]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-i386.c
x86-64: avoid bogus warnings with 32-bit addressing
[thirdparty/binutils-gdb.git] / gas / config / tc-i386.c
CommitLineData
b534c6d3 1/* tc-i386.c -- Assemble code for the Intel 80386
250d07de 2 Copyright (C) 1989-2021 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"
41fd2579 35#include <limits.h>
41fd2579 36
c3332e24 37#ifndef INFER_ADDR_PREFIX
eecb386c 38#define INFER_ADDR_PREFIX 1
c3332e24
AM
39#endif
40
29b0f896
AM
41#ifndef DEFAULT_ARCH
42#define DEFAULT_ARCH "i386"
246fcdee 43#endif
252b5132 44
edde18a5
AM
45#ifndef INLINE
46#if __GNUC__ >= 2
47#define INLINE __inline__
48#else
49#define INLINE
50#endif
51#endif
52
6305a203
L
53/* Prefixes will be emitted in the order defined below.
54 WAIT_PREFIX must be the first prefix since FWAIT is really is an
55 instruction, and so must come before any prefixes.
56 The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
42164a71 57 REP_PREFIX/HLE_PREFIX, LOCK_PREFIX. */
6305a203
L
58#define WAIT_PREFIX 0
59#define SEG_PREFIX 1
60#define ADDR_PREFIX 2
61#define DATA_PREFIX 3
c32fa91d 62#define REP_PREFIX 4
42164a71 63#define HLE_PREFIX REP_PREFIX
7e8b059b 64#define BND_PREFIX REP_PREFIX
c32fa91d 65#define LOCK_PREFIX 5
4e9ac44a
L
66#define REX_PREFIX 6 /* must come last. */
67#define MAX_PREFIXES 7 /* max prefixes per opcode */
6305a203
L
68
69/* we define the syntax here (modulo base,index,scale syntax) */
70#define REGISTER_PREFIX '%'
71#define IMMEDIATE_PREFIX '$'
72#define ABSOLUTE_PREFIX '*'
73
74/* these are the instruction mnemonic suffixes in AT&T syntax or
75 memory operand size in Intel syntax. */
76#define WORD_MNEM_SUFFIX 'w'
77#define BYTE_MNEM_SUFFIX 'b'
78#define SHORT_MNEM_SUFFIX 's'
79#define LONG_MNEM_SUFFIX 'l'
80#define QWORD_MNEM_SUFFIX 'q'
6305a203
L
81/* Intel Syntax. Use a non-ascii letter since since it never appears
82 in instructions. */
83#define LONG_DOUBLE_MNEM_SUFFIX '\1'
84
85#define END_OF_INSN '\0'
86
79dec6b7
JB
87/* This matches the C -> StaticRounding alias in the opcode table. */
88#define commutative staticrounding
89
6305a203
L
90/*
91 'templates' is for grouping together 'template' structures for opcodes
92 of the same name. This is only used for storing the insns in the grand
93 ole hash table of insns.
94 The templates themselves start at START and range up to (but not including)
95 END.
96 */
97typedef struct
98{
d3ce72d0
NC
99 const insn_template *start;
100 const insn_template *end;
6305a203
L
101}
102templates;
103
104/* 386 operand encoding bytes: see 386 book for details of this. */
105typedef struct
106{
107 unsigned int regmem; /* codes register or memory operand */
108 unsigned int reg; /* codes register operand (or extended opcode) */
109 unsigned int mode; /* how to interpret regmem & reg */
110}
111modrm_byte;
112
113/* x86-64 extension prefix. */
114typedef int rex_byte;
115
6305a203
L
116/* 386 opcode byte to code indirect addressing. */
117typedef struct
118{
119 unsigned base;
120 unsigned index;
121 unsigned scale;
122}
123sib_byte;
124
6305a203
L
125/* x86 arch names, types and features */
126typedef struct
127{
128 const char *name; /* arch name */
8a2c8fef 129 unsigned int len; /* arch string length */
6305a203
L
130 enum processor_type type; /* arch type */
131 i386_cpu_flags flags; /* cpu feature flags */
8a2c8fef 132 unsigned int skip; /* show_arch should skip this. */
6305a203
L
133}
134arch_entry;
135
293f5f65
L
136/* Used to turn off indicated flags. */
137typedef struct
138{
139 const char *name; /* arch name */
140 unsigned int len; /* arch string length */
141 i386_cpu_flags flags; /* cpu feature flags */
142}
143noarch_entry;
144
78f12dd3 145static void update_code_flag (int, int);
e3bb37b5
L
146static void set_code_flag (int);
147static void set_16bit_gcc_code_flag (int);
148static void set_intel_syntax (int);
1efbbeb4 149static void set_intel_mnemonic (int);
db51cc60 150static void set_allow_index_reg (int);
7bab8ab5 151static void set_check (int);
e3bb37b5 152static void set_cpu_arch (int);
6482c264 153#ifdef TE_PE
e3bb37b5 154static void pe_directive_secrel (int);
6482c264 155#endif
e3bb37b5
L
156static void signed_cons (int);
157static char *output_invalid (int c);
ee86248c
JB
158static int i386_finalize_immediate (segT, expressionS *, i386_operand_type,
159 const char *);
160static int i386_finalize_displacement (segT, expressionS *, i386_operand_type,
161 const char *);
a7619375 162static int i386_att_operand (char *);
e3bb37b5 163static int i386_intel_operand (char *, int);
ee86248c
JB
164static int i386_intel_simplify (expressionS *);
165static int i386_intel_parse_name (const char *, expressionS *);
e3bb37b5
L
166static const reg_entry *parse_register (char *, char **);
167static char *parse_insn (char *, char *);
168static char *parse_operands (char *, const char *);
169static void swap_operands (void);
783c187b 170static void swap_2_operands (unsigned int, unsigned int);
48bcea9f 171static enum flag_code i386_addressing_mode (void);
e3bb37b5
L
172static void optimize_imm (void);
173static void optimize_disp (void);
83b16ac6 174static const insn_template *match_template (char);
e3bb37b5
L
175static int check_string (void);
176static int process_suffix (void);
177static int check_byte_reg (void);
178static int check_long_reg (void);
179static int check_qword_reg (void);
180static int check_word_reg (void);
181static int finalize_imm (void);
182static int process_operands (void);
5e042380 183static const reg_entry *build_modrm_byte (void);
e3bb37b5
L
184static void output_insn (void);
185static void output_imm (fragS *, offsetT);
186static void output_disp (fragS *, offsetT);
29b0f896 187#ifndef I386COFF
e3bb37b5 188static void s_bss (int);
252b5132 189#endif
17d4e2a2
L
190#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
191static void handle_large_common (int small ATTRIBUTE_UNUSED);
b4a3a7b4
L
192
193/* GNU_PROPERTY_X86_ISA_1_USED. */
194static unsigned int x86_isa_1_used;
195/* GNU_PROPERTY_X86_FEATURE_2_USED. */
196static unsigned int x86_feature_2_used;
197/* Generate x86 used ISA and feature properties. */
198static unsigned int x86_used_note = DEFAULT_X86_USED_NOTE;
17d4e2a2 199#endif
252b5132 200
a847613f 201static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 202
8a6fb3f9
JB
203/* parse_register() returns this when a register alias cannot be used. */
204static const reg_entry bad_reg = { "<bad>", OPERAND_TYPE_NONE, 0, 0,
205 { Dw2Inval, Dw2Inval } };
206
34684862 207static const reg_entry *reg_eax;
5e042380
JB
208static const reg_entry *reg_ds;
209static const reg_entry *reg_es;
210static const reg_entry *reg_ss;
6288d05f 211static const reg_entry *reg_st0;
6225c532
JB
212static const reg_entry *reg_k0;
213
c0f3af97
L
214/* VEX prefix. */
215typedef struct
216{
43234a1e
L
217 /* VEX prefix is either 2 byte or 3 byte. EVEX is 4 byte. */
218 unsigned char bytes[4];
c0f3af97
L
219 unsigned int length;
220 /* Destination or source register specifier. */
221 const reg_entry *register_specifier;
222} vex_prefix;
223
252b5132 224/* 'md_assemble ()' gathers together information and puts it into a
47926f60 225 i386_insn. */
252b5132 226
520dc8e8
AM
227union i386_op
228 {
229 expressionS *disps;
230 expressionS *imms;
231 const reg_entry *regs;
232 };
233
a65babc9
L
234enum i386_error
235 {
86e026a4 236 operand_size_mismatch,
a65babc9
L
237 operand_type_mismatch,
238 register_type_mismatch,
239 number_of_operands_mismatch,
240 invalid_instruction_suffix,
241 bad_imm4,
a65babc9
L
242 unsupported_with_intel_mnemonic,
243 unsupported_syntax,
6c30d220 244 unsupported,
260cd341 245 invalid_sib_address,
6c30d220 246 invalid_vsib_address,
7bab8ab5 247 invalid_vector_register_set,
260cd341 248 invalid_tmm_register_set,
43234a1e
L
249 unsupported_vector_index_register,
250 unsupported_broadcast,
43234a1e
L
251 broadcast_needed,
252 unsupported_masking,
253 mask_not_on_destination,
254 no_default_mask,
255 unsupported_rc_sae,
256 rc_sae_operand_not_last_imm,
257 invalid_register_operand,
a65babc9
L
258 };
259
252b5132
RH
260struct _i386_insn
261 {
47926f60 262 /* TM holds the template for the insn were currently assembling. */
d3ce72d0 263 insn_template tm;
252b5132 264
7d5e4556
L
265 /* SUFFIX holds the instruction size suffix for byte, word, dword
266 or qword, if given. */
252b5132
RH
267 char suffix;
268
9a182d04
JB
269 /* OPCODE_LENGTH holds the number of base opcode bytes. */
270 unsigned char opcode_length;
271
47926f60 272 /* OPERANDS gives the number of given operands. */
252b5132
RH
273 unsigned int operands;
274
275 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
276 of given register, displacement, memory operands and immediate
47926f60 277 operands. */
252b5132
RH
278 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
279
280 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 281 use OP[i] for the corresponding operand. */
40fb9820 282 i386_operand_type types[MAX_OPERANDS];
252b5132 283
520dc8e8
AM
284 /* Displacement expression, immediate expression, or register for each
285 operand. */
286 union i386_op op[MAX_OPERANDS];
252b5132 287
3e73aa7c
JH
288 /* Flags for operands. */
289 unsigned int flags[MAX_OPERANDS];
290#define Operand_PCrel 1
c48dadc9 291#define Operand_Mem 2
3e73aa7c 292
252b5132 293 /* Relocation type for operand */
f86103b7 294 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 295
252b5132
RH
296 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
297 the base index byte below. */
298 const reg_entry *base_reg;
299 const reg_entry *index_reg;
300 unsigned int log2_scale_factor;
301
302 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 303 explicit segment overrides are given. */
5e042380 304 const reg_entry *seg[2];
252b5132 305
8325cc63
JB
306 /* Copied first memory operand string, for re-checking. */
307 char *memop1_string;
308
252b5132
RH
309 /* PREFIX holds all the given prefix opcodes (usually null).
310 PREFIXES is the number of prefix opcodes. */
311 unsigned int prefixes;
312 unsigned char prefix[MAX_PREFIXES];
313
50128d0c 314 /* Register is in low 3 bits of opcode. */
5b7c81bd 315 bool short_form;
50128d0c 316
6f2f06be 317 /* The operand to a branch insn indicates an absolute branch. */
5b7c81bd 318 bool jumpabsolute;
6f2f06be 319
921eafea
L
320 /* Extended states. */
321 enum
322 {
323 /* Use MMX state. */
324 xstate_mmx = 1 << 0,
325 /* Use XMM state. */
326 xstate_xmm = 1 << 1,
327 /* Use YMM state. */
328 xstate_ymm = 1 << 2 | xstate_xmm,
329 /* Use ZMM state. */
330 xstate_zmm = 1 << 3 | xstate_ymm,
331 /* Use TMM state. */
32930e4e
L
332 xstate_tmm = 1 << 4,
333 /* Use MASK state. */
334 xstate_mask = 1 << 5
921eafea 335 } xstate;
260cd341 336
e379e5f3 337 /* Has GOTPC or TLS relocation. */
5b7c81bd 338 bool has_gotpc_tls_reloc;
e379e5f3 339
252b5132 340 /* RM and SIB are the modrm byte and the sib byte where the
c1e679ec 341 addressing modes of this insn are encoded. */
252b5132 342 modrm_byte rm;
3e73aa7c 343 rex_byte rex;
43234a1e 344 rex_byte vrex;
252b5132 345 sib_byte sib;
c0f3af97 346 vex_prefix vex;
b6169b20 347
6225c532
JB
348 /* Masking attributes.
349
350 The struct describes masking, applied to OPERAND in the instruction.
351 REG is a pointer to the corresponding mask register. ZEROING tells
352 whether merging or zeroing mask is used. */
353 struct Mask_Operation
354 {
355 const reg_entry *reg;
356 unsigned int zeroing;
357 /* The operand where this operation is associated. */
358 unsigned int operand;
359 } mask;
43234a1e
L
360
361 /* Rounding control and SAE attributes. */
ca5312a2
JB
362 struct RC_Operation
363 {
364 enum rc_type
365 {
366 rc_none = -1,
367 rne,
368 rd,
369 ru,
370 rz,
371 saeonly
372 } type;
373
374 unsigned int operand;
375 } rounding;
43234a1e 376
5273a3cd
JB
377 /* Broadcasting attributes.
378
379 The struct describes broadcasting, applied to OPERAND. TYPE is
380 expresses the broadcast factor. */
381 struct Broadcast_Operation
382 {
383 /* Type of broadcast: {1to2}, {1to4}, {1to8}, or {1to16}. */
384 unsigned int type;
385
386 /* Index of broadcasted operand. */
387 unsigned int operand;
388
389 /* Number of bytes to broadcast. */
390 unsigned int bytes;
391 } broadcast;
43234a1e
L
392
393 /* Compressed disp8*N attribute. */
394 unsigned int memshift;
395
86fa6981
L
396 /* Prefer load or store in encoding. */
397 enum
398 {
399 dir_encoding_default = 0,
400 dir_encoding_load,
64c49ab3
JB
401 dir_encoding_store,
402 dir_encoding_swap
86fa6981 403 } dir_encoding;
891edac4 404
41eb8e88 405 /* Prefer 8bit, 16bit, 32bit displacement in encoding. */
a501d77e
L
406 enum
407 {
408 disp_encoding_default = 0,
409 disp_encoding_8bit,
41eb8e88 410 disp_encoding_16bit,
a501d77e
L
411 disp_encoding_32bit
412 } disp_encoding;
f8a5c266 413
6b6b6807 414 /* Prefer the REX byte in encoding. */
5b7c81bd 415 bool rex_encoding;
6b6b6807 416
b6f8c7c4 417 /* Disable instruction size optimization. */
5b7c81bd 418 bool no_optimize;
b6f8c7c4 419
86fa6981
L
420 /* How to encode vector instructions. */
421 enum
422 {
423 vex_encoding_default = 0,
42e04b36 424 vex_encoding_vex,
86fa6981 425 vex_encoding_vex3,
da4977e0
JB
426 vex_encoding_evex,
427 vex_encoding_error
86fa6981
L
428 } vec_encoding;
429
d5de92cf
L
430 /* REP prefix. */
431 const char *rep_prefix;
432
165de32a
L
433 /* HLE prefix. */
434 const char *hle_prefix;
42164a71 435
7e8b059b
L
436 /* Have BND prefix. */
437 const char *bnd_prefix;
438
04ef582a
L
439 /* Have NOTRACK prefix. */
440 const char *notrack_prefix;
441
891edac4 442 /* Error message. */
a65babc9 443 enum i386_error error;
252b5132
RH
444 };
445
446typedef struct _i386_insn i386_insn;
447
43234a1e
L
448/* Link RC type with corresponding string, that'll be looked for in
449 asm. */
450struct RC_name
451{
452 enum rc_type type;
453 const char *name;
454 unsigned int len;
455};
456
457static const struct RC_name RC_NamesTable[] =
458{
459 { rne, STRING_COMMA_LEN ("rn-sae") },
460 { rd, STRING_COMMA_LEN ("rd-sae") },
461 { ru, STRING_COMMA_LEN ("ru-sae") },
462 { rz, STRING_COMMA_LEN ("rz-sae") },
463 { saeonly, STRING_COMMA_LEN ("sae") },
464};
465
252b5132
RH
466/* List of chars besides those in app.c:symbol_chars that can start an
467 operand. Used to prevent the scrubber eating vital white-space. */
86fa6981 468const char extra_symbol_chars[] = "*%-([{}"
252b5132 469#ifdef LEX_AT
32137342
NC
470 "@"
471#endif
472#ifdef LEX_QM
473 "?"
252b5132 474#endif
32137342 475 ;
252b5132 476
b3983e5f
JB
477#if ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
478 && !defined (TE_GNU) \
479 && !defined (TE_LINUX) \
480 && !defined (TE_FreeBSD) \
481 && !defined (TE_DragonFly) \
482 && !defined (TE_NetBSD))
252b5132 483/* This array holds the chars that always start a comment. If the
b3b91714
AM
484 pre-processor is disabled, these aren't very useful. The option
485 --divide will remove '/' from this list. */
486const char *i386_comment_chars = "#/";
487#define SVR4_COMMENT_CHARS 1
252b5132 488#define PREFIX_SEPARATOR '\\'
252b5132 489
b3b91714
AM
490#else
491const char *i386_comment_chars = "#";
492#define PREFIX_SEPARATOR '/'
493#endif
494
252b5132
RH
495/* This array holds the chars that only start a comment at the beginning of
496 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
497 .line and .file directives will appear in the pre-processed output.
498 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 499 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
500 #NO_APP at the beginning of its output.
501 Also note that comments started like this one will always work if
252b5132 502 '/' isn't otherwise defined. */
b3b91714 503const char line_comment_chars[] = "#/";
252b5132 504
63a0b638 505const char line_separator_chars[] = ";";
252b5132 506
ce8a8b2f
AM
507/* Chars that can be used to separate mant from exp in floating point
508 nums. */
252b5132
RH
509const char EXP_CHARS[] = "eE";
510
ce8a8b2f
AM
511/* Chars that mean this number is a floating point constant
512 As in 0f12.456
513 or 0d1.2345e12. */
252b5132
RH
514const char FLT_CHARS[] = "fFdDxX";
515
ce8a8b2f 516/* Tables for lexical analysis. */
252b5132
RH
517static char mnemonic_chars[256];
518static char register_chars[256];
519static char operand_chars[256];
520static char identifier_chars[256];
252b5132 521
ce8a8b2f 522/* Lexical macros. */
252b5132
RH
523#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
524#define is_operand_char(x) (operand_chars[(unsigned char) x])
525#define is_register_char(x) (register_chars[(unsigned char) x])
526#define is_space_char(x) ((x) == ' ')
527#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
252b5132 528
0234cb7c 529/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
530static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
531
532/* md_assemble() always leaves the strings it's passed unaltered. To
533 effect this we maintain a stack of saved characters that we've smashed
534 with '\0's (indicating end of strings for various sub-fields of the
47926f60 535 assembler instruction). */
252b5132 536static char save_stack[32];
ce8a8b2f 537static char *save_stack_p;
252b5132
RH
538#define END_STRING_AND_SAVE(s) \
539 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
540#define RESTORE_END_STRING(s) \
541 do { *(s) = *--save_stack_p; } while (0)
542
47926f60 543/* The instruction we're assembling. */
252b5132
RH
544static i386_insn i;
545
546/* Possible templates for current insn. */
547static const templates *current_templates;
548
31b2323c
L
549/* Per instruction expressionS buffers: max displacements & immediates. */
550static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
551static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 552
47926f60 553/* Current operand we are working on. */
ee86248c 554static int this_operand = -1;
252b5132 555
3e73aa7c
JH
556/* We support four different modes. FLAG_CODE variable is used to distinguish
557 these. */
558
559enum flag_code {
560 CODE_32BIT,
561 CODE_16BIT,
562 CODE_64BIT };
563
564static enum flag_code flag_code;
4fa24527 565static unsigned int object_64bit;
862be3fb 566static unsigned int disallow_64bit_reloc;
3e73aa7c 567static int use_rela_relocations = 0;
e379e5f3
L
568/* __tls_get_addr/___tls_get_addr symbol for TLS. */
569static const char *tls_get_addr;
3e73aa7c 570
7af8ed2d
NC
571#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
572 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
573 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
574
351f65ca
L
575/* The ELF ABI to use. */
576enum x86_elf_abi
577{
578 I386_ABI,
7f56bc95
L
579 X86_64_ABI,
580 X86_64_X32_ABI
351f65ca
L
581};
582
583static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 584#endif
351f65ca 585
167ad85b
TG
586#if defined (TE_PE) || defined (TE_PEP)
587/* Use big object file format. */
588static int use_big_obj = 0;
589#endif
590
8dcea932
L
591#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
592/* 1 if generating code for a shared library. */
593static int shared = 0;
594#endif
595
47926f60
KH
596/* 1 for intel syntax,
597 0 if att syntax. */
598static int intel_syntax = 0;
252b5132 599
4b5aaf5f
L
600static enum x86_64_isa
601{
602 amd64 = 1, /* AMD64 ISA. */
603 intel64 /* Intel64 ISA. */
604} isa64;
e89c5eaa 605
1efbbeb4
L
606/* 1 for intel mnemonic,
607 0 if att mnemonic. */
608static int intel_mnemonic = !SYSV386_COMPAT;
609
a60de03c
JB
610/* 1 if pseudo registers are permitted. */
611static int allow_pseudo_reg = 0;
612
47926f60
KH
613/* 1 if register prefix % not required. */
614static int allow_naked_reg = 0;
252b5132 615
33eaf5de 616/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
617 instructions supporting it, even if this prefix wasn't specified
618 explicitly. */
619static int add_bnd_prefix = 0;
620
ba104c83 621/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
622static int allow_index_reg = 0;
623
d022bddd
IT
624/* 1 if the assembler should ignore LOCK prefix, even if it was
625 specified explicitly. */
626static int omit_lock_prefix = 0;
627
e4e00185
AS
628/* 1 if the assembler should encode lfence, mfence, and sfence as
629 "lock addl $0, (%{re}sp)". */
630static int avoid_fence = 0;
631
ae531041
L
632/* 1 if lfence should be inserted after every load. */
633static int lfence_after_load = 0;
634
635/* Non-zero if lfence should be inserted before indirect branch. */
636static enum lfence_before_indirect_branch_kind
637 {
638 lfence_branch_none = 0,
639 lfence_branch_register,
640 lfence_branch_memory,
641 lfence_branch_all
642 }
643lfence_before_indirect_branch;
644
645/* Non-zero if lfence should be inserted before ret. */
646static enum lfence_before_ret_kind
647 {
648 lfence_before_ret_none = 0,
649 lfence_before_ret_not,
a09f656b 650 lfence_before_ret_or,
651 lfence_before_ret_shl
ae531041
L
652 }
653lfence_before_ret;
654
655/* Types of previous instruction is .byte or prefix. */
e379e5f3
L
656static struct
657 {
658 segT seg;
659 const char *file;
660 const char *name;
661 unsigned int line;
662 enum last_insn_kind
663 {
664 last_insn_other = 0,
665 last_insn_directive,
666 last_insn_prefix
667 } kind;
668 } last_insn;
669
0cb4071e
L
670/* 1 if the assembler should generate relax relocations. */
671
672static int generate_relax_relocations
673 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
674
7bab8ab5 675static enum check_kind
daf50ae7 676 {
7bab8ab5
JB
677 check_none = 0,
678 check_warning,
679 check_error
daf50ae7 680 }
7bab8ab5 681sse_check, operand_check = check_warning;
daf50ae7 682
e379e5f3
L
683/* Non-zero if branches should be aligned within power of 2 boundary. */
684static int align_branch_power = 0;
685
686/* Types of branches to align. */
687enum align_branch_kind
688 {
689 align_branch_none = 0,
690 align_branch_jcc = 1,
691 align_branch_fused = 2,
692 align_branch_jmp = 3,
693 align_branch_call = 4,
694 align_branch_indirect = 5,
695 align_branch_ret = 6
696 };
697
698/* Type bits of branches to align. */
699enum align_branch_bit
700 {
701 align_branch_jcc_bit = 1 << align_branch_jcc,
702 align_branch_fused_bit = 1 << align_branch_fused,
703 align_branch_jmp_bit = 1 << align_branch_jmp,
704 align_branch_call_bit = 1 << align_branch_call,
705 align_branch_indirect_bit = 1 << align_branch_indirect,
706 align_branch_ret_bit = 1 << align_branch_ret
707 };
708
709static unsigned int align_branch = (align_branch_jcc_bit
710 | align_branch_fused_bit
711 | align_branch_jmp_bit);
712
79d72f45
HL
713/* Types of condition jump used by macro-fusion. */
714enum mf_jcc_kind
715 {
716 mf_jcc_jo = 0, /* base opcode 0x70 */
717 mf_jcc_jc, /* base opcode 0x72 */
718 mf_jcc_je, /* base opcode 0x74 */
719 mf_jcc_jna, /* base opcode 0x76 */
720 mf_jcc_js, /* base opcode 0x78 */
721 mf_jcc_jp, /* base opcode 0x7a */
722 mf_jcc_jl, /* base opcode 0x7c */
723 mf_jcc_jle, /* base opcode 0x7e */
724 };
725
726/* Types of compare flag-modifying insntructions used by macro-fusion. */
727enum mf_cmp_kind
728 {
729 mf_cmp_test_and, /* test/cmp */
730 mf_cmp_alu_cmp, /* add/sub/cmp */
731 mf_cmp_incdec /* inc/dec */
732 };
733
e379e5f3
L
734/* The maximum padding size for fused jcc. CMP like instruction can
735 be 9 bytes and jcc can be 6 bytes. Leave room just in case for
736 prefixes. */
737#define MAX_FUSED_JCC_PADDING_SIZE 20
738
739/* The maximum number of prefixes added for an instruction. */
740static unsigned int align_branch_prefix_size = 5;
741
b6f8c7c4
L
742/* Optimization:
743 1. Clear the REX_W bit with register operand if possible.
744 2. Above plus use 128bit vector instruction to clear the full vector
745 register.
746 */
747static int optimize = 0;
748
749/* Optimization:
750 1. Clear the REX_W bit with register operand if possible.
751 2. Above plus use 128bit vector instruction to clear the full vector
752 register.
753 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
754 "testb $imm7,%r8".
755 */
756static int optimize_for_space = 0;
757
2ca3ace5
L
758/* Register prefix used for error message. */
759static const char *register_prefix = "%";
760
47926f60
KH
761/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
762 leave, push, and pop instructions so that gcc has the same stack
763 frame as in 32 bit mode. */
764static char stackop_size = '\0';
eecb386c 765
12b55ccc
L
766/* Non-zero to optimize code alignment. */
767int optimize_align_code = 1;
768
47926f60
KH
769/* Non-zero to quieten some warnings. */
770static int quiet_warnings = 0;
a38cf1db 771
47926f60
KH
772/* CPU name. */
773static const char *cpu_arch_name = NULL;
6305a203 774static char *cpu_sub_arch_name = NULL;
a38cf1db 775
47926f60 776/* CPU feature flags. */
40fb9820
L
777static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
778
ccc9c027
L
779/* If we have selected a cpu we are generating instructions for. */
780static int cpu_arch_tune_set = 0;
781
9103f4f4 782/* Cpu we are generating instructions for. */
fbf3f584 783enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4
L
784
785/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 786static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 787
ccc9c027 788/* CPU instruction set architecture used. */
fbf3f584 789enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 790
9103f4f4 791/* CPU feature flags of instruction set architecture used. */
fbf3f584 792i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 793
fddf5b5b
AM
794/* If set, conditional jumps are not automatically promoted to handle
795 larger than a byte offset. */
796static unsigned int no_cond_jump_promotion = 0;
797
c0f3af97
L
798/* Encode SSE instructions with VEX prefix. */
799static unsigned int sse2avx;
800
539f890d
L
801/* Encode scalar AVX instructions with specific vector length. */
802static enum
803 {
804 vex128 = 0,
805 vex256
806 } avxscalar;
807
03751133
L
808/* Encode VEX WIG instructions with specific vex.w. */
809static enum
810 {
811 vexw0 = 0,
812 vexw1
813 } vexwig;
814
43234a1e
L
815/* Encode scalar EVEX LIG instructions with specific vector length. */
816static enum
817 {
818 evexl128 = 0,
819 evexl256,
820 evexl512
821 } evexlig;
822
823/* Encode EVEX WIG instructions with specific evex.w. */
824static enum
825 {
826 evexw0 = 0,
827 evexw1
828 } evexwig;
829
d3d3c6db
IT
830/* Value to encode in EVEX RC bits, for SAE-only instructions. */
831static enum rc_type evexrcig = rne;
832
29b0f896 833/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 834static symbolS *GOT_symbol;
29b0f896 835
a4447b93
RH
836/* The dwarf2 return column, adjusted for 32 or 64 bit. */
837unsigned int x86_dwarf2_return_column;
838
839/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
840int x86_cie_data_alignment;
841
252b5132 842/* Interface to relax_segment.
fddf5b5b
AM
843 There are 3 major relax states for 386 jump insns because the
844 different types of jumps add different sizes to frags when we're
e379e5f3
L
845 figuring out what sort of jump to choose to reach a given label.
846
847 BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING are used to align
848 branches which are handled by md_estimate_size_before_relax() and
849 i386_generic_table_relax_frag(). */
252b5132 850
47926f60 851/* Types. */
93c2a809
AM
852#define UNCOND_JUMP 0
853#define COND_JUMP 1
854#define COND_JUMP86 2
e379e5f3
L
855#define BRANCH_PADDING 3
856#define BRANCH_PREFIX 4
857#define FUSED_JCC_PADDING 5
fddf5b5b 858
47926f60 859/* Sizes. */
252b5132
RH
860#define CODE16 1
861#define SMALL 0
29b0f896 862#define SMALL16 (SMALL | CODE16)
252b5132 863#define BIG 2
29b0f896 864#define BIG16 (BIG | CODE16)
252b5132
RH
865
866#ifndef INLINE
867#ifdef __GNUC__
868#define INLINE __inline__
869#else
870#define INLINE
871#endif
872#endif
873
fddf5b5b
AM
874#define ENCODE_RELAX_STATE(type, size) \
875 ((relax_substateT) (((type) << 2) | (size)))
876#define TYPE_FROM_RELAX_STATE(s) \
877 ((s) >> 2)
878#define DISP_SIZE_FROM_RELAX_STATE(s) \
879 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
880
881/* This table is used by relax_frag to promote short jumps to long
882 ones where necessary. SMALL (short) jumps may be promoted to BIG
883 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
884 don't allow a short jump in a 32 bit code segment to be promoted to
885 a 16 bit offset jump because it's slower (requires data size
886 prefix), and doesn't work, unless the destination is in the bottom
887 64k of the code segment (The top 16 bits of eip are zeroed). */
888
889const relax_typeS md_relax_table[] =
890{
24eab124
AM
891 /* The fields are:
892 1) most positive reach of this state,
893 2) most negative reach of this state,
93c2a809 894 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 895 4) which index into the table to try if we can't fit into this one. */
252b5132 896
fddf5b5b 897 /* UNCOND_JUMP states. */
93c2a809
AM
898 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
899 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
900 /* dword jmp adds 4 bytes to frag:
901 0 extra opcode bytes, 4 displacement bytes. */
252b5132 902 {0, 0, 4, 0},
93c2a809
AM
903 /* word jmp adds 2 byte2 to frag:
904 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
905 {0, 0, 2, 0},
906
93c2a809
AM
907 /* COND_JUMP states. */
908 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
909 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
910 /* dword conditionals adds 5 bytes to frag:
911 1 extra opcode byte, 4 displacement bytes. */
912 {0, 0, 5, 0},
fddf5b5b 913 /* word conditionals add 3 bytes to frag:
93c2a809
AM
914 1 extra opcode byte, 2 displacement bytes. */
915 {0, 0, 3, 0},
916
917 /* COND_JUMP86 states. */
918 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
919 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
920 /* dword conditionals adds 5 bytes to frag:
921 1 extra opcode byte, 4 displacement bytes. */
922 {0, 0, 5, 0},
923 /* word conditionals add 4 bytes to frag:
924 1 displacement byte and a 3 byte long branch insn. */
925 {0, 0, 4, 0}
252b5132
RH
926};
927
9103f4f4
L
928static const arch_entry cpu_arch[] =
929{
89507696
JB
930 /* Do not replace the first two entries - i386_target_format()
931 relies on them being there in this order. */
8a2c8fef 932 { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
293f5f65 933 CPU_GENERIC32_FLAGS, 0 },
8a2c8fef 934 { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
293f5f65 935 CPU_GENERIC64_FLAGS, 0 },
8a2c8fef 936 { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
293f5f65 937 CPU_NONE_FLAGS, 0 },
8a2c8fef 938 { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
293f5f65 939 CPU_I186_FLAGS, 0 },
8a2c8fef 940 { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
293f5f65 941 CPU_I286_FLAGS, 0 },
8a2c8fef 942 { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
293f5f65 943 CPU_I386_FLAGS, 0 },
8a2c8fef 944 { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
293f5f65 945 CPU_I486_FLAGS, 0 },
8a2c8fef 946 { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
293f5f65 947 CPU_I586_FLAGS, 0 },
8a2c8fef 948 { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
293f5f65 949 CPU_I686_FLAGS, 0 },
8a2c8fef 950 { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
293f5f65 951 CPU_I586_FLAGS, 0 },
8a2c8fef 952 { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
293f5f65 953 CPU_PENTIUMPRO_FLAGS, 0 },
8a2c8fef 954 { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
293f5f65 955 CPU_P2_FLAGS, 0 },
8a2c8fef 956 { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
293f5f65 957 CPU_P3_FLAGS, 0 },
8a2c8fef 958 { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
293f5f65 959 CPU_P4_FLAGS, 0 },
8a2c8fef 960 { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
293f5f65 961 CPU_CORE_FLAGS, 0 },
8a2c8fef 962 { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
293f5f65 963 CPU_NOCONA_FLAGS, 0 },
8a2c8fef 964 { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
293f5f65 965 CPU_CORE_FLAGS, 1 },
8a2c8fef 966 { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
293f5f65 967 CPU_CORE_FLAGS, 0 },
8a2c8fef 968 { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
293f5f65 969 CPU_CORE2_FLAGS, 1 },
8a2c8fef 970 { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
293f5f65 971 CPU_CORE2_FLAGS, 0 },
8a2c8fef 972 { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
293f5f65 973 CPU_COREI7_FLAGS, 0 },
8a2c8fef 974 { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
293f5f65 975 CPU_L1OM_FLAGS, 0 },
7a9068fe 976 { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
293f5f65 977 CPU_K1OM_FLAGS, 0 },
81486035 978 { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
293f5f65 979 CPU_IAMCU_FLAGS, 0 },
8a2c8fef 980 { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
293f5f65 981 CPU_K6_FLAGS, 0 },
8a2c8fef 982 { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
293f5f65 983 CPU_K6_2_FLAGS, 0 },
8a2c8fef 984 { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
293f5f65 985 CPU_ATHLON_FLAGS, 0 },
8a2c8fef 986 { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
293f5f65 987 CPU_K8_FLAGS, 1 },
8a2c8fef 988 { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
293f5f65 989 CPU_K8_FLAGS, 0 },
8a2c8fef 990 { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
293f5f65 991 CPU_K8_FLAGS, 0 },
8a2c8fef 992 { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
293f5f65 993 CPU_AMDFAM10_FLAGS, 0 },
8aedb9fe 994 { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
293f5f65 995 CPU_BDVER1_FLAGS, 0 },
8aedb9fe 996 { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
293f5f65 997 CPU_BDVER2_FLAGS, 0 },
5e5c50d3 998 { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
293f5f65 999 CPU_BDVER3_FLAGS, 0 },
c7b0bd56 1000 { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
293f5f65 1001 CPU_BDVER4_FLAGS, 0 },
029f3522 1002 { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
293f5f65 1003 CPU_ZNVER1_FLAGS, 0 },
a9660a6f
AP
1004 { STRING_COMMA_LEN ("znver2"), PROCESSOR_ZNVER,
1005 CPU_ZNVER2_FLAGS, 0 },
646cc3e0
GG
1006 { STRING_COMMA_LEN ("znver3"), PROCESSOR_ZNVER,
1007 CPU_ZNVER3_FLAGS, 0 },
7b458c12 1008 { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
293f5f65 1009 CPU_BTVER1_FLAGS, 0 },
7b458c12 1010 { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
293f5f65 1011 CPU_BTVER2_FLAGS, 0 },
8a2c8fef 1012 { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
293f5f65 1013 CPU_8087_FLAGS, 0 },
8a2c8fef 1014 { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
293f5f65 1015 CPU_287_FLAGS, 0 },
8a2c8fef 1016 { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
293f5f65 1017 CPU_387_FLAGS, 0 },
1848e567
L
1018 { STRING_COMMA_LEN (".687"), PROCESSOR_UNKNOWN,
1019 CPU_687_FLAGS, 0 },
d871f3f4
L
1020 { STRING_COMMA_LEN (".cmov"), PROCESSOR_UNKNOWN,
1021 CPU_CMOV_FLAGS, 0 },
1022 { STRING_COMMA_LEN (".fxsr"), PROCESSOR_UNKNOWN,
1023 CPU_FXSR_FLAGS, 0 },
8a2c8fef 1024 { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
293f5f65 1025 CPU_MMX_FLAGS, 0 },
8a2c8fef 1026 { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
293f5f65 1027 CPU_SSE_FLAGS, 0 },
8a2c8fef 1028 { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
293f5f65 1029 CPU_SSE2_FLAGS, 0 },
8a2c8fef 1030 { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
293f5f65 1031 CPU_SSE3_FLAGS, 0 },
af5c13b0
L
1032 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
1033 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1034 { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
293f5f65 1035 CPU_SSSE3_FLAGS, 0 },
8a2c8fef 1036 { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
293f5f65 1037 CPU_SSE4_1_FLAGS, 0 },
8a2c8fef 1038 { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
293f5f65 1039 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1040 { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
293f5f65 1041 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1042 { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
293f5f65 1043 CPU_AVX_FLAGS, 0 },
6c30d220 1044 { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
293f5f65 1045 CPU_AVX2_FLAGS, 0 },
43234a1e 1046 { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
293f5f65 1047 CPU_AVX512F_FLAGS, 0 },
43234a1e 1048 { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
293f5f65 1049 CPU_AVX512CD_FLAGS, 0 },
43234a1e 1050 { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
293f5f65 1051 CPU_AVX512ER_FLAGS, 0 },
43234a1e 1052 { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
293f5f65 1053 CPU_AVX512PF_FLAGS, 0 },
1dfc6506 1054 { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
293f5f65 1055 CPU_AVX512DQ_FLAGS, 0 },
1dfc6506 1056 { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
293f5f65 1057 CPU_AVX512BW_FLAGS, 0 },
1dfc6506 1058 { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
293f5f65 1059 CPU_AVX512VL_FLAGS, 0 },
8a2c8fef 1060 { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
293f5f65 1061 CPU_VMX_FLAGS, 0 },
8729a6f6 1062 { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
293f5f65 1063 CPU_VMFUNC_FLAGS, 0 },
8a2c8fef 1064 { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
293f5f65 1065 CPU_SMX_FLAGS, 0 },
8a2c8fef 1066 { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
293f5f65 1067 CPU_XSAVE_FLAGS, 0 },
c7b8aa3a 1068 { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
293f5f65 1069 CPU_XSAVEOPT_FLAGS, 0 },
1dfc6506 1070 { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
293f5f65 1071 CPU_XSAVEC_FLAGS, 0 },
1dfc6506 1072 { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
293f5f65 1073 CPU_XSAVES_FLAGS, 0 },
8a2c8fef 1074 { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
293f5f65 1075 CPU_AES_FLAGS, 0 },
8a2c8fef 1076 { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
293f5f65 1077 CPU_PCLMUL_FLAGS, 0 },
8a2c8fef 1078 { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
293f5f65 1079 CPU_PCLMUL_FLAGS, 1 },
c7b8aa3a 1080 { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
293f5f65 1081 CPU_FSGSBASE_FLAGS, 0 },
c7b8aa3a 1082 { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
293f5f65 1083 CPU_RDRND_FLAGS, 0 },
c7b8aa3a 1084 { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
293f5f65 1085 CPU_F16C_FLAGS, 0 },
6c30d220 1086 { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
293f5f65 1087 CPU_BMI2_FLAGS, 0 },
8a2c8fef 1088 { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
293f5f65 1089 CPU_FMA_FLAGS, 0 },
8a2c8fef 1090 { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
293f5f65 1091 CPU_FMA4_FLAGS, 0 },
8a2c8fef 1092 { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
293f5f65 1093 CPU_XOP_FLAGS, 0 },
8a2c8fef 1094 { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
293f5f65 1095 CPU_LWP_FLAGS, 0 },
8a2c8fef 1096 { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
293f5f65 1097 CPU_MOVBE_FLAGS, 0 },
60aa667e 1098 { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
293f5f65 1099 CPU_CX16_FLAGS, 0 },
8a2c8fef 1100 { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
293f5f65 1101 CPU_EPT_FLAGS, 0 },
6c30d220 1102 { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
293f5f65 1103 CPU_LZCNT_FLAGS, 0 },
272a84b1
L
1104 { STRING_COMMA_LEN (".popcnt"), PROCESSOR_UNKNOWN,
1105 CPU_POPCNT_FLAGS, 0 },
42164a71 1106 { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
293f5f65 1107 CPU_HLE_FLAGS, 0 },
42164a71 1108 { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
293f5f65 1109 CPU_RTM_FLAGS, 0 },
6c30d220 1110 { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
293f5f65 1111 CPU_INVPCID_FLAGS, 0 },
8a2c8fef 1112 { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
293f5f65 1113 CPU_CLFLUSH_FLAGS, 0 },
22109423 1114 { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
293f5f65 1115 CPU_NOP_FLAGS, 0 },
8a2c8fef 1116 { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
293f5f65 1117 CPU_SYSCALL_FLAGS, 0 },
8a2c8fef 1118 { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
293f5f65 1119 CPU_RDTSCP_FLAGS, 0 },
8a2c8fef 1120 { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
293f5f65 1121 CPU_3DNOW_FLAGS, 0 },
8a2c8fef 1122 { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
293f5f65 1123 CPU_3DNOWA_FLAGS, 0 },
8a2c8fef 1124 { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
293f5f65 1125 CPU_PADLOCK_FLAGS, 0 },
8a2c8fef 1126 { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
293f5f65 1127 CPU_SVME_FLAGS, 1 },
8a2c8fef 1128 { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
293f5f65 1129 CPU_SVME_FLAGS, 0 },
8a2c8fef 1130 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
293f5f65 1131 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1132 { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
293f5f65 1133 CPU_ABM_FLAGS, 0 },
87973e9f 1134 { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
293f5f65 1135 CPU_BMI_FLAGS, 0 },
2a2a0f38 1136 { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
293f5f65 1137 CPU_TBM_FLAGS, 0 },
e2e1fcde 1138 { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
293f5f65 1139 CPU_ADX_FLAGS, 0 },
e2e1fcde 1140 { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
293f5f65 1141 CPU_RDSEED_FLAGS, 0 },
e2e1fcde 1142 { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
293f5f65 1143 CPU_PRFCHW_FLAGS, 0 },
5c111e37 1144 { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
293f5f65 1145 CPU_SMAP_FLAGS, 0 },
7e8b059b 1146 { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
293f5f65 1147 CPU_MPX_FLAGS, 0 },
a0046408 1148 { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
293f5f65 1149 CPU_SHA_FLAGS, 0 },
963f3586 1150 { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
293f5f65 1151 CPU_CLFLUSHOPT_FLAGS, 0 },
dcf893b5 1152 { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
293f5f65 1153 CPU_PREFETCHWT1_FLAGS, 0 },
2cf200a4 1154 { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
293f5f65 1155 CPU_SE1_FLAGS, 0 },
c5e7287a 1156 { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
293f5f65 1157 CPU_CLWB_FLAGS, 0 },
2cc1b5aa 1158 { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
293f5f65 1159 CPU_AVX512IFMA_FLAGS, 0 },
14f195c9 1160 { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
293f5f65 1161 CPU_AVX512VBMI_FLAGS, 0 },
920d2ddc
IT
1162 { STRING_COMMA_LEN (".avx512_4fmaps"), PROCESSOR_UNKNOWN,
1163 CPU_AVX512_4FMAPS_FLAGS, 0 },
47acf0bd
IT
1164 { STRING_COMMA_LEN (".avx512_4vnniw"), PROCESSOR_UNKNOWN,
1165 CPU_AVX512_4VNNIW_FLAGS, 0 },
620214f7
IT
1166 { STRING_COMMA_LEN (".avx512_vpopcntdq"), PROCESSOR_UNKNOWN,
1167 CPU_AVX512_VPOPCNTDQ_FLAGS, 0 },
53467f57
IT
1168 { STRING_COMMA_LEN (".avx512_vbmi2"), PROCESSOR_UNKNOWN,
1169 CPU_AVX512_VBMI2_FLAGS, 0 },
8cfcb765
IT
1170 { STRING_COMMA_LEN (".avx512_vnni"), PROCESSOR_UNKNOWN,
1171 CPU_AVX512_VNNI_FLAGS, 0 },
ee6872be
IT
1172 { STRING_COMMA_LEN (".avx512_bitalg"), PROCESSOR_UNKNOWN,
1173 CPU_AVX512_BITALG_FLAGS, 0 },
58bf9b6a
L
1174 { STRING_COMMA_LEN (".avx_vnni"), PROCESSOR_UNKNOWN,
1175 CPU_AVX_VNNI_FLAGS, 0 },
029f3522 1176 { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
293f5f65 1177 CPU_CLZERO_FLAGS, 0 },
9916071f 1178 { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
293f5f65 1179 CPU_MWAITX_FLAGS, 0 },
8eab4136 1180 { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
293f5f65 1181 CPU_OSPKE_FLAGS, 0 },
8bc52696 1182 { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
293f5f65 1183 CPU_RDPID_FLAGS, 0 },
6b40c462
L
1184 { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
1185 CPU_PTWRITE_FLAGS, 0 },
d777820b
IT
1186 { STRING_COMMA_LEN (".ibt"), PROCESSOR_UNKNOWN,
1187 CPU_IBT_FLAGS, 0 },
1188 { STRING_COMMA_LEN (".shstk"), PROCESSOR_UNKNOWN,
1189 CPU_SHSTK_FLAGS, 0 },
48521003
IT
1190 { STRING_COMMA_LEN (".gfni"), PROCESSOR_UNKNOWN,
1191 CPU_GFNI_FLAGS, 0 },
8dcf1fad
IT
1192 { STRING_COMMA_LEN (".vaes"), PROCESSOR_UNKNOWN,
1193 CPU_VAES_FLAGS, 0 },
ff1982d5
IT
1194 { STRING_COMMA_LEN (".vpclmulqdq"), PROCESSOR_UNKNOWN,
1195 CPU_VPCLMULQDQ_FLAGS, 0 },
3233d7d0
IT
1196 { STRING_COMMA_LEN (".wbnoinvd"), PROCESSOR_UNKNOWN,
1197 CPU_WBNOINVD_FLAGS, 0 },
be3a8dca
IT
1198 { STRING_COMMA_LEN (".pconfig"), PROCESSOR_UNKNOWN,
1199 CPU_PCONFIG_FLAGS, 0 },
de89d0a3
IT
1200 { STRING_COMMA_LEN (".waitpkg"), PROCESSOR_UNKNOWN,
1201 CPU_WAITPKG_FLAGS, 0 },
c48935d7
IT
1202 { STRING_COMMA_LEN (".cldemote"), PROCESSOR_UNKNOWN,
1203 CPU_CLDEMOTE_FLAGS, 0 },
260cd341
LC
1204 { STRING_COMMA_LEN (".amx_int8"), PROCESSOR_UNKNOWN,
1205 CPU_AMX_INT8_FLAGS, 0 },
1206 { STRING_COMMA_LEN (".amx_bf16"), PROCESSOR_UNKNOWN,
1207 CPU_AMX_BF16_FLAGS, 0 },
1208 { STRING_COMMA_LEN (".amx_tile"), PROCESSOR_UNKNOWN,
1209 CPU_AMX_TILE_FLAGS, 0 },
c0a30a9f
L
1210 { STRING_COMMA_LEN (".movdiri"), PROCESSOR_UNKNOWN,
1211 CPU_MOVDIRI_FLAGS, 0 },
1212 { STRING_COMMA_LEN (".movdir64b"), PROCESSOR_UNKNOWN,
1213 CPU_MOVDIR64B_FLAGS, 0 },
d6aab7a1
XG
1214 { STRING_COMMA_LEN (".avx512_bf16"), PROCESSOR_UNKNOWN,
1215 CPU_AVX512_BF16_FLAGS, 0 },
9186c494
L
1216 { STRING_COMMA_LEN (".avx512_vp2intersect"), PROCESSOR_UNKNOWN,
1217 CPU_AVX512_VP2INTERSECT_FLAGS, 0 },
81d54bb7
CL
1218 { STRING_COMMA_LEN (".tdx"), PROCESSOR_UNKNOWN,
1219 CPU_TDX_FLAGS, 0 },
dd455cf5
L
1220 { STRING_COMMA_LEN (".enqcmd"), PROCESSOR_UNKNOWN,
1221 CPU_ENQCMD_FLAGS, 0 },
4b27d27c
L
1222 { STRING_COMMA_LEN (".serialize"), PROCESSOR_UNKNOWN,
1223 CPU_SERIALIZE_FLAGS, 0 },
142861df
JB
1224 { STRING_COMMA_LEN (".rdpru"), PROCESSOR_UNKNOWN,
1225 CPU_RDPRU_FLAGS, 0 },
1226 { STRING_COMMA_LEN (".mcommit"), PROCESSOR_UNKNOWN,
1227 CPU_MCOMMIT_FLAGS, 0 },
a847e322
JB
1228 { STRING_COMMA_LEN (".sev_es"), PROCESSOR_UNKNOWN,
1229 CPU_SEV_ES_FLAGS, 0 },
bb651e8b
CL
1230 { STRING_COMMA_LEN (".tsxldtrk"), PROCESSOR_UNKNOWN,
1231 CPU_TSXLDTRK_FLAGS, 0 },
c4694f17
TG
1232 { STRING_COMMA_LEN (".kl"), PROCESSOR_UNKNOWN,
1233 CPU_KL_FLAGS, 0 },
1234 { STRING_COMMA_LEN (".widekl"), PROCESSOR_UNKNOWN,
1235 CPU_WIDEKL_FLAGS, 0 },
f64c42a9
LC
1236 { STRING_COMMA_LEN (".uintr"), PROCESSOR_UNKNOWN,
1237 CPU_UINTR_FLAGS, 0 },
c1fa250a
LC
1238 { STRING_COMMA_LEN (".hreset"), PROCESSOR_UNKNOWN,
1239 CPU_HRESET_FLAGS, 0 },
293f5f65
L
1240};
1241
1242static const noarch_entry cpu_noarch[] =
1243{
1244 { STRING_COMMA_LEN ("no87"), CPU_ANY_X87_FLAGS },
1848e567
L
1245 { STRING_COMMA_LEN ("no287"), CPU_ANY_287_FLAGS },
1246 { STRING_COMMA_LEN ("no387"), CPU_ANY_387_FLAGS },
1247 { STRING_COMMA_LEN ("no687"), CPU_ANY_687_FLAGS },
d871f3f4
L
1248 { STRING_COMMA_LEN ("nocmov"), CPU_ANY_CMOV_FLAGS },
1249 { STRING_COMMA_LEN ("nofxsr"), CPU_ANY_FXSR_FLAGS },
293f5f65
L
1250 { STRING_COMMA_LEN ("nommx"), CPU_ANY_MMX_FLAGS },
1251 { STRING_COMMA_LEN ("nosse"), CPU_ANY_SSE_FLAGS },
1848e567
L
1252 { STRING_COMMA_LEN ("nosse2"), CPU_ANY_SSE2_FLAGS },
1253 { STRING_COMMA_LEN ("nosse3"), CPU_ANY_SSE3_FLAGS },
af5c13b0 1254 { STRING_COMMA_LEN ("nosse4a"), CPU_ANY_SSE4A_FLAGS },
1848e567
L
1255 { STRING_COMMA_LEN ("nossse3"), CPU_ANY_SSSE3_FLAGS },
1256 { STRING_COMMA_LEN ("nosse4.1"), CPU_ANY_SSE4_1_FLAGS },
1257 { STRING_COMMA_LEN ("nosse4.2"), CPU_ANY_SSE4_2_FLAGS },
af5c13b0 1258 { STRING_COMMA_LEN ("nosse4"), CPU_ANY_SSE4_1_FLAGS },
293f5f65 1259 { STRING_COMMA_LEN ("noavx"), CPU_ANY_AVX_FLAGS },
1848e567 1260 { STRING_COMMA_LEN ("noavx2"), CPU_ANY_AVX2_FLAGS },
144b71e2
L
1261 { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
1262 { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
1263 { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
1264 { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
1265 { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
1266 { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
1267 { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
1268 { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
1269 { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
920d2ddc 1270 { STRING_COMMA_LEN ("noavx512_4fmaps"), CPU_ANY_AVX512_4FMAPS_FLAGS },
47acf0bd 1271 { STRING_COMMA_LEN ("noavx512_4vnniw"), CPU_ANY_AVX512_4VNNIW_FLAGS },
620214f7 1272 { STRING_COMMA_LEN ("noavx512_vpopcntdq"), CPU_ANY_AVX512_VPOPCNTDQ_FLAGS },
53467f57 1273 { STRING_COMMA_LEN ("noavx512_vbmi2"), CPU_ANY_AVX512_VBMI2_FLAGS },
8cfcb765 1274 { STRING_COMMA_LEN ("noavx512_vnni"), CPU_ANY_AVX512_VNNI_FLAGS },
ee6872be 1275 { STRING_COMMA_LEN ("noavx512_bitalg"), CPU_ANY_AVX512_BITALG_FLAGS },
58bf9b6a 1276 { STRING_COMMA_LEN ("noavx_vnni"), CPU_ANY_AVX_VNNI_FLAGS },
d777820b
IT
1277 { STRING_COMMA_LEN ("noibt"), CPU_ANY_IBT_FLAGS },
1278 { STRING_COMMA_LEN ("noshstk"), CPU_ANY_SHSTK_FLAGS },
260cd341
LC
1279 { STRING_COMMA_LEN ("noamx_int8"), CPU_ANY_AMX_INT8_FLAGS },
1280 { STRING_COMMA_LEN ("noamx_bf16"), CPU_ANY_AMX_BF16_FLAGS },
1281 { STRING_COMMA_LEN ("noamx_tile"), CPU_ANY_AMX_TILE_FLAGS },
c0a30a9f
L
1282 { STRING_COMMA_LEN ("nomovdiri"), CPU_ANY_MOVDIRI_FLAGS },
1283 { STRING_COMMA_LEN ("nomovdir64b"), CPU_ANY_MOVDIR64B_FLAGS },
d6aab7a1 1284 { STRING_COMMA_LEN ("noavx512_bf16"), CPU_ANY_AVX512_BF16_FLAGS },
708a2fff
CL
1285 { STRING_COMMA_LEN ("noavx512_vp2intersect"),
1286 CPU_ANY_AVX512_VP2INTERSECT_FLAGS },
81d54bb7 1287 { STRING_COMMA_LEN ("notdx"), CPU_ANY_TDX_FLAGS },
dd455cf5 1288 { STRING_COMMA_LEN ("noenqcmd"), CPU_ANY_ENQCMD_FLAGS },
4b27d27c 1289 { STRING_COMMA_LEN ("noserialize"), CPU_ANY_SERIALIZE_FLAGS },
bb651e8b 1290 { STRING_COMMA_LEN ("notsxldtrk"), CPU_ANY_TSXLDTRK_FLAGS },
c4694f17
TG
1291 { STRING_COMMA_LEN ("nokl"), CPU_ANY_KL_FLAGS },
1292 { STRING_COMMA_LEN ("nowidekl"), CPU_ANY_WIDEKL_FLAGS },
f64c42a9 1293 { STRING_COMMA_LEN ("nouintr"), CPU_ANY_UINTR_FLAGS },
c1fa250a 1294 { STRING_COMMA_LEN ("nohreset"), CPU_ANY_HRESET_FLAGS },
e413e4e9
AM
1295};
1296
704209c0 1297#ifdef I386COFF
a6c24e68
NC
1298/* Like s_lcomm_internal in gas/read.c but the alignment string
1299 is allowed to be optional. */
1300
1301static symbolS *
1302pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1303{
1304 addressT align = 0;
1305
1306 SKIP_WHITESPACE ();
1307
7ab9ffdd 1308 if (needs_align
a6c24e68
NC
1309 && *input_line_pointer == ',')
1310 {
1311 align = parse_align (needs_align - 1);
7ab9ffdd 1312
a6c24e68
NC
1313 if (align == (addressT) -1)
1314 return NULL;
1315 }
1316 else
1317 {
1318 if (size >= 8)
1319 align = 3;
1320 else if (size >= 4)
1321 align = 2;
1322 else if (size >= 2)
1323 align = 1;
1324 else
1325 align = 0;
1326 }
1327
1328 bss_alloc (symbolP, size, align);
1329 return symbolP;
1330}
1331
704209c0 1332static void
a6c24e68
NC
1333pe_lcomm (int needs_align)
1334{
1335 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1336}
704209c0 1337#endif
a6c24e68 1338
29b0f896
AM
1339const pseudo_typeS md_pseudo_table[] =
1340{
1341#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1342 {"align", s_align_bytes, 0},
1343#else
1344 {"align", s_align_ptwo, 0},
1345#endif
1346 {"arch", set_cpu_arch, 0},
1347#ifndef I386COFF
1348 {"bss", s_bss, 0},
a6c24e68
NC
1349#else
1350 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1351#endif
1352 {"ffloat", float_cons, 'f'},
1353 {"dfloat", float_cons, 'd'},
1354 {"tfloat", float_cons, 'x'},
1355 {"value", cons, 2},
d182319b 1356 {"slong", signed_cons, 4},
29b0f896
AM
1357 {"noopt", s_ignore, 0},
1358 {"optim", s_ignore, 0},
1359 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1360 {"code16", set_code_flag, CODE_16BIT},
1361 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1362#ifdef BFD64
29b0f896 1363 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1364#endif
29b0f896
AM
1365 {"intel_syntax", set_intel_syntax, 1},
1366 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1367 {"intel_mnemonic", set_intel_mnemonic, 1},
1368 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1369 {"allow_index_reg", set_allow_index_reg, 1},
1370 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1371 {"sse_check", set_check, 0},
1372 {"operand_check", set_check, 1},
3b22753a
L
1373#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1374 {"largecomm", handle_large_common, 0},
07a53e5c 1375#else
68d20676 1376 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1377 {"loc", dwarf2_directive_loc, 0},
1378 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1379#endif
6482c264
NC
1380#ifdef TE_PE
1381 {"secrel32", pe_directive_secrel, 0},
1382#endif
29b0f896
AM
1383 {0, 0, 0}
1384};
1385
1386/* For interface with expression (). */
1387extern char *input_line_pointer;
1388
1389/* Hash table for instruction mnemonic lookup. */
629310ab 1390static htab_t op_hash;
29b0f896
AM
1391
1392/* Hash table for register lookup. */
629310ab 1393static htab_t reg_hash;
29b0f896 1394\f
ce8a8b2f
AM
1395 /* Various efficient no-op patterns for aligning code labels.
1396 Note: Don't try to assemble the instructions in the comments.
1397 0L and 0w are not legal. */
62a02d25
L
1398static const unsigned char f32_1[] =
1399 {0x90}; /* nop */
1400static const unsigned char f32_2[] =
1401 {0x66,0x90}; /* xchg %ax,%ax */
1402static const unsigned char f32_3[] =
1403 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1404static const unsigned char f32_4[] =
1405 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
62a02d25
L
1406static const unsigned char f32_6[] =
1407 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1408static const unsigned char f32_7[] =
1409 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
62a02d25 1410static const unsigned char f16_3[] =
3ae729d5 1411 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
62a02d25 1412static const unsigned char f16_4[] =
3ae729d5
L
1413 {0x8d,0xb4,0x00,0x00}; /* lea 0W(%si),%si */
1414static const unsigned char jump_disp8[] =
1415 {0xeb}; /* jmp disp8 */
1416static const unsigned char jump32_disp32[] =
1417 {0xe9}; /* jmp disp32 */
1418static const unsigned char jump16_disp32[] =
1419 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1420/* 32-bit NOPs patterns. */
1421static const unsigned char *const f32_patt[] = {
3ae729d5 1422 f32_1, f32_2, f32_3, f32_4, NULL, f32_6, f32_7
62a02d25
L
1423};
1424/* 16-bit NOPs patterns. */
1425static const unsigned char *const f16_patt[] = {
3ae729d5 1426 f32_1, f32_2, f16_3, f16_4
62a02d25
L
1427};
1428/* nopl (%[re]ax) */
1429static const unsigned char alt_3[] =
1430 {0x0f,0x1f,0x00};
1431/* nopl 0(%[re]ax) */
1432static const unsigned char alt_4[] =
1433 {0x0f,0x1f,0x40,0x00};
1434/* nopl 0(%[re]ax,%[re]ax,1) */
1435static const unsigned char alt_5[] =
1436 {0x0f,0x1f,0x44,0x00,0x00};
1437/* nopw 0(%[re]ax,%[re]ax,1) */
1438static const unsigned char alt_6[] =
1439 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1440/* nopl 0L(%[re]ax) */
1441static const unsigned char alt_7[] =
1442 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1443/* nopl 0L(%[re]ax,%[re]ax,1) */
1444static const unsigned char alt_8[] =
1445 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1446/* nopw 0L(%[re]ax,%[re]ax,1) */
1447static const unsigned char alt_9[] =
1448 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1449/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1450static const unsigned char alt_10[] =
1451 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
3ae729d5
L
1452/* data16 nopw %cs:0L(%eax,%eax,1) */
1453static const unsigned char alt_11[] =
1454 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1455/* 32-bit and 64-bit NOPs patterns. */
1456static const unsigned char *const alt_patt[] = {
1457 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1458 alt_9, alt_10, alt_11
62a02d25
L
1459};
1460
1461/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1462 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1463
1464static void
1465i386_output_nops (char *where, const unsigned char *const *patt,
1466 int count, int max_single_nop_size)
1467
1468{
3ae729d5
L
1469 /* Place the longer NOP first. */
1470 int last;
1471 int offset;
3076e594
NC
1472 const unsigned char *nops;
1473
1474 if (max_single_nop_size < 1)
1475 {
1476 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1477 max_single_nop_size);
1478 return;
1479 }
1480
1481 nops = patt[max_single_nop_size - 1];
3ae729d5
L
1482
1483 /* Use the smaller one if the requsted one isn't available. */
1484 if (nops == NULL)
62a02d25 1485 {
3ae729d5
L
1486 max_single_nop_size--;
1487 nops = patt[max_single_nop_size - 1];
62a02d25
L
1488 }
1489
3ae729d5
L
1490 last = count % max_single_nop_size;
1491
1492 count -= last;
1493 for (offset = 0; offset < count; offset += max_single_nop_size)
1494 memcpy (where + offset, nops, max_single_nop_size);
1495
1496 if (last)
1497 {
1498 nops = patt[last - 1];
1499 if (nops == NULL)
1500 {
1501 /* Use the smaller one plus one-byte NOP if the needed one
1502 isn't available. */
1503 last--;
1504 nops = patt[last - 1];
1505 memcpy (where + offset, nops, last);
1506 where[offset + last] = *patt[0];
1507 }
1508 else
1509 memcpy (where + offset, nops, last);
1510 }
62a02d25
L
1511}
1512
3ae729d5
L
1513static INLINE int
1514fits_in_imm7 (offsetT num)
1515{
1516 return (num & 0x7f) == num;
1517}
1518
1519static INLINE int
1520fits_in_imm31 (offsetT num)
1521{
1522 return (num & 0x7fffffff) == num;
1523}
62a02d25
L
1524
1525/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1526 single NOP instruction LIMIT. */
1527
1528void
3ae729d5 1529i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1530{
3ae729d5 1531 const unsigned char *const *patt = NULL;
62a02d25 1532 int max_single_nop_size;
3ae729d5
L
1533 /* Maximum number of NOPs before switching to jump over NOPs. */
1534 int max_number_of_nops;
62a02d25 1535
3ae729d5 1536 switch (fragP->fr_type)
62a02d25 1537 {
3ae729d5
L
1538 case rs_fill_nop:
1539 case rs_align_code:
1540 break;
e379e5f3
L
1541 case rs_machine_dependent:
1542 /* Allow NOP padding for jumps and calls. */
1543 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
1544 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
1545 break;
1546 /* Fall through. */
3ae729d5 1547 default:
62a02d25
L
1548 return;
1549 }
1550
ccc9c027
L
1551 /* We need to decide which NOP sequence to use for 32bit and
1552 64bit. When -mtune= is used:
4eed87de 1553
76bc74dc
L
1554 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
1555 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1556 2. For the rest, alt_patt will be used.
1557
1558 When -mtune= isn't used, alt_patt will be used if
22109423 1559 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will
76bc74dc 1560 be used.
ccc9c027
L
1561
1562 When -march= or .arch is used, we can't use anything beyond
1563 cpu_arch_isa_flags. */
1564
1565 if (flag_code == CODE_16BIT)
1566 {
3ae729d5
L
1567 patt = f16_patt;
1568 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1569 /* Limit number of NOPs to 2 in 16-bit mode. */
1570 max_number_of_nops = 2;
252b5132 1571 }
33fef721 1572 else
ccc9c027 1573 {
fbf3f584 1574 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027
L
1575 {
1576 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
1577 switch (cpu_arch_tune)
1578 {
1579 case PROCESSOR_UNKNOWN:
1580 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423
L
1581 optimize with nops. */
1582 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1583 patt = alt_patt;
ccc9c027
L
1584 else
1585 patt = f32_patt;
1586 break;
ccc9c027
L
1587 case PROCESSOR_PENTIUM4:
1588 case PROCESSOR_NOCONA:
ef05d495 1589 case PROCESSOR_CORE:
76bc74dc 1590 case PROCESSOR_CORE2:
bd5295b2 1591 case PROCESSOR_COREI7:
3632d14b 1592 case PROCESSOR_L1OM:
7a9068fe 1593 case PROCESSOR_K1OM:
76bc74dc 1594 case PROCESSOR_GENERIC64:
ccc9c027
L
1595 case PROCESSOR_K6:
1596 case PROCESSOR_ATHLON:
1597 case PROCESSOR_K8:
4eed87de 1598 case PROCESSOR_AMDFAM10:
8aedb9fe 1599 case PROCESSOR_BD:
029f3522 1600 case PROCESSOR_ZNVER:
7b458c12 1601 case PROCESSOR_BT:
80b8656c 1602 patt = alt_patt;
ccc9c027 1603 break;
76bc74dc 1604 case PROCESSOR_I386:
ccc9c027
L
1605 case PROCESSOR_I486:
1606 case PROCESSOR_PENTIUM:
2dde1948 1607 case PROCESSOR_PENTIUMPRO:
81486035 1608 case PROCESSOR_IAMCU:
ccc9c027
L
1609 case PROCESSOR_GENERIC32:
1610 patt = f32_patt;
1611 break;
4eed87de 1612 }
ccc9c027
L
1613 }
1614 else
1615 {
fbf3f584 1616 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1617 {
1618 case PROCESSOR_UNKNOWN:
e6a14101 1619 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1620 PROCESSOR_UNKNOWN. */
1621 abort ();
1622 break;
1623
76bc74dc 1624 case PROCESSOR_I386:
ccc9c027
L
1625 case PROCESSOR_I486:
1626 case PROCESSOR_PENTIUM:
81486035 1627 case PROCESSOR_IAMCU:
ccc9c027
L
1628 case PROCESSOR_K6:
1629 case PROCESSOR_ATHLON:
1630 case PROCESSOR_K8:
4eed87de 1631 case PROCESSOR_AMDFAM10:
8aedb9fe 1632 case PROCESSOR_BD:
029f3522 1633 case PROCESSOR_ZNVER:
7b458c12 1634 case PROCESSOR_BT:
ccc9c027
L
1635 case PROCESSOR_GENERIC32:
1636 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423
L
1637 with nops. */
1638 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1639 patt = alt_patt;
ccc9c027
L
1640 else
1641 patt = f32_patt;
1642 break;
76bc74dc
L
1643 case PROCESSOR_PENTIUMPRO:
1644 case PROCESSOR_PENTIUM4:
1645 case PROCESSOR_NOCONA:
1646 case PROCESSOR_CORE:
ef05d495 1647 case PROCESSOR_CORE2:
bd5295b2 1648 case PROCESSOR_COREI7:
3632d14b 1649 case PROCESSOR_L1OM:
7a9068fe 1650 case PROCESSOR_K1OM:
22109423 1651 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1652 patt = alt_patt;
ccc9c027
L
1653 else
1654 patt = f32_patt;
1655 break;
1656 case PROCESSOR_GENERIC64:
80b8656c 1657 patt = alt_patt;
ccc9c027 1658 break;
4eed87de 1659 }
ccc9c027
L
1660 }
1661
76bc74dc
L
1662 if (patt == f32_patt)
1663 {
3ae729d5
L
1664 max_single_nop_size = sizeof (f32_patt) / sizeof (f32_patt[0]);
1665 /* Limit number of NOPs to 2 for older processors. */
1666 max_number_of_nops = 2;
76bc74dc
L
1667 }
1668 else
1669 {
3ae729d5
L
1670 max_single_nop_size = sizeof (alt_patt) / sizeof (alt_patt[0]);
1671 /* Limit number of NOPs to 7 for newer processors. */
1672 max_number_of_nops = 7;
1673 }
1674 }
1675
1676 if (limit == 0)
1677 limit = max_single_nop_size;
1678
1679 if (fragP->fr_type == rs_fill_nop)
1680 {
1681 /* Output NOPs for .nop directive. */
1682 if (limit > max_single_nop_size)
1683 {
1684 as_bad_where (fragP->fr_file, fragP->fr_line,
1685 _("invalid single nop size: %d "
1686 "(expect within [0, %d])"),
1687 limit, max_single_nop_size);
1688 return;
1689 }
1690 }
e379e5f3 1691 else if (fragP->fr_type != rs_machine_dependent)
3ae729d5
L
1692 fragP->fr_var = count;
1693
1694 if ((count / max_single_nop_size) > max_number_of_nops)
1695 {
1696 /* Generate jump over NOPs. */
1697 offsetT disp = count - 2;
1698 if (fits_in_imm7 (disp))
1699 {
1700 /* Use "jmp disp8" if possible. */
1701 count = disp;
1702 where[0] = jump_disp8[0];
1703 where[1] = count;
1704 where += 2;
1705 }
1706 else
1707 {
1708 unsigned int size_of_jump;
1709
1710 if (flag_code == CODE_16BIT)
1711 {
1712 where[0] = jump16_disp32[0];
1713 where[1] = jump16_disp32[1];
1714 size_of_jump = 2;
1715 }
1716 else
1717 {
1718 where[0] = jump32_disp32[0];
1719 size_of_jump = 1;
1720 }
1721
1722 count -= size_of_jump + 4;
1723 if (!fits_in_imm31 (count))
1724 {
1725 as_bad_where (fragP->fr_file, fragP->fr_line,
1726 _("jump over nop padding out of range"));
1727 return;
1728 }
1729
1730 md_number_to_chars (where + size_of_jump, count, 4);
1731 where += size_of_jump + 4;
76bc74dc 1732 }
ccc9c027 1733 }
3ae729d5
L
1734
1735 /* Generate multiple NOPs. */
1736 i386_output_nops (where, patt, count, limit);
252b5132
RH
1737}
1738
c6fb90c8 1739static INLINE int
0dfbf9d7 1740operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1741{
0dfbf9d7 1742 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1743 {
1744 case 3:
0dfbf9d7 1745 if (x->array[2])
c6fb90c8 1746 return 0;
1a0670f3 1747 /* Fall through. */
c6fb90c8 1748 case 2:
0dfbf9d7 1749 if (x->array[1])
c6fb90c8 1750 return 0;
1a0670f3 1751 /* Fall through. */
c6fb90c8 1752 case 1:
0dfbf9d7 1753 return !x->array[0];
c6fb90c8
L
1754 default:
1755 abort ();
1756 }
40fb9820
L
1757}
1758
c6fb90c8 1759static INLINE void
0dfbf9d7 1760operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1761{
0dfbf9d7 1762 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1763 {
1764 case 3:
0dfbf9d7 1765 x->array[2] = v;
1a0670f3 1766 /* Fall through. */
c6fb90c8 1767 case 2:
0dfbf9d7 1768 x->array[1] = v;
1a0670f3 1769 /* Fall through. */
c6fb90c8 1770 case 1:
0dfbf9d7 1771 x->array[0] = v;
1a0670f3 1772 /* Fall through. */
c6fb90c8
L
1773 break;
1774 default:
1775 abort ();
1776 }
bab6aec1
JB
1777
1778 x->bitfield.class = ClassNone;
75e5731b 1779 x->bitfield.instance = InstanceNone;
c6fb90c8 1780}
40fb9820 1781
c6fb90c8 1782static INLINE int
0dfbf9d7
L
1783operand_type_equal (const union i386_operand_type *x,
1784 const union i386_operand_type *y)
c6fb90c8 1785{
0dfbf9d7 1786 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1787 {
1788 case 3:
0dfbf9d7 1789 if (x->array[2] != y->array[2])
c6fb90c8 1790 return 0;
1a0670f3 1791 /* Fall through. */
c6fb90c8 1792 case 2:
0dfbf9d7 1793 if (x->array[1] != y->array[1])
c6fb90c8 1794 return 0;
1a0670f3 1795 /* Fall through. */
c6fb90c8 1796 case 1:
0dfbf9d7 1797 return x->array[0] == y->array[0];
c6fb90c8
L
1798 break;
1799 default:
1800 abort ();
1801 }
1802}
40fb9820 1803
0dfbf9d7
L
1804static INLINE int
1805cpu_flags_all_zero (const union i386_cpu_flags *x)
1806{
1807 switch (ARRAY_SIZE(x->array))
1808 {
53467f57
IT
1809 case 4:
1810 if (x->array[3])
1811 return 0;
1812 /* Fall through. */
0dfbf9d7
L
1813 case 3:
1814 if (x->array[2])
1815 return 0;
1a0670f3 1816 /* Fall through. */
0dfbf9d7
L
1817 case 2:
1818 if (x->array[1])
1819 return 0;
1a0670f3 1820 /* Fall through. */
0dfbf9d7
L
1821 case 1:
1822 return !x->array[0];
1823 default:
1824 abort ();
1825 }
1826}
1827
0dfbf9d7
L
1828static INLINE int
1829cpu_flags_equal (const union i386_cpu_flags *x,
1830 const union i386_cpu_flags *y)
1831{
1832 switch (ARRAY_SIZE(x->array))
1833 {
53467f57
IT
1834 case 4:
1835 if (x->array[3] != y->array[3])
1836 return 0;
1837 /* Fall through. */
0dfbf9d7
L
1838 case 3:
1839 if (x->array[2] != y->array[2])
1840 return 0;
1a0670f3 1841 /* Fall through. */
0dfbf9d7
L
1842 case 2:
1843 if (x->array[1] != y->array[1])
1844 return 0;
1a0670f3 1845 /* Fall through. */
0dfbf9d7
L
1846 case 1:
1847 return x->array[0] == y->array[0];
1848 break;
1849 default:
1850 abort ();
1851 }
1852}
c6fb90c8
L
1853
1854static INLINE int
1855cpu_flags_check_cpu64 (i386_cpu_flags f)
1856{
1857 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
1858 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
1859}
1860
c6fb90c8
L
1861static INLINE i386_cpu_flags
1862cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1863{
c6fb90c8
L
1864 switch (ARRAY_SIZE (x.array))
1865 {
53467f57
IT
1866 case 4:
1867 x.array [3] &= y.array [3];
1868 /* Fall through. */
c6fb90c8
L
1869 case 3:
1870 x.array [2] &= y.array [2];
1a0670f3 1871 /* Fall through. */
c6fb90c8
L
1872 case 2:
1873 x.array [1] &= y.array [1];
1a0670f3 1874 /* Fall through. */
c6fb90c8
L
1875 case 1:
1876 x.array [0] &= y.array [0];
1877 break;
1878 default:
1879 abort ();
1880 }
1881 return x;
1882}
40fb9820 1883
c6fb90c8
L
1884static INLINE i386_cpu_flags
1885cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1886{
c6fb90c8 1887 switch (ARRAY_SIZE (x.array))
40fb9820 1888 {
53467f57
IT
1889 case 4:
1890 x.array [3] |= y.array [3];
1891 /* Fall through. */
c6fb90c8
L
1892 case 3:
1893 x.array [2] |= y.array [2];
1a0670f3 1894 /* Fall through. */
c6fb90c8
L
1895 case 2:
1896 x.array [1] |= y.array [1];
1a0670f3 1897 /* Fall through. */
c6fb90c8
L
1898 case 1:
1899 x.array [0] |= y.array [0];
40fb9820
L
1900 break;
1901 default:
1902 abort ();
1903 }
40fb9820
L
1904 return x;
1905}
1906
309d3373
JB
1907static INLINE i386_cpu_flags
1908cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1909{
1910 switch (ARRAY_SIZE (x.array))
1911 {
53467f57
IT
1912 case 4:
1913 x.array [3] &= ~y.array [3];
1914 /* Fall through. */
309d3373
JB
1915 case 3:
1916 x.array [2] &= ~y.array [2];
1a0670f3 1917 /* Fall through. */
309d3373
JB
1918 case 2:
1919 x.array [1] &= ~y.array [1];
1a0670f3 1920 /* Fall through. */
309d3373
JB
1921 case 1:
1922 x.array [0] &= ~y.array [0];
1923 break;
1924 default:
1925 abort ();
1926 }
1927 return x;
1928}
1929
6c0946d0
JB
1930static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
1931
c0f3af97
L
1932#define CPU_FLAGS_ARCH_MATCH 0x1
1933#define CPU_FLAGS_64BIT_MATCH 0x2
1934
c0f3af97 1935#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1936 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1937
1938/* Return CPU flags match bits. */
3629bb00 1939
40fb9820 1940static int
d3ce72d0 1941cpu_flags_match (const insn_template *t)
40fb9820 1942{
c0f3af97
L
1943 i386_cpu_flags x = t->cpu_flags;
1944 int match = cpu_flags_check_cpu64 (x) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820
L
1945
1946 x.bitfield.cpu64 = 0;
1947 x.bitfield.cpuno64 = 0;
1948
0dfbf9d7 1949 if (cpu_flags_all_zero (&x))
c0f3af97
L
1950 {
1951 /* This instruction is available on all archs. */
db12e14e 1952 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1953 }
3629bb00
L
1954 else
1955 {
c0f3af97 1956 /* This instruction is available only on some archs. */
3629bb00
L
1957 i386_cpu_flags cpu = cpu_arch_flags;
1958
ab592e75
JB
1959 /* AVX512VL is no standalone feature - match it and then strip it. */
1960 if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl)
1961 return match;
1962 x.bitfield.cpuavx512vl = 0;
1963
3629bb00 1964 cpu = cpu_flags_and (x, cpu);
c0f3af97
L
1965 if (!cpu_flags_all_zero (&cpu))
1966 {
57392598 1967 if (x.bitfield.cpuavx)
a5ff0eb2 1968 {
929f69fa 1969 /* We need to check a few extra flags with AVX. */
b9d49817 1970 if (cpu.bitfield.cpuavx
40d231b4
JB
1971 && (!t->opcode_modifier.sse2avx
1972 || (sse2avx && !i.prefix[DATA_PREFIX]))
b9d49817 1973 && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
929f69fa 1974 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
b9d49817
JB
1975 && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
1976 match |= CPU_FLAGS_ARCH_MATCH;
a5ff0eb2 1977 }
929f69fa
JB
1978 else if (x.bitfield.cpuavx512f)
1979 {
1980 /* We need to check a few extra flags with AVX512F. */
1981 if (cpu.bitfield.cpuavx512f
1982 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
1983 && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes)
1984 && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq))
1985 match |= CPU_FLAGS_ARCH_MATCH;
1986 }
a5ff0eb2 1987 else
db12e14e 1988 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1989 }
3629bb00 1990 }
c0f3af97 1991 return match;
40fb9820
L
1992}
1993
c6fb90c8
L
1994static INLINE i386_operand_type
1995operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 1996{
bab6aec1
JB
1997 if (x.bitfield.class != y.bitfield.class)
1998 x.bitfield.class = ClassNone;
75e5731b
JB
1999 if (x.bitfield.instance != y.bitfield.instance)
2000 x.bitfield.instance = InstanceNone;
bab6aec1 2001
c6fb90c8
L
2002 switch (ARRAY_SIZE (x.array))
2003 {
2004 case 3:
2005 x.array [2] &= y.array [2];
1a0670f3 2006 /* Fall through. */
c6fb90c8
L
2007 case 2:
2008 x.array [1] &= y.array [1];
1a0670f3 2009 /* Fall through. */
c6fb90c8
L
2010 case 1:
2011 x.array [0] &= y.array [0];
2012 break;
2013 default:
2014 abort ();
2015 }
2016 return x;
40fb9820
L
2017}
2018
73053c1f
JB
2019static INLINE i386_operand_type
2020operand_type_and_not (i386_operand_type x, i386_operand_type y)
2021{
bab6aec1 2022 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2023 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2024
73053c1f
JB
2025 switch (ARRAY_SIZE (x.array))
2026 {
2027 case 3:
2028 x.array [2] &= ~y.array [2];
2029 /* Fall through. */
2030 case 2:
2031 x.array [1] &= ~y.array [1];
2032 /* Fall through. */
2033 case 1:
2034 x.array [0] &= ~y.array [0];
2035 break;
2036 default:
2037 abort ();
2038 }
2039 return x;
2040}
2041
c6fb90c8
L
2042static INLINE i386_operand_type
2043operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 2044{
bab6aec1
JB
2045 gas_assert (x.bitfield.class == ClassNone ||
2046 y.bitfield.class == ClassNone ||
2047 x.bitfield.class == y.bitfield.class);
75e5731b
JB
2048 gas_assert (x.bitfield.instance == InstanceNone ||
2049 y.bitfield.instance == InstanceNone ||
2050 x.bitfield.instance == y.bitfield.instance);
bab6aec1 2051
c6fb90c8 2052 switch (ARRAY_SIZE (x.array))
40fb9820 2053 {
c6fb90c8
L
2054 case 3:
2055 x.array [2] |= y.array [2];
1a0670f3 2056 /* Fall through. */
c6fb90c8
L
2057 case 2:
2058 x.array [1] |= y.array [1];
1a0670f3 2059 /* Fall through. */
c6fb90c8
L
2060 case 1:
2061 x.array [0] |= y.array [0];
40fb9820
L
2062 break;
2063 default:
2064 abort ();
2065 }
c6fb90c8
L
2066 return x;
2067}
40fb9820 2068
c6fb90c8
L
2069static INLINE i386_operand_type
2070operand_type_xor (i386_operand_type x, i386_operand_type y)
2071{
bab6aec1 2072 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2073 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2074
c6fb90c8
L
2075 switch (ARRAY_SIZE (x.array))
2076 {
2077 case 3:
2078 x.array [2] ^= y.array [2];
1a0670f3 2079 /* Fall through. */
c6fb90c8
L
2080 case 2:
2081 x.array [1] ^= y.array [1];
1a0670f3 2082 /* Fall through. */
c6fb90c8
L
2083 case 1:
2084 x.array [0] ^= y.array [0];
2085 break;
2086 default:
2087 abort ();
2088 }
40fb9820
L
2089 return x;
2090}
2091
40fb9820
L
2092static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
2093static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
2094static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
2095static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
bab6aec1
JB
2096static const i386_operand_type anydisp = OPERAND_TYPE_ANYDISP;
2097static const i386_operand_type anyimm = OPERAND_TYPE_ANYIMM;
40fb9820 2098static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
43234a1e 2099static const i386_operand_type regmask = OPERAND_TYPE_REGMASK;
40fb9820
L
2100static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
2101static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
2102static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
2103static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
2104static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
2105static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
2106static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
2107static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
2108static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
2109
2110enum operand_type
2111{
2112 reg,
40fb9820
L
2113 imm,
2114 disp,
2115 anymem
2116};
2117
c6fb90c8 2118static INLINE int
40fb9820
L
2119operand_type_check (i386_operand_type t, enum operand_type c)
2120{
2121 switch (c)
2122 {
2123 case reg:
bab6aec1 2124 return t.bitfield.class == Reg;
40fb9820 2125
40fb9820
L
2126 case imm:
2127 return (t.bitfield.imm8
2128 || t.bitfield.imm8s
2129 || t.bitfield.imm16
2130 || t.bitfield.imm32
2131 || t.bitfield.imm32s
2132 || t.bitfield.imm64);
2133
2134 case disp:
2135 return (t.bitfield.disp8
2136 || t.bitfield.disp16
2137 || t.bitfield.disp32
2138 || t.bitfield.disp32s
2139 || t.bitfield.disp64);
2140
2141 case anymem:
2142 return (t.bitfield.disp8
2143 || t.bitfield.disp16
2144 || t.bitfield.disp32
2145 || t.bitfield.disp32s
2146 || t.bitfield.disp64
2147 || t.bitfield.baseindex);
2148
2149 default:
2150 abort ();
2151 }
2cfe26b6
AM
2152
2153 return 0;
40fb9820
L
2154}
2155
7a54636a
L
2156/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
2157 between operand GIVEN and opeand WANTED for instruction template T. */
5c07affc
L
2158
2159static INLINE int
7a54636a
L
2160match_operand_size (const insn_template *t, unsigned int wanted,
2161 unsigned int given)
5c07affc 2162{
3ac21baa
JB
2163 return !((i.types[given].bitfield.byte
2164 && !t->operand_types[wanted].bitfield.byte)
2165 || (i.types[given].bitfield.word
2166 && !t->operand_types[wanted].bitfield.word)
2167 || (i.types[given].bitfield.dword
2168 && !t->operand_types[wanted].bitfield.dword)
2169 || (i.types[given].bitfield.qword
2170 && !t->operand_types[wanted].bitfield.qword)
2171 || (i.types[given].bitfield.tbyte
2172 && !t->operand_types[wanted].bitfield.tbyte));
5c07affc
L
2173}
2174
dd40ce22
L
2175/* Return 1 if there is no conflict in SIMD register between operand
2176 GIVEN and opeand WANTED for instruction template T. */
1b54b8d7
JB
2177
2178static INLINE int
dd40ce22
L
2179match_simd_size (const insn_template *t, unsigned int wanted,
2180 unsigned int given)
1b54b8d7 2181{
3ac21baa
JB
2182 return !((i.types[given].bitfield.xmmword
2183 && !t->operand_types[wanted].bitfield.xmmword)
2184 || (i.types[given].bitfield.ymmword
2185 && !t->operand_types[wanted].bitfield.ymmword)
2186 || (i.types[given].bitfield.zmmword
260cd341
LC
2187 && !t->operand_types[wanted].bitfield.zmmword)
2188 || (i.types[given].bitfield.tmmword
2189 && !t->operand_types[wanted].bitfield.tmmword));
1b54b8d7
JB
2190}
2191
7a54636a
L
2192/* Return 1 if there is no conflict in any size between operand GIVEN
2193 and opeand WANTED for instruction template T. */
5c07affc
L
2194
2195static INLINE int
dd40ce22
L
2196match_mem_size (const insn_template *t, unsigned int wanted,
2197 unsigned int given)
5c07affc 2198{
7a54636a 2199 return (match_operand_size (t, wanted, given)
3ac21baa 2200 && !((i.types[given].bitfield.unspecified
5273a3cd 2201 && !i.broadcast.type
3ac21baa
JB
2202 && !t->operand_types[wanted].bitfield.unspecified)
2203 || (i.types[given].bitfield.fword
2204 && !t->operand_types[wanted].bitfield.fword)
1b54b8d7
JB
2205 /* For scalar opcode templates to allow register and memory
2206 operands at the same time, some special casing is needed
d6793fa1
JB
2207 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2208 down-conversion vpmov*. */
3528c362 2209 || ((t->operand_types[wanted].bitfield.class == RegSIMD
bc49bfd8
JB
2210 && t->operand_types[wanted].bitfield.byte
2211 + t->operand_types[wanted].bitfield.word
2212 + t->operand_types[wanted].bitfield.dword
2213 + t->operand_types[wanted].bitfield.qword
2214 > !!t->opcode_modifier.broadcast)
3ac21baa
JB
2215 ? (i.types[given].bitfield.xmmword
2216 || i.types[given].bitfield.ymmword
2217 || i.types[given].bitfield.zmmword)
2218 : !match_simd_size(t, wanted, given))));
5c07affc
L
2219}
2220
3ac21baa
JB
2221/* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2222 operands for instruction template T, and it has MATCH_REVERSE set if there
2223 is no size conflict on any operands for the template with operands reversed
2224 (and the template allows for reversing in the first place). */
5c07affc 2225
3ac21baa
JB
2226#define MATCH_STRAIGHT 1
2227#define MATCH_REVERSE 2
2228
2229static INLINE unsigned int
d3ce72d0 2230operand_size_match (const insn_template *t)
5c07affc 2231{
3ac21baa 2232 unsigned int j, match = MATCH_STRAIGHT;
5c07affc 2233
0cfa3eb3 2234 /* Don't check non-absolute jump instructions. */
5c07affc 2235 if (t->opcode_modifier.jump
0cfa3eb3 2236 && t->opcode_modifier.jump != JUMP_ABSOLUTE)
5c07affc
L
2237 return match;
2238
2239 /* Check memory and accumulator operand size. */
2240 for (j = 0; j < i.operands; j++)
2241 {
3528c362
JB
2242 if (i.types[j].bitfield.class != Reg
2243 && i.types[j].bitfield.class != RegSIMD
601e8564 2244 && t->opcode_modifier.anysize)
5c07affc
L
2245 continue;
2246
bab6aec1 2247 if (t->operand_types[j].bitfield.class == Reg
7a54636a 2248 && !match_operand_size (t, j, j))
5c07affc
L
2249 {
2250 match = 0;
2251 break;
2252 }
2253
3528c362 2254 if (t->operand_types[j].bitfield.class == RegSIMD
3ac21baa 2255 && !match_simd_size (t, j, j))
1b54b8d7
JB
2256 {
2257 match = 0;
2258 break;
2259 }
2260
75e5731b 2261 if (t->operand_types[j].bitfield.instance == Accum
7a54636a 2262 && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
1b54b8d7
JB
2263 {
2264 match = 0;
2265 break;
2266 }
2267
c48dadc9 2268 if ((i.flags[j] & Operand_Mem) && !match_mem_size (t, j, j))
5c07affc
L
2269 {
2270 match = 0;
2271 break;
2272 }
2273 }
2274
3ac21baa 2275 if (!t->opcode_modifier.d)
891edac4 2276 {
dc1e8a47 2277 mismatch:
3ac21baa
JB
2278 if (!match)
2279 i.error = operand_size_mismatch;
2280 return match;
891edac4 2281 }
5c07affc
L
2282
2283 /* Check reverse. */
f5eb1d70 2284 gas_assert (i.operands >= 2 && i.operands <= 3);
5c07affc 2285
f5eb1d70 2286 for (j = 0; j < i.operands; j++)
5c07affc 2287 {
f5eb1d70
JB
2288 unsigned int given = i.operands - j - 1;
2289
bab6aec1 2290 if (t->operand_types[j].bitfield.class == Reg
f5eb1d70 2291 && !match_operand_size (t, j, given))
891edac4 2292 goto mismatch;
5c07affc 2293
3528c362 2294 if (t->operand_types[j].bitfield.class == RegSIMD
f5eb1d70 2295 && !match_simd_size (t, j, given))
dbbc8b7e
JB
2296 goto mismatch;
2297
75e5731b 2298 if (t->operand_types[j].bitfield.instance == Accum
f5eb1d70
JB
2299 && (!match_operand_size (t, j, given)
2300 || !match_simd_size (t, j, given)))
dbbc8b7e
JB
2301 goto mismatch;
2302
f5eb1d70 2303 if ((i.flags[given] & Operand_Mem) && !match_mem_size (t, j, given))
891edac4 2304 goto mismatch;
5c07affc
L
2305 }
2306
3ac21baa 2307 return match | MATCH_REVERSE;
5c07affc
L
2308}
2309
c6fb90c8 2310static INLINE int
40fb9820
L
2311operand_type_match (i386_operand_type overlap,
2312 i386_operand_type given)
2313{
2314 i386_operand_type temp = overlap;
2315
7d5e4556 2316 temp.bitfield.unspecified = 0;
5c07affc
L
2317 temp.bitfield.byte = 0;
2318 temp.bitfield.word = 0;
2319 temp.bitfield.dword = 0;
2320 temp.bitfield.fword = 0;
2321 temp.bitfield.qword = 0;
2322 temp.bitfield.tbyte = 0;
2323 temp.bitfield.xmmword = 0;
c0f3af97 2324 temp.bitfield.ymmword = 0;
43234a1e 2325 temp.bitfield.zmmword = 0;
260cd341 2326 temp.bitfield.tmmword = 0;
0dfbf9d7 2327 if (operand_type_all_zero (&temp))
891edac4 2328 goto mismatch;
40fb9820 2329
6f2f06be 2330 if (given.bitfield.baseindex == overlap.bitfield.baseindex)
891edac4
L
2331 return 1;
2332
dc1e8a47 2333 mismatch:
a65babc9 2334 i.error = operand_type_mismatch;
891edac4 2335 return 0;
40fb9820
L
2336}
2337
7d5e4556 2338/* If given types g0 and g1 are registers they must be of the same type
10c17abd 2339 unless the expected operand type register overlap is null.
5de4d9ef 2340 Some Intel syntax memory operand size checking also happens here. */
40fb9820 2341
c6fb90c8 2342static INLINE int
dc821c5f 2343operand_type_register_match (i386_operand_type g0,
40fb9820 2344 i386_operand_type t0,
40fb9820
L
2345 i386_operand_type g1,
2346 i386_operand_type t1)
2347{
bab6aec1 2348 if (g0.bitfield.class != Reg
3528c362 2349 && g0.bitfield.class != RegSIMD
10c17abd
JB
2350 && (!operand_type_check (g0, anymem)
2351 || g0.bitfield.unspecified
5de4d9ef
JB
2352 || (t0.bitfield.class != Reg
2353 && t0.bitfield.class != RegSIMD)))
40fb9820
L
2354 return 1;
2355
bab6aec1 2356 if (g1.bitfield.class != Reg
3528c362 2357 && g1.bitfield.class != RegSIMD
10c17abd
JB
2358 && (!operand_type_check (g1, anymem)
2359 || g1.bitfield.unspecified
5de4d9ef
JB
2360 || (t1.bitfield.class != Reg
2361 && t1.bitfield.class != RegSIMD)))
40fb9820
L
2362 return 1;
2363
dc821c5f
JB
2364 if (g0.bitfield.byte == g1.bitfield.byte
2365 && g0.bitfield.word == g1.bitfield.word
2366 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2367 && g0.bitfield.qword == g1.bitfield.qword
2368 && g0.bitfield.xmmword == g1.bitfield.xmmword
2369 && g0.bitfield.ymmword == g1.bitfield.ymmword
2370 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2371 return 1;
2372
dc821c5f
JB
2373 if (!(t0.bitfield.byte & t1.bitfield.byte)
2374 && !(t0.bitfield.word & t1.bitfield.word)
2375 && !(t0.bitfield.dword & t1.bitfield.dword)
10c17abd
JB
2376 && !(t0.bitfield.qword & t1.bitfield.qword)
2377 && !(t0.bitfield.xmmword & t1.bitfield.xmmword)
2378 && !(t0.bitfield.ymmword & t1.bitfield.ymmword)
2379 && !(t0.bitfield.zmmword & t1.bitfield.zmmword))
891edac4
L
2380 return 1;
2381
a65babc9 2382 i.error = register_type_mismatch;
891edac4
L
2383
2384 return 0;
40fb9820
L
2385}
2386
4c692bc7
JB
2387static INLINE unsigned int
2388register_number (const reg_entry *r)
2389{
2390 unsigned int nr = r->reg_num;
2391
2392 if (r->reg_flags & RegRex)
2393 nr += 8;
2394
200cbe0f
L
2395 if (r->reg_flags & RegVRex)
2396 nr += 16;
2397
4c692bc7
JB
2398 return nr;
2399}
2400
252b5132 2401static INLINE unsigned int
40fb9820 2402mode_from_disp_size (i386_operand_type t)
252b5132 2403{
b5014f7a 2404 if (t.bitfield.disp8)
40fb9820
L
2405 return 1;
2406 else if (t.bitfield.disp16
2407 || t.bitfield.disp32
2408 || t.bitfield.disp32s)
2409 return 2;
2410 else
2411 return 0;
252b5132
RH
2412}
2413
2414static INLINE int
65879393 2415fits_in_signed_byte (addressT num)
252b5132 2416{
65879393 2417 return num + 0x80 <= 0xff;
47926f60 2418}
252b5132
RH
2419
2420static INLINE int
65879393 2421fits_in_unsigned_byte (addressT num)
252b5132 2422{
65879393 2423 return num <= 0xff;
47926f60 2424}
252b5132
RH
2425
2426static INLINE int
65879393 2427fits_in_unsigned_word (addressT num)
252b5132 2428{
65879393 2429 return num <= 0xffff;
47926f60 2430}
252b5132
RH
2431
2432static INLINE int
65879393 2433fits_in_signed_word (addressT num)
252b5132 2434{
65879393 2435 return num + 0x8000 <= 0xffff;
47926f60 2436}
2a962e6d 2437
3e73aa7c 2438static INLINE int
65879393 2439fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2440{
2441#ifndef BFD64
2442 return 1;
2443#else
65879393 2444 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2445#endif
2446} /* fits_in_signed_long() */
2a962e6d 2447
3e73aa7c 2448static INLINE int
65879393 2449fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2450{
2451#ifndef BFD64
2452 return 1;
2453#else
65879393 2454 return num <= 0xffffffff;
3e73aa7c
JH
2455#endif
2456} /* fits_in_unsigned_long() */
252b5132 2457
a442cac5
JB
2458static INLINE valueT extend_to_32bit_address (addressT num)
2459{
2460#ifdef BFD64
2461 if (fits_in_unsigned_long(num))
2462 return (num ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
2463
2464 if (!fits_in_signed_long (num))
2465 return num & 0xffffffff;
2466#endif
2467
2468 return num;
2469}
2470
43234a1e 2471static INLINE int
b5014f7a 2472fits_in_disp8 (offsetT num)
43234a1e
L
2473{
2474 int shift = i.memshift;
2475 unsigned int mask;
2476
2477 if (shift == -1)
2478 abort ();
2479
2480 mask = (1 << shift) - 1;
2481
2482 /* Return 0 if NUM isn't properly aligned. */
2483 if ((num & mask))
2484 return 0;
2485
2486 /* Check if NUM will fit in 8bit after shift. */
2487 return fits_in_signed_byte (num >> shift);
2488}
2489
a683cc34
SP
2490static INLINE int
2491fits_in_imm4 (offsetT num)
2492{
2493 return (num & 0xf) == num;
2494}
2495
40fb9820 2496static i386_operand_type
e3bb37b5 2497smallest_imm_type (offsetT num)
252b5132 2498{
40fb9820 2499 i386_operand_type t;
7ab9ffdd 2500
0dfbf9d7 2501 operand_type_set (&t, 0);
40fb9820
L
2502 t.bitfield.imm64 = 1;
2503
2504 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2505 {
2506 /* This code is disabled on the 486 because all the Imm1 forms
2507 in the opcode table are slower on the i486. They're the
2508 versions with the implicitly specified single-position
2509 displacement, which has another syntax if you really want to
2510 use that form. */
40fb9820
L
2511 t.bitfield.imm1 = 1;
2512 t.bitfield.imm8 = 1;
2513 t.bitfield.imm8s = 1;
2514 t.bitfield.imm16 = 1;
2515 t.bitfield.imm32 = 1;
2516 t.bitfield.imm32s = 1;
2517 }
2518 else if (fits_in_signed_byte (num))
2519 {
2520 t.bitfield.imm8 = 1;
2521 t.bitfield.imm8s = 1;
2522 t.bitfield.imm16 = 1;
2523 t.bitfield.imm32 = 1;
2524 t.bitfield.imm32s = 1;
2525 }
2526 else if (fits_in_unsigned_byte (num))
2527 {
2528 t.bitfield.imm8 = 1;
2529 t.bitfield.imm16 = 1;
2530 t.bitfield.imm32 = 1;
2531 t.bitfield.imm32s = 1;
2532 }
2533 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2534 {
2535 t.bitfield.imm16 = 1;
2536 t.bitfield.imm32 = 1;
2537 t.bitfield.imm32s = 1;
2538 }
2539 else if (fits_in_signed_long (num))
2540 {
2541 t.bitfield.imm32 = 1;
2542 t.bitfield.imm32s = 1;
2543 }
2544 else if (fits_in_unsigned_long (num))
2545 t.bitfield.imm32 = 1;
2546
2547 return t;
47926f60 2548}
252b5132 2549
847f7ad4 2550static offsetT
e3bb37b5 2551offset_in_range (offsetT val, int size)
847f7ad4 2552{
508866be 2553 addressT mask;
ba2adb93 2554
847f7ad4
AM
2555 switch (size)
2556 {
508866be
L
2557 case 1: mask = ((addressT) 1 << 8) - 1; break;
2558 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 2559 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
2560#ifdef BFD64
2561 case 8: mask = ((addressT) 2 << 63) - 1; break;
2562#endif
47926f60 2563 default: abort ();
847f7ad4
AM
2564 }
2565
47926f60 2566 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
2567 {
2568 char buf1[40], buf2[40];
2569
9a8041fd
JB
2570 bfd_sprintf_vma (stdoutput, buf1, val);
2571 bfd_sprintf_vma (stdoutput, buf2, val & mask);
847f7ad4
AM
2572 as_warn (_("%s shortened to %s"), buf1, buf2);
2573 }
2574 return val & mask;
2575}
2576
c32fa91d
L
2577enum PREFIX_GROUP
2578{
2579 PREFIX_EXIST = 0,
2580 PREFIX_LOCK,
2581 PREFIX_REP,
04ef582a 2582 PREFIX_DS,
c32fa91d
L
2583 PREFIX_OTHER
2584};
2585
2586/* Returns
2587 a. PREFIX_EXIST if attempting to add a prefix where one from the
2588 same class already exists.
2589 b. PREFIX_LOCK if lock prefix is added.
2590 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2591 d. PREFIX_DS if ds prefix is added.
2592 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2593 */
2594
2595static enum PREFIX_GROUP
e3bb37b5 2596add_prefix (unsigned int prefix)
252b5132 2597{
c32fa91d 2598 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2599 unsigned int q;
252b5132 2600
29b0f896
AM
2601 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2602 && flag_code == CODE_64BIT)
b1905489 2603 {
161a04f6 2604 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2605 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2606 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2607 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2608 ret = PREFIX_EXIST;
b1905489
JB
2609 q = REX_PREFIX;
2610 }
3e73aa7c 2611 else
b1905489
JB
2612 {
2613 switch (prefix)
2614 {
2615 default:
2616 abort ();
2617
b1905489 2618 case DS_PREFIX_OPCODE:
04ef582a
L
2619 ret = PREFIX_DS;
2620 /* Fall through. */
2621 case CS_PREFIX_OPCODE:
b1905489
JB
2622 case ES_PREFIX_OPCODE:
2623 case FS_PREFIX_OPCODE:
2624 case GS_PREFIX_OPCODE:
2625 case SS_PREFIX_OPCODE:
2626 q = SEG_PREFIX;
2627 break;
2628
2629 case REPNE_PREFIX_OPCODE:
2630 case REPE_PREFIX_OPCODE:
c32fa91d
L
2631 q = REP_PREFIX;
2632 ret = PREFIX_REP;
2633 break;
2634
b1905489 2635 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2636 q = LOCK_PREFIX;
2637 ret = PREFIX_LOCK;
b1905489
JB
2638 break;
2639
2640 case FWAIT_OPCODE:
2641 q = WAIT_PREFIX;
2642 break;
2643
2644 case ADDR_PREFIX_OPCODE:
2645 q = ADDR_PREFIX;
2646 break;
2647
2648 case DATA_PREFIX_OPCODE:
2649 q = DATA_PREFIX;
2650 break;
2651 }
2652 if (i.prefix[q] != 0)
c32fa91d 2653 ret = PREFIX_EXIST;
b1905489 2654 }
252b5132 2655
b1905489 2656 if (ret)
252b5132 2657 {
b1905489
JB
2658 if (!i.prefix[q])
2659 ++i.prefixes;
2660 i.prefix[q] |= prefix;
252b5132 2661 }
b1905489
JB
2662 else
2663 as_bad (_("same type of prefix used twice"));
252b5132 2664
252b5132
RH
2665 return ret;
2666}
2667
2668static void
78f12dd3 2669update_code_flag (int value, int check)
eecb386c 2670{
78f12dd3
L
2671 PRINTF_LIKE ((*as_error));
2672
1e9cc1c2 2673 flag_code = (enum flag_code) value;
40fb9820
L
2674 if (flag_code == CODE_64BIT)
2675 {
2676 cpu_arch_flags.bitfield.cpu64 = 1;
2677 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
2678 }
2679 else
2680 {
2681 cpu_arch_flags.bitfield.cpu64 = 0;
2682 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
2683 }
2684 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c 2685 {
78f12dd3
L
2686 if (check)
2687 as_error = as_fatal;
2688 else
2689 as_error = as_bad;
2690 (*as_error) (_("64bit mode not supported on `%s'."),
2691 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2692 }
40fb9820 2693 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c 2694 {
78f12dd3
L
2695 if (check)
2696 as_error = as_fatal;
2697 else
2698 as_error = as_bad;
2699 (*as_error) (_("32bit mode not supported on `%s'."),
2700 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2701 }
eecb386c
AM
2702 stackop_size = '\0';
2703}
2704
78f12dd3
L
2705static void
2706set_code_flag (int value)
2707{
2708 update_code_flag (value, 0);
2709}
2710
eecb386c 2711static void
e3bb37b5 2712set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2713{
1e9cc1c2 2714 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2715 if (flag_code != CODE_16BIT)
2716 abort ();
2717 cpu_arch_flags.bitfield.cpu64 = 0;
2718 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 2719 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2720}
2721
2722static void
e3bb37b5 2723set_intel_syntax (int syntax_flag)
252b5132
RH
2724{
2725 /* Find out if register prefixing is specified. */
2726 int ask_naked_reg = 0;
2727
2728 SKIP_WHITESPACE ();
29b0f896 2729 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2730 {
d02603dc
NC
2731 char *string;
2732 int e = get_symbol_name (&string);
252b5132 2733
47926f60 2734 if (strcmp (string, "prefix") == 0)
252b5132 2735 ask_naked_reg = 1;
47926f60 2736 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2737 ask_naked_reg = -1;
2738 else
d0b47220 2739 as_bad (_("bad argument to syntax directive."));
d02603dc 2740 (void) restore_line_pointer (e);
252b5132
RH
2741 }
2742 demand_empty_rest_of_line ();
c3332e24 2743
252b5132
RH
2744 intel_syntax = syntax_flag;
2745
2746 if (ask_naked_reg == 0)
f86103b7
AM
2747 allow_naked_reg = (intel_syntax
2748 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2749 else
2750 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2751
ee86248c 2752 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
7ab9ffdd 2753
e4a3b5a4 2754 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 2755 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 2756 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
2757}
2758
1efbbeb4
L
2759static void
2760set_intel_mnemonic (int mnemonic_flag)
2761{
e1d4d893 2762 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2763}
2764
db51cc60
L
2765static void
2766set_allow_index_reg (int flag)
2767{
2768 allow_index_reg = flag;
2769}
2770
cb19c032 2771static void
7bab8ab5 2772set_check (int what)
cb19c032 2773{
7bab8ab5
JB
2774 enum check_kind *kind;
2775 const char *str;
2776
2777 if (what)
2778 {
2779 kind = &operand_check;
2780 str = "operand";
2781 }
2782 else
2783 {
2784 kind = &sse_check;
2785 str = "sse";
2786 }
2787
cb19c032
L
2788 SKIP_WHITESPACE ();
2789
2790 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2791 {
d02603dc
NC
2792 char *string;
2793 int e = get_symbol_name (&string);
cb19c032
L
2794
2795 if (strcmp (string, "none") == 0)
7bab8ab5 2796 *kind = check_none;
cb19c032 2797 else if (strcmp (string, "warning") == 0)
7bab8ab5 2798 *kind = check_warning;
cb19c032 2799 else if (strcmp (string, "error") == 0)
7bab8ab5 2800 *kind = check_error;
cb19c032 2801 else
7bab8ab5 2802 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2803 (void) restore_line_pointer (e);
cb19c032
L
2804 }
2805 else
7bab8ab5 2806 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2807
2808 demand_empty_rest_of_line ();
2809}
2810
8a9036a4
L
2811static void
2812check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2813 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2814{
2815#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2816 static const char *arch;
2817
2818 /* Intel LIOM is only supported on ELF. */
2819 if (!IS_ELF)
2820 return;
2821
2822 if (!arch)
2823 {
2824 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2825 use default_arch. */
2826 arch = cpu_arch_name;
2827 if (!arch)
2828 arch = default_arch;
2829 }
2830
81486035
L
2831 /* If we are targeting Intel MCU, we must enable it. */
2832 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_IAMCU
2833 || new_flag.bitfield.cpuiamcu)
2834 return;
2835
3632d14b 2836 /* If we are targeting Intel L1OM, we must enable it. */
8a9036a4 2837 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_L1OM
1e9cc1c2 2838 || new_flag.bitfield.cpul1om)
8a9036a4 2839 return;
76ba9986 2840
7a9068fe
L
2841 /* If we are targeting Intel K1OM, we must enable it. */
2842 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_K1OM
2843 || new_flag.bitfield.cpuk1om)
2844 return;
2845
8a9036a4
L
2846 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2847#endif
2848}
2849
e413e4e9 2850static void
e3bb37b5 2851set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2852{
47926f60 2853 SKIP_WHITESPACE ();
e413e4e9 2854
29b0f896 2855 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9 2856 {
d02603dc
NC
2857 char *string;
2858 int e = get_symbol_name (&string);
91d6fa6a 2859 unsigned int j;
40fb9820 2860 i386_cpu_flags flags;
e413e4e9 2861
91d6fa6a 2862 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
e413e4e9 2863 {
91d6fa6a 2864 if (strcmp (string, cpu_arch[j].name) == 0)
e413e4e9 2865 {
91d6fa6a 2866 check_cpu_arch_compatible (string, cpu_arch[j].flags);
8a9036a4 2867
5c6af06e
JB
2868 if (*string != '.')
2869 {
91d6fa6a 2870 cpu_arch_name = cpu_arch[j].name;
5c6af06e 2871 cpu_sub_arch_name = NULL;
91d6fa6a 2872 cpu_arch_flags = cpu_arch[j].flags;
40fb9820
L
2873 if (flag_code == CODE_64BIT)
2874 {
2875 cpu_arch_flags.bitfield.cpu64 = 1;
2876 cpu_arch_flags.bitfield.cpuno64 = 0;
2877 }
2878 else
2879 {
2880 cpu_arch_flags.bitfield.cpu64 = 0;
2881 cpu_arch_flags.bitfield.cpuno64 = 1;
2882 }
91d6fa6a
NC
2883 cpu_arch_isa = cpu_arch[j].type;
2884 cpu_arch_isa_flags = cpu_arch[j].flags;
ccc9c027
L
2885 if (!cpu_arch_tune_set)
2886 {
2887 cpu_arch_tune = cpu_arch_isa;
2888 cpu_arch_tune_flags = cpu_arch_isa_flags;
2889 }
5c6af06e
JB
2890 break;
2891 }
40fb9820 2892
293f5f65
L
2893 flags = cpu_flags_or (cpu_arch_flags,
2894 cpu_arch[j].flags);
81486035 2895
5b64d091 2896 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
5c6af06e 2897 {
6305a203
L
2898 if (cpu_sub_arch_name)
2899 {
2900 char *name = cpu_sub_arch_name;
2901 cpu_sub_arch_name = concat (name,
91d6fa6a 2902 cpu_arch[j].name,
1bf57e9f 2903 (const char *) NULL);
6305a203
L
2904 free (name);
2905 }
2906 else
91d6fa6a 2907 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
40fb9820 2908 cpu_arch_flags = flags;
a586129e 2909 cpu_arch_isa_flags = flags;
5c6af06e 2910 }
0089dace
L
2911 else
2912 cpu_arch_isa_flags
2913 = cpu_flags_or (cpu_arch_isa_flags,
2914 cpu_arch[j].flags);
d02603dc 2915 (void) restore_line_pointer (e);
5c6af06e
JB
2916 demand_empty_rest_of_line ();
2917 return;
e413e4e9
AM
2918 }
2919 }
293f5f65
L
2920
2921 if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
2922 {
33eaf5de 2923 /* Disable an ISA extension. */
293f5f65
L
2924 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
2925 if (strcmp (string + 1, cpu_noarch [j].name) == 0)
2926 {
2927 flags = cpu_flags_and_not (cpu_arch_flags,
2928 cpu_noarch[j].flags);
2929 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2930 {
2931 if (cpu_sub_arch_name)
2932 {
2933 char *name = cpu_sub_arch_name;
2934 cpu_sub_arch_name = concat (name, string,
2935 (const char *) NULL);
2936 free (name);
2937 }
2938 else
2939 cpu_sub_arch_name = xstrdup (string);
2940 cpu_arch_flags = flags;
2941 cpu_arch_isa_flags = flags;
2942 }
2943 (void) restore_line_pointer (e);
2944 demand_empty_rest_of_line ();
2945 return;
2946 }
2947
2948 j = ARRAY_SIZE (cpu_arch);
2949 }
2950
91d6fa6a 2951 if (j >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
2952 as_bad (_("no such architecture: `%s'"), string);
2953
2954 *input_line_pointer = e;
2955 }
2956 else
2957 as_bad (_("missing cpu architecture"));
2958
fddf5b5b
AM
2959 no_cond_jump_promotion = 0;
2960 if (*input_line_pointer == ','
29b0f896 2961 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 2962 {
d02603dc
NC
2963 char *string;
2964 char e;
2965
2966 ++input_line_pointer;
2967 e = get_symbol_name (&string);
fddf5b5b
AM
2968
2969 if (strcmp (string, "nojumps") == 0)
2970 no_cond_jump_promotion = 1;
2971 else if (strcmp (string, "jumps") == 0)
2972 ;
2973 else
2974 as_bad (_("no such architecture modifier: `%s'"), string);
2975
d02603dc 2976 (void) restore_line_pointer (e);
fddf5b5b
AM
2977 }
2978
e413e4e9
AM
2979 demand_empty_rest_of_line ();
2980}
2981
8a9036a4
L
2982enum bfd_architecture
2983i386_arch (void)
2984{
3632d14b 2985 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4
L
2986 {
2987 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2988 || flag_code != CODE_64BIT)
2989 as_fatal (_("Intel L1OM is 64bit ELF only"));
2990 return bfd_arch_l1om;
2991 }
7a9068fe
L
2992 else if (cpu_arch_isa == PROCESSOR_K1OM)
2993 {
2994 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2995 || flag_code != CODE_64BIT)
2996 as_fatal (_("Intel K1OM is 64bit ELF only"));
2997 return bfd_arch_k1om;
2998 }
81486035
L
2999 else if (cpu_arch_isa == PROCESSOR_IAMCU)
3000 {
3001 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3002 || flag_code == CODE_64BIT)
3003 as_fatal (_("Intel MCU is 32bit ELF only"));
3004 return bfd_arch_iamcu;
3005 }
8a9036a4
L
3006 else
3007 return bfd_arch_i386;
3008}
3009
b9d79e03 3010unsigned long
7016a5d5 3011i386_mach (void)
b9d79e03 3012{
d34049e8 3013 if (startswith (default_arch, "x86_64"))
8a9036a4 3014 {
3632d14b 3015 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 3016 {
351f65ca
L
3017 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3018 || default_arch[6] != '\0')
8a9036a4
L
3019 as_fatal (_("Intel L1OM is 64bit ELF only"));
3020 return bfd_mach_l1om;
3021 }
7a9068fe
L
3022 else if (cpu_arch_isa == PROCESSOR_K1OM)
3023 {
3024 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3025 || default_arch[6] != '\0')
3026 as_fatal (_("Intel K1OM is 64bit ELF only"));
3027 return bfd_mach_k1om;
3028 }
351f65ca 3029 else if (default_arch[6] == '\0')
8a9036a4 3030 return bfd_mach_x86_64;
351f65ca
L
3031 else
3032 return bfd_mach_x64_32;
8a9036a4 3033 }
5197d474
L
3034 else if (!strcmp (default_arch, "i386")
3035 || !strcmp (default_arch, "iamcu"))
81486035
L
3036 {
3037 if (cpu_arch_isa == PROCESSOR_IAMCU)
3038 {
3039 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
3040 as_fatal (_("Intel MCU is 32bit ELF only"));
3041 return bfd_mach_i386_iamcu;
3042 }
3043 else
3044 return bfd_mach_i386_i386;
3045 }
b9d79e03 3046 else
2b5d6a91 3047 as_fatal (_("unknown architecture"));
b9d79e03 3048}
b9d79e03 3049\f
252b5132 3050void
7016a5d5 3051md_begin (void)
252b5132 3052{
86fa6981
L
3053 /* Support pseudo prefixes like {disp32}. */
3054 lex_type ['{'] = LEX_BEGIN_NAME;
3055
47926f60 3056 /* Initialize op_hash hash table. */
629310ab 3057 op_hash = str_htab_create ();
252b5132
RH
3058
3059 {
d3ce72d0 3060 const insn_template *optab;
29b0f896 3061 templates *core_optab;
252b5132 3062
47926f60
KH
3063 /* Setup for loop. */
3064 optab = i386_optab;
add39d23 3065 core_optab = XNEW (templates);
252b5132
RH
3066 core_optab->start = optab;
3067
3068 while (1)
3069 {
3070 ++optab;
3071 if (optab->name == NULL
3072 || strcmp (optab->name, (optab - 1)->name) != 0)
3073 {
3074 /* different name --> ship out current template list;
47926f60 3075 add to hash table; & begin anew. */
252b5132 3076 core_optab->end = optab;
fe0e921f
AM
3077 if (str_hash_insert (op_hash, (optab - 1)->name, core_optab, 0))
3078 as_fatal (_("duplicate %s"), (optab - 1)->name);
3079
252b5132
RH
3080 if (optab->name == NULL)
3081 break;
add39d23 3082 core_optab = XNEW (templates);
252b5132
RH
3083 core_optab->start = optab;
3084 }
3085 }
3086 }
3087
47926f60 3088 /* Initialize reg_hash hash table. */
629310ab 3089 reg_hash = str_htab_create ();
252b5132 3090 {
29b0f896 3091 const reg_entry *regtab;
c3fe08fa 3092 unsigned int regtab_size = i386_regtab_size;
252b5132 3093
c3fe08fa 3094 for (regtab = i386_regtab; regtab_size--; regtab++)
6225c532 3095 {
6288d05f
JB
3096 switch (regtab->reg_type.bitfield.class)
3097 {
3098 case Reg:
34684862
JB
3099 if (regtab->reg_type.bitfield.dword)
3100 {
3101 if (regtab->reg_type.bitfield.instance == Accum)
3102 reg_eax = regtab;
3103 }
3104 else if (regtab->reg_type.bitfield.tbyte)
6288d05f
JB
3105 {
3106 /* There's no point inserting st(<N>) in the hash table, as
3107 parentheses aren't included in register_chars[] anyway. */
3108 if (regtab->reg_type.bitfield.instance != Accum)
3109 continue;
3110 reg_st0 = regtab;
3111 }
3112 break;
3113
5e042380
JB
3114 case SReg:
3115 switch (regtab->reg_num)
3116 {
3117 case 0: reg_es = regtab; break;
3118 case 2: reg_ss = regtab; break;
3119 case 3: reg_ds = regtab; break;
3120 }
3121 break;
3122
6288d05f
JB
3123 case RegMask:
3124 if (!regtab->reg_num)
3125 reg_k0 = regtab;
3126 break;
3127 }
3128
6225c532
JB
3129 if (str_hash_insert (reg_hash, regtab->reg_name, regtab, 0) != NULL)
3130 as_fatal (_("duplicate %s"), regtab->reg_name);
6225c532 3131 }
252b5132
RH
3132 }
3133
47926f60 3134 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 3135 {
29b0f896
AM
3136 int c;
3137 char *p;
252b5132
RH
3138
3139 for (c = 0; c < 256; c++)
3140 {
014fbcda 3141 if (ISDIGIT (c) || ISLOWER (c))
252b5132
RH
3142 {
3143 mnemonic_chars[c] = c;
3144 register_chars[c] = c;
3145 operand_chars[c] = c;
3146 }
3882b010 3147 else if (ISUPPER (c))
252b5132 3148 {
3882b010 3149 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
3150 register_chars[c] = mnemonic_chars[c];
3151 operand_chars[c] = c;
3152 }
43234a1e 3153 else if (c == '{' || c == '}')
86fa6981
L
3154 {
3155 mnemonic_chars[c] = c;
3156 operand_chars[c] = c;
3157 }
b3983e5f
JB
3158#ifdef SVR4_COMMENT_CHARS
3159 else if (c == '\\' && strchr (i386_comment_chars, '/'))
3160 operand_chars[c] = c;
3161#endif
252b5132 3162
3882b010 3163 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
3164 identifier_chars[c] = c;
3165 else if (c >= 128)
3166 {
3167 identifier_chars[c] = c;
3168 operand_chars[c] = c;
3169 }
3170 }
3171
3172#ifdef LEX_AT
3173 identifier_chars['@'] = '@';
32137342
NC
3174#endif
3175#ifdef LEX_QM
3176 identifier_chars['?'] = '?';
3177 operand_chars['?'] = '?';
252b5132 3178#endif
c0f3af97 3179 mnemonic_chars['_'] = '_';
791fe849 3180 mnemonic_chars['-'] = '-';
0003779b 3181 mnemonic_chars['.'] = '.';
252b5132
RH
3182 identifier_chars['_'] = '_';
3183 identifier_chars['.'] = '.';
3184
3185 for (p = operand_special_chars; *p != '\0'; p++)
3186 operand_chars[(unsigned char) *p] = *p;
3187 }
3188
a4447b93
RH
3189 if (flag_code == CODE_64BIT)
3190 {
ca19b261
KT
3191#if defined (OBJ_COFF) && defined (TE_PE)
3192 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
3193 ? 32 : 16);
3194#else
a4447b93 3195 x86_dwarf2_return_column = 16;
ca19b261 3196#endif
61ff971f 3197 x86_cie_data_alignment = -8;
a4447b93
RH
3198 }
3199 else
3200 {
3201 x86_dwarf2_return_column = 8;
3202 x86_cie_data_alignment = -4;
3203 }
e379e5f3
L
3204
3205 /* NB: FUSED_JCC_PADDING frag must have sufficient room so that it
3206 can be turned into BRANCH_PREFIX frag. */
3207 if (align_branch_prefix_size > MAX_FUSED_JCC_PADDING_SIZE)
3208 abort ();
252b5132
RH
3209}
3210
3211void
e3bb37b5 3212i386_print_statistics (FILE *file)
252b5132 3213{
629310ab
ML
3214 htab_print_statistics (file, "i386 opcode", op_hash);
3215 htab_print_statistics (file, "i386 register", reg_hash);
252b5132
RH
3216}
3217\f
252b5132
RH
3218#ifdef DEBUG386
3219
ce8a8b2f 3220/* Debugging routines for md_assemble. */
d3ce72d0 3221static void pte (insn_template *);
40fb9820 3222static void pt (i386_operand_type);
e3bb37b5
L
3223static void pe (expressionS *);
3224static void ps (symbolS *);
252b5132
RH
3225
3226static void
2c703856 3227pi (const char *line, i386_insn *x)
252b5132 3228{
09137c09 3229 unsigned int j;
252b5132
RH
3230
3231 fprintf (stdout, "%s: template ", line);
3232 pte (&x->tm);
09f131f2
JH
3233 fprintf (stdout, " address: base %s index %s scale %x\n",
3234 x->base_reg ? x->base_reg->reg_name : "none",
3235 x->index_reg ? x->index_reg->reg_name : "none",
3236 x->log2_scale_factor);
3237 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 3238 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
3239 fprintf (stdout, " sib: base %x index %x scale %x\n",
3240 x->sib.base, x->sib.index, x->sib.scale);
3241 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
3242 (x->rex & REX_W) != 0,
3243 (x->rex & REX_R) != 0,
3244 (x->rex & REX_X) != 0,
3245 (x->rex & REX_B) != 0);
09137c09 3246 for (j = 0; j < x->operands; j++)
252b5132 3247 {
09137c09
SP
3248 fprintf (stdout, " #%d: ", j + 1);
3249 pt (x->types[j]);
252b5132 3250 fprintf (stdout, "\n");
bab6aec1 3251 if (x->types[j].bitfield.class == Reg
3528c362
JB
3252 || x->types[j].bitfield.class == RegMMX
3253 || x->types[j].bitfield.class == RegSIMD
dd6b8a0b 3254 || x->types[j].bitfield.class == RegMask
00cee14f 3255 || x->types[j].bitfield.class == SReg
4a5c67ed
JB
3256 || x->types[j].bitfield.class == RegCR
3257 || x->types[j].bitfield.class == RegDR
dd6b8a0b
JB
3258 || x->types[j].bitfield.class == RegTR
3259 || x->types[j].bitfield.class == RegBND)
09137c09
SP
3260 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
3261 if (operand_type_check (x->types[j], imm))
3262 pe (x->op[j].imms);
3263 if (operand_type_check (x->types[j], disp))
3264 pe (x->op[j].disps);
252b5132
RH
3265 }
3266}
3267
3268static void
d3ce72d0 3269pte (insn_template *t)
252b5132 3270{
b933fa4b 3271 static const unsigned char opc_pfx[] = { 0, 0x66, 0xf3, 0xf2 };
441f6aca
JB
3272 static const char *const opc_spc[] = {
3273 NULL, "0f", "0f38", "0f3a", NULL, NULL, NULL, NULL,
3274 "XOP08", "XOP09", "XOP0A",
3275 };
09137c09 3276 unsigned int j;
441f6aca 3277
252b5132 3278 fprintf (stdout, " %d operands ", t->operands);
441f6aca
JB
3279 if (opc_pfx[t->opcode_modifier.opcodeprefix])
3280 fprintf (stdout, "pfx %x ", opc_pfx[t->opcode_modifier.opcodeprefix]);
3281 if (opc_spc[t->opcode_modifier.opcodespace])
3282 fprintf (stdout, "space %s ", opc_spc[t->opcode_modifier.opcodespace]);
47926f60 3283 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
3284 if (t->extension_opcode != None)
3285 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 3286 if (t->opcode_modifier.d)
252b5132 3287 fprintf (stdout, "D");
40fb9820 3288 if (t->opcode_modifier.w)
252b5132
RH
3289 fprintf (stdout, "W");
3290 fprintf (stdout, "\n");
09137c09 3291 for (j = 0; j < t->operands; j++)
252b5132 3292 {
09137c09
SP
3293 fprintf (stdout, " #%d type ", j + 1);
3294 pt (t->operand_types[j]);
252b5132
RH
3295 fprintf (stdout, "\n");
3296 }
3297}
3298
3299static void
e3bb37b5 3300pe (expressionS *e)
252b5132 3301{
24eab124 3302 fprintf (stdout, " operation %d\n", e->X_op);
7b025ee8
JB
3303 fprintf (stdout, " add_number %" BFD_VMA_FMT "d (%" BFD_VMA_FMT "x)\n",
3304 e->X_add_number, e->X_add_number);
252b5132
RH
3305 if (e->X_add_symbol)
3306 {
3307 fprintf (stdout, " add_symbol ");
3308 ps (e->X_add_symbol);
3309 fprintf (stdout, "\n");
3310 }
3311 if (e->X_op_symbol)
3312 {
3313 fprintf (stdout, " op_symbol ");
3314 ps (e->X_op_symbol);
3315 fprintf (stdout, "\n");
3316 }
3317}
3318
3319static void
e3bb37b5 3320ps (symbolS *s)
252b5132
RH
3321{
3322 fprintf (stdout, "%s type %s%s",
3323 S_GET_NAME (s),
3324 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3325 segment_name (S_GET_SEGMENT (s)));
3326}
3327
7b81dfbb 3328static struct type_name
252b5132 3329 {
40fb9820
L
3330 i386_operand_type mask;
3331 const char *name;
252b5132 3332 }
7b81dfbb 3333const type_names[] =
252b5132 3334{
40fb9820
L
3335 { OPERAND_TYPE_REG8, "r8" },
3336 { OPERAND_TYPE_REG16, "r16" },
3337 { OPERAND_TYPE_REG32, "r32" },
3338 { OPERAND_TYPE_REG64, "r64" },
2c703856
JB
3339 { OPERAND_TYPE_ACC8, "acc8" },
3340 { OPERAND_TYPE_ACC16, "acc16" },
3341 { OPERAND_TYPE_ACC32, "acc32" },
3342 { OPERAND_TYPE_ACC64, "acc64" },
40fb9820
L
3343 { OPERAND_TYPE_IMM8, "i8" },
3344 { OPERAND_TYPE_IMM8, "i8s" },
3345 { OPERAND_TYPE_IMM16, "i16" },
3346 { OPERAND_TYPE_IMM32, "i32" },
3347 { OPERAND_TYPE_IMM32S, "i32s" },
3348 { OPERAND_TYPE_IMM64, "i64" },
3349 { OPERAND_TYPE_IMM1, "i1" },
3350 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
3351 { OPERAND_TYPE_DISP8, "d8" },
3352 { OPERAND_TYPE_DISP16, "d16" },
3353 { OPERAND_TYPE_DISP32, "d32" },
3354 { OPERAND_TYPE_DISP32S, "d32s" },
3355 { OPERAND_TYPE_DISP64, "d64" },
3356 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
3357 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
3358 { OPERAND_TYPE_CONTROL, "control reg" },
3359 { OPERAND_TYPE_TEST, "test reg" },
3360 { OPERAND_TYPE_DEBUG, "debug reg" },
3361 { OPERAND_TYPE_FLOATREG, "FReg" },
3362 { OPERAND_TYPE_FLOATACC, "FAcc" },
21df382b 3363 { OPERAND_TYPE_SREG, "SReg" },
40fb9820
L
3364 { OPERAND_TYPE_REGMMX, "rMMX" },
3365 { OPERAND_TYPE_REGXMM, "rXMM" },
0349dc08 3366 { OPERAND_TYPE_REGYMM, "rYMM" },
43234a1e 3367 { OPERAND_TYPE_REGZMM, "rZMM" },
260cd341 3368 { OPERAND_TYPE_REGTMM, "rTMM" },
43234a1e 3369 { OPERAND_TYPE_REGMASK, "Mask reg" },
252b5132
RH
3370};
3371
3372static void
40fb9820 3373pt (i386_operand_type t)
252b5132 3374{
40fb9820 3375 unsigned int j;
c6fb90c8 3376 i386_operand_type a;
252b5132 3377
40fb9820 3378 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3379 {
3380 a = operand_type_and (t, type_names[j].mask);
2c703856 3381 if (operand_type_equal (&a, &type_names[j].mask))
c6fb90c8
L
3382 fprintf (stdout, "%s, ", type_names[j].name);
3383 }
252b5132
RH
3384 fflush (stdout);
3385}
3386
3387#endif /* DEBUG386 */
3388\f
252b5132 3389static bfd_reloc_code_real_type
3956db08 3390reloc (unsigned int size,
64e74474
AM
3391 int pcrel,
3392 int sign,
3393 bfd_reloc_code_real_type other)
252b5132 3394{
47926f60 3395 if (other != NO_RELOC)
3956db08 3396 {
91d6fa6a 3397 reloc_howto_type *rel;
3956db08
JB
3398
3399 if (size == 8)
3400 switch (other)
3401 {
64e74474
AM
3402 case BFD_RELOC_X86_64_GOT32:
3403 return BFD_RELOC_X86_64_GOT64;
3404 break;
553d1284
L
3405 case BFD_RELOC_X86_64_GOTPLT64:
3406 return BFD_RELOC_X86_64_GOTPLT64;
3407 break;
64e74474
AM
3408 case BFD_RELOC_X86_64_PLTOFF64:
3409 return BFD_RELOC_X86_64_PLTOFF64;
3410 break;
3411 case BFD_RELOC_X86_64_GOTPC32:
3412 other = BFD_RELOC_X86_64_GOTPC64;
3413 break;
3414 case BFD_RELOC_X86_64_GOTPCREL:
3415 other = BFD_RELOC_X86_64_GOTPCREL64;
3416 break;
3417 case BFD_RELOC_X86_64_TPOFF32:
3418 other = BFD_RELOC_X86_64_TPOFF64;
3419 break;
3420 case BFD_RELOC_X86_64_DTPOFF32:
3421 other = BFD_RELOC_X86_64_DTPOFF64;
3422 break;
3423 default:
3424 break;
3956db08 3425 }
e05278af 3426
8ce3d284 3427#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3428 if (other == BFD_RELOC_SIZE32)
3429 {
3430 if (size == 8)
1ab668bf 3431 other = BFD_RELOC_SIZE64;
8fd4256d 3432 if (pcrel)
1ab668bf
AM
3433 {
3434 as_bad (_("there are no pc-relative size relocations"));
3435 return NO_RELOC;
3436 }
8fd4256d 3437 }
8ce3d284 3438#endif
8fd4256d 3439
e05278af 3440 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3441 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3442 sign = -1;
3443
91d6fa6a
NC
3444 rel = bfd_reloc_type_lookup (stdoutput, other);
3445 if (!rel)
3956db08 3446 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3447 else if (size != bfd_get_reloc_size (rel))
3956db08 3448 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3449 bfd_get_reloc_size (rel),
3956db08 3450 size);
91d6fa6a 3451 else if (pcrel && !rel->pc_relative)
3956db08 3452 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3453 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3454 && !sign)
91d6fa6a 3455 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3456 && sign > 0))
3956db08
JB
3457 as_bad (_("relocated field and relocation type differ in signedness"));
3458 else
3459 return other;
3460 return NO_RELOC;
3461 }
252b5132
RH
3462
3463 if (pcrel)
3464 {
3e73aa7c 3465 if (!sign)
3956db08 3466 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3467 switch (size)
3468 {
3469 case 1: return BFD_RELOC_8_PCREL;
3470 case 2: return BFD_RELOC_16_PCREL;
d258b828 3471 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3472 case 8: return BFD_RELOC_64_PCREL;
252b5132 3473 }
3956db08 3474 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3475 }
3476 else
3477 {
3956db08 3478 if (sign > 0)
e5cb08ac 3479 switch (size)
3e73aa7c
JH
3480 {
3481 case 4: return BFD_RELOC_X86_64_32S;
3482 }
3483 else
3484 switch (size)
3485 {
3486 case 1: return BFD_RELOC_8;
3487 case 2: return BFD_RELOC_16;
3488 case 4: return BFD_RELOC_32;
3489 case 8: return BFD_RELOC_64;
3490 }
3956db08
JB
3491 as_bad (_("cannot do %s %u byte relocation"),
3492 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3493 }
3494
0cc9e1d3 3495 return NO_RELOC;
252b5132
RH
3496}
3497
47926f60
KH
3498/* Here we decide which fixups can be adjusted to make them relative to
3499 the beginning of the section instead of the symbol. Basically we need
3500 to make sure that the dynamic relocations are done correctly, so in
3501 some cases we force the original symbol to be used. */
3502
252b5132 3503int
e3bb37b5 3504tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3505{
6d249963 3506#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3507 if (!IS_ELF)
31312f95
AM
3508 return 1;
3509
a161fe53
AM
3510 /* Don't adjust pc-relative references to merge sections in 64-bit
3511 mode. */
3512 if (use_rela_relocations
3513 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3514 && fixP->fx_pcrel)
252b5132 3515 return 0;
31312f95 3516
8d01d9a9
AJ
3517 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3518 and changed later by validate_fix. */
3519 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3520 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3521 return 0;
3522
8fd4256d
L
3523 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3524 for size relocations. */
3525 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3526 || fixP->fx_r_type == BFD_RELOC_SIZE64
3527 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132 3528 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3529 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3530 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3531 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3532 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3533 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3534 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3535 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3536 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3537 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3538 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3539 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c 3540 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3541 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3542 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3543 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3544 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3545 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3546 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3547 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3548 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3549 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3550 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3551 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3552 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3553 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3554 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3555 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3556 return 0;
31312f95 3557#endif
252b5132
RH
3558 return 1;
3559}
252b5132 3560
a9aabc23
JB
3561static INLINE bool
3562want_disp32 (const insn_template *t)
3563{
3564 return flag_code != CODE_64BIT
3565 || i.prefix[ADDR_PREFIX]
3566 || (t->base_opcode == 0x8d
3567 && t->opcode_modifier.opcodespace == SPACE_BASE
fe134c65
JB
3568 && (!i.types[1].bitfield.qword
3569 || t->opcode_modifier.size == SIZE32));
a9aabc23
JB
3570}
3571
b4cac588 3572static int
e3bb37b5 3573intel_float_operand (const char *mnemonic)
252b5132 3574{
9306ca4a
JB
3575 /* Note that the value returned is meaningful only for opcodes with (memory)
3576 operands, hence the code here is free to improperly handle opcodes that
3577 have no operands (for better performance and smaller code). */
3578
3579 if (mnemonic[0] != 'f')
3580 return 0; /* non-math */
3581
3582 switch (mnemonic[1])
3583 {
3584 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3585 the fs segment override prefix not currently handled because no
3586 call path can make opcodes without operands get here */
3587 case 'i':
3588 return 2 /* integer op */;
3589 case 'l':
3590 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3591 return 3; /* fldcw/fldenv */
3592 break;
3593 case 'n':
3594 if (mnemonic[2] != 'o' /* fnop */)
3595 return 3; /* non-waiting control op */
3596 break;
3597 case 'r':
3598 if (mnemonic[2] == 's')
3599 return 3; /* frstor/frstpm */
3600 break;
3601 case 's':
3602 if (mnemonic[2] == 'a')
3603 return 3; /* fsave */
3604 if (mnemonic[2] == 't')
3605 {
3606 switch (mnemonic[3])
3607 {
3608 case 'c': /* fstcw */
3609 case 'd': /* fstdw */
3610 case 'e': /* fstenv */
3611 case 's': /* fsts[gw] */
3612 return 3;
3613 }
3614 }
3615 break;
3616 case 'x':
3617 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3618 return 0; /* fxsave/fxrstor are not really math ops */
3619 break;
3620 }
252b5132 3621
9306ca4a 3622 return 1;
252b5132
RH
3623}
3624
9a182d04
JB
3625static INLINE void
3626install_template (const insn_template *t)
3627{
3628 unsigned int l;
3629
3630 i.tm = *t;
3631
3632 /* Note that for pseudo prefixes this produces a length of 1. But for them
3633 the length isn't interesting at all. */
3634 for (l = 1; l < 4; ++l)
3635 if (!(t->base_opcode >> (8 * l)))
3636 break;
3637
3638 i.opcode_length = l;
3639}
3640
c0f3af97
L
3641/* Build the VEX prefix. */
3642
3643static void
d3ce72d0 3644build_vex_prefix (const insn_template *t)
c0f3af97
L
3645{
3646 unsigned int register_specifier;
c0f3af97 3647 unsigned int vector_length;
03751133 3648 unsigned int w;
c0f3af97
L
3649
3650 /* Check register specifier. */
3651 if (i.vex.register_specifier)
43234a1e
L
3652 {
3653 register_specifier =
3654 ~register_number (i.vex.register_specifier) & 0xf;
3655 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3656 }
c0f3af97
L
3657 else
3658 register_specifier = 0xf;
3659
79f0fa25
L
3660 /* Use 2-byte VEX prefix by swapping destination and source operand
3661 if there are more than 1 register operand. */
3662 if (i.reg_operands > 1
3663 && i.vec_encoding != vex_encoding_vex3
86fa6981 3664 && i.dir_encoding == dir_encoding_default
fa99fab2 3665 && i.operands == i.reg_operands
dbbc8b7e 3666 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
441f6aca 3667 && i.tm.opcode_modifier.opcodespace == SPACE_0F
dbbc8b7e 3668 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3669 && i.rex == REX_B)
3670 {
3671 unsigned int xchg = i.operands - 1;
3672 union i386_op temp_op;
3673 i386_operand_type temp_type;
3674
3675 temp_type = i.types[xchg];
3676 i.types[xchg] = i.types[0];
3677 i.types[0] = temp_type;
3678 temp_op = i.op[xchg];
3679 i.op[xchg] = i.op[0];
3680 i.op[0] = temp_op;
3681
9c2799c2 3682 gas_assert (i.rm.mode == 3);
fa99fab2
L
3683
3684 i.rex = REX_R;
3685 xchg = i.rm.regmem;
3686 i.rm.regmem = i.rm.reg;
3687 i.rm.reg = xchg;
3688
dbbc8b7e
JB
3689 if (i.tm.opcode_modifier.d)
3690 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
3691 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
3692 else /* Use the next insn. */
9a182d04 3693 install_template (&t[1]);
fa99fab2
L
3694 }
3695
79dec6b7
JB
3696 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3697 are no memory operands and at least 3 register ones. */
3698 if (i.reg_operands >= 3
3699 && i.vec_encoding != vex_encoding_vex3
3700 && i.reg_operands == i.operands - i.imm_operands
3701 && i.tm.opcode_modifier.vex
3702 && i.tm.opcode_modifier.commutative
3703 && (i.tm.opcode_modifier.sse2avx || optimize > 1)
3704 && i.rex == REX_B
3705 && i.vex.register_specifier
3706 && !(i.vex.register_specifier->reg_flags & RegRex))
3707 {
3708 unsigned int xchg = i.operands - i.reg_operands;
3709 union i386_op temp_op;
3710 i386_operand_type temp_type;
3711
441f6aca 3712 gas_assert (i.tm.opcode_modifier.opcodespace == SPACE_0F);
79dec6b7
JB
3713 gas_assert (!i.tm.opcode_modifier.sae);
3714 gas_assert (operand_type_equal (&i.types[i.operands - 2],
3715 &i.types[i.operands - 3]));
3716 gas_assert (i.rm.mode == 3);
3717
3718 temp_type = i.types[xchg];
3719 i.types[xchg] = i.types[xchg + 1];
3720 i.types[xchg + 1] = temp_type;
3721 temp_op = i.op[xchg];
3722 i.op[xchg] = i.op[xchg + 1];
3723 i.op[xchg + 1] = temp_op;
3724
3725 i.rex = 0;
3726 xchg = i.rm.regmem | 8;
3727 i.rm.regmem = ~register_specifier & 0xf;
3728 gas_assert (!(i.rm.regmem & 8));
3729 i.vex.register_specifier += xchg - i.rm.regmem;
3730 register_specifier = ~xchg & 0xf;
3731 }
3732
539f890d
L
3733 if (i.tm.opcode_modifier.vex == VEXScalar)
3734 vector_length = avxscalar;
10c17abd
JB
3735 else if (i.tm.opcode_modifier.vex == VEX256)
3736 vector_length = 1;
539f890d 3737 else
10c17abd 3738 {
56522fc5 3739 unsigned int op;
10c17abd 3740
c7213af9
L
3741 /* Determine vector length from the last multi-length vector
3742 operand. */
10c17abd 3743 vector_length = 0;
56522fc5 3744 for (op = t->operands; op--;)
10c17abd
JB
3745 if (t->operand_types[op].bitfield.xmmword
3746 && t->operand_types[op].bitfield.ymmword
3747 && i.types[op].bitfield.ymmword)
3748 {
3749 vector_length = 1;
3750 break;
3751 }
3752 }
c0f3af97 3753
03751133
L
3754 /* Check the REX.W bit and VEXW. */
3755 if (i.tm.opcode_modifier.vexw == VEXWIG)
3756 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
3757 else if (i.tm.opcode_modifier.vexw)
3758 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3759 else
931d03b7 3760 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3761
c0f3af97 3762 /* Use 2-byte VEX prefix if possible. */
03751133
L
3763 if (w == 0
3764 && i.vec_encoding != vex_encoding_vex3
441f6aca 3765 && i.tm.opcode_modifier.opcodespace == SPACE_0F
c0f3af97
L
3766 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3767 {
3768 /* 2-byte VEX prefix. */
3769 unsigned int r;
3770
3771 i.vex.length = 2;
3772 i.vex.bytes[0] = 0xc5;
3773
3774 /* Check the REX.R bit. */
3775 r = (i.rex & REX_R) ? 0 : 1;
3776 i.vex.bytes[1] = (r << 7
3777 | register_specifier << 3
3778 | vector_length << 2
35648716 3779 | i.tm.opcode_modifier.opcodeprefix);
c0f3af97
L
3780 }
3781 else
3782 {
3783 /* 3-byte VEX prefix. */
f88c9eb0 3784 i.vex.length = 3;
f88c9eb0 3785
441f6aca 3786 switch (i.tm.opcode_modifier.opcodespace)
5dd85c99 3787 {
441f6aca
JB
3788 case SPACE_0F:
3789 case SPACE_0F38:
3790 case SPACE_0F3A:
80de6e00 3791 i.vex.bytes[0] = 0xc4;
7f399153 3792 break;
441f6aca
JB
3793 case SPACE_XOP08:
3794 case SPACE_XOP09:
3795 case SPACE_XOP0A:
f88c9eb0 3796 i.vex.bytes[0] = 0x8f;
7f399153
L
3797 break;
3798 default:
3799 abort ();
f88c9eb0 3800 }
c0f3af97 3801
c0f3af97
L
3802 /* The high 3 bits of the second VEX byte are 1's compliment
3803 of RXB bits from REX. */
441f6aca 3804 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | i.tm.opcode_modifier.opcodespace;
c0f3af97 3805
c0f3af97
L
3806 i.vex.bytes[2] = (w << 7
3807 | register_specifier << 3
3808 | vector_length << 2
35648716 3809 | i.tm.opcode_modifier.opcodeprefix);
c0f3af97
L
3810 }
3811}
3812
5b7c81bd 3813static INLINE bool
e771e7c9
JB
3814is_evex_encoding (const insn_template *t)
3815{
7091c612 3816 return t->opcode_modifier.evex || t->opcode_modifier.disp8memshift
e771e7c9 3817 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
a80195f1 3818 || t->opcode_modifier.sae;
e771e7c9
JB
3819}
3820
5b7c81bd 3821static INLINE bool
7a8655d2
JB
3822is_any_vex_encoding (const insn_template *t)
3823{
7b47a312 3824 return t->opcode_modifier.vex || is_evex_encoding (t);
7a8655d2
JB
3825}
3826
43234a1e
L
3827/* Build the EVEX prefix. */
3828
3829static void
3830build_evex_prefix (void)
3831{
35648716 3832 unsigned int register_specifier, w;
43234a1e
L
3833 rex_byte vrex_used = 0;
3834
3835 /* Check register specifier. */
3836 if (i.vex.register_specifier)
3837 {
3838 gas_assert ((i.vrex & REX_X) == 0);
3839
3840 register_specifier = i.vex.register_specifier->reg_num;
3841 if ((i.vex.register_specifier->reg_flags & RegRex))
3842 register_specifier += 8;
3843 /* The upper 16 registers are encoded in the fourth byte of the
3844 EVEX prefix. */
3845 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3846 i.vex.bytes[3] = 0x8;
3847 register_specifier = ~register_specifier & 0xf;
3848 }
3849 else
3850 {
3851 register_specifier = 0xf;
3852
3853 /* Encode upper 16 vector index register in the fourth byte of
3854 the EVEX prefix. */
3855 if (!(i.vrex & REX_X))
3856 i.vex.bytes[3] = 0x8;
3857 else
3858 vrex_used |= REX_X;
3859 }
3860
43234a1e
L
3861 /* 4 byte EVEX prefix. */
3862 i.vex.length = 4;
3863 i.vex.bytes[0] = 0x62;
3864
43234a1e
L
3865 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3866 bits from REX. */
441f6aca
JB
3867 gas_assert (i.tm.opcode_modifier.opcodespace >= SPACE_0F);
3868 gas_assert (i.tm.opcode_modifier.opcodespace <= SPACE_0F3A);
3869 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | i.tm.opcode_modifier.opcodespace;
43234a1e
L
3870
3871 /* The fifth bit of the second EVEX byte is 1's compliment of the
3872 REX_R bit in VREX. */
3873 if (!(i.vrex & REX_R))
3874 i.vex.bytes[1] |= 0x10;
3875 else
3876 vrex_used |= REX_R;
3877
3878 if ((i.reg_operands + i.imm_operands) == i.operands)
3879 {
3880 /* When all operands are registers, the REX_X bit in REX is not
3881 used. We reuse it to encode the upper 16 registers, which is
3882 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3883 as 1's compliment. */
3884 if ((i.vrex & REX_B))
3885 {
3886 vrex_used |= REX_B;
3887 i.vex.bytes[1] &= ~0x40;
3888 }
3889 }
3890
3891 /* EVEX instructions shouldn't need the REX prefix. */
3892 i.vrex &= ~vrex_used;
3893 gas_assert (i.vrex == 0);
3894
6865c043
L
3895 /* Check the REX.W bit and VEXW. */
3896 if (i.tm.opcode_modifier.vexw == VEXWIG)
3897 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
3898 else if (i.tm.opcode_modifier.vexw)
3899 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3900 else
931d03b7 3901 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e 3902
43234a1e 3903 /* The third byte of the EVEX prefix. */
35648716
JB
3904 i.vex.bytes[2] = ((w << 7)
3905 | (register_specifier << 3)
3906 | 4 /* Encode the U bit. */
3907 | i.tm.opcode_modifier.opcodeprefix);
43234a1e
L
3908
3909 /* The fourth byte of the EVEX prefix. */
3910 /* The zeroing-masking bit. */
6225c532 3911 if (i.mask.reg && i.mask.zeroing)
43234a1e
L
3912 i.vex.bytes[3] |= 0x80;
3913
3914 /* Don't always set the broadcast bit if there is no RC. */
ca5312a2 3915 if (i.rounding.type == rc_none)
43234a1e
L
3916 {
3917 /* Encode the vector length. */
3918 unsigned int vec_length;
3919
e771e7c9
JB
3920 if (!i.tm.opcode_modifier.evex
3921 || i.tm.opcode_modifier.evex == EVEXDYN)
3922 {
56522fc5 3923 unsigned int op;
e771e7c9 3924
c7213af9
L
3925 /* Determine vector length from the last multi-length vector
3926 operand. */
56522fc5 3927 for (op = i.operands; op--;)
e771e7c9
JB
3928 if (i.tm.operand_types[op].bitfield.xmmword
3929 + i.tm.operand_types[op].bitfield.ymmword
3930 + i.tm.operand_types[op].bitfield.zmmword > 1)
3931 {
3932 if (i.types[op].bitfield.zmmword)
c7213af9
L
3933 {
3934 i.tm.opcode_modifier.evex = EVEX512;
3935 break;
3936 }
e771e7c9 3937 else if (i.types[op].bitfield.ymmword)
c7213af9
L
3938 {
3939 i.tm.opcode_modifier.evex = EVEX256;
3940 break;
3941 }
e771e7c9 3942 else if (i.types[op].bitfield.xmmword)
c7213af9
L
3943 {
3944 i.tm.opcode_modifier.evex = EVEX128;
3945 break;
3946 }
5273a3cd 3947 else if (i.broadcast.type && op == i.broadcast.operand)
625cbd7a 3948 {
5273a3cd 3949 switch (i.broadcast.bytes)
625cbd7a
JB
3950 {
3951 case 64:
3952 i.tm.opcode_modifier.evex = EVEX512;
3953 break;
3954 case 32:
3955 i.tm.opcode_modifier.evex = EVEX256;
3956 break;
3957 case 16:
3958 i.tm.opcode_modifier.evex = EVEX128;
3959 break;
3960 default:
c7213af9 3961 abort ();
625cbd7a 3962 }
c7213af9 3963 break;
625cbd7a 3964 }
e771e7c9 3965 }
c7213af9 3966
56522fc5 3967 if (op >= MAX_OPERANDS)
c7213af9 3968 abort ();
e771e7c9
JB
3969 }
3970
43234a1e
L
3971 switch (i.tm.opcode_modifier.evex)
3972 {
3973 case EVEXLIG: /* LL' is ignored */
3974 vec_length = evexlig << 5;
3975 break;
3976 case EVEX128:
3977 vec_length = 0 << 5;
3978 break;
3979 case EVEX256:
3980 vec_length = 1 << 5;
3981 break;
3982 case EVEX512:
3983 vec_length = 2 << 5;
3984 break;
3985 default:
3986 abort ();
3987 break;
3988 }
3989 i.vex.bytes[3] |= vec_length;
3990 /* Encode the broadcast bit. */
5273a3cd 3991 if (i.broadcast.type)
43234a1e
L
3992 i.vex.bytes[3] |= 0x10;
3993 }
ca5312a2
JB
3994 else if (i.rounding.type != saeonly)
3995 i.vex.bytes[3] |= 0x10 | (i.rounding.type << 5);
43234a1e 3996 else
ca5312a2 3997 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e 3998
6225c532
JB
3999 if (i.mask.reg)
4000 i.vex.bytes[3] |= i.mask.reg->reg_num;
43234a1e
L
4001}
4002
65da13b5
L
4003static void
4004process_immext (void)
4005{
4006 expressionS *exp;
4007
c0f3af97 4008 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
4009 which is coded in the same place as an 8-bit immediate field
4010 would be. Here we fake an 8-bit immediate operand from the
4011 opcode suffix stored in tm.extension_opcode.
4012
c1e679ec 4013 AVX instructions also use this encoding, for some of
c0f3af97 4014 3 argument instructions. */
65da13b5 4015
43234a1e 4016 gas_assert (i.imm_operands <= 1
7ab9ffdd 4017 && (i.operands <= 2
7a8655d2 4018 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 4019 && i.operands <= 4)));
65da13b5
L
4020
4021 exp = &im_expressions[i.imm_operands++];
4022 i.op[i.operands].imms = exp;
4023 i.types[i.operands] = imm8;
4024 i.operands++;
4025 exp->X_op = O_constant;
4026 exp->X_add_number = i.tm.extension_opcode;
4027 i.tm.extension_opcode = None;
4028}
4029
42164a71
L
4030
4031static int
4032check_hle (void)
4033{
742732c7 4034 switch (i.tm.opcode_modifier.prefixok)
42164a71
L
4035 {
4036 default:
4037 abort ();
742732c7
JB
4038 case PrefixLock:
4039 case PrefixNone:
4040 case PrefixNoTrack:
4041 case PrefixRep:
165de32a
L
4042 as_bad (_("invalid instruction `%s' after `%s'"),
4043 i.tm.name, i.hle_prefix);
42164a71 4044 return 0;
742732c7 4045 case PrefixHLELock:
42164a71
L
4046 if (i.prefix[LOCK_PREFIX])
4047 return 1;
165de32a 4048 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 4049 return 0;
742732c7 4050 case PrefixHLEAny:
42164a71 4051 return 1;
742732c7 4052 case PrefixHLERelease:
42164a71
L
4053 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
4054 {
4055 as_bad (_("instruction `%s' after `xacquire' not allowed"),
4056 i.tm.name);
4057 return 0;
4058 }
8dc0818e 4059 if (i.mem_operands == 0 || !(i.flags[i.operands - 1] & Operand_Mem))
42164a71
L
4060 {
4061 as_bad (_("memory destination needed for instruction `%s'"
4062 " after `xrelease'"), i.tm.name);
4063 return 0;
4064 }
4065 return 1;
4066 }
4067}
4068
b6f8c7c4
L
4069/* Try the shortest encoding by shortening operand size. */
4070
4071static void
4072optimize_encoding (void)
4073{
a0a1771e 4074 unsigned int j;
b6f8c7c4 4075
fe134c65
JB
4076 if (i.tm.opcode_modifier.opcodespace == SPACE_BASE
4077 && i.tm.base_opcode == 0x8d)
4078 {
4079 /* Optimize: -O:
4080 lea symbol, %rN -> mov $symbol, %rN
4081 lea (%rM), %rN -> mov %rM, %rN
4082 lea (,%rM,1), %rN -> mov %rM, %rN
4083
4084 and in 32-bit mode for 16-bit addressing
4085
4086 lea (%rM), %rN -> movzx %rM, %rN
4087
4088 and in 64-bit mode zap 32-bit addressing in favor of using a
4089 32-bit (or less) destination.
4090 */
4091 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4092 {
4093 if (!i.op[1].regs->reg_type.bitfield.word)
4094 i.tm.opcode_modifier.size = SIZE32;
4095 i.prefix[ADDR_PREFIX] = 0;
4096 }
4097
4098 if (!i.index_reg && !i.base_reg)
4099 {
4100 /* Handle:
4101 lea symbol, %rN -> mov $symbol, %rN
4102 */
4103 if (flag_code == CODE_64BIT)
4104 {
4105 /* Don't transform a relocation to a 16-bit one. */
4106 if (i.op[0].disps
4107 && i.op[0].disps->X_op != O_constant
4108 && i.op[1].regs->reg_type.bitfield.word)
4109 return;
4110
4111 if (!i.op[1].regs->reg_type.bitfield.qword
4112 || i.tm.opcode_modifier.size == SIZE32)
4113 {
4114 i.tm.base_opcode = 0xb8;
4115 i.tm.opcode_modifier.modrm = 0;
4116 if (!i.op[1].regs->reg_type.bitfield.word)
4117 i.types[0].bitfield.imm32 = 1;
4118 else
4119 {
4120 i.tm.opcode_modifier.size = SIZE16;
4121 i.types[0].bitfield.imm16 = 1;
4122 }
4123 }
4124 else
4125 {
4126 /* Subject to further optimization below. */
4127 i.tm.base_opcode = 0xc7;
4128 i.tm.extension_opcode = 0;
4129 i.types[0].bitfield.imm32s = 1;
4130 i.types[0].bitfield.baseindex = 0;
4131 }
4132 }
4133 /* Outside of 64-bit mode address and operand sizes have to match if
4134 a relocation is involved, as otherwise we wouldn't (currently) or
4135 even couldn't express the relocation correctly. */
4136 else if (i.op[0].disps
4137 && i.op[0].disps->X_op != O_constant
4138 && ((!i.prefix[ADDR_PREFIX])
4139 != (flag_code == CODE_32BIT
4140 ? i.op[1].regs->reg_type.bitfield.dword
4141 : i.op[1].regs->reg_type.bitfield.word)))
4142 return;
4143 else
4144 {
4145 i.tm.base_opcode = 0xb8;
4146 i.tm.opcode_modifier.modrm = 0;
4147 if (i.op[1].regs->reg_type.bitfield.dword)
4148 i.types[0].bitfield.imm32 = 1;
4149 else
4150 i.types[0].bitfield.imm16 = 1;
4151
4152 if (i.op[0].disps
4153 && i.op[0].disps->X_op == O_constant
4154 && i.op[1].regs->reg_type.bitfield.dword
60cfa10c
L
4155 /* NB: Add () to !i.prefix[ADDR_PREFIX] to silence
4156 GCC 5. */
4157 && (!i.prefix[ADDR_PREFIX]) != (flag_code == CODE_32BIT))
fe134c65
JB
4158 i.op[0].disps->X_add_number &= 0xffff;
4159 }
4160
4161 i.tm.operand_types[0] = i.types[0];
4162 i.imm_operands = 1;
4163 if (!i.op[0].imms)
4164 {
4165 i.op[0].imms = &im_expressions[0];
4166 i.op[0].imms->X_op = O_absent;
4167 }
4168 }
4169 else if (i.op[0].disps
4170 && (i.op[0].disps->X_op != O_constant
4171 || i.op[0].disps->X_add_number))
4172 return;
4173 else
4174 {
4175 /* Handle:
4176 lea (%rM), %rN -> mov %rM, %rN
4177 lea (,%rM,1), %rN -> mov %rM, %rN
4178 lea (%rM), %rN -> movzx %rM, %rN
4179 */
4180 const reg_entry *addr_reg;
4181
4182 if (!i.index_reg && i.base_reg->reg_num != RegIP)
4183 addr_reg = i.base_reg;
4184 else if (!i.base_reg
4185 && i.index_reg->reg_num != RegIZ
4186 && !i.log2_scale_factor)
4187 addr_reg = i.index_reg;
4188 else
4189 return;
4190
4191 if (addr_reg->reg_type.bitfield.word
4192 && i.op[1].regs->reg_type.bitfield.dword)
4193 {
4194 if (flag_code != CODE_32BIT)
4195 return;
4196 i.tm.opcode_modifier.opcodespace = SPACE_0F;
4197 i.tm.base_opcode = 0xb7;
4198 }
4199 else
4200 i.tm.base_opcode = 0x8b;
4201
4202 if (addr_reg->reg_type.bitfield.dword
4203 && i.op[1].regs->reg_type.bitfield.qword)
4204 i.tm.opcode_modifier.size = SIZE32;
4205
4206 i.op[0].regs = addr_reg;
4207 i.reg_operands = 2;
4208 }
4209
4210 i.mem_operands = 0;
4211 i.disp_operands = 0;
4212 i.prefix[ADDR_PREFIX] = 0;
4213 i.prefix[SEG_PREFIX] = 0;
4214 i.seg[0] = NULL;
4215 }
4216
b6f8c7c4 4217 if (optimize_for_space
389d00a5 4218 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
b6f8c7c4
L
4219 && i.reg_operands == 1
4220 && i.imm_operands == 1
4221 && !i.types[1].bitfield.byte
4222 && i.op[0].imms->X_op == O_constant
4223 && fits_in_imm7 (i.op[0].imms->X_add_number)
72aea328 4224 && (i.tm.base_opcode == 0xa8
b6f8c7c4
L
4225 || (i.tm.base_opcode == 0xf6
4226 && i.tm.extension_opcode == 0x0)))
4227 {
4228 /* Optimize: -Os:
4229 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
4230 */
4231 unsigned int base_regnum = i.op[1].regs->reg_num;
4232 if (flag_code == CODE_64BIT || base_regnum < 4)
4233 {
4234 i.types[1].bitfield.byte = 1;
4235 /* Ignore the suffix. */
4236 i.suffix = 0;
7697afb6
JB
4237 /* Convert to byte registers. */
4238 if (i.types[1].bitfield.word)
4239 j = 16;
4240 else if (i.types[1].bitfield.dword)
4241 j = 32;
4242 else
4243 j = 48;
4244 if (!(i.op[1].regs->reg_flags & RegRex) && base_regnum < 4)
4245 j += 8;
4246 i.op[1].regs -= j;
b6f8c7c4
L
4247 }
4248 }
4249 else if (flag_code == CODE_64BIT
389d00a5 4250 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
d3d50934
L
4251 && ((i.types[1].bitfield.qword
4252 && i.reg_operands == 1
b6f8c7c4
L
4253 && i.imm_operands == 1
4254 && i.op[0].imms->X_op == O_constant
507916b8 4255 && ((i.tm.base_opcode == 0xb8
b6f8c7c4
L
4256 && i.tm.extension_opcode == None
4257 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
4258 || (fits_in_imm31 (i.op[0].imms->X_add_number)
72aea328
JB
4259 && ((i.tm.base_opcode == 0x24
4260 || i.tm.base_opcode == 0xa8)
b6f8c7c4
L
4261 || (i.tm.base_opcode == 0x80
4262 && i.tm.extension_opcode == 0x4)
4263 || ((i.tm.base_opcode == 0xf6
507916b8 4264 || (i.tm.base_opcode | 1) == 0xc7)
b8364fa7
JB
4265 && i.tm.extension_opcode == 0x0)))
4266 || (fits_in_imm7 (i.op[0].imms->X_add_number)
4267 && i.tm.base_opcode == 0x83
4268 && i.tm.extension_opcode == 0x4)))
d3d50934
L
4269 || (i.types[0].bitfield.qword
4270 && ((i.reg_operands == 2
4271 && i.op[0].regs == i.op[1].regs
72aea328
JB
4272 && (i.tm.base_opcode == 0x30
4273 || i.tm.base_opcode == 0x28))
d3d50934
L
4274 || (i.reg_operands == 1
4275 && i.operands == 1
72aea328 4276 && i.tm.base_opcode == 0x30)))))
b6f8c7c4
L
4277 {
4278 /* Optimize: -O:
4279 andq $imm31, %r64 -> andl $imm31, %r32
b8364fa7 4280 andq $imm7, %r64 -> andl $imm7, %r32
b6f8c7c4
L
4281 testq $imm31, %r64 -> testl $imm31, %r32
4282 xorq %r64, %r64 -> xorl %r32, %r32
4283 subq %r64, %r64 -> subl %r32, %r32
4284 movq $imm31, %r64 -> movl $imm31, %r32
4285 movq $imm32, %r64 -> movl $imm32, %r32
4286 */
4287 i.tm.opcode_modifier.norex64 = 1;
507916b8 4288 if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4289 {
4290 /* Handle
4291 movq $imm31, %r64 -> movl $imm31, %r32
4292 movq $imm32, %r64 -> movl $imm32, %r32
4293 */
4294 i.tm.operand_types[0].bitfield.imm32 = 1;
4295 i.tm.operand_types[0].bitfield.imm32s = 0;
4296 i.tm.operand_types[0].bitfield.imm64 = 0;
4297 i.types[0].bitfield.imm32 = 1;
4298 i.types[0].bitfield.imm32s = 0;
4299 i.types[0].bitfield.imm64 = 0;
4300 i.types[1].bitfield.dword = 1;
4301 i.types[1].bitfield.qword = 0;
507916b8 4302 if ((i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4303 {
4304 /* Handle
4305 movq $imm31, %r64 -> movl $imm31, %r32
4306 */
507916b8 4307 i.tm.base_opcode = 0xb8;
b6f8c7c4 4308 i.tm.extension_opcode = None;
507916b8 4309 i.tm.opcode_modifier.w = 0;
b6f8c7c4
L
4310 i.tm.opcode_modifier.modrm = 0;
4311 }
4312 }
4313 }
5641ec01
JB
4314 else if (optimize > 1
4315 && !optimize_for_space
389d00a5 4316 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
5641ec01
JB
4317 && i.reg_operands == 2
4318 && i.op[0].regs == i.op[1].regs
4319 && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8
4320 || (i.tm.base_opcode & ~(Opcode_D | 1)) == 0x20)
4321 && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword))
4322 {
4323 /* Optimize: -O2:
4324 andb %rN, %rN -> testb %rN, %rN
4325 andw %rN, %rN -> testw %rN, %rN
4326 andq %rN, %rN -> testq %rN, %rN
4327 orb %rN, %rN -> testb %rN, %rN
4328 orw %rN, %rN -> testw %rN, %rN
4329 orq %rN, %rN -> testq %rN, %rN
4330
4331 and outside of 64-bit mode
4332
4333 andl %rN, %rN -> testl %rN, %rN
4334 orl %rN, %rN -> testl %rN, %rN
4335 */
4336 i.tm.base_opcode = 0x84 | (i.tm.base_opcode & 1);
4337 }
99112332 4338 else if (i.reg_operands == 3
b6f8c7c4
L
4339 && i.op[0].regs == i.op[1].regs
4340 && !i.types[2].bitfield.xmmword
4341 && (i.tm.opcode_modifier.vex
6225c532 4342 || ((!i.mask.reg || i.mask.zeroing)
ca5312a2 4343 && i.rounding.type == rc_none
e771e7c9 4344 && is_evex_encoding (&i.tm)
80c34c38 4345 && (i.vec_encoding != vex_encoding_evex
dd22218c 4346 || cpu_arch_isa_flags.bitfield.cpuavx512vl
80c34c38 4347 || i.tm.cpu_flags.bitfield.cpuavx512vl
7091c612 4348 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4349 && i.types[2].bitfield.ymmword))))
b6f8c7c4 4350 && ((i.tm.base_opcode == 0x55
b6f8c7c4 4351 || i.tm.base_opcode == 0x57
35648716
JB
4352 || i.tm.base_opcode == 0xdf
4353 || i.tm.base_opcode == 0xef
4354 || i.tm.base_opcode == 0xf8
4355 || i.tm.base_opcode == 0xf9
4356 || i.tm.base_opcode == 0xfa
4357 || i.tm.base_opcode == 0xfb
1424ad86 4358 || i.tm.base_opcode == 0x42
35648716 4359 || i.tm.base_opcode == 0x47)
b6f8c7c4
L
4360 && i.tm.extension_opcode == None))
4361 {
99112332 4362 /* Optimize: -O1:
8305403a
L
4363 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4364 vpsubq and vpsubw:
b6f8c7c4
L
4365 EVEX VOP %zmmM, %zmmM, %zmmN
4366 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4367 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4368 EVEX VOP %ymmM, %ymmM, %ymmN
4369 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4370 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4371 VEX VOP %ymmM, %ymmM, %ymmN
4372 -> VEX VOP %xmmM, %xmmM, %xmmN
4373 VOP, one of vpandn and vpxor:
4374 VEX VOP %ymmM, %ymmM, %ymmN
4375 -> VEX VOP %xmmM, %xmmM, %xmmN
4376 VOP, one of vpandnd and vpandnq:
4377 EVEX VOP %zmmM, %zmmM, %zmmN
4378 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4379 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4380 EVEX VOP %ymmM, %ymmM, %ymmN
4381 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4382 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4383 VOP, one of vpxord and vpxorq:
4384 EVEX VOP %zmmM, %zmmM, %zmmN
4385 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4386 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4387 EVEX VOP %ymmM, %ymmM, %ymmN
4388 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4389 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4390 VOP, one of kxord and kxorq:
4391 VEX VOP %kM, %kM, %kN
4392 -> VEX kxorw %kM, %kM, %kN
4393 VOP, one of kandnd and kandnq:
4394 VEX VOP %kM, %kM, %kN
4395 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4396 */
e771e7c9 4397 if (is_evex_encoding (&i.tm))
b6f8c7c4 4398 {
7b1d7ca1 4399 if (i.vec_encoding != vex_encoding_evex)
b6f8c7c4
L
4400 {
4401 i.tm.opcode_modifier.vex = VEX128;
4402 i.tm.opcode_modifier.vexw = VEXW0;
4403 i.tm.opcode_modifier.evex = 0;
4404 }
7b1d7ca1 4405 else if (optimize > 1)
dd22218c
L
4406 i.tm.opcode_modifier.evex = EVEX128;
4407 else
4408 return;
b6f8c7c4 4409 }
f74a6307 4410 else if (i.tm.operand_types[0].bitfield.class == RegMask)
1424ad86 4411 {
35648716 4412 i.tm.opcode_modifier.opcodeprefix = PREFIX_NONE;
1424ad86
JB
4413 i.tm.opcode_modifier.vexw = VEXW0;
4414 }
b6f8c7c4
L
4415 else
4416 i.tm.opcode_modifier.vex = VEX128;
4417
4418 if (i.tm.opcode_modifier.vex)
4419 for (j = 0; j < 3; j++)
4420 {
4421 i.types[j].bitfield.xmmword = 1;
4422 i.types[j].bitfield.ymmword = 0;
4423 }
4424 }
392a5972 4425 else if (i.vec_encoding != vex_encoding_evex
97ed31ae 4426 && !i.types[0].bitfield.zmmword
392a5972 4427 && !i.types[1].bitfield.zmmword
6225c532 4428 && !i.mask.reg
5273a3cd 4429 && !i.broadcast.type
97ed31ae 4430 && is_evex_encoding (&i.tm)
35648716
JB
4431 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x6f
4432 || (i.tm.base_opcode & ~4) == 0xdb
4433 || (i.tm.base_opcode & ~4) == 0xeb)
97ed31ae
L
4434 && i.tm.extension_opcode == None)
4435 {
4436 /* Optimize: -O1:
4437 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4438 vmovdqu32 and vmovdqu64:
4439 EVEX VOP %xmmM, %xmmN
4440 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4441 EVEX VOP %ymmM, %ymmN
4442 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4443 EVEX VOP %xmmM, mem
4444 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4445 EVEX VOP %ymmM, mem
4446 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4447 EVEX VOP mem, %xmmN
4448 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4449 EVEX VOP mem, %ymmN
4450 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
a0a1771e
JB
4451 VOP, one of vpand, vpandn, vpor, vpxor:
4452 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4453 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4454 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4455 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4456 EVEX VOP{d,q} mem, %xmmM, %xmmN
4457 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4458 EVEX VOP{d,q} mem, %ymmM, %ymmN
4459 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
97ed31ae 4460 */
a0a1771e 4461 for (j = 0; j < i.operands; j++)
392a5972
L
4462 if (operand_type_check (i.types[j], disp)
4463 && i.op[j].disps->X_op == O_constant)
4464 {
4465 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4466 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4467 bytes, we choose EVEX Disp8 over VEX Disp32. */
4468 int evex_disp8, vex_disp8;
4469 unsigned int memshift = i.memshift;
4470 offsetT n = i.op[j].disps->X_add_number;
4471
4472 evex_disp8 = fits_in_disp8 (n);
4473 i.memshift = 0;
4474 vex_disp8 = fits_in_disp8 (n);
4475 if (evex_disp8 != vex_disp8)
4476 {
4477 i.memshift = memshift;
4478 return;
4479 }
4480
4481 i.types[j].bitfield.disp8 = vex_disp8;
4482 break;
4483 }
35648716
JB
4484 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x6f
4485 && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2)
4486 i.tm.opcode_modifier.opcodeprefix = PREFIX_0XF3;
97ed31ae
L
4487 i.tm.opcode_modifier.vex
4488 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4489 i.tm.opcode_modifier.vexw = VEXW0;
79dec6b7 4490 /* VPAND, VPOR, and VPXOR are commutative. */
35648716 4491 if (i.reg_operands == 3 && i.tm.base_opcode != 0xdf)
79dec6b7 4492 i.tm.opcode_modifier.commutative = 1;
97ed31ae
L
4493 i.tm.opcode_modifier.evex = 0;
4494 i.tm.opcode_modifier.masking = 0;
a0a1771e 4495 i.tm.opcode_modifier.broadcast = 0;
97ed31ae
L
4496 i.tm.opcode_modifier.disp8memshift = 0;
4497 i.memshift = 0;
a0a1771e
JB
4498 if (j < i.operands)
4499 i.types[j].bitfield.disp8
4500 = fits_in_disp8 (i.op[j].disps->X_add_number);
97ed31ae 4501 }
b6f8c7c4
L
4502}
4503
ae531041
L
4504/* Return non-zero for load instruction. */
4505
4506static int
4507load_insn_p (void)
4508{
4509 unsigned int dest;
4510 int any_vex_p = is_any_vex_encoding (&i.tm);
4511 unsigned int base_opcode = i.tm.base_opcode | 1;
4512
4513 if (!any_vex_p)
4514 {
a09f656b 4515 /* Anysize insns: lea, invlpg, clflush, prefetchnta, prefetcht0,
4516 prefetcht1, prefetcht2, prefetchtw, bndmk, bndcl, bndcu, bndcn,
4517 bndstx, bndldx, prefetchwt1, clflushopt, clwb, cldemote. */
4518 if (i.tm.opcode_modifier.anysize)
ae531041
L
4519 return 0;
4520
389d00a5
JB
4521 /* pop. */
4522 if (strcmp (i.tm.name, "pop") == 0)
4523 return 1;
4524 }
4525
4526 if (i.tm.opcode_modifier.opcodespace == SPACE_BASE)
4527 {
4528 /* popf, popa. */
4529 if (i.tm.base_opcode == 0x9d
a09f656b 4530 || i.tm.base_opcode == 0x61)
ae531041
L
4531 return 1;
4532
4533 /* movs, cmps, lods, scas. */
4534 if ((i.tm.base_opcode | 0xb) == 0xaf)
4535 return 1;
4536
a09f656b 4537 /* outs, xlatb. */
4538 if (base_opcode == 0x6f
4539 || i.tm.base_opcode == 0xd7)
ae531041 4540 return 1;
a09f656b 4541 /* NB: For AMD-specific insns with implicit memory operands,
4542 they're intentionally not covered. */
ae531041
L
4543 }
4544
4545 /* No memory operand. */
4546 if (!i.mem_operands)
4547 return 0;
4548
4549 if (any_vex_p)
4550 {
4551 /* vldmxcsr. */
4552 if (i.tm.base_opcode == 0xae
4553 && i.tm.opcode_modifier.vex
441f6aca 4554 && i.tm.opcode_modifier.opcodespace == SPACE_0F
35648716 4555 && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE
ae531041
L
4556 && i.tm.extension_opcode == 2)
4557 return 1;
4558 }
389d00a5 4559 else if (i.tm.opcode_modifier.opcodespace == SPACE_BASE)
ae531041
L
4560 {
4561 /* test, not, neg, mul, imul, div, idiv. */
4562 if ((i.tm.base_opcode == 0xf6 || i.tm.base_opcode == 0xf7)
4563 && i.tm.extension_opcode != 1)
4564 return 1;
4565
4566 /* inc, dec. */
4567 if (base_opcode == 0xff && i.tm.extension_opcode <= 1)
4568 return 1;
4569
4570 /* add, or, adc, sbb, and, sub, xor, cmp. */
4571 if (i.tm.base_opcode >= 0x80 && i.tm.base_opcode <= 0x83)
4572 return 1;
4573
ae531041
L
4574 /* rol, ror, rcl, rcr, shl/sal, shr, sar. */
4575 if ((base_opcode == 0xc1
4576 || (i.tm.base_opcode >= 0xd0 && i.tm.base_opcode <= 0xd3))
4577 && i.tm.extension_opcode != 6)
4578 return 1;
4579
ae531041 4580 /* Check for x87 instructions. */
389d00a5 4581 if (base_opcode >= 0xd8 && base_opcode <= 0xdf)
ae531041
L
4582 {
4583 /* Skip fst, fstp, fstenv, fstcw. */
4584 if (i.tm.base_opcode == 0xd9
4585 && (i.tm.extension_opcode == 2
4586 || i.tm.extension_opcode == 3
4587 || i.tm.extension_opcode == 6
4588 || i.tm.extension_opcode == 7))
4589 return 0;
4590
4591 /* Skip fisttp, fist, fistp, fstp. */
4592 if (i.tm.base_opcode == 0xdb
4593 && (i.tm.extension_opcode == 1
4594 || i.tm.extension_opcode == 2
4595 || i.tm.extension_opcode == 3
4596 || i.tm.extension_opcode == 7))
4597 return 0;
4598
4599 /* Skip fisttp, fst, fstp, fsave, fstsw. */
4600 if (i.tm.base_opcode == 0xdd
4601 && (i.tm.extension_opcode == 1
4602 || i.tm.extension_opcode == 2
4603 || i.tm.extension_opcode == 3
4604 || i.tm.extension_opcode == 6
4605 || i.tm.extension_opcode == 7))
4606 return 0;
4607
4608 /* Skip fisttp, fist, fistp, fbstp, fistp. */
4609 if (i.tm.base_opcode == 0xdf
4610 && (i.tm.extension_opcode == 1
4611 || i.tm.extension_opcode == 2
4612 || i.tm.extension_opcode == 3
4613 || i.tm.extension_opcode == 6
4614 || i.tm.extension_opcode == 7))
4615 return 0;
4616
4617 return 1;
4618 }
4619 }
389d00a5
JB
4620 else if (i.tm.opcode_modifier.opcodespace == SPACE_0F)
4621 {
4622 /* bt, bts, btr, btc. */
4623 if (i.tm.base_opcode == 0xba
4624 && (i.tm.extension_opcode >= 4 && i.tm.extension_opcode <= 7))
4625 return 1;
4626
4627 /* cmpxchg8b, cmpxchg16b, xrstors, vmptrld. */
4628 if (i.tm.base_opcode == 0xc7
4629 && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE
4630 && (i.tm.extension_opcode == 1 || i.tm.extension_opcode == 3
4631 || i.tm.extension_opcode == 6))
4632 return 1;
4633
4634 /* fxrstor, ldmxcsr, xrstor. */
4635 if (i.tm.base_opcode == 0xae
4636 && (i.tm.extension_opcode == 1
4637 || i.tm.extension_opcode == 2
4638 || i.tm.extension_opcode == 5))
4639 return 1;
4640
4641 /* lgdt, lidt, lmsw. */
4642 if (i.tm.base_opcode == 0x01
4643 && (i.tm.extension_opcode == 2
4644 || i.tm.extension_opcode == 3
4645 || i.tm.extension_opcode == 6))
4646 return 1;
4647 }
ae531041
L
4648
4649 dest = i.operands - 1;
4650
4651 /* Check fake imm8 operand and 3 source operands. */
4652 if ((i.tm.opcode_modifier.immext
4653 || i.tm.opcode_modifier.vexsources == VEX3SOURCES)
4654 && i.types[dest].bitfield.imm8)
4655 dest--;
4656
389d00a5
JB
4657 /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg. */
4658 if (i.tm.opcode_modifier.opcodespace == SPACE_BASE
ae531041
L
4659 && (base_opcode == 0x1
4660 || base_opcode == 0x9
4661 || base_opcode == 0x11
4662 || base_opcode == 0x19
4663 || base_opcode == 0x21
4664 || base_opcode == 0x29
4665 || base_opcode == 0x31
4666 || base_opcode == 0x39
389d00a5
JB
4667 || (base_opcode | 2) == 0x87))
4668 return 1;
4669
4670 /* xadd. */
4671 if (i.tm.opcode_modifier.opcodespace == SPACE_0F
4672 && base_opcode == 0xc1)
ae531041
L
4673 return 1;
4674
4675 /* Check for load instruction. */
4676 return (i.types[dest].bitfield.class != ClassNone
4677 || i.types[dest].bitfield.instance == Accum);
4678}
4679
4680/* Output lfence, 0xfaee8, after instruction. */
4681
4682static void
4683insert_lfence_after (void)
4684{
4685 if (lfence_after_load && load_insn_p ())
4686 {
a09f656b 4687 /* There are also two REP string instructions that require
4688 special treatment. Specifically, the compare string (CMPS)
4689 and scan string (SCAS) instructions set EFLAGS in a manner
4690 that depends on the data being compared/scanned. When used
4691 with a REP prefix, the number of iterations may therefore
4692 vary depending on this data. If the data is a program secret
4693 chosen by the adversary using an LVI method,
4694 then this data-dependent behavior may leak some aspect
4695 of the secret. */
4696 if (((i.tm.base_opcode | 0x1) == 0xa7
4697 || (i.tm.base_opcode | 0x1) == 0xaf)
4698 && i.prefix[REP_PREFIX])
4699 {
4700 as_warn (_("`%s` changes flags which would affect control flow behavior"),
4701 i.tm.name);
4702 }
ae531041
L
4703 char *p = frag_more (3);
4704 *p++ = 0xf;
4705 *p++ = 0xae;
4706 *p = 0xe8;
4707 }
4708}
4709
4710/* Output lfence, 0xfaee8, before instruction. */
4711
4712static void
4713insert_lfence_before (void)
4714{
4715 char *p;
4716
389d00a5 4717 if (i.tm.opcode_modifier.opcodespace != SPACE_BASE)
ae531041
L
4718 return;
4719
4720 if (i.tm.base_opcode == 0xff
4721 && (i.tm.extension_opcode == 2 || i.tm.extension_opcode == 4))
4722 {
4723 /* Insert lfence before indirect branch if needed. */
4724
4725 if (lfence_before_indirect_branch == lfence_branch_none)
4726 return;
4727
4728 if (i.operands != 1)
4729 abort ();
4730
4731 if (i.reg_operands == 1)
4732 {
4733 /* Indirect branch via register. Don't insert lfence with
4734 -mlfence-after-load=yes. */
4735 if (lfence_after_load
4736 || lfence_before_indirect_branch == lfence_branch_memory)
4737 return;
4738 }
4739 else if (i.mem_operands == 1
4740 && lfence_before_indirect_branch != lfence_branch_register)
4741 {
4742 as_warn (_("indirect `%s` with memory operand should be avoided"),
4743 i.tm.name);
4744 return;
4745 }
4746 else
4747 return;
4748
4749 if (last_insn.kind != last_insn_other
4750 && last_insn.seg == now_seg)
4751 {
4752 as_warn_where (last_insn.file, last_insn.line,
4753 _("`%s` skips -mlfence-before-indirect-branch on `%s`"),
4754 last_insn.name, i.tm.name);
4755 return;
4756 }
4757
4758 p = frag_more (3);
4759 *p++ = 0xf;
4760 *p++ = 0xae;
4761 *p = 0xe8;
4762 return;
4763 }
4764
503648e4 4765 /* Output or/not/shl and lfence before near ret. */
ae531041
L
4766 if (lfence_before_ret != lfence_before_ret_none
4767 && (i.tm.base_opcode == 0xc2
503648e4 4768 || i.tm.base_opcode == 0xc3))
ae531041
L
4769 {
4770 if (last_insn.kind != last_insn_other
4771 && last_insn.seg == now_seg)
4772 {
4773 as_warn_where (last_insn.file, last_insn.line,
4774 _("`%s` skips -mlfence-before-ret on `%s`"),
4775 last_insn.name, i.tm.name);
4776 return;
4777 }
a09f656b 4778
a09f656b 4779 /* Near ret ingore operand size override under CPU64. */
503648e4 4780 char prefix = flag_code == CODE_64BIT
4781 ? 0x48
4782 : i.prefix[DATA_PREFIX] ? 0x66 : 0x0;
a09f656b 4783
4784 if (lfence_before_ret == lfence_before_ret_not)
4785 {
4786 /* not: 0xf71424, may add prefix
4787 for operand size override or 64-bit code. */
4788 p = frag_more ((prefix ? 2 : 0) + 6 + 3);
4789 if (prefix)
4790 *p++ = prefix;
ae531041
L
4791 *p++ = 0xf7;
4792 *p++ = 0x14;
4793 *p++ = 0x24;
a09f656b 4794 if (prefix)
4795 *p++ = prefix;
ae531041
L
4796 *p++ = 0xf7;
4797 *p++ = 0x14;
4798 *p++ = 0x24;
4799 }
a09f656b 4800 else
4801 {
4802 p = frag_more ((prefix ? 1 : 0) + 4 + 3);
4803 if (prefix)
4804 *p++ = prefix;
4805 if (lfence_before_ret == lfence_before_ret_or)
4806 {
4807 /* or: 0x830c2400, may add prefix
4808 for operand size override or 64-bit code. */
4809 *p++ = 0x83;
4810 *p++ = 0x0c;
4811 }
4812 else
4813 {
4814 /* shl: 0xc1242400, may add prefix
4815 for operand size override or 64-bit code. */
4816 *p++ = 0xc1;
4817 *p++ = 0x24;
4818 }
4819
4820 *p++ = 0x24;
4821 *p++ = 0x0;
4822 }
4823
ae531041
L
4824 *p++ = 0xf;
4825 *p++ = 0xae;
4826 *p = 0xe8;
4827 }
4828}
4829
252b5132
RH
4830/* This is the guts of the machine-dependent assembler. LINE points to a
4831 machine dependent instruction. This function is supposed to emit
4832 the frags/bytes it assembles to. */
4833
4834void
65da13b5 4835md_assemble (char *line)
252b5132 4836{
40fb9820 4837 unsigned int j;
83b16ac6 4838 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 4839 const insn_template *t;
252b5132 4840
47926f60 4841 /* Initialize globals. */
252b5132 4842 memset (&i, '\0', sizeof (i));
ca5312a2 4843 i.rounding.type = rc_none;
252b5132 4844 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 4845 i.reloc[j] = NO_RELOC;
252b5132
RH
4846 memset (disp_expressions, '\0', sizeof (disp_expressions));
4847 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 4848 save_stack_p = save_stack;
252b5132
RH
4849
4850 /* First parse an instruction mnemonic & call i386_operand for the operands.
4851 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 4852 start of a (possibly prefixed) mnemonic. */
252b5132 4853
29b0f896
AM
4854 line = parse_insn (line, mnemonic);
4855 if (line == NULL)
4856 return;
83b16ac6 4857 mnem_suffix = i.suffix;
252b5132 4858
29b0f896 4859 line = parse_operands (line, mnemonic);
ee86248c 4860 this_operand = -1;
8325cc63
JB
4861 xfree (i.memop1_string);
4862 i.memop1_string = NULL;
29b0f896
AM
4863 if (line == NULL)
4864 return;
252b5132 4865
29b0f896
AM
4866 /* Now we've parsed the mnemonic into a set of templates, and have the
4867 operands at hand. */
4868
b630c145 4869 /* All Intel opcodes have reversed operands except for "bound", "enter",
c0e54661
JB
4870 "invlpg*", "monitor*", "mwait*", "tpause", "umwait", "pvalidate",
4871 "rmpadjust", and "rmpupdate". We also don't reverse intersegment "jmp"
4872 and "call" instructions with 2 immediate operands so that the immediate
4873 segment precedes the offset consistently in Intel and AT&T modes. */
4d456e3d
L
4874 if (intel_syntax
4875 && i.operands > 1
29b0f896 4876 && (strcmp (mnemonic, "bound") != 0)
c0e54661 4877 && (strncmp (mnemonic, "invlpg", 6) != 0)
d34049e8
ML
4878 && !startswith (mnemonic, "monitor")
4879 && !startswith (mnemonic, "mwait")
c0e54661 4880 && (strcmp (mnemonic, "pvalidate") != 0)
d34049e8 4881 && !startswith (mnemonic, "rmp")
b630c145
JB
4882 && (strcmp (mnemonic, "tpause") != 0)
4883 && (strcmp (mnemonic, "umwait") != 0)
40fb9820
L
4884 && !(operand_type_check (i.types[0], imm)
4885 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4886 swap_operands ();
4887
ec56d5c0
JB
4888 /* The order of the immediates should be reversed
4889 for 2 immediates extrq and insertq instructions */
4890 if (i.imm_operands == 2
4891 && (strcmp (mnemonic, "extrq") == 0
4892 || strcmp (mnemonic, "insertq") == 0))
4893 swap_2_operands (0, 1);
4894
29b0f896
AM
4895 if (i.imm_operands)
4896 optimize_imm ();
4897
a9aabc23 4898 if (i.disp_operands && !want_disp32 (current_templates->start))
cce08655
JB
4899 {
4900 for (j = 0; j < i.operands; ++j)
4901 {
4902 const expressionS *exp = i.op[j].disps;
4903
4904 if (!operand_type_check (i.types[j], disp))
4905 continue;
4906
4907 if (exp->X_op != O_constant)
4908 continue;
4909
4910 /* Since displacement is signed extended to 64bit, don't allow
4911 disp32 and turn off disp32s if they are out of range. */
4912 i.types[j].bitfield.disp32 = 0;
4913 if (fits_in_signed_long (exp->X_add_number))
4914 continue;
4915
4916 i.types[j].bitfield.disp32s = 0;
4917 if (i.types[j].bitfield.baseindex)
4918 {
4919 as_bad (_("0x%" BFD_VMA_FMT "x out of range of signed 32bit displacement"),
4920 exp->X_add_number);
4921 return;
4922 }
4923 }
4924 }
4925
b300c311
L
4926 /* Don't optimize displacement for movabs since it only takes 64bit
4927 displacement. */
4928 if (i.disp_operands
a501d77e 4929 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4930 && (flag_code != CODE_64BIT
4931 || strcmp (mnemonic, "movabs") != 0))
4932 optimize_disp ();
29b0f896
AM
4933
4934 /* Next, we find a template that matches the given insn,
4935 making sure the overlap of the given operands types is consistent
4936 with the template operand types. */
252b5132 4937
83b16ac6 4938 if (!(t = match_template (mnem_suffix)))
29b0f896 4939 return;
252b5132 4940
7bab8ab5 4941 if (sse_check != check_none
81f8a913 4942 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4943 && !i.tm.cpu_flags.bitfield.cpuavx
569d50f1 4944 && !i.tm.cpu_flags.bitfield.cpuavx512f
daf50ae7
L
4945 && (i.tm.cpu_flags.bitfield.cpusse
4946 || i.tm.cpu_flags.bitfield.cpusse2
4947 || i.tm.cpu_flags.bitfield.cpusse3
4948 || i.tm.cpu_flags.bitfield.cpussse3
4949 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e
JB
4950 || i.tm.cpu_flags.bitfield.cpusse4_2
4951 || i.tm.cpu_flags.bitfield.cpupclmul
4952 || i.tm.cpu_flags.bitfield.cpuaes
569d50f1 4953 || i.tm.cpu_flags.bitfield.cpusha
6e3e5c9e 4954 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4955 {
7bab8ab5 4956 (sse_check == check_warning
daf50ae7
L
4957 ? as_warn
4958 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4959 }
4960
40fb9820 4961 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4962 if (!add_prefix (FWAIT_OPCODE))
4963 return;
252b5132 4964
d5de92cf 4965 /* Check if REP prefix is OK. */
742732c7 4966 if (i.rep_prefix && i.tm.opcode_modifier.prefixok != PrefixRep)
d5de92cf
L
4967 {
4968 as_bad (_("invalid instruction `%s' after `%s'"),
4969 i.tm.name, i.rep_prefix);
4970 return;
4971 }
4972
c1ba0266
L
4973 /* Check for lock without a lockable instruction. Destination operand
4974 must be memory unless it is xchg (0x86). */
c32fa91d 4975 if (i.prefix[LOCK_PREFIX]
742732c7 4976 && (i.tm.opcode_modifier.prefixok < PrefixLock
c1ba0266
L
4977 || i.mem_operands == 0
4978 || (i.tm.base_opcode != 0x86
8dc0818e 4979 && !(i.flags[i.operands - 1] & Operand_Mem))))
c32fa91d
L
4980 {
4981 as_bad (_("expecting lockable instruction after `lock'"));
4982 return;
4983 }
4984
40d231b4
JB
4985 /* Check for data size prefix on VEX/XOP/EVEX encoded and SIMD insns. */
4986 if (i.prefix[DATA_PREFIX]
4987 && (is_any_vex_encoding (&i.tm)
4988 || i.tm.operand_types[i.imm_operands].bitfield.class >= RegMMX
4989 || i.tm.operand_types[i.imm_operands + 1].bitfield.class >= RegMMX))
7a8655d2
JB
4990 {
4991 as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
4992 return;
4993 }
4994
42164a71 4995 /* Check if HLE prefix is OK. */
165de32a 4996 if (i.hle_prefix && !check_hle ())
42164a71
L
4997 return;
4998
7e8b059b
L
4999 /* Check BND prefix. */
5000 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
5001 as_bad (_("expecting valid branch instruction after `bnd'"));
5002
04ef582a 5003 /* Check NOTRACK prefix. */
742732c7 5004 if (i.notrack_prefix && i.tm.opcode_modifier.prefixok != PrefixNoTrack)
9fef80d6 5005 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 5006
327e8c42
JB
5007 if (i.tm.cpu_flags.bitfield.cpumpx)
5008 {
5009 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
5010 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
5011 else if (flag_code != CODE_16BIT
5012 ? i.prefix[ADDR_PREFIX]
5013 : i.mem_operands && !i.prefix[ADDR_PREFIX])
5014 as_bad (_("16-bit address isn't allowed in MPX instructions"));
5015 }
7e8b059b
L
5016
5017 /* Insert BND prefix. */
76d3a78a
JB
5018 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
5019 {
5020 if (!i.prefix[BND_PREFIX])
5021 add_prefix (BND_PREFIX_OPCODE);
5022 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
5023 {
5024 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
5025 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
5026 }
5027 }
7e8b059b 5028
29b0f896 5029 /* Check string instruction segment overrides. */
51c8edf6 5030 if (i.tm.opcode_modifier.isstring >= IS_STRING_ES_OP0)
29b0f896 5031 {
51c8edf6 5032 gas_assert (i.mem_operands);
29b0f896 5033 if (!check_string ())
5dd0794d 5034 return;
fc0763e6 5035 i.disp_operands = 0;
29b0f896 5036 }
5dd0794d 5037
b6f8c7c4
L
5038 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
5039 optimize_encoding ();
5040
29b0f896
AM
5041 if (!process_suffix ())
5042 return;
e413e4e9 5043
921eafea 5044 /* Update operand types and check extended states. */
bc0844ae 5045 for (j = 0; j < i.operands; j++)
921eafea
L
5046 {
5047 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
3d70986f 5048 switch (i.tm.operand_types[j].bitfield.class)
921eafea
L
5049 {
5050 default:
5051 break;
5052 case RegMMX:
5053 i.xstate |= xstate_mmx;
5054 break;
5055 case RegMask:
32930e4e 5056 i.xstate |= xstate_mask;
921eafea
L
5057 break;
5058 case RegSIMD:
3d70986f 5059 if (i.tm.operand_types[j].bitfield.tmmword)
921eafea 5060 i.xstate |= xstate_tmm;
3d70986f 5061 else if (i.tm.operand_types[j].bitfield.zmmword)
921eafea 5062 i.xstate |= xstate_zmm;
3d70986f 5063 else if (i.tm.operand_types[j].bitfield.ymmword)
921eafea 5064 i.xstate |= xstate_ymm;
3d70986f 5065 else if (i.tm.operand_types[j].bitfield.xmmword)
921eafea
L
5066 i.xstate |= xstate_xmm;
5067 break;
5068 }
5069 }
bc0844ae 5070
29b0f896
AM
5071 /* Make still unresolved immediate matches conform to size of immediate
5072 given in i.suffix. */
5073 if (!finalize_imm ())
5074 return;
252b5132 5075
40fb9820 5076 if (i.types[0].bitfield.imm1)
29b0f896 5077 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 5078
9afe6eb8
L
5079 /* We only need to check those implicit registers for instructions
5080 with 3 operands or less. */
5081 if (i.operands <= 3)
5082 for (j = 0; j < i.operands; j++)
75e5731b
JB
5083 if (i.types[j].bitfield.instance != InstanceNone
5084 && !i.types[j].bitfield.xmmword)
9afe6eb8 5085 i.reg_operands--;
40fb9820 5086
29b0f896
AM
5087 /* For insns with operands there are more diddles to do to the opcode. */
5088 if (i.operands)
5089 {
5090 if (!process_operands ())
5091 return;
5092 }
8c190ce0 5093 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
5094 {
5095 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
5096 as_warn (_("translating to `%sp'"), i.tm.name);
5097 }
252b5132 5098
7a8655d2 5099 if (is_any_vex_encoding (&i.tm))
9e5e5283 5100 {
c1dc7af5 5101 if (!cpu_arch_flags.bitfield.cpui286)
9e5e5283 5102 {
c1dc7af5 5103 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
9e5e5283
L
5104 i.tm.name);
5105 return;
5106 }
c0f3af97 5107
0b9404fd
JB
5108 /* Check for explicit REX prefix. */
5109 if (i.prefix[REX_PREFIX] || i.rex_encoding)
5110 {
5111 as_bad (_("REX prefix invalid with `%s'"), i.tm.name);
5112 return;
5113 }
5114
9e5e5283
L
5115 if (i.tm.opcode_modifier.vex)
5116 build_vex_prefix (t);
5117 else
5118 build_evex_prefix ();
0b9404fd
JB
5119
5120 /* The individual REX.RXBW bits got consumed. */
5121 i.rex &= REX_OPCODE;
9e5e5283 5122 }
43234a1e 5123
5dd85c99
SP
5124 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
5125 instructions may define INT_OPCODE as well, so avoid this corner
5126 case for those instructions that use MODRM. */
389d00a5
JB
5127 if (i.tm.opcode_modifier.opcodespace == SPACE_BASE
5128 && i.tm.base_opcode == INT_OPCODE
a6461c02
SP
5129 && !i.tm.opcode_modifier.modrm
5130 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
5131 {
5132 i.tm.base_opcode = INT3_OPCODE;
5133 i.imm_operands = 0;
5134 }
252b5132 5135
0cfa3eb3
JB
5136 if ((i.tm.opcode_modifier.jump == JUMP
5137 || i.tm.opcode_modifier.jump == JUMP_BYTE
5138 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896
AM
5139 && i.op[0].disps->X_op == O_constant)
5140 {
5141 /* Convert "jmp constant" (and "call constant") to a jump (call) to
5142 the absolute address given by the constant. Since ix86 jumps and
5143 calls are pc relative, we need to generate a reloc. */
5144 i.op[0].disps->X_add_symbol = &abs_symbol;
5145 i.op[0].disps->X_op = O_symbol;
5146 }
252b5132 5147
29b0f896
AM
5148 /* For 8 bit registers we need an empty rex prefix. Also if the
5149 instruction already has a prefix, we need to convert old
5150 registers to new ones. */
773f551c 5151
bab6aec1 5152 if ((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte
29b0f896 5153 && (i.op[0].regs->reg_flags & RegRex64) != 0)
bab6aec1 5154 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte
29b0f896 5155 && (i.op[1].regs->reg_flags & RegRex64) != 0)
bab6aec1
JB
5156 || (((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte)
5157 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte))
29b0f896
AM
5158 && i.rex != 0))
5159 {
5160 int x;
726c5dcd 5161
29b0f896
AM
5162 i.rex |= REX_OPCODE;
5163 for (x = 0; x < 2; x++)
5164 {
5165 /* Look for 8 bit operand that uses old registers. */
bab6aec1 5166 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
29b0f896 5167 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 5168 {
3f93af61 5169 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
29b0f896
AM
5170 /* In case it is "hi" register, give up. */
5171 if (i.op[x].regs->reg_num > 3)
a540244d 5172 as_bad (_("can't encode register '%s%s' in an "
4eed87de 5173 "instruction requiring REX prefix."),
a540244d 5174 register_prefix, i.op[x].regs->reg_name);
773f551c 5175
29b0f896
AM
5176 /* Otherwise it is equivalent to the extended register.
5177 Since the encoding doesn't change this is merely
5178 cosmetic cleanup for debug output. */
5179
5180 i.op[x].regs = i.op[x].regs + 8;
773f551c 5181 }
29b0f896
AM
5182 }
5183 }
773f551c 5184
6b6b6807
L
5185 if (i.rex == 0 && i.rex_encoding)
5186 {
5187 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
3f93af61 5188 that uses legacy register. If it is "hi" register, don't add
6b6b6807
L
5189 the REX_OPCODE byte. */
5190 int x;
5191 for (x = 0; x < 2; x++)
bab6aec1 5192 if (i.types[x].bitfield.class == Reg
6b6b6807
L
5193 && i.types[x].bitfield.byte
5194 && (i.op[x].regs->reg_flags & RegRex64) == 0
5195 && i.op[x].regs->reg_num > 3)
5196 {
3f93af61 5197 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
5b7c81bd 5198 i.rex_encoding = false;
6b6b6807
L
5199 break;
5200 }
5201
5202 if (i.rex_encoding)
5203 i.rex = REX_OPCODE;
5204 }
5205
7ab9ffdd 5206 if (i.rex != 0)
29b0f896
AM
5207 add_prefix (REX_OPCODE | i.rex);
5208
ae531041
L
5209 insert_lfence_before ();
5210
29b0f896
AM
5211 /* We are ready to output the insn. */
5212 output_insn ();
e379e5f3 5213
ae531041
L
5214 insert_lfence_after ();
5215
e379e5f3
L
5216 last_insn.seg = now_seg;
5217
5218 if (i.tm.opcode_modifier.isprefix)
5219 {
5220 last_insn.kind = last_insn_prefix;
5221 last_insn.name = i.tm.name;
5222 last_insn.file = as_where (&last_insn.line);
5223 }
5224 else
5225 last_insn.kind = last_insn_other;
29b0f896
AM
5226}
5227
5228static char *
e3bb37b5 5229parse_insn (char *line, char *mnemonic)
29b0f896
AM
5230{
5231 char *l = line;
5232 char *token_start = l;
5233 char *mnem_p;
5c6af06e 5234 int supported;
d3ce72d0 5235 const insn_template *t;
b6169b20 5236 char *dot_p = NULL;
29b0f896 5237
29b0f896
AM
5238 while (1)
5239 {
5240 mnem_p = mnemonic;
5241 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
5242 {
b6169b20
L
5243 if (*mnem_p == '.')
5244 dot_p = mnem_p;
29b0f896
AM
5245 mnem_p++;
5246 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 5247 {
29b0f896
AM
5248 as_bad (_("no such instruction: `%s'"), token_start);
5249 return NULL;
5250 }
5251 l++;
5252 }
5253 if (!is_space_char (*l)
5254 && *l != END_OF_INSN
e44823cf
JB
5255 && (intel_syntax
5256 || (*l != PREFIX_SEPARATOR
5257 && *l != ',')))
29b0f896
AM
5258 {
5259 as_bad (_("invalid character %s in mnemonic"),
5260 output_invalid (*l));
5261 return NULL;
5262 }
5263 if (token_start == l)
5264 {
e44823cf 5265 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
5266 as_bad (_("expecting prefix; got nothing"));
5267 else
5268 as_bad (_("expecting mnemonic; got nothing"));
5269 return NULL;
5270 }
45288df1 5271
29b0f896 5272 /* Look up instruction (or prefix) via hash table. */
629310ab 5273 current_templates = (const templates *) str_hash_find (op_hash, mnemonic);
47926f60 5274
29b0f896
AM
5275 if (*l != END_OF_INSN
5276 && (!is_space_char (*l) || l[1] != END_OF_INSN)
5277 && current_templates
40fb9820 5278 && current_templates->start->opcode_modifier.isprefix)
29b0f896 5279 {
c6fb90c8 5280 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
5281 {
5282 as_bad ((flag_code != CODE_64BIT
5283 ? _("`%s' is only supported in 64-bit mode")
5284 : _("`%s' is not supported in 64-bit mode")),
5285 current_templates->start->name);
5286 return NULL;
5287 }
29b0f896
AM
5288 /* If we are in 16-bit mode, do not allow addr16 or data16.
5289 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
5290 if ((current_templates->start->opcode_modifier.size == SIZE16
5291 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 5292 && flag_code != CODE_64BIT
673fe0f0 5293 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
5294 ^ (flag_code == CODE_16BIT)))
5295 {
5296 as_bad (_("redundant %s prefix"),
5297 current_templates->start->name);
5298 return NULL;
45288df1 5299 }
31184569
JB
5300
5301 if (current_templates->start->base_opcode == PSEUDO_PREFIX)
29b0f896 5302 {
86fa6981 5303 /* Handle pseudo prefixes. */
31184569 5304 switch (current_templates->start->extension_opcode)
86fa6981 5305 {
41eb8e88 5306 case Prefix_Disp8:
86fa6981
L
5307 /* {disp8} */
5308 i.disp_encoding = disp_encoding_8bit;
5309 break;
41eb8e88
L
5310 case Prefix_Disp16:
5311 /* {disp16} */
5312 i.disp_encoding = disp_encoding_16bit;
5313 break;
5314 case Prefix_Disp32:
86fa6981
L
5315 /* {disp32} */
5316 i.disp_encoding = disp_encoding_32bit;
5317 break;
41eb8e88 5318 case Prefix_Load:
86fa6981
L
5319 /* {load} */
5320 i.dir_encoding = dir_encoding_load;
5321 break;
41eb8e88 5322 case Prefix_Store:
86fa6981
L
5323 /* {store} */
5324 i.dir_encoding = dir_encoding_store;
5325 break;
41eb8e88 5326 case Prefix_VEX:
42e04b36
L
5327 /* {vex} */
5328 i.vec_encoding = vex_encoding_vex;
86fa6981 5329 break;
41eb8e88 5330 case Prefix_VEX3:
86fa6981
L
5331 /* {vex3} */
5332 i.vec_encoding = vex_encoding_vex3;
5333 break;
41eb8e88 5334 case Prefix_EVEX:
86fa6981
L
5335 /* {evex} */
5336 i.vec_encoding = vex_encoding_evex;
5337 break;
41eb8e88 5338 case Prefix_REX:
6b6b6807 5339 /* {rex} */
5b7c81bd 5340 i.rex_encoding = true;
6b6b6807 5341 break;
41eb8e88 5342 case Prefix_NoOptimize:
b6f8c7c4 5343 /* {nooptimize} */
5b7c81bd 5344 i.no_optimize = true;
b6f8c7c4 5345 break;
86fa6981
L
5346 default:
5347 abort ();
5348 }
5349 }
5350 else
5351 {
5352 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 5353 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 5354 {
4e9ac44a
L
5355 case PREFIX_EXIST:
5356 return NULL;
5357 case PREFIX_DS:
d777820b 5358 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
5359 i.notrack_prefix = current_templates->start->name;
5360 break;
5361 case PREFIX_REP:
5362 if (current_templates->start->cpu_flags.bitfield.cpuhle)
5363 i.hle_prefix = current_templates->start->name;
5364 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
5365 i.bnd_prefix = current_templates->start->name;
5366 else
5367 i.rep_prefix = current_templates->start->name;
5368 break;
5369 default:
5370 break;
86fa6981 5371 }
29b0f896
AM
5372 }
5373 /* Skip past PREFIX_SEPARATOR and reset token_start. */
5374 token_start = ++l;
5375 }
5376 else
5377 break;
5378 }
45288df1 5379
30a55f88 5380 if (!current_templates)
b6169b20 5381 {
07d5e953
JB
5382 /* Deprecated functionality (new code should use pseudo-prefixes instead):
5383 Check if we should swap operand or force 32bit displacement in
f8a5c266 5384 encoding. */
30a55f88 5385 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 5386 i.dir_encoding = dir_encoding_swap;
8d63c93e 5387 else if (mnem_p - 3 == dot_p
a501d77e
L
5388 && dot_p[1] == 'd'
5389 && dot_p[2] == '8')
5390 i.disp_encoding = disp_encoding_8bit;
8d63c93e 5391 else if (mnem_p - 4 == dot_p
f8a5c266
L
5392 && dot_p[1] == 'd'
5393 && dot_p[2] == '3'
5394 && dot_p[3] == '2')
a501d77e 5395 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
5396 else
5397 goto check_suffix;
5398 mnem_p = dot_p;
5399 *dot_p = '\0';
629310ab 5400 current_templates = (const templates *) str_hash_find (op_hash, mnemonic);
b6169b20
L
5401 }
5402
29b0f896
AM
5403 if (!current_templates)
5404 {
dc1e8a47 5405 check_suffix:
1c529385 5406 if (mnem_p > mnemonic)
29b0f896 5407 {
1c529385
LH
5408 /* See if we can get a match by trimming off a suffix. */
5409 switch (mnem_p[-1])
29b0f896 5410 {
1c529385
LH
5411 case WORD_MNEM_SUFFIX:
5412 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
5413 i.suffix = SHORT_MNEM_SUFFIX;
5414 else
1c529385
LH
5415 /* Fall through. */
5416 case BYTE_MNEM_SUFFIX:
5417 case QWORD_MNEM_SUFFIX:
5418 i.suffix = mnem_p[-1];
29b0f896 5419 mnem_p[-1] = '\0';
fe0e921f
AM
5420 current_templates
5421 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5422 break;
5423 case SHORT_MNEM_SUFFIX:
5424 case LONG_MNEM_SUFFIX:
5425 if (!intel_syntax)
5426 {
5427 i.suffix = mnem_p[-1];
5428 mnem_p[-1] = '\0';
fe0e921f
AM
5429 current_templates
5430 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5431 }
5432 break;
5433
5434 /* Intel Syntax. */
5435 case 'd':
5436 if (intel_syntax)
5437 {
5438 if (intel_float_operand (mnemonic) == 1)
5439 i.suffix = SHORT_MNEM_SUFFIX;
5440 else
5441 i.suffix = LONG_MNEM_SUFFIX;
5442 mnem_p[-1] = '\0';
fe0e921f
AM
5443 current_templates
5444 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5445 }
5446 break;
29b0f896 5447 }
29b0f896 5448 }
1c529385 5449
29b0f896
AM
5450 if (!current_templates)
5451 {
5452 as_bad (_("no such instruction: `%s'"), token_start);
5453 return NULL;
5454 }
5455 }
252b5132 5456
0cfa3eb3
JB
5457 if (current_templates->start->opcode_modifier.jump == JUMP
5458 || current_templates->start->opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
5459 {
5460 /* Check for a branch hint. We allow ",pt" and ",pn" for
5461 predict taken and predict not taken respectively.
5462 I'm not sure that branch hints actually do anything on loop
5463 and jcxz insns (JumpByte) for current Pentium4 chips. They
5464 may work in the future and it doesn't hurt to accept them
5465 now. */
5466 if (l[0] == ',' && l[1] == 'p')
5467 {
5468 if (l[2] == 't')
5469 {
5470 if (!add_prefix (DS_PREFIX_OPCODE))
5471 return NULL;
5472 l += 3;
5473 }
5474 else if (l[2] == 'n')
5475 {
5476 if (!add_prefix (CS_PREFIX_OPCODE))
5477 return NULL;
5478 l += 3;
5479 }
5480 }
5481 }
5482 /* Any other comma loses. */
5483 if (*l == ',')
5484 {
5485 as_bad (_("invalid character %s in mnemonic"),
5486 output_invalid (*l));
5487 return NULL;
5488 }
252b5132 5489
29b0f896 5490 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
5491 supported = 0;
5492 for (t = current_templates->start; t < current_templates->end; ++t)
5493 {
c0f3af97
L
5494 supported |= cpu_flags_match (t);
5495 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
5496 {
5497 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
5498 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 5499
548d0ee6
JB
5500 return l;
5501 }
29b0f896 5502 }
3629bb00 5503
548d0ee6
JB
5504 if (!(supported & CPU_FLAGS_64BIT_MATCH))
5505 as_bad (flag_code == CODE_64BIT
5506 ? _("`%s' is not supported in 64-bit mode")
5507 : _("`%s' is only supported in 64-bit mode"),
5508 current_templates->start->name);
5509 else
5510 as_bad (_("`%s' is not supported on `%s%s'"),
5511 current_templates->start->name,
5512 cpu_arch_name ? cpu_arch_name : default_arch,
5513 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 5514
548d0ee6 5515 return NULL;
29b0f896 5516}
252b5132 5517
29b0f896 5518static char *
e3bb37b5 5519parse_operands (char *l, const char *mnemonic)
29b0f896
AM
5520{
5521 char *token_start;
3138f287 5522
29b0f896
AM
5523 /* 1 if operand is pending after ','. */
5524 unsigned int expecting_operand = 0;
252b5132 5525
29b0f896
AM
5526 while (*l != END_OF_INSN)
5527 {
e68c3d59
JB
5528 /* Non-zero if operand parens not balanced. */
5529 unsigned int paren_not_balanced = 0;
5530 /* True if inside double quotes. */
5531 bool in_quotes = false;
5532
29b0f896
AM
5533 /* Skip optional white space before operand. */
5534 if (is_space_char (*l))
5535 ++l;
d02603dc 5536 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
5537 {
5538 as_bad (_("invalid character %s before operand %d"),
5539 output_invalid (*l),
5540 i.operands + 1);
5541 return NULL;
5542 }
d02603dc 5543 token_start = l; /* After white space. */
e68c3d59 5544 while (in_quotes || paren_not_balanced || *l != ',')
29b0f896
AM
5545 {
5546 if (*l == END_OF_INSN)
5547 {
e68c3d59
JB
5548 if (in_quotes)
5549 {
5550 as_bad (_("unbalanced double quotes in operand %d."),
5551 i.operands + 1);
5552 return NULL;
5553 }
29b0f896
AM
5554 if (paren_not_balanced)
5555 {
98ff9f1c
JB
5556 know (!intel_syntax);
5557 as_bad (_("unbalanced parenthesis in operand %d."),
5558 i.operands + 1);
29b0f896
AM
5559 return NULL;
5560 }
5561 else
5562 break; /* we are done */
5563 }
e68c3d59
JB
5564 else if (*l == '\\' && l[1] == '"')
5565 ++l;
5566 else if (*l == '"')
5567 in_quotes = !in_quotes;
5568 else if (!in_quotes && !is_operand_char (*l) && !is_space_char (*l))
29b0f896
AM
5569 {
5570 as_bad (_("invalid character %s in operand %d"),
5571 output_invalid (*l),
5572 i.operands + 1);
5573 return NULL;
5574 }
e68c3d59 5575 if (!intel_syntax && !in_quotes)
29b0f896
AM
5576 {
5577 if (*l == '(')
5578 ++paren_not_balanced;
5579 if (*l == ')')
5580 --paren_not_balanced;
5581 }
29b0f896
AM
5582 l++;
5583 }
5584 if (l != token_start)
5585 { /* Yes, we've read in another operand. */
5586 unsigned int operand_ok;
5587 this_operand = i.operands++;
5588 if (i.operands > MAX_OPERANDS)
5589 {
5590 as_bad (_("spurious operands; (%d operands/instruction max)"),
5591 MAX_OPERANDS);
5592 return NULL;
5593 }
9d46ce34 5594 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
5595 /* Now parse operand adding info to 'i' as we go along. */
5596 END_STRING_AND_SAVE (l);
5597
1286ab78
L
5598 if (i.mem_operands > 1)
5599 {
5600 as_bad (_("too many memory references for `%s'"),
5601 mnemonic);
5602 return 0;
5603 }
5604
29b0f896
AM
5605 if (intel_syntax)
5606 operand_ok =
5607 i386_intel_operand (token_start,
5608 intel_float_operand (mnemonic));
5609 else
a7619375 5610 operand_ok = i386_att_operand (token_start);
29b0f896
AM
5611
5612 RESTORE_END_STRING (l);
5613 if (!operand_ok)
5614 return NULL;
5615 }
5616 else
5617 {
5618 if (expecting_operand)
5619 {
5620 expecting_operand_after_comma:
5621 as_bad (_("expecting operand after ','; got nothing"));
5622 return NULL;
5623 }
5624 if (*l == ',')
5625 {
5626 as_bad (_("expecting operand before ','; got nothing"));
5627 return NULL;
5628 }
5629 }
7f3f1ea2 5630
29b0f896
AM
5631 /* Now *l must be either ',' or END_OF_INSN. */
5632 if (*l == ',')
5633 {
5634 if (*++l == END_OF_INSN)
5635 {
5636 /* Just skip it, if it's \n complain. */
5637 goto expecting_operand_after_comma;
5638 }
5639 expecting_operand = 1;
5640 }
5641 }
5642 return l;
5643}
7f3f1ea2 5644
050dfa73 5645static void
783c187b 5646swap_2_operands (unsigned int xchg1, unsigned int xchg2)
050dfa73
MM
5647{
5648 union i386_op temp_op;
40fb9820 5649 i386_operand_type temp_type;
c48dadc9 5650 unsigned int temp_flags;
050dfa73 5651 enum bfd_reloc_code_real temp_reloc;
4eed87de 5652
050dfa73
MM
5653 temp_type = i.types[xchg2];
5654 i.types[xchg2] = i.types[xchg1];
5655 i.types[xchg1] = temp_type;
c48dadc9
JB
5656
5657 temp_flags = i.flags[xchg2];
5658 i.flags[xchg2] = i.flags[xchg1];
5659 i.flags[xchg1] = temp_flags;
5660
050dfa73
MM
5661 temp_op = i.op[xchg2];
5662 i.op[xchg2] = i.op[xchg1];
5663 i.op[xchg1] = temp_op;
c48dadc9 5664
050dfa73
MM
5665 temp_reloc = i.reloc[xchg2];
5666 i.reloc[xchg2] = i.reloc[xchg1];
5667 i.reloc[xchg1] = temp_reloc;
43234a1e 5668
6225c532 5669 if (i.mask.reg)
43234a1e 5670 {
6225c532
JB
5671 if (i.mask.operand == xchg1)
5672 i.mask.operand = xchg2;
5673 else if (i.mask.operand == xchg2)
5674 i.mask.operand = xchg1;
43234a1e 5675 }
5273a3cd 5676 if (i.broadcast.type)
43234a1e 5677 {
5273a3cd
JB
5678 if (i.broadcast.operand == xchg1)
5679 i.broadcast.operand = xchg2;
5680 else if (i.broadcast.operand == xchg2)
5681 i.broadcast.operand = xchg1;
43234a1e 5682 }
ca5312a2 5683 if (i.rounding.type != rc_none)
43234a1e 5684 {
ca5312a2
JB
5685 if (i.rounding.operand == xchg1)
5686 i.rounding.operand = xchg2;
5687 else if (i.rounding.operand == xchg2)
5688 i.rounding.operand = xchg1;
43234a1e 5689 }
050dfa73
MM
5690}
5691
29b0f896 5692static void
e3bb37b5 5693swap_operands (void)
29b0f896 5694{
b7c61d9a 5695 switch (i.operands)
050dfa73 5696 {
c0f3af97 5697 case 5:
b7c61d9a 5698 case 4:
4d456e3d 5699 swap_2_operands (1, i.operands - 2);
1a0670f3 5700 /* Fall through. */
b7c61d9a
L
5701 case 3:
5702 case 2:
4d456e3d 5703 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
5704 break;
5705 default:
5706 abort ();
29b0f896 5707 }
29b0f896
AM
5708
5709 if (i.mem_operands == 2)
5710 {
5e042380 5711 const reg_entry *temp_seg;
29b0f896
AM
5712 temp_seg = i.seg[0];
5713 i.seg[0] = i.seg[1];
5714 i.seg[1] = temp_seg;
5715 }
5716}
252b5132 5717
29b0f896
AM
5718/* Try to ensure constant immediates are represented in the smallest
5719 opcode possible. */
5720static void
e3bb37b5 5721optimize_imm (void)
29b0f896
AM
5722{
5723 char guess_suffix = 0;
5724 int op;
252b5132 5725
29b0f896
AM
5726 if (i.suffix)
5727 guess_suffix = i.suffix;
5728 else if (i.reg_operands)
5729 {
5730 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
5731 We can't do this properly yet, i.e. excluding special register
5732 instances, but the following works for instructions with
5733 immediates. In any case, we can't set i.suffix yet. */
29b0f896 5734 for (op = i.operands; --op >= 0;)
bab6aec1
JB
5735 if (i.types[op].bitfield.class != Reg)
5736 continue;
5737 else if (i.types[op].bitfield.byte)
7ab9ffdd 5738 {
40fb9820
L
5739 guess_suffix = BYTE_MNEM_SUFFIX;
5740 break;
5741 }
bab6aec1 5742 else if (i.types[op].bitfield.word)
252b5132 5743 {
40fb9820
L
5744 guess_suffix = WORD_MNEM_SUFFIX;
5745 break;
5746 }
bab6aec1 5747 else if (i.types[op].bitfield.dword)
40fb9820
L
5748 {
5749 guess_suffix = LONG_MNEM_SUFFIX;
5750 break;
5751 }
bab6aec1 5752 else if (i.types[op].bitfield.qword)
40fb9820
L
5753 {
5754 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5755 break;
252b5132 5756 }
29b0f896
AM
5757 }
5758 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5759 guess_suffix = WORD_MNEM_SUFFIX;
5760
5761 for (op = i.operands; --op >= 0;)
40fb9820 5762 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5763 {
5764 switch (i.op[op].imms->X_op)
252b5132 5765 {
29b0f896
AM
5766 case O_constant:
5767 /* If a suffix is given, this operand may be shortened. */
5768 switch (guess_suffix)
252b5132 5769 {
29b0f896 5770 case LONG_MNEM_SUFFIX:
40fb9820
L
5771 i.types[op].bitfield.imm32 = 1;
5772 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5773 break;
5774 case WORD_MNEM_SUFFIX:
40fb9820
L
5775 i.types[op].bitfield.imm16 = 1;
5776 i.types[op].bitfield.imm32 = 1;
5777 i.types[op].bitfield.imm32s = 1;
5778 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5779 break;
5780 case BYTE_MNEM_SUFFIX:
40fb9820
L
5781 i.types[op].bitfield.imm8 = 1;
5782 i.types[op].bitfield.imm8s = 1;
5783 i.types[op].bitfield.imm16 = 1;
5784 i.types[op].bitfield.imm32 = 1;
5785 i.types[op].bitfield.imm32s = 1;
5786 i.types[op].bitfield.imm64 = 1;
29b0f896 5787 break;
252b5132 5788 }
252b5132 5789
29b0f896
AM
5790 /* If this operand is at most 16 bits, convert it
5791 to a signed 16 bit number before trying to see
5792 whether it will fit in an even smaller size.
5793 This allows a 16-bit operand such as $0xffe0 to
5794 be recognised as within Imm8S range. */
40fb9820 5795 if ((i.types[op].bitfield.imm16)
29b0f896 5796 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5797 {
87ed972d
JB
5798 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5799 ^ 0x8000) - 0x8000);
29b0f896 5800 }
a28def75
L
5801#ifdef BFD64
5802 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5803 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5804 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5805 == 0))
5806 {
5807 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5808 ^ ((offsetT) 1 << 31))
5809 - ((offsetT) 1 << 31));
5810 }
a28def75 5811#endif
40fb9820 5812 i.types[op]
c6fb90c8
L
5813 = operand_type_or (i.types[op],
5814 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5815
29b0f896
AM
5816 /* We must avoid matching of Imm32 templates when 64bit
5817 only immediate is available. */
5818 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5819 i.types[op].bitfield.imm32 = 0;
29b0f896 5820 break;
252b5132 5821
29b0f896
AM
5822 case O_absent:
5823 case O_register:
5824 abort ();
5825
5826 /* Symbols and expressions. */
5827 default:
9cd96992
JB
5828 /* Convert symbolic operand to proper sizes for matching, but don't
5829 prevent matching a set of insns that only supports sizes other
5830 than those matching the insn suffix. */
5831 {
40fb9820 5832 i386_operand_type mask, allowed;
87ed972d 5833 const insn_template *t = current_templates->start;
9cd96992 5834
0dfbf9d7 5835 operand_type_set (&mask, 0);
87ed972d 5836 allowed = t->operand_types[op];
40fb9820 5837
87ed972d 5838 while (++t < current_templates->end)
bab6aec1 5839 {
bab6aec1 5840 allowed = operand_type_and (allowed, anyimm);
87ed972d 5841 allowed = operand_type_or (allowed, t->operand_types[op]);
bab6aec1 5842 }
9cd96992
JB
5843 switch (guess_suffix)
5844 {
5845 case QWORD_MNEM_SUFFIX:
40fb9820
L
5846 mask.bitfield.imm64 = 1;
5847 mask.bitfield.imm32s = 1;
9cd96992
JB
5848 break;
5849 case LONG_MNEM_SUFFIX:
40fb9820 5850 mask.bitfield.imm32 = 1;
9cd96992
JB
5851 break;
5852 case WORD_MNEM_SUFFIX:
40fb9820 5853 mask.bitfield.imm16 = 1;
9cd96992
JB
5854 break;
5855 case BYTE_MNEM_SUFFIX:
40fb9820 5856 mask.bitfield.imm8 = 1;
9cd96992
JB
5857 break;
5858 default:
9cd96992
JB
5859 break;
5860 }
c6fb90c8 5861 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5862 if (!operand_type_all_zero (&allowed))
c6fb90c8 5863 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5864 }
29b0f896 5865 break;
252b5132 5866 }
29b0f896
AM
5867 }
5868}
47926f60 5869
29b0f896
AM
5870/* Try to use the smallest displacement type too. */
5871static void
e3bb37b5 5872optimize_disp (void)
29b0f896
AM
5873{
5874 int op;
3e73aa7c 5875
29b0f896 5876 for (op = i.operands; --op >= 0;)
40fb9820 5877 if (operand_type_check (i.types[op], disp))
252b5132 5878 {
b300c311 5879 if (i.op[op].disps->X_op == O_constant)
252b5132 5880 {
91d6fa6a 5881 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5882
91d6fa6a 5883 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5884 {
40fb9820
L
5885 i.types[op].bitfield.disp8 = 0;
5886 i.types[op].bitfield.disp16 = 0;
5887 i.types[op].bitfield.disp32 = 0;
5888 i.types[op].bitfield.disp32s = 0;
5889 i.types[op].bitfield.disp64 = 0;
b300c311
L
5890 i.op[op].disps = 0;
5891 i.disp_operands--;
f185acdd
JB
5892 continue;
5893 }
5894
5895 if (i.types[op].bitfield.disp16
5896 && (op_disp & ~(offsetT) 0xffff) == 0)
5897 {
5898 /* If this operand is at most 16 bits, convert
5899 to a signed 16 bit number and don't use 64bit
5900 displacement. */
5901 op_disp = ((op_disp ^ 0x8000) - 0x8000);
5902 i.types[op].bitfield.disp64 = 0;
b300c311 5903 }
f185acdd 5904
28a167a4 5905#ifdef BFD64
f185acdd 5906 if (flag_code == CODE_64BIT)
b300c311 5907 {
a9aabc23 5908 if (want_disp32 (current_templates->start)
28a167a4
JB
5909 && fits_in_unsigned_long (op_disp))
5910 i.types[op].bitfield.disp32 = 1;
5911
5912 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
5913 if (i.types[op].bitfield.disp32
5914 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
5915 {
5916 /* If this operand is at most 32 bits, convert
5917 to a signed 32 bit number and don't use 64bit
5918 displacement. */
28a167a4
JB
5919 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
5920 i.types[op].bitfield.disp64 = 0;
5921 }
5922
91d6fa6a 5923 if (fits_in_signed_long (op_disp))
28a9d8f5 5924 {
40fb9820
L
5925 i.types[op].bitfield.disp64 = 0;
5926 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5927 }
b300c311 5928 }
28a167a4 5929#endif
40fb9820
L
5930 if ((i.types[op].bitfield.disp32
5931 || i.types[op].bitfield.disp32s
5932 || i.types[op].bitfield.disp16)
b5014f7a 5933 && fits_in_disp8 (op_disp))
40fb9820 5934 i.types[op].bitfield.disp8 = 1;
77c59789
JB
5935
5936 i.op[op].disps->X_add_number = op_disp;
252b5132 5937 }
67a4f2b7
AO
5938 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5939 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5940 {
5941 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5942 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
5943 i.types[op].bitfield.disp8 = 0;
5944 i.types[op].bitfield.disp16 = 0;
5945 i.types[op].bitfield.disp32 = 0;
5946 i.types[op].bitfield.disp32s = 0;
5947 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
5948 }
5949 else
b300c311 5950 /* We only support 64bit displacement on constants. */
40fb9820 5951 i.types[op].bitfield.disp64 = 0;
252b5132 5952 }
29b0f896
AM
5953}
5954
4a1b91ea
L
5955/* Return 1 if there is a match in broadcast bytes between operand
5956 GIVEN and instruction template T. */
5957
5958static INLINE int
5959match_broadcast_size (const insn_template *t, unsigned int given)
5960{
5961 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5962 && i.types[given].bitfield.byte)
5963 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5964 && i.types[given].bitfield.word)
5965 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5966 && i.types[given].bitfield.dword)
5967 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5968 && i.types[given].bitfield.qword));
5969}
5970
6c30d220
L
5971/* Check if operands are valid for the instruction. */
5972
5973static int
5974check_VecOperands (const insn_template *t)
5975{
43234a1e 5976 unsigned int op;
e2195274 5977 i386_cpu_flags cpu;
e2195274
JB
5978
5979 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5980 any one operand are implicity requiring AVX512VL support if the actual
5981 operand size is YMMword or XMMword. Since this function runs after
5982 template matching, there's no need to check for YMMword/XMMword in
5983 the template. */
5984 cpu = cpu_flags_and (t->cpu_flags, avx512);
5985 if (!cpu_flags_all_zero (&cpu)
5986 && !t->cpu_flags.bitfield.cpuavx512vl
5987 && !cpu_arch_flags.bitfield.cpuavx512vl)
5988 {
5989 for (op = 0; op < t->operands; ++op)
5990 {
5991 if (t->operand_types[op].bitfield.zmmword
5992 && (i.types[op].bitfield.ymmword
5993 || i.types[op].bitfield.xmmword))
5994 {
5995 i.error = unsupported;
5996 return 1;
5997 }
5998 }
5999 }
43234a1e 6000
6c30d220 6001 /* Without VSIB byte, we can't have a vector register for index. */
63112cd6 6002 if (!t->opcode_modifier.sib
6c30d220 6003 && i.index_reg
1b54b8d7
JB
6004 && (i.index_reg->reg_type.bitfield.xmmword
6005 || i.index_reg->reg_type.bitfield.ymmword
6006 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
6007 {
6008 i.error = unsupported_vector_index_register;
6009 return 1;
6010 }
6011
ad8ecc81
MZ
6012 /* Check if default mask is allowed. */
6013 if (t->opcode_modifier.nodefmask
6225c532 6014 && (!i.mask.reg || i.mask.reg->reg_num == 0))
ad8ecc81
MZ
6015 {
6016 i.error = no_default_mask;
6017 return 1;
6018 }
6019
7bab8ab5
JB
6020 /* For VSIB byte, we need a vector register for index, and all vector
6021 registers must be distinct. */
260cd341 6022 if (t->opcode_modifier.sib && t->opcode_modifier.sib != SIBMEM)
7bab8ab5
JB
6023 {
6024 if (!i.index_reg
63112cd6 6025 || !((t->opcode_modifier.sib == VECSIB128
1b54b8d7 6026 && i.index_reg->reg_type.bitfield.xmmword)
63112cd6 6027 || (t->opcode_modifier.sib == VECSIB256
1b54b8d7 6028 && i.index_reg->reg_type.bitfield.ymmword)
63112cd6 6029 || (t->opcode_modifier.sib == VECSIB512
1b54b8d7 6030 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
6031 {
6032 i.error = invalid_vsib_address;
6033 return 1;
6034 }
6035
6225c532
JB
6036 gas_assert (i.reg_operands == 2 || i.mask.reg);
6037 if (i.reg_operands == 2 && !i.mask.reg)
43234a1e 6038 {
3528c362 6039 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
6040 gas_assert (i.types[0].bitfield.xmmword
6041 || i.types[0].bitfield.ymmword);
3528c362 6042 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
6043 gas_assert (i.types[2].bitfield.xmmword
6044 || i.types[2].bitfield.ymmword);
43234a1e
L
6045 if (operand_check == check_none)
6046 return 0;
6047 if (register_number (i.op[0].regs)
6048 != register_number (i.index_reg)
6049 && register_number (i.op[2].regs)
6050 != register_number (i.index_reg)
6051 && register_number (i.op[0].regs)
6052 != register_number (i.op[2].regs))
6053 return 0;
6054 if (operand_check == check_error)
6055 {
6056 i.error = invalid_vector_register_set;
6057 return 1;
6058 }
6059 as_warn (_("mask, index, and destination registers should be distinct"));
6060 }
6225c532 6061 else if (i.reg_operands == 1 && i.mask.reg)
8444f82a 6062 {
3528c362 6063 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
6064 && (i.types[1].bitfield.xmmword
6065 || i.types[1].bitfield.ymmword
6066 || i.types[1].bitfield.zmmword)
8444f82a
MZ
6067 && (register_number (i.op[1].regs)
6068 == register_number (i.index_reg)))
6069 {
6070 if (operand_check == check_error)
6071 {
6072 i.error = invalid_vector_register_set;
6073 return 1;
6074 }
6075 if (operand_check != check_none)
6076 as_warn (_("index and destination registers should be distinct"));
6077 }
6078 }
43234a1e 6079 }
7bab8ab5 6080
260cd341
LC
6081 /* For AMX instructions with three tmmword operands, all tmmword operand must be
6082 distinct */
6083 if (t->operand_types[0].bitfield.tmmword
6084 && i.reg_operands == 3)
6085 {
6086 if (register_number (i.op[0].regs)
6087 == register_number (i.op[1].regs)
6088 || register_number (i.op[0].regs)
6089 == register_number (i.op[2].regs)
6090 || register_number (i.op[1].regs)
6091 == register_number (i.op[2].regs))
6092 {
6093 i.error = invalid_tmm_register_set;
6094 return 1;
6095 }
6096 }
6097
43234a1e
L
6098 /* Check if broadcast is supported by the instruction and is applied
6099 to the memory operand. */
5273a3cd 6100 if (i.broadcast.type)
43234a1e 6101 {
8e6e0792 6102 i386_operand_type type, overlap;
43234a1e
L
6103
6104 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 6105 and its broadcast bytes match the memory operand. */
5273a3cd 6106 op = i.broadcast.operand;
8e6e0792 6107 if (!t->opcode_modifier.broadcast
c48dadc9 6108 || !(i.flags[op] & Operand_Mem)
c39e5b26 6109 || (!i.types[op].bitfield.unspecified
4a1b91ea 6110 && !match_broadcast_size (t, op)))
43234a1e
L
6111 {
6112 bad_broadcast:
6113 i.error = unsupported_broadcast;
6114 return 1;
6115 }
8e6e0792 6116
5273a3cd
JB
6117 i.broadcast.bytes = ((1 << (t->opcode_modifier.broadcast - 1))
6118 * i.broadcast.type);
8e6e0792 6119 operand_type_set (&type, 0);
5273a3cd 6120 switch (i.broadcast.bytes)
8e6e0792 6121 {
4a1b91ea
L
6122 case 2:
6123 type.bitfield.word = 1;
6124 break;
6125 case 4:
6126 type.bitfield.dword = 1;
6127 break;
8e6e0792
JB
6128 case 8:
6129 type.bitfield.qword = 1;
6130 break;
6131 case 16:
6132 type.bitfield.xmmword = 1;
6133 break;
6134 case 32:
6135 type.bitfield.ymmword = 1;
6136 break;
6137 case 64:
6138 type.bitfield.zmmword = 1;
6139 break;
6140 default:
6141 goto bad_broadcast;
6142 }
6143
6144 overlap = operand_type_and (type, t->operand_types[op]);
bc49bfd8
JB
6145 if (t->operand_types[op].bitfield.class == RegSIMD
6146 && t->operand_types[op].bitfield.byte
6147 + t->operand_types[op].bitfield.word
6148 + t->operand_types[op].bitfield.dword
6149 + t->operand_types[op].bitfield.qword > 1)
6150 {
6151 overlap.bitfield.xmmword = 0;
6152 overlap.bitfield.ymmword = 0;
6153 overlap.bitfield.zmmword = 0;
6154 }
8e6e0792
JB
6155 if (operand_type_all_zero (&overlap))
6156 goto bad_broadcast;
6157
6158 if (t->opcode_modifier.checkregsize)
6159 {
6160 unsigned int j;
6161
e2195274 6162 type.bitfield.baseindex = 1;
8e6e0792
JB
6163 for (j = 0; j < i.operands; ++j)
6164 {
6165 if (j != op
6166 && !operand_type_register_match(i.types[j],
6167 t->operand_types[j],
6168 type,
6169 t->operand_types[op]))
6170 goto bad_broadcast;
6171 }
6172 }
43234a1e
L
6173 }
6174 /* If broadcast is supported in this instruction, we need to check if
6175 operand of one-element size isn't specified without broadcast. */
6176 else if (t->opcode_modifier.broadcast && i.mem_operands)
6177 {
6178 /* Find memory operand. */
6179 for (op = 0; op < i.operands; op++)
8dc0818e 6180 if (i.flags[op] & Operand_Mem)
43234a1e
L
6181 break;
6182 gas_assert (op < i.operands);
6183 /* Check size of the memory operand. */
4a1b91ea 6184 if (match_broadcast_size (t, op))
43234a1e
L
6185 {
6186 i.error = broadcast_needed;
6187 return 1;
6188 }
6189 }
c39e5b26
JB
6190 else
6191 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
6192
6193 /* Check if requested masking is supported. */
6225c532 6194 if (i.mask.reg)
43234a1e 6195 {
ae2387fe
JB
6196 switch (t->opcode_modifier.masking)
6197 {
6198 case BOTH_MASKING:
6199 break;
6200 case MERGING_MASKING:
6225c532 6201 if (i.mask.zeroing)
ae2387fe
JB
6202 {
6203 case 0:
6204 i.error = unsupported_masking;
6205 return 1;
6206 }
6207 break;
6208 case DYNAMIC_MASKING:
6209 /* Memory destinations allow only merging masking. */
6225c532 6210 if (i.mask.zeroing && i.mem_operands)
ae2387fe
JB
6211 {
6212 /* Find memory operand. */
6213 for (op = 0; op < i.operands; op++)
c48dadc9 6214 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
6215 break;
6216 gas_assert (op < i.operands);
6217 if (op == i.operands - 1)
6218 {
6219 i.error = unsupported_masking;
6220 return 1;
6221 }
6222 }
6223 break;
6224 default:
6225 abort ();
6226 }
43234a1e
L
6227 }
6228
6229 /* Check if masking is applied to dest operand. */
6225c532 6230 if (i.mask.reg && (i.mask.operand != i.operands - 1))
43234a1e
L
6231 {
6232 i.error = mask_not_on_destination;
6233 return 1;
6234 }
6235
43234a1e 6236 /* Check RC/SAE. */
ca5312a2 6237 if (i.rounding.type != rc_none)
43234a1e 6238 {
a80195f1 6239 if (!t->opcode_modifier.sae
ca5312a2 6240 || (i.rounding.type != saeonly && !t->opcode_modifier.staticrounding))
43234a1e
L
6241 {
6242 i.error = unsupported_rc_sae;
6243 return 1;
6244 }
6245 /* If the instruction has several immediate operands and one of
6246 them is rounding, the rounding operand should be the last
6247 immediate operand. */
6248 if (i.imm_operands > 1
ca5312a2 6249 && i.rounding.operand != i.imm_operands - 1)
7bab8ab5 6250 {
43234a1e 6251 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
6252 return 1;
6253 }
6c30d220
L
6254 }
6255
da4977e0
JB
6256 /* Check the special Imm4 cases; must be the first operand. */
6257 if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)
6258 {
6259 if (i.op[0].imms->X_op != O_constant
6260 || !fits_in_imm4 (i.op[0].imms->X_add_number))
6261 {
6262 i.error = bad_imm4;
6263 return 1;
6264 }
6265
6266 /* Turn off Imm<N> so that update_imm won't complain. */
6267 operand_type_set (&i.types[0], 0);
6268 }
6269
43234a1e 6270 /* Check vector Disp8 operand. */
b5014f7a
JB
6271 if (t->opcode_modifier.disp8memshift
6272 && i.disp_encoding != disp_encoding_32bit)
43234a1e 6273 {
5273a3cd 6274 if (i.broadcast.type)
4a1b91ea 6275 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 6276 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 6277 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
6278 else
6279 {
6280 const i386_operand_type *type = NULL;
6281
6282 i.memshift = 0;
6283 for (op = 0; op < i.operands; op++)
8dc0818e 6284 if (i.flags[op] & Operand_Mem)
7091c612 6285 {
4174bfff
JB
6286 if (t->opcode_modifier.evex == EVEXLIG)
6287 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
6288 else if (t->operand_types[op].bitfield.xmmword
6289 + t->operand_types[op].bitfield.ymmword
6290 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
6291 type = &t->operand_types[op];
6292 else if (!i.types[op].bitfield.unspecified)
6293 type = &i.types[op];
6294 }
3528c362 6295 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 6296 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
6297 {
6298 if (i.types[op].bitfield.zmmword)
6299 i.memshift = 6;
6300 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
6301 i.memshift = 5;
6302 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
6303 i.memshift = 4;
6304 }
6305
6306 if (type)
6307 {
6308 if (type->bitfield.zmmword)
6309 i.memshift = 6;
6310 else if (type->bitfield.ymmword)
6311 i.memshift = 5;
6312 else if (type->bitfield.xmmword)
6313 i.memshift = 4;
6314 }
6315
6316 /* For the check in fits_in_disp8(). */
6317 if (i.memshift == 0)
6318 i.memshift = -1;
6319 }
43234a1e
L
6320
6321 for (op = 0; op < i.operands; op++)
6322 if (operand_type_check (i.types[op], disp)
6323 && i.op[op].disps->X_op == O_constant)
6324 {
b5014f7a 6325 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 6326 {
b5014f7a
JB
6327 i.types[op].bitfield.disp8 = 1;
6328 return 0;
43234a1e 6329 }
b5014f7a 6330 i.types[op].bitfield.disp8 = 0;
43234a1e
L
6331 }
6332 }
b5014f7a
JB
6333
6334 i.memshift = 0;
43234a1e 6335
6c30d220
L
6336 return 0;
6337}
6338
da4977e0 6339/* Check if encoding requirements are met by the instruction. */
a683cc34
SP
6340
6341static int
da4977e0 6342VEX_check_encoding (const insn_template *t)
a683cc34 6343{
da4977e0
JB
6344 if (i.vec_encoding == vex_encoding_error)
6345 {
6346 i.error = unsupported;
6347 return 1;
6348 }
6349
86fa6981 6350 if (i.vec_encoding == vex_encoding_evex)
43234a1e 6351 {
86fa6981 6352 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 6353 if (!is_evex_encoding (t))
86fa6981
L
6354 {
6355 i.error = unsupported;
6356 return 1;
6357 }
6358 return 0;
43234a1e
L
6359 }
6360
a683cc34 6361 if (!t->opcode_modifier.vex)
86fa6981
L
6362 {
6363 /* This instruction template doesn't have VEX prefix. */
6364 if (i.vec_encoding != vex_encoding_default)
6365 {
6366 i.error = unsupported;
6367 return 1;
6368 }
6369 return 0;
6370 }
a683cc34 6371
a683cc34
SP
6372 return 0;
6373}
6374
d3ce72d0 6375static const insn_template *
83b16ac6 6376match_template (char mnem_suffix)
29b0f896
AM
6377{
6378 /* Points to template once we've found it. */
d3ce72d0 6379 const insn_template *t;
40fb9820 6380 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 6381 i386_operand_type overlap4;
29b0f896 6382 unsigned int found_reverse_match;
dc2be329 6383 i386_opcode_modifier suffix_check;
40fb9820 6384 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 6385 int addr_prefix_disp;
45a4bb20 6386 unsigned int j, size_match, check_register;
5614d22c 6387 enum i386_error specific_error = 0;
29b0f896 6388
c0f3af97
L
6389#if MAX_OPERANDS != 5
6390# error "MAX_OPERANDS must be 5."
f48ff2ae
L
6391#endif
6392
29b0f896 6393 found_reverse_match = 0;
539e75ad 6394 addr_prefix_disp = -1;
40fb9820 6395
dc2be329 6396 /* Prepare for mnemonic suffix check. */
40fb9820 6397 memset (&suffix_check, 0, sizeof (suffix_check));
dc2be329
L
6398 switch (mnem_suffix)
6399 {
6400 case BYTE_MNEM_SUFFIX:
6401 suffix_check.no_bsuf = 1;
6402 break;
6403 case WORD_MNEM_SUFFIX:
6404 suffix_check.no_wsuf = 1;
6405 break;
6406 case SHORT_MNEM_SUFFIX:
6407 suffix_check.no_ssuf = 1;
6408 break;
6409 case LONG_MNEM_SUFFIX:
6410 suffix_check.no_lsuf = 1;
6411 break;
6412 case QWORD_MNEM_SUFFIX:
6413 suffix_check.no_qsuf = 1;
6414 break;
6415 default:
6416 /* NB: In Intel syntax, normally we can check for memory operand
6417 size when there is no mnemonic suffix. But jmp and call have
6418 2 different encodings with Dword memory operand size, one with
6419 No_ldSuf and the other without. i.suffix is set to
6420 LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
6421 if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
6422 suffix_check.no_ldsuf = 1;
83b16ac6
JB
6423 }
6424
01559ecc
L
6425 /* Must have right number of operands. */
6426 i.error = number_of_operands_mismatch;
6427
45aa61fe 6428 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 6429 {
539e75ad 6430 addr_prefix_disp = -1;
dbbc8b7e 6431 found_reverse_match = 0;
539e75ad 6432
29b0f896
AM
6433 if (i.operands != t->operands)
6434 continue;
6435
50aecf8c 6436 /* Check processor support. */
a65babc9 6437 i.error = unsupported;
45a4bb20 6438 if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH)
50aecf8c
L
6439 continue;
6440
57392598
CL
6441 /* Check Pseudo Prefix. */
6442 i.error = unsupported;
6443 if (t->opcode_modifier.pseudovexprefix
6444 && !(i.vec_encoding == vex_encoding_vex
6445 || i.vec_encoding == vex_encoding_vex3))
6446 continue;
6447
e1d4d893 6448 /* Check AT&T mnemonic. */
a65babc9 6449 i.error = unsupported_with_intel_mnemonic;
e1d4d893 6450 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
6451 continue;
6452
4b5aaf5f 6453 /* Check AT&T/Intel syntax. */
a65babc9 6454 i.error = unsupported_syntax;
5c07affc 6455 if ((intel_syntax && t->opcode_modifier.attsyntax)
4b5aaf5f 6456 || (!intel_syntax && t->opcode_modifier.intelsyntax))
1efbbeb4
L
6457 continue;
6458
4b5aaf5f
L
6459 /* Check Intel64/AMD64 ISA. */
6460 switch (isa64)
6461 {
6462 default:
6463 /* Default: Don't accept Intel64. */
6464 if (t->opcode_modifier.isa64 == INTEL64)
6465 continue;
6466 break;
6467 case amd64:
6468 /* -mamd64: Don't accept Intel64 and Intel64 only. */
6469 if (t->opcode_modifier.isa64 >= INTEL64)
6470 continue;
6471 break;
6472 case intel64:
6473 /* -mintel64: Don't accept AMD64. */
5990e377 6474 if (t->opcode_modifier.isa64 == AMD64 && flag_code == CODE_64BIT)
4b5aaf5f
L
6475 continue;
6476 break;
6477 }
6478
dc2be329 6479 /* Check the suffix. */
a65babc9 6480 i.error = invalid_instruction_suffix;
dc2be329
L
6481 if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
6482 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
6483 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
6484 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
6485 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
6486 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
83b16ac6 6487 continue;
29b0f896 6488
3ac21baa
JB
6489 size_match = operand_size_match (t);
6490 if (!size_match)
7d5e4556 6491 continue;
539e75ad 6492
6f2f06be
JB
6493 /* This is intentionally not
6494
0cfa3eb3 6495 if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
6f2f06be
JB
6496
6497 as the case of a missing * on the operand is accepted (perhaps with
6498 a warning, issued further down). */
0cfa3eb3 6499 if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
6f2f06be
JB
6500 {
6501 i.error = operand_type_mismatch;
6502 continue;
6503 }
6504
5c07affc
L
6505 for (j = 0; j < MAX_OPERANDS; j++)
6506 operand_types[j] = t->operand_types[j];
6507
e365e234
JB
6508 /* In general, don't allow
6509 - 64-bit operands outside of 64-bit mode,
6510 - 32-bit operands on pre-386. */
4873e243 6511 j = i.imm_operands + (t->operands > i.imm_operands + 1);
e365e234
JB
6512 if (((i.suffix == QWORD_MNEM_SUFFIX
6513 && flag_code != CODE_64BIT
389d00a5
JB
6514 && !(t->opcode_modifier.opcodespace == SPACE_0F
6515 && t->base_opcode == 0xc7
5e74b495 6516 && t->opcode_modifier.opcodeprefix == PREFIX_NONE
8b65b895 6517 && t->extension_opcode == 1) /* cmpxchg8b */)
e365e234
JB
6518 || (i.suffix == LONG_MNEM_SUFFIX
6519 && !cpu_arch_flags.bitfield.cpui386))
45aa61fe 6520 && (intel_syntax
3cd7f3e3 6521 ? (t->opcode_modifier.mnemonicsize != IGNORESIZE
45aa61fe
AM
6522 && !intel_float_operand (t->name))
6523 : intel_float_operand (t->name) != 2)
4873e243
JB
6524 && (t->operands == i.imm_operands
6525 || (operand_types[i.imm_operands].bitfield.class != RegMMX
6526 && operand_types[i.imm_operands].bitfield.class != RegSIMD
6527 && operand_types[i.imm_operands].bitfield.class != RegMask)
6528 || (operand_types[j].bitfield.class != RegMMX
6529 && operand_types[j].bitfield.class != RegSIMD
6530 && operand_types[j].bitfield.class != RegMask))
63112cd6 6531 && !t->opcode_modifier.sib)
192dc9c6
JB
6532 continue;
6533
29b0f896 6534 /* Do not verify operands when there are none. */
e365e234 6535 if (!t->operands)
da4977e0
JB
6536 {
6537 if (VEX_check_encoding (t))
6538 {
6539 specific_error = i.error;
6540 continue;
6541 }
6542
6543 /* We've found a match; break out of loop. */
6544 break;
6545 }
252b5132 6546
48bcea9f
JB
6547 if (!t->opcode_modifier.jump
6548 || t->opcode_modifier.jump == JUMP_ABSOLUTE)
6549 {
6550 /* There should be only one Disp operand. */
6551 for (j = 0; j < MAX_OPERANDS; j++)
6552 if (operand_type_check (operand_types[j], disp))
539e75ad 6553 break;
48bcea9f
JB
6554 if (j < MAX_OPERANDS)
6555 {
5b7c81bd 6556 bool override = (i.prefix[ADDR_PREFIX] != 0);
48bcea9f
JB
6557
6558 addr_prefix_disp = j;
6559
6560 /* Address size prefix will turn Disp64/Disp32S/Disp32/Disp16
6561 operand into Disp32/Disp32/Disp16/Disp32 operand. */
6562 switch (flag_code)
40fb9820 6563 {
48bcea9f
JB
6564 case CODE_16BIT:
6565 override = !override;
6566 /* Fall through. */
6567 case CODE_32BIT:
6568 if (operand_types[j].bitfield.disp32
6569 && operand_types[j].bitfield.disp16)
40fb9820 6570 {
48bcea9f
JB
6571 operand_types[j].bitfield.disp16 = override;
6572 operand_types[j].bitfield.disp32 = !override;
40fb9820 6573 }
48bcea9f
JB
6574 operand_types[j].bitfield.disp32s = 0;
6575 operand_types[j].bitfield.disp64 = 0;
6576 break;
6577
6578 case CODE_64BIT:
6579 if (operand_types[j].bitfield.disp32s
6580 || operand_types[j].bitfield.disp64)
40fb9820 6581 {
48bcea9f
JB
6582 operand_types[j].bitfield.disp64 &= !override;
6583 operand_types[j].bitfield.disp32s &= !override;
6584 operand_types[j].bitfield.disp32 = override;
40fb9820 6585 }
48bcea9f
JB
6586 operand_types[j].bitfield.disp16 = 0;
6587 break;
40fb9820 6588 }
539e75ad 6589 }
48bcea9f 6590 }
539e75ad 6591
02a86693 6592 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
35648716
JB
6593 if (i.reloc[0] == BFD_RELOC_386_GOT32
6594 && t->base_opcode == 0xa0
6595 && t->opcode_modifier.opcodespace == SPACE_BASE)
02a86693
L
6596 continue;
6597
56ffb741 6598 /* We check register size if needed. */
e2195274
JB
6599 if (t->opcode_modifier.checkregsize)
6600 {
6601 check_register = (1 << t->operands) - 1;
5273a3cd
JB
6602 if (i.broadcast.type)
6603 check_register &= ~(1 << i.broadcast.operand);
e2195274
JB
6604 }
6605 else
6606 check_register = 0;
6607
c6fb90c8 6608 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
6609 switch (t->operands)
6610 {
6611 case 1:
40fb9820 6612 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
6613 continue;
6614 break;
6615 case 2:
33eaf5de 6616 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
6617 only in 32bit mode and we can use opcode 0x90. In 64bit
6618 mode, we can't use 0x90 for xchg %eax, %eax since it should
6619 zero-extend %eax to %rax. */
6620 if (flag_code == CODE_64BIT
6621 && t->base_opcode == 0x90
35648716 6622 && t->opcode_modifier.opcodespace == SPACE_BASE
75e5731b
JB
6623 && i.types[0].bitfield.instance == Accum
6624 && i.types[0].bitfield.dword
6625 && i.types[1].bitfield.instance == Accum
6626 && i.types[1].bitfield.dword)
8b38ad71 6627 continue;
1212781b
JB
6628 /* xrelease mov %eax, <disp> is another special case. It must not
6629 match the accumulator-only encoding of mov. */
6630 if (flag_code != CODE_64BIT
6631 && i.hle_prefix
6632 && t->base_opcode == 0xa0
35648716 6633 && t->opcode_modifier.opcodespace == SPACE_BASE
75e5731b 6634 && i.types[0].bitfield.instance == Accum
8dc0818e 6635 && (i.flags[1] & Operand_Mem))
1212781b 6636 continue;
f5eb1d70
JB
6637 /* Fall through. */
6638
6639 case 3:
3ac21baa
JB
6640 if (!(size_match & MATCH_STRAIGHT))
6641 goto check_reverse;
64c49ab3
JB
6642 /* Reverse direction of operands if swapping is possible in the first
6643 place (operands need to be symmetric) and
6644 - the load form is requested, and the template is a store form,
6645 - the store form is requested, and the template is a load form,
6646 - the non-default (swapped) form is requested. */
6647 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 6648 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
6649 && !operand_type_all_zero (&overlap1))
6650 switch (i.dir_encoding)
6651 {
6652 case dir_encoding_load:
6653 if (operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6654 || t->opcode_modifier.regmem)
64c49ab3
JB
6655 goto check_reverse;
6656 break;
6657
6658 case dir_encoding_store:
6659 if (!operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6660 && !t->opcode_modifier.regmem)
64c49ab3
JB
6661 goto check_reverse;
6662 break;
6663
6664 case dir_encoding_swap:
6665 goto check_reverse;
6666
6667 case dir_encoding_default:
6668 break;
6669 }
86fa6981 6670 /* If we want store form, we skip the current load. */
64c49ab3
JB
6671 if ((i.dir_encoding == dir_encoding_store
6672 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
6673 && i.mem_operands == 0
6674 && t->opcode_modifier.load)
fa99fab2 6675 continue;
1a0670f3 6676 /* Fall through. */
f48ff2ae 6677 case 4:
c0f3af97 6678 case 5:
c6fb90c8 6679 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
6680 if (!operand_type_match (overlap0, i.types[0])
6681 || !operand_type_match (overlap1, i.types[1])
e2195274 6682 || ((check_register & 3) == 3
dc821c5f 6683 && !operand_type_register_match (i.types[0],
40fb9820 6684 operand_types[0],
dc821c5f 6685 i.types[1],
40fb9820 6686 operand_types[1])))
29b0f896
AM
6687 {
6688 /* Check if other direction is valid ... */
38e314eb 6689 if (!t->opcode_modifier.d)
29b0f896
AM
6690 continue;
6691
dc1e8a47 6692 check_reverse:
3ac21baa
JB
6693 if (!(size_match & MATCH_REVERSE))
6694 continue;
29b0f896 6695 /* Try reversing direction of operands. */
f5eb1d70
JB
6696 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
6697 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 6698 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 6699 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 6700 || (check_register
dc821c5f 6701 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
6702 operand_types[i.operands - 1],
6703 i.types[i.operands - 1],
45664ddb 6704 operand_types[0])))
29b0f896
AM
6705 {
6706 /* Does not match either direction. */
6707 continue;
6708 }
38e314eb 6709 /* found_reverse_match holds which of D or FloatR
29b0f896 6710 we've found. */
38e314eb
JB
6711 if (!t->opcode_modifier.d)
6712 found_reverse_match = 0;
6713 else if (operand_types[0].bitfield.tbyte)
8a2ed489 6714 found_reverse_match = Opcode_FloatD;
dbbc8b7e 6715 else if (operand_types[0].bitfield.xmmword
f5eb1d70 6716 || operand_types[i.operands - 1].bitfield.xmmword
3528c362
JB
6717 || operand_types[0].bitfield.class == RegMMX
6718 || operand_types[i.operands - 1].bitfield.class == RegMMX
dbbc8b7e
JB
6719 || is_any_vex_encoding(t))
6720 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
6721 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 6722 else
38e314eb 6723 found_reverse_match = Opcode_D;
40fb9820 6724 if (t->opcode_modifier.floatr)
8a2ed489 6725 found_reverse_match |= Opcode_FloatR;
29b0f896 6726 }
f48ff2ae 6727 else
29b0f896 6728 {
f48ff2ae 6729 /* Found a forward 2 operand match here. */
d1cbb4db
L
6730 switch (t->operands)
6731 {
c0f3af97
L
6732 case 5:
6733 overlap4 = operand_type_and (i.types[4],
6734 operand_types[4]);
1a0670f3 6735 /* Fall through. */
d1cbb4db 6736 case 4:
c6fb90c8
L
6737 overlap3 = operand_type_and (i.types[3],
6738 operand_types[3]);
1a0670f3 6739 /* Fall through. */
d1cbb4db 6740 case 3:
c6fb90c8
L
6741 overlap2 = operand_type_and (i.types[2],
6742 operand_types[2]);
d1cbb4db
L
6743 break;
6744 }
29b0f896 6745
f48ff2ae
L
6746 switch (t->operands)
6747 {
c0f3af97
L
6748 case 5:
6749 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 6750 || !operand_type_register_match (i.types[3],
c0f3af97 6751 operand_types[3],
c0f3af97
L
6752 i.types[4],
6753 operand_types[4]))
6754 continue;
1a0670f3 6755 /* Fall through. */
f48ff2ae 6756 case 4:
40fb9820 6757 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
6758 || ((check_register & 0xa) == 0xa
6759 && !operand_type_register_match (i.types[1],
f7768225
JB
6760 operand_types[1],
6761 i.types[3],
e2195274
JB
6762 operand_types[3]))
6763 || ((check_register & 0xc) == 0xc
6764 && !operand_type_register_match (i.types[2],
6765 operand_types[2],
6766 i.types[3],
6767 operand_types[3])))
f48ff2ae 6768 continue;
1a0670f3 6769 /* Fall through. */
f48ff2ae
L
6770 case 3:
6771 /* Here we make use of the fact that there are no
23e42951 6772 reverse match 3 operand instructions. */
40fb9820 6773 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
6774 || ((check_register & 5) == 5
6775 && !operand_type_register_match (i.types[0],
23e42951
JB
6776 operand_types[0],
6777 i.types[2],
e2195274
JB
6778 operand_types[2]))
6779 || ((check_register & 6) == 6
6780 && !operand_type_register_match (i.types[1],
6781 operand_types[1],
6782 i.types[2],
6783 operand_types[2])))
f48ff2ae
L
6784 continue;
6785 break;
6786 }
29b0f896 6787 }
f48ff2ae 6788 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
6789 slip through to break. */
6790 }
c0f3af97 6791
da4977e0
JB
6792 /* Check if vector operands are valid. */
6793 if (check_VecOperands (t))
6794 {
6795 specific_error = i.error;
6796 continue;
6797 }
6798
6799 /* Check if VEX/EVEX encoding requirements can be satisfied. */
6800 if (VEX_check_encoding (t))
5614d22c
JB
6801 {
6802 specific_error = i.error;
6803 continue;
6804 }
a683cc34 6805
29b0f896
AM
6806 /* We've found a match; break out of loop. */
6807 break;
6808 }
6809
6810 if (t == current_templates->end)
6811 {
6812 /* We found no match. */
a65babc9 6813 const char *err_msg;
5614d22c 6814 switch (specific_error ? specific_error : i.error)
a65babc9
L
6815 {
6816 default:
6817 abort ();
86e026a4 6818 case operand_size_mismatch:
a65babc9
L
6819 err_msg = _("operand size mismatch");
6820 break;
6821 case operand_type_mismatch:
6822 err_msg = _("operand type mismatch");
6823 break;
6824 case register_type_mismatch:
6825 err_msg = _("register type mismatch");
6826 break;
6827 case number_of_operands_mismatch:
6828 err_msg = _("number of operands mismatch");
6829 break;
6830 case invalid_instruction_suffix:
6831 err_msg = _("invalid instruction suffix");
6832 break;
6833 case bad_imm4:
4a2608e3 6834 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6835 break;
a65babc9
L
6836 case unsupported_with_intel_mnemonic:
6837 err_msg = _("unsupported with Intel mnemonic");
6838 break;
6839 case unsupported_syntax:
6840 err_msg = _("unsupported syntax");
6841 break;
6842 case unsupported:
35262a23 6843 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6844 current_templates->start->name);
6845 return NULL;
260cd341
LC
6846 case invalid_sib_address:
6847 err_msg = _("invalid SIB address");
6848 break;
6c30d220
L
6849 case invalid_vsib_address:
6850 err_msg = _("invalid VSIB address");
6851 break;
7bab8ab5
JB
6852 case invalid_vector_register_set:
6853 err_msg = _("mask, index, and destination registers must be distinct");
6854 break;
260cd341
LC
6855 case invalid_tmm_register_set:
6856 err_msg = _("all tmm registers must be distinct");
6857 break;
6c30d220
L
6858 case unsupported_vector_index_register:
6859 err_msg = _("unsupported vector index register");
6860 break;
43234a1e
L
6861 case unsupported_broadcast:
6862 err_msg = _("unsupported broadcast");
6863 break;
43234a1e
L
6864 case broadcast_needed:
6865 err_msg = _("broadcast is needed for operand of such type");
6866 break;
6867 case unsupported_masking:
6868 err_msg = _("unsupported masking");
6869 break;
6870 case mask_not_on_destination:
6871 err_msg = _("mask not on destination operand");
6872 break;
6873 case no_default_mask:
6874 err_msg = _("default mask isn't allowed");
6875 break;
6876 case unsupported_rc_sae:
6877 err_msg = _("unsupported static rounding/sae");
6878 break;
6879 case rc_sae_operand_not_last_imm:
6880 if (intel_syntax)
6881 err_msg = _("RC/SAE operand must precede immediate operands");
6882 else
6883 err_msg = _("RC/SAE operand must follow immediate operands");
6884 break;
6885 case invalid_register_operand:
6886 err_msg = _("invalid register operand");
6887 break;
a65babc9
L
6888 }
6889 as_bad (_("%s for `%s'"), err_msg,
891edac4 6890 current_templates->start->name);
fa99fab2 6891 return NULL;
29b0f896 6892 }
252b5132 6893
29b0f896
AM
6894 if (!quiet_warnings)
6895 {
6896 if (!intel_syntax
0cfa3eb3 6897 && (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE)))
6f2f06be 6898 as_warn (_("indirect %s without `*'"), t->name);
29b0f896 6899
40fb9820 6900 if (t->opcode_modifier.isprefix
3cd7f3e3 6901 && t->opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6902 {
6903 /* Warn them that a data or address size prefix doesn't
6904 affect assembly of the next line of code. */
6905 as_warn (_("stand-alone `%s' prefix"), t->name);
6906 }
6907 }
6908
6909 /* Copy the template we found. */
9a182d04 6910 install_template (t);
539e75ad
L
6911
6912 if (addr_prefix_disp != -1)
6913 i.tm.operand_types[addr_prefix_disp]
6914 = operand_types[addr_prefix_disp];
6915
29b0f896
AM
6916 if (found_reverse_match)
6917 {
dfd69174
JB
6918 /* If we found a reverse match we must alter the opcode direction
6919 bit and clear/flip the regmem modifier one. found_reverse_match
6920 holds bits to change (different for int & float insns). */
29b0f896
AM
6921
6922 i.tm.base_opcode ^= found_reverse_match;
6923
f5eb1d70
JB
6924 i.tm.operand_types[0] = operand_types[i.operands - 1];
6925 i.tm.operand_types[i.operands - 1] = operand_types[0];
dfd69174
JB
6926
6927 /* Certain SIMD insns have their load forms specified in the opcode
6928 table, and hence we need to _set_ RegMem instead of clearing it.
6929 We need to avoid setting the bit though on insns like KMOVW. */
6930 i.tm.opcode_modifier.regmem
6931 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
6932 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
6933 && !i.tm.opcode_modifier.regmem;
29b0f896
AM
6934 }
6935
fa99fab2 6936 return t;
29b0f896
AM
6937}
6938
6939static int
e3bb37b5 6940check_string (void)
29b0f896 6941{
51c8edf6
JB
6942 unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
6943 unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
8dc0818e 6944
5e042380 6945 if (i.seg[op] != NULL && i.seg[op] != reg_es)
29b0f896 6946 {
51c8edf6
JB
6947 as_bad (_("`%s' operand %u must use `%ses' segment"),
6948 i.tm.name,
6949 intel_syntax ? i.tm.operands - es_op : es_op + 1,
6950 register_prefix);
6951 return 0;
29b0f896 6952 }
51c8edf6
JB
6953
6954 /* There's only ever one segment override allowed per instruction.
6955 This instruction possibly has a legal segment override on the
6956 second operand, so copy the segment to where non-string
6957 instructions store it, allowing common code. */
6958 i.seg[op] = i.seg[1];
6959
29b0f896
AM
6960 return 1;
6961}
6962
6963static int
543613e9 6964process_suffix (void)
29b0f896 6965{
5b7c81bd 6966 bool is_crc32 = false, is_movx = false;
8b65b895 6967
29b0f896
AM
6968 /* If matched instruction specifies an explicit instruction mnemonic
6969 suffix, use it. */
673fe0f0 6970 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6971 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6972 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6973 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6974 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6975 i.suffix = QWORD_MNEM_SUFFIX;
13e600d0 6976 else if (i.reg_operands
c8f8eebc
JB
6977 && (i.operands > 1 || i.types[0].bitfield.class == Reg)
6978 && !i.tm.opcode_modifier.addrprefixopreg)
29b0f896 6979 {
65fca059 6980 unsigned int numop = i.operands;
389d00a5
JB
6981
6982 /* MOVSX/MOVZX */
6983 is_movx = (i.tm.opcode_modifier.opcodespace == SPACE_0F
6984 && (i.tm.base_opcode | 8) == 0xbe)
6985 || (i.tm.opcode_modifier.opcodespace == SPACE_BASE
6986 && i.tm.base_opcode == 0x63
6987 && i.tm.cpu_flags.bitfield.cpu64);
6988
8b65b895 6989 /* CRC32 */
389d00a5
JB
6990 is_crc32 = (i.tm.base_opcode == 0xf0
6991 && i.tm.opcode_modifier.opcodespace == SPACE_0F38
8b65b895 6992 && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2);
65fca059
JB
6993
6994 /* movsx/movzx want only their source operand considered here, for the
6995 ambiguity checking below. The suffix will be replaced afterwards
6996 to represent the destination (register). */
389d00a5 6997 if (is_movx && (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63))
65fca059
JB
6998 --i.operands;
6999
643bb870 7000 /* crc32 needs REX.W set regardless of suffix / source operand size. */
8b65b895 7001 if (is_crc32 && i.tm.operand_types[1].bitfield.qword)
643bb870
JB
7002 i.rex |= REX_W;
7003
29b0f896 7004 /* If there's no instruction mnemonic suffix we try to invent one
13e600d0 7005 based on GPR operands. */
29b0f896
AM
7006 if (!i.suffix)
7007 {
7008 /* We take i.suffix from the last register operand specified,
7009 Destination register type is more significant than source
381d071f
L
7010 register type. crc32 in SSE4.2 prefers source register
7011 type. */
8b65b895 7012 unsigned int op = is_crc32 ? 1 : i.operands;
20592a94 7013
1a035124
JB
7014 while (op--)
7015 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
7016 || i.tm.operand_types[op].bitfield.instance == Accum)
7017 {
7018 if (i.types[op].bitfield.class != Reg)
7019 continue;
7020 if (i.types[op].bitfield.byte)
7021 i.suffix = BYTE_MNEM_SUFFIX;
7022 else if (i.types[op].bitfield.word)
7023 i.suffix = WORD_MNEM_SUFFIX;
7024 else if (i.types[op].bitfield.dword)
7025 i.suffix = LONG_MNEM_SUFFIX;
7026 else if (i.types[op].bitfield.qword)
7027 i.suffix = QWORD_MNEM_SUFFIX;
7028 else
7029 continue;
7030 break;
7031 }
65fca059
JB
7032
7033 /* As an exception, movsx/movzx silently default to a byte source
7034 in AT&T mode. */
389d00a5 7035 if (is_movx && i.tm.opcode_modifier.w && !i.suffix && !intel_syntax)
65fca059 7036 i.suffix = BYTE_MNEM_SUFFIX;
29b0f896
AM
7037 }
7038 else if (i.suffix == BYTE_MNEM_SUFFIX)
7039 {
2eb952a4 7040 if (intel_syntax
3cd7f3e3 7041 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
7042 && i.tm.opcode_modifier.no_bsuf)
7043 i.suffix = 0;
7044 else if (!check_byte_reg ())
29b0f896
AM
7045 return 0;
7046 }
7047 else if (i.suffix == LONG_MNEM_SUFFIX)
7048 {
2eb952a4 7049 if (intel_syntax
3cd7f3e3 7050 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
7051 && i.tm.opcode_modifier.no_lsuf
7052 && !i.tm.opcode_modifier.todword
7053 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
7054 i.suffix = 0;
7055 else if (!check_long_reg ())
29b0f896
AM
7056 return 0;
7057 }
7058 else if (i.suffix == QWORD_MNEM_SUFFIX)
7059 {
955e1e6a 7060 if (intel_syntax
3cd7f3e3 7061 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
7062 && i.tm.opcode_modifier.no_qsuf
7063 && !i.tm.opcode_modifier.todword
7064 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
7065 i.suffix = 0;
7066 else if (!check_qword_reg ())
29b0f896
AM
7067 return 0;
7068 }
7069 else if (i.suffix == WORD_MNEM_SUFFIX)
7070 {
2eb952a4 7071 if (intel_syntax
3cd7f3e3 7072 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
7073 && i.tm.opcode_modifier.no_wsuf)
7074 i.suffix = 0;
7075 else if (!check_word_reg ())
29b0f896
AM
7076 return 0;
7077 }
3cd7f3e3
L
7078 else if (intel_syntax
7079 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
7080 /* Do nothing if the instruction is going to ignore the prefix. */
7081 ;
7082 else
7083 abort ();
65fca059
JB
7084
7085 /* Undo the movsx/movzx change done above. */
7086 i.operands = numop;
29b0f896 7087 }
3cd7f3e3
L
7088 else if (i.tm.opcode_modifier.mnemonicsize == DEFAULTSIZE
7089 && !i.suffix)
29b0f896 7090 {
13e600d0
JB
7091 i.suffix = stackop_size;
7092 if (stackop_size == LONG_MNEM_SUFFIX)
06f74c5c
L
7093 {
7094 /* stackop_size is set to LONG_MNEM_SUFFIX for the
7095 .code16gcc directive to support 16-bit mode with
7096 32-bit address. For IRET without a suffix, generate
7097 16-bit IRET (opcode 0xcf) to return from an interrupt
7098 handler. */
13e600d0
JB
7099 if (i.tm.base_opcode == 0xcf)
7100 {
7101 i.suffix = WORD_MNEM_SUFFIX;
7102 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
7103 }
7104 /* Warn about changed behavior for segment register push/pop. */
7105 else if ((i.tm.base_opcode | 1) == 0x07)
7106 as_warn (_("generating 32-bit `%s', unlike earlier gas versions"),
7107 i.tm.name);
06f74c5c 7108 }
29b0f896 7109 }
c006a730 7110 else if (!i.suffix
0cfa3eb3
JB
7111 && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
7112 || i.tm.opcode_modifier.jump == JUMP_BYTE
7113 || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
389d00a5
JB
7114 || (i.tm.opcode_modifier.opcodespace == SPACE_0F
7115 && i.tm.base_opcode == 0x01 /* [ls][gi]dt */
64e74474 7116 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
7117 {
7118 switch (flag_code)
7119 {
7120 case CODE_64BIT:
40fb9820 7121 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a 7122 {
828c2a25
JB
7123 if (i.tm.opcode_modifier.jump == JUMP_BYTE
7124 || i.tm.opcode_modifier.no_lsuf)
7125 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a
JB
7126 break;
7127 }
1a0670f3 7128 /* Fall through. */
9306ca4a 7129 case CODE_32BIT:
40fb9820 7130 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
7131 i.suffix = LONG_MNEM_SUFFIX;
7132 break;
7133 case CODE_16BIT:
40fb9820 7134 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
7135 i.suffix = WORD_MNEM_SUFFIX;
7136 break;
7137 }
7138 }
252b5132 7139
c006a730 7140 if (!i.suffix
3cd7f3e3 7141 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8
JB
7142 /* Also cover lret/retf/iret in 64-bit mode. */
7143 || (flag_code == CODE_64BIT
7144 && !i.tm.opcode_modifier.no_lsuf
7145 && !i.tm.opcode_modifier.no_qsuf))
3cd7f3e3 7146 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
8bbb3ad8
JB
7147 /* Explicit sizing prefixes are assumed to disambiguate insns. */
7148 && !i.prefix[DATA_PREFIX] && !(i.prefix[REX_PREFIX] & REX_W)
62b3f548
JB
7149 /* Accept FLDENV et al without suffix. */
7150 && (i.tm.opcode_modifier.no_ssuf || i.tm.opcode_modifier.floatmf))
29b0f896 7151 {
6c0946d0 7152 unsigned int suffixes, evex = 0;
c006a730
JB
7153
7154 suffixes = !i.tm.opcode_modifier.no_bsuf;
7155 if (!i.tm.opcode_modifier.no_wsuf)
7156 suffixes |= 1 << 1;
7157 if (!i.tm.opcode_modifier.no_lsuf)
7158 suffixes |= 1 << 2;
7159 if (!i.tm.opcode_modifier.no_ldsuf)
7160 suffixes |= 1 << 3;
7161 if (!i.tm.opcode_modifier.no_ssuf)
7162 suffixes |= 1 << 4;
7163 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
7164 suffixes |= 1 << 5;
7165
6c0946d0
JB
7166 /* For [XYZ]MMWORD operands inspect operand sizes. While generally
7167 also suitable for AT&T syntax mode, it was requested that this be
7168 restricted to just Intel syntax. */
5273a3cd 7169 if (intel_syntax && is_any_vex_encoding (&i.tm) && !i.broadcast.type)
6c0946d0 7170 {
b9915cbc 7171 unsigned int op;
6c0946d0 7172
b9915cbc 7173 for (op = 0; op < i.tm.operands; ++op)
6c0946d0 7174 {
b9915cbc
JB
7175 if (is_evex_encoding (&i.tm)
7176 && !cpu_arch_flags.bitfield.cpuavx512vl)
6c0946d0 7177 {
b9915cbc
JB
7178 if (i.tm.operand_types[op].bitfield.ymmword)
7179 i.tm.operand_types[op].bitfield.xmmword = 0;
7180 if (i.tm.operand_types[op].bitfield.zmmword)
7181 i.tm.operand_types[op].bitfield.ymmword = 0;
7182 if (!i.tm.opcode_modifier.evex
7183 || i.tm.opcode_modifier.evex == EVEXDYN)
7184 i.tm.opcode_modifier.evex = EVEX512;
7185 }
6c0946d0 7186
b9915cbc
JB
7187 if (i.tm.operand_types[op].bitfield.xmmword
7188 + i.tm.operand_types[op].bitfield.ymmword
7189 + i.tm.operand_types[op].bitfield.zmmword < 2)
7190 continue;
6c0946d0 7191
b9915cbc
JB
7192 /* Any properly sized operand disambiguates the insn. */
7193 if (i.types[op].bitfield.xmmword
7194 || i.types[op].bitfield.ymmword
7195 || i.types[op].bitfield.zmmword)
7196 {
7197 suffixes &= ~(7 << 6);
7198 evex = 0;
7199 break;
7200 }
6c0946d0 7201
b9915cbc
JB
7202 if ((i.flags[op] & Operand_Mem)
7203 && i.tm.operand_types[op].bitfield.unspecified)
7204 {
7205 if (i.tm.operand_types[op].bitfield.xmmword)
7206 suffixes |= 1 << 6;
7207 if (i.tm.operand_types[op].bitfield.ymmword)
7208 suffixes |= 1 << 7;
7209 if (i.tm.operand_types[op].bitfield.zmmword)
7210 suffixes |= 1 << 8;
7211 if (is_evex_encoding (&i.tm))
7212 evex = EVEX512;
6c0946d0
JB
7213 }
7214 }
7215 }
7216
7217 /* Are multiple suffixes / operand sizes allowed? */
c006a730 7218 if (suffixes & (suffixes - 1))
9306ca4a 7219 {
873494c8 7220 if (intel_syntax
3cd7f3e3 7221 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8 7222 || operand_check == check_error))
9306ca4a 7223 {
c006a730 7224 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
9306ca4a
JB
7225 return 0;
7226 }
c006a730 7227 if (operand_check == check_error)
9306ca4a 7228 {
c006a730
JB
7229 as_bad (_("no instruction mnemonic suffix given and "
7230 "no register operands; can't size `%s'"), i.tm.name);
9306ca4a
JB
7231 return 0;
7232 }
c006a730 7233 if (operand_check == check_warning)
873494c8
JB
7234 as_warn (_("%s; using default for `%s'"),
7235 intel_syntax
7236 ? _("ambiguous operand size")
7237 : _("no instruction mnemonic suffix given and "
7238 "no register operands"),
7239 i.tm.name);
c006a730
JB
7240
7241 if (i.tm.opcode_modifier.floatmf)
7242 i.suffix = SHORT_MNEM_SUFFIX;
389d00a5 7243 else if (is_movx)
65fca059 7244 /* handled below */;
6c0946d0
JB
7245 else if (evex)
7246 i.tm.opcode_modifier.evex = evex;
c006a730
JB
7247 else if (flag_code == CODE_16BIT)
7248 i.suffix = WORD_MNEM_SUFFIX;
1a035124 7249 else if (!i.tm.opcode_modifier.no_lsuf)
c006a730 7250 i.suffix = LONG_MNEM_SUFFIX;
1a035124
JB
7251 else
7252 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a 7253 }
29b0f896 7254 }
252b5132 7255
389d00a5 7256 if (is_movx)
65fca059
JB
7257 {
7258 /* In Intel syntax, movsx/movzx must have a "suffix" (checked above).
7259 In AT&T syntax, if there is no suffix (warned about above), the default
7260 will be byte extension. */
7261 if (i.tm.opcode_modifier.w && i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
7262 i.tm.base_opcode |= 1;
7263
7264 /* For further processing, the suffix should represent the destination
7265 (register). This is already the case when one was used with
7266 mov[sz][bw]*, but we need to replace it for mov[sz]x, or if there was
7267 no suffix to begin with. */
7268 if (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63 || !i.suffix)
7269 {
7270 if (i.types[1].bitfield.word)
7271 i.suffix = WORD_MNEM_SUFFIX;
7272 else if (i.types[1].bitfield.qword)
7273 i.suffix = QWORD_MNEM_SUFFIX;
7274 else
7275 i.suffix = LONG_MNEM_SUFFIX;
7276
7277 i.tm.opcode_modifier.w = 0;
7278 }
7279 }
7280
50128d0c
JB
7281 if (!i.tm.opcode_modifier.modrm && i.reg_operands && i.tm.operands < 3)
7282 i.short_form = (i.tm.operand_types[0].bitfield.class == Reg)
7283 != (i.tm.operand_types[1].bitfield.class == Reg);
7284
d2224064
JB
7285 /* Change the opcode based on the operand size given by i.suffix. */
7286 switch (i.suffix)
29b0f896 7287 {
d2224064
JB
7288 /* Size floating point instruction. */
7289 case LONG_MNEM_SUFFIX:
7290 if (i.tm.opcode_modifier.floatmf)
7291 {
7292 i.tm.base_opcode ^= 4;
7293 break;
7294 }
7295 /* fall through */
7296 case WORD_MNEM_SUFFIX:
7297 case QWORD_MNEM_SUFFIX:
29b0f896 7298 /* It's not a byte, select word/dword operation. */
40fb9820 7299 if (i.tm.opcode_modifier.w)
29b0f896 7300 {
50128d0c 7301 if (i.short_form)
29b0f896
AM
7302 i.tm.base_opcode |= 8;
7303 else
7304 i.tm.base_opcode |= 1;
7305 }
d2224064
JB
7306 /* fall through */
7307 case SHORT_MNEM_SUFFIX:
29b0f896
AM
7308 /* Now select between word & dword operations via the operand
7309 size prefix, except for instructions that will ignore this
7310 prefix anyway. */
c8f8eebc 7311 if (i.suffix != QWORD_MNEM_SUFFIX
3cd7f3e3 7312 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
c8f8eebc
JB
7313 && !i.tm.opcode_modifier.floatmf
7314 && !is_any_vex_encoding (&i.tm)
7315 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
7316 || (flag_code == CODE_64BIT
7317 && i.tm.opcode_modifier.jump == JUMP_BYTE)))
24eab124
AM
7318 {
7319 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 7320
0cfa3eb3 7321 if (i.tm.opcode_modifier.jump == JUMP_BYTE) /* jcxz, loop */
29b0f896 7322 prefix = ADDR_PREFIX_OPCODE;
252b5132 7323
29b0f896
AM
7324 if (!add_prefix (prefix))
7325 return 0;
24eab124 7326 }
252b5132 7327
29b0f896
AM
7328 /* Set mode64 for an operand. */
7329 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 7330 && flag_code == CODE_64BIT
d2224064 7331 && !i.tm.opcode_modifier.norex64
4ed21b58 7332 && !i.tm.opcode_modifier.vexw
46e883c5 7333 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
7334 need rex64. */
7335 && ! (i.operands == 2
7336 && i.tm.base_opcode == 0x90
7337 && i.tm.extension_opcode == None
75e5731b
JB
7338 && i.types[0].bitfield.instance == Accum
7339 && i.types[0].bitfield.qword
7340 && i.types[1].bitfield.instance == Accum
7341 && i.types[1].bitfield.qword))
d2224064 7342 i.rex |= REX_W;
3e73aa7c 7343
d2224064 7344 break;
8bbb3ad8
JB
7345
7346 case 0:
f9a6a8f0 7347 /* Select word/dword/qword operation with explicit data sizing prefix
8bbb3ad8
JB
7348 when there are no suitable register operands. */
7349 if (i.tm.opcode_modifier.w
7350 && (i.prefix[DATA_PREFIX] || (i.prefix[REX_PREFIX] & REX_W))
7351 && (!i.reg_operands
7352 || (i.reg_operands == 1
7353 /* ShiftCount */
7354 && (i.tm.operand_types[0].bitfield.instance == RegC
7355 /* InOutPortReg */
7356 || i.tm.operand_types[0].bitfield.instance == RegD
7357 || i.tm.operand_types[1].bitfield.instance == RegD
7358 /* CRC32 */
8b65b895 7359 || is_crc32))))
8bbb3ad8
JB
7360 i.tm.base_opcode |= 1;
7361 break;
29b0f896 7362 }
7ecd2f8b 7363
c8f8eebc 7364 if (i.tm.opcode_modifier.addrprefixopreg)
c0a30a9f 7365 {
c8f8eebc
JB
7366 gas_assert (!i.suffix);
7367 gas_assert (i.reg_operands);
c0a30a9f 7368
c8f8eebc
JB
7369 if (i.tm.operand_types[0].bitfield.instance == Accum
7370 || i.operands == 1)
7371 {
7372 /* The address size override prefix changes the size of the
7373 first operand. */
7374 if (flag_code == CODE_64BIT
7375 && i.op[0].regs->reg_type.bitfield.word)
7376 {
7377 as_bad (_("16-bit addressing unavailable for `%s'"),
7378 i.tm.name);
7379 return 0;
7380 }
7381
7382 if ((flag_code == CODE_32BIT
7383 ? i.op[0].regs->reg_type.bitfield.word
7384 : i.op[0].regs->reg_type.bitfield.dword)
7385 && !add_prefix (ADDR_PREFIX_OPCODE))
7386 return 0;
7387 }
c0a30a9f
L
7388 else
7389 {
c8f8eebc
JB
7390 /* Check invalid register operand when the address size override
7391 prefix changes the size of register operands. */
7392 unsigned int op;
7393 enum { need_word, need_dword, need_qword } need;
7394
27f13469 7395 /* Check the register operand for the address size prefix if
b3a3496f 7396 the memory operand has no real registers, like symbol, DISP
829f3fe1 7397 or bogus (x32-only) symbol(%rip) when symbol(%eip) is meant. */
27f13469
L
7398 if (i.mem_operands == 1
7399 && i.reg_operands == 1
7400 && i.operands == 2
27f13469 7401 && i.types[1].bitfield.class == Reg
b3a3496f
L
7402 && (flag_code == CODE_32BIT
7403 ? i.op[1].regs->reg_type.bitfield.word
7404 : i.op[1].regs->reg_type.bitfield.dword)
7405 && ((i.base_reg == NULL && i.index_reg == NULL)
829f3fe1
JB
7406#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
7407 || (x86_elf_abi == X86_64_X32_ABI
7408 && i.base_reg
b3a3496f
L
7409 && i.base_reg->reg_num == RegIP
7410 && i.base_reg->reg_type.bitfield.qword))
829f3fe1
JB
7411#else
7412 || 0)
7413#endif
27f13469
L
7414 && !add_prefix (ADDR_PREFIX_OPCODE))
7415 return 0;
7416
c8f8eebc
JB
7417 if (flag_code == CODE_32BIT)
7418 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
7419 else if (i.prefix[ADDR_PREFIX])
c0a30a9f
L
7420 need = need_dword;
7421 else
7422 need = flag_code == CODE_64BIT ? need_qword : need_word;
c0a30a9f 7423
c8f8eebc
JB
7424 for (op = 0; op < i.operands; op++)
7425 {
7426 if (i.types[op].bitfield.class != Reg)
7427 continue;
7428
7429 switch (need)
7430 {
7431 case need_word:
7432 if (i.op[op].regs->reg_type.bitfield.word)
7433 continue;
7434 break;
7435 case need_dword:
7436 if (i.op[op].regs->reg_type.bitfield.dword)
7437 continue;
7438 break;
7439 case need_qword:
7440 if (i.op[op].regs->reg_type.bitfield.qword)
7441 continue;
7442 break;
7443 }
7444
7445 as_bad (_("invalid register operand size for `%s'"),
7446 i.tm.name);
7447 return 0;
7448 }
7449 }
c0a30a9f
L
7450 }
7451
29b0f896
AM
7452 return 1;
7453}
3e73aa7c 7454
29b0f896 7455static int
543613e9 7456check_byte_reg (void)
29b0f896
AM
7457{
7458 int op;
543613e9 7459
29b0f896
AM
7460 for (op = i.operands; --op >= 0;)
7461 {
dc821c5f 7462 /* Skip non-register operands. */
bab6aec1 7463 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
7464 continue;
7465
29b0f896
AM
7466 /* If this is an eight bit register, it's OK. If it's the 16 or
7467 32 bit version of an eight bit register, we will just use the
7468 low portion, and that's OK too. */
dc821c5f 7469 if (i.types[op].bitfield.byte)
29b0f896
AM
7470 continue;
7471
5a819eb9 7472 /* I/O port address operands are OK too. */
75e5731b
JB
7473 if (i.tm.operand_types[op].bitfield.instance == RegD
7474 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
7475 continue;
7476
9706160a 7477 /* crc32 only wants its source operand checked here. */
389d00a5
JB
7478 if (i.tm.base_opcode == 0xf0
7479 && i.tm.opcode_modifier.opcodespace == SPACE_0F38
8b65b895
L
7480 && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2
7481 && op != 0)
9344ff29
L
7482 continue;
7483
29b0f896 7484 /* Any other register is bad. */
73c76375
JB
7485 as_bad (_("`%s%s' not allowed with `%s%c'"),
7486 register_prefix, i.op[op].regs->reg_name,
7487 i.tm.name, i.suffix);
7488 return 0;
29b0f896
AM
7489 }
7490 return 1;
7491}
7492
7493static int
e3bb37b5 7494check_long_reg (void)
29b0f896
AM
7495{
7496 int op;
7497
7498 for (op = i.operands; --op >= 0;)
dc821c5f 7499 /* Skip non-register operands. */
bab6aec1 7500 if (i.types[op].bitfield.class != Reg)
dc821c5f 7501 continue;
29b0f896
AM
7502 /* Reject eight bit registers, except where the template requires
7503 them. (eg. movzb) */
dc821c5f 7504 else if (i.types[op].bitfield.byte
bab6aec1 7505 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7506 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7507 && (i.tm.operand_types[op].bitfield.word
7508 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7509 {
a540244d
L
7510 as_bad (_("`%s%s' not allowed with `%s%c'"),
7511 register_prefix,
29b0f896
AM
7512 i.op[op].regs->reg_name,
7513 i.tm.name,
7514 i.suffix);
7515 return 0;
7516 }
be4c5e58
L
7517 /* Error if the e prefix on a general reg is missing. */
7518 else if (i.types[op].bitfield.word
bab6aec1 7519 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7520 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7521 && i.tm.operand_types[op].bitfield.dword)
29b0f896 7522 {
be4c5e58
L
7523 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7524 register_prefix, i.op[op].regs->reg_name,
7525 i.suffix);
7526 return 0;
252b5132 7527 }
e4630f71 7528 /* Warn if the r prefix on a general reg is present. */
dc821c5f 7529 else if (i.types[op].bitfield.qword
bab6aec1 7530 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7531 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7532 && i.tm.operand_types[op].bitfield.dword)
252b5132 7533 {
34828aad 7534 if (intel_syntax
65fca059 7535 && i.tm.opcode_modifier.toqword
3528c362 7536 && i.types[0].bitfield.class != RegSIMD)
34828aad 7537 {
ca61edf2 7538 /* Convert to QWORD. We want REX byte. */
34828aad
L
7539 i.suffix = QWORD_MNEM_SUFFIX;
7540 }
7541 else
7542 {
2b5d6a91 7543 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7544 register_prefix, i.op[op].regs->reg_name,
7545 i.suffix);
7546 return 0;
7547 }
29b0f896
AM
7548 }
7549 return 1;
7550}
252b5132 7551
29b0f896 7552static int
e3bb37b5 7553check_qword_reg (void)
29b0f896
AM
7554{
7555 int op;
252b5132 7556
29b0f896 7557 for (op = i.operands; --op >= 0; )
dc821c5f 7558 /* Skip non-register operands. */
bab6aec1 7559 if (i.types[op].bitfield.class != Reg)
dc821c5f 7560 continue;
29b0f896
AM
7561 /* Reject eight bit registers, except where the template requires
7562 them. (eg. movzb) */
dc821c5f 7563 else if (i.types[op].bitfield.byte
bab6aec1 7564 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7565 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7566 && (i.tm.operand_types[op].bitfield.word
7567 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7568 {
a540244d
L
7569 as_bad (_("`%s%s' not allowed with `%s%c'"),
7570 register_prefix,
29b0f896
AM
7571 i.op[op].regs->reg_name,
7572 i.tm.name,
7573 i.suffix);
7574 return 0;
7575 }
e4630f71 7576 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
7577 else if ((i.types[op].bitfield.word
7578 || i.types[op].bitfield.dword)
bab6aec1 7579 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7580 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7581 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
7582 {
7583 /* Prohibit these changes in the 64bit mode, since the
7584 lowering is more complicated. */
34828aad 7585 if (intel_syntax
ca61edf2 7586 && i.tm.opcode_modifier.todword
3528c362 7587 && i.types[0].bitfield.class != RegSIMD)
34828aad 7588 {
ca61edf2 7589 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
7590 i.suffix = LONG_MNEM_SUFFIX;
7591 }
7592 else
7593 {
2b5d6a91 7594 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7595 register_prefix, i.op[op].regs->reg_name,
7596 i.suffix);
7597 return 0;
7598 }
252b5132 7599 }
29b0f896
AM
7600 return 1;
7601}
252b5132 7602
29b0f896 7603static int
e3bb37b5 7604check_word_reg (void)
29b0f896
AM
7605{
7606 int op;
7607 for (op = i.operands; --op >= 0;)
dc821c5f 7608 /* Skip non-register operands. */
bab6aec1 7609 if (i.types[op].bitfield.class != Reg)
dc821c5f 7610 continue;
29b0f896
AM
7611 /* Reject eight bit registers, except where the template requires
7612 them. (eg. movzb) */
dc821c5f 7613 else if (i.types[op].bitfield.byte
bab6aec1 7614 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7615 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7616 && (i.tm.operand_types[op].bitfield.word
7617 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7618 {
a540244d
L
7619 as_bad (_("`%s%s' not allowed with `%s%c'"),
7620 register_prefix,
29b0f896
AM
7621 i.op[op].regs->reg_name,
7622 i.tm.name,
7623 i.suffix);
7624 return 0;
7625 }
9706160a
JB
7626 /* Error if the e or r prefix on a general reg is present. */
7627 else if ((i.types[op].bitfield.dword
dc821c5f 7628 || i.types[op].bitfield.qword)
bab6aec1 7629 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7630 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7631 && i.tm.operand_types[op].bitfield.word)
252b5132 7632 {
9706160a
JB
7633 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7634 register_prefix, i.op[op].regs->reg_name,
7635 i.suffix);
7636 return 0;
29b0f896
AM
7637 }
7638 return 1;
7639}
252b5132 7640
29b0f896 7641static int
40fb9820 7642update_imm (unsigned int j)
29b0f896 7643{
bc0844ae 7644 i386_operand_type overlap = i.types[j];
40fb9820
L
7645 if ((overlap.bitfield.imm8
7646 || overlap.bitfield.imm8s
7647 || overlap.bitfield.imm16
7648 || overlap.bitfield.imm32
7649 || overlap.bitfield.imm32s
7650 || overlap.bitfield.imm64)
0dfbf9d7
L
7651 && !operand_type_equal (&overlap, &imm8)
7652 && !operand_type_equal (&overlap, &imm8s)
7653 && !operand_type_equal (&overlap, &imm16)
7654 && !operand_type_equal (&overlap, &imm32)
7655 && !operand_type_equal (&overlap, &imm32s)
7656 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
7657 {
7658 if (i.suffix)
7659 {
40fb9820
L
7660 i386_operand_type temp;
7661
0dfbf9d7 7662 operand_type_set (&temp, 0);
7ab9ffdd 7663 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
7664 {
7665 temp.bitfield.imm8 = overlap.bitfield.imm8;
7666 temp.bitfield.imm8s = overlap.bitfield.imm8s;
7667 }
7668 else if (i.suffix == WORD_MNEM_SUFFIX)
7669 temp.bitfield.imm16 = overlap.bitfield.imm16;
7670 else if (i.suffix == QWORD_MNEM_SUFFIX)
7671 {
7672 temp.bitfield.imm64 = overlap.bitfield.imm64;
7673 temp.bitfield.imm32s = overlap.bitfield.imm32s;
7674 }
7675 else
7676 temp.bitfield.imm32 = overlap.bitfield.imm32;
7677 overlap = temp;
29b0f896 7678 }
0dfbf9d7
L
7679 else if (operand_type_equal (&overlap, &imm16_32_32s)
7680 || operand_type_equal (&overlap, &imm16_32)
7681 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 7682 {
40fb9820 7683 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 7684 overlap = imm16;
40fb9820 7685 else
65da13b5 7686 overlap = imm32s;
29b0f896 7687 }
8bbb3ad8
JB
7688 else if (i.prefix[REX_PREFIX] & REX_W)
7689 overlap = operand_type_and (overlap, imm32s);
7690 else if (i.prefix[DATA_PREFIX])
7691 overlap = operand_type_and (overlap,
7692 flag_code != CODE_16BIT ? imm16 : imm32);
0dfbf9d7
L
7693 if (!operand_type_equal (&overlap, &imm8)
7694 && !operand_type_equal (&overlap, &imm8s)
7695 && !operand_type_equal (&overlap, &imm16)
7696 && !operand_type_equal (&overlap, &imm32)
7697 && !operand_type_equal (&overlap, &imm32s)
7698 && !operand_type_equal (&overlap, &imm64))
29b0f896 7699 {
4eed87de
AM
7700 as_bad (_("no instruction mnemonic suffix given; "
7701 "can't determine immediate size"));
29b0f896
AM
7702 return 0;
7703 }
7704 }
40fb9820 7705 i.types[j] = overlap;
29b0f896 7706
40fb9820
L
7707 return 1;
7708}
7709
7710static int
7711finalize_imm (void)
7712{
bc0844ae 7713 unsigned int j, n;
29b0f896 7714
bc0844ae
L
7715 /* Update the first 2 immediate operands. */
7716 n = i.operands > 2 ? 2 : i.operands;
7717 if (n)
7718 {
7719 for (j = 0; j < n; j++)
7720 if (update_imm (j) == 0)
7721 return 0;
40fb9820 7722
bc0844ae
L
7723 /* The 3rd operand can't be immediate operand. */
7724 gas_assert (operand_type_check (i.types[2], imm) == 0);
7725 }
29b0f896
AM
7726
7727 return 1;
7728}
7729
7730static int
e3bb37b5 7731process_operands (void)
29b0f896
AM
7732{
7733 /* Default segment register this instruction will use for memory
7734 accesses. 0 means unknown. This is only for optimizing out
7735 unnecessary segment overrides. */
5e042380 7736 const reg_entry *default_seg = NULL;
29b0f896 7737
a5aeccd9
JB
7738 if (i.tm.opcode_modifier.sse2avx)
7739 {
7740 /* Legacy encoded insns allow explicit REX prefixes, so these prefixes
7741 need converting. */
7742 i.rex |= i.prefix[REX_PREFIX] & (REX_W | REX_R | REX_X | REX_B);
7743 i.prefix[REX_PREFIX] = 0;
7744 i.rex_encoding = 0;
7745 }
c423d21a
JB
7746 /* ImmExt should be processed after SSE2AVX. */
7747 else if (i.tm.opcode_modifier.immext)
7748 process_immext ();
a5aeccd9 7749
2426c15f 7750 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 7751 {
91d6fa6a
NC
7752 unsigned int dupl = i.operands;
7753 unsigned int dest = dupl - 1;
9fcfb3d7
L
7754 unsigned int j;
7755
c0f3af97 7756 /* The destination must be an xmm register. */
9c2799c2 7757 gas_assert (i.reg_operands
91d6fa6a 7758 && MAX_OPERANDS > dupl
7ab9ffdd 7759 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 7760
75e5731b 7761 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7762 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 7763 {
8cd7925b 7764 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
7765 {
7766 /* Keep xmm0 for instructions with VEX prefix and 3
7767 sources. */
75e5731b 7768 i.tm.operand_types[0].bitfield.instance = InstanceNone;
3528c362 7769 i.tm.operand_types[0].bitfield.class = RegSIMD;
c0f3af97
L
7770 goto duplicate;
7771 }
e2ec9d29 7772 else
c0f3af97
L
7773 {
7774 /* We remove the first xmm0 and keep the number of
7775 operands unchanged, which in fact duplicates the
7776 destination. */
7777 for (j = 1; j < i.operands; j++)
7778 {
7779 i.op[j - 1] = i.op[j];
7780 i.types[j - 1] = i.types[j];
7781 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
8dc0818e 7782 i.flags[j - 1] = i.flags[j];
c0f3af97
L
7783 }
7784 }
7785 }
7786 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 7787 {
91d6fa6a 7788 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
7789 && (i.tm.opcode_modifier.vexsources
7790 == VEX3SOURCES));
c0f3af97
L
7791
7792 /* Add the implicit xmm0 for instructions with VEX prefix
7793 and 3 sources. */
7794 for (j = i.operands; j > 0; j--)
7795 {
7796 i.op[j] = i.op[j - 1];
7797 i.types[j] = i.types[j - 1];
7798 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 7799 i.flags[j] = i.flags[j - 1];
c0f3af97
L
7800 }
7801 i.op[0].regs
629310ab 7802 = (const reg_entry *) str_hash_find (reg_hash, "xmm0");
7ab9ffdd 7803 i.types[0] = regxmm;
c0f3af97
L
7804 i.tm.operand_types[0] = regxmm;
7805
7806 i.operands += 2;
7807 i.reg_operands += 2;
7808 i.tm.operands += 2;
7809
91d6fa6a 7810 dupl++;
c0f3af97 7811 dest++;
91d6fa6a
NC
7812 i.op[dupl] = i.op[dest];
7813 i.types[dupl] = i.types[dest];
7814 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7815 i.flags[dupl] = i.flags[dest];
e2ec9d29 7816 }
c0f3af97
L
7817 else
7818 {
dc1e8a47 7819 duplicate:
c0f3af97
L
7820 i.operands++;
7821 i.reg_operands++;
7822 i.tm.operands++;
7823
91d6fa6a
NC
7824 i.op[dupl] = i.op[dest];
7825 i.types[dupl] = i.types[dest];
7826 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7827 i.flags[dupl] = i.flags[dest];
c0f3af97
L
7828 }
7829
7830 if (i.tm.opcode_modifier.immext)
7831 process_immext ();
7832 }
75e5731b 7833 else if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7834 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
7835 {
7836 unsigned int j;
7837
9fcfb3d7
L
7838 for (j = 1; j < i.operands; j++)
7839 {
7840 i.op[j - 1] = i.op[j];
7841 i.types[j - 1] = i.types[j];
7842
7843 /* We need to adjust fields in i.tm since they are used by
7844 build_modrm_byte. */
7845 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
7846
7847 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
7848 }
7849
e2ec9d29
L
7850 i.operands--;
7851 i.reg_operands--;
e2ec9d29
L
7852 i.tm.operands--;
7853 }
920d2ddc
IT
7854 else if (i.tm.opcode_modifier.implicitquadgroup)
7855 {
a477a8c4
JB
7856 unsigned int regnum, first_reg_in_group, last_reg_in_group;
7857
920d2ddc 7858 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 7859 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
7860 regnum = register_number (i.op[1].regs);
7861 first_reg_in_group = regnum & ~3;
7862 last_reg_in_group = first_reg_in_group + 3;
7863 if (regnum != first_reg_in_group)
7864 as_warn (_("source register `%s%s' implicitly denotes"
7865 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
7866 register_prefix, i.op[1].regs->reg_name,
7867 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
7868 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
7869 i.tm.name);
7870 }
e2ec9d29
L
7871 else if (i.tm.opcode_modifier.regkludge)
7872 {
7873 /* The imul $imm, %reg instruction is converted into
7874 imul $imm, %reg, %reg, and the clr %reg instruction
7875 is converted into xor %reg, %reg. */
7876
7877 unsigned int first_reg_op;
7878
7879 if (operand_type_check (i.types[0], reg))
7880 first_reg_op = 0;
7881 else
7882 first_reg_op = 1;
7883 /* Pretend we saw the extra register operand. */
9c2799c2 7884 gas_assert (i.reg_operands == 1
7ab9ffdd 7885 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
7886 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
7887 i.types[first_reg_op + 1] = i.types[first_reg_op];
7888 i.operands++;
7889 i.reg_operands++;
29b0f896
AM
7890 }
7891
85b80b0f 7892 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
7893 {
7894 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
7895 must be put into the modrm byte). Now, we make the modrm and
7896 index base bytes based on all the info we've collected. */
29b0f896
AM
7897
7898 default_seg = build_modrm_byte ();
7899 }
00cee14f 7900 else if (i.types[0].bitfield.class == SReg)
85b80b0f
JB
7901 {
7902 if (flag_code != CODE_64BIT
7903 ? i.tm.base_opcode == POP_SEG_SHORT
7904 && i.op[0].regs->reg_num == 1
389d00a5 7905 : (i.tm.base_opcode | 1) == (POP_SEG386_SHORT & 0xff)
85b80b0f
JB
7906 && i.op[0].regs->reg_num < 4)
7907 {
7908 as_bad (_("you can't `%s %s%s'"),
7909 i.tm.name, register_prefix, i.op[0].regs->reg_name);
7910 return 0;
7911 }
389d00a5
JB
7912 if (i.op[0].regs->reg_num > 3
7913 && i.tm.opcode_modifier.opcodespace == SPACE_BASE )
85b80b0f 7914 {
389d00a5
JB
7915 i.tm.base_opcode ^= (POP_SEG_SHORT ^ POP_SEG386_SHORT) & 0xff;
7916 i.tm.opcode_modifier.opcodespace = SPACE_0F;
85b80b0f
JB
7917 }
7918 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
7919 }
389d00a5
JB
7920 else if (i.tm.opcode_modifier.opcodespace == SPACE_BASE
7921 && (i.tm.base_opcode & ~3) == MOV_AX_DISP32)
29b0f896 7922 {
5e042380 7923 default_seg = reg_ds;
29b0f896 7924 }
40fb9820 7925 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
7926 {
7927 /* For the string instructions that allow a segment override
7928 on one of their operands, the default segment is ds. */
5e042380 7929 default_seg = reg_ds;
29b0f896 7930 }
50128d0c 7931 else if (i.short_form)
85b80b0f
JB
7932 {
7933 /* The register or float register operand is in operand
7934 0 or 1. */
bab6aec1 7935 unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
85b80b0f
JB
7936
7937 /* Register goes in low 3 bits of opcode. */
7938 i.tm.base_opcode |= i.op[op].regs->reg_num;
7939 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7940 i.rex |= REX_B;
7941 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
7942 {
7943 /* Warn about some common errors, but press on regardless.
7944 The first case can be generated by gcc (<= 2.8.1). */
7945 if (i.operands == 2)
7946 {
7947 /* Reversed arguments on faddp, fsubp, etc. */
7948 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
7949 register_prefix, i.op[!intel_syntax].regs->reg_name,
7950 register_prefix, i.op[intel_syntax].regs->reg_name);
7951 }
7952 else
7953 {
7954 /* Extraneous `l' suffix on fp insn. */
7955 as_warn (_("translating to `%s %s%s'"), i.tm.name,
7956 register_prefix, i.op[0].regs->reg_name);
7957 }
7958 }
7959 }
29b0f896 7960
514a8bb0 7961 if ((i.seg[0] || i.prefix[SEG_PREFIX])
514a8bb0 7962 && i.tm.base_opcode == 0x8d /* lea */
35648716 7963 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
514a8bb0 7964 && !is_any_vex_encoding(&i.tm))
92334ad2
JB
7965 {
7966 if (!quiet_warnings)
7967 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
7968 if (optimize)
7969 {
7970 i.seg[0] = NULL;
7971 i.prefix[SEG_PREFIX] = 0;
7972 }
7973 }
52271982
AM
7974
7975 /* If a segment was explicitly specified, and the specified segment
b6773884
JB
7976 is neither the default nor the one already recorded from a prefix,
7977 use an opcode prefix to select it. If we never figured out what
7978 the default segment is, then default_seg will be zero at this
7979 point, and the specified segment prefix will always be used. */
7980 if (i.seg[0]
7981 && i.seg[0] != default_seg
5e042380 7982 && i386_seg_prefixes[i.seg[0]->reg_num] != i.prefix[SEG_PREFIX])
29b0f896 7983 {
5e042380 7984 if (!add_prefix (i386_seg_prefixes[i.seg[0]->reg_num]))
29b0f896
AM
7985 return 0;
7986 }
7987 return 1;
7988}
7989
a5aeccd9 7990static INLINE void set_rex_vrex (const reg_entry *r, unsigned int rex_bit,
5b7c81bd 7991 bool do_sse2avx)
a5aeccd9
JB
7992{
7993 if (r->reg_flags & RegRex)
7994 {
7995 if (i.rex & rex_bit)
7996 as_bad (_("same type of prefix used twice"));
7997 i.rex |= rex_bit;
7998 }
7999 else if (do_sse2avx && (i.rex & rex_bit) && i.vex.register_specifier)
8000 {
8001 gas_assert (i.vex.register_specifier == r);
8002 i.vex.register_specifier += 8;
8003 }
8004
8005 if (r->reg_flags & RegVRex)
8006 i.vrex |= rex_bit;
8007}
8008
5e042380 8009static const reg_entry *
e3bb37b5 8010build_modrm_byte (void)
29b0f896 8011{
5e042380 8012 const reg_entry *default_seg = NULL;
c0f3af97 8013 unsigned int source, dest;
8cd7925b 8014 int vex_3_sources;
c0f3af97 8015
8cd7925b 8016 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
8017 if (vex_3_sources)
8018 {
91d6fa6a 8019 unsigned int nds, reg_slot;
4c2c6516 8020 expressionS *exp;
c0f3af97 8021
6b8d3588 8022 dest = i.operands - 1;
c0f3af97 8023 nds = dest - 1;
922d8de8 8024
a683cc34 8025 /* There are 2 kinds of instructions:
bed3d976 8026 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 8027 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 8028 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 8029 ZMM register.
bed3d976 8030 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 8031 plus 1 memory operand, with VexXDS. */
922d8de8 8032 gas_assert ((i.reg_operands == 4
bed3d976
JB
8033 || (i.reg_operands == 3 && i.mem_operands == 1))
8034 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323 8035 && i.tm.opcode_modifier.vexw
3528c362 8036 && i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 8037
48db9223
JB
8038 /* If VexW1 is set, the first non-immediate operand is the source and
8039 the second non-immediate one is encoded in the immediate operand. */
8040 if (i.tm.opcode_modifier.vexw == VEXW1)
8041 {
8042 source = i.imm_operands;
8043 reg_slot = i.imm_operands + 1;
8044 }
8045 else
8046 {
8047 source = i.imm_operands + 1;
8048 reg_slot = i.imm_operands;
8049 }
8050
a683cc34 8051 if (i.imm_operands == 0)
bed3d976
JB
8052 {
8053 /* When there is no immediate operand, generate an 8bit
8054 immediate operand to encode the first operand. */
8055 exp = &im_expressions[i.imm_operands++];
8056 i.op[i.operands].imms = exp;
8057 i.types[i.operands] = imm8;
8058 i.operands++;
8059
3528c362 8060 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
bed3d976
JB
8061 exp->X_op = O_constant;
8062 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
8063 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
8064 }
922d8de8 8065 else
bed3d976 8066 {
9d3bf266
JB
8067 gas_assert (i.imm_operands == 1);
8068 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
8069 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 8070
9d3bf266
JB
8071 /* Turn on Imm8 again so that output_imm will generate it. */
8072 i.types[0].bitfield.imm8 = 1;
bed3d976 8073
3528c362 8074 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
9d3bf266 8075 i.op[0].imms->X_add_number
bed3d976 8076 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 8077 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 8078 }
a683cc34 8079
3528c362 8080 gas_assert (i.tm.operand_types[nds].bitfield.class == RegSIMD);
dae39acc 8081 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
8082 }
8083 else
8084 source = dest = 0;
29b0f896
AM
8085
8086 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
8087 implicit registers do not count. If there are 3 register
8088 operands, it must be a instruction with VexNDS. For a
8089 instruction with VexNDD, the destination register is encoded
8090 in VEX prefix. If there are 4 register operands, it must be
8091 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
8092 if (i.mem_operands == 0
8093 && ((i.reg_operands == 2
2426c15f 8094 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 8095 || (i.reg_operands == 3
2426c15f 8096 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 8097 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 8098 {
cab737b9
L
8099 switch (i.operands)
8100 {
8101 case 2:
8102 source = 0;
8103 break;
8104 case 3:
c81128dc
L
8105 /* When there are 3 operands, one of them may be immediate,
8106 which may be the first or the last operand. Otherwise,
c0f3af97
L
8107 the first operand must be shift count register (cl) or it
8108 is an instruction with VexNDS. */
9c2799c2 8109 gas_assert (i.imm_operands == 1
7ab9ffdd 8110 || (i.imm_operands == 0
2426c15f 8111 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
75e5731b
JB
8112 || (i.types[0].bitfield.instance == RegC
8113 && i.types[0].bitfield.byte))));
40fb9820 8114 if (operand_type_check (i.types[0], imm)
75e5731b
JB
8115 || (i.types[0].bitfield.instance == RegC
8116 && i.types[0].bitfield.byte))
40fb9820
L
8117 source = 1;
8118 else
8119 source = 0;
cab737b9
L
8120 break;
8121 case 4:
368d64cc
L
8122 /* When there are 4 operands, the first two must be 8bit
8123 immediate operands. The source operand will be the 3rd
c0f3af97
L
8124 one.
8125
8126 For instructions with VexNDS, if the first operand
8127 an imm8, the source operand is the 2nd one. If the last
8128 operand is imm8, the source operand is the first one. */
9c2799c2 8129 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
8130 && i.types[0].bitfield.imm8
8131 && i.types[1].bitfield.imm8)
2426c15f 8132 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
8133 && i.imm_operands == 1
8134 && (i.types[0].bitfield.imm8
43234a1e 8135 || i.types[i.operands - 1].bitfield.imm8
ca5312a2 8136 || i.rounding.type != rc_none)));
9f2670f2
L
8137 if (i.imm_operands == 2)
8138 source = 2;
8139 else
c0f3af97
L
8140 {
8141 if (i.types[0].bitfield.imm8)
8142 source = 1;
8143 else
8144 source = 0;
8145 }
c0f3af97
L
8146 break;
8147 case 5:
e771e7c9 8148 if (is_evex_encoding (&i.tm))
43234a1e
L
8149 {
8150 /* For EVEX instructions, when there are 5 operands, the
8151 first one must be immediate operand. If the second one
8152 is immediate operand, the source operand is the 3th
8153 one. If the last one is immediate operand, the source
8154 operand is the 2nd one. */
8155 gas_assert (i.imm_operands == 2
8156 && i.tm.opcode_modifier.sae
8157 && operand_type_check (i.types[0], imm));
8158 if (operand_type_check (i.types[1], imm))
8159 source = 2;
8160 else if (operand_type_check (i.types[4], imm))
8161 source = 1;
8162 else
8163 abort ();
8164 }
cab737b9
L
8165 break;
8166 default:
8167 abort ();
8168 }
8169
c0f3af97
L
8170 if (!vex_3_sources)
8171 {
8172 dest = source + 1;
8173
43234a1e
L
8174 /* RC/SAE operand could be between DEST and SRC. That happens
8175 when one operand is GPR and the other one is XMM/YMM/ZMM
8176 register. */
ca5312a2 8177 if (i.rounding.type != rc_none && i.rounding.operand == dest)
43234a1e
L
8178 dest++;
8179
2426c15f 8180 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 8181 {
43234a1e 8182 /* For instructions with VexNDS, the register-only source
c5d0745b 8183 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
dfd69174 8184 register. It is encoded in VEX prefix. */
f12dc422
L
8185
8186 i386_operand_type op;
8187 unsigned int vvvv;
8188
c2ecccb3
L
8189 /* Swap two source operands if needed. */
8190 if (i.tm.opcode_modifier.swapsources)
f12dc422
L
8191 {
8192 vvvv = source;
8193 source = dest;
8194 }
8195 else
8196 vvvv = dest;
8197
8198 op = i.tm.operand_types[vvvv];
c0f3af97 8199 if ((dest + 1) >= i.operands
bab6aec1 8200 || ((op.bitfield.class != Reg
dc821c5f 8201 || (!op.bitfield.dword && !op.bitfield.qword))
3528c362 8202 && op.bitfield.class != RegSIMD
43234a1e 8203 && !operand_type_equal (&op, &regmask)))
c0f3af97 8204 abort ();
f12dc422 8205 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
8206 dest++;
8207 }
8208 }
29b0f896
AM
8209
8210 i.rm.mode = 3;
dfd69174
JB
8211 /* One of the register operands will be encoded in the i.rm.reg
8212 field, the other in the combined i.rm.mode and i.rm.regmem
29b0f896
AM
8213 fields. If no form of this instruction supports a memory
8214 destination operand, then we assume the source operand may
8215 sometimes be a memory operand and so we need to store the
8216 destination in the i.rm.reg field. */
dfd69174 8217 if (!i.tm.opcode_modifier.regmem
40fb9820 8218 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
8219 {
8220 i.rm.reg = i.op[dest].regs->reg_num;
8221 i.rm.regmem = i.op[source].regs->reg_num;
a5aeccd9 8222 set_rex_vrex (i.op[dest].regs, REX_R, i.tm.opcode_modifier.sse2avx);
5b7c81bd 8223 set_rex_vrex (i.op[source].regs, REX_B, false);
29b0f896
AM
8224 }
8225 else
8226 {
8227 i.rm.reg = i.op[source].regs->reg_num;
8228 i.rm.regmem = i.op[dest].regs->reg_num;
a5aeccd9 8229 set_rex_vrex (i.op[dest].regs, REX_B, i.tm.opcode_modifier.sse2avx);
5b7c81bd 8230 set_rex_vrex (i.op[source].regs, REX_R, false);
29b0f896 8231 }
e0c7f900 8232 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 8233 {
4a5c67ed 8234 if (i.types[!i.tm.opcode_modifier.regmem].bitfield.class != RegCR)
c4a530c5 8235 abort ();
e0c7f900 8236 i.rex &= ~REX_R;
c4a530c5
JB
8237 add_prefix (LOCK_PREFIX_OPCODE);
8238 }
29b0f896
AM
8239 }
8240 else
8241 { /* If it's not 2 reg operands... */
c0f3af97
L
8242 unsigned int mem;
8243
29b0f896
AM
8244 if (i.mem_operands)
8245 {
8246 unsigned int fake_zero_displacement = 0;
99018f42 8247 unsigned int op;
4eed87de 8248
7ab9ffdd 8249 for (op = 0; op < i.operands; op++)
8dc0818e 8250 if (i.flags[op] & Operand_Mem)
7ab9ffdd 8251 break;
7ab9ffdd 8252 gas_assert (op < i.operands);
29b0f896 8253
63112cd6 8254 if (i.tm.opcode_modifier.sib)
6c30d220 8255 {
260cd341
LC
8256 /* The index register of VSIB shouldn't be RegIZ. */
8257 if (i.tm.opcode_modifier.sib != SIBMEM
8258 && i.index_reg->reg_num == RegIZ)
6c30d220
L
8259 abort ();
8260
8261 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8262 if (!i.base_reg)
8263 {
8264 i.sib.base = NO_BASE_REGISTER;
8265 i.sib.scale = i.log2_scale_factor;
8266 i.types[op].bitfield.disp8 = 0;
8267 i.types[op].bitfield.disp16 = 0;
8268 i.types[op].bitfield.disp64 = 0;
a9aabc23 8269 if (want_disp32 (&i.tm))
6c30d220
L
8270 {
8271 /* Must be 32 bit */
8272 i.types[op].bitfield.disp32 = 1;
8273 i.types[op].bitfield.disp32s = 0;
8274 }
8275 else
8276 {
8277 i.types[op].bitfield.disp32 = 0;
8278 i.types[op].bitfield.disp32s = 1;
8279 }
8280 }
260cd341
LC
8281
8282 /* Since the mandatory SIB always has index register, so
8283 the code logic remains unchanged. The non-mandatory SIB
8284 without index register is allowed and will be handled
8285 later. */
8286 if (i.index_reg)
8287 {
8288 if (i.index_reg->reg_num == RegIZ)
8289 i.sib.index = NO_INDEX_REGISTER;
8290 else
8291 i.sib.index = i.index_reg->reg_num;
5b7c81bd 8292 set_rex_vrex (i.index_reg, REX_X, false);
260cd341 8293 }
6c30d220
L
8294 }
8295
5e042380 8296 default_seg = reg_ds;
29b0f896
AM
8297
8298 if (i.base_reg == 0)
8299 {
8300 i.rm.mode = 0;
8301 if (!i.disp_operands)
9bb129e8 8302 fake_zero_displacement = 1;
29b0f896
AM
8303 if (i.index_reg == 0)
8304 {
73053c1f
JB
8305 i386_operand_type newdisp;
8306
260cd341
LC
8307 /* Both check for VSIB and mandatory non-vector SIB. */
8308 gas_assert (!i.tm.opcode_modifier.sib
8309 || i.tm.opcode_modifier.sib == SIBMEM);
29b0f896 8310 /* Operand is just <disp> */
20f0a1fc 8311 if (flag_code == CODE_64BIT)
29b0f896
AM
8312 {
8313 /* 64bit mode overwrites the 32bit absolute
8314 addressing by RIP relative addressing and
8315 absolute addressing is encoded by one of the
8316 redundant SIB forms. */
8317 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8318 i.sib.base = NO_BASE_REGISTER;
8319 i.sib.index = NO_INDEX_REGISTER;
a9aabc23 8320 newdisp = (want_disp32(&i.tm) ? disp32 : disp32s);
20f0a1fc 8321 }
fc225355
L
8322 else if ((flag_code == CODE_16BIT)
8323 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
8324 {
8325 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 8326 newdisp = disp16;
20f0a1fc
NC
8327 }
8328 else
8329 {
8330 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 8331 newdisp = disp32;
29b0f896 8332 }
73053c1f
JB
8333 i.types[op] = operand_type_and_not (i.types[op], anydisp);
8334 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 8335 }
63112cd6 8336 else if (!i.tm.opcode_modifier.sib)
29b0f896 8337 {
6c30d220 8338 /* !i.base_reg && i.index_reg */
e968fc9b 8339 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8340 i.sib.index = NO_INDEX_REGISTER;
8341 else
8342 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8343 i.sib.base = NO_BASE_REGISTER;
8344 i.sib.scale = i.log2_scale_factor;
8345 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
8346 i.types[op].bitfield.disp8 = 0;
8347 i.types[op].bitfield.disp16 = 0;
8348 i.types[op].bitfield.disp64 = 0;
a9aabc23 8349 if (want_disp32 (&i.tm))
40fb9820
L
8350 {
8351 /* Must be 32 bit */
8352 i.types[op].bitfield.disp32 = 1;
8353 i.types[op].bitfield.disp32s = 0;
8354 }
29b0f896 8355 else
40fb9820
L
8356 {
8357 i.types[op].bitfield.disp32 = 0;
8358 i.types[op].bitfield.disp32s = 1;
8359 }
29b0f896 8360 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8361 i.rex |= REX_X;
29b0f896
AM
8362 }
8363 }
8364 /* RIP addressing for 64bit mode. */
e968fc9b 8365 else if (i.base_reg->reg_num == RegIP)
29b0f896 8366 {
63112cd6 8367 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896 8368 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
8369 i.types[op].bitfield.disp8 = 0;
8370 i.types[op].bitfield.disp16 = 0;
8371 i.types[op].bitfield.disp32 = 0;
8372 i.types[op].bitfield.disp32s = 1;
8373 i.types[op].bitfield.disp64 = 0;
71903a11 8374 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
8375 if (! i.disp_operands)
8376 fake_zero_displacement = 1;
29b0f896 8377 }
dc821c5f 8378 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 8379 {
63112cd6 8380 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896
AM
8381 switch (i.base_reg->reg_num)
8382 {
8383 case 3: /* (%bx) */
8384 if (i.index_reg == 0)
8385 i.rm.regmem = 7;
8386 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
8387 i.rm.regmem = i.index_reg->reg_num - 6;
8388 break;
8389 case 5: /* (%bp) */
5e042380 8390 default_seg = reg_ss;
29b0f896
AM
8391 if (i.index_reg == 0)
8392 {
8393 i.rm.regmem = 6;
40fb9820 8394 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
8395 {
8396 /* fake (%bp) into 0(%bp) */
41eb8e88 8397 if (i.disp_encoding == disp_encoding_16bit)
1a02d6b0
L
8398 i.types[op].bitfield.disp16 = 1;
8399 else
8400 i.types[op].bitfield.disp8 = 1;
252b5132 8401 fake_zero_displacement = 1;
29b0f896
AM
8402 }
8403 }
8404 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
8405 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
8406 break;
8407 default: /* (%si) -> 4 or (%di) -> 5 */
8408 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
8409 }
41eb8e88
L
8410 if (!fake_zero_displacement
8411 && !i.disp_operands
8412 && i.disp_encoding)
8413 {
8414 fake_zero_displacement = 1;
8415 if (i.disp_encoding == disp_encoding_8bit)
8416 i.types[op].bitfield.disp8 = 1;
8417 else
8418 i.types[op].bitfield.disp16 = 1;
8419 }
29b0f896
AM
8420 i.rm.mode = mode_from_disp_size (i.types[op]);
8421 }
8422 else /* i.base_reg and 32/64 bit mode */
8423 {
a9aabc23 8424 if (operand_type_check (i.types[op], disp))
40fb9820 8425 {
73053c1f
JB
8426 i.types[op].bitfield.disp16 = 0;
8427 i.types[op].bitfield.disp64 = 0;
a9aabc23 8428 if (!want_disp32 (&i.tm))
73053c1f
JB
8429 {
8430 i.types[op].bitfield.disp32 = 0;
8431 i.types[op].bitfield.disp32s = 1;
8432 }
40fb9820 8433 else
73053c1f
JB
8434 {
8435 i.types[op].bitfield.disp32 = 1;
8436 i.types[op].bitfield.disp32s = 0;
8437 }
40fb9820 8438 }
20f0a1fc 8439
63112cd6 8440 if (!i.tm.opcode_modifier.sib)
6c30d220 8441 i.rm.regmem = i.base_reg->reg_num;
29b0f896 8442 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 8443 i.rex |= REX_B;
29b0f896
AM
8444 i.sib.base = i.base_reg->reg_num;
8445 /* x86-64 ignores REX prefix bit here to avoid decoder
8446 complications. */
848930b2
JB
8447 if (!(i.base_reg->reg_flags & RegRex)
8448 && (i.base_reg->reg_num == EBP_REG_NUM
8449 || i.base_reg->reg_num == ESP_REG_NUM))
5e042380 8450 default_seg = reg_ss;
848930b2 8451 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 8452 {
848930b2 8453 fake_zero_displacement = 1;
1a02d6b0
L
8454 if (i.disp_encoding == disp_encoding_32bit)
8455 i.types[op].bitfield.disp32 = 1;
8456 else
8457 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
8458 }
8459 i.sib.scale = i.log2_scale_factor;
8460 if (i.index_reg == 0)
8461 {
260cd341
LC
8462 /* Only check for VSIB. */
8463 gas_assert (i.tm.opcode_modifier.sib != VECSIB128
8464 && i.tm.opcode_modifier.sib != VECSIB256
8465 && i.tm.opcode_modifier.sib != VECSIB512);
8466
29b0f896
AM
8467 /* <disp>(%esp) becomes two byte modrm with no index
8468 register. We've already stored the code for esp
8469 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
8470 Any base register besides %esp will not use the
8471 extra modrm byte. */
8472 i.sib.index = NO_INDEX_REGISTER;
29b0f896 8473 }
63112cd6 8474 else if (!i.tm.opcode_modifier.sib)
29b0f896 8475 {
e968fc9b 8476 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8477 i.sib.index = NO_INDEX_REGISTER;
8478 else
8479 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8480 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8481 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8482 i.rex |= REX_X;
29b0f896 8483 }
67a4f2b7
AO
8484
8485 if (i.disp_operands
8486 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
8487 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
8488 i.rm.mode = 0;
8489 else
a501d77e
L
8490 {
8491 if (!fake_zero_displacement
8492 && !i.disp_operands
8493 && i.disp_encoding)
8494 {
8495 fake_zero_displacement = 1;
8496 if (i.disp_encoding == disp_encoding_8bit)
8497 i.types[op].bitfield.disp8 = 1;
8498 else
8499 i.types[op].bitfield.disp32 = 1;
8500 }
8501 i.rm.mode = mode_from_disp_size (i.types[op]);
8502 }
29b0f896 8503 }
252b5132 8504
29b0f896
AM
8505 if (fake_zero_displacement)
8506 {
8507 /* Fakes a zero displacement assuming that i.types[op]
8508 holds the correct displacement size. */
8509 expressionS *exp;
8510
9c2799c2 8511 gas_assert (i.op[op].disps == 0);
29b0f896
AM
8512 exp = &disp_expressions[i.disp_operands++];
8513 i.op[op].disps = exp;
8514 exp->X_op = O_constant;
8515 exp->X_add_number = 0;
8516 exp->X_add_symbol = (symbolS *) 0;
8517 exp->X_op_symbol = (symbolS *) 0;
8518 }
c0f3af97
L
8519
8520 mem = op;
29b0f896 8521 }
c0f3af97
L
8522 else
8523 mem = ~0;
252b5132 8524
8c43a48b 8525 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
8526 {
8527 if (operand_type_check (i.types[0], imm))
8528 i.vex.register_specifier = NULL;
8529 else
8530 {
8531 /* VEX.vvvv encodes one of the sources when the first
8532 operand is not an immediate. */
1ef99a7b 8533 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8534 i.vex.register_specifier = i.op[0].regs;
8535 else
8536 i.vex.register_specifier = i.op[1].regs;
8537 }
8538
8539 /* Destination is a XMM register encoded in the ModRM.reg
8540 and VEX.R bit. */
8541 i.rm.reg = i.op[2].regs->reg_num;
8542 if ((i.op[2].regs->reg_flags & RegRex) != 0)
8543 i.rex |= REX_R;
8544
8545 /* ModRM.rm and VEX.B encodes the other source. */
8546 if (!i.mem_operands)
8547 {
8548 i.rm.mode = 3;
8549
1ef99a7b 8550 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8551 i.rm.regmem = i.op[1].regs->reg_num;
8552 else
8553 i.rm.regmem = i.op[0].regs->reg_num;
8554
8555 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8556 i.rex |= REX_B;
8557 }
8558 }
2426c15f 8559 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
8560 {
8561 i.vex.register_specifier = i.op[2].regs;
8562 if (!i.mem_operands)
8563 {
8564 i.rm.mode = 3;
8565 i.rm.regmem = i.op[1].regs->reg_num;
8566 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8567 i.rex |= REX_B;
8568 }
8569 }
29b0f896
AM
8570 /* Fill in i.rm.reg or i.rm.regmem field with register operand
8571 (if any) based on i.tm.extension_opcode. Again, we must be
8572 careful to make sure that segment/control/debug/test/MMX
8573 registers are coded into the i.rm.reg field. */
f88c9eb0 8574 else if (i.reg_operands)
29b0f896 8575 {
99018f42 8576 unsigned int op;
7ab9ffdd
L
8577 unsigned int vex_reg = ~0;
8578
8579 for (op = 0; op < i.operands; op++)
921eafea
L
8580 if (i.types[op].bitfield.class == Reg
8581 || i.types[op].bitfield.class == RegBND
8582 || i.types[op].bitfield.class == RegMask
8583 || i.types[op].bitfield.class == SReg
8584 || i.types[op].bitfield.class == RegCR
8585 || i.types[op].bitfield.class == RegDR
8586 || i.types[op].bitfield.class == RegTR
8587 || i.types[op].bitfield.class == RegSIMD
8588 || i.types[op].bitfield.class == RegMMX)
8589 break;
c0209578 8590
7ab9ffdd
L
8591 if (vex_3_sources)
8592 op = dest;
2426c15f 8593 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
8594 {
8595 /* For instructions with VexNDS, the register-only
8596 source operand is encoded in VEX prefix. */
8597 gas_assert (mem != (unsigned int) ~0);
c0f3af97 8598
7ab9ffdd 8599 if (op > mem)
c0f3af97 8600 {
7ab9ffdd
L
8601 vex_reg = op++;
8602 gas_assert (op < i.operands);
c0f3af97
L
8603 }
8604 else
c0f3af97 8605 {
f12dc422
L
8606 /* Check register-only source operand when two source
8607 operands are swapped. */
8608 if (!i.tm.operand_types[op].bitfield.baseindex
8609 && i.tm.operand_types[op + 1].bitfield.baseindex)
8610 {
8611 vex_reg = op;
8612 op += 2;
8613 gas_assert (mem == (vex_reg + 1)
8614 && op < i.operands);
8615 }
8616 else
8617 {
8618 vex_reg = op + 1;
8619 gas_assert (vex_reg < i.operands);
8620 }
c0f3af97 8621 }
7ab9ffdd 8622 }
2426c15f 8623 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 8624 {
f12dc422 8625 /* For instructions with VexNDD, the register destination
7ab9ffdd 8626 is encoded in VEX prefix. */
f12dc422
L
8627 if (i.mem_operands == 0)
8628 {
8629 /* There is no memory operand. */
8630 gas_assert ((op + 2) == i.operands);
8631 vex_reg = op + 1;
8632 }
8633 else
8d63c93e 8634 {
ed438a93
JB
8635 /* There are only 2 non-immediate operands. */
8636 gas_assert (op < i.imm_operands + 2
8637 && i.operands == i.imm_operands + 2);
8638 vex_reg = i.imm_operands + 1;
f12dc422 8639 }
7ab9ffdd
L
8640 }
8641 else
8642 gas_assert (op < i.operands);
99018f42 8643
7ab9ffdd
L
8644 if (vex_reg != (unsigned int) ~0)
8645 {
f12dc422 8646 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 8647
bab6aec1 8648 if ((type->bitfield.class != Reg
dc821c5f 8649 || (!type->bitfield.dword && !type->bitfield.qword))
3528c362 8650 && type->bitfield.class != RegSIMD
43234a1e 8651 && !operand_type_equal (type, &regmask))
7ab9ffdd 8652 abort ();
f88c9eb0 8653
7ab9ffdd
L
8654 i.vex.register_specifier = i.op[vex_reg].regs;
8655 }
8656
1b9f0c97
L
8657 /* Don't set OP operand twice. */
8658 if (vex_reg != op)
7ab9ffdd 8659 {
1b9f0c97
L
8660 /* If there is an extension opcode to put here, the
8661 register number must be put into the regmem field. */
8662 if (i.tm.extension_opcode != None)
8663 {
8664 i.rm.regmem = i.op[op].regs->reg_num;
a5aeccd9
JB
8665 set_rex_vrex (i.op[op].regs, REX_B,
8666 i.tm.opcode_modifier.sse2avx);
1b9f0c97
L
8667 }
8668 else
8669 {
8670 i.rm.reg = i.op[op].regs->reg_num;
a5aeccd9
JB
8671 set_rex_vrex (i.op[op].regs, REX_R,
8672 i.tm.opcode_modifier.sse2avx);
1b9f0c97 8673 }
7ab9ffdd 8674 }
252b5132 8675
29b0f896
AM
8676 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
8677 must set it to 3 to indicate this is a register operand
8678 in the regmem field. */
8679 if (!i.mem_operands)
8680 i.rm.mode = 3;
8681 }
252b5132 8682
29b0f896 8683 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 8684 if (i.tm.extension_opcode != None)
29b0f896
AM
8685 i.rm.reg = i.tm.extension_opcode;
8686 }
8687 return default_seg;
8688}
252b5132 8689
48ef937e
JB
8690static INLINE void
8691frag_opcode_byte (unsigned char byte)
8692{
8693 if (now_seg != absolute_section)
8694 FRAG_APPEND_1_CHAR (byte);
8695 else
8696 ++abs_section_offset;
8697}
8698
376cd056
JB
8699static unsigned int
8700flip_code16 (unsigned int code16)
8701{
8702 gas_assert (i.tm.operands == 1);
8703
8704 return !(i.prefix[REX_PREFIX] & REX_W)
8705 && (code16 ? i.tm.operand_types[0].bitfield.disp32
8706 || i.tm.operand_types[0].bitfield.disp32s
8707 : i.tm.operand_types[0].bitfield.disp16)
8708 ? CODE16 : 0;
8709}
8710
29b0f896 8711static void
e3bb37b5 8712output_branch (void)
29b0f896
AM
8713{
8714 char *p;
f8a5c266 8715 int size;
29b0f896
AM
8716 int code16;
8717 int prefix;
8718 relax_substateT subtype;
8719 symbolS *sym;
8720 offsetT off;
8721
48ef937e
JB
8722 if (now_seg == absolute_section)
8723 {
8724 as_bad (_("relaxable branches not supported in absolute section"));
8725 return;
8726 }
8727
f8a5c266 8728 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 8729 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
8730
8731 prefix = 0;
8732 if (i.prefix[DATA_PREFIX] != 0)
252b5132 8733 {
29b0f896
AM
8734 prefix = 1;
8735 i.prefixes -= 1;
376cd056 8736 code16 ^= flip_code16(code16);
252b5132 8737 }
29b0f896
AM
8738 /* Pentium4 branch hints. */
8739 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8740 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 8741 {
29b0f896
AM
8742 prefix++;
8743 i.prefixes--;
8744 }
8745 if (i.prefix[REX_PREFIX] != 0)
8746 {
8747 prefix++;
8748 i.prefixes--;
2f66722d
AM
8749 }
8750
7e8b059b
L
8751 /* BND prefixed jump. */
8752 if (i.prefix[BND_PREFIX] != 0)
8753 {
6cb0a70e
JB
8754 prefix++;
8755 i.prefixes--;
7e8b059b
L
8756 }
8757
f2810fe0
JB
8758 if (i.prefixes != 0)
8759 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
29b0f896
AM
8760
8761 /* It's always a symbol; End frag & setup for relax.
8762 Make sure there is enough room in this frag for the largest
8763 instruction we may generate in md_convert_frag. This is 2
8764 bytes for the opcode and room for the prefix and largest
8765 displacement. */
8766 frag_grow (prefix + 2 + 4);
8767 /* Prefix and 1 opcode byte go in fr_fix. */
8768 p = frag_more (prefix + 1);
8769 if (i.prefix[DATA_PREFIX] != 0)
8770 *p++ = DATA_PREFIX_OPCODE;
8771 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
8772 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
8773 *p++ = i.prefix[SEG_PREFIX];
6cb0a70e
JB
8774 if (i.prefix[BND_PREFIX] != 0)
8775 *p++ = BND_PREFIX_OPCODE;
29b0f896
AM
8776 if (i.prefix[REX_PREFIX] != 0)
8777 *p++ = i.prefix[REX_PREFIX];
8778 *p = i.tm.base_opcode;
8779
8780 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 8781 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 8782 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 8783 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 8784 else
f8a5c266 8785 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 8786 subtype |= code16;
3e73aa7c 8787
29b0f896
AM
8788 sym = i.op[0].disps->X_add_symbol;
8789 off = i.op[0].disps->X_add_number;
3e73aa7c 8790
29b0f896
AM
8791 if (i.op[0].disps->X_op != O_constant
8792 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 8793 {
29b0f896
AM
8794 /* Handle complex expressions. */
8795 sym = make_expr_symbol (i.op[0].disps);
8796 off = 0;
8797 }
3e73aa7c 8798
29b0f896
AM
8799 /* 1 possible extra opcode + 4 byte displacement go in var part.
8800 Pass reloc in fr_var. */
d258b828 8801 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 8802}
3e73aa7c 8803
bd7ab16b
L
8804#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8805/* Return TRUE iff PLT32 relocation should be used for branching to
8806 symbol S. */
8807
5b7c81bd 8808static bool
bd7ab16b
L
8809need_plt32_p (symbolS *s)
8810{
8811 /* PLT32 relocation is ELF only. */
8812 if (!IS_ELF)
5b7c81bd 8813 return false;
bd7ab16b 8814
a5def729
RO
8815#ifdef TE_SOLARIS
8816 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
8817 krtld support it. */
5b7c81bd 8818 return false;
a5def729
RO
8819#endif
8820
bd7ab16b
L
8821 /* Since there is no need to prepare for PLT branch on x86-64, we
8822 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
8823 be used as a marker for 32-bit PC-relative branches. */
8824 if (!object_64bit)
5b7c81bd 8825 return false;
bd7ab16b 8826
44365e88 8827 if (s == NULL)
5b7c81bd 8828 return false;
44365e88 8829
bd7ab16b
L
8830 /* Weak or undefined symbol need PLT32 relocation. */
8831 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
5b7c81bd 8832 return true;
bd7ab16b
L
8833
8834 /* Non-global symbol doesn't need PLT32 relocation. */
8835 if (! S_IS_EXTERNAL (s))
5b7c81bd 8836 return false;
bd7ab16b
L
8837
8838 /* Other global symbols need PLT32 relocation. NB: Symbol with
8839 non-default visibilities are treated as normal global symbol
8840 so that PLT32 relocation can be used as a marker for 32-bit
8841 PC-relative branches. It is useful for linker relaxation. */
5b7c81bd 8842 return true;
bd7ab16b
L
8843}
8844#endif
8845
29b0f896 8846static void
e3bb37b5 8847output_jump (void)
29b0f896
AM
8848{
8849 char *p;
8850 int size;
3e02c1cc 8851 fixS *fixP;
bd7ab16b 8852 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 8853
0cfa3eb3 8854 if (i.tm.opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
8855 {
8856 /* This is a loop or jecxz type instruction. */
8857 size = 1;
8858 if (i.prefix[ADDR_PREFIX] != 0)
8859 {
48ef937e 8860 frag_opcode_byte (ADDR_PREFIX_OPCODE);
29b0f896
AM
8861 i.prefixes -= 1;
8862 }
8863 /* Pentium4 branch hints. */
8864 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8865 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
8866 {
48ef937e 8867 frag_opcode_byte (i.prefix[SEG_PREFIX]);
29b0f896 8868 i.prefixes--;
3e73aa7c
JH
8869 }
8870 }
29b0f896
AM
8871 else
8872 {
8873 int code16;
3e73aa7c 8874
29b0f896
AM
8875 code16 = 0;
8876 if (flag_code == CODE_16BIT)
8877 code16 = CODE16;
3e73aa7c 8878
29b0f896
AM
8879 if (i.prefix[DATA_PREFIX] != 0)
8880 {
48ef937e 8881 frag_opcode_byte (DATA_PREFIX_OPCODE);
29b0f896 8882 i.prefixes -= 1;
376cd056 8883 code16 ^= flip_code16(code16);
29b0f896 8884 }
252b5132 8885
29b0f896
AM
8886 size = 4;
8887 if (code16)
8888 size = 2;
8889 }
9fcc94b6 8890
6cb0a70e
JB
8891 /* BND prefixed jump. */
8892 if (i.prefix[BND_PREFIX] != 0)
29b0f896 8893 {
48ef937e 8894 frag_opcode_byte (i.prefix[BND_PREFIX]);
29b0f896
AM
8895 i.prefixes -= 1;
8896 }
252b5132 8897
6cb0a70e 8898 if (i.prefix[REX_PREFIX] != 0)
7e8b059b 8899 {
48ef937e 8900 frag_opcode_byte (i.prefix[REX_PREFIX]);
7e8b059b
L
8901 i.prefixes -= 1;
8902 }
8903
f2810fe0
JB
8904 if (i.prefixes != 0)
8905 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
e0890092 8906
48ef937e
JB
8907 if (now_seg == absolute_section)
8908 {
9a182d04 8909 abs_section_offset += i.opcode_length + size;
48ef937e
JB
8910 return;
8911 }
8912
9a182d04
JB
8913 p = frag_more (i.opcode_length + size);
8914 switch (i.opcode_length)
42164a71
L
8915 {
8916 case 2:
8917 *p++ = i.tm.base_opcode >> 8;
1a0670f3 8918 /* Fall through. */
42164a71
L
8919 case 1:
8920 *p++ = i.tm.base_opcode;
8921 break;
8922 default:
8923 abort ();
8924 }
e0890092 8925
bd7ab16b
L
8926#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8927 if (size == 4
8928 && jump_reloc == NO_RELOC
8929 && need_plt32_p (i.op[0].disps->X_add_symbol))
8930 jump_reloc = BFD_RELOC_X86_64_PLT32;
8931#endif
8932
8933 jump_reloc = reloc (size, 1, 1, jump_reloc);
8934
3e02c1cc 8935 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 8936 i.op[0].disps, 1, jump_reloc);
3e02c1cc 8937
eb19308f
JB
8938 /* All jumps handled here are signed, but don't unconditionally use a
8939 signed limit check for 32 and 16 bit jumps as we want to allow wrap
8940 around at 4G (outside of 64-bit mode) and 64k (except for XBEGIN)
8941 respectively. */
8942 switch (size)
8943 {
8944 case 1:
8945 fixP->fx_signed = 1;
8946 break;
8947
8948 case 2:
8949 if (i.tm.base_opcode == 0xc7f8)
8950 fixP->fx_signed = 1;
8951 break;
8952
8953 case 4:
8954 if (flag_code == CODE_64BIT)
8955 fixP->fx_signed = 1;
8956 break;
8957 }
29b0f896 8958}
e0890092 8959
29b0f896 8960static void
e3bb37b5 8961output_interseg_jump (void)
29b0f896
AM
8962{
8963 char *p;
8964 int size;
8965 int prefix;
8966 int code16;
252b5132 8967
29b0f896
AM
8968 code16 = 0;
8969 if (flag_code == CODE_16BIT)
8970 code16 = CODE16;
a217f122 8971
29b0f896
AM
8972 prefix = 0;
8973 if (i.prefix[DATA_PREFIX] != 0)
8974 {
8975 prefix = 1;
8976 i.prefixes -= 1;
8977 code16 ^= CODE16;
8978 }
6cb0a70e
JB
8979
8980 gas_assert (!i.prefix[REX_PREFIX]);
252b5132 8981
29b0f896
AM
8982 size = 4;
8983 if (code16)
8984 size = 2;
252b5132 8985
f2810fe0
JB
8986 if (i.prefixes != 0)
8987 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
252b5132 8988
48ef937e
JB
8989 if (now_seg == absolute_section)
8990 {
8991 abs_section_offset += prefix + 1 + 2 + size;
8992 return;
8993 }
8994
29b0f896
AM
8995 /* 1 opcode; 2 segment; offset */
8996 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 8997
29b0f896
AM
8998 if (i.prefix[DATA_PREFIX] != 0)
8999 *p++ = DATA_PREFIX_OPCODE;
252b5132 9000
29b0f896
AM
9001 if (i.prefix[REX_PREFIX] != 0)
9002 *p++ = i.prefix[REX_PREFIX];
252b5132 9003
29b0f896
AM
9004 *p++ = i.tm.base_opcode;
9005 if (i.op[1].imms->X_op == O_constant)
9006 {
9007 offsetT n = i.op[1].imms->X_add_number;
252b5132 9008
29b0f896
AM
9009 if (size == 2
9010 && !fits_in_unsigned_word (n)
9011 && !fits_in_signed_word (n))
9012 {
9013 as_bad (_("16-bit jump out of range"));
9014 return;
9015 }
9016 md_number_to_chars (p, n, size);
9017 }
9018 else
9019 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 9020 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
6d96a594
C
9021
9022 p += size;
9023 if (i.op[0].imms->X_op == O_constant)
9024 md_number_to_chars (p, (valueT) i.op[0].imms->X_add_number, 2);
9025 else
9026 fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
9027 i.op[0].imms, 0, reloc (2, 0, 0, i.reloc[0]));
29b0f896 9028}
a217f122 9029
b4a3a7b4
L
9030#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
9031void
9032x86_cleanup (void)
9033{
9034 char *p;
9035 asection *seg = now_seg;
9036 subsegT subseg = now_subseg;
9037 asection *sec;
9038 unsigned int alignment, align_size_1;
9039 unsigned int isa_1_descsz, feature_2_descsz, descsz;
9040 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
9041 unsigned int padding;
9042
1273b2f8 9043 if (!IS_ELF || !x86_used_note)
b4a3a7b4
L
9044 return;
9045
b4a3a7b4
L
9046 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
9047
9048 /* The .note.gnu.property section layout:
9049
9050 Field Length Contents
9051 ---- ---- ----
9052 n_namsz 4 4
9053 n_descsz 4 The note descriptor size
9054 n_type 4 NT_GNU_PROPERTY_TYPE_0
9055 n_name 4 "GNU"
9056 n_desc n_descsz The program property array
9057 .... .... ....
9058 */
9059
9060 /* Create the .note.gnu.property section. */
9061 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 9062 bfd_set_section_flags (sec,
b4a3a7b4
L
9063 (SEC_ALLOC
9064 | SEC_LOAD
9065 | SEC_DATA
9066 | SEC_HAS_CONTENTS
9067 | SEC_READONLY));
9068
9069 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
9070 {
9071 align_size_1 = 7;
9072 alignment = 3;
9073 }
9074 else
9075 {
9076 align_size_1 = 3;
9077 alignment = 2;
9078 }
9079
fd361982 9080 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
9081 elf_section_type (sec) = SHT_NOTE;
9082
1273b2f8
L
9083 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
9084 + 4-byte data */
9085 isa_1_descsz_raw = 4 + 4 + 4;
9086 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
9087 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
b4a3a7b4
L
9088
9089 feature_2_descsz_raw = isa_1_descsz;
9090 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
1273b2f8 9091 + 4-byte data */
b4a3a7b4
L
9092 feature_2_descsz_raw += 4 + 4 + 4;
9093 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
9094 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
9095 & ~align_size_1);
9096
9097 descsz = feature_2_descsz;
9098 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
9099 p = frag_more (4 + 4 + 4 + 4 + descsz);
9100
9101 /* Write n_namsz. */
9102 md_number_to_chars (p, (valueT) 4, 4);
9103
9104 /* Write n_descsz. */
9105 md_number_to_chars (p + 4, (valueT) descsz, 4);
9106
9107 /* Write n_type. */
9108 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
9109
9110 /* Write n_name. */
9111 memcpy (p + 4 * 3, "GNU", 4);
9112
1273b2f8
L
9113 /* Write 4-byte type. */
9114 md_number_to_chars (p + 4 * 4,
9115 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
b4a3a7b4 9116
1273b2f8
L
9117 /* Write 4-byte data size. */
9118 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
b4a3a7b4 9119
1273b2f8
L
9120 /* Write 4-byte data. */
9121 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
b4a3a7b4 9122
1273b2f8
L
9123 /* Zero out paddings. */
9124 padding = isa_1_descsz - isa_1_descsz_raw;
9125 if (padding)
9126 memset (p + 4 * 7, 0, padding);
b4a3a7b4
L
9127
9128 /* Write 4-byte type. */
9129 md_number_to_chars (p + isa_1_descsz + 4 * 4,
9130 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
9131
9132 /* Write 4-byte data size. */
9133 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
9134
9135 /* Write 4-byte data. */
9136 md_number_to_chars (p + isa_1_descsz + 4 * 6,
9137 (valueT) x86_feature_2_used, 4);
9138
9139 /* Zero out paddings. */
9140 padding = feature_2_descsz - feature_2_descsz_raw;
9141 if (padding)
9142 memset (p + isa_1_descsz + 4 * 7, 0, padding);
9143
9144 /* We probably can't restore the current segment, for there likely
9145 isn't one yet... */
9146 if (seg && subseg)
9147 subseg_set (seg, subseg);
9148}
9149#endif
9150
9c33702b
JB
9151static unsigned int
9152encoding_length (const fragS *start_frag, offsetT start_off,
9153 const char *frag_now_ptr)
9154{
9155 unsigned int len = 0;
9156
9157 if (start_frag != frag_now)
9158 {
9159 const fragS *fr = start_frag;
9160
9161 do {
9162 len += fr->fr_fix;
9163 fr = fr->fr_next;
9164 } while (fr && fr != frag_now);
9165 }
9166
9167 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
9168}
9169
e379e5f3 9170/* Return 1 for test, and, cmp, add, sub, inc and dec which may
79d72f45
HL
9171 be macro-fused with conditional jumps.
9172 NB: If TEST/AND/CMP/ADD/SUB/INC/DEC is of RIP relative address,
9173 or is one of the following format:
9174
9175 cmp m, imm
9176 add m, imm
9177 sub m, imm
9178 test m, imm
9179 and m, imm
9180 inc m
9181 dec m
9182
9183 it is unfusible. */
e379e5f3
L
9184
9185static int
79d72f45 9186maybe_fused_with_jcc_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
9187{
9188 /* No RIP address. */
9189 if (i.base_reg && i.base_reg->reg_num == RegIP)
9190 return 0;
9191
389d00a5
JB
9192 /* No opcodes outside of base encoding space. */
9193 if (i.tm.opcode_modifier.opcodespace != SPACE_BASE)
e379e5f3
L
9194 return 0;
9195
79d72f45
HL
9196 /* add, sub without add/sub m, imm. */
9197 if (i.tm.base_opcode <= 5
e379e5f3
L
9198 || (i.tm.base_opcode >= 0x28 && i.tm.base_opcode <= 0x2d)
9199 || ((i.tm.base_opcode | 3) == 0x83
79d72f45 9200 && (i.tm.extension_opcode == 0x5
e379e5f3 9201 || i.tm.extension_opcode == 0x0)))
79d72f45
HL
9202 {
9203 *mf_cmp_p = mf_cmp_alu_cmp;
9204 return !(i.mem_operands && i.imm_operands);
9205 }
e379e5f3 9206
79d72f45
HL
9207 /* and without and m, imm. */
9208 if ((i.tm.base_opcode >= 0x20 && i.tm.base_opcode <= 0x25)
9209 || ((i.tm.base_opcode | 3) == 0x83
9210 && i.tm.extension_opcode == 0x4))
9211 {
9212 *mf_cmp_p = mf_cmp_test_and;
9213 return !(i.mem_operands && i.imm_operands);
9214 }
9215
9216 /* test without test m imm. */
e379e5f3
L
9217 if ((i.tm.base_opcode | 1) == 0x85
9218 || (i.tm.base_opcode | 1) == 0xa9
9219 || ((i.tm.base_opcode | 1) == 0xf7
79d72f45
HL
9220 && i.tm.extension_opcode == 0))
9221 {
9222 *mf_cmp_p = mf_cmp_test_and;
9223 return !(i.mem_operands && i.imm_operands);
9224 }
9225
9226 /* cmp without cmp m, imm. */
9227 if ((i.tm.base_opcode >= 0x38 && i.tm.base_opcode <= 0x3d)
e379e5f3
L
9228 || ((i.tm.base_opcode | 3) == 0x83
9229 && (i.tm.extension_opcode == 0x7)))
79d72f45
HL
9230 {
9231 *mf_cmp_p = mf_cmp_alu_cmp;
9232 return !(i.mem_operands && i.imm_operands);
9233 }
e379e5f3 9234
79d72f45 9235 /* inc, dec without inc/dec m. */
e379e5f3
L
9236 if ((i.tm.cpu_flags.bitfield.cpuno64
9237 && (i.tm.base_opcode | 0xf) == 0x4f)
9238 || ((i.tm.base_opcode | 1) == 0xff
9239 && i.tm.extension_opcode <= 0x1))
79d72f45
HL
9240 {
9241 *mf_cmp_p = mf_cmp_incdec;
9242 return !i.mem_operands;
9243 }
e379e5f3
L
9244
9245 return 0;
9246}
9247
9248/* Return 1 if a FUSED_JCC_PADDING frag should be generated. */
9249
9250static int
79d72f45 9251add_fused_jcc_padding_frag_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
9252{
9253 /* NB: Don't work with COND_JUMP86 without i386. */
9254 if (!align_branch_power
9255 || now_seg == absolute_section
9256 || !cpu_arch_flags.bitfield.cpui386
9257 || !(align_branch & align_branch_fused_bit))
9258 return 0;
9259
79d72f45 9260 if (maybe_fused_with_jcc_p (mf_cmp_p))
e379e5f3
L
9261 {
9262 if (last_insn.kind == last_insn_other
9263 || last_insn.seg != now_seg)
9264 return 1;
9265 if (flag_debug)
9266 as_warn_where (last_insn.file, last_insn.line,
9267 _("`%s` skips -malign-branch-boundary on `%s`"),
9268 last_insn.name, i.tm.name);
9269 }
9270
9271 return 0;
9272}
9273
9274/* Return 1 if a BRANCH_PREFIX frag should be generated. */
9275
9276static int
9277add_branch_prefix_frag_p (void)
9278{
9279 /* NB: Don't work with COND_JUMP86 without i386. Don't add prefix
9280 to PadLock instructions since they include prefixes in opcode. */
9281 if (!align_branch_power
9282 || !align_branch_prefix_size
9283 || now_seg == absolute_section
9284 || i.tm.cpu_flags.bitfield.cpupadlock
9285 || !cpu_arch_flags.bitfield.cpui386)
9286 return 0;
9287
9288 /* Don't add prefix if it is a prefix or there is no operand in case
9289 that segment prefix is special. */
9290 if (!i.operands || i.tm.opcode_modifier.isprefix)
9291 return 0;
9292
9293 if (last_insn.kind == last_insn_other
9294 || last_insn.seg != now_seg)
9295 return 1;
9296
9297 if (flag_debug)
9298 as_warn_where (last_insn.file, last_insn.line,
9299 _("`%s` skips -malign-branch-boundary on `%s`"),
9300 last_insn.name, i.tm.name);
9301
9302 return 0;
9303}
9304
9305/* Return 1 if a BRANCH_PADDING frag should be generated. */
9306
9307static int
79d72f45
HL
9308add_branch_padding_frag_p (enum align_branch_kind *branch_p,
9309 enum mf_jcc_kind *mf_jcc_p)
e379e5f3
L
9310{
9311 int add_padding;
9312
9313 /* NB: Don't work with COND_JUMP86 without i386. */
9314 if (!align_branch_power
9315 || now_seg == absolute_section
389d00a5
JB
9316 || !cpu_arch_flags.bitfield.cpui386
9317 || i.tm.opcode_modifier.opcodespace != SPACE_BASE)
e379e5f3
L
9318 return 0;
9319
9320 add_padding = 0;
9321
9322 /* Check for jcc and direct jmp. */
9323 if (i.tm.opcode_modifier.jump == JUMP)
9324 {
9325 if (i.tm.base_opcode == JUMP_PC_RELATIVE)
9326 {
9327 *branch_p = align_branch_jmp;
9328 add_padding = align_branch & align_branch_jmp_bit;
9329 }
9330 else
9331 {
79d72f45
HL
9332 /* Because J<cc> and JN<cc> share same group in macro-fusible table,
9333 igore the lowest bit. */
9334 *mf_jcc_p = (i.tm.base_opcode & 0x0e) >> 1;
e379e5f3
L
9335 *branch_p = align_branch_jcc;
9336 if ((align_branch & align_branch_jcc_bit))
9337 add_padding = 1;
9338 }
9339 }
e379e5f3
L
9340 else if ((i.tm.base_opcode | 1) == 0xc3)
9341 {
9342 /* Near ret. */
9343 *branch_p = align_branch_ret;
9344 if ((align_branch & align_branch_ret_bit))
9345 add_padding = 1;
9346 }
9347 else
9348 {
9349 /* Check for indirect jmp, direct and indirect calls. */
9350 if (i.tm.base_opcode == 0xe8)
9351 {
9352 /* Direct call. */
9353 *branch_p = align_branch_call;
9354 if ((align_branch & align_branch_call_bit))
9355 add_padding = 1;
9356 }
9357 else if (i.tm.base_opcode == 0xff
9358 && (i.tm.extension_opcode == 2
9359 || i.tm.extension_opcode == 4))
9360 {
9361 /* Indirect call and jmp. */
9362 *branch_p = align_branch_indirect;
9363 if ((align_branch & align_branch_indirect_bit))
9364 add_padding = 1;
9365 }
9366
9367 if (add_padding
9368 && i.disp_operands
9369 && tls_get_addr
9370 && (i.op[0].disps->X_op == O_symbol
9371 || (i.op[0].disps->X_op == O_subtract
9372 && i.op[0].disps->X_op_symbol == GOT_symbol)))
9373 {
9374 symbolS *s = i.op[0].disps->X_add_symbol;
9375 /* No padding to call to global or undefined tls_get_addr. */
9376 if ((S_IS_EXTERNAL (s) || !S_IS_DEFINED (s))
9377 && strcmp (S_GET_NAME (s), tls_get_addr) == 0)
9378 return 0;
9379 }
9380 }
9381
9382 if (add_padding
9383 && last_insn.kind != last_insn_other
9384 && last_insn.seg == now_seg)
9385 {
9386 if (flag_debug)
9387 as_warn_where (last_insn.file, last_insn.line,
9388 _("`%s` skips -malign-branch-boundary on `%s`"),
9389 last_insn.name, i.tm.name);
9390 return 0;
9391 }
9392
9393 return add_padding;
9394}
9395
29b0f896 9396static void
e3bb37b5 9397output_insn (void)
29b0f896 9398{
2bbd9c25
JJ
9399 fragS *insn_start_frag;
9400 offsetT insn_start_off;
e379e5f3
L
9401 fragS *fragP = NULL;
9402 enum align_branch_kind branch = align_branch_none;
79d72f45
HL
9403 /* The initializer is arbitrary just to avoid uninitialized error.
9404 it's actually either assigned in add_branch_padding_frag_p
9405 or never be used. */
9406 enum mf_jcc_kind mf_jcc = mf_jcc_jo;
2bbd9c25 9407
b4a3a7b4 9408#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
48ef937e 9409 if (IS_ELF && x86_used_note && now_seg != absolute_section)
b4a3a7b4 9410 {
32930e4e
L
9411 if ((i.xstate & xstate_tmm) == xstate_tmm
9412 || i.tm.cpu_flags.bitfield.cpuamx_tile)
9413 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_TMM;
9414
b4a3a7b4
L
9415 if (i.tm.cpu_flags.bitfield.cpu8087
9416 || i.tm.cpu_flags.bitfield.cpu287
9417 || i.tm.cpu_flags.bitfield.cpu387
9418 || i.tm.cpu_flags.bitfield.cpu687
9419 || i.tm.cpu_flags.bitfield.cpufisttp)
9420 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
014d61ea 9421
921eafea 9422 if ((i.xstate & xstate_mmx)
389d00a5
JB
9423 || (i.tm.opcode_modifier.opcodespace == SPACE_0F
9424 && !is_any_vex_encoding (&i.tm)
9425 && (i.tm.base_opcode == 0x77 /* emms */
9426 || i.tm.base_opcode == 0x0e /* femms */)))
b4a3a7b4 9427 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
014d61ea 9428
32930e4e
L
9429 if (i.index_reg)
9430 {
9431 if (i.index_reg->reg_type.bitfield.zmmword)
9432 i.xstate |= xstate_zmm;
9433 else if (i.index_reg->reg_type.bitfield.ymmword)
9434 i.xstate |= xstate_ymm;
9435 else if (i.index_reg->reg_type.bitfield.xmmword)
9436 i.xstate |= xstate_xmm;
9437 }
014d61ea
JB
9438
9439 /* vzeroall / vzeroupper */
9440 if (i.tm.base_opcode == 0x77 && i.tm.cpu_flags.bitfield.cpuavx)
9441 i.xstate |= xstate_ymm;
9442
c4694f17 9443 if ((i.xstate & xstate_xmm)
389d00a5
JB
9444 /* ldmxcsr / stmxcsr / vldmxcsr / vstmxcsr */
9445 || (i.tm.base_opcode == 0xae
9446 && (i.tm.cpu_flags.bitfield.cpusse
9447 || i.tm.cpu_flags.bitfield.cpuavx))
c4694f17
TG
9448 || i.tm.cpu_flags.bitfield.cpuwidekl
9449 || i.tm.cpu_flags.bitfield.cpukl)
b4a3a7b4 9450 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
014d61ea 9451
921eafea 9452 if ((i.xstate & xstate_ymm) == xstate_ymm)
b4a3a7b4 9453 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
921eafea 9454 if ((i.xstate & xstate_zmm) == xstate_zmm)
b4a3a7b4 9455 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
6225c532 9456 if (i.mask.reg || (i.xstate & xstate_mask) == xstate_mask)
32930e4e 9457 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MASK;
b4a3a7b4
L
9458 if (i.tm.cpu_flags.bitfield.cpufxsr)
9459 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
9460 if (i.tm.cpu_flags.bitfield.cpuxsave)
9461 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
9462 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
9463 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
9464 if (i.tm.cpu_flags.bitfield.cpuxsavec)
9465 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
b0ab0693
L
9466
9467 if (x86_feature_2_used
9468 || i.tm.cpu_flags.bitfield.cpucmov
9469 || i.tm.cpu_flags.bitfield.cpusyscall
389d00a5
JB
9470 || (i.tm.opcode_modifier.opcodespace == SPACE_0F
9471 && i.tm.base_opcode == 0xc7
70e95837 9472 && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE
b0ab0693
L
9473 && i.tm.extension_opcode == 1) /* cmpxchg8b */)
9474 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_BASELINE;
9475 if (i.tm.cpu_flags.bitfield.cpusse3
9476 || i.tm.cpu_flags.bitfield.cpussse3
9477 || i.tm.cpu_flags.bitfield.cpusse4_1
9478 || i.tm.cpu_flags.bitfield.cpusse4_2
9479 || i.tm.cpu_flags.bitfield.cpucx16
9480 || i.tm.cpu_flags.bitfield.cpupopcnt
9481 /* LAHF-SAHF insns in 64-bit mode. */
9482 || (flag_code == CODE_64BIT
35648716
JB
9483 && (i.tm.base_opcode | 1) == 0x9f
9484 && i.tm.opcode_modifier.opcodespace == SPACE_BASE))
b0ab0693
L
9485 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V2;
9486 if (i.tm.cpu_flags.bitfield.cpuavx
9487 || i.tm.cpu_flags.bitfield.cpuavx2
9488 /* Any VEX encoded insns execpt for CpuAVX512F, CpuAVX512BW,
9489 CpuAVX512DQ, LPW, TBM and AMX. */
9490 || (i.tm.opcode_modifier.vex
9491 && !i.tm.cpu_flags.bitfield.cpuavx512f
9492 && !i.tm.cpu_flags.bitfield.cpuavx512bw
9493 && !i.tm.cpu_flags.bitfield.cpuavx512dq
9494 && !i.tm.cpu_flags.bitfield.cpulwp
9495 && !i.tm.cpu_flags.bitfield.cputbm
9496 && !(x86_feature_2_used & GNU_PROPERTY_X86_FEATURE_2_TMM))
9497 || i.tm.cpu_flags.bitfield.cpuf16c
9498 || i.tm.cpu_flags.bitfield.cpufma
9499 || i.tm.cpu_flags.bitfield.cpulzcnt
9500 || i.tm.cpu_flags.bitfield.cpumovbe
9501 || i.tm.cpu_flags.bitfield.cpuxsaves
9502 || (x86_feature_2_used
9503 & (GNU_PROPERTY_X86_FEATURE_2_XSAVE
9504 | GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT
9505 | GNU_PROPERTY_X86_FEATURE_2_XSAVEC)) != 0)
9506 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V3;
9507 if (i.tm.cpu_flags.bitfield.cpuavx512f
9508 || i.tm.cpu_flags.bitfield.cpuavx512bw
9509 || i.tm.cpu_flags.bitfield.cpuavx512dq
9510 || i.tm.cpu_flags.bitfield.cpuavx512vl
9511 /* Any EVEX encoded insns except for AVX512ER, AVX512PF and
9512 VNNIW. */
9513 || (i.tm.opcode_modifier.evex
9514 && !i.tm.cpu_flags.bitfield.cpuavx512er
9515 && !i.tm.cpu_flags.bitfield.cpuavx512pf
9516 && !i.tm.cpu_flags.bitfield.cpuavx512_4vnniw))
9517 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V4;
b4a3a7b4
L
9518 }
9519#endif
9520
29b0f896
AM
9521 /* Tie dwarf2 debug info to the address at the start of the insn.
9522 We can't do this after the insn has been output as the current
9523 frag may have been closed off. eg. by frag_var. */
9524 dwarf2_emit_insn (0);
9525
2bbd9c25
JJ
9526 insn_start_frag = frag_now;
9527 insn_start_off = frag_now_fix ();
9528
79d72f45 9529 if (add_branch_padding_frag_p (&branch, &mf_jcc))
e379e5f3
L
9530 {
9531 char *p;
9532 /* Branch can be 8 bytes. Leave some room for prefixes. */
9533 unsigned int max_branch_padding_size = 14;
9534
9535 /* Align section to boundary. */
9536 record_alignment (now_seg, align_branch_power);
9537
9538 /* Make room for padding. */
9539 frag_grow (max_branch_padding_size);
9540
9541 /* Start of the padding. */
9542 p = frag_more (0);
9543
9544 fragP = frag_now;
9545
9546 frag_var (rs_machine_dependent, max_branch_padding_size, 0,
9547 ENCODE_RELAX_STATE (BRANCH_PADDING, 0),
9548 NULL, 0, p);
9549
79d72f45 9550 fragP->tc_frag_data.mf_type = mf_jcc;
e379e5f3
L
9551 fragP->tc_frag_data.branch_type = branch;
9552 fragP->tc_frag_data.max_bytes = max_branch_padding_size;
9553 }
9554
29b0f896 9555 /* Output jumps. */
0cfa3eb3 9556 if (i.tm.opcode_modifier.jump == JUMP)
29b0f896 9557 output_branch ();
0cfa3eb3
JB
9558 else if (i.tm.opcode_modifier.jump == JUMP_BYTE
9559 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896 9560 output_jump ();
0cfa3eb3 9561 else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT)
29b0f896
AM
9562 output_interseg_jump ();
9563 else
9564 {
9565 /* Output normal instructions here. */
9566 char *p;
9567 unsigned char *q;
47465058 9568 unsigned int j;
79d72f45 9569 enum mf_cmp_kind mf_cmp;
4dffcebc 9570
e4e00185 9571 if (avoid_fence
389d00a5
JB
9572 && (i.tm.base_opcode == 0xaee8
9573 || i.tm.base_opcode == 0xaef0
9574 || i.tm.base_opcode == 0xaef8))
48ef937e
JB
9575 {
9576 /* Encode lfence, mfence, and sfence as
9577 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
9578 if (now_seg != absolute_section)
9579 {
9580 offsetT val = 0x240483f0ULL;
9581
9582 p = frag_more (5);
9583 md_number_to_chars (p, val, 5);
9584 }
9585 else
9586 abs_section_offset += 5;
9587 return;
9588 }
e4e00185 9589
d022bddd
IT
9590 /* Some processors fail on LOCK prefix. This options makes
9591 assembler ignore LOCK prefix and serves as a workaround. */
9592 if (omit_lock_prefix)
9593 {
35648716
JB
9594 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE
9595 && i.tm.opcode_modifier.isprefix)
d022bddd
IT
9596 return;
9597 i.prefix[LOCK_PREFIX] = 0;
9598 }
9599
e379e5f3
L
9600 if (branch)
9601 /* Skip if this is a branch. */
9602 ;
79d72f45 9603 else if (add_fused_jcc_padding_frag_p (&mf_cmp))
e379e5f3
L
9604 {
9605 /* Make room for padding. */
9606 frag_grow (MAX_FUSED_JCC_PADDING_SIZE);
9607 p = frag_more (0);
9608
9609 fragP = frag_now;
9610
9611 frag_var (rs_machine_dependent, MAX_FUSED_JCC_PADDING_SIZE, 0,
9612 ENCODE_RELAX_STATE (FUSED_JCC_PADDING, 0),
9613 NULL, 0, p);
9614
79d72f45 9615 fragP->tc_frag_data.mf_type = mf_cmp;
e379e5f3
L
9616 fragP->tc_frag_data.branch_type = align_branch_fused;
9617 fragP->tc_frag_data.max_bytes = MAX_FUSED_JCC_PADDING_SIZE;
9618 }
9619 else if (add_branch_prefix_frag_p ())
9620 {
9621 unsigned int max_prefix_size = align_branch_prefix_size;
9622
9623 /* Make room for padding. */
9624 frag_grow (max_prefix_size);
9625 p = frag_more (0);
9626
9627 fragP = frag_now;
9628
9629 frag_var (rs_machine_dependent, max_prefix_size, 0,
9630 ENCODE_RELAX_STATE (BRANCH_PREFIX, 0),
9631 NULL, 0, p);
9632
9633 fragP->tc_frag_data.max_bytes = max_prefix_size;
9634 }
9635
43234a1e
L
9636 /* Since the VEX/EVEX prefix contains the implicit prefix, we
9637 don't need the explicit prefix. */
9638 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 9639 {
7b47a312 9640 switch (i.tm.opcode_modifier.opcodeprefix)
bc4bd9ab 9641 {
7b47a312
L
9642 case PREFIX_0X66:
9643 add_prefix (0x66);
9644 break;
9645 case PREFIX_0XF2:
9646 add_prefix (0xf2);
9647 break;
9648 case PREFIX_0XF3:
8b65b895
L
9649 if (!i.tm.cpu_flags.bitfield.cpupadlock
9650 || (i.prefix[REP_PREFIX] != 0xf3))
9651 add_prefix (0xf3);
c0f3af97 9652 break;
7b47a312 9653 case PREFIX_NONE:
9a182d04 9654 switch (i.opcode_length)
c0f3af97 9655 {
7b47a312 9656 case 2:
7b47a312 9657 break;
9a182d04 9658 case 1:
7b47a312 9659 /* Check for pseudo prefixes. */
9a182d04
JB
9660 if (!i.tm.opcode_modifier.isprefix || i.tm.base_opcode)
9661 break;
7b47a312
L
9662 as_bad_where (insn_start_frag->fr_file,
9663 insn_start_frag->fr_line,
9664 _("pseudo prefix without instruction"));
9665 return;
9666 default:
9667 abort ();
4dffcebc 9668 }
c0f3af97 9669 break;
c0f3af97
L
9670 default:
9671 abort ();
bc4bd9ab 9672 }
c0f3af97 9673
6d19a37a 9674#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
9675 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
9676 R_X86_64_GOTTPOFF relocation so that linker can safely
14470f07
L
9677 perform IE->LE optimization. A dummy REX_OPCODE prefix
9678 is also needed for lea with R_X86_64_GOTPC32_TLSDESC
9679 relocation for GDesc -> IE/LE optimization. */
cf61b747
L
9680 if (x86_elf_abi == X86_64_X32_ABI
9681 && i.operands == 2
14470f07
L
9682 && (i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
9683 || i.reloc[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
cf61b747
L
9684 && i.prefix[REX_PREFIX] == 0)
9685 add_prefix (REX_OPCODE);
6d19a37a 9686#endif
cf61b747 9687
c0f3af97
L
9688 /* The prefix bytes. */
9689 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
9690 if (*q)
48ef937e 9691 frag_opcode_byte (*q);
0f10071e 9692 }
ae5c1c7b 9693 else
c0f3af97
L
9694 {
9695 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
9696 if (*q)
9697 switch (j)
9698 {
c0f3af97
L
9699 case SEG_PREFIX:
9700 case ADDR_PREFIX:
48ef937e 9701 frag_opcode_byte (*q);
c0f3af97
L
9702 break;
9703 default:
9704 /* There should be no other prefixes for instructions
9705 with VEX prefix. */
9706 abort ();
9707 }
9708
43234a1e
L
9709 /* For EVEX instructions i.vrex should become 0 after
9710 build_evex_prefix. For VEX instructions upper 16 registers
9711 aren't available, so VREX should be 0. */
9712 if (i.vrex)
9713 abort ();
c0f3af97 9714 /* Now the VEX prefix. */
48ef937e
JB
9715 if (now_seg != absolute_section)
9716 {
9717 p = frag_more (i.vex.length);
9718 for (j = 0; j < i.vex.length; j++)
9719 p[j] = i.vex.bytes[j];
9720 }
9721 else
9722 abs_section_offset += i.vex.length;
c0f3af97 9723 }
252b5132 9724
29b0f896 9725 /* Now the opcode; be careful about word order here! */
389d00a5
JB
9726 j = i.opcode_length;
9727 if (!i.vex.length)
9728 switch (i.tm.opcode_modifier.opcodespace)
9729 {
9730 case SPACE_BASE:
9731 break;
9732 case SPACE_0F:
9733 ++j;
9734 break;
9735 case SPACE_0F38:
9736 case SPACE_0F3A:
9737 j += 2;
9738 break;
9739 default:
9740 abort ();
9741 }
9742
48ef937e 9743 if (now_seg == absolute_section)
389d00a5
JB
9744 abs_section_offset += j;
9745 else if (j == 1)
29b0f896
AM
9746 {
9747 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
9748 }
9749 else
9750 {
389d00a5
JB
9751 p = frag_more (j);
9752 if (!i.vex.length
9753 && i.tm.opcode_modifier.opcodespace != SPACE_BASE)
9754 {
9755 *p++ = 0x0f;
9756 if (i.tm.opcode_modifier.opcodespace != SPACE_0F)
9757 *p++ = i.tm.opcode_modifier.opcodespace == SPACE_0F38
9758 ? 0x38 : 0x3a;
9759 }
9760
9a182d04 9761 switch (i.opcode_length)
331d2d0d 9762 {
4dffcebc 9763 case 2:
389d00a5
JB
9764 /* Put out high byte first: can't use md_number_to_chars! */
9765 *p++ = (i.tm.base_opcode >> 8) & 0xff;
9766 /* Fall through. */
9767 case 1:
9768 *p = i.tm.base_opcode & 0xff;
4dffcebc
L
9769 break;
9770 default:
9771 abort ();
9772 break;
331d2d0d 9773 }
0f10071e 9774
29b0f896 9775 }
3e73aa7c 9776
29b0f896 9777 /* Now the modrm byte and sib byte (if present). */
40fb9820 9778 if (i.tm.opcode_modifier.modrm)
29b0f896 9779 {
48ef937e
JB
9780 frag_opcode_byte ((i.rm.regmem << 0)
9781 | (i.rm.reg << 3)
9782 | (i.rm.mode << 6));
29b0f896
AM
9783 /* If i.rm.regmem == ESP (4)
9784 && i.rm.mode != (Register mode)
9785 && not 16 bit
9786 ==> need second modrm byte. */
9787 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
9788 && i.rm.mode != 3
dc821c5f 9789 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
48ef937e
JB
9790 frag_opcode_byte ((i.sib.base << 0)
9791 | (i.sib.index << 3)
9792 | (i.sib.scale << 6));
29b0f896 9793 }
3e73aa7c 9794
29b0f896 9795 if (i.disp_operands)
2bbd9c25 9796 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 9797
29b0f896 9798 if (i.imm_operands)
2bbd9c25 9799 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
9800
9801 /*
9802 * frag_now_fix () returning plain abs_section_offset when we're in the
9803 * absolute section, and abs_section_offset not getting updated as data
9804 * gets added to the frag breaks the logic below.
9805 */
9806 if (now_seg != absolute_section)
9807 {
9808 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
9809 if (j > 15)
9810 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
9811 j);
e379e5f3
L
9812 else if (fragP)
9813 {
9814 /* NB: Don't add prefix with GOTPC relocation since
9815 output_disp() above depends on the fixed encoding
9816 length. Can't add prefix with TLS relocation since
9817 it breaks TLS linker optimization. */
9818 unsigned int max = i.has_gotpc_tls_reloc ? 0 : 15 - j;
9819 /* Prefix count on the current instruction. */
9820 unsigned int count = i.vex.length;
9821 unsigned int k;
9822 for (k = 0; k < ARRAY_SIZE (i.prefix); k++)
9823 /* REX byte is encoded in VEX/EVEX prefix. */
9824 if (i.prefix[k] && (k != REX_PREFIX || !i.vex.length))
9825 count++;
9826
9827 /* Count prefixes for extended opcode maps. */
9828 if (!i.vex.length)
389d00a5 9829 switch (i.tm.opcode_modifier.opcodespace)
e379e5f3 9830 {
389d00a5 9831 case SPACE_BASE:
e379e5f3 9832 break;
389d00a5
JB
9833 case SPACE_0F:
9834 count++;
e379e5f3 9835 break;
389d00a5
JB
9836 case SPACE_0F38:
9837 case SPACE_0F3A:
9838 count += 2;
e379e5f3
L
9839 break;
9840 default:
9841 abort ();
9842 }
9843
9844 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
9845 == BRANCH_PREFIX)
9846 {
9847 /* Set the maximum prefix size in BRANCH_PREFIX
9848 frag. */
9849 if (fragP->tc_frag_data.max_bytes > max)
9850 fragP->tc_frag_data.max_bytes = max;
9851 if (fragP->tc_frag_data.max_bytes > count)
9852 fragP->tc_frag_data.max_bytes -= count;
9853 else
9854 fragP->tc_frag_data.max_bytes = 0;
9855 }
9856 else
9857 {
9858 /* Remember the maximum prefix size in FUSED_JCC_PADDING
9859 frag. */
9860 unsigned int max_prefix_size;
9861 if (align_branch_prefix_size > max)
9862 max_prefix_size = max;
9863 else
9864 max_prefix_size = align_branch_prefix_size;
9865 if (max_prefix_size > count)
9866 fragP->tc_frag_data.max_prefix_length
9867 = max_prefix_size - count;
9868 }
9869
9870 /* Use existing segment prefix if possible. Use CS
9871 segment prefix in 64-bit mode. In 32-bit mode, use SS
9872 segment prefix with ESP/EBP base register and use DS
9873 segment prefix without ESP/EBP base register. */
9874 if (i.prefix[SEG_PREFIX])
9875 fragP->tc_frag_data.default_prefix = i.prefix[SEG_PREFIX];
9876 else if (flag_code == CODE_64BIT)
9877 fragP->tc_frag_data.default_prefix = CS_PREFIX_OPCODE;
9878 else if (i.base_reg
9879 && (i.base_reg->reg_num == 4
9880 || i.base_reg->reg_num == 5))
9881 fragP->tc_frag_data.default_prefix = SS_PREFIX_OPCODE;
9882 else
9883 fragP->tc_frag_data.default_prefix = DS_PREFIX_OPCODE;
9884 }
9c33702b 9885 }
29b0f896 9886 }
252b5132 9887
e379e5f3
L
9888 /* NB: Don't work with COND_JUMP86 without i386. */
9889 if (align_branch_power
9890 && now_seg != absolute_section
9891 && cpu_arch_flags.bitfield.cpui386)
9892 {
9893 /* Terminate each frag so that we can add prefix and check for
9894 fused jcc. */
9895 frag_wane (frag_now);
9896 frag_new (0);
9897 }
9898
29b0f896
AM
9899#ifdef DEBUG386
9900 if (flag_debug)
9901 {
7b81dfbb 9902 pi ("" /*line*/, &i);
29b0f896
AM
9903 }
9904#endif /* DEBUG386 */
9905}
252b5132 9906
e205caa7
L
9907/* Return the size of the displacement operand N. */
9908
9909static int
9910disp_size (unsigned int n)
9911{
9912 int size = 4;
43234a1e 9913
b5014f7a 9914 if (i.types[n].bitfield.disp64)
40fb9820
L
9915 size = 8;
9916 else if (i.types[n].bitfield.disp8)
9917 size = 1;
9918 else if (i.types[n].bitfield.disp16)
9919 size = 2;
e205caa7
L
9920 return size;
9921}
9922
9923/* Return the size of the immediate operand N. */
9924
9925static int
9926imm_size (unsigned int n)
9927{
9928 int size = 4;
40fb9820
L
9929 if (i.types[n].bitfield.imm64)
9930 size = 8;
9931 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
9932 size = 1;
9933 else if (i.types[n].bitfield.imm16)
9934 size = 2;
e205caa7
L
9935 return size;
9936}
9937
29b0f896 9938static void
64e74474 9939output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9940{
9941 char *p;
9942 unsigned int n;
252b5132 9943
29b0f896
AM
9944 for (n = 0; n < i.operands; n++)
9945 {
b5014f7a 9946 if (operand_type_check (i.types[n], disp))
29b0f896 9947 {
48ef937e
JB
9948 int size = disp_size (n);
9949
9950 if (now_seg == absolute_section)
9951 abs_section_offset += size;
9952 else if (i.op[n].disps->X_op == O_constant)
29b0f896 9953 {
43234a1e 9954 offsetT val = i.op[n].disps->X_add_number;
252b5132 9955
629cfaf1
JB
9956 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
9957 size);
29b0f896
AM
9958 p = frag_more (size);
9959 md_number_to_chars (p, val, size);
9960 }
9961 else
9962 {
f86103b7 9963 enum bfd_reloc_code_real reloc_type;
40fb9820 9964 int sign = i.types[n].bitfield.disp32s;
29b0f896 9965 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 9966 fixS *fixP;
29b0f896 9967
e205caa7 9968 /* We can't have 8 bit displacement here. */
9c2799c2 9969 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 9970
29b0f896
AM
9971 /* The PC relative address is computed relative
9972 to the instruction boundary, so in case immediate
9973 fields follows, we need to adjust the value. */
9974 if (pcrel && i.imm_operands)
9975 {
29b0f896 9976 unsigned int n1;
e205caa7 9977 int sz = 0;
252b5132 9978
29b0f896 9979 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 9980 if (operand_type_check (i.types[n1], imm))
252b5132 9981 {
e205caa7
L
9982 /* Only one immediate is allowed for PC
9983 relative address. */
9c2799c2 9984 gas_assert (sz == 0);
e205caa7
L
9985 sz = imm_size (n1);
9986 i.op[n].disps->X_add_number -= sz;
252b5132 9987 }
29b0f896 9988 /* We should find the immediate. */
9c2799c2 9989 gas_assert (sz != 0);
29b0f896 9990 }
520dc8e8 9991
29b0f896 9992 p = frag_more (size);
d258b828 9993 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 9994 if (GOT_symbol
2bbd9c25 9995 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 9996 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9997 || reloc_type == BFD_RELOC_X86_64_32S
9998 || (reloc_type == BFD_RELOC_64
9999 && object_64bit))
d6ab8113
JB
10000 && (i.op[n].disps->X_op == O_symbol
10001 || (i.op[n].disps->X_op == O_add
10002 && ((symbol_get_value_expression
10003 (i.op[n].disps->X_op_symbol)->X_op)
10004 == O_subtract))))
10005 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 10006 {
4fa24527 10007 if (!object_64bit)
7b81dfbb
AJ
10008 {
10009 reloc_type = BFD_RELOC_386_GOTPC;
5b7c81bd 10010 i.has_gotpc_tls_reloc = true;
98da05bf 10011 i.op[n].disps->X_add_number +=
d583596c 10012 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
10013 }
10014 else if (reloc_type == BFD_RELOC_64)
10015 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 10016 else
7b81dfbb
AJ
10017 /* Don't do the adjustment for x86-64, as there
10018 the pcrel addressing is relative to the _next_
10019 insn, and that is taken care of in other code. */
d6ab8113 10020 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 10021 }
e379e5f3
L
10022 else if (align_branch_power)
10023 {
10024 switch (reloc_type)
10025 {
10026 case BFD_RELOC_386_TLS_GD:
10027 case BFD_RELOC_386_TLS_LDM:
10028 case BFD_RELOC_386_TLS_IE:
10029 case BFD_RELOC_386_TLS_IE_32:
10030 case BFD_RELOC_386_TLS_GOTIE:
10031 case BFD_RELOC_386_TLS_GOTDESC:
10032 case BFD_RELOC_386_TLS_DESC_CALL:
10033 case BFD_RELOC_X86_64_TLSGD:
10034 case BFD_RELOC_X86_64_TLSLD:
10035 case BFD_RELOC_X86_64_GOTTPOFF:
10036 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
10037 case BFD_RELOC_X86_64_TLSDESC_CALL:
5b7c81bd 10038 i.has_gotpc_tls_reloc = true;
e379e5f3
L
10039 default:
10040 break;
10041 }
10042 }
02a86693
L
10043 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
10044 size, i.op[n].disps, pcrel,
10045 reloc_type);
eb19308f
JB
10046
10047 if (flag_code == CODE_64BIT && size == 4 && pcrel
10048 && !i.prefix[ADDR_PREFIX])
10049 fixP->fx_signed = 1;
10050
02a86693
L
10051 /* Check for "call/jmp *mem", "mov mem, %reg",
10052 "test %reg, mem" and "binop mem, %reg" where binop
10053 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
10054 instructions without data prefix. Always generate
10055 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
10056 if (i.prefix[DATA_PREFIX] == 0
10057 && (generate_relax_relocations
10058 || (!object_64bit
10059 && i.rm.mode == 0
10060 && i.rm.regmem == 5))
0cb4071e
L
10061 && (i.rm.mode == 2
10062 || (i.rm.mode == 0 && i.rm.regmem == 5))
389d00a5 10063 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
02a86693
L
10064 && ((i.operands == 1
10065 && i.tm.base_opcode == 0xff
10066 && (i.rm.reg == 2 || i.rm.reg == 4))
10067 || (i.operands == 2
10068 && (i.tm.base_opcode == 0x8b
10069 || i.tm.base_opcode == 0x85
2ae4c703 10070 || (i.tm.base_opcode & ~0x38) == 0x03))))
02a86693
L
10071 {
10072 if (object_64bit)
10073 {
10074 fixP->fx_tcbit = i.rex != 0;
10075 if (i.base_reg
e968fc9b 10076 && (i.base_reg->reg_num == RegIP))
02a86693
L
10077 fixP->fx_tcbit2 = 1;
10078 }
10079 else
10080 fixP->fx_tcbit2 = 1;
10081 }
29b0f896
AM
10082 }
10083 }
10084 }
10085}
252b5132 10086
29b0f896 10087static void
64e74474 10088output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
10089{
10090 char *p;
10091 unsigned int n;
252b5132 10092
29b0f896
AM
10093 for (n = 0; n < i.operands; n++)
10094 {
43234a1e 10095 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
ca5312a2 10096 if (i.rounding.type != rc_none && n == i.rounding.operand)
43234a1e
L
10097 continue;
10098
40fb9820 10099 if (operand_type_check (i.types[n], imm))
29b0f896 10100 {
48ef937e
JB
10101 int size = imm_size (n);
10102
10103 if (now_seg == absolute_section)
10104 abs_section_offset += size;
10105 else if (i.op[n].imms->X_op == O_constant)
29b0f896 10106 {
29b0f896 10107 offsetT val;
b4cac588 10108
29b0f896
AM
10109 val = offset_in_range (i.op[n].imms->X_add_number,
10110 size);
10111 p = frag_more (size);
10112 md_number_to_chars (p, val, size);
10113 }
10114 else
10115 {
10116 /* Not absolute_section.
10117 Need a 32-bit fixup (don't support 8bit
10118 non-absolute imms). Try to support other
10119 sizes ... */
f86103b7 10120 enum bfd_reloc_code_real reloc_type;
e205caa7 10121 int sign;
29b0f896 10122
40fb9820 10123 if (i.types[n].bitfield.imm32s
a7d61044 10124 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 10125 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 10126 sign = 1;
e205caa7
L
10127 else
10128 sign = 0;
520dc8e8 10129
29b0f896 10130 p = frag_more (size);
d258b828 10131 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 10132
2bbd9c25
JJ
10133 /* This is tough to explain. We end up with this one if we
10134 * have operands that look like
10135 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
10136 * obtain the absolute address of the GOT, and it is strongly
10137 * preferable from a performance point of view to avoid using
10138 * a runtime relocation for this. The actual sequence of
10139 * instructions often look something like:
10140 *
10141 * call .L66
10142 * .L66:
10143 * popl %ebx
10144 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
10145 *
10146 * The call and pop essentially return the absolute address
10147 * of the label .L66 and store it in %ebx. The linker itself
10148 * will ultimately change the first operand of the addl so
10149 * that %ebx points to the GOT, but to keep things simple, the
10150 * .o file must have this operand set so that it generates not
10151 * the absolute address of .L66, but the absolute address of
10152 * itself. This allows the linker itself simply treat a GOTPC
10153 * relocation as asking for a pcrel offset to the GOT to be
10154 * added in, and the addend of the relocation is stored in the
10155 * operand field for the instruction itself.
10156 *
10157 * Our job here is to fix the operand so that it would add
10158 * the correct offset so that %ebx would point to itself. The
10159 * thing that is tricky is that .-.L66 will point to the
10160 * beginning of the instruction, so we need to further modify
10161 * the operand so that it will point to itself. There are
10162 * other cases where you have something like:
10163 *
10164 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
10165 *
10166 * and here no correction would be required. Internally in
10167 * the assembler we treat operands of this form as not being
10168 * pcrel since the '.' is explicitly mentioned, and I wonder
10169 * whether it would simplify matters to do it this way. Who
10170 * knows. In earlier versions of the PIC patches, the
10171 * pcrel_adjust field was used to store the correction, but
10172 * since the expression is not pcrel, I felt it would be
10173 * confusing to do it this way. */
10174
d6ab8113 10175 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
10176 || reloc_type == BFD_RELOC_X86_64_32S
10177 || reloc_type == BFD_RELOC_64)
29b0f896
AM
10178 && GOT_symbol
10179 && GOT_symbol == i.op[n].imms->X_add_symbol
10180 && (i.op[n].imms->X_op == O_symbol
10181 || (i.op[n].imms->X_op == O_add
10182 && ((symbol_get_value_expression
10183 (i.op[n].imms->X_op_symbol)->X_op)
10184 == O_subtract))))
10185 {
4fa24527 10186 if (!object_64bit)
d6ab8113 10187 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 10188 else if (size == 4)
d6ab8113 10189 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
10190 else if (size == 8)
10191 reloc_type = BFD_RELOC_X86_64_GOTPC64;
5b7c81bd 10192 i.has_gotpc_tls_reloc = true;
d583596c
JB
10193 i.op[n].imms->X_add_number +=
10194 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 10195 }
29b0f896
AM
10196 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
10197 i.op[n].imms, 0, reloc_type);
10198 }
10199 }
10200 }
252b5132
RH
10201}
10202\f
d182319b
JB
10203/* x86_cons_fix_new is called via the expression parsing code when a
10204 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
10205static int cons_sign = -1;
10206
10207void
e3bb37b5 10208x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 10209 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 10210{
d258b828 10211 r = reloc (len, 0, cons_sign, r);
d182319b
JB
10212
10213#ifdef TE_PE
10214 if (exp->X_op == O_secrel)
10215 {
10216 exp->X_op = O_symbol;
10217 r = BFD_RELOC_32_SECREL;
10218 }
10219#endif
10220
10221 fix_new_exp (frag, off, len, exp, 0, r);
10222}
10223
357d1bd8
L
10224/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
10225 purpose of the `.dc.a' internal pseudo-op. */
10226
10227int
10228x86_address_bytes (void)
10229{
10230 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
10231 return 4;
10232 return stdoutput->arch_info->bits_per_address / 8;
10233}
10234
deea4973
JB
10235#if (!(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
10236 || defined (LEX_AT)) && !defined (TE_PE)
d258b828 10237# define lex_got(reloc, adjust, types) NULL
718ddfc0 10238#else
f3c180ae
AM
10239/* Parse operands of the form
10240 <symbol>@GOTOFF+<nnn>
10241 and similar .plt or .got references.
10242
10243 If we find one, set up the correct relocation in RELOC and copy the
10244 input string, minus the `@GOTOFF' into a malloc'd buffer for
10245 parsing by the calling routine. Return this buffer, and if ADJUST
10246 is non-null set it to the length of the string we removed from the
10247 input line. Otherwise return NULL. */
10248static char *
91d6fa6a 10249lex_got (enum bfd_reloc_code_real *rel,
64e74474 10250 int *adjust,
d258b828 10251 i386_operand_type *types)
f3c180ae 10252{
7b81dfbb
AJ
10253 /* Some of the relocations depend on the size of what field is to
10254 be relocated. But in our callers i386_immediate and i386_displacement
10255 we don't yet know the operand size (this will be set by insn
10256 matching). Hence we record the word32 relocation here,
10257 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
10258 static const struct {
10259 const char *str;
cff8d58a 10260 int len;
4fa24527 10261 const enum bfd_reloc_code_real rel[2];
40fb9820 10262 const i386_operand_type types64;
5b7c81bd 10263 bool need_GOT_symbol;
f3c180ae 10264 } gotrel[] = {
deea4973 10265#ifndef TE_PE
8ce3d284 10266#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
10267 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
10268 BFD_RELOC_SIZE32 },
5b7c81bd 10269 OPERAND_TYPE_IMM32_64, false },
8ce3d284 10270#endif
cff8d58a
L
10271 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
10272 BFD_RELOC_X86_64_PLTOFF64 },
5b7c81bd 10273 OPERAND_TYPE_IMM64, true },
cff8d58a
L
10274 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
10275 BFD_RELOC_X86_64_PLT32 },
5b7c81bd 10276 OPERAND_TYPE_IMM32_32S_DISP32, false },
cff8d58a
L
10277 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
10278 BFD_RELOC_X86_64_GOTPLT64 },
5b7c81bd 10279 OPERAND_TYPE_IMM64_DISP64, true },
cff8d58a
L
10280 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
10281 BFD_RELOC_X86_64_GOTOFF64 },
5b7c81bd 10282 OPERAND_TYPE_IMM64_DISP64, true },
cff8d58a
L
10283 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
10284 BFD_RELOC_X86_64_GOTPCREL },
5b7c81bd 10285 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10286 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
10287 BFD_RELOC_X86_64_TLSGD },
5b7c81bd 10288 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10289 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
10290 _dummy_first_bfd_reloc_code_real },
5b7c81bd 10291 OPERAND_TYPE_NONE, true },
cff8d58a
L
10292 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
10293 BFD_RELOC_X86_64_TLSLD },
5b7c81bd 10294 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10295 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
10296 BFD_RELOC_X86_64_GOTTPOFF },
5b7c81bd 10297 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10298 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
10299 BFD_RELOC_X86_64_TPOFF32 },
5b7c81bd 10300 OPERAND_TYPE_IMM32_32S_64_DISP32_64, true },
cff8d58a
L
10301 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
10302 _dummy_first_bfd_reloc_code_real },
5b7c81bd 10303 OPERAND_TYPE_NONE, true },
cff8d58a
L
10304 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
10305 BFD_RELOC_X86_64_DTPOFF32 },
5b7c81bd 10306 OPERAND_TYPE_IMM32_32S_64_DISP32_64, true },
cff8d58a
L
10307 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
10308 _dummy_first_bfd_reloc_code_real },
5b7c81bd 10309 OPERAND_TYPE_NONE, true },
cff8d58a
L
10310 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
10311 _dummy_first_bfd_reloc_code_real },
5b7c81bd 10312 OPERAND_TYPE_NONE, true },
cff8d58a
L
10313 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
10314 BFD_RELOC_X86_64_GOT32 },
5b7c81bd 10315 OPERAND_TYPE_IMM32_32S_64_DISP32, true },
cff8d58a
L
10316 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
10317 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
5b7c81bd 10318 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10319 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
10320 BFD_RELOC_X86_64_TLSDESC_CALL },
5b7c81bd 10321 OPERAND_TYPE_IMM32_32S_DISP32, true },
deea4973
JB
10322#else /* TE_PE */
10323 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
10324 BFD_RELOC_32_SECREL },
10325 OPERAND_TYPE_IMM32_32S_64_DISP32_64, false },
10326#endif
f3c180ae
AM
10327 };
10328 char *cp;
10329 unsigned int j;
10330
deea4973 10331#if defined (OBJ_MAYBE_ELF) && !defined (TE_PE)
718ddfc0
JB
10332 if (!IS_ELF)
10333 return NULL;
d382c579 10334#endif
718ddfc0 10335
f3c180ae 10336 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 10337 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
10338 return NULL;
10339
47465058 10340 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 10341 {
cff8d58a 10342 int len = gotrel[j].len;
28f81592 10343 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 10344 {
4fa24527 10345 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 10346 {
28f81592
AM
10347 int first, second;
10348 char *tmpbuf, *past_reloc;
f3c180ae 10349
91d6fa6a 10350 *rel = gotrel[j].rel[object_64bit];
f3c180ae 10351
3956db08
JB
10352 if (types)
10353 {
10354 if (flag_code != CODE_64BIT)
40fb9820
L
10355 {
10356 types->bitfield.imm32 = 1;
10357 types->bitfield.disp32 = 1;
10358 }
3956db08
JB
10359 else
10360 *types = gotrel[j].types64;
10361 }
10362
844bf810 10363 if (gotrel[j].need_GOT_symbol && GOT_symbol == NULL)
f3c180ae
AM
10364 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
10365
28f81592 10366 /* The length of the first part of our input line. */
f3c180ae 10367 first = cp - input_line_pointer;
28f81592
AM
10368
10369 /* The second part goes from after the reloc token until
67c11a9b 10370 (and including) an end_of_line char or comma. */
28f81592 10371 past_reloc = cp + 1 + len;
67c11a9b
AM
10372 cp = past_reloc;
10373 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10374 ++cp;
10375 second = cp + 1 - past_reloc;
28f81592
AM
10376
10377 /* Allocate and copy string. The trailing NUL shouldn't
10378 be necessary, but be safe. */
add39d23 10379 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 10380 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
10381 if (second != 0 && *past_reloc != ' ')
10382 /* Replace the relocation token with ' ', so that
10383 errors like foo@GOTOFF1 will be detected. */
10384 tmpbuf[first++] = ' ';
af89796a
L
10385 else
10386 /* Increment length by 1 if the relocation token is
10387 removed. */
10388 len++;
10389 if (adjust)
10390 *adjust = len;
0787a12d
AM
10391 memcpy (tmpbuf + first, past_reloc, second);
10392 tmpbuf[first + second] = '\0';
f3c180ae
AM
10393 return tmpbuf;
10394 }
10395
4fa24527
JB
10396 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10397 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
10398 return NULL;
10399 }
10400 }
10401
10402 /* Might be a symbol version string. Don't as_bad here. */
10403 return NULL;
10404}
4e4f7c87 10405#endif
f3c180ae 10406
62ebcb5c 10407bfd_reloc_code_real_type
e3bb37b5 10408x86_cons (expressionS *exp, int size)
f3c180ae 10409{
62ebcb5c
AM
10410 bfd_reloc_code_real_type got_reloc = NO_RELOC;
10411
ee86248c
JB
10412 intel_syntax = -intel_syntax;
10413
3c7b9c2c 10414 exp->X_md = 0;
4fa24527 10415 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
10416 {
10417 /* Handle @GOTOFF and the like in an expression. */
10418 char *save;
10419 char *gotfree_input_line;
4a57f2cf 10420 int adjust = 0;
f3c180ae
AM
10421
10422 save = input_line_pointer;
d258b828 10423 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
10424 if (gotfree_input_line)
10425 input_line_pointer = gotfree_input_line;
10426
10427 expression (exp);
10428
10429 if (gotfree_input_line)
10430 {
10431 /* expression () has merrily parsed up to the end of line,
10432 or a comma - in the wrong buffer. Transfer how far
10433 input_line_pointer has moved to the right buffer. */
10434 input_line_pointer = (save
10435 + (input_line_pointer - gotfree_input_line)
10436 + adjust);
10437 free (gotfree_input_line);
3992d3b7
AM
10438 if (exp->X_op == O_constant
10439 || exp->X_op == O_absent
10440 || exp->X_op == O_illegal
0398aac5 10441 || exp->X_op == O_register
3992d3b7
AM
10442 || exp->X_op == O_big)
10443 {
10444 char c = *input_line_pointer;
10445 *input_line_pointer = 0;
10446 as_bad (_("missing or invalid expression `%s'"), save);
10447 *input_line_pointer = c;
10448 }
b9519cfe
L
10449 else if ((got_reloc == BFD_RELOC_386_PLT32
10450 || got_reloc == BFD_RELOC_X86_64_PLT32)
10451 && exp->X_op != O_symbol)
10452 {
10453 char c = *input_line_pointer;
10454 *input_line_pointer = 0;
10455 as_bad (_("invalid PLT expression `%s'"), save);
10456 *input_line_pointer = c;
10457 }
f3c180ae
AM
10458 }
10459 }
10460 else
10461 expression (exp);
ee86248c
JB
10462
10463 intel_syntax = -intel_syntax;
10464
10465 if (intel_syntax)
10466 i386_intel_simplify (exp);
62ebcb5c 10467
a442cac5
JB
10468 /* If not 64bit, massage value, to account for wraparound when !BFD64. */
10469 if (size == 4 && exp->X_op == O_constant && !object_64bit)
10470 exp->X_add_number = extend_to_32bit_address (exp->X_add_number);
10471
62ebcb5c 10472 return got_reloc;
f3c180ae 10473}
f3c180ae 10474
9f32dd5b
L
10475static void
10476signed_cons (int size)
6482c264 10477{
a442cac5 10478 if (object_64bit)
d182319b
JB
10479 cons_sign = 1;
10480 cons (size);
10481 cons_sign = -1;
6482c264
NC
10482}
10483
d182319b 10484#ifdef TE_PE
6482c264 10485static void
7016a5d5 10486pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
10487{
10488 expressionS exp;
10489
10490 do
10491 {
10492 expression (&exp);
10493 if (exp.X_op == O_symbol)
10494 exp.X_op = O_secrel;
10495
10496 emit_expr (&exp, 4);
10497 }
10498 while (*input_line_pointer++ == ',');
10499
10500 input_line_pointer--;
10501 demand_empty_rest_of_line ();
10502}
6482c264
NC
10503#endif
10504
43234a1e
L
10505/* Handle Vector operations. */
10506
10507static char *
f70c6814 10508check_VecOperations (char *op_string)
43234a1e
L
10509{
10510 const reg_entry *mask;
10511 const char *saved;
10512 char *end_op;
10513
f70c6814 10514 while (*op_string)
43234a1e
L
10515 {
10516 saved = op_string;
10517 if (*op_string == '{')
10518 {
10519 op_string++;
10520
10521 /* Check broadcasts. */
d34049e8 10522 if (startswith (op_string, "1to"))
43234a1e 10523 {
5273a3cd 10524 unsigned int bcst_type;
43234a1e 10525
5273a3cd 10526 if (i.broadcast.type)
43234a1e
L
10527 goto duplicated_vec_op;
10528
10529 op_string += 3;
10530 if (*op_string == '8')
8e6e0792 10531 bcst_type = 8;
b28d1bda 10532 else if (*op_string == '4')
8e6e0792 10533 bcst_type = 4;
b28d1bda 10534 else if (*op_string == '2')
8e6e0792 10535 bcst_type = 2;
43234a1e
L
10536 else if (*op_string == '1'
10537 && *(op_string+1) == '6')
10538 {
8e6e0792 10539 bcst_type = 16;
43234a1e
L
10540 op_string++;
10541 }
10542 else
10543 {
10544 as_bad (_("Unsupported broadcast: `%s'"), saved);
10545 return NULL;
10546 }
10547 op_string++;
10548
5273a3cd
JB
10549 i.broadcast.type = bcst_type;
10550 i.broadcast.operand = this_operand;
43234a1e
L
10551 }
10552 /* Check masking operation. */
10553 else if ((mask = parse_register (op_string, &end_op)) != NULL)
10554 {
8a6fb3f9
JB
10555 if (mask == &bad_reg)
10556 return NULL;
10557
43234a1e 10558 /* k0 can't be used for write mask. */
f74a6307 10559 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 10560 {
6d2cd6b2
JB
10561 as_bad (_("`%s%s' can't be used for write mask"),
10562 register_prefix, mask->reg_name);
43234a1e
L
10563 return NULL;
10564 }
10565
6225c532 10566 if (!i.mask.reg)
43234a1e 10567 {
6225c532
JB
10568 i.mask.reg = mask;
10569 i.mask.operand = this_operand;
43234a1e 10570 }
6225c532
JB
10571 else if (i.mask.reg->reg_num)
10572 goto duplicated_vec_op;
43234a1e
L
10573 else
10574 {
6225c532 10575 i.mask.reg = mask;
43234a1e
L
10576
10577 /* Only "{z}" is allowed here. No need to check
10578 zeroing mask explicitly. */
6225c532 10579 if (i.mask.operand != (unsigned int) this_operand)
43234a1e
L
10580 {
10581 as_bad (_("invalid write mask `%s'"), saved);
10582 return NULL;
10583 }
10584 }
10585
10586 op_string = end_op;
10587 }
10588 /* Check zeroing-flag for masking operation. */
10589 else if (*op_string == 'z')
10590 {
6225c532 10591 if (!i.mask.reg)
43234a1e 10592 {
6225c532
JB
10593 i.mask.reg = reg_k0;
10594 i.mask.zeroing = 1;
10595 i.mask.operand = this_operand;
43234a1e
L
10596 }
10597 else
10598 {
6225c532 10599 if (i.mask.zeroing)
43234a1e
L
10600 {
10601 duplicated_vec_op:
10602 as_bad (_("duplicated `%s'"), saved);
10603 return NULL;
10604 }
10605
6225c532 10606 i.mask.zeroing = 1;
43234a1e
L
10607
10608 /* Only "{%k}" is allowed here. No need to check mask
10609 register explicitly. */
6225c532 10610 if (i.mask.operand != (unsigned int) this_operand)
43234a1e
L
10611 {
10612 as_bad (_("invalid zeroing-masking `%s'"),
10613 saved);
10614 return NULL;
10615 }
10616 }
10617
10618 op_string++;
10619 }
10620 else
10621 goto unknown_vec_op;
10622
10623 if (*op_string != '}')
10624 {
10625 as_bad (_("missing `}' in `%s'"), saved);
10626 return NULL;
10627 }
10628 op_string++;
0ba3a731
L
10629
10630 /* Strip whitespace since the addition of pseudo prefixes
10631 changed how the scrubber treats '{'. */
10632 if (is_space_char (*op_string))
10633 ++op_string;
10634
43234a1e
L
10635 continue;
10636 }
10637 unknown_vec_op:
10638 /* We don't know this one. */
10639 as_bad (_("unknown vector operation: `%s'"), saved);
10640 return NULL;
10641 }
10642
6225c532 10643 if (i.mask.reg && i.mask.zeroing && !i.mask.reg->reg_num)
6d2cd6b2
JB
10644 {
10645 as_bad (_("zeroing-masking only allowed with write mask"));
10646 return NULL;
10647 }
10648
43234a1e
L
10649 return op_string;
10650}
10651
252b5132 10652static int
70e41ade 10653i386_immediate (char *imm_start)
252b5132
RH
10654{
10655 char *save_input_line_pointer;
f3c180ae 10656 char *gotfree_input_line;
252b5132 10657 segT exp_seg = 0;
47926f60 10658 expressionS *exp;
40fb9820
L
10659 i386_operand_type types;
10660
0dfbf9d7 10661 operand_type_set (&types, ~0);
252b5132
RH
10662
10663 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
10664 {
31b2323c
L
10665 as_bad (_("at most %d immediate operands are allowed"),
10666 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
10667 return 0;
10668 }
10669
10670 exp = &im_expressions[i.imm_operands++];
520dc8e8 10671 i.op[this_operand].imms = exp;
252b5132
RH
10672
10673 if (is_space_char (*imm_start))
10674 ++imm_start;
10675
10676 save_input_line_pointer = input_line_pointer;
10677 input_line_pointer = imm_start;
10678
d258b828 10679 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10680 if (gotfree_input_line)
10681 input_line_pointer = gotfree_input_line;
252b5132
RH
10682
10683 exp_seg = expression (exp);
10684
83183c0c 10685 SKIP_WHITESPACE ();
252b5132 10686 if (*input_line_pointer)
f3c180ae 10687 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
10688
10689 input_line_pointer = save_input_line_pointer;
f3c180ae 10690 if (gotfree_input_line)
ee86248c
JB
10691 {
10692 free (gotfree_input_line);
10693
9aac24b1 10694 if (exp->X_op == O_constant)
ee86248c
JB
10695 exp->X_op = O_illegal;
10696 }
10697
9aac24b1
JB
10698 if (exp_seg == reg_section)
10699 {
10700 as_bad (_("illegal immediate register operand %s"), imm_start);
10701 return 0;
10702 }
10703
ee86248c
JB
10704 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
10705}
252b5132 10706
ee86248c
JB
10707static int
10708i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10709 i386_operand_type types, const char *imm_start)
10710{
10711 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 10712 {
313c53d1
L
10713 if (imm_start)
10714 as_bad (_("missing or invalid immediate expression `%s'"),
10715 imm_start);
3992d3b7 10716 return 0;
252b5132 10717 }
3e73aa7c 10718 else if (exp->X_op == O_constant)
252b5132 10719 {
47926f60 10720 /* Size it properly later. */
40fb9820 10721 i.types[this_operand].bitfield.imm64 = 1;
a442cac5
JB
10722
10723 /* If not 64bit, sign/zero extend val, to account for wraparound
10724 when !BFD64. */
10725 if (flag_code != CODE_64BIT)
10726 exp->X_add_number = extend_to_32bit_address (exp->X_add_number);
252b5132 10727 }
4c63da97 10728#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 10729 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 10730 && exp_seg != absolute_section
47926f60 10731 && exp_seg != text_section
24eab124
AM
10732 && exp_seg != data_section
10733 && exp_seg != bss_section
10734 && exp_seg != undefined_section
f86103b7 10735 && !bfd_is_com_section (exp_seg))
252b5132 10736 {
d0b47220 10737 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
10738 return 0;
10739 }
10740#endif
10741 else
10742 {
10743 /* This is an address. The size of the address will be
24eab124 10744 determined later, depending on destination register,
3e73aa7c 10745 suffix, or the default for the section. */
40fb9820
L
10746 i.types[this_operand].bitfield.imm8 = 1;
10747 i.types[this_operand].bitfield.imm16 = 1;
10748 i.types[this_operand].bitfield.imm32 = 1;
10749 i.types[this_operand].bitfield.imm32s = 1;
10750 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
10751 i.types[this_operand] = operand_type_and (i.types[this_operand],
10752 types);
252b5132
RH
10753 }
10754
10755 return 1;
10756}
10757
551c1ca1 10758static char *
e3bb37b5 10759i386_scale (char *scale)
252b5132 10760{
551c1ca1
AM
10761 offsetT val;
10762 char *save = input_line_pointer;
252b5132 10763
551c1ca1
AM
10764 input_line_pointer = scale;
10765 val = get_absolute_expression ();
10766
10767 switch (val)
252b5132 10768 {
551c1ca1 10769 case 1:
252b5132
RH
10770 i.log2_scale_factor = 0;
10771 break;
551c1ca1 10772 case 2:
252b5132
RH
10773 i.log2_scale_factor = 1;
10774 break;
551c1ca1 10775 case 4:
252b5132
RH
10776 i.log2_scale_factor = 2;
10777 break;
551c1ca1 10778 case 8:
252b5132
RH
10779 i.log2_scale_factor = 3;
10780 break;
10781 default:
a724f0f4
JB
10782 {
10783 char sep = *input_line_pointer;
10784
10785 *input_line_pointer = '\0';
10786 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
10787 scale);
10788 *input_line_pointer = sep;
10789 input_line_pointer = save;
10790 return NULL;
10791 }
252b5132 10792 }
29b0f896 10793 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
10794 {
10795 as_warn (_("scale factor of %d without an index register"),
24eab124 10796 1 << i.log2_scale_factor);
252b5132 10797 i.log2_scale_factor = 0;
252b5132 10798 }
551c1ca1
AM
10799 scale = input_line_pointer;
10800 input_line_pointer = save;
10801 return scale;
252b5132
RH
10802}
10803
252b5132 10804static int
e3bb37b5 10805i386_displacement (char *disp_start, char *disp_end)
252b5132 10806{
29b0f896 10807 expressionS *exp;
252b5132
RH
10808 segT exp_seg = 0;
10809 char *save_input_line_pointer;
f3c180ae 10810 char *gotfree_input_line;
40fb9820
L
10811 int override;
10812 i386_operand_type bigdisp, types = anydisp;
3992d3b7 10813 int ret;
252b5132 10814
31b2323c
L
10815 if (i.disp_operands == MAX_MEMORY_OPERANDS)
10816 {
10817 as_bad (_("at most %d displacement operands are allowed"),
10818 MAX_MEMORY_OPERANDS);
10819 return 0;
10820 }
10821
0dfbf9d7 10822 operand_type_set (&bigdisp, 0);
6f2f06be 10823 if (i.jumpabsolute
48bcea9f 10824 || i.types[this_operand].bitfield.baseindex
0cfa3eb3
JB
10825 || (current_templates->start->opcode_modifier.jump != JUMP
10826 && current_templates->start->opcode_modifier.jump != JUMP_DWORD))
e05278af 10827 {
48bcea9f 10828 i386_addressing_mode ();
e05278af 10829 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
10830 if (flag_code == CODE_64BIT)
10831 {
10832 if (!override)
10833 {
10834 bigdisp.bitfield.disp32s = 1;
10835 bigdisp.bitfield.disp64 = 1;
10836 }
48bcea9f
JB
10837 else
10838 bigdisp.bitfield.disp32 = 1;
40fb9820
L
10839 }
10840 else if ((flag_code == CODE_16BIT) ^ override)
40fb9820 10841 bigdisp.bitfield.disp16 = 1;
48bcea9f
JB
10842 else
10843 bigdisp.bitfield.disp32 = 1;
e05278af
JB
10844 }
10845 else
10846 {
376cd056
JB
10847 /* For PC-relative branches, the width of the displacement may be
10848 dependent upon data size, but is never dependent upon address size.
10849 Also make sure to not unintentionally match against a non-PC-relative
10850 branch template. */
10851 static templates aux_templates;
10852 const insn_template *t = current_templates->start;
5b7c81bd 10853 bool has_intel64 = false;
376cd056
JB
10854
10855 aux_templates.start = t;
10856 while (++t < current_templates->end)
10857 {
10858 if (t->opcode_modifier.jump
10859 != current_templates->start->opcode_modifier.jump)
10860 break;
4b5aaf5f 10861 if ((t->opcode_modifier.isa64 >= INTEL64))
5b7c81bd 10862 has_intel64 = true;
376cd056
JB
10863 }
10864 if (t < current_templates->end)
10865 {
10866 aux_templates.end = t;
10867 current_templates = &aux_templates;
10868 }
10869
e05278af 10870 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
10871 if (flag_code == CODE_64BIT)
10872 {
376cd056
JB
10873 if ((override || i.suffix == WORD_MNEM_SUFFIX)
10874 && (!intel64 || !has_intel64))
40fb9820
L
10875 bigdisp.bitfield.disp16 = 1;
10876 else
48bcea9f 10877 bigdisp.bitfield.disp32s = 1;
40fb9820
L
10878 }
10879 else
e05278af
JB
10880 {
10881 if (!override)
10882 override = (i.suffix == (flag_code != CODE_16BIT
10883 ? WORD_MNEM_SUFFIX
10884 : LONG_MNEM_SUFFIX));
40fb9820
L
10885 bigdisp.bitfield.disp32 = 1;
10886 if ((flag_code == CODE_16BIT) ^ override)
10887 {
10888 bigdisp.bitfield.disp32 = 0;
10889 bigdisp.bitfield.disp16 = 1;
10890 }
e05278af 10891 }
e05278af 10892 }
c6fb90c8
L
10893 i.types[this_operand] = operand_type_or (i.types[this_operand],
10894 bigdisp);
252b5132
RH
10895
10896 exp = &disp_expressions[i.disp_operands];
520dc8e8 10897 i.op[this_operand].disps = exp;
252b5132
RH
10898 i.disp_operands++;
10899 save_input_line_pointer = input_line_pointer;
10900 input_line_pointer = disp_start;
10901 END_STRING_AND_SAVE (disp_end);
10902
10903#ifndef GCC_ASM_O_HACK
10904#define GCC_ASM_O_HACK 0
10905#endif
10906#if GCC_ASM_O_HACK
10907 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 10908 if (i.types[this_operand].bitfield.baseIndex
24eab124 10909 && displacement_string_end[-1] == '+')
252b5132
RH
10910 {
10911 /* This hack is to avoid a warning when using the "o"
24eab124
AM
10912 constraint within gcc asm statements.
10913 For instance:
10914
10915 #define _set_tssldt_desc(n,addr,limit,type) \
10916 __asm__ __volatile__ ( \
10917 "movw %w2,%0\n\t" \
10918 "movw %w1,2+%0\n\t" \
10919 "rorl $16,%1\n\t" \
10920 "movb %b1,4+%0\n\t" \
10921 "movb %4,5+%0\n\t" \
10922 "movb $0,6+%0\n\t" \
10923 "movb %h1,7+%0\n\t" \
10924 "rorl $16,%1" \
10925 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
10926
10927 This works great except that the output assembler ends
10928 up looking a bit weird if it turns out that there is
10929 no offset. You end up producing code that looks like:
10930
10931 #APP
10932 movw $235,(%eax)
10933 movw %dx,2+(%eax)
10934 rorl $16,%edx
10935 movb %dl,4+(%eax)
10936 movb $137,5+(%eax)
10937 movb $0,6+(%eax)
10938 movb %dh,7+(%eax)
10939 rorl $16,%edx
10940 #NO_APP
10941
47926f60 10942 So here we provide the missing zero. */
24eab124
AM
10943
10944 *displacement_string_end = '0';
252b5132
RH
10945 }
10946#endif
d258b828 10947 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10948 if (gotfree_input_line)
10949 input_line_pointer = gotfree_input_line;
252b5132 10950
24eab124 10951 exp_seg = expression (exp);
252b5132 10952
636c26b0
AM
10953 SKIP_WHITESPACE ();
10954 if (*input_line_pointer)
10955 as_bad (_("junk `%s' after expression"), input_line_pointer);
10956#if GCC_ASM_O_HACK
10957 RESTORE_END_STRING (disp_end + 1);
10958#endif
636c26b0 10959 input_line_pointer = save_input_line_pointer;
636c26b0 10960 if (gotfree_input_line)
ee86248c
JB
10961 {
10962 free (gotfree_input_line);
10963
10964 if (exp->X_op == O_constant || exp->X_op == O_register)
10965 exp->X_op = O_illegal;
10966 }
10967
10968 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
10969
10970 RESTORE_END_STRING (disp_end);
10971
10972 return ret;
10973}
10974
10975static int
10976i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10977 i386_operand_type types, const char *disp_start)
10978{
10979 i386_operand_type bigdisp;
10980 int ret = 1;
636c26b0 10981
24eab124
AM
10982 /* We do this to make sure that the section symbol is in
10983 the symbol table. We will ultimately change the relocation
47926f60 10984 to be relative to the beginning of the section. */
1ae12ab7 10985 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
10986 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
10987 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 10988 {
636c26b0 10989 if (exp->X_op != O_symbol)
3992d3b7 10990 goto inv_disp;
636c26b0 10991
e5cb08ac 10992 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
10993 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
10994 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 10995 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
10996 exp->X_op = O_subtract;
10997 exp->X_op_symbol = GOT_symbol;
1ae12ab7 10998 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 10999 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
11000 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
11001 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 11002 else
29b0f896 11003 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 11004 }
252b5132 11005
3992d3b7
AM
11006 else if (exp->X_op == O_absent
11007 || exp->X_op == O_illegal
ee86248c 11008 || exp->X_op == O_big)
2daf4fd8 11009 {
3992d3b7
AM
11010 inv_disp:
11011 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 11012 disp_start);
3992d3b7 11013 ret = 0;
2daf4fd8
AM
11014 }
11015
4c63da97 11016#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
11017 else if (exp->X_op != O_constant
11018 && OUTPUT_FLAVOR == bfd_target_aout_flavour
11019 && exp_seg != absolute_section
11020 && exp_seg != text_section
11021 && exp_seg != data_section
11022 && exp_seg != bss_section
11023 && exp_seg != undefined_section
11024 && !bfd_is_com_section (exp_seg))
24eab124 11025 {
d0b47220 11026 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 11027 ret = 0;
24eab124 11028 }
252b5132 11029#endif
3956db08 11030
48bcea9f
JB
11031 if (current_templates->start->opcode_modifier.jump == JUMP_BYTE
11032 /* Constants get taken care of by optimize_disp(). */
11033 && exp->X_op != O_constant)
11034 i.types[this_operand].bitfield.disp8 = 1;
11035
40fb9820
L
11036 /* Check if this is a displacement only operand. */
11037 bigdisp = i.types[this_operand];
11038 bigdisp.bitfield.disp8 = 0;
11039 bigdisp.bitfield.disp16 = 0;
11040 bigdisp.bitfield.disp32 = 0;
11041 bigdisp.bitfield.disp32s = 0;
11042 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 11043 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
11044 i.types[this_operand] = operand_type_and (i.types[this_operand],
11045 types);
3956db08 11046
3992d3b7 11047 return ret;
252b5132
RH
11048}
11049
2abc2bec
JB
11050/* Return the active addressing mode, taking address override and
11051 registers forming the address into consideration. Update the
11052 address override prefix if necessary. */
47926f60 11053
2abc2bec
JB
11054static enum flag_code
11055i386_addressing_mode (void)
252b5132 11056{
be05d201
L
11057 enum flag_code addr_mode;
11058
11059 if (i.prefix[ADDR_PREFIX])
11060 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
a23b33b3
JB
11061 else if (flag_code == CODE_16BIT
11062 && current_templates->start->cpu_flags.bitfield.cpumpx
11063 /* Avoid replacing the "16-bit addressing not allowed" diagnostic
11064 from md_assemble() by "is not a valid base/index expression"
11065 when there is a base and/or index. */
11066 && !i.types[this_operand].bitfield.baseindex)
11067 {
11068 /* MPX insn memory operands with neither base nor index must be forced
11069 to use 32-bit addressing in 16-bit mode. */
11070 addr_mode = CODE_32BIT;
11071 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
11072 ++i.prefixes;
11073 gas_assert (!i.types[this_operand].bitfield.disp16);
11074 gas_assert (!i.types[this_operand].bitfield.disp32);
11075 }
be05d201
L
11076 else
11077 {
11078 addr_mode = flag_code;
11079
24eab124 11080#if INFER_ADDR_PREFIX
be05d201
L
11081 if (i.mem_operands == 0)
11082 {
11083 /* Infer address prefix from the first memory operand. */
11084 const reg_entry *addr_reg = i.base_reg;
11085
11086 if (addr_reg == NULL)
11087 addr_reg = i.index_reg;
eecb386c 11088
be05d201
L
11089 if (addr_reg)
11090 {
e968fc9b 11091 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
11092 addr_mode = CODE_32BIT;
11093 else if (flag_code != CODE_64BIT
dc821c5f 11094 && addr_reg->reg_type.bitfield.word)
be05d201
L
11095 addr_mode = CODE_16BIT;
11096
11097 if (addr_mode != flag_code)
11098 {
11099 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
11100 i.prefixes += 1;
11101 /* Change the size of any displacement too. At most one
11102 of Disp16 or Disp32 is set.
11103 FIXME. There doesn't seem to be any real need for
11104 separate Disp16 and Disp32 flags. The same goes for
11105 Imm16 and Imm32. Removing them would probably clean
11106 up the code quite a lot. */
11107 if (flag_code != CODE_64BIT
11108 && (i.types[this_operand].bitfield.disp16
11109 || i.types[this_operand].bitfield.disp32))
11110 i.types[this_operand]
11111 = operand_type_xor (i.types[this_operand], disp16_32);
11112 }
11113 }
11114 }
24eab124 11115#endif
be05d201
L
11116 }
11117
2abc2bec
JB
11118 return addr_mode;
11119}
11120
11121/* Make sure the memory operand we've been dealt is valid.
11122 Return 1 on success, 0 on a failure. */
11123
11124static int
11125i386_index_check (const char *operand_string)
11126{
11127 const char *kind = "base/index";
11128 enum flag_code addr_mode = i386_addressing_mode ();
a152332d 11129 const insn_template *t = current_templates->start;
2abc2bec 11130
a152332d
JB
11131 if (t->opcode_modifier.isstring
11132 && !t->cpu_flags.bitfield.cpupadlock
fc0763e6
JB
11133 && (current_templates->end[-1].opcode_modifier.isstring
11134 || i.mem_operands))
11135 {
11136 /* Memory operands of string insns are special in that they only allow
11137 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
11138 const reg_entry *expected_reg;
11139 static const char *di_si[][2] =
11140 {
11141 { "esi", "edi" },
11142 { "si", "di" },
11143 { "rsi", "rdi" }
11144 };
11145 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
11146
11147 kind = "string address";
11148
a152332d 11149 if (t->opcode_modifier.prefixok == PrefixRep)
fc0763e6 11150 {
51c8edf6
JB
11151 int es_op = current_templates->end[-1].opcode_modifier.isstring
11152 - IS_STRING_ES_OP0;
11153 int op = 0;
fc0763e6 11154
51c8edf6 11155 if (!current_templates->end[-1].operand_types[0].bitfield.baseindex
fc0763e6
JB
11156 || ((!i.mem_operands != !intel_syntax)
11157 && current_templates->end[-1].operand_types[1]
11158 .bitfield.baseindex))
51c8edf6 11159 op = 1;
fe0e921f
AM
11160 expected_reg
11161 = (const reg_entry *) str_hash_find (reg_hash,
11162 di_si[addr_mode][op == es_op]);
fc0763e6
JB
11163 }
11164 else
fe0e921f
AM
11165 expected_reg
11166 = (const reg_entry *)str_hash_find (reg_hash, bx[addr_mode]);
fc0763e6 11167
be05d201
L
11168 if (i.base_reg != expected_reg
11169 || i.index_reg
fc0763e6 11170 || operand_type_check (i.types[this_operand], disp))
fc0763e6 11171 {
be05d201
L
11172 /* The second memory operand must have the same size as
11173 the first one. */
11174 if (i.mem_operands
11175 && i.base_reg
11176 && !((addr_mode == CODE_64BIT
dc821c5f 11177 && i.base_reg->reg_type.bitfield.qword)
be05d201 11178 || (addr_mode == CODE_32BIT
dc821c5f
JB
11179 ? i.base_reg->reg_type.bitfield.dword
11180 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
11181 goto bad_address;
11182
fc0763e6
JB
11183 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
11184 operand_string,
11185 intel_syntax ? '[' : '(',
11186 register_prefix,
be05d201 11187 expected_reg->reg_name,
fc0763e6 11188 intel_syntax ? ']' : ')');
be05d201 11189 return 1;
fc0763e6 11190 }
be05d201
L
11191 else
11192 return 1;
11193
dc1e8a47 11194 bad_address:
be05d201
L
11195 as_bad (_("`%s' is not a valid %s expression"),
11196 operand_string, kind);
11197 return 0;
3e73aa7c
JH
11198 }
11199 else
11200 {
be05d201
L
11201 if (addr_mode != CODE_16BIT)
11202 {
11203 /* 32-bit/64-bit checks. */
41eb8e88
L
11204 if (i.disp_encoding == disp_encoding_16bit)
11205 {
11206 bad_disp:
11207 as_bad (_("invalid `%s' prefix"),
11208 addr_mode == CODE_16BIT ? "{disp32}" : "{disp16}");
11209 return 0;
11210 }
11211
be05d201 11212 if ((i.base_reg
e968fc9b
JB
11213 && ((addr_mode == CODE_64BIT
11214 ? !i.base_reg->reg_type.bitfield.qword
11215 : !i.base_reg->reg_type.bitfield.dword)
11216 || (i.index_reg && i.base_reg->reg_num == RegIP)
11217 || i.base_reg->reg_num == RegIZ))
be05d201 11218 || (i.index_reg
1b54b8d7
JB
11219 && !i.index_reg->reg_type.bitfield.xmmword
11220 && !i.index_reg->reg_type.bitfield.ymmword
11221 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 11222 && ((addr_mode == CODE_64BIT
e968fc9b
JB
11223 ? !i.index_reg->reg_type.bitfield.qword
11224 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
11225 || !i.index_reg->reg_type.bitfield.baseindex)))
11226 goto bad_address;
8178be5b 11227
260cd341 11228 /* bndmk, bndldx, bndstx and mandatory non-vector SIB have special restrictions. */
a152332d 11229 if ((t->opcode_modifier.opcodeprefix == PREFIX_0XF3
389d00a5
JB
11230 && t->opcode_modifier.opcodespace == SPACE_0F
11231 && t->base_opcode == 0x1b)
a152332d 11232 || (t->opcode_modifier.opcodeprefix == PREFIX_NONE
389d00a5
JB
11233 && t->opcode_modifier.opcodespace == SPACE_0F
11234 && (t->base_opcode & ~1) == 0x1a)
a152332d 11235 || t->opcode_modifier.sib == SIBMEM)
8178be5b
JB
11236 {
11237 /* They cannot use RIP-relative addressing. */
e968fc9b 11238 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
11239 {
11240 as_bad (_("`%s' cannot be used here"), operand_string);
11241 return 0;
11242 }
11243
11244 /* bndldx and bndstx ignore their scale factor. */
a152332d 11245 if (t->opcode_modifier.opcodeprefix == PREFIX_NONE
389d00a5
JB
11246 && t->opcode_modifier.opcodespace == SPACE_0F
11247 && (t->base_opcode & ~1) == 0x1a
8178be5b
JB
11248 && i.log2_scale_factor)
11249 as_warn (_("register scaling is being ignored here"));
11250 }
be05d201
L
11251 }
11252 else
3e73aa7c 11253 {
be05d201 11254 /* 16-bit checks. */
41eb8e88
L
11255 if (i.disp_encoding == disp_encoding_32bit)
11256 goto bad_disp;
11257
3e73aa7c 11258 if ((i.base_reg
dc821c5f 11259 && (!i.base_reg->reg_type.bitfield.word
40fb9820 11260 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 11261 || (i.index_reg
dc821c5f 11262 && (!i.index_reg->reg_type.bitfield.word
40fb9820 11263 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
11264 || !(i.base_reg
11265 && i.base_reg->reg_num < 6
11266 && i.index_reg->reg_num >= 6
11267 && i.log2_scale_factor == 0))))
be05d201 11268 goto bad_address;
3e73aa7c
JH
11269 }
11270 }
be05d201 11271 return 1;
24eab124 11272}
252b5132 11273
43234a1e
L
11274/* Handle vector immediates. */
11275
11276static int
11277RC_SAE_immediate (const char *imm_start)
11278{
11279 unsigned int match_found, j;
11280 const char *pstr = imm_start;
11281 expressionS *exp;
11282
11283 if (*pstr != '{')
11284 return 0;
11285
11286 pstr++;
11287 match_found = 0;
11288 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
11289 {
11290 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
11291 {
ca5312a2 11292 if (i.rounding.type != rc_none)
43234a1e
L
11293 {
11294 as_bad (_("duplicated `%s'"), imm_start);
11295 return 0;
11296 }
ca5312a2
JB
11297
11298 i.rounding.type = RC_NamesTable[j].type;
11299 i.rounding.operand = this_operand;
11300
43234a1e
L
11301 pstr += RC_NamesTable[j].len;
11302 match_found = 1;
11303 break;
11304 }
11305 }
11306 if (!match_found)
11307 return 0;
11308
11309 if (*pstr++ != '}')
11310 {
11311 as_bad (_("Missing '}': '%s'"), imm_start);
11312 return 0;
11313 }
11314 /* RC/SAE immediate string should contain nothing more. */;
11315 if (*pstr != 0)
11316 {
11317 as_bad (_("Junk after '}': '%s'"), imm_start);
11318 return 0;
11319 }
11320
11321 exp = &im_expressions[i.imm_operands++];
11322 i.op[this_operand].imms = exp;
11323
11324 exp->X_op = O_constant;
11325 exp->X_add_number = 0;
11326 exp->X_add_symbol = (symbolS *) 0;
11327 exp->X_op_symbol = (symbolS *) 0;
11328
11329 i.types[this_operand].bitfield.imm8 = 1;
11330 return 1;
11331}
11332
8325cc63
JB
11333/* Only string instructions can have a second memory operand, so
11334 reduce current_templates to just those if it contains any. */
11335static int
11336maybe_adjust_templates (void)
11337{
11338 const insn_template *t;
11339
11340 gas_assert (i.mem_operands == 1);
11341
11342 for (t = current_templates->start; t < current_templates->end; ++t)
11343 if (t->opcode_modifier.isstring)
11344 break;
11345
11346 if (t < current_templates->end)
11347 {
11348 static templates aux_templates;
5b7c81bd 11349 bool recheck;
8325cc63
JB
11350
11351 aux_templates.start = t;
11352 for (; t < current_templates->end; ++t)
11353 if (!t->opcode_modifier.isstring)
11354 break;
11355 aux_templates.end = t;
11356
11357 /* Determine whether to re-check the first memory operand. */
11358 recheck = (aux_templates.start != current_templates->start
11359 || t != current_templates->end);
11360
11361 current_templates = &aux_templates;
11362
11363 if (recheck)
11364 {
11365 i.mem_operands = 0;
11366 if (i.memop1_string != NULL
11367 && i386_index_check (i.memop1_string) == 0)
11368 return 0;
11369 i.mem_operands = 1;
11370 }
11371 }
11372
11373 return 1;
11374}
11375
9d299bea
JB
11376static INLINE bool starts_memory_operand (char c)
11377{
014fbcda 11378 return ISDIGIT (c)
9d299bea 11379 || is_identifier_char (c)
014fbcda 11380 || strchr ("([\"+-!~", c);
9d299bea
JB
11381}
11382
fc0763e6 11383/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 11384 on error. */
252b5132 11385
252b5132 11386static int
a7619375 11387i386_att_operand (char *operand_string)
252b5132 11388{
af6bdddf
AM
11389 const reg_entry *r;
11390 char *end_op;
24eab124 11391 char *op_string = operand_string;
252b5132 11392
24eab124 11393 if (is_space_char (*op_string))
252b5132
RH
11394 ++op_string;
11395
24eab124 11396 /* We check for an absolute prefix (differentiating,
47926f60 11397 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
11398 if (*op_string == ABSOLUTE_PREFIX)
11399 {
11400 ++op_string;
11401 if (is_space_char (*op_string))
11402 ++op_string;
5b7c81bd 11403 i.jumpabsolute = true;
24eab124 11404 }
252b5132 11405
47926f60 11406 /* Check if operand is a register. */
4d1bb795 11407 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 11408 {
40fb9820
L
11409 i386_operand_type temp;
11410
8a6fb3f9
JB
11411 if (r == &bad_reg)
11412 return 0;
11413
24eab124
AM
11414 /* Check for a segment override by searching for ':' after a
11415 segment register. */
11416 op_string = end_op;
11417 if (is_space_char (*op_string))
11418 ++op_string;
00cee14f 11419 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124 11420 {
5e042380 11421 i.seg[i.mem_operands] = r;
252b5132 11422
24eab124 11423 /* Skip the ':' and whitespace. */
252b5132
RH
11424 ++op_string;
11425 if (is_space_char (*op_string))
24eab124 11426 ++op_string;
252b5132 11427
47926f60 11428 /* Handle case of %es:*foo. */
c8d541e2 11429 if (!i.jumpabsolute && *op_string == ABSOLUTE_PREFIX)
24eab124
AM
11430 {
11431 ++op_string;
11432 if (is_space_char (*op_string))
11433 ++op_string;
5b7c81bd 11434 i.jumpabsolute = true;
24eab124 11435 }
c8d541e2 11436
9d299bea 11437 if (!starts_memory_operand (*op_string))
c8d541e2
JB
11438 {
11439 as_bad (_("bad memory operand `%s'"), op_string);
11440 return 0;
11441 }
24eab124
AM
11442 goto do_memory_reference;
11443 }
43234a1e
L
11444
11445 /* Handle vector operations. */
11446 if (*op_string == '{')
11447 {
f70c6814 11448 op_string = check_VecOperations (op_string);
43234a1e
L
11449 if (op_string == NULL)
11450 return 0;
11451 }
11452
24eab124
AM
11453 if (*op_string)
11454 {
d0b47220 11455 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
11456 return 0;
11457 }
40fb9820
L
11458 temp = r->reg_type;
11459 temp.bitfield.baseindex = 0;
c6fb90c8
L
11460 i.types[this_operand] = operand_type_or (i.types[this_operand],
11461 temp);
7d5e4556 11462 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 11463 i.op[this_operand].regs = r;
24eab124
AM
11464 i.reg_operands++;
11465 }
af6bdddf
AM
11466 else if (*op_string == REGISTER_PREFIX)
11467 {
11468 as_bad (_("bad register name `%s'"), op_string);
11469 return 0;
11470 }
24eab124 11471 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 11472 {
24eab124 11473 ++op_string;
6f2f06be 11474 if (i.jumpabsolute)
24eab124 11475 {
d0b47220 11476 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
11477 return 0;
11478 }
11479 if (!i386_immediate (op_string))
11480 return 0;
11481 }
43234a1e
L
11482 else if (RC_SAE_immediate (operand_string))
11483 {
11484 /* If it is a RC or SAE immediate, do nothing. */
11485 ;
11486 }
9d299bea 11487 else if (starts_memory_operand (*op_string))
24eab124 11488 {
47926f60 11489 /* This is a memory reference of some sort. */
af6bdddf 11490 char *base_string;
252b5132 11491
47926f60 11492 /* Start and end of displacement string expression (if found). */
eecb386c
AM
11493 char *displacement_string_start;
11494 char *displacement_string_end;
252b5132 11495
24eab124 11496 do_memory_reference:
8325cc63
JB
11497 if (i.mem_operands == 1 && !maybe_adjust_templates ())
11498 return 0;
24eab124 11499 if ((i.mem_operands == 1
40fb9820 11500 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
11501 || i.mem_operands == 2)
11502 {
11503 as_bad (_("too many memory references for `%s'"),
11504 current_templates->start->name);
11505 return 0;
11506 }
252b5132 11507
24eab124
AM
11508 /* Check for base index form. We detect the base index form by
11509 looking for an ')' at the end of the operand, searching
11510 for the '(' matching it, and finding a REGISTER_PREFIX or ','
11511 after the '('. */
af6bdddf 11512 base_string = op_string + strlen (op_string);
c3332e24 11513
43234a1e 11514 /* Handle vector operations. */
6b5ba0d4
JB
11515 --base_string;
11516 if (is_space_char (*base_string))
11517 --base_string;
11518
11519 if (*base_string == '}')
43234a1e 11520 {
6b5ba0d4
JB
11521 char *vop_start = NULL;
11522
11523 while (base_string-- > op_string)
11524 {
11525 if (*base_string == '"')
11526 break;
11527 if (*base_string != '{')
11528 continue;
11529
11530 vop_start = base_string;
11531
11532 --base_string;
11533 if (is_space_char (*base_string))
11534 --base_string;
11535
11536 if (*base_string != '}')
11537 break;
11538
11539 vop_start = NULL;
11540 }
11541
11542 if (!vop_start)
11543 {
11544 as_bad (_("unbalanced figure braces"));
11545 return 0;
11546 }
11547
f70c6814 11548 if (check_VecOperations (vop_start) == NULL)
43234a1e 11549 return 0;
43234a1e
L
11550 }
11551
47926f60 11552 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
11553 displacement_string_start = op_string;
11554 displacement_string_end = base_string + 1;
252b5132 11555
24eab124
AM
11556 if (*base_string == ')')
11557 {
af6bdddf 11558 char *temp_string;
e68c3d59 11559
24eab124 11560 /* We've already checked that the number of left & right ()'s are
47926f60 11561 equal, so this loop will not be infinite. */
24eab124
AM
11562 do
11563 {
11564 base_string--;
24eab124 11565 }
e68c3d59
JB
11566 while (*base_string != '(' && *base_string != ')'
11567 && *base_string != '"');
c3332e24 11568
af6bdddf 11569 temp_string = base_string;
c3332e24 11570
24eab124 11571 /* Skip past '(' and whitespace. */
e68c3d59
JB
11572 if (*base_string == '(')
11573 ++base_string;
252b5132 11574 if (is_space_char (*base_string))
24eab124 11575 ++base_string;
252b5132 11576
af6bdddf 11577 if (*base_string == ','
4eed87de
AM
11578 || ((i.base_reg = parse_register (base_string, &end_op))
11579 != NULL))
252b5132 11580 {
af6bdddf 11581 displacement_string_end = temp_string;
252b5132 11582
40fb9820 11583 i.types[this_operand].bitfield.baseindex = 1;
252b5132 11584
af6bdddf 11585 if (i.base_reg)
24eab124 11586 {
8a6fb3f9
JB
11587 if (i.base_reg == &bad_reg)
11588 return 0;
24eab124
AM
11589 base_string = end_op;
11590 if (is_space_char (*base_string))
11591 ++base_string;
af6bdddf
AM
11592 }
11593
11594 /* There may be an index reg or scale factor here. */
11595 if (*base_string == ',')
11596 {
11597 ++base_string;
11598 if (is_space_char (*base_string))
11599 ++base_string;
11600
4eed87de
AM
11601 if ((i.index_reg = parse_register (base_string, &end_op))
11602 != NULL)
24eab124 11603 {
8a6fb3f9
JB
11604 if (i.index_reg == &bad_reg)
11605 return 0;
af6bdddf 11606 base_string = end_op;
24eab124
AM
11607 if (is_space_char (*base_string))
11608 ++base_string;
af6bdddf
AM
11609 if (*base_string == ',')
11610 {
11611 ++base_string;
11612 if (is_space_char (*base_string))
11613 ++base_string;
11614 }
e5cb08ac 11615 else if (*base_string != ')')
af6bdddf 11616 {
4eed87de
AM
11617 as_bad (_("expecting `,' or `)' "
11618 "after index register in `%s'"),
af6bdddf
AM
11619 operand_string);
11620 return 0;
11621 }
24eab124 11622 }
af6bdddf 11623 else if (*base_string == REGISTER_PREFIX)
24eab124 11624 {
f76bf5e0
L
11625 end_op = strchr (base_string, ',');
11626 if (end_op)
11627 *end_op = '\0';
af6bdddf 11628 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
11629 return 0;
11630 }
252b5132 11631
47926f60 11632 /* Check for scale factor. */
551c1ca1 11633 if (*base_string != ')')
af6bdddf 11634 {
551c1ca1
AM
11635 char *end_scale = i386_scale (base_string);
11636
11637 if (!end_scale)
af6bdddf 11638 return 0;
24eab124 11639
551c1ca1 11640 base_string = end_scale;
af6bdddf
AM
11641 if (is_space_char (*base_string))
11642 ++base_string;
11643 if (*base_string != ')')
11644 {
4eed87de
AM
11645 as_bad (_("expecting `)' "
11646 "after scale factor in `%s'"),
af6bdddf
AM
11647 operand_string);
11648 return 0;
11649 }
11650 }
11651 else if (!i.index_reg)
24eab124 11652 {
4eed87de
AM
11653 as_bad (_("expecting index register or scale factor "
11654 "after `,'; got '%c'"),
af6bdddf 11655 *base_string);
24eab124
AM
11656 return 0;
11657 }
11658 }
af6bdddf 11659 else if (*base_string != ')')
24eab124 11660 {
4eed87de
AM
11661 as_bad (_("expecting `,' or `)' "
11662 "after base register in `%s'"),
af6bdddf 11663 operand_string);
24eab124
AM
11664 return 0;
11665 }
c3332e24 11666 }
af6bdddf 11667 else if (*base_string == REGISTER_PREFIX)
c3332e24 11668 {
f76bf5e0
L
11669 end_op = strchr (base_string, ',');
11670 if (end_op)
11671 *end_op = '\0';
af6bdddf 11672 as_bad (_("bad register name `%s'"), base_string);
24eab124 11673 return 0;
c3332e24 11674 }
24eab124
AM
11675 }
11676
11677 /* If there's an expression beginning the operand, parse it,
11678 assuming displacement_string_start and
11679 displacement_string_end are meaningful. */
11680 if (displacement_string_start != displacement_string_end)
11681 {
11682 if (!i386_displacement (displacement_string_start,
11683 displacement_string_end))
11684 return 0;
11685 }
11686
11687 /* Special case for (%dx) while doing input/output op. */
11688 if (i.base_reg
75e5731b
JB
11689 && i.base_reg->reg_type.bitfield.instance == RegD
11690 && i.base_reg->reg_type.bitfield.word
24eab124
AM
11691 && i.index_reg == 0
11692 && i.log2_scale_factor == 0
11693 && i.seg[i.mem_operands] == 0
40fb9820 11694 && !operand_type_check (i.types[this_operand], disp))
24eab124 11695 {
2fb5be8d 11696 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
11697 return 1;
11698 }
11699
eecb386c
AM
11700 if (i386_index_check (operand_string) == 0)
11701 return 0;
c48dadc9 11702 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
11703 if (i.mem_operands == 0)
11704 i.memop1_string = xstrdup (operand_string);
24eab124
AM
11705 i.mem_operands++;
11706 }
11707 else
ce8a8b2f
AM
11708 {
11709 /* It's not a memory operand; argh! */
24eab124
AM
11710 as_bad (_("invalid char %s beginning operand %d `%s'"),
11711 output_invalid (*op_string),
11712 this_operand + 1,
11713 op_string);
11714 return 0;
11715 }
47926f60 11716 return 1; /* Normal return. */
252b5132
RH
11717}
11718\f
fa94de6b
RM
11719/* Calculate the maximum variable size (i.e., excluding fr_fix)
11720 that an rs_machine_dependent frag may reach. */
11721
11722unsigned int
11723i386_frag_max_var (fragS *frag)
11724{
11725 /* The only relaxable frags are for jumps.
11726 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
11727 gas_assert (frag->fr_type == rs_machine_dependent);
11728 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
11729}
11730
b084df0b
L
11731#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11732static int
8dcea932 11733elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
11734{
11735 /* STT_GNU_IFUNC symbol must go through PLT. */
11736 if ((symbol_get_bfdsym (fr_symbol)->flags
11737 & BSF_GNU_INDIRECT_FUNCTION) != 0)
11738 return 0;
11739
11740 if (!S_IS_EXTERNAL (fr_symbol))
11741 /* Symbol may be weak or local. */
11742 return !S_IS_WEAK (fr_symbol);
11743
8dcea932
L
11744 /* Global symbols with non-default visibility can't be preempted. */
11745 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
11746 return 1;
11747
11748 if (fr_var != NO_RELOC)
11749 switch ((enum bfd_reloc_code_real) fr_var)
11750 {
11751 case BFD_RELOC_386_PLT32:
11752 case BFD_RELOC_X86_64_PLT32:
33eaf5de 11753 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
11754 return 0;
11755 default:
11756 abort ();
11757 }
11758
b084df0b
L
11759 /* Global symbols with default visibility in a shared library may be
11760 preempted by another definition. */
8dcea932 11761 return !shared;
b084df0b
L
11762}
11763#endif
11764
79d72f45
HL
11765/* Table 3-2. Macro-Fusible Instructions in Haswell Microarchitecture
11766 Note also work for Skylake and Cascadelake.
11767---------------------------------------------------------------------
11768| JCC | ADD/SUB/CMP | INC/DEC | TEST/AND |
11769| ------ | ----------- | ------- | -------- |
11770| Jo | N | N | Y |
11771| Jno | N | N | Y |
11772| Jc/Jb | Y | N | Y |
11773| Jae/Jnb | Y | N | Y |
11774| Je/Jz | Y | Y | Y |
11775| Jne/Jnz | Y | Y | Y |
11776| Jna/Jbe | Y | N | Y |
11777| Ja/Jnbe | Y | N | Y |
11778| Js | N | N | Y |
11779| Jns | N | N | Y |
11780| Jp/Jpe | N | N | Y |
11781| Jnp/Jpo | N | N | Y |
11782| Jl/Jnge | Y | Y | Y |
11783| Jge/Jnl | Y | Y | Y |
11784| Jle/Jng | Y | Y | Y |
11785| Jg/Jnle | Y | Y | Y |
11786--------------------------------------------------------------------- */
11787static int
11788i386_macro_fusible_p (enum mf_cmp_kind mf_cmp, enum mf_jcc_kind mf_jcc)
11789{
11790 if (mf_cmp == mf_cmp_alu_cmp)
11791 return ((mf_jcc >= mf_jcc_jc && mf_jcc <= mf_jcc_jna)
11792 || mf_jcc == mf_jcc_jl || mf_jcc == mf_jcc_jle);
11793 if (mf_cmp == mf_cmp_incdec)
11794 return (mf_jcc == mf_jcc_je || mf_jcc == mf_jcc_jl
11795 || mf_jcc == mf_jcc_jle);
11796 if (mf_cmp == mf_cmp_test_and)
11797 return 1;
11798 return 0;
11799}
11800
e379e5f3
L
11801/* Return the next non-empty frag. */
11802
11803static fragS *
11804i386_next_non_empty_frag (fragS *fragP)
11805{
11806 /* There may be a frag with a ".fill 0" when there is no room in
11807 the current frag for frag_grow in output_insn. */
11808 for (fragP = fragP->fr_next;
11809 (fragP != NULL
11810 && fragP->fr_type == rs_fill
11811 && fragP->fr_fix == 0);
11812 fragP = fragP->fr_next)
11813 ;
11814 return fragP;
11815}
11816
11817/* Return the next jcc frag after BRANCH_PADDING. */
11818
11819static fragS *
79d72f45 11820i386_next_fusible_jcc_frag (fragS *maybe_cmp_fragP, fragS *pad_fragP)
e379e5f3 11821{
79d72f45
HL
11822 fragS *branch_fragP;
11823 if (!pad_fragP)
e379e5f3
L
11824 return NULL;
11825
79d72f45
HL
11826 if (pad_fragP->fr_type == rs_machine_dependent
11827 && (TYPE_FROM_RELAX_STATE (pad_fragP->fr_subtype)
e379e5f3
L
11828 == BRANCH_PADDING))
11829 {
79d72f45
HL
11830 branch_fragP = i386_next_non_empty_frag (pad_fragP);
11831 if (branch_fragP->fr_type != rs_machine_dependent)
e379e5f3 11832 return NULL;
79d72f45
HL
11833 if (TYPE_FROM_RELAX_STATE (branch_fragP->fr_subtype) == COND_JUMP
11834 && i386_macro_fusible_p (maybe_cmp_fragP->tc_frag_data.mf_type,
11835 pad_fragP->tc_frag_data.mf_type))
11836 return branch_fragP;
e379e5f3
L
11837 }
11838
11839 return NULL;
11840}
11841
11842/* Classify BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags. */
11843
11844static void
11845i386_classify_machine_dependent_frag (fragS *fragP)
11846{
11847 fragS *cmp_fragP;
11848 fragS *pad_fragP;
11849 fragS *branch_fragP;
11850 fragS *next_fragP;
11851 unsigned int max_prefix_length;
11852
11853 if (fragP->tc_frag_data.classified)
11854 return;
11855
11856 /* First scan for BRANCH_PADDING and FUSED_JCC_PADDING. Convert
11857 FUSED_JCC_PADDING and merge BRANCH_PADDING. */
11858 for (next_fragP = fragP;
11859 next_fragP != NULL;
11860 next_fragP = next_fragP->fr_next)
11861 {
11862 next_fragP->tc_frag_data.classified = 1;
11863 if (next_fragP->fr_type == rs_machine_dependent)
11864 switch (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype))
11865 {
11866 case BRANCH_PADDING:
11867 /* The BRANCH_PADDING frag must be followed by a branch
11868 frag. */
11869 branch_fragP = i386_next_non_empty_frag (next_fragP);
11870 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11871 break;
11872 case FUSED_JCC_PADDING:
11873 /* Check if this is a fused jcc:
11874 FUSED_JCC_PADDING
11875 CMP like instruction
11876 BRANCH_PADDING
11877 COND_JUMP
11878 */
11879 cmp_fragP = i386_next_non_empty_frag (next_fragP);
11880 pad_fragP = i386_next_non_empty_frag (cmp_fragP);
79d72f45 11881 branch_fragP = i386_next_fusible_jcc_frag (next_fragP, pad_fragP);
e379e5f3
L
11882 if (branch_fragP)
11883 {
11884 /* The BRANCH_PADDING frag is merged with the
11885 FUSED_JCC_PADDING frag. */
11886 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11887 /* CMP like instruction size. */
11888 next_fragP->tc_frag_data.cmp_size = cmp_fragP->fr_fix;
11889 frag_wane (pad_fragP);
11890 /* Skip to branch_fragP. */
11891 next_fragP = branch_fragP;
11892 }
11893 else if (next_fragP->tc_frag_data.max_prefix_length)
11894 {
11895 /* Turn FUSED_JCC_PADDING into BRANCH_PREFIX if it isn't
11896 a fused jcc. */
11897 next_fragP->fr_subtype
11898 = ENCODE_RELAX_STATE (BRANCH_PREFIX, 0);
11899 next_fragP->tc_frag_data.max_bytes
11900 = next_fragP->tc_frag_data.max_prefix_length;
11901 /* This will be updated in the BRANCH_PREFIX scan. */
11902 next_fragP->tc_frag_data.max_prefix_length = 0;
11903 }
11904 else
11905 frag_wane (next_fragP);
11906 break;
11907 }
11908 }
11909
11910 /* Stop if there is no BRANCH_PREFIX. */
11911 if (!align_branch_prefix_size)
11912 return;
11913
11914 /* Scan for BRANCH_PREFIX. */
11915 for (; fragP != NULL; fragP = fragP->fr_next)
11916 {
11917 if (fragP->fr_type != rs_machine_dependent
11918 || (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11919 != BRANCH_PREFIX))
11920 continue;
11921
11922 /* Count all BRANCH_PREFIX frags before BRANCH_PADDING and
11923 COND_JUMP_PREFIX. */
11924 max_prefix_length = 0;
11925 for (next_fragP = fragP;
11926 next_fragP != NULL;
11927 next_fragP = next_fragP->fr_next)
11928 {
11929 if (next_fragP->fr_type == rs_fill)
11930 /* Skip rs_fill frags. */
11931 continue;
11932 else if (next_fragP->fr_type != rs_machine_dependent)
11933 /* Stop for all other frags. */
11934 break;
11935
11936 /* rs_machine_dependent frags. */
11937 if (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11938 == BRANCH_PREFIX)
11939 {
11940 /* Count BRANCH_PREFIX frags. */
11941 if (max_prefix_length >= MAX_FUSED_JCC_PADDING_SIZE)
11942 {
11943 max_prefix_length = MAX_FUSED_JCC_PADDING_SIZE;
11944 frag_wane (next_fragP);
11945 }
11946 else
11947 max_prefix_length
11948 += next_fragP->tc_frag_data.max_bytes;
11949 }
11950 else if ((TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11951 == BRANCH_PADDING)
11952 || (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11953 == FUSED_JCC_PADDING))
11954 {
11955 /* Stop at BRANCH_PADDING and FUSED_JCC_PADDING. */
11956 fragP->tc_frag_data.u.padding_fragP = next_fragP;
11957 break;
11958 }
11959 else
11960 /* Stop for other rs_machine_dependent frags. */
11961 break;
11962 }
11963
11964 fragP->tc_frag_data.max_prefix_length = max_prefix_length;
11965
11966 /* Skip to the next frag. */
11967 fragP = next_fragP;
11968 }
11969}
11970
11971/* Compute padding size for
11972
11973 FUSED_JCC_PADDING
11974 CMP like instruction
11975 BRANCH_PADDING
11976 COND_JUMP/UNCOND_JUMP
11977
11978 or
11979
11980 BRANCH_PADDING
11981 COND_JUMP/UNCOND_JUMP
11982 */
11983
11984static int
11985i386_branch_padding_size (fragS *fragP, offsetT address)
11986{
11987 unsigned int offset, size, padding_size;
11988 fragS *branch_fragP = fragP->tc_frag_data.u.branch_fragP;
11989
11990 /* The start address of the BRANCH_PADDING or FUSED_JCC_PADDING frag. */
11991 if (!address)
11992 address = fragP->fr_address;
11993 address += fragP->fr_fix;
11994
11995 /* CMP like instrunction size. */
11996 size = fragP->tc_frag_data.cmp_size;
11997
11998 /* The base size of the branch frag. */
11999 size += branch_fragP->fr_fix;
12000
12001 /* Add opcode and displacement bytes for the rs_machine_dependent
12002 branch frag. */
12003 if (branch_fragP->fr_type == rs_machine_dependent)
12004 size += md_relax_table[branch_fragP->fr_subtype].rlx_length;
12005
12006 /* Check if branch is within boundary and doesn't end at the last
12007 byte. */
12008 offset = address & ((1U << align_branch_power) - 1);
12009 if ((offset + size) >= (1U << align_branch_power))
12010 /* Padding needed to avoid crossing boundary. */
12011 padding_size = (1U << align_branch_power) - offset;
12012 else
12013 /* No padding needed. */
12014 padding_size = 0;
12015
12016 /* The return value may be saved in tc_frag_data.length which is
12017 unsigned byte. */
12018 if (!fits_in_unsigned_byte (padding_size))
12019 abort ();
12020
12021 return padding_size;
12022}
12023
12024/* i386_generic_table_relax_frag()
12025
12026 Handle BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags to
12027 grow/shrink padding to align branch frags. Hand others to
12028 relax_frag(). */
12029
12030long
12031i386_generic_table_relax_frag (segT segment, fragS *fragP, long stretch)
12032{
12033 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12034 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
12035 {
12036 long padding_size = i386_branch_padding_size (fragP, 0);
12037 long grow = padding_size - fragP->tc_frag_data.length;
12038
12039 /* When the BRANCH_PREFIX frag is used, the computed address
12040 must match the actual address and there should be no padding. */
12041 if (fragP->tc_frag_data.padding_address
12042 && (fragP->tc_frag_data.padding_address != fragP->fr_address
12043 || padding_size))
12044 abort ();
12045
12046 /* Update the padding size. */
12047 if (grow)
12048 fragP->tc_frag_data.length = padding_size;
12049
12050 return grow;
12051 }
12052 else if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12053 {
12054 fragS *padding_fragP, *next_fragP;
12055 long padding_size, left_size, last_size;
12056
12057 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
12058 if (!padding_fragP)
12059 /* Use the padding set by the leading BRANCH_PREFIX frag. */
12060 return (fragP->tc_frag_data.length
12061 - fragP->tc_frag_data.last_length);
12062
12063 /* Compute the relative address of the padding frag in the very
12064 first time where the BRANCH_PREFIX frag sizes are zero. */
12065 if (!fragP->tc_frag_data.padding_address)
12066 fragP->tc_frag_data.padding_address
12067 = padding_fragP->fr_address - (fragP->fr_address - stretch);
12068
12069 /* First update the last length from the previous interation. */
12070 left_size = fragP->tc_frag_data.prefix_length;
12071 for (next_fragP = fragP;
12072 next_fragP != padding_fragP;
12073 next_fragP = next_fragP->fr_next)
12074 if (next_fragP->fr_type == rs_machine_dependent
12075 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
12076 == BRANCH_PREFIX))
12077 {
12078 if (left_size)
12079 {
12080 int max = next_fragP->tc_frag_data.max_bytes;
12081 if (max)
12082 {
12083 int size;
12084 if (max > left_size)
12085 size = left_size;
12086 else
12087 size = max;
12088 left_size -= size;
12089 next_fragP->tc_frag_data.last_length = size;
12090 }
12091 }
12092 else
12093 next_fragP->tc_frag_data.last_length = 0;
12094 }
12095
12096 /* Check the padding size for the padding frag. */
12097 padding_size = i386_branch_padding_size
12098 (padding_fragP, (fragP->fr_address
12099 + fragP->tc_frag_data.padding_address));
12100
12101 last_size = fragP->tc_frag_data.prefix_length;
12102 /* Check if there is change from the last interation. */
12103 if (padding_size == last_size)
12104 {
12105 /* Update the expected address of the padding frag. */
12106 padding_fragP->tc_frag_data.padding_address
12107 = (fragP->fr_address + padding_size
12108 + fragP->tc_frag_data.padding_address);
12109 return 0;
12110 }
12111
12112 if (padding_size > fragP->tc_frag_data.max_prefix_length)
12113 {
12114 /* No padding if there is no sufficient room. Clear the
12115 expected address of the padding frag. */
12116 padding_fragP->tc_frag_data.padding_address = 0;
12117 padding_size = 0;
12118 }
12119 else
12120 /* Store the expected address of the padding frag. */
12121 padding_fragP->tc_frag_data.padding_address
12122 = (fragP->fr_address + padding_size
12123 + fragP->tc_frag_data.padding_address);
12124
12125 fragP->tc_frag_data.prefix_length = padding_size;
12126
12127 /* Update the length for the current interation. */
12128 left_size = padding_size;
12129 for (next_fragP = fragP;
12130 next_fragP != padding_fragP;
12131 next_fragP = next_fragP->fr_next)
12132 if (next_fragP->fr_type == rs_machine_dependent
12133 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
12134 == BRANCH_PREFIX))
12135 {
12136 if (left_size)
12137 {
12138 int max = next_fragP->tc_frag_data.max_bytes;
12139 if (max)
12140 {
12141 int size;
12142 if (max > left_size)
12143 size = left_size;
12144 else
12145 size = max;
12146 left_size -= size;
12147 next_fragP->tc_frag_data.length = size;
12148 }
12149 }
12150 else
12151 next_fragP->tc_frag_data.length = 0;
12152 }
12153
12154 return (fragP->tc_frag_data.length
12155 - fragP->tc_frag_data.last_length);
12156 }
12157 return relax_frag (segment, fragP, stretch);
12158}
12159
ee7fcc42
AM
12160/* md_estimate_size_before_relax()
12161
12162 Called just before relax() for rs_machine_dependent frags. The x86
12163 assembler uses these frags to handle variable size jump
12164 instructions.
12165
12166 Any symbol that is now undefined will not become defined.
12167 Return the correct fr_subtype in the frag.
12168 Return the initial "guess for variable size of frag" to caller.
12169 The guess is actually the growth beyond the fixed part. Whatever
12170 we do to grow the fixed or variable part contributes to our
12171 returned value. */
12172
252b5132 12173int
7016a5d5 12174md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 12175{
e379e5f3
L
12176 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12177 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX
12178 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
12179 {
12180 i386_classify_machine_dependent_frag (fragP);
12181 return fragP->tc_frag_data.length;
12182 }
12183
252b5132 12184 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
12185 check for un-relaxable symbols. On an ELF system, we can't relax
12186 an externally visible symbol, because it may be overridden by a
12187 shared library. */
12188 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 12189#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12190 || (IS_ELF
8dcea932
L
12191 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
12192 fragP->fr_var))
fbeb56a4
DK
12193#endif
12194#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 12195 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 12196 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
12197#endif
12198 )
252b5132 12199 {
b98ef147
AM
12200 /* Symbol is undefined in this segment, or we need to keep a
12201 reloc so that weak symbols can be overridden. */
12202 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 12203 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
12204 unsigned char *opcode;
12205 int old_fr_fix;
eb19308f 12206 fixS *fixP = NULL;
f6af82bd 12207
ee7fcc42 12208 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 12209 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 12210 else if (size == 2)
f6af82bd 12211 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
12212#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12213 else if (need_plt32_p (fragP->fr_symbol))
12214 reloc_type = BFD_RELOC_X86_64_PLT32;
12215#endif
f6af82bd
AM
12216 else
12217 reloc_type = BFD_RELOC_32_PCREL;
252b5132 12218
ee7fcc42
AM
12219 old_fr_fix = fragP->fr_fix;
12220 opcode = (unsigned char *) fragP->fr_opcode;
12221
fddf5b5b 12222 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 12223 {
fddf5b5b
AM
12224 case UNCOND_JUMP:
12225 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 12226 opcode[0] = 0xe9;
252b5132 12227 fragP->fr_fix += size;
eb19308f
JB
12228 fixP = fix_new (fragP, old_fr_fix, size,
12229 fragP->fr_symbol,
12230 fragP->fr_offset, 1,
12231 reloc_type);
252b5132
RH
12232 break;
12233
fddf5b5b 12234 case COND_JUMP86:
412167cb
AM
12235 if (size == 2
12236 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
12237 {
12238 /* Negate the condition, and branch past an
12239 unconditional jump. */
12240 opcode[0] ^= 1;
12241 opcode[1] = 3;
12242 /* Insert an unconditional jump. */
12243 opcode[2] = 0xe9;
12244 /* We added two extra opcode bytes, and have a two byte
12245 offset. */
12246 fragP->fr_fix += 2 + 2;
062cd5e7
AS
12247 fix_new (fragP, old_fr_fix + 2, 2,
12248 fragP->fr_symbol,
12249 fragP->fr_offset, 1,
12250 reloc_type);
fddf5b5b
AM
12251 break;
12252 }
12253 /* Fall through. */
12254
12255 case COND_JUMP:
412167cb
AM
12256 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
12257 {
12258 fragP->fr_fix += 1;
3e02c1cc
AM
12259 fixP = fix_new (fragP, old_fr_fix, 1,
12260 fragP->fr_symbol,
12261 fragP->fr_offset, 1,
12262 BFD_RELOC_8_PCREL);
12263 fixP->fx_signed = 1;
412167cb
AM
12264 break;
12265 }
93c2a809 12266
24eab124 12267 /* This changes the byte-displacement jump 0x7N
fddf5b5b 12268 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 12269 opcode[1] = opcode[0] + 0x10;
f6af82bd 12270 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
12271 /* We've added an opcode byte. */
12272 fragP->fr_fix += 1 + size;
eb19308f
JB
12273 fixP = fix_new (fragP, old_fr_fix + 1, size,
12274 fragP->fr_symbol,
12275 fragP->fr_offset, 1,
12276 reloc_type);
252b5132 12277 break;
fddf5b5b
AM
12278
12279 default:
12280 BAD_CASE (fragP->fr_subtype);
12281 break;
252b5132 12282 }
eb19308f
JB
12283
12284 /* All jumps handled here are signed, but don't unconditionally use a
12285 signed limit check for 32 and 16 bit jumps as we want to allow wrap
12286 around at 4G (outside of 64-bit mode) and 64k. */
12287 if (size == 4 && flag_code == CODE_64BIT)
12288 fixP->fx_signed = 1;
12289
252b5132 12290 frag_wane (fragP);
ee7fcc42 12291 return fragP->fr_fix - old_fr_fix;
252b5132 12292 }
93c2a809 12293
93c2a809
AM
12294 /* Guess size depending on current relax state. Initially the relax
12295 state will correspond to a short jump and we return 1, because
12296 the variable part of the frag (the branch offset) is one byte
12297 long. However, we can relax a section more than once and in that
12298 case we must either set fr_subtype back to the unrelaxed state,
12299 or return the value for the appropriate branch. */
12300 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
12301}
12302
47926f60
KH
12303/* Called after relax() is finished.
12304
12305 In: Address of frag.
12306 fr_type == rs_machine_dependent.
12307 fr_subtype is what the address relaxed to.
12308
12309 Out: Any fixSs and constants are set up.
12310 Caller will turn frag into a ".space 0". */
12311
252b5132 12312void
7016a5d5
TG
12313md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
12314 fragS *fragP)
252b5132 12315{
29b0f896 12316 unsigned char *opcode;
252b5132 12317 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
12318 offsetT target_address;
12319 offsetT opcode_address;
252b5132 12320 unsigned int extension = 0;
847f7ad4 12321 offsetT displacement_from_opcode_start;
252b5132 12322
e379e5f3
L
12323 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12324 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING
12325 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12326 {
12327 /* Generate nop padding. */
12328 unsigned int size = fragP->tc_frag_data.length;
12329 if (size)
12330 {
12331 if (size > fragP->tc_frag_data.max_bytes)
12332 abort ();
12333
12334 if (flag_debug)
12335 {
12336 const char *msg;
12337 const char *branch = "branch";
12338 const char *prefix = "";
12339 fragS *padding_fragP;
12340 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
12341 == BRANCH_PREFIX)
12342 {
12343 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
12344 switch (fragP->tc_frag_data.default_prefix)
12345 {
12346 default:
12347 abort ();
12348 break;
12349 case CS_PREFIX_OPCODE:
12350 prefix = " cs";
12351 break;
12352 case DS_PREFIX_OPCODE:
12353 prefix = " ds";
12354 break;
12355 case ES_PREFIX_OPCODE:
12356 prefix = " es";
12357 break;
12358 case FS_PREFIX_OPCODE:
12359 prefix = " fs";
12360 break;
12361 case GS_PREFIX_OPCODE:
12362 prefix = " gs";
12363 break;
12364 case SS_PREFIX_OPCODE:
12365 prefix = " ss";
12366 break;
12367 }
12368 if (padding_fragP)
12369 msg = _("%s:%u: add %d%s at 0x%llx to align "
12370 "%s within %d-byte boundary\n");
12371 else
12372 msg = _("%s:%u: add additional %d%s at 0x%llx to "
12373 "align %s within %d-byte boundary\n");
12374 }
12375 else
12376 {
12377 padding_fragP = fragP;
12378 msg = _("%s:%u: add %d%s-byte nop at 0x%llx to align "
12379 "%s within %d-byte boundary\n");
12380 }
12381
12382 if (padding_fragP)
12383 switch (padding_fragP->tc_frag_data.branch_type)
12384 {
12385 case align_branch_jcc:
12386 branch = "jcc";
12387 break;
12388 case align_branch_fused:
12389 branch = "fused jcc";
12390 break;
12391 case align_branch_jmp:
12392 branch = "jmp";
12393 break;
12394 case align_branch_call:
12395 branch = "call";
12396 break;
12397 case align_branch_indirect:
12398 branch = "indiret branch";
12399 break;
12400 case align_branch_ret:
12401 branch = "ret";
12402 break;
12403 default:
12404 break;
12405 }
12406
12407 fprintf (stdout, msg,
12408 fragP->fr_file, fragP->fr_line, size, prefix,
12409 (long long) fragP->fr_address, branch,
12410 1 << align_branch_power);
12411 }
12412 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12413 memset (fragP->fr_opcode,
12414 fragP->tc_frag_data.default_prefix, size);
12415 else
12416 i386_generate_nops (fragP, (char *) fragP->fr_opcode,
12417 size, 0);
12418 fragP->fr_fix += size;
12419 }
12420 return;
12421 }
12422
252b5132
RH
12423 opcode = (unsigned char *) fragP->fr_opcode;
12424
47926f60 12425 /* Address we want to reach in file space. */
252b5132 12426 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 12427
47926f60 12428 /* Address opcode resides at in file space. */
252b5132
RH
12429 opcode_address = fragP->fr_address + fragP->fr_fix;
12430
47926f60 12431 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
12432 displacement_from_opcode_start = target_address - opcode_address;
12433
fddf5b5b 12434 if ((fragP->fr_subtype & BIG) == 0)
252b5132 12435 {
47926f60
KH
12436 /* Don't have to change opcode. */
12437 extension = 1; /* 1 opcode + 1 displacement */
252b5132 12438 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
12439 }
12440 else
12441 {
12442 if (no_cond_jump_promotion
12443 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
12444 as_warn_where (fragP->fr_file, fragP->fr_line,
12445 _("long jump required"));
252b5132 12446
fddf5b5b
AM
12447 switch (fragP->fr_subtype)
12448 {
12449 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
12450 extension = 4; /* 1 opcode + 4 displacement */
12451 opcode[0] = 0xe9;
12452 where_to_put_displacement = &opcode[1];
12453 break;
252b5132 12454
fddf5b5b
AM
12455 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
12456 extension = 2; /* 1 opcode + 2 displacement */
12457 opcode[0] = 0xe9;
12458 where_to_put_displacement = &opcode[1];
12459 break;
252b5132 12460
fddf5b5b
AM
12461 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
12462 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
12463 extension = 5; /* 2 opcode + 4 displacement */
12464 opcode[1] = opcode[0] + 0x10;
12465 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12466 where_to_put_displacement = &opcode[2];
12467 break;
252b5132 12468
fddf5b5b
AM
12469 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
12470 extension = 3; /* 2 opcode + 2 displacement */
12471 opcode[1] = opcode[0] + 0x10;
12472 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12473 where_to_put_displacement = &opcode[2];
12474 break;
252b5132 12475
fddf5b5b
AM
12476 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
12477 extension = 4;
12478 opcode[0] ^= 1;
12479 opcode[1] = 3;
12480 opcode[2] = 0xe9;
12481 where_to_put_displacement = &opcode[3];
12482 break;
12483
12484 default:
12485 BAD_CASE (fragP->fr_subtype);
12486 break;
12487 }
252b5132 12488 }
fddf5b5b 12489
7b81dfbb
AJ
12490 /* If size if less then four we are sure that the operand fits,
12491 but if it's 4, then it could be that the displacement is larger
12492 then -/+ 2GB. */
12493 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
12494 && object_64bit
12495 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
12496 + ((addressT) 1 << 31))
12497 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
12498 {
12499 as_bad_where (fragP->fr_file, fragP->fr_line,
12500 _("jump target out of range"));
12501 /* Make us emit 0. */
12502 displacement_from_opcode_start = extension;
12503 }
47926f60 12504 /* Now put displacement after opcode. */
252b5132
RH
12505 md_number_to_chars ((char *) where_to_put_displacement,
12506 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 12507 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
12508 fragP->fr_fix += extension;
12509}
12510\f
7016a5d5 12511/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
12512 by our caller that we have all the info we need to fix it up.
12513
7016a5d5
TG
12514 Parameter valP is the pointer to the value of the bits.
12515
252b5132
RH
12516 On the 386, immediates, displacements, and data pointers are all in
12517 the same (little-endian) format, so we don't need to care about which
12518 we are handling. */
12519
94f592af 12520void
7016a5d5 12521md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 12522{
94f592af 12523 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 12524 valueT value = *valP;
252b5132 12525
f86103b7 12526#if !defined (TE_Mach)
93382f6d
AM
12527 if (fixP->fx_pcrel)
12528 {
12529 switch (fixP->fx_r_type)
12530 {
5865bb77
ILT
12531 default:
12532 break;
12533
d6ab8113
JB
12534 case BFD_RELOC_64:
12535 fixP->fx_r_type = BFD_RELOC_64_PCREL;
12536 break;
93382f6d 12537 case BFD_RELOC_32:
ae8887b5 12538 case BFD_RELOC_X86_64_32S:
93382f6d
AM
12539 fixP->fx_r_type = BFD_RELOC_32_PCREL;
12540 break;
12541 case BFD_RELOC_16:
12542 fixP->fx_r_type = BFD_RELOC_16_PCREL;
12543 break;
12544 case BFD_RELOC_8:
12545 fixP->fx_r_type = BFD_RELOC_8_PCREL;
12546 break;
12547 }
12548 }
252b5132 12549
a161fe53 12550 if (fixP->fx_addsy != NULL
31312f95 12551 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 12552 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 12553 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 12554 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 12555 && !use_rela_relocations)
252b5132 12556 {
31312f95
AM
12557 /* This is a hack. There should be a better way to handle this.
12558 This covers for the fact that bfd_install_relocation will
12559 subtract the current location (for partial_inplace, PC relative
12560 relocations); see more below. */
252b5132 12561#ifndef OBJ_AOUT
718ddfc0 12562 if (IS_ELF
252b5132
RH
12563#ifdef TE_PE
12564 || OUTPUT_FLAVOR == bfd_target_coff_flavour
12565#endif
12566 )
12567 value += fixP->fx_where + fixP->fx_frag->fr_address;
12568#endif
12569#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12570 if (IS_ELF)
252b5132 12571 {
6539b54b 12572 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 12573
6539b54b 12574 if ((sym_seg == seg
2f66722d 12575 || (symbol_section_p (fixP->fx_addsy)
6539b54b 12576 && sym_seg != absolute_section))
af65af87 12577 && !generic_force_reloc (fixP))
2f66722d
AM
12578 {
12579 /* Yes, we add the values in twice. This is because
6539b54b
AM
12580 bfd_install_relocation subtracts them out again. I think
12581 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
12582 it. FIXME. */
12583 value += fixP->fx_where + fixP->fx_frag->fr_address;
12584 }
252b5132
RH
12585 }
12586#endif
12587#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
12588 /* For some reason, the PE format does not store a
12589 section address offset for a PC relative symbol. */
12590 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 12591 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
12592 value += md_pcrel_from (fixP);
12593#endif
12594 }
fbeb56a4 12595#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
12596 if (fixP->fx_addsy != NULL
12597 && S_IS_WEAK (fixP->fx_addsy)
12598 /* PR 16858: Do not modify weak function references. */
12599 && ! fixP->fx_pcrel)
fbeb56a4 12600 {
296a8689
NC
12601#if !defined (TE_PEP)
12602 /* For x86 PE weak function symbols are neither PC-relative
12603 nor do they set S_IS_FUNCTION. So the only reliable way
12604 to detect them is to check the flags of their containing
12605 section. */
12606 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
12607 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
12608 ;
12609 else
12610#endif
fbeb56a4
DK
12611 value -= S_GET_VALUE (fixP->fx_addsy);
12612 }
12613#endif
252b5132
RH
12614
12615 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 12616 and we must not disappoint it. */
252b5132 12617#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12618 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
12619 switch (fixP->fx_r_type)
12620 {
12621 case BFD_RELOC_386_PLT32:
3e73aa7c 12622 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
12623 /* Make the jump instruction point to the address of the operand.
12624 At runtime we merely add the offset to the actual PLT entry.
12625 NB: Subtract the offset size only for jump instructions. */
12626 if (fixP->fx_pcrel)
12627 value = -4;
47926f60 12628 break;
31312f95 12629
13ae64f3
JJ
12630 case BFD_RELOC_386_TLS_GD:
12631 case BFD_RELOC_386_TLS_LDM:
13ae64f3 12632 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
12633 case BFD_RELOC_386_TLS_IE:
12634 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 12635 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
12636 case BFD_RELOC_X86_64_TLSGD:
12637 case BFD_RELOC_X86_64_TLSLD:
12638 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 12639 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
12640 value = 0; /* Fully resolved at runtime. No addend. */
12641 /* Fallthrough */
12642 case BFD_RELOC_386_TLS_LE:
12643 case BFD_RELOC_386_TLS_LDO_32:
12644 case BFD_RELOC_386_TLS_LE_32:
12645 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 12646 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 12647 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 12648 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
12649 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12650 break;
12651
67a4f2b7
AO
12652 case BFD_RELOC_386_TLS_DESC_CALL:
12653 case BFD_RELOC_X86_64_TLSDESC_CALL:
12654 value = 0; /* Fully resolved at runtime. No addend. */
12655 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12656 fixP->fx_done = 0;
12657 return;
12658
47926f60
KH
12659 case BFD_RELOC_VTABLE_INHERIT:
12660 case BFD_RELOC_VTABLE_ENTRY:
12661 fixP->fx_done = 0;
94f592af 12662 return;
47926f60
KH
12663
12664 default:
12665 break;
12666 }
12667#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
a442cac5
JB
12668
12669 /* If not 64bit, massage value, to account for wraparound when !BFD64. */
12670 if (!object_64bit)
12671 value = extend_to_32bit_address (value);
12672
c6682705 12673 *valP = value;
f86103b7 12674#endif /* !defined (TE_Mach) */
3e73aa7c 12675
3e73aa7c 12676 /* Are we finished with this relocation now? */
c6682705 12677 if (fixP->fx_addsy == NULL)
b8188555
JB
12678 {
12679 fixP->fx_done = 1;
12680 switch (fixP->fx_r_type)
12681 {
12682 case BFD_RELOC_X86_64_32S:
12683 fixP->fx_signed = 1;
12684 break;
12685
12686 default:
12687 break;
12688 }
12689 }
fbeb56a4
DK
12690#if defined (OBJ_COFF) && defined (TE_PE)
12691 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
12692 {
12693 fixP->fx_done = 0;
12694 /* Remember value for tc_gen_reloc. */
12695 fixP->fx_addnumber = value;
12696 /* Clear out the frag for now. */
12697 value = 0;
12698 }
12699#endif
3e73aa7c
JH
12700 else if (use_rela_relocations)
12701 {
12702 fixP->fx_no_overflow = 1;
062cd5e7
AS
12703 /* Remember value for tc_gen_reloc. */
12704 fixP->fx_addnumber = value;
3e73aa7c
JH
12705 value = 0;
12706 }
f86103b7 12707
94f592af 12708 md_number_to_chars (p, value, fixP->fx_size);
252b5132 12709}
252b5132 12710\f
6d4af3c2 12711const char *
499ac353 12712md_atof (int type, char *litP, int *sizeP)
252b5132 12713{
499ac353
NC
12714 /* This outputs the LITTLENUMs in REVERSE order;
12715 in accord with the bigendian 386. */
5b7c81bd 12716 return ieee_md_atof (type, litP, sizeP, false);
252b5132
RH
12717}
12718\f
2d545b82 12719static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 12720
252b5132 12721static char *
e3bb37b5 12722output_invalid (int c)
252b5132 12723{
3882b010 12724 if (ISPRINT (c))
f9f21a03
L
12725 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
12726 "'%c'", c);
252b5132 12727 else
f9f21a03 12728 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 12729 "(0x%x)", (unsigned char) c);
252b5132
RH
12730 return output_invalid_buf;
12731}
12732
8a6fb3f9
JB
12733/* Verify that @r can be used in the current context. */
12734
5b7c81bd 12735static bool check_register (const reg_entry *r)
8a6fb3f9
JB
12736{
12737 if (allow_pseudo_reg)
5b7c81bd 12738 return true;
8a6fb3f9
JB
12739
12740 if (operand_type_all_zero (&r->reg_type))
5b7c81bd 12741 return false;
8a6fb3f9
JB
12742
12743 if ((r->reg_type.bitfield.dword
12744 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
12745 || r->reg_type.bitfield.class == RegCR
22e00a3f 12746 || r->reg_type.bitfield.class == RegDR)
8a6fb3f9 12747 && !cpu_arch_flags.bitfield.cpui386)
5b7c81bd 12748 return false;
8a6fb3f9 12749
22e00a3f
JB
12750 if (r->reg_type.bitfield.class == RegTR
12751 && (flag_code == CODE_64BIT
12752 || !cpu_arch_flags.bitfield.cpui386
12753 || cpu_arch_isa_flags.bitfield.cpui586
12754 || cpu_arch_isa_flags.bitfield.cpui686))
5b7c81bd 12755 return false;
22e00a3f 12756
8a6fb3f9 12757 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
5b7c81bd 12758 return false;
8a6fb3f9
JB
12759
12760 if (!cpu_arch_flags.bitfield.cpuavx512f)
12761 {
12762 if (r->reg_type.bitfield.zmmword
12763 || r->reg_type.bitfield.class == RegMask)
5b7c81bd 12764 return false;
8a6fb3f9
JB
12765
12766 if (!cpu_arch_flags.bitfield.cpuavx)
12767 {
12768 if (r->reg_type.bitfield.ymmword)
5b7c81bd 12769 return false;
8a6fb3f9
JB
12770
12771 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
5b7c81bd 12772 return false;
8a6fb3f9
JB
12773 }
12774 }
12775
260cd341
LC
12776 if (r->reg_type.bitfield.tmmword
12777 && (!cpu_arch_flags.bitfield.cpuamx_tile
12778 || flag_code != CODE_64BIT))
5b7c81bd 12779 return false;
260cd341 12780
8a6fb3f9 12781 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
5b7c81bd 12782 return false;
8a6fb3f9
JB
12783
12784 /* Don't allow fake index register unless allow_index_reg isn't 0. */
12785 if (!allow_index_reg && r->reg_num == RegIZ)
5b7c81bd 12786 return false;
8a6fb3f9
JB
12787
12788 /* Upper 16 vector registers are only available with VREX in 64bit
12789 mode, and require EVEX encoding. */
12790 if (r->reg_flags & RegVRex)
12791 {
12792 if (!cpu_arch_flags.bitfield.cpuavx512f
12793 || flag_code != CODE_64BIT)
5b7c81bd 12794 return false;
8a6fb3f9 12795
da4977e0
JB
12796 if (i.vec_encoding == vex_encoding_default)
12797 i.vec_encoding = vex_encoding_evex;
12798 else if (i.vec_encoding != vex_encoding_evex)
12799 i.vec_encoding = vex_encoding_error;
8a6fb3f9
JB
12800 }
12801
12802 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
12803 && (!cpu_arch_flags.bitfield.cpulm || r->reg_type.bitfield.class != RegCR)
12804 && flag_code != CODE_64BIT)
5b7c81bd 12805 return false;
8a6fb3f9
JB
12806
12807 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
12808 && !intel_syntax)
5b7c81bd 12809 return false;
8a6fb3f9 12810
5b7c81bd 12811 return true;
8a6fb3f9
JB
12812}
12813
af6bdddf 12814/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
12815
12816static const reg_entry *
4d1bb795 12817parse_real_register (char *reg_string, char **end_op)
252b5132 12818{
af6bdddf
AM
12819 char *s = reg_string;
12820 char *p;
252b5132
RH
12821 char reg_name_given[MAX_REG_NAME_SIZE + 1];
12822 const reg_entry *r;
12823
12824 /* Skip possible REGISTER_PREFIX and possible whitespace. */
12825 if (*s == REGISTER_PREFIX)
12826 ++s;
12827
12828 if (is_space_char (*s))
12829 ++s;
12830
12831 p = reg_name_given;
af6bdddf 12832 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
12833 {
12834 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
12835 return (const reg_entry *) NULL;
12836 s++;
252b5132
RH
12837 }
12838
6588847e
DN
12839 /* For naked regs, make sure that we are not dealing with an identifier.
12840 This prevents confusing an identifier like `eax_var' with register
12841 `eax'. */
12842 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
12843 return (const reg_entry *) NULL;
12844
af6bdddf 12845 *end_op = s;
252b5132 12846
629310ab 12847 r = (const reg_entry *) str_hash_find (reg_hash, reg_name_given);
252b5132 12848
5f47d35b 12849 /* Handle floating point regs, allowing spaces in the (i) part. */
6288d05f 12850 if (r == reg_st0)
5f47d35b 12851 {
0e0eea78
JB
12852 if (!cpu_arch_flags.bitfield.cpu8087
12853 && !cpu_arch_flags.bitfield.cpu287
af32b722
JB
12854 && !cpu_arch_flags.bitfield.cpu387
12855 && !allow_pseudo_reg)
0e0eea78
JB
12856 return (const reg_entry *) NULL;
12857
5f47d35b
AM
12858 if (is_space_char (*s))
12859 ++s;
12860 if (*s == '(')
12861 {
af6bdddf 12862 ++s;
5f47d35b
AM
12863 if (is_space_char (*s))
12864 ++s;
12865 if (*s >= '0' && *s <= '7')
12866 {
db557034 12867 int fpr = *s - '0';
af6bdddf 12868 ++s;
5f47d35b
AM
12869 if (is_space_char (*s))
12870 ++s;
12871 if (*s == ')')
12872 {
12873 *end_op = s + 1;
6288d05f 12874 know (r[fpr].reg_num == fpr);
db557034 12875 return r + fpr;
5f47d35b 12876 }
5f47d35b 12877 }
47926f60 12878 /* We have "%st(" then garbage. */
5f47d35b
AM
12879 return (const reg_entry *) NULL;
12880 }
12881 }
12882
8a6fb3f9 12883 return r && check_register (r) ? r : NULL;
252b5132 12884}
4d1bb795
JB
12885
12886/* REG_STRING starts *before* REGISTER_PREFIX. */
12887
12888static const reg_entry *
12889parse_register (char *reg_string, char **end_op)
12890{
12891 const reg_entry *r;
12892
12893 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
12894 r = parse_real_register (reg_string, end_op);
12895 else
12896 r = NULL;
12897 if (!r)
12898 {
12899 char *save = input_line_pointer;
12900 char c;
12901 symbolS *symbolP;
12902
12903 input_line_pointer = reg_string;
d02603dc 12904 c = get_symbol_name (&reg_string);
4d1bb795
JB
12905 symbolP = symbol_find (reg_string);
12906 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
12907 {
12908 const expressionS *e = symbol_get_value_expression (symbolP);
12909
0398aac5 12910 know (e->X_op == O_register);
4eed87de 12911 know (e->X_add_number >= 0
c3fe08fa 12912 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 12913 r = i386_regtab + e->X_add_number;
8a6fb3f9
JB
12914 if (!check_register (r))
12915 {
12916 as_bad (_("register '%s%s' cannot be used here"),
12917 register_prefix, r->reg_name);
12918 r = &bad_reg;
12919 }
4d1bb795
JB
12920 *end_op = input_line_pointer;
12921 }
12922 *input_line_pointer = c;
12923 input_line_pointer = save;
12924 }
12925 return r;
12926}
12927
12928int
12929i386_parse_name (char *name, expressionS *e, char *nextcharP)
12930{
12931 const reg_entry *r;
12932 char *end = input_line_pointer;
12933
12934 *end = *nextcharP;
12935 r = parse_register (name, &input_line_pointer);
12936 if (r && end <= input_line_pointer)
12937 {
12938 *nextcharP = *input_line_pointer;
12939 *input_line_pointer = 0;
8a6fb3f9
JB
12940 if (r != &bad_reg)
12941 {
12942 e->X_op = O_register;
12943 e->X_add_number = r - i386_regtab;
12944 }
12945 else
12946 e->X_op = O_illegal;
4d1bb795
JB
12947 return 1;
12948 }
12949 input_line_pointer = end;
12950 *end = 0;
ee86248c 12951 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
12952}
12953
12954void
12955md_operand (expressionS *e)
12956{
ee86248c
JB
12957 char *end;
12958 const reg_entry *r;
4d1bb795 12959
ee86248c
JB
12960 switch (*input_line_pointer)
12961 {
12962 case REGISTER_PREFIX:
12963 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
12964 if (r)
12965 {
12966 e->X_op = O_register;
12967 e->X_add_number = r - i386_regtab;
12968 input_line_pointer = end;
12969 }
ee86248c
JB
12970 break;
12971
12972 case '[':
9c2799c2 12973 gas_assert (intel_syntax);
ee86248c
JB
12974 end = input_line_pointer++;
12975 expression (e);
12976 if (*input_line_pointer == ']')
12977 {
12978 ++input_line_pointer;
12979 e->X_op_symbol = make_expr_symbol (e);
12980 e->X_add_symbol = NULL;
12981 e->X_add_number = 0;
12982 e->X_op = O_index;
12983 }
12984 else
12985 {
12986 e->X_op = O_absent;
12987 input_line_pointer = end;
12988 }
12989 break;
4d1bb795
JB
12990 }
12991}
12992
252b5132 12993\f
4cc782b5 12994#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 12995const char *md_shortopts = "kVQ:sqnO::";
252b5132 12996#else
b6f8c7c4 12997const char *md_shortopts = "qnO::";
252b5132 12998#endif
6e0b89ee 12999
3e73aa7c 13000#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
13001#define OPTION_64 (OPTION_MD_BASE + 1)
13002#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
13003#define OPTION_MARCH (OPTION_MD_BASE + 3)
13004#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
13005#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
13006#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
13007#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
13008#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 13009#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 13010#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 13011#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
13012#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
13013#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
13014#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 13015#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
13016#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
13017#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 13018#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 13019#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 13020#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 13021#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
13022#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
13023#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 13024#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 13025#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 13026#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
e379e5f3
L
13027#define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27)
13028#define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
13029#define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
76cf450b 13030#define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
ae531041
L
13031#define OPTION_MLFENCE_AFTER_LOAD (OPTION_MD_BASE + 31)
13032#define OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH (OPTION_MD_BASE + 32)
13033#define OPTION_MLFENCE_BEFORE_RET (OPTION_MD_BASE + 33)
b3b91714 13034
99ad8390
NC
13035struct option md_longopts[] =
13036{
3e73aa7c 13037 {"32", no_argument, NULL, OPTION_32},
321098a5 13038#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 13039 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 13040 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
13041#endif
13042#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 13043 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 13044 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 13045 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 13046#endif
b3b91714 13047 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
13048 {"march", required_argument, NULL, OPTION_MARCH},
13049 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
13050 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
13051 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
13052 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
13053 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 13054 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 13055 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 13056 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 13057 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 13058 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 13059 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
13060 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
13061 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
13062# if defined (TE_PE) || defined (TE_PEP)
13063 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
13064#endif
d1982f93 13065 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 13066 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 13067 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 13068 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
e379e5f3
L
13069 {"malign-branch-boundary", required_argument, NULL, OPTION_MALIGN_BRANCH_BOUNDARY},
13070 {"malign-branch-prefix-size", required_argument, NULL, OPTION_MALIGN_BRANCH_PREFIX_SIZE},
13071 {"malign-branch", required_argument, NULL, OPTION_MALIGN_BRANCH},
76cf450b 13072 {"mbranches-within-32B-boundaries", no_argument, NULL, OPTION_MBRANCHES_WITH_32B_BOUNDARIES},
ae531041
L
13073 {"mlfence-after-load", required_argument, NULL, OPTION_MLFENCE_AFTER_LOAD},
13074 {"mlfence-before-indirect-branch", required_argument, NULL,
13075 OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH},
13076 {"mlfence-before-ret", required_argument, NULL, OPTION_MLFENCE_BEFORE_RET},
5db04b09
L
13077 {"mamd64", no_argument, NULL, OPTION_MAMD64},
13078 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
13079 {NULL, no_argument, NULL, 0}
13080};
13081size_t md_longopts_size = sizeof (md_longopts);
13082
13083int
17b9d67d 13084md_parse_option (int c, const char *arg)
252b5132 13085{
91d6fa6a 13086 unsigned int j;
e379e5f3 13087 char *arch, *next, *saved, *type;
9103f4f4 13088
252b5132
RH
13089 switch (c)
13090 {
12b55ccc
L
13091 case 'n':
13092 optimize_align_code = 0;
13093 break;
13094
a38cf1db
AM
13095 case 'q':
13096 quiet_warnings = 1;
252b5132
RH
13097 break;
13098
13099#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
13100 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
13101 should be emitted or not. FIXME: Not implemented. */
13102 case 'Q':
d4693039
JB
13103 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
13104 return 0;
252b5132
RH
13105 break;
13106
13107 /* -V: SVR4 argument to print version ID. */
13108 case 'V':
13109 print_version_id ();
13110 break;
13111
a38cf1db
AM
13112 /* -k: Ignore for FreeBSD compatibility. */
13113 case 'k':
252b5132 13114 break;
4cc782b5
ILT
13115
13116 case 's':
13117 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 13118 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 13119 break;
8dcea932
L
13120
13121 case OPTION_MSHARED:
13122 shared = 1;
13123 break;
b4a3a7b4
L
13124
13125 case OPTION_X86_USED_NOTE:
13126 if (strcasecmp (arg, "yes") == 0)
13127 x86_used_note = 1;
13128 else if (strcasecmp (arg, "no") == 0)
13129 x86_used_note = 0;
13130 else
13131 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
13132 break;
13133
13134
99ad8390 13135#endif
321098a5 13136#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 13137 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
13138 case OPTION_64:
13139 {
13140 const char **list, **l;
13141
3e73aa7c
JH
13142 list = bfd_target_list ();
13143 for (l = list; *l != NULL; l++)
08dedd66 13144 if (startswith (*l, "elf64-x86-64")
99ad8390
NC
13145 || strcmp (*l, "coff-x86-64") == 0
13146 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
13147 || strcmp (*l, "pei-x86-64") == 0
13148 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
13149 {
13150 default_arch = "x86_64";
13151 break;
13152 }
3e73aa7c 13153 if (*l == NULL)
2b5d6a91 13154 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
13155 free (list);
13156 }
13157 break;
13158#endif
252b5132 13159
351f65ca 13160#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 13161 case OPTION_X32:
351f65ca
L
13162 if (IS_ELF)
13163 {
13164 const char **list, **l;
13165
13166 list = bfd_target_list ();
13167 for (l = list; *l != NULL; l++)
08dedd66 13168 if (startswith (*l, "elf32-x86-64"))
351f65ca
L
13169 {
13170 default_arch = "x86_64:32";
13171 break;
13172 }
13173 if (*l == NULL)
2b5d6a91 13174 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
13175 free (list);
13176 }
13177 else
13178 as_fatal (_("32bit x86_64 is only supported for ELF"));
13179 break;
13180#endif
13181
6e0b89ee
AM
13182 case OPTION_32:
13183 default_arch = "i386";
13184 break;
13185
b3b91714
AM
13186 case OPTION_DIVIDE:
13187#ifdef SVR4_COMMENT_CHARS
13188 {
13189 char *n, *t;
13190 const char *s;
13191
add39d23 13192 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
13193 t = n;
13194 for (s = i386_comment_chars; *s != '\0'; s++)
13195 if (*s != '/')
13196 *t++ = *s;
13197 *t = '\0';
13198 i386_comment_chars = n;
13199 }
13200#endif
13201 break;
13202
9103f4f4 13203 case OPTION_MARCH:
293f5f65
L
13204 saved = xstrdup (arg);
13205 arch = saved;
13206 /* Allow -march=+nosse. */
13207 if (*arch == '+')
13208 arch++;
6305a203 13209 do
9103f4f4 13210 {
6305a203 13211 if (*arch == '.')
2b5d6a91 13212 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
13213 next = strchr (arch, '+');
13214 if (next)
13215 *next++ = '\0';
91d6fa6a 13216 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 13217 {
91d6fa6a 13218 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 13219 {
6305a203 13220 /* Processor. */
1ded5609
JB
13221 if (! cpu_arch[j].flags.bitfield.cpui386)
13222 continue;
13223
91d6fa6a 13224 cpu_arch_name = cpu_arch[j].name;
6305a203 13225 cpu_sub_arch_name = NULL;
91d6fa6a
NC
13226 cpu_arch_flags = cpu_arch[j].flags;
13227 cpu_arch_isa = cpu_arch[j].type;
13228 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
13229 if (!cpu_arch_tune_set)
13230 {
13231 cpu_arch_tune = cpu_arch_isa;
13232 cpu_arch_tune_flags = cpu_arch_isa_flags;
13233 }
13234 break;
13235 }
91d6fa6a
NC
13236 else if (*cpu_arch [j].name == '.'
13237 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 13238 {
33eaf5de 13239 /* ISA extension. */
6305a203 13240 i386_cpu_flags flags;
309d3373 13241
293f5f65
L
13242 flags = cpu_flags_or (cpu_arch_flags,
13243 cpu_arch[j].flags);
81486035 13244
5b64d091 13245 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
13246 {
13247 if (cpu_sub_arch_name)
13248 {
13249 char *name = cpu_sub_arch_name;
13250 cpu_sub_arch_name = concat (name,
91d6fa6a 13251 cpu_arch[j].name,
1bf57e9f 13252 (const char *) NULL);
6305a203
L
13253 free (name);
13254 }
13255 else
91d6fa6a 13256 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 13257 cpu_arch_flags = flags;
a586129e 13258 cpu_arch_isa_flags = flags;
6305a203 13259 }
0089dace
L
13260 else
13261 cpu_arch_isa_flags
13262 = cpu_flags_or (cpu_arch_isa_flags,
13263 cpu_arch[j].flags);
6305a203 13264 break;
ccc9c027 13265 }
9103f4f4 13266 }
6305a203 13267
293f5f65
L
13268 if (j >= ARRAY_SIZE (cpu_arch))
13269 {
33eaf5de 13270 /* Disable an ISA extension. */
293f5f65
L
13271 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13272 if (strcmp (arch, cpu_noarch [j].name) == 0)
13273 {
13274 i386_cpu_flags flags;
13275
13276 flags = cpu_flags_and_not (cpu_arch_flags,
13277 cpu_noarch[j].flags);
13278 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
13279 {
13280 if (cpu_sub_arch_name)
13281 {
13282 char *name = cpu_sub_arch_name;
13283 cpu_sub_arch_name = concat (arch,
13284 (const char *) NULL);
13285 free (name);
13286 }
13287 else
13288 cpu_sub_arch_name = xstrdup (arch);
13289 cpu_arch_flags = flags;
13290 cpu_arch_isa_flags = flags;
13291 }
13292 break;
13293 }
13294
13295 if (j >= ARRAY_SIZE (cpu_noarch))
13296 j = ARRAY_SIZE (cpu_arch);
13297 }
13298
91d6fa6a 13299 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 13300 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
13301
13302 arch = next;
9103f4f4 13303 }
293f5f65
L
13304 while (next != NULL);
13305 free (saved);
9103f4f4
L
13306 break;
13307
13308 case OPTION_MTUNE:
13309 if (*arg == '.')
2b5d6a91 13310 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 13311 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 13312 {
91d6fa6a 13313 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 13314 {
ccc9c027 13315 cpu_arch_tune_set = 1;
91d6fa6a
NC
13316 cpu_arch_tune = cpu_arch [j].type;
13317 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
13318 break;
13319 }
13320 }
91d6fa6a 13321 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 13322 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
13323 break;
13324
1efbbeb4
L
13325 case OPTION_MMNEMONIC:
13326 if (strcasecmp (arg, "att") == 0)
13327 intel_mnemonic = 0;
13328 else if (strcasecmp (arg, "intel") == 0)
13329 intel_mnemonic = 1;
13330 else
2b5d6a91 13331 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
13332 break;
13333
13334 case OPTION_MSYNTAX:
13335 if (strcasecmp (arg, "att") == 0)
13336 intel_syntax = 0;
13337 else if (strcasecmp (arg, "intel") == 0)
13338 intel_syntax = 1;
13339 else
2b5d6a91 13340 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
13341 break;
13342
13343 case OPTION_MINDEX_REG:
13344 allow_index_reg = 1;
13345 break;
13346
13347 case OPTION_MNAKED_REG:
13348 allow_naked_reg = 1;
13349 break;
13350
c0f3af97
L
13351 case OPTION_MSSE2AVX:
13352 sse2avx = 1;
13353 break;
13354
daf50ae7
L
13355 case OPTION_MSSE_CHECK:
13356 if (strcasecmp (arg, "error") == 0)
7bab8ab5 13357 sse_check = check_error;
daf50ae7 13358 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 13359 sse_check = check_warning;
daf50ae7 13360 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 13361 sse_check = check_none;
daf50ae7 13362 else
2b5d6a91 13363 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
13364 break;
13365
7bab8ab5
JB
13366 case OPTION_MOPERAND_CHECK:
13367 if (strcasecmp (arg, "error") == 0)
13368 operand_check = check_error;
13369 else if (strcasecmp (arg, "warning") == 0)
13370 operand_check = check_warning;
13371 else if (strcasecmp (arg, "none") == 0)
13372 operand_check = check_none;
13373 else
13374 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
13375 break;
13376
539f890d
L
13377 case OPTION_MAVXSCALAR:
13378 if (strcasecmp (arg, "128") == 0)
13379 avxscalar = vex128;
13380 else if (strcasecmp (arg, "256") == 0)
13381 avxscalar = vex256;
13382 else
2b5d6a91 13383 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
13384 break;
13385
03751133
L
13386 case OPTION_MVEXWIG:
13387 if (strcmp (arg, "0") == 0)
40c9c8de 13388 vexwig = vexw0;
03751133 13389 else if (strcmp (arg, "1") == 0)
40c9c8de 13390 vexwig = vexw1;
03751133
L
13391 else
13392 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
13393 break;
13394
7e8b059b
L
13395 case OPTION_MADD_BND_PREFIX:
13396 add_bnd_prefix = 1;
13397 break;
13398
43234a1e
L
13399 case OPTION_MEVEXLIG:
13400 if (strcmp (arg, "128") == 0)
13401 evexlig = evexl128;
13402 else if (strcmp (arg, "256") == 0)
13403 evexlig = evexl256;
13404 else if (strcmp (arg, "512") == 0)
13405 evexlig = evexl512;
13406 else
13407 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
13408 break;
13409
d3d3c6db
IT
13410 case OPTION_MEVEXRCIG:
13411 if (strcmp (arg, "rne") == 0)
13412 evexrcig = rne;
13413 else if (strcmp (arg, "rd") == 0)
13414 evexrcig = rd;
13415 else if (strcmp (arg, "ru") == 0)
13416 evexrcig = ru;
13417 else if (strcmp (arg, "rz") == 0)
13418 evexrcig = rz;
13419 else
13420 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
13421 break;
13422
43234a1e
L
13423 case OPTION_MEVEXWIG:
13424 if (strcmp (arg, "0") == 0)
13425 evexwig = evexw0;
13426 else if (strcmp (arg, "1") == 0)
13427 evexwig = evexw1;
13428 else
13429 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
13430 break;
13431
167ad85b
TG
13432# if defined (TE_PE) || defined (TE_PEP)
13433 case OPTION_MBIG_OBJ:
13434 use_big_obj = 1;
13435 break;
13436#endif
13437
d1982f93 13438 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
13439 if (strcasecmp (arg, "yes") == 0)
13440 omit_lock_prefix = 1;
13441 else if (strcasecmp (arg, "no") == 0)
13442 omit_lock_prefix = 0;
13443 else
13444 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
13445 break;
13446
e4e00185
AS
13447 case OPTION_MFENCE_AS_LOCK_ADD:
13448 if (strcasecmp (arg, "yes") == 0)
13449 avoid_fence = 1;
13450 else if (strcasecmp (arg, "no") == 0)
13451 avoid_fence = 0;
13452 else
13453 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
13454 break;
13455
ae531041
L
13456 case OPTION_MLFENCE_AFTER_LOAD:
13457 if (strcasecmp (arg, "yes") == 0)
13458 lfence_after_load = 1;
13459 else if (strcasecmp (arg, "no") == 0)
13460 lfence_after_load = 0;
13461 else
13462 as_fatal (_("invalid -mlfence-after-load= option: `%s'"), arg);
13463 break;
13464
13465 case OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH:
13466 if (strcasecmp (arg, "all") == 0)
a09f656b 13467 {
13468 lfence_before_indirect_branch = lfence_branch_all;
13469 if (lfence_before_ret == lfence_before_ret_none)
13470 lfence_before_ret = lfence_before_ret_shl;
13471 }
ae531041
L
13472 else if (strcasecmp (arg, "memory") == 0)
13473 lfence_before_indirect_branch = lfence_branch_memory;
13474 else if (strcasecmp (arg, "register") == 0)
13475 lfence_before_indirect_branch = lfence_branch_register;
13476 else if (strcasecmp (arg, "none") == 0)
13477 lfence_before_indirect_branch = lfence_branch_none;
13478 else
13479 as_fatal (_("invalid -mlfence-before-indirect-branch= option: `%s'"),
13480 arg);
13481 break;
13482
13483 case OPTION_MLFENCE_BEFORE_RET:
13484 if (strcasecmp (arg, "or") == 0)
13485 lfence_before_ret = lfence_before_ret_or;
13486 else if (strcasecmp (arg, "not") == 0)
13487 lfence_before_ret = lfence_before_ret_not;
a09f656b 13488 else if (strcasecmp (arg, "shl") == 0 || strcasecmp (arg, "yes") == 0)
13489 lfence_before_ret = lfence_before_ret_shl;
ae531041
L
13490 else if (strcasecmp (arg, "none") == 0)
13491 lfence_before_ret = lfence_before_ret_none;
13492 else
13493 as_fatal (_("invalid -mlfence-before-ret= option: `%s'"),
13494 arg);
13495 break;
13496
0cb4071e
L
13497 case OPTION_MRELAX_RELOCATIONS:
13498 if (strcasecmp (arg, "yes") == 0)
13499 generate_relax_relocations = 1;
13500 else if (strcasecmp (arg, "no") == 0)
13501 generate_relax_relocations = 0;
13502 else
13503 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
13504 break;
13505
e379e5f3
L
13506 case OPTION_MALIGN_BRANCH_BOUNDARY:
13507 {
13508 char *end;
13509 long int align = strtoul (arg, &end, 0);
13510 if (*end == '\0')
13511 {
13512 if (align == 0)
13513 {
13514 align_branch_power = 0;
13515 break;
13516 }
13517 else if (align >= 16)
13518 {
13519 int align_power;
13520 for (align_power = 0;
13521 (align & 1) == 0;
13522 align >>= 1, align_power++)
13523 continue;
13524 /* Limit alignment power to 31. */
13525 if (align == 1 && align_power < 32)
13526 {
13527 align_branch_power = align_power;
13528 break;
13529 }
13530 }
13531 }
13532 as_fatal (_("invalid -malign-branch-boundary= value: %s"), arg);
13533 }
13534 break;
13535
13536 case OPTION_MALIGN_BRANCH_PREFIX_SIZE:
13537 {
13538 char *end;
13539 int align = strtoul (arg, &end, 0);
13540 /* Some processors only support 5 prefixes. */
13541 if (*end == '\0' && align >= 0 && align < 6)
13542 {
13543 align_branch_prefix_size = align;
13544 break;
13545 }
13546 as_fatal (_("invalid -malign-branch-prefix-size= value: %s"),
13547 arg);
13548 }
13549 break;
13550
13551 case OPTION_MALIGN_BRANCH:
13552 align_branch = 0;
13553 saved = xstrdup (arg);
13554 type = saved;
13555 do
13556 {
13557 next = strchr (type, '+');
13558 if (next)
13559 *next++ = '\0';
13560 if (strcasecmp (type, "jcc") == 0)
13561 align_branch |= align_branch_jcc_bit;
13562 else if (strcasecmp (type, "fused") == 0)
13563 align_branch |= align_branch_fused_bit;
13564 else if (strcasecmp (type, "jmp") == 0)
13565 align_branch |= align_branch_jmp_bit;
13566 else if (strcasecmp (type, "call") == 0)
13567 align_branch |= align_branch_call_bit;
13568 else if (strcasecmp (type, "ret") == 0)
13569 align_branch |= align_branch_ret_bit;
13570 else if (strcasecmp (type, "indirect") == 0)
13571 align_branch |= align_branch_indirect_bit;
13572 else
13573 as_fatal (_("invalid -malign-branch= option: `%s'"), arg);
13574 type = next;
13575 }
13576 while (next != NULL);
13577 free (saved);
13578 break;
13579
76cf450b
L
13580 case OPTION_MBRANCHES_WITH_32B_BOUNDARIES:
13581 align_branch_power = 5;
13582 align_branch_prefix_size = 5;
13583 align_branch = (align_branch_jcc_bit
13584 | align_branch_fused_bit
13585 | align_branch_jmp_bit);
13586 break;
13587
5db04b09 13588 case OPTION_MAMD64:
4b5aaf5f 13589 isa64 = amd64;
5db04b09
L
13590 break;
13591
13592 case OPTION_MINTEL64:
4b5aaf5f 13593 isa64 = intel64;
5db04b09
L
13594 break;
13595
b6f8c7c4
L
13596 case 'O':
13597 if (arg == NULL)
13598 {
13599 optimize = 1;
13600 /* Turn off -Os. */
13601 optimize_for_space = 0;
13602 }
13603 else if (*arg == 's')
13604 {
13605 optimize_for_space = 1;
13606 /* Turn on all encoding optimizations. */
41fd2579 13607 optimize = INT_MAX;
b6f8c7c4
L
13608 }
13609 else
13610 {
13611 optimize = atoi (arg);
13612 /* Turn off -Os. */
13613 optimize_for_space = 0;
13614 }
13615 break;
13616
252b5132
RH
13617 default:
13618 return 0;
13619 }
13620 return 1;
13621}
13622
8a2c8fef
L
13623#define MESSAGE_TEMPLATE \
13624" "
13625
293f5f65
L
13626static char *
13627output_message (FILE *stream, char *p, char *message, char *start,
13628 int *left_p, const char *name, int len)
13629{
13630 int size = sizeof (MESSAGE_TEMPLATE);
13631 int left = *left_p;
13632
13633 /* Reserve 2 spaces for ", " or ",\0" */
13634 left -= len + 2;
13635
13636 /* Check if there is any room. */
13637 if (left >= 0)
13638 {
13639 if (p != start)
13640 {
13641 *p++ = ',';
13642 *p++ = ' ';
13643 }
13644 p = mempcpy (p, name, len);
13645 }
13646 else
13647 {
13648 /* Output the current message now and start a new one. */
13649 *p++ = ',';
13650 *p = '\0';
13651 fprintf (stream, "%s\n", message);
13652 p = start;
13653 left = size - (start - message) - len - 2;
13654
13655 gas_assert (left >= 0);
13656
13657 p = mempcpy (p, name, len);
13658 }
13659
13660 *left_p = left;
13661 return p;
13662}
13663
8a2c8fef 13664static void
1ded5609 13665show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
13666{
13667 static char message[] = MESSAGE_TEMPLATE;
13668 char *start = message + 27;
13669 char *p;
13670 int size = sizeof (MESSAGE_TEMPLATE);
13671 int left;
13672 const char *name;
13673 int len;
13674 unsigned int j;
13675
13676 p = start;
13677 left = size - (start - message);
13678 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
13679 {
13680 /* Should it be skipped? */
13681 if (cpu_arch [j].skip)
13682 continue;
13683
13684 name = cpu_arch [j].name;
13685 len = cpu_arch [j].len;
13686 if (*name == '.')
13687 {
13688 /* It is an extension. Skip if we aren't asked to show it. */
13689 if (ext)
13690 {
13691 name++;
13692 len--;
13693 }
13694 else
13695 continue;
13696 }
13697 else if (ext)
13698 {
13699 /* It is an processor. Skip if we show only extension. */
13700 continue;
13701 }
1ded5609
JB
13702 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
13703 {
13704 /* It is an impossible processor - skip. */
13705 continue;
13706 }
8a2c8fef 13707
293f5f65 13708 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
13709 }
13710
293f5f65
L
13711 /* Display disabled extensions. */
13712 if (ext)
13713 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13714 {
13715 name = cpu_noarch [j].name;
13716 len = cpu_noarch [j].len;
13717 p = output_message (stream, p, message, start, &left, name,
13718 len);
13719 }
13720
8a2c8fef
L
13721 *p = '\0';
13722 fprintf (stream, "%s\n", message);
13723}
13724
252b5132 13725void
8a2c8fef 13726md_show_usage (FILE *stream)
252b5132 13727{
4cc782b5
ILT
13728#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13729 fprintf (stream, _("\
d4693039 13730 -Qy, -Qn ignored\n\
a38cf1db 13731 -V print assembler version number\n\
b3b91714
AM
13732 -k ignored\n"));
13733#endif
13734 fprintf (stream, _("\
12b55ccc 13735 -n Do not optimize code alignment\n\
b3b91714
AM
13736 -q quieten some warnings\n"));
13737#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13738 fprintf (stream, _("\
a38cf1db 13739 -s ignored\n"));
b3b91714 13740#endif
d7f449c0
L
13741#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
13742 || defined (TE_PE) || defined (TE_PEP))
751d281c 13743 fprintf (stream, _("\
570561f7 13744 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 13745#endif
b3b91714
AM
13746#ifdef SVR4_COMMENT_CHARS
13747 fprintf (stream, _("\
13748 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
13749#else
13750 fprintf (stream, _("\
b3b91714 13751 --divide ignored\n"));
4cc782b5 13752#endif
9103f4f4 13753 fprintf (stream, _("\
6305a203 13754 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 13755 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 13756 show_arch (stream, 0, 1);
8a2c8fef
L
13757 fprintf (stream, _("\
13758 EXTENSION is combination of:\n"));
1ded5609 13759 show_arch (stream, 1, 0);
6305a203 13760 fprintf (stream, _("\
8a2c8fef 13761 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 13762 show_arch (stream, 0, 0);
ba104c83 13763 fprintf (stream, _("\
c0f3af97
L
13764 -msse2avx encode SSE instructions with VEX prefix\n"));
13765 fprintf (stream, _("\
7c5c05ef 13766 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
13767 check SSE instructions\n"));
13768 fprintf (stream, _("\
7c5c05ef 13769 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
13770 check operand combinations for validity\n"));
13771 fprintf (stream, _("\
7c5c05ef
L
13772 -mavxscalar=[128|256] (default: 128)\n\
13773 encode scalar AVX instructions with specific vector\n\
539f890d
L
13774 length\n"));
13775 fprintf (stream, _("\
03751133
L
13776 -mvexwig=[0|1] (default: 0)\n\
13777 encode VEX instructions with specific VEX.W value\n\
13778 for VEX.W bit ignored instructions\n"));
13779 fprintf (stream, _("\
7c5c05ef
L
13780 -mevexlig=[128|256|512] (default: 128)\n\
13781 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
13782 length\n"));
13783 fprintf (stream, _("\
7c5c05ef
L
13784 -mevexwig=[0|1] (default: 0)\n\
13785 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
13786 for EVEX.W bit ignored instructions\n"));
13787 fprintf (stream, _("\
7c5c05ef 13788 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
13789 encode EVEX instructions with specific EVEX.RC value\n\
13790 for SAE-only ignored instructions\n"));
13791 fprintf (stream, _("\
7c5c05ef
L
13792 -mmnemonic=[att|intel] "));
13793 if (SYSV386_COMPAT)
13794 fprintf (stream, _("(default: att)\n"));
13795 else
13796 fprintf (stream, _("(default: intel)\n"));
13797 fprintf (stream, _("\
13798 use AT&T/Intel mnemonic\n"));
ba104c83 13799 fprintf (stream, _("\
7c5c05ef
L
13800 -msyntax=[att|intel] (default: att)\n\
13801 use AT&T/Intel syntax\n"));
ba104c83
L
13802 fprintf (stream, _("\
13803 -mindex-reg support pseudo index registers\n"));
13804 fprintf (stream, _("\
13805 -mnaked-reg don't require `%%' prefix for registers\n"));
13806 fprintf (stream, _("\
7e8b059b 13807 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 13808#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
13809 fprintf (stream, _("\
13810 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
13811 fprintf (stream, _("\
13812 -mx86-used-note=[no|yes] "));
13813 if (DEFAULT_X86_USED_NOTE)
13814 fprintf (stream, _("(default: yes)\n"));
13815 else
13816 fprintf (stream, _("(default: no)\n"));
13817 fprintf (stream, _("\
13818 generate x86 used ISA and feature properties\n"));
13819#endif
13820#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
13821 fprintf (stream, _("\
13822 -mbig-obj generate big object files\n"));
13823#endif
d022bddd 13824 fprintf (stream, _("\
7c5c05ef 13825 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 13826 strip all lock prefixes\n"));
5db04b09 13827 fprintf (stream, _("\
7c5c05ef 13828 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
13829 encode lfence, mfence and sfence as\n\
13830 lock addl $0x0, (%%{re}sp)\n"));
13831 fprintf (stream, _("\
7c5c05ef
L
13832 -mrelax-relocations=[no|yes] "));
13833 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
13834 fprintf (stream, _("(default: yes)\n"));
13835 else
13836 fprintf (stream, _("(default: no)\n"));
13837 fprintf (stream, _("\
0cb4071e
L
13838 generate relax relocations\n"));
13839 fprintf (stream, _("\
e379e5f3
L
13840 -malign-branch-boundary=NUM (default: 0)\n\
13841 align branches within NUM byte boundary\n"));
13842 fprintf (stream, _("\
13843 -malign-branch=TYPE[+TYPE...] (default: jcc+fused+jmp)\n\
13844 TYPE is combination of jcc, fused, jmp, call, ret,\n\
13845 indirect\n\
13846 specify types of branches to align\n"));
13847 fprintf (stream, _("\
13848 -malign-branch-prefix-size=NUM (default: 5)\n\
13849 align branches with NUM prefixes per instruction\n"));
13850 fprintf (stream, _("\
76cf450b
L
13851 -mbranches-within-32B-boundaries\n\
13852 align branches within 32 byte boundary\n"));
13853 fprintf (stream, _("\
ae531041
L
13854 -mlfence-after-load=[no|yes] (default: no)\n\
13855 generate lfence after load\n"));
13856 fprintf (stream, _("\
13857 -mlfence-before-indirect-branch=[none|all|register|memory] (default: none)\n\
13858 generate lfence before indirect near branch\n"));
13859 fprintf (stream, _("\
a09f656b 13860 -mlfence-before-ret=[none|or|not|shl|yes] (default: none)\n\
ae531041
L
13861 generate lfence before ret\n"));
13862 fprintf (stream, _("\
7c5c05ef 13863 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
13864 fprintf (stream, _("\
13865 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
13866}
13867
3e73aa7c 13868#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 13869 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 13870 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
13871
13872/* Pick the target format to use. */
13873
47926f60 13874const char *
e3bb37b5 13875i386_target_format (void)
252b5132 13876{
d34049e8 13877 if (startswith (default_arch, "x86_64"))
351f65ca
L
13878 {
13879 update_code_flag (CODE_64BIT, 1);
13880 if (default_arch[6] == '\0')
7f56bc95 13881 x86_elf_abi = X86_64_ABI;
351f65ca 13882 else
7f56bc95 13883 x86_elf_abi = X86_64_X32_ABI;
351f65ca 13884 }
3e73aa7c 13885 else if (!strcmp (default_arch, "i386"))
78f12dd3 13886 update_code_flag (CODE_32BIT, 1);
5197d474
L
13887 else if (!strcmp (default_arch, "iamcu"))
13888 {
13889 update_code_flag (CODE_32BIT, 1);
13890 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
13891 {
13892 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
13893 cpu_arch_name = "iamcu";
13894 cpu_sub_arch_name = NULL;
13895 cpu_arch_flags = iamcu_flags;
13896 cpu_arch_isa = PROCESSOR_IAMCU;
13897 cpu_arch_isa_flags = iamcu_flags;
13898 if (!cpu_arch_tune_set)
13899 {
13900 cpu_arch_tune = cpu_arch_isa;
13901 cpu_arch_tune_flags = cpu_arch_isa_flags;
13902 }
13903 }
8d471ec1 13904 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
13905 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
13906 cpu_arch_name);
13907 }
3e73aa7c 13908 else
2b5d6a91 13909 as_fatal (_("unknown architecture"));
89507696
JB
13910
13911 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
13912 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13913 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
13914 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13915
252b5132
RH
13916 switch (OUTPUT_FLAVOR)
13917 {
9384f2ff 13918#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 13919 case bfd_target_aout_flavour:
47926f60 13920 return AOUT_TARGET_FORMAT;
4c63da97 13921#endif
9384f2ff
AM
13922#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
13923# if defined (TE_PE) || defined (TE_PEP)
13924 case bfd_target_coff_flavour:
167ad85b 13925 if (flag_code == CODE_64BIT)
eb19308f
JB
13926 {
13927 object_64bit = 1;
13928 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
13929 }
13930 return use_big_obj ? "pe-bigobj-i386" : "pe-i386";
9384f2ff 13931# elif defined (TE_GO32)
0561d57c
JK
13932 case bfd_target_coff_flavour:
13933 return "coff-go32";
9384f2ff 13934# else
252b5132
RH
13935 case bfd_target_coff_flavour:
13936 return "coff-i386";
9384f2ff 13937# endif
4c63da97 13938#endif
3e73aa7c 13939#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 13940 case bfd_target_elf_flavour:
3e73aa7c 13941 {
351f65ca
L
13942 const char *format;
13943
13944 switch (x86_elf_abi)
4fa24527 13945 {
351f65ca
L
13946 default:
13947 format = ELF_TARGET_FORMAT;
e379e5f3
L
13948#ifndef TE_SOLARIS
13949 tls_get_addr = "___tls_get_addr";
13950#endif
351f65ca 13951 break;
7f56bc95 13952 case X86_64_ABI:
351f65ca 13953 use_rela_relocations = 1;
4fa24527 13954 object_64bit = 1;
e379e5f3
L
13955#ifndef TE_SOLARIS
13956 tls_get_addr = "__tls_get_addr";
13957#endif
351f65ca
L
13958 format = ELF_TARGET_FORMAT64;
13959 break;
7f56bc95 13960 case X86_64_X32_ABI:
4fa24527 13961 use_rela_relocations = 1;
351f65ca 13962 object_64bit = 1;
e379e5f3
L
13963#ifndef TE_SOLARIS
13964 tls_get_addr = "__tls_get_addr";
13965#endif
862be3fb 13966 disallow_64bit_reloc = 1;
351f65ca
L
13967 format = ELF_TARGET_FORMAT32;
13968 break;
4fa24527 13969 }
3632d14b 13970 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 13971 {
7f56bc95 13972 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
13973 as_fatal (_("Intel L1OM is 64bit only"));
13974 return ELF_TARGET_L1OM_FORMAT;
13975 }
b49f93f6 13976 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
13977 {
13978 if (x86_elf_abi != X86_64_ABI)
13979 as_fatal (_("Intel K1OM is 64bit only"));
13980 return ELF_TARGET_K1OM_FORMAT;
13981 }
81486035
L
13982 else if (cpu_arch_isa == PROCESSOR_IAMCU)
13983 {
13984 if (x86_elf_abi != I386_ABI)
13985 as_fatal (_("Intel MCU is 32bit only"));
13986 return ELF_TARGET_IAMCU_FORMAT;
13987 }
8a9036a4 13988 else
351f65ca 13989 return format;
3e73aa7c 13990 }
e57f8c65
TG
13991#endif
13992#if defined (OBJ_MACH_O)
13993 case bfd_target_mach_o_flavour:
d382c579
TG
13994 if (flag_code == CODE_64BIT)
13995 {
13996 use_rela_relocations = 1;
13997 object_64bit = 1;
13998 return "mach-o-x86-64";
13999 }
14000 else
14001 return "mach-o-i386";
4c63da97 14002#endif
252b5132
RH
14003 default:
14004 abort ();
14005 return NULL;
14006 }
14007}
14008
47926f60 14009#endif /* OBJ_MAYBE_ more than one */
252b5132 14010\f
252b5132 14011symbolS *
7016a5d5 14012md_undefined_symbol (char *name)
252b5132 14013{
18dc2407
ILT
14014 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
14015 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
14016 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
14017 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
14018 {
14019 if (!GOT_symbol)
14020 {
14021 if (symbol_find (name))
14022 as_bad (_("GOT already in symbol table"));
14023 GOT_symbol = symbol_new (name, undefined_section,
e01e1cee 14024 &zero_address_frag, 0);
24eab124
AM
14025 };
14026 return GOT_symbol;
14027 }
252b5132
RH
14028 return 0;
14029}
14030
14031/* Round up a section size to the appropriate boundary. */
47926f60 14032
252b5132 14033valueT
7016a5d5 14034md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 14035{
4c63da97
AM
14036#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
14037 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
14038 {
14039 /* For a.out, force the section size to be aligned. If we don't do
14040 this, BFD will align it for us, but it will not write out the
14041 final bytes of the section. This may be a bug in BFD, but it is
14042 easier to fix it here since that is how the other a.out targets
14043 work. */
14044 int align;
14045
fd361982 14046 align = bfd_section_alignment (segment);
8d3842cd 14047 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 14048 }
252b5132
RH
14049#endif
14050
14051 return size;
14052}
14053
14054/* On the i386, PC-relative offsets are relative to the start of the
14055 next instruction. That is, the address of the offset, plus its
14056 size, since the offset is always the last part of the insn. */
14057
14058long
e3bb37b5 14059md_pcrel_from (fixS *fixP)
252b5132
RH
14060{
14061 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
14062}
14063
14064#ifndef I386COFF
14065
14066static void
e3bb37b5 14067s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 14068{
29b0f896 14069 int temp;
252b5132 14070
8a75718c
JB
14071#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14072 if (IS_ELF)
14073 obj_elf_section_change_hook ();
14074#endif
252b5132
RH
14075 temp = get_absolute_expression ();
14076 subseg_set (bss_section, (subsegT) temp);
14077 demand_empty_rest_of_line ();
14078}
14079
14080#endif
14081
e379e5f3
L
14082/* Remember constant directive. */
14083
14084void
14085i386_cons_align (int ignore ATTRIBUTE_UNUSED)
14086{
14087 if (last_insn.kind != last_insn_directive
14088 && (bfd_section_flags (now_seg) & SEC_CODE))
14089 {
14090 last_insn.seg = now_seg;
14091 last_insn.kind = last_insn_directive;
14092 last_insn.name = "constant directive";
14093 last_insn.file = as_where (&last_insn.line);
ae531041
L
14094 if (lfence_before_ret != lfence_before_ret_none)
14095 {
14096 if (lfence_before_indirect_branch != lfence_branch_none)
14097 as_warn (_("constant directive skips -mlfence-before-ret "
14098 "and -mlfence-before-indirect-branch"));
14099 else
14100 as_warn (_("constant directive skips -mlfence-before-ret"));
14101 }
14102 else if (lfence_before_indirect_branch != lfence_branch_none)
14103 as_warn (_("constant directive skips -mlfence-before-indirect-branch"));
e379e5f3
L
14104 }
14105}
14106
3abbafc2 14107int
e3bb37b5 14108i386_validate_fix (fixS *fixp)
252b5132 14109{
3abbafc2
JB
14110#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14111 if (fixp->fx_r_type == BFD_RELOC_SIZE32
14112 || fixp->fx_r_type == BFD_RELOC_SIZE64)
14113 return IS_ELF && fixp->fx_addsy
14114 && (!S_IS_DEFINED (fixp->fx_addsy)
14115 || S_IS_EXTERNAL (fixp->fx_addsy));
14116#endif
14117
02a86693 14118 if (fixp->fx_subsy)
252b5132 14119 {
02a86693 14120 if (fixp->fx_subsy == GOT_symbol)
23df1078 14121 {
02a86693
L
14122 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
14123 {
14124 if (!object_64bit)
14125 abort ();
14126#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14127 if (fixp->fx_tcbit2)
56ceb5b5
L
14128 fixp->fx_r_type = (fixp->fx_tcbit
14129 ? BFD_RELOC_X86_64_REX_GOTPCRELX
14130 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
14131 else
14132#endif
14133 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
14134 }
d6ab8113 14135 else
02a86693
L
14136 {
14137 if (!object_64bit)
14138 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
14139 else
14140 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
14141 }
14142 fixp->fx_subsy = 0;
23df1078 14143 }
252b5132 14144 }
02a86693 14145#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2585b7a5 14146 else
02a86693 14147 {
2585b7a5
L
14148 /* NB: Commit 292676c1 resolved PLT32 reloc aganst local symbol
14149 to section. Since PLT32 relocation must be against symbols,
14150 turn such PLT32 relocation into PC32 relocation. */
14151 if (fixp->fx_addsy
14152 && (fixp->fx_r_type == BFD_RELOC_386_PLT32
14153 || fixp->fx_r_type == BFD_RELOC_X86_64_PLT32)
14154 && symbol_section_p (fixp->fx_addsy))
14155 fixp->fx_r_type = BFD_RELOC_32_PCREL;
14156 if (!object_64bit)
14157 {
14158 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
14159 && fixp->fx_tcbit2)
14160 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
14161 }
02a86693
L
14162 }
14163#endif
3abbafc2
JB
14164
14165 return 1;
252b5132
RH
14166}
14167
252b5132 14168arelent *
7016a5d5 14169tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
14170{
14171 arelent *rel;
14172 bfd_reloc_code_real_type code;
14173
14174 switch (fixp->fx_r_type)
14175 {
8ce3d284 14176#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
3abbafc2
JB
14177 symbolS *sym;
14178
8fd4256d
L
14179 case BFD_RELOC_SIZE32:
14180 case BFD_RELOC_SIZE64:
3abbafc2
JB
14181 if (fixp->fx_addsy
14182 && !bfd_is_abs_section (S_GET_SEGMENT (fixp->fx_addsy))
14183 && (!fixp->fx_subsy
14184 || bfd_is_abs_section (S_GET_SEGMENT (fixp->fx_subsy))))
14185 sym = fixp->fx_addsy;
14186 else if (fixp->fx_subsy
14187 && !bfd_is_abs_section (S_GET_SEGMENT (fixp->fx_subsy))
14188 && (!fixp->fx_addsy
14189 || bfd_is_abs_section (S_GET_SEGMENT (fixp->fx_addsy))))
14190 sym = fixp->fx_subsy;
14191 else
14192 sym = NULL;
14193 if (IS_ELF && sym && S_IS_DEFINED (sym) && !S_IS_EXTERNAL (sym))
8fd4256d
L
14194 {
14195 /* Resolve size relocation against local symbol to size of
14196 the symbol plus addend. */
3abbafc2 14197 valueT value = S_GET_SIZE (sym);
44f87162 14198
3abbafc2
JB
14199 if (symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM)
14200 value = bfd_section_size (S_GET_SEGMENT (sym));
14201 if (sym == fixp->fx_subsy)
14202 {
14203 value = -value;
14204 if (fixp->fx_addsy)
14205 value += S_GET_VALUE (fixp->fx_addsy);
14206 }
14207 else if (fixp->fx_subsy)
14208 value -= S_GET_VALUE (fixp->fx_subsy);
44f87162 14209 value += fixp->fx_offset;
8fd4256d 14210 if (fixp->fx_r_type == BFD_RELOC_SIZE32
d965814f 14211 && object_64bit
8fd4256d
L
14212 && !fits_in_unsigned_long (value))
14213 as_bad_where (fixp->fx_file, fixp->fx_line,
14214 _("symbol size computation overflow"));
14215 fixp->fx_addsy = NULL;
14216 fixp->fx_subsy = NULL;
14217 md_apply_fix (fixp, (valueT *) &value, NULL);
14218 return NULL;
14219 }
3abbafc2
JB
14220 if (!fixp->fx_addsy || fixp->fx_subsy)
14221 {
14222 as_bad_where (fixp->fx_file, fixp->fx_line,
14223 "unsupported expression involving @size");
14224 return NULL;
14225 }
8ce3d284 14226#endif
1a0670f3 14227 /* Fall through. */
8fd4256d 14228
3e73aa7c
JH
14229 case BFD_RELOC_X86_64_PLT32:
14230 case BFD_RELOC_X86_64_GOT32:
14231 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
14232 case BFD_RELOC_X86_64_GOTPCRELX:
14233 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
14234 case BFD_RELOC_386_PLT32:
14235 case BFD_RELOC_386_GOT32:
02a86693 14236 case BFD_RELOC_386_GOT32X:
252b5132
RH
14237 case BFD_RELOC_386_GOTOFF:
14238 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
14239 case BFD_RELOC_386_TLS_GD:
14240 case BFD_RELOC_386_TLS_LDM:
14241 case BFD_RELOC_386_TLS_LDO_32:
14242 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
14243 case BFD_RELOC_386_TLS_IE:
14244 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
14245 case BFD_RELOC_386_TLS_LE_32:
14246 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
14247 case BFD_RELOC_386_TLS_GOTDESC:
14248 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
14249 case BFD_RELOC_X86_64_TLSGD:
14250 case BFD_RELOC_X86_64_TLSLD:
14251 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 14252 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
14253 case BFD_RELOC_X86_64_GOTTPOFF:
14254 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
14255 case BFD_RELOC_X86_64_TPOFF64:
14256 case BFD_RELOC_X86_64_GOTOFF64:
14257 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
14258 case BFD_RELOC_X86_64_GOT64:
14259 case BFD_RELOC_X86_64_GOTPCREL64:
14260 case BFD_RELOC_X86_64_GOTPC64:
14261 case BFD_RELOC_X86_64_GOTPLT64:
14262 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
14263 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
14264 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
14265 case BFD_RELOC_RVA:
14266 case BFD_RELOC_VTABLE_ENTRY:
14267 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
14268#ifdef TE_PE
14269 case BFD_RELOC_32_SECREL:
14270#endif
252b5132
RH
14271 code = fixp->fx_r_type;
14272 break;
dbbaec26
L
14273 case BFD_RELOC_X86_64_32S:
14274 if (!fixp->fx_pcrel)
14275 {
14276 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
14277 code = fixp->fx_r_type;
14278 break;
14279 }
1a0670f3 14280 /* Fall through. */
252b5132 14281 default:
93382f6d 14282 if (fixp->fx_pcrel)
252b5132 14283 {
93382f6d
AM
14284 switch (fixp->fx_size)
14285 {
14286 default:
b091f402
AM
14287 as_bad_where (fixp->fx_file, fixp->fx_line,
14288 _("can not do %d byte pc-relative relocation"),
14289 fixp->fx_size);
93382f6d
AM
14290 code = BFD_RELOC_32_PCREL;
14291 break;
14292 case 1: code = BFD_RELOC_8_PCREL; break;
14293 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 14294 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
14295#ifdef BFD64
14296 case 8: code = BFD_RELOC_64_PCREL; break;
14297#endif
93382f6d
AM
14298 }
14299 }
14300 else
14301 {
14302 switch (fixp->fx_size)
14303 {
14304 default:
b091f402
AM
14305 as_bad_where (fixp->fx_file, fixp->fx_line,
14306 _("can not do %d byte relocation"),
14307 fixp->fx_size);
93382f6d
AM
14308 code = BFD_RELOC_32;
14309 break;
14310 case 1: code = BFD_RELOC_8; break;
14311 case 2: code = BFD_RELOC_16; break;
14312 case 4: code = BFD_RELOC_32; break;
937149dd 14313#ifdef BFD64
3e73aa7c 14314 case 8: code = BFD_RELOC_64; break;
937149dd 14315#endif
93382f6d 14316 }
252b5132
RH
14317 }
14318 break;
14319 }
252b5132 14320
d182319b
JB
14321 if ((code == BFD_RELOC_32
14322 || code == BFD_RELOC_32_PCREL
14323 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
14324 && GOT_symbol
14325 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 14326 {
4fa24527 14327 if (!object_64bit)
d6ab8113
JB
14328 code = BFD_RELOC_386_GOTPC;
14329 else
14330 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 14331 }
7b81dfbb
AJ
14332 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
14333 && GOT_symbol
14334 && fixp->fx_addsy == GOT_symbol)
14335 {
14336 code = BFD_RELOC_X86_64_GOTPC64;
14337 }
252b5132 14338
add39d23
TS
14339 rel = XNEW (arelent);
14340 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 14341 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
14342
14343 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 14344
3e73aa7c
JH
14345 if (!use_rela_relocations)
14346 {
14347 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
14348 vtable entry to be used in the relocation's section offset. */
14349 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14350 rel->address = fixp->fx_offset;
fbeb56a4
DK
14351#if defined (OBJ_COFF) && defined (TE_PE)
14352 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
14353 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
14354 else
14355#endif
c6682705 14356 rel->addend = 0;
3e73aa7c
JH
14357 }
14358 /* Use the rela in 64bit mode. */
252b5132 14359 else
3e73aa7c 14360 {
862be3fb
L
14361 if (disallow_64bit_reloc)
14362 switch (code)
14363 {
862be3fb
L
14364 case BFD_RELOC_X86_64_DTPOFF64:
14365 case BFD_RELOC_X86_64_TPOFF64:
14366 case BFD_RELOC_64_PCREL:
14367 case BFD_RELOC_X86_64_GOTOFF64:
14368 case BFD_RELOC_X86_64_GOT64:
14369 case BFD_RELOC_X86_64_GOTPCREL64:
14370 case BFD_RELOC_X86_64_GOTPC64:
14371 case BFD_RELOC_X86_64_GOTPLT64:
14372 case BFD_RELOC_X86_64_PLTOFF64:
14373 as_bad_where (fixp->fx_file, fixp->fx_line,
14374 _("cannot represent relocation type %s in x32 mode"),
14375 bfd_get_reloc_code_name (code));
14376 break;
14377 default:
14378 break;
14379 }
14380
062cd5e7
AS
14381 if (!fixp->fx_pcrel)
14382 rel->addend = fixp->fx_offset;
14383 else
14384 switch (code)
14385 {
14386 case BFD_RELOC_X86_64_PLT32:
14387 case BFD_RELOC_X86_64_GOT32:
14388 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
14389 case BFD_RELOC_X86_64_GOTPCRELX:
14390 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
14391 case BFD_RELOC_X86_64_TLSGD:
14392 case BFD_RELOC_X86_64_TLSLD:
14393 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
14394 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
14395 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
14396 rel->addend = fixp->fx_offset - fixp->fx_size;
14397 break;
14398 default:
14399 rel->addend = (section->vma
14400 - fixp->fx_size
14401 + fixp->fx_addnumber
14402 + md_pcrel_from (fixp));
14403 break;
14404 }
3e73aa7c
JH
14405 }
14406
252b5132
RH
14407 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
14408 if (rel->howto == NULL)
14409 {
14410 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 14411 _("cannot represent relocation type %s"),
252b5132
RH
14412 bfd_get_reloc_code_name (code));
14413 /* Set howto to a garbage value so that we can keep going. */
14414 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 14415 gas_assert (rel->howto != NULL);
252b5132
RH
14416 }
14417
14418 return rel;
14419}
14420
ee86248c 14421#include "tc-i386-intel.c"
54cfded0 14422
a60de03c
JB
14423void
14424tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 14425{
a60de03c
JB
14426 int saved_naked_reg;
14427 char saved_register_dot;
54cfded0 14428
a60de03c
JB
14429 saved_naked_reg = allow_naked_reg;
14430 allow_naked_reg = 1;
14431 saved_register_dot = register_chars['.'];
14432 register_chars['.'] = '.';
14433 allow_pseudo_reg = 1;
14434 expression_and_evaluate (exp);
14435 allow_pseudo_reg = 0;
14436 register_chars['.'] = saved_register_dot;
14437 allow_naked_reg = saved_naked_reg;
14438
e96d56a1 14439 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 14440 {
a60de03c
JB
14441 if ((addressT) exp->X_add_number < i386_regtab_size)
14442 {
14443 exp->X_op = O_constant;
14444 exp->X_add_number = i386_regtab[exp->X_add_number]
14445 .dw2_regnum[flag_code >> 1];
14446 }
14447 else
14448 exp->X_op = O_illegal;
54cfded0 14449 }
54cfded0
AM
14450}
14451
14452void
14453tc_x86_frame_initial_instructions (void)
14454{
a60de03c
JB
14455 static unsigned int sp_regno[2];
14456
14457 if (!sp_regno[flag_code >> 1])
14458 {
14459 char *saved_input = input_line_pointer;
14460 char sp[][4] = {"esp", "rsp"};
14461 expressionS exp;
a4447b93 14462
a60de03c
JB
14463 input_line_pointer = sp[flag_code >> 1];
14464 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 14465 gas_assert (exp.X_op == O_constant);
a60de03c
JB
14466 sp_regno[flag_code >> 1] = exp.X_add_number;
14467 input_line_pointer = saved_input;
14468 }
a4447b93 14469
61ff971f
L
14470 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
14471 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 14472}
d2b2c203 14473
d7921315
L
14474int
14475x86_dwarf2_addr_size (void)
14476{
14477#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
14478 if (x86_elf_abi == X86_64_X32_ABI)
14479 return 4;
14480#endif
14481 return bfd_arch_bits_per_address (stdoutput) / 8;
14482}
14483
d2b2c203
DJ
14484int
14485i386_elf_section_type (const char *str, size_t len)
14486{
14487 if (flag_code == CODE_64BIT
14488 && len == sizeof ("unwind") - 1
d34049e8 14489 && startswith (str, "unwind"))
d2b2c203
DJ
14490 return SHT_X86_64_UNWIND;
14491
14492 return -1;
14493}
bb41ade5 14494
ad5fec3b
EB
14495#ifdef TE_SOLARIS
14496void
14497i386_solaris_fix_up_eh_frame (segT sec)
14498{
14499 if (flag_code == CODE_64BIT)
14500 elf_section_type (sec) = SHT_X86_64_UNWIND;
14501}
14502#endif
14503
bb41ade5
AM
14504#ifdef TE_PE
14505void
14506tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
14507{
91d6fa6a 14508 expressionS exp;
bb41ade5 14509
91d6fa6a
NC
14510 exp.X_op = O_secrel;
14511 exp.X_add_symbol = symbol;
14512 exp.X_add_number = 0;
14513 emit_expr (&exp, size);
bb41ade5
AM
14514}
14515#endif
3b22753a
L
14516
14517#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14518/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
14519
01e1a5bc 14520bfd_vma
6d4af3c2 14521x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
14522{
14523 if (flag_code == CODE_64BIT)
14524 {
14525 if (letter == 'l')
14526 return SHF_X86_64_LARGE;
14527
8f3bae45 14528 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 14529 }
3b22753a 14530 else
8f3bae45 14531 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
14532 return -1;
14533}
14534
01e1a5bc 14535bfd_vma
3b22753a
L
14536x86_64_section_word (char *str, size_t len)
14537{
08dedd66 14538 if (len == 5 && flag_code == CODE_64BIT && startswith (str, "large"))
3b22753a
L
14539 return SHF_X86_64_LARGE;
14540
14541 return -1;
14542}
14543
14544static void
14545handle_large_common (int small ATTRIBUTE_UNUSED)
14546{
14547 if (flag_code != CODE_64BIT)
14548 {
14549 s_comm_internal (0, elf_common_parse);
14550 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
14551 }
14552 else
14553 {
14554 static segT lbss_section;
14555 asection *saved_com_section_ptr = elf_com_section_ptr;
14556 asection *saved_bss_section = bss_section;
14557
14558 if (lbss_section == NULL)
14559 {
14560 flagword applicable;
14561 segT seg = now_seg;
14562 subsegT subseg = now_subseg;
14563
14564 /* The .lbss section is for local .largecomm symbols. */
14565 lbss_section = subseg_new (".lbss", 0);
14566 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 14567 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
14568 seg_info (lbss_section)->bss = 1;
14569
14570 subseg_set (seg, subseg);
14571 }
14572
14573 elf_com_section_ptr = &_bfd_elf_large_com_section;
14574 bss_section = lbss_section;
14575
14576 s_comm_internal (0, elf_common_parse);
14577
14578 elf_com_section_ptr = saved_com_section_ptr;
14579 bss_section = saved_bss_section;
14580 }
14581}
14582#endif /* OBJ_ELF || OBJ_MAYBE_ELF */