x86-64: honor REX prefixes for SSE2AVX
[deliverable/binutils-gdb.git] / gas / config / tc-i386.c
CommitLineData
b534c6d3 1/* tc-i386.c -- Assemble code for the Intel 80386
b3adc24a 2 Copyright (C) 1989-2020 Free Software Foundation, Inc.
252b5132
RH
3
4 This file is part of GAS, the GNU Assembler.
5
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
ec2655a6 8 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
9 any later version.
10
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
252b5132 20
47926f60
KH
21/* Intel 80386 machine specific gas.
22 Written by Eliot Dresselhaus (eliot@mgm.mit.edu).
3e73aa7c 23 x86_64 support by Jan Hubicka (jh@suse.cz)
0f10071e 24 VIA PadLock support by Michal Ludvig (mludvig@suse.cz)
47926f60
KH
25 Bugs & suggestions are completely welcome. This is free software.
26 Please help us make it better. */
252b5132 27
252b5132 28#include "as.h"
3882b010 29#include "safe-ctype.h"
252b5132 30#include "subsegs.h"
316e2c05 31#include "dwarf2dbg.h"
54cfded0 32#include "dw2gencfi.h"
d2b2c203 33#include "elf/x86-64.h"
40fb9820 34#include "opcodes/i386-init.h"
252b5132 35
41fd2579
L
36#ifdef HAVE_LIMITS_H
37#include <limits.h>
38#else
39#ifdef HAVE_SYS_PARAM_H
40#include <sys/param.h>
41#endif
42#ifndef INT_MAX
43#define INT_MAX (int) (((unsigned) (-1)) >> 1)
44#endif
45#endif
46
c3332e24 47#ifndef INFER_ADDR_PREFIX
eecb386c 48#define INFER_ADDR_PREFIX 1
c3332e24
AM
49#endif
50
29b0f896
AM
51#ifndef DEFAULT_ARCH
52#define DEFAULT_ARCH "i386"
246fcdee 53#endif
252b5132 54
edde18a5
AM
55#ifndef INLINE
56#if __GNUC__ >= 2
57#define INLINE __inline__
58#else
59#define INLINE
60#endif
61#endif
62
6305a203
L
63/* Prefixes will be emitted in the order defined below.
64 WAIT_PREFIX must be the first prefix since FWAIT is really is an
65 instruction, and so must come before any prefixes.
66 The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
42164a71 67 REP_PREFIX/HLE_PREFIX, LOCK_PREFIX. */
6305a203
L
68#define WAIT_PREFIX 0
69#define SEG_PREFIX 1
70#define ADDR_PREFIX 2
71#define DATA_PREFIX 3
c32fa91d 72#define REP_PREFIX 4
42164a71 73#define HLE_PREFIX REP_PREFIX
7e8b059b 74#define BND_PREFIX REP_PREFIX
c32fa91d 75#define LOCK_PREFIX 5
4e9ac44a
L
76#define REX_PREFIX 6 /* must come last. */
77#define MAX_PREFIXES 7 /* max prefixes per opcode */
6305a203
L
78
79/* we define the syntax here (modulo base,index,scale syntax) */
80#define REGISTER_PREFIX '%'
81#define IMMEDIATE_PREFIX '$'
82#define ABSOLUTE_PREFIX '*'
83
84/* these are the instruction mnemonic suffixes in AT&T syntax or
85 memory operand size in Intel syntax. */
86#define WORD_MNEM_SUFFIX 'w'
87#define BYTE_MNEM_SUFFIX 'b'
88#define SHORT_MNEM_SUFFIX 's'
89#define LONG_MNEM_SUFFIX 'l'
90#define QWORD_MNEM_SUFFIX 'q'
6305a203
L
91/* Intel Syntax. Use a non-ascii letter since since it never appears
92 in instructions. */
93#define LONG_DOUBLE_MNEM_SUFFIX '\1'
94
95#define END_OF_INSN '\0'
96
79dec6b7
JB
97/* This matches the C -> StaticRounding alias in the opcode table. */
98#define commutative staticrounding
99
6305a203
L
100/*
101 'templates' is for grouping together 'template' structures for opcodes
102 of the same name. This is only used for storing the insns in the grand
103 ole hash table of insns.
104 The templates themselves start at START and range up to (but not including)
105 END.
106 */
107typedef struct
108{
d3ce72d0
NC
109 const insn_template *start;
110 const insn_template *end;
6305a203
L
111}
112templates;
113
114/* 386 operand encoding bytes: see 386 book for details of this. */
115typedef struct
116{
117 unsigned int regmem; /* codes register or memory operand */
118 unsigned int reg; /* codes register operand (or extended opcode) */
119 unsigned int mode; /* how to interpret regmem & reg */
120}
121modrm_byte;
122
123/* x86-64 extension prefix. */
124typedef int rex_byte;
125
6305a203
L
126/* 386 opcode byte to code indirect addressing. */
127typedef struct
128{
129 unsigned base;
130 unsigned index;
131 unsigned scale;
132}
133sib_byte;
134
6305a203
L
135/* x86 arch names, types and features */
136typedef struct
137{
138 const char *name; /* arch name */
8a2c8fef 139 unsigned int len; /* arch string length */
6305a203
L
140 enum processor_type type; /* arch type */
141 i386_cpu_flags flags; /* cpu feature flags */
8a2c8fef 142 unsigned int skip; /* show_arch should skip this. */
6305a203
L
143}
144arch_entry;
145
293f5f65
L
146/* Used to turn off indicated flags. */
147typedef struct
148{
149 const char *name; /* arch name */
150 unsigned int len; /* arch string length */
151 i386_cpu_flags flags; /* cpu feature flags */
152}
153noarch_entry;
154
78f12dd3 155static void update_code_flag (int, int);
e3bb37b5
L
156static void set_code_flag (int);
157static void set_16bit_gcc_code_flag (int);
158static void set_intel_syntax (int);
1efbbeb4 159static void set_intel_mnemonic (int);
db51cc60 160static void set_allow_index_reg (int);
7bab8ab5 161static void set_check (int);
e3bb37b5 162static void set_cpu_arch (int);
6482c264 163#ifdef TE_PE
e3bb37b5 164static void pe_directive_secrel (int);
6482c264 165#endif
e3bb37b5
L
166static void signed_cons (int);
167static char *output_invalid (int c);
ee86248c
JB
168static int i386_finalize_immediate (segT, expressionS *, i386_operand_type,
169 const char *);
170static int i386_finalize_displacement (segT, expressionS *, i386_operand_type,
171 const char *);
a7619375 172static int i386_att_operand (char *);
e3bb37b5 173static int i386_intel_operand (char *, int);
ee86248c
JB
174static int i386_intel_simplify (expressionS *);
175static int i386_intel_parse_name (const char *, expressionS *);
e3bb37b5
L
176static const reg_entry *parse_register (char *, char **);
177static char *parse_insn (char *, char *);
178static char *parse_operands (char *, const char *);
179static void swap_operands (void);
4d456e3d 180static void swap_2_operands (int, int);
48bcea9f 181static enum flag_code i386_addressing_mode (void);
e3bb37b5
L
182static void optimize_imm (void);
183static void optimize_disp (void);
83b16ac6 184static const insn_template *match_template (char);
e3bb37b5
L
185static int check_string (void);
186static int process_suffix (void);
187static int check_byte_reg (void);
188static int check_long_reg (void);
189static int check_qword_reg (void);
190static int check_word_reg (void);
191static int finalize_imm (void);
192static int process_operands (void);
193static const seg_entry *build_modrm_byte (void);
194static void output_insn (void);
195static void output_imm (fragS *, offsetT);
196static void output_disp (fragS *, offsetT);
29b0f896 197#ifndef I386COFF
e3bb37b5 198static void s_bss (int);
252b5132 199#endif
17d4e2a2
L
200#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
201static void handle_large_common (int small ATTRIBUTE_UNUSED);
b4a3a7b4
L
202
203/* GNU_PROPERTY_X86_ISA_1_USED. */
204static unsigned int x86_isa_1_used;
205/* GNU_PROPERTY_X86_FEATURE_2_USED. */
206static unsigned int x86_feature_2_used;
207/* Generate x86 used ISA and feature properties. */
208static unsigned int x86_used_note = DEFAULT_X86_USED_NOTE;
17d4e2a2 209#endif
252b5132 210
a847613f 211static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 212
8a6fb3f9
JB
213/* parse_register() returns this when a register alias cannot be used. */
214static const reg_entry bad_reg = { "<bad>", OPERAND_TYPE_NONE, 0, 0,
215 { Dw2Inval, Dw2Inval } };
216
43234a1e
L
217/* This struct describes rounding control and SAE in the instruction. */
218struct RC_Operation
219{
220 enum rc_type
221 {
222 rne = 0,
223 rd,
224 ru,
225 rz,
226 saeonly
227 } type;
228 int operand;
229};
230
231static struct RC_Operation rc_op;
232
233/* The struct describes masking, applied to OPERAND in the instruction.
234 MASK is a pointer to the corresponding mask register. ZEROING tells
235 whether merging or zeroing mask is used. */
236struct Mask_Operation
237{
238 const reg_entry *mask;
239 unsigned int zeroing;
240 /* The operand where this operation is associated. */
241 int operand;
242};
243
244static struct Mask_Operation mask_op;
245
246/* The struct describes broadcasting, applied to OPERAND. FACTOR is
247 broadcast factor. */
248struct Broadcast_Operation
249{
8e6e0792 250 /* Type of broadcast: {1to2}, {1to4}, {1to8}, or {1to16}. */
43234a1e
L
251 int type;
252
253 /* Index of broadcasted operand. */
254 int operand;
4a1b91ea
L
255
256 /* Number of bytes to broadcast. */
257 int bytes;
43234a1e
L
258};
259
260static struct Broadcast_Operation broadcast_op;
261
c0f3af97
L
262/* VEX prefix. */
263typedef struct
264{
43234a1e
L
265 /* VEX prefix is either 2 byte or 3 byte. EVEX is 4 byte. */
266 unsigned char bytes[4];
c0f3af97
L
267 unsigned int length;
268 /* Destination or source register specifier. */
269 const reg_entry *register_specifier;
270} vex_prefix;
271
252b5132 272/* 'md_assemble ()' gathers together information and puts it into a
47926f60 273 i386_insn. */
252b5132 274
520dc8e8
AM
275union i386_op
276 {
277 expressionS *disps;
278 expressionS *imms;
279 const reg_entry *regs;
280 };
281
a65babc9
L
282enum i386_error
283 {
86e026a4 284 operand_size_mismatch,
a65babc9
L
285 operand_type_mismatch,
286 register_type_mismatch,
287 number_of_operands_mismatch,
288 invalid_instruction_suffix,
289 bad_imm4,
a65babc9
L
290 unsupported_with_intel_mnemonic,
291 unsupported_syntax,
6c30d220
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
9e5e5283
L
4896 if (i.tm.opcode_modifier.vex)
4897 build_vex_prefix (t);
4898 else
4899 build_evex_prefix ();
4900 }
43234a1e 4901
5dd85c99
SP
4902 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
4903 instructions may define INT_OPCODE as well, so avoid this corner
4904 case for those instructions that use MODRM. */
4905 if (i.tm.base_opcode == INT_OPCODE
a6461c02
SP
4906 && !i.tm.opcode_modifier.modrm
4907 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
4908 {
4909 i.tm.base_opcode = INT3_OPCODE;
4910 i.imm_operands = 0;
4911 }
252b5132 4912
0cfa3eb3
JB
4913 if ((i.tm.opcode_modifier.jump == JUMP
4914 || i.tm.opcode_modifier.jump == JUMP_BYTE
4915 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896
AM
4916 && i.op[0].disps->X_op == O_constant)
4917 {
4918 /* Convert "jmp constant" (and "call constant") to a jump (call) to
4919 the absolute address given by the constant. Since ix86 jumps and
4920 calls are pc relative, we need to generate a reloc. */
4921 i.op[0].disps->X_add_symbol = &abs_symbol;
4922 i.op[0].disps->X_op = O_symbol;
4923 }
252b5132 4924
29b0f896
AM
4925 /* For 8 bit registers we need an empty rex prefix. Also if the
4926 instruction already has a prefix, we need to convert old
4927 registers to new ones. */
773f551c 4928
bab6aec1 4929 if ((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte
29b0f896 4930 && (i.op[0].regs->reg_flags & RegRex64) != 0)
bab6aec1 4931 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte
29b0f896 4932 && (i.op[1].regs->reg_flags & RegRex64) != 0)
bab6aec1
JB
4933 || (((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte)
4934 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte))
29b0f896
AM
4935 && i.rex != 0))
4936 {
4937 int x;
726c5dcd 4938
29b0f896
AM
4939 i.rex |= REX_OPCODE;
4940 for (x = 0; x < 2; x++)
4941 {
4942 /* Look for 8 bit operand that uses old registers. */
bab6aec1 4943 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
29b0f896 4944 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 4945 {
3f93af61 4946 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
29b0f896
AM
4947 /* In case it is "hi" register, give up. */
4948 if (i.op[x].regs->reg_num > 3)
a540244d 4949 as_bad (_("can't encode register '%s%s' in an "
4eed87de 4950 "instruction requiring REX prefix."),
a540244d 4951 register_prefix, i.op[x].regs->reg_name);
773f551c 4952
29b0f896
AM
4953 /* Otherwise it is equivalent to the extended register.
4954 Since the encoding doesn't change this is merely
4955 cosmetic cleanup for debug output. */
4956
4957 i.op[x].regs = i.op[x].regs + 8;
773f551c 4958 }
29b0f896
AM
4959 }
4960 }
773f551c 4961
6b6b6807
L
4962 if (i.rex == 0 && i.rex_encoding)
4963 {
4964 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
3f93af61 4965 that uses legacy register. If it is "hi" register, don't add
6b6b6807
L
4966 the REX_OPCODE byte. */
4967 int x;
4968 for (x = 0; x < 2; x++)
bab6aec1 4969 if (i.types[x].bitfield.class == Reg
6b6b6807
L
4970 && i.types[x].bitfield.byte
4971 && (i.op[x].regs->reg_flags & RegRex64) == 0
4972 && i.op[x].regs->reg_num > 3)
4973 {
3f93af61 4974 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
6b6b6807
L
4975 i.rex_encoding = FALSE;
4976 break;
4977 }
4978
4979 if (i.rex_encoding)
4980 i.rex = REX_OPCODE;
4981 }
4982
7ab9ffdd 4983 if (i.rex != 0)
29b0f896
AM
4984 add_prefix (REX_OPCODE | i.rex);
4985
ae531041
L
4986 insert_lfence_before ();
4987
29b0f896
AM
4988 /* We are ready to output the insn. */
4989 output_insn ();
e379e5f3 4990
ae531041
L
4991 insert_lfence_after ();
4992
e379e5f3
L
4993 last_insn.seg = now_seg;
4994
4995 if (i.tm.opcode_modifier.isprefix)
4996 {
4997 last_insn.kind = last_insn_prefix;
4998 last_insn.name = i.tm.name;
4999 last_insn.file = as_where (&last_insn.line);
5000 }
5001 else
5002 last_insn.kind = last_insn_other;
29b0f896
AM
5003}
5004
5005static char *
e3bb37b5 5006parse_insn (char *line, char *mnemonic)
29b0f896
AM
5007{
5008 char *l = line;
5009 char *token_start = l;
5010 char *mnem_p;
5c6af06e 5011 int supported;
d3ce72d0 5012 const insn_template *t;
b6169b20 5013 char *dot_p = NULL;
29b0f896 5014
29b0f896
AM
5015 while (1)
5016 {
5017 mnem_p = mnemonic;
5018 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
5019 {
b6169b20
L
5020 if (*mnem_p == '.')
5021 dot_p = mnem_p;
29b0f896
AM
5022 mnem_p++;
5023 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 5024 {
29b0f896
AM
5025 as_bad (_("no such instruction: `%s'"), token_start);
5026 return NULL;
5027 }
5028 l++;
5029 }
5030 if (!is_space_char (*l)
5031 && *l != END_OF_INSN
e44823cf
JB
5032 && (intel_syntax
5033 || (*l != PREFIX_SEPARATOR
5034 && *l != ',')))
29b0f896
AM
5035 {
5036 as_bad (_("invalid character %s in mnemonic"),
5037 output_invalid (*l));
5038 return NULL;
5039 }
5040 if (token_start == l)
5041 {
e44823cf 5042 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
5043 as_bad (_("expecting prefix; got nothing"));
5044 else
5045 as_bad (_("expecting mnemonic; got nothing"));
5046 return NULL;
5047 }
45288df1 5048
29b0f896 5049 /* Look up instruction (or prefix) via hash table. */
d3ce72d0 5050 current_templates = (const templates *) hash_find (op_hash, mnemonic);
47926f60 5051
29b0f896
AM
5052 if (*l != END_OF_INSN
5053 && (!is_space_char (*l) || l[1] != END_OF_INSN)
5054 && current_templates
40fb9820 5055 && current_templates->start->opcode_modifier.isprefix)
29b0f896 5056 {
c6fb90c8 5057 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
5058 {
5059 as_bad ((flag_code != CODE_64BIT
5060 ? _("`%s' is only supported in 64-bit mode")
5061 : _("`%s' is not supported in 64-bit mode")),
5062 current_templates->start->name);
5063 return NULL;
5064 }
29b0f896
AM
5065 /* If we are in 16-bit mode, do not allow addr16 or data16.
5066 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
5067 if ((current_templates->start->opcode_modifier.size == SIZE16
5068 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 5069 && flag_code != CODE_64BIT
673fe0f0 5070 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
5071 ^ (flag_code == CODE_16BIT)))
5072 {
5073 as_bad (_("redundant %s prefix"),
5074 current_templates->start->name);
5075 return NULL;
45288df1 5076 }
86fa6981 5077 if (current_templates->start->opcode_length == 0)
29b0f896 5078 {
86fa6981
L
5079 /* Handle pseudo prefixes. */
5080 switch (current_templates->start->base_opcode)
5081 {
5082 case 0x0:
5083 /* {disp8} */
5084 i.disp_encoding = disp_encoding_8bit;
5085 break;
5086 case 0x1:
5087 /* {disp32} */
5088 i.disp_encoding = disp_encoding_32bit;
5089 break;
5090 case 0x2:
5091 /* {load} */
5092 i.dir_encoding = dir_encoding_load;
5093 break;
5094 case 0x3:
5095 /* {store} */
5096 i.dir_encoding = dir_encoding_store;
5097 break;
5098 case 0x4:
42e04b36
L
5099 /* {vex} */
5100 i.vec_encoding = vex_encoding_vex;
86fa6981
L
5101 break;
5102 case 0x5:
5103 /* {vex3} */
5104 i.vec_encoding = vex_encoding_vex3;
5105 break;
5106 case 0x6:
5107 /* {evex} */
5108 i.vec_encoding = vex_encoding_evex;
5109 break;
6b6b6807
L
5110 case 0x7:
5111 /* {rex} */
5112 i.rex_encoding = TRUE;
5113 break;
b6f8c7c4
L
5114 case 0x8:
5115 /* {nooptimize} */
5116 i.no_optimize = TRUE;
5117 break;
86fa6981
L
5118 default:
5119 abort ();
5120 }
5121 }
5122 else
5123 {
5124 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 5125 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 5126 {
4e9ac44a
L
5127 case PREFIX_EXIST:
5128 return NULL;
5129 case PREFIX_DS:
d777820b 5130 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
5131 i.notrack_prefix = current_templates->start->name;
5132 break;
5133 case PREFIX_REP:
5134 if (current_templates->start->cpu_flags.bitfield.cpuhle)
5135 i.hle_prefix = current_templates->start->name;
5136 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
5137 i.bnd_prefix = current_templates->start->name;
5138 else
5139 i.rep_prefix = current_templates->start->name;
5140 break;
5141 default:
5142 break;
86fa6981 5143 }
29b0f896
AM
5144 }
5145 /* Skip past PREFIX_SEPARATOR and reset token_start. */
5146 token_start = ++l;
5147 }
5148 else
5149 break;
5150 }
45288df1 5151
30a55f88 5152 if (!current_templates)
b6169b20 5153 {
07d5e953
JB
5154 /* Deprecated functionality (new code should use pseudo-prefixes instead):
5155 Check if we should swap operand or force 32bit displacement in
f8a5c266 5156 encoding. */
30a55f88 5157 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 5158 i.dir_encoding = dir_encoding_swap;
8d63c93e 5159 else if (mnem_p - 3 == dot_p
a501d77e
L
5160 && dot_p[1] == 'd'
5161 && dot_p[2] == '8')
5162 i.disp_encoding = disp_encoding_8bit;
8d63c93e 5163 else if (mnem_p - 4 == dot_p
f8a5c266
L
5164 && dot_p[1] == 'd'
5165 && dot_p[2] == '3'
5166 && dot_p[3] == '2')
a501d77e 5167 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
5168 else
5169 goto check_suffix;
5170 mnem_p = dot_p;
5171 *dot_p = '\0';
d3ce72d0 5172 current_templates = (const templates *) hash_find (op_hash, mnemonic);
b6169b20
L
5173 }
5174
29b0f896
AM
5175 if (!current_templates)
5176 {
dc1e8a47 5177 check_suffix:
1c529385 5178 if (mnem_p > mnemonic)
29b0f896 5179 {
1c529385
LH
5180 /* See if we can get a match by trimming off a suffix. */
5181 switch (mnem_p[-1])
29b0f896 5182 {
1c529385
LH
5183 case WORD_MNEM_SUFFIX:
5184 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
5185 i.suffix = SHORT_MNEM_SUFFIX;
5186 else
1c529385
LH
5187 /* Fall through. */
5188 case BYTE_MNEM_SUFFIX:
5189 case QWORD_MNEM_SUFFIX:
5190 i.suffix = mnem_p[-1];
29b0f896 5191 mnem_p[-1] = '\0';
d3ce72d0 5192 current_templates = (const templates *) hash_find (op_hash,
1c529385
LH
5193 mnemonic);
5194 break;
5195 case SHORT_MNEM_SUFFIX:
5196 case LONG_MNEM_SUFFIX:
5197 if (!intel_syntax)
5198 {
5199 i.suffix = mnem_p[-1];
5200 mnem_p[-1] = '\0';
5201 current_templates = (const templates *) hash_find (op_hash,
5202 mnemonic);
5203 }
5204 break;
5205
5206 /* Intel Syntax. */
5207 case 'd':
5208 if (intel_syntax)
5209 {
5210 if (intel_float_operand (mnemonic) == 1)
5211 i.suffix = SHORT_MNEM_SUFFIX;
5212 else
5213 i.suffix = LONG_MNEM_SUFFIX;
5214 mnem_p[-1] = '\0';
5215 current_templates = (const templates *) hash_find (op_hash,
5216 mnemonic);
5217 }
5218 break;
29b0f896 5219 }
29b0f896 5220 }
1c529385 5221
29b0f896
AM
5222 if (!current_templates)
5223 {
5224 as_bad (_("no such instruction: `%s'"), token_start);
5225 return NULL;
5226 }
5227 }
252b5132 5228
0cfa3eb3
JB
5229 if (current_templates->start->opcode_modifier.jump == JUMP
5230 || current_templates->start->opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
5231 {
5232 /* Check for a branch hint. We allow ",pt" and ",pn" for
5233 predict taken and predict not taken respectively.
5234 I'm not sure that branch hints actually do anything on loop
5235 and jcxz insns (JumpByte) for current Pentium4 chips. They
5236 may work in the future and it doesn't hurt to accept them
5237 now. */
5238 if (l[0] == ',' && l[1] == 'p')
5239 {
5240 if (l[2] == 't')
5241 {
5242 if (!add_prefix (DS_PREFIX_OPCODE))
5243 return NULL;
5244 l += 3;
5245 }
5246 else if (l[2] == 'n')
5247 {
5248 if (!add_prefix (CS_PREFIX_OPCODE))
5249 return NULL;
5250 l += 3;
5251 }
5252 }
5253 }
5254 /* Any other comma loses. */
5255 if (*l == ',')
5256 {
5257 as_bad (_("invalid character %s in mnemonic"),
5258 output_invalid (*l));
5259 return NULL;
5260 }
252b5132 5261
29b0f896 5262 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
5263 supported = 0;
5264 for (t = current_templates->start; t < current_templates->end; ++t)
5265 {
c0f3af97
L
5266 supported |= cpu_flags_match (t);
5267 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
5268 {
5269 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
5270 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 5271
548d0ee6
JB
5272 return l;
5273 }
29b0f896 5274 }
3629bb00 5275
548d0ee6
JB
5276 if (!(supported & CPU_FLAGS_64BIT_MATCH))
5277 as_bad (flag_code == CODE_64BIT
5278 ? _("`%s' is not supported in 64-bit mode")
5279 : _("`%s' is only supported in 64-bit mode"),
5280 current_templates->start->name);
5281 else
5282 as_bad (_("`%s' is not supported on `%s%s'"),
5283 current_templates->start->name,
5284 cpu_arch_name ? cpu_arch_name : default_arch,
5285 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 5286
548d0ee6 5287 return NULL;
29b0f896 5288}
252b5132 5289
29b0f896 5290static char *
e3bb37b5 5291parse_operands (char *l, const char *mnemonic)
29b0f896
AM
5292{
5293 char *token_start;
3138f287 5294
29b0f896
AM
5295 /* 1 if operand is pending after ','. */
5296 unsigned int expecting_operand = 0;
252b5132 5297
29b0f896
AM
5298 /* Non-zero if operand parens not balanced. */
5299 unsigned int paren_not_balanced;
5300
5301 while (*l != END_OF_INSN)
5302 {
5303 /* Skip optional white space before operand. */
5304 if (is_space_char (*l))
5305 ++l;
d02603dc 5306 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
5307 {
5308 as_bad (_("invalid character %s before operand %d"),
5309 output_invalid (*l),
5310 i.operands + 1);
5311 return NULL;
5312 }
d02603dc 5313 token_start = l; /* After white space. */
29b0f896
AM
5314 paren_not_balanced = 0;
5315 while (paren_not_balanced || *l != ',')
5316 {
5317 if (*l == END_OF_INSN)
5318 {
5319 if (paren_not_balanced)
5320 {
5321 if (!intel_syntax)
5322 as_bad (_("unbalanced parenthesis in operand %d."),
5323 i.operands + 1);
5324 else
5325 as_bad (_("unbalanced brackets in operand %d."),
5326 i.operands + 1);
5327 return NULL;
5328 }
5329 else
5330 break; /* we are done */
5331 }
d02603dc 5332 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
5333 {
5334 as_bad (_("invalid character %s in operand %d"),
5335 output_invalid (*l),
5336 i.operands + 1);
5337 return NULL;
5338 }
5339 if (!intel_syntax)
5340 {
5341 if (*l == '(')
5342 ++paren_not_balanced;
5343 if (*l == ')')
5344 --paren_not_balanced;
5345 }
5346 else
5347 {
5348 if (*l == '[')
5349 ++paren_not_balanced;
5350 if (*l == ']')
5351 --paren_not_balanced;
5352 }
5353 l++;
5354 }
5355 if (l != token_start)
5356 { /* Yes, we've read in another operand. */
5357 unsigned int operand_ok;
5358 this_operand = i.operands++;
5359 if (i.operands > MAX_OPERANDS)
5360 {
5361 as_bad (_("spurious operands; (%d operands/instruction max)"),
5362 MAX_OPERANDS);
5363 return NULL;
5364 }
9d46ce34 5365 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
5366 /* Now parse operand adding info to 'i' as we go along. */
5367 END_STRING_AND_SAVE (l);
5368
1286ab78
L
5369 if (i.mem_operands > 1)
5370 {
5371 as_bad (_("too many memory references for `%s'"),
5372 mnemonic);
5373 return 0;
5374 }
5375
29b0f896
AM
5376 if (intel_syntax)
5377 operand_ok =
5378 i386_intel_operand (token_start,
5379 intel_float_operand (mnemonic));
5380 else
a7619375 5381 operand_ok = i386_att_operand (token_start);
29b0f896
AM
5382
5383 RESTORE_END_STRING (l);
5384 if (!operand_ok)
5385 return NULL;
5386 }
5387 else
5388 {
5389 if (expecting_operand)
5390 {
5391 expecting_operand_after_comma:
5392 as_bad (_("expecting operand after ','; got nothing"));
5393 return NULL;
5394 }
5395 if (*l == ',')
5396 {
5397 as_bad (_("expecting operand before ','; got nothing"));
5398 return NULL;
5399 }
5400 }
7f3f1ea2 5401
29b0f896
AM
5402 /* Now *l must be either ',' or END_OF_INSN. */
5403 if (*l == ',')
5404 {
5405 if (*++l == END_OF_INSN)
5406 {
5407 /* Just skip it, if it's \n complain. */
5408 goto expecting_operand_after_comma;
5409 }
5410 expecting_operand = 1;
5411 }
5412 }
5413 return l;
5414}
7f3f1ea2 5415
050dfa73 5416static void
4d456e3d 5417swap_2_operands (int xchg1, int xchg2)
050dfa73
MM
5418{
5419 union i386_op temp_op;
40fb9820 5420 i386_operand_type temp_type;
c48dadc9 5421 unsigned int temp_flags;
050dfa73 5422 enum bfd_reloc_code_real temp_reloc;
4eed87de 5423
050dfa73
MM
5424 temp_type = i.types[xchg2];
5425 i.types[xchg2] = i.types[xchg1];
5426 i.types[xchg1] = temp_type;
c48dadc9
JB
5427
5428 temp_flags = i.flags[xchg2];
5429 i.flags[xchg2] = i.flags[xchg1];
5430 i.flags[xchg1] = temp_flags;
5431
050dfa73
MM
5432 temp_op = i.op[xchg2];
5433 i.op[xchg2] = i.op[xchg1];
5434 i.op[xchg1] = temp_op;
c48dadc9 5435
050dfa73
MM
5436 temp_reloc = i.reloc[xchg2];
5437 i.reloc[xchg2] = i.reloc[xchg1];
5438 i.reloc[xchg1] = temp_reloc;
43234a1e
L
5439
5440 if (i.mask)
5441 {
5442 if (i.mask->operand == xchg1)
5443 i.mask->operand = xchg2;
5444 else if (i.mask->operand == xchg2)
5445 i.mask->operand = xchg1;
5446 }
5447 if (i.broadcast)
5448 {
5449 if (i.broadcast->operand == xchg1)
5450 i.broadcast->operand = xchg2;
5451 else if (i.broadcast->operand == xchg2)
5452 i.broadcast->operand = xchg1;
5453 }
5454 if (i.rounding)
5455 {
5456 if (i.rounding->operand == xchg1)
5457 i.rounding->operand = xchg2;
5458 else if (i.rounding->operand == xchg2)
5459 i.rounding->operand = xchg1;
5460 }
050dfa73
MM
5461}
5462
29b0f896 5463static void
e3bb37b5 5464swap_operands (void)
29b0f896 5465{
b7c61d9a 5466 switch (i.operands)
050dfa73 5467 {
c0f3af97 5468 case 5:
b7c61d9a 5469 case 4:
4d456e3d 5470 swap_2_operands (1, i.operands - 2);
1a0670f3 5471 /* Fall through. */
b7c61d9a
L
5472 case 3:
5473 case 2:
4d456e3d 5474 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
5475 break;
5476 default:
5477 abort ();
29b0f896 5478 }
29b0f896
AM
5479
5480 if (i.mem_operands == 2)
5481 {
5482 const seg_entry *temp_seg;
5483 temp_seg = i.seg[0];
5484 i.seg[0] = i.seg[1];
5485 i.seg[1] = temp_seg;
5486 }
5487}
252b5132 5488
29b0f896
AM
5489/* Try to ensure constant immediates are represented in the smallest
5490 opcode possible. */
5491static void
e3bb37b5 5492optimize_imm (void)
29b0f896
AM
5493{
5494 char guess_suffix = 0;
5495 int op;
252b5132 5496
29b0f896
AM
5497 if (i.suffix)
5498 guess_suffix = i.suffix;
5499 else if (i.reg_operands)
5500 {
5501 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
5502 We can't do this properly yet, i.e. excluding special register
5503 instances, but the following works for instructions with
5504 immediates. In any case, we can't set i.suffix yet. */
29b0f896 5505 for (op = i.operands; --op >= 0;)
bab6aec1
JB
5506 if (i.types[op].bitfield.class != Reg)
5507 continue;
5508 else if (i.types[op].bitfield.byte)
7ab9ffdd 5509 {
40fb9820
L
5510 guess_suffix = BYTE_MNEM_SUFFIX;
5511 break;
5512 }
bab6aec1 5513 else if (i.types[op].bitfield.word)
252b5132 5514 {
40fb9820
L
5515 guess_suffix = WORD_MNEM_SUFFIX;
5516 break;
5517 }
bab6aec1 5518 else if (i.types[op].bitfield.dword)
40fb9820
L
5519 {
5520 guess_suffix = LONG_MNEM_SUFFIX;
5521 break;
5522 }
bab6aec1 5523 else if (i.types[op].bitfield.qword)
40fb9820
L
5524 {
5525 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5526 break;
252b5132 5527 }
29b0f896
AM
5528 }
5529 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5530 guess_suffix = WORD_MNEM_SUFFIX;
5531
5532 for (op = i.operands; --op >= 0;)
40fb9820 5533 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5534 {
5535 switch (i.op[op].imms->X_op)
252b5132 5536 {
29b0f896
AM
5537 case O_constant:
5538 /* If a suffix is given, this operand may be shortened. */
5539 switch (guess_suffix)
252b5132 5540 {
29b0f896 5541 case LONG_MNEM_SUFFIX:
40fb9820
L
5542 i.types[op].bitfield.imm32 = 1;
5543 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5544 break;
5545 case WORD_MNEM_SUFFIX:
40fb9820
L
5546 i.types[op].bitfield.imm16 = 1;
5547 i.types[op].bitfield.imm32 = 1;
5548 i.types[op].bitfield.imm32s = 1;
5549 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5550 break;
5551 case BYTE_MNEM_SUFFIX:
40fb9820
L
5552 i.types[op].bitfield.imm8 = 1;
5553 i.types[op].bitfield.imm8s = 1;
5554 i.types[op].bitfield.imm16 = 1;
5555 i.types[op].bitfield.imm32 = 1;
5556 i.types[op].bitfield.imm32s = 1;
5557 i.types[op].bitfield.imm64 = 1;
29b0f896 5558 break;
252b5132 5559 }
252b5132 5560
29b0f896
AM
5561 /* If this operand is at most 16 bits, convert it
5562 to a signed 16 bit number before trying to see
5563 whether it will fit in an even smaller size.
5564 This allows a 16-bit operand such as $0xffe0 to
5565 be recognised as within Imm8S range. */
40fb9820 5566 if ((i.types[op].bitfield.imm16)
29b0f896 5567 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5568 {
29b0f896
AM
5569 i.op[op].imms->X_add_number =
5570 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
5571 }
a28def75
L
5572#ifdef BFD64
5573 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5574 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5575 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5576 == 0))
5577 {
5578 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5579 ^ ((offsetT) 1 << 31))
5580 - ((offsetT) 1 << 31));
5581 }
a28def75 5582#endif
40fb9820 5583 i.types[op]
c6fb90c8
L
5584 = operand_type_or (i.types[op],
5585 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5586
29b0f896
AM
5587 /* We must avoid matching of Imm32 templates when 64bit
5588 only immediate is available. */
5589 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5590 i.types[op].bitfield.imm32 = 0;
29b0f896 5591 break;
252b5132 5592
29b0f896
AM
5593 case O_absent:
5594 case O_register:
5595 abort ();
5596
5597 /* Symbols and expressions. */
5598 default:
9cd96992
JB
5599 /* Convert symbolic operand to proper sizes for matching, but don't
5600 prevent matching a set of insns that only supports sizes other
5601 than those matching the insn suffix. */
5602 {
40fb9820 5603 i386_operand_type mask, allowed;
d3ce72d0 5604 const insn_template *t;
9cd96992 5605
0dfbf9d7
L
5606 operand_type_set (&mask, 0);
5607 operand_type_set (&allowed, 0);
40fb9820 5608
4eed87de
AM
5609 for (t = current_templates->start;
5610 t < current_templates->end;
5611 ++t)
bab6aec1
JB
5612 {
5613 allowed = operand_type_or (allowed, t->operand_types[op]);
5614 allowed = operand_type_and (allowed, anyimm);
5615 }
9cd96992
JB
5616 switch (guess_suffix)
5617 {
5618 case QWORD_MNEM_SUFFIX:
40fb9820
L
5619 mask.bitfield.imm64 = 1;
5620 mask.bitfield.imm32s = 1;
9cd96992
JB
5621 break;
5622 case LONG_MNEM_SUFFIX:
40fb9820 5623 mask.bitfield.imm32 = 1;
9cd96992
JB
5624 break;
5625 case WORD_MNEM_SUFFIX:
40fb9820 5626 mask.bitfield.imm16 = 1;
9cd96992
JB
5627 break;
5628 case BYTE_MNEM_SUFFIX:
40fb9820 5629 mask.bitfield.imm8 = 1;
9cd96992
JB
5630 break;
5631 default:
9cd96992
JB
5632 break;
5633 }
c6fb90c8 5634 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5635 if (!operand_type_all_zero (&allowed))
c6fb90c8 5636 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5637 }
29b0f896 5638 break;
252b5132 5639 }
29b0f896
AM
5640 }
5641}
47926f60 5642
29b0f896
AM
5643/* Try to use the smallest displacement type too. */
5644static void
e3bb37b5 5645optimize_disp (void)
29b0f896
AM
5646{
5647 int op;
3e73aa7c 5648
29b0f896 5649 for (op = i.operands; --op >= 0;)
40fb9820 5650 if (operand_type_check (i.types[op], disp))
252b5132 5651 {
b300c311 5652 if (i.op[op].disps->X_op == O_constant)
252b5132 5653 {
91d6fa6a 5654 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5655
40fb9820 5656 if (i.types[op].bitfield.disp16
91d6fa6a 5657 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
5658 {
5659 /* If this operand is at most 16 bits, convert
5660 to a signed 16 bit number and don't use 64bit
5661 displacement. */
91d6fa6a 5662 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 5663 i.types[op].bitfield.disp64 = 0;
b300c311 5664 }
a28def75
L
5665#ifdef BFD64
5666 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
40fb9820 5667 if (i.types[op].bitfield.disp32
91d6fa6a 5668 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
b300c311
L
5669 {
5670 /* If this operand is at most 32 bits, convert
5671 to a signed 32 bit number and don't use 64bit
5672 displacement. */
91d6fa6a
NC
5673 op_disp &= (((offsetT) 2 << 31) - 1);
5674 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 5675 i.types[op].bitfield.disp64 = 0;
b300c311 5676 }
a28def75 5677#endif
91d6fa6a 5678 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5679 {
40fb9820
L
5680 i.types[op].bitfield.disp8 = 0;
5681 i.types[op].bitfield.disp16 = 0;
5682 i.types[op].bitfield.disp32 = 0;
5683 i.types[op].bitfield.disp32s = 0;
5684 i.types[op].bitfield.disp64 = 0;
b300c311
L
5685 i.op[op].disps = 0;
5686 i.disp_operands--;
5687 }
5688 else if (flag_code == CODE_64BIT)
5689 {
91d6fa6a 5690 if (fits_in_signed_long (op_disp))
28a9d8f5 5691 {
40fb9820
L
5692 i.types[op].bitfield.disp64 = 0;
5693 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5694 }
0e1147d9 5695 if (i.prefix[ADDR_PREFIX]
91d6fa6a 5696 && fits_in_unsigned_long (op_disp))
40fb9820 5697 i.types[op].bitfield.disp32 = 1;
b300c311 5698 }
40fb9820
L
5699 if ((i.types[op].bitfield.disp32
5700 || i.types[op].bitfield.disp32s
5701 || i.types[op].bitfield.disp16)
b5014f7a 5702 && fits_in_disp8 (op_disp))
40fb9820 5703 i.types[op].bitfield.disp8 = 1;
252b5132 5704 }
67a4f2b7
AO
5705 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5706 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5707 {
5708 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5709 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
5710 i.types[op].bitfield.disp8 = 0;
5711 i.types[op].bitfield.disp16 = 0;
5712 i.types[op].bitfield.disp32 = 0;
5713 i.types[op].bitfield.disp32s = 0;
5714 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
5715 }
5716 else
b300c311 5717 /* We only support 64bit displacement on constants. */
40fb9820 5718 i.types[op].bitfield.disp64 = 0;
252b5132 5719 }
29b0f896
AM
5720}
5721
4a1b91ea
L
5722/* Return 1 if there is a match in broadcast bytes between operand
5723 GIVEN and instruction template T. */
5724
5725static INLINE int
5726match_broadcast_size (const insn_template *t, unsigned int given)
5727{
5728 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5729 && i.types[given].bitfield.byte)
5730 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5731 && i.types[given].bitfield.word)
5732 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5733 && i.types[given].bitfield.dword)
5734 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5735 && i.types[given].bitfield.qword));
5736}
5737
6c30d220
L
5738/* Check if operands are valid for the instruction. */
5739
5740static int
5741check_VecOperands (const insn_template *t)
5742{
43234a1e 5743 unsigned int op;
e2195274 5744 i386_cpu_flags cpu;
e2195274
JB
5745
5746 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5747 any one operand are implicity requiring AVX512VL support if the actual
5748 operand size is YMMword or XMMword. Since this function runs after
5749 template matching, there's no need to check for YMMword/XMMword in
5750 the template. */
5751 cpu = cpu_flags_and (t->cpu_flags, avx512);
5752 if (!cpu_flags_all_zero (&cpu)
5753 && !t->cpu_flags.bitfield.cpuavx512vl
5754 && !cpu_arch_flags.bitfield.cpuavx512vl)
5755 {
5756 for (op = 0; op < t->operands; ++op)
5757 {
5758 if (t->operand_types[op].bitfield.zmmword
5759 && (i.types[op].bitfield.ymmword
5760 || i.types[op].bitfield.xmmword))
5761 {
5762 i.error = unsupported;
5763 return 1;
5764 }
5765 }
5766 }
43234a1e 5767
6c30d220
L
5768 /* Without VSIB byte, we can't have a vector register for index. */
5769 if (!t->opcode_modifier.vecsib
5770 && i.index_reg
1b54b8d7
JB
5771 && (i.index_reg->reg_type.bitfield.xmmword
5772 || i.index_reg->reg_type.bitfield.ymmword
5773 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
5774 {
5775 i.error = unsupported_vector_index_register;
5776 return 1;
5777 }
5778
ad8ecc81
MZ
5779 /* Check if default mask is allowed. */
5780 if (t->opcode_modifier.nodefmask
5781 && (!i.mask || i.mask->mask->reg_num == 0))
5782 {
5783 i.error = no_default_mask;
5784 return 1;
5785 }
5786
7bab8ab5
JB
5787 /* For VSIB byte, we need a vector register for index, and all vector
5788 registers must be distinct. */
5789 if (t->opcode_modifier.vecsib)
5790 {
5791 if (!i.index_reg
6c30d220 5792 || !((t->opcode_modifier.vecsib == VecSIB128
1b54b8d7 5793 && i.index_reg->reg_type.bitfield.xmmword)
6c30d220 5794 || (t->opcode_modifier.vecsib == VecSIB256
1b54b8d7 5795 && i.index_reg->reg_type.bitfield.ymmword)
43234a1e 5796 || (t->opcode_modifier.vecsib == VecSIB512
1b54b8d7 5797 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
5798 {
5799 i.error = invalid_vsib_address;
5800 return 1;
5801 }
5802
43234a1e
L
5803 gas_assert (i.reg_operands == 2 || i.mask);
5804 if (i.reg_operands == 2 && !i.mask)
5805 {
3528c362 5806 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
5807 gas_assert (i.types[0].bitfield.xmmword
5808 || i.types[0].bitfield.ymmword);
3528c362 5809 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
5810 gas_assert (i.types[2].bitfield.xmmword
5811 || i.types[2].bitfield.ymmword);
43234a1e
L
5812 if (operand_check == check_none)
5813 return 0;
5814 if (register_number (i.op[0].regs)
5815 != register_number (i.index_reg)
5816 && register_number (i.op[2].regs)
5817 != register_number (i.index_reg)
5818 && register_number (i.op[0].regs)
5819 != register_number (i.op[2].regs))
5820 return 0;
5821 if (operand_check == check_error)
5822 {
5823 i.error = invalid_vector_register_set;
5824 return 1;
5825 }
5826 as_warn (_("mask, index, and destination registers should be distinct"));
5827 }
8444f82a
MZ
5828 else if (i.reg_operands == 1 && i.mask)
5829 {
3528c362 5830 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
5831 && (i.types[1].bitfield.xmmword
5832 || i.types[1].bitfield.ymmword
5833 || i.types[1].bitfield.zmmword)
8444f82a
MZ
5834 && (register_number (i.op[1].regs)
5835 == register_number (i.index_reg)))
5836 {
5837 if (operand_check == check_error)
5838 {
5839 i.error = invalid_vector_register_set;
5840 return 1;
5841 }
5842 if (operand_check != check_none)
5843 as_warn (_("index and destination registers should be distinct"));
5844 }
5845 }
43234a1e 5846 }
7bab8ab5 5847
43234a1e
L
5848 /* Check if broadcast is supported by the instruction and is applied
5849 to the memory operand. */
5850 if (i.broadcast)
5851 {
8e6e0792 5852 i386_operand_type type, overlap;
43234a1e
L
5853
5854 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 5855 and its broadcast bytes match the memory operand. */
32546502 5856 op = i.broadcast->operand;
8e6e0792 5857 if (!t->opcode_modifier.broadcast
c48dadc9 5858 || !(i.flags[op] & Operand_Mem)
c39e5b26 5859 || (!i.types[op].bitfield.unspecified
4a1b91ea 5860 && !match_broadcast_size (t, op)))
43234a1e
L
5861 {
5862 bad_broadcast:
5863 i.error = unsupported_broadcast;
5864 return 1;
5865 }
8e6e0792 5866
4a1b91ea
L
5867 i.broadcast->bytes = ((1 << (t->opcode_modifier.broadcast - 1))
5868 * i.broadcast->type);
8e6e0792 5869 operand_type_set (&type, 0);
4a1b91ea 5870 switch (i.broadcast->bytes)
8e6e0792 5871 {
4a1b91ea
L
5872 case 2:
5873 type.bitfield.word = 1;
5874 break;
5875 case 4:
5876 type.bitfield.dword = 1;
5877 break;
8e6e0792
JB
5878 case 8:
5879 type.bitfield.qword = 1;
5880 break;
5881 case 16:
5882 type.bitfield.xmmword = 1;
5883 break;
5884 case 32:
5885 type.bitfield.ymmword = 1;
5886 break;
5887 case 64:
5888 type.bitfield.zmmword = 1;
5889 break;
5890 default:
5891 goto bad_broadcast;
5892 }
5893
5894 overlap = operand_type_and (type, t->operand_types[op]);
bc49bfd8
JB
5895 if (t->operand_types[op].bitfield.class == RegSIMD
5896 && t->operand_types[op].bitfield.byte
5897 + t->operand_types[op].bitfield.word
5898 + t->operand_types[op].bitfield.dword
5899 + t->operand_types[op].bitfield.qword > 1)
5900 {
5901 overlap.bitfield.xmmword = 0;
5902 overlap.bitfield.ymmword = 0;
5903 overlap.bitfield.zmmword = 0;
5904 }
8e6e0792
JB
5905 if (operand_type_all_zero (&overlap))
5906 goto bad_broadcast;
5907
5908 if (t->opcode_modifier.checkregsize)
5909 {
5910 unsigned int j;
5911
e2195274 5912 type.bitfield.baseindex = 1;
8e6e0792
JB
5913 for (j = 0; j < i.operands; ++j)
5914 {
5915 if (j != op
5916 && !operand_type_register_match(i.types[j],
5917 t->operand_types[j],
5918 type,
5919 t->operand_types[op]))
5920 goto bad_broadcast;
5921 }
5922 }
43234a1e
L
5923 }
5924 /* If broadcast is supported in this instruction, we need to check if
5925 operand of one-element size isn't specified without broadcast. */
5926 else if (t->opcode_modifier.broadcast && i.mem_operands)
5927 {
5928 /* Find memory operand. */
5929 for (op = 0; op < i.operands; op++)
8dc0818e 5930 if (i.flags[op] & Operand_Mem)
43234a1e
L
5931 break;
5932 gas_assert (op < i.operands);
5933 /* Check size of the memory operand. */
4a1b91ea 5934 if (match_broadcast_size (t, op))
43234a1e
L
5935 {
5936 i.error = broadcast_needed;
5937 return 1;
5938 }
5939 }
c39e5b26
JB
5940 else
5941 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
5942
5943 /* Check if requested masking is supported. */
ae2387fe 5944 if (i.mask)
43234a1e 5945 {
ae2387fe
JB
5946 switch (t->opcode_modifier.masking)
5947 {
5948 case BOTH_MASKING:
5949 break;
5950 case MERGING_MASKING:
5951 if (i.mask->zeroing)
5952 {
5953 case 0:
5954 i.error = unsupported_masking;
5955 return 1;
5956 }
5957 break;
5958 case DYNAMIC_MASKING:
5959 /* Memory destinations allow only merging masking. */
5960 if (i.mask->zeroing && i.mem_operands)
5961 {
5962 /* Find memory operand. */
5963 for (op = 0; op < i.operands; op++)
c48dadc9 5964 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
5965 break;
5966 gas_assert (op < i.operands);
5967 if (op == i.operands - 1)
5968 {
5969 i.error = unsupported_masking;
5970 return 1;
5971 }
5972 }
5973 break;
5974 default:
5975 abort ();
5976 }
43234a1e
L
5977 }
5978
5979 /* Check if masking is applied to dest operand. */
5980 if (i.mask && (i.mask->operand != (int) (i.operands - 1)))
5981 {
5982 i.error = mask_not_on_destination;
5983 return 1;
5984 }
5985
43234a1e
L
5986 /* Check RC/SAE. */
5987 if (i.rounding)
5988 {
a80195f1
JB
5989 if (!t->opcode_modifier.sae
5990 || (i.rounding->type != saeonly && !t->opcode_modifier.staticrounding))
43234a1e
L
5991 {
5992 i.error = unsupported_rc_sae;
5993 return 1;
5994 }
5995 /* If the instruction has several immediate operands and one of
5996 them is rounding, the rounding operand should be the last
5997 immediate operand. */
5998 if (i.imm_operands > 1
5999 && i.rounding->operand != (int) (i.imm_operands - 1))
7bab8ab5 6000 {
43234a1e 6001 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
6002 return 1;
6003 }
6c30d220
L
6004 }
6005
da4977e0
JB
6006 /* Check the special Imm4 cases; must be the first operand. */
6007 if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)
6008 {
6009 if (i.op[0].imms->X_op != O_constant
6010 || !fits_in_imm4 (i.op[0].imms->X_add_number))
6011 {
6012 i.error = bad_imm4;
6013 return 1;
6014 }
6015
6016 /* Turn off Imm<N> so that update_imm won't complain. */
6017 operand_type_set (&i.types[0], 0);
6018 }
6019
43234a1e 6020 /* Check vector Disp8 operand. */
b5014f7a
JB
6021 if (t->opcode_modifier.disp8memshift
6022 && i.disp_encoding != disp_encoding_32bit)
43234a1e
L
6023 {
6024 if (i.broadcast)
4a1b91ea 6025 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 6026 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 6027 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
6028 else
6029 {
6030 const i386_operand_type *type = NULL;
6031
6032 i.memshift = 0;
6033 for (op = 0; op < i.operands; op++)
8dc0818e 6034 if (i.flags[op] & Operand_Mem)
7091c612 6035 {
4174bfff
JB
6036 if (t->opcode_modifier.evex == EVEXLIG)
6037 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
6038 else if (t->operand_types[op].bitfield.xmmword
6039 + t->operand_types[op].bitfield.ymmword
6040 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
6041 type = &t->operand_types[op];
6042 else if (!i.types[op].bitfield.unspecified)
6043 type = &i.types[op];
6044 }
3528c362 6045 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 6046 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
6047 {
6048 if (i.types[op].bitfield.zmmword)
6049 i.memshift = 6;
6050 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
6051 i.memshift = 5;
6052 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
6053 i.memshift = 4;
6054 }
6055
6056 if (type)
6057 {
6058 if (type->bitfield.zmmword)
6059 i.memshift = 6;
6060 else if (type->bitfield.ymmword)
6061 i.memshift = 5;
6062 else if (type->bitfield.xmmword)
6063 i.memshift = 4;
6064 }
6065
6066 /* For the check in fits_in_disp8(). */
6067 if (i.memshift == 0)
6068 i.memshift = -1;
6069 }
43234a1e
L
6070
6071 for (op = 0; op < i.operands; op++)
6072 if (operand_type_check (i.types[op], disp)
6073 && i.op[op].disps->X_op == O_constant)
6074 {
b5014f7a 6075 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 6076 {
b5014f7a
JB
6077 i.types[op].bitfield.disp8 = 1;
6078 return 0;
43234a1e 6079 }
b5014f7a 6080 i.types[op].bitfield.disp8 = 0;
43234a1e
L
6081 }
6082 }
b5014f7a
JB
6083
6084 i.memshift = 0;
43234a1e 6085
6c30d220
L
6086 return 0;
6087}
6088
da4977e0 6089/* Check if encoding requirements are met by the instruction. */
a683cc34
SP
6090
6091static int
da4977e0 6092VEX_check_encoding (const insn_template *t)
a683cc34 6093{
da4977e0
JB
6094 if (i.vec_encoding == vex_encoding_error)
6095 {
6096 i.error = unsupported;
6097 return 1;
6098 }
6099
86fa6981 6100 if (i.vec_encoding == vex_encoding_evex)
43234a1e 6101 {
86fa6981 6102 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 6103 if (!is_evex_encoding (t))
86fa6981
L
6104 {
6105 i.error = unsupported;
6106 return 1;
6107 }
6108 return 0;
43234a1e
L
6109 }
6110
a683cc34 6111 if (!t->opcode_modifier.vex)
86fa6981
L
6112 {
6113 /* This instruction template doesn't have VEX prefix. */
6114 if (i.vec_encoding != vex_encoding_default)
6115 {
6116 i.error = unsupported;
6117 return 1;
6118 }
6119 return 0;
6120 }
a683cc34 6121
a683cc34
SP
6122 return 0;
6123}
6124
d3ce72d0 6125static const insn_template *
83b16ac6 6126match_template (char mnem_suffix)
29b0f896
AM
6127{
6128 /* Points to template once we've found it. */
d3ce72d0 6129 const insn_template *t;
40fb9820 6130 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 6131 i386_operand_type overlap4;
29b0f896 6132 unsigned int found_reverse_match;
dc2be329 6133 i386_opcode_modifier suffix_check;
40fb9820 6134 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 6135 int addr_prefix_disp;
45a4bb20 6136 unsigned int j, size_match, check_register;
5614d22c 6137 enum i386_error specific_error = 0;
29b0f896 6138
c0f3af97
L
6139#if MAX_OPERANDS != 5
6140# error "MAX_OPERANDS must be 5."
f48ff2ae
L
6141#endif
6142
29b0f896 6143 found_reverse_match = 0;
539e75ad 6144 addr_prefix_disp = -1;
40fb9820 6145
dc2be329 6146 /* Prepare for mnemonic suffix check. */
40fb9820 6147 memset (&suffix_check, 0, sizeof (suffix_check));
dc2be329
L
6148 switch (mnem_suffix)
6149 {
6150 case BYTE_MNEM_SUFFIX:
6151 suffix_check.no_bsuf = 1;
6152 break;
6153 case WORD_MNEM_SUFFIX:
6154 suffix_check.no_wsuf = 1;
6155 break;
6156 case SHORT_MNEM_SUFFIX:
6157 suffix_check.no_ssuf = 1;
6158 break;
6159 case LONG_MNEM_SUFFIX:
6160 suffix_check.no_lsuf = 1;
6161 break;
6162 case QWORD_MNEM_SUFFIX:
6163 suffix_check.no_qsuf = 1;
6164 break;
6165 default:
6166 /* NB: In Intel syntax, normally we can check for memory operand
6167 size when there is no mnemonic suffix. But jmp and call have
6168 2 different encodings with Dword memory operand size, one with
6169 No_ldSuf and the other without. i.suffix is set to
6170 LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
6171 if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
6172 suffix_check.no_ldsuf = 1;
83b16ac6
JB
6173 }
6174
01559ecc
L
6175 /* Must have right number of operands. */
6176 i.error = number_of_operands_mismatch;
6177
45aa61fe 6178 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 6179 {
539e75ad 6180 addr_prefix_disp = -1;
dbbc8b7e 6181 found_reverse_match = 0;
539e75ad 6182
29b0f896
AM
6183 if (i.operands != t->operands)
6184 continue;
6185
50aecf8c 6186 /* Check processor support. */
a65babc9 6187 i.error = unsupported;
45a4bb20 6188 if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH)
50aecf8c
L
6189 continue;
6190
e1d4d893 6191 /* Check AT&T mnemonic. */
a65babc9 6192 i.error = unsupported_with_intel_mnemonic;
e1d4d893 6193 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
6194 continue;
6195
4b5aaf5f 6196 /* Check AT&T/Intel syntax. */
a65babc9 6197 i.error = unsupported_syntax;
5c07affc 6198 if ((intel_syntax && t->opcode_modifier.attsyntax)
4b5aaf5f 6199 || (!intel_syntax && t->opcode_modifier.intelsyntax))
1efbbeb4
L
6200 continue;
6201
4b5aaf5f
L
6202 /* Check Intel64/AMD64 ISA. */
6203 switch (isa64)
6204 {
6205 default:
6206 /* Default: Don't accept Intel64. */
6207 if (t->opcode_modifier.isa64 == INTEL64)
6208 continue;
6209 break;
6210 case amd64:
6211 /* -mamd64: Don't accept Intel64 and Intel64 only. */
6212 if (t->opcode_modifier.isa64 >= INTEL64)
6213 continue;
6214 break;
6215 case intel64:
6216 /* -mintel64: Don't accept AMD64. */
5990e377 6217 if (t->opcode_modifier.isa64 == AMD64 && flag_code == CODE_64BIT)
4b5aaf5f
L
6218 continue;
6219 break;
6220 }
6221
dc2be329 6222 /* Check the suffix. */
a65babc9 6223 i.error = invalid_instruction_suffix;
dc2be329
L
6224 if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
6225 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
6226 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
6227 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
6228 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
6229 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
83b16ac6 6230 continue;
29b0f896 6231
3ac21baa
JB
6232 size_match = operand_size_match (t);
6233 if (!size_match)
7d5e4556 6234 continue;
539e75ad 6235
6f2f06be
JB
6236 /* This is intentionally not
6237
0cfa3eb3 6238 if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
6f2f06be
JB
6239
6240 as the case of a missing * on the operand is accepted (perhaps with
6241 a warning, issued further down). */
0cfa3eb3 6242 if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
6f2f06be
JB
6243 {
6244 i.error = operand_type_mismatch;
6245 continue;
6246 }
6247
5c07affc
L
6248 for (j = 0; j < MAX_OPERANDS; j++)
6249 operand_types[j] = t->operand_types[j];
6250
e365e234
JB
6251 /* In general, don't allow
6252 - 64-bit operands outside of 64-bit mode,
6253 - 32-bit operands on pre-386. */
4873e243 6254 j = i.imm_operands + (t->operands > i.imm_operands + 1);
e365e234
JB
6255 if (((i.suffix == QWORD_MNEM_SUFFIX
6256 && flag_code != CODE_64BIT
6257 && (t->base_opcode != 0x0fc7
6258 || t->extension_opcode != 1 /* cmpxchg8b */))
6259 || (i.suffix == LONG_MNEM_SUFFIX
6260 && !cpu_arch_flags.bitfield.cpui386))
45aa61fe 6261 && (intel_syntax
3cd7f3e3 6262 ? (t->opcode_modifier.mnemonicsize != IGNORESIZE
45aa61fe
AM
6263 && !intel_float_operand (t->name))
6264 : intel_float_operand (t->name) != 2)
4873e243
JB
6265 && (t->operands == i.imm_operands
6266 || (operand_types[i.imm_operands].bitfield.class != RegMMX
6267 && operand_types[i.imm_operands].bitfield.class != RegSIMD
6268 && operand_types[i.imm_operands].bitfield.class != RegMask)
6269 || (operand_types[j].bitfield.class != RegMMX
6270 && operand_types[j].bitfield.class != RegSIMD
6271 && operand_types[j].bitfield.class != RegMask))
6272 && !t->opcode_modifier.vecsib)
192dc9c6
JB
6273 continue;
6274
29b0f896 6275 /* Do not verify operands when there are none. */
e365e234 6276 if (!t->operands)
da4977e0
JB
6277 {
6278 if (VEX_check_encoding (t))
6279 {
6280 specific_error = i.error;
6281 continue;
6282 }
6283
6284 /* We've found a match; break out of loop. */
6285 break;
6286 }
252b5132 6287
48bcea9f
JB
6288 if (!t->opcode_modifier.jump
6289 || t->opcode_modifier.jump == JUMP_ABSOLUTE)
6290 {
6291 /* There should be only one Disp operand. */
6292 for (j = 0; j < MAX_OPERANDS; j++)
6293 if (operand_type_check (operand_types[j], disp))
539e75ad 6294 break;
48bcea9f
JB
6295 if (j < MAX_OPERANDS)
6296 {
6297 bfd_boolean override = (i.prefix[ADDR_PREFIX] != 0);
6298
6299 addr_prefix_disp = j;
6300
6301 /* Address size prefix will turn Disp64/Disp32S/Disp32/Disp16
6302 operand into Disp32/Disp32/Disp16/Disp32 operand. */
6303 switch (flag_code)
40fb9820 6304 {
48bcea9f
JB
6305 case CODE_16BIT:
6306 override = !override;
6307 /* Fall through. */
6308 case CODE_32BIT:
6309 if (operand_types[j].bitfield.disp32
6310 && operand_types[j].bitfield.disp16)
40fb9820 6311 {
48bcea9f
JB
6312 operand_types[j].bitfield.disp16 = override;
6313 operand_types[j].bitfield.disp32 = !override;
40fb9820 6314 }
48bcea9f
JB
6315 operand_types[j].bitfield.disp32s = 0;
6316 operand_types[j].bitfield.disp64 = 0;
6317 break;
6318
6319 case CODE_64BIT:
6320 if (operand_types[j].bitfield.disp32s
6321 || operand_types[j].bitfield.disp64)
40fb9820 6322 {
48bcea9f
JB
6323 operand_types[j].bitfield.disp64 &= !override;
6324 operand_types[j].bitfield.disp32s &= !override;
6325 operand_types[j].bitfield.disp32 = override;
40fb9820 6326 }
48bcea9f
JB
6327 operand_types[j].bitfield.disp16 = 0;
6328 break;
40fb9820 6329 }
539e75ad 6330 }
48bcea9f 6331 }
539e75ad 6332
02a86693
L
6333 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
6334 if (i.reloc[0] == BFD_RELOC_386_GOT32 && t->base_opcode == 0xa0)
6335 continue;
6336
56ffb741 6337 /* We check register size if needed. */
e2195274
JB
6338 if (t->opcode_modifier.checkregsize)
6339 {
6340 check_register = (1 << t->operands) - 1;
6341 if (i.broadcast)
6342 check_register &= ~(1 << i.broadcast->operand);
6343 }
6344 else
6345 check_register = 0;
6346
c6fb90c8 6347 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
6348 switch (t->operands)
6349 {
6350 case 1:
40fb9820 6351 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
6352 continue;
6353 break;
6354 case 2:
33eaf5de 6355 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
6356 only in 32bit mode and we can use opcode 0x90. In 64bit
6357 mode, we can't use 0x90 for xchg %eax, %eax since it should
6358 zero-extend %eax to %rax. */
6359 if (flag_code == CODE_64BIT
6360 && t->base_opcode == 0x90
75e5731b
JB
6361 && i.types[0].bitfield.instance == Accum
6362 && i.types[0].bitfield.dword
6363 && i.types[1].bitfield.instance == Accum
6364 && i.types[1].bitfield.dword)
8b38ad71 6365 continue;
1212781b
JB
6366 /* xrelease mov %eax, <disp> is another special case. It must not
6367 match the accumulator-only encoding of mov. */
6368 if (flag_code != CODE_64BIT
6369 && i.hle_prefix
6370 && t->base_opcode == 0xa0
75e5731b 6371 && i.types[0].bitfield.instance == Accum
8dc0818e 6372 && (i.flags[1] & Operand_Mem))
1212781b 6373 continue;
f5eb1d70
JB
6374 /* Fall through. */
6375
6376 case 3:
3ac21baa
JB
6377 if (!(size_match & MATCH_STRAIGHT))
6378 goto check_reverse;
64c49ab3
JB
6379 /* Reverse direction of operands if swapping is possible in the first
6380 place (operands need to be symmetric) and
6381 - the load form is requested, and the template is a store form,
6382 - the store form is requested, and the template is a load form,
6383 - the non-default (swapped) form is requested. */
6384 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 6385 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
6386 && !operand_type_all_zero (&overlap1))
6387 switch (i.dir_encoding)
6388 {
6389 case dir_encoding_load:
6390 if (operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6391 || t->opcode_modifier.regmem)
64c49ab3
JB
6392 goto check_reverse;
6393 break;
6394
6395 case dir_encoding_store:
6396 if (!operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6397 && !t->opcode_modifier.regmem)
64c49ab3
JB
6398 goto check_reverse;
6399 break;
6400
6401 case dir_encoding_swap:
6402 goto check_reverse;
6403
6404 case dir_encoding_default:
6405 break;
6406 }
86fa6981 6407 /* If we want store form, we skip the current load. */
64c49ab3
JB
6408 if ((i.dir_encoding == dir_encoding_store
6409 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
6410 && i.mem_operands == 0
6411 && t->opcode_modifier.load)
fa99fab2 6412 continue;
1a0670f3 6413 /* Fall through. */
f48ff2ae 6414 case 4:
c0f3af97 6415 case 5:
c6fb90c8 6416 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
6417 if (!operand_type_match (overlap0, i.types[0])
6418 || !operand_type_match (overlap1, i.types[1])
e2195274 6419 || ((check_register & 3) == 3
dc821c5f 6420 && !operand_type_register_match (i.types[0],
40fb9820 6421 operand_types[0],
dc821c5f 6422 i.types[1],
40fb9820 6423 operand_types[1])))
29b0f896
AM
6424 {
6425 /* Check if other direction is valid ... */
38e314eb 6426 if (!t->opcode_modifier.d)
29b0f896
AM
6427 continue;
6428
dc1e8a47 6429 check_reverse:
3ac21baa
JB
6430 if (!(size_match & MATCH_REVERSE))
6431 continue;
29b0f896 6432 /* Try reversing direction of operands. */
f5eb1d70
JB
6433 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
6434 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 6435 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 6436 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 6437 || (check_register
dc821c5f 6438 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
6439 operand_types[i.operands - 1],
6440 i.types[i.operands - 1],
45664ddb 6441 operand_types[0])))
29b0f896
AM
6442 {
6443 /* Does not match either direction. */
6444 continue;
6445 }
38e314eb 6446 /* found_reverse_match holds which of D or FloatR
29b0f896 6447 we've found. */
38e314eb
JB
6448 if (!t->opcode_modifier.d)
6449 found_reverse_match = 0;
6450 else if (operand_types[0].bitfield.tbyte)
8a2ed489 6451 found_reverse_match = Opcode_FloatD;
dbbc8b7e 6452 else if (operand_types[0].bitfield.xmmword
f5eb1d70 6453 || operand_types[i.operands - 1].bitfield.xmmword
3528c362
JB
6454 || operand_types[0].bitfield.class == RegMMX
6455 || operand_types[i.operands - 1].bitfield.class == RegMMX
dbbc8b7e
JB
6456 || is_any_vex_encoding(t))
6457 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
6458 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 6459 else
38e314eb 6460 found_reverse_match = Opcode_D;
40fb9820 6461 if (t->opcode_modifier.floatr)
8a2ed489 6462 found_reverse_match |= Opcode_FloatR;
29b0f896 6463 }
f48ff2ae 6464 else
29b0f896 6465 {
f48ff2ae 6466 /* Found a forward 2 operand match here. */
d1cbb4db
L
6467 switch (t->operands)
6468 {
c0f3af97
L
6469 case 5:
6470 overlap4 = operand_type_and (i.types[4],
6471 operand_types[4]);
1a0670f3 6472 /* Fall through. */
d1cbb4db 6473 case 4:
c6fb90c8
L
6474 overlap3 = operand_type_and (i.types[3],
6475 operand_types[3]);
1a0670f3 6476 /* Fall through. */
d1cbb4db 6477 case 3:
c6fb90c8
L
6478 overlap2 = operand_type_and (i.types[2],
6479 operand_types[2]);
d1cbb4db
L
6480 break;
6481 }
29b0f896 6482
f48ff2ae
L
6483 switch (t->operands)
6484 {
c0f3af97
L
6485 case 5:
6486 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 6487 || !operand_type_register_match (i.types[3],
c0f3af97 6488 operand_types[3],
c0f3af97
L
6489 i.types[4],
6490 operand_types[4]))
6491 continue;
1a0670f3 6492 /* Fall through. */
f48ff2ae 6493 case 4:
40fb9820 6494 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
6495 || ((check_register & 0xa) == 0xa
6496 && !operand_type_register_match (i.types[1],
f7768225
JB
6497 operand_types[1],
6498 i.types[3],
e2195274
JB
6499 operand_types[3]))
6500 || ((check_register & 0xc) == 0xc
6501 && !operand_type_register_match (i.types[2],
6502 operand_types[2],
6503 i.types[3],
6504 operand_types[3])))
f48ff2ae 6505 continue;
1a0670f3 6506 /* Fall through. */
f48ff2ae
L
6507 case 3:
6508 /* Here we make use of the fact that there are no
23e42951 6509 reverse match 3 operand instructions. */
40fb9820 6510 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
6511 || ((check_register & 5) == 5
6512 && !operand_type_register_match (i.types[0],
23e42951
JB
6513 operand_types[0],
6514 i.types[2],
e2195274
JB
6515 operand_types[2]))
6516 || ((check_register & 6) == 6
6517 && !operand_type_register_match (i.types[1],
6518 operand_types[1],
6519 i.types[2],
6520 operand_types[2])))
f48ff2ae
L
6521 continue;
6522 break;
6523 }
29b0f896 6524 }
f48ff2ae 6525 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
6526 slip through to break. */
6527 }
c0f3af97 6528
da4977e0
JB
6529 /* Check if vector operands are valid. */
6530 if (check_VecOperands (t))
6531 {
6532 specific_error = i.error;
6533 continue;
6534 }
6535
6536 /* Check if VEX/EVEX encoding requirements can be satisfied. */
6537 if (VEX_check_encoding (t))
5614d22c
JB
6538 {
6539 specific_error = i.error;
6540 continue;
6541 }
a683cc34 6542
29b0f896
AM
6543 /* We've found a match; break out of loop. */
6544 break;
6545 }
6546
6547 if (t == current_templates->end)
6548 {
6549 /* We found no match. */
a65babc9 6550 const char *err_msg;
5614d22c 6551 switch (specific_error ? specific_error : i.error)
a65babc9
L
6552 {
6553 default:
6554 abort ();
86e026a4 6555 case operand_size_mismatch:
a65babc9
L
6556 err_msg = _("operand size mismatch");
6557 break;
6558 case operand_type_mismatch:
6559 err_msg = _("operand type mismatch");
6560 break;
6561 case register_type_mismatch:
6562 err_msg = _("register type mismatch");
6563 break;
6564 case number_of_operands_mismatch:
6565 err_msg = _("number of operands mismatch");
6566 break;
6567 case invalid_instruction_suffix:
6568 err_msg = _("invalid instruction suffix");
6569 break;
6570 case bad_imm4:
4a2608e3 6571 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6572 break;
a65babc9
L
6573 case unsupported_with_intel_mnemonic:
6574 err_msg = _("unsupported with Intel mnemonic");
6575 break;
6576 case unsupported_syntax:
6577 err_msg = _("unsupported syntax");
6578 break;
6579 case unsupported:
35262a23 6580 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6581 current_templates->start->name);
6582 return NULL;
6c30d220
L
6583 case invalid_vsib_address:
6584 err_msg = _("invalid VSIB address");
6585 break;
7bab8ab5
JB
6586 case invalid_vector_register_set:
6587 err_msg = _("mask, index, and destination registers must be distinct");
6588 break;
6c30d220
L
6589 case unsupported_vector_index_register:
6590 err_msg = _("unsupported vector index register");
6591 break;
43234a1e
L
6592 case unsupported_broadcast:
6593 err_msg = _("unsupported broadcast");
6594 break;
43234a1e
L
6595 case broadcast_needed:
6596 err_msg = _("broadcast is needed for operand of such type");
6597 break;
6598 case unsupported_masking:
6599 err_msg = _("unsupported masking");
6600 break;
6601 case mask_not_on_destination:
6602 err_msg = _("mask not on destination operand");
6603 break;
6604 case no_default_mask:
6605 err_msg = _("default mask isn't allowed");
6606 break;
6607 case unsupported_rc_sae:
6608 err_msg = _("unsupported static rounding/sae");
6609 break;
6610 case rc_sae_operand_not_last_imm:
6611 if (intel_syntax)
6612 err_msg = _("RC/SAE operand must precede immediate operands");
6613 else
6614 err_msg = _("RC/SAE operand must follow immediate operands");
6615 break;
6616 case invalid_register_operand:
6617 err_msg = _("invalid register operand");
6618 break;
a65babc9
L
6619 }
6620 as_bad (_("%s for `%s'"), err_msg,
891edac4 6621 current_templates->start->name);
fa99fab2 6622 return NULL;
29b0f896 6623 }
252b5132 6624
29b0f896
AM
6625 if (!quiet_warnings)
6626 {
6627 if (!intel_syntax
0cfa3eb3 6628 && (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE)))
6f2f06be 6629 as_warn (_("indirect %s without `*'"), t->name);
29b0f896 6630
40fb9820 6631 if (t->opcode_modifier.isprefix
3cd7f3e3 6632 && t->opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6633 {
6634 /* Warn them that a data or address size prefix doesn't
6635 affect assembly of the next line of code. */
6636 as_warn (_("stand-alone `%s' prefix"), t->name);
6637 }
6638 }
6639
6640 /* Copy the template we found. */
6641 i.tm = *t;
539e75ad
L
6642
6643 if (addr_prefix_disp != -1)
6644 i.tm.operand_types[addr_prefix_disp]
6645 = operand_types[addr_prefix_disp];
6646
29b0f896
AM
6647 if (found_reverse_match)
6648 {
dfd69174
JB
6649 /* If we found a reverse match we must alter the opcode direction
6650 bit and clear/flip the regmem modifier one. found_reverse_match
6651 holds bits to change (different for int & float insns). */
29b0f896
AM
6652
6653 i.tm.base_opcode ^= found_reverse_match;
6654
f5eb1d70
JB
6655 i.tm.operand_types[0] = operand_types[i.operands - 1];
6656 i.tm.operand_types[i.operands - 1] = operand_types[0];
dfd69174
JB
6657
6658 /* Certain SIMD insns have their load forms specified in the opcode
6659 table, and hence we need to _set_ RegMem instead of clearing it.
6660 We need to avoid setting the bit though on insns like KMOVW. */
6661 i.tm.opcode_modifier.regmem
6662 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
6663 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
6664 && !i.tm.opcode_modifier.regmem;
29b0f896
AM
6665 }
6666
fa99fab2 6667 return t;
29b0f896
AM
6668}
6669
6670static int
e3bb37b5 6671check_string (void)
29b0f896 6672{
51c8edf6
JB
6673 unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
6674 unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
8dc0818e 6675
51c8edf6 6676 if (i.seg[op] != NULL && i.seg[op] != &es)
29b0f896 6677 {
51c8edf6
JB
6678 as_bad (_("`%s' operand %u must use `%ses' segment"),
6679 i.tm.name,
6680 intel_syntax ? i.tm.operands - es_op : es_op + 1,
6681 register_prefix);
6682 return 0;
29b0f896 6683 }
51c8edf6
JB
6684
6685 /* There's only ever one segment override allowed per instruction.
6686 This instruction possibly has a legal segment override on the
6687 second operand, so copy the segment to where non-string
6688 instructions store it, allowing common code. */
6689 i.seg[op] = i.seg[1];
6690
29b0f896
AM
6691 return 1;
6692}
6693
6694static int
543613e9 6695process_suffix (void)
29b0f896
AM
6696{
6697 /* If matched instruction specifies an explicit instruction mnemonic
6698 suffix, use it. */
673fe0f0 6699 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6700 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6701 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6702 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6703 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6704 i.suffix = QWORD_MNEM_SUFFIX;
13e600d0 6705 else if (i.reg_operands
c8f8eebc
JB
6706 && (i.operands > 1 || i.types[0].bitfield.class == Reg)
6707 && !i.tm.opcode_modifier.addrprefixopreg)
29b0f896 6708 {
65fca059
JB
6709 unsigned int numop = i.operands;
6710
6711 /* movsx/movzx want only their source operand considered here, for the
6712 ambiguity checking below. The suffix will be replaced afterwards
6713 to represent the destination (register). */
6714 if (((i.tm.base_opcode | 8) == 0xfbe && i.tm.opcode_modifier.w)
6715 || (i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64))
6716 --i.operands;
6717
643bb870
JB
6718 /* crc32 needs REX.W set regardless of suffix / source operand size. */
6719 if (i.tm.base_opcode == 0xf20f38f0
6720 && i.tm.operand_types[1].bitfield.qword)
6721 i.rex |= REX_W;
6722
29b0f896 6723 /* If there's no instruction mnemonic suffix we try to invent one
13e600d0 6724 based on GPR operands. */
29b0f896
AM
6725 if (!i.suffix)
6726 {
6727 /* We take i.suffix from the last register operand specified,
6728 Destination register type is more significant than source
381d071f
L
6729 register type. crc32 in SSE4.2 prefers source register
6730 type. */
1a035124 6731 unsigned int op = i.tm.base_opcode != 0xf20f38f0 ? i.operands : 1;
20592a94 6732
1a035124
JB
6733 while (op--)
6734 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
6735 || i.tm.operand_types[op].bitfield.instance == Accum)
6736 {
6737 if (i.types[op].bitfield.class != Reg)
6738 continue;
6739 if (i.types[op].bitfield.byte)
6740 i.suffix = BYTE_MNEM_SUFFIX;
6741 else if (i.types[op].bitfield.word)
6742 i.suffix = WORD_MNEM_SUFFIX;
6743 else if (i.types[op].bitfield.dword)
6744 i.suffix = LONG_MNEM_SUFFIX;
6745 else if (i.types[op].bitfield.qword)
6746 i.suffix = QWORD_MNEM_SUFFIX;
6747 else
6748 continue;
6749 break;
6750 }
65fca059
JB
6751
6752 /* As an exception, movsx/movzx silently default to a byte source
6753 in AT&T mode. */
6754 if ((i.tm.base_opcode | 8) == 0xfbe && i.tm.opcode_modifier.w
6755 && !i.suffix && !intel_syntax)
6756 i.suffix = BYTE_MNEM_SUFFIX;
29b0f896
AM
6757 }
6758 else if (i.suffix == BYTE_MNEM_SUFFIX)
6759 {
2eb952a4 6760 if (intel_syntax
3cd7f3e3 6761 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6762 && i.tm.opcode_modifier.no_bsuf)
6763 i.suffix = 0;
6764 else if (!check_byte_reg ())
29b0f896
AM
6765 return 0;
6766 }
6767 else if (i.suffix == LONG_MNEM_SUFFIX)
6768 {
2eb952a4 6769 if (intel_syntax
3cd7f3e3 6770 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6771 && i.tm.opcode_modifier.no_lsuf
6772 && !i.tm.opcode_modifier.todword
6773 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
6774 i.suffix = 0;
6775 else if (!check_long_reg ())
29b0f896
AM
6776 return 0;
6777 }
6778 else if (i.suffix == QWORD_MNEM_SUFFIX)
6779 {
955e1e6a 6780 if (intel_syntax
3cd7f3e3 6781 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6782 && i.tm.opcode_modifier.no_qsuf
6783 && !i.tm.opcode_modifier.todword
6784 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
6785 i.suffix = 0;
6786 else if (!check_qword_reg ())
29b0f896
AM
6787 return 0;
6788 }
6789 else if (i.suffix == WORD_MNEM_SUFFIX)
6790 {
2eb952a4 6791 if (intel_syntax
3cd7f3e3 6792 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6793 && i.tm.opcode_modifier.no_wsuf)
6794 i.suffix = 0;
6795 else if (!check_word_reg ())
29b0f896
AM
6796 return 0;
6797 }
3cd7f3e3
L
6798 else if (intel_syntax
6799 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6800 /* Do nothing if the instruction is going to ignore the prefix. */
6801 ;
6802 else
6803 abort ();
65fca059
JB
6804
6805 /* Undo the movsx/movzx change done above. */
6806 i.operands = numop;
29b0f896 6807 }
3cd7f3e3
L
6808 else if (i.tm.opcode_modifier.mnemonicsize == DEFAULTSIZE
6809 && !i.suffix)
29b0f896 6810 {
13e600d0
JB
6811 i.suffix = stackop_size;
6812 if (stackop_size == LONG_MNEM_SUFFIX)
06f74c5c
L
6813 {
6814 /* stackop_size is set to LONG_MNEM_SUFFIX for the
6815 .code16gcc directive to support 16-bit mode with
6816 32-bit address. For IRET without a suffix, generate
6817 16-bit IRET (opcode 0xcf) to return from an interrupt
6818 handler. */
13e600d0
JB
6819 if (i.tm.base_opcode == 0xcf)
6820 {
6821 i.suffix = WORD_MNEM_SUFFIX;
6822 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
6823 }
6824 /* Warn about changed behavior for segment register push/pop. */
6825 else if ((i.tm.base_opcode | 1) == 0x07)
6826 as_warn (_("generating 32-bit `%s', unlike earlier gas versions"),
6827 i.tm.name);
06f74c5c 6828 }
29b0f896 6829 }
c006a730 6830 else if (!i.suffix
0cfa3eb3
JB
6831 && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
6832 || i.tm.opcode_modifier.jump == JUMP_BYTE
6833 || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
64e74474
AM
6834 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
6835 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
6836 {
6837 switch (flag_code)
6838 {
6839 case CODE_64BIT:
40fb9820 6840 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a 6841 {
828c2a25
JB
6842 if (i.tm.opcode_modifier.jump == JUMP_BYTE
6843 || i.tm.opcode_modifier.no_lsuf)
6844 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a
JB
6845 break;
6846 }
1a0670f3 6847 /* Fall through. */
9306ca4a 6848 case CODE_32BIT:
40fb9820 6849 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
6850 i.suffix = LONG_MNEM_SUFFIX;
6851 break;
6852 case CODE_16BIT:
40fb9820 6853 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
6854 i.suffix = WORD_MNEM_SUFFIX;
6855 break;
6856 }
6857 }
252b5132 6858
c006a730 6859 if (!i.suffix
3cd7f3e3 6860 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8
JB
6861 /* Also cover lret/retf/iret in 64-bit mode. */
6862 || (flag_code == CODE_64BIT
6863 && !i.tm.opcode_modifier.no_lsuf
6864 && !i.tm.opcode_modifier.no_qsuf))
3cd7f3e3 6865 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
62b3f548
JB
6866 /* Accept FLDENV et al without suffix. */
6867 && (i.tm.opcode_modifier.no_ssuf || i.tm.opcode_modifier.floatmf))
29b0f896 6868 {
6c0946d0 6869 unsigned int suffixes, evex = 0;
c006a730
JB
6870
6871 suffixes = !i.tm.opcode_modifier.no_bsuf;
6872 if (!i.tm.opcode_modifier.no_wsuf)
6873 suffixes |= 1 << 1;
6874 if (!i.tm.opcode_modifier.no_lsuf)
6875 suffixes |= 1 << 2;
6876 if (!i.tm.opcode_modifier.no_ldsuf)
6877 suffixes |= 1 << 3;
6878 if (!i.tm.opcode_modifier.no_ssuf)
6879 suffixes |= 1 << 4;
6880 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
6881 suffixes |= 1 << 5;
6882
6c0946d0
JB
6883 /* For [XYZ]MMWORD operands inspect operand sizes. While generally
6884 also suitable for AT&T syntax mode, it was requested that this be
6885 restricted to just Intel syntax. */
b9915cbc 6886 if (intel_syntax && is_any_vex_encoding (&i.tm) && !i.broadcast)
6c0946d0 6887 {
b9915cbc 6888 unsigned int op;
6c0946d0 6889
b9915cbc 6890 for (op = 0; op < i.tm.operands; ++op)
6c0946d0 6891 {
b9915cbc
JB
6892 if (is_evex_encoding (&i.tm)
6893 && !cpu_arch_flags.bitfield.cpuavx512vl)
6c0946d0 6894 {
b9915cbc
JB
6895 if (i.tm.operand_types[op].bitfield.ymmword)
6896 i.tm.operand_types[op].bitfield.xmmword = 0;
6897 if (i.tm.operand_types[op].bitfield.zmmword)
6898 i.tm.operand_types[op].bitfield.ymmword = 0;
6899 if (!i.tm.opcode_modifier.evex
6900 || i.tm.opcode_modifier.evex == EVEXDYN)
6901 i.tm.opcode_modifier.evex = EVEX512;
6902 }
6c0946d0 6903
b9915cbc
JB
6904 if (i.tm.operand_types[op].bitfield.xmmword
6905 + i.tm.operand_types[op].bitfield.ymmword
6906 + i.tm.operand_types[op].bitfield.zmmword < 2)
6907 continue;
6c0946d0 6908
b9915cbc
JB
6909 /* Any properly sized operand disambiguates the insn. */
6910 if (i.types[op].bitfield.xmmword
6911 || i.types[op].bitfield.ymmword
6912 || i.types[op].bitfield.zmmword)
6913 {
6914 suffixes &= ~(7 << 6);
6915 evex = 0;
6916 break;
6917 }
6c0946d0 6918
b9915cbc
JB
6919 if ((i.flags[op] & Operand_Mem)
6920 && i.tm.operand_types[op].bitfield.unspecified)
6921 {
6922 if (i.tm.operand_types[op].bitfield.xmmword)
6923 suffixes |= 1 << 6;
6924 if (i.tm.operand_types[op].bitfield.ymmword)
6925 suffixes |= 1 << 7;
6926 if (i.tm.operand_types[op].bitfield.zmmword)
6927 suffixes |= 1 << 8;
6928 if (is_evex_encoding (&i.tm))
6929 evex = EVEX512;
6c0946d0
JB
6930 }
6931 }
6932 }
6933
6934 /* Are multiple suffixes / operand sizes allowed? */
c006a730 6935 if (suffixes & (suffixes - 1))
9306ca4a 6936 {
873494c8 6937 if (intel_syntax
3cd7f3e3 6938 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8 6939 || operand_check == check_error))
9306ca4a 6940 {
c006a730 6941 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
9306ca4a
JB
6942 return 0;
6943 }
c006a730 6944 if (operand_check == check_error)
9306ca4a 6945 {
c006a730
JB
6946 as_bad (_("no instruction mnemonic suffix given and "
6947 "no register operands; can't size `%s'"), i.tm.name);
9306ca4a
JB
6948 return 0;
6949 }
c006a730 6950 if (operand_check == check_warning)
873494c8
JB
6951 as_warn (_("%s; using default for `%s'"),
6952 intel_syntax
6953 ? _("ambiguous operand size")
6954 : _("no instruction mnemonic suffix given and "
6955 "no register operands"),
6956 i.tm.name);
c006a730
JB
6957
6958 if (i.tm.opcode_modifier.floatmf)
6959 i.suffix = SHORT_MNEM_SUFFIX;
65fca059
JB
6960 else if ((i.tm.base_opcode | 8) == 0xfbe
6961 || (i.tm.base_opcode == 0x63
6962 && i.tm.cpu_flags.bitfield.cpu64))
6963 /* handled below */;
6c0946d0
JB
6964 else if (evex)
6965 i.tm.opcode_modifier.evex = evex;
c006a730
JB
6966 else if (flag_code == CODE_16BIT)
6967 i.suffix = WORD_MNEM_SUFFIX;
1a035124 6968 else if (!i.tm.opcode_modifier.no_lsuf)
c006a730 6969 i.suffix = LONG_MNEM_SUFFIX;
1a035124
JB
6970 else
6971 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a 6972 }
29b0f896 6973 }
252b5132 6974
65fca059
JB
6975 if ((i.tm.base_opcode | 8) == 0xfbe
6976 || (i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64))
6977 {
6978 /* In Intel syntax, movsx/movzx must have a "suffix" (checked above).
6979 In AT&T syntax, if there is no suffix (warned about above), the default
6980 will be byte extension. */
6981 if (i.tm.opcode_modifier.w && i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
6982 i.tm.base_opcode |= 1;
6983
6984 /* For further processing, the suffix should represent the destination
6985 (register). This is already the case when one was used with
6986 mov[sz][bw]*, but we need to replace it for mov[sz]x, or if there was
6987 no suffix to begin with. */
6988 if (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63 || !i.suffix)
6989 {
6990 if (i.types[1].bitfield.word)
6991 i.suffix = WORD_MNEM_SUFFIX;
6992 else if (i.types[1].bitfield.qword)
6993 i.suffix = QWORD_MNEM_SUFFIX;
6994 else
6995 i.suffix = LONG_MNEM_SUFFIX;
6996
6997 i.tm.opcode_modifier.w = 0;
6998 }
6999 }
7000
50128d0c
JB
7001 if (!i.tm.opcode_modifier.modrm && i.reg_operands && i.tm.operands < 3)
7002 i.short_form = (i.tm.operand_types[0].bitfield.class == Reg)
7003 != (i.tm.operand_types[1].bitfield.class == Reg);
7004
d2224064
JB
7005 /* Change the opcode based on the operand size given by i.suffix. */
7006 switch (i.suffix)
29b0f896 7007 {
d2224064
JB
7008 /* Size floating point instruction. */
7009 case LONG_MNEM_SUFFIX:
7010 if (i.tm.opcode_modifier.floatmf)
7011 {
7012 i.tm.base_opcode ^= 4;
7013 break;
7014 }
7015 /* fall through */
7016 case WORD_MNEM_SUFFIX:
7017 case QWORD_MNEM_SUFFIX:
29b0f896 7018 /* It's not a byte, select word/dword operation. */
40fb9820 7019 if (i.tm.opcode_modifier.w)
29b0f896 7020 {
50128d0c 7021 if (i.short_form)
29b0f896
AM
7022 i.tm.base_opcode |= 8;
7023 else
7024 i.tm.base_opcode |= 1;
7025 }
d2224064
JB
7026 /* fall through */
7027 case SHORT_MNEM_SUFFIX:
29b0f896
AM
7028 /* Now select between word & dword operations via the operand
7029 size prefix, except for instructions that will ignore this
7030 prefix anyway. */
c8f8eebc 7031 if (i.suffix != QWORD_MNEM_SUFFIX
3cd7f3e3 7032 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
c8f8eebc
JB
7033 && !i.tm.opcode_modifier.floatmf
7034 && !is_any_vex_encoding (&i.tm)
7035 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
7036 || (flag_code == CODE_64BIT
7037 && i.tm.opcode_modifier.jump == JUMP_BYTE)))
24eab124
AM
7038 {
7039 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 7040
0cfa3eb3 7041 if (i.tm.opcode_modifier.jump == JUMP_BYTE) /* jcxz, loop */
29b0f896 7042 prefix = ADDR_PREFIX_OPCODE;
252b5132 7043
29b0f896
AM
7044 if (!add_prefix (prefix))
7045 return 0;
24eab124 7046 }
252b5132 7047
29b0f896
AM
7048 /* Set mode64 for an operand. */
7049 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 7050 && flag_code == CODE_64BIT
d2224064 7051 && !i.tm.opcode_modifier.norex64
4ed21b58 7052 && !i.tm.opcode_modifier.vexw
46e883c5 7053 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
7054 need rex64. */
7055 && ! (i.operands == 2
7056 && i.tm.base_opcode == 0x90
7057 && i.tm.extension_opcode == None
75e5731b
JB
7058 && i.types[0].bitfield.instance == Accum
7059 && i.types[0].bitfield.qword
7060 && i.types[1].bitfield.instance == Accum
7061 && i.types[1].bitfield.qword))
d2224064 7062 i.rex |= REX_W;
3e73aa7c 7063
d2224064 7064 break;
29b0f896 7065 }
7ecd2f8b 7066
c8f8eebc 7067 if (i.tm.opcode_modifier.addrprefixopreg)
c0a30a9f 7068 {
c8f8eebc
JB
7069 gas_assert (!i.suffix);
7070 gas_assert (i.reg_operands);
c0a30a9f 7071
c8f8eebc
JB
7072 if (i.tm.operand_types[0].bitfield.instance == Accum
7073 || i.operands == 1)
7074 {
7075 /* The address size override prefix changes the size of the
7076 first operand. */
7077 if (flag_code == CODE_64BIT
7078 && i.op[0].regs->reg_type.bitfield.word)
7079 {
7080 as_bad (_("16-bit addressing unavailable for `%s'"),
7081 i.tm.name);
7082 return 0;
7083 }
7084
7085 if ((flag_code == CODE_32BIT
7086 ? i.op[0].regs->reg_type.bitfield.word
7087 : i.op[0].regs->reg_type.bitfield.dword)
7088 && !add_prefix (ADDR_PREFIX_OPCODE))
7089 return 0;
7090 }
c0a30a9f
L
7091 else
7092 {
c8f8eebc
JB
7093 /* Check invalid register operand when the address size override
7094 prefix changes the size of register operands. */
7095 unsigned int op;
7096 enum { need_word, need_dword, need_qword } need;
7097
7098 if (flag_code == CODE_32BIT)
7099 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
7100 else if (i.prefix[ADDR_PREFIX])
c0a30a9f
L
7101 need = need_dword;
7102 else
7103 need = flag_code == CODE_64BIT ? need_qword : need_word;
c0a30a9f 7104
c8f8eebc
JB
7105 for (op = 0; op < i.operands; op++)
7106 {
7107 if (i.types[op].bitfield.class != Reg)
7108 continue;
7109
7110 switch (need)
7111 {
7112 case need_word:
7113 if (i.op[op].regs->reg_type.bitfield.word)
7114 continue;
7115 break;
7116 case need_dword:
7117 if (i.op[op].regs->reg_type.bitfield.dword)
7118 continue;
7119 break;
7120 case need_qword:
7121 if (i.op[op].regs->reg_type.bitfield.qword)
7122 continue;
7123 break;
7124 }
7125
7126 as_bad (_("invalid register operand size for `%s'"),
7127 i.tm.name);
7128 return 0;
7129 }
7130 }
c0a30a9f
L
7131 }
7132
29b0f896
AM
7133 return 1;
7134}
3e73aa7c 7135
29b0f896 7136static int
543613e9 7137check_byte_reg (void)
29b0f896
AM
7138{
7139 int op;
543613e9 7140
29b0f896
AM
7141 for (op = i.operands; --op >= 0;)
7142 {
dc821c5f 7143 /* Skip non-register operands. */
bab6aec1 7144 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
7145 continue;
7146
29b0f896
AM
7147 /* If this is an eight bit register, it's OK. If it's the 16 or
7148 32 bit version of an eight bit register, we will just use the
7149 low portion, and that's OK too. */
dc821c5f 7150 if (i.types[op].bitfield.byte)
29b0f896
AM
7151 continue;
7152
5a819eb9 7153 /* I/O port address operands are OK too. */
75e5731b
JB
7154 if (i.tm.operand_types[op].bitfield.instance == RegD
7155 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
7156 continue;
7157
9706160a
JB
7158 /* crc32 only wants its source operand checked here. */
7159 if (i.tm.base_opcode == 0xf20f38f0 && op)
9344ff29
L
7160 continue;
7161
29b0f896 7162 /* Any other register is bad. */
73c76375
JB
7163 as_bad (_("`%s%s' not allowed with `%s%c'"),
7164 register_prefix, i.op[op].regs->reg_name,
7165 i.tm.name, i.suffix);
7166 return 0;
29b0f896
AM
7167 }
7168 return 1;
7169}
7170
7171static int
e3bb37b5 7172check_long_reg (void)
29b0f896
AM
7173{
7174 int op;
7175
7176 for (op = i.operands; --op >= 0;)
dc821c5f 7177 /* Skip non-register operands. */
bab6aec1 7178 if (i.types[op].bitfield.class != Reg)
dc821c5f 7179 continue;
29b0f896
AM
7180 /* Reject eight bit registers, except where the template requires
7181 them. (eg. movzb) */
dc821c5f 7182 else if (i.types[op].bitfield.byte
bab6aec1 7183 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7184 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7185 && (i.tm.operand_types[op].bitfield.word
7186 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7187 {
a540244d
L
7188 as_bad (_("`%s%s' not allowed with `%s%c'"),
7189 register_prefix,
29b0f896
AM
7190 i.op[op].regs->reg_name,
7191 i.tm.name,
7192 i.suffix);
7193 return 0;
7194 }
be4c5e58
L
7195 /* Error if the e prefix on a general reg is missing. */
7196 else if (i.types[op].bitfield.word
bab6aec1 7197 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7198 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7199 && i.tm.operand_types[op].bitfield.dword)
29b0f896 7200 {
be4c5e58
L
7201 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7202 register_prefix, i.op[op].regs->reg_name,
7203 i.suffix);
7204 return 0;
252b5132 7205 }
e4630f71 7206 /* Warn if the r prefix on a general reg is present. */
dc821c5f 7207 else if (i.types[op].bitfield.qword
bab6aec1 7208 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7209 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7210 && i.tm.operand_types[op].bitfield.dword)
252b5132 7211 {
34828aad 7212 if (intel_syntax
65fca059 7213 && i.tm.opcode_modifier.toqword
3528c362 7214 && i.types[0].bitfield.class != RegSIMD)
34828aad 7215 {
ca61edf2 7216 /* Convert to QWORD. We want REX byte. */
34828aad
L
7217 i.suffix = QWORD_MNEM_SUFFIX;
7218 }
7219 else
7220 {
2b5d6a91 7221 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7222 register_prefix, i.op[op].regs->reg_name,
7223 i.suffix);
7224 return 0;
7225 }
29b0f896
AM
7226 }
7227 return 1;
7228}
252b5132 7229
29b0f896 7230static int
e3bb37b5 7231check_qword_reg (void)
29b0f896
AM
7232{
7233 int op;
252b5132 7234
29b0f896 7235 for (op = i.operands; --op >= 0; )
dc821c5f 7236 /* Skip non-register operands. */
bab6aec1 7237 if (i.types[op].bitfield.class != Reg)
dc821c5f 7238 continue;
29b0f896
AM
7239 /* Reject eight bit registers, except where the template requires
7240 them. (eg. movzb) */
dc821c5f 7241 else if (i.types[op].bitfield.byte
bab6aec1 7242 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7243 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7244 && (i.tm.operand_types[op].bitfield.word
7245 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7246 {
a540244d
L
7247 as_bad (_("`%s%s' not allowed with `%s%c'"),
7248 register_prefix,
29b0f896
AM
7249 i.op[op].regs->reg_name,
7250 i.tm.name,
7251 i.suffix);
7252 return 0;
7253 }
e4630f71 7254 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
7255 else if ((i.types[op].bitfield.word
7256 || i.types[op].bitfield.dword)
bab6aec1 7257 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7258 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7259 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
7260 {
7261 /* Prohibit these changes in the 64bit mode, since the
7262 lowering is more complicated. */
34828aad 7263 if (intel_syntax
ca61edf2 7264 && i.tm.opcode_modifier.todword
3528c362 7265 && i.types[0].bitfield.class != RegSIMD)
34828aad 7266 {
ca61edf2 7267 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
7268 i.suffix = LONG_MNEM_SUFFIX;
7269 }
7270 else
7271 {
2b5d6a91 7272 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7273 register_prefix, i.op[op].regs->reg_name,
7274 i.suffix);
7275 return 0;
7276 }
252b5132 7277 }
29b0f896
AM
7278 return 1;
7279}
252b5132 7280
29b0f896 7281static int
e3bb37b5 7282check_word_reg (void)
29b0f896
AM
7283{
7284 int op;
7285 for (op = i.operands; --op >= 0;)
dc821c5f 7286 /* Skip non-register operands. */
bab6aec1 7287 if (i.types[op].bitfield.class != Reg)
dc821c5f 7288 continue;
29b0f896
AM
7289 /* Reject eight bit registers, except where the template requires
7290 them. (eg. movzb) */
dc821c5f 7291 else if (i.types[op].bitfield.byte
bab6aec1 7292 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7293 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7294 && (i.tm.operand_types[op].bitfield.word
7295 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7296 {
a540244d
L
7297 as_bad (_("`%s%s' not allowed with `%s%c'"),
7298 register_prefix,
29b0f896
AM
7299 i.op[op].regs->reg_name,
7300 i.tm.name,
7301 i.suffix);
7302 return 0;
7303 }
9706160a
JB
7304 /* Error if the e or r prefix on a general reg is present. */
7305 else if ((i.types[op].bitfield.dword
dc821c5f 7306 || i.types[op].bitfield.qword)
bab6aec1 7307 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7308 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7309 && i.tm.operand_types[op].bitfield.word)
252b5132 7310 {
9706160a
JB
7311 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7312 register_prefix, i.op[op].regs->reg_name,
7313 i.suffix);
7314 return 0;
29b0f896
AM
7315 }
7316 return 1;
7317}
252b5132 7318
29b0f896 7319static int
40fb9820 7320update_imm (unsigned int j)
29b0f896 7321{
bc0844ae 7322 i386_operand_type overlap = i.types[j];
40fb9820
L
7323 if ((overlap.bitfield.imm8
7324 || overlap.bitfield.imm8s
7325 || overlap.bitfield.imm16
7326 || overlap.bitfield.imm32
7327 || overlap.bitfield.imm32s
7328 || overlap.bitfield.imm64)
0dfbf9d7
L
7329 && !operand_type_equal (&overlap, &imm8)
7330 && !operand_type_equal (&overlap, &imm8s)
7331 && !operand_type_equal (&overlap, &imm16)
7332 && !operand_type_equal (&overlap, &imm32)
7333 && !operand_type_equal (&overlap, &imm32s)
7334 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
7335 {
7336 if (i.suffix)
7337 {
40fb9820
L
7338 i386_operand_type temp;
7339
0dfbf9d7 7340 operand_type_set (&temp, 0);
7ab9ffdd 7341 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
7342 {
7343 temp.bitfield.imm8 = overlap.bitfield.imm8;
7344 temp.bitfield.imm8s = overlap.bitfield.imm8s;
7345 }
7346 else if (i.suffix == WORD_MNEM_SUFFIX)
7347 temp.bitfield.imm16 = overlap.bitfield.imm16;
7348 else if (i.suffix == QWORD_MNEM_SUFFIX)
7349 {
7350 temp.bitfield.imm64 = overlap.bitfield.imm64;
7351 temp.bitfield.imm32s = overlap.bitfield.imm32s;
7352 }
7353 else
7354 temp.bitfield.imm32 = overlap.bitfield.imm32;
7355 overlap = temp;
29b0f896 7356 }
0dfbf9d7
L
7357 else if (operand_type_equal (&overlap, &imm16_32_32s)
7358 || operand_type_equal (&overlap, &imm16_32)
7359 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 7360 {
40fb9820 7361 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 7362 overlap = imm16;
40fb9820 7363 else
65da13b5 7364 overlap = imm32s;
29b0f896 7365 }
0dfbf9d7
L
7366 if (!operand_type_equal (&overlap, &imm8)
7367 && !operand_type_equal (&overlap, &imm8s)
7368 && !operand_type_equal (&overlap, &imm16)
7369 && !operand_type_equal (&overlap, &imm32)
7370 && !operand_type_equal (&overlap, &imm32s)
7371 && !operand_type_equal (&overlap, &imm64))
29b0f896 7372 {
4eed87de
AM
7373 as_bad (_("no instruction mnemonic suffix given; "
7374 "can't determine immediate size"));
29b0f896
AM
7375 return 0;
7376 }
7377 }
40fb9820 7378 i.types[j] = overlap;
29b0f896 7379
40fb9820
L
7380 return 1;
7381}
7382
7383static int
7384finalize_imm (void)
7385{
bc0844ae 7386 unsigned int j, n;
29b0f896 7387
bc0844ae
L
7388 /* Update the first 2 immediate operands. */
7389 n = i.operands > 2 ? 2 : i.operands;
7390 if (n)
7391 {
7392 for (j = 0; j < n; j++)
7393 if (update_imm (j) == 0)
7394 return 0;
40fb9820 7395
bc0844ae
L
7396 /* The 3rd operand can't be immediate operand. */
7397 gas_assert (operand_type_check (i.types[2], imm) == 0);
7398 }
29b0f896
AM
7399
7400 return 1;
7401}
7402
7403static int
e3bb37b5 7404process_operands (void)
29b0f896
AM
7405{
7406 /* Default segment register this instruction will use for memory
7407 accesses. 0 means unknown. This is only for optimizing out
7408 unnecessary segment overrides. */
7409 const seg_entry *default_seg = 0;
7410
a5aeccd9
JB
7411 if (i.tm.opcode_modifier.sse2avx)
7412 {
7413 /* Legacy encoded insns allow explicit REX prefixes, so these prefixes
7414 need converting. */
7415 i.rex |= i.prefix[REX_PREFIX] & (REX_W | REX_R | REX_X | REX_B);
7416 i.prefix[REX_PREFIX] = 0;
7417 i.rex_encoding = 0;
7418 }
7419
2426c15f 7420 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 7421 {
91d6fa6a
NC
7422 unsigned int dupl = i.operands;
7423 unsigned int dest = dupl - 1;
9fcfb3d7
L
7424 unsigned int j;
7425
c0f3af97 7426 /* The destination must be an xmm register. */
9c2799c2 7427 gas_assert (i.reg_operands
91d6fa6a 7428 && MAX_OPERANDS > dupl
7ab9ffdd 7429 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 7430
75e5731b 7431 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7432 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 7433 {
8cd7925b 7434 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
7435 {
7436 /* Keep xmm0 for instructions with VEX prefix and 3
7437 sources. */
75e5731b 7438 i.tm.operand_types[0].bitfield.instance = InstanceNone;
3528c362 7439 i.tm.operand_types[0].bitfield.class = RegSIMD;
c0f3af97
L
7440 goto duplicate;
7441 }
e2ec9d29 7442 else
c0f3af97
L
7443 {
7444 /* We remove the first xmm0 and keep the number of
7445 operands unchanged, which in fact duplicates the
7446 destination. */
7447 for (j = 1; j < i.operands; j++)
7448 {
7449 i.op[j - 1] = i.op[j];
7450 i.types[j - 1] = i.types[j];
7451 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
8dc0818e 7452 i.flags[j - 1] = i.flags[j];
c0f3af97
L
7453 }
7454 }
7455 }
7456 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 7457 {
91d6fa6a 7458 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
7459 && (i.tm.opcode_modifier.vexsources
7460 == VEX3SOURCES));
c0f3af97
L
7461
7462 /* Add the implicit xmm0 for instructions with VEX prefix
7463 and 3 sources. */
7464 for (j = i.operands; j > 0; j--)
7465 {
7466 i.op[j] = i.op[j - 1];
7467 i.types[j] = i.types[j - 1];
7468 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 7469 i.flags[j] = i.flags[j - 1];
c0f3af97
L
7470 }
7471 i.op[0].regs
7472 = (const reg_entry *) hash_find (reg_hash, "xmm0");
7ab9ffdd 7473 i.types[0] = regxmm;
c0f3af97
L
7474 i.tm.operand_types[0] = regxmm;
7475
7476 i.operands += 2;
7477 i.reg_operands += 2;
7478 i.tm.operands += 2;
7479
91d6fa6a 7480 dupl++;
c0f3af97 7481 dest++;
91d6fa6a
NC
7482 i.op[dupl] = i.op[dest];
7483 i.types[dupl] = i.types[dest];
7484 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7485 i.flags[dupl] = i.flags[dest];
e2ec9d29 7486 }
c0f3af97
L
7487 else
7488 {
dc1e8a47 7489 duplicate:
c0f3af97
L
7490 i.operands++;
7491 i.reg_operands++;
7492 i.tm.operands++;
7493
91d6fa6a
NC
7494 i.op[dupl] = i.op[dest];
7495 i.types[dupl] = i.types[dest];
7496 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7497 i.flags[dupl] = i.flags[dest];
c0f3af97
L
7498 }
7499
7500 if (i.tm.opcode_modifier.immext)
7501 process_immext ();
7502 }
75e5731b 7503 else if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7504 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
7505 {
7506 unsigned int j;
7507
9fcfb3d7
L
7508 for (j = 1; j < i.operands; j++)
7509 {
7510 i.op[j - 1] = i.op[j];
7511 i.types[j - 1] = i.types[j];
7512
7513 /* We need to adjust fields in i.tm since they are used by
7514 build_modrm_byte. */
7515 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
7516
7517 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
7518 }
7519
e2ec9d29
L
7520 i.operands--;
7521 i.reg_operands--;
e2ec9d29
L
7522 i.tm.operands--;
7523 }
920d2ddc
IT
7524 else if (i.tm.opcode_modifier.implicitquadgroup)
7525 {
a477a8c4
JB
7526 unsigned int regnum, first_reg_in_group, last_reg_in_group;
7527
920d2ddc 7528 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 7529 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
7530 regnum = register_number (i.op[1].regs);
7531 first_reg_in_group = regnum & ~3;
7532 last_reg_in_group = first_reg_in_group + 3;
7533 if (regnum != first_reg_in_group)
7534 as_warn (_("source register `%s%s' implicitly denotes"
7535 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
7536 register_prefix, i.op[1].regs->reg_name,
7537 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
7538 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
7539 i.tm.name);
7540 }
e2ec9d29
L
7541 else if (i.tm.opcode_modifier.regkludge)
7542 {
7543 /* The imul $imm, %reg instruction is converted into
7544 imul $imm, %reg, %reg, and the clr %reg instruction
7545 is converted into xor %reg, %reg. */
7546
7547 unsigned int first_reg_op;
7548
7549 if (operand_type_check (i.types[0], reg))
7550 first_reg_op = 0;
7551 else
7552 first_reg_op = 1;
7553 /* Pretend we saw the extra register operand. */
9c2799c2 7554 gas_assert (i.reg_operands == 1
7ab9ffdd 7555 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
7556 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
7557 i.types[first_reg_op + 1] = i.types[first_reg_op];
7558 i.operands++;
7559 i.reg_operands++;
29b0f896
AM
7560 }
7561
85b80b0f 7562 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
7563 {
7564 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
7565 must be put into the modrm byte). Now, we make the modrm and
7566 index base bytes based on all the info we've collected. */
29b0f896
AM
7567
7568 default_seg = build_modrm_byte ();
7569 }
00cee14f 7570 else if (i.types[0].bitfield.class == SReg)
85b80b0f
JB
7571 {
7572 if (flag_code != CODE_64BIT
7573 ? i.tm.base_opcode == POP_SEG_SHORT
7574 && i.op[0].regs->reg_num == 1
7575 : (i.tm.base_opcode | 1) == POP_SEG386_SHORT
7576 && i.op[0].regs->reg_num < 4)
7577 {
7578 as_bad (_("you can't `%s %s%s'"),
7579 i.tm.name, register_prefix, i.op[0].regs->reg_name);
7580 return 0;
7581 }
7582 if ( i.op[0].regs->reg_num > 3 && i.tm.opcode_length == 1 )
7583 {
7584 i.tm.base_opcode ^= POP_SEG_SHORT ^ POP_SEG386_SHORT;
7585 i.tm.opcode_length = 2;
7586 }
7587 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
7588 }
8a2ed489 7589 else if ((i.tm.base_opcode & ~0x3) == MOV_AX_DISP32)
29b0f896
AM
7590 {
7591 default_seg = &ds;
7592 }
40fb9820 7593 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
7594 {
7595 /* For the string instructions that allow a segment override
7596 on one of their operands, the default segment is ds. */
7597 default_seg = &ds;
7598 }
50128d0c 7599 else if (i.short_form)
85b80b0f
JB
7600 {
7601 /* The register or float register operand is in operand
7602 0 or 1. */
bab6aec1 7603 unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
85b80b0f
JB
7604
7605 /* Register goes in low 3 bits of opcode. */
7606 i.tm.base_opcode |= i.op[op].regs->reg_num;
7607 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7608 i.rex |= REX_B;
7609 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
7610 {
7611 /* Warn about some common errors, but press on regardless.
7612 The first case can be generated by gcc (<= 2.8.1). */
7613 if (i.operands == 2)
7614 {
7615 /* Reversed arguments on faddp, fsubp, etc. */
7616 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
7617 register_prefix, i.op[!intel_syntax].regs->reg_name,
7618 register_prefix, i.op[intel_syntax].regs->reg_name);
7619 }
7620 else
7621 {
7622 /* Extraneous `l' suffix on fp insn. */
7623 as_warn (_("translating to `%s %s%s'"), i.tm.name,
7624 register_prefix, i.op[0].regs->reg_name);
7625 }
7626 }
7627 }
29b0f896 7628
514a8bb0 7629 if ((i.seg[0] || i.prefix[SEG_PREFIX])
514a8bb0
JB
7630 && i.tm.base_opcode == 0x8d /* lea */
7631 && !is_any_vex_encoding(&i.tm))
92334ad2
JB
7632 {
7633 if (!quiet_warnings)
7634 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
7635 if (optimize)
7636 {
7637 i.seg[0] = NULL;
7638 i.prefix[SEG_PREFIX] = 0;
7639 }
7640 }
52271982
AM
7641
7642 /* If a segment was explicitly specified, and the specified segment
b6773884
JB
7643 is neither the default nor the one already recorded from a prefix,
7644 use an opcode prefix to select it. If we never figured out what
7645 the default segment is, then default_seg will be zero at this
7646 point, and the specified segment prefix will always be used. */
7647 if (i.seg[0]
7648 && i.seg[0] != default_seg
7649 && i.seg[0]->seg_prefix != i.prefix[SEG_PREFIX])
29b0f896
AM
7650 {
7651 if (!add_prefix (i.seg[0]->seg_prefix))
7652 return 0;
7653 }
7654 return 1;
7655}
7656
a5aeccd9
JB
7657static INLINE void set_rex_vrex (const reg_entry *r, unsigned int rex_bit,
7658 bfd_boolean do_sse2avx)
7659{
7660 if (r->reg_flags & RegRex)
7661 {
7662 if (i.rex & rex_bit)
7663 as_bad (_("same type of prefix used twice"));
7664 i.rex |= rex_bit;
7665 }
7666 else if (do_sse2avx && (i.rex & rex_bit) && i.vex.register_specifier)
7667 {
7668 gas_assert (i.vex.register_specifier == r);
7669 i.vex.register_specifier += 8;
7670 }
7671
7672 if (r->reg_flags & RegVRex)
7673 i.vrex |= rex_bit;
7674}
7675
29b0f896 7676static const seg_entry *
e3bb37b5 7677build_modrm_byte (void)
29b0f896
AM
7678{
7679 const seg_entry *default_seg = 0;
c0f3af97 7680 unsigned int source, dest;
8cd7925b 7681 int vex_3_sources;
c0f3af97 7682
8cd7925b 7683 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
7684 if (vex_3_sources)
7685 {
91d6fa6a 7686 unsigned int nds, reg_slot;
4c2c6516 7687 expressionS *exp;
c0f3af97 7688
6b8d3588 7689 dest = i.operands - 1;
c0f3af97 7690 nds = dest - 1;
922d8de8 7691
a683cc34 7692 /* There are 2 kinds of instructions:
bed3d976 7693 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 7694 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 7695 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 7696 ZMM register.
bed3d976 7697 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 7698 plus 1 memory operand, with VexXDS. */
922d8de8 7699 gas_assert ((i.reg_operands == 4
bed3d976
JB
7700 || (i.reg_operands == 3 && i.mem_operands == 1))
7701 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323 7702 && i.tm.opcode_modifier.vexw
3528c362 7703 && i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 7704
48db9223
JB
7705 /* If VexW1 is set, the first non-immediate operand is the source and
7706 the second non-immediate one is encoded in the immediate operand. */
7707 if (i.tm.opcode_modifier.vexw == VEXW1)
7708 {
7709 source = i.imm_operands;
7710 reg_slot = i.imm_operands + 1;
7711 }
7712 else
7713 {
7714 source = i.imm_operands + 1;
7715 reg_slot = i.imm_operands;
7716 }
7717
a683cc34 7718 if (i.imm_operands == 0)
bed3d976
JB
7719 {
7720 /* When there is no immediate operand, generate an 8bit
7721 immediate operand to encode the first operand. */
7722 exp = &im_expressions[i.imm_operands++];
7723 i.op[i.operands].imms = exp;
7724 i.types[i.operands] = imm8;
7725 i.operands++;
7726
3528c362 7727 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
bed3d976
JB
7728 exp->X_op = O_constant;
7729 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
7730 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
7731 }
922d8de8 7732 else
bed3d976 7733 {
9d3bf266
JB
7734 gas_assert (i.imm_operands == 1);
7735 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
7736 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 7737
9d3bf266
JB
7738 /* Turn on Imm8 again so that output_imm will generate it. */
7739 i.types[0].bitfield.imm8 = 1;
bed3d976 7740
3528c362 7741 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
9d3bf266 7742 i.op[0].imms->X_add_number
bed3d976 7743 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 7744 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 7745 }
a683cc34 7746
3528c362 7747 gas_assert (i.tm.operand_types[nds].bitfield.class == RegSIMD);
dae39acc 7748 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
7749 }
7750 else
7751 source = dest = 0;
29b0f896
AM
7752
7753 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
7754 implicit registers do not count. If there are 3 register
7755 operands, it must be a instruction with VexNDS. For a
7756 instruction with VexNDD, the destination register is encoded
7757 in VEX prefix. If there are 4 register operands, it must be
7758 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
7759 if (i.mem_operands == 0
7760 && ((i.reg_operands == 2
2426c15f 7761 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 7762 || (i.reg_operands == 3
2426c15f 7763 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 7764 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 7765 {
cab737b9
L
7766 switch (i.operands)
7767 {
7768 case 2:
7769 source = 0;
7770 break;
7771 case 3:
c81128dc
L
7772 /* When there are 3 operands, one of them may be immediate,
7773 which may be the first or the last operand. Otherwise,
c0f3af97
L
7774 the first operand must be shift count register (cl) or it
7775 is an instruction with VexNDS. */
9c2799c2 7776 gas_assert (i.imm_operands == 1
7ab9ffdd 7777 || (i.imm_operands == 0
2426c15f 7778 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
75e5731b
JB
7779 || (i.types[0].bitfield.instance == RegC
7780 && i.types[0].bitfield.byte))));
40fb9820 7781 if (operand_type_check (i.types[0], imm)
75e5731b
JB
7782 || (i.types[0].bitfield.instance == RegC
7783 && i.types[0].bitfield.byte))
40fb9820
L
7784 source = 1;
7785 else
7786 source = 0;
cab737b9
L
7787 break;
7788 case 4:
368d64cc
L
7789 /* When there are 4 operands, the first two must be 8bit
7790 immediate operands. The source operand will be the 3rd
c0f3af97
L
7791 one.
7792
7793 For instructions with VexNDS, if the first operand
7794 an imm8, the source operand is the 2nd one. If the last
7795 operand is imm8, the source operand is the first one. */
9c2799c2 7796 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
7797 && i.types[0].bitfield.imm8
7798 && i.types[1].bitfield.imm8)
2426c15f 7799 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
7800 && i.imm_operands == 1
7801 && (i.types[0].bitfield.imm8
43234a1e
L
7802 || i.types[i.operands - 1].bitfield.imm8
7803 || i.rounding)));
9f2670f2
L
7804 if (i.imm_operands == 2)
7805 source = 2;
7806 else
c0f3af97
L
7807 {
7808 if (i.types[0].bitfield.imm8)
7809 source = 1;
7810 else
7811 source = 0;
7812 }
c0f3af97
L
7813 break;
7814 case 5:
e771e7c9 7815 if (is_evex_encoding (&i.tm))
43234a1e
L
7816 {
7817 /* For EVEX instructions, when there are 5 operands, the
7818 first one must be immediate operand. If the second one
7819 is immediate operand, the source operand is the 3th
7820 one. If the last one is immediate operand, the source
7821 operand is the 2nd one. */
7822 gas_assert (i.imm_operands == 2
7823 && i.tm.opcode_modifier.sae
7824 && operand_type_check (i.types[0], imm));
7825 if (operand_type_check (i.types[1], imm))
7826 source = 2;
7827 else if (operand_type_check (i.types[4], imm))
7828 source = 1;
7829 else
7830 abort ();
7831 }
cab737b9
L
7832 break;
7833 default:
7834 abort ();
7835 }
7836
c0f3af97
L
7837 if (!vex_3_sources)
7838 {
7839 dest = source + 1;
7840
43234a1e
L
7841 /* RC/SAE operand could be between DEST and SRC. That happens
7842 when one operand is GPR and the other one is XMM/YMM/ZMM
7843 register. */
7844 if (i.rounding && i.rounding->operand == (int) dest)
7845 dest++;
7846
2426c15f 7847 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 7848 {
43234a1e 7849 /* For instructions with VexNDS, the register-only source
c5d0745b 7850 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
dfd69174 7851 register. It is encoded in VEX prefix. */
f12dc422
L
7852
7853 i386_operand_type op;
7854 unsigned int vvvv;
7855
7856 /* Check register-only source operand when two source
7857 operands are swapped. */
7858 if (!i.tm.operand_types[source].bitfield.baseindex
7859 && i.tm.operand_types[dest].bitfield.baseindex)
7860 {
7861 vvvv = source;
7862 source = dest;
7863 }
7864 else
7865 vvvv = dest;
7866
7867 op = i.tm.operand_types[vvvv];
c0f3af97 7868 if ((dest + 1) >= i.operands
bab6aec1 7869 || ((op.bitfield.class != Reg
dc821c5f 7870 || (!op.bitfield.dword && !op.bitfield.qword))
3528c362 7871 && op.bitfield.class != RegSIMD
43234a1e 7872 && !operand_type_equal (&op, &regmask)))
c0f3af97 7873 abort ();
f12dc422 7874 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
7875 dest++;
7876 }
7877 }
29b0f896
AM
7878
7879 i.rm.mode = 3;
dfd69174
JB
7880 /* One of the register operands will be encoded in the i.rm.reg
7881 field, the other in the combined i.rm.mode and i.rm.regmem
29b0f896
AM
7882 fields. If no form of this instruction supports a memory
7883 destination operand, then we assume the source operand may
7884 sometimes be a memory operand and so we need to store the
7885 destination in the i.rm.reg field. */
dfd69174 7886 if (!i.tm.opcode_modifier.regmem
40fb9820 7887 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
7888 {
7889 i.rm.reg = i.op[dest].regs->reg_num;
7890 i.rm.regmem = i.op[source].regs->reg_num;
3528c362
JB
7891 if (i.op[dest].regs->reg_type.bitfield.class == RegMMX
7892 || i.op[source].regs->reg_type.bitfield.class == RegMMX)
b4a3a7b4 7893 i.has_regmmx = TRUE;
3528c362
JB
7894 else if (i.op[dest].regs->reg_type.bitfield.class == RegSIMD
7895 || i.op[source].regs->reg_type.bitfield.class == RegSIMD)
b4a3a7b4
L
7896 {
7897 if (i.types[dest].bitfield.zmmword
7898 || i.types[source].bitfield.zmmword)
7899 i.has_regzmm = TRUE;
7900 else if (i.types[dest].bitfield.ymmword
7901 || i.types[source].bitfield.ymmword)
7902 i.has_regymm = TRUE;
7903 else
7904 i.has_regxmm = TRUE;
7905 }
a5aeccd9
JB
7906 set_rex_vrex (i.op[dest].regs, REX_R, i.tm.opcode_modifier.sse2avx);
7907 set_rex_vrex (i.op[source].regs, REX_B, FALSE);
29b0f896
AM
7908 }
7909 else
7910 {
7911 i.rm.reg = i.op[source].regs->reg_num;
7912 i.rm.regmem = i.op[dest].regs->reg_num;
a5aeccd9
JB
7913 set_rex_vrex (i.op[dest].regs, REX_B, i.tm.opcode_modifier.sse2avx);
7914 set_rex_vrex (i.op[source].regs, REX_R, FALSE);
29b0f896 7915 }
e0c7f900 7916 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 7917 {
4a5c67ed 7918 if (i.types[!i.tm.opcode_modifier.regmem].bitfield.class != RegCR)
c4a530c5 7919 abort ();
e0c7f900 7920 i.rex &= ~REX_R;
c4a530c5
JB
7921 add_prefix (LOCK_PREFIX_OPCODE);
7922 }
29b0f896
AM
7923 }
7924 else
7925 { /* If it's not 2 reg operands... */
c0f3af97
L
7926 unsigned int mem;
7927
29b0f896
AM
7928 if (i.mem_operands)
7929 {
7930 unsigned int fake_zero_displacement = 0;
99018f42 7931 unsigned int op;
4eed87de 7932
7ab9ffdd 7933 for (op = 0; op < i.operands; op++)
8dc0818e 7934 if (i.flags[op] & Operand_Mem)
7ab9ffdd 7935 break;
7ab9ffdd 7936 gas_assert (op < i.operands);
29b0f896 7937
6c30d220
L
7938 if (i.tm.opcode_modifier.vecsib)
7939 {
e968fc9b 7940 if (i.index_reg->reg_num == RegIZ)
6c30d220
L
7941 abort ();
7942
7943 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7944 if (!i.base_reg)
7945 {
7946 i.sib.base = NO_BASE_REGISTER;
7947 i.sib.scale = i.log2_scale_factor;
7948 i.types[op].bitfield.disp8 = 0;
7949 i.types[op].bitfield.disp16 = 0;
7950 i.types[op].bitfield.disp64 = 0;
43083a50 7951 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
6c30d220
L
7952 {
7953 /* Must be 32 bit */
7954 i.types[op].bitfield.disp32 = 1;
7955 i.types[op].bitfield.disp32s = 0;
7956 }
7957 else
7958 {
7959 i.types[op].bitfield.disp32 = 0;
7960 i.types[op].bitfield.disp32s = 1;
7961 }
7962 }
7963 i.sib.index = i.index_reg->reg_num;
a5aeccd9 7964 set_rex_vrex (i.index_reg, REX_X, FALSE);
6c30d220
L
7965 }
7966
29b0f896
AM
7967 default_seg = &ds;
7968
7969 if (i.base_reg == 0)
7970 {
7971 i.rm.mode = 0;
7972 if (!i.disp_operands)
9bb129e8 7973 fake_zero_displacement = 1;
29b0f896
AM
7974 if (i.index_reg == 0)
7975 {
73053c1f
JB
7976 i386_operand_type newdisp;
7977
6c30d220 7978 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 7979 /* Operand is just <disp> */
20f0a1fc 7980 if (flag_code == CODE_64BIT)
29b0f896
AM
7981 {
7982 /* 64bit mode overwrites the 32bit absolute
7983 addressing by RIP relative addressing and
7984 absolute addressing is encoded by one of the
7985 redundant SIB forms. */
7986 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7987 i.sib.base = NO_BASE_REGISTER;
7988 i.sib.index = NO_INDEX_REGISTER;
73053c1f 7989 newdisp = (!i.prefix[ADDR_PREFIX] ? disp32s : disp32);
20f0a1fc 7990 }
fc225355
L
7991 else if ((flag_code == CODE_16BIT)
7992 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
7993 {
7994 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 7995 newdisp = disp16;
20f0a1fc
NC
7996 }
7997 else
7998 {
7999 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 8000 newdisp = disp32;
29b0f896 8001 }
73053c1f
JB
8002 i.types[op] = operand_type_and_not (i.types[op], anydisp);
8003 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 8004 }
6c30d220 8005 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 8006 {
6c30d220 8007 /* !i.base_reg && i.index_reg */
e968fc9b 8008 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8009 i.sib.index = NO_INDEX_REGISTER;
8010 else
8011 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8012 i.sib.base = NO_BASE_REGISTER;
8013 i.sib.scale = i.log2_scale_factor;
8014 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
8015 i.types[op].bitfield.disp8 = 0;
8016 i.types[op].bitfield.disp16 = 0;
8017 i.types[op].bitfield.disp64 = 0;
43083a50 8018 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
40fb9820
L
8019 {
8020 /* Must be 32 bit */
8021 i.types[op].bitfield.disp32 = 1;
8022 i.types[op].bitfield.disp32s = 0;
8023 }
29b0f896 8024 else
40fb9820
L
8025 {
8026 i.types[op].bitfield.disp32 = 0;
8027 i.types[op].bitfield.disp32s = 1;
8028 }
29b0f896 8029 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8030 i.rex |= REX_X;
29b0f896
AM
8031 }
8032 }
8033 /* RIP addressing for 64bit mode. */
e968fc9b 8034 else if (i.base_reg->reg_num == RegIP)
29b0f896 8035 {
6c30d220 8036 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 8037 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
8038 i.types[op].bitfield.disp8 = 0;
8039 i.types[op].bitfield.disp16 = 0;
8040 i.types[op].bitfield.disp32 = 0;
8041 i.types[op].bitfield.disp32s = 1;
8042 i.types[op].bitfield.disp64 = 0;
71903a11 8043 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
8044 if (! i.disp_operands)
8045 fake_zero_displacement = 1;
29b0f896 8046 }
dc821c5f 8047 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 8048 {
6c30d220 8049 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
8050 switch (i.base_reg->reg_num)
8051 {
8052 case 3: /* (%bx) */
8053 if (i.index_reg == 0)
8054 i.rm.regmem = 7;
8055 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
8056 i.rm.regmem = i.index_reg->reg_num - 6;
8057 break;
8058 case 5: /* (%bp) */
8059 default_seg = &ss;
8060 if (i.index_reg == 0)
8061 {
8062 i.rm.regmem = 6;
40fb9820 8063 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
8064 {
8065 /* fake (%bp) into 0(%bp) */
b5014f7a 8066 i.types[op].bitfield.disp8 = 1;
252b5132 8067 fake_zero_displacement = 1;
29b0f896
AM
8068 }
8069 }
8070 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
8071 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
8072 break;
8073 default: /* (%si) -> 4 or (%di) -> 5 */
8074 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
8075 }
8076 i.rm.mode = mode_from_disp_size (i.types[op]);
8077 }
8078 else /* i.base_reg and 32/64 bit mode */
8079 {
8080 if (flag_code == CODE_64BIT
40fb9820
L
8081 && operand_type_check (i.types[op], disp))
8082 {
73053c1f
JB
8083 i.types[op].bitfield.disp16 = 0;
8084 i.types[op].bitfield.disp64 = 0;
40fb9820 8085 if (i.prefix[ADDR_PREFIX] == 0)
73053c1f
JB
8086 {
8087 i.types[op].bitfield.disp32 = 0;
8088 i.types[op].bitfield.disp32s = 1;
8089 }
40fb9820 8090 else
73053c1f
JB
8091 {
8092 i.types[op].bitfield.disp32 = 1;
8093 i.types[op].bitfield.disp32s = 0;
8094 }
40fb9820 8095 }
20f0a1fc 8096
6c30d220
L
8097 if (!i.tm.opcode_modifier.vecsib)
8098 i.rm.regmem = i.base_reg->reg_num;
29b0f896 8099 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 8100 i.rex |= REX_B;
29b0f896
AM
8101 i.sib.base = i.base_reg->reg_num;
8102 /* x86-64 ignores REX prefix bit here to avoid decoder
8103 complications. */
848930b2
JB
8104 if (!(i.base_reg->reg_flags & RegRex)
8105 && (i.base_reg->reg_num == EBP_REG_NUM
8106 || i.base_reg->reg_num == ESP_REG_NUM))
29b0f896 8107 default_seg = &ss;
848930b2 8108 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 8109 {
848930b2 8110 fake_zero_displacement = 1;
b5014f7a 8111 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
8112 }
8113 i.sib.scale = i.log2_scale_factor;
8114 if (i.index_reg == 0)
8115 {
6c30d220 8116 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
8117 /* <disp>(%esp) becomes two byte modrm with no index
8118 register. We've already stored the code for esp
8119 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
8120 Any base register besides %esp will not use the
8121 extra modrm byte. */
8122 i.sib.index = NO_INDEX_REGISTER;
29b0f896 8123 }
6c30d220 8124 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 8125 {
e968fc9b 8126 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8127 i.sib.index = NO_INDEX_REGISTER;
8128 else
8129 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8130 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8131 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8132 i.rex |= REX_X;
29b0f896 8133 }
67a4f2b7
AO
8134
8135 if (i.disp_operands
8136 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
8137 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
8138 i.rm.mode = 0;
8139 else
a501d77e
L
8140 {
8141 if (!fake_zero_displacement
8142 && !i.disp_operands
8143 && i.disp_encoding)
8144 {
8145 fake_zero_displacement = 1;
8146 if (i.disp_encoding == disp_encoding_8bit)
8147 i.types[op].bitfield.disp8 = 1;
8148 else
8149 i.types[op].bitfield.disp32 = 1;
8150 }
8151 i.rm.mode = mode_from_disp_size (i.types[op]);
8152 }
29b0f896 8153 }
252b5132 8154
29b0f896
AM
8155 if (fake_zero_displacement)
8156 {
8157 /* Fakes a zero displacement assuming that i.types[op]
8158 holds the correct displacement size. */
8159 expressionS *exp;
8160
9c2799c2 8161 gas_assert (i.op[op].disps == 0);
29b0f896
AM
8162 exp = &disp_expressions[i.disp_operands++];
8163 i.op[op].disps = exp;
8164 exp->X_op = O_constant;
8165 exp->X_add_number = 0;
8166 exp->X_add_symbol = (symbolS *) 0;
8167 exp->X_op_symbol = (symbolS *) 0;
8168 }
c0f3af97
L
8169
8170 mem = op;
29b0f896 8171 }
c0f3af97
L
8172 else
8173 mem = ~0;
252b5132 8174
8c43a48b 8175 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
8176 {
8177 if (operand_type_check (i.types[0], imm))
8178 i.vex.register_specifier = NULL;
8179 else
8180 {
8181 /* VEX.vvvv encodes one of the sources when the first
8182 operand is not an immediate. */
1ef99a7b 8183 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8184 i.vex.register_specifier = i.op[0].regs;
8185 else
8186 i.vex.register_specifier = i.op[1].regs;
8187 }
8188
8189 /* Destination is a XMM register encoded in the ModRM.reg
8190 and VEX.R bit. */
8191 i.rm.reg = i.op[2].regs->reg_num;
8192 if ((i.op[2].regs->reg_flags & RegRex) != 0)
8193 i.rex |= REX_R;
8194
8195 /* ModRM.rm and VEX.B encodes the other source. */
8196 if (!i.mem_operands)
8197 {
8198 i.rm.mode = 3;
8199
1ef99a7b 8200 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8201 i.rm.regmem = i.op[1].regs->reg_num;
8202 else
8203 i.rm.regmem = i.op[0].regs->reg_num;
8204
8205 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8206 i.rex |= REX_B;
8207 }
8208 }
2426c15f 8209 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
8210 {
8211 i.vex.register_specifier = i.op[2].regs;
8212 if (!i.mem_operands)
8213 {
8214 i.rm.mode = 3;
8215 i.rm.regmem = i.op[1].regs->reg_num;
8216 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8217 i.rex |= REX_B;
8218 }
8219 }
29b0f896
AM
8220 /* Fill in i.rm.reg or i.rm.regmem field with register operand
8221 (if any) based on i.tm.extension_opcode. Again, we must be
8222 careful to make sure that segment/control/debug/test/MMX
8223 registers are coded into the i.rm.reg field. */
f88c9eb0 8224 else if (i.reg_operands)
29b0f896 8225 {
99018f42 8226 unsigned int op;
7ab9ffdd
L
8227 unsigned int vex_reg = ~0;
8228
8229 for (op = 0; op < i.operands; op++)
b4a3a7b4 8230 {
bab6aec1 8231 if (i.types[op].bitfield.class == Reg
f74a6307
JB
8232 || i.types[op].bitfield.class == RegBND
8233 || i.types[op].bitfield.class == RegMask
00cee14f 8234 || i.types[op].bitfield.class == SReg
4a5c67ed
JB
8235 || i.types[op].bitfield.class == RegCR
8236 || i.types[op].bitfield.class == RegDR
8237 || i.types[op].bitfield.class == RegTR)
b4a3a7b4 8238 break;
3528c362 8239 if (i.types[op].bitfield.class == RegSIMD)
b4a3a7b4
L
8240 {
8241 if (i.types[op].bitfield.zmmword)
8242 i.has_regzmm = TRUE;
8243 else if (i.types[op].bitfield.ymmword)
8244 i.has_regymm = TRUE;
8245 else
8246 i.has_regxmm = TRUE;
8247 break;
8248 }
3528c362 8249 if (i.types[op].bitfield.class == RegMMX)
b4a3a7b4
L
8250 {
8251 i.has_regmmx = TRUE;
8252 break;
8253 }
8254 }
c0209578 8255
7ab9ffdd
L
8256 if (vex_3_sources)
8257 op = dest;
2426c15f 8258 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
8259 {
8260 /* For instructions with VexNDS, the register-only
8261 source operand is encoded in VEX prefix. */
8262 gas_assert (mem != (unsigned int) ~0);
c0f3af97 8263
7ab9ffdd 8264 if (op > mem)
c0f3af97 8265 {
7ab9ffdd
L
8266 vex_reg = op++;
8267 gas_assert (op < i.operands);
c0f3af97
L
8268 }
8269 else
c0f3af97 8270 {
f12dc422
L
8271 /* Check register-only source operand when two source
8272 operands are swapped. */
8273 if (!i.tm.operand_types[op].bitfield.baseindex
8274 && i.tm.operand_types[op + 1].bitfield.baseindex)
8275 {
8276 vex_reg = op;
8277 op += 2;
8278 gas_assert (mem == (vex_reg + 1)
8279 && op < i.operands);
8280 }
8281 else
8282 {
8283 vex_reg = op + 1;
8284 gas_assert (vex_reg < i.operands);
8285 }
c0f3af97 8286 }
7ab9ffdd 8287 }
2426c15f 8288 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 8289 {
f12dc422 8290 /* For instructions with VexNDD, the register destination
7ab9ffdd 8291 is encoded in VEX prefix. */
f12dc422
L
8292 if (i.mem_operands == 0)
8293 {
8294 /* There is no memory operand. */
8295 gas_assert ((op + 2) == i.operands);
8296 vex_reg = op + 1;
8297 }
8298 else
8d63c93e 8299 {
ed438a93
JB
8300 /* There are only 2 non-immediate operands. */
8301 gas_assert (op < i.imm_operands + 2
8302 && i.operands == i.imm_operands + 2);
8303 vex_reg = i.imm_operands + 1;
f12dc422 8304 }
7ab9ffdd
L
8305 }
8306 else
8307 gas_assert (op < i.operands);
99018f42 8308
7ab9ffdd
L
8309 if (vex_reg != (unsigned int) ~0)
8310 {
f12dc422 8311 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 8312
bab6aec1 8313 if ((type->bitfield.class != Reg
dc821c5f 8314 || (!type->bitfield.dword && !type->bitfield.qword))
3528c362 8315 && type->bitfield.class != RegSIMD
43234a1e 8316 && !operand_type_equal (type, &regmask))
7ab9ffdd 8317 abort ();
f88c9eb0 8318
7ab9ffdd
L
8319 i.vex.register_specifier = i.op[vex_reg].regs;
8320 }
8321
1b9f0c97
L
8322 /* Don't set OP operand twice. */
8323 if (vex_reg != op)
7ab9ffdd 8324 {
1b9f0c97
L
8325 /* If there is an extension opcode to put here, the
8326 register number must be put into the regmem field. */
8327 if (i.tm.extension_opcode != None)
8328 {
8329 i.rm.regmem = i.op[op].regs->reg_num;
a5aeccd9
JB
8330 set_rex_vrex (i.op[op].regs, REX_B,
8331 i.tm.opcode_modifier.sse2avx);
1b9f0c97
L
8332 }
8333 else
8334 {
8335 i.rm.reg = i.op[op].regs->reg_num;
a5aeccd9
JB
8336 set_rex_vrex (i.op[op].regs, REX_R,
8337 i.tm.opcode_modifier.sse2avx);
1b9f0c97 8338 }
7ab9ffdd 8339 }
252b5132 8340
29b0f896
AM
8341 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
8342 must set it to 3 to indicate this is a register operand
8343 in the regmem field. */
8344 if (!i.mem_operands)
8345 i.rm.mode = 3;
8346 }
252b5132 8347
29b0f896 8348 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 8349 if (i.tm.extension_opcode != None)
29b0f896
AM
8350 i.rm.reg = i.tm.extension_opcode;
8351 }
8352 return default_seg;
8353}
252b5132 8354
376cd056
JB
8355static unsigned int
8356flip_code16 (unsigned int code16)
8357{
8358 gas_assert (i.tm.operands == 1);
8359
8360 return !(i.prefix[REX_PREFIX] & REX_W)
8361 && (code16 ? i.tm.operand_types[0].bitfield.disp32
8362 || i.tm.operand_types[0].bitfield.disp32s
8363 : i.tm.operand_types[0].bitfield.disp16)
8364 ? CODE16 : 0;
8365}
8366
29b0f896 8367static void
e3bb37b5 8368output_branch (void)
29b0f896
AM
8369{
8370 char *p;
f8a5c266 8371 int size;
29b0f896
AM
8372 int code16;
8373 int prefix;
8374 relax_substateT subtype;
8375 symbolS *sym;
8376 offsetT off;
8377
f8a5c266 8378 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 8379 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
8380
8381 prefix = 0;
8382 if (i.prefix[DATA_PREFIX] != 0)
252b5132 8383 {
29b0f896
AM
8384 prefix = 1;
8385 i.prefixes -= 1;
376cd056 8386 code16 ^= flip_code16(code16);
252b5132 8387 }
29b0f896
AM
8388 /* Pentium4 branch hints. */
8389 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8390 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 8391 {
29b0f896
AM
8392 prefix++;
8393 i.prefixes--;
8394 }
8395 if (i.prefix[REX_PREFIX] != 0)
8396 {
8397 prefix++;
8398 i.prefixes--;
2f66722d
AM
8399 }
8400
7e8b059b
L
8401 /* BND prefixed jump. */
8402 if (i.prefix[BND_PREFIX] != 0)
8403 {
6cb0a70e
JB
8404 prefix++;
8405 i.prefixes--;
7e8b059b
L
8406 }
8407
f2810fe0
JB
8408 if (i.prefixes != 0)
8409 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
29b0f896
AM
8410
8411 /* It's always a symbol; End frag & setup for relax.
8412 Make sure there is enough room in this frag for the largest
8413 instruction we may generate in md_convert_frag. This is 2
8414 bytes for the opcode and room for the prefix and largest
8415 displacement. */
8416 frag_grow (prefix + 2 + 4);
8417 /* Prefix and 1 opcode byte go in fr_fix. */
8418 p = frag_more (prefix + 1);
8419 if (i.prefix[DATA_PREFIX] != 0)
8420 *p++ = DATA_PREFIX_OPCODE;
8421 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
8422 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
8423 *p++ = i.prefix[SEG_PREFIX];
6cb0a70e
JB
8424 if (i.prefix[BND_PREFIX] != 0)
8425 *p++ = BND_PREFIX_OPCODE;
29b0f896
AM
8426 if (i.prefix[REX_PREFIX] != 0)
8427 *p++ = i.prefix[REX_PREFIX];
8428 *p = i.tm.base_opcode;
8429
8430 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 8431 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 8432 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 8433 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 8434 else
f8a5c266 8435 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 8436 subtype |= code16;
3e73aa7c 8437
29b0f896
AM
8438 sym = i.op[0].disps->X_add_symbol;
8439 off = i.op[0].disps->X_add_number;
3e73aa7c 8440
29b0f896
AM
8441 if (i.op[0].disps->X_op != O_constant
8442 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 8443 {
29b0f896
AM
8444 /* Handle complex expressions. */
8445 sym = make_expr_symbol (i.op[0].disps);
8446 off = 0;
8447 }
3e73aa7c 8448
29b0f896
AM
8449 /* 1 possible extra opcode + 4 byte displacement go in var part.
8450 Pass reloc in fr_var. */
d258b828 8451 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 8452}
3e73aa7c 8453
bd7ab16b
L
8454#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8455/* Return TRUE iff PLT32 relocation should be used for branching to
8456 symbol S. */
8457
8458static bfd_boolean
8459need_plt32_p (symbolS *s)
8460{
8461 /* PLT32 relocation is ELF only. */
8462 if (!IS_ELF)
8463 return FALSE;
8464
a5def729
RO
8465#ifdef TE_SOLARIS
8466 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
8467 krtld support it. */
8468 return FALSE;
8469#endif
8470
bd7ab16b
L
8471 /* Since there is no need to prepare for PLT branch on x86-64, we
8472 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
8473 be used as a marker for 32-bit PC-relative branches. */
8474 if (!object_64bit)
8475 return FALSE;
8476
8477 /* Weak or undefined symbol need PLT32 relocation. */
8478 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
8479 return TRUE;
8480
8481 /* Non-global symbol doesn't need PLT32 relocation. */
8482 if (! S_IS_EXTERNAL (s))
8483 return FALSE;
8484
8485 /* Other global symbols need PLT32 relocation. NB: Symbol with
8486 non-default visibilities are treated as normal global symbol
8487 so that PLT32 relocation can be used as a marker for 32-bit
8488 PC-relative branches. It is useful for linker relaxation. */
8489 return TRUE;
8490}
8491#endif
8492
29b0f896 8493static void
e3bb37b5 8494output_jump (void)
29b0f896
AM
8495{
8496 char *p;
8497 int size;
3e02c1cc 8498 fixS *fixP;
bd7ab16b 8499 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 8500
0cfa3eb3 8501 if (i.tm.opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
8502 {
8503 /* This is a loop or jecxz type instruction. */
8504 size = 1;
8505 if (i.prefix[ADDR_PREFIX] != 0)
8506 {
8507 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
8508 i.prefixes -= 1;
8509 }
8510 /* Pentium4 branch hints. */
8511 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8512 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
8513 {
8514 FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
8515 i.prefixes--;
3e73aa7c
JH
8516 }
8517 }
29b0f896
AM
8518 else
8519 {
8520 int code16;
3e73aa7c 8521
29b0f896
AM
8522 code16 = 0;
8523 if (flag_code == CODE_16BIT)
8524 code16 = CODE16;
3e73aa7c 8525
29b0f896
AM
8526 if (i.prefix[DATA_PREFIX] != 0)
8527 {
8528 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
8529 i.prefixes -= 1;
376cd056 8530 code16 ^= flip_code16(code16);
29b0f896 8531 }
252b5132 8532
29b0f896
AM
8533 size = 4;
8534 if (code16)
8535 size = 2;
8536 }
9fcc94b6 8537
6cb0a70e
JB
8538 /* BND prefixed jump. */
8539 if (i.prefix[BND_PREFIX] != 0)
29b0f896 8540 {
6cb0a70e 8541 FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
29b0f896
AM
8542 i.prefixes -= 1;
8543 }
252b5132 8544
6cb0a70e 8545 if (i.prefix[REX_PREFIX] != 0)
7e8b059b 8546 {
6cb0a70e 8547 FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
7e8b059b
L
8548 i.prefixes -= 1;
8549 }
8550
f2810fe0
JB
8551 if (i.prefixes != 0)
8552 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
e0890092 8553
42164a71
L
8554 p = frag_more (i.tm.opcode_length + size);
8555 switch (i.tm.opcode_length)
8556 {
8557 case 2:
8558 *p++ = i.tm.base_opcode >> 8;
1a0670f3 8559 /* Fall through. */
42164a71
L
8560 case 1:
8561 *p++ = i.tm.base_opcode;
8562 break;
8563 default:
8564 abort ();
8565 }
e0890092 8566
bd7ab16b
L
8567#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8568 if (size == 4
8569 && jump_reloc == NO_RELOC
8570 && need_plt32_p (i.op[0].disps->X_add_symbol))
8571 jump_reloc = BFD_RELOC_X86_64_PLT32;
8572#endif
8573
8574 jump_reloc = reloc (size, 1, 1, jump_reloc);
8575
3e02c1cc 8576 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 8577 i.op[0].disps, 1, jump_reloc);
3e02c1cc
AM
8578
8579 /* All jumps handled here are signed, but don't use a signed limit
8580 check for 32 and 16 bit jumps as we want to allow wrap around at
8581 4G and 64k respectively. */
8582 if (size == 1)
8583 fixP->fx_signed = 1;
29b0f896 8584}
e0890092 8585
29b0f896 8586static void
e3bb37b5 8587output_interseg_jump (void)
29b0f896
AM
8588{
8589 char *p;
8590 int size;
8591 int prefix;
8592 int code16;
252b5132 8593
29b0f896
AM
8594 code16 = 0;
8595 if (flag_code == CODE_16BIT)
8596 code16 = CODE16;
a217f122 8597
29b0f896
AM
8598 prefix = 0;
8599 if (i.prefix[DATA_PREFIX] != 0)
8600 {
8601 prefix = 1;
8602 i.prefixes -= 1;
8603 code16 ^= CODE16;
8604 }
6cb0a70e
JB
8605
8606 gas_assert (!i.prefix[REX_PREFIX]);
252b5132 8607
29b0f896
AM
8608 size = 4;
8609 if (code16)
8610 size = 2;
252b5132 8611
f2810fe0
JB
8612 if (i.prefixes != 0)
8613 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
252b5132 8614
29b0f896
AM
8615 /* 1 opcode; 2 segment; offset */
8616 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 8617
29b0f896
AM
8618 if (i.prefix[DATA_PREFIX] != 0)
8619 *p++ = DATA_PREFIX_OPCODE;
252b5132 8620
29b0f896
AM
8621 if (i.prefix[REX_PREFIX] != 0)
8622 *p++ = i.prefix[REX_PREFIX];
252b5132 8623
29b0f896
AM
8624 *p++ = i.tm.base_opcode;
8625 if (i.op[1].imms->X_op == O_constant)
8626 {
8627 offsetT n = i.op[1].imms->X_add_number;
252b5132 8628
29b0f896
AM
8629 if (size == 2
8630 && !fits_in_unsigned_word (n)
8631 && !fits_in_signed_word (n))
8632 {
8633 as_bad (_("16-bit jump out of range"));
8634 return;
8635 }
8636 md_number_to_chars (p, n, size);
8637 }
8638 else
8639 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 8640 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
29b0f896
AM
8641 if (i.op[0].imms->X_op != O_constant)
8642 as_bad (_("can't handle non absolute segment in `%s'"),
8643 i.tm.name);
8644 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
8645}
a217f122 8646
b4a3a7b4
L
8647#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8648void
8649x86_cleanup (void)
8650{
8651 char *p;
8652 asection *seg = now_seg;
8653 subsegT subseg = now_subseg;
8654 asection *sec;
8655 unsigned int alignment, align_size_1;
8656 unsigned int isa_1_descsz, feature_2_descsz, descsz;
8657 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
8658 unsigned int padding;
8659
8660 if (!IS_ELF || !x86_used_note)
8661 return;
8662
b4a3a7b4
L
8663 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
8664
8665 /* The .note.gnu.property section layout:
8666
8667 Field Length Contents
8668 ---- ---- ----
8669 n_namsz 4 4
8670 n_descsz 4 The note descriptor size
8671 n_type 4 NT_GNU_PROPERTY_TYPE_0
8672 n_name 4 "GNU"
8673 n_desc n_descsz The program property array
8674 .... .... ....
8675 */
8676
8677 /* Create the .note.gnu.property section. */
8678 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 8679 bfd_set_section_flags (sec,
b4a3a7b4
L
8680 (SEC_ALLOC
8681 | SEC_LOAD
8682 | SEC_DATA
8683 | SEC_HAS_CONTENTS
8684 | SEC_READONLY));
8685
8686 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
8687 {
8688 align_size_1 = 7;
8689 alignment = 3;
8690 }
8691 else
8692 {
8693 align_size_1 = 3;
8694 alignment = 2;
8695 }
8696
fd361982 8697 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
8698 elf_section_type (sec) = SHT_NOTE;
8699
8700 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
8701 + 4-byte data */
8702 isa_1_descsz_raw = 4 + 4 + 4;
8703 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
8704 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
8705
8706 feature_2_descsz_raw = isa_1_descsz;
8707 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
8708 + 4-byte data */
8709 feature_2_descsz_raw += 4 + 4 + 4;
8710 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
8711 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
8712 & ~align_size_1);
8713
8714 descsz = feature_2_descsz;
8715 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
8716 p = frag_more (4 + 4 + 4 + 4 + descsz);
8717
8718 /* Write n_namsz. */
8719 md_number_to_chars (p, (valueT) 4, 4);
8720
8721 /* Write n_descsz. */
8722 md_number_to_chars (p + 4, (valueT) descsz, 4);
8723
8724 /* Write n_type. */
8725 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
8726
8727 /* Write n_name. */
8728 memcpy (p + 4 * 3, "GNU", 4);
8729
8730 /* Write 4-byte type. */
8731 md_number_to_chars (p + 4 * 4,
8732 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
8733
8734 /* Write 4-byte data size. */
8735 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
8736
8737 /* Write 4-byte data. */
8738 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
8739
8740 /* Zero out paddings. */
8741 padding = isa_1_descsz - isa_1_descsz_raw;
8742 if (padding)
8743 memset (p + 4 * 7, 0, padding);
8744
8745 /* Write 4-byte type. */
8746 md_number_to_chars (p + isa_1_descsz + 4 * 4,
8747 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
8748
8749 /* Write 4-byte data size. */
8750 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
8751
8752 /* Write 4-byte data. */
8753 md_number_to_chars (p + isa_1_descsz + 4 * 6,
8754 (valueT) x86_feature_2_used, 4);
8755
8756 /* Zero out paddings. */
8757 padding = feature_2_descsz - feature_2_descsz_raw;
8758 if (padding)
8759 memset (p + isa_1_descsz + 4 * 7, 0, padding);
8760
8761 /* We probably can't restore the current segment, for there likely
8762 isn't one yet... */
8763 if (seg && subseg)
8764 subseg_set (seg, subseg);
8765}
8766#endif
8767
9c33702b
JB
8768static unsigned int
8769encoding_length (const fragS *start_frag, offsetT start_off,
8770 const char *frag_now_ptr)
8771{
8772 unsigned int len = 0;
8773
8774 if (start_frag != frag_now)
8775 {
8776 const fragS *fr = start_frag;
8777
8778 do {
8779 len += fr->fr_fix;
8780 fr = fr->fr_next;
8781 } while (fr && fr != frag_now);
8782 }
8783
8784 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
8785}
8786
e379e5f3 8787/* Return 1 for test, and, cmp, add, sub, inc and dec which may
79d72f45
HL
8788 be macro-fused with conditional jumps.
8789 NB: If TEST/AND/CMP/ADD/SUB/INC/DEC is of RIP relative address,
8790 or is one of the following format:
8791
8792 cmp m, imm
8793 add m, imm
8794 sub m, imm
8795 test m, imm
8796 and m, imm
8797 inc m
8798 dec m
8799
8800 it is unfusible. */
e379e5f3
L
8801
8802static int
79d72f45 8803maybe_fused_with_jcc_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8804{
8805 /* No RIP address. */
8806 if (i.base_reg && i.base_reg->reg_num == RegIP)
8807 return 0;
8808
8809 /* No VEX/EVEX encoding. */
8810 if (is_any_vex_encoding (&i.tm))
8811 return 0;
8812
79d72f45
HL
8813 /* add, sub without add/sub m, imm. */
8814 if (i.tm.base_opcode <= 5
e379e5f3
L
8815 || (i.tm.base_opcode >= 0x28 && i.tm.base_opcode <= 0x2d)
8816 || ((i.tm.base_opcode | 3) == 0x83
79d72f45 8817 && (i.tm.extension_opcode == 0x5
e379e5f3 8818 || i.tm.extension_opcode == 0x0)))
79d72f45
HL
8819 {
8820 *mf_cmp_p = mf_cmp_alu_cmp;
8821 return !(i.mem_operands && i.imm_operands);
8822 }
e379e5f3 8823
79d72f45
HL
8824 /* and without and m, imm. */
8825 if ((i.tm.base_opcode >= 0x20 && i.tm.base_opcode <= 0x25)
8826 || ((i.tm.base_opcode | 3) == 0x83
8827 && i.tm.extension_opcode == 0x4))
8828 {
8829 *mf_cmp_p = mf_cmp_test_and;
8830 return !(i.mem_operands && i.imm_operands);
8831 }
8832
8833 /* test without test m imm. */
e379e5f3
L
8834 if ((i.tm.base_opcode | 1) == 0x85
8835 || (i.tm.base_opcode | 1) == 0xa9
8836 || ((i.tm.base_opcode | 1) == 0xf7
79d72f45
HL
8837 && i.tm.extension_opcode == 0))
8838 {
8839 *mf_cmp_p = mf_cmp_test_and;
8840 return !(i.mem_operands && i.imm_operands);
8841 }
8842
8843 /* cmp without cmp m, imm. */
8844 if ((i.tm.base_opcode >= 0x38 && i.tm.base_opcode <= 0x3d)
e379e5f3
L
8845 || ((i.tm.base_opcode | 3) == 0x83
8846 && (i.tm.extension_opcode == 0x7)))
79d72f45
HL
8847 {
8848 *mf_cmp_p = mf_cmp_alu_cmp;
8849 return !(i.mem_operands && i.imm_operands);
8850 }
e379e5f3 8851
79d72f45 8852 /* inc, dec without inc/dec m. */
e379e5f3
L
8853 if ((i.tm.cpu_flags.bitfield.cpuno64
8854 && (i.tm.base_opcode | 0xf) == 0x4f)
8855 || ((i.tm.base_opcode | 1) == 0xff
8856 && i.tm.extension_opcode <= 0x1))
79d72f45
HL
8857 {
8858 *mf_cmp_p = mf_cmp_incdec;
8859 return !i.mem_operands;
8860 }
e379e5f3
L
8861
8862 return 0;
8863}
8864
8865/* Return 1 if a FUSED_JCC_PADDING frag should be generated. */
8866
8867static int
79d72f45 8868add_fused_jcc_padding_frag_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8869{
8870 /* NB: Don't work with COND_JUMP86 without i386. */
8871 if (!align_branch_power
8872 || now_seg == absolute_section
8873 || !cpu_arch_flags.bitfield.cpui386
8874 || !(align_branch & align_branch_fused_bit))
8875 return 0;
8876
79d72f45 8877 if (maybe_fused_with_jcc_p (mf_cmp_p))
e379e5f3
L
8878 {
8879 if (last_insn.kind == last_insn_other
8880 || last_insn.seg != now_seg)
8881 return 1;
8882 if (flag_debug)
8883 as_warn_where (last_insn.file, last_insn.line,
8884 _("`%s` skips -malign-branch-boundary on `%s`"),
8885 last_insn.name, i.tm.name);
8886 }
8887
8888 return 0;
8889}
8890
8891/* Return 1 if a BRANCH_PREFIX frag should be generated. */
8892
8893static int
8894add_branch_prefix_frag_p (void)
8895{
8896 /* NB: Don't work with COND_JUMP86 without i386. Don't add prefix
8897 to PadLock instructions since they include prefixes in opcode. */
8898 if (!align_branch_power
8899 || !align_branch_prefix_size
8900 || now_seg == absolute_section
8901 || i.tm.cpu_flags.bitfield.cpupadlock
8902 || !cpu_arch_flags.bitfield.cpui386)
8903 return 0;
8904
8905 /* Don't add prefix if it is a prefix or there is no operand in case
8906 that segment prefix is special. */
8907 if (!i.operands || i.tm.opcode_modifier.isprefix)
8908 return 0;
8909
8910 if (last_insn.kind == last_insn_other
8911 || last_insn.seg != now_seg)
8912 return 1;
8913
8914 if (flag_debug)
8915 as_warn_where (last_insn.file, last_insn.line,
8916 _("`%s` skips -malign-branch-boundary on `%s`"),
8917 last_insn.name, i.tm.name);
8918
8919 return 0;
8920}
8921
8922/* Return 1 if a BRANCH_PADDING frag should be generated. */
8923
8924static int
79d72f45
HL
8925add_branch_padding_frag_p (enum align_branch_kind *branch_p,
8926 enum mf_jcc_kind *mf_jcc_p)
e379e5f3
L
8927{
8928 int add_padding;
8929
8930 /* NB: Don't work with COND_JUMP86 without i386. */
8931 if (!align_branch_power
8932 || now_seg == absolute_section
8933 || !cpu_arch_flags.bitfield.cpui386)
8934 return 0;
8935
8936 add_padding = 0;
8937
8938 /* Check for jcc and direct jmp. */
8939 if (i.tm.opcode_modifier.jump == JUMP)
8940 {
8941 if (i.tm.base_opcode == JUMP_PC_RELATIVE)
8942 {
8943 *branch_p = align_branch_jmp;
8944 add_padding = align_branch & align_branch_jmp_bit;
8945 }
8946 else
8947 {
79d72f45
HL
8948 /* Because J<cc> and JN<cc> share same group in macro-fusible table,
8949 igore the lowest bit. */
8950 *mf_jcc_p = (i.tm.base_opcode & 0x0e) >> 1;
e379e5f3
L
8951 *branch_p = align_branch_jcc;
8952 if ((align_branch & align_branch_jcc_bit))
8953 add_padding = 1;
8954 }
8955 }
8956 else if (is_any_vex_encoding (&i.tm))
8957 return 0;
8958 else if ((i.tm.base_opcode | 1) == 0xc3)
8959 {
8960 /* Near ret. */
8961 *branch_p = align_branch_ret;
8962 if ((align_branch & align_branch_ret_bit))
8963 add_padding = 1;
8964 }
8965 else
8966 {
8967 /* Check for indirect jmp, direct and indirect calls. */
8968 if (i.tm.base_opcode == 0xe8)
8969 {
8970 /* Direct call. */
8971 *branch_p = align_branch_call;
8972 if ((align_branch & align_branch_call_bit))
8973 add_padding = 1;
8974 }
8975 else if (i.tm.base_opcode == 0xff
8976 && (i.tm.extension_opcode == 2
8977 || i.tm.extension_opcode == 4))
8978 {
8979 /* Indirect call and jmp. */
8980 *branch_p = align_branch_indirect;
8981 if ((align_branch & align_branch_indirect_bit))
8982 add_padding = 1;
8983 }
8984
8985 if (add_padding
8986 && i.disp_operands
8987 && tls_get_addr
8988 && (i.op[0].disps->X_op == O_symbol
8989 || (i.op[0].disps->X_op == O_subtract
8990 && i.op[0].disps->X_op_symbol == GOT_symbol)))
8991 {
8992 symbolS *s = i.op[0].disps->X_add_symbol;
8993 /* No padding to call to global or undefined tls_get_addr. */
8994 if ((S_IS_EXTERNAL (s) || !S_IS_DEFINED (s))
8995 && strcmp (S_GET_NAME (s), tls_get_addr) == 0)
8996 return 0;
8997 }
8998 }
8999
9000 if (add_padding
9001 && last_insn.kind != last_insn_other
9002 && last_insn.seg == now_seg)
9003 {
9004 if (flag_debug)
9005 as_warn_where (last_insn.file, last_insn.line,
9006 _("`%s` skips -malign-branch-boundary on `%s`"),
9007 last_insn.name, i.tm.name);
9008 return 0;
9009 }
9010
9011 return add_padding;
9012}
9013
29b0f896 9014static void
e3bb37b5 9015output_insn (void)
29b0f896 9016{
2bbd9c25
JJ
9017 fragS *insn_start_frag;
9018 offsetT insn_start_off;
e379e5f3
L
9019 fragS *fragP = NULL;
9020 enum align_branch_kind branch = align_branch_none;
79d72f45
HL
9021 /* The initializer is arbitrary just to avoid uninitialized error.
9022 it's actually either assigned in add_branch_padding_frag_p
9023 or never be used. */
9024 enum mf_jcc_kind mf_jcc = mf_jcc_jo;
2bbd9c25 9025
b4a3a7b4
L
9026#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
9027 if (IS_ELF && x86_used_note)
9028 {
9029 if (i.tm.cpu_flags.bitfield.cpucmov)
9030 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_CMOV;
9031 if (i.tm.cpu_flags.bitfield.cpusse)
9032 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE;
9033 if (i.tm.cpu_flags.bitfield.cpusse2)
9034 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE2;
9035 if (i.tm.cpu_flags.bitfield.cpusse3)
9036 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE3;
9037 if (i.tm.cpu_flags.bitfield.cpussse3)
9038 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSSE3;
9039 if (i.tm.cpu_flags.bitfield.cpusse4_1)
9040 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_1;
9041 if (i.tm.cpu_flags.bitfield.cpusse4_2)
9042 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_2;
9043 if (i.tm.cpu_flags.bitfield.cpuavx)
9044 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX;
9045 if (i.tm.cpu_flags.bitfield.cpuavx2)
9046 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX2;
9047 if (i.tm.cpu_flags.bitfield.cpufma)
9048 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_FMA;
9049 if (i.tm.cpu_flags.bitfield.cpuavx512f)
9050 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512F;
9051 if (i.tm.cpu_flags.bitfield.cpuavx512cd)
9052 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512CD;
9053 if (i.tm.cpu_flags.bitfield.cpuavx512er)
9054 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512ER;
9055 if (i.tm.cpu_flags.bitfield.cpuavx512pf)
9056 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512PF;
9057 if (i.tm.cpu_flags.bitfield.cpuavx512vl)
9058 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512VL;
9059 if (i.tm.cpu_flags.bitfield.cpuavx512dq)
9060 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512DQ;
9061 if (i.tm.cpu_flags.bitfield.cpuavx512bw)
9062 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512BW;
9063 if (i.tm.cpu_flags.bitfield.cpuavx512_4fmaps)
9064 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS;
9065 if (i.tm.cpu_flags.bitfield.cpuavx512_4vnniw)
9066 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW;
9067 if (i.tm.cpu_flags.bitfield.cpuavx512_bitalg)
9068 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BITALG;
9069 if (i.tm.cpu_flags.bitfield.cpuavx512ifma)
9070 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_IFMA;
9071 if (i.tm.cpu_flags.bitfield.cpuavx512vbmi)
9072 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI;
9073 if (i.tm.cpu_flags.bitfield.cpuavx512_vbmi2)
9074 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2;
9075 if (i.tm.cpu_flags.bitfield.cpuavx512_vnni)
9076 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VNNI;
462cac58
L
9077 if (i.tm.cpu_flags.bitfield.cpuavx512_bf16)
9078 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BF16;
b4a3a7b4
L
9079
9080 if (i.tm.cpu_flags.bitfield.cpu8087
9081 || i.tm.cpu_flags.bitfield.cpu287
9082 || i.tm.cpu_flags.bitfield.cpu387
9083 || i.tm.cpu_flags.bitfield.cpu687
9084 || i.tm.cpu_flags.bitfield.cpufisttp)
9085 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
319ff62c
JB
9086 if (i.has_regmmx
9087 || i.tm.base_opcode == 0xf77 /* emms */
a7e12755
L
9088 || i.tm.base_opcode == 0xf0e /* femms */
9089 || i.tm.base_opcode == 0xf2a /* cvtpi2ps */
9090 || i.tm.base_opcode == 0x660f2a /* cvtpi2pd */)
b4a3a7b4
L
9091 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
9092 if (i.has_regxmm)
9093 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
9094 if (i.has_regymm)
9095 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
9096 if (i.has_regzmm)
9097 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
9098 if (i.tm.cpu_flags.bitfield.cpufxsr)
9099 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
9100 if (i.tm.cpu_flags.bitfield.cpuxsave)
9101 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
9102 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
9103 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
9104 if (i.tm.cpu_flags.bitfield.cpuxsavec)
9105 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
9106 }
9107#endif
9108
29b0f896
AM
9109 /* Tie dwarf2 debug info to the address at the start of the insn.
9110 We can't do this after the insn has been output as the current
9111 frag may have been closed off. eg. by frag_var. */
9112 dwarf2_emit_insn (0);
9113
2bbd9c25
JJ
9114 insn_start_frag = frag_now;
9115 insn_start_off = frag_now_fix ();
9116
79d72f45 9117 if (add_branch_padding_frag_p (&branch, &mf_jcc))
e379e5f3
L
9118 {
9119 char *p;
9120 /* Branch can be 8 bytes. Leave some room for prefixes. */
9121 unsigned int max_branch_padding_size = 14;
9122
9123 /* Align section to boundary. */
9124 record_alignment (now_seg, align_branch_power);
9125
9126 /* Make room for padding. */
9127 frag_grow (max_branch_padding_size);
9128
9129 /* Start of the padding. */
9130 p = frag_more (0);
9131
9132 fragP = frag_now;
9133
9134 frag_var (rs_machine_dependent, max_branch_padding_size, 0,
9135 ENCODE_RELAX_STATE (BRANCH_PADDING, 0),
9136 NULL, 0, p);
9137
79d72f45 9138 fragP->tc_frag_data.mf_type = mf_jcc;
e379e5f3
L
9139 fragP->tc_frag_data.branch_type = branch;
9140 fragP->tc_frag_data.max_bytes = max_branch_padding_size;
9141 }
9142
29b0f896 9143 /* Output jumps. */
0cfa3eb3 9144 if (i.tm.opcode_modifier.jump == JUMP)
29b0f896 9145 output_branch ();
0cfa3eb3
JB
9146 else if (i.tm.opcode_modifier.jump == JUMP_BYTE
9147 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896 9148 output_jump ();
0cfa3eb3 9149 else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT)
29b0f896
AM
9150 output_interseg_jump ();
9151 else
9152 {
9153 /* Output normal instructions here. */
9154 char *p;
9155 unsigned char *q;
47465058 9156 unsigned int j;
331d2d0d 9157 unsigned int prefix;
79d72f45 9158 enum mf_cmp_kind mf_cmp;
4dffcebc 9159
e4e00185 9160 if (avoid_fence
c3949f43
JB
9161 && (i.tm.base_opcode == 0xfaee8
9162 || i.tm.base_opcode == 0xfaef0
9163 || i.tm.base_opcode == 0xfaef8))
e4e00185
AS
9164 {
9165 /* Encode lfence, mfence, and sfence as
9166 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
9167 offsetT val = 0x240483f0ULL;
9168 p = frag_more (5);
9169 md_number_to_chars (p, val, 5);
9170 return;
9171 }
9172
d022bddd
IT
9173 /* Some processors fail on LOCK prefix. This options makes
9174 assembler ignore LOCK prefix and serves as a workaround. */
9175 if (omit_lock_prefix)
9176 {
9177 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE)
9178 return;
9179 i.prefix[LOCK_PREFIX] = 0;
9180 }
9181
e379e5f3
L
9182 if (branch)
9183 /* Skip if this is a branch. */
9184 ;
79d72f45 9185 else if (add_fused_jcc_padding_frag_p (&mf_cmp))
e379e5f3
L
9186 {
9187 /* Make room for padding. */
9188 frag_grow (MAX_FUSED_JCC_PADDING_SIZE);
9189 p = frag_more (0);
9190
9191 fragP = frag_now;
9192
9193 frag_var (rs_machine_dependent, MAX_FUSED_JCC_PADDING_SIZE, 0,
9194 ENCODE_RELAX_STATE (FUSED_JCC_PADDING, 0),
9195 NULL, 0, p);
9196
79d72f45 9197 fragP->tc_frag_data.mf_type = mf_cmp;
e379e5f3
L
9198 fragP->tc_frag_data.branch_type = align_branch_fused;
9199 fragP->tc_frag_data.max_bytes = MAX_FUSED_JCC_PADDING_SIZE;
9200 }
9201 else if (add_branch_prefix_frag_p ())
9202 {
9203 unsigned int max_prefix_size = align_branch_prefix_size;
9204
9205 /* Make room for padding. */
9206 frag_grow (max_prefix_size);
9207 p = frag_more (0);
9208
9209 fragP = frag_now;
9210
9211 frag_var (rs_machine_dependent, max_prefix_size, 0,
9212 ENCODE_RELAX_STATE (BRANCH_PREFIX, 0),
9213 NULL, 0, p);
9214
9215 fragP->tc_frag_data.max_bytes = max_prefix_size;
9216 }
9217
43234a1e
L
9218 /* Since the VEX/EVEX prefix contains the implicit prefix, we
9219 don't need the explicit prefix. */
9220 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 9221 {
c0f3af97 9222 switch (i.tm.opcode_length)
bc4bd9ab 9223 {
c0f3af97
L
9224 case 3:
9225 if (i.tm.base_opcode & 0xff000000)
4dffcebc 9226 {
c0f3af97 9227 prefix = (i.tm.base_opcode >> 24) & 0xff;
c3949f43
JB
9228 if (!i.tm.cpu_flags.bitfield.cpupadlock
9229 || prefix != REPE_PREFIX_OPCODE
9230 || (i.prefix[REP_PREFIX] != REPE_PREFIX_OPCODE))
9231 add_prefix (prefix);
c0f3af97
L
9232 }
9233 break;
9234 case 2:
9235 if ((i.tm.base_opcode & 0xff0000) != 0)
9236 {
9237 prefix = (i.tm.base_opcode >> 16) & 0xff;
c3949f43 9238 add_prefix (prefix);
4dffcebc 9239 }
c0f3af97
L
9240 break;
9241 case 1:
9242 break;
390c91cf
L
9243 case 0:
9244 /* Check for pseudo prefixes. */
9245 as_bad_where (insn_start_frag->fr_file,
9246 insn_start_frag->fr_line,
9247 _("pseudo prefix without instruction"));
9248 return;
c0f3af97
L
9249 default:
9250 abort ();
bc4bd9ab 9251 }
c0f3af97 9252
6d19a37a 9253#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
9254 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
9255 R_X86_64_GOTTPOFF relocation so that linker can safely
14470f07
L
9256 perform IE->LE optimization. A dummy REX_OPCODE prefix
9257 is also needed for lea with R_X86_64_GOTPC32_TLSDESC
9258 relocation for GDesc -> IE/LE optimization. */
cf61b747
L
9259 if (x86_elf_abi == X86_64_X32_ABI
9260 && i.operands == 2
14470f07
L
9261 && (i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
9262 || i.reloc[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
cf61b747
L
9263 && i.prefix[REX_PREFIX] == 0)
9264 add_prefix (REX_OPCODE);
6d19a37a 9265#endif
cf61b747 9266
c0f3af97
L
9267 /* The prefix bytes. */
9268 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
9269 if (*q)
9270 FRAG_APPEND_1_CHAR (*q);
0f10071e 9271 }
ae5c1c7b 9272 else
c0f3af97
L
9273 {
9274 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
9275 if (*q)
9276 switch (j)
9277 {
9278 case REX_PREFIX:
9279 /* REX byte is encoded in VEX prefix. */
9280 break;
9281 case SEG_PREFIX:
9282 case ADDR_PREFIX:
9283 FRAG_APPEND_1_CHAR (*q);
9284 break;
9285 default:
9286 /* There should be no other prefixes for instructions
9287 with VEX prefix. */
9288 abort ();
9289 }
9290
43234a1e
L
9291 /* For EVEX instructions i.vrex should become 0 after
9292 build_evex_prefix. For VEX instructions upper 16 registers
9293 aren't available, so VREX should be 0. */
9294 if (i.vrex)
9295 abort ();
c0f3af97
L
9296 /* Now the VEX prefix. */
9297 p = frag_more (i.vex.length);
9298 for (j = 0; j < i.vex.length; j++)
9299 p[j] = i.vex.bytes[j];
9300 }
252b5132 9301
29b0f896 9302 /* Now the opcode; be careful about word order here! */
4dffcebc 9303 if (i.tm.opcode_length == 1)
29b0f896
AM
9304 {
9305 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
9306 }
9307 else
9308 {
4dffcebc 9309 switch (i.tm.opcode_length)
331d2d0d 9310 {
43234a1e
L
9311 case 4:
9312 p = frag_more (4);
9313 *p++ = (i.tm.base_opcode >> 24) & 0xff;
9314 *p++ = (i.tm.base_opcode >> 16) & 0xff;
9315 break;
4dffcebc 9316 case 3:
331d2d0d
L
9317 p = frag_more (3);
9318 *p++ = (i.tm.base_opcode >> 16) & 0xff;
4dffcebc
L
9319 break;
9320 case 2:
9321 p = frag_more (2);
9322 break;
9323 default:
9324 abort ();
9325 break;
331d2d0d 9326 }
0f10071e 9327
29b0f896
AM
9328 /* Put out high byte first: can't use md_number_to_chars! */
9329 *p++ = (i.tm.base_opcode >> 8) & 0xff;
9330 *p = i.tm.base_opcode & 0xff;
9331 }
3e73aa7c 9332
29b0f896 9333 /* Now the modrm byte and sib byte (if present). */
40fb9820 9334 if (i.tm.opcode_modifier.modrm)
29b0f896 9335 {
4a3523fa
L
9336 FRAG_APPEND_1_CHAR ((i.rm.regmem << 0
9337 | i.rm.reg << 3
9338 | i.rm.mode << 6));
29b0f896
AM
9339 /* If i.rm.regmem == ESP (4)
9340 && i.rm.mode != (Register mode)
9341 && not 16 bit
9342 ==> need second modrm byte. */
9343 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
9344 && i.rm.mode != 3
dc821c5f 9345 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
4a3523fa
L
9346 FRAG_APPEND_1_CHAR ((i.sib.base << 0
9347 | i.sib.index << 3
9348 | i.sib.scale << 6));
29b0f896 9349 }
3e73aa7c 9350
29b0f896 9351 if (i.disp_operands)
2bbd9c25 9352 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 9353
29b0f896 9354 if (i.imm_operands)
2bbd9c25 9355 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
9356
9357 /*
9358 * frag_now_fix () returning plain abs_section_offset when we're in the
9359 * absolute section, and abs_section_offset not getting updated as data
9360 * gets added to the frag breaks the logic below.
9361 */
9362 if (now_seg != absolute_section)
9363 {
9364 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
9365 if (j > 15)
9366 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
9367 j);
e379e5f3
L
9368 else if (fragP)
9369 {
9370 /* NB: Don't add prefix with GOTPC relocation since
9371 output_disp() above depends on the fixed encoding
9372 length. Can't add prefix with TLS relocation since
9373 it breaks TLS linker optimization. */
9374 unsigned int max = i.has_gotpc_tls_reloc ? 0 : 15 - j;
9375 /* Prefix count on the current instruction. */
9376 unsigned int count = i.vex.length;
9377 unsigned int k;
9378 for (k = 0; k < ARRAY_SIZE (i.prefix); k++)
9379 /* REX byte is encoded in VEX/EVEX prefix. */
9380 if (i.prefix[k] && (k != REX_PREFIX || !i.vex.length))
9381 count++;
9382
9383 /* Count prefixes for extended opcode maps. */
9384 if (!i.vex.length)
9385 switch (i.tm.opcode_length)
9386 {
9387 case 3:
9388 if (((i.tm.base_opcode >> 16) & 0xff) == 0xf)
9389 {
9390 count++;
9391 switch ((i.tm.base_opcode >> 8) & 0xff)
9392 {
9393 case 0x38:
9394 case 0x3a:
9395 count++;
9396 break;
9397 default:
9398 break;
9399 }
9400 }
9401 break;
9402 case 2:
9403 if (((i.tm.base_opcode >> 8) & 0xff) == 0xf)
9404 count++;
9405 break;
9406 case 1:
9407 break;
9408 default:
9409 abort ();
9410 }
9411
9412 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
9413 == BRANCH_PREFIX)
9414 {
9415 /* Set the maximum prefix size in BRANCH_PREFIX
9416 frag. */
9417 if (fragP->tc_frag_data.max_bytes > max)
9418 fragP->tc_frag_data.max_bytes = max;
9419 if (fragP->tc_frag_data.max_bytes > count)
9420 fragP->tc_frag_data.max_bytes -= count;
9421 else
9422 fragP->tc_frag_data.max_bytes = 0;
9423 }
9424 else
9425 {
9426 /* Remember the maximum prefix size in FUSED_JCC_PADDING
9427 frag. */
9428 unsigned int max_prefix_size;
9429 if (align_branch_prefix_size > max)
9430 max_prefix_size = max;
9431 else
9432 max_prefix_size = align_branch_prefix_size;
9433 if (max_prefix_size > count)
9434 fragP->tc_frag_data.max_prefix_length
9435 = max_prefix_size - count;
9436 }
9437
9438 /* Use existing segment prefix if possible. Use CS
9439 segment prefix in 64-bit mode. In 32-bit mode, use SS
9440 segment prefix with ESP/EBP base register and use DS
9441 segment prefix without ESP/EBP base register. */
9442 if (i.prefix[SEG_PREFIX])
9443 fragP->tc_frag_data.default_prefix = i.prefix[SEG_PREFIX];
9444 else if (flag_code == CODE_64BIT)
9445 fragP->tc_frag_data.default_prefix = CS_PREFIX_OPCODE;
9446 else if (i.base_reg
9447 && (i.base_reg->reg_num == 4
9448 || i.base_reg->reg_num == 5))
9449 fragP->tc_frag_data.default_prefix = SS_PREFIX_OPCODE;
9450 else
9451 fragP->tc_frag_data.default_prefix = DS_PREFIX_OPCODE;
9452 }
9c33702b 9453 }
29b0f896 9454 }
252b5132 9455
e379e5f3
L
9456 /* NB: Don't work with COND_JUMP86 without i386. */
9457 if (align_branch_power
9458 && now_seg != absolute_section
9459 && cpu_arch_flags.bitfield.cpui386)
9460 {
9461 /* Terminate each frag so that we can add prefix and check for
9462 fused jcc. */
9463 frag_wane (frag_now);
9464 frag_new (0);
9465 }
9466
29b0f896
AM
9467#ifdef DEBUG386
9468 if (flag_debug)
9469 {
7b81dfbb 9470 pi ("" /*line*/, &i);
29b0f896
AM
9471 }
9472#endif /* DEBUG386 */
9473}
252b5132 9474
e205caa7
L
9475/* Return the size of the displacement operand N. */
9476
9477static int
9478disp_size (unsigned int n)
9479{
9480 int size = 4;
43234a1e 9481
b5014f7a 9482 if (i.types[n].bitfield.disp64)
40fb9820
L
9483 size = 8;
9484 else if (i.types[n].bitfield.disp8)
9485 size = 1;
9486 else if (i.types[n].bitfield.disp16)
9487 size = 2;
e205caa7
L
9488 return size;
9489}
9490
9491/* Return the size of the immediate operand N. */
9492
9493static int
9494imm_size (unsigned int n)
9495{
9496 int size = 4;
40fb9820
L
9497 if (i.types[n].bitfield.imm64)
9498 size = 8;
9499 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
9500 size = 1;
9501 else if (i.types[n].bitfield.imm16)
9502 size = 2;
e205caa7
L
9503 return size;
9504}
9505
29b0f896 9506static void
64e74474 9507output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9508{
9509 char *p;
9510 unsigned int n;
252b5132 9511
29b0f896
AM
9512 for (n = 0; n < i.operands; n++)
9513 {
b5014f7a 9514 if (operand_type_check (i.types[n], disp))
29b0f896
AM
9515 {
9516 if (i.op[n].disps->X_op == O_constant)
9517 {
e205caa7 9518 int size = disp_size (n);
43234a1e 9519 offsetT val = i.op[n].disps->X_add_number;
252b5132 9520
629cfaf1
JB
9521 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
9522 size);
29b0f896
AM
9523 p = frag_more (size);
9524 md_number_to_chars (p, val, size);
9525 }
9526 else
9527 {
f86103b7 9528 enum bfd_reloc_code_real reloc_type;
e205caa7 9529 int size = disp_size (n);
40fb9820 9530 int sign = i.types[n].bitfield.disp32s;
29b0f896 9531 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 9532 fixS *fixP;
29b0f896 9533
e205caa7 9534 /* We can't have 8 bit displacement here. */
9c2799c2 9535 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 9536
29b0f896
AM
9537 /* The PC relative address is computed relative
9538 to the instruction boundary, so in case immediate
9539 fields follows, we need to adjust the value. */
9540 if (pcrel && i.imm_operands)
9541 {
29b0f896 9542 unsigned int n1;
e205caa7 9543 int sz = 0;
252b5132 9544
29b0f896 9545 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 9546 if (operand_type_check (i.types[n1], imm))
252b5132 9547 {
e205caa7
L
9548 /* Only one immediate is allowed for PC
9549 relative address. */
9c2799c2 9550 gas_assert (sz == 0);
e205caa7
L
9551 sz = imm_size (n1);
9552 i.op[n].disps->X_add_number -= sz;
252b5132 9553 }
29b0f896 9554 /* We should find the immediate. */
9c2799c2 9555 gas_assert (sz != 0);
29b0f896 9556 }
520dc8e8 9557
29b0f896 9558 p = frag_more (size);
d258b828 9559 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 9560 if (GOT_symbol
2bbd9c25 9561 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 9562 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9563 || reloc_type == BFD_RELOC_X86_64_32S
9564 || (reloc_type == BFD_RELOC_64
9565 && object_64bit))
d6ab8113
JB
9566 && (i.op[n].disps->X_op == O_symbol
9567 || (i.op[n].disps->X_op == O_add
9568 && ((symbol_get_value_expression
9569 (i.op[n].disps->X_op_symbol)->X_op)
9570 == O_subtract))))
9571 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 9572 {
4fa24527 9573 if (!object_64bit)
7b81dfbb
AJ
9574 {
9575 reloc_type = BFD_RELOC_386_GOTPC;
e379e5f3 9576 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9577 i.op[n].imms->X_add_number +=
9578 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
9579 }
9580 else if (reloc_type == BFD_RELOC_64)
9581 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 9582 else
7b81dfbb
AJ
9583 /* Don't do the adjustment for x86-64, as there
9584 the pcrel addressing is relative to the _next_
9585 insn, and that is taken care of in other code. */
d6ab8113 9586 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 9587 }
e379e5f3
L
9588 else if (align_branch_power)
9589 {
9590 switch (reloc_type)
9591 {
9592 case BFD_RELOC_386_TLS_GD:
9593 case BFD_RELOC_386_TLS_LDM:
9594 case BFD_RELOC_386_TLS_IE:
9595 case BFD_RELOC_386_TLS_IE_32:
9596 case BFD_RELOC_386_TLS_GOTIE:
9597 case BFD_RELOC_386_TLS_GOTDESC:
9598 case BFD_RELOC_386_TLS_DESC_CALL:
9599 case BFD_RELOC_X86_64_TLSGD:
9600 case BFD_RELOC_X86_64_TLSLD:
9601 case BFD_RELOC_X86_64_GOTTPOFF:
9602 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
9603 case BFD_RELOC_X86_64_TLSDESC_CALL:
9604 i.has_gotpc_tls_reloc = TRUE;
9605 default:
9606 break;
9607 }
9608 }
02a86693
L
9609 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
9610 size, i.op[n].disps, pcrel,
9611 reloc_type);
9612 /* Check for "call/jmp *mem", "mov mem, %reg",
9613 "test %reg, mem" and "binop mem, %reg" where binop
9614 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
9615 instructions without data prefix. Always generate
9616 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
9617 if (i.prefix[DATA_PREFIX] == 0
9618 && (generate_relax_relocations
9619 || (!object_64bit
9620 && i.rm.mode == 0
9621 && i.rm.regmem == 5))
0cb4071e
L
9622 && (i.rm.mode == 2
9623 || (i.rm.mode == 0 && i.rm.regmem == 5))
2ae4c703 9624 && !is_any_vex_encoding(&i.tm)
02a86693
L
9625 && ((i.operands == 1
9626 && i.tm.base_opcode == 0xff
9627 && (i.rm.reg == 2 || i.rm.reg == 4))
9628 || (i.operands == 2
9629 && (i.tm.base_opcode == 0x8b
9630 || i.tm.base_opcode == 0x85
2ae4c703 9631 || (i.tm.base_opcode & ~0x38) == 0x03))))
02a86693
L
9632 {
9633 if (object_64bit)
9634 {
9635 fixP->fx_tcbit = i.rex != 0;
9636 if (i.base_reg
e968fc9b 9637 && (i.base_reg->reg_num == RegIP))
02a86693
L
9638 fixP->fx_tcbit2 = 1;
9639 }
9640 else
9641 fixP->fx_tcbit2 = 1;
9642 }
29b0f896
AM
9643 }
9644 }
9645 }
9646}
252b5132 9647
29b0f896 9648static void
64e74474 9649output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9650{
9651 char *p;
9652 unsigned int n;
252b5132 9653
29b0f896
AM
9654 for (n = 0; n < i.operands; n++)
9655 {
43234a1e
L
9656 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
9657 if (i.rounding && (int) n == i.rounding->operand)
9658 continue;
9659
40fb9820 9660 if (operand_type_check (i.types[n], imm))
29b0f896
AM
9661 {
9662 if (i.op[n].imms->X_op == O_constant)
9663 {
e205caa7 9664 int size = imm_size (n);
29b0f896 9665 offsetT val;
b4cac588 9666
29b0f896
AM
9667 val = offset_in_range (i.op[n].imms->X_add_number,
9668 size);
9669 p = frag_more (size);
9670 md_number_to_chars (p, val, size);
9671 }
9672 else
9673 {
9674 /* Not absolute_section.
9675 Need a 32-bit fixup (don't support 8bit
9676 non-absolute imms). Try to support other
9677 sizes ... */
f86103b7 9678 enum bfd_reloc_code_real reloc_type;
e205caa7
L
9679 int size = imm_size (n);
9680 int sign;
29b0f896 9681
40fb9820 9682 if (i.types[n].bitfield.imm32s
a7d61044 9683 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 9684 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 9685 sign = 1;
e205caa7
L
9686 else
9687 sign = 0;
520dc8e8 9688
29b0f896 9689 p = frag_more (size);
d258b828 9690 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 9691
2bbd9c25
JJ
9692 /* This is tough to explain. We end up with this one if we
9693 * have operands that look like
9694 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
9695 * obtain the absolute address of the GOT, and it is strongly
9696 * preferable from a performance point of view to avoid using
9697 * a runtime relocation for this. The actual sequence of
9698 * instructions often look something like:
9699 *
9700 * call .L66
9701 * .L66:
9702 * popl %ebx
9703 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
9704 *
9705 * The call and pop essentially return the absolute address
9706 * of the label .L66 and store it in %ebx. The linker itself
9707 * will ultimately change the first operand of the addl so
9708 * that %ebx points to the GOT, but to keep things simple, the
9709 * .o file must have this operand set so that it generates not
9710 * the absolute address of .L66, but the absolute address of
9711 * itself. This allows the linker itself simply treat a GOTPC
9712 * relocation as asking for a pcrel offset to the GOT to be
9713 * added in, and the addend of the relocation is stored in the
9714 * operand field for the instruction itself.
9715 *
9716 * Our job here is to fix the operand so that it would add
9717 * the correct offset so that %ebx would point to itself. The
9718 * thing that is tricky is that .-.L66 will point to the
9719 * beginning of the instruction, so we need to further modify
9720 * the operand so that it will point to itself. There are
9721 * other cases where you have something like:
9722 *
9723 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
9724 *
9725 * and here no correction would be required. Internally in
9726 * the assembler we treat operands of this form as not being
9727 * pcrel since the '.' is explicitly mentioned, and I wonder
9728 * whether it would simplify matters to do it this way. Who
9729 * knows. In earlier versions of the PIC patches, the
9730 * pcrel_adjust field was used to store the correction, but
9731 * since the expression is not pcrel, I felt it would be
9732 * confusing to do it this way. */
9733
d6ab8113 9734 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9735 || reloc_type == BFD_RELOC_X86_64_32S
9736 || reloc_type == BFD_RELOC_64)
29b0f896
AM
9737 && GOT_symbol
9738 && GOT_symbol == i.op[n].imms->X_add_symbol
9739 && (i.op[n].imms->X_op == O_symbol
9740 || (i.op[n].imms->X_op == O_add
9741 && ((symbol_get_value_expression
9742 (i.op[n].imms->X_op_symbol)->X_op)
9743 == O_subtract))))
9744 {
4fa24527 9745 if (!object_64bit)
d6ab8113 9746 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 9747 else if (size == 4)
d6ab8113 9748 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
9749 else if (size == 8)
9750 reloc_type = BFD_RELOC_X86_64_GOTPC64;
e379e5f3 9751 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9752 i.op[n].imms->X_add_number +=
9753 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 9754 }
29b0f896
AM
9755 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
9756 i.op[n].imms, 0, reloc_type);
9757 }
9758 }
9759 }
252b5132
RH
9760}
9761\f
d182319b
JB
9762/* x86_cons_fix_new is called via the expression parsing code when a
9763 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
9764static int cons_sign = -1;
9765
9766void
e3bb37b5 9767x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 9768 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 9769{
d258b828 9770 r = reloc (len, 0, cons_sign, r);
d182319b
JB
9771
9772#ifdef TE_PE
9773 if (exp->X_op == O_secrel)
9774 {
9775 exp->X_op = O_symbol;
9776 r = BFD_RELOC_32_SECREL;
9777 }
9778#endif
9779
9780 fix_new_exp (frag, off, len, exp, 0, r);
9781}
9782
357d1bd8
L
9783/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
9784 purpose of the `.dc.a' internal pseudo-op. */
9785
9786int
9787x86_address_bytes (void)
9788{
9789 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
9790 return 4;
9791 return stdoutput->arch_info->bits_per_address / 8;
9792}
9793
d382c579
TG
9794#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
9795 || defined (LEX_AT)
d258b828 9796# define lex_got(reloc, adjust, types) NULL
718ddfc0 9797#else
f3c180ae
AM
9798/* Parse operands of the form
9799 <symbol>@GOTOFF+<nnn>
9800 and similar .plt or .got references.
9801
9802 If we find one, set up the correct relocation in RELOC and copy the
9803 input string, minus the `@GOTOFF' into a malloc'd buffer for
9804 parsing by the calling routine. Return this buffer, and if ADJUST
9805 is non-null set it to the length of the string we removed from the
9806 input line. Otherwise return NULL. */
9807static char *
91d6fa6a 9808lex_got (enum bfd_reloc_code_real *rel,
64e74474 9809 int *adjust,
d258b828 9810 i386_operand_type *types)
f3c180ae 9811{
7b81dfbb
AJ
9812 /* Some of the relocations depend on the size of what field is to
9813 be relocated. But in our callers i386_immediate and i386_displacement
9814 we don't yet know the operand size (this will be set by insn
9815 matching). Hence we record the word32 relocation here,
9816 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
9817 static const struct {
9818 const char *str;
cff8d58a 9819 int len;
4fa24527 9820 const enum bfd_reloc_code_real rel[2];
40fb9820 9821 const i386_operand_type types64;
f3c180ae 9822 } gotrel[] = {
8ce3d284 9823#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
9824 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
9825 BFD_RELOC_SIZE32 },
9826 OPERAND_TYPE_IMM32_64 },
8ce3d284 9827#endif
cff8d58a
L
9828 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
9829 BFD_RELOC_X86_64_PLTOFF64 },
40fb9820 9830 OPERAND_TYPE_IMM64 },
cff8d58a
L
9831 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
9832 BFD_RELOC_X86_64_PLT32 },
40fb9820 9833 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9834 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
9835 BFD_RELOC_X86_64_GOTPLT64 },
40fb9820 9836 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
9837 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
9838 BFD_RELOC_X86_64_GOTOFF64 },
40fb9820 9839 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
9840 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
9841 BFD_RELOC_X86_64_GOTPCREL },
40fb9820 9842 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9843 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
9844 BFD_RELOC_X86_64_TLSGD },
40fb9820 9845 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9846 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
9847 _dummy_first_bfd_reloc_code_real },
40fb9820 9848 OPERAND_TYPE_NONE },
cff8d58a
L
9849 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
9850 BFD_RELOC_X86_64_TLSLD },
40fb9820 9851 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9852 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
9853 BFD_RELOC_X86_64_GOTTPOFF },
40fb9820 9854 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9855 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
9856 BFD_RELOC_X86_64_TPOFF32 },
40fb9820 9857 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
9858 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
9859 _dummy_first_bfd_reloc_code_real },
40fb9820 9860 OPERAND_TYPE_NONE },
cff8d58a
L
9861 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
9862 BFD_RELOC_X86_64_DTPOFF32 },
40fb9820 9863 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
9864 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
9865 _dummy_first_bfd_reloc_code_real },
40fb9820 9866 OPERAND_TYPE_NONE },
cff8d58a
L
9867 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
9868 _dummy_first_bfd_reloc_code_real },
40fb9820 9869 OPERAND_TYPE_NONE },
cff8d58a
L
9870 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
9871 BFD_RELOC_X86_64_GOT32 },
40fb9820 9872 OPERAND_TYPE_IMM32_32S_64_DISP32 },
cff8d58a
L
9873 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
9874 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
40fb9820 9875 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9876 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
9877 BFD_RELOC_X86_64_TLSDESC_CALL },
40fb9820 9878 OPERAND_TYPE_IMM32_32S_DISP32 },
f3c180ae
AM
9879 };
9880 char *cp;
9881 unsigned int j;
9882
d382c579 9883#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
9884 if (!IS_ELF)
9885 return NULL;
d382c579 9886#endif
718ddfc0 9887
f3c180ae 9888 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 9889 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
9890 return NULL;
9891
47465058 9892 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 9893 {
cff8d58a 9894 int len = gotrel[j].len;
28f81592 9895 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 9896 {
4fa24527 9897 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 9898 {
28f81592
AM
9899 int first, second;
9900 char *tmpbuf, *past_reloc;
f3c180ae 9901
91d6fa6a 9902 *rel = gotrel[j].rel[object_64bit];
f3c180ae 9903
3956db08
JB
9904 if (types)
9905 {
9906 if (flag_code != CODE_64BIT)
40fb9820
L
9907 {
9908 types->bitfield.imm32 = 1;
9909 types->bitfield.disp32 = 1;
9910 }
3956db08
JB
9911 else
9912 *types = gotrel[j].types64;
9913 }
9914
8fd4256d 9915 if (j != 0 && GOT_symbol == NULL)
f3c180ae
AM
9916 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
9917
28f81592 9918 /* The length of the first part of our input line. */
f3c180ae 9919 first = cp - input_line_pointer;
28f81592
AM
9920
9921 /* The second part goes from after the reloc token until
67c11a9b 9922 (and including) an end_of_line char or comma. */
28f81592 9923 past_reloc = cp + 1 + len;
67c11a9b
AM
9924 cp = past_reloc;
9925 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
9926 ++cp;
9927 second = cp + 1 - past_reloc;
28f81592
AM
9928
9929 /* Allocate and copy string. The trailing NUL shouldn't
9930 be necessary, but be safe. */
add39d23 9931 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 9932 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
9933 if (second != 0 && *past_reloc != ' ')
9934 /* Replace the relocation token with ' ', so that
9935 errors like foo@GOTOFF1 will be detected. */
9936 tmpbuf[first++] = ' ';
af89796a
L
9937 else
9938 /* Increment length by 1 if the relocation token is
9939 removed. */
9940 len++;
9941 if (adjust)
9942 *adjust = len;
0787a12d
AM
9943 memcpy (tmpbuf + first, past_reloc, second);
9944 tmpbuf[first + second] = '\0';
f3c180ae
AM
9945 return tmpbuf;
9946 }
9947
4fa24527
JB
9948 as_bad (_("@%s reloc is not supported with %d-bit output format"),
9949 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
9950 return NULL;
9951 }
9952 }
9953
9954 /* Might be a symbol version string. Don't as_bad here. */
9955 return NULL;
9956}
4e4f7c87 9957#endif
f3c180ae 9958
a988325c
NC
9959#ifdef TE_PE
9960#ifdef lex_got
9961#undef lex_got
9962#endif
9963/* Parse operands of the form
9964 <symbol>@SECREL32+<nnn>
9965
9966 If we find one, set up the correct relocation in RELOC and copy the
9967 input string, minus the `@SECREL32' into a malloc'd buffer for
9968 parsing by the calling routine. Return this buffer, and if ADJUST
9969 is non-null set it to the length of the string we removed from the
34bca508
L
9970 input line. Otherwise return NULL.
9971
a988325c
NC
9972 This function is copied from the ELF version above adjusted for PE targets. */
9973
9974static char *
9975lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
9976 int *adjust ATTRIBUTE_UNUSED,
d258b828 9977 i386_operand_type *types)
a988325c
NC
9978{
9979 static const struct
9980 {
9981 const char *str;
9982 int len;
9983 const enum bfd_reloc_code_real rel[2];
9984 const i386_operand_type types64;
9985 }
9986 gotrel[] =
9987 {
9988 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
9989 BFD_RELOC_32_SECREL },
9990 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
9991 };
9992
9993 char *cp;
9994 unsigned j;
9995
9996 for (cp = input_line_pointer; *cp != '@'; cp++)
9997 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
9998 return NULL;
9999
10000 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
10001 {
10002 int len = gotrel[j].len;
10003
10004 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
10005 {
10006 if (gotrel[j].rel[object_64bit] != 0)
10007 {
10008 int first, second;
10009 char *tmpbuf, *past_reloc;
10010
10011 *rel = gotrel[j].rel[object_64bit];
10012 if (adjust)
10013 *adjust = len;
10014
10015 if (types)
10016 {
10017 if (flag_code != CODE_64BIT)
10018 {
10019 types->bitfield.imm32 = 1;
10020 types->bitfield.disp32 = 1;
10021 }
10022 else
10023 *types = gotrel[j].types64;
10024 }
10025
10026 /* The length of the first part of our input line. */
10027 first = cp - input_line_pointer;
10028
10029 /* The second part goes from after the reloc token until
10030 (and including) an end_of_line char or comma. */
10031 past_reloc = cp + 1 + len;
10032 cp = past_reloc;
10033 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10034 ++cp;
10035 second = cp + 1 - past_reloc;
10036
10037 /* Allocate and copy string. The trailing NUL shouldn't
10038 be necessary, but be safe. */
add39d23 10039 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
10040 memcpy (tmpbuf, input_line_pointer, first);
10041 if (second != 0 && *past_reloc != ' ')
10042 /* Replace the relocation token with ' ', so that
10043 errors like foo@SECLREL321 will be detected. */
10044 tmpbuf[first++] = ' ';
10045 memcpy (tmpbuf + first, past_reloc, second);
10046 tmpbuf[first + second] = '\0';
10047 return tmpbuf;
10048 }
10049
10050 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10051 gotrel[j].str, 1 << (5 + object_64bit));
10052 return NULL;
10053 }
10054 }
10055
10056 /* Might be a symbol version string. Don't as_bad here. */
10057 return NULL;
10058}
10059
10060#endif /* TE_PE */
10061
62ebcb5c 10062bfd_reloc_code_real_type
e3bb37b5 10063x86_cons (expressionS *exp, int size)
f3c180ae 10064{
62ebcb5c
AM
10065 bfd_reloc_code_real_type got_reloc = NO_RELOC;
10066
ee86248c
JB
10067 intel_syntax = -intel_syntax;
10068
3c7b9c2c 10069 exp->X_md = 0;
4fa24527 10070 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
10071 {
10072 /* Handle @GOTOFF and the like in an expression. */
10073 char *save;
10074 char *gotfree_input_line;
4a57f2cf 10075 int adjust = 0;
f3c180ae
AM
10076
10077 save = input_line_pointer;
d258b828 10078 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
10079 if (gotfree_input_line)
10080 input_line_pointer = gotfree_input_line;
10081
10082 expression (exp);
10083
10084 if (gotfree_input_line)
10085 {
10086 /* expression () has merrily parsed up to the end of line,
10087 or a comma - in the wrong buffer. Transfer how far
10088 input_line_pointer has moved to the right buffer. */
10089 input_line_pointer = (save
10090 + (input_line_pointer - gotfree_input_line)
10091 + adjust);
10092 free (gotfree_input_line);
3992d3b7
AM
10093 if (exp->X_op == O_constant
10094 || exp->X_op == O_absent
10095 || exp->X_op == O_illegal
0398aac5 10096 || exp->X_op == O_register
3992d3b7
AM
10097 || exp->X_op == O_big)
10098 {
10099 char c = *input_line_pointer;
10100 *input_line_pointer = 0;
10101 as_bad (_("missing or invalid expression `%s'"), save);
10102 *input_line_pointer = c;
10103 }
b9519cfe
L
10104 else if ((got_reloc == BFD_RELOC_386_PLT32
10105 || got_reloc == BFD_RELOC_X86_64_PLT32)
10106 && exp->X_op != O_symbol)
10107 {
10108 char c = *input_line_pointer;
10109 *input_line_pointer = 0;
10110 as_bad (_("invalid PLT expression `%s'"), save);
10111 *input_line_pointer = c;
10112 }
f3c180ae
AM
10113 }
10114 }
10115 else
10116 expression (exp);
ee86248c
JB
10117
10118 intel_syntax = -intel_syntax;
10119
10120 if (intel_syntax)
10121 i386_intel_simplify (exp);
62ebcb5c
AM
10122
10123 return got_reloc;
f3c180ae 10124}
f3c180ae 10125
9f32dd5b
L
10126static void
10127signed_cons (int size)
6482c264 10128{
d182319b
JB
10129 if (flag_code == CODE_64BIT)
10130 cons_sign = 1;
10131 cons (size);
10132 cons_sign = -1;
6482c264
NC
10133}
10134
d182319b 10135#ifdef TE_PE
6482c264 10136static void
7016a5d5 10137pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
10138{
10139 expressionS exp;
10140
10141 do
10142 {
10143 expression (&exp);
10144 if (exp.X_op == O_symbol)
10145 exp.X_op = O_secrel;
10146
10147 emit_expr (&exp, 4);
10148 }
10149 while (*input_line_pointer++ == ',');
10150
10151 input_line_pointer--;
10152 demand_empty_rest_of_line ();
10153}
6482c264
NC
10154#endif
10155
43234a1e
L
10156/* Handle Vector operations. */
10157
10158static char *
10159check_VecOperations (char *op_string, char *op_end)
10160{
10161 const reg_entry *mask;
10162 const char *saved;
10163 char *end_op;
10164
10165 while (*op_string
10166 && (op_end == NULL || op_string < op_end))
10167 {
10168 saved = op_string;
10169 if (*op_string == '{')
10170 {
10171 op_string++;
10172
10173 /* Check broadcasts. */
10174 if (strncmp (op_string, "1to", 3) == 0)
10175 {
10176 int bcst_type;
10177
10178 if (i.broadcast)
10179 goto duplicated_vec_op;
10180
10181 op_string += 3;
10182 if (*op_string == '8')
8e6e0792 10183 bcst_type = 8;
b28d1bda 10184 else if (*op_string == '4')
8e6e0792 10185 bcst_type = 4;
b28d1bda 10186 else if (*op_string == '2')
8e6e0792 10187 bcst_type = 2;
43234a1e
L
10188 else if (*op_string == '1'
10189 && *(op_string+1) == '6')
10190 {
8e6e0792 10191 bcst_type = 16;
43234a1e
L
10192 op_string++;
10193 }
10194 else
10195 {
10196 as_bad (_("Unsupported broadcast: `%s'"), saved);
10197 return NULL;
10198 }
10199 op_string++;
10200
10201 broadcast_op.type = bcst_type;
10202 broadcast_op.operand = this_operand;
1f75763a 10203 broadcast_op.bytes = 0;
43234a1e
L
10204 i.broadcast = &broadcast_op;
10205 }
10206 /* Check masking operation. */
10207 else if ((mask = parse_register (op_string, &end_op)) != NULL)
10208 {
8a6fb3f9
JB
10209 if (mask == &bad_reg)
10210 return NULL;
10211
43234a1e 10212 /* k0 can't be used for write mask. */
f74a6307 10213 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 10214 {
6d2cd6b2
JB
10215 as_bad (_("`%s%s' can't be used for write mask"),
10216 register_prefix, mask->reg_name);
43234a1e
L
10217 return NULL;
10218 }
10219
10220 if (!i.mask)
10221 {
10222 mask_op.mask = mask;
10223 mask_op.zeroing = 0;
10224 mask_op.operand = this_operand;
10225 i.mask = &mask_op;
10226 }
10227 else
10228 {
10229 if (i.mask->mask)
10230 goto duplicated_vec_op;
10231
10232 i.mask->mask = mask;
10233
10234 /* Only "{z}" is allowed here. No need to check
10235 zeroing mask explicitly. */
10236 if (i.mask->operand != this_operand)
10237 {
10238 as_bad (_("invalid write mask `%s'"), saved);
10239 return NULL;
10240 }
10241 }
10242
10243 op_string = end_op;
10244 }
10245 /* Check zeroing-flag for masking operation. */
10246 else if (*op_string == 'z')
10247 {
10248 if (!i.mask)
10249 {
10250 mask_op.mask = NULL;
10251 mask_op.zeroing = 1;
10252 mask_op.operand = this_operand;
10253 i.mask = &mask_op;
10254 }
10255 else
10256 {
10257 if (i.mask->zeroing)
10258 {
10259 duplicated_vec_op:
10260 as_bad (_("duplicated `%s'"), saved);
10261 return NULL;
10262 }
10263
10264 i.mask->zeroing = 1;
10265
10266 /* Only "{%k}" is allowed here. No need to check mask
10267 register explicitly. */
10268 if (i.mask->operand != this_operand)
10269 {
10270 as_bad (_("invalid zeroing-masking `%s'"),
10271 saved);
10272 return NULL;
10273 }
10274 }
10275
10276 op_string++;
10277 }
10278 else
10279 goto unknown_vec_op;
10280
10281 if (*op_string != '}')
10282 {
10283 as_bad (_("missing `}' in `%s'"), saved);
10284 return NULL;
10285 }
10286 op_string++;
0ba3a731
L
10287
10288 /* Strip whitespace since the addition of pseudo prefixes
10289 changed how the scrubber treats '{'. */
10290 if (is_space_char (*op_string))
10291 ++op_string;
10292
43234a1e
L
10293 continue;
10294 }
10295 unknown_vec_op:
10296 /* We don't know this one. */
10297 as_bad (_("unknown vector operation: `%s'"), saved);
10298 return NULL;
10299 }
10300
6d2cd6b2
JB
10301 if (i.mask && i.mask->zeroing && !i.mask->mask)
10302 {
10303 as_bad (_("zeroing-masking only allowed with write mask"));
10304 return NULL;
10305 }
10306
43234a1e
L
10307 return op_string;
10308}
10309
252b5132 10310static int
70e41ade 10311i386_immediate (char *imm_start)
252b5132
RH
10312{
10313 char *save_input_line_pointer;
f3c180ae 10314 char *gotfree_input_line;
252b5132 10315 segT exp_seg = 0;
47926f60 10316 expressionS *exp;
40fb9820
L
10317 i386_operand_type types;
10318
0dfbf9d7 10319 operand_type_set (&types, ~0);
252b5132
RH
10320
10321 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
10322 {
31b2323c
L
10323 as_bad (_("at most %d immediate operands are allowed"),
10324 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
10325 return 0;
10326 }
10327
10328 exp = &im_expressions[i.imm_operands++];
520dc8e8 10329 i.op[this_operand].imms = exp;
252b5132
RH
10330
10331 if (is_space_char (*imm_start))
10332 ++imm_start;
10333
10334 save_input_line_pointer = input_line_pointer;
10335 input_line_pointer = imm_start;
10336
d258b828 10337 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10338 if (gotfree_input_line)
10339 input_line_pointer = gotfree_input_line;
252b5132
RH
10340
10341 exp_seg = expression (exp);
10342
83183c0c 10343 SKIP_WHITESPACE ();
43234a1e
L
10344
10345 /* Handle vector operations. */
10346 if (*input_line_pointer == '{')
10347 {
10348 input_line_pointer = check_VecOperations (input_line_pointer,
10349 NULL);
10350 if (input_line_pointer == NULL)
10351 return 0;
10352 }
10353
252b5132 10354 if (*input_line_pointer)
f3c180ae 10355 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
10356
10357 input_line_pointer = save_input_line_pointer;
f3c180ae 10358 if (gotfree_input_line)
ee86248c
JB
10359 {
10360 free (gotfree_input_line);
10361
10362 if (exp->X_op == O_constant || exp->X_op == O_register)
10363 exp->X_op = O_illegal;
10364 }
10365
10366 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
10367}
252b5132 10368
ee86248c
JB
10369static int
10370i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10371 i386_operand_type types, const char *imm_start)
10372{
10373 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 10374 {
313c53d1
L
10375 if (imm_start)
10376 as_bad (_("missing or invalid immediate expression `%s'"),
10377 imm_start);
3992d3b7 10378 return 0;
252b5132 10379 }
3e73aa7c 10380 else if (exp->X_op == O_constant)
252b5132 10381 {
47926f60 10382 /* Size it properly later. */
40fb9820 10383 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
10384 /* If not 64bit, sign extend val. */
10385 if (flag_code != CODE_64BIT
4eed87de
AM
10386 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
10387 exp->X_add_number
10388 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 10389 }
4c63da97 10390#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 10391 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 10392 && exp_seg != absolute_section
47926f60 10393 && exp_seg != text_section
24eab124
AM
10394 && exp_seg != data_section
10395 && exp_seg != bss_section
10396 && exp_seg != undefined_section
f86103b7 10397 && !bfd_is_com_section (exp_seg))
252b5132 10398 {
d0b47220 10399 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
10400 return 0;
10401 }
10402#endif
a841bdf5 10403 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 10404 {
313c53d1
L
10405 if (imm_start)
10406 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
10407 return 0;
10408 }
252b5132
RH
10409 else
10410 {
10411 /* This is an address. The size of the address will be
24eab124 10412 determined later, depending on destination register,
3e73aa7c 10413 suffix, or the default for the section. */
40fb9820
L
10414 i.types[this_operand].bitfield.imm8 = 1;
10415 i.types[this_operand].bitfield.imm16 = 1;
10416 i.types[this_operand].bitfield.imm32 = 1;
10417 i.types[this_operand].bitfield.imm32s = 1;
10418 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
10419 i.types[this_operand] = operand_type_and (i.types[this_operand],
10420 types);
252b5132
RH
10421 }
10422
10423 return 1;
10424}
10425
551c1ca1 10426static char *
e3bb37b5 10427i386_scale (char *scale)
252b5132 10428{
551c1ca1
AM
10429 offsetT val;
10430 char *save = input_line_pointer;
252b5132 10431
551c1ca1
AM
10432 input_line_pointer = scale;
10433 val = get_absolute_expression ();
10434
10435 switch (val)
252b5132 10436 {
551c1ca1 10437 case 1:
252b5132
RH
10438 i.log2_scale_factor = 0;
10439 break;
551c1ca1 10440 case 2:
252b5132
RH
10441 i.log2_scale_factor = 1;
10442 break;
551c1ca1 10443 case 4:
252b5132
RH
10444 i.log2_scale_factor = 2;
10445 break;
551c1ca1 10446 case 8:
252b5132
RH
10447 i.log2_scale_factor = 3;
10448 break;
10449 default:
a724f0f4
JB
10450 {
10451 char sep = *input_line_pointer;
10452
10453 *input_line_pointer = '\0';
10454 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
10455 scale);
10456 *input_line_pointer = sep;
10457 input_line_pointer = save;
10458 return NULL;
10459 }
252b5132 10460 }
29b0f896 10461 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
10462 {
10463 as_warn (_("scale factor of %d without an index register"),
24eab124 10464 1 << i.log2_scale_factor);
252b5132 10465 i.log2_scale_factor = 0;
252b5132 10466 }
551c1ca1
AM
10467 scale = input_line_pointer;
10468 input_line_pointer = save;
10469 return scale;
252b5132
RH
10470}
10471
252b5132 10472static int
e3bb37b5 10473i386_displacement (char *disp_start, char *disp_end)
252b5132 10474{
29b0f896 10475 expressionS *exp;
252b5132
RH
10476 segT exp_seg = 0;
10477 char *save_input_line_pointer;
f3c180ae 10478 char *gotfree_input_line;
40fb9820
L
10479 int override;
10480 i386_operand_type bigdisp, types = anydisp;
3992d3b7 10481 int ret;
252b5132 10482
31b2323c
L
10483 if (i.disp_operands == MAX_MEMORY_OPERANDS)
10484 {
10485 as_bad (_("at most %d displacement operands are allowed"),
10486 MAX_MEMORY_OPERANDS);
10487 return 0;
10488 }
10489
0dfbf9d7 10490 operand_type_set (&bigdisp, 0);
6f2f06be 10491 if (i.jumpabsolute
48bcea9f 10492 || i.types[this_operand].bitfield.baseindex
0cfa3eb3
JB
10493 || (current_templates->start->opcode_modifier.jump != JUMP
10494 && current_templates->start->opcode_modifier.jump != JUMP_DWORD))
e05278af 10495 {
48bcea9f 10496 i386_addressing_mode ();
e05278af 10497 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
10498 if (flag_code == CODE_64BIT)
10499 {
10500 if (!override)
10501 {
10502 bigdisp.bitfield.disp32s = 1;
10503 bigdisp.bitfield.disp64 = 1;
10504 }
48bcea9f
JB
10505 else
10506 bigdisp.bitfield.disp32 = 1;
40fb9820
L
10507 }
10508 else if ((flag_code == CODE_16BIT) ^ override)
40fb9820 10509 bigdisp.bitfield.disp16 = 1;
48bcea9f
JB
10510 else
10511 bigdisp.bitfield.disp32 = 1;
e05278af
JB
10512 }
10513 else
10514 {
376cd056
JB
10515 /* For PC-relative branches, the width of the displacement may be
10516 dependent upon data size, but is never dependent upon address size.
10517 Also make sure to not unintentionally match against a non-PC-relative
10518 branch template. */
10519 static templates aux_templates;
10520 const insn_template *t = current_templates->start;
10521 bfd_boolean has_intel64 = FALSE;
10522
10523 aux_templates.start = t;
10524 while (++t < current_templates->end)
10525 {
10526 if (t->opcode_modifier.jump
10527 != current_templates->start->opcode_modifier.jump)
10528 break;
4b5aaf5f 10529 if ((t->opcode_modifier.isa64 >= INTEL64))
376cd056
JB
10530 has_intel64 = TRUE;
10531 }
10532 if (t < current_templates->end)
10533 {
10534 aux_templates.end = t;
10535 current_templates = &aux_templates;
10536 }
10537
e05278af 10538 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
10539 if (flag_code == CODE_64BIT)
10540 {
376cd056
JB
10541 if ((override || i.suffix == WORD_MNEM_SUFFIX)
10542 && (!intel64 || !has_intel64))
40fb9820
L
10543 bigdisp.bitfield.disp16 = 1;
10544 else
48bcea9f 10545 bigdisp.bitfield.disp32s = 1;
40fb9820
L
10546 }
10547 else
e05278af
JB
10548 {
10549 if (!override)
10550 override = (i.suffix == (flag_code != CODE_16BIT
10551 ? WORD_MNEM_SUFFIX
10552 : LONG_MNEM_SUFFIX));
40fb9820
L
10553 bigdisp.bitfield.disp32 = 1;
10554 if ((flag_code == CODE_16BIT) ^ override)
10555 {
10556 bigdisp.bitfield.disp32 = 0;
10557 bigdisp.bitfield.disp16 = 1;
10558 }
e05278af 10559 }
e05278af 10560 }
c6fb90c8
L
10561 i.types[this_operand] = operand_type_or (i.types[this_operand],
10562 bigdisp);
252b5132
RH
10563
10564 exp = &disp_expressions[i.disp_operands];
520dc8e8 10565 i.op[this_operand].disps = exp;
252b5132
RH
10566 i.disp_operands++;
10567 save_input_line_pointer = input_line_pointer;
10568 input_line_pointer = disp_start;
10569 END_STRING_AND_SAVE (disp_end);
10570
10571#ifndef GCC_ASM_O_HACK
10572#define GCC_ASM_O_HACK 0
10573#endif
10574#if GCC_ASM_O_HACK
10575 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 10576 if (i.types[this_operand].bitfield.baseIndex
24eab124 10577 && displacement_string_end[-1] == '+')
252b5132
RH
10578 {
10579 /* This hack is to avoid a warning when using the "o"
24eab124
AM
10580 constraint within gcc asm statements.
10581 For instance:
10582
10583 #define _set_tssldt_desc(n,addr,limit,type) \
10584 __asm__ __volatile__ ( \
10585 "movw %w2,%0\n\t" \
10586 "movw %w1,2+%0\n\t" \
10587 "rorl $16,%1\n\t" \
10588 "movb %b1,4+%0\n\t" \
10589 "movb %4,5+%0\n\t" \
10590 "movb $0,6+%0\n\t" \
10591 "movb %h1,7+%0\n\t" \
10592 "rorl $16,%1" \
10593 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
10594
10595 This works great except that the output assembler ends
10596 up looking a bit weird if it turns out that there is
10597 no offset. You end up producing code that looks like:
10598
10599 #APP
10600 movw $235,(%eax)
10601 movw %dx,2+(%eax)
10602 rorl $16,%edx
10603 movb %dl,4+(%eax)
10604 movb $137,5+(%eax)
10605 movb $0,6+(%eax)
10606 movb %dh,7+(%eax)
10607 rorl $16,%edx
10608 #NO_APP
10609
47926f60 10610 So here we provide the missing zero. */
24eab124
AM
10611
10612 *displacement_string_end = '0';
252b5132
RH
10613 }
10614#endif
d258b828 10615 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10616 if (gotfree_input_line)
10617 input_line_pointer = gotfree_input_line;
252b5132 10618
24eab124 10619 exp_seg = expression (exp);
252b5132 10620
636c26b0
AM
10621 SKIP_WHITESPACE ();
10622 if (*input_line_pointer)
10623 as_bad (_("junk `%s' after expression"), input_line_pointer);
10624#if GCC_ASM_O_HACK
10625 RESTORE_END_STRING (disp_end + 1);
10626#endif
636c26b0 10627 input_line_pointer = save_input_line_pointer;
636c26b0 10628 if (gotfree_input_line)
ee86248c
JB
10629 {
10630 free (gotfree_input_line);
10631
10632 if (exp->X_op == O_constant || exp->X_op == O_register)
10633 exp->X_op = O_illegal;
10634 }
10635
10636 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
10637
10638 RESTORE_END_STRING (disp_end);
10639
10640 return ret;
10641}
10642
10643static int
10644i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10645 i386_operand_type types, const char *disp_start)
10646{
10647 i386_operand_type bigdisp;
10648 int ret = 1;
636c26b0 10649
24eab124
AM
10650 /* We do this to make sure that the section symbol is in
10651 the symbol table. We will ultimately change the relocation
47926f60 10652 to be relative to the beginning of the section. */
1ae12ab7 10653 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
10654 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
10655 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 10656 {
636c26b0 10657 if (exp->X_op != O_symbol)
3992d3b7 10658 goto inv_disp;
636c26b0 10659
e5cb08ac 10660 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
10661 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
10662 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 10663 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
10664 exp->X_op = O_subtract;
10665 exp->X_op_symbol = GOT_symbol;
1ae12ab7 10666 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 10667 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
10668 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
10669 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 10670 else
29b0f896 10671 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 10672 }
252b5132 10673
3992d3b7
AM
10674 else if (exp->X_op == O_absent
10675 || exp->X_op == O_illegal
ee86248c 10676 || exp->X_op == O_big)
2daf4fd8 10677 {
3992d3b7
AM
10678 inv_disp:
10679 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 10680 disp_start);
3992d3b7 10681 ret = 0;
2daf4fd8
AM
10682 }
10683
0e1147d9
L
10684 else if (flag_code == CODE_64BIT
10685 && !i.prefix[ADDR_PREFIX]
10686 && exp->X_op == O_constant)
10687 {
10688 /* Since displacement is signed extended to 64bit, don't allow
10689 disp32 and turn off disp32s if they are out of range. */
10690 i.types[this_operand].bitfield.disp32 = 0;
10691 if (!fits_in_signed_long (exp->X_add_number))
10692 {
10693 i.types[this_operand].bitfield.disp32s = 0;
10694 if (i.types[this_operand].bitfield.baseindex)
10695 {
10696 as_bad (_("0x%lx out range of signed 32bit displacement"),
10697 (long) exp->X_add_number);
10698 ret = 0;
10699 }
10700 }
10701 }
10702
4c63da97 10703#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
10704 else if (exp->X_op != O_constant
10705 && OUTPUT_FLAVOR == bfd_target_aout_flavour
10706 && exp_seg != absolute_section
10707 && exp_seg != text_section
10708 && exp_seg != data_section
10709 && exp_seg != bss_section
10710 && exp_seg != undefined_section
10711 && !bfd_is_com_section (exp_seg))
24eab124 10712 {
d0b47220 10713 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 10714 ret = 0;
24eab124 10715 }
252b5132 10716#endif
3956db08 10717
48bcea9f
JB
10718 if (current_templates->start->opcode_modifier.jump == JUMP_BYTE
10719 /* Constants get taken care of by optimize_disp(). */
10720 && exp->X_op != O_constant)
10721 i.types[this_operand].bitfield.disp8 = 1;
10722
40fb9820
L
10723 /* Check if this is a displacement only operand. */
10724 bigdisp = i.types[this_operand];
10725 bigdisp.bitfield.disp8 = 0;
10726 bigdisp.bitfield.disp16 = 0;
10727 bigdisp.bitfield.disp32 = 0;
10728 bigdisp.bitfield.disp32s = 0;
10729 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 10730 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
10731 i.types[this_operand] = operand_type_and (i.types[this_operand],
10732 types);
3956db08 10733
3992d3b7 10734 return ret;
252b5132
RH
10735}
10736
2abc2bec
JB
10737/* Return the active addressing mode, taking address override and
10738 registers forming the address into consideration. Update the
10739 address override prefix if necessary. */
47926f60 10740
2abc2bec
JB
10741static enum flag_code
10742i386_addressing_mode (void)
252b5132 10743{
be05d201
L
10744 enum flag_code addr_mode;
10745
10746 if (i.prefix[ADDR_PREFIX])
10747 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
a23b33b3
JB
10748 else if (flag_code == CODE_16BIT
10749 && current_templates->start->cpu_flags.bitfield.cpumpx
10750 /* Avoid replacing the "16-bit addressing not allowed" diagnostic
10751 from md_assemble() by "is not a valid base/index expression"
10752 when there is a base and/or index. */
10753 && !i.types[this_operand].bitfield.baseindex)
10754 {
10755 /* MPX insn memory operands with neither base nor index must be forced
10756 to use 32-bit addressing in 16-bit mode. */
10757 addr_mode = CODE_32BIT;
10758 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10759 ++i.prefixes;
10760 gas_assert (!i.types[this_operand].bitfield.disp16);
10761 gas_assert (!i.types[this_operand].bitfield.disp32);
10762 }
be05d201
L
10763 else
10764 {
10765 addr_mode = flag_code;
10766
24eab124 10767#if INFER_ADDR_PREFIX
be05d201
L
10768 if (i.mem_operands == 0)
10769 {
10770 /* Infer address prefix from the first memory operand. */
10771 const reg_entry *addr_reg = i.base_reg;
10772
10773 if (addr_reg == NULL)
10774 addr_reg = i.index_reg;
eecb386c 10775
be05d201
L
10776 if (addr_reg)
10777 {
e968fc9b 10778 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
10779 addr_mode = CODE_32BIT;
10780 else if (flag_code != CODE_64BIT
dc821c5f 10781 && addr_reg->reg_type.bitfield.word)
be05d201
L
10782 addr_mode = CODE_16BIT;
10783
10784 if (addr_mode != flag_code)
10785 {
10786 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10787 i.prefixes += 1;
10788 /* Change the size of any displacement too. At most one
10789 of Disp16 or Disp32 is set.
10790 FIXME. There doesn't seem to be any real need for
10791 separate Disp16 and Disp32 flags. The same goes for
10792 Imm16 and Imm32. Removing them would probably clean
10793 up the code quite a lot. */
10794 if (flag_code != CODE_64BIT
10795 && (i.types[this_operand].bitfield.disp16
10796 || i.types[this_operand].bitfield.disp32))
10797 i.types[this_operand]
10798 = operand_type_xor (i.types[this_operand], disp16_32);
10799 }
10800 }
10801 }
24eab124 10802#endif
be05d201
L
10803 }
10804
2abc2bec
JB
10805 return addr_mode;
10806}
10807
10808/* Make sure the memory operand we've been dealt is valid.
10809 Return 1 on success, 0 on a failure. */
10810
10811static int
10812i386_index_check (const char *operand_string)
10813{
10814 const char *kind = "base/index";
10815 enum flag_code addr_mode = i386_addressing_mode ();
10816
fc0763e6 10817 if (current_templates->start->opcode_modifier.isstring
c3949f43 10818 && !current_templates->start->cpu_flags.bitfield.cpupadlock
fc0763e6
JB
10819 && (current_templates->end[-1].opcode_modifier.isstring
10820 || i.mem_operands))
10821 {
10822 /* Memory operands of string insns are special in that they only allow
10823 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
10824 const reg_entry *expected_reg;
10825 static const char *di_si[][2] =
10826 {
10827 { "esi", "edi" },
10828 { "si", "di" },
10829 { "rsi", "rdi" }
10830 };
10831 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
10832
10833 kind = "string address";
10834
8325cc63 10835 if (current_templates->start->opcode_modifier.repprefixok)
fc0763e6 10836 {
51c8edf6
JB
10837 int es_op = current_templates->end[-1].opcode_modifier.isstring
10838 - IS_STRING_ES_OP0;
10839 int op = 0;
fc0763e6 10840
51c8edf6 10841 if (!current_templates->end[-1].operand_types[0].bitfield.baseindex
fc0763e6
JB
10842 || ((!i.mem_operands != !intel_syntax)
10843 && current_templates->end[-1].operand_types[1]
10844 .bitfield.baseindex))
51c8edf6
JB
10845 op = 1;
10846 expected_reg = hash_find (reg_hash, di_si[addr_mode][op == es_op]);
fc0763e6
JB
10847 }
10848 else
be05d201 10849 expected_reg = hash_find (reg_hash, bx[addr_mode]);
fc0763e6 10850
be05d201
L
10851 if (i.base_reg != expected_reg
10852 || i.index_reg
fc0763e6 10853 || operand_type_check (i.types[this_operand], disp))
fc0763e6 10854 {
be05d201
L
10855 /* The second memory operand must have the same size as
10856 the first one. */
10857 if (i.mem_operands
10858 && i.base_reg
10859 && !((addr_mode == CODE_64BIT
dc821c5f 10860 && i.base_reg->reg_type.bitfield.qword)
be05d201 10861 || (addr_mode == CODE_32BIT
dc821c5f
JB
10862 ? i.base_reg->reg_type.bitfield.dword
10863 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
10864 goto bad_address;
10865
fc0763e6
JB
10866 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
10867 operand_string,
10868 intel_syntax ? '[' : '(',
10869 register_prefix,
be05d201 10870 expected_reg->reg_name,
fc0763e6 10871 intel_syntax ? ']' : ')');
be05d201 10872 return 1;
fc0763e6 10873 }
be05d201
L
10874 else
10875 return 1;
10876
dc1e8a47 10877 bad_address:
be05d201
L
10878 as_bad (_("`%s' is not a valid %s expression"),
10879 operand_string, kind);
10880 return 0;
3e73aa7c
JH
10881 }
10882 else
10883 {
be05d201
L
10884 if (addr_mode != CODE_16BIT)
10885 {
10886 /* 32-bit/64-bit checks. */
10887 if ((i.base_reg
e968fc9b
JB
10888 && ((addr_mode == CODE_64BIT
10889 ? !i.base_reg->reg_type.bitfield.qword
10890 : !i.base_reg->reg_type.bitfield.dword)
10891 || (i.index_reg && i.base_reg->reg_num == RegIP)
10892 || i.base_reg->reg_num == RegIZ))
be05d201 10893 || (i.index_reg
1b54b8d7
JB
10894 && !i.index_reg->reg_type.bitfield.xmmword
10895 && !i.index_reg->reg_type.bitfield.ymmword
10896 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 10897 && ((addr_mode == CODE_64BIT
e968fc9b
JB
10898 ? !i.index_reg->reg_type.bitfield.qword
10899 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
10900 || !i.index_reg->reg_type.bitfield.baseindex)))
10901 goto bad_address;
8178be5b
JB
10902
10903 /* bndmk, bndldx, and bndstx have special restrictions. */
10904 if (current_templates->start->base_opcode == 0xf30f1b
10905 || (current_templates->start->base_opcode & ~1) == 0x0f1a)
10906 {
10907 /* They cannot use RIP-relative addressing. */
e968fc9b 10908 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
10909 {
10910 as_bad (_("`%s' cannot be used here"), operand_string);
10911 return 0;
10912 }
10913
10914 /* bndldx and bndstx ignore their scale factor. */
10915 if (current_templates->start->base_opcode != 0xf30f1b
10916 && i.log2_scale_factor)
10917 as_warn (_("register scaling is being ignored here"));
10918 }
be05d201
L
10919 }
10920 else
3e73aa7c 10921 {
be05d201 10922 /* 16-bit checks. */
3e73aa7c 10923 if ((i.base_reg
dc821c5f 10924 && (!i.base_reg->reg_type.bitfield.word
40fb9820 10925 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 10926 || (i.index_reg
dc821c5f 10927 && (!i.index_reg->reg_type.bitfield.word
40fb9820 10928 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
10929 || !(i.base_reg
10930 && i.base_reg->reg_num < 6
10931 && i.index_reg->reg_num >= 6
10932 && i.log2_scale_factor == 0))))
be05d201 10933 goto bad_address;
3e73aa7c
JH
10934 }
10935 }
be05d201 10936 return 1;
24eab124 10937}
252b5132 10938
43234a1e
L
10939/* Handle vector immediates. */
10940
10941static int
10942RC_SAE_immediate (const char *imm_start)
10943{
10944 unsigned int match_found, j;
10945 const char *pstr = imm_start;
10946 expressionS *exp;
10947
10948 if (*pstr != '{')
10949 return 0;
10950
10951 pstr++;
10952 match_found = 0;
10953 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
10954 {
10955 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
10956 {
10957 if (!i.rounding)
10958 {
10959 rc_op.type = RC_NamesTable[j].type;
10960 rc_op.operand = this_operand;
10961 i.rounding = &rc_op;
10962 }
10963 else
10964 {
10965 as_bad (_("duplicated `%s'"), imm_start);
10966 return 0;
10967 }
10968 pstr += RC_NamesTable[j].len;
10969 match_found = 1;
10970 break;
10971 }
10972 }
10973 if (!match_found)
10974 return 0;
10975
10976 if (*pstr++ != '}')
10977 {
10978 as_bad (_("Missing '}': '%s'"), imm_start);
10979 return 0;
10980 }
10981 /* RC/SAE immediate string should contain nothing more. */;
10982 if (*pstr != 0)
10983 {
10984 as_bad (_("Junk after '}': '%s'"), imm_start);
10985 return 0;
10986 }
10987
10988 exp = &im_expressions[i.imm_operands++];
10989 i.op[this_operand].imms = exp;
10990
10991 exp->X_op = O_constant;
10992 exp->X_add_number = 0;
10993 exp->X_add_symbol = (symbolS *) 0;
10994 exp->X_op_symbol = (symbolS *) 0;
10995
10996 i.types[this_operand].bitfield.imm8 = 1;
10997 return 1;
10998}
10999
8325cc63
JB
11000/* Only string instructions can have a second memory operand, so
11001 reduce current_templates to just those if it contains any. */
11002static int
11003maybe_adjust_templates (void)
11004{
11005 const insn_template *t;
11006
11007 gas_assert (i.mem_operands == 1);
11008
11009 for (t = current_templates->start; t < current_templates->end; ++t)
11010 if (t->opcode_modifier.isstring)
11011 break;
11012
11013 if (t < current_templates->end)
11014 {
11015 static templates aux_templates;
11016 bfd_boolean recheck;
11017
11018 aux_templates.start = t;
11019 for (; t < current_templates->end; ++t)
11020 if (!t->opcode_modifier.isstring)
11021 break;
11022 aux_templates.end = t;
11023
11024 /* Determine whether to re-check the first memory operand. */
11025 recheck = (aux_templates.start != current_templates->start
11026 || t != current_templates->end);
11027
11028 current_templates = &aux_templates;
11029
11030 if (recheck)
11031 {
11032 i.mem_operands = 0;
11033 if (i.memop1_string != NULL
11034 && i386_index_check (i.memop1_string) == 0)
11035 return 0;
11036 i.mem_operands = 1;
11037 }
11038 }
11039
11040 return 1;
11041}
11042
fc0763e6 11043/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 11044 on error. */
252b5132 11045
252b5132 11046static int
a7619375 11047i386_att_operand (char *operand_string)
252b5132 11048{
af6bdddf
AM
11049 const reg_entry *r;
11050 char *end_op;
24eab124 11051 char *op_string = operand_string;
252b5132 11052
24eab124 11053 if (is_space_char (*op_string))
252b5132
RH
11054 ++op_string;
11055
24eab124 11056 /* We check for an absolute prefix (differentiating,
47926f60 11057 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
11058 if (*op_string == ABSOLUTE_PREFIX)
11059 {
11060 ++op_string;
11061 if (is_space_char (*op_string))
11062 ++op_string;
6f2f06be 11063 i.jumpabsolute = TRUE;
24eab124 11064 }
252b5132 11065
47926f60 11066 /* Check if operand is a register. */
4d1bb795 11067 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 11068 {
40fb9820
L
11069 i386_operand_type temp;
11070
8a6fb3f9
JB
11071 if (r == &bad_reg)
11072 return 0;
11073
24eab124
AM
11074 /* Check for a segment override by searching for ':' after a
11075 segment register. */
11076 op_string = end_op;
11077 if (is_space_char (*op_string))
11078 ++op_string;
00cee14f 11079 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124
AM
11080 {
11081 switch (r->reg_num)
11082 {
11083 case 0:
11084 i.seg[i.mem_operands] = &es;
11085 break;
11086 case 1:
11087 i.seg[i.mem_operands] = &cs;
11088 break;
11089 case 2:
11090 i.seg[i.mem_operands] = &ss;
11091 break;
11092 case 3:
11093 i.seg[i.mem_operands] = &ds;
11094 break;
11095 case 4:
11096 i.seg[i.mem_operands] = &fs;
11097 break;
11098 case 5:
11099 i.seg[i.mem_operands] = &gs;
11100 break;
11101 }
252b5132 11102
24eab124 11103 /* Skip the ':' and whitespace. */
252b5132
RH
11104 ++op_string;
11105 if (is_space_char (*op_string))
24eab124 11106 ++op_string;
252b5132 11107
24eab124
AM
11108 if (!is_digit_char (*op_string)
11109 && !is_identifier_char (*op_string)
11110 && *op_string != '('
11111 && *op_string != ABSOLUTE_PREFIX)
11112 {
11113 as_bad (_("bad memory operand `%s'"), op_string);
11114 return 0;
11115 }
47926f60 11116 /* Handle case of %es:*foo. */
24eab124
AM
11117 if (*op_string == ABSOLUTE_PREFIX)
11118 {
11119 ++op_string;
11120 if (is_space_char (*op_string))
11121 ++op_string;
6f2f06be 11122 i.jumpabsolute = TRUE;
24eab124
AM
11123 }
11124 goto do_memory_reference;
11125 }
43234a1e
L
11126
11127 /* Handle vector operations. */
11128 if (*op_string == '{')
11129 {
11130 op_string = check_VecOperations (op_string, NULL);
11131 if (op_string == NULL)
11132 return 0;
11133 }
11134
24eab124
AM
11135 if (*op_string)
11136 {
d0b47220 11137 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
11138 return 0;
11139 }
40fb9820
L
11140 temp = r->reg_type;
11141 temp.bitfield.baseindex = 0;
c6fb90c8
L
11142 i.types[this_operand] = operand_type_or (i.types[this_operand],
11143 temp);
7d5e4556 11144 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 11145 i.op[this_operand].regs = r;
24eab124
AM
11146 i.reg_operands++;
11147 }
af6bdddf
AM
11148 else if (*op_string == REGISTER_PREFIX)
11149 {
11150 as_bad (_("bad register name `%s'"), op_string);
11151 return 0;
11152 }
24eab124 11153 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 11154 {
24eab124 11155 ++op_string;
6f2f06be 11156 if (i.jumpabsolute)
24eab124 11157 {
d0b47220 11158 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
11159 return 0;
11160 }
11161 if (!i386_immediate (op_string))
11162 return 0;
11163 }
43234a1e
L
11164 else if (RC_SAE_immediate (operand_string))
11165 {
11166 /* If it is a RC or SAE immediate, do nothing. */
11167 ;
11168 }
24eab124
AM
11169 else if (is_digit_char (*op_string)
11170 || is_identifier_char (*op_string)
d02603dc 11171 || *op_string == '"'
e5cb08ac 11172 || *op_string == '(')
24eab124 11173 {
47926f60 11174 /* This is a memory reference of some sort. */
af6bdddf 11175 char *base_string;
252b5132 11176
47926f60 11177 /* Start and end of displacement string expression (if found). */
eecb386c
AM
11178 char *displacement_string_start;
11179 char *displacement_string_end;
43234a1e 11180 char *vop_start;
252b5132 11181
24eab124 11182 do_memory_reference:
8325cc63
JB
11183 if (i.mem_operands == 1 && !maybe_adjust_templates ())
11184 return 0;
24eab124 11185 if ((i.mem_operands == 1
40fb9820 11186 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
11187 || i.mem_operands == 2)
11188 {
11189 as_bad (_("too many memory references for `%s'"),
11190 current_templates->start->name);
11191 return 0;
11192 }
252b5132 11193
24eab124
AM
11194 /* Check for base index form. We detect the base index form by
11195 looking for an ')' at the end of the operand, searching
11196 for the '(' matching it, and finding a REGISTER_PREFIX or ','
11197 after the '('. */
af6bdddf 11198 base_string = op_string + strlen (op_string);
c3332e24 11199
43234a1e
L
11200 /* Handle vector operations. */
11201 vop_start = strchr (op_string, '{');
11202 if (vop_start && vop_start < base_string)
11203 {
11204 if (check_VecOperations (vop_start, base_string) == NULL)
11205 return 0;
11206 base_string = vop_start;
11207 }
11208
af6bdddf
AM
11209 --base_string;
11210 if (is_space_char (*base_string))
11211 --base_string;
252b5132 11212
47926f60 11213 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
11214 displacement_string_start = op_string;
11215 displacement_string_end = base_string + 1;
252b5132 11216
24eab124
AM
11217 if (*base_string == ')')
11218 {
af6bdddf 11219 char *temp_string;
24eab124
AM
11220 unsigned int parens_balanced = 1;
11221 /* We've already checked that the number of left & right ()'s are
47926f60 11222 equal, so this loop will not be infinite. */
24eab124
AM
11223 do
11224 {
11225 base_string--;
11226 if (*base_string == ')')
11227 parens_balanced++;
11228 if (*base_string == '(')
11229 parens_balanced--;
11230 }
11231 while (parens_balanced);
c3332e24 11232
af6bdddf 11233 temp_string = base_string;
c3332e24 11234
24eab124 11235 /* Skip past '(' and whitespace. */
252b5132
RH
11236 ++base_string;
11237 if (is_space_char (*base_string))
24eab124 11238 ++base_string;
252b5132 11239
af6bdddf 11240 if (*base_string == ','
4eed87de
AM
11241 || ((i.base_reg = parse_register (base_string, &end_op))
11242 != NULL))
252b5132 11243 {
af6bdddf 11244 displacement_string_end = temp_string;
252b5132 11245
40fb9820 11246 i.types[this_operand].bitfield.baseindex = 1;
252b5132 11247
af6bdddf 11248 if (i.base_reg)
24eab124 11249 {
8a6fb3f9
JB
11250 if (i.base_reg == &bad_reg)
11251 return 0;
24eab124
AM
11252 base_string = end_op;
11253 if (is_space_char (*base_string))
11254 ++base_string;
af6bdddf
AM
11255 }
11256
11257 /* There may be an index reg or scale factor here. */
11258 if (*base_string == ',')
11259 {
11260 ++base_string;
11261 if (is_space_char (*base_string))
11262 ++base_string;
11263
4eed87de
AM
11264 if ((i.index_reg = parse_register (base_string, &end_op))
11265 != NULL)
24eab124 11266 {
8a6fb3f9
JB
11267 if (i.index_reg == &bad_reg)
11268 return 0;
af6bdddf 11269 base_string = end_op;
24eab124
AM
11270 if (is_space_char (*base_string))
11271 ++base_string;
af6bdddf
AM
11272 if (*base_string == ',')
11273 {
11274 ++base_string;
11275 if (is_space_char (*base_string))
11276 ++base_string;
11277 }
e5cb08ac 11278 else if (*base_string != ')')
af6bdddf 11279 {
4eed87de
AM
11280 as_bad (_("expecting `,' or `)' "
11281 "after index register in `%s'"),
af6bdddf
AM
11282 operand_string);
11283 return 0;
11284 }
24eab124 11285 }
af6bdddf 11286 else if (*base_string == REGISTER_PREFIX)
24eab124 11287 {
f76bf5e0
L
11288 end_op = strchr (base_string, ',');
11289 if (end_op)
11290 *end_op = '\0';
af6bdddf 11291 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
11292 return 0;
11293 }
252b5132 11294
47926f60 11295 /* Check for scale factor. */
551c1ca1 11296 if (*base_string != ')')
af6bdddf 11297 {
551c1ca1
AM
11298 char *end_scale = i386_scale (base_string);
11299
11300 if (!end_scale)
af6bdddf 11301 return 0;
24eab124 11302
551c1ca1 11303 base_string = end_scale;
af6bdddf
AM
11304 if (is_space_char (*base_string))
11305 ++base_string;
11306 if (*base_string != ')')
11307 {
4eed87de
AM
11308 as_bad (_("expecting `)' "
11309 "after scale factor in `%s'"),
af6bdddf
AM
11310 operand_string);
11311 return 0;
11312 }
11313 }
11314 else if (!i.index_reg)
24eab124 11315 {
4eed87de
AM
11316 as_bad (_("expecting index register or scale factor "
11317 "after `,'; got '%c'"),
af6bdddf 11318 *base_string);
24eab124
AM
11319 return 0;
11320 }
11321 }
af6bdddf 11322 else if (*base_string != ')')
24eab124 11323 {
4eed87de
AM
11324 as_bad (_("expecting `,' or `)' "
11325 "after base register in `%s'"),
af6bdddf 11326 operand_string);
24eab124
AM
11327 return 0;
11328 }
c3332e24 11329 }
af6bdddf 11330 else if (*base_string == REGISTER_PREFIX)
c3332e24 11331 {
f76bf5e0
L
11332 end_op = strchr (base_string, ',');
11333 if (end_op)
11334 *end_op = '\0';
af6bdddf 11335 as_bad (_("bad register name `%s'"), base_string);
24eab124 11336 return 0;
c3332e24 11337 }
24eab124
AM
11338 }
11339
11340 /* If there's an expression beginning the operand, parse it,
11341 assuming displacement_string_start and
11342 displacement_string_end are meaningful. */
11343 if (displacement_string_start != displacement_string_end)
11344 {
11345 if (!i386_displacement (displacement_string_start,
11346 displacement_string_end))
11347 return 0;
11348 }
11349
11350 /* Special case for (%dx) while doing input/output op. */
11351 if (i.base_reg
75e5731b
JB
11352 && i.base_reg->reg_type.bitfield.instance == RegD
11353 && i.base_reg->reg_type.bitfield.word
24eab124
AM
11354 && i.index_reg == 0
11355 && i.log2_scale_factor == 0
11356 && i.seg[i.mem_operands] == 0
40fb9820 11357 && !operand_type_check (i.types[this_operand], disp))
24eab124 11358 {
2fb5be8d 11359 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
11360 return 1;
11361 }
11362
eecb386c
AM
11363 if (i386_index_check (operand_string) == 0)
11364 return 0;
c48dadc9 11365 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
11366 if (i.mem_operands == 0)
11367 i.memop1_string = xstrdup (operand_string);
24eab124
AM
11368 i.mem_operands++;
11369 }
11370 else
ce8a8b2f
AM
11371 {
11372 /* It's not a memory operand; argh! */
24eab124
AM
11373 as_bad (_("invalid char %s beginning operand %d `%s'"),
11374 output_invalid (*op_string),
11375 this_operand + 1,
11376 op_string);
11377 return 0;
11378 }
47926f60 11379 return 1; /* Normal return. */
252b5132
RH
11380}
11381\f
fa94de6b
RM
11382/* Calculate the maximum variable size (i.e., excluding fr_fix)
11383 that an rs_machine_dependent frag may reach. */
11384
11385unsigned int
11386i386_frag_max_var (fragS *frag)
11387{
11388 /* The only relaxable frags are for jumps.
11389 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
11390 gas_assert (frag->fr_type == rs_machine_dependent);
11391 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
11392}
11393
b084df0b
L
11394#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11395static int
8dcea932 11396elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
11397{
11398 /* STT_GNU_IFUNC symbol must go through PLT. */
11399 if ((symbol_get_bfdsym (fr_symbol)->flags
11400 & BSF_GNU_INDIRECT_FUNCTION) != 0)
11401 return 0;
11402
11403 if (!S_IS_EXTERNAL (fr_symbol))
11404 /* Symbol may be weak or local. */
11405 return !S_IS_WEAK (fr_symbol);
11406
8dcea932
L
11407 /* Global symbols with non-default visibility can't be preempted. */
11408 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
11409 return 1;
11410
11411 if (fr_var != NO_RELOC)
11412 switch ((enum bfd_reloc_code_real) fr_var)
11413 {
11414 case BFD_RELOC_386_PLT32:
11415 case BFD_RELOC_X86_64_PLT32:
33eaf5de 11416 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
11417 return 0;
11418 default:
11419 abort ();
11420 }
11421
b084df0b
L
11422 /* Global symbols with default visibility in a shared library may be
11423 preempted by another definition. */
8dcea932 11424 return !shared;
b084df0b
L
11425}
11426#endif
11427
79d72f45
HL
11428/* Table 3-2. Macro-Fusible Instructions in Haswell Microarchitecture
11429 Note also work for Skylake and Cascadelake.
11430---------------------------------------------------------------------
11431| JCC | ADD/SUB/CMP | INC/DEC | TEST/AND |
11432| ------ | ----------- | ------- | -------- |
11433| Jo | N | N | Y |
11434| Jno | N | N | Y |
11435| Jc/Jb | Y | N | Y |
11436| Jae/Jnb | Y | N | Y |
11437| Je/Jz | Y | Y | Y |
11438| Jne/Jnz | Y | Y | Y |
11439| Jna/Jbe | Y | N | Y |
11440| Ja/Jnbe | Y | N | Y |
11441| Js | N | N | Y |
11442| Jns | N | N | Y |
11443| Jp/Jpe | N | N | Y |
11444| Jnp/Jpo | N | N | Y |
11445| Jl/Jnge | Y | Y | Y |
11446| Jge/Jnl | Y | Y | Y |
11447| Jle/Jng | Y | Y | Y |
11448| Jg/Jnle | Y | Y | Y |
11449--------------------------------------------------------------------- */
11450static int
11451i386_macro_fusible_p (enum mf_cmp_kind mf_cmp, enum mf_jcc_kind mf_jcc)
11452{
11453 if (mf_cmp == mf_cmp_alu_cmp)
11454 return ((mf_jcc >= mf_jcc_jc && mf_jcc <= mf_jcc_jna)
11455 || mf_jcc == mf_jcc_jl || mf_jcc == mf_jcc_jle);
11456 if (mf_cmp == mf_cmp_incdec)
11457 return (mf_jcc == mf_jcc_je || mf_jcc == mf_jcc_jl
11458 || mf_jcc == mf_jcc_jle);
11459 if (mf_cmp == mf_cmp_test_and)
11460 return 1;
11461 return 0;
11462}
11463
e379e5f3
L
11464/* Return the next non-empty frag. */
11465
11466static fragS *
11467i386_next_non_empty_frag (fragS *fragP)
11468{
11469 /* There may be a frag with a ".fill 0" when there is no room in
11470 the current frag for frag_grow in output_insn. */
11471 for (fragP = fragP->fr_next;
11472 (fragP != NULL
11473 && fragP->fr_type == rs_fill
11474 && fragP->fr_fix == 0);
11475 fragP = fragP->fr_next)
11476 ;
11477 return fragP;
11478}
11479
11480/* Return the next jcc frag after BRANCH_PADDING. */
11481
11482static fragS *
79d72f45 11483i386_next_fusible_jcc_frag (fragS *maybe_cmp_fragP, fragS *pad_fragP)
e379e5f3 11484{
79d72f45
HL
11485 fragS *branch_fragP;
11486 if (!pad_fragP)
e379e5f3
L
11487 return NULL;
11488
79d72f45
HL
11489 if (pad_fragP->fr_type == rs_machine_dependent
11490 && (TYPE_FROM_RELAX_STATE (pad_fragP->fr_subtype)
e379e5f3
L
11491 == BRANCH_PADDING))
11492 {
79d72f45
HL
11493 branch_fragP = i386_next_non_empty_frag (pad_fragP);
11494 if (branch_fragP->fr_type != rs_machine_dependent)
e379e5f3 11495 return NULL;
79d72f45
HL
11496 if (TYPE_FROM_RELAX_STATE (branch_fragP->fr_subtype) == COND_JUMP
11497 && i386_macro_fusible_p (maybe_cmp_fragP->tc_frag_data.mf_type,
11498 pad_fragP->tc_frag_data.mf_type))
11499 return branch_fragP;
e379e5f3
L
11500 }
11501
11502 return NULL;
11503}
11504
11505/* Classify BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags. */
11506
11507static void
11508i386_classify_machine_dependent_frag (fragS *fragP)
11509{
11510 fragS *cmp_fragP;
11511 fragS *pad_fragP;
11512 fragS *branch_fragP;
11513 fragS *next_fragP;
11514 unsigned int max_prefix_length;
11515
11516 if (fragP->tc_frag_data.classified)
11517 return;
11518
11519 /* First scan for BRANCH_PADDING and FUSED_JCC_PADDING. Convert
11520 FUSED_JCC_PADDING and merge BRANCH_PADDING. */
11521 for (next_fragP = fragP;
11522 next_fragP != NULL;
11523 next_fragP = next_fragP->fr_next)
11524 {
11525 next_fragP->tc_frag_data.classified = 1;
11526 if (next_fragP->fr_type == rs_machine_dependent)
11527 switch (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype))
11528 {
11529 case BRANCH_PADDING:
11530 /* The BRANCH_PADDING frag must be followed by a branch
11531 frag. */
11532 branch_fragP = i386_next_non_empty_frag (next_fragP);
11533 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11534 break;
11535 case FUSED_JCC_PADDING:
11536 /* Check if this is a fused jcc:
11537 FUSED_JCC_PADDING
11538 CMP like instruction
11539 BRANCH_PADDING
11540 COND_JUMP
11541 */
11542 cmp_fragP = i386_next_non_empty_frag (next_fragP);
11543 pad_fragP = i386_next_non_empty_frag (cmp_fragP);
79d72f45 11544 branch_fragP = i386_next_fusible_jcc_frag (next_fragP, pad_fragP);
e379e5f3
L
11545 if (branch_fragP)
11546 {
11547 /* The BRANCH_PADDING frag is merged with the
11548 FUSED_JCC_PADDING frag. */
11549 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11550 /* CMP like instruction size. */
11551 next_fragP->tc_frag_data.cmp_size = cmp_fragP->fr_fix;
11552 frag_wane (pad_fragP);
11553 /* Skip to branch_fragP. */
11554 next_fragP = branch_fragP;
11555 }
11556 else if (next_fragP->tc_frag_data.max_prefix_length)
11557 {
11558 /* Turn FUSED_JCC_PADDING into BRANCH_PREFIX if it isn't
11559 a fused jcc. */
11560 next_fragP->fr_subtype
11561 = ENCODE_RELAX_STATE (BRANCH_PREFIX, 0);
11562 next_fragP->tc_frag_data.max_bytes
11563 = next_fragP->tc_frag_data.max_prefix_length;
11564 /* This will be updated in the BRANCH_PREFIX scan. */
11565 next_fragP->tc_frag_data.max_prefix_length = 0;
11566 }
11567 else
11568 frag_wane (next_fragP);
11569 break;
11570 }
11571 }
11572
11573 /* Stop if there is no BRANCH_PREFIX. */
11574 if (!align_branch_prefix_size)
11575 return;
11576
11577 /* Scan for BRANCH_PREFIX. */
11578 for (; fragP != NULL; fragP = fragP->fr_next)
11579 {
11580 if (fragP->fr_type != rs_machine_dependent
11581 || (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11582 != BRANCH_PREFIX))
11583 continue;
11584
11585 /* Count all BRANCH_PREFIX frags before BRANCH_PADDING and
11586 COND_JUMP_PREFIX. */
11587 max_prefix_length = 0;
11588 for (next_fragP = fragP;
11589 next_fragP != NULL;
11590 next_fragP = next_fragP->fr_next)
11591 {
11592 if (next_fragP->fr_type == rs_fill)
11593 /* Skip rs_fill frags. */
11594 continue;
11595 else if (next_fragP->fr_type != rs_machine_dependent)
11596 /* Stop for all other frags. */
11597 break;
11598
11599 /* rs_machine_dependent frags. */
11600 if (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11601 == BRANCH_PREFIX)
11602 {
11603 /* Count BRANCH_PREFIX frags. */
11604 if (max_prefix_length >= MAX_FUSED_JCC_PADDING_SIZE)
11605 {
11606 max_prefix_length = MAX_FUSED_JCC_PADDING_SIZE;
11607 frag_wane (next_fragP);
11608 }
11609 else
11610 max_prefix_length
11611 += next_fragP->tc_frag_data.max_bytes;
11612 }
11613 else if ((TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11614 == BRANCH_PADDING)
11615 || (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11616 == FUSED_JCC_PADDING))
11617 {
11618 /* Stop at BRANCH_PADDING and FUSED_JCC_PADDING. */
11619 fragP->tc_frag_data.u.padding_fragP = next_fragP;
11620 break;
11621 }
11622 else
11623 /* Stop for other rs_machine_dependent frags. */
11624 break;
11625 }
11626
11627 fragP->tc_frag_data.max_prefix_length = max_prefix_length;
11628
11629 /* Skip to the next frag. */
11630 fragP = next_fragP;
11631 }
11632}
11633
11634/* Compute padding size for
11635
11636 FUSED_JCC_PADDING
11637 CMP like instruction
11638 BRANCH_PADDING
11639 COND_JUMP/UNCOND_JUMP
11640
11641 or
11642
11643 BRANCH_PADDING
11644 COND_JUMP/UNCOND_JUMP
11645 */
11646
11647static int
11648i386_branch_padding_size (fragS *fragP, offsetT address)
11649{
11650 unsigned int offset, size, padding_size;
11651 fragS *branch_fragP = fragP->tc_frag_data.u.branch_fragP;
11652
11653 /* The start address of the BRANCH_PADDING or FUSED_JCC_PADDING frag. */
11654 if (!address)
11655 address = fragP->fr_address;
11656 address += fragP->fr_fix;
11657
11658 /* CMP like instrunction size. */
11659 size = fragP->tc_frag_data.cmp_size;
11660
11661 /* The base size of the branch frag. */
11662 size += branch_fragP->fr_fix;
11663
11664 /* Add opcode and displacement bytes for the rs_machine_dependent
11665 branch frag. */
11666 if (branch_fragP->fr_type == rs_machine_dependent)
11667 size += md_relax_table[branch_fragP->fr_subtype].rlx_length;
11668
11669 /* Check if branch is within boundary and doesn't end at the last
11670 byte. */
11671 offset = address & ((1U << align_branch_power) - 1);
11672 if ((offset + size) >= (1U << align_branch_power))
11673 /* Padding needed to avoid crossing boundary. */
11674 padding_size = (1U << align_branch_power) - offset;
11675 else
11676 /* No padding needed. */
11677 padding_size = 0;
11678
11679 /* The return value may be saved in tc_frag_data.length which is
11680 unsigned byte. */
11681 if (!fits_in_unsigned_byte (padding_size))
11682 abort ();
11683
11684 return padding_size;
11685}
11686
11687/* i386_generic_table_relax_frag()
11688
11689 Handle BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags to
11690 grow/shrink padding to align branch frags. Hand others to
11691 relax_frag(). */
11692
11693long
11694i386_generic_table_relax_frag (segT segment, fragS *fragP, long stretch)
11695{
11696 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11697 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11698 {
11699 long padding_size = i386_branch_padding_size (fragP, 0);
11700 long grow = padding_size - fragP->tc_frag_data.length;
11701
11702 /* When the BRANCH_PREFIX frag is used, the computed address
11703 must match the actual address and there should be no padding. */
11704 if (fragP->tc_frag_data.padding_address
11705 && (fragP->tc_frag_data.padding_address != fragP->fr_address
11706 || padding_size))
11707 abort ();
11708
11709 /* Update the padding size. */
11710 if (grow)
11711 fragP->tc_frag_data.length = padding_size;
11712
11713 return grow;
11714 }
11715 else if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11716 {
11717 fragS *padding_fragP, *next_fragP;
11718 long padding_size, left_size, last_size;
11719
11720 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
11721 if (!padding_fragP)
11722 /* Use the padding set by the leading BRANCH_PREFIX frag. */
11723 return (fragP->tc_frag_data.length
11724 - fragP->tc_frag_data.last_length);
11725
11726 /* Compute the relative address of the padding frag in the very
11727 first time where the BRANCH_PREFIX frag sizes are zero. */
11728 if (!fragP->tc_frag_data.padding_address)
11729 fragP->tc_frag_data.padding_address
11730 = padding_fragP->fr_address - (fragP->fr_address - stretch);
11731
11732 /* First update the last length from the previous interation. */
11733 left_size = fragP->tc_frag_data.prefix_length;
11734 for (next_fragP = fragP;
11735 next_fragP != padding_fragP;
11736 next_fragP = next_fragP->fr_next)
11737 if (next_fragP->fr_type == rs_machine_dependent
11738 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11739 == BRANCH_PREFIX))
11740 {
11741 if (left_size)
11742 {
11743 int max = next_fragP->tc_frag_data.max_bytes;
11744 if (max)
11745 {
11746 int size;
11747 if (max > left_size)
11748 size = left_size;
11749 else
11750 size = max;
11751 left_size -= size;
11752 next_fragP->tc_frag_data.last_length = size;
11753 }
11754 }
11755 else
11756 next_fragP->tc_frag_data.last_length = 0;
11757 }
11758
11759 /* Check the padding size for the padding frag. */
11760 padding_size = i386_branch_padding_size
11761 (padding_fragP, (fragP->fr_address
11762 + fragP->tc_frag_data.padding_address));
11763
11764 last_size = fragP->tc_frag_data.prefix_length;
11765 /* Check if there is change from the last interation. */
11766 if (padding_size == last_size)
11767 {
11768 /* Update the expected address of the padding frag. */
11769 padding_fragP->tc_frag_data.padding_address
11770 = (fragP->fr_address + padding_size
11771 + fragP->tc_frag_data.padding_address);
11772 return 0;
11773 }
11774
11775 if (padding_size > fragP->tc_frag_data.max_prefix_length)
11776 {
11777 /* No padding if there is no sufficient room. Clear the
11778 expected address of the padding frag. */
11779 padding_fragP->tc_frag_data.padding_address = 0;
11780 padding_size = 0;
11781 }
11782 else
11783 /* Store the expected address of the padding frag. */
11784 padding_fragP->tc_frag_data.padding_address
11785 = (fragP->fr_address + padding_size
11786 + fragP->tc_frag_data.padding_address);
11787
11788 fragP->tc_frag_data.prefix_length = padding_size;
11789
11790 /* Update the length for the current interation. */
11791 left_size = padding_size;
11792 for (next_fragP = fragP;
11793 next_fragP != padding_fragP;
11794 next_fragP = next_fragP->fr_next)
11795 if (next_fragP->fr_type == rs_machine_dependent
11796 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11797 == BRANCH_PREFIX))
11798 {
11799 if (left_size)
11800 {
11801 int max = next_fragP->tc_frag_data.max_bytes;
11802 if (max)
11803 {
11804 int size;
11805 if (max > left_size)
11806 size = left_size;
11807 else
11808 size = max;
11809 left_size -= size;
11810 next_fragP->tc_frag_data.length = size;
11811 }
11812 }
11813 else
11814 next_fragP->tc_frag_data.length = 0;
11815 }
11816
11817 return (fragP->tc_frag_data.length
11818 - fragP->tc_frag_data.last_length);
11819 }
11820 return relax_frag (segment, fragP, stretch);
11821}
11822
ee7fcc42
AM
11823/* md_estimate_size_before_relax()
11824
11825 Called just before relax() for rs_machine_dependent frags. The x86
11826 assembler uses these frags to handle variable size jump
11827 instructions.
11828
11829 Any symbol that is now undefined will not become defined.
11830 Return the correct fr_subtype in the frag.
11831 Return the initial "guess for variable size of frag" to caller.
11832 The guess is actually the growth beyond the fixed part. Whatever
11833 we do to grow the fixed or variable part contributes to our
11834 returned value. */
11835
252b5132 11836int
7016a5d5 11837md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 11838{
e379e5f3
L
11839 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11840 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX
11841 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11842 {
11843 i386_classify_machine_dependent_frag (fragP);
11844 return fragP->tc_frag_data.length;
11845 }
11846
252b5132 11847 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
11848 check for un-relaxable symbols. On an ELF system, we can't relax
11849 an externally visible symbol, because it may be overridden by a
11850 shared library. */
11851 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 11852#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 11853 || (IS_ELF
8dcea932
L
11854 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
11855 fragP->fr_var))
fbeb56a4
DK
11856#endif
11857#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 11858 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 11859 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
11860#endif
11861 )
252b5132 11862 {
b98ef147
AM
11863 /* Symbol is undefined in this segment, or we need to keep a
11864 reloc so that weak symbols can be overridden. */
11865 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 11866 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
11867 unsigned char *opcode;
11868 int old_fr_fix;
f6af82bd 11869
ee7fcc42 11870 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 11871 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 11872 else if (size == 2)
f6af82bd 11873 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
11874#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11875 else if (need_plt32_p (fragP->fr_symbol))
11876 reloc_type = BFD_RELOC_X86_64_PLT32;
11877#endif
f6af82bd
AM
11878 else
11879 reloc_type = BFD_RELOC_32_PCREL;
252b5132 11880
ee7fcc42
AM
11881 old_fr_fix = fragP->fr_fix;
11882 opcode = (unsigned char *) fragP->fr_opcode;
11883
fddf5b5b 11884 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 11885 {
fddf5b5b
AM
11886 case UNCOND_JUMP:
11887 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 11888 opcode[0] = 0xe9;
252b5132 11889 fragP->fr_fix += size;
062cd5e7
AS
11890 fix_new (fragP, old_fr_fix, size,
11891 fragP->fr_symbol,
11892 fragP->fr_offset, 1,
11893 reloc_type);
252b5132
RH
11894 break;
11895
fddf5b5b 11896 case COND_JUMP86:
412167cb
AM
11897 if (size == 2
11898 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
11899 {
11900 /* Negate the condition, and branch past an
11901 unconditional jump. */
11902 opcode[0] ^= 1;
11903 opcode[1] = 3;
11904 /* Insert an unconditional jump. */
11905 opcode[2] = 0xe9;
11906 /* We added two extra opcode bytes, and have a two byte
11907 offset. */
11908 fragP->fr_fix += 2 + 2;
062cd5e7
AS
11909 fix_new (fragP, old_fr_fix + 2, 2,
11910 fragP->fr_symbol,
11911 fragP->fr_offset, 1,
11912 reloc_type);
fddf5b5b
AM
11913 break;
11914 }
11915 /* Fall through. */
11916
11917 case COND_JUMP:
412167cb
AM
11918 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
11919 {
3e02c1cc
AM
11920 fixS *fixP;
11921
412167cb 11922 fragP->fr_fix += 1;
3e02c1cc
AM
11923 fixP = fix_new (fragP, old_fr_fix, 1,
11924 fragP->fr_symbol,
11925 fragP->fr_offset, 1,
11926 BFD_RELOC_8_PCREL);
11927 fixP->fx_signed = 1;
412167cb
AM
11928 break;
11929 }
93c2a809 11930
24eab124 11931 /* This changes the byte-displacement jump 0x7N
fddf5b5b 11932 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 11933 opcode[1] = opcode[0] + 0x10;
f6af82bd 11934 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
11935 /* We've added an opcode byte. */
11936 fragP->fr_fix += 1 + size;
062cd5e7
AS
11937 fix_new (fragP, old_fr_fix + 1, size,
11938 fragP->fr_symbol,
11939 fragP->fr_offset, 1,
11940 reloc_type);
252b5132 11941 break;
fddf5b5b
AM
11942
11943 default:
11944 BAD_CASE (fragP->fr_subtype);
11945 break;
252b5132
RH
11946 }
11947 frag_wane (fragP);
ee7fcc42 11948 return fragP->fr_fix - old_fr_fix;
252b5132 11949 }
93c2a809 11950
93c2a809
AM
11951 /* Guess size depending on current relax state. Initially the relax
11952 state will correspond to a short jump and we return 1, because
11953 the variable part of the frag (the branch offset) is one byte
11954 long. However, we can relax a section more than once and in that
11955 case we must either set fr_subtype back to the unrelaxed state,
11956 or return the value for the appropriate branch. */
11957 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
11958}
11959
47926f60
KH
11960/* Called after relax() is finished.
11961
11962 In: Address of frag.
11963 fr_type == rs_machine_dependent.
11964 fr_subtype is what the address relaxed to.
11965
11966 Out: Any fixSs and constants are set up.
11967 Caller will turn frag into a ".space 0". */
11968
252b5132 11969void
7016a5d5
TG
11970md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
11971 fragS *fragP)
252b5132 11972{
29b0f896 11973 unsigned char *opcode;
252b5132 11974 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
11975 offsetT target_address;
11976 offsetT opcode_address;
252b5132 11977 unsigned int extension = 0;
847f7ad4 11978 offsetT displacement_from_opcode_start;
252b5132 11979
e379e5f3
L
11980 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11981 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING
11982 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11983 {
11984 /* Generate nop padding. */
11985 unsigned int size = fragP->tc_frag_data.length;
11986 if (size)
11987 {
11988 if (size > fragP->tc_frag_data.max_bytes)
11989 abort ();
11990
11991 if (flag_debug)
11992 {
11993 const char *msg;
11994 const char *branch = "branch";
11995 const char *prefix = "";
11996 fragS *padding_fragP;
11997 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11998 == BRANCH_PREFIX)
11999 {
12000 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
12001 switch (fragP->tc_frag_data.default_prefix)
12002 {
12003 default:
12004 abort ();
12005 break;
12006 case CS_PREFIX_OPCODE:
12007 prefix = " cs";
12008 break;
12009 case DS_PREFIX_OPCODE:
12010 prefix = " ds";
12011 break;
12012 case ES_PREFIX_OPCODE:
12013 prefix = " es";
12014 break;
12015 case FS_PREFIX_OPCODE:
12016 prefix = " fs";
12017 break;
12018 case GS_PREFIX_OPCODE:
12019 prefix = " gs";
12020 break;
12021 case SS_PREFIX_OPCODE:
12022 prefix = " ss";
12023 break;
12024 }
12025 if (padding_fragP)
12026 msg = _("%s:%u: add %d%s at 0x%llx to align "
12027 "%s within %d-byte boundary\n");
12028 else
12029 msg = _("%s:%u: add additional %d%s at 0x%llx to "
12030 "align %s within %d-byte boundary\n");
12031 }
12032 else
12033 {
12034 padding_fragP = fragP;
12035 msg = _("%s:%u: add %d%s-byte nop at 0x%llx to align "
12036 "%s within %d-byte boundary\n");
12037 }
12038
12039 if (padding_fragP)
12040 switch (padding_fragP->tc_frag_data.branch_type)
12041 {
12042 case align_branch_jcc:
12043 branch = "jcc";
12044 break;
12045 case align_branch_fused:
12046 branch = "fused jcc";
12047 break;
12048 case align_branch_jmp:
12049 branch = "jmp";
12050 break;
12051 case align_branch_call:
12052 branch = "call";
12053 break;
12054 case align_branch_indirect:
12055 branch = "indiret branch";
12056 break;
12057 case align_branch_ret:
12058 branch = "ret";
12059 break;
12060 default:
12061 break;
12062 }
12063
12064 fprintf (stdout, msg,
12065 fragP->fr_file, fragP->fr_line, size, prefix,
12066 (long long) fragP->fr_address, branch,
12067 1 << align_branch_power);
12068 }
12069 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12070 memset (fragP->fr_opcode,
12071 fragP->tc_frag_data.default_prefix, size);
12072 else
12073 i386_generate_nops (fragP, (char *) fragP->fr_opcode,
12074 size, 0);
12075 fragP->fr_fix += size;
12076 }
12077 return;
12078 }
12079
252b5132
RH
12080 opcode = (unsigned char *) fragP->fr_opcode;
12081
47926f60 12082 /* Address we want to reach in file space. */
252b5132 12083 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 12084
47926f60 12085 /* Address opcode resides at in file space. */
252b5132
RH
12086 opcode_address = fragP->fr_address + fragP->fr_fix;
12087
47926f60 12088 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
12089 displacement_from_opcode_start = target_address - opcode_address;
12090
fddf5b5b 12091 if ((fragP->fr_subtype & BIG) == 0)
252b5132 12092 {
47926f60
KH
12093 /* Don't have to change opcode. */
12094 extension = 1; /* 1 opcode + 1 displacement */
252b5132 12095 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
12096 }
12097 else
12098 {
12099 if (no_cond_jump_promotion
12100 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
12101 as_warn_where (fragP->fr_file, fragP->fr_line,
12102 _("long jump required"));
252b5132 12103
fddf5b5b
AM
12104 switch (fragP->fr_subtype)
12105 {
12106 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
12107 extension = 4; /* 1 opcode + 4 displacement */
12108 opcode[0] = 0xe9;
12109 where_to_put_displacement = &opcode[1];
12110 break;
252b5132 12111
fddf5b5b
AM
12112 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
12113 extension = 2; /* 1 opcode + 2 displacement */
12114 opcode[0] = 0xe9;
12115 where_to_put_displacement = &opcode[1];
12116 break;
252b5132 12117
fddf5b5b
AM
12118 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
12119 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
12120 extension = 5; /* 2 opcode + 4 displacement */
12121 opcode[1] = opcode[0] + 0x10;
12122 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12123 where_to_put_displacement = &opcode[2];
12124 break;
252b5132 12125
fddf5b5b
AM
12126 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
12127 extension = 3; /* 2 opcode + 2 displacement */
12128 opcode[1] = opcode[0] + 0x10;
12129 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12130 where_to_put_displacement = &opcode[2];
12131 break;
252b5132 12132
fddf5b5b
AM
12133 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
12134 extension = 4;
12135 opcode[0] ^= 1;
12136 opcode[1] = 3;
12137 opcode[2] = 0xe9;
12138 where_to_put_displacement = &opcode[3];
12139 break;
12140
12141 default:
12142 BAD_CASE (fragP->fr_subtype);
12143 break;
12144 }
252b5132 12145 }
fddf5b5b 12146
7b81dfbb
AJ
12147 /* If size if less then four we are sure that the operand fits,
12148 but if it's 4, then it could be that the displacement is larger
12149 then -/+ 2GB. */
12150 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
12151 && object_64bit
12152 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
12153 + ((addressT) 1 << 31))
12154 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
12155 {
12156 as_bad_where (fragP->fr_file, fragP->fr_line,
12157 _("jump target out of range"));
12158 /* Make us emit 0. */
12159 displacement_from_opcode_start = extension;
12160 }
47926f60 12161 /* Now put displacement after opcode. */
252b5132
RH
12162 md_number_to_chars ((char *) where_to_put_displacement,
12163 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 12164 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
12165 fragP->fr_fix += extension;
12166}
12167\f
7016a5d5 12168/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
12169 by our caller that we have all the info we need to fix it up.
12170
7016a5d5
TG
12171 Parameter valP is the pointer to the value of the bits.
12172
252b5132
RH
12173 On the 386, immediates, displacements, and data pointers are all in
12174 the same (little-endian) format, so we don't need to care about which
12175 we are handling. */
12176
94f592af 12177void
7016a5d5 12178md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 12179{
94f592af 12180 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 12181 valueT value = *valP;
252b5132 12182
f86103b7 12183#if !defined (TE_Mach)
93382f6d
AM
12184 if (fixP->fx_pcrel)
12185 {
12186 switch (fixP->fx_r_type)
12187 {
5865bb77
ILT
12188 default:
12189 break;
12190
d6ab8113
JB
12191 case BFD_RELOC_64:
12192 fixP->fx_r_type = BFD_RELOC_64_PCREL;
12193 break;
93382f6d 12194 case BFD_RELOC_32:
ae8887b5 12195 case BFD_RELOC_X86_64_32S:
93382f6d
AM
12196 fixP->fx_r_type = BFD_RELOC_32_PCREL;
12197 break;
12198 case BFD_RELOC_16:
12199 fixP->fx_r_type = BFD_RELOC_16_PCREL;
12200 break;
12201 case BFD_RELOC_8:
12202 fixP->fx_r_type = BFD_RELOC_8_PCREL;
12203 break;
12204 }
12205 }
252b5132 12206
a161fe53 12207 if (fixP->fx_addsy != NULL
31312f95 12208 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 12209 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 12210 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 12211 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 12212 && !use_rela_relocations)
252b5132 12213 {
31312f95
AM
12214 /* This is a hack. There should be a better way to handle this.
12215 This covers for the fact that bfd_install_relocation will
12216 subtract the current location (for partial_inplace, PC relative
12217 relocations); see more below. */
252b5132 12218#ifndef OBJ_AOUT
718ddfc0 12219 if (IS_ELF
252b5132
RH
12220#ifdef TE_PE
12221 || OUTPUT_FLAVOR == bfd_target_coff_flavour
12222#endif
12223 )
12224 value += fixP->fx_where + fixP->fx_frag->fr_address;
12225#endif
12226#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12227 if (IS_ELF)
252b5132 12228 {
6539b54b 12229 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 12230
6539b54b 12231 if ((sym_seg == seg
2f66722d 12232 || (symbol_section_p (fixP->fx_addsy)
6539b54b 12233 && sym_seg != absolute_section))
af65af87 12234 && !generic_force_reloc (fixP))
2f66722d
AM
12235 {
12236 /* Yes, we add the values in twice. This is because
6539b54b
AM
12237 bfd_install_relocation subtracts them out again. I think
12238 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
12239 it. FIXME. */
12240 value += fixP->fx_where + fixP->fx_frag->fr_address;
12241 }
252b5132
RH
12242 }
12243#endif
12244#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
12245 /* For some reason, the PE format does not store a
12246 section address offset for a PC relative symbol. */
12247 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 12248 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
12249 value += md_pcrel_from (fixP);
12250#endif
12251 }
fbeb56a4 12252#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
12253 if (fixP->fx_addsy != NULL
12254 && S_IS_WEAK (fixP->fx_addsy)
12255 /* PR 16858: Do not modify weak function references. */
12256 && ! fixP->fx_pcrel)
fbeb56a4 12257 {
296a8689
NC
12258#if !defined (TE_PEP)
12259 /* For x86 PE weak function symbols are neither PC-relative
12260 nor do they set S_IS_FUNCTION. So the only reliable way
12261 to detect them is to check the flags of their containing
12262 section. */
12263 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
12264 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
12265 ;
12266 else
12267#endif
fbeb56a4
DK
12268 value -= S_GET_VALUE (fixP->fx_addsy);
12269 }
12270#endif
252b5132
RH
12271
12272 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 12273 and we must not disappoint it. */
252b5132 12274#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12275 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
12276 switch (fixP->fx_r_type)
12277 {
12278 case BFD_RELOC_386_PLT32:
3e73aa7c 12279 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
12280 /* Make the jump instruction point to the address of the operand.
12281 At runtime we merely add the offset to the actual PLT entry.
12282 NB: Subtract the offset size only for jump instructions. */
12283 if (fixP->fx_pcrel)
12284 value = -4;
47926f60 12285 break;
31312f95 12286
13ae64f3
JJ
12287 case BFD_RELOC_386_TLS_GD:
12288 case BFD_RELOC_386_TLS_LDM:
13ae64f3 12289 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
12290 case BFD_RELOC_386_TLS_IE:
12291 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 12292 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
12293 case BFD_RELOC_X86_64_TLSGD:
12294 case BFD_RELOC_X86_64_TLSLD:
12295 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 12296 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
12297 value = 0; /* Fully resolved at runtime. No addend. */
12298 /* Fallthrough */
12299 case BFD_RELOC_386_TLS_LE:
12300 case BFD_RELOC_386_TLS_LDO_32:
12301 case BFD_RELOC_386_TLS_LE_32:
12302 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 12303 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 12304 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 12305 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
12306 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12307 break;
12308
67a4f2b7
AO
12309 case BFD_RELOC_386_TLS_DESC_CALL:
12310 case BFD_RELOC_X86_64_TLSDESC_CALL:
12311 value = 0; /* Fully resolved at runtime. No addend. */
12312 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12313 fixP->fx_done = 0;
12314 return;
12315
47926f60
KH
12316 case BFD_RELOC_VTABLE_INHERIT:
12317 case BFD_RELOC_VTABLE_ENTRY:
12318 fixP->fx_done = 0;
94f592af 12319 return;
47926f60
KH
12320
12321 default:
12322 break;
12323 }
12324#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 12325 *valP = value;
f86103b7 12326#endif /* !defined (TE_Mach) */
3e73aa7c 12327
3e73aa7c 12328 /* Are we finished with this relocation now? */
c6682705 12329 if (fixP->fx_addsy == NULL)
3e73aa7c 12330 fixP->fx_done = 1;
fbeb56a4
DK
12331#if defined (OBJ_COFF) && defined (TE_PE)
12332 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
12333 {
12334 fixP->fx_done = 0;
12335 /* Remember value for tc_gen_reloc. */
12336 fixP->fx_addnumber = value;
12337 /* Clear out the frag for now. */
12338 value = 0;
12339 }
12340#endif
3e73aa7c
JH
12341 else if (use_rela_relocations)
12342 {
12343 fixP->fx_no_overflow = 1;
062cd5e7
AS
12344 /* Remember value for tc_gen_reloc. */
12345 fixP->fx_addnumber = value;
3e73aa7c
JH
12346 value = 0;
12347 }
f86103b7 12348
94f592af 12349 md_number_to_chars (p, value, fixP->fx_size);
252b5132 12350}
252b5132 12351\f
6d4af3c2 12352const char *
499ac353 12353md_atof (int type, char *litP, int *sizeP)
252b5132 12354{
499ac353
NC
12355 /* This outputs the LITTLENUMs in REVERSE order;
12356 in accord with the bigendian 386. */
12357 return ieee_md_atof (type, litP, sizeP, FALSE);
252b5132
RH
12358}
12359\f
2d545b82 12360static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 12361
252b5132 12362static char *
e3bb37b5 12363output_invalid (int c)
252b5132 12364{
3882b010 12365 if (ISPRINT (c))
f9f21a03
L
12366 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
12367 "'%c'", c);
252b5132 12368 else
f9f21a03 12369 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 12370 "(0x%x)", (unsigned char) c);
252b5132
RH
12371 return output_invalid_buf;
12372}
12373
8a6fb3f9
JB
12374/* Verify that @r can be used in the current context. */
12375
12376static bfd_boolean check_register (const reg_entry *r)
12377{
12378 if (allow_pseudo_reg)
12379 return TRUE;
12380
12381 if (operand_type_all_zero (&r->reg_type))
12382 return FALSE;
12383
12384 if ((r->reg_type.bitfield.dword
12385 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
12386 || r->reg_type.bitfield.class == RegCR
22e00a3f 12387 || r->reg_type.bitfield.class == RegDR)
8a6fb3f9
JB
12388 && !cpu_arch_flags.bitfield.cpui386)
12389 return FALSE;
12390
22e00a3f
JB
12391 if (r->reg_type.bitfield.class == RegTR
12392 && (flag_code == CODE_64BIT
12393 || !cpu_arch_flags.bitfield.cpui386
12394 || cpu_arch_isa_flags.bitfield.cpui586
12395 || cpu_arch_isa_flags.bitfield.cpui686))
12396 return FALSE;
12397
8a6fb3f9
JB
12398 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
12399 return FALSE;
12400
12401 if (!cpu_arch_flags.bitfield.cpuavx512f)
12402 {
12403 if (r->reg_type.bitfield.zmmword
12404 || r->reg_type.bitfield.class == RegMask)
12405 return FALSE;
12406
12407 if (!cpu_arch_flags.bitfield.cpuavx)
12408 {
12409 if (r->reg_type.bitfield.ymmword)
12410 return FALSE;
12411
12412 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
12413 return FALSE;
12414 }
12415 }
12416
12417 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
12418 return FALSE;
12419
12420 /* Don't allow fake index register unless allow_index_reg isn't 0. */
12421 if (!allow_index_reg && r->reg_num == RegIZ)
12422 return FALSE;
12423
12424 /* Upper 16 vector registers are only available with VREX in 64bit
12425 mode, and require EVEX encoding. */
12426 if (r->reg_flags & RegVRex)
12427 {
12428 if (!cpu_arch_flags.bitfield.cpuavx512f
12429 || flag_code != CODE_64BIT)
12430 return FALSE;
12431
da4977e0
JB
12432 if (i.vec_encoding == vex_encoding_default)
12433 i.vec_encoding = vex_encoding_evex;
12434 else if (i.vec_encoding != vex_encoding_evex)
12435 i.vec_encoding = vex_encoding_error;
8a6fb3f9
JB
12436 }
12437
12438 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
12439 && (!cpu_arch_flags.bitfield.cpulm || r->reg_type.bitfield.class != RegCR)
12440 && flag_code != CODE_64BIT)
12441 return FALSE;
12442
12443 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
12444 && !intel_syntax)
12445 return FALSE;
12446
12447 return TRUE;
12448}
12449
af6bdddf 12450/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
12451
12452static const reg_entry *
4d1bb795 12453parse_real_register (char *reg_string, char **end_op)
252b5132 12454{
af6bdddf
AM
12455 char *s = reg_string;
12456 char *p;
252b5132
RH
12457 char reg_name_given[MAX_REG_NAME_SIZE + 1];
12458 const reg_entry *r;
12459
12460 /* Skip possible REGISTER_PREFIX and possible whitespace. */
12461 if (*s == REGISTER_PREFIX)
12462 ++s;
12463
12464 if (is_space_char (*s))
12465 ++s;
12466
12467 p = reg_name_given;
af6bdddf 12468 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
12469 {
12470 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
12471 return (const reg_entry *) NULL;
12472 s++;
252b5132
RH
12473 }
12474
6588847e
DN
12475 /* For naked regs, make sure that we are not dealing with an identifier.
12476 This prevents confusing an identifier like `eax_var' with register
12477 `eax'. */
12478 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
12479 return (const reg_entry *) NULL;
12480
af6bdddf 12481 *end_op = s;
252b5132
RH
12482
12483 r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
12484
5f47d35b 12485 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 12486 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 12487 {
0e0eea78
JB
12488 if (!cpu_arch_flags.bitfield.cpu8087
12489 && !cpu_arch_flags.bitfield.cpu287
af32b722
JB
12490 && !cpu_arch_flags.bitfield.cpu387
12491 && !allow_pseudo_reg)
0e0eea78
JB
12492 return (const reg_entry *) NULL;
12493
5f47d35b
AM
12494 if (is_space_char (*s))
12495 ++s;
12496 if (*s == '(')
12497 {
af6bdddf 12498 ++s;
5f47d35b
AM
12499 if (is_space_char (*s))
12500 ++s;
12501 if (*s >= '0' && *s <= '7')
12502 {
db557034 12503 int fpr = *s - '0';
af6bdddf 12504 ++s;
5f47d35b
AM
12505 if (is_space_char (*s))
12506 ++s;
12507 if (*s == ')')
12508 {
12509 *end_op = s + 1;
1e9cc1c2 12510 r = (const reg_entry *) hash_find (reg_hash, "st(0)");
db557034
AM
12511 know (r);
12512 return r + fpr;
5f47d35b 12513 }
5f47d35b 12514 }
47926f60 12515 /* We have "%st(" then garbage. */
5f47d35b
AM
12516 return (const reg_entry *) NULL;
12517 }
12518 }
12519
8a6fb3f9 12520 return r && check_register (r) ? r : NULL;
252b5132 12521}
4d1bb795
JB
12522
12523/* REG_STRING starts *before* REGISTER_PREFIX. */
12524
12525static const reg_entry *
12526parse_register (char *reg_string, char **end_op)
12527{
12528 const reg_entry *r;
12529
12530 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
12531 r = parse_real_register (reg_string, end_op);
12532 else
12533 r = NULL;
12534 if (!r)
12535 {
12536 char *save = input_line_pointer;
12537 char c;
12538 symbolS *symbolP;
12539
12540 input_line_pointer = reg_string;
d02603dc 12541 c = get_symbol_name (&reg_string);
4d1bb795
JB
12542 symbolP = symbol_find (reg_string);
12543 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
12544 {
12545 const expressionS *e = symbol_get_value_expression (symbolP);
12546
0398aac5 12547 know (e->X_op == O_register);
4eed87de 12548 know (e->X_add_number >= 0
c3fe08fa 12549 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 12550 r = i386_regtab + e->X_add_number;
8a6fb3f9
JB
12551 if (!check_register (r))
12552 {
12553 as_bad (_("register '%s%s' cannot be used here"),
12554 register_prefix, r->reg_name);
12555 r = &bad_reg;
12556 }
4d1bb795
JB
12557 *end_op = input_line_pointer;
12558 }
12559 *input_line_pointer = c;
12560 input_line_pointer = save;
12561 }
12562 return r;
12563}
12564
12565int
12566i386_parse_name (char *name, expressionS *e, char *nextcharP)
12567{
12568 const reg_entry *r;
12569 char *end = input_line_pointer;
12570
12571 *end = *nextcharP;
12572 r = parse_register (name, &input_line_pointer);
12573 if (r && end <= input_line_pointer)
12574 {
12575 *nextcharP = *input_line_pointer;
12576 *input_line_pointer = 0;
8a6fb3f9
JB
12577 if (r != &bad_reg)
12578 {
12579 e->X_op = O_register;
12580 e->X_add_number = r - i386_regtab;
12581 }
12582 else
12583 e->X_op = O_illegal;
4d1bb795
JB
12584 return 1;
12585 }
12586 input_line_pointer = end;
12587 *end = 0;
ee86248c 12588 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
12589}
12590
12591void
12592md_operand (expressionS *e)
12593{
ee86248c
JB
12594 char *end;
12595 const reg_entry *r;
4d1bb795 12596
ee86248c
JB
12597 switch (*input_line_pointer)
12598 {
12599 case REGISTER_PREFIX:
12600 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
12601 if (r)
12602 {
12603 e->X_op = O_register;
12604 e->X_add_number = r - i386_regtab;
12605 input_line_pointer = end;
12606 }
ee86248c
JB
12607 break;
12608
12609 case '[':
9c2799c2 12610 gas_assert (intel_syntax);
ee86248c
JB
12611 end = input_line_pointer++;
12612 expression (e);
12613 if (*input_line_pointer == ']')
12614 {
12615 ++input_line_pointer;
12616 e->X_op_symbol = make_expr_symbol (e);
12617 e->X_add_symbol = NULL;
12618 e->X_add_number = 0;
12619 e->X_op = O_index;
12620 }
12621 else
12622 {
12623 e->X_op = O_absent;
12624 input_line_pointer = end;
12625 }
12626 break;
4d1bb795
JB
12627 }
12628}
12629
252b5132 12630\f
4cc782b5 12631#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 12632const char *md_shortopts = "kVQ:sqnO::";
252b5132 12633#else
b6f8c7c4 12634const char *md_shortopts = "qnO::";
252b5132 12635#endif
6e0b89ee 12636
3e73aa7c 12637#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
12638#define OPTION_64 (OPTION_MD_BASE + 1)
12639#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
12640#define OPTION_MARCH (OPTION_MD_BASE + 3)
12641#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
12642#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
12643#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
12644#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
12645#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 12646#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 12647#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 12648#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
12649#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
12650#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
12651#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 12652#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
12653#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
12654#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 12655#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 12656#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 12657#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 12658#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
12659#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
12660#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 12661#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 12662#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 12663#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
e379e5f3
L
12664#define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27)
12665#define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
12666#define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
76cf450b 12667#define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
ae531041
L
12668#define OPTION_MLFENCE_AFTER_LOAD (OPTION_MD_BASE + 31)
12669#define OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH (OPTION_MD_BASE + 32)
12670#define OPTION_MLFENCE_BEFORE_RET (OPTION_MD_BASE + 33)
b3b91714 12671
99ad8390
NC
12672struct option md_longopts[] =
12673{
3e73aa7c 12674 {"32", no_argument, NULL, OPTION_32},
321098a5 12675#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12676 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 12677 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
12678#endif
12679#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12680 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 12681 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 12682 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 12683#endif
b3b91714 12684 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
12685 {"march", required_argument, NULL, OPTION_MARCH},
12686 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
12687 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
12688 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
12689 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
12690 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 12691 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 12692 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 12693 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 12694 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 12695 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 12696 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
12697 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
12698 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
12699# if defined (TE_PE) || defined (TE_PEP)
12700 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
12701#endif
d1982f93 12702 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 12703 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 12704 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 12705 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
e379e5f3
L
12706 {"malign-branch-boundary", required_argument, NULL, OPTION_MALIGN_BRANCH_BOUNDARY},
12707 {"malign-branch-prefix-size", required_argument, NULL, OPTION_MALIGN_BRANCH_PREFIX_SIZE},
12708 {"malign-branch", required_argument, NULL, OPTION_MALIGN_BRANCH},
76cf450b 12709 {"mbranches-within-32B-boundaries", no_argument, NULL, OPTION_MBRANCHES_WITH_32B_BOUNDARIES},
ae531041
L
12710 {"mlfence-after-load", required_argument, NULL, OPTION_MLFENCE_AFTER_LOAD},
12711 {"mlfence-before-indirect-branch", required_argument, NULL,
12712 OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH},
12713 {"mlfence-before-ret", required_argument, NULL, OPTION_MLFENCE_BEFORE_RET},
5db04b09
L
12714 {"mamd64", no_argument, NULL, OPTION_MAMD64},
12715 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
12716 {NULL, no_argument, NULL, 0}
12717};
12718size_t md_longopts_size = sizeof (md_longopts);
12719
12720int
17b9d67d 12721md_parse_option (int c, const char *arg)
252b5132 12722{
91d6fa6a 12723 unsigned int j;
e379e5f3 12724 char *arch, *next, *saved, *type;
9103f4f4 12725
252b5132
RH
12726 switch (c)
12727 {
12b55ccc
L
12728 case 'n':
12729 optimize_align_code = 0;
12730 break;
12731
a38cf1db
AM
12732 case 'q':
12733 quiet_warnings = 1;
252b5132
RH
12734 break;
12735
12736#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
12737 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
12738 should be emitted or not. FIXME: Not implemented. */
12739 case 'Q':
d4693039
JB
12740 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
12741 return 0;
252b5132
RH
12742 break;
12743
12744 /* -V: SVR4 argument to print version ID. */
12745 case 'V':
12746 print_version_id ();
12747 break;
12748
a38cf1db
AM
12749 /* -k: Ignore for FreeBSD compatibility. */
12750 case 'k':
252b5132 12751 break;
4cc782b5
ILT
12752
12753 case 's':
12754 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 12755 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 12756 break;
8dcea932
L
12757
12758 case OPTION_MSHARED:
12759 shared = 1;
12760 break;
b4a3a7b4
L
12761
12762 case OPTION_X86_USED_NOTE:
12763 if (strcasecmp (arg, "yes") == 0)
12764 x86_used_note = 1;
12765 else if (strcasecmp (arg, "no") == 0)
12766 x86_used_note = 0;
12767 else
12768 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
12769 break;
12770
12771
99ad8390 12772#endif
321098a5 12773#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12774 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
12775 case OPTION_64:
12776 {
12777 const char **list, **l;
12778
3e73aa7c
JH
12779 list = bfd_target_list ();
12780 for (l = list; *l != NULL; l++)
8620418b 12781 if (CONST_STRNEQ (*l, "elf64-x86-64")
99ad8390
NC
12782 || strcmp (*l, "coff-x86-64") == 0
12783 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
12784 || strcmp (*l, "pei-x86-64") == 0
12785 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
12786 {
12787 default_arch = "x86_64";
12788 break;
12789 }
3e73aa7c 12790 if (*l == NULL)
2b5d6a91 12791 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
12792 free (list);
12793 }
12794 break;
12795#endif
252b5132 12796
351f65ca 12797#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12798 case OPTION_X32:
351f65ca
L
12799 if (IS_ELF)
12800 {
12801 const char **list, **l;
12802
12803 list = bfd_target_list ();
12804 for (l = list; *l != NULL; l++)
12805 if (CONST_STRNEQ (*l, "elf32-x86-64"))
12806 {
12807 default_arch = "x86_64:32";
12808 break;
12809 }
12810 if (*l == NULL)
2b5d6a91 12811 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
12812 free (list);
12813 }
12814 else
12815 as_fatal (_("32bit x86_64 is only supported for ELF"));
12816 break;
12817#endif
12818
6e0b89ee
AM
12819 case OPTION_32:
12820 default_arch = "i386";
12821 break;
12822
b3b91714
AM
12823 case OPTION_DIVIDE:
12824#ifdef SVR4_COMMENT_CHARS
12825 {
12826 char *n, *t;
12827 const char *s;
12828
add39d23 12829 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
12830 t = n;
12831 for (s = i386_comment_chars; *s != '\0'; s++)
12832 if (*s != '/')
12833 *t++ = *s;
12834 *t = '\0';
12835 i386_comment_chars = n;
12836 }
12837#endif
12838 break;
12839
9103f4f4 12840 case OPTION_MARCH:
293f5f65
L
12841 saved = xstrdup (arg);
12842 arch = saved;
12843 /* Allow -march=+nosse. */
12844 if (*arch == '+')
12845 arch++;
6305a203 12846 do
9103f4f4 12847 {
6305a203 12848 if (*arch == '.')
2b5d6a91 12849 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
12850 next = strchr (arch, '+');
12851 if (next)
12852 *next++ = '\0';
91d6fa6a 12853 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 12854 {
91d6fa6a 12855 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 12856 {
6305a203 12857 /* Processor. */
1ded5609
JB
12858 if (! cpu_arch[j].flags.bitfield.cpui386)
12859 continue;
12860
91d6fa6a 12861 cpu_arch_name = cpu_arch[j].name;
6305a203 12862 cpu_sub_arch_name = NULL;
91d6fa6a
NC
12863 cpu_arch_flags = cpu_arch[j].flags;
12864 cpu_arch_isa = cpu_arch[j].type;
12865 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
12866 if (!cpu_arch_tune_set)
12867 {
12868 cpu_arch_tune = cpu_arch_isa;
12869 cpu_arch_tune_flags = cpu_arch_isa_flags;
12870 }
12871 break;
12872 }
91d6fa6a
NC
12873 else if (*cpu_arch [j].name == '.'
12874 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 12875 {
33eaf5de 12876 /* ISA extension. */
6305a203 12877 i386_cpu_flags flags;
309d3373 12878
293f5f65
L
12879 flags = cpu_flags_or (cpu_arch_flags,
12880 cpu_arch[j].flags);
81486035 12881
5b64d091 12882 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
12883 {
12884 if (cpu_sub_arch_name)
12885 {
12886 char *name = cpu_sub_arch_name;
12887 cpu_sub_arch_name = concat (name,
91d6fa6a 12888 cpu_arch[j].name,
1bf57e9f 12889 (const char *) NULL);
6305a203
L
12890 free (name);
12891 }
12892 else
91d6fa6a 12893 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 12894 cpu_arch_flags = flags;
a586129e 12895 cpu_arch_isa_flags = flags;
6305a203 12896 }
0089dace
L
12897 else
12898 cpu_arch_isa_flags
12899 = cpu_flags_or (cpu_arch_isa_flags,
12900 cpu_arch[j].flags);
6305a203 12901 break;
ccc9c027 12902 }
9103f4f4 12903 }
6305a203 12904
293f5f65
L
12905 if (j >= ARRAY_SIZE (cpu_arch))
12906 {
33eaf5de 12907 /* Disable an ISA extension. */
293f5f65
L
12908 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
12909 if (strcmp (arch, cpu_noarch [j].name) == 0)
12910 {
12911 i386_cpu_flags flags;
12912
12913 flags = cpu_flags_and_not (cpu_arch_flags,
12914 cpu_noarch[j].flags);
12915 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
12916 {
12917 if (cpu_sub_arch_name)
12918 {
12919 char *name = cpu_sub_arch_name;
12920 cpu_sub_arch_name = concat (arch,
12921 (const char *) NULL);
12922 free (name);
12923 }
12924 else
12925 cpu_sub_arch_name = xstrdup (arch);
12926 cpu_arch_flags = flags;
12927 cpu_arch_isa_flags = flags;
12928 }
12929 break;
12930 }
12931
12932 if (j >= ARRAY_SIZE (cpu_noarch))
12933 j = ARRAY_SIZE (cpu_arch);
12934 }
12935
91d6fa6a 12936 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 12937 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
12938
12939 arch = next;
9103f4f4 12940 }
293f5f65
L
12941 while (next != NULL);
12942 free (saved);
9103f4f4
L
12943 break;
12944
12945 case OPTION_MTUNE:
12946 if (*arg == '.')
2b5d6a91 12947 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 12948 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 12949 {
91d6fa6a 12950 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 12951 {
ccc9c027 12952 cpu_arch_tune_set = 1;
91d6fa6a
NC
12953 cpu_arch_tune = cpu_arch [j].type;
12954 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
12955 break;
12956 }
12957 }
91d6fa6a 12958 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 12959 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
12960 break;
12961
1efbbeb4
L
12962 case OPTION_MMNEMONIC:
12963 if (strcasecmp (arg, "att") == 0)
12964 intel_mnemonic = 0;
12965 else if (strcasecmp (arg, "intel") == 0)
12966 intel_mnemonic = 1;
12967 else
2b5d6a91 12968 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
12969 break;
12970
12971 case OPTION_MSYNTAX:
12972 if (strcasecmp (arg, "att") == 0)
12973 intel_syntax = 0;
12974 else if (strcasecmp (arg, "intel") == 0)
12975 intel_syntax = 1;
12976 else
2b5d6a91 12977 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
12978 break;
12979
12980 case OPTION_MINDEX_REG:
12981 allow_index_reg = 1;
12982 break;
12983
12984 case OPTION_MNAKED_REG:
12985 allow_naked_reg = 1;
12986 break;
12987
c0f3af97
L
12988 case OPTION_MSSE2AVX:
12989 sse2avx = 1;
12990 break;
12991
daf50ae7
L
12992 case OPTION_MSSE_CHECK:
12993 if (strcasecmp (arg, "error") == 0)
7bab8ab5 12994 sse_check = check_error;
daf50ae7 12995 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 12996 sse_check = check_warning;
daf50ae7 12997 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 12998 sse_check = check_none;
daf50ae7 12999 else
2b5d6a91 13000 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
13001 break;
13002
7bab8ab5
JB
13003 case OPTION_MOPERAND_CHECK:
13004 if (strcasecmp (arg, "error") == 0)
13005 operand_check = check_error;
13006 else if (strcasecmp (arg, "warning") == 0)
13007 operand_check = check_warning;
13008 else if (strcasecmp (arg, "none") == 0)
13009 operand_check = check_none;
13010 else
13011 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
13012 break;
13013
539f890d
L
13014 case OPTION_MAVXSCALAR:
13015 if (strcasecmp (arg, "128") == 0)
13016 avxscalar = vex128;
13017 else if (strcasecmp (arg, "256") == 0)
13018 avxscalar = vex256;
13019 else
2b5d6a91 13020 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
13021 break;
13022
03751133
L
13023 case OPTION_MVEXWIG:
13024 if (strcmp (arg, "0") == 0)
40c9c8de 13025 vexwig = vexw0;
03751133 13026 else if (strcmp (arg, "1") == 0)
40c9c8de 13027 vexwig = vexw1;
03751133
L
13028 else
13029 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
13030 break;
13031
7e8b059b
L
13032 case OPTION_MADD_BND_PREFIX:
13033 add_bnd_prefix = 1;
13034 break;
13035
43234a1e
L
13036 case OPTION_MEVEXLIG:
13037 if (strcmp (arg, "128") == 0)
13038 evexlig = evexl128;
13039 else if (strcmp (arg, "256") == 0)
13040 evexlig = evexl256;
13041 else if (strcmp (arg, "512") == 0)
13042 evexlig = evexl512;
13043 else
13044 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
13045 break;
13046
d3d3c6db
IT
13047 case OPTION_MEVEXRCIG:
13048 if (strcmp (arg, "rne") == 0)
13049 evexrcig = rne;
13050 else if (strcmp (arg, "rd") == 0)
13051 evexrcig = rd;
13052 else if (strcmp (arg, "ru") == 0)
13053 evexrcig = ru;
13054 else if (strcmp (arg, "rz") == 0)
13055 evexrcig = rz;
13056 else
13057 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
13058 break;
13059
43234a1e
L
13060 case OPTION_MEVEXWIG:
13061 if (strcmp (arg, "0") == 0)
13062 evexwig = evexw0;
13063 else if (strcmp (arg, "1") == 0)
13064 evexwig = evexw1;
13065 else
13066 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
13067 break;
13068
167ad85b
TG
13069# if defined (TE_PE) || defined (TE_PEP)
13070 case OPTION_MBIG_OBJ:
13071 use_big_obj = 1;
13072 break;
13073#endif
13074
d1982f93 13075 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
13076 if (strcasecmp (arg, "yes") == 0)
13077 omit_lock_prefix = 1;
13078 else if (strcasecmp (arg, "no") == 0)
13079 omit_lock_prefix = 0;
13080 else
13081 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
13082 break;
13083
e4e00185
AS
13084 case OPTION_MFENCE_AS_LOCK_ADD:
13085 if (strcasecmp (arg, "yes") == 0)
13086 avoid_fence = 1;
13087 else if (strcasecmp (arg, "no") == 0)
13088 avoid_fence = 0;
13089 else
13090 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
13091 break;
13092
ae531041
L
13093 case OPTION_MLFENCE_AFTER_LOAD:
13094 if (strcasecmp (arg, "yes") == 0)
13095 lfence_after_load = 1;
13096 else if (strcasecmp (arg, "no") == 0)
13097 lfence_after_load = 0;
13098 else
13099 as_fatal (_("invalid -mlfence-after-load= option: `%s'"), arg);
13100 break;
13101
13102 case OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH:
13103 if (strcasecmp (arg, "all") == 0)
a09f656b 13104 {
13105 lfence_before_indirect_branch = lfence_branch_all;
13106 if (lfence_before_ret == lfence_before_ret_none)
13107 lfence_before_ret = lfence_before_ret_shl;
13108 }
ae531041
L
13109 else if (strcasecmp (arg, "memory") == 0)
13110 lfence_before_indirect_branch = lfence_branch_memory;
13111 else if (strcasecmp (arg, "register") == 0)
13112 lfence_before_indirect_branch = lfence_branch_register;
13113 else if (strcasecmp (arg, "none") == 0)
13114 lfence_before_indirect_branch = lfence_branch_none;
13115 else
13116 as_fatal (_("invalid -mlfence-before-indirect-branch= option: `%s'"),
13117 arg);
13118 break;
13119
13120 case OPTION_MLFENCE_BEFORE_RET:
13121 if (strcasecmp (arg, "or") == 0)
13122 lfence_before_ret = lfence_before_ret_or;
13123 else if (strcasecmp (arg, "not") == 0)
13124 lfence_before_ret = lfence_before_ret_not;
a09f656b 13125 else if (strcasecmp (arg, "shl") == 0 || strcasecmp (arg, "yes") == 0)
13126 lfence_before_ret = lfence_before_ret_shl;
ae531041
L
13127 else if (strcasecmp (arg, "none") == 0)
13128 lfence_before_ret = lfence_before_ret_none;
13129 else
13130 as_fatal (_("invalid -mlfence-before-ret= option: `%s'"),
13131 arg);
13132 break;
13133
0cb4071e
L
13134 case OPTION_MRELAX_RELOCATIONS:
13135 if (strcasecmp (arg, "yes") == 0)
13136 generate_relax_relocations = 1;
13137 else if (strcasecmp (arg, "no") == 0)
13138 generate_relax_relocations = 0;
13139 else
13140 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
13141 break;
13142
e379e5f3
L
13143 case OPTION_MALIGN_BRANCH_BOUNDARY:
13144 {
13145 char *end;
13146 long int align = strtoul (arg, &end, 0);
13147 if (*end == '\0')
13148 {
13149 if (align == 0)
13150 {
13151 align_branch_power = 0;
13152 break;
13153 }
13154 else if (align >= 16)
13155 {
13156 int align_power;
13157 for (align_power = 0;
13158 (align & 1) == 0;
13159 align >>= 1, align_power++)
13160 continue;
13161 /* Limit alignment power to 31. */
13162 if (align == 1 && align_power < 32)
13163 {
13164 align_branch_power = align_power;
13165 break;
13166 }
13167 }
13168 }
13169 as_fatal (_("invalid -malign-branch-boundary= value: %s"), arg);
13170 }
13171 break;
13172
13173 case OPTION_MALIGN_BRANCH_PREFIX_SIZE:
13174 {
13175 char *end;
13176 int align = strtoul (arg, &end, 0);
13177 /* Some processors only support 5 prefixes. */
13178 if (*end == '\0' && align >= 0 && align < 6)
13179 {
13180 align_branch_prefix_size = align;
13181 break;
13182 }
13183 as_fatal (_("invalid -malign-branch-prefix-size= value: %s"),
13184 arg);
13185 }
13186 break;
13187
13188 case OPTION_MALIGN_BRANCH:
13189 align_branch = 0;
13190 saved = xstrdup (arg);
13191 type = saved;
13192 do
13193 {
13194 next = strchr (type, '+');
13195 if (next)
13196 *next++ = '\0';
13197 if (strcasecmp (type, "jcc") == 0)
13198 align_branch |= align_branch_jcc_bit;
13199 else if (strcasecmp (type, "fused") == 0)
13200 align_branch |= align_branch_fused_bit;
13201 else if (strcasecmp (type, "jmp") == 0)
13202 align_branch |= align_branch_jmp_bit;
13203 else if (strcasecmp (type, "call") == 0)
13204 align_branch |= align_branch_call_bit;
13205 else if (strcasecmp (type, "ret") == 0)
13206 align_branch |= align_branch_ret_bit;
13207 else if (strcasecmp (type, "indirect") == 0)
13208 align_branch |= align_branch_indirect_bit;
13209 else
13210 as_fatal (_("invalid -malign-branch= option: `%s'"), arg);
13211 type = next;
13212 }
13213 while (next != NULL);
13214 free (saved);
13215 break;
13216
76cf450b
L
13217 case OPTION_MBRANCHES_WITH_32B_BOUNDARIES:
13218 align_branch_power = 5;
13219 align_branch_prefix_size = 5;
13220 align_branch = (align_branch_jcc_bit
13221 | align_branch_fused_bit
13222 | align_branch_jmp_bit);
13223 break;
13224
5db04b09 13225 case OPTION_MAMD64:
4b5aaf5f 13226 isa64 = amd64;
5db04b09
L
13227 break;
13228
13229 case OPTION_MINTEL64:
4b5aaf5f 13230 isa64 = intel64;
5db04b09
L
13231 break;
13232
b6f8c7c4
L
13233 case 'O':
13234 if (arg == NULL)
13235 {
13236 optimize = 1;
13237 /* Turn off -Os. */
13238 optimize_for_space = 0;
13239 }
13240 else if (*arg == 's')
13241 {
13242 optimize_for_space = 1;
13243 /* Turn on all encoding optimizations. */
41fd2579 13244 optimize = INT_MAX;
b6f8c7c4
L
13245 }
13246 else
13247 {
13248 optimize = atoi (arg);
13249 /* Turn off -Os. */
13250 optimize_for_space = 0;
13251 }
13252 break;
13253
252b5132
RH
13254 default:
13255 return 0;
13256 }
13257 return 1;
13258}
13259
8a2c8fef
L
13260#define MESSAGE_TEMPLATE \
13261" "
13262
293f5f65
L
13263static char *
13264output_message (FILE *stream, char *p, char *message, char *start,
13265 int *left_p, const char *name, int len)
13266{
13267 int size = sizeof (MESSAGE_TEMPLATE);
13268 int left = *left_p;
13269
13270 /* Reserve 2 spaces for ", " or ",\0" */
13271 left -= len + 2;
13272
13273 /* Check if there is any room. */
13274 if (left >= 0)
13275 {
13276 if (p != start)
13277 {
13278 *p++ = ',';
13279 *p++ = ' ';
13280 }
13281 p = mempcpy (p, name, len);
13282 }
13283 else
13284 {
13285 /* Output the current message now and start a new one. */
13286 *p++ = ',';
13287 *p = '\0';
13288 fprintf (stream, "%s\n", message);
13289 p = start;
13290 left = size - (start - message) - len - 2;
13291
13292 gas_assert (left >= 0);
13293
13294 p = mempcpy (p, name, len);
13295 }
13296
13297 *left_p = left;
13298 return p;
13299}
13300
8a2c8fef 13301static void
1ded5609 13302show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
13303{
13304 static char message[] = MESSAGE_TEMPLATE;
13305 char *start = message + 27;
13306 char *p;
13307 int size = sizeof (MESSAGE_TEMPLATE);
13308 int left;
13309 const char *name;
13310 int len;
13311 unsigned int j;
13312
13313 p = start;
13314 left = size - (start - message);
13315 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
13316 {
13317 /* Should it be skipped? */
13318 if (cpu_arch [j].skip)
13319 continue;
13320
13321 name = cpu_arch [j].name;
13322 len = cpu_arch [j].len;
13323 if (*name == '.')
13324 {
13325 /* It is an extension. Skip if we aren't asked to show it. */
13326 if (ext)
13327 {
13328 name++;
13329 len--;
13330 }
13331 else
13332 continue;
13333 }
13334 else if (ext)
13335 {
13336 /* It is an processor. Skip if we show only extension. */
13337 continue;
13338 }
1ded5609
JB
13339 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
13340 {
13341 /* It is an impossible processor - skip. */
13342 continue;
13343 }
8a2c8fef 13344
293f5f65 13345 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
13346 }
13347
293f5f65
L
13348 /* Display disabled extensions. */
13349 if (ext)
13350 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13351 {
13352 name = cpu_noarch [j].name;
13353 len = cpu_noarch [j].len;
13354 p = output_message (stream, p, message, start, &left, name,
13355 len);
13356 }
13357
8a2c8fef
L
13358 *p = '\0';
13359 fprintf (stream, "%s\n", message);
13360}
13361
252b5132 13362void
8a2c8fef 13363md_show_usage (FILE *stream)
252b5132 13364{
4cc782b5
ILT
13365#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13366 fprintf (stream, _("\
d4693039 13367 -Qy, -Qn ignored\n\
a38cf1db 13368 -V print assembler version number\n\
b3b91714
AM
13369 -k ignored\n"));
13370#endif
13371 fprintf (stream, _("\
12b55ccc 13372 -n Do not optimize code alignment\n\
b3b91714
AM
13373 -q quieten some warnings\n"));
13374#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13375 fprintf (stream, _("\
a38cf1db 13376 -s ignored\n"));
b3b91714 13377#endif
d7f449c0
L
13378#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
13379 || defined (TE_PE) || defined (TE_PEP))
751d281c 13380 fprintf (stream, _("\
570561f7 13381 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 13382#endif
b3b91714
AM
13383#ifdef SVR4_COMMENT_CHARS
13384 fprintf (stream, _("\
13385 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
13386#else
13387 fprintf (stream, _("\
b3b91714 13388 --divide ignored\n"));
4cc782b5 13389#endif
9103f4f4 13390 fprintf (stream, _("\
6305a203 13391 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 13392 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 13393 show_arch (stream, 0, 1);
8a2c8fef
L
13394 fprintf (stream, _("\
13395 EXTENSION is combination of:\n"));
1ded5609 13396 show_arch (stream, 1, 0);
6305a203 13397 fprintf (stream, _("\
8a2c8fef 13398 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 13399 show_arch (stream, 0, 0);
ba104c83 13400 fprintf (stream, _("\
c0f3af97
L
13401 -msse2avx encode SSE instructions with VEX prefix\n"));
13402 fprintf (stream, _("\
7c5c05ef 13403 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
13404 check SSE instructions\n"));
13405 fprintf (stream, _("\
7c5c05ef 13406 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
13407 check operand combinations for validity\n"));
13408 fprintf (stream, _("\
7c5c05ef
L
13409 -mavxscalar=[128|256] (default: 128)\n\
13410 encode scalar AVX instructions with specific vector\n\
539f890d
L
13411 length\n"));
13412 fprintf (stream, _("\
03751133
L
13413 -mvexwig=[0|1] (default: 0)\n\
13414 encode VEX instructions with specific VEX.W value\n\
13415 for VEX.W bit ignored instructions\n"));
13416 fprintf (stream, _("\
7c5c05ef
L
13417 -mevexlig=[128|256|512] (default: 128)\n\
13418 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
13419 length\n"));
13420 fprintf (stream, _("\
7c5c05ef
L
13421 -mevexwig=[0|1] (default: 0)\n\
13422 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
13423 for EVEX.W bit ignored instructions\n"));
13424 fprintf (stream, _("\
7c5c05ef 13425 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
13426 encode EVEX instructions with specific EVEX.RC value\n\
13427 for SAE-only ignored instructions\n"));
13428 fprintf (stream, _("\
7c5c05ef
L
13429 -mmnemonic=[att|intel] "));
13430 if (SYSV386_COMPAT)
13431 fprintf (stream, _("(default: att)\n"));
13432 else
13433 fprintf (stream, _("(default: intel)\n"));
13434 fprintf (stream, _("\
13435 use AT&T/Intel mnemonic\n"));
ba104c83 13436 fprintf (stream, _("\
7c5c05ef
L
13437 -msyntax=[att|intel] (default: att)\n\
13438 use AT&T/Intel syntax\n"));
ba104c83
L
13439 fprintf (stream, _("\
13440 -mindex-reg support pseudo index registers\n"));
13441 fprintf (stream, _("\
13442 -mnaked-reg don't require `%%' prefix for registers\n"));
13443 fprintf (stream, _("\
7e8b059b 13444 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 13445#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
13446 fprintf (stream, _("\
13447 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
13448 fprintf (stream, _("\
13449 -mx86-used-note=[no|yes] "));
13450 if (DEFAULT_X86_USED_NOTE)
13451 fprintf (stream, _("(default: yes)\n"));
13452 else
13453 fprintf (stream, _("(default: no)\n"));
13454 fprintf (stream, _("\
13455 generate x86 used ISA and feature properties\n"));
13456#endif
13457#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
13458 fprintf (stream, _("\
13459 -mbig-obj generate big object files\n"));
13460#endif
d022bddd 13461 fprintf (stream, _("\
7c5c05ef 13462 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 13463 strip all lock prefixes\n"));
5db04b09 13464 fprintf (stream, _("\
7c5c05ef 13465 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
13466 encode lfence, mfence and sfence as\n\
13467 lock addl $0x0, (%%{re}sp)\n"));
13468 fprintf (stream, _("\
7c5c05ef
L
13469 -mrelax-relocations=[no|yes] "));
13470 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
13471 fprintf (stream, _("(default: yes)\n"));
13472 else
13473 fprintf (stream, _("(default: no)\n"));
13474 fprintf (stream, _("\
0cb4071e
L
13475 generate relax relocations\n"));
13476 fprintf (stream, _("\
e379e5f3
L
13477 -malign-branch-boundary=NUM (default: 0)\n\
13478 align branches within NUM byte boundary\n"));
13479 fprintf (stream, _("\
13480 -malign-branch=TYPE[+TYPE...] (default: jcc+fused+jmp)\n\
13481 TYPE is combination of jcc, fused, jmp, call, ret,\n\
13482 indirect\n\
13483 specify types of branches to align\n"));
13484 fprintf (stream, _("\
13485 -malign-branch-prefix-size=NUM (default: 5)\n\
13486 align branches with NUM prefixes per instruction\n"));
13487 fprintf (stream, _("\
76cf450b
L
13488 -mbranches-within-32B-boundaries\n\
13489 align branches within 32 byte boundary\n"));
13490 fprintf (stream, _("\
ae531041
L
13491 -mlfence-after-load=[no|yes] (default: no)\n\
13492 generate lfence after load\n"));
13493 fprintf (stream, _("\
13494 -mlfence-before-indirect-branch=[none|all|register|memory] (default: none)\n\
13495 generate lfence before indirect near branch\n"));
13496 fprintf (stream, _("\
a09f656b 13497 -mlfence-before-ret=[none|or|not|shl|yes] (default: none)\n\
ae531041
L
13498 generate lfence before ret\n"));
13499 fprintf (stream, _("\
7c5c05ef 13500 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
13501 fprintf (stream, _("\
13502 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
13503}
13504
3e73aa7c 13505#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 13506 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 13507 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
13508
13509/* Pick the target format to use. */
13510
47926f60 13511const char *
e3bb37b5 13512i386_target_format (void)
252b5132 13513{
351f65ca
L
13514 if (!strncmp (default_arch, "x86_64", 6))
13515 {
13516 update_code_flag (CODE_64BIT, 1);
13517 if (default_arch[6] == '\0')
7f56bc95 13518 x86_elf_abi = X86_64_ABI;
351f65ca 13519 else
7f56bc95 13520 x86_elf_abi = X86_64_X32_ABI;
351f65ca 13521 }
3e73aa7c 13522 else if (!strcmp (default_arch, "i386"))
78f12dd3 13523 update_code_flag (CODE_32BIT, 1);
5197d474
L
13524 else if (!strcmp (default_arch, "iamcu"))
13525 {
13526 update_code_flag (CODE_32BIT, 1);
13527 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
13528 {
13529 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
13530 cpu_arch_name = "iamcu";
13531 cpu_sub_arch_name = NULL;
13532 cpu_arch_flags = iamcu_flags;
13533 cpu_arch_isa = PROCESSOR_IAMCU;
13534 cpu_arch_isa_flags = iamcu_flags;
13535 if (!cpu_arch_tune_set)
13536 {
13537 cpu_arch_tune = cpu_arch_isa;
13538 cpu_arch_tune_flags = cpu_arch_isa_flags;
13539 }
13540 }
8d471ec1 13541 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
13542 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
13543 cpu_arch_name);
13544 }
3e73aa7c 13545 else
2b5d6a91 13546 as_fatal (_("unknown architecture"));
89507696
JB
13547
13548 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
13549 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13550 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
13551 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13552
252b5132
RH
13553 switch (OUTPUT_FLAVOR)
13554 {
9384f2ff 13555#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 13556 case bfd_target_aout_flavour:
47926f60 13557 return AOUT_TARGET_FORMAT;
4c63da97 13558#endif
9384f2ff
AM
13559#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
13560# if defined (TE_PE) || defined (TE_PEP)
13561 case bfd_target_coff_flavour:
167ad85b
TG
13562 if (flag_code == CODE_64BIT)
13563 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
13564 else
251dae91 13565 return use_big_obj ? "pe-bigobj-i386" : "pe-i386";
9384f2ff 13566# elif defined (TE_GO32)
0561d57c
JK
13567 case bfd_target_coff_flavour:
13568 return "coff-go32";
9384f2ff 13569# else
252b5132
RH
13570 case bfd_target_coff_flavour:
13571 return "coff-i386";
9384f2ff 13572# endif
4c63da97 13573#endif
3e73aa7c 13574#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 13575 case bfd_target_elf_flavour:
3e73aa7c 13576 {
351f65ca
L
13577 const char *format;
13578
13579 switch (x86_elf_abi)
4fa24527 13580 {
351f65ca
L
13581 default:
13582 format = ELF_TARGET_FORMAT;
e379e5f3
L
13583#ifndef TE_SOLARIS
13584 tls_get_addr = "___tls_get_addr";
13585#endif
351f65ca 13586 break;
7f56bc95 13587 case X86_64_ABI:
351f65ca 13588 use_rela_relocations = 1;
4fa24527 13589 object_64bit = 1;
e379e5f3
L
13590#ifndef TE_SOLARIS
13591 tls_get_addr = "__tls_get_addr";
13592#endif
351f65ca
L
13593 format = ELF_TARGET_FORMAT64;
13594 break;
7f56bc95 13595 case X86_64_X32_ABI:
4fa24527 13596 use_rela_relocations = 1;
351f65ca 13597 object_64bit = 1;
e379e5f3
L
13598#ifndef TE_SOLARIS
13599 tls_get_addr = "__tls_get_addr";
13600#endif
862be3fb 13601 disallow_64bit_reloc = 1;
351f65ca
L
13602 format = ELF_TARGET_FORMAT32;
13603 break;
4fa24527 13604 }
3632d14b 13605 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 13606 {
7f56bc95 13607 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
13608 as_fatal (_("Intel L1OM is 64bit only"));
13609 return ELF_TARGET_L1OM_FORMAT;
13610 }
b49f93f6 13611 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
13612 {
13613 if (x86_elf_abi != X86_64_ABI)
13614 as_fatal (_("Intel K1OM is 64bit only"));
13615 return ELF_TARGET_K1OM_FORMAT;
13616 }
81486035
L
13617 else if (cpu_arch_isa == PROCESSOR_IAMCU)
13618 {
13619 if (x86_elf_abi != I386_ABI)
13620 as_fatal (_("Intel MCU is 32bit only"));
13621 return ELF_TARGET_IAMCU_FORMAT;
13622 }
8a9036a4 13623 else
351f65ca 13624 return format;
3e73aa7c 13625 }
e57f8c65
TG
13626#endif
13627#if defined (OBJ_MACH_O)
13628 case bfd_target_mach_o_flavour:
d382c579
TG
13629 if (flag_code == CODE_64BIT)
13630 {
13631 use_rela_relocations = 1;
13632 object_64bit = 1;
13633 return "mach-o-x86-64";
13634 }
13635 else
13636 return "mach-o-i386";
4c63da97 13637#endif
252b5132
RH
13638 default:
13639 abort ();
13640 return NULL;
13641 }
13642}
13643
47926f60 13644#endif /* OBJ_MAYBE_ more than one */
252b5132 13645\f
252b5132 13646symbolS *
7016a5d5 13647md_undefined_symbol (char *name)
252b5132 13648{
18dc2407
ILT
13649 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
13650 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
13651 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
13652 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
13653 {
13654 if (!GOT_symbol)
13655 {
13656 if (symbol_find (name))
13657 as_bad (_("GOT already in symbol table"));
13658 GOT_symbol = symbol_new (name, undefined_section,
13659 (valueT) 0, &zero_address_frag);
13660 };
13661 return GOT_symbol;
13662 }
252b5132
RH
13663 return 0;
13664}
13665
13666/* Round up a section size to the appropriate boundary. */
47926f60 13667
252b5132 13668valueT
7016a5d5 13669md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 13670{
4c63da97
AM
13671#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
13672 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
13673 {
13674 /* For a.out, force the section size to be aligned. If we don't do
13675 this, BFD will align it for us, but it will not write out the
13676 final bytes of the section. This may be a bug in BFD, but it is
13677 easier to fix it here since that is how the other a.out targets
13678 work. */
13679 int align;
13680
fd361982 13681 align = bfd_section_alignment (segment);
8d3842cd 13682 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 13683 }
252b5132
RH
13684#endif
13685
13686 return size;
13687}
13688
13689/* On the i386, PC-relative offsets are relative to the start of the
13690 next instruction. That is, the address of the offset, plus its
13691 size, since the offset is always the last part of the insn. */
13692
13693long
e3bb37b5 13694md_pcrel_from (fixS *fixP)
252b5132
RH
13695{
13696 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
13697}
13698
13699#ifndef I386COFF
13700
13701static void
e3bb37b5 13702s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 13703{
29b0f896 13704 int temp;
252b5132 13705
8a75718c
JB
13706#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13707 if (IS_ELF)
13708 obj_elf_section_change_hook ();
13709#endif
252b5132
RH
13710 temp = get_absolute_expression ();
13711 subseg_set (bss_section, (subsegT) temp);
13712 demand_empty_rest_of_line ();
13713}
13714
13715#endif
13716
e379e5f3
L
13717/* Remember constant directive. */
13718
13719void
13720i386_cons_align (int ignore ATTRIBUTE_UNUSED)
13721{
13722 if (last_insn.kind != last_insn_directive
13723 && (bfd_section_flags (now_seg) & SEC_CODE))
13724 {
13725 last_insn.seg = now_seg;
13726 last_insn.kind = last_insn_directive;
13727 last_insn.name = "constant directive";
13728 last_insn.file = as_where (&last_insn.line);
ae531041
L
13729 if (lfence_before_ret != lfence_before_ret_none)
13730 {
13731 if (lfence_before_indirect_branch != lfence_branch_none)
13732 as_warn (_("constant directive skips -mlfence-before-ret "
13733 "and -mlfence-before-indirect-branch"));
13734 else
13735 as_warn (_("constant directive skips -mlfence-before-ret"));
13736 }
13737 else if (lfence_before_indirect_branch != lfence_branch_none)
13738 as_warn (_("constant directive skips -mlfence-before-indirect-branch"));
e379e5f3
L
13739 }
13740}
13741
252b5132 13742void
e3bb37b5 13743i386_validate_fix (fixS *fixp)
252b5132 13744{
02a86693 13745 if (fixp->fx_subsy)
252b5132 13746 {
02a86693 13747 if (fixp->fx_subsy == GOT_symbol)
23df1078 13748 {
02a86693
L
13749 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
13750 {
13751 if (!object_64bit)
13752 abort ();
13753#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13754 if (fixp->fx_tcbit2)
56ceb5b5
L
13755 fixp->fx_r_type = (fixp->fx_tcbit
13756 ? BFD_RELOC_X86_64_REX_GOTPCRELX
13757 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
13758 else
13759#endif
13760 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
13761 }
d6ab8113 13762 else
02a86693
L
13763 {
13764 if (!object_64bit)
13765 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
13766 else
13767 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
13768 }
13769 fixp->fx_subsy = 0;
23df1078 13770 }
252b5132 13771 }
02a86693
L
13772#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13773 else if (!object_64bit)
13774 {
13775 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
13776 && fixp->fx_tcbit2)
13777 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
13778 }
13779#endif
252b5132
RH
13780}
13781
252b5132 13782arelent *
7016a5d5 13783tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
13784{
13785 arelent *rel;
13786 bfd_reloc_code_real_type code;
13787
13788 switch (fixp->fx_r_type)
13789 {
8ce3d284 13790#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
13791 case BFD_RELOC_SIZE32:
13792 case BFD_RELOC_SIZE64:
13793 if (S_IS_DEFINED (fixp->fx_addsy)
13794 && !S_IS_EXTERNAL (fixp->fx_addsy))
13795 {
13796 /* Resolve size relocation against local symbol to size of
13797 the symbol plus addend. */
13798 valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
13799 if (fixp->fx_r_type == BFD_RELOC_SIZE32
13800 && !fits_in_unsigned_long (value))
13801 as_bad_where (fixp->fx_file, fixp->fx_line,
13802 _("symbol size computation overflow"));
13803 fixp->fx_addsy = NULL;
13804 fixp->fx_subsy = NULL;
13805 md_apply_fix (fixp, (valueT *) &value, NULL);
13806 return NULL;
13807 }
8ce3d284 13808#endif
1a0670f3 13809 /* Fall through. */
8fd4256d 13810
3e73aa7c
JH
13811 case BFD_RELOC_X86_64_PLT32:
13812 case BFD_RELOC_X86_64_GOT32:
13813 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
13814 case BFD_RELOC_X86_64_GOTPCRELX:
13815 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
13816 case BFD_RELOC_386_PLT32:
13817 case BFD_RELOC_386_GOT32:
02a86693 13818 case BFD_RELOC_386_GOT32X:
252b5132
RH
13819 case BFD_RELOC_386_GOTOFF:
13820 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
13821 case BFD_RELOC_386_TLS_GD:
13822 case BFD_RELOC_386_TLS_LDM:
13823 case BFD_RELOC_386_TLS_LDO_32:
13824 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
13825 case BFD_RELOC_386_TLS_IE:
13826 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
13827 case BFD_RELOC_386_TLS_LE_32:
13828 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
13829 case BFD_RELOC_386_TLS_GOTDESC:
13830 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
13831 case BFD_RELOC_X86_64_TLSGD:
13832 case BFD_RELOC_X86_64_TLSLD:
13833 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 13834 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
13835 case BFD_RELOC_X86_64_GOTTPOFF:
13836 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
13837 case BFD_RELOC_X86_64_TPOFF64:
13838 case BFD_RELOC_X86_64_GOTOFF64:
13839 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
13840 case BFD_RELOC_X86_64_GOT64:
13841 case BFD_RELOC_X86_64_GOTPCREL64:
13842 case BFD_RELOC_X86_64_GOTPC64:
13843 case BFD_RELOC_X86_64_GOTPLT64:
13844 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
13845 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
13846 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
13847 case BFD_RELOC_RVA:
13848 case BFD_RELOC_VTABLE_ENTRY:
13849 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
13850#ifdef TE_PE
13851 case BFD_RELOC_32_SECREL:
13852#endif
252b5132
RH
13853 code = fixp->fx_r_type;
13854 break;
dbbaec26
L
13855 case BFD_RELOC_X86_64_32S:
13856 if (!fixp->fx_pcrel)
13857 {
13858 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
13859 code = fixp->fx_r_type;
13860 break;
13861 }
1a0670f3 13862 /* Fall through. */
252b5132 13863 default:
93382f6d 13864 if (fixp->fx_pcrel)
252b5132 13865 {
93382f6d
AM
13866 switch (fixp->fx_size)
13867 {
13868 default:
b091f402
AM
13869 as_bad_where (fixp->fx_file, fixp->fx_line,
13870 _("can not do %d byte pc-relative relocation"),
13871 fixp->fx_size);
93382f6d
AM
13872 code = BFD_RELOC_32_PCREL;
13873 break;
13874 case 1: code = BFD_RELOC_8_PCREL; break;
13875 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 13876 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
13877#ifdef BFD64
13878 case 8: code = BFD_RELOC_64_PCREL; break;
13879#endif
93382f6d
AM
13880 }
13881 }
13882 else
13883 {
13884 switch (fixp->fx_size)
13885 {
13886 default:
b091f402
AM
13887 as_bad_where (fixp->fx_file, fixp->fx_line,
13888 _("can not do %d byte relocation"),
13889 fixp->fx_size);
93382f6d
AM
13890 code = BFD_RELOC_32;
13891 break;
13892 case 1: code = BFD_RELOC_8; break;
13893 case 2: code = BFD_RELOC_16; break;
13894 case 4: code = BFD_RELOC_32; break;
937149dd 13895#ifdef BFD64
3e73aa7c 13896 case 8: code = BFD_RELOC_64; break;
937149dd 13897#endif
93382f6d 13898 }
252b5132
RH
13899 }
13900 break;
13901 }
252b5132 13902
d182319b
JB
13903 if ((code == BFD_RELOC_32
13904 || code == BFD_RELOC_32_PCREL
13905 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
13906 && GOT_symbol
13907 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 13908 {
4fa24527 13909 if (!object_64bit)
d6ab8113
JB
13910 code = BFD_RELOC_386_GOTPC;
13911 else
13912 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 13913 }
7b81dfbb
AJ
13914 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
13915 && GOT_symbol
13916 && fixp->fx_addsy == GOT_symbol)
13917 {
13918 code = BFD_RELOC_X86_64_GOTPC64;
13919 }
252b5132 13920
add39d23
TS
13921 rel = XNEW (arelent);
13922 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 13923 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
13924
13925 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 13926
3e73aa7c
JH
13927 if (!use_rela_relocations)
13928 {
13929 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
13930 vtable entry to be used in the relocation's section offset. */
13931 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13932 rel->address = fixp->fx_offset;
fbeb56a4
DK
13933#if defined (OBJ_COFF) && defined (TE_PE)
13934 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
13935 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
13936 else
13937#endif
c6682705 13938 rel->addend = 0;
3e73aa7c
JH
13939 }
13940 /* Use the rela in 64bit mode. */
252b5132 13941 else
3e73aa7c 13942 {
862be3fb
L
13943 if (disallow_64bit_reloc)
13944 switch (code)
13945 {
862be3fb
L
13946 case BFD_RELOC_X86_64_DTPOFF64:
13947 case BFD_RELOC_X86_64_TPOFF64:
13948 case BFD_RELOC_64_PCREL:
13949 case BFD_RELOC_X86_64_GOTOFF64:
13950 case BFD_RELOC_X86_64_GOT64:
13951 case BFD_RELOC_X86_64_GOTPCREL64:
13952 case BFD_RELOC_X86_64_GOTPC64:
13953 case BFD_RELOC_X86_64_GOTPLT64:
13954 case BFD_RELOC_X86_64_PLTOFF64:
13955 as_bad_where (fixp->fx_file, fixp->fx_line,
13956 _("cannot represent relocation type %s in x32 mode"),
13957 bfd_get_reloc_code_name (code));
13958 break;
13959 default:
13960 break;
13961 }
13962
062cd5e7
AS
13963 if (!fixp->fx_pcrel)
13964 rel->addend = fixp->fx_offset;
13965 else
13966 switch (code)
13967 {
13968 case BFD_RELOC_X86_64_PLT32:
13969 case BFD_RELOC_X86_64_GOT32:
13970 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
13971 case BFD_RELOC_X86_64_GOTPCRELX:
13972 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
13973 case BFD_RELOC_X86_64_TLSGD:
13974 case BFD_RELOC_X86_64_TLSLD:
13975 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
13976 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
13977 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
13978 rel->addend = fixp->fx_offset - fixp->fx_size;
13979 break;
13980 default:
13981 rel->addend = (section->vma
13982 - fixp->fx_size
13983 + fixp->fx_addnumber
13984 + md_pcrel_from (fixp));
13985 break;
13986 }
3e73aa7c
JH
13987 }
13988
252b5132
RH
13989 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
13990 if (rel->howto == NULL)
13991 {
13992 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 13993 _("cannot represent relocation type %s"),
252b5132
RH
13994 bfd_get_reloc_code_name (code));
13995 /* Set howto to a garbage value so that we can keep going. */
13996 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 13997 gas_assert (rel->howto != NULL);
252b5132
RH
13998 }
13999
14000 return rel;
14001}
14002
ee86248c 14003#include "tc-i386-intel.c"
54cfded0 14004
a60de03c
JB
14005void
14006tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 14007{
a60de03c
JB
14008 int saved_naked_reg;
14009 char saved_register_dot;
54cfded0 14010
a60de03c
JB
14011 saved_naked_reg = allow_naked_reg;
14012 allow_naked_reg = 1;
14013 saved_register_dot = register_chars['.'];
14014 register_chars['.'] = '.';
14015 allow_pseudo_reg = 1;
14016 expression_and_evaluate (exp);
14017 allow_pseudo_reg = 0;
14018 register_chars['.'] = saved_register_dot;
14019 allow_naked_reg = saved_naked_reg;
14020
e96d56a1 14021 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 14022 {
a60de03c
JB
14023 if ((addressT) exp->X_add_number < i386_regtab_size)
14024 {
14025 exp->X_op = O_constant;
14026 exp->X_add_number = i386_regtab[exp->X_add_number]
14027 .dw2_regnum[flag_code >> 1];
14028 }
14029 else
14030 exp->X_op = O_illegal;
54cfded0 14031 }
54cfded0
AM
14032}
14033
14034void
14035tc_x86_frame_initial_instructions (void)
14036{
a60de03c
JB
14037 static unsigned int sp_regno[2];
14038
14039 if (!sp_regno[flag_code >> 1])
14040 {
14041 char *saved_input = input_line_pointer;
14042 char sp[][4] = {"esp", "rsp"};
14043 expressionS exp;
a4447b93 14044
a60de03c
JB
14045 input_line_pointer = sp[flag_code >> 1];
14046 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 14047 gas_assert (exp.X_op == O_constant);
a60de03c
JB
14048 sp_regno[flag_code >> 1] = exp.X_add_number;
14049 input_line_pointer = saved_input;
14050 }
a4447b93 14051
61ff971f
L
14052 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
14053 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 14054}
d2b2c203 14055
d7921315
L
14056int
14057x86_dwarf2_addr_size (void)
14058{
14059#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
14060 if (x86_elf_abi == X86_64_X32_ABI)
14061 return 4;
14062#endif
14063 return bfd_arch_bits_per_address (stdoutput) / 8;
14064}
14065
d2b2c203
DJ
14066int
14067i386_elf_section_type (const char *str, size_t len)
14068{
14069 if (flag_code == CODE_64BIT
14070 && len == sizeof ("unwind") - 1
14071 && strncmp (str, "unwind", 6) == 0)
14072 return SHT_X86_64_UNWIND;
14073
14074 return -1;
14075}
bb41ade5 14076
ad5fec3b
EB
14077#ifdef TE_SOLARIS
14078void
14079i386_solaris_fix_up_eh_frame (segT sec)
14080{
14081 if (flag_code == CODE_64BIT)
14082 elf_section_type (sec) = SHT_X86_64_UNWIND;
14083}
14084#endif
14085
bb41ade5
AM
14086#ifdef TE_PE
14087void
14088tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
14089{
91d6fa6a 14090 expressionS exp;
bb41ade5 14091
91d6fa6a
NC
14092 exp.X_op = O_secrel;
14093 exp.X_add_symbol = symbol;
14094 exp.X_add_number = 0;
14095 emit_expr (&exp, size);
bb41ade5
AM
14096}
14097#endif
3b22753a
L
14098
14099#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14100/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
14101
01e1a5bc 14102bfd_vma
6d4af3c2 14103x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
14104{
14105 if (flag_code == CODE_64BIT)
14106 {
14107 if (letter == 'l')
14108 return SHF_X86_64_LARGE;
14109
8f3bae45 14110 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 14111 }
3b22753a 14112 else
8f3bae45 14113 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
14114 return -1;
14115}
14116
01e1a5bc 14117bfd_vma
3b22753a
L
14118x86_64_section_word (char *str, size_t len)
14119{
8620418b 14120 if (len == 5 && flag_code == CODE_64BIT && CONST_STRNEQ (str, "large"))
3b22753a
L
14121 return SHF_X86_64_LARGE;
14122
14123 return -1;
14124}
14125
14126static void
14127handle_large_common (int small ATTRIBUTE_UNUSED)
14128{
14129 if (flag_code != CODE_64BIT)
14130 {
14131 s_comm_internal (0, elf_common_parse);
14132 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
14133 }
14134 else
14135 {
14136 static segT lbss_section;
14137 asection *saved_com_section_ptr = elf_com_section_ptr;
14138 asection *saved_bss_section = bss_section;
14139
14140 if (lbss_section == NULL)
14141 {
14142 flagword applicable;
14143 segT seg = now_seg;
14144 subsegT subseg = now_subseg;
14145
14146 /* The .lbss section is for local .largecomm symbols. */
14147 lbss_section = subseg_new (".lbss", 0);
14148 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 14149 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
14150 seg_info (lbss_section)->bss = 1;
14151
14152 subseg_set (seg, subseg);
14153 }
14154
14155 elf_com_section_ptr = &_bfd_elf_large_com_section;
14156 bss_section = lbss_section;
14157
14158 s_comm_internal (0, elf_common_parse);
14159
14160 elf_com_section_ptr = saved_com_section_ptr;
14161 bss_section = saved_bss_section;
14162 }
14163}
14164#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
This page took 2.390748 seconds and 4 git commands to generate.