gdb: use function_view for iterate_over_bp_locations' callback
[deliverable/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];
521static char digit_chars[256];
522
ce8a8b2f 523/* Lexical macros. */
252b5132
RH
524#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
525#define is_operand_char(x) (operand_chars[(unsigned char) x])
526#define is_register_char(x) (register_chars[(unsigned char) x])
527#define is_space_char(x) ((x) == ' ')
528#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
529#define is_digit_char(x) (digit_chars[(unsigned char) x])
530
0234cb7c 531/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
532static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
533
534/* md_assemble() always leaves the strings it's passed unaltered. To
535 effect this we maintain a stack of saved characters that we've smashed
536 with '\0's (indicating end of strings for various sub-fields of the
47926f60 537 assembler instruction). */
252b5132 538static char save_stack[32];
ce8a8b2f 539static char *save_stack_p;
252b5132
RH
540#define END_STRING_AND_SAVE(s) \
541 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
542#define RESTORE_END_STRING(s) \
543 do { *(s) = *--save_stack_p; } while (0)
544
47926f60 545/* The instruction we're assembling. */
252b5132
RH
546static i386_insn i;
547
548/* Possible templates for current insn. */
549static const templates *current_templates;
550
31b2323c
L
551/* Per instruction expressionS buffers: max displacements & immediates. */
552static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
553static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 554
47926f60 555/* Current operand we are working on. */
ee86248c 556static int this_operand = -1;
252b5132 557
3e73aa7c
JH
558/* We support four different modes. FLAG_CODE variable is used to distinguish
559 these. */
560
561enum flag_code {
562 CODE_32BIT,
563 CODE_16BIT,
564 CODE_64BIT };
565
566static enum flag_code flag_code;
4fa24527 567static unsigned int object_64bit;
862be3fb 568static unsigned int disallow_64bit_reloc;
3e73aa7c 569static int use_rela_relocations = 0;
e379e5f3
L
570/* __tls_get_addr/___tls_get_addr symbol for TLS. */
571static const char *tls_get_addr;
3e73aa7c 572
7af8ed2d
NC
573#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
574 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
575 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
576
351f65ca
L
577/* The ELF ABI to use. */
578enum x86_elf_abi
579{
580 I386_ABI,
7f56bc95
L
581 X86_64_ABI,
582 X86_64_X32_ABI
351f65ca
L
583};
584
585static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 586#endif
351f65ca 587
167ad85b
TG
588#if defined (TE_PE) || defined (TE_PEP)
589/* Use big object file format. */
590static int use_big_obj = 0;
591#endif
592
8dcea932
L
593#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
594/* 1 if generating code for a shared library. */
595static int shared = 0;
596#endif
597
47926f60
KH
598/* 1 for intel syntax,
599 0 if att syntax. */
600static int intel_syntax = 0;
252b5132 601
4b5aaf5f
L
602static enum x86_64_isa
603{
604 amd64 = 1, /* AMD64 ISA. */
605 intel64 /* Intel64 ISA. */
606} isa64;
e89c5eaa 607
1efbbeb4
L
608/* 1 for intel mnemonic,
609 0 if att mnemonic. */
610static int intel_mnemonic = !SYSV386_COMPAT;
611
a60de03c
JB
612/* 1 if pseudo registers are permitted. */
613static int allow_pseudo_reg = 0;
614
47926f60
KH
615/* 1 if register prefix % not required. */
616static int allow_naked_reg = 0;
252b5132 617
33eaf5de 618/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
619 instructions supporting it, even if this prefix wasn't specified
620 explicitly. */
621static int add_bnd_prefix = 0;
622
ba104c83 623/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
624static int allow_index_reg = 0;
625
d022bddd
IT
626/* 1 if the assembler should ignore LOCK prefix, even if it was
627 specified explicitly. */
628static int omit_lock_prefix = 0;
629
e4e00185
AS
630/* 1 if the assembler should encode lfence, mfence, and sfence as
631 "lock addl $0, (%{re}sp)". */
632static int avoid_fence = 0;
633
ae531041
L
634/* 1 if lfence should be inserted after every load. */
635static int lfence_after_load = 0;
636
637/* Non-zero if lfence should be inserted before indirect branch. */
638static enum lfence_before_indirect_branch_kind
639 {
640 lfence_branch_none = 0,
641 lfence_branch_register,
642 lfence_branch_memory,
643 lfence_branch_all
644 }
645lfence_before_indirect_branch;
646
647/* Non-zero if lfence should be inserted before ret. */
648static enum lfence_before_ret_kind
649 {
650 lfence_before_ret_none = 0,
651 lfence_before_ret_not,
a09f656b 652 lfence_before_ret_or,
653 lfence_before_ret_shl
ae531041
L
654 }
655lfence_before_ret;
656
657/* Types of previous instruction is .byte or prefix. */
e379e5f3
L
658static struct
659 {
660 segT seg;
661 const char *file;
662 const char *name;
663 unsigned int line;
664 enum last_insn_kind
665 {
666 last_insn_other = 0,
667 last_insn_directive,
668 last_insn_prefix
669 } kind;
670 } last_insn;
671
0cb4071e
L
672/* 1 if the assembler should generate relax relocations. */
673
674static int generate_relax_relocations
675 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
676
7bab8ab5 677static enum check_kind
daf50ae7 678 {
7bab8ab5
JB
679 check_none = 0,
680 check_warning,
681 check_error
daf50ae7 682 }
7bab8ab5 683sse_check, operand_check = check_warning;
daf50ae7 684
e379e5f3
L
685/* Non-zero if branches should be aligned within power of 2 boundary. */
686static int align_branch_power = 0;
687
688/* Types of branches to align. */
689enum align_branch_kind
690 {
691 align_branch_none = 0,
692 align_branch_jcc = 1,
693 align_branch_fused = 2,
694 align_branch_jmp = 3,
695 align_branch_call = 4,
696 align_branch_indirect = 5,
697 align_branch_ret = 6
698 };
699
700/* Type bits of branches to align. */
701enum align_branch_bit
702 {
703 align_branch_jcc_bit = 1 << align_branch_jcc,
704 align_branch_fused_bit = 1 << align_branch_fused,
705 align_branch_jmp_bit = 1 << align_branch_jmp,
706 align_branch_call_bit = 1 << align_branch_call,
707 align_branch_indirect_bit = 1 << align_branch_indirect,
708 align_branch_ret_bit = 1 << align_branch_ret
709 };
710
711static unsigned int align_branch = (align_branch_jcc_bit
712 | align_branch_fused_bit
713 | align_branch_jmp_bit);
714
79d72f45
HL
715/* Types of condition jump used by macro-fusion. */
716enum mf_jcc_kind
717 {
718 mf_jcc_jo = 0, /* base opcode 0x70 */
719 mf_jcc_jc, /* base opcode 0x72 */
720 mf_jcc_je, /* base opcode 0x74 */
721 mf_jcc_jna, /* base opcode 0x76 */
722 mf_jcc_js, /* base opcode 0x78 */
723 mf_jcc_jp, /* base opcode 0x7a */
724 mf_jcc_jl, /* base opcode 0x7c */
725 mf_jcc_jle, /* base opcode 0x7e */
726 };
727
728/* Types of compare flag-modifying insntructions used by macro-fusion. */
729enum mf_cmp_kind
730 {
731 mf_cmp_test_and, /* test/cmp */
732 mf_cmp_alu_cmp, /* add/sub/cmp */
733 mf_cmp_incdec /* inc/dec */
734 };
735
e379e5f3
L
736/* The maximum padding size for fused jcc. CMP like instruction can
737 be 9 bytes and jcc can be 6 bytes. Leave room just in case for
738 prefixes. */
739#define MAX_FUSED_JCC_PADDING_SIZE 20
740
741/* The maximum number of prefixes added for an instruction. */
742static unsigned int align_branch_prefix_size = 5;
743
b6f8c7c4
L
744/* Optimization:
745 1. Clear the REX_W bit with register operand if possible.
746 2. Above plus use 128bit vector instruction to clear the full vector
747 register.
748 */
749static int optimize = 0;
750
751/* Optimization:
752 1. Clear the REX_W bit with register operand if possible.
753 2. Above plus use 128bit vector instruction to clear the full vector
754 register.
755 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
756 "testb $imm7,%r8".
757 */
758static int optimize_for_space = 0;
759
2ca3ace5
L
760/* Register prefix used for error message. */
761static const char *register_prefix = "%";
762
47926f60
KH
763/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
764 leave, push, and pop instructions so that gcc has the same stack
765 frame as in 32 bit mode. */
766static char stackop_size = '\0';
eecb386c 767
12b55ccc
L
768/* Non-zero to optimize code alignment. */
769int optimize_align_code = 1;
770
47926f60
KH
771/* Non-zero to quieten some warnings. */
772static int quiet_warnings = 0;
a38cf1db 773
47926f60
KH
774/* CPU name. */
775static const char *cpu_arch_name = NULL;
6305a203 776static char *cpu_sub_arch_name = NULL;
a38cf1db 777
47926f60 778/* CPU feature flags. */
40fb9820
L
779static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
780
ccc9c027
L
781/* If we have selected a cpu we are generating instructions for. */
782static int cpu_arch_tune_set = 0;
783
9103f4f4 784/* Cpu we are generating instructions for. */
fbf3f584 785enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4
L
786
787/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 788static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 789
ccc9c027 790/* CPU instruction set architecture used. */
fbf3f584 791enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 792
9103f4f4 793/* CPU feature flags of instruction set architecture used. */
fbf3f584 794i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 795
fddf5b5b
AM
796/* If set, conditional jumps are not automatically promoted to handle
797 larger than a byte offset. */
798static unsigned int no_cond_jump_promotion = 0;
799
c0f3af97
L
800/* Encode SSE instructions with VEX prefix. */
801static unsigned int sse2avx;
802
539f890d
L
803/* Encode scalar AVX instructions with specific vector length. */
804static enum
805 {
806 vex128 = 0,
807 vex256
808 } avxscalar;
809
03751133
L
810/* Encode VEX WIG instructions with specific vex.w. */
811static enum
812 {
813 vexw0 = 0,
814 vexw1
815 } vexwig;
816
43234a1e
L
817/* Encode scalar EVEX LIG instructions with specific vector length. */
818static enum
819 {
820 evexl128 = 0,
821 evexl256,
822 evexl512
823 } evexlig;
824
825/* Encode EVEX WIG instructions with specific evex.w. */
826static enum
827 {
828 evexw0 = 0,
829 evexw1
830 } evexwig;
831
d3d3c6db
IT
832/* Value to encode in EVEX RC bits, for SAE-only instructions. */
833static enum rc_type evexrcig = rne;
834
29b0f896 835/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 836static symbolS *GOT_symbol;
29b0f896 837
a4447b93
RH
838/* The dwarf2 return column, adjusted for 32 or 64 bit. */
839unsigned int x86_dwarf2_return_column;
840
841/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
842int x86_cie_data_alignment;
843
252b5132 844/* Interface to relax_segment.
fddf5b5b
AM
845 There are 3 major relax states for 386 jump insns because the
846 different types of jumps add different sizes to frags when we're
e379e5f3
L
847 figuring out what sort of jump to choose to reach a given label.
848
849 BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING are used to align
850 branches which are handled by md_estimate_size_before_relax() and
851 i386_generic_table_relax_frag(). */
252b5132 852
47926f60 853/* Types. */
93c2a809
AM
854#define UNCOND_JUMP 0
855#define COND_JUMP 1
856#define COND_JUMP86 2
e379e5f3
L
857#define BRANCH_PADDING 3
858#define BRANCH_PREFIX 4
859#define FUSED_JCC_PADDING 5
fddf5b5b 860
47926f60 861/* Sizes. */
252b5132
RH
862#define CODE16 1
863#define SMALL 0
29b0f896 864#define SMALL16 (SMALL | CODE16)
252b5132 865#define BIG 2
29b0f896 866#define BIG16 (BIG | CODE16)
252b5132
RH
867
868#ifndef INLINE
869#ifdef __GNUC__
870#define INLINE __inline__
871#else
872#define INLINE
873#endif
874#endif
875
fddf5b5b
AM
876#define ENCODE_RELAX_STATE(type, size) \
877 ((relax_substateT) (((type) << 2) | (size)))
878#define TYPE_FROM_RELAX_STATE(s) \
879 ((s) >> 2)
880#define DISP_SIZE_FROM_RELAX_STATE(s) \
881 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
882
883/* This table is used by relax_frag to promote short jumps to long
884 ones where necessary. SMALL (short) jumps may be promoted to BIG
885 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
886 don't allow a short jump in a 32 bit code segment to be promoted to
887 a 16 bit offset jump because it's slower (requires data size
888 prefix), and doesn't work, unless the destination is in the bottom
889 64k of the code segment (The top 16 bits of eip are zeroed). */
890
891const relax_typeS md_relax_table[] =
892{
24eab124
AM
893 /* The fields are:
894 1) most positive reach of this state,
895 2) most negative reach of this state,
93c2a809 896 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 897 4) which index into the table to try if we can't fit into this one. */
252b5132 898
fddf5b5b 899 /* UNCOND_JUMP states. */
93c2a809
AM
900 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
901 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
902 /* dword jmp adds 4 bytes to frag:
903 0 extra opcode bytes, 4 displacement bytes. */
252b5132 904 {0, 0, 4, 0},
93c2a809
AM
905 /* word jmp adds 2 byte2 to frag:
906 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
907 {0, 0, 2, 0},
908
93c2a809
AM
909 /* COND_JUMP states. */
910 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
911 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
912 /* dword conditionals adds 5 bytes to frag:
913 1 extra opcode byte, 4 displacement bytes. */
914 {0, 0, 5, 0},
fddf5b5b 915 /* word conditionals add 3 bytes to frag:
93c2a809
AM
916 1 extra opcode byte, 2 displacement bytes. */
917 {0, 0, 3, 0},
918
919 /* COND_JUMP86 states. */
920 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
921 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
922 /* dword conditionals adds 5 bytes to frag:
923 1 extra opcode byte, 4 displacement bytes. */
924 {0, 0, 5, 0},
925 /* word conditionals add 4 bytes to frag:
926 1 displacement byte and a 3 byte long branch insn. */
927 {0, 0, 4, 0}
252b5132
RH
928};
929
9103f4f4
L
930static const arch_entry cpu_arch[] =
931{
89507696
JB
932 /* Do not replace the first two entries - i386_target_format()
933 relies on them being there in this order. */
8a2c8fef 934 { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
293f5f65 935 CPU_GENERIC32_FLAGS, 0 },
8a2c8fef 936 { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
293f5f65 937 CPU_GENERIC64_FLAGS, 0 },
8a2c8fef 938 { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
293f5f65 939 CPU_NONE_FLAGS, 0 },
8a2c8fef 940 { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
293f5f65 941 CPU_I186_FLAGS, 0 },
8a2c8fef 942 { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
293f5f65 943 CPU_I286_FLAGS, 0 },
8a2c8fef 944 { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
293f5f65 945 CPU_I386_FLAGS, 0 },
8a2c8fef 946 { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
293f5f65 947 CPU_I486_FLAGS, 0 },
8a2c8fef 948 { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
293f5f65 949 CPU_I586_FLAGS, 0 },
8a2c8fef 950 { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
293f5f65 951 CPU_I686_FLAGS, 0 },
8a2c8fef 952 { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
293f5f65 953 CPU_I586_FLAGS, 0 },
8a2c8fef 954 { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
293f5f65 955 CPU_PENTIUMPRO_FLAGS, 0 },
8a2c8fef 956 { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
293f5f65 957 CPU_P2_FLAGS, 0 },
8a2c8fef 958 { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
293f5f65 959 CPU_P3_FLAGS, 0 },
8a2c8fef 960 { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
293f5f65 961 CPU_P4_FLAGS, 0 },
8a2c8fef 962 { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
293f5f65 963 CPU_CORE_FLAGS, 0 },
8a2c8fef 964 { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
293f5f65 965 CPU_NOCONA_FLAGS, 0 },
8a2c8fef 966 { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
293f5f65 967 CPU_CORE_FLAGS, 1 },
8a2c8fef 968 { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
293f5f65 969 CPU_CORE_FLAGS, 0 },
8a2c8fef 970 { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
293f5f65 971 CPU_CORE2_FLAGS, 1 },
8a2c8fef 972 { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
293f5f65 973 CPU_CORE2_FLAGS, 0 },
8a2c8fef 974 { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
293f5f65 975 CPU_COREI7_FLAGS, 0 },
8a2c8fef 976 { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
293f5f65 977 CPU_L1OM_FLAGS, 0 },
7a9068fe 978 { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
293f5f65 979 CPU_K1OM_FLAGS, 0 },
81486035 980 { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
293f5f65 981 CPU_IAMCU_FLAGS, 0 },
8a2c8fef 982 { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
293f5f65 983 CPU_K6_FLAGS, 0 },
8a2c8fef 984 { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
293f5f65 985 CPU_K6_2_FLAGS, 0 },
8a2c8fef 986 { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
293f5f65 987 CPU_ATHLON_FLAGS, 0 },
8a2c8fef 988 { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
293f5f65 989 CPU_K8_FLAGS, 1 },
8a2c8fef 990 { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
293f5f65 991 CPU_K8_FLAGS, 0 },
8a2c8fef 992 { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
293f5f65 993 CPU_K8_FLAGS, 0 },
8a2c8fef 994 { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
293f5f65 995 CPU_AMDFAM10_FLAGS, 0 },
8aedb9fe 996 { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
293f5f65 997 CPU_BDVER1_FLAGS, 0 },
8aedb9fe 998 { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
293f5f65 999 CPU_BDVER2_FLAGS, 0 },
5e5c50d3 1000 { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
293f5f65 1001 CPU_BDVER3_FLAGS, 0 },
c7b0bd56 1002 { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
293f5f65 1003 CPU_BDVER4_FLAGS, 0 },
029f3522 1004 { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
293f5f65 1005 CPU_ZNVER1_FLAGS, 0 },
a9660a6f
AP
1006 { STRING_COMMA_LEN ("znver2"), PROCESSOR_ZNVER,
1007 CPU_ZNVER2_FLAGS, 0 },
646cc3e0
GG
1008 { STRING_COMMA_LEN ("znver3"), PROCESSOR_ZNVER,
1009 CPU_ZNVER3_FLAGS, 0 },
7b458c12 1010 { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
293f5f65 1011 CPU_BTVER1_FLAGS, 0 },
7b458c12 1012 { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
293f5f65 1013 CPU_BTVER2_FLAGS, 0 },
8a2c8fef 1014 { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
293f5f65 1015 CPU_8087_FLAGS, 0 },
8a2c8fef 1016 { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
293f5f65 1017 CPU_287_FLAGS, 0 },
8a2c8fef 1018 { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
293f5f65 1019 CPU_387_FLAGS, 0 },
1848e567
L
1020 { STRING_COMMA_LEN (".687"), PROCESSOR_UNKNOWN,
1021 CPU_687_FLAGS, 0 },
d871f3f4
L
1022 { STRING_COMMA_LEN (".cmov"), PROCESSOR_UNKNOWN,
1023 CPU_CMOV_FLAGS, 0 },
1024 { STRING_COMMA_LEN (".fxsr"), PROCESSOR_UNKNOWN,
1025 CPU_FXSR_FLAGS, 0 },
8a2c8fef 1026 { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
293f5f65 1027 CPU_MMX_FLAGS, 0 },
8a2c8fef 1028 { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
293f5f65 1029 CPU_SSE_FLAGS, 0 },
8a2c8fef 1030 { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
293f5f65 1031 CPU_SSE2_FLAGS, 0 },
8a2c8fef 1032 { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
293f5f65 1033 CPU_SSE3_FLAGS, 0 },
af5c13b0
L
1034 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
1035 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1036 { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
293f5f65 1037 CPU_SSSE3_FLAGS, 0 },
8a2c8fef 1038 { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
293f5f65 1039 CPU_SSE4_1_FLAGS, 0 },
8a2c8fef 1040 { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
293f5f65 1041 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1042 { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
293f5f65 1043 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1044 { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
293f5f65 1045 CPU_AVX_FLAGS, 0 },
6c30d220 1046 { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
293f5f65 1047 CPU_AVX2_FLAGS, 0 },
43234a1e 1048 { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
293f5f65 1049 CPU_AVX512F_FLAGS, 0 },
43234a1e 1050 { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
293f5f65 1051 CPU_AVX512CD_FLAGS, 0 },
43234a1e 1052 { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
293f5f65 1053 CPU_AVX512ER_FLAGS, 0 },
43234a1e 1054 { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
293f5f65 1055 CPU_AVX512PF_FLAGS, 0 },
1dfc6506 1056 { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
293f5f65 1057 CPU_AVX512DQ_FLAGS, 0 },
1dfc6506 1058 { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
293f5f65 1059 CPU_AVX512BW_FLAGS, 0 },
1dfc6506 1060 { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
293f5f65 1061 CPU_AVX512VL_FLAGS, 0 },
8a2c8fef 1062 { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
293f5f65 1063 CPU_VMX_FLAGS, 0 },
8729a6f6 1064 { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
293f5f65 1065 CPU_VMFUNC_FLAGS, 0 },
8a2c8fef 1066 { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
293f5f65 1067 CPU_SMX_FLAGS, 0 },
8a2c8fef 1068 { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
293f5f65 1069 CPU_XSAVE_FLAGS, 0 },
c7b8aa3a 1070 { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
293f5f65 1071 CPU_XSAVEOPT_FLAGS, 0 },
1dfc6506 1072 { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
293f5f65 1073 CPU_XSAVEC_FLAGS, 0 },
1dfc6506 1074 { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
293f5f65 1075 CPU_XSAVES_FLAGS, 0 },
8a2c8fef 1076 { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
293f5f65 1077 CPU_AES_FLAGS, 0 },
8a2c8fef 1078 { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
293f5f65 1079 CPU_PCLMUL_FLAGS, 0 },
8a2c8fef 1080 { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
293f5f65 1081 CPU_PCLMUL_FLAGS, 1 },
c7b8aa3a 1082 { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
293f5f65 1083 CPU_FSGSBASE_FLAGS, 0 },
c7b8aa3a 1084 { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
293f5f65 1085 CPU_RDRND_FLAGS, 0 },
c7b8aa3a 1086 { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
293f5f65 1087 CPU_F16C_FLAGS, 0 },
6c30d220 1088 { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
293f5f65 1089 CPU_BMI2_FLAGS, 0 },
8a2c8fef 1090 { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
293f5f65 1091 CPU_FMA_FLAGS, 0 },
8a2c8fef 1092 { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
293f5f65 1093 CPU_FMA4_FLAGS, 0 },
8a2c8fef 1094 { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
293f5f65 1095 CPU_XOP_FLAGS, 0 },
8a2c8fef 1096 { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
293f5f65 1097 CPU_LWP_FLAGS, 0 },
8a2c8fef 1098 { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
293f5f65 1099 CPU_MOVBE_FLAGS, 0 },
60aa667e 1100 { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
293f5f65 1101 CPU_CX16_FLAGS, 0 },
8a2c8fef 1102 { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
293f5f65 1103 CPU_EPT_FLAGS, 0 },
6c30d220 1104 { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
293f5f65 1105 CPU_LZCNT_FLAGS, 0 },
272a84b1
L
1106 { STRING_COMMA_LEN (".popcnt"), PROCESSOR_UNKNOWN,
1107 CPU_POPCNT_FLAGS, 0 },
42164a71 1108 { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
293f5f65 1109 CPU_HLE_FLAGS, 0 },
42164a71 1110 { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
293f5f65 1111 CPU_RTM_FLAGS, 0 },
6c30d220 1112 { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
293f5f65 1113 CPU_INVPCID_FLAGS, 0 },
8a2c8fef 1114 { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
293f5f65 1115 CPU_CLFLUSH_FLAGS, 0 },
22109423 1116 { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
293f5f65 1117 CPU_NOP_FLAGS, 0 },
8a2c8fef 1118 { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
293f5f65 1119 CPU_SYSCALL_FLAGS, 0 },
8a2c8fef 1120 { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
293f5f65 1121 CPU_RDTSCP_FLAGS, 0 },
8a2c8fef 1122 { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
293f5f65 1123 CPU_3DNOW_FLAGS, 0 },
8a2c8fef 1124 { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
293f5f65 1125 CPU_3DNOWA_FLAGS, 0 },
8a2c8fef 1126 { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
293f5f65 1127 CPU_PADLOCK_FLAGS, 0 },
8a2c8fef 1128 { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
293f5f65 1129 CPU_SVME_FLAGS, 1 },
8a2c8fef 1130 { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
293f5f65 1131 CPU_SVME_FLAGS, 0 },
8a2c8fef 1132 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
293f5f65 1133 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1134 { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
293f5f65 1135 CPU_ABM_FLAGS, 0 },
87973e9f 1136 { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
293f5f65 1137 CPU_BMI_FLAGS, 0 },
2a2a0f38 1138 { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
293f5f65 1139 CPU_TBM_FLAGS, 0 },
e2e1fcde 1140 { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
293f5f65 1141 CPU_ADX_FLAGS, 0 },
e2e1fcde 1142 { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
293f5f65 1143 CPU_RDSEED_FLAGS, 0 },
e2e1fcde 1144 { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
293f5f65 1145 CPU_PRFCHW_FLAGS, 0 },
5c111e37 1146 { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
293f5f65 1147 CPU_SMAP_FLAGS, 0 },
7e8b059b 1148 { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
293f5f65 1149 CPU_MPX_FLAGS, 0 },
a0046408 1150 { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
293f5f65 1151 CPU_SHA_FLAGS, 0 },
963f3586 1152 { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
293f5f65 1153 CPU_CLFLUSHOPT_FLAGS, 0 },
dcf893b5 1154 { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
293f5f65 1155 CPU_PREFETCHWT1_FLAGS, 0 },
2cf200a4 1156 { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
293f5f65 1157 CPU_SE1_FLAGS, 0 },
c5e7287a 1158 { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
293f5f65 1159 CPU_CLWB_FLAGS, 0 },
2cc1b5aa 1160 { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
293f5f65 1161 CPU_AVX512IFMA_FLAGS, 0 },
14f195c9 1162 { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
293f5f65 1163 CPU_AVX512VBMI_FLAGS, 0 },
920d2ddc
IT
1164 { STRING_COMMA_LEN (".avx512_4fmaps"), PROCESSOR_UNKNOWN,
1165 CPU_AVX512_4FMAPS_FLAGS, 0 },
47acf0bd
IT
1166 { STRING_COMMA_LEN (".avx512_4vnniw"), PROCESSOR_UNKNOWN,
1167 CPU_AVX512_4VNNIW_FLAGS, 0 },
620214f7
IT
1168 { STRING_COMMA_LEN (".avx512_vpopcntdq"), PROCESSOR_UNKNOWN,
1169 CPU_AVX512_VPOPCNTDQ_FLAGS, 0 },
53467f57
IT
1170 { STRING_COMMA_LEN (".avx512_vbmi2"), PROCESSOR_UNKNOWN,
1171 CPU_AVX512_VBMI2_FLAGS, 0 },
8cfcb765
IT
1172 { STRING_COMMA_LEN (".avx512_vnni"), PROCESSOR_UNKNOWN,
1173 CPU_AVX512_VNNI_FLAGS, 0 },
ee6872be
IT
1174 { STRING_COMMA_LEN (".avx512_bitalg"), PROCESSOR_UNKNOWN,
1175 CPU_AVX512_BITALG_FLAGS, 0 },
58bf9b6a
L
1176 { STRING_COMMA_LEN (".avx_vnni"), PROCESSOR_UNKNOWN,
1177 CPU_AVX_VNNI_FLAGS, 0 },
029f3522 1178 { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
293f5f65 1179 CPU_CLZERO_FLAGS, 0 },
9916071f 1180 { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
293f5f65 1181 CPU_MWAITX_FLAGS, 0 },
8eab4136 1182 { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
293f5f65 1183 CPU_OSPKE_FLAGS, 0 },
8bc52696 1184 { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
293f5f65 1185 CPU_RDPID_FLAGS, 0 },
6b40c462
L
1186 { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
1187 CPU_PTWRITE_FLAGS, 0 },
d777820b
IT
1188 { STRING_COMMA_LEN (".ibt"), PROCESSOR_UNKNOWN,
1189 CPU_IBT_FLAGS, 0 },
1190 { STRING_COMMA_LEN (".shstk"), PROCESSOR_UNKNOWN,
1191 CPU_SHSTK_FLAGS, 0 },
48521003
IT
1192 { STRING_COMMA_LEN (".gfni"), PROCESSOR_UNKNOWN,
1193 CPU_GFNI_FLAGS, 0 },
8dcf1fad
IT
1194 { STRING_COMMA_LEN (".vaes"), PROCESSOR_UNKNOWN,
1195 CPU_VAES_FLAGS, 0 },
ff1982d5
IT
1196 { STRING_COMMA_LEN (".vpclmulqdq"), PROCESSOR_UNKNOWN,
1197 CPU_VPCLMULQDQ_FLAGS, 0 },
3233d7d0
IT
1198 { STRING_COMMA_LEN (".wbnoinvd"), PROCESSOR_UNKNOWN,
1199 CPU_WBNOINVD_FLAGS, 0 },
be3a8dca
IT
1200 { STRING_COMMA_LEN (".pconfig"), PROCESSOR_UNKNOWN,
1201 CPU_PCONFIG_FLAGS, 0 },
de89d0a3
IT
1202 { STRING_COMMA_LEN (".waitpkg"), PROCESSOR_UNKNOWN,
1203 CPU_WAITPKG_FLAGS, 0 },
c48935d7
IT
1204 { STRING_COMMA_LEN (".cldemote"), PROCESSOR_UNKNOWN,
1205 CPU_CLDEMOTE_FLAGS, 0 },
260cd341
LC
1206 { STRING_COMMA_LEN (".amx_int8"), PROCESSOR_UNKNOWN,
1207 CPU_AMX_INT8_FLAGS, 0 },
1208 { STRING_COMMA_LEN (".amx_bf16"), PROCESSOR_UNKNOWN,
1209 CPU_AMX_BF16_FLAGS, 0 },
1210 { STRING_COMMA_LEN (".amx_tile"), PROCESSOR_UNKNOWN,
1211 CPU_AMX_TILE_FLAGS, 0 },
c0a30a9f
L
1212 { STRING_COMMA_LEN (".movdiri"), PROCESSOR_UNKNOWN,
1213 CPU_MOVDIRI_FLAGS, 0 },
1214 { STRING_COMMA_LEN (".movdir64b"), PROCESSOR_UNKNOWN,
1215 CPU_MOVDIR64B_FLAGS, 0 },
d6aab7a1
XG
1216 { STRING_COMMA_LEN (".avx512_bf16"), PROCESSOR_UNKNOWN,
1217 CPU_AVX512_BF16_FLAGS, 0 },
9186c494
L
1218 { STRING_COMMA_LEN (".avx512_vp2intersect"), PROCESSOR_UNKNOWN,
1219 CPU_AVX512_VP2INTERSECT_FLAGS, 0 },
81d54bb7
CL
1220 { STRING_COMMA_LEN (".tdx"), PROCESSOR_UNKNOWN,
1221 CPU_TDX_FLAGS, 0 },
dd455cf5
L
1222 { STRING_COMMA_LEN (".enqcmd"), PROCESSOR_UNKNOWN,
1223 CPU_ENQCMD_FLAGS, 0 },
4b27d27c
L
1224 { STRING_COMMA_LEN (".serialize"), PROCESSOR_UNKNOWN,
1225 CPU_SERIALIZE_FLAGS, 0 },
142861df
JB
1226 { STRING_COMMA_LEN (".rdpru"), PROCESSOR_UNKNOWN,
1227 CPU_RDPRU_FLAGS, 0 },
1228 { STRING_COMMA_LEN (".mcommit"), PROCESSOR_UNKNOWN,
1229 CPU_MCOMMIT_FLAGS, 0 },
a847e322
JB
1230 { STRING_COMMA_LEN (".sev_es"), PROCESSOR_UNKNOWN,
1231 CPU_SEV_ES_FLAGS, 0 },
bb651e8b
CL
1232 { STRING_COMMA_LEN (".tsxldtrk"), PROCESSOR_UNKNOWN,
1233 CPU_TSXLDTRK_FLAGS, 0 },
c4694f17
TG
1234 { STRING_COMMA_LEN (".kl"), PROCESSOR_UNKNOWN,
1235 CPU_KL_FLAGS, 0 },
1236 { STRING_COMMA_LEN (".widekl"), PROCESSOR_UNKNOWN,
1237 CPU_WIDEKL_FLAGS, 0 },
f64c42a9
LC
1238 { STRING_COMMA_LEN (".uintr"), PROCESSOR_UNKNOWN,
1239 CPU_UINTR_FLAGS, 0 },
c1fa250a
LC
1240 { STRING_COMMA_LEN (".hreset"), PROCESSOR_UNKNOWN,
1241 CPU_HRESET_FLAGS, 0 },
293f5f65
L
1242};
1243
1244static const noarch_entry cpu_noarch[] =
1245{
1246 { STRING_COMMA_LEN ("no87"), CPU_ANY_X87_FLAGS },
1848e567
L
1247 { STRING_COMMA_LEN ("no287"), CPU_ANY_287_FLAGS },
1248 { STRING_COMMA_LEN ("no387"), CPU_ANY_387_FLAGS },
1249 { STRING_COMMA_LEN ("no687"), CPU_ANY_687_FLAGS },
d871f3f4
L
1250 { STRING_COMMA_LEN ("nocmov"), CPU_ANY_CMOV_FLAGS },
1251 { STRING_COMMA_LEN ("nofxsr"), CPU_ANY_FXSR_FLAGS },
293f5f65
L
1252 { STRING_COMMA_LEN ("nommx"), CPU_ANY_MMX_FLAGS },
1253 { STRING_COMMA_LEN ("nosse"), CPU_ANY_SSE_FLAGS },
1848e567
L
1254 { STRING_COMMA_LEN ("nosse2"), CPU_ANY_SSE2_FLAGS },
1255 { STRING_COMMA_LEN ("nosse3"), CPU_ANY_SSE3_FLAGS },
af5c13b0 1256 { STRING_COMMA_LEN ("nosse4a"), CPU_ANY_SSE4A_FLAGS },
1848e567
L
1257 { STRING_COMMA_LEN ("nossse3"), CPU_ANY_SSSE3_FLAGS },
1258 { STRING_COMMA_LEN ("nosse4.1"), CPU_ANY_SSE4_1_FLAGS },
1259 { STRING_COMMA_LEN ("nosse4.2"), CPU_ANY_SSE4_2_FLAGS },
af5c13b0 1260 { STRING_COMMA_LEN ("nosse4"), CPU_ANY_SSE4_1_FLAGS },
293f5f65 1261 { STRING_COMMA_LEN ("noavx"), CPU_ANY_AVX_FLAGS },
1848e567 1262 { STRING_COMMA_LEN ("noavx2"), CPU_ANY_AVX2_FLAGS },
144b71e2
L
1263 { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
1264 { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
1265 { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
1266 { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
1267 { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
1268 { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
1269 { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
1270 { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
1271 { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
920d2ddc 1272 { STRING_COMMA_LEN ("noavx512_4fmaps"), CPU_ANY_AVX512_4FMAPS_FLAGS },
47acf0bd 1273 { STRING_COMMA_LEN ("noavx512_4vnniw"), CPU_ANY_AVX512_4VNNIW_FLAGS },
620214f7 1274 { STRING_COMMA_LEN ("noavx512_vpopcntdq"), CPU_ANY_AVX512_VPOPCNTDQ_FLAGS },
53467f57 1275 { STRING_COMMA_LEN ("noavx512_vbmi2"), CPU_ANY_AVX512_VBMI2_FLAGS },
8cfcb765 1276 { STRING_COMMA_LEN ("noavx512_vnni"), CPU_ANY_AVX512_VNNI_FLAGS },
ee6872be 1277 { STRING_COMMA_LEN ("noavx512_bitalg"), CPU_ANY_AVX512_BITALG_FLAGS },
58bf9b6a 1278 { STRING_COMMA_LEN ("noavx_vnni"), CPU_ANY_AVX_VNNI_FLAGS },
d777820b
IT
1279 { STRING_COMMA_LEN ("noibt"), CPU_ANY_IBT_FLAGS },
1280 { STRING_COMMA_LEN ("noshstk"), CPU_ANY_SHSTK_FLAGS },
260cd341
LC
1281 { STRING_COMMA_LEN ("noamx_int8"), CPU_ANY_AMX_INT8_FLAGS },
1282 { STRING_COMMA_LEN ("noamx_bf16"), CPU_ANY_AMX_BF16_FLAGS },
1283 { STRING_COMMA_LEN ("noamx_tile"), CPU_ANY_AMX_TILE_FLAGS },
c0a30a9f
L
1284 { STRING_COMMA_LEN ("nomovdiri"), CPU_ANY_MOVDIRI_FLAGS },
1285 { STRING_COMMA_LEN ("nomovdir64b"), CPU_ANY_MOVDIR64B_FLAGS },
d6aab7a1 1286 { STRING_COMMA_LEN ("noavx512_bf16"), CPU_ANY_AVX512_BF16_FLAGS },
708a2fff
CL
1287 { STRING_COMMA_LEN ("noavx512_vp2intersect"),
1288 CPU_ANY_AVX512_VP2INTERSECT_FLAGS },
81d54bb7 1289 { STRING_COMMA_LEN ("notdx"), CPU_ANY_TDX_FLAGS },
dd455cf5 1290 { STRING_COMMA_LEN ("noenqcmd"), CPU_ANY_ENQCMD_FLAGS },
4b27d27c 1291 { STRING_COMMA_LEN ("noserialize"), CPU_ANY_SERIALIZE_FLAGS },
bb651e8b 1292 { STRING_COMMA_LEN ("notsxldtrk"), CPU_ANY_TSXLDTRK_FLAGS },
c4694f17
TG
1293 { STRING_COMMA_LEN ("nokl"), CPU_ANY_KL_FLAGS },
1294 { STRING_COMMA_LEN ("nowidekl"), CPU_ANY_WIDEKL_FLAGS },
f64c42a9 1295 { STRING_COMMA_LEN ("nouintr"), CPU_ANY_UINTR_FLAGS },
c1fa250a 1296 { STRING_COMMA_LEN ("nohreset"), CPU_ANY_HRESET_FLAGS },
e413e4e9
AM
1297};
1298
704209c0 1299#ifdef I386COFF
a6c24e68
NC
1300/* Like s_lcomm_internal in gas/read.c but the alignment string
1301 is allowed to be optional. */
1302
1303static symbolS *
1304pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1305{
1306 addressT align = 0;
1307
1308 SKIP_WHITESPACE ();
1309
7ab9ffdd 1310 if (needs_align
a6c24e68
NC
1311 && *input_line_pointer == ',')
1312 {
1313 align = parse_align (needs_align - 1);
7ab9ffdd 1314
a6c24e68
NC
1315 if (align == (addressT) -1)
1316 return NULL;
1317 }
1318 else
1319 {
1320 if (size >= 8)
1321 align = 3;
1322 else if (size >= 4)
1323 align = 2;
1324 else if (size >= 2)
1325 align = 1;
1326 else
1327 align = 0;
1328 }
1329
1330 bss_alloc (symbolP, size, align);
1331 return symbolP;
1332}
1333
704209c0 1334static void
a6c24e68
NC
1335pe_lcomm (int needs_align)
1336{
1337 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1338}
704209c0 1339#endif
a6c24e68 1340
29b0f896
AM
1341const pseudo_typeS md_pseudo_table[] =
1342{
1343#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1344 {"align", s_align_bytes, 0},
1345#else
1346 {"align", s_align_ptwo, 0},
1347#endif
1348 {"arch", set_cpu_arch, 0},
1349#ifndef I386COFF
1350 {"bss", s_bss, 0},
a6c24e68
NC
1351#else
1352 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1353#endif
1354 {"ffloat", float_cons, 'f'},
1355 {"dfloat", float_cons, 'd'},
1356 {"tfloat", float_cons, 'x'},
1357 {"value", cons, 2},
d182319b 1358 {"slong", signed_cons, 4},
29b0f896
AM
1359 {"noopt", s_ignore, 0},
1360 {"optim", s_ignore, 0},
1361 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1362 {"code16", set_code_flag, CODE_16BIT},
1363 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1364#ifdef BFD64
29b0f896 1365 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1366#endif
29b0f896
AM
1367 {"intel_syntax", set_intel_syntax, 1},
1368 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1369 {"intel_mnemonic", set_intel_mnemonic, 1},
1370 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1371 {"allow_index_reg", set_allow_index_reg, 1},
1372 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1373 {"sse_check", set_check, 0},
1374 {"operand_check", set_check, 1},
3b22753a
L
1375#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1376 {"largecomm", handle_large_common, 0},
07a53e5c 1377#else
68d20676 1378 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1379 {"loc", dwarf2_directive_loc, 0},
1380 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1381#endif
6482c264
NC
1382#ifdef TE_PE
1383 {"secrel32", pe_directive_secrel, 0},
1384#endif
29b0f896
AM
1385 {0, 0, 0}
1386};
1387
1388/* For interface with expression (). */
1389extern char *input_line_pointer;
1390
1391/* Hash table for instruction mnemonic lookup. */
629310ab 1392static htab_t op_hash;
29b0f896
AM
1393
1394/* Hash table for register lookup. */
629310ab 1395static htab_t reg_hash;
29b0f896 1396\f
ce8a8b2f
AM
1397 /* Various efficient no-op patterns for aligning code labels.
1398 Note: Don't try to assemble the instructions in the comments.
1399 0L and 0w are not legal. */
62a02d25
L
1400static const unsigned char f32_1[] =
1401 {0x90}; /* nop */
1402static const unsigned char f32_2[] =
1403 {0x66,0x90}; /* xchg %ax,%ax */
1404static const unsigned char f32_3[] =
1405 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1406static const unsigned char f32_4[] =
1407 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
62a02d25
L
1408static const unsigned char f32_6[] =
1409 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1410static const unsigned char f32_7[] =
1411 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
62a02d25 1412static const unsigned char f16_3[] =
3ae729d5 1413 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
62a02d25 1414static const unsigned char f16_4[] =
3ae729d5
L
1415 {0x8d,0xb4,0x00,0x00}; /* lea 0W(%si),%si */
1416static const unsigned char jump_disp8[] =
1417 {0xeb}; /* jmp disp8 */
1418static const unsigned char jump32_disp32[] =
1419 {0xe9}; /* jmp disp32 */
1420static const unsigned char jump16_disp32[] =
1421 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1422/* 32-bit NOPs patterns. */
1423static const unsigned char *const f32_patt[] = {
3ae729d5 1424 f32_1, f32_2, f32_3, f32_4, NULL, f32_6, f32_7
62a02d25
L
1425};
1426/* 16-bit NOPs patterns. */
1427static const unsigned char *const f16_patt[] = {
3ae729d5 1428 f32_1, f32_2, f16_3, f16_4
62a02d25
L
1429};
1430/* nopl (%[re]ax) */
1431static const unsigned char alt_3[] =
1432 {0x0f,0x1f,0x00};
1433/* nopl 0(%[re]ax) */
1434static const unsigned char alt_4[] =
1435 {0x0f,0x1f,0x40,0x00};
1436/* nopl 0(%[re]ax,%[re]ax,1) */
1437static const unsigned char alt_5[] =
1438 {0x0f,0x1f,0x44,0x00,0x00};
1439/* nopw 0(%[re]ax,%[re]ax,1) */
1440static const unsigned char alt_6[] =
1441 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1442/* nopl 0L(%[re]ax) */
1443static const unsigned char alt_7[] =
1444 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1445/* nopl 0L(%[re]ax,%[re]ax,1) */
1446static const unsigned char alt_8[] =
1447 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1448/* nopw 0L(%[re]ax,%[re]ax,1) */
1449static const unsigned char alt_9[] =
1450 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1451/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1452static const unsigned char alt_10[] =
1453 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
3ae729d5
L
1454/* data16 nopw %cs:0L(%eax,%eax,1) */
1455static const unsigned char alt_11[] =
1456 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1457/* 32-bit and 64-bit NOPs patterns. */
1458static const unsigned char *const alt_patt[] = {
1459 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1460 alt_9, alt_10, alt_11
62a02d25
L
1461};
1462
1463/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1464 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1465
1466static void
1467i386_output_nops (char *where, const unsigned char *const *patt,
1468 int count, int max_single_nop_size)
1469
1470{
3ae729d5
L
1471 /* Place the longer NOP first. */
1472 int last;
1473 int offset;
3076e594
NC
1474 const unsigned char *nops;
1475
1476 if (max_single_nop_size < 1)
1477 {
1478 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1479 max_single_nop_size);
1480 return;
1481 }
1482
1483 nops = patt[max_single_nop_size - 1];
3ae729d5
L
1484
1485 /* Use the smaller one if the requsted one isn't available. */
1486 if (nops == NULL)
62a02d25 1487 {
3ae729d5
L
1488 max_single_nop_size--;
1489 nops = patt[max_single_nop_size - 1];
62a02d25
L
1490 }
1491
3ae729d5
L
1492 last = count % max_single_nop_size;
1493
1494 count -= last;
1495 for (offset = 0; offset < count; offset += max_single_nop_size)
1496 memcpy (where + offset, nops, max_single_nop_size);
1497
1498 if (last)
1499 {
1500 nops = patt[last - 1];
1501 if (nops == NULL)
1502 {
1503 /* Use the smaller one plus one-byte NOP if the needed one
1504 isn't available. */
1505 last--;
1506 nops = patt[last - 1];
1507 memcpy (where + offset, nops, last);
1508 where[offset + last] = *patt[0];
1509 }
1510 else
1511 memcpy (where + offset, nops, last);
1512 }
62a02d25
L
1513}
1514
3ae729d5
L
1515static INLINE int
1516fits_in_imm7 (offsetT num)
1517{
1518 return (num & 0x7f) == num;
1519}
1520
1521static INLINE int
1522fits_in_imm31 (offsetT num)
1523{
1524 return (num & 0x7fffffff) == num;
1525}
62a02d25
L
1526
1527/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1528 single NOP instruction LIMIT. */
1529
1530void
3ae729d5 1531i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1532{
3ae729d5 1533 const unsigned char *const *patt = NULL;
62a02d25 1534 int max_single_nop_size;
3ae729d5
L
1535 /* Maximum number of NOPs before switching to jump over NOPs. */
1536 int max_number_of_nops;
62a02d25 1537
3ae729d5 1538 switch (fragP->fr_type)
62a02d25 1539 {
3ae729d5
L
1540 case rs_fill_nop:
1541 case rs_align_code:
1542 break;
e379e5f3
L
1543 case rs_machine_dependent:
1544 /* Allow NOP padding for jumps and calls. */
1545 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
1546 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
1547 break;
1548 /* Fall through. */
3ae729d5 1549 default:
62a02d25
L
1550 return;
1551 }
1552
ccc9c027
L
1553 /* We need to decide which NOP sequence to use for 32bit and
1554 64bit. When -mtune= is used:
4eed87de 1555
76bc74dc
L
1556 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
1557 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1558 2. For the rest, alt_patt will be used.
1559
1560 When -mtune= isn't used, alt_patt will be used if
22109423 1561 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will
76bc74dc 1562 be used.
ccc9c027
L
1563
1564 When -march= or .arch is used, we can't use anything beyond
1565 cpu_arch_isa_flags. */
1566
1567 if (flag_code == CODE_16BIT)
1568 {
3ae729d5
L
1569 patt = f16_patt;
1570 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1571 /* Limit number of NOPs to 2 in 16-bit mode. */
1572 max_number_of_nops = 2;
252b5132 1573 }
33fef721 1574 else
ccc9c027 1575 {
fbf3f584 1576 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027
L
1577 {
1578 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
1579 switch (cpu_arch_tune)
1580 {
1581 case PROCESSOR_UNKNOWN:
1582 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423
L
1583 optimize with nops. */
1584 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1585 patt = alt_patt;
ccc9c027
L
1586 else
1587 patt = f32_patt;
1588 break;
ccc9c027
L
1589 case PROCESSOR_PENTIUM4:
1590 case PROCESSOR_NOCONA:
ef05d495 1591 case PROCESSOR_CORE:
76bc74dc 1592 case PROCESSOR_CORE2:
bd5295b2 1593 case PROCESSOR_COREI7:
3632d14b 1594 case PROCESSOR_L1OM:
7a9068fe 1595 case PROCESSOR_K1OM:
76bc74dc 1596 case PROCESSOR_GENERIC64:
ccc9c027
L
1597 case PROCESSOR_K6:
1598 case PROCESSOR_ATHLON:
1599 case PROCESSOR_K8:
4eed87de 1600 case PROCESSOR_AMDFAM10:
8aedb9fe 1601 case PROCESSOR_BD:
029f3522 1602 case PROCESSOR_ZNVER:
7b458c12 1603 case PROCESSOR_BT:
80b8656c 1604 patt = alt_patt;
ccc9c027 1605 break;
76bc74dc 1606 case PROCESSOR_I386:
ccc9c027
L
1607 case PROCESSOR_I486:
1608 case PROCESSOR_PENTIUM:
2dde1948 1609 case PROCESSOR_PENTIUMPRO:
81486035 1610 case PROCESSOR_IAMCU:
ccc9c027
L
1611 case PROCESSOR_GENERIC32:
1612 patt = f32_patt;
1613 break;
4eed87de 1614 }
ccc9c027
L
1615 }
1616 else
1617 {
fbf3f584 1618 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1619 {
1620 case PROCESSOR_UNKNOWN:
e6a14101 1621 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1622 PROCESSOR_UNKNOWN. */
1623 abort ();
1624 break;
1625
76bc74dc 1626 case PROCESSOR_I386:
ccc9c027
L
1627 case PROCESSOR_I486:
1628 case PROCESSOR_PENTIUM:
81486035 1629 case PROCESSOR_IAMCU:
ccc9c027
L
1630 case PROCESSOR_K6:
1631 case PROCESSOR_ATHLON:
1632 case PROCESSOR_K8:
4eed87de 1633 case PROCESSOR_AMDFAM10:
8aedb9fe 1634 case PROCESSOR_BD:
029f3522 1635 case PROCESSOR_ZNVER:
7b458c12 1636 case PROCESSOR_BT:
ccc9c027
L
1637 case PROCESSOR_GENERIC32:
1638 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423
L
1639 with nops. */
1640 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1641 patt = alt_patt;
ccc9c027
L
1642 else
1643 patt = f32_patt;
1644 break;
76bc74dc
L
1645 case PROCESSOR_PENTIUMPRO:
1646 case PROCESSOR_PENTIUM4:
1647 case PROCESSOR_NOCONA:
1648 case PROCESSOR_CORE:
ef05d495 1649 case PROCESSOR_CORE2:
bd5295b2 1650 case PROCESSOR_COREI7:
3632d14b 1651 case PROCESSOR_L1OM:
7a9068fe 1652 case PROCESSOR_K1OM:
22109423 1653 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1654 patt = alt_patt;
ccc9c027
L
1655 else
1656 patt = f32_patt;
1657 break;
1658 case PROCESSOR_GENERIC64:
80b8656c 1659 patt = alt_patt;
ccc9c027 1660 break;
4eed87de 1661 }
ccc9c027
L
1662 }
1663
76bc74dc
L
1664 if (patt == f32_patt)
1665 {
3ae729d5
L
1666 max_single_nop_size = sizeof (f32_patt) / sizeof (f32_patt[0]);
1667 /* Limit number of NOPs to 2 for older processors. */
1668 max_number_of_nops = 2;
76bc74dc
L
1669 }
1670 else
1671 {
3ae729d5
L
1672 max_single_nop_size = sizeof (alt_patt) / sizeof (alt_patt[0]);
1673 /* Limit number of NOPs to 7 for newer processors. */
1674 max_number_of_nops = 7;
1675 }
1676 }
1677
1678 if (limit == 0)
1679 limit = max_single_nop_size;
1680
1681 if (fragP->fr_type == rs_fill_nop)
1682 {
1683 /* Output NOPs for .nop directive. */
1684 if (limit > max_single_nop_size)
1685 {
1686 as_bad_where (fragP->fr_file, fragP->fr_line,
1687 _("invalid single nop size: %d "
1688 "(expect within [0, %d])"),
1689 limit, max_single_nop_size);
1690 return;
1691 }
1692 }
e379e5f3 1693 else if (fragP->fr_type != rs_machine_dependent)
3ae729d5
L
1694 fragP->fr_var = count;
1695
1696 if ((count / max_single_nop_size) > max_number_of_nops)
1697 {
1698 /* Generate jump over NOPs. */
1699 offsetT disp = count - 2;
1700 if (fits_in_imm7 (disp))
1701 {
1702 /* Use "jmp disp8" if possible. */
1703 count = disp;
1704 where[0] = jump_disp8[0];
1705 where[1] = count;
1706 where += 2;
1707 }
1708 else
1709 {
1710 unsigned int size_of_jump;
1711
1712 if (flag_code == CODE_16BIT)
1713 {
1714 where[0] = jump16_disp32[0];
1715 where[1] = jump16_disp32[1];
1716 size_of_jump = 2;
1717 }
1718 else
1719 {
1720 where[0] = jump32_disp32[0];
1721 size_of_jump = 1;
1722 }
1723
1724 count -= size_of_jump + 4;
1725 if (!fits_in_imm31 (count))
1726 {
1727 as_bad_where (fragP->fr_file, fragP->fr_line,
1728 _("jump over nop padding out of range"));
1729 return;
1730 }
1731
1732 md_number_to_chars (where + size_of_jump, count, 4);
1733 where += size_of_jump + 4;
76bc74dc 1734 }
ccc9c027 1735 }
3ae729d5
L
1736
1737 /* Generate multiple NOPs. */
1738 i386_output_nops (where, patt, count, limit);
252b5132
RH
1739}
1740
c6fb90c8 1741static INLINE int
0dfbf9d7 1742operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1743{
0dfbf9d7 1744 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1745 {
1746 case 3:
0dfbf9d7 1747 if (x->array[2])
c6fb90c8 1748 return 0;
1a0670f3 1749 /* Fall through. */
c6fb90c8 1750 case 2:
0dfbf9d7 1751 if (x->array[1])
c6fb90c8 1752 return 0;
1a0670f3 1753 /* Fall through. */
c6fb90c8 1754 case 1:
0dfbf9d7 1755 return !x->array[0];
c6fb90c8
L
1756 default:
1757 abort ();
1758 }
40fb9820
L
1759}
1760
c6fb90c8 1761static INLINE void
0dfbf9d7 1762operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1763{
0dfbf9d7 1764 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1765 {
1766 case 3:
0dfbf9d7 1767 x->array[2] = v;
1a0670f3 1768 /* Fall through. */
c6fb90c8 1769 case 2:
0dfbf9d7 1770 x->array[1] = v;
1a0670f3 1771 /* Fall through. */
c6fb90c8 1772 case 1:
0dfbf9d7 1773 x->array[0] = v;
1a0670f3 1774 /* Fall through. */
c6fb90c8
L
1775 break;
1776 default:
1777 abort ();
1778 }
bab6aec1
JB
1779
1780 x->bitfield.class = ClassNone;
75e5731b 1781 x->bitfield.instance = InstanceNone;
c6fb90c8 1782}
40fb9820 1783
c6fb90c8 1784static INLINE int
0dfbf9d7
L
1785operand_type_equal (const union i386_operand_type *x,
1786 const union i386_operand_type *y)
c6fb90c8 1787{
0dfbf9d7 1788 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1789 {
1790 case 3:
0dfbf9d7 1791 if (x->array[2] != y->array[2])
c6fb90c8 1792 return 0;
1a0670f3 1793 /* Fall through. */
c6fb90c8 1794 case 2:
0dfbf9d7 1795 if (x->array[1] != y->array[1])
c6fb90c8 1796 return 0;
1a0670f3 1797 /* Fall through. */
c6fb90c8 1798 case 1:
0dfbf9d7 1799 return x->array[0] == y->array[0];
c6fb90c8
L
1800 break;
1801 default:
1802 abort ();
1803 }
1804}
40fb9820 1805
0dfbf9d7
L
1806static INLINE int
1807cpu_flags_all_zero (const union i386_cpu_flags *x)
1808{
1809 switch (ARRAY_SIZE(x->array))
1810 {
53467f57
IT
1811 case 4:
1812 if (x->array[3])
1813 return 0;
1814 /* Fall through. */
0dfbf9d7
L
1815 case 3:
1816 if (x->array[2])
1817 return 0;
1a0670f3 1818 /* Fall through. */
0dfbf9d7
L
1819 case 2:
1820 if (x->array[1])
1821 return 0;
1a0670f3 1822 /* Fall through. */
0dfbf9d7
L
1823 case 1:
1824 return !x->array[0];
1825 default:
1826 abort ();
1827 }
1828}
1829
0dfbf9d7
L
1830static INLINE int
1831cpu_flags_equal (const union i386_cpu_flags *x,
1832 const union i386_cpu_flags *y)
1833{
1834 switch (ARRAY_SIZE(x->array))
1835 {
53467f57
IT
1836 case 4:
1837 if (x->array[3] != y->array[3])
1838 return 0;
1839 /* Fall through. */
0dfbf9d7
L
1840 case 3:
1841 if (x->array[2] != y->array[2])
1842 return 0;
1a0670f3 1843 /* Fall through. */
0dfbf9d7
L
1844 case 2:
1845 if (x->array[1] != y->array[1])
1846 return 0;
1a0670f3 1847 /* Fall through. */
0dfbf9d7
L
1848 case 1:
1849 return x->array[0] == y->array[0];
1850 break;
1851 default:
1852 abort ();
1853 }
1854}
c6fb90c8
L
1855
1856static INLINE int
1857cpu_flags_check_cpu64 (i386_cpu_flags f)
1858{
1859 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
1860 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
1861}
1862
c6fb90c8
L
1863static INLINE i386_cpu_flags
1864cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1865{
c6fb90c8
L
1866 switch (ARRAY_SIZE (x.array))
1867 {
53467f57
IT
1868 case 4:
1869 x.array [3] &= y.array [3];
1870 /* Fall through. */
c6fb90c8
L
1871 case 3:
1872 x.array [2] &= y.array [2];
1a0670f3 1873 /* Fall through. */
c6fb90c8
L
1874 case 2:
1875 x.array [1] &= y.array [1];
1a0670f3 1876 /* Fall through. */
c6fb90c8
L
1877 case 1:
1878 x.array [0] &= y.array [0];
1879 break;
1880 default:
1881 abort ();
1882 }
1883 return x;
1884}
40fb9820 1885
c6fb90c8
L
1886static INLINE i386_cpu_flags
1887cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1888{
c6fb90c8 1889 switch (ARRAY_SIZE (x.array))
40fb9820 1890 {
53467f57
IT
1891 case 4:
1892 x.array [3] |= y.array [3];
1893 /* Fall through. */
c6fb90c8
L
1894 case 3:
1895 x.array [2] |= y.array [2];
1a0670f3 1896 /* Fall through. */
c6fb90c8
L
1897 case 2:
1898 x.array [1] |= y.array [1];
1a0670f3 1899 /* Fall through. */
c6fb90c8
L
1900 case 1:
1901 x.array [0] |= y.array [0];
40fb9820
L
1902 break;
1903 default:
1904 abort ();
1905 }
40fb9820
L
1906 return x;
1907}
1908
309d3373
JB
1909static INLINE i386_cpu_flags
1910cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1911{
1912 switch (ARRAY_SIZE (x.array))
1913 {
53467f57
IT
1914 case 4:
1915 x.array [3] &= ~y.array [3];
1916 /* Fall through. */
309d3373
JB
1917 case 3:
1918 x.array [2] &= ~y.array [2];
1a0670f3 1919 /* Fall through. */
309d3373
JB
1920 case 2:
1921 x.array [1] &= ~y.array [1];
1a0670f3 1922 /* Fall through. */
309d3373
JB
1923 case 1:
1924 x.array [0] &= ~y.array [0];
1925 break;
1926 default:
1927 abort ();
1928 }
1929 return x;
1930}
1931
6c0946d0
JB
1932static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
1933
c0f3af97
L
1934#define CPU_FLAGS_ARCH_MATCH 0x1
1935#define CPU_FLAGS_64BIT_MATCH 0x2
1936
c0f3af97 1937#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1938 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1939
1940/* Return CPU flags match bits. */
3629bb00 1941
40fb9820 1942static int
d3ce72d0 1943cpu_flags_match (const insn_template *t)
40fb9820 1944{
c0f3af97
L
1945 i386_cpu_flags x = t->cpu_flags;
1946 int match = cpu_flags_check_cpu64 (x) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820
L
1947
1948 x.bitfield.cpu64 = 0;
1949 x.bitfield.cpuno64 = 0;
1950
0dfbf9d7 1951 if (cpu_flags_all_zero (&x))
c0f3af97
L
1952 {
1953 /* This instruction is available on all archs. */
db12e14e 1954 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1955 }
3629bb00
L
1956 else
1957 {
c0f3af97 1958 /* This instruction is available only on some archs. */
3629bb00
L
1959 i386_cpu_flags cpu = cpu_arch_flags;
1960
ab592e75
JB
1961 /* AVX512VL is no standalone feature - match it and then strip it. */
1962 if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl)
1963 return match;
1964 x.bitfield.cpuavx512vl = 0;
1965
3629bb00 1966 cpu = cpu_flags_and (x, cpu);
c0f3af97
L
1967 if (!cpu_flags_all_zero (&cpu))
1968 {
57392598 1969 if (x.bitfield.cpuavx)
a5ff0eb2 1970 {
929f69fa 1971 /* We need to check a few extra flags with AVX. */
b9d49817 1972 if (cpu.bitfield.cpuavx
40d231b4
JB
1973 && (!t->opcode_modifier.sse2avx
1974 || (sse2avx && !i.prefix[DATA_PREFIX]))
b9d49817 1975 && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
929f69fa 1976 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
b9d49817
JB
1977 && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
1978 match |= CPU_FLAGS_ARCH_MATCH;
a5ff0eb2 1979 }
929f69fa
JB
1980 else if (x.bitfield.cpuavx512f)
1981 {
1982 /* We need to check a few extra flags with AVX512F. */
1983 if (cpu.bitfield.cpuavx512f
1984 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
1985 && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes)
1986 && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq))
1987 match |= CPU_FLAGS_ARCH_MATCH;
1988 }
a5ff0eb2 1989 else
db12e14e 1990 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1991 }
3629bb00 1992 }
c0f3af97 1993 return match;
40fb9820
L
1994}
1995
c6fb90c8
L
1996static INLINE i386_operand_type
1997operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 1998{
bab6aec1
JB
1999 if (x.bitfield.class != y.bitfield.class)
2000 x.bitfield.class = ClassNone;
75e5731b
JB
2001 if (x.bitfield.instance != y.bitfield.instance)
2002 x.bitfield.instance = InstanceNone;
bab6aec1 2003
c6fb90c8
L
2004 switch (ARRAY_SIZE (x.array))
2005 {
2006 case 3:
2007 x.array [2] &= y.array [2];
1a0670f3 2008 /* Fall through. */
c6fb90c8
L
2009 case 2:
2010 x.array [1] &= y.array [1];
1a0670f3 2011 /* Fall through. */
c6fb90c8
L
2012 case 1:
2013 x.array [0] &= y.array [0];
2014 break;
2015 default:
2016 abort ();
2017 }
2018 return x;
40fb9820
L
2019}
2020
73053c1f
JB
2021static INLINE i386_operand_type
2022operand_type_and_not (i386_operand_type x, i386_operand_type y)
2023{
bab6aec1 2024 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2025 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2026
73053c1f
JB
2027 switch (ARRAY_SIZE (x.array))
2028 {
2029 case 3:
2030 x.array [2] &= ~y.array [2];
2031 /* Fall through. */
2032 case 2:
2033 x.array [1] &= ~y.array [1];
2034 /* Fall through. */
2035 case 1:
2036 x.array [0] &= ~y.array [0];
2037 break;
2038 default:
2039 abort ();
2040 }
2041 return x;
2042}
2043
c6fb90c8
L
2044static INLINE i386_operand_type
2045operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 2046{
bab6aec1
JB
2047 gas_assert (x.bitfield.class == ClassNone ||
2048 y.bitfield.class == ClassNone ||
2049 x.bitfield.class == y.bitfield.class);
75e5731b
JB
2050 gas_assert (x.bitfield.instance == InstanceNone ||
2051 y.bitfield.instance == InstanceNone ||
2052 x.bitfield.instance == y.bitfield.instance);
bab6aec1 2053
c6fb90c8 2054 switch (ARRAY_SIZE (x.array))
40fb9820 2055 {
c6fb90c8
L
2056 case 3:
2057 x.array [2] |= y.array [2];
1a0670f3 2058 /* Fall through. */
c6fb90c8
L
2059 case 2:
2060 x.array [1] |= y.array [1];
1a0670f3 2061 /* Fall through. */
c6fb90c8
L
2062 case 1:
2063 x.array [0] |= y.array [0];
40fb9820
L
2064 break;
2065 default:
2066 abort ();
2067 }
c6fb90c8
L
2068 return x;
2069}
40fb9820 2070
c6fb90c8
L
2071static INLINE i386_operand_type
2072operand_type_xor (i386_operand_type x, i386_operand_type y)
2073{
bab6aec1 2074 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2075 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2076
c6fb90c8
L
2077 switch (ARRAY_SIZE (x.array))
2078 {
2079 case 3:
2080 x.array [2] ^= y.array [2];
1a0670f3 2081 /* Fall through. */
c6fb90c8
L
2082 case 2:
2083 x.array [1] ^= y.array [1];
1a0670f3 2084 /* Fall through. */
c6fb90c8
L
2085 case 1:
2086 x.array [0] ^= y.array [0];
2087 break;
2088 default:
2089 abort ();
2090 }
40fb9820
L
2091 return x;
2092}
2093
40fb9820
L
2094static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
2095static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
2096static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
2097static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
bab6aec1
JB
2098static const i386_operand_type anydisp = OPERAND_TYPE_ANYDISP;
2099static const i386_operand_type anyimm = OPERAND_TYPE_ANYIMM;
40fb9820 2100static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
43234a1e 2101static const i386_operand_type regmask = OPERAND_TYPE_REGMASK;
40fb9820
L
2102static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
2103static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
2104static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
2105static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
2106static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
2107static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
2108static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
2109static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
2110static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
2111
2112enum operand_type
2113{
2114 reg,
40fb9820
L
2115 imm,
2116 disp,
2117 anymem
2118};
2119
c6fb90c8 2120static INLINE int
40fb9820
L
2121operand_type_check (i386_operand_type t, enum operand_type c)
2122{
2123 switch (c)
2124 {
2125 case reg:
bab6aec1 2126 return t.bitfield.class == Reg;
40fb9820 2127
40fb9820
L
2128 case imm:
2129 return (t.bitfield.imm8
2130 || t.bitfield.imm8s
2131 || t.bitfield.imm16
2132 || t.bitfield.imm32
2133 || t.bitfield.imm32s
2134 || t.bitfield.imm64);
2135
2136 case disp:
2137 return (t.bitfield.disp8
2138 || t.bitfield.disp16
2139 || t.bitfield.disp32
2140 || t.bitfield.disp32s
2141 || t.bitfield.disp64);
2142
2143 case anymem:
2144 return (t.bitfield.disp8
2145 || t.bitfield.disp16
2146 || t.bitfield.disp32
2147 || t.bitfield.disp32s
2148 || t.bitfield.disp64
2149 || t.bitfield.baseindex);
2150
2151 default:
2152 abort ();
2153 }
2cfe26b6
AM
2154
2155 return 0;
40fb9820
L
2156}
2157
7a54636a
L
2158/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
2159 between operand GIVEN and opeand WANTED for instruction template T. */
5c07affc
L
2160
2161static INLINE int
7a54636a
L
2162match_operand_size (const insn_template *t, unsigned int wanted,
2163 unsigned int given)
5c07affc 2164{
3ac21baa
JB
2165 return !((i.types[given].bitfield.byte
2166 && !t->operand_types[wanted].bitfield.byte)
2167 || (i.types[given].bitfield.word
2168 && !t->operand_types[wanted].bitfield.word)
2169 || (i.types[given].bitfield.dword
2170 && !t->operand_types[wanted].bitfield.dword)
2171 || (i.types[given].bitfield.qword
2172 && !t->operand_types[wanted].bitfield.qword)
2173 || (i.types[given].bitfield.tbyte
2174 && !t->operand_types[wanted].bitfield.tbyte));
5c07affc
L
2175}
2176
dd40ce22
L
2177/* Return 1 if there is no conflict in SIMD register between operand
2178 GIVEN and opeand WANTED for instruction template T. */
1b54b8d7
JB
2179
2180static INLINE int
dd40ce22
L
2181match_simd_size (const insn_template *t, unsigned int wanted,
2182 unsigned int given)
1b54b8d7 2183{
3ac21baa
JB
2184 return !((i.types[given].bitfield.xmmword
2185 && !t->operand_types[wanted].bitfield.xmmword)
2186 || (i.types[given].bitfield.ymmword
2187 && !t->operand_types[wanted].bitfield.ymmword)
2188 || (i.types[given].bitfield.zmmword
260cd341
LC
2189 && !t->operand_types[wanted].bitfield.zmmword)
2190 || (i.types[given].bitfield.tmmword
2191 && !t->operand_types[wanted].bitfield.tmmword));
1b54b8d7
JB
2192}
2193
7a54636a
L
2194/* Return 1 if there is no conflict in any size between operand GIVEN
2195 and opeand WANTED for instruction template T. */
5c07affc
L
2196
2197static INLINE int
dd40ce22
L
2198match_mem_size (const insn_template *t, unsigned int wanted,
2199 unsigned int given)
5c07affc 2200{
7a54636a 2201 return (match_operand_size (t, wanted, given)
3ac21baa 2202 && !((i.types[given].bitfield.unspecified
5273a3cd 2203 && !i.broadcast.type
3ac21baa
JB
2204 && !t->operand_types[wanted].bitfield.unspecified)
2205 || (i.types[given].bitfield.fword
2206 && !t->operand_types[wanted].bitfield.fword)
1b54b8d7
JB
2207 /* For scalar opcode templates to allow register and memory
2208 operands at the same time, some special casing is needed
d6793fa1
JB
2209 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2210 down-conversion vpmov*. */
3528c362 2211 || ((t->operand_types[wanted].bitfield.class == RegSIMD
bc49bfd8
JB
2212 && t->operand_types[wanted].bitfield.byte
2213 + t->operand_types[wanted].bitfield.word
2214 + t->operand_types[wanted].bitfield.dword
2215 + t->operand_types[wanted].bitfield.qword
2216 > !!t->opcode_modifier.broadcast)
3ac21baa
JB
2217 ? (i.types[given].bitfield.xmmword
2218 || i.types[given].bitfield.ymmword
2219 || i.types[given].bitfield.zmmword)
2220 : !match_simd_size(t, wanted, given))));
5c07affc
L
2221}
2222
3ac21baa
JB
2223/* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2224 operands for instruction template T, and it has MATCH_REVERSE set if there
2225 is no size conflict on any operands for the template with operands reversed
2226 (and the template allows for reversing in the first place). */
5c07affc 2227
3ac21baa
JB
2228#define MATCH_STRAIGHT 1
2229#define MATCH_REVERSE 2
2230
2231static INLINE unsigned int
d3ce72d0 2232operand_size_match (const insn_template *t)
5c07affc 2233{
3ac21baa 2234 unsigned int j, match = MATCH_STRAIGHT;
5c07affc 2235
0cfa3eb3 2236 /* Don't check non-absolute jump instructions. */
5c07affc 2237 if (t->opcode_modifier.jump
0cfa3eb3 2238 && t->opcode_modifier.jump != JUMP_ABSOLUTE)
5c07affc
L
2239 return match;
2240
2241 /* Check memory and accumulator operand size. */
2242 for (j = 0; j < i.operands; j++)
2243 {
3528c362
JB
2244 if (i.types[j].bitfield.class != Reg
2245 && i.types[j].bitfield.class != RegSIMD
601e8564 2246 && t->opcode_modifier.anysize)
5c07affc
L
2247 continue;
2248
bab6aec1 2249 if (t->operand_types[j].bitfield.class == Reg
7a54636a 2250 && !match_operand_size (t, j, j))
5c07affc
L
2251 {
2252 match = 0;
2253 break;
2254 }
2255
3528c362 2256 if (t->operand_types[j].bitfield.class == RegSIMD
3ac21baa 2257 && !match_simd_size (t, j, j))
1b54b8d7
JB
2258 {
2259 match = 0;
2260 break;
2261 }
2262
75e5731b 2263 if (t->operand_types[j].bitfield.instance == Accum
7a54636a 2264 && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
1b54b8d7
JB
2265 {
2266 match = 0;
2267 break;
2268 }
2269
c48dadc9 2270 if ((i.flags[j] & Operand_Mem) && !match_mem_size (t, j, j))
5c07affc
L
2271 {
2272 match = 0;
2273 break;
2274 }
2275 }
2276
3ac21baa 2277 if (!t->opcode_modifier.d)
891edac4 2278 {
dc1e8a47 2279 mismatch:
3ac21baa
JB
2280 if (!match)
2281 i.error = operand_size_mismatch;
2282 return match;
891edac4 2283 }
5c07affc
L
2284
2285 /* Check reverse. */
f5eb1d70 2286 gas_assert (i.operands >= 2 && i.operands <= 3);
5c07affc 2287
f5eb1d70 2288 for (j = 0; j < i.operands; j++)
5c07affc 2289 {
f5eb1d70
JB
2290 unsigned int given = i.operands - j - 1;
2291
bab6aec1 2292 if (t->operand_types[j].bitfield.class == Reg
f5eb1d70 2293 && !match_operand_size (t, j, given))
891edac4 2294 goto mismatch;
5c07affc 2295
3528c362 2296 if (t->operand_types[j].bitfield.class == RegSIMD
f5eb1d70 2297 && !match_simd_size (t, j, given))
dbbc8b7e
JB
2298 goto mismatch;
2299
75e5731b 2300 if (t->operand_types[j].bitfield.instance == Accum
f5eb1d70
JB
2301 && (!match_operand_size (t, j, given)
2302 || !match_simd_size (t, j, given)))
dbbc8b7e
JB
2303 goto mismatch;
2304
f5eb1d70 2305 if ((i.flags[given] & Operand_Mem) && !match_mem_size (t, j, given))
891edac4 2306 goto mismatch;
5c07affc
L
2307 }
2308
3ac21baa 2309 return match | MATCH_REVERSE;
5c07affc
L
2310}
2311
c6fb90c8 2312static INLINE int
40fb9820
L
2313operand_type_match (i386_operand_type overlap,
2314 i386_operand_type given)
2315{
2316 i386_operand_type temp = overlap;
2317
7d5e4556 2318 temp.bitfield.unspecified = 0;
5c07affc
L
2319 temp.bitfield.byte = 0;
2320 temp.bitfield.word = 0;
2321 temp.bitfield.dword = 0;
2322 temp.bitfield.fword = 0;
2323 temp.bitfield.qword = 0;
2324 temp.bitfield.tbyte = 0;
2325 temp.bitfield.xmmword = 0;
c0f3af97 2326 temp.bitfield.ymmword = 0;
43234a1e 2327 temp.bitfield.zmmword = 0;
260cd341 2328 temp.bitfield.tmmword = 0;
0dfbf9d7 2329 if (operand_type_all_zero (&temp))
891edac4 2330 goto mismatch;
40fb9820 2331
6f2f06be 2332 if (given.bitfield.baseindex == overlap.bitfield.baseindex)
891edac4
L
2333 return 1;
2334
dc1e8a47 2335 mismatch:
a65babc9 2336 i.error = operand_type_mismatch;
891edac4 2337 return 0;
40fb9820
L
2338}
2339
7d5e4556 2340/* If given types g0 and g1 are registers they must be of the same type
10c17abd 2341 unless the expected operand type register overlap is null.
5de4d9ef 2342 Some Intel syntax memory operand size checking also happens here. */
40fb9820 2343
c6fb90c8 2344static INLINE int
dc821c5f 2345operand_type_register_match (i386_operand_type g0,
40fb9820 2346 i386_operand_type t0,
40fb9820
L
2347 i386_operand_type g1,
2348 i386_operand_type t1)
2349{
bab6aec1 2350 if (g0.bitfield.class != Reg
3528c362 2351 && g0.bitfield.class != RegSIMD
10c17abd
JB
2352 && (!operand_type_check (g0, anymem)
2353 || g0.bitfield.unspecified
5de4d9ef
JB
2354 || (t0.bitfield.class != Reg
2355 && t0.bitfield.class != RegSIMD)))
40fb9820
L
2356 return 1;
2357
bab6aec1 2358 if (g1.bitfield.class != Reg
3528c362 2359 && g1.bitfield.class != RegSIMD
10c17abd
JB
2360 && (!operand_type_check (g1, anymem)
2361 || g1.bitfield.unspecified
5de4d9ef
JB
2362 || (t1.bitfield.class != Reg
2363 && t1.bitfield.class != RegSIMD)))
40fb9820
L
2364 return 1;
2365
dc821c5f
JB
2366 if (g0.bitfield.byte == g1.bitfield.byte
2367 && g0.bitfield.word == g1.bitfield.word
2368 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2369 && g0.bitfield.qword == g1.bitfield.qword
2370 && g0.bitfield.xmmword == g1.bitfield.xmmword
2371 && g0.bitfield.ymmword == g1.bitfield.ymmword
2372 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2373 return 1;
2374
dc821c5f
JB
2375 if (!(t0.bitfield.byte & t1.bitfield.byte)
2376 && !(t0.bitfield.word & t1.bitfield.word)
2377 && !(t0.bitfield.dword & t1.bitfield.dword)
10c17abd
JB
2378 && !(t0.bitfield.qword & t1.bitfield.qword)
2379 && !(t0.bitfield.xmmword & t1.bitfield.xmmword)
2380 && !(t0.bitfield.ymmword & t1.bitfield.ymmword)
2381 && !(t0.bitfield.zmmword & t1.bitfield.zmmword))
891edac4
L
2382 return 1;
2383
a65babc9 2384 i.error = register_type_mismatch;
891edac4
L
2385
2386 return 0;
40fb9820
L
2387}
2388
4c692bc7
JB
2389static INLINE unsigned int
2390register_number (const reg_entry *r)
2391{
2392 unsigned int nr = r->reg_num;
2393
2394 if (r->reg_flags & RegRex)
2395 nr += 8;
2396
200cbe0f
L
2397 if (r->reg_flags & RegVRex)
2398 nr += 16;
2399
4c692bc7
JB
2400 return nr;
2401}
2402
252b5132 2403static INLINE unsigned int
40fb9820 2404mode_from_disp_size (i386_operand_type t)
252b5132 2405{
b5014f7a 2406 if (t.bitfield.disp8)
40fb9820
L
2407 return 1;
2408 else if (t.bitfield.disp16
2409 || t.bitfield.disp32
2410 || t.bitfield.disp32s)
2411 return 2;
2412 else
2413 return 0;
252b5132
RH
2414}
2415
2416static INLINE int
65879393 2417fits_in_signed_byte (addressT num)
252b5132 2418{
65879393 2419 return num + 0x80 <= 0xff;
47926f60 2420}
252b5132
RH
2421
2422static INLINE int
65879393 2423fits_in_unsigned_byte (addressT num)
252b5132 2424{
65879393 2425 return num <= 0xff;
47926f60 2426}
252b5132
RH
2427
2428static INLINE int
65879393 2429fits_in_unsigned_word (addressT num)
252b5132 2430{
65879393 2431 return num <= 0xffff;
47926f60 2432}
252b5132
RH
2433
2434static INLINE int
65879393 2435fits_in_signed_word (addressT num)
252b5132 2436{
65879393 2437 return num + 0x8000 <= 0xffff;
47926f60 2438}
2a962e6d 2439
3e73aa7c 2440static INLINE int
65879393 2441fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2442{
2443#ifndef BFD64
2444 return 1;
2445#else
65879393 2446 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2447#endif
2448} /* fits_in_signed_long() */
2a962e6d 2449
3e73aa7c 2450static INLINE int
65879393 2451fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2452{
2453#ifndef BFD64
2454 return 1;
2455#else
65879393 2456 return num <= 0xffffffff;
3e73aa7c
JH
2457#endif
2458} /* fits_in_unsigned_long() */
252b5132 2459
43234a1e 2460static INLINE int
b5014f7a 2461fits_in_disp8 (offsetT num)
43234a1e
L
2462{
2463 int shift = i.memshift;
2464 unsigned int mask;
2465
2466 if (shift == -1)
2467 abort ();
2468
2469 mask = (1 << shift) - 1;
2470
2471 /* Return 0 if NUM isn't properly aligned. */
2472 if ((num & mask))
2473 return 0;
2474
2475 /* Check if NUM will fit in 8bit after shift. */
2476 return fits_in_signed_byte (num >> shift);
2477}
2478
a683cc34
SP
2479static INLINE int
2480fits_in_imm4 (offsetT num)
2481{
2482 return (num & 0xf) == num;
2483}
2484
40fb9820 2485static i386_operand_type
e3bb37b5 2486smallest_imm_type (offsetT num)
252b5132 2487{
40fb9820 2488 i386_operand_type t;
7ab9ffdd 2489
0dfbf9d7 2490 operand_type_set (&t, 0);
40fb9820
L
2491 t.bitfield.imm64 = 1;
2492
2493 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2494 {
2495 /* This code is disabled on the 486 because all the Imm1 forms
2496 in the opcode table are slower on the i486. They're the
2497 versions with the implicitly specified single-position
2498 displacement, which has another syntax if you really want to
2499 use that form. */
40fb9820
L
2500 t.bitfield.imm1 = 1;
2501 t.bitfield.imm8 = 1;
2502 t.bitfield.imm8s = 1;
2503 t.bitfield.imm16 = 1;
2504 t.bitfield.imm32 = 1;
2505 t.bitfield.imm32s = 1;
2506 }
2507 else if (fits_in_signed_byte (num))
2508 {
2509 t.bitfield.imm8 = 1;
2510 t.bitfield.imm8s = 1;
2511 t.bitfield.imm16 = 1;
2512 t.bitfield.imm32 = 1;
2513 t.bitfield.imm32s = 1;
2514 }
2515 else if (fits_in_unsigned_byte (num))
2516 {
2517 t.bitfield.imm8 = 1;
2518 t.bitfield.imm16 = 1;
2519 t.bitfield.imm32 = 1;
2520 t.bitfield.imm32s = 1;
2521 }
2522 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2523 {
2524 t.bitfield.imm16 = 1;
2525 t.bitfield.imm32 = 1;
2526 t.bitfield.imm32s = 1;
2527 }
2528 else if (fits_in_signed_long (num))
2529 {
2530 t.bitfield.imm32 = 1;
2531 t.bitfield.imm32s = 1;
2532 }
2533 else if (fits_in_unsigned_long (num))
2534 t.bitfield.imm32 = 1;
2535
2536 return t;
47926f60 2537}
252b5132 2538
847f7ad4 2539static offsetT
e3bb37b5 2540offset_in_range (offsetT val, int size)
847f7ad4 2541{
508866be 2542 addressT mask;
ba2adb93 2543
847f7ad4
AM
2544 switch (size)
2545 {
508866be
L
2546 case 1: mask = ((addressT) 1 << 8) - 1; break;
2547 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 2548 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
2549#ifdef BFD64
2550 case 8: mask = ((addressT) 2 << 63) - 1; break;
2551#endif
47926f60 2552 default: abort ();
847f7ad4
AM
2553 }
2554
47926f60 2555 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
2556 {
2557 char buf1[40], buf2[40];
2558
9a8041fd
JB
2559 bfd_sprintf_vma (stdoutput, buf1, val);
2560 bfd_sprintf_vma (stdoutput, buf2, val & mask);
847f7ad4
AM
2561 as_warn (_("%s shortened to %s"), buf1, buf2);
2562 }
2563 return val & mask;
2564}
2565
c32fa91d
L
2566enum PREFIX_GROUP
2567{
2568 PREFIX_EXIST = 0,
2569 PREFIX_LOCK,
2570 PREFIX_REP,
04ef582a 2571 PREFIX_DS,
c32fa91d
L
2572 PREFIX_OTHER
2573};
2574
2575/* Returns
2576 a. PREFIX_EXIST if attempting to add a prefix where one from the
2577 same class already exists.
2578 b. PREFIX_LOCK if lock prefix is added.
2579 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2580 d. PREFIX_DS if ds prefix is added.
2581 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2582 */
2583
2584static enum PREFIX_GROUP
e3bb37b5 2585add_prefix (unsigned int prefix)
252b5132 2586{
c32fa91d 2587 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2588 unsigned int q;
252b5132 2589
29b0f896
AM
2590 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2591 && flag_code == CODE_64BIT)
b1905489 2592 {
161a04f6 2593 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2594 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2595 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2596 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2597 ret = PREFIX_EXIST;
b1905489
JB
2598 q = REX_PREFIX;
2599 }
3e73aa7c 2600 else
b1905489
JB
2601 {
2602 switch (prefix)
2603 {
2604 default:
2605 abort ();
2606
b1905489 2607 case DS_PREFIX_OPCODE:
04ef582a
L
2608 ret = PREFIX_DS;
2609 /* Fall through. */
2610 case CS_PREFIX_OPCODE:
b1905489
JB
2611 case ES_PREFIX_OPCODE:
2612 case FS_PREFIX_OPCODE:
2613 case GS_PREFIX_OPCODE:
2614 case SS_PREFIX_OPCODE:
2615 q = SEG_PREFIX;
2616 break;
2617
2618 case REPNE_PREFIX_OPCODE:
2619 case REPE_PREFIX_OPCODE:
c32fa91d
L
2620 q = REP_PREFIX;
2621 ret = PREFIX_REP;
2622 break;
2623
b1905489 2624 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2625 q = LOCK_PREFIX;
2626 ret = PREFIX_LOCK;
b1905489
JB
2627 break;
2628
2629 case FWAIT_OPCODE:
2630 q = WAIT_PREFIX;
2631 break;
2632
2633 case ADDR_PREFIX_OPCODE:
2634 q = ADDR_PREFIX;
2635 break;
2636
2637 case DATA_PREFIX_OPCODE:
2638 q = DATA_PREFIX;
2639 break;
2640 }
2641 if (i.prefix[q] != 0)
c32fa91d 2642 ret = PREFIX_EXIST;
b1905489 2643 }
252b5132 2644
b1905489 2645 if (ret)
252b5132 2646 {
b1905489
JB
2647 if (!i.prefix[q])
2648 ++i.prefixes;
2649 i.prefix[q] |= prefix;
252b5132 2650 }
b1905489
JB
2651 else
2652 as_bad (_("same type of prefix used twice"));
252b5132 2653
252b5132
RH
2654 return ret;
2655}
2656
2657static void
78f12dd3 2658update_code_flag (int value, int check)
eecb386c 2659{
78f12dd3
L
2660 PRINTF_LIKE ((*as_error));
2661
1e9cc1c2 2662 flag_code = (enum flag_code) value;
40fb9820
L
2663 if (flag_code == CODE_64BIT)
2664 {
2665 cpu_arch_flags.bitfield.cpu64 = 1;
2666 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
2667 }
2668 else
2669 {
2670 cpu_arch_flags.bitfield.cpu64 = 0;
2671 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
2672 }
2673 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c 2674 {
78f12dd3
L
2675 if (check)
2676 as_error = as_fatal;
2677 else
2678 as_error = as_bad;
2679 (*as_error) (_("64bit mode not supported on `%s'."),
2680 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2681 }
40fb9820 2682 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c 2683 {
78f12dd3
L
2684 if (check)
2685 as_error = as_fatal;
2686 else
2687 as_error = as_bad;
2688 (*as_error) (_("32bit mode not supported on `%s'."),
2689 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2690 }
eecb386c
AM
2691 stackop_size = '\0';
2692}
2693
78f12dd3
L
2694static void
2695set_code_flag (int value)
2696{
2697 update_code_flag (value, 0);
2698}
2699
eecb386c 2700static void
e3bb37b5 2701set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2702{
1e9cc1c2 2703 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2704 if (flag_code != CODE_16BIT)
2705 abort ();
2706 cpu_arch_flags.bitfield.cpu64 = 0;
2707 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 2708 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2709}
2710
2711static void
e3bb37b5 2712set_intel_syntax (int syntax_flag)
252b5132
RH
2713{
2714 /* Find out if register prefixing is specified. */
2715 int ask_naked_reg = 0;
2716
2717 SKIP_WHITESPACE ();
29b0f896 2718 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2719 {
d02603dc
NC
2720 char *string;
2721 int e = get_symbol_name (&string);
252b5132 2722
47926f60 2723 if (strcmp (string, "prefix") == 0)
252b5132 2724 ask_naked_reg = 1;
47926f60 2725 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2726 ask_naked_reg = -1;
2727 else
d0b47220 2728 as_bad (_("bad argument to syntax directive."));
d02603dc 2729 (void) restore_line_pointer (e);
252b5132
RH
2730 }
2731 demand_empty_rest_of_line ();
c3332e24 2732
252b5132
RH
2733 intel_syntax = syntax_flag;
2734
2735 if (ask_naked_reg == 0)
f86103b7
AM
2736 allow_naked_reg = (intel_syntax
2737 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2738 else
2739 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2740
ee86248c 2741 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
7ab9ffdd 2742
e4a3b5a4 2743 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 2744 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 2745 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
2746}
2747
1efbbeb4
L
2748static void
2749set_intel_mnemonic (int mnemonic_flag)
2750{
e1d4d893 2751 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2752}
2753
db51cc60
L
2754static void
2755set_allow_index_reg (int flag)
2756{
2757 allow_index_reg = flag;
2758}
2759
cb19c032 2760static void
7bab8ab5 2761set_check (int what)
cb19c032 2762{
7bab8ab5
JB
2763 enum check_kind *kind;
2764 const char *str;
2765
2766 if (what)
2767 {
2768 kind = &operand_check;
2769 str = "operand";
2770 }
2771 else
2772 {
2773 kind = &sse_check;
2774 str = "sse";
2775 }
2776
cb19c032
L
2777 SKIP_WHITESPACE ();
2778
2779 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2780 {
d02603dc
NC
2781 char *string;
2782 int e = get_symbol_name (&string);
cb19c032
L
2783
2784 if (strcmp (string, "none") == 0)
7bab8ab5 2785 *kind = check_none;
cb19c032 2786 else if (strcmp (string, "warning") == 0)
7bab8ab5 2787 *kind = check_warning;
cb19c032 2788 else if (strcmp (string, "error") == 0)
7bab8ab5 2789 *kind = check_error;
cb19c032 2790 else
7bab8ab5 2791 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2792 (void) restore_line_pointer (e);
cb19c032
L
2793 }
2794 else
7bab8ab5 2795 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2796
2797 demand_empty_rest_of_line ();
2798}
2799
8a9036a4
L
2800static void
2801check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2802 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2803{
2804#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2805 static const char *arch;
2806
2807 /* Intel LIOM is only supported on ELF. */
2808 if (!IS_ELF)
2809 return;
2810
2811 if (!arch)
2812 {
2813 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2814 use default_arch. */
2815 arch = cpu_arch_name;
2816 if (!arch)
2817 arch = default_arch;
2818 }
2819
81486035
L
2820 /* If we are targeting Intel MCU, we must enable it. */
2821 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_IAMCU
2822 || new_flag.bitfield.cpuiamcu)
2823 return;
2824
3632d14b 2825 /* If we are targeting Intel L1OM, we must enable it. */
8a9036a4 2826 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_L1OM
1e9cc1c2 2827 || new_flag.bitfield.cpul1om)
8a9036a4 2828 return;
76ba9986 2829
7a9068fe
L
2830 /* If we are targeting Intel K1OM, we must enable it. */
2831 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_K1OM
2832 || new_flag.bitfield.cpuk1om)
2833 return;
2834
8a9036a4
L
2835 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2836#endif
2837}
2838
e413e4e9 2839static void
e3bb37b5 2840set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2841{
47926f60 2842 SKIP_WHITESPACE ();
e413e4e9 2843
29b0f896 2844 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9 2845 {
d02603dc
NC
2846 char *string;
2847 int e = get_symbol_name (&string);
91d6fa6a 2848 unsigned int j;
40fb9820 2849 i386_cpu_flags flags;
e413e4e9 2850
91d6fa6a 2851 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
e413e4e9 2852 {
91d6fa6a 2853 if (strcmp (string, cpu_arch[j].name) == 0)
e413e4e9 2854 {
91d6fa6a 2855 check_cpu_arch_compatible (string, cpu_arch[j].flags);
8a9036a4 2856
5c6af06e
JB
2857 if (*string != '.')
2858 {
91d6fa6a 2859 cpu_arch_name = cpu_arch[j].name;
5c6af06e 2860 cpu_sub_arch_name = NULL;
91d6fa6a 2861 cpu_arch_flags = cpu_arch[j].flags;
40fb9820
L
2862 if (flag_code == CODE_64BIT)
2863 {
2864 cpu_arch_flags.bitfield.cpu64 = 1;
2865 cpu_arch_flags.bitfield.cpuno64 = 0;
2866 }
2867 else
2868 {
2869 cpu_arch_flags.bitfield.cpu64 = 0;
2870 cpu_arch_flags.bitfield.cpuno64 = 1;
2871 }
91d6fa6a
NC
2872 cpu_arch_isa = cpu_arch[j].type;
2873 cpu_arch_isa_flags = cpu_arch[j].flags;
ccc9c027
L
2874 if (!cpu_arch_tune_set)
2875 {
2876 cpu_arch_tune = cpu_arch_isa;
2877 cpu_arch_tune_flags = cpu_arch_isa_flags;
2878 }
5c6af06e
JB
2879 break;
2880 }
40fb9820 2881
293f5f65
L
2882 flags = cpu_flags_or (cpu_arch_flags,
2883 cpu_arch[j].flags);
81486035 2884
5b64d091 2885 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
5c6af06e 2886 {
6305a203
L
2887 if (cpu_sub_arch_name)
2888 {
2889 char *name = cpu_sub_arch_name;
2890 cpu_sub_arch_name = concat (name,
91d6fa6a 2891 cpu_arch[j].name,
1bf57e9f 2892 (const char *) NULL);
6305a203
L
2893 free (name);
2894 }
2895 else
91d6fa6a 2896 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
40fb9820 2897 cpu_arch_flags = flags;
a586129e 2898 cpu_arch_isa_flags = flags;
5c6af06e 2899 }
0089dace
L
2900 else
2901 cpu_arch_isa_flags
2902 = cpu_flags_or (cpu_arch_isa_flags,
2903 cpu_arch[j].flags);
d02603dc 2904 (void) restore_line_pointer (e);
5c6af06e
JB
2905 demand_empty_rest_of_line ();
2906 return;
e413e4e9
AM
2907 }
2908 }
293f5f65
L
2909
2910 if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
2911 {
33eaf5de 2912 /* Disable an ISA extension. */
293f5f65
L
2913 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
2914 if (strcmp (string + 1, cpu_noarch [j].name) == 0)
2915 {
2916 flags = cpu_flags_and_not (cpu_arch_flags,
2917 cpu_noarch[j].flags);
2918 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2919 {
2920 if (cpu_sub_arch_name)
2921 {
2922 char *name = cpu_sub_arch_name;
2923 cpu_sub_arch_name = concat (name, string,
2924 (const char *) NULL);
2925 free (name);
2926 }
2927 else
2928 cpu_sub_arch_name = xstrdup (string);
2929 cpu_arch_flags = flags;
2930 cpu_arch_isa_flags = flags;
2931 }
2932 (void) restore_line_pointer (e);
2933 demand_empty_rest_of_line ();
2934 return;
2935 }
2936
2937 j = ARRAY_SIZE (cpu_arch);
2938 }
2939
91d6fa6a 2940 if (j >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
2941 as_bad (_("no such architecture: `%s'"), string);
2942
2943 *input_line_pointer = e;
2944 }
2945 else
2946 as_bad (_("missing cpu architecture"));
2947
fddf5b5b
AM
2948 no_cond_jump_promotion = 0;
2949 if (*input_line_pointer == ','
29b0f896 2950 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 2951 {
d02603dc
NC
2952 char *string;
2953 char e;
2954
2955 ++input_line_pointer;
2956 e = get_symbol_name (&string);
fddf5b5b
AM
2957
2958 if (strcmp (string, "nojumps") == 0)
2959 no_cond_jump_promotion = 1;
2960 else if (strcmp (string, "jumps") == 0)
2961 ;
2962 else
2963 as_bad (_("no such architecture modifier: `%s'"), string);
2964
d02603dc 2965 (void) restore_line_pointer (e);
fddf5b5b
AM
2966 }
2967
e413e4e9
AM
2968 demand_empty_rest_of_line ();
2969}
2970
8a9036a4
L
2971enum bfd_architecture
2972i386_arch (void)
2973{
3632d14b 2974 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4
L
2975 {
2976 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2977 || flag_code != CODE_64BIT)
2978 as_fatal (_("Intel L1OM is 64bit ELF only"));
2979 return bfd_arch_l1om;
2980 }
7a9068fe
L
2981 else if (cpu_arch_isa == PROCESSOR_K1OM)
2982 {
2983 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2984 || flag_code != CODE_64BIT)
2985 as_fatal (_("Intel K1OM is 64bit ELF only"));
2986 return bfd_arch_k1om;
2987 }
81486035
L
2988 else if (cpu_arch_isa == PROCESSOR_IAMCU)
2989 {
2990 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2991 || flag_code == CODE_64BIT)
2992 as_fatal (_("Intel MCU is 32bit ELF only"));
2993 return bfd_arch_iamcu;
2994 }
8a9036a4
L
2995 else
2996 return bfd_arch_i386;
2997}
2998
b9d79e03 2999unsigned long
7016a5d5 3000i386_mach (void)
b9d79e03 3001{
d34049e8 3002 if (startswith (default_arch, "x86_64"))
8a9036a4 3003 {
3632d14b 3004 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 3005 {
351f65ca
L
3006 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3007 || default_arch[6] != '\0')
8a9036a4
L
3008 as_fatal (_("Intel L1OM is 64bit ELF only"));
3009 return bfd_mach_l1om;
3010 }
7a9068fe
L
3011 else if (cpu_arch_isa == PROCESSOR_K1OM)
3012 {
3013 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3014 || default_arch[6] != '\0')
3015 as_fatal (_("Intel K1OM is 64bit ELF only"));
3016 return bfd_mach_k1om;
3017 }
351f65ca 3018 else if (default_arch[6] == '\0')
8a9036a4 3019 return bfd_mach_x86_64;
351f65ca
L
3020 else
3021 return bfd_mach_x64_32;
8a9036a4 3022 }
5197d474
L
3023 else if (!strcmp (default_arch, "i386")
3024 || !strcmp (default_arch, "iamcu"))
81486035
L
3025 {
3026 if (cpu_arch_isa == PROCESSOR_IAMCU)
3027 {
3028 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
3029 as_fatal (_("Intel MCU is 32bit ELF only"));
3030 return bfd_mach_i386_iamcu;
3031 }
3032 else
3033 return bfd_mach_i386_i386;
3034 }
b9d79e03 3035 else
2b5d6a91 3036 as_fatal (_("unknown architecture"));
b9d79e03 3037}
b9d79e03 3038\f
252b5132 3039void
7016a5d5 3040md_begin (void)
252b5132 3041{
86fa6981
L
3042 /* Support pseudo prefixes like {disp32}. */
3043 lex_type ['{'] = LEX_BEGIN_NAME;
3044
47926f60 3045 /* Initialize op_hash hash table. */
629310ab 3046 op_hash = str_htab_create ();
252b5132
RH
3047
3048 {
d3ce72d0 3049 const insn_template *optab;
29b0f896 3050 templates *core_optab;
252b5132 3051
47926f60
KH
3052 /* Setup for loop. */
3053 optab = i386_optab;
add39d23 3054 core_optab = XNEW (templates);
252b5132
RH
3055 core_optab->start = optab;
3056
3057 while (1)
3058 {
3059 ++optab;
3060 if (optab->name == NULL
3061 || strcmp (optab->name, (optab - 1)->name) != 0)
3062 {
3063 /* different name --> ship out current template list;
47926f60 3064 add to hash table; & begin anew. */
252b5132 3065 core_optab->end = optab;
fe0e921f
AM
3066 if (str_hash_insert (op_hash, (optab - 1)->name, core_optab, 0))
3067 as_fatal (_("duplicate %s"), (optab - 1)->name);
3068
252b5132
RH
3069 if (optab->name == NULL)
3070 break;
add39d23 3071 core_optab = XNEW (templates);
252b5132
RH
3072 core_optab->start = optab;
3073 }
3074 }
3075 }
3076
47926f60 3077 /* Initialize reg_hash hash table. */
629310ab 3078 reg_hash = str_htab_create ();
252b5132 3079 {
29b0f896 3080 const reg_entry *regtab;
c3fe08fa 3081 unsigned int regtab_size = i386_regtab_size;
252b5132 3082
c3fe08fa 3083 for (regtab = i386_regtab; regtab_size--; regtab++)
6225c532 3084 {
6288d05f
JB
3085 switch (regtab->reg_type.bitfield.class)
3086 {
3087 case Reg:
34684862
JB
3088 if (regtab->reg_type.bitfield.dword)
3089 {
3090 if (regtab->reg_type.bitfield.instance == Accum)
3091 reg_eax = regtab;
3092 }
3093 else if (regtab->reg_type.bitfield.tbyte)
6288d05f
JB
3094 {
3095 /* There's no point inserting st(<N>) in the hash table, as
3096 parentheses aren't included in register_chars[] anyway. */
3097 if (regtab->reg_type.bitfield.instance != Accum)
3098 continue;
3099 reg_st0 = regtab;
3100 }
3101 break;
3102
5e042380
JB
3103 case SReg:
3104 switch (regtab->reg_num)
3105 {
3106 case 0: reg_es = regtab; break;
3107 case 2: reg_ss = regtab; break;
3108 case 3: reg_ds = regtab; break;
3109 }
3110 break;
3111
6288d05f
JB
3112 case RegMask:
3113 if (!regtab->reg_num)
3114 reg_k0 = regtab;
3115 break;
3116 }
3117
6225c532
JB
3118 if (str_hash_insert (reg_hash, regtab->reg_name, regtab, 0) != NULL)
3119 as_fatal (_("duplicate %s"), regtab->reg_name);
6225c532 3120 }
252b5132
RH
3121 }
3122
47926f60 3123 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 3124 {
29b0f896
AM
3125 int c;
3126 char *p;
252b5132
RH
3127
3128 for (c = 0; c < 256; c++)
3129 {
3882b010 3130 if (ISDIGIT (c))
252b5132
RH
3131 {
3132 digit_chars[c] = c;
3133 mnemonic_chars[c] = c;
3134 register_chars[c] = c;
3135 operand_chars[c] = c;
3136 }
3882b010 3137 else if (ISLOWER (c))
252b5132
RH
3138 {
3139 mnemonic_chars[c] = c;
3140 register_chars[c] = c;
3141 operand_chars[c] = c;
3142 }
3882b010 3143 else if (ISUPPER (c))
252b5132 3144 {
3882b010 3145 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
3146 register_chars[c] = mnemonic_chars[c];
3147 operand_chars[c] = c;
3148 }
43234a1e 3149 else if (c == '{' || c == '}')
86fa6981
L
3150 {
3151 mnemonic_chars[c] = c;
3152 operand_chars[c] = c;
3153 }
b3983e5f
JB
3154#ifdef SVR4_COMMENT_CHARS
3155 else if (c == '\\' && strchr (i386_comment_chars, '/'))
3156 operand_chars[c] = c;
3157#endif
252b5132 3158
3882b010 3159 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
3160 identifier_chars[c] = c;
3161 else if (c >= 128)
3162 {
3163 identifier_chars[c] = c;
3164 operand_chars[c] = c;
3165 }
3166 }
3167
3168#ifdef LEX_AT
3169 identifier_chars['@'] = '@';
32137342
NC
3170#endif
3171#ifdef LEX_QM
3172 identifier_chars['?'] = '?';
3173 operand_chars['?'] = '?';
252b5132 3174#endif
252b5132 3175 digit_chars['-'] = '-';
c0f3af97 3176 mnemonic_chars['_'] = '_';
791fe849 3177 mnemonic_chars['-'] = '-';
0003779b 3178 mnemonic_chars['.'] = '.';
252b5132
RH
3179 identifier_chars['_'] = '_';
3180 identifier_chars['.'] = '.';
3181
3182 for (p = operand_special_chars; *p != '\0'; p++)
3183 operand_chars[(unsigned char) *p] = *p;
3184 }
3185
a4447b93
RH
3186 if (flag_code == CODE_64BIT)
3187 {
ca19b261
KT
3188#if defined (OBJ_COFF) && defined (TE_PE)
3189 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
3190 ? 32 : 16);
3191#else
a4447b93 3192 x86_dwarf2_return_column = 16;
ca19b261 3193#endif
61ff971f 3194 x86_cie_data_alignment = -8;
a4447b93
RH
3195 }
3196 else
3197 {
3198 x86_dwarf2_return_column = 8;
3199 x86_cie_data_alignment = -4;
3200 }
e379e5f3
L
3201
3202 /* NB: FUSED_JCC_PADDING frag must have sufficient room so that it
3203 can be turned into BRANCH_PREFIX frag. */
3204 if (align_branch_prefix_size > MAX_FUSED_JCC_PADDING_SIZE)
3205 abort ();
252b5132
RH
3206}
3207
3208void
e3bb37b5 3209i386_print_statistics (FILE *file)
252b5132 3210{
629310ab
ML
3211 htab_print_statistics (file, "i386 opcode", op_hash);
3212 htab_print_statistics (file, "i386 register", reg_hash);
252b5132
RH
3213}
3214\f
252b5132
RH
3215#ifdef DEBUG386
3216
ce8a8b2f 3217/* Debugging routines for md_assemble. */
d3ce72d0 3218static void pte (insn_template *);
40fb9820 3219static void pt (i386_operand_type);
e3bb37b5
L
3220static void pe (expressionS *);
3221static void ps (symbolS *);
252b5132
RH
3222
3223static void
2c703856 3224pi (const char *line, i386_insn *x)
252b5132 3225{
09137c09 3226 unsigned int j;
252b5132
RH
3227
3228 fprintf (stdout, "%s: template ", line);
3229 pte (&x->tm);
09f131f2
JH
3230 fprintf (stdout, " address: base %s index %s scale %x\n",
3231 x->base_reg ? x->base_reg->reg_name : "none",
3232 x->index_reg ? x->index_reg->reg_name : "none",
3233 x->log2_scale_factor);
3234 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 3235 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
3236 fprintf (stdout, " sib: base %x index %x scale %x\n",
3237 x->sib.base, x->sib.index, x->sib.scale);
3238 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
3239 (x->rex & REX_W) != 0,
3240 (x->rex & REX_R) != 0,
3241 (x->rex & REX_X) != 0,
3242 (x->rex & REX_B) != 0);
09137c09 3243 for (j = 0; j < x->operands; j++)
252b5132 3244 {
09137c09
SP
3245 fprintf (stdout, " #%d: ", j + 1);
3246 pt (x->types[j]);
252b5132 3247 fprintf (stdout, "\n");
bab6aec1 3248 if (x->types[j].bitfield.class == Reg
3528c362
JB
3249 || x->types[j].bitfield.class == RegMMX
3250 || x->types[j].bitfield.class == RegSIMD
dd6b8a0b 3251 || x->types[j].bitfield.class == RegMask
00cee14f 3252 || x->types[j].bitfield.class == SReg
4a5c67ed
JB
3253 || x->types[j].bitfield.class == RegCR
3254 || x->types[j].bitfield.class == RegDR
dd6b8a0b
JB
3255 || x->types[j].bitfield.class == RegTR
3256 || x->types[j].bitfield.class == RegBND)
09137c09
SP
3257 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
3258 if (operand_type_check (x->types[j], imm))
3259 pe (x->op[j].imms);
3260 if (operand_type_check (x->types[j], disp))
3261 pe (x->op[j].disps);
252b5132
RH
3262 }
3263}
3264
3265static void
d3ce72d0 3266pte (insn_template *t)
252b5132 3267{
b933fa4b 3268 static const unsigned char opc_pfx[] = { 0, 0x66, 0xf3, 0xf2 };
441f6aca
JB
3269 static const char *const opc_spc[] = {
3270 NULL, "0f", "0f38", "0f3a", NULL, NULL, NULL, NULL,
3271 "XOP08", "XOP09", "XOP0A",
3272 };
09137c09 3273 unsigned int j;
441f6aca 3274
252b5132 3275 fprintf (stdout, " %d operands ", t->operands);
441f6aca
JB
3276 if (opc_pfx[t->opcode_modifier.opcodeprefix])
3277 fprintf (stdout, "pfx %x ", opc_pfx[t->opcode_modifier.opcodeprefix]);
3278 if (opc_spc[t->opcode_modifier.opcodespace])
3279 fprintf (stdout, "space %s ", opc_spc[t->opcode_modifier.opcodespace]);
47926f60 3280 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
3281 if (t->extension_opcode != None)
3282 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 3283 if (t->opcode_modifier.d)
252b5132 3284 fprintf (stdout, "D");
40fb9820 3285 if (t->opcode_modifier.w)
252b5132
RH
3286 fprintf (stdout, "W");
3287 fprintf (stdout, "\n");
09137c09 3288 for (j = 0; j < t->operands; j++)
252b5132 3289 {
09137c09
SP
3290 fprintf (stdout, " #%d type ", j + 1);
3291 pt (t->operand_types[j]);
252b5132
RH
3292 fprintf (stdout, "\n");
3293 }
3294}
3295
3296static void
e3bb37b5 3297pe (expressionS *e)
252b5132 3298{
24eab124 3299 fprintf (stdout, " operation %d\n", e->X_op);
b77ad1d4
AM
3300 fprintf (stdout, " add_number %ld (%lx)\n",
3301 (long) e->X_add_number, (long) e->X_add_number);
252b5132
RH
3302 if (e->X_add_symbol)
3303 {
3304 fprintf (stdout, " add_symbol ");
3305 ps (e->X_add_symbol);
3306 fprintf (stdout, "\n");
3307 }
3308 if (e->X_op_symbol)
3309 {
3310 fprintf (stdout, " op_symbol ");
3311 ps (e->X_op_symbol);
3312 fprintf (stdout, "\n");
3313 }
3314}
3315
3316static void
e3bb37b5 3317ps (symbolS *s)
252b5132
RH
3318{
3319 fprintf (stdout, "%s type %s%s",
3320 S_GET_NAME (s),
3321 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3322 segment_name (S_GET_SEGMENT (s)));
3323}
3324
7b81dfbb 3325static struct type_name
252b5132 3326 {
40fb9820
L
3327 i386_operand_type mask;
3328 const char *name;
252b5132 3329 }
7b81dfbb 3330const type_names[] =
252b5132 3331{
40fb9820
L
3332 { OPERAND_TYPE_REG8, "r8" },
3333 { OPERAND_TYPE_REG16, "r16" },
3334 { OPERAND_TYPE_REG32, "r32" },
3335 { OPERAND_TYPE_REG64, "r64" },
2c703856
JB
3336 { OPERAND_TYPE_ACC8, "acc8" },
3337 { OPERAND_TYPE_ACC16, "acc16" },
3338 { OPERAND_TYPE_ACC32, "acc32" },
3339 { OPERAND_TYPE_ACC64, "acc64" },
40fb9820
L
3340 { OPERAND_TYPE_IMM8, "i8" },
3341 { OPERAND_TYPE_IMM8, "i8s" },
3342 { OPERAND_TYPE_IMM16, "i16" },
3343 { OPERAND_TYPE_IMM32, "i32" },
3344 { OPERAND_TYPE_IMM32S, "i32s" },
3345 { OPERAND_TYPE_IMM64, "i64" },
3346 { OPERAND_TYPE_IMM1, "i1" },
3347 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
3348 { OPERAND_TYPE_DISP8, "d8" },
3349 { OPERAND_TYPE_DISP16, "d16" },
3350 { OPERAND_TYPE_DISP32, "d32" },
3351 { OPERAND_TYPE_DISP32S, "d32s" },
3352 { OPERAND_TYPE_DISP64, "d64" },
3353 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
3354 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
3355 { OPERAND_TYPE_CONTROL, "control reg" },
3356 { OPERAND_TYPE_TEST, "test reg" },
3357 { OPERAND_TYPE_DEBUG, "debug reg" },
3358 { OPERAND_TYPE_FLOATREG, "FReg" },
3359 { OPERAND_TYPE_FLOATACC, "FAcc" },
21df382b 3360 { OPERAND_TYPE_SREG, "SReg" },
40fb9820
L
3361 { OPERAND_TYPE_REGMMX, "rMMX" },
3362 { OPERAND_TYPE_REGXMM, "rXMM" },
0349dc08 3363 { OPERAND_TYPE_REGYMM, "rYMM" },
43234a1e 3364 { OPERAND_TYPE_REGZMM, "rZMM" },
260cd341 3365 { OPERAND_TYPE_REGTMM, "rTMM" },
43234a1e 3366 { OPERAND_TYPE_REGMASK, "Mask reg" },
252b5132
RH
3367};
3368
3369static void
40fb9820 3370pt (i386_operand_type t)
252b5132 3371{
40fb9820 3372 unsigned int j;
c6fb90c8 3373 i386_operand_type a;
252b5132 3374
40fb9820 3375 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3376 {
3377 a = operand_type_and (t, type_names[j].mask);
2c703856 3378 if (operand_type_equal (&a, &type_names[j].mask))
c6fb90c8
L
3379 fprintf (stdout, "%s, ", type_names[j].name);
3380 }
252b5132
RH
3381 fflush (stdout);
3382}
3383
3384#endif /* DEBUG386 */
3385\f
252b5132 3386static bfd_reloc_code_real_type
3956db08 3387reloc (unsigned int size,
64e74474
AM
3388 int pcrel,
3389 int sign,
3390 bfd_reloc_code_real_type other)
252b5132 3391{
47926f60 3392 if (other != NO_RELOC)
3956db08 3393 {
91d6fa6a 3394 reloc_howto_type *rel;
3956db08
JB
3395
3396 if (size == 8)
3397 switch (other)
3398 {
64e74474
AM
3399 case BFD_RELOC_X86_64_GOT32:
3400 return BFD_RELOC_X86_64_GOT64;
3401 break;
553d1284
L
3402 case BFD_RELOC_X86_64_GOTPLT64:
3403 return BFD_RELOC_X86_64_GOTPLT64;
3404 break;
64e74474
AM
3405 case BFD_RELOC_X86_64_PLTOFF64:
3406 return BFD_RELOC_X86_64_PLTOFF64;
3407 break;
3408 case BFD_RELOC_X86_64_GOTPC32:
3409 other = BFD_RELOC_X86_64_GOTPC64;
3410 break;
3411 case BFD_RELOC_X86_64_GOTPCREL:
3412 other = BFD_RELOC_X86_64_GOTPCREL64;
3413 break;
3414 case BFD_RELOC_X86_64_TPOFF32:
3415 other = BFD_RELOC_X86_64_TPOFF64;
3416 break;
3417 case BFD_RELOC_X86_64_DTPOFF32:
3418 other = BFD_RELOC_X86_64_DTPOFF64;
3419 break;
3420 default:
3421 break;
3956db08 3422 }
e05278af 3423
8ce3d284 3424#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3425 if (other == BFD_RELOC_SIZE32)
3426 {
3427 if (size == 8)
1ab668bf 3428 other = BFD_RELOC_SIZE64;
8fd4256d 3429 if (pcrel)
1ab668bf
AM
3430 {
3431 as_bad (_("there are no pc-relative size relocations"));
3432 return NO_RELOC;
3433 }
8fd4256d 3434 }
8ce3d284 3435#endif
8fd4256d 3436
e05278af 3437 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3438 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3439 sign = -1;
3440
91d6fa6a
NC
3441 rel = bfd_reloc_type_lookup (stdoutput, other);
3442 if (!rel)
3956db08 3443 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3444 else if (size != bfd_get_reloc_size (rel))
3956db08 3445 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3446 bfd_get_reloc_size (rel),
3956db08 3447 size);
91d6fa6a 3448 else if (pcrel && !rel->pc_relative)
3956db08 3449 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3450 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3451 && !sign)
91d6fa6a 3452 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3453 && sign > 0))
3956db08
JB
3454 as_bad (_("relocated field and relocation type differ in signedness"));
3455 else
3456 return other;
3457 return NO_RELOC;
3458 }
252b5132
RH
3459
3460 if (pcrel)
3461 {
3e73aa7c 3462 if (!sign)
3956db08 3463 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3464 switch (size)
3465 {
3466 case 1: return BFD_RELOC_8_PCREL;
3467 case 2: return BFD_RELOC_16_PCREL;
d258b828 3468 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3469 case 8: return BFD_RELOC_64_PCREL;
252b5132 3470 }
3956db08 3471 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3472 }
3473 else
3474 {
3956db08 3475 if (sign > 0)
e5cb08ac 3476 switch (size)
3e73aa7c
JH
3477 {
3478 case 4: return BFD_RELOC_X86_64_32S;
3479 }
3480 else
3481 switch (size)
3482 {
3483 case 1: return BFD_RELOC_8;
3484 case 2: return BFD_RELOC_16;
3485 case 4: return BFD_RELOC_32;
3486 case 8: return BFD_RELOC_64;
3487 }
3956db08
JB
3488 as_bad (_("cannot do %s %u byte relocation"),
3489 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3490 }
3491
0cc9e1d3 3492 return NO_RELOC;
252b5132
RH
3493}
3494
47926f60
KH
3495/* Here we decide which fixups can be adjusted to make them relative to
3496 the beginning of the section instead of the symbol. Basically we need
3497 to make sure that the dynamic relocations are done correctly, so in
3498 some cases we force the original symbol to be used. */
3499
252b5132 3500int
e3bb37b5 3501tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3502{
6d249963 3503#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3504 if (!IS_ELF)
31312f95
AM
3505 return 1;
3506
a161fe53
AM
3507 /* Don't adjust pc-relative references to merge sections in 64-bit
3508 mode. */
3509 if (use_rela_relocations
3510 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3511 && fixP->fx_pcrel)
252b5132 3512 return 0;
31312f95 3513
8d01d9a9
AJ
3514 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3515 and changed later by validate_fix. */
3516 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3517 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3518 return 0;
3519
8fd4256d
L
3520 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3521 for size relocations. */
3522 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3523 || fixP->fx_r_type == BFD_RELOC_SIZE64
3524 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132 3525 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3526 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3527 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3528 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3529 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3530 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3531 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3532 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3533 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3534 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3535 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3536 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c 3537 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3538 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3539 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3540 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3541 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3542 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3543 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3544 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3545 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3546 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3547 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3548 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3549 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3550 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3551 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3552 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3553 return 0;
31312f95 3554#endif
252b5132
RH
3555 return 1;
3556}
252b5132 3557
b4cac588 3558static int
e3bb37b5 3559intel_float_operand (const char *mnemonic)
252b5132 3560{
9306ca4a
JB
3561 /* Note that the value returned is meaningful only for opcodes with (memory)
3562 operands, hence the code here is free to improperly handle opcodes that
3563 have no operands (for better performance and smaller code). */
3564
3565 if (mnemonic[0] != 'f')
3566 return 0; /* non-math */
3567
3568 switch (mnemonic[1])
3569 {
3570 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3571 the fs segment override prefix not currently handled because no
3572 call path can make opcodes without operands get here */
3573 case 'i':
3574 return 2 /* integer op */;
3575 case 'l':
3576 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3577 return 3; /* fldcw/fldenv */
3578 break;
3579 case 'n':
3580 if (mnemonic[2] != 'o' /* fnop */)
3581 return 3; /* non-waiting control op */
3582 break;
3583 case 'r':
3584 if (mnemonic[2] == 's')
3585 return 3; /* frstor/frstpm */
3586 break;
3587 case 's':
3588 if (mnemonic[2] == 'a')
3589 return 3; /* fsave */
3590 if (mnemonic[2] == 't')
3591 {
3592 switch (mnemonic[3])
3593 {
3594 case 'c': /* fstcw */
3595 case 'd': /* fstdw */
3596 case 'e': /* fstenv */
3597 case 's': /* fsts[gw] */
3598 return 3;
3599 }
3600 }
3601 break;
3602 case 'x':
3603 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3604 return 0; /* fxsave/fxrstor are not really math ops */
3605 break;
3606 }
252b5132 3607
9306ca4a 3608 return 1;
252b5132
RH
3609}
3610
9a182d04
JB
3611static INLINE void
3612install_template (const insn_template *t)
3613{
3614 unsigned int l;
3615
3616 i.tm = *t;
3617
3618 /* Note that for pseudo prefixes this produces a length of 1. But for them
3619 the length isn't interesting at all. */
3620 for (l = 1; l < 4; ++l)
3621 if (!(t->base_opcode >> (8 * l)))
3622 break;
3623
3624 i.opcode_length = l;
3625}
3626
c0f3af97
L
3627/* Build the VEX prefix. */
3628
3629static void
d3ce72d0 3630build_vex_prefix (const insn_template *t)
c0f3af97
L
3631{
3632 unsigned int register_specifier;
c0f3af97 3633 unsigned int vector_length;
03751133 3634 unsigned int w;
c0f3af97
L
3635
3636 /* Check register specifier. */
3637 if (i.vex.register_specifier)
43234a1e
L
3638 {
3639 register_specifier =
3640 ~register_number (i.vex.register_specifier) & 0xf;
3641 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3642 }
c0f3af97
L
3643 else
3644 register_specifier = 0xf;
3645
79f0fa25
L
3646 /* Use 2-byte VEX prefix by swapping destination and source operand
3647 if there are more than 1 register operand. */
3648 if (i.reg_operands > 1
3649 && i.vec_encoding != vex_encoding_vex3
86fa6981 3650 && i.dir_encoding == dir_encoding_default
fa99fab2 3651 && i.operands == i.reg_operands
dbbc8b7e 3652 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
441f6aca 3653 && i.tm.opcode_modifier.opcodespace == SPACE_0F
dbbc8b7e 3654 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3655 && i.rex == REX_B)
3656 {
3657 unsigned int xchg = i.operands - 1;
3658 union i386_op temp_op;
3659 i386_operand_type temp_type;
3660
3661 temp_type = i.types[xchg];
3662 i.types[xchg] = i.types[0];
3663 i.types[0] = temp_type;
3664 temp_op = i.op[xchg];
3665 i.op[xchg] = i.op[0];
3666 i.op[0] = temp_op;
3667
9c2799c2 3668 gas_assert (i.rm.mode == 3);
fa99fab2
L
3669
3670 i.rex = REX_R;
3671 xchg = i.rm.regmem;
3672 i.rm.regmem = i.rm.reg;
3673 i.rm.reg = xchg;
3674
dbbc8b7e
JB
3675 if (i.tm.opcode_modifier.d)
3676 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
3677 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
3678 else /* Use the next insn. */
9a182d04 3679 install_template (&t[1]);
fa99fab2
L
3680 }
3681
79dec6b7
JB
3682 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3683 are no memory operands and at least 3 register ones. */
3684 if (i.reg_operands >= 3
3685 && i.vec_encoding != vex_encoding_vex3
3686 && i.reg_operands == i.operands - i.imm_operands
3687 && i.tm.opcode_modifier.vex
3688 && i.tm.opcode_modifier.commutative
3689 && (i.tm.opcode_modifier.sse2avx || optimize > 1)
3690 && i.rex == REX_B
3691 && i.vex.register_specifier
3692 && !(i.vex.register_specifier->reg_flags & RegRex))
3693 {
3694 unsigned int xchg = i.operands - i.reg_operands;
3695 union i386_op temp_op;
3696 i386_operand_type temp_type;
3697
441f6aca 3698 gas_assert (i.tm.opcode_modifier.opcodespace == SPACE_0F);
79dec6b7
JB
3699 gas_assert (!i.tm.opcode_modifier.sae);
3700 gas_assert (operand_type_equal (&i.types[i.operands - 2],
3701 &i.types[i.operands - 3]));
3702 gas_assert (i.rm.mode == 3);
3703
3704 temp_type = i.types[xchg];
3705 i.types[xchg] = i.types[xchg + 1];
3706 i.types[xchg + 1] = temp_type;
3707 temp_op = i.op[xchg];
3708 i.op[xchg] = i.op[xchg + 1];
3709 i.op[xchg + 1] = temp_op;
3710
3711 i.rex = 0;
3712 xchg = i.rm.regmem | 8;
3713 i.rm.regmem = ~register_specifier & 0xf;
3714 gas_assert (!(i.rm.regmem & 8));
3715 i.vex.register_specifier += xchg - i.rm.regmem;
3716 register_specifier = ~xchg & 0xf;
3717 }
3718
539f890d
L
3719 if (i.tm.opcode_modifier.vex == VEXScalar)
3720 vector_length = avxscalar;
10c17abd
JB
3721 else if (i.tm.opcode_modifier.vex == VEX256)
3722 vector_length = 1;
539f890d 3723 else
10c17abd 3724 {
56522fc5 3725 unsigned int op;
10c17abd 3726
c7213af9
L
3727 /* Determine vector length from the last multi-length vector
3728 operand. */
10c17abd 3729 vector_length = 0;
56522fc5 3730 for (op = t->operands; op--;)
10c17abd
JB
3731 if (t->operand_types[op].bitfield.xmmword
3732 && t->operand_types[op].bitfield.ymmword
3733 && i.types[op].bitfield.ymmword)
3734 {
3735 vector_length = 1;
3736 break;
3737 }
3738 }
c0f3af97 3739
03751133
L
3740 /* Check the REX.W bit and VEXW. */
3741 if (i.tm.opcode_modifier.vexw == VEXWIG)
3742 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
3743 else if (i.tm.opcode_modifier.vexw)
3744 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3745 else
931d03b7 3746 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3747
c0f3af97 3748 /* Use 2-byte VEX prefix if possible. */
03751133
L
3749 if (w == 0
3750 && i.vec_encoding != vex_encoding_vex3
441f6aca 3751 && i.tm.opcode_modifier.opcodespace == SPACE_0F
c0f3af97
L
3752 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3753 {
3754 /* 2-byte VEX prefix. */
3755 unsigned int r;
3756
3757 i.vex.length = 2;
3758 i.vex.bytes[0] = 0xc5;
3759
3760 /* Check the REX.R bit. */
3761 r = (i.rex & REX_R) ? 0 : 1;
3762 i.vex.bytes[1] = (r << 7
3763 | register_specifier << 3
3764 | vector_length << 2
35648716 3765 | i.tm.opcode_modifier.opcodeprefix);
c0f3af97
L
3766 }
3767 else
3768 {
3769 /* 3-byte VEX prefix. */
f88c9eb0 3770 i.vex.length = 3;
f88c9eb0 3771
441f6aca 3772 switch (i.tm.opcode_modifier.opcodespace)
5dd85c99 3773 {
441f6aca
JB
3774 case SPACE_0F:
3775 case SPACE_0F38:
3776 case SPACE_0F3A:
80de6e00 3777 i.vex.bytes[0] = 0xc4;
7f399153 3778 break;
441f6aca
JB
3779 case SPACE_XOP08:
3780 case SPACE_XOP09:
3781 case SPACE_XOP0A:
f88c9eb0 3782 i.vex.bytes[0] = 0x8f;
7f399153
L
3783 break;
3784 default:
3785 abort ();
f88c9eb0 3786 }
c0f3af97 3787
c0f3af97
L
3788 /* The high 3 bits of the second VEX byte are 1's compliment
3789 of RXB bits from REX. */
441f6aca 3790 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | i.tm.opcode_modifier.opcodespace;
c0f3af97 3791
c0f3af97
L
3792 i.vex.bytes[2] = (w << 7
3793 | register_specifier << 3
3794 | vector_length << 2
35648716 3795 | i.tm.opcode_modifier.opcodeprefix);
c0f3af97
L
3796 }
3797}
3798
5b7c81bd 3799static INLINE bool
e771e7c9
JB
3800is_evex_encoding (const insn_template *t)
3801{
7091c612 3802 return t->opcode_modifier.evex || t->opcode_modifier.disp8memshift
e771e7c9 3803 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
a80195f1 3804 || t->opcode_modifier.sae;
e771e7c9
JB
3805}
3806
5b7c81bd 3807static INLINE bool
7a8655d2
JB
3808is_any_vex_encoding (const insn_template *t)
3809{
7b47a312 3810 return t->opcode_modifier.vex || is_evex_encoding (t);
7a8655d2
JB
3811}
3812
43234a1e
L
3813/* Build the EVEX prefix. */
3814
3815static void
3816build_evex_prefix (void)
3817{
35648716 3818 unsigned int register_specifier, w;
43234a1e
L
3819 rex_byte vrex_used = 0;
3820
3821 /* Check register specifier. */
3822 if (i.vex.register_specifier)
3823 {
3824 gas_assert ((i.vrex & REX_X) == 0);
3825
3826 register_specifier = i.vex.register_specifier->reg_num;
3827 if ((i.vex.register_specifier->reg_flags & RegRex))
3828 register_specifier += 8;
3829 /* The upper 16 registers are encoded in the fourth byte of the
3830 EVEX prefix. */
3831 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3832 i.vex.bytes[3] = 0x8;
3833 register_specifier = ~register_specifier & 0xf;
3834 }
3835 else
3836 {
3837 register_specifier = 0xf;
3838
3839 /* Encode upper 16 vector index register in the fourth byte of
3840 the EVEX prefix. */
3841 if (!(i.vrex & REX_X))
3842 i.vex.bytes[3] = 0x8;
3843 else
3844 vrex_used |= REX_X;
3845 }
3846
43234a1e
L
3847 /* 4 byte EVEX prefix. */
3848 i.vex.length = 4;
3849 i.vex.bytes[0] = 0x62;
3850
43234a1e
L
3851 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3852 bits from REX. */
441f6aca
JB
3853 gas_assert (i.tm.opcode_modifier.opcodespace >= SPACE_0F);
3854 gas_assert (i.tm.opcode_modifier.opcodespace <= SPACE_0F3A);
3855 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | i.tm.opcode_modifier.opcodespace;
43234a1e
L
3856
3857 /* The fifth bit of the second EVEX byte is 1's compliment of the
3858 REX_R bit in VREX. */
3859 if (!(i.vrex & REX_R))
3860 i.vex.bytes[1] |= 0x10;
3861 else
3862 vrex_used |= REX_R;
3863
3864 if ((i.reg_operands + i.imm_operands) == i.operands)
3865 {
3866 /* When all operands are registers, the REX_X bit in REX is not
3867 used. We reuse it to encode the upper 16 registers, which is
3868 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3869 as 1's compliment. */
3870 if ((i.vrex & REX_B))
3871 {
3872 vrex_used |= REX_B;
3873 i.vex.bytes[1] &= ~0x40;
3874 }
3875 }
3876
3877 /* EVEX instructions shouldn't need the REX prefix. */
3878 i.vrex &= ~vrex_used;
3879 gas_assert (i.vrex == 0);
3880
6865c043
L
3881 /* Check the REX.W bit and VEXW. */
3882 if (i.tm.opcode_modifier.vexw == VEXWIG)
3883 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
3884 else if (i.tm.opcode_modifier.vexw)
3885 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3886 else
931d03b7 3887 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e 3888
43234a1e 3889 /* The third byte of the EVEX prefix. */
35648716
JB
3890 i.vex.bytes[2] = ((w << 7)
3891 | (register_specifier << 3)
3892 | 4 /* Encode the U bit. */
3893 | i.tm.opcode_modifier.opcodeprefix);
43234a1e
L
3894
3895 /* The fourth byte of the EVEX prefix. */
3896 /* The zeroing-masking bit. */
6225c532 3897 if (i.mask.reg && i.mask.zeroing)
43234a1e
L
3898 i.vex.bytes[3] |= 0x80;
3899
3900 /* Don't always set the broadcast bit if there is no RC. */
ca5312a2 3901 if (i.rounding.type == rc_none)
43234a1e
L
3902 {
3903 /* Encode the vector length. */
3904 unsigned int vec_length;
3905
e771e7c9
JB
3906 if (!i.tm.opcode_modifier.evex
3907 || i.tm.opcode_modifier.evex == EVEXDYN)
3908 {
56522fc5 3909 unsigned int op;
e771e7c9 3910
c7213af9
L
3911 /* Determine vector length from the last multi-length vector
3912 operand. */
56522fc5 3913 for (op = i.operands; op--;)
e771e7c9
JB
3914 if (i.tm.operand_types[op].bitfield.xmmword
3915 + i.tm.operand_types[op].bitfield.ymmword
3916 + i.tm.operand_types[op].bitfield.zmmword > 1)
3917 {
3918 if (i.types[op].bitfield.zmmword)
c7213af9
L
3919 {
3920 i.tm.opcode_modifier.evex = EVEX512;
3921 break;
3922 }
e771e7c9 3923 else if (i.types[op].bitfield.ymmword)
c7213af9
L
3924 {
3925 i.tm.opcode_modifier.evex = EVEX256;
3926 break;
3927 }
e771e7c9 3928 else if (i.types[op].bitfield.xmmword)
c7213af9
L
3929 {
3930 i.tm.opcode_modifier.evex = EVEX128;
3931 break;
3932 }
5273a3cd 3933 else if (i.broadcast.type && op == i.broadcast.operand)
625cbd7a 3934 {
5273a3cd 3935 switch (i.broadcast.bytes)
625cbd7a
JB
3936 {
3937 case 64:
3938 i.tm.opcode_modifier.evex = EVEX512;
3939 break;
3940 case 32:
3941 i.tm.opcode_modifier.evex = EVEX256;
3942 break;
3943 case 16:
3944 i.tm.opcode_modifier.evex = EVEX128;
3945 break;
3946 default:
c7213af9 3947 abort ();
625cbd7a 3948 }
c7213af9 3949 break;
625cbd7a 3950 }
e771e7c9 3951 }
c7213af9 3952
56522fc5 3953 if (op >= MAX_OPERANDS)
c7213af9 3954 abort ();
e771e7c9
JB
3955 }
3956
43234a1e
L
3957 switch (i.tm.opcode_modifier.evex)
3958 {
3959 case EVEXLIG: /* LL' is ignored */
3960 vec_length = evexlig << 5;
3961 break;
3962 case EVEX128:
3963 vec_length = 0 << 5;
3964 break;
3965 case EVEX256:
3966 vec_length = 1 << 5;
3967 break;
3968 case EVEX512:
3969 vec_length = 2 << 5;
3970 break;
3971 default:
3972 abort ();
3973 break;
3974 }
3975 i.vex.bytes[3] |= vec_length;
3976 /* Encode the broadcast bit. */
5273a3cd 3977 if (i.broadcast.type)
43234a1e
L
3978 i.vex.bytes[3] |= 0x10;
3979 }
ca5312a2
JB
3980 else if (i.rounding.type != saeonly)
3981 i.vex.bytes[3] |= 0x10 | (i.rounding.type << 5);
43234a1e 3982 else
ca5312a2 3983 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e 3984
6225c532
JB
3985 if (i.mask.reg)
3986 i.vex.bytes[3] |= i.mask.reg->reg_num;
43234a1e
L
3987}
3988
65da13b5
L
3989static void
3990process_immext (void)
3991{
3992 expressionS *exp;
3993
c0f3af97 3994 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
3995 which is coded in the same place as an 8-bit immediate field
3996 would be. Here we fake an 8-bit immediate operand from the
3997 opcode suffix stored in tm.extension_opcode.
3998
c1e679ec 3999 AVX instructions also use this encoding, for some of
c0f3af97 4000 3 argument instructions. */
65da13b5 4001
43234a1e 4002 gas_assert (i.imm_operands <= 1
7ab9ffdd 4003 && (i.operands <= 2
7a8655d2 4004 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 4005 && i.operands <= 4)));
65da13b5
L
4006
4007 exp = &im_expressions[i.imm_operands++];
4008 i.op[i.operands].imms = exp;
4009 i.types[i.operands] = imm8;
4010 i.operands++;
4011 exp->X_op = O_constant;
4012 exp->X_add_number = i.tm.extension_opcode;
4013 i.tm.extension_opcode = None;
4014}
4015
42164a71
L
4016
4017static int
4018check_hle (void)
4019{
742732c7 4020 switch (i.tm.opcode_modifier.prefixok)
42164a71
L
4021 {
4022 default:
4023 abort ();
742732c7
JB
4024 case PrefixLock:
4025 case PrefixNone:
4026 case PrefixNoTrack:
4027 case PrefixRep:
165de32a
L
4028 as_bad (_("invalid instruction `%s' after `%s'"),
4029 i.tm.name, i.hle_prefix);
42164a71 4030 return 0;
742732c7 4031 case PrefixHLELock:
42164a71
L
4032 if (i.prefix[LOCK_PREFIX])
4033 return 1;
165de32a 4034 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 4035 return 0;
742732c7 4036 case PrefixHLEAny:
42164a71 4037 return 1;
742732c7 4038 case PrefixHLERelease:
42164a71
L
4039 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
4040 {
4041 as_bad (_("instruction `%s' after `xacquire' not allowed"),
4042 i.tm.name);
4043 return 0;
4044 }
8dc0818e 4045 if (i.mem_operands == 0 || !(i.flags[i.operands - 1] & Operand_Mem))
42164a71
L
4046 {
4047 as_bad (_("memory destination needed for instruction `%s'"
4048 " after `xrelease'"), i.tm.name);
4049 return 0;
4050 }
4051 return 1;
4052 }
4053}
4054
b6f8c7c4
L
4055/* Try the shortest encoding by shortening operand size. */
4056
4057static void
4058optimize_encoding (void)
4059{
a0a1771e 4060 unsigned int j;
b6f8c7c4
L
4061
4062 if (optimize_for_space
389d00a5 4063 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
b6f8c7c4
L
4064 && i.reg_operands == 1
4065 && i.imm_operands == 1
4066 && !i.types[1].bitfield.byte
4067 && i.op[0].imms->X_op == O_constant
4068 && fits_in_imm7 (i.op[0].imms->X_add_number)
72aea328 4069 && (i.tm.base_opcode == 0xa8
b6f8c7c4
L
4070 || (i.tm.base_opcode == 0xf6
4071 && i.tm.extension_opcode == 0x0)))
4072 {
4073 /* Optimize: -Os:
4074 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
4075 */
4076 unsigned int base_regnum = i.op[1].regs->reg_num;
4077 if (flag_code == CODE_64BIT || base_regnum < 4)
4078 {
4079 i.types[1].bitfield.byte = 1;
4080 /* Ignore the suffix. */
4081 i.suffix = 0;
7697afb6
JB
4082 /* Convert to byte registers. */
4083 if (i.types[1].bitfield.word)
4084 j = 16;
4085 else if (i.types[1].bitfield.dword)
4086 j = 32;
4087 else
4088 j = 48;
4089 if (!(i.op[1].regs->reg_flags & RegRex) && base_regnum < 4)
4090 j += 8;
4091 i.op[1].regs -= j;
b6f8c7c4
L
4092 }
4093 }
4094 else if (flag_code == CODE_64BIT
389d00a5 4095 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
d3d50934
L
4096 && ((i.types[1].bitfield.qword
4097 && i.reg_operands == 1
b6f8c7c4
L
4098 && i.imm_operands == 1
4099 && i.op[0].imms->X_op == O_constant
507916b8 4100 && ((i.tm.base_opcode == 0xb8
b6f8c7c4
L
4101 && i.tm.extension_opcode == None
4102 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
4103 || (fits_in_imm31 (i.op[0].imms->X_add_number)
72aea328
JB
4104 && ((i.tm.base_opcode == 0x24
4105 || i.tm.base_opcode == 0xa8)
b6f8c7c4
L
4106 || (i.tm.base_opcode == 0x80
4107 && i.tm.extension_opcode == 0x4)
4108 || ((i.tm.base_opcode == 0xf6
507916b8 4109 || (i.tm.base_opcode | 1) == 0xc7)
b8364fa7
JB
4110 && i.tm.extension_opcode == 0x0)))
4111 || (fits_in_imm7 (i.op[0].imms->X_add_number)
4112 && i.tm.base_opcode == 0x83
4113 && i.tm.extension_opcode == 0x4)))
d3d50934
L
4114 || (i.types[0].bitfield.qword
4115 && ((i.reg_operands == 2
4116 && i.op[0].regs == i.op[1].regs
72aea328
JB
4117 && (i.tm.base_opcode == 0x30
4118 || i.tm.base_opcode == 0x28))
d3d50934
L
4119 || (i.reg_operands == 1
4120 && i.operands == 1
72aea328 4121 && i.tm.base_opcode == 0x30)))))
b6f8c7c4
L
4122 {
4123 /* Optimize: -O:
4124 andq $imm31, %r64 -> andl $imm31, %r32
b8364fa7 4125 andq $imm7, %r64 -> andl $imm7, %r32
b6f8c7c4
L
4126 testq $imm31, %r64 -> testl $imm31, %r32
4127 xorq %r64, %r64 -> xorl %r32, %r32
4128 subq %r64, %r64 -> subl %r32, %r32
4129 movq $imm31, %r64 -> movl $imm31, %r32
4130 movq $imm32, %r64 -> movl $imm32, %r32
4131 */
4132 i.tm.opcode_modifier.norex64 = 1;
507916b8 4133 if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4134 {
4135 /* Handle
4136 movq $imm31, %r64 -> movl $imm31, %r32
4137 movq $imm32, %r64 -> movl $imm32, %r32
4138 */
4139 i.tm.operand_types[0].bitfield.imm32 = 1;
4140 i.tm.operand_types[0].bitfield.imm32s = 0;
4141 i.tm.operand_types[0].bitfield.imm64 = 0;
4142 i.types[0].bitfield.imm32 = 1;
4143 i.types[0].bitfield.imm32s = 0;
4144 i.types[0].bitfield.imm64 = 0;
4145 i.types[1].bitfield.dword = 1;
4146 i.types[1].bitfield.qword = 0;
507916b8 4147 if ((i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4148 {
4149 /* Handle
4150 movq $imm31, %r64 -> movl $imm31, %r32
4151 */
507916b8 4152 i.tm.base_opcode = 0xb8;
b6f8c7c4 4153 i.tm.extension_opcode = None;
507916b8 4154 i.tm.opcode_modifier.w = 0;
b6f8c7c4
L
4155 i.tm.opcode_modifier.modrm = 0;
4156 }
4157 }
4158 }
5641ec01
JB
4159 else if (optimize > 1
4160 && !optimize_for_space
389d00a5 4161 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
5641ec01
JB
4162 && i.reg_operands == 2
4163 && i.op[0].regs == i.op[1].regs
4164 && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8
4165 || (i.tm.base_opcode & ~(Opcode_D | 1)) == 0x20)
4166 && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword))
4167 {
4168 /* Optimize: -O2:
4169 andb %rN, %rN -> testb %rN, %rN
4170 andw %rN, %rN -> testw %rN, %rN
4171 andq %rN, %rN -> testq %rN, %rN
4172 orb %rN, %rN -> testb %rN, %rN
4173 orw %rN, %rN -> testw %rN, %rN
4174 orq %rN, %rN -> testq %rN, %rN
4175
4176 and outside of 64-bit mode
4177
4178 andl %rN, %rN -> testl %rN, %rN
4179 orl %rN, %rN -> testl %rN, %rN
4180 */
4181 i.tm.base_opcode = 0x84 | (i.tm.base_opcode & 1);
4182 }
99112332 4183 else if (i.reg_operands == 3
b6f8c7c4
L
4184 && i.op[0].regs == i.op[1].regs
4185 && !i.types[2].bitfield.xmmword
4186 && (i.tm.opcode_modifier.vex
6225c532 4187 || ((!i.mask.reg || i.mask.zeroing)
ca5312a2 4188 && i.rounding.type == rc_none
e771e7c9 4189 && is_evex_encoding (&i.tm)
80c34c38 4190 && (i.vec_encoding != vex_encoding_evex
dd22218c 4191 || cpu_arch_isa_flags.bitfield.cpuavx512vl
80c34c38 4192 || i.tm.cpu_flags.bitfield.cpuavx512vl
7091c612 4193 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4194 && i.types[2].bitfield.ymmword))))
b6f8c7c4 4195 && ((i.tm.base_opcode == 0x55
b6f8c7c4 4196 || i.tm.base_opcode == 0x57
35648716
JB
4197 || i.tm.base_opcode == 0xdf
4198 || i.tm.base_opcode == 0xef
4199 || i.tm.base_opcode == 0xf8
4200 || i.tm.base_opcode == 0xf9
4201 || i.tm.base_opcode == 0xfa
4202 || i.tm.base_opcode == 0xfb
1424ad86 4203 || i.tm.base_opcode == 0x42
35648716 4204 || i.tm.base_opcode == 0x47)
b6f8c7c4
L
4205 && i.tm.extension_opcode == None))
4206 {
99112332 4207 /* Optimize: -O1:
8305403a
L
4208 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4209 vpsubq and vpsubw:
b6f8c7c4
L
4210 EVEX VOP %zmmM, %zmmM, %zmmN
4211 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4212 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4213 EVEX VOP %ymmM, %ymmM, %ymmN
4214 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4215 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4216 VEX VOP %ymmM, %ymmM, %ymmN
4217 -> VEX VOP %xmmM, %xmmM, %xmmN
4218 VOP, one of vpandn and vpxor:
4219 VEX VOP %ymmM, %ymmM, %ymmN
4220 -> VEX VOP %xmmM, %xmmM, %xmmN
4221 VOP, one of vpandnd and vpandnq:
4222 EVEX VOP %zmmM, %zmmM, %zmmN
4223 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4224 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4225 EVEX VOP %ymmM, %ymmM, %ymmN
4226 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4227 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4228 VOP, one of vpxord and vpxorq:
4229 EVEX VOP %zmmM, %zmmM, %zmmN
4230 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4231 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4232 EVEX VOP %ymmM, %ymmM, %ymmN
4233 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4234 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4235 VOP, one of kxord and kxorq:
4236 VEX VOP %kM, %kM, %kN
4237 -> VEX kxorw %kM, %kM, %kN
4238 VOP, one of kandnd and kandnq:
4239 VEX VOP %kM, %kM, %kN
4240 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4241 */
e771e7c9 4242 if (is_evex_encoding (&i.tm))
b6f8c7c4 4243 {
7b1d7ca1 4244 if (i.vec_encoding != vex_encoding_evex)
b6f8c7c4
L
4245 {
4246 i.tm.opcode_modifier.vex = VEX128;
4247 i.tm.opcode_modifier.vexw = VEXW0;
4248 i.tm.opcode_modifier.evex = 0;
4249 }
7b1d7ca1 4250 else if (optimize > 1)
dd22218c
L
4251 i.tm.opcode_modifier.evex = EVEX128;
4252 else
4253 return;
b6f8c7c4 4254 }
f74a6307 4255 else if (i.tm.operand_types[0].bitfield.class == RegMask)
1424ad86 4256 {
35648716 4257 i.tm.opcode_modifier.opcodeprefix = PREFIX_NONE;
1424ad86
JB
4258 i.tm.opcode_modifier.vexw = VEXW0;
4259 }
b6f8c7c4
L
4260 else
4261 i.tm.opcode_modifier.vex = VEX128;
4262
4263 if (i.tm.opcode_modifier.vex)
4264 for (j = 0; j < 3; j++)
4265 {
4266 i.types[j].bitfield.xmmword = 1;
4267 i.types[j].bitfield.ymmword = 0;
4268 }
4269 }
392a5972 4270 else if (i.vec_encoding != vex_encoding_evex
97ed31ae 4271 && !i.types[0].bitfield.zmmword
392a5972 4272 && !i.types[1].bitfield.zmmword
6225c532 4273 && !i.mask.reg
5273a3cd 4274 && !i.broadcast.type
97ed31ae 4275 && is_evex_encoding (&i.tm)
35648716
JB
4276 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x6f
4277 || (i.tm.base_opcode & ~4) == 0xdb
4278 || (i.tm.base_opcode & ~4) == 0xeb)
97ed31ae
L
4279 && i.tm.extension_opcode == None)
4280 {
4281 /* Optimize: -O1:
4282 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4283 vmovdqu32 and vmovdqu64:
4284 EVEX VOP %xmmM, %xmmN
4285 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4286 EVEX VOP %ymmM, %ymmN
4287 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4288 EVEX VOP %xmmM, mem
4289 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4290 EVEX VOP %ymmM, mem
4291 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4292 EVEX VOP mem, %xmmN
4293 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4294 EVEX VOP mem, %ymmN
4295 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
a0a1771e
JB
4296 VOP, one of vpand, vpandn, vpor, vpxor:
4297 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4298 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4299 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4300 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4301 EVEX VOP{d,q} mem, %xmmM, %xmmN
4302 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4303 EVEX VOP{d,q} mem, %ymmM, %ymmN
4304 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
97ed31ae 4305 */
a0a1771e 4306 for (j = 0; j < i.operands; j++)
392a5972
L
4307 if (operand_type_check (i.types[j], disp)
4308 && i.op[j].disps->X_op == O_constant)
4309 {
4310 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4311 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4312 bytes, we choose EVEX Disp8 over VEX Disp32. */
4313 int evex_disp8, vex_disp8;
4314 unsigned int memshift = i.memshift;
4315 offsetT n = i.op[j].disps->X_add_number;
4316
4317 evex_disp8 = fits_in_disp8 (n);
4318 i.memshift = 0;
4319 vex_disp8 = fits_in_disp8 (n);
4320 if (evex_disp8 != vex_disp8)
4321 {
4322 i.memshift = memshift;
4323 return;
4324 }
4325
4326 i.types[j].bitfield.disp8 = vex_disp8;
4327 break;
4328 }
35648716
JB
4329 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x6f
4330 && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2)
4331 i.tm.opcode_modifier.opcodeprefix = PREFIX_0XF3;
97ed31ae
L
4332 i.tm.opcode_modifier.vex
4333 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4334 i.tm.opcode_modifier.vexw = VEXW0;
79dec6b7 4335 /* VPAND, VPOR, and VPXOR are commutative. */
35648716 4336 if (i.reg_operands == 3 && i.tm.base_opcode != 0xdf)
79dec6b7 4337 i.tm.opcode_modifier.commutative = 1;
97ed31ae
L
4338 i.tm.opcode_modifier.evex = 0;
4339 i.tm.opcode_modifier.masking = 0;
a0a1771e 4340 i.tm.opcode_modifier.broadcast = 0;
97ed31ae
L
4341 i.tm.opcode_modifier.disp8memshift = 0;
4342 i.memshift = 0;
a0a1771e
JB
4343 if (j < i.operands)
4344 i.types[j].bitfield.disp8
4345 = fits_in_disp8 (i.op[j].disps->X_add_number);
97ed31ae 4346 }
b6f8c7c4
L
4347}
4348
ae531041
L
4349/* Return non-zero for load instruction. */
4350
4351static int
4352load_insn_p (void)
4353{
4354 unsigned int dest;
4355 int any_vex_p = is_any_vex_encoding (&i.tm);
4356 unsigned int base_opcode = i.tm.base_opcode | 1;
4357
4358 if (!any_vex_p)
4359 {
a09f656b 4360 /* Anysize insns: lea, invlpg, clflush, prefetchnta, prefetcht0,
4361 prefetcht1, prefetcht2, prefetchtw, bndmk, bndcl, bndcu, bndcn,
4362 bndstx, bndldx, prefetchwt1, clflushopt, clwb, cldemote. */
4363 if (i.tm.opcode_modifier.anysize)
ae531041
L
4364 return 0;
4365
389d00a5
JB
4366 /* pop. */
4367 if (strcmp (i.tm.name, "pop") == 0)
4368 return 1;
4369 }
4370
4371 if (i.tm.opcode_modifier.opcodespace == SPACE_BASE)
4372 {
4373 /* popf, popa. */
4374 if (i.tm.base_opcode == 0x9d
a09f656b 4375 || i.tm.base_opcode == 0x61)
ae531041
L
4376 return 1;
4377
4378 /* movs, cmps, lods, scas. */
4379 if ((i.tm.base_opcode | 0xb) == 0xaf)
4380 return 1;
4381
a09f656b 4382 /* outs, xlatb. */
4383 if (base_opcode == 0x6f
4384 || i.tm.base_opcode == 0xd7)
ae531041 4385 return 1;
a09f656b 4386 /* NB: For AMD-specific insns with implicit memory operands,
4387 they're intentionally not covered. */
ae531041
L
4388 }
4389
4390 /* No memory operand. */
4391 if (!i.mem_operands)
4392 return 0;
4393
4394 if (any_vex_p)
4395 {
4396 /* vldmxcsr. */
4397 if (i.tm.base_opcode == 0xae
4398 && i.tm.opcode_modifier.vex
441f6aca 4399 && i.tm.opcode_modifier.opcodespace == SPACE_0F
35648716 4400 && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE
ae531041
L
4401 && i.tm.extension_opcode == 2)
4402 return 1;
4403 }
389d00a5 4404 else if (i.tm.opcode_modifier.opcodespace == SPACE_BASE)
ae531041
L
4405 {
4406 /* test, not, neg, mul, imul, div, idiv. */
4407 if ((i.tm.base_opcode == 0xf6 || i.tm.base_opcode == 0xf7)
4408 && i.tm.extension_opcode != 1)
4409 return 1;
4410
4411 /* inc, dec. */
4412 if (base_opcode == 0xff && i.tm.extension_opcode <= 1)
4413 return 1;
4414
4415 /* add, or, adc, sbb, and, sub, xor, cmp. */
4416 if (i.tm.base_opcode >= 0x80 && i.tm.base_opcode <= 0x83)
4417 return 1;
4418
ae531041
L
4419 /* rol, ror, rcl, rcr, shl/sal, shr, sar. */
4420 if ((base_opcode == 0xc1
4421 || (i.tm.base_opcode >= 0xd0 && i.tm.base_opcode <= 0xd3))
4422 && i.tm.extension_opcode != 6)
4423 return 1;
4424
ae531041 4425 /* Check for x87 instructions. */
389d00a5 4426 if (base_opcode >= 0xd8 && base_opcode <= 0xdf)
ae531041
L
4427 {
4428 /* Skip fst, fstp, fstenv, fstcw. */
4429 if (i.tm.base_opcode == 0xd9
4430 && (i.tm.extension_opcode == 2
4431 || i.tm.extension_opcode == 3
4432 || i.tm.extension_opcode == 6
4433 || i.tm.extension_opcode == 7))
4434 return 0;
4435
4436 /* Skip fisttp, fist, fistp, fstp. */
4437 if (i.tm.base_opcode == 0xdb
4438 && (i.tm.extension_opcode == 1
4439 || i.tm.extension_opcode == 2
4440 || i.tm.extension_opcode == 3
4441 || i.tm.extension_opcode == 7))
4442 return 0;
4443
4444 /* Skip fisttp, fst, fstp, fsave, fstsw. */
4445 if (i.tm.base_opcode == 0xdd
4446 && (i.tm.extension_opcode == 1
4447 || i.tm.extension_opcode == 2
4448 || i.tm.extension_opcode == 3
4449 || i.tm.extension_opcode == 6
4450 || i.tm.extension_opcode == 7))
4451 return 0;
4452
4453 /* Skip fisttp, fist, fistp, fbstp, fistp. */
4454 if (i.tm.base_opcode == 0xdf
4455 && (i.tm.extension_opcode == 1
4456 || i.tm.extension_opcode == 2
4457 || i.tm.extension_opcode == 3
4458 || i.tm.extension_opcode == 6
4459 || i.tm.extension_opcode == 7))
4460 return 0;
4461
4462 return 1;
4463 }
4464 }
389d00a5
JB
4465 else if (i.tm.opcode_modifier.opcodespace == SPACE_0F)
4466 {
4467 /* bt, bts, btr, btc. */
4468 if (i.tm.base_opcode == 0xba
4469 && (i.tm.extension_opcode >= 4 && i.tm.extension_opcode <= 7))
4470 return 1;
4471
4472 /* cmpxchg8b, cmpxchg16b, xrstors, vmptrld. */
4473 if (i.tm.base_opcode == 0xc7
4474 && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE
4475 && (i.tm.extension_opcode == 1 || i.tm.extension_opcode == 3
4476 || i.tm.extension_opcode == 6))
4477 return 1;
4478
4479 /* fxrstor, ldmxcsr, xrstor. */
4480 if (i.tm.base_opcode == 0xae
4481 && (i.tm.extension_opcode == 1
4482 || i.tm.extension_opcode == 2
4483 || i.tm.extension_opcode == 5))
4484 return 1;
4485
4486 /* lgdt, lidt, lmsw. */
4487 if (i.tm.base_opcode == 0x01
4488 && (i.tm.extension_opcode == 2
4489 || i.tm.extension_opcode == 3
4490 || i.tm.extension_opcode == 6))
4491 return 1;
4492 }
ae531041
L
4493
4494 dest = i.operands - 1;
4495
4496 /* Check fake imm8 operand and 3 source operands. */
4497 if ((i.tm.opcode_modifier.immext
4498 || i.tm.opcode_modifier.vexsources == VEX3SOURCES)
4499 && i.types[dest].bitfield.imm8)
4500 dest--;
4501
389d00a5
JB
4502 /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg. */
4503 if (i.tm.opcode_modifier.opcodespace == SPACE_BASE
ae531041
L
4504 && (base_opcode == 0x1
4505 || base_opcode == 0x9
4506 || base_opcode == 0x11
4507 || base_opcode == 0x19
4508 || base_opcode == 0x21
4509 || base_opcode == 0x29
4510 || base_opcode == 0x31
4511 || base_opcode == 0x39
389d00a5
JB
4512 || (base_opcode | 2) == 0x87))
4513 return 1;
4514
4515 /* xadd. */
4516 if (i.tm.opcode_modifier.opcodespace == SPACE_0F
4517 && base_opcode == 0xc1)
ae531041
L
4518 return 1;
4519
4520 /* Check for load instruction. */
4521 return (i.types[dest].bitfield.class != ClassNone
4522 || i.types[dest].bitfield.instance == Accum);
4523}
4524
4525/* Output lfence, 0xfaee8, after instruction. */
4526
4527static void
4528insert_lfence_after (void)
4529{
4530 if (lfence_after_load && load_insn_p ())
4531 {
a09f656b 4532 /* There are also two REP string instructions that require
4533 special treatment. Specifically, the compare string (CMPS)
4534 and scan string (SCAS) instructions set EFLAGS in a manner
4535 that depends on the data being compared/scanned. When used
4536 with a REP prefix, the number of iterations may therefore
4537 vary depending on this data. If the data is a program secret
4538 chosen by the adversary using an LVI method,
4539 then this data-dependent behavior may leak some aspect
4540 of the secret. */
4541 if (((i.tm.base_opcode | 0x1) == 0xa7
4542 || (i.tm.base_opcode | 0x1) == 0xaf)
4543 && i.prefix[REP_PREFIX])
4544 {
4545 as_warn (_("`%s` changes flags which would affect control flow behavior"),
4546 i.tm.name);
4547 }
ae531041
L
4548 char *p = frag_more (3);
4549 *p++ = 0xf;
4550 *p++ = 0xae;
4551 *p = 0xe8;
4552 }
4553}
4554
4555/* Output lfence, 0xfaee8, before instruction. */
4556
4557static void
4558insert_lfence_before (void)
4559{
4560 char *p;
4561
389d00a5 4562 if (i.tm.opcode_modifier.opcodespace != SPACE_BASE)
ae531041
L
4563 return;
4564
4565 if (i.tm.base_opcode == 0xff
4566 && (i.tm.extension_opcode == 2 || i.tm.extension_opcode == 4))
4567 {
4568 /* Insert lfence before indirect branch if needed. */
4569
4570 if (lfence_before_indirect_branch == lfence_branch_none)
4571 return;
4572
4573 if (i.operands != 1)
4574 abort ();
4575
4576 if (i.reg_operands == 1)
4577 {
4578 /* Indirect branch via register. Don't insert lfence with
4579 -mlfence-after-load=yes. */
4580 if (lfence_after_load
4581 || lfence_before_indirect_branch == lfence_branch_memory)
4582 return;
4583 }
4584 else if (i.mem_operands == 1
4585 && lfence_before_indirect_branch != lfence_branch_register)
4586 {
4587 as_warn (_("indirect `%s` with memory operand should be avoided"),
4588 i.tm.name);
4589 return;
4590 }
4591 else
4592 return;
4593
4594 if (last_insn.kind != last_insn_other
4595 && last_insn.seg == now_seg)
4596 {
4597 as_warn_where (last_insn.file, last_insn.line,
4598 _("`%s` skips -mlfence-before-indirect-branch on `%s`"),
4599 last_insn.name, i.tm.name);
4600 return;
4601 }
4602
4603 p = frag_more (3);
4604 *p++ = 0xf;
4605 *p++ = 0xae;
4606 *p = 0xe8;
4607 return;
4608 }
4609
503648e4 4610 /* Output or/not/shl and lfence before near ret. */
ae531041
L
4611 if (lfence_before_ret != lfence_before_ret_none
4612 && (i.tm.base_opcode == 0xc2
503648e4 4613 || i.tm.base_opcode == 0xc3))
ae531041
L
4614 {
4615 if (last_insn.kind != last_insn_other
4616 && last_insn.seg == now_seg)
4617 {
4618 as_warn_where (last_insn.file, last_insn.line,
4619 _("`%s` skips -mlfence-before-ret on `%s`"),
4620 last_insn.name, i.tm.name);
4621 return;
4622 }
a09f656b 4623
a09f656b 4624 /* Near ret ingore operand size override under CPU64. */
503648e4 4625 char prefix = flag_code == CODE_64BIT
4626 ? 0x48
4627 : i.prefix[DATA_PREFIX] ? 0x66 : 0x0;
a09f656b 4628
4629 if (lfence_before_ret == lfence_before_ret_not)
4630 {
4631 /* not: 0xf71424, may add prefix
4632 for operand size override or 64-bit code. */
4633 p = frag_more ((prefix ? 2 : 0) + 6 + 3);
4634 if (prefix)
4635 *p++ = prefix;
ae531041
L
4636 *p++ = 0xf7;
4637 *p++ = 0x14;
4638 *p++ = 0x24;
a09f656b 4639 if (prefix)
4640 *p++ = prefix;
ae531041
L
4641 *p++ = 0xf7;
4642 *p++ = 0x14;
4643 *p++ = 0x24;
4644 }
a09f656b 4645 else
4646 {
4647 p = frag_more ((prefix ? 1 : 0) + 4 + 3);
4648 if (prefix)
4649 *p++ = prefix;
4650 if (lfence_before_ret == lfence_before_ret_or)
4651 {
4652 /* or: 0x830c2400, may add prefix
4653 for operand size override or 64-bit code. */
4654 *p++ = 0x83;
4655 *p++ = 0x0c;
4656 }
4657 else
4658 {
4659 /* shl: 0xc1242400, may add prefix
4660 for operand size override or 64-bit code. */
4661 *p++ = 0xc1;
4662 *p++ = 0x24;
4663 }
4664
4665 *p++ = 0x24;
4666 *p++ = 0x0;
4667 }
4668
ae531041
L
4669 *p++ = 0xf;
4670 *p++ = 0xae;
4671 *p = 0xe8;
4672 }
4673}
4674
252b5132
RH
4675/* This is the guts of the machine-dependent assembler. LINE points to a
4676 machine dependent instruction. This function is supposed to emit
4677 the frags/bytes it assembles to. */
4678
4679void
65da13b5 4680md_assemble (char *line)
252b5132 4681{
40fb9820 4682 unsigned int j;
83b16ac6 4683 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 4684 const insn_template *t;
252b5132 4685
47926f60 4686 /* Initialize globals. */
252b5132 4687 memset (&i, '\0', sizeof (i));
ca5312a2 4688 i.rounding.type = rc_none;
252b5132 4689 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 4690 i.reloc[j] = NO_RELOC;
252b5132
RH
4691 memset (disp_expressions, '\0', sizeof (disp_expressions));
4692 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 4693 save_stack_p = save_stack;
252b5132
RH
4694
4695 /* First parse an instruction mnemonic & call i386_operand for the operands.
4696 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 4697 start of a (possibly prefixed) mnemonic. */
252b5132 4698
29b0f896
AM
4699 line = parse_insn (line, mnemonic);
4700 if (line == NULL)
4701 return;
83b16ac6 4702 mnem_suffix = i.suffix;
252b5132 4703
29b0f896 4704 line = parse_operands (line, mnemonic);
ee86248c 4705 this_operand = -1;
8325cc63
JB
4706 xfree (i.memop1_string);
4707 i.memop1_string = NULL;
29b0f896
AM
4708 if (line == NULL)
4709 return;
252b5132 4710
29b0f896
AM
4711 /* Now we've parsed the mnemonic into a set of templates, and have the
4712 operands at hand. */
4713
b630c145 4714 /* All Intel opcodes have reversed operands except for "bound", "enter",
c0e54661
JB
4715 "invlpg*", "monitor*", "mwait*", "tpause", "umwait", "pvalidate",
4716 "rmpadjust", and "rmpupdate". We also don't reverse intersegment "jmp"
4717 and "call" instructions with 2 immediate operands so that the immediate
4718 segment precedes the offset consistently in Intel and AT&T modes. */
4d456e3d
L
4719 if (intel_syntax
4720 && i.operands > 1
29b0f896 4721 && (strcmp (mnemonic, "bound") != 0)
c0e54661 4722 && (strncmp (mnemonic, "invlpg", 6) != 0)
d34049e8
ML
4723 && !startswith (mnemonic, "monitor")
4724 && !startswith (mnemonic, "mwait")
c0e54661 4725 && (strcmp (mnemonic, "pvalidate") != 0)
d34049e8 4726 && !startswith (mnemonic, "rmp")
b630c145
JB
4727 && (strcmp (mnemonic, "tpause") != 0)
4728 && (strcmp (mnemonic, "umwait") != 0)
40fb9820
L
4729 && !(operand_type_check (i.types[0], imm)
4730 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4731 swap_operands ();
4732
ec56d5c0
JB
4733 /* The order of the immediates should be reversed
4734 for 2 immediates extrq and insertq instructions */
4735 if (i.imm_operands == 2
4736 && (strcmp (mnemonic, "extrq") == 0
4737 || strcmp (mnemonic, "insertq") == 0))
4738 swap_2_operands (0, 1);
4739
29b0f896
AM
4740 if (i.imm_operands)
4741 optimize_imm ();
4742
b300c311
L
4743 /* Don't optimize displacement for movabs since it only takes 64bit
4744 displacement. */
4745 if (i.disp_operands
a501d77e 4746 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4747 && (flag_code != CODE_64BIT
4748 || strcmp (mnemonic, "movabs") != 0))
4749 optimize_disp ();
29b0f896
AM
4750
4751 /* Next, we find a template that matches the given insn,
4752 making sure the overlap of the given operands types is consistent
4753 with the template operand types. */
252b5132 4754
83b16ac6 4755 if (!(t = match_template (mnem_suffix)))
29b0f896 4756 return;
252b5132 4757
7bab8ab5 4758 if (sse_check != check_none
81f8a913 4759 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4760 && !i.tm.cpu_flags.bitfield.cpuavx
569d50f1 4761 && !i.tm.cpu_flags.bitfield.cpuavx512f
daf50ae7
L
4762 && (i.tm.cpu_flags.bitfield.cpusse
4763 || i.tm.cpu_flags.bitfield.cpusse2
4764 || i.tm.cpu_flags.bitfield.cpusse3
4765 || i.tm.cpu_flags.bitfield.cpussse3
4766 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e
JB
4767 || i.tm.cpu_flags.bitfield.cpusse4_2
4768 || i.tm.cpu_flags.bitfield.cpupclmul
4769 || i.tm.cpu_flags.bitfield.cpuaes
569d50f1 4770 || i.tm.cpu_flags.bitfield.cpusha
6e3e5c9e 4771 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4772 {
7bab8ab5 4773 (sse_check == check_warning
daf50ae7
L
4774 ? as_warn
4775 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4776 }
4777
40fb9820 4778 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4779 if (!add_prefix (FWAIT_OPCODE))
4780 return;
252b5132 4781
d5de92cf 4782 /* Check if REP prefix is OK. */
742732c7 4783 if (i.rep_prefix && i.tm.opcode_modifier.prefixok != PrefixRep)
d5de92cf
L
4784 {
4785 as_bad (_("invalid instruction `%s' after `%s'"),
4786 i.tm.name, i.rep_prefix);
4787 return;
4788 }
4789
c1ba0266
L
4790 /* Check for lock without a lockable instruction. Destination operand
4791 must be memory unless it is xchg (0x86). */
c32fa91d 4792 if (i.prefix[LOCK_PREFIX]
742732c7 4793 && (i.tm.opcode_modifier.prefixok < PrefixLock
c1ba0266
L
4794 || i.mem_operands == 0
4795 || (i.tm.base_opcode != 0x86
8dc0818e 4796 && !(i.flags[i.operands - 1] & Operand_Mem))))
c32fa91d
L
4797 {
4798 as_bad (_("expecting lockable instruction after `lock'"));
4799 return;
4800 }
4801
40d231b4
JB
4802 /* Check for data size prefix on VEX/XOP/EVEX encoded and SIMD insns. */
4803 if (i.prefix[DATA_PREFIX]
4804 && (is_any_vex_encoding (&i.tm)
4805 || i.tm.operand_types[i.imm_operands].bitfield.class >= RegMMX
4806 || i.tm.operand_types[i.imm_operands + 1].bitfield.class >= RegMMX))
7a8655d2
JB
4807 {
4808 as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
4809 return;
4810 }
4811
42164a71 4812 /* Check if HLE prefix is OK. */
165de32a 4813 if (i.hle_prefix && !check_hle ())
42164a71
L
4814 return;
4815
7e8b059b
L
4816 /* Check BND prefix. */
4817 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
4818 as_bad (_("expecting valid branch instruction after `bnd'"));
4819
04ef582a 4820 /* Check NOTRACK prefix. */
742732c7 4821 if (i.notrack_prefix && i.tm.opcode_modifier.prefixok != PrefixNoTrack)
9fef80d6 4822 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 4823
327e8c42
JB
4824 if (i.tm.cpu_flags.bitfield.cpumpx)
4825 {
4826 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4827 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
4828 else if (flag_code != CODE_16BIT
4829 ? i.prefix[ADDR_PREFIX]
4830 : i.mem_operands && !i.prefix[ADDR_PREFIX])
4831 as_bad (_("16-bit address isn't allowed in MPX instructions"));
4832 }
7e8b059b
L
4833
4834 /* Insert BND prefix. */
76d3a78a
JB
4835 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
4836 {
4837 if (!i.prefix[BND_PREFIX])
4838 add_prefix (BND_PREFIX_OPCODE);
4839 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
4840 {
4841 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
4842 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
4843 }
4844 }
7e8b059b 4845
29b0f896 4846 /* Check string instruction segment overrides. */
51c8edf6 4847 if (i.tm.opcode_modifier.isstring >= IS_STRING_ES_OP0)
29b0f896 4848 {
51c8edf6 4849 gas_assert (i.mem_operands);
29b0f896 4850 if (!check_string ())
5dd0794d 4851 return;
fc0763e6 4852 i.disp_operands = 0;
29b0f896 4853 }
5dd0794d 4854
b6f8c7c4
L
4855 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
4856 optimize_encoding ();
4857
29b0f896
AM
4858 if (!process_suffix ())
4859 return;
e413e4e9 4860
921eafea 4861 /* Update operand types and check extended states. */
bc0844ae 4862 for (j = 0; j < i.operands; j++)
921eafea
L
4863 {
4864 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
3d70986f 4865 switch (i.tm.operand_types[j].bitfield.class)
921eafea
L
4866 {
4867 default:
4868 break;
4869 case RegMMX:
4870 i.xstate |= xstate_mmx;
4871 break;
4872 case RegMask:
32930e4e 4873 i.xstate |= xstate_mask;
921eafea
L
4874 break;
4875 case RegSIMD:
3d70986f 4876 if (i.tm.operand_types[j].bitfield.tmmword)
921eafea 4877 i.xstate |= xstate_tmm;
3d70986f 4878 else if (i.tm.operand_types[j].bitfield.zmmword)
921eafea 4879 i.xstate |= xstate_zmm;
3d70986f 4880 else if (i.tm.operand_types[j].bitfield.ymmword)
921eafea 4881 i.xstate |= xstate_ymm;
3d70986f 4882 else if (i.tm.operand_types[j].bitfield.xmmword)
921eafea
L
4883 i.xstate |= xstate_xmm;
4884 break;
4885 }
4886 }
bc0844ae 4887
29b0f896
AM
4888 /* Make still unresolved immediate matches conform to size of immediate
4889 given in i.suffix. */
4890 if (!finalize_imm ())
4891 return;
252b5132 4892
40fb9820 4893 if (i.types[0].bitfield.imm1)
29b0f896 4894 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 4895
9afe6eb8
L
4896 /* We only need to check those implicit registers for instructions
4897 with 3 operands or less. */
4898 if (i.operands <= 3)
4899 for (j = 0; j < i.operands; j++)
75e5731b
JB
4900 if (i.types[j].bitfield.instance != InstanceNone
4901 && !i.types[j].bitfield.xmmword)
9afe6eb8 4902 i.reg_operands--;
40fb9820 4903
29b0f896
AM
4904 /* For insns with operands there are more diddles to do to the opcode. */
4905 if (i.operands)
4906 {
4907 if (!process_operands ())
4908 return;
4909 }
8c190ce0 4910 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
4911 {
4912 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
4913 as_warn (_("translating to `%sp'"), i.tm.name);
4914 }
252b5132 4915
7a8655d2 4916 if (is_any_vex_encoding (&i.tm))
9e5e5283 4917 {
c1dc7af5 4918 if (!cpu_arch_flags.bitfield.cpui286)
9e5e5283 4919 {
c1dc7af5 4920 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
9e5e5283
L
4921 i.tm.name);
4922 return;
4923 }
c0f3af97 4924
0b9404fd
JB
4925 /* Check for explicit REX prefix. */
4926 if (i.prefix[REX_PREFIX] || i.rex_encoding)
4927 {
4928 as_bad (_("REX prefix invalid with `%s'"), i.tm.name);
4929 return;
4930 }
4931
9e5e5283
L
4932 if (i.tm.opcode_modifier.vex)
4933 build_vex_prefix (t);
4934 else
4935 build_evex_prefix ();
0b9404fd
JB
4936
4937 /* The individual REX.RXBW bits got consumed. */
4938 i.rex &= REX_OPCODE;
9e5e5283 4939 }
43234a1e 4940
5dd85c99
SP
4941 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
4942 instructions may define INT_OPCODE as well, so avoid this corner
4943 case for those instructions that use MODRM. */
389d00a5
JB
4944 if (i.tm.opcode_modifier.opcodespace == SPACE_BASE
4945 && i.tm.base_opcode == INT_OPCODE
a6461c02
SP
4946 && !i.tm.opcode_modifier.modrm
4947 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
4948 {
4949 i.tm.base_opcode = INT3_OPCODE;
4950 i.imm_operands = 0;
4951 }
252b5132 4952
0cfa3eb3
JB
4953 if ((i.tm.opcode_modifier.jump == JUMP
4954 || i.tm.opcode_modifier.jump == JUMP_BYTE
4955 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896
AM
4956 && i.op[0].disps->X_op == O_constant)
4957 {
4958 /* Convert "jmp constant" (and "call constant") to a jump (call) to
4959 the absolute address given by the constant. Since ix86 jumps and
4960 calls are pc relative, we need to generate a reloc. */
4961 i.op[0].disps->X_add_symbol = &abs_symbol;
4962 i.op[0].disps->X_op = O_symbol;
4963 }
252b5132 4964
29b0f896
AM
4965 /* For 8 bit registers we need an empty rex prefix. Also if the
4966 instruction already has a prefix, we need to convert old
4967 registers to new ones. */
773f551c 4968
bab6aec1 4969 if ((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte
29b0f896 4970 && (i.op[0].regs->reg_flags & RegRex64) != 0)
bab6aec1 4971 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte
29b0f896 4972 && (i.op[1].regs->reg_flags & RegRex64) != 0)
bab6aec1
JB
4973 || (((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte)
4974 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte))
29b0f896
AM
4975 && i.rex != 0))
4976 {
4977 int x;
726c5dcd 4978
29b0f896
AM
4979 i.rex |= REX_OPCODE;
4980 for (x = 0; x < 2; x++)
4981 {
4982 /* Look for 8 bit operand that uses old registers. */
bab6aec1 4983 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
29b0f896 4984 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 4985 {
3f93af61 4986 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
29b0f896
AM
4987 /* In case it is "hi" register, give up. */
4988 if (i.op[x].regs->reg_num > 3)
a540244d 4989 as_bad (_("can't encode register '%s%s' in an "
4eed87de 4990 "instruction requiring REX prefix."),
a540244d 4991 register_prefix, i.op[x].regs->reg_name);
773f551c 4992
29b0f896
AM
4993 /* Otherwise it is equivalent to the extended register.
4994 Since the encoding doesn't change this is merely
4995 cosmetic cleanup for debug output. */
4996
4997 i.op[x].regs = i.op[x].regs + 8;
773f551c 4998 }
29b0f896
AM
4999 }
5000 }
773f551c 5001
6b6b6807
L
5002 if (i.rex == 0 && i.rex_encoding)
5003 {
5004 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
3f93af61 5005 that uses legacy register. If it is "hi" register, don't add
6b6b6807
L
5006 the REX_OPCODE byte. */
5007 int x;
5008 for (x = 0; x < 2; x++)
bab6aec1 5009 if (i.types[x].bitfield.class == Reg
6b6b6807
L
5010 && i.types[x].bitfield.byte
5011 && (i.op[x].regs->reg_flags & RegRex64) == 0
5012 && i.op[x].regs->reg_num > 3)
5013 {
3f93af61 5014 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
5b7c81bd 5015 i.rex_encoding = false;
6b6b6807
L
5016 break;
5017 }
5018
5019 if (i.rex_encoding)
5020 i.rex = REX_OPCODE;
5021 }
5022
7ab9ffdd 5023 if (i.rex != 0)
29b0f896
AM
5024 add_prefix (REX_OPCODE | i.rex);
5025
ae531041
L
5026 insert_lfence_before ();
5027
29b0f896
AM
5028 /* We are ready to output the insn. */
5029 output_insn ();
e379e5f3 5030
ae531041
L
5031 insert_lfence_after ();
5032
e379e5f3
L
5033 last_insn.seg = now_seg;
5034
5035 if (i.tm.opcode_modifier.isprefix)
5036 {
5037 last_insn.kind = last_insn_prefix;
5038 last_insn.name = i.tm.name;
5039 last_insn.file = as_where (&last_insn.line);
5040 }
5041 else
5042 last_insn.kind = last_insn_other;
29b0f896
AM
5043}
5044
5045static char *
e3bb37b5 5046parse_insn (char *line, char *mnemonic)
29b0f896
AM
5047{
5048 char *l = line;
5049 char *token_start = l;
5050 char *mnem_p;
5c6af06e 5051 int supported;
d3ce72d0 5052 const insn_template *t;
b6169b20 5053 char *dot_p = NULL;
29b0f896 5054
29b0f896
AM
5055 while (1)
5056 {
5057 mnem_p = mnemonic;
5058 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
5059 {
b6169b20
L
5060 if (*mnem_p == '.')
5061 dot_p = mnem_p;
29b0f896
AM
5062 mnem_p++;
5063 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 5064 {
29b0f896
AM
5065 as_bad (_("no such instruction: `%s'"), token_start);
5066 return NULL;
5067 }
5068 l++;
5069 }
5070 if (!is_space_char (*l)
5071 && *l != END_OF_INSN
e44823cf
JB
5072 && (intel_syntax
5073 || (*l != PREFIX_SEPARATOR
5074 && *l != ',')))
29b0f896
AM
5075 {
5076 as_bad (_("invalid character %s in mnemonic"),
5077 output_invalid (*l));
5078 return NULL;
5079 }
5080 if (token_start == l)
5081 {
e44823cf 5082 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
5083 as_bad (_("expecting prefix; got nothing"));
5084 else
5085 as_bad (_("expecting mnemonic; got nothing"));
5086 return NULL;
5087 }
45288df1 5088
29b0f896 5089 /* Look up instruction (or prefix) via hash table. */
629310ab 5090 current_templates = (const templates *) str_hash_find (op_hash, mnemonic);
47926f60 5091
29b0f896
AM
5092 if (*l != END_OF_INSN
5093 && (!is_space_char (*l) || l[1] != END_OF_INSN)
5094 && current_templates
40fb9820 5095 && current_templates->start->opcode_modifier.isprefix)
29b0f896 5096 {
c6fb90c8 5097 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
5098 {
5099 as_bad ((flag_code != CODE_64BIT
5100 ? _("`%s' is only supported in 64-bit mode")
5101 : _("`%s' is not supported in 64-bit mode")),
5102 current_templates->start->name);
5103 return NULL;
5104 }
29b0f896
AM
5105 /* If we are in 16-bit mode, do not allow addr16 or data16.
5106 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
5107 if ((current_templates->start->opcode_modifier.size == SIZE16
5108 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 5109 && flag_code != CODE_64BIT
673fe0f0 5110 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
5111 ^ (flag_code == CODE_16BIT)))
5112 {
5113 as_bad (_("redundant %s prefix"),
5114 current_templates->start->name);
5115 return NULL;
45288df1 5116 }
31184569
JB
5117
5118 if (current_templates->start->base_opcode == PSEUDO_PREFIX)
29b0f896 5119 {
86fa6981 5120 /* Handle pseudo prefixes. */
31184569 5121 switch (current_templates->start->extension_opcode)
86fa6981 5122 {
41eb8e88 5123 case Prefix_Disp8:
86fa6981
L
5124 /* {disp8} */
5125 i.disp_encoding = disp_encoding_8bit;
5126 break;
41eb8e88
L
5127 case Prefix_Disp16:
5128 /* {disp16} */
5129 i.disp_encoding = disp_encoding_16bit;
5130 break;
5131 case Prefix_Disp32:
86fa6981
L
5132 /* {disp32} */
5133 i.disp_encoding = disp_encoding_32bit;
5134 break;
41eb8e88 5135 case Prefix_Load:
86fa6981
L
5136 /* {load} */
5137 i.dir_encoding = dir_encoding_load;
5138 break;
41eb8e88 5139 case Prefix_Store:
86fa6981
L
5140 /* {store} */
5141 i.dir_encoding = dir_encoding_store;
5142 break;
41eb8e88 5143 case Prefix_VEX:
42e04b36
L
5144 /* {vex} */
5145 i.vec_encoding = vex_encoding_vex;
86fa6981 5146 break;
41eb8e88 5147 case Prefix_VEX3:
86fa6981
L
5148 /* {vex3} */
5149 i.vec_encoding = vex_encoding_vex3;
5150 break;
41eb8e88 5151 case Prefix_EVEX:
86fa6981
L
5152 /* {evex} */
5153 i.vec_encoding = vex_encoding_evex;
5154 break;
41eb8e88 5155 case Prefix_REX:
6b6b6807 5156 /* {rex} */
5b7c81bd 5157 i.rex_encoding = true;
6b6b6807 5158 break;
41eb8e88 5159 case Prefix_NoOptimize:
b6f8c7c4 5160 /* {nooptimize} */
5b7c81bd 5161 i.no_optimize = true;
b6f8c7c4 5162 break;
86fa6981
L
5163 default:
5164 abort ();
5165 }
5166 }
5167 else
5168 {
5169 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 5170 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 5171 {
4e9ac44a
L
5172 case PREFIX_EXIST:
5173 return NULL;
5174 case PREFIX_DS:
d777820b 5175 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
5176 i.notrack_prefix = current_templates->start->name;
5177 break;
5178 case PREFIX_REP:
5179 if (current_templates->start->cpu_flags.bitfield.cpuhle)
5180 i.hle_prefix = current_templates->start->name;
5181 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
5182 i.bnd_prefix = current_templates->start->name;
5183 else
5184 i.rep_prefix = current_templates->start->name;
5185 break;
5186 default:
5187 break;
86fa6981 5188 }
29b0f896
AM
5189 }
5190 /* Skip past PREFIX_SEPARATOR and reset token_start. */
5191 token_start = ++l;
5192 }
5193 else
5194 break;
5195 }
45288df1 5196
30a55f88 5197 if (!current_templates)
b6169b20 5198 {
07d5e953
JB
5199 /* Deprecated functionality (new code should use pseudo-prefixes instead):
5200 Check if we should swap operand or force 32bit displacement in
f8a5c266 5201 encoding. */
30a55f88 5202 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 5203 i.dir_encoding = dir_encoding_swap;
8d63c93e 5204 else if (mnem_p - 3 == dot_p
a501d77e
L
5205 && dot_p[1] == 'd'
5206 && dot_p[2] == '8')
5207 i.disp_encoding = disp_encoding_8bit;
8d63c93e 5208 else if (mnem_p - 4 == dot_p
f8a5c266
L
5209 && dot_p[1] == 'd'
5210 && dot_p[2] == '3'
5211 && dot_p[3] == '2')
a501d77e 5212 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
5213 else
5214 goto check_suffix;
5215 mnem_p = dot_p;
5216 *dot_p = '\0';
629310ab 5217 current_templates = (const templates *) str_hash_find (op_hash, mnemonic);
b6169b20
L
5218 }
5219
29b0f896
AM
5220 if (!current_templates)
5221 {
dc1e8a47 5222 check_suffix:
1c529385 5223 if (mnem_p > mnemonic)
29b0f896 5224 {
1c529385
LH
5225 /* See if we can get a match by trimming off a suffix. */
5226 switch (mnem_p[-1])
29b0f896 5227 {
1c529385
LH
5228 case WORD_MNEM_SUFFIX:
5229 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
5230 i.suffix = SHORT_MNEM_SUFFIX;
5231 else
1c529385
LH
5232 /* Fall through. */
5233 case BYTE_MNEM_SUFFIX:
5234 case QWORD_MNEM_SUFFIX:
5235 i.suffix = mnem_p[-1];
29b0f896 5236 mnem_p[-1] = '\0';
fe0e921f
AM
5237 current_templates
5238 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5239 break;
5240 case SHORT_MNEM_SUFFIX:
5241 case LONG_MNEM_SUFFIX:
5242 if (!intel_syntax)
5243 {
5244 i.suffix = mnem_p[-1];
5245 mnem_p[-1] = '\0';
fe0e921f
AM
5246 current_templates
5247 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5248 }
5249 break;
5250
5251 /* Intel Syntax. */
5252 case 'd':
5253 if (intel_syntax)
5254 {
5255 if (intel_float_operand (mnemonic) == 1)
5256 i.suffix = SHORT_MNEM_SUFFIX;
5257 else
5258 i.suffix = LONG_MNEM_SUFFIX;
5259 mnem_p[-1] = '\0';
fe0e921f
AM
5260 current_templates
5261 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5262 }
5263 break;
29b0f896 5264 }
29b0f896 5265 }
1c529385 5266
29b0f896
AM
5267 if (!current_templates)
5268 {
5269 as_bad (_("no such instruction: `%s'"), token_start);
5270 return NULL;
5271 }
5272 }
252b5132 5273
0cfa3eb3
JB
5274 if (current_templates->start->opcode_modifier.jump == JUMP
5275 || current_templates->start->opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
5276 {
5277 /* Check for a branch hint. We allow ",pt" and ",pn" for
5278 predict taken and predict not taken respectively.
5279 I'm not sure that branch hints actually do anything on loop
5280 and jcxz insns (JumpByte) for current Pentium4 chips. They
5281 may work in the future and it doesn't hurt to accept them
5282 now. */
5283 if (l[0] == ',' && l[1] == 'p')
5284 {
5285 if (l[2] == 't')
5286 {
5287 if (!add_prefix (DS_PREFIX_OPCODE))
5288 return NULL;
5289 l += 3;
5290 }
5291 else if (l[2] == 'n')
5292 {
5293 if (!add_prefix (CS_PREFIX_OPCODE))
5294 return NULL;
5295 l += 3;
5296 }
5297 }
5298 }
5299 /* Any other comma loses. */
5300 if (*l == ',')
5301 {
5302 as_bad (_("invalid character %s in mnemonic"),
5303 output_invalid (*l));
5304 return NULL;
5305 }
252b5132 5306
29b0f896 5307 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
5308 supported = 0;
5309 for (t = current_templates->start; t < current_templates->end; ++t)
5310 {
c0f3af97
L
5311 supported |= cpu_flags_match (t);
5312 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
5313 {
5314 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
5315 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 5316
548d0ee6
JB
5317 return l;
5318 }
29b0f896 5319 }
3629bb00 5320
548d0ee6
JB
5321 if (!(supported & CPU_FLAGS_64BIT_MATCH))
5322 as_bad (flag_code == CODE_64BIT
5323 ? _("`%s' is not supported in 64-bit mode")
5324 : _("`%s' is only supported in 64-bit mode"),
5325 current_templates->start->name);
5326 else
5327 as_bad (_("`%s' is not supported on `%s%s'"),
5328 current_templates->start->name,
5329 cpu_arch_name ? cpu_arch_name : default_arch,
5330 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 5331
548d0ee6 5332 return NULL;
29b0f896 5333}
252b5132 5334
29b0f896 5335static char *
e3bb37b5 5336parse_operands (char *l, const char *mnemonic)
29b0f896
AM
5337{
5338 char *token_start;
3138f287 5339
29b0f896
AM
5340 /* 1 if operand is pending after ','. */
5341 unsigned int expecting_operand = 0;
252b5132 5342
29b0f896
AM
5343 /* Non-zero if operand parens not balanced. */
5344 unsigned int paren_not_balanced;
5345
5346 while (*l != END_OF_INSN)
5347 {
5348 /* Skip optional white space before operand. */
5349 if (is_space_char (*l))
5350 ++l;
d02603dc 5351 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
5352 {
5353 as_bad (_("invalid character %s before operand %d"),
5354 output_invalid (*l),
5355 i.operands + 1);
5356 return NULL;
5357 }
d02603dc 5358 token_start = l; /* After white space. */
29b0f896
AM
5359 paren_not_balanced = 0;
5360 while (paren_not_balanced || *l != ',')
5361 {
5362 if (*l == END_OF_INSN)
5363 {
5364 if (paren_not_balanced)
5365 {
5366 if (!intel_syntax)
5367 as_bad (_("unbalanced parenthesis in operand %d."),
5368 i.operands + 1);
5369 else
5370 as_bad (_("unbalanced brackets in operand %d."),
5371 i.operands + 1);
5372 return NULL;
5373 }
5374 else
5375 break; /* we are done */
5376 }
d02603dc 5377 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
5378 {
5379 as_bad (_("invalid character %s in operand %d"),
5380 output_invalid (*l),
5381 i.operands + 1);
5382 return NULL;
5383 }
5384 if (!intel_syntax)
5385 {
5386 if (*l == '(')
5387 ++paren_not_balanced;
5388 if (*l == ')')
5389 --paren_not_balanced;
5390 }
5391 else
5392 {
5393 if (*l == '[')
5394 ++paren_not_balanced;
5395 if (*l == ']')
5396 --paren_not_balanced;
5397 }
5398 l++;
5399 }
5400 if (l != token_start)
5401 { /* Yes, we've read in another operand. */
5402 unsigned int operand_ok;
5403 this_operand = i.operands++;
5404 if (i.operands > MAX_OPERANDS)
5405 {
5406 as_bad (_("spurious operands; (%d operands/instruction max)"),
5407 MAX_OPERANDS);
5408 return NULL;
5409 }
9d46ce34 5410 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
5411 /* Now parse operand adding info to 'i' as we go along. */
5412 END_STRING_AND_SAVE (l);
5413
1286ab78
L
5414 if (i.mem_operands > 1)
5415 {
5416 as_bad (_("too many memory references for `%s'"),
5417 mnemonic);
5418 return 0;
5419 }
5420
29b0f896
AM
5421 if (intel_syntax)
5422 operand_ok =
5423 i386_intel_operand (token_start,
5424 intel_float_operand (mnemonic));
5425 else
a7619375 5426 operand_ok = i386_att_operand (token_start);
29b0f896
AM
5427
5428 RESTORE_END_STRING (l);
5429 if (!operand_ok)
5430 return NULL;
5431 }
5432 else
5433 {
5434 if (expecting_operand)
5435 {
5436 expecting_operand_after_comma:
5437 as_bad (_("expecting operand after ','; got nothing"));
5438 return NULL;
5439 }
5440 if (*l == ',')
5441 {
5442 as_bad (_("expecting operand before ','; got nothing"));
5443 return NULL;
5444 }
5445 }
7f3f1ea2 5446
29b0f896
AM
5447 /* Now *l must be either ',' or END_OF_INSN. */
5448 if (*l == ',')
5449 {
5450 if (*++l == END_OF_INSN)
5451 {
5452 /* Just skip it, if it's \n complain. */
5453 goto expecting_operand_after_comma;
5454 }
5455 expecting_operand = 1;
5456 }
5457 }
5458 return l;
5459}
7f3f1ea2 5460
050dfa73 5461static void
783c187b 5462swap_2_operands (unsigned int xchg1, unsigned int xchg2)
050dfa73
MM
5463{
5464 union i386_op temp_op;
40fb9820 5465 i386_operand_type temp_type;
c48dadc9 5466 unsigned int temp_flags;
050dfa73 5467 enum bfd_reloc_code_real temp_reloc;
4eed87de 5468
050dfa73
MM
5469 temp_type = i.types[xchg2];
5470 i.types[xchg2] = i.types[xchg1];
5471 i.types[xchg1] = temp_type;
c48dadc9
JB
5472
5473 temp_flags = i.flags[xchg2];
5474 i.flags[xchg2] = i.flags[xchg1];
5475 i.flags[xchg1] = temp_flags;
5476
050dfa73
MM
5477 temp_op = i.op[xchg2];
5478 i.op[xchg2] = i.op[xchg1];
5479 i.op[xchg1] = temp_op;
c48dadc9 5480
050dfa73
MM
5481 temp_reloc = i.reloc[xchg2];
5482 i.reloc[xchg2] = i.reloc[xchg1];
5483 i.reloc[xchg1] = temp_reloc;
43234a1e 5484
6225c532 5485 if (i.mask.reg)
43234a1e 5486 {
6225c532
JB
5487 if (i.mask.operand == xchg1)
5488 i.mask.operand = xchg2;
5489 else if (i.mask.operand == xchg2)
5490 i.mask.operand = xchg1;
43234a1e 5491 }
5273a3cd 5492 if (i.broadcast.type)
43234a1e 5493 {
5273a3cd
JB
5494 if (i.broadcast.operand == xchg1)
5495 i.broadcast.operand = xchg2;
5496 else if (i.broadcast.operand == xchg2)
5497 i.broadcast.operand = xchg1;
43234a1e 5498 }
ca5312a2 5499 if (i.rounding.type != rc_none)
43234a1e 5500 {
ca5312a2
JB
5501 if (i.rounding.operand == xchg1)
5502 i.rounding.operand = xchg2;
5503 else if (i.rounding.operand == xchg2)
5504 i.rounding.operand = xchg1;
43234a1e 5505 }
050dfa73
MM
5506}
5507
29b0f896 5508static void
e3bb37b5 5509swap_operands (void)
29b0f896 5510{
b7c61d9a 5511 switch (i.operands)
050dfa73 5512 {
c0f3af97 5513 case 5:
b7c61d9a 5514 case 4:
4d456e3d 5515 swap_2_operands (1, i.operands - 2);
1a0670f3 5516 /* Fall through. */
b7c61d9a
L
5517 case 3:
5518 case 2:
4d456e3d 5519 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
5520 break;
5521 default:
5522 abort ();
29b0f896 5523 }
29b0f896
AM
5524
5525 if (i.mem_operands == 2)
5526 {
5e042380 5527 const reg_entry *temp_seg;
29b0f896
AM
5528 temp_seg = i.seg[0];
5529 i.seg[0] = i.seg[1];
5530 i.seg[1] = temp_seg;
5531 }
5532}
252b5132 5533
29b0f896
AM
5534/* Try to ensure constant immediates are represented in the smallest
5535 opcode possible. */
5536static void
e3bb37b5 5537optimize_imm (void)
29b0f896
AM
5538{
5539 char guess_suffix = 0;
5540 int op;
252b5132 5541
29b0f896
AM
5542 if (i.suffix)
5543 guess_suffix = i.suffix;
5544 else if (i.reg_operands)
5545 {
5546 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
5547 We can't do this properly yet, i.e. excluding special register
5548 instances, but the following works for instructions with
5549 immediates. In any case, we can't set i.suffix yet. */
29b0f896 5550 for (op = i.operands; --op >= 0;)
bab6aec1
JB
5551 if (i.types[op].bitfield.class != Reg)
5552 continue;
5553 else if (i.types[op].bitfield.byte)
7ab9ffdd 5554 {
40fb9820
L
5555 guess_suffix = BYTE_MNEM_SUFFIX;
5556 break;
5557 }
bab6aec1 5558 else if (i.types[op].bitfield.word)
252b5132 5559 {
40fb9820
L
5560 guess_suffix = WORD_MNEM_SUFFIX;
5561 break;
5562 }
bab6aec1 5563 else if (i.types[op].bitfield.dword)
40fb9820
L
5564 {
5565 guess_suffix = LONG_MNEM_SUFFIX;
5566 break;
5567 }
bab6aec1 5568 else if (i.types[op].bitfield.qword)
40fb9820
L
5569 {
5570 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5571 break;
252b5132 5572 }
29b0f896
AM
5573 }
5574 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5575 guess_suffix = WORD_MNEM_SUFFIX;
5576
5577 for (op = i.operands; --op >= 0;)
40fb9820 5578 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5579 {
5580 switch (i.op[op].imms->X_op)
252b5132 5581 {
29b0f896
AM
5582 case O_constant:
5583 /* If a suffix is given, this operand may be shortened. */
5584 switch (guess_suffix)
252b5132 5585 {
29b0f896 5586 case LONG_MNEM_SUFFIX:
40fb9820
L
5587 i.types[op].bitfield.imm32 = 1;
5588 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5589 break;
5590 case WORD_MNEM_SUFFIX:
40fb9820
L
5591 i.types[op].bitfield.imm16 = 1;
5592 i.types[op].bitfield.imm32 = 1;
5593 i.types[op].bitfield.imm32s = 1;
5594 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5595 break;
5596 case BYTE_MNEM_SUFFIX:
40fb9820
L
5597 i.types[op].bitfield.imm8 = 1;
5598 i.types[op].bitfield.imm8s = 1;
5599 i.types[op].bitfield.imm16 = 1;
5600 i.types[op].bitfield.imm32 = 1;
5601 i.types[op].bitfield.imm32s = 1;
5602 i.types[op].bitfield.imm64 = 1;
29b0f896 5603 break;
252b5132 5604 }
252b5132 5605
29b0f896
AM
5606 /* If this operand is at most 16 bits, convert it
5607 to a signed 16 bit number before trying to see
5608 whether it will fit in an even smaller size.
5609 This allows a 16-bit operand such as $0xffe0 to
5610 be recognised as within Imm8S range. */
40fb9820 5611 if ((i.types[op].bitfield.imm16)
29b0f896 5612 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5613 {
29b0f896
AM
5614 i.op[op].imms->X_add_number =
5615 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
5616 }
a28def75
L
5617#ifdef BFD64
5618 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5619 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5620 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5621 == 0))
5622 {
5623 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5624 ^ ((offsetT) 1 << 31))
5625 - ((offsetT) 1 << 31));
5626 }
a28def75 5627#endif
40fb9820 5628 i.types[op]
c6fb90c8
L
5629 = operand_type_or (i.types[op],
5630 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5631
29b0f896
AM
5632 /* We must avoid matching of Imm32 templates when 64bit
5633 only immediate is available. */
5634 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5635 i.types[op].bitfield.imm32 = 0;
29b0f896 5636 break;
252b5132 5637
29b0f896
AM
5638 case O_absent:
5639 case O_register:
5640 abort ();
5641
5642 /* Symbols and expressions. */
5643 default:
9cd96992
JB
5644 /* Convert symbolic operand to proper sizes for matching, but don't
5645 prevent matching a set of insns that only supports sizes other
5646 than those matching the insn suffix. */
5647 {
40fb9820 5648 i386_operand_type mask, allowed;
d3ce72d0 5649 const insn_template *t;
9cd96992 5650
0dfbf9d7
L
5651 operand_type_set (&mask, 0);
5652 operand_type_set (&allowed, 0);
40fb9820 5653
4eed87de
AM
5654 for (t = current_templates->start;
5655 t < current_templates->end;
5656 ++t)
bab6aec1
JB
5657 {
5658 allowed = operand_type_or (allowed, t->operand_types[op]);
5659 allowed = operand_type_and (allowed, anyimm);
5660 }
9cd96992
JB
5661 switch (guess_suffix)
5662 {
5663 case QWORD_MNEM_SUFFIX:
40fb9820
L
5664 mask.bitfield.imm64 = 1;
5665 mask.bitfield.imm32s = 1;
9cd96992
JB
5666 break;
5667 case LONG_MNEM_SUFFIX:
40fb9820 5668 mask.bitfield.imm32 = 1;
9cd96992
JB
5669 break;
5670 case WORD_MNEM_SUFFIX:
40fb9820 5671 mask.bitfield.imm16 = 1;
9cd96992
JB
5672 break;
5673 case BYTE_MNEM_SUFFIX:
40fb9820 5674 mask.bitfield.imm8 = 1;
9cd96992
JB
5675 break;
5676 default:
9cd96992
JB
5677 break;
5678 }
c6fb90c8 5679 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5680 if (!operand_type_all_zero (&allowed))
c6fb90c8 5681 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5682 }
29b0f896 5683 break;
252b5132 5684 }
29b0f896
AM
5685 }
5686}
47926f60 5687
29b0f896
AM
5688/* Try to use the smallest displacement type too. */
5689static void
e3bb37b5 5690optimize_disp (void)
29b0f896
AM
5691{
5692 int op;
3e73aa7c 5693
29b0f896 5694 for (op = i.operands; --op >= 0;)
40fb9820 5695 if (operand_type_check (i.types[op], disp))
252b5132 5696 {
b300c311 5697 if (i.op[op].disps->X_op == O_constant)
252b5132 5698 {
91d6fa6a 5699 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5700
40fb9820 5701 if (i.types[op].bitfield.disp16
91d6fa6a 5702 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
5703 {
5704 /* If this operand is at most 16 bits, convert
5705 to a signed 16 bit number and don't use 64bit
5706 displacement. */
91d6fa6a 5707 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 5708 i.types[op].bitfield.disp64 = 0;
b300c311 5709 }
a28def75
L
5710#ifdef BFD64
5711 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
40fb9820 5712 if (i.types[op].bitfield.disp32
91d6fa6a 5713 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
b300c311
L
5714 {
5715 /* If this operand is at most 32 bits, convert
5716 to a signed 32 bit number and don't use 64bit
5717 displacement. */
91d6fa6a
NC
5718 op_disp &= (((offsetT) 2 << 31) - 1);
5719 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 5720 i.types[op].bitfield.disp64 = 0;
b300c311 5721 }
a28def75 5722#endif
91d6fa6a 5723 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5724 {
40fb9820
L
5725 i.types[op].bitfield.disp8 = 0;
5726 i.types[op].bitfield.disp16 = 0;
5727 i.types[op].bitfield.disp32 = 0;
5728 i.types[op].bitfield.disp32s = 0;
5729 i.types[op].bitfield.disp64 = 0;
b300c311
L
5730 i.op[op].disps = 0;
5731 i.disp_operands--;
5732 }
5733 else if (flag_code == CODE_64BIT)
5734 {
91d6fa6a 5735 if (fits_in_signed_long (op_disp))
28a9d8f5 5736 {
40fb9820
L
5737 i.types[op].bitfield.disp64 = 0;
5738 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5739 }
0e1147d9 5740 if (i.prefix[ADDR_PREFIX]
91d6fa6a 5741 && fits_in_unsigned_long (op_disp))
40fb9820 5742 i.types[op].bitfield.disp32 = 1;
b300c311 5743 }
40fb9820
L
5744 if ((i.types[op].bitfield.disp32
5745 || i.types[op].bitfield.disp32s
5746 || i.types[op].bitfield.disp16)
b5014f7a 5747 && fits_in_disp8 (op_disp))
40fb9820 5748 i.types[op].bitfield.disp8 = 1;
252b5132 5749 }
67a4f2b7
AO
5750 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5751 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5752 {
5753 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5754 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
5755 i.types[op].bitfield.disp8 = 0;
5756 i.types[op].bitfield.disp16 = 0;
5757 i.types[op].bitfield.disp32 = 0;
5758 i.types[op].bitfield.disp32s = 0;
5759 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
5760 }
5761 else
b300c311 5762 /* We only support 64bit displacement on constants. */
40fb9820 5763 i.types[op].bitfield.disp64 = 0;
252b5132 5764 }
29b0f896
AM
5765}
5766
4a1b91ea
L
5767/* Return 1 if there is a match in broadcast bytes between operand
5768 GIVEN and instruction template T. */
5769
5770static INLINE int
5771match_broadcast_size (const insn_template *t, unsigned int given)
5772{
5773 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5774 && i.types[given].bitfield.byte)
5775 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5776 && i.types[given].bitfield.word)
5777 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5778 && i.types[given].bitfield.dword)
5779 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5780 && i.types[given].bitfield.qword));
5781}
5782
6c30d220
L
5783/* Check if operands are valid for the instruction. */
5784
5785static int
5786check_VecOperands (const insn_template *t)
5787{
43234a1e 5788 unsigned int op;
e2195274 5789 i386_cpu_flags cpu;
e2195274
JB
5790
5791 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5792 any one operand are implicity requiring AVX512VL support if the actual
5793 operand size is YMMword or XMMword. Since this function runs after
5794 template matching, there's no need to check for YMMword/XMMword in
5795 the template. */
5796 cpu = cpu_flags_and (t->cpu_flags, avx512);
5797 if (!cpu_flags_all_zero (&cpu)
5798 && !t->cpu_flags.bitfield.cpuavx512vl
5799 && !cpu_arch_flags.bitfield.cpuavx512vl)
5800 {
5801 for (op = 0; op < t->operands; ++op)
5802 {
5803 if (t->operand_types[op].bitfield.zmmword
5804 && (i.types[op].bitfield.ymmword
5805 || i.types[op].bitfield.xmmword))
5806 {
5807 i.error = unsupported;
5808 return 1;
5809 }
5810 }
5811 }
43234a1e 5812
6c30d220 5813 /* Without VSIB byte, we can't have a vector register for index. */
63112cd6 5814 if (!t->opcode_modifier.sib
6c30d220 5815 && i.index_reg
1b54b8d7
JB
5816 && (i.index_reg->reg_type.bitfield.xmmword
5817 || i.index_reg->reg_type.bitfield.ymmword
5818 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
5819 {
5820 i.error = unsupported_vector_index_register;
5821 return 1;
5822 }
5823
ad8ecc81
MZ
5824 /* Check if default mask is allowed. */
5825 if (t->opcode_modifier.nodefmask
6225c532 5826 && (!i.mask.reg || i.mask.reg->reg_num == 0))
ad8ecc81
MZ
5827 {
5828 i.error = no_default_mask;
5829 return 1;
5830 }
5831
7bab8ab5
JB
5832 /* For VSIB byte, we need a vector register for index, and all vector
5833 registers must be distinct. */
260cd341 5834 if (t->opcode_modifier.sib && t->opcode_modifier.sib != SIBMEM)
7bab8ab5
JB
5835 {
5836 if (!i.index_reg
63112cd6 5837 || !((t->opcode_modifier.sib == VECSIB128
1b54b8d7 5838 && i.index_reg->reg_type.bitfield.xmmword)
63112cd6 5839 || (t->opcode_modifier.sib == VECSIB256
1b54b8d7 5840 && i.index_reg->reg_type.bitfield.ymmword)
63112cd6 5841 || (t->opcode_modifier.sib == VECSIB512
1b54b8d7 5842 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
5843 {
5844 i.error = invalid_vsib_address;
5845 return 1;
5846 }
5847
6225c532
JB
5848 gas_assert (i.reg_operands == 2 || i.mask.reg);
5849 if (i.reg_operands == 2 && !i.mask.reg)
43234a1e 5850 {
3528c362 5851 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
5852 gas_assert (i.types[0].bitfield.xmmword
5853 || i.types[0].bitfield.ymmword);
3528c362 5854 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
5855 gas_assert (i.types[2].bitfield.xmmword
5856 || i.types[2].bitfield.ymmword);
43234a1e
L
5857 if (operand_check == check_none)
5858 return 0;
5859 if (register_number (i.op[0].regs)
5860 != register_number (i.index_reg)
5861 && register_number (i.op[2].regs)
5862 != register_number (i.index_reg)
5863 && register_number (i.op[0].regs)
5864 != register_number (i.op[2].regs))
5865 return 0;
5866 if (operand_check == check_error)
5867 {
5868 i.error = invalid_vector_register_set;
5869 return 1;
5870 }
5871 as_warn (_("mask, index, and destination registers should be distinct"));
5872 }
6225c532 5873 else if (i.reg_operands == 1 && i.mask.reg)
8444f82a 5874 {
3528c362 5875 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
5876 && (i.types[1].bitfield.xmmword
5877 || i.types[1].bitfield.ymmword
5878 || i.types[1].bitfield.zmmword)
8444f82a
MZ
5879 && (register_number (i.op[1].regs)
5880 == register_number (i.index_reg)))
5881 {
5882 if (operand_check == check_error)
5883 {
5884 i.error = invalid_vector_register_set;
5885 return 1;
5886 }
5887 if (operand_check != check_none)
5888 as_warn (_("index and destination registers should be distinct"));
5889 }
5890 }
43234a1e 5891 }
7bab8ab5 5892
260cd341
LC
5893 /* For AMX instructions with three tmmword operands, all tmmword operand must be
5894 distinct */
5895 if (t->operand_types[0].bitfield.tmmword
5896 && i.reg_operands == 3)
5897 {
5898 if (register_number (i.op[0].regs)
5899 == register_number (i.op[1].regs)
5900 || register_number (i.op[0].regs)
5901 == register_number (i.op[2].regs)
5902 || register_number (i.op[1].regs)
5903 == register_number (i.op[2].regs))
5904 {
5905 i.error = invalid_tmm_register_set;
5906 return 1;
5907 }
5908 }
5909
43234a1e
L
5910 /* Check if broadcast is supported by the instruction and is applied
5911 to the memory operand. */
5273a3cd 5912 if (i.broadcast.type)
43234a1e 5913 {
8e6e0792 5914 i386_operand_type type, overlap;
43234a1e
L
5915
5916 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 5917 and its broadcast bytes match the memory operand. */
5273a3cd 5918 op = i.broadcast.operand;
8e6e0792 5919 if (!t->opcode_modifier.broadcast
c48dadc9 5920 || !(i.flags[op] & Operand_Mem)
c39e5b26 5921 || (!i.types[op].bitfield.unspecified
4a1b91ea 5922 && !match_broadcast_size (t, op)))
43234a1e
L
5923 {
5924 bad_broadcast:
5925 i.error = unsupported_broadcast;
5926 return 1;
5927 }
8e6e0792 5928
5273a3cd
JB
5929 i.broadcast.bytes = ((1 << (t->opcode_modifier.broadcast - 1))
5930 * i.broadcast.type);
8e6e0792 5931 operand_type_set (&type, 0);
5273a3cd 5932 switch (i.broadcast.bytes)
8e6e0792 5933 {
4a1b91ea
L
5934 case 2:
5935 type.bitfield.word = 1;
5936 break;
5937 case 4:
5938 type.bitfield.dword = 1;
5939 break;
8e6e0792
JB
5940 case 8:
5941 type.bitfield.qword = 1;
5942 break;
5943 case 16:
5944 type.bitfield.xmmword = 1;
5945 break;
5946 case 32:
5947 type.bitfield.ymmword = 1;
5948 break;
5949 case 64:
5950 type.bitfield.zmmword = 1;
5951 break;
5952 default:
5953 goto bad_broadcast;
5954 }
5955
5956 overlap = operand_type_and (type, t->operand_types[op]);
bc49bfd8
JB
5957 if (t->operand_types[op].bitfield.class == RegSIMD
5958 && t->operand_types[op].bitfield.byte
5959 + t->operand_types[op].bitfield.word
5960 + t->operand_types[op].bitfield.dword
5961 + t->operand_types[op].bitfield.qword > 1)
5962 {
5963 overlap.bitfield.xmmword = 0;
5964 overlap.bitfield.ymmword = 0;
5965 overlap.bitfield.zmmword = 0;
5966 }
8e6e0792
JB
5967 if (operand_type_all_zero (&overlap))
5968 goto bad_broadcast;
5969
5970 if (t->opcode_modifier.checkregsize)
5971 {
5972 unsigned int j;
5973
e2195274 5974 type.bitfield.baseindex = 1;
8e6e0792
JB
5975 for (j = 0; j < i.operands; ++j)
5976 {
5977 if (j != op
5978 && !operand_type_register_match(i.types[j],
5979 t->operand_types[j],
5980 type,
5981 t->operand_types[op]))
5982 goto bad_broadcast;
5983 }
5984 }
43234a1e
L
5985 }
5986 /* If broadcast is supported in this instruction, we need to check if
5987 operand of one-element size isn't specified without broadcast. */
5988 else if (t->opcode_modifier.broadcast && i.mem_operands)
5989 {
5990 /* Find memory operand. */
5991 for (op = 0; op < i.operands; op++)
8dc0818e 5992 if (i.flags[op] & Operand_Mem)
43234a1e
L
5993 break;
5994 gas_assert (op < i.operands);
5995 /* Check size of the memory operand. */
4a1b91ea 5996 if (match_broadcast_size (t, op))
43234a1e
L
5997 {
5998 i.error = broadcast_needed;
5999 return 1;
6000 }
6001 }
c39e5b26
JB
6002 else
6003 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
6004
6005 /* Check if requested masking is supported. */
6225c532 6006 if (i.mask.reg)
43234a1e 6007 {
ae2387fe
JB
6008 switch (t->opcode_modifier.masking)
6009 {
6010 case BOTH_MASKING:
6011 break;
6012 case MERGING_MASKING:
6225c532 6013 if (i.mask.zeroing)
ae2387fe
JB
6014 {
6015 case 0:
6016 i.error = unsupported_masking;
6017 return 1;
6018 }
6019 break;
6020 case DYNAMIC_MASKING:
6021 /* Memory destinations allow only merging masking. */
6225c532 6022 if (i.mask.zeroing && i.mem_operands)
ae2387fe
JB
6023 {
6024 /* Find memory operand. */
6025 for (op = 0; op < i.operands; op++)
c48dadc9 6026 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
6027 break;
6028 gas_assert (op < i.operands);
6029 if (op == i.operands - 1)
6030 {
6031 i.error = unsupported_masking;
6032 return 1;
6033 }
6034 }
6035 break;
6036 default:
6037 abort ();
6038 }
43234a1e
L
6039 }
6040
6041 /* Check if masking is applied to dest operand. */
6225c532 6042 if (i.mask.reg && (i.mask.operand != i.operands - 1))
43234a1e
L
6043 {
6044 i.error = mask_not_on_destination;
6045 return 1;
6046 }
6047
43234a1e 6048 /* Check RC/SAE. */
ca5312a2 6049 if (i.rounding.type != rc_none)
43234a1e 6050 {
a80195f1 6051 if (!t->opcode_modifier.sae
ca5312a2 6052 || (i.rounding.type != saeonly && !t->opcode_modifier.staticrounding))
43234a1e
L
6053 {
6054 i.error = unsupported_rc_sae;
6055 return 1;
6056 }
6057 /* If the instruction has several immediate operands and one of
6058 them is rounding, the rounding operand should be the last
6059 immediate operand. */
6060 if (i.imm_operands > 1
ca5312a2 6061 && i.rounding.operand != i.imm_operands - 1)
7bab8ab5 6062 {
43234a1e 6063 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
6064 return 1;
6065 }
6c30d220
L
6066 }
6067
da4977e0
JB
6068 /* Check the special Imm4 cases; must be the first operand. */
6069 if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)
6070 {
6071 if (i.op[0].imms->X_op != O_constant
6072 || !fits_in_imm4 (i.op[0].imms->X_add_number))
6073 {
6074 i.error = bad_imm4;
6075 return 1;
6076 }
6077
6078 /* Turn off Imm<N> so that update_imm won't complain. */
6079 operand_type_set (&i.types[0], 0);
6080 }
6081
43234a1e 6082 /* Check vector Disp8 operand. */
b5014f7a
JB
6083 if (t->opcode_modifier.disp8memshift
6084 && i.disp_encoding != disp_encoding_32bit)
43234a1e 6085 {
5273a3cd 6086 if (i.broadcast.type)
4a1b91ea 6087 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 6088 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 6089 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
6090 else
6091 {
6092 const i386_operand_type *type = NULL;
6093
6094 i.memshift = 0;
6095 for (op = 0; op < i.operands; op++)
8dc0818e 6096 if (i.flags[op] & Operand_Mem)
7091c612 6097 {
4174bfff
JB
6098 if (t->opcode_modifier.evex == EVEXLIG)
6099 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
6100 else if (t->operand_types[op].bitfield.xmmword
6101 + t->operand_types[op].bitfield.ymmword
6102 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
6103 type = &t->operand_types[op];
6104 else if (!i.types[op].bitfield.unspecified)
6105 type = &i.types[op];
6106 }
3528c362 6107 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 6108 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
6109 {
6110 if (i.types[op].bitfield.zmmword)
6111 i.memshift = 6;
6112 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
6113 i.memshift = 5;
6114 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
6115 i.memshift = 4;
6116 }
6117
6118 if (type)
6119 {
6120 if (type->bitfield.zmmword)
6121 i.memshift = 6;
6122 else if (type->bitfield.ymmword)
6123 i.memshift = 5;
6124 else if (type->bitfield.xmmword)
6125 i.memshift = 4;
6126 }
6127
6128 /* For the check in fits_in_disp8(). */
6129 if (i.memshift == 0)
6130 i.memshift = -1;
6131 }
43234a1e
L
6132
6133 for (op = 0; op < i.operands; op++)
6134 if (operand_type_check (i.types[op], disp)
6135 && i.op[op].disps->X_op == O_constant)
6136 {
b5014f7a 6137 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 6138 {
b5014f7a
JB
6139 i.types[op].bitfield.disp8 = 1;
6140 return 0;
43234a1e 6141 }
b5014f7a 6142 i.types[op].bitfield.disp8 = 0;
43234a1e
L
6143 }
6144 }
b5014f7a
JB
6145
6146 i.memshift = 0;
43234a1e 6147
6c30d220
L
6148 return 0;
6149}
6150
da4977e0 6151/* Check if encoding requirements are met by the instruction. */
a683cc34
SP
6152
6153static int
da4977e0 6154VEX_check_encoding (const insn_template *t)
a683cc34 6155{
da4977e0
JB
6156 if (i.vec_encoding == vex_encoding_error)
6157 {
6158 i.error = unsupported;
6159 return 1;
6160 }
6161
86fa6981 6162 if (i.vec_encoding == vex_encoding_evex)
43234a1e 6163 {
86fa6981 6164 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 6165 if (!is_evex_encoding (t))
86fa6981
L
6166 {
6167 i.error = unsupported;
6168 return 1;
6169 }
6170 return 0;
43234a1e
L
6171 }
6172
a683cc34 6173 if (!t->opcode_modifier.vex)
86fa6981
L
6174 {
6175 /* This instruction template doesn't have VEX prefix. */
6176 if (i.vec_encoding != vex_encoding_default)
6177 {
6178 i.error = unsupported;
6179 return 1;
6180 }
6181 return 0;
6182 }
a683cc34 6183
a683cc34
SP
6184 return 0;
6185}
6186
d3ce72d0 6187static const insn_template *
83b16ac6 6188match_template (char mnem_suffix)
29b0f896
AM
6189{
6190 /* Points to template once we've found it. */
d3ce72d0 6191 const insn_template *t;
40fb9820 6192 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 6193 i386_operand_type overlap4;
29b0f896 6194 unsigned int found_reverse_match;
dc2be329 6195 i386_opcode_modifier suffix_check;
40fb9820 6196 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 6197 int addr_prefix_disp;
45a4bb20 6198 unsigned int j, size_match, check_register;
5614d22c 6199 enum i386_error specific_error = 0;
29b0f896 6200
c0f3af97
L
6201#if MAX_OPERANDS != 5
6202# error "MAX_OPERANDS must be 5."
f48ff2ae
L
6203#endif
6204
29b0f896 6205 found_reverse_match = 0;
539e75ad 6206 addr_prefix_disp = -1;
40fb9820 6207
dc2be329 6208 /* Prepare for mnemonic suffix check. */
40fb9820 6209 memset (&suffix_check, 0, sizeof (suffix_check));
dc2be329
L
6210 switch (mnem_suffix)
6211 {
6212 case BYTE_MNEM_SUFFIX:
6213 suffix_check.no_bsuf = 1;
6214 break;
6215 case WORD_MNEM_SUFFIX:
6216 suffix_check.no_wsuf = 1;
6217 break;
6218 case SHORT_MNEM_SUFFIX:
6219 suffix_check.no_ssuf = 1;
6220 break;
6221 case LONG_MNEM_SUFFIX:
6222 suffix_check.no_lsuf = 1;
6223 break;
6224 case QWORD_MNEM_SUFFIX:
6225 suffix_check.no_qsuf = 1;
6226 break;
6227 default:
6228 /* NB: In Intel syntax, normally we can check for memory operand
6229 size when there is no mnemonic suffix. But jmp and call have
6230 2 different encodings with Dword memory operand size, one with
6231 No_ldSuf and the other without. i.suffix is set to
6232 LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
6233 if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
6234 suffix_check.no_ldsuf = 1;
83b16ac6
JB
6235 }
6236
01559ecc
L
6237 /* Must have right number of operands. */
6238 i.error = number_of_operands_mismatch;
6239
45aa61fe 6240 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 6241 {
539e75ad 6242 addr_prefix_disp = -1;
dbbc8b7e 6243 found_reverse_match = 0;
539e75ad 6244
29b0f896
AM
6245 if (i.operands != t->operands)
6246 continue;
6247
50aecf8c 6248 /* Check processor support. */
a65babc9 6249 i.error = unsupported;
45a4bb20 6250 if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH)
50aecf8c
L
6251 continue;
6252
57392598
CL
6253 /* Check Pseudo Prefix. */
6254 i.error = unsupported;
6255 if (t->opcode_modifier.pseudovexprefix
6256 && !(i.vec_encoding == vex_encoding_vex
6257 || i.vec_encoding == vex_encoding_vex3))
6258 continue;
6259
e1d4d893 6260 /* Check AT&T mnemonic. */
a65babc9 6261 i.error = unsupported_with_intel_mnemonic;
e1d4d893 6262 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
6263 continue;
6264
4b5aaf5f 6265 /* Check AT&T/Intel syntax. */
a65babc9 6266 i.error = unsupported_syntax;
5c07affc 6267 if ((intel_syntax && t->opcode_modifier.attsyntax)
4b5aaf5f 6268 || (!intel_syntax && t->opcode_modifier.intelsyntax))
1efbbeb4
L
6269 continue;
6270
4b5aaf5f
L
6271 /* Check Intel64/AMD64 ISA. */
6272 switch (isa64)
6273 {
6274 default:
6275 /* Default: Don't accept Intel64. */
6276 if (t->opcode_modifier.isa64 == INTEL64)
6277 continue;
6278 break;
6279 case amd64:
6280 /* -mamd64: Don't accept Intel64 and Intel64 only. */
6281 if (t->opcode_modifier.isa64 >= INTEL64)
6282 continue;
6283 break;
6284 case intel64:
6285 /* -mintel64: Don't accept AMD64. */
5990e377 6286 if (t->opcode_modifier.isa64 == AMD64 && flag_code == CODE_64BIT)
4b5aaf5f
L
6287 continue;
6288 break;
6289 }
6290
dc2be329 6291 /* Check the suffix. */
a65babc9 6292 i.error = invalid_instruction_suffix;
dc2be329
L
6293 if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
6294 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
6295 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
6296 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
6297 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
6298 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
83b16ac6 6299 continue;
29b0f896 6300
3ac21baa
JB
6301 size_match = operand_size_match (t);
6302 if (!size_match)
7d5e4556 6303 continue;
539e75ad 6304
6f2f06be
JB
6305 /* This is intentionally not
6306
0cfa3eb3 6307 if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
6f2f06be
JB
6308
6309 as the case of a missing * on the operand is accepted (perhaps with
6310 a warning, issued further down). */
0cfa3eb3 6311 if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
6f2f06be
JB
6312 {
6313 i.error = operand_type_mismatch;
6314 continue;
6315 }
6316
5c07affc
L
6317 for (j = 0; j < MAX_OPERANDS; j++)
6318 operand_types[j] = t->operand_types[j];
6319
e365e234
JB
6320 /* In general, don't allow
6321 - 64-bit operands outside of 64-bit mode,
6322 - 32-bit operands on pre-386. */
4873e243 6323 j = i.imm_operands + (t->operands > i.imm_operands + 1);
e365e234
JB
6324 if (((i.suffix == QWORD_MNEM_SUFFIX
6325 && flag_code != CODE_64BIT
389d00a5
JB
6326 && !(t->opcode_modifier.opcodespace == SPACE_0F
6327 && t->base_opcode == 0xc7
5e74b495 6328 && t->opcode_modifier.opcodeprefix == PREFIX_NONE
8b65b895 6329 && t->extension_opcode == 1) /* cmpxchg8b */)
e365e234
JB
6330 || (i.suffix == LONG_MNEM_SUFFIX
6331 && !cpu_arch_flags.bitfield.cpui386))
45aa61fe 6332 && (intel_syntax
3cd7f3e3 6333 ? (t->opcode_modifier.mnemonicsize != IGNORESIZE
45aa61fe
AM
6334 && !intel_float_operand (t->name))
6335 : intel_float_operand (t->name) != 2)
4873e243
JB
6336 && (t->operands == i.imm_operands
6337 || (operand_types[i.imm_operands].bitfield.class != RegMMX
6338 && operand_types[i.imm_operands].bitfield.class != RegSIMD
6339 && operand_types[i.imm_operands].bitfield.class != RegMask)
6340 || (operand_types[j].bitfield.class != RegMMX
6341 && operand_types[j].bitfield.class != RegSIMD
6342 && operand_types[j].bitfield.class != RegMask))
63112cd6 6343 && !t->opcode_modifier.sib)
192dc9c6
JB
6344 continue;
6345
29b0f896 6346 /* Do not verify operands when there are none. */
e365e234 6347 if (!t->operands)
da4977e0
JB
6348 {
6349 if (VEX_check_encoding (t))
6350 {
6351 specific_error = i.error;
6352 continue;
6353 }
6354
6355 /* We've found a match; break out of loop. */
6356 break;
6357 }
252b5132 6358
48bcea9f
JB
6359 if (!t->opcode_modifier.jump
6360 || t->opcode_modifier.jump == JUMP_ABSOLUTE)
6361 {
6362 /* There should be only one Disp operand. */
6363 for (j = 0; j < MAX_OPERANDS; j++)
6364 if (operand_type_check (operand_types[j], disp))
539e75ad 6365 break;
48bcea9f
JB
6366 if (j < MAX_OPERANDS)
6367 {
5b7c81bd 6368 bool override = (i.prefix[ADDR_PREFIX] != 0);
48bcea9f
JB
6369
6370 addr_prefix_disp = j;
6371
6372 /* Address size prefix will turn Disp64/Disp32S/Disp32/Disp16
6373 operand into Disp32/Disp32/Disp16/Disp32 operand. */
6374 switch (flag_code)
40fb9820 6375 {
48bcea9f
JB
6376 case CODE_16BIT:
6377 override = !override;
6378 /* Fall through. */
6379 case CODE_32BIT:
6380 if (operand_types[j].bitfield.disp32
6381 && operand_types[j].bitfield.disp16)
40fb9820 6382 {
48bcea9f
JB
6383 operand_types[j].bitfield.disp16 = override;
6384 operand_types[j].bitfield.disp32 = !override;
40fb9820 6385 }
48bcea9f
JB
6386 operand_types[j].bitfield.disp32s = 0;
6387 operand_types[j].bitfield.disp64 = 0;
6388 break;
6389
6390 case CODE_64BIT:
6391 if (operand_types[j].bitfield.disp32s
6392 || operand_types[j].bitfield.disp64)
40fb9820 6393 {
48bcea9f
JB
6394 operand_types[j].bitfield.disp64 &= !override;
6395 operand_types[j].bitfield.disp32s &= !override;
6396 operand_types[j].bitfield.disp32 = override;
40fb9820 6397 }
48bcea9f
JB
6398 operand_types[j].bitfield.disp16 = 0;
6399 break;
40fb9820 6400 }
539e75ad 6401 }
48bcea9f 6402 }
539e75ad 6403
02a86693 6404 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
35648716
JB
6405 if (i.reloc[0] == BFD_RELOC_386_GOT32
6406 && t->base_opcode == 0xa0
6407 && t->opcode_modifier.opcodespace == SPACE_BASE)
02a86693
L
6408 continue;
6409
56ffb741 6410 /* We check register size if needed. */
e2195274
JB
6411 if (t->opcode_modifier.checkregsize)
6412 {
6413 check_register = (1 << t->operands) - 1;
5273a3cd
JB
6414 if (i.broadcast.type)
6415 check_register &= ~(1 << i.broadcast.operand);
e2195274
JB
6416 }
6417 else
6418 check_register = 0;
6419
c6fb90c8 6420 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
6421 switch (t->operands)
6422 {
6423 case 1:
40fb9820 6424 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
6425 continue;
6426 break;
6427 case 2:
33eaf5de 6428 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
6429 only in 32bit mode and we can use opcode 0x90. In 64bit
6430 mode, we can't use 0x90 for xchg %eax, %eax since it should
6431 zero-extend %eax to %rax. */
6432 if (flag_code == CODE_64BIT
6433 && t->base_opcode == 0x90
35648716 6434 && t->opcode_modifier.opcodespace == SPACE_BASE
75e5731b
JB
6435 && i.types[0].bitfield.instance == Accum
6436 && i.types[0].bitfield.dword
6437 && i.types[1].bitfield.instance == Accum
6438 && i.types[1].bitfield.dword)
8b38ad71 6439 continue;
1212781b
JB
6440 /* xrelease mov %eax, <disp> is another special case. It must not
6441 match the accumulator-only encoding of mov. */
6442 if (flag_code != CODE_64BIT
6443 && i.hle_prefix
6444 && t->base_opcode == 0xa0
35648716 6445 && t->opcode_modifier.opcodespace == SPACE_BASE
75e5731b 6446 && i.types[0].bitfield.instance == Accum
8dc0818e 6447 && (i.flags[1] & Operand_Mem))
1212781b 6448 continue;
f5eb1d70
JB
6449 /* Fall through. */
6450
6451 case 3:
3ac21baa
JB
6452 if (!(size_match & MATCH_STRAIGHT))
6453 goto check_reverse;
64c49ab3
JB
6454 /* Reverse direction of operands if swapping is possible in the first
6455 place (operands need to be symmetric) and
6456 - the load form is requested, and the template is a store form,
6457 - the store form is requested, and the template is a load form,
6458 - the non-default (swapped) form is requested. */
6459 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 6460 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
6461 && !operand_type_all_zero (&overlap1))
6462 switch (i.dir_encoding)
6463 {
6464 case dir_encoding_load:
6465 if (operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6466 || t->opcode_modifier.regmem)
64c49ab3
JB
6467 goto check_reverse;
6468 break;
6469
6470 case dir_encoding_store:
6471 if (!operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6472 && !t->opcode_modifier.regmem)
64c49ab3
JB
6473 goto check_reverse;
6474 break;
6475
6476 case dir_encoding_swap:
6477 goto check_reverse;
6478
6479 case dir_encoding_default:
6480 break;
6481 }
86fa6981 6482 /* If we want store form, we skip the current load. */
64c49ab3
JB
6483 if ((i.dir_encoding == dir_encoding_store
6484 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
6485 && i.mem_operands == 0
6486 && t->opcode_modifier.load)
fa99fab2 6487 continue;
1a0670f3 6488 /* Fall through. */
f48ff2ae 6489 case 4:
c0f3af97 6490 case 5:
c6fb90c8 6491 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
6492 if (!operand_type_match (overlap0, i.types[0])
6493 || !operand_type_match (overlap1, i.types[1])
e2195274 6494 || ((check_register & 3) == 3
dc821c5f 6495 && !operand_type_register_match (i.types[0],
40fb9820 6496 operand_types[0],
dc821c5f 6497 i.types[1],
40fb9820 6498 operand_types[1])))
29b0f896
AM
6499 {
6500 /* Check if other direction is valid ... */
38e314eb 6501 if (!t->opcode_modifier.d)
29b0f896
AM
6502 continue;
6503
dc1e8a47 6504 check_reverse:
3ac21baa
JB
6505 if (!(size_match & MATCH_REVERSE))
6506 continue;
29b0f896 6507 /* Try reversing direction of operands. */
f5eb1d70
JB
6508 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
6509 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 6510 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 6511 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 6512 || (check_register
dc821c5f 6513 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
6514 operand_types[i.operands - 1],
6515 i.types[i.operands - 1],
45664ddb 6516 operand_types[0])))
29b0f896
AM
6517 {
6518 /* Does not match either direction. */
6519 continue;
6520 }
38e314eb 6521 /* found_reverse_match holds which of D or FloatR
29b0f896 6522 we've found. */
38e314eb
JB
6523 if (!t->opcode_modifier.d)
6524 found_reverse_match = 0;
6525 else if (operand_types[0].bitfield.tbyte)
8a2ed489 6526 found_reverse_match = Opcode_FloatD;
dbbc8b7e 6527 else if (operand_types[0].bitfield.xmmword
f5eb1d70 6528 || operand_types[i.operands - 1].bitfield.xmmword
3528c362
JB
6529 || operand_types[0].bitfield.class == RegMMX
6530 || operand_types[i.operands - 1].bitfield.class == RegMMX
dbbc8b7e
JB
6531 || is_any_vex_encoding(t))
6532 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
6533 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 6534 else
38e314eb 6535 found_reverse_match = Opcode_D;
40fb9820 6536 if (t->opcode_modifier.floatr)
8a2ed489 6537 found_reverse_match |= Opcode_FloatR;
29b0f896 6538 }
f48ff2ae 6539 else
29b0f896 6540 {
f48ff2ae 6541 /* Found a forward 2 operand match here. */
d1cbb4db
L
6542 switch (t->operands)
6543 {
c0f3af97
L
6544 case 5:
6545 overlap4 = operand_type_and (i.types[4],
6546 operand_types[4]);
1a0670f3 6547 /* Fall through. */
d1cbb4db 6548 case 4:
c6fb90c8
L
6549 overlap3 = operand_type_and (i.types[3],
6550 operand_types[3]);
1a0670f3 6551 /* Fall through. */
d1cbb4db 6552 case 3:
c6fb90c8
L
6553 overlap2 = operand_type_and (i.types[2],
6554 operand_types[2]);
d1cbb4db
L
6555 break;
6556 }
29b0f896 6557
f48ff2ae
L
6558 switch (t->operands)
6559 {
c0f3af97
L
6560 case 5:
6561 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 6562 || !operand_type_register_match (i.types[3],
c0f3af97 6563 operand_types[3],
c0f3af97
L
6564 i.types[4],
6565 operand_types[4]))
6566 continue;
1a0670f3 6567 /* Fall through. */
f48ff2ae 6568 case 4:
40fb9820 6569 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
6570 || ((check_register & 0xa) == 0xa
6571 && !operand_type_register_match (i.types[1],
f7768225
JB
6572 operand_types[1],
6573 i.types[3],
e2195274
JB
6574 operand_types[3]))
6575 || ((check_register & 0xc) == 0xc
6576 && !operand_type_register_match (i.types[2],
6577 operand_types[2],
6578 i.types[3],
6579 operand_types[3])))
f48ff2ae 6580 continue;
1a0670f3 6581 /* Fall through. */
f48ff2ae
L
6582 case 3:
6583 /* Here we make use of the fact that there are no
23e42951 6584 reverse match 3 operand instructions. */
40fb9820 6585 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
6586 || ((check_register & 5) == 5
6587 && !operand_type_register_match (i.types[0],
23e42951
JB
6588 operand_types[0],
6589 i.types[2],
e2195274
JB
6590 operand_types[2]))
6591 || ((check_register & 6) == 6
6592 && !operand_type_register_match (i.types[1],
6593 operand_types[1],
6594 i.types[2],
6595 operand_types[2])))
f48ff2ae
L
6596 continue;
6597 break;
6598 }
29b0f896 6599 }
f48ff2ae 6600 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
6601 slip through to break. */
6602 }
c0f3af97 6603
da4977e0
JB
6604 /* Check if vector operands are valid. */
6605 if (check_VecOperands (t))
6606 {
6607 specific_error = i.error;
6608 continue;
6609 }
6610
6611 /* Check if VEX/EVEX encoding requirements can be satisfied. */
6612 if (VEX_check_encoding (t))
5614d22c
JB
6613 {
6614 specific_error = i.error;
6615 continue;
6616 }
a683cc34 6617
29b0f896
AM
6618 /* We've found a match; break out of loop. */
6619 break;
6620 }
6621
6622 if (t == current_templates->end)
6623 {
6624 /* We found no match. */
a65babc9 6625 const char *err_msg;
5614d22c 6626 switch (specific_error ? specific_error : i.error)
a65babc9
L
6627 {
6628 default:
6629 abort ();
86e026a4 6630 case operand_size_mismatch:
a65babc9
L
6631 err_msg = _("operand size mismatch");
6632 break;
6633 case operand_type_mismatch:
6634 err_msg = _("operand type mismatch");
6635 break;
6636 case register_type_mismatch:
6637 err_msg = _("register type mismatch");
6638 break;
6639 case number_of_operands_mismatch:
6640 err_msg = _("number of operands mismatch");
6641 break;
6642 case invalid_instruction_suffix:
6643 err_msg = _("invalid instruction suffix");
6644 break;
6645 case bad_imm4:
4a2608e3 6646 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6647 break;
a65babc9
L
6648 case unsupported_with_intel_mnemonic:
6649 err_msg = _("unsupported with Intel mnemonic");
6650 break;
6651 case unsupported_syntax:
6652 err_msg = _("unsupported syntax");
6653 break;
6654 case unsupported:
35262a23 6655 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6656 current_templates->start->name);
6657 return NULL;
260cd341
LC
6658 case invalid_sib_address:
6659 err_msg = _("invalid SIB address");
6660 break;
6c30d220
L
6661 case invalid_vsib_address:
6662 err_msg = _("invalid VSIB address");
6663 break;
7bab8ab5
JB
6664 case invalid_vector_register_set:
6665 err_msg = _("mask, index, and destination registers must be distinct");
6666 break;
260cd341
LC
6667 case invalid_tmm_register_set:
6668 err_msg = _("all tmm registers must be distinct");
6669 break;
6c30d220
L
6670 case unsupported_vector_index_register:
6671 err_msg = _("unsupported vector index register");
6672 break;
43234a1e
L
6673 case unsupported_broadcast:
6674 err_msg = _("unsupported broadcast");
6675 break;
43234a1e
L
6676 case broadcast_needed:
6677 err_msg = _("broadcast is needed for operand of such type");
6678 break;
6679 case unsupported_masking:
6680 err_msg = _("unsupported masking");
6681 break;
6682 case mask_not_on_destination:
6683 err_msg = _("mask not on destination operand");
6684 break;
6685 case no_default_mask:
6686 err_msg = _("default mask isn't allowed");
6687 break;
6688 case unsupported_rc_sae:
6689 err_msg = _("unsupported static rounding/sae");
6690 break;
6691 case rc_sae_operand_not_last_imm:
6692 if (intel_syntax)
6693 err_msg = _("RC/SAE operand must precede immediate operands");
6694 else
6695 err_msg = _("RC/SAE operand must follow immediate operands");
6696 break;
6697 case invalid_register_operand:
6698 err_msg = _("invalid register operand");
6699 break;
a65babc9
L
6700 }
6701 as_bad (_("%s for `%s'"), err_msg,
891edac4 6702 current_templates->start->name);
fa99fab2 6703 return NULL;
29b0f896 6704 }
252b5132 6705
29b0f896
AM
6706 if (!quiet_warnings)
6707 {
6708 if (!intel_syntax
0cfa3eb3 6709 && (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE)))
6f2f06be 6710 as_warn (_("indirect %s without `*'"), t->name);
29b0f896 6711
40fb9820 6712 if (t->opcode_modifier.isprefix
3cd7f3e3 6713 && t->opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6714 {
6715 /* Warn them that a data or address size prefix doesn't
6716 affect assembly of the next line of code. */
6717 as_warn (_("stand-alone `%s' prefix"), t->name);
6718 }
6719 }
6720
6721 /* Copy the template we found. */
9a182d04 6722 install_template (t);
539e75ad
L
6723
6724 if (addr_prefix_disp != -1)
6725 i.tm.operand_types[addr_prefix_disp]
6726 = operand_types[addr_prefix_disp];
6727
29b0f896
AM
6728 if (found_reverse_match)
6729 {
dfd69174
JB
6730 /* If we found a reverse match we must alter the opcode direction
6731 bit and clear/flip the regmem modifier one. found_reverse_match
6732 holds bits to change (different for int & float insns). */
29b0f896
AM
6733
6734 i.tm.base_opcode ^= found_reverse_match;
6735
f5eb1d70
JB
6736 i.tm.operand_types[0] = operand_types[i.operands - 1];
6737 i.tm.operand_types[i.operands - 1] = operand_types[0];
dfd69174
JB
6738
6739 /* Certain SIMD insns have their load forms specified in the opcode
6740 table, and hence we need to _set_ RegMem instead of clearing it.
6741 We need to avoid setting the bit though on insns like KMOVW. */
6742 i.tm.opcode_modifier.regmem
6743 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
6744 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
6745 && !i.tm.opcode_modifier.regmem;
29b0f896
AM
6746 }
6747
fa99fab2 6748 return t;
29b0f896
AM
6749}
6750
6751static int
e3bb37b5 6752check_string (void)
29b0f896 6753{
51c8edf6
JB
6754 unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
6755 unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
8dc0818e 6756
5e042380 6757 if (i.seg[op] != NULL && i.seg[op] != reg_es)
29b0f896 6758 {
51c8edf6
JB
6759 as_bad (_("`%s' operand %u must use `%ses' segment"),
6760 i.tm.name,
6761 intel_syntax ? i.tm.operands - es_op : es_op + 1,
6762 register_prefix);
6763 return 0;
29b0f896 6764 }
51c8edf6
JB
6765
6766 /* There's only ever one segment override allowed per instruction.
6767 This instruction possibly has a legal segment override on the
6768 second operand, so copy the segment to where non-string
6769 instructions store it, allowing common code. */
6770 i.seg[op] = i.seg[1];
6771
29b0f896
AM
6772 return 1;
6773}
6774
6775static int
543613e9 6776process_suffix (void)
29b0f896 6777{
5b7c81bd 6778 bool is_crc32 = false, is_movx = false;
8b65b895 6779
29b0f896
AM
6780 /* If matched instruction specifies an explicit instruction mnemonic
6781 suffix, use it. */
673fe0f0 6782 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6783 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6784 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6785 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6786 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6787 i.suffix = QWORD_MNEM_SUFFIX;
13e600d0 6788 else if (i.reg_operands
c8f8eebc
JB
6789 && (i.operands > 1 || i.types[0].bitfield.class == Reg)
6790 && !i.tm.opcode_modifier.addrprefixopreg)
29b0f896 6791 {
65fca059 6792 unsigned int numop = i.operands;
389d00a5
JB
6793
6794 /* MOVSX/MOVZX */
6795 is_movx = (i.tm.opcode_modifier.opcodespace == SPACE_0F
6796 && (i.tm.base_opcode | 8) == 0xbe)
6797 || (i.tm.opcode_modifier.opcodespace == SPACE_BASE
6798 && i.tm.base_opcode == 0x63
6799 && i.tm.cpu_flags.bitfield.cpu64);
6800
8b65b895 6801 /* CRC32 */
389d00a5
JB
6802 is_crc32 = (i.tm.base_opcode == 0xf0
6803 && i.tm.opcode_modifier.opcodespace == SPACE_0F38
8b65b895 6804 && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2);
65fca059
JB
6805
6806 /* movsx/movzx want only their source operand considered here, for the
6807 ambiguity checking below. The suffix will be replaced afterwards
6808 to represent the destination (register). */
389d00a5 6809 if (is_movx && (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63))
65fca059
JB
6810 --i.operands;
6811
643bb870 6812 /* crc32 needs REX.W set regardless of suffix / source operand size. */
8b65b895 6813 if (is_crc32 && i.tm.operand_types[1].bitfield.qword)
643bb870
JB
6814 i.rex |= REX_W;
6815
29b0f896 6816 /* If there's no instruction mnemonic suffix we try to invent one
13e600d0 6817 based on GPR operands. */
29b0f896
AM
6818 if (!i.suffix)
6819 {
6820 /* We take i.suffix from the last register operand specified,
6821 Destination register type is more significant than source
381d071f
L
6822 register type. crc32 in SSE4.2 prefers source register
6823 type. */
8b65b895 6824 unsigned int op = is_crc32 ? 1 : i.operands;
20592a94 6825
1a035124
JB
6826 while (op--)
6827 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
6828 || i.tm.operand_types[op].bitfield.instance == Accum)
6829 {
6830 if (i.types[op].bitfield.class != Reg)
6831 continue;
6832 if (i.types[op].bitfield.byte)
6833 i.suffix = BYTE_MNEM_SUFFIX;
6834 else if (i.types[op].bitfield.word)
6835 i.suffix = WORD_MNEM_SUFFIX;
6836 else if (i.types[op].bitfield.dword)
6837 i.suffix = LONG_MNEM_SUFFIX;
6838 else if (i.types[op].bitfield.qword)
6839 i.suffix = QWORD_MNEM_SUFFIX;
6840 else
6841 continue;
6842 break;
6843 }
65fca059
JB
6844
6845 /* As an exception, movsx/movzx silently default to a byte source
6846 in AT&T mode. */
389d00a5 6847 if (is_movx && i.tm.opcode_modifier.w && !i.suffix && !intel_syntax)
65fca059 6848 i.suffix = BYTE_MNEM_SUFFIX;
29b0f896
AM
6849 }
6850 else if (i.suffix == BYTE_MNEM_SUFFIX)
6851 {
2eb952a4 6852 if (intel_syntax
3cd7f3e3 6853 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6854 && i.tm.opcode_modifier.no_bsuf)
6855 i.suffix = 0;
6856 else if (!check_byte_reg ())
29b0f896
AM
6857 return 0;
6858 }
6859 else if (i.suffix == LONG_MNEM_SUFFIX)
6860 {
2eb952a4 6861 if (intel_syntax
3cd7f3e3 6862 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6863 && i.tm.opcode_modifier.no_lsuf
6864 && !i.tm.opcode_modifier.todword
6865 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
6866 i.suffix = 0;
6867 else if (!check_long_reg ())
29b0f896
AM
6868 return 0;
6869 }
6870 else if (i.suffix == QWORD_MNEM_SUFFIX)
6871 {
955e1e6a 6872 if (intel_syntax
3cd7f3e3 6873 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6874 && i.tm.opcode_modifier.no_qsuf
6875 && !i.tm.opcode_modifier.todword
6876 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
6877 i.suffix = 0;
6878 else if (!check_qword_reg ())
29b0f896
AM
6879 return 0;
6880 }
6881 else if (i.suffix == WORD_MNEM_SUFFIX)
6882 {
2eb952a4 6883 if (intel_syntax
3cd7f3e3 6884 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6885 && i.tm.opcode_modifier.no_wsuf)
6886 i.suffix = 0;
6887 else if (!check_word_reg ())
29b0f896
AM
6888 return 0;
6889 }
3cd7f3e3
L
6890 else if (intel_syntax
6891 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6892 /* Do nothing if the instruction is going to ignore the prefix. */
6893 ;
6894 else
6895 abort ();
65fca059
JB
6896
6897 /* Undo the movsx/movzx change done above. */
6898 i.operands = numop;
29b0f896 6899 }
3cd7f3e3
L
6900 else if (i.tm.opcode_modifier.mnemonicsize == DEFAULTSIZE
6901 && !i.suffix)
29b0f896 6902 {
13e600d0
JB
6903 i.suffix = stackop_size;
6904 if (stackop_size == LONG_MNEM_SUFFIX)
06f74c5c
L
6905 {
6906 /* stackop_size is set to LONG_MNEM_SUFFIX for the
6907 .code16gcc directive to support 16-bit mode with
6908 32-bit address. For IRET without a suffix, generate
6909 16-bit IRET (opcode 0xcf) to return from an interrupt
6910 handler. */
13e600d0
JB
6911 if (i.tm.base_opcode == 0xcf)
6912 {
6913 i.suffix = WORD_MNEM_SUFFIX;
6914 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
6915 }
6916 /* Warn about changed behavior for segment register push/pop. */
6917 else if ((i.tm.base_opcode | 1) == 0x07)
6918 as_warn (_("generating 32-bit `%s', unlike earlier gas versions"),
6919 i.tm.name);
06f74c5c 6920 }
29b0f896 6921 }
c006a730 6922 else if (!i.suffix
0cfa3eb3
JB
6923 && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
6924 || i.tm.opcode_modifier.jump == JUMP_BYTE
6925 || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
389d00a5
JB
6926 || (i.tm.opcode_modifier.opcodespace == SPACE_0F
6927 && i.tm.base_opcode == 0x01 /* [ls][gi]dt */
64e74474 6928 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
6929 {
6930 switch (flag_code)
6931 {
6932 case CODE_64BIT:
40fb9820 6933 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a 6934 {
828c2a25
JB
6935 if (i.tm.opcode_modifier.jump == JUMP_BYTE
6936 || i.tm.opcode_modifier.no_lsuf)
6937 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a
JB
6938 break;
6939 }
1a0670f3 6940 /* Fall through. */
9306ca4a 6941 case CODE_32BIT:
40fb9820 6942 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
6943 i.suffix = LONG_MNEM_SUFFIX;
6944 break;
6945 case CODE_16BIT:
40fb9820 6946 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
6947 i.suffix = WORD_MNEM_SUFFIX;
6948 break;
6949 }
6950 }
252b5132 6951
c006a730 6952 if (!i.suffix
3cd7f3e3 6953 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8
JB
6954 /* Also cover lret/retf/iret in 64-bit mode. */
6955 || (flag_code == CODE_64BIT
6956 && !i.tm.opcode_modifier.no_lsuf
6957 && !i.tm.opcode_modifier.no_qsuf))
3cd7f3e3 6958 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
8bbb3ad8
JB
6959 /* Explicit sizing prefixes are assumed to disambiguate insns. */
6960 && !i.prefix[DATA_PREFIX] && !(i.prefix[REX_PREFIX] & REX_W)
62b3f548
JB
6961 /* Accept FLDENV et al without suffix. */
6962 && (i.tm.opcode_modifier.no_ssuf || i.tm.opcode_modifier.floatmf))
29b0f896 6963 {
6c0946d0 6964 unsigned int suffixes, evex = 0;
c006a730
JB
6965
6966 suffixes = !i.tm.opcode_modifier.no_bsuf;
6967 if (!i.tm.opcode_modifier.no_wsuf)
6968 suffixes |= 1 << 1;
6969 if (!i.tm.opcode_modifier.no_lsuf)
6970 suffixes |= 1 << 2;
6971 if (!i.tm.opcode_modifier.no_ldsuf)
6972 suffixes |= 1 << 3;
6973 if (!i.tm.opcode_modifier.no_ssuf)
6974 suffixes |= 1 << 4;
6975 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
6976 suffixes |= 1 << 5;
6977
6c0946d0
JB
6978 /* For [XYZ]MMWORD operands inspect operand sizes. While generally
6979 also suitable for AT&T syntax mode, it was requested that this be
6980 restricted to just Intel syntax. */
5273a3cd 6981 if (intel_syntax && is_any_vex_encoding (&i.tm) && !i.broadcast.type)
6c0946d0 6982 {
b9915cbc 6983 unsigned int op;
6c0946d0 6984
b9915cbc 6985 for (op = 0; op < i.tm.operands; ++op)
6c0946d0 6986 {
b9915cbc
JB
6987 if (is_evex_encoding (&i.tm)
6988 && !cpu_arch_flags.bitfield.cpuavx512vl)
6c0946d0 6989 {
b9915cbc
JB
6990 if (i.tm.operand_types[op].bitfield.ymmword)
6991 i.tm.operand_types[op].bitfield.xmmword = 0;
6992 if (i.tm.operand_types[op].bitfield.zmmword)
6993 i.tm.operand_types[op].bitfield.ymmword = 0;
6994 if (!i.tm.opcode_modifier.evex
6995 || i.tm.opcode_modifier.evex == EVEXDYN)
6996 i.tm.opcode_modifier.evex = EVEX512;
6997 }
6c0946d0 6998
b9915cbc
JB
6999 if (i.tm.operand_types[op].bitfield.xmmword
7000 + i.tm.operand_types[op].bitfield.ymmword
7001 + i.tm.operand_types[op].bitfield.zmmword < 2)
7002 continue;
6c0946d0 7003
b9915cbc
JB
7004 /* Any properly sized operand disambiguates the insn. */
7005 if (i.types[op].bitfield.xmmword
7006 || i.types[op].bitfield.ymmword
7007 || i.types[op].bitfield.zmmword)
7008 {
7009 suffixes &= ~(7 << 6);
7010 evex = 0;
7011 break;
7012 }
6c0946d0 7013
b9915cbc
JB
7014 if ((i.flags[op] & Operand_Mem)
7015 && i.tm.operand_types[op].bitfield.unspecified)
7016 {
7017 if (i.tm.operand_types[op].bitfield.xmmword)
7018 suffixes |= 1 << 6;
7019 if (i.tm.operand_types[op].bitfield.ymmword)
7020 suffixes |= 1 << 7;
7021 if (i.tm.operand_types[op].bitfield.zmmword)
7022 suffixes |= 1 << 8;
7023 if (is_evex_encoding (&i.tm))
7024 evex = EVEX512;
6c0946d0
JB
7025 }
7026 }
7027 }
7028
7029 /* Are multiple suffixes / operand sizes allowed? */
c006a730 7030 if (suffixes & (suffixes - 1))
9306ca4a 7031 {
873494c8 7032 if (intel_syntax
3cd7f3e3 7033 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8 7034 || operand_check == check_error))
9306ca4a 7035 {
c006a730 7036 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
9306ca4a
JB
7037 return 0;
7038 }
c006a730 7039 if (operand_check == check_error)
9306ca4a 7040 {
c006a730
JB
7041 as_bad (_("no instruction mnemonic suffix given and "
7042 "no register operands; can't size `%s'"), i.tm.name);
9306ca4a
JB
7043 return 0;
7044 }
c006a730 7045 if (operand_check == check_warning)
873494c8
JB
7046 as_warn (_("%s; using default for `%s'"),
7047 intel_syntax
7048 ? _("ambiguous operand size")
7049 : _("no instruction mnemonic suffix given and "
7050 "no register operands"),
7051 i.tm.name);
c006a730
JB
7052
7053 if (i.tm.opcode_modifier.floatmf)
7054 i.suffix = SHORT_MNEM_SUFFIX;
389d00a5 7055 else if (is_movx)
65fca059 7056 /* handled below */;
6c0946d0
JB
7057 else if (evex)
7058 i.tm.opcode_modifier.evex = evex;
c006a730
JB
7059 else if (flag_code == CODE_16BIT)
7060 i.suffix = WORD_MNEM_SUFFIX;
1a035124 7061 else if (!i.tm.opcode_modifier.no_lsuf)
c006a730 7062 i.suffix = LONG_MNEM_SUFFIX;
1a035124
JB
7063 else
7064 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a 7065 }
29b0f896 7066 }
252b5132 7067
389d00a5 7068 if (is_movx)
65fca059
JB
7069 {
7070 /* In Intel syntax, movsx/movzx must have a "suffix" (checked above).
7071 In AT&T syntax, if there is no suffix (warned about above), the default
7072 will be byte extension. */
7073 if (i.tm.opcode_modifier.w && i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
7074 i.tm.base_opcode |= 1;
7075
7076 /* For further processing, the suffix should represent the destination
7077 (register). This is already the case when one was used with
7078 mov[sz][bw]*, but we need to replace it for mov[sz]x, or if there was
7079 no suffix to begin with. */
7080 if (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63 || !i.suffix)
7081 {
7082 if (i.types[1].bitfield.word)
7083 i.suffix = WORD_MNEM_SUFFIX;
7084 else if (i.types[1].bitfield.qword)
7085 i.suffix = QWORD_MNEM_SUFFIX;
7086 else
7087 i.suffix = LONG_MNEM_SUFFIX;
7088
7089 i.tm.opcode_modifier.w = 0;
7090 }
7091 }
7092
50128d0c
JB
7093 if (!i.tm.opcode_modifier.modrm && i.reg_operands && i.tm.operands < 3)
7094 i.short_form = (i.tm.operand_types[0].bitfield.class == Reg)
7095 != (i.tm.operand_types[1].bitfield.class == Reg);
7096
d2224064
JB
7097 /* Change the opcode based on the operand size given by i.suffix. */
7098 switch (i.suffix)
29b0f896 7099 {
d2224064
JB
7100 /* Size floating point instruction. */
7101 case LONG_MNEM_SUFFIX:
7102 if (i.tm.opcode_modifier.floatmf)
7103 {
7104 i.tm.base_opcode ^= 4;
7105 break;
7106 }
7107 /* fall through */
7108 case WORD_MNEM_SUFFIX:
7109 case QWORD_MNEM_SUFFIX:
29b0f896 7110 /* It's not a byte, select word/dword operation. */
40fb9820 7111 if (i.tm.opcode_modifier.w)
29b0f896 7112 {
50128d0c 7113 if (i.short_form)
29b0f896
AM
7114 i.tm.base_opcode |= 8;
7115 else
7116 i.tm.base_opcode |= 1;
7117 }
d2224064
JB
7118 /* fall through */
7119 case SHORT_MNEM_SUFFIX:
29b0f896
AM
7120 /* Now select between word & dword operations via the operand
7121 size prefix, except for instructions that will ignore this
7122 prefix anyway. */
c8f8eebc 7123 if (i.suffix != QWORD_MNEM_SUFFIX
3cd7f3e3 7124 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
c8f8eebc
JB
7125 && !i.tm.opcode_modifier.floatmf
7126 && !is_any_vex_encoding (&i.tm)
7127 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
7128 || (flag_code == CODE_64BIT
7129 && i.tm.opcode_modifier.jump == JUMP_BYTE)))
24eab124
AM
7130 {
7131 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 7132
0cfa3eb3 7133 if (i.tm.opcode_modifier.jump == JUMP_BYTE) /* jcxz, loop */
29b0f896 7134 prefix = ADDR_PREFIX_OPCODE;
252b5132 7135
29b0f896
AM
7136 if (!add_prefix (prefix))
7137 return 0;
24eab124 7138 }
252b5132 7139
29b0f896
AM
7140 /* Set mode64 for an operand. */
7141 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 7142 && flag_code == CODE_64BIT
d2224064 7143 && !i.tm.opcode_modifier.norex64
4ed21b58 7144 && !i.tm.opcode_modifier.vexw
46e883c5 7145 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
7146 need rex64. */
7147 && ! (i.operands == 2
7148 && i.tm.base_opcode == 0x90
7149 && i.tm.extension_opcode == None
75e5731b
JB
7150 && i.types[0].bitfield.instance == Accum
7151 && i.types[0].bitfield.qword
7152 && i.types[1].bitfield.instance == Accum
7153 && i.types[1].bitfield.qword))
d2224064 7154 i.rex |= REX_W;
3e73aa7c 7155
d2224064 7156 break;
8bbb3ad8
JB
7157
7158 case 0:
f9a6a8f0 7159 /* Select word/dword/qword operation with explicit data sizing prefix
8bbb3ad8
JB
7160 when there are no suitable register operands. */
7161 if (i.tm.opcode_modifier.w
7162 && (i.prefix[DATA_PREFIX] || (i.prefix[REX_PREFIX] & REX_W))
7163 && (!i.reg_operands
7164 || (i.reg_operands == 1
7165 /* ShiftCount */
7166 && (i.tm.operand_types[0].bitfield.instance == RegC
7167 /* InOutPortReg */
7168 || i.tm.operand_types[0].bitfield.instance == RegD
7169 || i.tm.operand_types[1].bitfield.instance == RegD
7170 /* CRC32 */
8b65b895 7171 || is_crc32))))
8bbb3ad8
JB
7172 i.tm.base_opcode |= 1;
7173 break;
29b0f896 7174 }
7ecd2f8b 7175
c8f8eebc 7176 if (i.tm.opcode_modifier.addrprefixopreg)
c0a30a9f 7177 {
c8f8eebc
JB
7178 gas_assert (!i.suffix);
7179 gas_assert (i.reg_operands);
c0a30a9f 7180
c8f8eebc
JB
7181 if (i.tm.operand_types[0].bitfield.instance == Accum
7182 || i.operands == 1)
7183 {
7184 /* The address size override prefix changes the size of the
7185 first operand. */
7186 if (flag_code == CODE_64BIT
7187 && i.op[0].regs->reg_type.bitfield.word)
7188 {
7189 as_bad (_("16-bit addressing unavailable for `%s'"),
7190 i.tm.name);
7191 return 0;
7192 }
7193
7194 if ((flag_code == CODE_32BIT
7195 ? i.op[0].regs->reg_type.bitfield.word
7196 : i.op[0].regs->reg_type.bitfield.dword)
7197 && !add_prefix (ADDR_PREFIX_OPCODE))
7198 return 0;
7199 }
c0a30a9f
L
7200 else
7201 {
c8f8eebc
JB
7202 /* Check invalid register operand when the address size override
7203 prefix changes the size of register operands. */
7204 unsigned int op;
7205 enum { need_word, need_dword, need_qword } need;
7206
27f13469 7207 /* Check the register operand for the address size prefix if
b3a3496f 7208 the memory operand has no real registers, like symbol, DISP
829f3fe1 7209 or bogus (x32-only) symbol(%rip) when symbol(%eip) is meant. */
27f13469
L
7210 if (i.mem_operands == 1
7211 && i.reg_operands == 1
7212 && i.operands == 2
27f13469 7213 && i.types[1].bitfield.class == Reg
b3a3496f
L
7214 && (flag_code == CODE_32BIT
7215 ? i.op[1].regs->reg_type.bitfield.word
7216 : i.op[1].regs->reg_type.bitfield.dword)
7217 && ((i.base_reg == NULL && i.index_reg == NULL)
829f3fe1
JB
7218#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
7219 || (x86_elf_abi == X86_64_X32_ABI
7220 && i.base_reg
b3a3496f
L
7221 && i.base_reg->reg_num == RegIP
7222 && i.base_reg->reg_type.bitfield.qword))
829f3fe1
JB
7223#else
7224 || 0)
7225#endif
27f13469
L
7226 && !add_prefix (ADDR_PREFIX_OPCODE))
7227 return 0;
7228
c8f8eebc
JB
7229 if (flag_code == CODE_32BIT)
7230 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
7231 else if (i.prefix[ADDR_PREFIX])
c0a30a9f
L
7232 need = need_dword;
7233 else
7234 need = flag_code == CODE_64BIT ? need_qword : need_word;
c0a30a9f 7235
c8f8eebc
JB
7236 for (op = 0; op < i.operands; op++)
7237 {
7238 if (i.types[op].bitfield.class != Reg)
7239 continue;
7240
7241 switch (need)
7242 {
7243 case need_word:
7244 if (i.op[op].regs->reg_type.bitfield.word)
7245 continue;
7246 break;
7247 case need_dword:
7248 if (i.op[op].regs->reg_type.bitfield.dword)
7249 continue;
7250 break;
7251 case need_qword:
7252 if (i.op[op].regs->reg_type.bitfield.qword)
7253 continue;
7254 break;
7255 }
7256
7257 as_bad (_("invalid register operand size for `%s'"),
7258 i.tm.name);
7259 return 0;
7260 }
7261 }
c0a30a9f
L
7262 }
7263
29b0f896
AM
7264 return 1;
7265}
3e73aa7c 7266
29b0f896 7267static int
543613e9 7268check_byte_reg (void)
29b0f896
AM
7269{
7270 int op;
543613e9 7271
29b0f896
AM
7272 for (op = i.operands; --op >= 0;)
7273 {
dc821c5f 7274 /* Skip non-register operands. */
bab6aec1 7275 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
7276 continue;
7277
29b0f896
AM
7278 /* If this is an eight bit register, it's OK. If it's the 16 or
7279 32 bit version of an eight bit register, we will just use the
7280 low portion, and that's OK too. */
dc821c5f 7281 if (i.types[op].bitfield.byte)
29b0f896
AM
7282 continue;
7283
5a819eb9 7284 /* I/O port address operands are OK too. */
75e5731b
JB
7285 if (i.tm.operand_types[op].bitfield.instance == RegD
7286 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
7287 continue;
7288
9706160a 7289 /* crc32 only wants its source operand checked here. */
389d00a5
JB
7290 if (i.tm.base_opcode == 0xf0
7291 && i.tm.opcode_modifier.opcodespace == SPACE_0F38
8b65b895
L
7292 && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2
7293 && op != 0)
9344ff29
L
7294 continue;
7295
29b0f896 7296 /* Any other register is bad. */
73c76375
JB
7297 as_bad (_("`%s%s' not allowed with `%s%c'"),
7298 register_prefix, i.op[op].regs->reg_name,
7299 i.tm.name, i.suffix);
7300 return 0;
29b0f896
AM
7301 }
7302 return 1;
7303}
7304
7305static int
e3bb37b5 7306check_long_reg (void)
29b0f896
AM
7307{
7308 int op;
7309
7310 for (op = i.operands; --op >= 0;)
dc821c5f 7311 /* Skip non-register operands. */
bab6aec1 7312 if (i.types[op].bitfield.class != Reg)
dc821c5f 7313 continue;
29b0f896
AM
7314 /* Reject eight bit registers, except where the template requires
7315 them. (eg. movzb) */
dc821c5f 7316 else if (i.types[op].bitfield.byte
bab6aec1 7317 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7318 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7319 && (i.tm.operand_types[op].bitfield.word
7320 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7321 {
a540244d
L
7322 as_bad (_("`%s%s' not allowed with `%s%c'"),
7323 register_prefix,
29b0f896
AM
7324 i.op[op].regs->reg_name,
7325 i.tm.name,
7326 i.suffix);
7327 return 0;
7328 }
be4c5e58
L
7329 /* Error if the e prefix on a general reg is missing. */
7330 else if (i.types[op].bitfield.word
bab6aec1 7331 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7332 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7333 && i.tm.operand_types[op].bitfield.dword)
29b0f896 7334 {
be4c5e58
L
7335 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7336 register_prefix, i.op[op].regs->reg_name,
7337 i.suffix);
7338 return 0;
252b5132 7339 }
e4630f71 7340 /* Warn if the r prefix on a general reg is present. */
dc821c5f 7341 else if (i.types[op].bitfield.qword
bab6aec1 7342 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7343 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7344 && i.tm.operand_types[op].bitfield.dword)
252b5132 7345 {
34828aad 7346 if (intel_syntax
65fca059 7347 && i.tm.opcode_modifier.toqword
3528c362 7348 && i.types[0].bitfield.class != RegSIMD)
34828aad 7349 {
ca61edf2 7350 /* Convert to QWORD. We want REX byte. */
34828aad
L
7351 i.suffix = QWORD_MNEM_SUFFIX;
7352 }
7353 else
7354 {
2b5d6a91 7355 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7356 register_prefix, i.op[op].regs->reg_name,
7357 i.suffix);
7358 return 0;
7359 }
29b0f896
AM
7360 }
7361 return 1;
7362}
252b5132 7363
29b0f896 7364static int
e3bb37b5 7365check_qword_reg (void)
29b0f896
AM
7366{
7367 int op;
252b5132 7368
29b0f896 7369 for (op = i.operands; --op >= 0; )
dc821c5f 7370 /* Skip non-register operands. */
bab6aec1 7371 if (i.types[op].bitfield.class != Reg)
dc821c5f 7372 continue;
29b0f896
AM
7373 /* Reject eight bit registers, except where the template requires
7374 them. (eg. movzb) */
dc821c5f 7375 else if (i.types[op].bitfield.byte
bab6aec1 7376 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7377 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7378 && (i.tm.operand_types[op].bitfield.word
7379 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7380 {
a540244d
L
7381 as_bad (_("`%s%s' not allowed with `%s%c'"),
7382 register_prefix,
29b0f896
AM
7383 i.op[op].regs->reg_name,
7384 i.tm.name,
7385 i.suffix);
7386 return 0;
7387 }
e4630f71 7388 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
7389 else if ((i.types[op].bitfield.word
7390 || i.types[op].bitfield.dword)
bab6aec1 7391 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7392 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7393 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
7394 {
7395 /* Prohibit these changes in the 64bit mode, since the
7396 lowering is more complicated. */
34828aad 7397 if (intel_syntax
ca61edf2 7398 && i.tm.opcode_modifier.todword
3528c362 7399 && i.types[0].bitfield.class != RegSIMD)
34828aad 7400 {
ca61edf2 7401 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
7402 i.suffix = LONG_MNEM_SUFFIX;
7403 }
7404 else
7405 {
2b5d6a91 7406 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7407 register_prefix, i.op[op].regs->reg_name,
7408 i.suffix);
7409 return 0;
7410 }
252b5132 7411 }
29b0f896
AM
7412 return 1;
7413}
252b5132 7414
29b0f896 7415static int
e3bb37b5 7416check_word_reg (void)
29b0f896
AM
7417{
7418 int op;
7419 for (op = i.operands; --op >= 0;)
dc821c5f 7420 /* Skip non-register operands. */
bab6aec1 7421 if (i.types[op].bitfield.class != Reg)
dc821c5f 7422 continue;
29b0f896
AM
7423 /* Reject eight bit registers, except where the template requires
7424 them. (eg. movzb) */
dc821c5f 7425 else if (i.types[op].bitfield.byte
bab6aec1 7426 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7427 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7428 && (i.tm.operand_types[op].bitfield.word
7429 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7430 {
a540244d
L
7431 as_bad (_("`%s%s' not allowed with `%s%c'"),
7432 register_prefix,
29b0f896
AM
7433 i.op[op].regs->reg_name,
7434 i.tm.name,
7435 i.suffix);
7436 return 0;
7437 }
9706160a
JB
7438 /* Error if the e or r prefix on a general reg is present. */
7439 else if ((i.types[op].bitfield.dword
dc821c5f 7440 || i.types[op].bitfield.qword)
bab6aec1 7441 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7442 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7443 && i.tm.operand_types[op].bitfield.word)
252b5132 7444 {
9706160a
JB
7445 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7446 register_prefix, i.op[op].regs->reg_name,
7447 i.suffix);
7448 return 0;
29b0f896
AM
7449 }
7450 return 1;
7451}
252b5132 7452
29b0f896 7453static int
40fb9820 7454update_imm (unsigned int j)
29b0f896 7455{
bc0844ae 7456 i386_operand_type overlap = i.types[j];
40fb9820
L
7457 if ((overlap.bitfield.imm8
7458 || overlap.bitfield.imm8s
7459 || overlap.bitfield.imm16
7460 || overlap.bitfield.imm32
7461 || overlap.bitfield.imm32s
7462 || overlap.bitfield.imm64)
0dfbf9d7
L
7463 && !operand_type_equal (&overlap, &imm8)
7464 && !operand_type_equal (&overlap, &imm8s)
7465 && !operand_type_equal (&overlap, &imm16)
7466 && !operand_type_equal (&overlap, &imm32)
7467 && !operand_type_equal (&overlap, &imm32s)
7468 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
7469 {
7470 if (i.suffix)
7471 {
40fb9820
L
7472 i386_operand_type temp;
7473
0dfbf9d7 7474 operand_type_set (&temp, 0);
7ab9ffdd 7475 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
7476 {
7477 temp.bitfield.imm8 = overlap.bitfield.imm8;
7478 temp.bitfield.imm8s = overlap.bitfield.imm8s;
7479 }
7480 else if (i.suffix == WORD_MNEM_SUFFIX)
7481 temp.bitfield.imm16 = overlap.bitfield.imm16;
7482 else if (i.suffix == QWORD_MNEM_SUFFIX)
7483 {
7484 temp.bitfield.imm64 = overlap.bitfield.imm64;
7485 temp.bitfield.imm32s = overlap.bitfield.imm32s;
7486 }
7487 else
7488 temp.bitfield.imm32 = overlap.bitfield.imm32;
7489 overlap = temp;
29b0f896 7490 }
0dfbf9d7
L
7491 else if (operand_type_equal (&overlap, &imm16_32_32s)
7492 || operand_type_equal (&overlap, &imm16_32)
7493 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 7494 {
40fb9820 7495 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 7496 overlap = imm16;
40fb9820 7497 else
65da13b5 7498 overlap = imm32s;
29b0f896 7499 }
8bbb3ad8
JB
7500 else if (i.prefix[REX_PREFIX] & REX_W)
7501 overlap = operand_type_and (overlap, imm32s);
7502 else if (i.prefix[DATA_PREFIX])
7503 overlap = operand_type_and (overlap,
7504 flag_code != CODE_16BIT ? imm16 : imm32);
0dfbf9d7
L
7505 if (!operand_type_equal (&overlap, &imm8)
7506 && !operand_type_equal (&overlap, &imm8s)
7507 && !operand_type_equal (&overlap, &imm16)
7508 && !operand_type_equal (&overlap, &imm32)
7509 && !operand_type_equal (&overlap, &imm32s)
7510 && !operand_type_equal (&overlap, &imm64))
29b0f896 7511 {
4eed87de
AM
7512 as_bad (_("no instruction mnemonic suffix given; "
7513 "can't determine immediate size"));
29b0f896
AM
7514 return 0;
7515 }
7516 }
40fb9820 7517 i.types[j] = overlap;
29b0f896 7518
40fb9820
L
7519 return 1;
7520}
7521
7522static int
7523finalize_imm (void)
7524{
bc0844ae 7525 unsigned int j, n;
29b0f896 7526
bc0844ae
L
7527 /* Update the first 2 immediate operands. */
7528 n = i.operands > 2 ? 2 : i.operands;
7529 if (n)
7530 {
7531 for (j = 0; j < n; j++)
7532 if (update_imm (j) == 0)
7533 return 0;
40fb9820 7534
bc0844ae
L
7535 /* The 3rd operand can't be immediate operand. */
7536 gas_assert (operand_type_check (i.types[2], imm) == 0);
7537 }
29b0f896
AM
7538
7539 return 1;
7540}
7541
7542static int
e3bb37b5 7543process_operands (void)
29b0f896
AM
7544{
7545 /* Default segment register this instruction will use for memory
7546 accesses. 0 means unknown. This is only for optimizing out
7547 unnecessary segment overrides. */
5e042380 7548 const reg_entry *default_seg = NULL;
29b0f896 7549
a5aeccd9
JB
7550 if (i.tm.opcode_modifier.sse2avx)
7551 {
7552 /* Legacy encoded insns allow explicit REX prefixes, so these prefixes
7553 need converting. */
7554 i.rex |= i.prefix[REX_PREFIX] & (REX_W | REX_R | REX_X | REX_B);
7555 i.prefix[REX_PREFIX] = 0;
7556 i.rex_encoding = 0;
7557 }
c423d21a
JB
7558 /* ImmExt should be processed after SSE2AVX. */
7559 else if (i.tm.opcode_modifier.immext)
7560 process_immext ();
a5aeccd9 7561
2426c15f 7562 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 7563 {
91d6fa6a
NC
7564 unsigned int dupl = i.operands;
7565 unsigned int dest = dupl - 1;
9fcfb3d7
L
7566 unsigned int j;
7567
c0f3af97 7568 /* The destination must be an xmm register. */
9c2799c2 7569 gas_assert (i.reg_operands
91d6fa6a 7570 && MAX_OPERANDS > dupl
7ab9ffdd 7571 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 7572
75e5731b 7573 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7574 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 7575 {
8cd7925b 7576 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
7577 {
7578 /* Keep xmm0 for instructions with VEX prefix and 3
7579 sources. */
75e5731b 7580 i.tm.operand_types[0].bitfield.instance = InstanceNone;
3528c362 7581 i.tm.operand_types[0].bitfield.class = RegSIMD;
c0f3af97
L
7582 goto duplicate;
7583 }
e2ec9d29 7584 else
c0f3af97
L
7585 {
7586 /* We remove the first xmm0 and keep the number of
7587 operands unchanged, which in fact duplicates the
7588 destination. */
7589 for (j = 1; j < i.operands; j++)
7590 {
7591 i.op[j - 1] = i.op[j];
7592 i.types[j - 1] = i.types[j];
7593 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
8dc0818e 7594 i.flags[j - 1] = i.flags[j];
c0f3af97
L
7595 }
7596 }
7597 }
7598 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 7599 {
91d6fa6a 7600 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
7601 && (i.tm.opcode_modifier.vexsources
7602 == VEX3SOURCES));
c0f3af97
L
7603
7604 /* Add the implicit xmm0 for instructions with VEX prefix
7605 and 3 sources. */
7606 for (j = i.operands; j > 0; j--)
7607 {
7608 i.op[j] = i.op[j - 1];
7609 i.types[j] = i.types[j - 1];
7610 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 7611 i.flags[j] = i.flags[j - 1];
c0f3af97
L
7612 }
7613 i.op[0].regs
629310ab 7614 = (const reg_entry *) str_hash_find (reg_hash, "xmm0");
7ab9ffdd 7615 i.types[0] = regxmm;
c0f3af97
L
7616 i.tm.operand_types[0] = regxmm;
7617
7618 i.operands += 2;
7619 i.reg_operands += 2;
7620 i.tm.operands += 2;
7621
91d6fa6a 7622 dupl++;
c0f3af97 7623 dest++;
91d6fa6a
NC
7624 i.op[dupl] = i.op[dest];
7625 i.types[dupl] = i.types[dest];
7626 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7627 i.flags[dupl] = i.flags[dest];
e2ec9d29 7628 }
c0f3af97
L
7629 else
7630 {
dc1e8a47 7631 duplicate:
c0f3af97
L
7632 i.operands++;
7633 i.reg_operands++;
7634 i.tm.operands++;
7635
91d6fa6a
NC
7636 i.op[dupl] = i.op[dest];
7637 i.types[dupl] = i.types[dest];
7638 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7639 i.flags[dupl] = i.flags[dest];
c0f3af97
L
7640 }
7641
7642 if (i.tm.opcode_modifier.immext)
7643 process_immext ();
7644 }
75e5731b 7645 else if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7646 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
7647 {
7648 unsigned int j;
7649
9fcfb3d7
L
7650 for (j = 1; j < i.operands; j++)
7651 {
7652 i.op[j - 1] = i.op[j];
7653 i.types[j - 1] = i.types[j];
7654
7655 /* We need to adjust fields in i.tm since they are used by
7656 build_modrm_byte. */
7657 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
7658
7659 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
7660 }
7661
e2ec9d29
L
7662 i.operands--;
7663 i.reg_operands--;
e2ec9d29
L
7664 i.tm.operands--;
7665 }
920d2ddc
IT
7666 else if (i.tm.opcode_modifier.implicitquadgroup)
7667 {
a477a8c4
JB
7668 unsigned int regnum, first_reg_in_group, last_reg_in_group;
7669
920d2ddc 7670 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 7671 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
7672 regnum = register_number (i.op[1].regs);
7673 first_reg_in_group = regnum & ~3;
7674 last_reg_in_group = first_reg_in_group + 3;
7675 if (regnum != first_reg_in_group)
7676 as_warn (_("source register `%s%s' implicitly denotes"
7677 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
7678 register_prefix, i.op[1].regs->reg_name,
7679 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
7680 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
7681 i.tm.name);
7682 }
e2ec9d29
L
7683 else if (i.tm.opcode_modifier.regkludge)
7684 {
7685 /* The imul $imm, %reg instruction is converted into
7686 imul $imm, %reg, %reg, and the clr %reg instruction
7687 is converted into xor %reg, %reg. */
7688
7689 unsigned int first_reg_op;
7690
7691 if (operand_type_check (i.types[0], reg))
7692 first_reg_op = 0;
7693 else
7694 first_reg_op = 1;
7695 /* Pretend we saw the extra register operand. */
9c2799c2 7696 gas_assert (i.reg_operands == 1
7ab9ffdd 7697 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
7698 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
7699 i.types[first_reg_op + 1] = i.types[first_reg_op];
7700 i.operands++;
7701 i.reg_operands++;
29b0f896
AM
7702 }
7703
85b80b0f 7704 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
7705 {
7706 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
7707 must be put into the modrm byte). Now, we make the modrm and
7708 index base bytes based on all the info we've collected. */
29b0f896
AM
7709
7710 default_seg = build_modrm_byte ();
7711 }
00cee14f 7712 else if (i.types[0].bitfield.class == SReg)
85b80b0f
JB
7713 {
7714 if (flag_code != CODE_64BIT
7715 ? i.tm.base_opcode == POP_SEG_SHORT
7716 && i.op[0].regs->reg_num == 1
389d00a5 7717 : (i.tm.base_opcode | 1) == (POP_SEG386_SHORT & 0xff)
85b80b0f
JB
7718 && i.op[0].regs->reg_num < 4)
7719 {
7720 as_bad (_("you can't `%s %s%s'"),
7721 i.tm.name, register_prefix, i.op[0].regs->reg_name);
7722 return 0;
7723 }
389d00a5
JB
7724 if (i.op[0].regs->reg_num > 3
7725 && i.tm.opcode_modifier.opcodespace == SPACE_BASE )
85b80b0f 7726 {
389d00a5
JB
7727 i.tm.base_opcode ^= (POP_SEG_SHORT ^ POP_SEG386_SHORT) & 0xff;
7728 i.tm.opcode_modifier.opcodespace = SPACE_0F;
85b80b0f
JB
7729 }
7730 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
7731 }
389d00a5
JB
7732 else if (i.tm.opcode_modifier.opcodespace == SPACE_BASE
7733 && (i.tm.base_opcode & ~3) == MOV_AX_DISP32)
29b0f896 7734 {
5e042380 7735 default_seg = reg_ds;
29b0f896 7736 }
40fb9820 7737 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
7738 {
7739 /* For the string instructions that allow a segment override
7740 on one of their operands, the default segment is ds. */
5e042380 7741 default_seg = reg_ds;
29b0f896 7742 }
50128d0c 7743 else if (i.short_form)
85b80b0f
JB
7744 {
7745 /* The register or float register operand is in operand
7746 0 or 1. */
bab6aec1 7747 unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
85b80b0f
JB
7748
7749 /* Register goes in low 3 bits of opcode. */
7750 i.tm.base_opcode |= i.op[op].regs->reg_num;
7751 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7752 i.rex |= REX_B;
7753 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
7754 {
7755 /* Warn about some common errors, but press on regardless.
7756 The first case can be generated by gcc (<= 2.8.1). */
7757 if (i.operands == 2)
7758 {
7759 /* Reversed arguments on faddp, fsubp, etc. */
7760 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
7761 register_prefix, i.op[!intel_syntax].regs->reg_name,
7762 register_prefix, i.op[intel_syntax].regs->reg_name);
7763 }
7764 else
7765 {
7766 /* Extraneous `l' suffix on fp insn. */
7767 as_warn (_("translating to `%s %s%s'"), i.tm.name,
7768 register_prefix, i.op[0].regs->reg_name);
7769 }
7770 }
7771 }
29b0f896 7772
514a8bb0 7773 if ((i.seg[0] || i.prefix[SEG_PREFIX])
514a8bb0 7774 && i.tm.base_opcode == 0x8d /* lea */
35648716 7775 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
514a8bb0 7776 && !is_any_vex_encoding(&i.tm))
92334ad2
JB
7777 {
7778 if (!quiet_warnings)
7779 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
7780 if (optimize)
7781 {
7782 i.seg[0] = NULL;
7783 i.prefix[SEG_PREFIX] = 0;
7784 }
7785 }
52271982
AM
7786
7787 /* If a segment was explicitly specified, and the specified segment
b6773884
JB
7788 is neither the default nor the one already recorded from a prefix,
7789 use an opcode prefix to select it. If we never figured out what
7790 the default segment is, then default_seg will be zero at this
7791 point, and the specified segment prefix will always be used. */
7792 if (i.seg[0]
7793 && i.seg[0] != default_seg
5e042380 7794 && i386_seg_prefixes[i.seg[0]->reg_num] != i.prefix[SEG_PREFIX])
29b0f896 7795 {
5e042380 7796 if (!add_prefix (i386_seg_prefixes[i.seg[0]->reg_num]))
29b0f896
AM
7797 return 0;
7798 }
7799 return 1;
7800}
7801
a5aeccd9 7802static INLINE void set_rex_vrex (const reg_entry *r, unsigned int rex_bit,
5b7c81bd 7803 bool do_sse2avx)
a5aeccd9
JB
7804{
7805 if (r->reg_flags & RegRex)
7806 {
7807 if (i.rex & rex_bit)
7808 as_bad (_("same type of prefix used twice"));
7809 i.rex |= rex_bit;
7810 }
7811 else if (do_sse2avx && (i.rex & rex_bit) && i.vex.register_specifier)
7812 {
7813 gas_assert (i.vex.register_specifier == r);
7814 i.vex.register_specifier += 8;
7815 }
7816
7817 if (r->reg_flags & RegVRex)
7818 i.vrex |= rex_bit;
7819}
7820
5e042380 7821static const reg_entry *
e3bb37b5 7822build_modrm_byte (void)
29b0f896 7823{
5e042380 7824 const reg_entry *default_seg = NULL;
c0f3af97 7825 unsigned int source, dest;
8cd7925b 7826 int vex_3_sources;
c0f3af97 7827
8cd7925b 7828 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
7829 if (vex_3_sources)
7830 {
91d6fa6a 7831 unsigned int nds, reg_slot;
4c2c6516 7832 expressionS *exp;
c0f3af97 7833
6b8d3588 7834 dest = i.operands - 1;
c0f3af97 7835 nds = dest - 1;
922d8de8 7836
a683cc34 7837 /* There are 2 kinds of instructions:
bed3d976 7838 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 7839 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 7840 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 7841 ZMM register.
bed3d976 7842 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 7843 plus 1 memory operand, with VexXDS. */
922d8de8 7844 gas_assert ((i.reg_operands == 4
bed3d976
JB
7845 || (i.reg_operands == 3 && i.mem_operands == 1))
7846 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323 7847 && i.tm.opcode_modifier.vexw
3528c362 7848 && i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 7849
48db9223
JB
7850 /* If VexW1 is set, the first non-immediate operand is the source and
7851 the second non-immediate one is encoded in the immediate operand. */
7852 if (i.tm.opcode_modifier.vexw == VEXW1)
7853 {
7854 source = i.imm_operands;
7855 reg_slot = i.imm_operands + 1;
7856 }
7857 else
7858 {
7859 source = i.imm_operands + 1;
7860 reg_slot = i.imm_operands;
7861 }
7862
a683cc34 7863 if (i.imm_operands == 0)
bed3d976
JB
7864 {
7865 /* When there is no immediate operand, generate an 8bit
7866 immediate operand to encode the first operand. */
7867 exp = &im_expressions[i.imm_operands++];
7868 i.op[i.operands].imms = exp;
7869 i.types[i.operands] = imm8;
7870 i.operands++;
7871
3528c362 7872 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
bed3d976
JB
7873 exp->X_op = O_constant;
7874 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
7875 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
7876 }
922d8de8 7877 else
bed3d976 7878 {
9d3bf266
JB
7879 gas_assert (i.imm_operands == 1);
7880 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
7881 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 7882
9d3bf266
JB
7883 /* Turn on Imm8 again so that output_imm will generate it. */
7884 i.types[0].bitfield.imm8 = 1;
bed3d976 7885
3528c362 7886 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
9d3bf266 7887 i.op[0].imms->X_add_number
bed3d976 7888 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 7889 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 7890 }
a683cc34 7891
3528c362 7892 gas_assert (i.tm.operand_types[nds].bitfield.class == RegSIMD);
dae39acc 7893 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
7894 }
7895 else
7896 source = dest = 0;
29b0f896
AM
7897
7898 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
7899 implicit registers do not count. If there are 3 register
7900 operands, it must be a instruction with VexNDS. For a
7901 instruction with VexNDD, the destination register is encoded
7902 in VEX prefix. If there are 4 register operands, it must be
7903 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
7904 if (i.mem_operands == 0
7905 && ((i.reg_operands == 2
2426c15f 7906 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 7907 || (i.reg_operands == 3
2426c15f 7908 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 7909 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 7910 {
cab737b9
L
7911 switch (i.operands)
7912 {
7913 case 2:
7914 source = 0;
7915 break;
7916 case 3:
c81128dc
L
7917 /* When there are 3 operands, one of them may be immediate,
7918 which may be the first or the last operand. Otherwise,
c0f3af97
L
7919 the first operand must be shift count register (cl) or it
7920 is an instruction with VexNDS. */
9c2799c2 7921 gas_assert (i.imm_operands == 1
7ab9ffdd 7922 || (i.imm_operands == 0
2426c15f 7923 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
75e5731b
JB
7924 || (i.types[0].bitfield.instance == RegC
7925 && i.types[0].bitfield.byte))));
40fb9820 7926 if (operand_type_check (i.types[0], imm)
75e5731b
JB
7927 || (i.types[0].bitfield.instance == RegC
7928 && i.types[0].bitfield.byte))
40fb9820
L
7929 source = 1;
7930 else
7931 source = 0;
cab737b9
L
7932 break;
7933 case 4:
368d64cc
L
7934 /* When there are 4 operands, the first two must be 8bit
7935 immediate operands. The source operand will be the 3rd
c0f3af97
L
7936 one.
7937
7938 For instructions with VexNDS, if the first operand
7939 an imm8, the source operand is the 2nd one. If the last
7940 operand is imm8, the source operand is the first one. */
9c2799c2 7941 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
7942 && i.types[0].bitfield.imm8
7943 && i.types[1].bitfield.imm8)
2426c15f 7944 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
7945 && i.imm_operands == 1
7946 && (i.types[0].bitfield.imm8
43234a1e 7947 || i.types[i.operands - 1].bitfield.imm8
ca5312a2 7948 || i.rounding.type != rc_none)));
9f2670f2
L
7949 if (i.imm_operands == 2)
7950 source = 2;
7951 else
c0f3af97
L
7952 {
7953 if (i.types[0].bitfield.imm8)
7954 source = 1;
7955 else
7956 source = 0;
7957 }
c0f3af97
L
7958 break;
7959 case 5:
e771e7c9 7960 if (is_evex_encoding (&i.tm))
43234a1e
L
7961 {
7962 /* For EVEX instructions, when there are 5 operands, the
7963 first one must be immediate operand. If the second one
7964 is immediate operand, the source operand is the 3th
7965 one. If the last one is immediate operand, the source
7966 operand is the 2nd one. */
7967 gas_assert (i.imm_operands == 2
7968 && i.tm.opcode_modifier.sae
7969 && operand_type_check (i.types[0], imm));
7970 if (operand_type_check (i.types[1], imm))
7971 source = 2;
7972 else if (operand_type_check (i.types[4], imm))
7973 source = 1;
7974 else
7975 abort ();
7976 }
cab737b9
L
7977 break;
7978 default:
7979 abort ();
7980 }
7981
c0f3af97
L
7982 if (!vex_3_sources)
7983 {
7984 dest = source + 1;
7985
43234a1e
L
7986 /* RC/SAE operand could be between DEST and SRC. That happens
7987 when one operand is GPR and the other one is XMM/YMM/ZMM
7988 register. */
ca5312a2 7989 if (i.rounding.type != rc_none && i.rounding.operand == dest)
43234a1e
L
7990 dest++;
7991
2426c15f 7992 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 7993 {
43234a1e 7994 /* For instructions with VexNDS, the register-only source
c5d0745b 7995 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
dfd69174 7996 register. It is encoded in VEX prefix. */
f12dc422
L
7997
7998 i386_operand_type op;
7999 unsigned int vvvv;
8000
c2ecccb3
L
8001 /* Swap two source operands if needed. */
8002 if (i.tm.opcode_modifier.swapsources)
f12dc422
L
8003 {
8004 vvvv = source;
8005 source = dest;
8006 }
8007 else
8008 vvvv = dest;
8009
8010 op = i.tm.operand_types[vvvv];
c0f3af97 8011 if ((dest + 1) >= i.operands
bab6aec1 8012 || ((op.bitfield.class != Reg
dc821c5f 8013 || (!op.bitfield.dword && !op.bitfield.qword))
3528c362 8014 && op.bitfield.class != RegSIMD
43234a1e 8015 && !operand_type_equal (&op, &regmask)))
c0f3af97 8016 abort ();
f12dc422 8017 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
8018 dest++;
8019 }
8020 }
29b0f896
AM
8021
8022 i.rm.mode = 3;
dfd69174
JB
8023 /* One of the register operands will be encoded in the i.rm.reg
8024 field, the other in the combined i.rm.mode and i.rm.regmem
29b0f896
AM
8025 fields. If no form of this instruction supports a memory
8026 destination operand, then we assume the source operand may
8027 sometimes be a memory operand and so we need to store the
8028 destination in the i.rm.reg field. */
dfd69174 8029 if (!i.tm.opcode_modifier.regmem
40fb9820 8030 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
8031 {
8032 i.rm.reg = i.op[dest].regs->reg_num;
8033 i.rm.regmem = i.op[source].regs->reg_num;
a5aeccd9 8034 set_rex_vrex (i.op[dest].regs, REX_R, i.tm.opcode_modifier.sse2avx);
5b7c81bd 8035 set_rex_vrex (i.op[source].regs, REX_B, false);
29b0f896
AM
8036 }
8037 else
8038 {
8039 i.rm.reg = i.op[source].regs->reg_num;
8040 i.rm.regmem = i.op[dest].regs->reg_num;
a5aeccd9 8041 set_rex_vrex (i.op[dest].regs, REX_B, i.tm.opcode_modifier.sse2avx);
5b7c81bd 8042 set_rex_vrex (i.op[source].regs, REX_R, false);
29b0f896 8043 }
e0c7f900 8044 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 8045 {
4a5c67ed 8046 if (i.types[!i.tm.opcode_modifier.regmem].bitfield.class != RegCR)
c4a530c5 8047 abort ();
e0c7f900 8048 i.rex &= ~REX_R;
c4a530c5
JB
8049 add_prefix (LOCK_PREFIX_OPCODE);
8050 }
29b0f896
AM
8051 }
8052 else
8053 { /* If it's not 2 reg operands... */
c0f3af97
L
8054 unsigned int mem;
8055
29b0f896
AM
8056 if (i.mem_operands)
8057 {
8058 unsigned int fake_zero_displacement = 0;
99018f42 8059 unsigned int op;
4eed87de 8060
7ab9ffdd 8061 for (op = 0; op < i.operands; op++)
8dc0818e 8062 if (i.flags[op] & Operand_Mem)
7ab9ffdd 8063 break;
7ab9ffdd 8064 gas_assert (op < i.operands);
29b0f896 8065
63112cd6 8066 if (i.tm.opcode_modifier.sib)
6c30d220 8067 {
260cd341
LC
8068 /* The index register of VSIB shouldn't be RegIZ. */
8069 if (i.tm.opcode_modifier.sib != SIBMEM
8070 && i.index_reg->reg_num == RegIZ)
6c30d220
L
8071 abort ();
8072
8073 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8074 if (!i.base_reg)
8075 {
8076 i.sib.base = NO_BASE_REGISTER;
8077 i.sib.scale = i.log2_scale_factor;
8078 i.types[op].bitfield.disp8 = 0;
8079 i.types[op].bitfield.disp16 = 0;
8080 i.types[op].bitfield.disp64 = 0;
43083a50 8081 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
6c30d220
L
8082 {
8083 /* Must be 32 bit */
8084 i.types[op].bitfield.disp32 = 1;
8085 i.types[op].bitfield.disp32s = 0;
8086 }
8087 else
8088 {
8089 i.types[op].bitfield.disp32 = 0;
8090 i.types[op].bitfield.disp32s = 1;
8091 }
8092 }
260cd341
LC
8093
8094 /* Since the mandatory SIB always has index register, so
8095 the code logic remains unchanged. The non-mandatory SIB
8096 without index register is allowed and will be handled
8097 later. */
8098 if (i.index_reg)
8099 {
8100 if (i.index_reg->reg_num == RegIZ)
8101 i.sib.index = NO_INDEX_REGISTER;
8102 else
8103 i.sib.index = i.index_reg->reg_num;
5b7c81bd 8104 set_rex_vrex (i.index_reg, REX_X, false);
260cd341 8105 }
6c30d220
L
8106 }
8107
5e042380 8108 default_seg = reg_ds;
29b0f896
AM
8109
8110 if (i.base_reg == 0)
8111 {
8112 i.rm.mode = 0;
8113 if (!i.disp_operands)
9bb129e8 8114 fake_zero_displacement = 1;
29b0f896
AM
8115 if (i.index_reg == 0)
8116 {
73053c1f
JB
8117 i386_operand_type newdisp;
8118
260cd341
LC
8119 /* Both check for VSIB and mandatory non-vector SIB. */
8120 gas_assert (!i.tm.opcode_modifier.sib
8121 || i.tm.opcode_modifier.sib == SIBMEM);
29b0f896 8122 /* Operand is just <disp> */
20f0a1fc 8123 if (flag_code == CODE_64BIT)
29b0f896
AM
8124 {
8125 /* 64bit mode overwrites the 32bit absolute
8126 addressing by RIP relative addressing and
8127 absolute addressing is encoded by one of the
8128 redundant SIB forms. */
8129 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8130 i.sib.base = NO_BASE_REGISTER;
8131 i.sib.index = NO_INDEX_REGISTER;
73053c1f 8132 newdisp = (!i.prefix[ADDR_PREFIX] ? disp32s : disp32);
20f0a1fc 8133 }
fc225355
L
8134 else if ((flag_code == CODE_16BIT)
8135 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
8136 {
8137 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 8138 newdisp = disp16;
20f0a1fc
NC
8139 }
8140 else
8141 {
8142 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 8143 newdisp = disp32;
29b0f896 8144 }
73053c1f
JB
8145 i.types[op] = operand_type_and_not (i.types[op], anydisp);
8146 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 8147 }
63112cd6 8148 else if (!i.tm.opcode_modifier.sib)
29b0f896 8149 {
6c30d220 8150 /* !i.base_reg && i.index_reg */
e968fc9b 8151 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8152 i.sib.index = NO_INDEX_REGISTER;
8153 else
8154 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8155 i.sib.base = NO_BASE_REGISTER;
8156 i.sib.scale = i.log2_scale_factor;
8157 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
8158 i.types[op].bitfield.disp8 = 0;
8159 i.types[op].bitfield.disp16 = 0;
8160 i.types[op].bitfield.disp64 = 0;
43083a50 8161 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
40fb9820
L
8162 {
8163 /* Must be 32 bit */
8164 i.types[op].bitfield.disp32 = 1;
8165 i.types[op].bitfield.disp32s = 0;
8166 }
29b0f896 8167 else
40fb9820
L
8168 {
8169 i.types[op].bitfield.disp32 = 0;
8170 i.types[op].bitfield.disp32s = 1;
8171 }
29b0f896 8172 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8173 i.rex |= REX_X;
29b0f896
AM
8174 }
8175 }
8176 /* RIP addressing for 64bit mode. */
e968fc9b 8177 else if (i.base_reg->reg_num == RegIP)
29b0f896 8178 {
63112cd6 8179 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896 8180 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
8181 i.types[op].bitfield.disp8 = 0;
8182 i.types[op].bitfield.disp16 = 0;
8183 i.types[op].bitfield.disp32 = 0;
8184 i.types[op].bitfield.disp32s = 1;
8185 i.types[op].bitfield.disp64 = 0;
71903a11 8186 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
8187 if (! i.disp_operands)
8188 fake_zero_displacement = 1;
29b0f896 8189 }
dc821c5f 8190 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 8191 {
63112cd6 8192 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896
AM
8193 switch (i.base_reg->reg_num)
8194 {
8195 case 3: /* (%bx) */
8196 if (i.index_reg == 0)
8197 i.rm.regmem = 7;
8198 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
8199 i.rm.regmem = i.index_reg->reg_num - 6;
8200 break;
8201 case 5: /* (%bp) */
5e042380 8202 default_seg = reg_ss;
29b0f896
AM
8203 if (i.index_reg == 0)
8204 {
8205 i.rm.regmem = 6;
40fb9820 8206 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
8207 {
8208 /* fake (%bp) into 0(%bp) */
41eb8e88 8209 if (i.disp_encoding == disp_encoding_16bit)
1a02d6b0
L
8210 i.types[op].bitfield.disp16 = 1;
8211 else
8212 i.types[op].bitfield.disp8 = 1;
252b5132 8213 fake_zero_displacement = 1;
29b0f896
AM
8214 }
8215 }
8216 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
8217 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
8218 break;
8219 default: /* (%si) -> 4 or (%di) -> 5 */
8220 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
8221 }
41eb8e88
L
8222 if (!fake_zero_displacement
8223 && !i.disp_operands
8224 && i.disp_encoding)
8225 {
8226 fake_zero_displacement = 1;
8227 if (i.disp_encoding == disp_encoding_8bit)
8228 i.types[op].bitfield.disp8 = 1;
8229 else
8230 i.types[op].bitfield.disp16 = 1;
8231 }
29b0f896
AM
8232 i.rm.mode = mode_from_disp_size (i.types[op]);
8233 }
8234 else /* i.base_reg and 32/64 bit mode */
8235 {
8236 if (flag_code == CODE_64BIT
40fb9820
L
8237 && operand_type_check (i.types[op], disp))
8238 {
73053c1f
JB
8239 i.types[op].bitfield.disp16 = 0;
8240 i.types[op].bitfield.disp64 = 0;
40fb9820 8241 if (i.prefix[ADDR_PREFIX] == 0)
73053c1f
JB
8242 {
8243 i.types[op].bitfield.disp32 = 0;
8244 i.types[op].bitfield.disp32s = 1;
8245 }
40fb9820 8246 else
73053c1f
JB
8247 {
8248 i.types[op].bitfield.disp32 = 1;
8249 i.types[op].bitfield.disp32s = 0;
8250 }
40fb9820 8251 }
20f0a1fc 8252
63112cd6 8253 if (!i.tm.opcode_modifier.sib)
6c30d220 8254 i.rm.regmem = i.base_reg->reg_num;
29b0f896 8255 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 8256 i.rex |= REX_B;
29b0f896
AM
8257 i.sib.base = i.base_reg->reg_num;
8258 /* x86-64 ignores REX prefix bit here to avoid decoder
8259 complications. */
848930b2
JB
8260 if (!(i.base_reg->reg_flags & RegRex)
8261 && (i.base_reg->reg_num == EBP_REG_NUM
8262 || i.base_reg->reg_num == ESP_REG_NUM))
5e042380 8263 default_seg = reg_ss;
848930b2 8264 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 8265 {
848930b2 8266 fake_zero_displacement = 1;
1a02d6b0
L
8267 if (i.disp_encoding == disp_encoding_32bit)
8268 i.types[op].bitfield.disp32 = 1;
8269 else
8270 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
8271 }
8272 i.sib.scale = i.log2_scale_factor;
8273 if (i.index_reg == 0)
8274 {
260cd341
LC
8275 /* Only check for VSIB. */
8276 gas_assert (i.tm.opcode_modifier.sib != VECSIB128
8277 && i.tm.opcode_modifier.sib != VECSIB256
8278 && i.tm.opcode_modifier.sib != VECSIB512);
8279
29b0f896
AM
8280 /* <disp>(%esp) becomes two byte modrm with no index
8281 register. We've already stored the code for esp
8282 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
8283 Any base register besides %esp will not use the
8284 extra modrm byte. */
8285 i.sib.index = NO_INDEX_REGISTER;
29b0f896 8286 }
63112cd6 8287 else if (!i.tm.opcode_modifier.sib)
29b0f896 8288 {
e968fc9b 8289 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8290 i.sib.index = NO_INDEX_REGISTER;
8291 else
8292 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8293 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8294 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8295 i.rex |= REX_X;
29b0f896 8296 }
67a4f2b7
AO
8297
8298 if (i.disp_operands
8299 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
8300 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
8301 i.rm.mode = 0;
8302 else
a501d77e
L
8303 {
8304 if (!fake_zero_displacement
8305 && !i.disp_operands
8306 && i.disp_encoding)
8307 {
8308 fake_zero_displacement = 1;
8309 if (i.disp_encoding == disp_encoding_8bit)
8310 i.types[op].bitfield.disp8 = 1;
8311 else
8312 i.types[op].bitfield.disp32 = 1;
8313 }
8314 i.rm.mode = mode_from_disp_size (i.types[op]);
8315 }
29b0f896 8316 }
252b5132 8317
29b0f896
AM
8318 if (fake_zero_displacement)
8319 {
8320 /* Fakes a zero displacement assuming that i.types[op]
8321 holds the correct displacement size. */
8322 expressionS *exp;
8323
9c2799c2 8324 gas_assert (i.op[op].disps == 0);
29b0f896
AM
8325 exp = &disp_expressions[i.disp_operands++];
8326 i.op[op].disps = exp;
8327 exp->X_op = O_constant;
8328 exp->X_add_number = 0;
8329 exp->X_add_symbol = (symbolS *) 0;
8330 exp->X_op_symbol = (symbolS *) 0;
8331 }
c0f3af97
L
8332
8333 mem = op;
29b0f896 8334 }
c0f3af97
L
8335 else
8336 mem = ~0;
252b5132 8337
8c43a48b 8338 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
8339 {
8340 if (operand_type_check (i.types[0], imm))
8341 i.vex.register_specifier = NULL;
8342 else
8343 {
8344 /* VEX.vvvv encodes one of the sources when the first
8345 operand is not an immediate. */
1ef99a7b 8346 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8347 i.vex.register_specifier = i.op[0].regs;
8348 else
8349 i.vex.register_specifier = i.op[1].regs;
8350 }
8351
8352 /* Destination is a XMM register encoded in the ModRM.reg
8353 and VEX.R bit. */
8354 i.rm.reg = i.op[2].regs->reg_num;
8355 if ((i.op[2].regs->reg_flags & RegRex) != 0)
8356 i.rex |= REX_R;
8357
8358 /* ModRM.rm and VEX.B encodes the other source. */
8359 if (!i.mem_operands)
8360 {
8361 i.rm.mode = 3;
8362
1ef99a7b 8363 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8364 i.rm.regmem = i.op[1].regs->reg_num;
8365 else
8366 i.rm.regmem = i.op[0].regs->reg_num;
8367
8368 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8369 i.rex |= REX_B;
8370 }
8371 }
2426c15f 8372 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
8373 {
8374 i.vex.register_specifier = i.op[2].regs;
8375 if (!i.mem_operands)
8376 {
8377 i.rm.mode = 3;
8378 i.rm.regmem = i.op[1].regs->reg_num;
8379 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8380 i.rex |= REX_B;
8381 }
8382 }
29b0f896
AM
8383 /* Fill in i.rm.reg or i.rm.regmem field with register operand
8384 (if any) based on i.tm.extension_opcode. Again, we must be
8385 careful to make sure that segment/control/debug/test/MMX
8386 registers are coded into the i.rm.reg field. */
f88c9eb0 8387 else if (i.reg_operands)
29b0f896 8388 {
99018f42 8389 unsigned int op;
7ab9ffdd
L
8390 unsigned int vex_reg = ~0;
8391
8392 for (op = 0; op < i.operands; op++)
921eafea
L
8393 if (i.types[op].bitfield.class == Reg
8394 || i.types[op].bitfield.class == RegBND
8395 || i.types[op].bitfield.class == RegMask
8396 || i.types[op].bitfield.class == SReg
8397 || i.types[op].bitfield.class == RegCR
8398 || i.types[op].bitfield.class == RegDR
8399 || i.types[op].bitfield.class == RegTR
8400 || i.types[op].bitfield.class == RegSIMD
8401 || i.types[op].bitfield.class == RegMMX)
8402 break;
c0209578 8403
7ab9ffdd
L
8404 if (vex_3_sources)
8405 op = dest;
2426c15f 8406 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
8407 {
8408 /* For instructions with VexNDS, the register-only
8409 source operand is encoded in VEX prefix. */
8410 gas_assert (mem != (unsigned int) ~0);
c0f3af97 8411
7ab9ffdd 8412 if (op > mem)
c0f3af97 8413 {
7ab9ffdd
L
8414 vex_reg = op++;
8415 gas_assert (op < i.operands);
c0f3af97
L
8416 }
8417 else
c0f3af97 8418 {
f12dc422
L
8419 /* Check register-only source operand when two source
8420 operands are swapped. */
8421 if (!i.tm.operand_types[op].bitfield.baseindex
8422 && i.tm.operand_types[op + 1].bitfield.baseindex)
8423 {
8424 vex_reg = op;
8425 op += 2;
8426 gas_assert (mem == (vex_reg + 1)
8427 && op < i.operands);
8428 }
8429 else
8430 {
8431 vex_reg = op + 1;
8432 gas_assert (vex_reg < i.operands);
8433 }
c0f3af97 8434 }
7ab9ffdd 8435 }
2426c15f 8436 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 8437 {
f12dc422 8438 /* For instructions with VexNDD, the register destination
7ab9ffdd 8439 is encoded in VEX prefix. */
f12dc422
L
8440 if (i.mem_operands == 0)
8441 {
8442 /* There is no memory operand. */
8443 gas_assert ((op + 2) == i.operands);
8444 vex_reg = op + 1;
8445 }
8446 else
8d63c93e 8447 {
ed438a93
JB
8448 /* There are only 2 non-immediate operands. */
8449 gas_assert (op < i.imm_operands + 2
8450 && i.operands == i.imm_operands + 2);
8451 vex_reg = i.imm_operands + 1;
f12dc422 8452 }
7ab9ffdd
L
8453 }
8454 else
8455 gas_assert (op < i.operands);
99018f42 8456
7ab9ffdd
L
8457 if (vex_reg != (unsigned int) ~0)
8458 {
f12dc422 8459 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 8460
bab6aec1 8461 if ((type->bitfield.class != Reg
dc821c5f 8462 || (!type->bitfield.dword && !type->bitfield.qword))
3528c362 8463 && type->bitfield.class != RegSIMD
43234a1e 8464 && !operand_type_equal (type, &regmask))
7ab9ffdd 8465 abort ();
f88c9eb0 8466
7ab9ffdd
L
8467 i.vex.register_specifier = i.op[vex_reg].regs;
8468 }
8469
1b9f0c97
L
8470 /* Don't set OP operand twice. */
8471 if (vex_reg != op)
7ab9ffdd 8472 {
1b9f0c97
L
8473 /* If there is an extension opcode to put here, the
8474 register number must be put into the regmem field. */
8475 if (i.tm.extension_opcode != None)
8476 {
8477 i.rm.regmem = i.op[op].regs->reg_num;
a5aeccd9
JB
8478 set_rex_vrex (i.op[op].regs, REX_B,
8479 i.tm.opcode_modifier.sse2avx);
1b9f0c97
L
8480 }
8481 else
8482 {
8483 i.rm.reg = i.op[op].regs->reg_num;
a5aeccd9
JB
8484 set_rex_vrex (i.op[op].regs, REX_R,
8485 i.tm.opcode_modifier.sse2avx);
1b9f0c97 8486 }
7ab9ffdd 8487 }
252b5132 8488
29b0f896
AM
8489 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
8490 must set it to 3 to indicate this is a register operand
8491 in the regmem field. */
8492 if (!i.mem_operands)
8493 i.rm.mode = 3;
8494 }
252b5132 8495
29b0f896 8496 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 8497 if (i.tm.extension_opcode != None)
29b0f896
AM
8498 i.rm.reg = i.tm.extension_opcode;
8499 }
8500 return default_seg;
8501}
252b5132 8502
48ef937e
JB
8503static INLINE void
8504frag_opcode_byte (unsigned char byte)
8505{
8506 if (now_seg != absolute_section)
8507 FRAG_APPEND_1_CHAR (byte);
8508 else
8509 ++abs_section_offset;
8510}
8511
376cd056
JB
8512static unsigned int
8513flip_code16 (unsigned int code16)
8514{
8515 gas_assert (i.tm.operands == 1);
8516
8517 return !(i.prefix[REX_PREFIX] & REX_W)
8518 && (code16 ? i.tm.operand_types[0].bitfield.disp32
8519 || i.tm.operand_types[0].bitfield.disp32s
8520 : i.tm.operand_types[0].bitfield.disp16)
8521 ? CODE16 : 0;
8522}
8523
29b0f896 8524static void
e3bb37b5 8525output_branch (void)
29b0f896
AM
8526{
8527 char *p;
f8a5c266 8528 int size;
29b0f896
AM
8529 int code16;
8530 int prefix;
8531 relax_substateT subtype;
8532 symbolS *sym;
8533 offsetT off;
8534
48ef937e
JB
8535 if (now_seg == absolute_section)
8536 {
8537 as_bad (_("relaxable branches not supported in absolute section"));
8538 return;
8539 }
8540
f8a5c266 8541 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 8542 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
8543
8544 prefix = 0;
8545 if (i.prefix[DATA_PREFIX] != 0)
252b5132 8546 {
29b0f896
AM
8547 prefix = 1;
8548 i.prefixes -= 1;
376cd056 8549 code16 ^= flip_code16(code16);
252b5132 8550 }
29b0f896
AM
8551 /* Pentium4 branch hints. */
8552 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8553 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 8554 {
29b0f896
AM
8555 prefix++;
8556 i.prefixes--;
8557 }
8558 if (i.prefix[REX_PREFIX] != 0)
8559 {
8560 prefix++;
8561 i.prefixes--;
2f66722d
AM
8562 }
8563
7e8b059b
L
8564 /* BND prefixed jump. */
8565 if (i.prefix[BND_PREFIX] != 0)
8566 {
6cb0a70e
JB
8567 prefix++;
8568 i.prefixes--;
7e8b059b
L
8569 }
8570
f2810fe0
JB
8571 if (i.prefixes != 0)
8572 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
29b0f896
AM
8573
8574 /* It's always a symbol; End frag & setup for relax.
8575 Make sure there is enough room in this frag for the largest
8576 instruction we may generate in md_convert_frag. This is 2
8577 bytes for the opcode and room for the prefix and largest
8578 displacement. */
8579 frag_grow (prefix + 2 + 4);
8580 /* Prefix and 1 opcode byte go in fr_fix. */
8581 p = frag_more (prefix + 1);
8582 if (i.prefix[DATA_PREFIX] != 0)
8583 *p++ = DATA_PREFIX_OPCODE;
8584 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
8585 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
8586 *p++ = i.prefix[SEG_PREFIX];
6cb0a70e
JB
8587 if (i.prefix[BND_PREFIX] != 0)
8588 *p++ = BND_PREFIX_OPCODE;
29b0f896
AM
8589 if (i.prefix[REX_PREFIX] != 0)
8590 *p++ = i.prefix[REX_PREFIX];
8591 *p = i.tm.base_opcode;
8592
8593 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 8594 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 8595 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 8596 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 8597 else
f8a5c266 8598 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 8599 subtype |= code16;
3e73aa7c 8600
29b0f896
AM
8601 sym = i.op[0].disps->X_add_symbol;
8602 off = i.op[0].disps->X_add_number;
3e73aa7c 8603
29b0f896
AM
8604 if (i.op[0].disps->X_op != O_constant
8605 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 8606 {
29b0f896
AM
8607 /* Handle complex expressions. */
8608 sym = make_expr_symbol (i.op[0].disps);
8609 off = 0;
8610 }
3e73aa7c 8611
29b0f896
AM
8612 /* 1 possible extra opcode + 4 byte displacement go in var part.
8613 Pass reloc in fr_var. */
d258b828 8614 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 8615}
3e73aa7c 8616
bd7ab16b
L
8617#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8618/* Return TRUE iff PLT32 relocation should be used for branching to
8619 symbol S. */
8620
5b7c81bd 8621static bool
bd7ab16b
L
8622need_plt32_p (symbolS *s)
8623{
8624 /* PLT32 relocation is ELF only. */
8625 if (!IS_ELF)
5b7c81bd 8626 return false;
bd7ab16b 8627
a5def729
RO
8628#ifdef TE_SOLARIS
8629 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
8630 krtld support it. */
5b7c81bd 8631 return false;
a5def729
RO
8632#endif
8633
bd7ab16b
L
8634 /* Since there is no need to prepare for PLT branch on x86-64, we
8635 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
8636 be used as a marker for 32-bit PC-relative branches. */
8637 if (!object_64bit)
5b7c81bd 8638 return false;
bd7ab16b 8639
44365e88 8640 if (s == NULL)
5b7c81bd 8641 return false;
44365e88 8642
bd7ab16b
L
8643 /* Weak or undefined symbol need PLT32 relocation. */
8644 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
5b7c81bd 8645 return true;
bd7ab16b
L
8646
8647 /* Non-global symbol doesn't need PLT32 relocation. */
8648 if (! S_IS_EXTERNAL (s))
5b7c81bd 8649 return false;
bd7ab16b
L
8650
8651 /* Other global symbols need PLT32 relocation. NB: Symbol with
8652 non-default visibilities are treated as normal global symbol
8653 so that PLT32 relocation can be used as a marker for 32-bit
8654 PC-relative branches. It is useful for linker relaxation. */
5b7c81bd 8655 return true;
bd7ab16b
L
8656}
8657#endif
8658
29b0f896 8659static void
e3bb37b5 8660output_jump (void)
29b0f896
AM
8661{
8662 char *p;
8663 int size;
3e02c1cc 8664 fixS *fixP;
bd7ab16b 8665 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 8666
0cfa3eb3 8667 if (i.tm.opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
8668 {
8669 /* This is a loop or jecxz type instruction. */
8670 size = 1;
8671 if (i.prefix[ADDR_PREFIX] != 0)
8672 {
48ef937e 8673 frag_opcode_byte (ADDR_PREFIX_OPCODE);
29b0f896
AM
8674 i.prefixes -= 1;
8675 }
8676 /* Pentium4 branch hints. */
8677 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8678 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
8679 {
48ef937e 8680 frag_opcode_byte (i.prefix[SEG_PREFIX]);
29b0f896 8681 i.prefixes--;
3e73aa7c
JH
8682 }
8683 }
29b0f896
AM
8684 else
8685 {
8686 int code16;
3e73aa7c 8687
29b0f896
AM
8688 code16 = 0;
8689 if (flag_code == CODE_16BIT)
8690 code16 = CODE16;
3e73aa7c 8691
29b0f896
AM
8692 if (i.prefix[DATA_PREFIX] != 0)
8693 {
48ef937e 8694 frag_opcode_byte (DATA_PREFIX_OPCODE);
29b0f896 8695 i.prefixes -= 1;
376cd056 8696 code16 ^= flip_code16(code16);
29b0f896 8697 }
252b5132 8698
29b0f896
AM
8699 size = 4;
8700 if (code16)
8701 size = 2;
8702 }
9fcc94b6 8703
6cb0a70e
JB
8704 /* BND prefixed jump. */
8705 if (i.prefix[BND_PREFIX] != 0)
29b0f896 8706 {
48ef937e 8707 frag_opcode_byte (i.prefix[BND_PREFIX]);
29b0f896
AM
8708 i.prefixes -= 1;
8709 }
252b5132 8710
6cb0a70e 8711 if (i.prefix[REX_PREFIX] != 0)
7e8b059b 8712 {
48ef937e 8713 frag_opcode_byte (i.prefix[REX_PREFIX]);
7e8b059b
L
8714 i.prefixes -= 1;
8715 }
8716
f2810fe0
JB
8717 if (i.prefixes != 0)
8718 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
e0890092 8719
48ef937e
JB
8720 if (now_seg == absolute_section)
8721 {
9a182d04 8722 abs_section_offset += i.opcode_length + size;
48ef937e
JB
8723 return;
8724 }
8725
9a182d04
JB
8726 p = frag_more (i.opcode_length + size);
8727 switch (i.opcode_length)
42164a71
L
8728 {
8729 case 2:
8730 *p++ = i.tm.base_opcode >> 8;
1a0670f3 8731 /* Fall through. */
42164a71
L
8732 case 1:
8733 *p++ = i.tm.base_opcode;
8734 break;
8735 default:
8736 abort ();
8737 }
e0890092 8738
bd7ab16b
L
8739#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8740 if (size == 4
8741 && jump_reloc == NO_RELOC
8742 && need_plt32_p (i.op[0].disps->X_add_symbol))
8743 jump_reloc = BFD_RELOC_X86_64_PLT32;
8744#endif
8745
8746 jump_reloc = reloc (size, 1, 1, jump_reloc);
8747
3e02c1cc 8748 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 8749 i.op[0].disps, 1, jump_reloc);
3e02c1cc
AM
8750
8751 /* All jumps handled here are signed, but don't use a signed limit
8752 check for 32 and 16 bit jumps as we want to allow wrap around at
8753 4G and 64k respectively. */
8754 if (size == 1)
8755 fixP->fx_signed = 1;
29b0f896 8756}
e0890092 8757
29b0f896 8758static void
e3bb37b5 8759output_interseg_jump (void)
29b0f896
AM
8760{
8761 char *p;
8762 int size;
8763 int prefix;
8764 int code16;
252b5132 8765
29b0f896
AM
8766 code16 = 0;
8767 if (flag_code == CODE_16BIT)
8768 code16 = CODE16;
a217f122 8769
29b0f896
AM
8770 prefix = 0;
8771 if (i.prefix[DATA_PREFIX] != 0)
8772 {
8773 prefix = 1;
8774 i.prefixes -= 1;
8775 code16 ^= CODE16;
8776 }
6cb0a70e
JB
8777
8778 gas_assert (!i.prefix[REX_PREFIX]);
252b5132 8779
29b0f896
AM
8780 size = 4;
8781 if (code16)
8782 size = 2;
252b5132 8783
f2810fe0
JB
8784 if (i.prefixes != 0)
8785 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
252b5132 8786
48ef937e
JB
8787 if (now_seg == absolute_section)
8788 {
8789 abs_section_offset += prefix + 1 + 2 + size;
8790 return;
8791 }
8792
29b0f896
AM
8793 /* 1 opcode; 2 segment; offset */
8794 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 8795
29b0f896
AM
8796 if (i.prefix[DATA_PREFIX] != 0)
8797 *p++ = DATA_PREFIX_OPCODE;
252b5132 8798
29b0f896
AM
8799 if (i.prefix[REX_PREFIX] != 0)
8800 *p++ = i.prefix[REX_PREFIX];
252b5132 8801
29b0f896
AM
8802 *p++ = i.tm.base_opcode;
8803 if (i.op[1].imms->X_op == O_constant)
8804 {
8805 offsetT n = i.op[1].imms->X_add_number;
252b5132 8806
29b0f896
AM
8807 if (size == 2
8808 && !fits_in_unsigned_word (n)
8809 && !fits_in_signed_word (n))
8810 {
8811 as_bad (_("16-bit jump out of range"));
8812 return;
8813 }
8814 md_number_to_chars (p, n, size);
8815 }
8816 else
8817 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 8818 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
6d96a594
C
8819
8820 p += size;
8821 if (i.op[0].imms->X_op == O_constant)
8822 md_number_to_chars (p, (valueT) i.op[0].imms->X_add_number, 2);
8823 else
8824 fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
8825 i.op[0].imms, 0, reloc (2, 0, 0, i.reloc[0]));
29b0f896 8826}
a217f122 8827
b4a3a7b4
L
8828#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8829void
8830x86_cleanup (void)
8831{
8832 char *p;
8833 asection *seg = now_seg;
8834 subsegT subseg = now_subseg;
8835 asection *sec;
8836 unsigned int alignment, align_size_1;
8837 unsigned int isa_1_descsz, feature_2_descsz, descsz;
8838 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
8839 unsigned int padding;
8840
8841 if (!IS_ELF || !x86_used_note)
8842 return;
8843
b4a3a7b4
L
8844 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
8845
8846 /* The .note.gnu.property section layout:
8847
8848 Field Length Contents
8849 ---- ---- ----
8850 n_namsz 4 4
8851 n_descsz 4 The note descriptor size
8852 n_type 4 NT_GNU_PROPERTY_TYPE_0
8853 n_name 4 "GNU"
8854 n_desc n_descsz The program property array
8855 .... .... ....
8856 */
8857
8858 /* Create the .note.gnu.property section. */
8859 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 8860 bfd_set_section_flags (sec,
b4a3a7b4
L
8861 (SEC_ALLOC
8862 | SEC_LOAD
8863 | SEC_DATA
8864 | SEC_HAS_CONTENTS
8865 | SEC_READONLY));
8866
8867 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
8868 {
8869 align_size_1 = 7;
8870 alignment = 3;
8871 }
8872 else
8873 {
8874 align_size_1 = 3;
8875 alignment = 2;
8876 }
8877
fd361982 8878 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
8879 elf_section_type (sec) = SHT_NOTE;
8880
8881 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
8882 + 4-byte data */
8883 isa_1_descsz_raw = 4 + 4 + 4;
8884 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
8885 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
8886
8887 feature_2_descsz_raw = isa_1_descsz;
8888 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
8889 + 4-byte data */
8890 feature_2_descsz_raw += 4 + 4 + 4;
8891 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
8892 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
8893 & ~align_size_1);
8894
8895 descsz = feature_2_descsz;
8896 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
8897 p = frag_more (4 + 4 + 4 + 4 + descsz);
8898
8899 /* Write n_namsz. */
8900 md_number_to_chars (p, (valueT) 4, 4);
8901
8902 /* Write n_descsz. */
8903 md_number_to_chars (p + 4, (valueT) descsz, 4);
8904
8905 /* Write n_type. */
8906 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
8907
8908 /* Write n_name. */
8909 memcpy (p + 4 * 3, "GNU", 4);
8910
8911 /* Write 4-byte type. */
8912 md_number_to_chars (p + 4 * 4,
8913 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
8914
8915 /* Write 4-byte data size. */
8916 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
8917
8918 /* Write 4-byte data. */
8919 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
8920
8921 /* Zero out paddings. */
8922 padding = isa_1_descsz - isa_1_descsz_raw;
8923 if (padding)
8924 memset (p + 4 * 7, 0, padding);
8925
8926 /* Write 4-byte type. */
8927 md_number_to_chars (p + isa_1_descsz + 4 * 4,
8928 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
8929
8930 /* Write 4-byte data size. */
8931 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
8932
8933 /* Write 4-byte data. */
8934 md_number_to_chars (p + isa_1_descsz + 4 * 6,
8935 (valueT) x86_feature_2_used, 4);
8936
8937 /* Zero out paddings. */
8938 padding = feature_2_descsz - feature_2_descsz_raw;
8939 if (padding)
8940 memset (p + isa_1_descsz + 4 * 7, 0, padding);
8941
8942 /* We probably can't restore the current segment, for there likely
8943 isn't one yet... */
8944 if (seg && subseg)
8945 subseg_set (seg, subseg);
8946}
8947#endif
8948
9c33702b
JB
8949static unsigned int
8950encoding_length (const fragS *start_frag, offsetT start_off,
8951 const char *frag_now_ptr)
8952{
8953 unsigned int len = 0;
8954
8955 if (start_frag != frag_now)
8956 {
8957 const fragS *fr = start_frag;
8958
8959 do {
8960 len += fr->fr_fix;
8961 fr = fr->fr_next;
8962 } while (fr && fr != frag_now);
8963 }
8964
8965 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
8966}
8967
e379e5f3 8968/* Return 1 for test, and, cmp, add, sub, inc and dec which may
79d72f45
HL
8969 be macro-fused with conditional jumps.
8970 NB: If TEST/AND/CMP/ADD/SUB/INC/DEC is of RIP relative address,
8971 or is one of the following format:
8972
8973 cmp m, imm
8974 add m, imm
8975 sub m, imm
8976 test m, imm
8977 and m, imm
8978 inc m
8979 dec m
8980
8981 it is unfusible. */
e379e5f3
L
8982
8983static int
79d72f45 8984maybe_fused_with_jcc_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8985{
8986 /* No RIP address. */
8987 if (i.base_reg && i.base_reg->reg_num == RegIP)
8988 return 0;
8989
389d00a5
JB
8990 /* No opcodes outside of base encoding space. */
8991 if (i.tm.opcode_modifier.opcodespace != SPACE_BASE)
e379e5f3
L
8992 return 0;
8993
79d72f45
HL
8994 /* add, sub without add/sub m, imm. */
8995 if (i.tm.base_opcode <= 5
e379e5f3
L
8996 || (i.tm.base_opcode >= 0x28 && i.tm.base_opcode <= 0x2d)
8997 || ((i.tm.base_opcode | 3) == 0x83
79d72f45 8998 && (i.tm.extension_opcode == 0x5
e379e5f3 8999 || i.tm.extension_opcode == 0x0)))
79d72f45
HL
9000 {
9001 *mf_cmp_p = mf_cmp_alu_cmp;
9002 return !(i.mem_operands && i.imm_operands);
9003 }
e379e5f3 9004
79d72f45
HL
9005 /* and without and m, imm. */
9006 if ((i.tm.base_opcode >= 0x20 && i.tm.base_opcode <= 0x25)
9007 || ((i.tm.base_opcode | 3) == 0x83
9008 && i.tm.extension_opcode == 0x4))
9009 {
9010 *mf_cmp_p = mf_cmp_test_and;
9011 return !(i.mem_operands && i.imm_operands);
9012 }
9013
9014 /* test without test m imm. */
e379e5f3
L
9015 if ((i.tm.base_opcode | 1) == 0x85
9016 || (i.tm.base_opcode | 1) == 0xa9
9017 || ((i.tm.base_opcode | 1) == 0xf7
79d72f45
HL
9018 && i.tm.extension_opcode == 0))
9019 {
9020 *mf_cmp_p = mf_cmp_test_and;
9021 return !(i.mem_operands && i.imm_operands);
9022 }
9023
9024 /* cmp without cmp m, imm. */
9025 if ((i.tm.base_opcode >= 0x38 && i.tm.base_opcode <= 0x3d)
e379e5f3
L
9026 || ((i.tm.base_opcode | 3) == 0x83
9027 && (i.tm.extension_opcode == 0x7)))
79d72f45
HL
9028 {
9029 *mf_cmp_p = mf_cmp_alu_cmp;
9030 return !(i.mem_operands && i.imm_operands);
9031 }
e379e5f3 9032
79d72f45 9033 /* inc, dec without inc/dec m. */
e379e5f3
L
9034 if ((i.tm.cpu_flags.bitfield.cpuno64
9035 && (i.tm.base_opcode | 0xf) == 0x4f)
9036 || ((i.tm.base_opcode | 1) == 0xff
9037 && i.tm.extension_opcode <= 0x1))
79d72f45
HL
9038 {
9039 *mf_cmp_p = mf_cmp_incdec;
9040 return !i.mem_operands;
9041 }
e379e5f3
L
9042
9043 return 0;
9044}
9045
9046/* Return 1 if a FUSED_JCC_PADDING frag should be generated. */
9047
9048static int
79d72f45 9049add_fused_jcc_padding_frag_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
9050{
9051 /* NB: Don't work with COND_JUMP86 without i386. */
9052 if (!align_branch_power
9053 || now_seg == absolute_section
9054 || !cpu_arch_flags.bitfield.cpui386
9055 || !(align_branch & align_branch_fused_bit))
9056 return 0;
9057
79d72f45 9058 if (maybe_fused_with_jcc_p (mf_cmp_p))
e379e5f3
L
9059 {
9060 if (last_insn.kind == last_insn_other
9061 || last_insn.seg != now_seg)
9062 return 1;
9063 if (flag_debug)
9064 as_warn_where (last_insn.file, last_insn.line,
9065 _("`%s` skips -malign-branch-boundary on `%s`"),
9066 last_insn.name, i.tm.name);
9067 }
9068
9069 return 0;
9070}
9071
9072/* Return 1 if a BRANCH_PREFIX frag should be generated. */
9073
9074static int
9075add_branch_prefix_frag_p (void)
9076{
9077 /* NB: Don't work with COND_JUMP86 without i386. Don't add prefix
9078 to PadLock instructions since they include prefixes in opcode. */
9079 if (!align_branch_power
9080 || !align_branch_prefix_size
9081 || now_seg == absolute_section
9082 || i.tm.cpu_flags.bitfield.cpupadlock
9083 || !cpu_arch_flags.bitfield.cpui386)
9084 return 0;
9085
9086 /* Don't add prefix if it is a prefix or there is no operand in case
9087 that segment prefix is special. */
9088 if (!i.operands || i.tm.opcode_modifier.isprefix)
9089 return 0;
9090
9091 if (last_insn.kind == last_insn_other
9092 || last_insn.seg != now_seg)
9093 return 1;
9094
9095 if (flag_debug)
9096 as_warn_where (last_insn.file, last_insn.line,
9097 _("`%s` skips -malign-branch-boundary on `%s`"),
9098 last_insn.name, i.tm.name);
9099
9100 return 0;
9101}
9102
9103/* Return 1 if a BRANCH_PADDING frag should be generated. */
9104
9105static int
79d72f45
HL
9106add_branch_padding_frag_p (enum align_branch_kind *branch_p,
9107 enum mf_jcc_kind *mf_jcc_p)
e379e5f3
L
9108{
9109 int add_padding;
9110
9111 /* NB: Don't work with COND_JUMP86 without i386. */
9112 if (!align_branch_power
9113 || now_seg == absolute_section
389d00a5
JB
9114 || !cpu_arch_flags.bitfield.cpui386
9115 || i.tm.opcode_modifier.opcodespace != SPACE_BASE)
e379e5f3
L
9116 return 0;
9117
9118 add_padding = 0;
9119
9120 /* Check for jcc and direct jmp. */
9121 if (i.tm.opcode_modifier.jump == JUMP)
9122 {
9123 if (i.tm.base_opcode == JUMP_PC_RELATIVE)
9124 {
9125 *branch_p = align_branch_jmp;
9126 add_padding = align_branch & align_branch_jmp_bit;
9127 }
9128 else
9129 {
79d72f45
HL
9130 /* Because J<cc> and JN<cc> share same group in macro-fusible table,
9131 igore the lowest bit. */
9132 *mf_jcc_p = (i.tm.base_opcode & 0x0e) >> 1;
e379e5f3
L
9133 *branch_p = align_branch_jcc;
9134 if ((align_branch & align_branch_jcc_bit))
9135 add_padding = 1;
9136 }
9137 }
e379e5f3
L
9138 else if ((i.tm.base_opcode | 1) == 0xc3)
9139 {
9140 /* Near ret. */
9141 *branch_p = align_branch_ret;
9142 if ((align_branch & align_branch_ret_bit))
9143 add_padding = 1;
9144 }
9145 else
9146 {
9147 /* Check for indirect jmp, direct and indirect calls. */
9148 if (i.tm.base_opcode == 0xe8)
9149 {
9150 /* Direct call. */
9151 *branch_p = align_branch_call;
9152 if ((align_branch & align_branch_call_bit))
9153 add_padding = 1;
9154 }
9155 else if (i.tm.base_opcode == 0xff
9156 && (i.tm.extension_opcode == 2
9157 || i.tm.extension_opcode == 4))
9158 {
9159 /* Indirect call and jmp. */
9160 *branch_p = align_branch_indirect;
9161 if ((align_branch & align_branch_indirect_bit))
9162 add_padding = 1;
9163 }
9164
9165 if (add_padding
9166 && i.disp_operands
9167 && tls_get_addr
9168 && (i.op[0].disps->X_op == O_symbol
9169 || (i.op[0].disps->X_op == O_subtract
9170 && i.op[0].disps->X_op_symbol == GOT_symbol)))
9171 {
9172 symbolS *s = i.op[0].disps->X_add_symbol;
9173 /* No padding to call to global or undefined tls_get_addr. */
9174 if ((S_IS_EXTERNAL (s) || !S_IS_DEFINED (s))
9175 && strcmp (S_GET_NAME (s), tls_get_addr) == 0)
9176 return 0;
9177 }
9178 }
9179
9180 if (add_padding
9181 && last_insn.kind != last_insn_other
9182 && last_insn.seg == now_seg)
9183 {
9184 if (flag_debug)
9185 as_warn_where (last_insn.file, last_insn.line,
9186 _("`%s` skips -malign-branch-boundary on `%s`"),
9187 last_insn.name, i.tm.name);
9188 return 0;
9189 }
9190
9191 return add_padding;
9192}
9193
29b0f896 9194static void
e3bb37b5 9195output_insn (void)
29b0f896 9196{
2bbd9c25
JJ
9197 fragS *insn_start_frag;
9198 offsetT insn_start_off;
e379e5f3
L
9199 fragS *fragP = NULL;
9200 enum align_branch_kind branch = align_branch_none;
79d72f45
HL
9201 /* The initializer is arbitrary just to avoid uninitialized error.
9202 it's actually either assigned in add_branch_padding_frag_p
9203 or never be used. */
9204 enum mf_jcc_kind mf_jcc = mf_jcc_jo;
2bbd9c25 9205
b4a3a7b4 9206#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
48ef937e 9207 if (IS_ELF && x86_used_note && now_seg != absolute_section)
b4a3a7b4 9208 {
32930e4e
L
9209 if ((i.xstate & xstate_tmm) == xstate_tmm
9210 || i.tm.cpu_flags.bitfield.cpuamx_tile)
9211 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_TMM;
9212
b4a3a7b4
L
9213 if (i.tm.cpu_flags.bitfield.cpu8087
9214 || i.tm.cpu_flags.bitfield.cpu287
9215 || i.tm.cpu_flags.bitfield.cpu387
9216 || i.tm.cpu_flags.bitfield.cpu687
9217 || i.tm.cpu_flags.bitfield.cpufisttp)
9218 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
014d61ea 9219
921eafea 9220 if ((i.xstate & xstate_mmx)
389d00a5
JB
9221 || (i.tm.opcode_modifier.opcodespace == SPACE_0F
9222 && !is_any_vex_encoding (&i.tm)
9223 && (i.tm.base_opcode == 0x77 /* emms */
9224 || i.tm.base_opcode == 0x0e /* femms */)))
b4a3a7b4 9225 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
014d61ea 9226
32930e4e
L
9227 if (i.index_reg)
9228 {
9229 if (i.index_reg->reg_type.bitfield.zmmword)
9230 i.xstate |= xstate_zmm;
9231 else if (i.index_reg->reg_type.bitfield.ymmword)
9232 i.xstate |= xstate_ymm;
9233 else if (i.index_reg->reg_type.bitfield.xmmword)
9234 i.xstate |= xstate_xmm;
9235 }
014d61ea
JB
9236
9237 /* vzeroall / vzeroupper */
9238 if (i.tm.base_opcode == 0x77 && i.tm.cpu_flags.bitfield.cpuavx)
9239 i.xstate |= xstate_ymm;
9240
c4694f17 9241 if ((i.xstate & xstate_xmm)
389d00a5
JB
9242 /* ldmxcsr / stmxcsr / vldmxcsr / vstmxcsr */
9243 || (i.tm.base_opcode == 0xae
9244 && (i.tm.cpu_flags.bitfield.cpusse
9245 || i.tm.cpu_flags.bitfield.cpuavx))
c4694f17
TG
9246 || i.tm.cpu_flags.bitfield.cpuwidekl
9247 || i.tm.cpu_flags.bitfield.cpukl)
b4a3a7b4 9248 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
014d61ea 9249
921eafea 9250 if ((i.xstate & xstate_ymm) == xstate_ymm)
b4a3a7b4 9251 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
921eafea 9252 if ((i.xstate & xstate_zmm) == xstate_zmm)
b4a3a7b4 9253 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
6225c532 9254 if (i.mask.reg || (i.xstate & xstate_mask) == xstate_mask)
32930e4e 9255 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MASK;
b4a3a7b4
L
9256 if (i.tm.cpu_flags.bitfield.cpufxsr)
9257 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
9258 if (i.tm.cpu_flags.bitfield.cpuxsave)
9259 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
9260 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
9261 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
9262 if (i.tm.cpu_flags.bitfield.cpuxsavec)
9263 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
b0ab0693
L
9264
9265 if (x86_feature_2_used
9266 || i.tm.cpu_flags.bitfield.cpucmov
9267 || i.tm.cpu_flags.bitfield.cpusyscall
389d00a5
JB
9268 || (i.tm.opcode_modifier.opcodespace == SPACE_0F
9269 && i.tm.base_opcode == 0xc7
70e95837 9270 && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE
b0ab0693
L
9271 && i.tm.extension_opcode == 1) /* cmpxchg8b */)
9272 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_BASELINE;
9273 if (i.tm.cpu_flags.bitfield.cpusse3
9274 || i.tm.cpu_flags.bitfield.cpussse3
9275 || i.tm.cpu_flags.bitfield.cpusse4_1
9276 || i.tm.cpu_flags.bitfield.cpusse4_2
9277 || i.tm.cpu_flags.bitfield.cpucx16
9278 || i.tm.cpu_flags.bitfield.cpupopcnt
9279 /* LAHF-SAHF insns in 64-bit mode. */
9280 || (flag_code == CODE_64BIT
35648716
JB
9281 && (i.tm.base_opcode | 1) == 0x9f
9282 && i.tm.opcode_modifier.opcodespace == SPACE_BASE))
b0ab0693
L
9283 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V2;
9284 if (i.tm.cpu_flags.bitfield.cpuavx
9285 || i.tm.cpu_flags.bitfield.cpuavx2
9286 /* Any VEX encoded insns execpt for CpuAVX512F, CpuAVX512BW,
9287 CpuAVX512DQ, LPW, TBM and AMX. */
9288 || (i.tm.opcode_modifier.vex
9289 && !i.tm.cpu_flags.bitfield.cpuavx512f
9290 && !i.tm.cpu_flags.bitfield.cpuavx512bw
9291 && !i.tm.cpu_flags.bitfield.cpuavx512dq
9292 && !i.tm.cpu_flags.bitfield.cpulwp
9293 && !i.tm.cpu_flags.bitfield.cputbm
9294 && !(x86_feature_2_used & GNU_PROPERTY_X86_FEATURE_2_TMM))
9295 || i.tm.cpu_flags.bitfield.cpuf16c
9296 || i.tm.cpu_flags.bitfield.cpufma
9297 || i.tm.cpu_flags.bitfield.cpulzcnt
9298 || i.tm.cpu_flags.bitfield.cpumovbe
9299 || i.tm.cpu_flags.bitfield.cpuxsaves
9300 || (x86_feature_2_used
9301 & (GNU_PROPERTY_X86_FEATURE_2_XSAVE
9302 | GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT
9303 | GNU_PROPERTY_X86_FEATURE_2_XSAVEC)) != 0)
9304 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V3;
9305 if (i.tm.cpu_flags.bitfield.cpuavx512f
9306 || i.tm.cpu_flags.bitfield.cpuavx512bw
9307 || i.tm.cpu_flags.bitfield.cpuavx512dq
9308 || i.tm.cpu_flags.bitfield.cpuavx512vl
9309 /* Any EVEX encoded insns except for AVX512ER, AVX512PF and
9310 VNNIW. */
9311 || (i.tm.opcode_modifier.evex
9312 && !i.tm.cpu_flags.bitfield.cpuavx512er
9313 && !i.tm.cpu_flags.bitfield.cpuavx512pf
9314 && !i.tm.cpu_flags.bitfield.cpuavx512_4vnniw))
9315 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V4;
b4a3a7b4
L
9316 }
9317#endif
9318
29b0f896
AM
9319 /* Tie dwarf2 debug info to the address at the start of the insn.
9320 We can't do this after the insn has been output as the current
9321 frag may have been closed off. eg. by frag_var. */
9322 dwarf2_emit_insn (0);
9323
2bbd9c25
JJ
9324 insn_start_frag = frag_now;
9325 insn_start_off = frag_now_fix ();
9326
79d72f45 9327 if (add_branch_padding_frag_p (&branch, &mf_jcc))
e379e5f3
L
9328 {
9329 char *p;
9330 /* Branch can be 8 bytes. Leave some room for prefixes. */
9331 unsigned int max_branch_padding_size = 14;
9332
9333 /* Align section to boundary. */
9334 record_alignment (now_seg, align_branch_power);
9335
9336 /* Make room for padding. */
9337 frag_grow (max_branch_padding_size);
9338
9339 /* Start of the padding. */
9340 p = frag_more (0);
9341
9342 fragP = frag_now;
9343
9344 frag_var (rs_machine_dependent, max_branch_padding_size, 0,
9345 ENCODE_RELAX_STATE (BRANCH_PADDING, 0),
9346 NULL, 0, p);
9347
79d72f45 9348 fragP->tc_frag_data.mf_type = mf_jcc;
e379e5f3
L
9349 fragP->tc_frag_data.branch_type = branch;
9350 fragP->tc_frag_data.max_bytes = max_branch_padding_size;
9351 }
9352
29b0f896 9353 /* Output jumps. */
0cfa3eb3 9354 if (i.tm.opcode_modifier.jump == JUMP)
29b0f896 9355 output_branch ();
0cfa3eb3
JB
9356 else if (i.tm.opcode_modifier.jump == JUMP_BYTE
9357 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896 9358 output_jump ();
0cfa3eb3 9359 else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT)
29b0f896
AM
9360 output_interseg_jump ();
9361 else
9362 {
9363 /* Output normal instructions here. */
9364 char *p;
9365 unsigned char *q;
47465058 9366 unsigned int j;
79d72f45 9367 enum mf_cmp_kind mf_cmp;
4dffcebc 9368
e4e00185 9369 if (avoid_fence
389d00a5
JB
9370 && (i.tm.base_opcode == 0xaee8
9371 || i.tm.base_opcode == 0xaef0
9372 || i.tm.base_opcode == 0xaef8))
48ef937e
JB
9373 {
9374 /* Encode lfence, mfence, and sfence as
9375 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
9376 if (now_seg != absolute_section)
9377 {
9378 offsetT val = 0x240483f0ULL;
9379
9380 p = frag_more (5);
9381 md_number_to_chars (p, val, 5);
9382 }
9383 else
9384 abs_section_offset += 5;
9385 return;
9386 }
e4e00185 9387
d022bddd
IT
9388 /* Some processors fail on LOCK prefix. This options makes
9389 assembler ignore LOCK prefix and serves as a workaround. */
9390 if (omit_lock_prefix)
9391 {
35648716
JB
9392 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE
9393 && i.tm.opcode_modifier.isprefix)
d022bddd
IT
9394 return;
9395 i.prefix[LOCK_PREFIX] = 0;
9396 }
9397
e379e5f3
L
9398 if (branch)
9399 /* Skip if this is a branch. */
9400 ;
79d72f45 9401 else if (add_fused_jcc_padding_frag_p (&mf_cmp))
e379e5f3
L
9402 {
9403 /* Make room for padding. */
9404 frag_grow (MAX_FUSED_JCC_PADDING_SIZE);
9405 p = frag_more (0);
9406
9407 fragP = frag_now;
9408
9409 frag_var (rs_machine_dependent, MAX_FUSED_JCC_PADDING_SIZE, 0,
9410 ENCODE_RELAX_STATE (FUSED_JCC_PADDING, 0),
9411 NULL, 0, p);
9412
79d72f45 9413 fragP->tc_frag_data.mf_type = mf_cmp;
e379e5f3
L
9414 fragP->tc_frag_data.branch_type = align_branch_fused;
9415 fragP->tc_frag_data.max_bytes = MAX_FUSED_JCC_PADDING_SIZE;
9416 }
9417 else if (add_branch_prefix_frag_p ())
9418 {
9419 unsigned int max_prefix_size = align_branch_prefix_size;
9420
9421 /* Make room for padding. */
9422 frag_grow (max_prefix_size);
9423 p = frag_more (0);
9424
9425 fragP = frag_now;
9426
9427 frag_var (rs_machine_dependent, max_prefix_size, 0,
9428 ENCODE_RELAX_STATE (BRANCH_PREFIX, 0),
9429 NULL, 0, p);
9430
9431 fragP->tc_frag_data.max_bytes = max_prefix_size;
9432 }
9433
43234a1e
L
9434 /* Since the VEX/EVEX prefix contains the implicit prefix, we
9435 don't need the explicit prefix. */
9436 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 9437 {
7b47a312 9438 switch (i.tm.opcode_modifier.opcodeprefix)
bc4bd9ab 9439 {
7b47a312
L
9440 case PREFIX_0X66:
9441 add_prefix (0x66);
9442 break;
9443 case PREFIX_0XF2:
9444 add_prefix (0xf2);
9445 break;
9446 case PREFIX_0XF3:
8b65b895
L
9447 if (!i.tm.cpu_flags.bitfield.cpupadlock
9448 || (i.prefix[REP_PREFIX] != 0xf3))
9449 add_prefix (0xf3);
c0f3af97 9450 break;
7b47a312 9451 case PREFIX_NONE:
9a182d04 9452 switch (i.opcode_length)
c0f3af97 9453 {
7b47a312 9454 case 2:
7b47a312 9455 break;
9a182d04 9456 case 1:
7b47a312 9457 /* Check for pseudo prefixes. */
9a182d04
JB
9458 if (!i.tm.opcode_modifier.isprefix || i.tm.base_opcode)
9459 break;
7b47a312
L
9460 as_bad_where (insn_start_frag->fr_file,
9461 insn_start_frag->fr_line,
9462 _("pseudo prefix without instruction"));
9463 return;
9464 default:
9465 abort ();
4dffcebc 9466 }
c0f3af97 9467 break;
c0f3af97
L
9468 default:
9469 abort ();
bc4bd9ab 9470 }
c0f3af97 9471
6d19a37a 9472#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
9473 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
9474 R_X86_64_GOTTPOFF relocation so that linker can safely
14470f07
L
9475 perform IE->LE optimization. A dummy REX_OPCODE prefix
9476 is also needed for lea with R_X86_64_GOTPC32_TLSDESC
9477 relocation for GDesc -> IE/LE optimization. */
cf61b747
L
9478 if (x86_elf_abi == X86_64_X32_ABI
9479 && i.operands == 2
14470f07
L
9480 && (i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
9481 || i.reloc[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
cf61b747
L
9482 && i.prefix[REX_PREFIX] == 0)
9483 add_prefix (REX_OPCODE);
6d19a37a 9484#endif
cf61b747 9485
c0f3af97
L
9486 /* The prefix bytes. */
9487 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
9488 if (*q)
48ef937e 9489 frag_opcode_byte (*q);
0f10071e 9490 }
ae5c1c7b 9491 else
c0f3af97
L
9492 {
9493 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
9494 if (*q)
9495 switch (j)
9496 {
c0f3af97
L
9497 case SEG_PREFIX:
9498 case ADDR_PREFIX:
48ef937e 9499 frag_opcode_byte (*q);
c0f3af97
L
9500 break;
9501 default:
9502 /* There should be no other prefixes for instructions
9503 with VEX prefix. */
9504 abort ();
9505 }
9506
43234a1e
L
9507 /* For EVEX instructions i.vrex should become 0 after
9508 build_evex_prefix. For VEX instructions upper 16 registers
9509 aren't available, so VREX should be 0. */
9510 if (i.vrex)
9511 abort ();
c0f3af97 9512 /* Now the VEX prefix. */
48ef937e
JB
9513 if (now_seg != absolute_section)
9514 {
9515 p = frag_more (i.vex.length);
9516 for (j = 0; j < i.vex.length; j++)
9517 p[j] = i.vex.bytes[j];
9518 }
9519 else
9520 abs_section_offset += i.vex.length;
c0f3af97 9521 }
252b5132 9522
29b0f896 9523 /* Now the opcode; be careful about word order here! */
389d00a5
JB
9524 j = i.opcode_length;
9525 if (!i.vex.length)
9526 switch (i.tm.opcode_modifier.opcodespace)
9527 {
9528 case SPACE_BASE:
9529 break;
9530 case SPACE_0F:
9531 ++j;
9532 break;
9533 case SPACE_0F38:
9534 case SPACE_0F3A:
9535 j += 2;
9536 break;
9537 default:
9538 abort ();
9539 }
9540
48ef937e 9541 if (now_seg == absolute_section)
389d00a5
JB
9542 abs_section_offset += j;
9543 else if (j == 1)
29b0f896
AM
9544 {
9545 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
9546 }
9547 else
9548 {
389d00a5
JB
9549 p = frag_more (j);
9550 if (!i.vex.length
9551 && i.tm.opcode_modifier.opcodespace != SPACE_BASE)
9552 {
9553 *p++ = 0x0f;
9554 if (i.tm.opcode_modifier.opcodespace != SPACE_0F)
9555 *p++ = i.tm.opcode_modifier.opcodespace == SPACE_0F38
9556 ? 0x38 : 0x3a;
9557 }
9558
9a182d04 9559 switch (i.opcode_length)
331d2d0d 9560 {
4dffcebc 9561 case 2:
389d00a5
JB
9562 /* Put out high byte first: can't use md_number_to_chars! */
9563 *p++ = (i.tm.base_opcode >> 8) & 0xff;
9564 /* Fall through. */
9565 case 1:
9566 *p = i.tm.base_opcode & 0xff;
4dffcebc
L
9567 break;
9568 default:
9569 abort ();
9570 break;
331d2d0d 9571 }
0f10071e 9572
29b0f896 9573 }
3e73aa7c 9574
29b0f896 9575 /* Now the modrm byte and sib byte (if present). */
40fb9820 9576 if (i.tm.opcode_modifier.modrm)
29b0f896 9577 {
48ef937e
JB
9578 frag_opcode_byte ((i.rm.regmem << 0)
9579 | (i.rm.reg << 3)
9580 | (i.rm.mode << 6));
29b0f896
AM
9581 /* If i.rm.regmem == ESP (4)
9582 && i.rm.mode != (Register mode)
9583 && not 16 bit
9584 ==> need second modrm byte. */
9585 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
9586 && i.rm.mode != 3
dc821c5f 9587 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
48ef937e
JB
9588 frag_opcode_byte ((i.sib.base << 0)
9589 | (i.sib.index << 3)
9590 | (i.sib.scale << 6));
29b0f896 9591 }
3e73aa7c 9592
29b0f896 9593 if (i.disp_operands)
2bbd9c25 9594 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 9595
29b0f896 9596 if (i.imm_operands)
2bbd9c25 9597 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
9598
9599 /*
9600 * frag_now_fix () returning plain abs_section_offset when we're in the
9601 * absolute section, and abs_section_offset not getting updated as data
9602 * gets added to the frag breaks the logic below.
9603 */
9604 if (now_seg != absolute_section)
9605 {
9606 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
9607 if (j > 15)
9608 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
9609 j);
e379e5f3
L
9610 else if (fragP)
9611 {
9612 /* NB: Don't add prefix with GOTPC relocation since
9613 output_disp() above depends on the fixed encoding
9614 length. Can't add prefix with TLS relocation since
9615 it breaks TLS linker optimization. */
9616 unsigned int max = i.has_gotpc_tls_reloc ? 0 : 15 - j;
9617 /* Prefix count on the current instruction. */
9618 unsigned int count = i.vex.length;
9619 unsigned int k;
9620 for (k = 0; k < ARRAY_SIZE (i.prefix); k++)
9621 /* REX byte is encoded in VEX/EVEX prefix. */
9622 if (i.prefix[k] && (k != REX_PREFIX || !i.vex.length))
9623 count++;
9624
9625 /* Count prefixes for extended opcode maps. */
9626 if (!i.vex.length)
389d00a5 9627 switch (i.tm.opcode_modifier.opcodespace)
e379e5f3 9628 {
389d00a5 9629 case SPACE_BASE:
e379e5f3 9630 break;
389d00a5
JB
9631 case SPACE_0F:
9632 count++;
e379e5f3 9633 break;
389d00a5
JB
9634 case SPACE_0F38:
9635 case SPACE_0F3A:
9636 count += 2;
e379e5f3
L
9637 break;
9638 default:
9639 abort ();
9640 }
9641
9642 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
9643 == BRANCH_PREFIX)
9644 {
9645 /* Set the maximum prefix size in BRANCH_PREFIX
9646 frag. */
9647 if (fragP->tc_frag_data.max_bytes > max)
9648 fragP->tc_frag_data.max_bytes = max;
9649 if (fragP->tc_frag_data.max_bytes > count)
9650 fragP->tc_frag_data.max_bytes -= count;
9651 else
9652 fragP->tc_frag_data.max_bytes = 0;
9653 }
9654 else
9655 {
9656 /* Remember the maximum prefix size in FUSED_JCC_PADDING
9657 frag. */
9658 unsigned int max_prefix_size;
9659 if (align_branch_prefix_size > max)
9660 max_prefix_size = max;
9661 else
9662 max_prefix_size = align_branch_prefix_size;
9663 if (max_prefix_size > count)
9664 fragP->tc_frag_data.max_prefix_length
9665 = max_prefix_size - count;
9666 }
9667
9668 /* Use existing segment prefix if possible. Use CS
9669 segment prefix in 64-bit mode. In 32-bit mode, use SS
9670 segment prefix with ESP/EBP base register and use DS
9671 segment prefix without ESP/EBP base register. */
9672 if (i.prefix[SEG_PREFIX])
9673 fragP->tc_frag_data.default_prefix = i.prefix[SEG_PREFIX];
9674 else if (flag_code == CODE_64BIT)
9675 fragP->tc_frag_data.default_prefix = CS_PREFIX_OPCODE;
9676 else if (i.base_reg
9677 && (i.base_reg->reg_num == 4
9678 || i.base_reg->reg_num == 5))
9679 fragP->tc_frag_data.default_prefix = SS_PREFIX_OPCODE;
9680 else
9681 fragP->tc_frag_data.default_prefix = DS_PREFIX_OPCODE;
9682 }
9c33702b 9683 }
29b0f896 9684 }
252b5132 9685
e379e5f3
L
9686 /* NB: Don't work with COND_JUMP86 without i386. */
9687 if (align_branch_power
9688 && now_seg != absolute_section
9689 && cpu_arch_flags.bitfield.cpui386)
9690 {
9691 /* Terminate each frag so that we can add prefix and check for
9692 fused jcc. */
9693 frag_wane (frag_now);
9694 frag_new (0);
9695 }
9696
29b0f896
AM
9697#ifdef DEBUG386
9698 if (flag_debug)
9699 {
7b81dfbb 9700 pi ("" /*line*/, &i);
29b0f896
AM
9701 }
9702#endif /* DEBUG386 */
9703}
252b5132 9704
e205caa7
L
9705/* Return the size of the displacement operand N. */
9706
9707static int
9708disp_size (unsigned int n)
9709{
9710 int size = 4;
43234a1e 9711
b5014f7a 9712 if (i.types[n].bitfield.disp64)
40fb9820
L
9713 size = 8;
9714 else if (i.types[n].bitfield.disp8)
9715 size = 1;
9716 else if (i.types[n].bitfield.disp16)
9717 size = 2;
e205caa7
L
9718 return size;
9719}
9720
9721/* Return the size of the immediate operand N. */
9722
9723static int
9724imm_size (unsigned int n)
9725{
9726 int size = 4;
40fb9820
L
9727 if (i.types[n].bitfield.imm64)
9728 size = 8;
9729 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
9730 size = 1;
9731 else if (i.types[n].bitfield.imm16)
9732 size = 2;
e205caa7
L
9733 return size;
9734}
9735
29b0f896 9736static void
64e74474 9737output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9738{
9739 char *p;
9740 unsigned int n;
252b5132 9741
29b0f896
AM
9742 for (n = 0; n < i.operands; n++)
9743 {
b5014f7a 9744 if (operand_type_check (i.types[n], disp))
29b0f896 9745 {
48ef937e
JB
9746 int size = disp_size (n);
9747
9748 if (now_seg == absolute_section)
9749 abs_section_offset += size;
9750 else if (i.op[n].disps->X_op == O_constant)
29b0f896 9751 {
43234a1e 9752 offsetT val = i.op[n].disps->X_add_number;
252b5132 9753
629cfaf1
JB
9754 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
9755 size);
29b0f896
AM
9756 p = frag_more (size);
9757 md_number_to_chars (p, val, size);
9758 }
9759 else
9760 {
f86103b7 9761 enum bfd_reloc_code_real reloc_type;
40fb9820 9762 int sign = i.types[n].bitfield.disp32s;
29b0f896 9763 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 9764 fixS *fixP;
29b0f896 9765
e205caa7 9766 /* We can't have 8 bit displacement here. */
9c2799c2 9767 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 9768
29b0f896
AM
9769 /* The PC relative address is computed relative
9770 to the instruction boundary, so in case immediate
9771 fields follows, we need to adjust the value. */
9772 if (pcrel && i.imm_operands)
9773 {
29b0f896 9774 unsigned int n1;
e205caa7 9775 int sz = 0;
252b5132 9776
29b0f896 9777 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 9778 if (operand_type_check (i.types[n1], imm))
252b5132 9779 {
e205caa7
L
9780 /* Only one immediate is allowed for PC
9781 relative address. */
9c2799c2 9782 gas_assert (sz == 0);
e205caa7
L
9783 sz = imm_size (n1);
9784 i.op[n].disps->X_add_number -= sz;
252b5132 9785 }
29b0f896 9786 /* We should find the immediate. */
9c2799c2 9787 gas_assert (sz != 0);
29b0f896 9788 }
520dc8e8 9789
29b0f896 9790 p = frag_more (size);
d258b828 9791 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 9792 if (GOT_symbol
2bbd9c25 9793 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 9794 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9795 || reloc_type == BFD_RELOC_X86_64_32S
9796 || (reloc_type == BFD_RELOC_64
9797 && object_64bit))
d6ab8113
JB
9798 && (i.op[n].disps->X_op == O_symbol
9799 || (i.op[n].disps->X_op == O_add
9800 && ((symbol_get_value_expression
9801 (i.op[n].disps->X_op_symbol)->X_op)
9802 == O_subtract))))
9803 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 9804 {
4fa24527 9805 if (!object_64bit)
7b81dfbb
AJ
9806 {
9807 reloc_type = BFD_RELOC_386_GOTPC;
5b7c81bd 9808 i.has_gotpc_tls_reloc = true;
d583596c
JB
9809 i.op[n].imms->X_add_number +=
9810 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
9811 }
9812 else if (reloc_type == BFD_RELOC_64)
9813 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 9814 else
7b81dfbb
AJ
9815 /* Don't do the adjustment for x86-64, as there
9816 the pcrel addressing is relative to the _next_
9817 insn, and that is taken care of in other code. */
d6ab8113 9818 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 9819 }
e379e5f3
L
9820 else if (align_branch_power)
9821 {
9822 switch (reloc_type)
9823 {
9824 case BFD_RELOC_386_TLS_GD:
9825 case BFD_RELOC_386_TLS_LDM:
9826 case BFD_RELOC_386_TLS_IE:
9827 case BFD_RELOC_386_TLS_IE_32:
9828 case BFD_RELOC_386_TLS_GOTIE:
9829 case BFD_RELOC_386_TLS_GOTDESC:
9830 case BFD_RELOC_386_TLS_DESC_CALL:
9831 case BFD_RELOC_X86_64_TLSGD:
9832 case BFD_RELOC_X86_64_TLSLD:
9833 case BFD_RELOC_X86_64_GOTTPOFF:
9834 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
9835 case BFD_RELOC_X86_64_TLSDESC_CALL:
5b7c81bd 9836 i.has_gotpc_tls_reloc = true;
e379e5f3
L
9837 default:
9838 break;
9839 }
9840 }
02a86693
L
9841 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
9842 size, i.op[n].disps, pcrel,
9843 reloc_type);
9844 /* Check for "call/jmp *mem", "mov mem, %reg",
9845 "test %reg, mem" and "binop mem, %reg" where binop
9846 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
9847 instructions without data prefix. Always generate
9848 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
9849 if (i.prefix[DATA_PREFIX] == 0
9850 && (generate_relax_relocations
9851 || (!object_64bit
9852 && i.rm.mode == 0
9853 && i.rm.regmem == 5))
0cb4071e
L
9854 && (i.rm.mode == 2
9855 || (i.rm.mode == 0 && i.rm.regmem == 5))
389d00a5 9856 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
02a86693
L
9857 && ((i.operands == 1
9858 && i.tm.base_opcode == 0xff
9859 && (i.rm.reg == 2 || i.rm.reg == 4))
9860 || (i.operands == 2
9861 && (i.tm.base_opcode == 0x8b
9862 || i.tm.base_opcode == 0x85
2ae4c703 9863 || (i.tm.base_opcode & ~0x38) == 0x03))))
02a86693
L
9864 {
9865 if (object_64bit)
9866 {
9867 fixP->fx_tcbit = i.rex != 0;
9868 if (i.base_reg
e968fc9b 9869 && (i.base_reg->reg_num == RegIP))
02a86693
L
9870 fixP->fx_tcbit2 = 1;
9871 }
9872 else
9873 fixP->fx_tcbit2 = 1;
9874 }
29b0f896
AM
9875 }
9876 }
9877 }
9878}
252b5132 9879
29b0f896 9880static void
64e74474 9881output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9882{
9883 char *p;
9884 unsigned int n;
252b5132 9885
29b0f896
AM
9886 for (n = 0; n < i.operands; n++)
9887 {
43234a1e 9888 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
ca5312a2 9889 if (i.rounding.type != rc_none && n == i.rounding.operand)
43234a1e
L
9890 continue;
9891
40fb9820 9892 if (operand_type_check (i.types[n], imm))
29b0f896 9893 {
48ef937e
JB
9894 int size = imm_size (n);
9895
9896 if (now_seg == absolute_section)
9897 abs_section_offset += size;
9898 else if (i.op[n].imms->X_op == O_constant)
29b0f896 9899 {
29b0f896 9900 offsetT val;
b4cac588 9901
29b0f896
AM
9902 val = offset_in_range (i.op[n].imms->X_add_number,
9903 size);
9904 p = frag_more (size);
9905 md_number_to_chars (p, val, size);
9906 }
9907 else
9908 {
9909 /* Not absolute_section.
9910 Need a 32-bit fixup (don't support 8bit
9911 non-absolute imms). Try to support other
9912 sizes ... */
f86103b7 9913 enum bfd_reloc_code_real reloc_type;
e205caa7 9914 int sign;
29b0f896 9915
40fb9820 9916 if (i.types[n].bitfield.imm32s
a7d61044 9917 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 9918 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 9919 sign = 1;
e205caa7
L
9920 else
9921 sign = 0;
520dc8e8 9922
29b0f896 9923 p = frag_more (size);
d258b828 9924 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 9925
2bbd9c25
JJ
9926 /* This is tough to explain. We end up with this one if we
9927 * have operands that look like
9928 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
9929 * obtain the absolute address of the GOT, and it is strongly
9930 * preferable from a performance point of view to avoid using
9931 * a runtime relocation for this. The actual sequence of
9932 * instructions often look something like:
9933 *
9934 * call .L66
9935 * .L66:
9936 * popl %ebx
9937 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
9938 *
9939 * The call and pop essentially return the absolute address
9940 * of the label .L66 and store it in %ebx. The linker itself
9941 * will ultimately change the first operand of the addl so
9942 * that %ebx points to the GOT, but to keep things simple, the
9943 * .o file must have this operand set so that it generates not
9944 * the absolute address of .L66, but the absolute address of
9945 * itself. This allows the linker itself simply treat a GOTPC
9946 * relocation as asking for a pcrel offset to the GOT to be
9947 * added in, and the addend of the relocation is stored in the
9948 * operand field for the instruction itself.
9949 *
9950 * Our job here is to fix the operand so that it would add
9951 * the correct offset so that %ebx would point to itself. The
9952 * thing that is tricky is that .-.L66 will point to the
9953 * beginning of the instruction, so we need to further modify
9954 * the operand so that it will point to itself. There are
9955 * other cases where you have something like:
9956 *
9957 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
9958 *
9959 * and here no correction would be required. Internally in
9960 * the assembler we treat operands of this form as not being
9961 * pcrel since the '.' is explicitly mentioned, and I wonder
9962 * whether it would simplify matters to do it this way. Who
9963 * knows. In earlier versions of the PIC patches, the
9964 * pcrel_adjust field was used to store the correction, but
9965 * since the expression is not pcrel, I felt it would be
9966 * confusing to do it this way. */
9967
d6ab8113 9968 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9969 || reloc_type == BFD_RELOC_X86_64_32S
9970 || reloc_type == BFD_RELOC_64)
29b0f896
AM
9971 && GOT_symbol
9972 && GOT_symbol == i.op[n].imms->X_add_symbol
9973 && (i.op[n].imms->X_op == O_symbol
9974 || (i.op[n].imms->X_op == O_add
9975 && ((symbol_get_value_expression
9976 (i.op[n].imms->X_op_symbol)->X_op)
9977 == O_subtract))))
9978 {
4fa24527 9979 if (!object_64bit)
d6ab8113 9980 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 9981 else if (size == 4)
d6ab8113 9982 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
9983 else if (size == 8)
9984 reloc_type = BFD_RELOC_X86_64_GOTPC64;
5b7c81bd 9985 i.has_gotpc_tls_reloc = true;
d583596c
JB
9986 i.op[n].imms->X_add_number +=
9987 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 9988 }
29b0f896
AM
9989 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
9990 i.op[n].imms, 0, reloc_type);
9991 }
9992 }
9993 }
252b5132
RH
9994}
9995\f
d182319b
JB
9996/* x86_cons_fix_new is called via the expression parsing code when a
9997 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
9998static int cons_sign = -1;
9999
10000void
e3bb37b5 10001x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 10002 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 10003{
d258b828 10004 r = reloc (len, 0, cons_sign, r);
d182319b
JB
10005
10006#ifdef TE_PE
10007 if (exp->X_op == O_secrel)
10008 {
10009 exp->X_op = O_symbol;
10010 r = BFD_RELOC_32_SECREL;
10011 }
10012#endif
10013
10014 fix_new_exp (frag, off, len, exp, 0, r);
10015}
10016
357d1bd8
L
10017/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
10018 purpose of the `.dc.a' internal pseudo-op. */
10019
10020int
10021x86_address_bytes (void)
10022{
10023 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
10024 return 4;
10025 return stdoutput->arch_info->bits_per_address / 8;
10026}
10027
d382c579
TG
10028#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
10029 || defined (LEX_AT)
d258b828 10030# define lex_got(reloc, adjust, types) NULL
718ddfc0 10031#else
f3c180ae
AM
10032/* Parse operands of the form
10033 <symbol>@GOTOFF+<nnn>
10034 and similar .plt or .got references.
10035
10036 If we find one, set up the correct relocation in RELOC and copy the
10037 input string, minus the `@GOTOFF' into a malloc'd buffer for
10038 parsing by the calling routine. Return this buffer, and if ADJUST
10039 is non-null set it to the length of the string we removed from the
10040 input line. Otherwise return NULL. */
10041static char *
91d6fa6a 10042lex_got (enum bfd_reloc_code_real *rel,
64e74474 10043 int *adjust,
d258b828 10044 i386_operand_type *types)
f3c180ae 10045{
7b81dfbb
AJ
10046 /* Some of the relocations depend on the size of what field is to
10047 be relocated. But in our callers i386_immediate and i386_displacement
10048 we don't yet know the operand size (this will be set by insn
10049 matching). Hence we record the word32 relocation here,
10050 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
10051 static const struct {
10052 const char *str;
cff8d58a 10053 int len;
4fa24527 10054 const enum bfd_reloc_code_real rel[2];
40fb9820 10055 const i386_operand_type types64;
5b7c81bd 10056 bool need_GOT_symbol;
f3c180ae 10057 } gotrel[] = {
8ce3d284 10058#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
10059 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
10060 BFD_RELOC_SIZE32 },
5b7c81bd 10061 OPERAND_TYPE_IMM32_64, false },
8ce3d284 10062#endif
cff8d58a
L
10063 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
10064 BFD_RELOC_X86_64_PLTOFF64 },
5b7c81bd 10065 OPERAND_TYPE_IMM64, true },
cff8d58a
L
10066 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
10067 BFD_RELOC_X86_64_PLT32 },
5b7c81bd 10068 OPERAND_TYPE_IMM32_32S_DISP32, false },
cff8d58a
L
10069 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
10070 BFD_RELOC_X86_64_GOTPLT64 },
5b7c81bd 10071 OPERAND_TYPE_IMM64_DISP64, true },
cff8d58a
L
10072 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
10073 BFD_RELOC_X86_64_GOTOFF64 },
5b7c81bd 10074 OPERAND_TYPE_IMM64_DISP64, true },
cff8d58a
L
10075 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
10076 BFD_RELOC_X86_64_GOTPCREL },
5b7c81bd 10077 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10078 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
10079 BFD_RELOC_X86_64_TLSGD },
5b7c81bd 10080 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10081 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
10082 _dummy_first_bfd_reloc_code_real },
5b7c81bd 10083 OPERAND_TYPE_NONE, true },
cff8d58a
L
10084 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
10085 BFD_RELOC_X86_64_TLSLD },
5b7c81bd 10086 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10087 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
10088 BFD_RELOC_X86_64_GOTTPOFF },
5b7c81bd 10089 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10090 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
10091 BFD_RELOC_X86_64_TPOFF32 },
5b7c81bd 10092 OPERAND_TYPE_IMM32_32S_64_DISP32_64, true },
cff8d58a
L
10093 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
10094 _dummy_first_bfd_reloc_code_real },
5b7c81bd 10095 OPERAND_TYPE_NONE, true },
cff8d58a
L
10096 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
10097 BFD_RELOC_X86_64_DTPOFF32 },
5b7c81bd 10098 OPERAND_TYPE_IMM32_32S_64_DISP32_64, true },
cff8d58a
L
10099 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
10100 _dummy_first_bfd_reloc_code_real },
5b7c81bd 10101 OPERAND_TYPE_NONE, true },
cff8d58a
L
10102 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
10103 _dummy_first_bfd_reloc_code_real },
5b7c81bd 10104 OPERAND_TYPE_NONE, true },
cff8d58a
L
10105 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
10106 BFD_RELOC_X86_64_GOT32 },
5b7c81bd 10107 OPERAND_TYPE_IMM32_32S_64_DISP32, true },
cff8d58a
L
10108 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
10109 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
5b7c81bd 10110 OPERAND_TYPE_IMM32_32S_DISP32, true },
cff8d58a
L
10111 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
10112 BFD_RELOC_X86_64_TLSDESC_CALL },
5b7c81bd 10113 OPERAND_TYPE_IMM32_32S_DISP32, true },
f3c180ae
AM
10114 };
10115 char *cp;
10116 unsigned int j;
10117
d382c579 10118#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
10119 if (!IS_ELF)
10120 return NULL;
d382c579 10121#endif
718ddfc0 10122
f3c180ae 10123 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 10124 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
10125 return NULL;
10126
47465058 10127 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 10128 {
cff8d58a 10129 int len = gotrel[j].len;
28f81592 10130 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 10131 {
4fa24527 10132 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 10133 {
28f81592
AM
10134 int first, second;
10135 char *tmpbuf, *past_reloc;
f3c180ae 10136
91d6fa6a 10137 *rel = gotrel[j].rel[object_64bit];
f3c180ae 10138
3956db08
JB
10139 if (types)
10140 {
10141 if (flag_code != CODE_64BIT)
40fb9820
L
10142 {
10143 types->bitfield.imm32 = 1;
10144 types->bitfield.disp32 = 1;
10145 }
3956db08
JB
10146 else
10147 *types = gotrel[j].types64;
10148 }
10149
844bf810 10150 if (gotrel[j].need_GOT_symbol && GOT_symbol == NULL)
f3c180ae
AM
10151 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
10152
28f81592 10153 /* The length of the first part of our input line. */
f3c180ae 10154 first = cp - input_line_pointer;
28f81592
AM
10155
10156 /* The second part goes from after the reloc token until
67c11a9b 10157 (and including) an end_of_line char or comma. */
28f81592 10158 past_reloc = cp + 1 + len;
67c11a9b
AM
10159 cp = past_reloc;
10160 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10161 ++cp;
10162 second = cp + 1 - past_reloc;
28f81592
AM
10163
10164 /* Allocate and copy string. The trailing NUL shouldn't
10165 be necessary, but be safe. */
add39d23 10166 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 10167 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
10168 if (second != 0 && *past_reloc != ' ')
10169 /* Replace the relocation token with ' ', so that
10170 errors like foo@GOTOFF1 will be detected. */
10171 tmpbuf[first++] = ' ';
af89796a
L
10172 else
10173 /* Increment length by 1 if the relocation token is
10174 removed. */
10175 len++;
10176 if (adjust)
10177 *adjust = len;
0787a12d
AM
10178 memcpy (tmpbuf + first, past_reloc, second);
10179 tmpbuf[first + second] = '\0';
f3c180ae
AM
10180 return tmpbuf;
10181 }
10182
4fa24527
JB
10183 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10184 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
10185 return NULL;
10186 }
10187 }
10188
10189 /* Might be a symbol version string. Don't as_bad here. */
10190 return NULL;
10191}
4e4f7c87 10192#endif
f3c180ae 10193
a988325c
NC
10194#ifdef TE_PE
10195#ifdef lex_got
10196#undef lex_got
10197#endif
10198/* Parse operands of the form
10199 <symbol>@SECREL32+<nnn>
10200
10201 If we find one, set up the correct relocation in RELOC and copy the
10202 input string, minus the `@SECREL32' into a malloc'd buffer for
10203 parsing by the calling routine. Return this buffer, and if ADJUST
10204 is non-null set it to the length of the string we removed from the
34bca508
L
10205 input line. Otherwise return NULL.
10206
a988325c
NC
10207 This function is copied from the ELF version above adjusted for PE targets. */
10208
10209static char *
10210lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
10211 int *adjust ATTRIBUTE_UNUSED,
d258b828 10212 i386_operand_type *types)
a988325c
NC
10213{
10214 static const struct
10215 {
10216 const char *str;
10217 int len;
10218 const enum bfd_reloc_code_real rel[2];
10219 const i386_operand_type types64;
10220 }
10221 gotrel[] =
10222 {
10223 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
10224 BFD_RELOC_32_SECREL },
10225 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
10226 };
10227
10228 char *cp;
10229 unsigned j;
10230
10231 for (cp = input_line_pointer; *cp != '@'; cp++)
10232 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
10233 return NULL;
10234
10235 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
10236 {
10237 int len = gotrel[j].len;
10238
10239 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
10240 {
10241 if (gotrel[j].rel[object_64bit] != 0)
10242 {
10243 int first, second;
10244 char *tmpbuf, *past_reloc;
10245
10246 *rel = gotrel[j].rel[object_64bit];
10247 if (adjust)
10248 *adjust = len;
10249
10250 if (types)
10251 {
10252 if (flag_code != CODE_64BIT)
10253 {
10254 types->bitfield.imm32 = 1;
10255 types->bitfield.disp32 = 1;
10256 }
10257 else
10258 *types = gotrel[j].types64;
10259 }
10260
10261 /* The length of the first part of our input line. */
10262 first = cp - input_line_pointer;
10263
10264 /* The second part goes from after the reloc token until
10265 (and including) an end_of_line char or comma. */
10266 past_reloc = cp + 1 + len;
10267 cp = past_reloc;
10268 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10269 ++cp;
10270 second = cp + 1 - past_reloc;
10271
10272 /* Allocate and copy string. The trailing NUL shouldn't
10273 be necessary, but be safe. */
add39d23 10274 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
10275 memcpy (tmpbuf, input_line_pointer, first);
10276 if (second != 0 && *past_reloc != ' ')
10277 /* Replace the relocation token with ' ', so that
10278 errors like foo@SECLREL321 will be detected. */
10279 tmpbuf[first++] = ' ';
10280 memcpy (tmpbuf + first, past_reloc, second);
10281 tmpbuf[first + second] = '\0';
10282 return tmpbuf;
10283 }
10284
10285 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10286 gotrel[j].str, 1 << (5 + object_64bit));
10287 return NULL;
10288 }
10289 }
10290
10291 /* Might be a symbol version string. Don't as_bad here. */
10292 return NULL;
10293}
10294
10295#endif /* TE_PE */
10296
62ebcb5c 10297bfd_reloc_code_real_type
e3bb37b5 10298x86_cons (expressionS *exp, int size)
f3c180ae 10299{
62ebcb5c
AM
10300 bfd_reloc_code_real_type got_reloc = NO_RELOC;
10301
ee86248c
JB
10302 intel_syntax = -intel_syntax;
10303
3c7b9c2c 10304 exp->X_md = 0;
4fa24527 10305 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
10306 {
10307 /* Handle @GOTOFF and the like in an expression. */
10308 char *save;
10309 char *gotfree_input_line;
4a57f2cf 10310 int adjust = 0;
f3c180ae
AM
10311
10312 save = input_line_pointer;
d258b828 10313 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
10314 if (gotfree_input_line)
10315 input_line_pointer = gotfree_input_line;
10316
10317 expression (exp);
10318
10319 if (gotfree_input_line)
10320 {
10321 /* expression () has merrily parsed up to the end of line,
10322 or a comma - in the wrong buffer. Transfer how far
10323 input_line_pointer has moved to the right buffer. */
10324 input_line_pointer = (save
10325 + (input_line_pointer - gotfree_input_line)
10326 + adjust);
10327 free (gotfree_input_line);
3992d3b7
AM
10328 if (exp->X_op == O_constant
10329 || exp->X_op == O_absent
10330 || exp->X_op == O_illegal
0398aac5 10331 || exp->X_op == O_register
3992d3b7
AM
10332 || exp->X_op == O_big)
10333 {
10334 char c = *input_line_pointer;
10335 *input_line_pointer = 0;
10336 as_bad (_("missing or invalid expression `%s'"), save);
10337 *input_line_pointer = c;
10338 }
b9519cfe
L
10339 else if ((got_reloc == BFD_RELOC_386_PLT32
10340 || got_reloc == BFD_RELOC_X86_64_PLT32)
10341 && exp->X_op != O_symbol)
10342 {
10343 char c = *input_line_pointer;
10344 *input_line_pointer = 0;
10345 as_bad (_("invalid PLT expression `%s'"), save);
10346 *input_line_pointer = c;
10347 }
f3c180ae
AM
10348 }
10349 }
10350 else
10351 expression (exp);
ee86248c
JB
10352
10353 intel_syntax = -intel_syntax;
10354
10355 if (intel_syntax)
10356 i386_intel_simplify (exp);
62ebcb5c
AM
10357
10358 return got_reloc;
f3c180ae 10359}
f3c180ae 10360
9f32dd5b
L
10361static void
10362signed_cons (int size)
6482c264 10363{
d182319b
JB
10364 if (flag_code == CODE_64BIT)
10365 cons_sign = 1;
10366 cons (size);
10367 cons_sign = -1;
6482c264
NC
10368}
10369
d182319b 10370#ifdef TE_PE
6482c264 10371static void
7016a5d5 10372pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
10373{
10374 expressionS exp;
10375
10376 do
10377 {
10378 expression (&exp);
10379 if (exp.X_op == O_symbol)
10380 exp.X_op = O_secrel;
10381
10382 emit_expr (&exp, 4);
10383 }
10384 while (*input_line_pointer++ == ',');
10385
10386 input_line_pointer--;
10387 demand_empty_rest_of_line ();
10388}
6482c264
NC
10389#endif
10390
43234a1e
L
10391/* Handle Vector operations. */
10392
10393static char *
10394check_VecOperations (char *op_string, char *op_end)
10395{
10396 const reg_entry *mask;
10397 const char *saved;
10398 char *end_op;
10399
10400 while (*op_string
10401 && (op_end == NULL || op_string < op_end))
10402 {
10403 saved = op_string;
10404 if (*op_string == '{')
10405 {
10406 op_string++;
10407
10408 /* Check broadcasts. */
d34049e8 10409 if (startswith (op_string, "1to"))
43234a1e 10410 {
5273a3cd 10411 unsigned int bcst_type;
43234a1e 10412
5273a3cd 10413 if (i.broadcast.type)
43234a1e
L
10414 goto duplicated_vec_op;
10415
10416 op_string += 3;
10417 if (*op_string == '8')
8e6e0792 10418 bcst_type = 8;
b28d1bda 10419 else if (*op_string == '4')
8e6e0792 10420 bcst_type = 4;
b28d1bda 10421 else if (*op_string == '2')
8e6e0792 10422 bcst_type = 2;
43234a1e
L
10423 else if (*op_string == '1'
10424 && *(op_string+1) == '6')
10425 {
8e6e0792 10426 bcst_type = 16;
43234a1e
L
10427 op_string++;
10428 }
10429 else
10430 {
10431 as_bad (_("Unsupported broadcast: `%s'"), saved);
10432 return NULL;
10433 }
10434 op_string++;
10435
5273a3cd
JB
10436 i.broadcast.type = bcst_type;
10437 i.broadcast.operand = this_operand;
43234a1e
L
10438 }
10439 /* Check masking operation. */
10440 else if ((mask = parse_register (op_string, &end_op)) != NULL)
10441 {
8a6fb3f9
JB
10442 if (mask == &bad_reg)
10443 return NULL;
10444
43234a1e 10445 /* k0 can't be used for write mask. */
f74a6307 10446 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 10447 {
6d2cd6b2
JB
10448 as_bad (_("`%s%s' can't be used for write mask"),
10449 register_prefix, mask->reg_name);
43234a1e
L
10450 return NULL;
10451 }
10452
6225c532 10453 if (!i.mask.reg)
43234a1e 10454 {
6225c532
JB
10455 i.mask.reg = mask;
10456 i.mask.operand = this_operand;
43234a1e 10457 }
6225c532
JB
10458 else if (i.mask.reg->reg_num)
10459 goto duplicated_vec_op;
43234a1e
L
10460 else
10461 {
6225c532 10462 i.mask.reg = mask;
43234a1e
L
10463
10464 /* Only "{z}" is allowed here. No need to check
10465 zeroing mask explicitly. */
6225c532 10466 if (i.mask.operand != (unsigned int) this_operand)
43234a1e
L
10467 {
10468 as_bad (_("invalid write mask `%s'"), saved);
10469 return NULL;
10470 }
10471 }
10472
10473 op_string = end_op;
10474 }
10475 /* Check zeroing-flag for masking operation. */
10476 else if (*op_string == 'z')
10477 {
6225c532 10478 if (!i.mask.reg)
43234a1e 10479 {
6225c532
JB
10480 i.mask.reg = reg_k0;
10481 i.mask.zeroing = 1;
10482 i.mask.operand = this_operand;
43234a1e
L
10483 }
10484 else
10485 {
6225c532 10486 if (i.mask.zeroing)
43234a1e
L
10487 {
10488 duplicated_vec_op:
10489 as_bad (_("duplicated `%s'"), saved);
10490 return NULL;
10491 }
10492
6225c532 10493 i.mask.zeroing = 1;
43234a1e
L
10494
10495 /* Only "{%k}" is allowed here. No need to check mask
10496 register explicitly. */
6225c532 10497 if (i.mask.operand != (unsigned int) this_operand)
43234a1e
L
10498 {
10499 as_bad (_("invalid zeroing-masking `%s'"),
10500 saved);
10501 return NULL;
10502 }
10503 }
10504
10505 op_string++;
10506 }
10507 else
10508 goto unknown_vec_op;
10509
10510 if (*op_string != '}')
10511 {
10512 as_bad (_("missing `}' in `%s'"), saved);
10513 return NULL;
10514 }
10515 op_string++;
0ba3a731
L
10516
10517 /* Strip whitespace since the addition of pseudo prefixes
10518 changed how the scrubber treats '{'. */
10519 if (is_space_char (*op_string))
10520 ++op_string;
10521
43234a1e
L
10522 continue;
10523 }
10524 unknown_vec_op:
10525 /* We don't know this one. */
10526 as_bad (_("unknown vector operation: `%s'"), saved);
10527 return NULL;
10528 }
10529
6225c532 10530 if (i.mask.reg && i.mask.zeroing && !i.mask.reg->reg_num)
6d2cd6b2
JB
10531 {
10532 as_bad (_("zeroing-masking only allowed with write mask"));
10533 return NULL;
10534 }
10535
43234a1e
L
10536 return op_string;
10537}
10538
252b5132 10539static int
70e41ade 10540i386_immediate (char *imm_start)
252b5132
RH
10541{
10542 char *save_input_line_pointer;
f3c180ae 10543 char *gotfree_input_line;
252b5132 10544 segT exp_seg = 0;
47926f60 10545 expressionS *exp;
40fb9820
L
10546 i386_operand_type types;
10547
0dfbf9d7 10548 operand_type_set (&types, ~0);
252b5132
RH
10549
10550 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
10551 {
31b2323c
L
10552 as_bad (_("at most %d immediate operands are allowed"),
10553 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
10554 return 0;
10555 }
10556
10557 exp = &im_expressions[i.imm_operands++];
520dc8e8 10558 i.op[this_operand].imms = exp;
252b5132
RH
10559
10560 if (is_space_char (*imm_start))
10561 ++imm_start;
10562
10563 save_input_line_pointer = input_line_pointer;
10564 input_line_pointer = imm_start;
10565
d258b828 10566 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10567 if (gotfree_input_line)
10568 input_line_pointer = gotfree_input_line;
252b5132
RH
10569
10570 exp_seg = expression (exp);
10571
83183c0c 10572 SKIP_WHITESPACE ();
43234a1e
L
10573
10574 /* Handle vector operations. */
10575 if (*input_line_pointer == '{')
10576 {
10577 input_line_pointer = check_VecOperations (input_line_pointer,
10578 NULL);
10579 if (input_line_pointer == NULL)
10580 return 0;
10581 }
10582
252b5132 10583 if (*input_line_pointer)
f3c180ae 10584 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
10585
10586 input_line_pointer = save_input_line_pointer;
f3c180ae 10587 if (gotfree_input_line)
ee86248c
JB
10588 {
10589 free (gotfree_input_line);
10590
10591 if (exp->X_op == O_constant || exp->X_op == O_register)
10592 exp->X_op = O_illegal;
10593 }
10594
10595 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
10596}
252b5132 10597
ee86248c
JB
10598static int
10599i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10600 i386_operand_type types, const char *imm_start)
10601{
10602 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 10603 {
313c53d1
L
10604 if (imm_start)
10605 as_bad (_("missing or invalid immediate expression `%s'"),
10606 imm_start);
3992d3b7 10607 return 0;
252b5132 10608 }
3e73aa7c 10609 else if (exp->X_op == O_constant)
252b5132 10610 {
47926f60 10611 /* Size it properly later. */
40fb9820 10612 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
10613 /* If not 64bit, sign extend val. */
10614 if (flag_code != CODE_64BIT
4eed87de
AM
10615 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
10616 exp->X_add_number
10617 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 10618 }
4c63da97 10619#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 10620 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 10621 && exp_seg != absolute_section
47926f60 10622 && exp_seg != text_section
24eab124
AM
10623 && exp_seg != data_section
10624 && exp_seg != bss_section
10625 && exp_seg != undefined_section
f86103b7 10626 && !bfd_is_com_section (exp_seg))
252b5132 10627 {
d0b47220 10628 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
10629 return 0;
10630 }
10631#endif
a841bdf5 10632 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 10633 {
313c53d1
L
10634 if (imm_start)
10635 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
10636 return 0;
10637 }
252b5132
RH
10638 else
10639 {
10640 /* This is an address. The size of the address will be
24eab124 10641 determined later, depending on destination register,
3e73aa7c 10642 suffix, or the default for the section. */
40fb9820
L
10643 i.types[this_operand].bitfield.imm8 = 1;
10644 i.types[this_operand].bitfield.imm16 = 1;
10645 i.types[this_operand].bitfield.imm32 = 1;
10646 i.types[this_operand].bitfield.imm32s = 1;
10647 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
10648 i.types[this_operand] = operand_type_and (i.types[this_operand],
10649 types);
252b5132
RH
10650 }
10651
10652 return 1;
10653}
10654
551c1ca1 10655static char *
e3bb37b5 10656i386_scale (char *scale)
252b5132 10657{
551c1ca1
AM
10658 offsetT val;
10659 char *save = input_line_pointer;
252b5132 10660
551c1ca1
AM
10661 input_line_pointer = scale;
10662 val = get_absolute_expression ();
10663
10664 switch (val)
252b5132 10665 {
551c1ca1 10666 case 1:
252b5132
RH
10667 i.log2_scale_factor = 0;
10668 break;
551c1ca1 10669 case 2:
252b5132
RH
10670 i.log2_scale_factor = 1;
10671 break;
551c1ca1 10672 case 4:
252b5132
RH
10673 i.log2_scale_factor = 2;
10674 break;
551c1ca1 10675 case 8:
252b5132
RH
10676 i.log2_scale_factor = 3;
10677 break;
10678 default:
a724f0f4
JB
10679 {
10680 char sep = *input_line_pointer;
10681
10682 *input_line_pointer = '\0';
10683 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
10684 scale);
10685 *input_line_pointer = sep;
10686 input_line_pointer = save;
10687 return NULL;
10688 }
252b5132 10689 }
29b0f896 10690 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
10691 {
10692 as_warn (_("scale factor of %d without an index register"),
24eab124 10693 1 << i.log2_scale_factor);
252b5132 10694 i.log2_scale_factor = 0;
252b5132 10695 }
551c1ca1
AM
10696 scale = input_line_pointer;
10697 input_line_pointer = save;
10698 return scale;
252b5132
RH
10699}
10700
252b5132 10701static int
e3bb37b5 10702i386_displacement (char *disp_start, char *disp_end)
252b5132 10703{
29b0f896 10704 expressionS *exp;
252b5132
RH
10705 segT exp_seg = 0;
10706 char *save_input_line_pointer;
f3c180ae 10707 char *gotfree_input_line;
40fb9820
L
10708 int override;
10709 i386_operand_type bigdisp, types = anydisp;
3992d3b7 10710 int ret;
252b5132 10711
31b2323c
L
10712 if (i.disp_operands == MAX_MEMORY_OPERANDS)
10713 {
10714 as_bad (_("at most %d displacement operands are allowed"),
10715 MAX_MEMORY_OPERANDS);
10716 return 0;
10717 }
10718
0dfbf9d7 10719 operand_type_set (&bigdisp, 0);
6f2f06be 10720 if (i.jumpabsolute
48bcea9f 10721 || i.types[this_operand].bitfield.baseindex
0cfa3eb3
JB
10722 || (current_templates->start->opcode_modifier.jump != JUMP
10723 && current_templates->start->opcode_modifier.jump != JUMP_DWORD))
e05278af 10724 {
48bcea9f 10725 i386_addressing_mode ();
e05278af 10726 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
10727 if (flag_code == CODE_64BIT)
10728 {
10729 if (!override)
10730 {
10731 bigdisp.bitfield.disp32s = 1;
10732 bigdisp.bitfield.disp64 = 1;
10733 }
48bcea9f
JB
10734 else
10735 bigdisp.bitfield.disp32 = 1;
40fb9820
L
10736 }
10737 else if ((flag_code == CODE_16BIT) ^ override)
40fb9820 10738 bigdisp.bitfield.disp16 = 1;
48bcea9f
JB
10739 else
10740 bigdisp.bitfield.disp32 = 1;
e05278af
JB
10741 }
10742 else
10743 {
376cd056
JB
10744 /* For PC-relative branches, the width of the displacement may be
10745 dependent upon data size, but is never dependent upon address size.
10746 Also make sure to not unintentionally match against a non-PC-relative
10747 branch template. */
10748 static templates aux_templates;
10749 const insn_template *t = current_templates->start;
5b7c81bd 10750 bool has_intel64 = false;
376cd056
JB
10751
10752 aux_templates.start = t;
10753 while (++t < current_templates->end)
10754 {
10755 if (t->opcode_modifier.jump
10756 != current_templates->start->opcode_modifier.jump)
10757 break;
4b5aaf5f 10758 if ((t->opcode_modifier.isa64 >= INTEL64))
5b7c81bd 10759 has_intel64 = true;
376cd056
JB
10760 }
10761 if (t < current_templates->end)
10762 {
10763 aux_templates.end = t;
10764 current_templates = &aux_templates;
10765 }
10766
e05278af 10767 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
10768 if (flag_code == CODE_64BIT)
10769 {
376cd056
JB
10770 if ((override || i.suffix == WORD_MNEM_SUFFIX)
10771 && (!intel64 || !has_intel64))
40fb9820
L
10772 bigdisp.bitfield.disp16 = 1;
10773 else
48bcea9f 10774 bigdisp.bitfield.disp32s = 1;
40fb9820
L
10775 }
10776 else
e05278af
JB
10777 {
10778 if (!override)
10779 override = (i.suffix == (flag_code != CODE_16BIT
10780 ? WORD_MNEM_SUFFIX
10781 : LONG_MNEM_SUFFIX));
40fb9820
L
10782 bigdisp.bitfield.disp32 = 1;
10783 if ((flag_code == CODE_16BIT) ^ override)
10784 {
10785 bigdisp.bitfield.disp32 = 0;
10786 bigdisp.bitfield.disp16 = 1;
10787 }
e05278af 10788 }
e05278af 10789 }
c6fb90c8
L
10790 i.types[this_operand] = operand_type_or (i.types[this_operand],
10791 bigdisp);
252b5132
RH
10792
10793 exp = &disp_expressions[i.disp_operands];
520dc8e8 10794 i.op[this_operand].disps = exp;
252b5132
RH
10795 i.disp_operands++;
10796 save_input_line_pointer = input_line_pointer;
10797 input_line_pointer = disp_start;
10798 END_STRING_AND_SAVE (disp_end);
10799
10800#ifndef GCC_ASM_O_HACK
10801#define GCC_ASM_O_HACK 0
10802#endif
10803#if GCC_ASM_O_HACK
10804 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 10805 if (i.types[this_operand].bitfield.baseIndex
24eab124 10806 && displacement_string_end[-1] == '+')
252b5132
RH
10807 {
10808 /* This hack is to avoid a warning when using the "o"
24eab124
AM
10809 constraint within gcc asm statements.
10810 For instance:
10811
10812 #define _set_tssldt_desc(n,addr,limit,type) \
10813 __asm__ __volatile__ ( \
10814 "movw %w2,%0\n\t" \
10815 "movw %w1,2+%0\n\t" \
10816 "rorl $16,%1\n\t" \
10817 "movb %b1,4+%0\n\t" \
10818 "movb %4,5+%0\n\t" \
10819 "movb $0,6+%0\n\t" \
10820 "movb %h1,7+%0\n\t" \
10821 "rorl $16,%1" \
10822 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
10823
10824 This works great except that the output assembler ends
10825 up looking a bit weird if it turns out that there is
10826 no offset. You end up producing code that looks like:
10827
10828 #APP
10829 movw $235,(%eax)
10830 movw %dx,2+(%eax)
10831 rorl $16,%edx
10832 movb %dl,4+(%eax)
10833 movb $137,5+(%eax)
10834 movb $0,6+(%eax)
10835 movb %dh,7+(%eax)
10836 rorl $16,%edx
10837 #NO_APP
10838
47926f60 10839 So here we provide the missing zero. */
24eab124
AM
10840
10841 *displacement_string_end = '0';
252b5132
RH
10842 }
10843#endif
d258b828 10844 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10845 if (gotfree_input_line)
10846 input_line_pointer = gotfree_input_line;
252b5132 10847
24eab124 10848 exp_seg = expression (exp);
252b5132 10849
636c26b0
AM
10850 SKIP_WHITESPACE ();
10851 if (*input_line_pointer)
10852 as_bad (_("junk `%s' after expression"), input_line_pointer);
10853#if GCC_ASM_O_HACK
10854 RESTORE_END_STRING (disp_end + 1);
10855#endif
636c26b0 10856 input_line_pointer = save_input_line_pointer;
636c26b0 10857 if (gotfree_input_line)
ee86248c
JB
10858 {
10859 free (gotfree_input_line);
10860
10861 if (exp->X_op == O_constant || exp->X_op == O_register)
10862 exp->X_op = O_illegal;
10863 }
10864
10865 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
10866
10867 RESTORE_END_STRING (disp_end);
10868
10869 return ret;
10870}
10871
10872static int
10873i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10874 i386_operand_type types, const char *disp_start)
10875{
10876 i386_operand_type bigdisp;
10877 int ret = 1;
636c26b0 10878
24eab124
AM
10879 /* We do this to make sure that the section symbol is in
10880 the symbol table. We will ultimately change the relocation
47926f60 10881 to be relative to the beginning of the section. */
1ae12ab7 10882 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
10883 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
10884 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 10885 {
636c26b0 10886 if (exp->X_op != O_symbol)
3992d3b7 10887 goto inv_disp;
636c26b0 10888
e5cb08ac 10889 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
10890 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
10891 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 10892 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
10893 exp->X_op = O_subtract;
10894 exp->X_op_symbol = GOT_symbol;
1ae12ab7 10895 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 10896 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
10897 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
10898 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 10899 else
29b0f896 10900 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 10901 }
252b5132 10902
3992d3b7
AM
10903 else if (exp->X_op == O_absent
10904 || exp->X_op == O_illegal
ee86248c 10905 || exp->X_op == O_big)
2daf4fd8 10906 {
3992d3b7
AM
10907 inv_disp:
10908 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 10909 disp_start);
3992d3b7 10910 ret = 0;
2daf4fd8
AM
10911 }
10912
0e1147d9
L
10913 else if (flag_code == CODE_64BIT
10914 && !i.prefix[ADDR_PREFIX]
10915 && exp->X_op == O_constant)
10916 {
10917 /* Since displacement is signed extended to 64bit, don't allow
10918 disp32 and turn off disp32s if they are out of range. */
10919 i.types[this_operand].bitfield.disp32 = 0;
10920 if (!fits_in_signed_long (exp->X_add_number))
10921 {
10922 i.types[this_operand].bitfield.disp32s = 0;
10923 if (i.types[this_operand].bitfield.baseindex)
10924 {
10925 as_bad (_("0x%lx out range of signed 32bit displacement"),
10926 (long) exp->X_add_number);
10927 ret = 0;
10928 }
10929 }
10930 }
10931
4c63da97 10932#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
10933 else if (exp->X_op != O_constant
10934 && OUTPUT_FLAVOR == bfd_target_aout_flavour
10935 && exp_seg != absolute_section
10936 && exp_seg != text_section
10937 && exp_seg != data_section
10938 && exp_seg != bss_section
10939 && exp_seg != undefined_section
10940 && !bfd_is_com_section (exp_seg))
24eab124 10941 {
d0b47220 10942 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 10943 ret = 0;
24eab124 10944 }
252b5132 10945#endif
3956db08 10946
48bcea9f
JB
10947 if (current_templates->start->opcode_modifier.jump == JUMP_BYTE
10948 /* Constants get taken care of by optimize_disp(). */
10949 && exp->X_op != O_constant)
10950 i.types[this_operand].bitfield.disp8 = 1;
10951
40fb9820
L
10952 /* Check if this is a displacement only operand. */
10953 bigdisp = i.types[this_operand];
10954 bigdisp.bitfield.disp8 = 0;
10955 bigdisp.bitfield.disp16 = 0;
10956 bigdisp.bitfield.disp32 = 0;
10957 bigdisp.bitfield.disp32s = 0;
10958 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 10959 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
10960 i.types[this_operand] = operand_type_and (i.types[this_operand],
10961 types);
3956db08 10962
3992d3b7 10963 return ret;
252b5132
RH
10964}
10965
2abc2bec
JB
10966/* Return the active addressing mode, taking address override and
10967 registers forming the address into consideration. Update the
10968 address override prefix if necessary. */
47926f60 10969
2abc2bec
JB
10970static enum flag_code
10971i386_addressing_mode (void)
252b5132 10972{
be05d201
L
10973 enum flag_code addr_mode;
10974
10975 if (i.prefix[ADDR_PREFIX])
10976 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
a23b33b3
JB
10977 else if (flag_code == CODE_16BIT
10978 && current_templates->start->cpu_flags.bitfield.cpumpx
10979 /* Avoid replacing the "16-bit addressing not allowed" diagnostic
10980 from md_assemble() by "is not a valid base/index expression"
10981 when there is a base and/or index. */
10982 && !i.types[this_operand].bitfield.baseindex)
10983 {
10984 /* MPX insn memory operands with neither base nor index must be forced
10985 to use 32-bit addressing in 16-bit mode. */
10986 addr_mode = CODE_32BIT;
10987 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10988 ++i.prefixes;
10989 gas_assert (!i.types[this_operand].bitfield.disp16);
10990 gas_assert (!i.types[this_operand].bitfield.disp32);
10991 }
be05d201
L
10992 else
10993 {
10994 addr_mode = flag_code;
10995
24eab124 10996#if INFER_ADDR_PREFIX
be05d201
L
10997 if (i.mem_operands == 0)
10998 {
10999 /* Infer address prefix from the first memory operand. */
11000 const reg_entry *addr_reg = i.base_reg;
11001
11002 if (addr_reg == NULL)
11003 addr_reg = i.index_reg;
eecb386c 11004
be05d201
L
11005 if (addr_reg)
11006 {
e968fc9b 11007 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
11008 addr_mode = CODE_32BIT;
11009 else if (flag_code != CODE_64BIT
dc821c5f 11010 && addr_reg->reg_type.bitfield.word)
be05d201
L
11011 addr_mode = CODE_16BIT;
11012
11013 if (addr_mode != flag_code)
11014 {
11015 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
11016 i.prefixes += 1;
11017 /* Change the size of any displacement too. At most one
11018 of Disp16 or Disp32 is set.
11019 FIXME. There doesn't seem to be any real need for
11020 separate Disp16 and Disp32 flags. The same goes for
11021 Imm16 and Imm32. Removing them would probably clean
11022 up the code quite a lot. */
11023 if (flag_code != CODE_64BIT
11024 && (i.types[this_operand].bitfield.disp16
11025 || i.types[this_operand].bitfield.disp32))
11026 i.types[this_operand]
11027 = operand_type_xor (i.types[this_operand], disp16_32);
11028 }
11029 }
11030 }
24eab124 11031#endif
be05d201
L
11032 }
11033
2abc2bec
JB
11034 return addr_mode;
11035}
11036
11037/* Make sure the memory operand we've been dealt is valid.
11038 Return 1 on success, 0 on a failure. */
11039
11040static int
11041i386_index_check (const char *operand_string)
11042{
11043 const char *kind = "base/index";
11044 enum flag_code addr_mode = i386_addressing_mode ();
a152332d 11045 const insn_template *t = current_templates->start;
2abc2bec 11046
a152332d
JB
11047 if (t->opcode_modifier.isstring
11048 && !t->cpu_flags.bitfield.cpupadlock
fc0763e6
JB
11049 && (current_templates->end[-1].opcode_modifier.isstring
11050 || i.mem_operands))
11051 {
11052 /* Memory operands of string insns are special in that they only allow
11053 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
11054 const reg_entry *expected_reg;
11055 static const char *di_si[][2] =
11056 {
11057 { "esi", "edi" },
11058 { "si", "di" },
11059 { "rsi", "rdi" }
11060 };
11061 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
11062
11063 kind = "string address";
11064
a152332d 11065 if (t->opcode_modifier.prefixok == PrefixRep)
fc0763e6 11066 {
51c8edf6
JB
11067 int es_op = current_templates->end[-1].opcode_modifier.isstring
11068 - IS_STRING_ES_OP0;
11069 int op = 0;
fc0763e6 11070
51c8edf6 11071 if (!current_templates->end[-1].operand_types[0].bitfield.baseindex
fc0763e6
JB
11072 || ((!i.mem_operands != !intel_syntax)
11073 && current_templates->end[-1].operand_types[1]
11074 .bitfield.baseindex))
51c8edf6 11075 op = 1;
fe0e921f
AM
11076 expected_reg
11077 = (const reg_entry *) str_hash_find (reg_hash,
11078 di_si[addr_mode][op == es_op]);
fc0763e6
JB
11079 }
11080 else
fe0e921f
AM
11081 expected_reg
11082 = (const reg_entry *)str_hash_find (reg_hash, bx[addr_mode]);
fc0763e6 11083
be05d201
L
11084 if (i.base_reg != expected_reg
11085 || i.index_reg
fc0763e6 11086 || operand_type_check (i.types[this_operand], disp))
fc0763e6 11087 {
be05d201
L
11088 /* The second memory operand must have the same size as
11089 the first one. */
11090 if (i.mem_operands
11091 && i.base_reg
11092 && !((addr_mode == CODE_64BIT
dc821c5f 11093 && i.base_reg->reg_type.bitfield.qword)
be05d201 11094 || (addr_mode == CODE_32BIT
dc821c5f
JB
11095 ? i.base_reg->reg_type.bitfield.dword
11096 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
11097 goto bad_address;
11098
fc0763e6
JB
11099 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
11100 operand_string,
11101 intel_syntax ? '[' : '(',
11102 register_prefix,
be05d201 11103 expected_reg->reg_name,
fc0763e6 11104 intel_syntax ? ']' : ')');
be05d201 11105 return 1;
fc0763e6 11106 }
be05d201
L
11107 else
11108 return 1;
11109
dc1e8a47 11110 bad_address:
be05d201
L
11111 as_bad (_("`%s' is not a valid %s expression"),
11112 operand_string, kind);
11113 return 0;
3e73aa7c
JH
11114 }
11115 else
11116 {
be05d201
L
11117 if (addr_mode != CODE_16BIT)
11118 {
11119 /* 32-bit/64-bit checks. */
41eb8e88
L
11120 if (i.disp_encoding == disp_encoding_16bit)
11121 {
11122 bad_disp:
11123 as_bad (_("invalid `%s' prefix"),
11124 addr_mode == CODE_16BIT ? "{disp32}" : "{disp16}");
11125 return 0;
11126 }
11127
be05d201 11128 if ((i.base_reg
e968fc9b
JB
11129 && ((addr_mode == CODE_64BIT
11130 ? !i.base_reg->reg_type.bitfield.qword
11131 : !i.base_reg->reg_type.bitfield.dword)
11132 || (i.index_reg && i.base_reg->reg_num == RegIP)
11133 || i.base_reg->reg_num == RegIZ))
be05d201 11134 || (i.index_reg
1b54b8d7
JB
11135 && !i.index_reg->reg_type.bitfield.xmmword
11136 && !i.index_reg->reg_type.bitfield.ymmword
11137 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 11138 && ((addr_mode == CODE_64BIT
e968fc9b
JB
11139 ? !i.index_reg->reg_type.bitfield.qword
11140 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
11141 || !i.index_reg->reg_type.bitfield.baseindex)))
11142 goto bad_address;
8178be5b 11143
260cd341 11144 /* bndmk, bndldx, bndstx and mandatory non-vector SIB have special restrictions. */
a152332d 11145 if ((t->opcode_modifier.opcodeprefix == PREFIX_0XF3
389d00a5
JB
11146 && t->opcode_modifier.opcodespace == SPACE_0F
11147 && t->base_opcode == 0x1b)
a152332d 11148 || (t->opcode_modifier.opcodeprefix == PREFIX_NONE
389d00a5
JB
11149 && t->opcode_modifier.opcodespace == SPACE_0F
11150 && (t->base_opcode & ~1) == 0x1a)
a152332d 11151 || t->opcode_modifier.sib == SIBMEM)
8178be5b
JB
11152 {
11153 /* They cannot use RIP-relative addressing. */
e968fc9b 11154 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
11155 {
11156 as_bad (_("`%s' cannot be used here"), operand_string);
11157 return 0;
11158 }
11159
11160 /* bndldx and bndstx ignore their scale factor. */
a152332d 11161 if (t->opcode_modifier.opcodeprefix == PREFIX_NONE
389d00a5
JB
11162 && t->opcode_modifier.opcodespace == SPACE_0F
11163 && (t->base_opcode & ~1) == 0x1a
8178be5b
JB
11164 && i.log2_scale_factor)
11165 as_warn (_("register scaling is being ignored here"));
11166 }
be05d201
L
11167 }
11168 else
3e73aa7c 11169 {
be05d201 11170 /* 16-bit checks. */
41eb8e88
L
11171 if (i.disp_encoding == disp_encoding_32bit)
11172 goto bad_disp;
11173
3e73aa7c 11174 if ((i.base_reg
dc821c5f 11175 && (!i.base_reg->reg_type.bitfield.word
40fb9820 11176 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 11177 || (i.index_reg
dc821c5f 11178 && (!i.index_reg->reg_type.bitfield.word
40fb9820 11179 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
11180 || !(i.base_reg
11181 && i.base_reg->reg_num < 6
11182 && i.index_reg->reg_num >= 6
11183 && i.log2_scale_factor == 0))))
be05d201 11184 goto bad_address;
3e73aa7c
JH
11185 }
11186 }
be05d201 11187 return 1;
24eab124 11188}
252b5132 11189
43234a1e
L
11190/* Handle vector immediates. */
11191
11192static int
11193RC_SAE_immediate (const char *imm_start)
11194{
11195 unsigned int match_found, j;
11196 const char *pstr = imm_start;
11197 expressionS *exp;
11198
11199 if (*pstr != '{')
11200 return 0;
11201
11202 pstr++;
11203 match_found = 0;
11204 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
11205 {
11206 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
11207 {
ca5312a2 11208 if (i.rounding.type != rc_none)
43234a1e
L
11209 {
11210 as_bad (_("duplicated `%s'"), imm_start);
11211 return 0;
11212 }
ca5312a2
JB
11213
11214 i.rounding.type = RC_NamesTable[j].type;
11215 i.rounding.operand = this_operand;
11216
43234a1e
L
11217 pstr += RC_NamesTable[j].len;
11218 match_found = 1;
11219 break;
11220 }
11221 }
11222 if (!match_found)
11223 return 0;
11224
11225 if (*pstr++ != '}')
11226 {
11227 as_bad (_("Missing '}': '%s'"), imm_start);
11228 return 0;
11229 }
11230 /* RC/SAE immediate string should contain nothing more. */;
11231 if (*pstr != 0)
11232 {
11233 as_bad (_("Junk after '}': '%s'"), imm_start);
11234 return 0;
11235 }
11236
11237 exp = &im_expressions[i.imm_operands++];
11238 i.op[this_operand].imms = exp;
11239
11240 exp->X_op = O_constant;
11241 exp->X_add_number = 0;
11242 exp->X_add_symbol = (symbolS *) 0;
11243 exp->X_op_symbol = (symbolS *) 0;
11244
11245 i.types[this_operand].bitfield.imm8 = 1;
11246 return 1;
11247}
11248
8325cc63
JB
11249/* Only string instructions can have a second memory operand, so
11250 reduce current_templates to just those if it contains any. */
11251static int
11252maybe_adjust_templates (void)
11253{
11254 const insn_template *t;
11255
11256 gas_assert (i.mem_operands == 1);
11257
11258 for (t = current_templates->start; t < current_templates->end; ++t)
11259 if (t->opcode_modifier.isstring)
11260 break;
11261
11262 if (t < current_templates->end)
11263 {
11264 static templates aux_templates;
5b7c81bd 11265 bool recheck;
8325cc63
JB
11266
11267 aux_templates.start = t;
11268 for (; t < current_templates->end; ++t)
11269 if (!t->opcode_modifier.isstring)
11270 break;
11271 aux_templates.end = t;
11272
11273 /* Determine whether to re-check the first memory operand. */
11274 recheck = (aux_templates.start != current_templates->start
11275 || t != current_templates->end);
11276
11277 current_templates = &aux_templates;
11278
11279 if (recheck)
11280 {
11281 i.mem_operands = 0;
11282 if (i.memop1_string != NULL
11283 && i386_index_check (i.memop1_string) == 0)
11284 return 0;
11285 i.mem_operands = 1;
11286 }
11287 }
11288
11289 return 1;
11290}
11291
fc0763e6 11292/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 11293 on error. */
252b5132 11294
252b5132 11295static int
a7619375 11296i386_att_operand (char *operand_string)
252b5132 11297{
af6bdddf
AM
11298 const reg_entry *r;
11299 char *end_op;
24eab124 11300 char *op_string = operand_string;
252b5132 11301
24eab124 11302 if (is_space_char (*op_string))
252b5132
RH
11303 ++op_string;
11304
24eab124 11305 /* We check for an absolute prefix (differentiating,
47926f60 11306 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
11307 if (*op_string == ABSOLUTE_PREFIX)
11308 {
11309 ++op_string;
11310 if (is_space_char (*op_string))
11311 ++op_string;
5b7c81bd 11312 i.jumpabsolute = true;
24eab124 11313 }
252b5132 11314
47926f60 11315 /* Check if operand is a register. */
4d1bb795 11316 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 11317 {
40fb9820
L
11318 i386_operand_type temp;
11319
8a6fb3f9
JB
11320 if (r == &bad_reg)
11321 return 0;
11322
24eab124
AM
11323 /* Check for a segment override by searching for ':' after a
11324 segment register. */
11325 op_string = end_op;
11326 if (is_space_char (*op_string))
11327 ++op_string;
00cee14f 11328 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124 11329 {
5e042380 11330 i.seg[i.mem_operands] = r;
252b5132 11331
24eab124 11332 /* Skip the ':' and whitespace. */
252b5132
RH
11333 ++op_string;
11334 if (is_space_char (*op_string))
24eab124 11335 ++op_string;
252b5132 11336
24eab124
AM
11337 if (!is_digit_char (*op_string)
11338 && !is_identifier_char (*op_string)
11339 && *op_string != '('
11340 && *op_string != ABSOLUTE_PREFIX)
11341 {
11342 as_bad (_("bad memory operand `%s'"), op_string);
11343 return 0;
11344 }
47926f60 11345 /* Handle case of %es:*foo. */
24eab124
AM
11346 if (*op_string == ABSOLUTE_PREFIX)
11347 {
11348 ++op_string;
11349 if (is_space_char (*op_string))
11350 ++op_string;
5b7c81bd 11351 i.jumpabsolute = true;
24eab124
AM
11352 }
11353 goto do_memory_reference;
11354 }
43234a1e
L
11355
11356 /* Handle vector operations. */
11357 if (*op_string == '{')
11358 {
11359 op_string = check_VecOperations (op_string, NULL);
11360 if (op_string == NULL)
11361 return 0;
11362 }
11363
24eab124
AM
11364 if (*op_string)
11365 {
d0b47220 11366 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
11367 return 0;
11368 }
40fb9820
L
11369 temp = r->reg_type;
11370 temp.bitfield.baseindex = 0;
c6fb90c8
L
11371 i.types[this_operand] = operand_type_or (i.types[this_operand],
11372 temp);
7d5e4556 11373 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 11374 i.op[this_operand].regs = r;
24eab124
AM
11375 i.reg_operands++;
11376 }
af6bdddf
AM
11377 else if (*op_string == REGISTER_PREFIX)
11378 {
11379 as_bad (_("bad register name `%s'"), op_string);
11380 return 0;
11381 }
24eab124 11382 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 11383 {
24eab124 11384 ++op_string;
6f2f06be 11385 if (i.jumpabsolute)
24eab124 11386 {
d0b47220 11387 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
11388 return 0;
11389 }
11390 if (!i386_immediate (op_string))
11391 return 0;
11392 }
43234a1e
L
11393 else if (RC_SAE_immediate (operand_string))
11394 {
11395 /* If it is a RC or SAE immediate, do nothing. */
11396 ;
11397 }
24eab124
AM
11398 else if (is_digit_char (*op_string)
11399 || is_identifier_char (*op_string)
d02603dc 11400 || *op_string == '"'
e5cb08ac 11401 || *op_string == '(')
24eab124 11402 {
47926f60 11403 /* This is a memory reference of some sort. */
af6bdddf 11404 char *base_string;
252b5132 11405
47926f60 11406 /* Start and end of displacement string expression (if found). */
eecb386c
AM
11407 char *displacement_string_start;
11408 char *displacement_string_end;
43234a1e 11409 char *vop_start;
252b5132 11410
24eab124 11411 do_memory_reference:
8325cc63
JB
11412 if (i.mem_operands == 1 && !maybe_adjust_templates ())
11413 return 0;
24eab124 11414 if ((i.mem_operands == 1
40fb9820 11415 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
11416 || i.mem_operands == 2)
11417 {
11418 as_bad (_("too many memory references for `%s'"),
11419 current_templates->start->name);
11420 return 0;
11421 }
252b5132 11422
24eab124
AM
11423 /* Check for base index form. We detect the base index form by
11424 looking for an ')' at the end of the operand, searching
11425 for the '(' matching it, and finding a REGISTER_PREFIX or ','
11426 after the '('. */
af6bdddf 11427 base_string = op_string + strlen (op_string);
c3332e24 11428
43234a1e
L
11429 /* Handle vector operations. */
11430 vop_start = strchr (op_string, '{');
11431 if (vop_start && vop_start < base_string)
11432 {
11433 if (check_VecOperations (vop_start, base_string) == NULL)
11434 return 0;
11435 base_string = vop_start;
11436 }
11437
af6bdddf
AM
11438 --base_string;
11439 if (is_space_char (*base_string))
11440 --base_string;
252b5132 11441
47926f60 11442 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
11443 displacement_string_start = op_string;
11444 displacement_string_end = base_string + 1;
252b5132 11445
24eab124
AM
11446 if (*base_string == ')')
11447 {
af6bdddf 11448 char *temp_string;
24eab124
AM
11449 unsigned int parens_balanced = 1;
11450 /* We've already checked that the number of left & right ()'s are
47926f60 11451 equal, so this loop will not be infinite. */
24eab124
AM
11452 do
11453 {
11454 base_string--;
11455 if (*base_string == ')')
11456 parens_balanced++;
11457 if (*base_string == '(')
11458 parens_balanced--;
11459 }
11460 while (parens_balanced);
c3332e24 11461
af6bdddf 11462 temp_string = base_string;
c3332e24 11463
24eab124 11464 /* Skip past '(' and whitespace. */
252b5132
RH
11465 ++base_string;
11466 if (is_space_char (*base_string))
24eab124 11467 ++base_string;
252b5132 11468
af6bdddf 11469 if (*base_string == ','
4eed87de
AM
11470 || ((i.base_reg = parse_register (base_string, &end_op))
11471 != NULL))
252b5132 11472 {
af6bdddf 11473 displacement_string_end = temp_string;
252b5132 11474
40fb9820 11475 i.types[this_operand].bitfield.baseindex = 1;
252b5132 11476
af6bdddf 11477 if (i.base_reg)
24eab124 11478 {
8a6fb3f9
JB
11479 if (i.base_reg == &bad_reg)
11480 return 0;
24eab124
AM
11481 base_string = end_op;
11482 if (is_space_char (*base_string))
11483 ++base_string;
af6bdddf
AM
11484 }
11485
11486 /* There may be an index reg or scale factor here. */
11487 if (*base_string == ',')
11488 {
11489 ++base_string;
11490 if (is_space_char (*base_string))
11491 ++base_string;
11492
4eed87de
AM
11493 if ((i.index_reg = parse_register (base_string, &end_op))
11494 != NULL)
24eab124 11495 {
8a6fb3f9
JB
11496 if (i.index_reg == &bad_reg)
11497 return 0;
af6bdddf 11498 base_string = end_op;
24eab124
AM
11499 if (is_space_char (*base_string))
11500 ++base_string;
af6bdddf
AM
11501 if (*base_string == ',')
11502 {
11503 ++base_string;
11504 if (is_space_char (*base_string))
11505 ++base_string;
11506 }
e5cb08ac 11507 else if (*base_string != ')')
af6bdddf 11508 {
4eed87de
AM
11509 as_bad (_("expecting `,' or `)' "
11510 "after index register in `%s'"),
af6bdddf
AM
11511 operand_string);
11512 return 0;
11513 }
24eab124 11514 }
af6bdddf 11515 else if (*base_string == REGISTER_PREFIX)
24eab124 11516 {
f76bf5e0
L
11517 end_op = strchr (base_string, ',');
11518 if (end_op)
11519 *end_op = '\0';
af6bdddf 11520 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
11521 return 0;
11522 }
252b5132 11523
47926f60 11524 /* Check for scale factor. */
551c1ca1 11525 if (*base_string != ')')
af6bdddf 11526 {
551c1ca1
AM
11527 char *end_scale = i386_scale (base_string);
11528
11529 if (!end_scale)
af6bdddf 11530 return 0;
24eab124 11531
551c1ca1 11532 base_string = end_scale;
af6bdddf
AM
11533 if (is_space_char (*base_string))
11534 ++base_string;
11535 if (*base_string != ')')
11536 {
4eed87de
AM
11537 as_bad (_("expecting `)' "
11538 "after scale factor in `%s'"),
af6bdddf
AM
11539 operand_string);
11540 return 0;
11541 }
11542 }
11543 else if (!i.index_reg)
24eab124 11544 {
4eed87de
AM
11545 as_bad (_("expecting index register or scale factor "
11546 "after `,'; got '%c'"),
af6bdddf 11547 *base_string);
24eab124
AM
11548 return 0;
11549 }
11550 }
af6bdddf 11551 else if (*base_string != ')')
24eab124 11552 {
4eed87de
AM
11553 as_bad (_("expecting `,' or `)' "
11554 "after base register in `%s'"),
af6bdddf 11555 operand_string);
24eab124
AM
11556 return 0;
11557 }
c3332e24 11558 }
af6bdddf 11559 else if (*base_string == REGISTER_PREFIX)
c3332e24 11560 {
f76bf5e0
L
11561 end_op = strchr (base_string, ',');
11562 if (end_op)
11563 *end_op = '\0';
af6bdddf 11564 as_bad (_("bad register name `%s'"), base_string);
24eab124 11565 return 0;
c3332e24 11566 }
24eab124
AM
11567 }
11568
11569 /* If there's an expression beginning the operand, parse it,
11570 assuming displacement_string_start and
11571 displacement_string_end are meaningful. */
11572 if (displacement_string_start != displacement_string_end)
11573 {
11574 if (!i386_displacement (displacement_string_start,
11575 displacement_string_end))
11576 return 0;
11577 }
11578
11579 /* Special case for (%dx) while doing input/output op. */
11580 if (i.base_reg
75e5731b
JB
11581 && i.base_reg->reg_type.bitfield.instance == RegD
11582 && i.base_reg->reg_type.bitfield.word
24eab124
AM
11583 && i.index_reg == 0
11584 && i.log2_scale_factor == 0
11585 && i.seg[i.mem_operands] == 0
40fb9820 11586 && !operand_type_check (i.types[this_operand], disp))
24eab124 11587 {
2fb5be8d 11588 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
11589 return 1;
11590 }
11591
eecb386c
AM
11592 if (i386_index_check (operand_string) == 0)
11593 return 0;
c48dadc9 11594 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
11595 if (i.mem_operands == 0)
11596 i.memop1_string = xstrdup (operand_string);
24eab124
AM
11597 i.mem_operands++;
11598 }
11599 else
ce8a8b2f
AM
11600 {
11601 /* It's not a memory operand; argh! */
24eab124
AM
11602 as_bad (_("invalid char %s beginning operand %d `%s'"),
11603 output_invalid (*op_string),
11604 this_operand + 1,
11605 op_string);
11606 return 0;
11607 }
47926f60 11608 return 1; /* Normal return. */
252b5132
RH
11609}
11610\f
fa94de6b
RM
11611/* Calculate the maximum variable size (i.e., excluding fr_fix)
11612 that an rs_machine_dependent frag may reach. */
11613
11614unsigned int
11615i386_frag_max_var (fragS *frag)
11616{
11617 /* The only relaxable frags are for jumps.
11618 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
11619 gas_assert (frag->fr_type == rs_machine_dependent);
11620 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
11621}
11622
b084df0b
L
11623#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11624static int
8dcea932 11625elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
11626{
11627 /* STT_GNU_IFUNC symbol must go through PLT. */
11628 if ((symbol_get_bfdsym (fr_symbol)->flags
11629 & BSF_GNU_INDIRECT_FUNCTION) != 0)
11630 return 0;
11631
11632 if (!S_IS_EXTERNAL (fr_symbol))
11633 /* Symbol may be weak or local. */
11634 return !S_IS_WEAK (fr_symbol);
11635
8dcea932
L
11636 /* Global symbols with non-default visibility can't be preempted. */
11637 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
11638 return 1;
11639
11640 if (fr_var != NO_RELOC)
11641 switch ((enum bfd_reloc_code_real) fr_var)
11642 {
11643 case BFD_RELOC_386_PLT32:
11644 case BFD_RELOC_X86_64_PLT32:
33eaf5de 11645 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
11646 return 0;
11647 default:
11648 abort ();
11649 }
11650
b084df0b
L
11651 /* Global symbols with default visibility in a shared library may be
11652 preempted by another definition. */
8dcea932 11653 return !shared;
b084df0b
L
11654}
11655#endif
11656
79d72f45
HL
11657/* Table 3-2. Macro-Fusible Instructions in Haswell Microarchitecture
11658 Note also work for Skylake and Cascadelake.
11659---------------------------------------------------------------------
11660| JCC | ADD/SUB/CMP | INC/DEC | TEST/AND |
11661| ------ | ----------- | ------- | -------- |
11662| Jo | N | N | Y |
11663| Jno | N | N | Y |
11664| Jc/Jb | Y | N | Y |
11665| Jae/Jnb | Y | N | Y |
11666| Je/Jz | Y | Y | Y |
11667| Jne/Jnz | Y | Y | Y |
11668| Jna/Jbe | Y | N | Y |
11669| Ja/Jnbe | Y | N | Y |
11670| Js | N | N | Y |
11671| Jns | N | N | Y |
11672| Jp/Jpe | N | N | Y |
11673| Jnp/Jpo | N | N | Y |
11674| Jl/Jnge | Y | Y | Y |
11675| Jge/Jnl | Y | Y | Y |
11676| Jle/Jng | Y | Y | Y |
11677| Jg/Jnle | Y | Y | Y |
11678--------------------------------------------------------------------- */
11679static int
11680i386_macro_fusible_p (enum mf_cmp_kind mf_cmp, enum mf_jcc_kind mf_jcc)
11681{
11682 if (mf_cmp == mf_cmp_alu_cmp)
11683 return ((mf_jcc >= mf_jcc_jc && mf_jcc <= mf_jcc_jna)
11684 || mf_jcc == mf_jcc_jl || mf_jcc == mf_jcc_jle);
11685 if (mf_cmp == mf_cmp_incdec)
11686 return (mf_jcc == mf_jcc_je || mf_jcc == mf_jcc_jl
11687 || mf_jcc == mf_jcc_jle);
11688 if (mf_cmp == mf_cmp_test_and)
11689 return 1;
11690 return 0;
11691}
11692
e379e5f3
L
11693/* Return the next non-empty frag. */
11694
11695static fragS *
11696i386_next_non_empty_frag (fragS *fragP)
11697{
11698 /* There may be a frag with a ".fill 0" when there is no room in
11699 the current frag for frag_grow in output_insn. */
11700 for (fragP = fragP->fr_next;
11701 (fragP != NULL
11702 && fragP->fr_type == rs_fill
11703 && fragP->fr_fix == 0);
11704 fragP = fragP->fr_next)
11705 ;
11706 return fragP;
11707}
11708
11709/* Return the next jcc frag after BRANCH_PADDING. */
11710
11711static fragS *
79d72f45 11712i386_next_fusible_jcc_frag (fragS *maybe_cmp_fragP, fragS *pad_fragP)
e379e5f3 11713{
79d72f45
HL
11714 fragS *branch_fragP;
11715 if (!pad_fragP)
e379e5f3
L
11716 return NULL;
11717
79d72f45
HL
11718 if (pad_fragP->fr_type == rs_machine_dependent
11719 && (TYPE_FROM_RELAX_STATE (pad_fragP->fr_subtype)
e379e5f3
L
11720 == BRANCH_PADDING))
11721 {
79d72f45
HL
11722 branch_fragP = i386_next_non_empty_frag (pad_fragP);
11723 if (branch_fragP->fr_type != rs_machine_dependent)
e379e5f3 11724 return NULL;
79d72f45
HL
11725 if (TYPE_FROM_RELAX_STATE (branch_fragP->fr_subtype) == COND_JUMP
11726 && i386_macro_fusible_p (maybe_cmp_fragP->tc_frag_data.mf_type,
11727 pad_fragP->tc_frag_data.mf_type))
11728 return branch_fragP;
e379e5f3
L
11729 }
11730
11731 return NULL;
11732}
11733
11734/* Classify BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags. */
11735
11736static void
11737i386_classify_machine_dependent_frag (fragS *fragP)
11738{
11739 fragS *cmp_fragP;
11740 fragS *pad_fragP;
11741 fragS *branch_fragP;
11742 fragS *next_fragP;
11743 unsigned int max_prefix_length;
11744
11745 if (fragP->tc_frag_data.classified)
11746 return;
11747
11748 /* First scan for BRANCH_PADDING and FUSED_JCC_PADDING. Convert
11749 FUSED_JCC_PADDING and merge BRANCH_PADDING. */
11750 for (next_fragP = fragP;
11751 next_fragP != NULL;
11752 next_fragP = next_fragP->fr_next)
11753 {
11754 next_fragP->tc_frag_data.classified = 1;
11755 if (next_fragP->fr_type == rs_machine_dependent)
11756 switch (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype))
11757 {
11758 case BRANCH_PADDING:
11759 /* The BRANCH_PADDING frag must be followed by a branch
11760 frag. */
11761 branch_fragP = i386_next_non_empty_frag (next_fragP);
11762 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11763 break;
11764 case FUSED_JCC_PADDING:
11765 /* Check if this is a fused jcc:
11766 FUSED_JCC_PADDING
11767 CMP like instruction
11768 BRANCH_PADDING
11769 COND_JUMP
11770 */
11771 cmp_fragP = i386_next_non_empty_frag (next_fragP);
11772 pad_fragP = i386_next_non_empty_frag (cmp_fragP);
79d72f45 11773 branch_fragP = i386_next_fusible_jcc_frag (next_fragP, pad_fragP);
e379e5f3
L
11774 if (branch_fragP)
11775 {
11776 /* The BRANCH_PADDING frag is merged with the
11777 FUSED_JCC_PADDING frag. */
11778 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11779 /* CMP like instruction size. */
11780 next_fragP->tc_frag_data.cmp_size = cmp_fragP->fr_fix;
11781 frag_wane (pad_fragP);
11782 /* Skip to branch_fragP. */
11783 next_fragP = branch_fragP;
11784 }
11785 else if (next_fragP->tc_frag_data.max_prefix_length)
11786 {
11787 /* Turn FUSED_JCC_PADDING into BRANCH_PREFIX if it isn't
11788 a fused jcc. */
11789 next_fragP->fr_subtype
11790 = ENCODE_RELAX_STATE (BRANCH_PREFIX, 0);
11791 next_fragP->tc_frag_data.max_bytes
11792 = next_fragP->tc_frag_data.max_prefix_length;
11793 /* This will be updated in the BRANCH_PREFIX scan. */
11794 next_fragP->tc_frag_data.max_prefix_length = 0;
11795 }
11796 else
11797 frag_wane (next_fragP);
11798 break;
11799 }
11800 }
11801
11802 /* Stop if there is no BRANCH_PREFIX. */
11803 if (!align_branch_prefix_size)
11804 return;
11805
11806 /* Scan for BRANCH_PREFIX. */
11807 for (; fragP != NULL; fragP = fragP->fr_next)
11808 {
11809 if (fragP->fr_type != rs_machine_dependent
11810 || (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11811 != BRANCH_PREFIX))
11812 continue;
11813
11814 /* Count all BRANCH_PREFIX frags before BRANCH_PADDING and
11815 COND_JUMP_PREFIX. */
11816 max_prefix_length = 0;
11817 for (next_fragP = fragP;
11818 next_fragP != NULL;
11819 next_fragP = next_fragP->fr_next)
11820 {
11821 if (next_fragP->fr_type == rs_fill)
11822 /* Skip rs_fill frags. */
11823 continue;
11824 else if (next_fragP->fr_type != rs_machine_dependent)
11825 /* Stop for all other frags. */
11826 break;
11827
11828 /* rs_machine_dependent frags. */
11829 if (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11830 == BRANCH_PREFIX)
11831 {
11832 /* Count BRANCH_PREFIX frags. */
11833 if (max_prefix_length >= MAX_FUSED_JCC_PADDING_SIZE)
11834 {
11835 max_prefix_length = MAX_FUSED_JCC_PADDING_SIZE;
11836 frag_wane (next_fragP);
11837 }
11838 else
11839 max_prefix_length
11840 += next_fragP->tc_frag_data.max_bytes;
11841 }
11842 else if ((TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11843 == BRANCH_PADDING)
11844 || (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11845 == FUSED_JCC_PADDING))
11846 {
11847 /* Stop at BRANCH_PADDING and FUSED_JCC_PADDING. */
11848 fragP->tc_frag_data.u.padding_fragP = next_fragP;
11849 break;
11850 }
11851 else
11852 /* Stop for other rs_machine_dependent frags. */
11853 break;
11854 }
11855
11856 fragP->tc_frag_data.max_prefix_length = max_prefix_length;
11857
11858 /* Skip to the next frag. */
11859 fragP = next_fragP;
11860 }
11861}
11862
11863/* Compute padding size for
11864
11865 FUSED_JCC_PADDING
11866 CMP like instruction
11867 BRANCH_PADDING
11868 COND_JUMP/UNCOND_JUMP
11869
11870 or
11871
11872 BRANCH_PADDING
11873 COND_JUMP/UNCOND_JUMP
11874 */
11875
11876static int
11877i386_branch_padding_size (fragS *fragP, offsetT address)
11878{
11879 unsigned int offset, size, padding_size;
11880 fragS *branch_fragP = fragP->tc_frag_data.u.branch_fragP;
11881
11882 /* The start address of the BRANCH_PADDING or FUSED_JCC_PADDING frag. */
11883 if (!address)
11884 address = fragP->fr_address;
11885 address += fragP->fr_fix;
11886
11887 /* CMP like instrunction size. */
11888 size = fragP->tc_frag_data.cmp_size;
11889
11890 /* The base size of the branch frag. */
11891 size += branch_fragP->fr_fix;
11892
11893 /* Add opcode and displacement bytes for the rs_machine_dependent
11894 branch frag. */
11895 if (branch_fragP->fr_type == rs_machine_dependent)
11896 size += md_relax_table[branch_fragP->fr_subtype].rlx_length;
11897
11898 /* Check if branch is within boundary and doesn't end at the last
11899 byte. */
11900 offset = address & ((1U << align_branch_power) - 1);
11901 if ((offset + size) >= (1U << align_branch_power))
11902 /* Padding needed to avoid crossing boundary. */
11903 padding_size = (1U << align_branch_power) - offset;
11904 else
11905 /* No padding needed. */
11906 padding_size = 0;
11907
11908 /* The return value may be saved in tc_frag_data.length which is
11909 unsigned byte. */
11910 if (!fits_in_unsigned_byte (padding_size))
11911 abort ();
11912
11913 return padding_size;
11914}
11915
11916/* i386_generic_table_relax_frag()
11917
11918 Handle BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags to
11919 grow/shrink padding to align branch frags. Hand others to
11920 relax_frag(). */
11921
11922long
11923i386_generic_table_relax_frag (segT segment, fragS *fragP, long stretch)
11924{
11925 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11926 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11927 {
11928 long padding_size = i386_branch_padding_size (fragP, 0);
11929 long grow = padding_size - fragP->tc_frag_data.length;
11930
11931 /* When the BRANCH_PREFIX frag is used, the computed address
11932 must match the actual address and there should be no padding. */
11933 if (fragP->tc_frag_data.padding_address
11934 && (fragP->tc_frag_data.padding_address != fragP->fr_address
11935 || padding_size))
11936 abort ();
11937
11938 /* Update the padding size. */
11939 if (grow)
11940 fragP->tc_frag_data.length = padding_size;
11941
11942 return grow;
11943 }
11944 else if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11945 {
11946 fragS *padding_fragP, *next_fragP;
11947 long padding_size, left_size, last_size;
11948
11949 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
11950 if (!padding_fragP)
11951 /* Use the padding set by the leading BRANCH_PREFIX frag. */
11952 return (fragP->tc_frag_data.length
11953 - fragP->tc_frag_data.last_length);
11954
11955 /* Compute the relative address of the padding frag in the very
11956 first time where the BRANCH_PREFIX frag sizes are zero. */
11957 if (!fragP->tc_frag_data.padding_address)
11958 fragP->tc_frag_data.padding_address
11959 = padding_fragP->fr_address - (fragP->fr_address - stretch);
11960
11961 /* First update the last length from the previous interation. */
11962 left_size = fragP->tc_frag_data.prefix_length;
11963 for (next_fragP = fragP;
11964 next_fragP != padding_fragP;
11965 next_fragP = next_fragP->fr_next)
11966 if (next_fragP->fr_type == rs_machine_dependent
11967 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11968 == BRANCH_PREFIX))
11969 {
11970 if (left_size)
11971 {
11972 int max = next_fragP->tc_frag_data.max_bytes;
11973 if (max)
11974 {
11975 int size;
11976 if (max > left_size)
11977 size = left_size;
11978 else
11979 size = max;
11980 left_size -= size;
11981 next_fragP->tc_frag_data.last_length = size;
11982 }
11983 }
11984 else
11985 next_fragP->tc_frag_data.last_length = 0;
11986 }
11987
11988 /* Check the padding size for the padding frag. */
11989 padding_size = i386_branch_padding_size
11990 (padding_fragP, (fragP->fr_address
11991 + fragP->tc_frag_data.padding_address));
11992
11993 last_size = fragP->tc_frag_data.prefix_length;
11994 /* Check if there is change from the last interation. */
11995 if (padding_size == last_size)
11996 {
11997 /* Update the expected address of the padding frag. */
11998 padding_fragP->tc_frag_data.padding_address
11999 = (fragP->fr_address + padding_size
12000 + fragP->tc_frag_data.padding_address);
12001 return 0;
12002 }
12003
12004 if (padding_size > fragP->tc_frag_data.max_prefix_length)
12005 {
12006 /* No padding if there is no sufficient room. Clear the
12007 expected address of the padding frag. */
12008 padding_fragP->tc_frag_data.padding_address = 0;
12009 padding_size = 0;
12010 }
12011 else
12012 /* Store the expected address of the padding frag. */
12013 padding_fragP->tc_frag_data.padding_address
12014 = (fragP->fr_address + padding_size
12015 + fragP->tc_frag_data.padding_address);
12016
12017 fragP->tc_frag_data.prefix_length = padding_size;
12018
12019 /* Update the length for the current interation. */
12020 left_size = padding_size;
12021 for (next_fragP = fragP;
12022 next_fragP != padding_fragP;
12023 next_fragP = next_fragP->fr_next)
12024 if (next_fragP->fr_type == rs_machine_dependent
12025 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
12026 == BRANCH_PREFIX))
12027 {
12028 if (left_size)
12029 {
12030 int max = next_fragP->tc_frag_data.max_bytes;
12031 if (max)
12032 {
12033 int size;
12034 if (max > left_size)
12035 size = left_size;
12036 else
12037 size = max;
12038 left_size -= size;
12039 next_fragP->tc_frag_data.length = size;
12040 }
12041 }
12042 else
12043 next_fragP->tc_frag_data.length = 0;
12044 }
12045
12046 return (fragP->tc_frag_data.length
12047 - fragP->tc_frag_data.last_length);
12048 }
12049 return relax_frag (segment, fragP, stretch);
12050}
12051
ee7fcc42
AM
12052/* md_estimate_size_before_relax()
12053
12054 Called just before relax() for rs_machine_dependent frags. The x86
12055 assembler uses these frags to handle variable size jump
12056 instructions.
12057
12058 Any symbol that is now undefined will not become defined.
12059 Return the correct fr_subtype in the frag.
12060 Return the initial "guess for variable size of frag" to caller.
12061 The guess is actually the growth beyond the fixed part. Whatever
12062 we do to grow the fixed or variable part contributes to our
12063 returned value. */
12064
252b5132 12065int
7016a5d5 12066md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 12067{
e379e5f3
L
12068 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12069 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX
12070 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
12071 {
12072 i386_classify_machine_dependent_frag (fragP);
12073 return fragP->tc_frag_data.length;
12074 }
12075
252b5132 12076 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
12077 check for un-relaxable symbols. On an ELF system, we can't relax
12078 an externally visible symbol, because it may be overridden by a
12079 shared library. */
12080 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 12081#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12082 || (IS_ELF
8dcea932
L
12083 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
12084 fragP->fr_var))
fbeb56a4
DK
12085#endif
12086#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 12087 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 12088 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
12089#endif
12090 )
252b5132 12091 {
b98ef147
AM
12092 /* Symbol is undefined in this segment, or we need to keep a
12093 reloc so that weak symbols can be overridden. */
12094 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 12095 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
12096 unsigned char *opcode;
12097 int old_fr_fix;
f6af82bd 12098
ee7fcc42 12099 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 12100 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 12101 else if (size == 2)
f6af82bd 12102 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
12103#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12104 else if (need_plt32_p (fragP->fr_symbol))
12105 reloc_type = BFD_RELOC_X86_64_PLT32;
12106#endif
f6af82bd
AM
12107 else
12108 reloc_type = BFD_RELOC_32_PCREL;
252b5132 12109
ee7fcc42
AM
12110 old_fr_fix = fragP->fr_fix;
12111 opcode = (unsigned char *) fragP->fr_opcode;
12112
fddf5b5b 12113 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 12114 {
fddf5b5b
AM
12115 case UNCOND_JUMP:
12116 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 12117 opcode[0] = 0xe9;
252b5132 12118 fragP->fr_fix += size;
062cd5e7
AS
12119 fix_new (fragP, old_fr_fix, size,
12120 fragP->fr_symbol,
12121 fragP->fr_offset, 1,
12122 reloc_type);
252b5132
RH
12123 break;
12124
fddf5b5b 12125 case COND_JUMP86:
412167cb
AM
12126 if (size == 2
12127 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
12128 {
12129 /* Negate the condition, and branch past an
12130 unconditional jump. */
12131 opcode[0] ^= 1;
12132 opcode[1] = 3;
12133 /* Insert an unconditional jump. */
12134 opcode[2] = 0xe9;
12135 /* We added two extra opcode bytes, and have a two byte
12136 offset. */
12137 fragP->fr_fix += 2 + 2;
062cd5e7
AS
12138 fix_new (fragP, old_fr_fix + 2, 2,
12139 fragP->fr_symbol,
12140 fragP->fr_offset, 1,
12141 reloc_type);
fddf5b5b
AM
12142 break;
12143 }
12144 /* Fall through. */
12145
12146 case COND_JUMP:
412167cb
AM
12147 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
12148 {
3e02c1cc
AM
12149 fixS *fixP;
12150
412167cb 12151 fragP->fr_fix += 1;
3e02c1cc
AM
12152 fixP = fix_new (fragP, old_fr_fix, 1,
12153 fragP->fr_symbol,
12154 fragP->fr_offset, 1,
12155 BFD_RELOC_8_PCREL);
12156 fixP->fx_signed = 1;
412167cb
AM
12157 break;
12158 }
93c2a809 12159
24eab124 12160 /* This changes the byte-displacement jump 0x7N
fddf5b5b 12161 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 12162 opcode[1] = opcode[0] + 0x10;
f6af82bd 12163 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
12164 /* We've added an opcode byte. */
12165 fragP->fr_fix += 1 + size;
062cd5e7
AS
12166 fix_new (fragP, old_fr_fix + 1, size,
12167 fragP->fr_symbol,
12168 fragP->fr_offset, 1,
12169 reloc_type);
252b5132 12170 break;
fddf5b5b
AM
12171
12172 default:
12173 BAD_CASE (fragP->fr_subtype);
12174 break;
252b5132
RH
12175 }
12176 frag_wane (fragP);
ee7fcc42 12177 return fragP->fr_fix - old_fr_fix;
252b5132 12178 }
93c2a809 12179
93c2a809
AM
12180 /* Guess size depending on current relax state. Initially the relax
12181 state will correspond to a short jump and we return 1, because
12182 the variable part of the frag (the branch offset) is one byte
12183 long. However, we can relax a section more than once and in that
12184 case we must either set fr_subtype back to the unrelaxed state,
12185 or return the value for the appropriate branch. */
12186 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
12187}
12188
47926f60
KH
12189/* Called after relax() is finished.
12190
12191 In: Address of frag.
12192 fr_type == rs_machine_dependent.
12193 fr_subtype is what the address relaxed to.
12194
12195 Out: Any fixSs and constants are set up.
12196 Caller will turn frag into a ".space 0". */
12197
252b5132 12198void
7016a5d5
TG
12199md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
12200 fragS *fragP)
252b5132 12201{
29b0f896 12202 unsigned char *opcode;
252b5132 12203 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
12204 offsetT target_address;
12205 offsetT opcode_address;
252b5132 12206 unsigned int extension = 0;
847f7ad4 12207 offsetT displacement_from_opcode_start;
252b5132 12208
e379e5f3
L
12209 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12210 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING
12211 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12212 {
12213 /* Generate nop padding. */
12214 unsigned int size = fragP->tc_frag_data.length;
12215 if (size)
12216 {
12217 if (size > fragP->tc_frag_data.max_bytes)
12218 abort ();
12219
12220 if (flag_debug)
12221 {
12222 const char *msg;
12223 const char *branch = "branch";
12224 const char *prefix = "";
12225 fragS *padding_fragP;
12226 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
12227 == BRANCH_PREFIX)
12228 {
12229 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
12230 switch (fragP->tc_frag_data.default_prefix)
12231 {
12232 default:
12233 abort ();
12234 break;
12235 case CS_PREFIX_OPCODE:
12236 prefix = " cs";
12237 break;
12238 case DS_PREFIX_OPCODE:
12239 prefix = " ds";
12240 break;
12241 case ES_PREFIX_OPCODE:
12242 prefix = " es";
12243 break;
12244 case FS_PREFIX_OPCODE:
12245 prefix = " fs";
12246 break;
12247 case GS_PREFIX_OPCODE:
12248 prefix = " gs";
12249 break;
12250 case SS_PREFIX_OPCODE:
12251 prefix = " ss";
12252 break;
12253 }
12254 if (padding_fragP)
12255 msg = _("%s:%u: add %d%s at 0x%llx to align "
12256 "%s within %d-byte boundary\n");
12257 else
12258 msg = _("%s:%u: add additional %d%s at 0x%llx to "
12259 "align %s within %d-byte boundary\n");
12260 }
12261 else
12262 {
12263 padding_fragP = fragP;
12264 msg = _("%s:%u: add %d%s-byte nop at 0x%llx to align "
12265 "%s within %d-byte boundary\n");
12266 }
12267
12268 if (padding_fragP)
12269 switch (padding_fragP->tc_frag_data.branch_type)
12270 {
12271 case align_branch_jcc:
12272 branch = "jcc";
12273 break;
12274 case align_branch_fused:
12275 branch = "fused jcc";
12276 break;
12277 case align_branch_jmp:
12278 branch = "jmp";
12279 break;
12280 case align_branch_call:
12281 branch = "call";
12282 break;
12283 case align_branch_indirect:
12284 branch = "indiret branch";
12285 break;
12286 case align_branch_ret:
12287 branch = "ret";
12288 break;
12289 default:
12290 break;
12291 }
12292
12293 fprintf (stdout, msg,
12294 fragP->fr_file, fragP->fr_line, size, prefix,
12295 (long long) fragP->fr_address, branch,
12296 1 << align_branch_power);
12297 }
12298 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12299 memset (fragP->fr_opcode,
12300 fragP->tc_frag_data.default_prefix, size);
12301 else
12302 i386_generate_nops (fragP, (char *) fragP->fr_opcode,
12303 size, 0);
12304 fragP->fr_fix += size;
12305 }
12306 return;
12307 }
12308
252b5132
RH
12309 opcode = (unsigned char *) fragP->fr_opcode;
12310
47926f60 12311 /* Address we want to reach in file space. */
252b5132 12312 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 12313
47926f60 12314 /* Address opcode resides at in file space. */
252b5132
RH
12315 opcode_address = fragP->fr_address + fragP->fr_fix;
12316
47926f60 12317 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
12318 displacement_from_opcode_start = target_address - opcode_address;
12319
fddf5b5b 12320 if ((fragP->fr_subtype & BIG) == 0)
252b5132 12321 {
47926f60
KH
12322 /* Don't have to change opcode. */
12323 extension = 1; /* 1 opcode + 1 displacement */
252b5132 12324 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
12325 }
12326 else
12327 {
12328 if (no_cond_jump_promotion
12329 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
12330 as_warn_where (fragP->fr_file, fragP->fr_line,
12331 _("long jump required"));
252b5132 12332
fddf5b5b
AM
12333 switch (fragP->fr_subtype)
12334 {
12335 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
12336 extension = 4; /* 1 opcode + 4 displacement */
12337 opcode[0] = 0xe9;
12338 where_to_put_displacement = &opcode[1];
12339 break;
252b5132 12340
fddf5b5b
AM
12341 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
12342 extension = 2; /* 1 opcode + 2 displacement */
12343 opcode[0] = 0xe9;
12344 where_to_put_displacement = &opcode[1];
12345 break;
252b5132 12346
fddf5b5b
AM
12347 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
12348 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
12349 extension = 5; /* 2 opcode + 4 displacement */
12350 opcode[1] = opcode[0] + 0x10;
12351 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12352 where_to_put_displacement = &opcode[2];
12353 break;
252b5132 12354
fddf5b5b
AM
12355 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
12356 extension = 3; /* 2 opcode + 2 displacement */
12357 opcode[1] = opcode[0] + 0x10;
12358 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12359 where_to_put_displacement = &opcode[2];
12360 break;
252b5132 12361
fddf5b5b
AM
12362 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
12363 extension = 4;
12364 opcode[0] ^= 1;
12365 opcode[1] = 3;
12366 opcode[2] = 0xe9;
12367 where_to_put_displacement = &opcode[3];
12368 break;
12369
12370 default:
12371 BAD_CASE (fragP->fr_subtype);
12372 break;
12373 }
252b5132 12374 }
fddf5b5b 12375
7b81dfbb
AJ
12376 /* If size if less then four we are sure that the operand fits,
12377 but if it's 4, then it could be that the displacement is larger
12378 then -/+ 2GB. */
12379 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
12380 && object_64bit
12381 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
12382 + ((addressT) 1 << 31))
12383 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
12384 {
12385 as_bad_where (fragP->fr_file, fragP->fr_line,
12386 _("jump target out of range"));
12387 /* Make us emit 0. */
12388 displacement_from_opcode_start = extension;
12389 }
47926f60 12390 /* Now put displacement after opcode. */
252b5132
RH
12391 md_number_to_chars ((char *) where_to_put_displacement,
12392 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 12393 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
12394 fragP->fr_fix += extension;
12395}
12396\f
7016a5d5 12397/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
12398 by our caller that we have all the info we need to fix it up.
12399
7016a5d5
TG
12400 Parameter valP is the pointer to the value of the bits.
12401
252b5132
RH
12402 On the 386, immediates, displacements, and data pointers are all in
12403 the same (little-endian) format, so we don't need to care about which
12404 we are handling. */
12405
94f592af 12406void
7016a5d5 12407md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 12408{
94f592af 12409 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 12410 valueT value = *valP;
252b5132 12411
f86103b7 12412#if !defined (TE_Mach)
93382f6d
AM
12413 if (fixP->fx_pcrel)
12414 {
12415 switch (fixP->fx_r_type)
12416 {
5865bb77
ILT
12417 default:
12418 break;
12419
d6ab8113
JB
12420 case BFD_RELOC_64:
12421 fixP->fx_r_type = BFD_RELOC_64_PCREL;
12422 break;
93382f6d 12423 case BFD_RELOC_32:
ae8887b5 12424 case BFD_RELOC_X86_64_32S:
93382f6d
AM
12425 fixP->fx_r_type = BFD_RELOC_32_PCREL;
12426 break;
12427 case BFD_RELOC_16:
12428 fixP->fx_r_type = BFD_RELOC_16_PCREL;
12429 break;
12430 case BFD_RELOC_8:
12431 fixP->fx_r_type = BFD_RELOC_8_PCREL;
12432 break;
12433 }
12434 }
252b5132 12435
a161fe53 12436 if (fixP->fx_addsy != NULL
31312f95 12437 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 12438 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 12439 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 12440 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 12441 && !use_rela_relocations)
252b5132 12442 {
31312f95
AM
12443 /* This is a hack. There should be a better way to handle this.
12444 This covers for the fact that bfd_install_relocation will
12445 subtract the current location (for partial_inplace, PC relative
12446 relocations); see more below. */
252b5132 12447#ifndef OBJ_AOUT
718ddfc0 12448 if (IS_ELF
252b5132
RH
12449#ifdef TE_PE
12450 || OUTPUT_FLAVOR == bfd_target_coff_flavour
12451#endif
12452 )
12453 value += fixP->fx_where + fixP->fx_frag->fr_address;
12454#endif
12455#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12456 if (IS_ELF)
252b5132 12457 {
6539b54b 12458 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 12459
6539b54b 12460 if ((sym_seg == seg
2f66722d 12461 || (symbol_section_p (fixP->fx_addsy)
6539b54b 12462 && sym_seg != absolute_section))
af65af87 12463 && !generic_force_reloc (fixP))
2f66722d
AM
12464 {
12465 /* Yes, we add the values in twice. This is because
6539b54b
AM
12466 bfd_install_relocation subtracts them out again. I think
12467 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
12468 it. FIXME. */
12469 value += fixP->fx_where + fixP->fx_frag->fr_address;
12470 }
252b5132
RH
12471 }
12472#endif
12473#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
12474 /* For some reason, the PE format does not store a
12475 section address offset for a PC relative symbol. */
12476 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 12477 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
12478 value += md_pcrel_from (fixP);
12479#endif
12480 }
fbeb56a4 12481#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
12482 if (fixP->fx_addsy != NULL
12483 && S_IS_WEAK (fixP->fx_addsy)
12484 /* PR 16858: Do not modify weak function references. */
12485 && ! fixP->fx_pcrel)
fbeb56a4 12486 {
296a8689
NC
12487#if !defined (TE_PEP)
12488 /* For x86 PE weak function symbols are neither PC-relative
12489 nor do they set S_IS_FUNCTION. So the only reliable way
12490 to detect them is to check the flags of their containing
12491 section. */
12492 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
12493 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
12494 ;
12495 else
12496#endif
fbeb56a4
DK
12497 value -= S_GET_VALUE (fixP->fx_addsy);
12498 }
12499#endif
252b5132
RH
12500
12501 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 12502 and we must not disappoint it. */
252b5132 12503#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12504 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
12505 switch (fixP->fx_r_type)
12506 {
12507 case BFD_RELOC_386_PLT32:
3e73aa7c 12508 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
12509 /* Make the jump instruction point to the address of the operand.
12510 At runtime we merely add the offset to the actual PLT entry.
12511 NB: Subtract the offset size only for jump instructions. */
12512 if (fixP->fx_pcrel)
12513 value = -4;
47926f60 12514 break;
31312f95 12515
13ae64f3
JJ
12516 case BFD_RELOC_386_TLS_GD:
12517 case BFD_RELOC_386_TLS_LDM:
13ae64f3 12518 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
12519 case BFD_RELOC_386_TLS_IE:
12520 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 12521 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
12522 case BFD_RELOC_X86_64_TLSGD:
12523 case BFD_RELOC_X86_64_TLSLD:
12524 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 12525 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
12526 value = 0; /* Fully resolved at runtime. No addend. */
12527 /* Fallthrough */
12528 case BFD_RELOC_386_TLS_LE:
12529 case BFD_RELOC_386_TLS_LDO_32:
12530 case BFD_RELOC_386_TLS_LE_32:
12531 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 12532 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 12533 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 12534 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
12535 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12536 break;
12537
67a4f2b7
AO
12538 case BFD_RELOC_386_TLS_DESC_CALL:
12539 case BFD_RELOC_X86_64_TLSDESC_CALL:
12540 value = 0; /* Fully resolved at runtime. No addend. */
12541 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12542 fixP->fx_done = 0;
12543 return;
12544
47926f60
KH
12545 case BFD_RELOC_VTABLE_INHERIT:
12546 case BFD_RELOC_VTABLE_ENTRY:
12547 fixP->fx_done = 0;
94f592af 12548 return;
47926f60
KH
12549
12550 default:
12551 break;
12552 }
12553#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 12554 *valP = value;
f86103b7 12555#endif /* !defined (TE_Mach) */
3e73aa7c 12556
3e73aa7c 12557 /* Are we finished with this relocation now? */
c6682705 12558 if (fixP->fx_addsy == NULL)
3e73aa7c 12559 fixP->fx_done = 1;
fbeb56a4
DK
12560#if defined (OBJ_COFF) && defined (TE_PE)
12561 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
12562 {
12563 fixP->fx_done = 0;
12564 /* Remember value for tc_gen_reloc. */
12565 fixP->fx_addnumber = value;
12566 /* Clear out the frag for now. */
12567 value = 0;
12568 }
12569#endif
3e73aa7c
JH
12570 else if (use_rela_relocations)
12571 {
12572 fixP->fx_no_overflow = 1;
062cd5e7
AS
12573 /* Remember value for tc_gen_reloc. */
12574 fixP->fx_addnumber = value;
3e73aa7c
JH
12575 value = 0;
12576 }
f86103b7 12577
94f592af 12578 md_number_to_chars (p, value, fixP->fx_size);
252b5132 12579}
252b5132 12580\f
6d4af3c2 12581const char *
499ac353 12582md_atof (int type, char *litP, int *sizeP)
252b5132 12583{
499ac353
NC
12584 /* This outputs the LITTLENUMs in REVERSE order;
12585 in accord with the bigendian 386. */
5b7c81bd 12586 return ieee_md_atof (type, litP, sizeP, false);
252b5132
RH
12587}
12588\f
2d545b82 12589static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 12590
252b5132 12591static char *
e3bb37b5 12592output_invalid (int c)
252b5132 12593{
3882b010 12594 if (ISPRINT (c))
f9f21a03
L
12595 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
12596 "'%c'", c);
252b5132 12597 else
f9f21a03 12598 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 12599 "(0x%x)", (unsigned char) c);
252b5132
RH
12600 return output_invalid_buf;
12601}
12602
8a6fb3f9
JB
12603/* Verify that @r can be used in the current context. */
12604
5b7c81bd 12605static bool check_register (const reg_entry *r)
8a6fb3f9
JB
12606{
12607 if (allow_pseudo_reg)
5b7c81bd 12608 return true;
8a6fb3f9
JB
12609
12610 if (operand_type_all_zero (&r->reg_type))
5b7c81bd 12611 return false;
8a6fb3f9
JB
12612
12613 if ((r->reg_type.bitfield.dword
12614 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
12615 || r->reg_type.bitfield.class == RegCR
22e00a3f 12616 || r->reg_type.bitfield.class == RegDR)
8a6fb3f9 12617 && !cpu_arch_flags.bitfield.cpui386)
5b7c81bd 12618 return false;
8a6fb3f9 12619
22e00a3f
JB
12620 if (r->reg_type.bitfield.class == RegTR
12621 && (flag_code == CODE_64BIT
12622 || !cpu_arch_flags.bitfield.cpui386
12623 || cpu_arch_isa_flags.bitfield.cpui586
12624 || cpu_arch_isa_flags.bitfield.cpui686))
5b7c81bd 12625 return false;
22e00a3f 12626
8a6fb3f9 12627 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
5b7c81bd 12628 return false;
8a6fb3f9
JB
12629
12630 if (!cpu_arch_flags.bitfield.cpuavx512f)
12631 {
12632 if (r->reg_type.bitfield.zmmword
12633 || r->reg_type.bitfield.class == RegMask)
5b7c81bd 12634 return false;
8a6fb3f9
JB
12635
12636 if (!cpu_arch_flags.bitfield.cpuavx)
12637 {
12638 if (r->reg_type.bitfield.ymmword)
5b7c81bd 12639 return false;
8a6fb3f9
JB
12640
12641 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
5b7c81bd 12642 return false;
8a6fb3f9
JB
12643 }
12644 }
12645
260cd341
LC
12646 if (r->reg_type.bitfield.tmmword
12647 && (!cpu_arch_flags.bitfield.cpuamx_tile
12648 || flag_code != CODE_64BIT))
5b7c81bd 12649 return false;
260cd341 12650
8a6fb3f9 12651 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
5b7c81bd 12652 return false;
8a6fb3f9
JB
12653
12654 /* Don't allow fake index register unless allow_index_reg isn't 0. */
12655 if (!allow_index_reg && r->reg_num == RegIZ)
5b7c81bd 12656 return false;
8a6fb3f9
JB
12657
12658 /* Upper 16 vector registers are only available with VREX in 64bit
12659 mode, and require EVEX encoding. */
12660 if (r->reg_flags & RegVRex)
12661 {
12662 if (!cpu_arch_flags.bitfield.cpuavx512f
12663 || flag_code != CODE_64BIT)
5b7c81bd 12664 return false;
8a6fb3f9 12665
da4977e0
JB
12666 if (i.vec_encoding == vex_encoding_default)
12667 i.vec_encoding = vex_encoding_evex;
12668 else if (i.vec_encoding != vex_encoding_evex)
12669 i.vec_encoding = vex_encoding_error;
8a6fb3f9
JB
12670 }
12671
12672 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
12673 && (!cpu_arch_flags.bitfield.cpulm || r->reg_type.bitfield.class != RegCR)
12674 && flag_code != CODE_64BIT)
5b7c81bd 12675 return false;
8a6fb3f9
JB
12676
12677 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
12678 && !intel_syntax)
5b7c81bd 12679 return false;
8a6fb3f9 12680
5b7c81bd 12681 return true;
8a6fb3f9
JB
12682}
12683
af6bdddf 12684/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
12685
12686static const reg_entry *
4d1bb795 12687parse_real_register (char *reg_string, char **end_op)
252b5132 12688{
af6bdddf
AM
12689 char *s = reg_string;
12690 char *p;
252b5132
RH
12691 char reg_name_given[MAX_REG_NAME_SIZE + 1];
12692 const reg_entry *r;
12693
12694 /* Skip possible REGISTER_PREFIX and possible whitespace. */
12695 if (*s == REGISTER_PREFIX)
12696 ++s;
12697
12698 if (is_space_char (*s))
12699 ++s;
12700
12701 p = reg_name_given;
af6bdddf 12702 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
12703 {
12704 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
12705 return (const reg_entry *) NULL;
12706 s++;
252b5132
RH
12707 }
12708
6588847e
DN
12709 /* For naked regs, make sure that we are not dealing with an identifier.
12710 This prevents confusing an identifier like `eax_var' with register
12711 `eax'. */
12712 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
12713 return (const reg_entry *) NULL;
12714
af6bdddf 12715 *end_op = s;
252b5132 12716
629310ab 12717 r = (const reg_entry *) str_hash_find (reg_hash, reg_name_given);
252b5132 12718
5f47d35b 12719 /* Handle floating point regs, allowing spaces in the (i) part. */
6288d05f 12720 if (r == reg_st0)
5f47d35b 12721 {
0e0eea78
JB
12722 if (!cpu_arch_flags.bitfield.cpu8087
12723 && !cpu_arch_flags.bitfield.cpu287
af32b722
JB
12724 && !cpu_arch_flags.bitfield.cpu387
12725 && !allow_pseudo_reg)
0e0eea78
JB
12726 return (const reg_entry *) NULL;
12727
5f47d35b
AM
12728 if (is_space_char (*s))
12729 ++s;
12730 if (*s == '(')
12731 {
af6bdddf 12732 ++s;
5f47d35b
AM
12733 if (is_space_char (*s))
12734 ++s;
12735 if (*s >= '0' && *s <= '7')
12736 {
db557034 12737 int fpr = *s - '0';
af6bdddf 12738 ++s;
5f47d35b
AM
12739 if (is_space_char (*s))
12740 ++s;
12741 if (*s == ')')
12742 {
12743 *end_op = s + 1;
6288d05f 12744 know (r[fpr].reg_num == fpr);
db557034 12745 return r + fpr;
5f47d35b 12746 }
5f47d35b 12747 }
47926f60 12748 /* We have "%st(" then garbage. */
5f47d35b
AM
12749 return (const reg_entry *) NULL;
12750 }
12751 }
12752
8a6fb3f9 12753 return r && check_register (r) ? r : NULL;
252b5132 12754}
4d1bb795
JB
12755
12756/* REG_STRING starts *before* REGISTER_PREFIX. */
12757
12758static const reg_entry *
12759parse_register (char *reg_string, char **end_op)
12760{
12761 const reg_entry *r;
12762
12763 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
12764 r = parse_real_register (reg_string, end_op);
12765 else
12766 r = NULL;
12767 if (!r)
12768 {
12769 char *save = input_line_pointer;
12770 char c;
12771 symbolS *symbolP;
12772
12773 input_line_pointer = reg_string;
d02603dc 12774 c = get_symbol_name (&reg_string);
4d1bb795
JB
12775 symbolP = symbol_find (reg_string);
12776 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
12777 {
12778 const expressionS *e = symbol_get_value_expression (symbolP);
12779
0398aac5 12780 know (e->X_op == O_register);
4eed87de 12781 know (e->X_add_number >= 0
c3fe08fa 12782 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 12783 r = i386_regtab + e->X_add_number;
8a6fb3f9
JB
12784 if (!check_register (r))
12785 {
12786 as_bad (_("register '%s%s' cannot be used here"),
12787 register_prefix, r->reg_name);
12788 r = &bad_reg;
12789 }
4d1bb795
JB
12790 *end_op = input_line_pointer;
12791 }
12792 *input_line_pointer = c;
12793 input_line_pointer = save;
12794 }
12795 return r;
12796}
12797
12798int
12799i386_parse_name (char *name, expressionS *e, char *nextcharP)
12800{
12801 const reg_entry *r;
12802 char *end = input_line_pointer;
12803
12804 *end = *nextcharP;
12805 r = parse_register (name, &input_line_pointer);
12806 if (r && end <= input_line_pointer)
12807 {
12808 *nextcharP = *input_line_pointer;
12809 *input_line_pointer = 0;
8a6fb3f9
JB
12810 if (r != &bad_reg)
12811 {
12812 e->X_op = O_register;
12813 e->X_add_number = r - i386_regtab;
12814 }
12815 else
12816 e->X_op = O_illegal;
4d1bb795
JB
12817 return 1;
12818 }
12819 input_line_pointer = end;
12820 *end = 0;
ee86248c 12821 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
12822}
12823
12824void
12825md_operand (expressionS *e)
12826{
ee86248c
JB
12827 char *end;
12828 const reg_entry *r;
4d1bb795 12829
ee86248c
JB
12830 switch (*input_line_pointer)
12831 {
12832 case REGISTER_PREFIX:
12833 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
12834 if (r)
12835 {
12836 e->X_op = O_register;
12837 e->X_add_number = r - i386_regtab;
12838 input_line_pointer = end;
12839 }
ee86248c
JB
12840 break;
12841
12842 case '[':
9c2799c2 12843 gas_assert (intel_syntax);
ee86248c
JB
12844 end = input_line_pointer++;
12845 expression (e);
12846 if (*input_line_pointer == ']')
12847 {
12848 ++input_line_pointer;
12849 e->X_op_symbol = make_expr_symbol (e);
12850 e->X_add_symbol = NULL;
12851 e->X_add_number = 0;
12852 e->X_op = O_index;
12853 }
12854 else
12855 {
12856 e->X_op = O_absent;
12857 input_line_pointer = end;
12858 }
12859 break;
4d1bb795
JB
12860 }
12861}
12862
252b5132 12863\f
4cc782b5 12864#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 12865const char *md_shortopts = "kVQ:sqnO::";
252b5132 12866#else
b6f8c7c4 12867const char *md_shortopts = "qnO::";
252b5132 12868#endif
6e0b89ee 12869
3e73aa7c 12870#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
12871#define OPTION_64 (OPTION_MD_BASE + 1)
12872#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
12873#define OPTION_MARCH (OPTION_MD_BASE + 3)
12874#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
12875#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
12876#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
12877#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
12878#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 12879#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 12880#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 12881#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
12882#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
12883#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
12884#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 12885#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
12886#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
12887#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 12888#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 12889#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 12890#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 12891#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
12892#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
12893#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 12894#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 12895#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 12896#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
e379e5f3
L
12897#define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27)
12898#define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
12899#define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
76cf450b 12900#define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
ae531041
L
12901#define OPTION_MLFENCE_AFTER_LOAD (OPTION_MD_BASE + 31)
12902#define OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH (OPTION_MD_BASE + 32)
12903#define OPTION_MLFENCE_BEFORE_RET (OPTION_MD_BASE + 33)
b3b91714 12904
99ad8390
NC
12905struct option md_longopts[] =
12906{
3e73aa7c 12907 {"32", no_argument, NULL, OPTION_32},
321098a5 12908#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12909 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 12910 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
12911#endif
12912#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12913 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 12914 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 12915 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 12916#endif
b3b91714 12917 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
12918 {"march", required_argument, NULL, OPTION_MARCH},
12919 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
12920 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
12921 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
12922 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
12923 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 12924 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 12925 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 12926 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 12927 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 12928 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 12929 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
12930 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
12931 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
12932# if defined (TE_PE) || defined (TE_PEP)
12933 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
12934#endif
d1982f93 12935 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 12936 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 12937 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 12938 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
e379e5f3
L
12939 {"malign-branch-boundary", required_argument, NULL, OPTION_MALIGN_BRANCH_BOUNDARY},
12940 {"malign-branch-prefix-size", required_argument, NULL, OPTION_MALIGN_BRANCH_PREFIX_SIZE},
12941 {"malign-branch", required_argument, NULL, OPTION_MALIGN_BRANCH},
76cf450b 12942 {"mbranches-within-32B-boundaries", no_argument, NULL, OPTION_MBRANCHES_WITH_32B_BOUNDARIES},
ae531041
L
12943 {"mlfence-after-load", required_argument, NULL, OPTION_MLFENCE_AFTER_LOAD},
12944 {"mlfence-before-indirect-branch", required_argument, NULL,
12945 OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH},
12946 {"mlfence-before-ret", required_argument, NULL, OPTION_MLFENCE_BEFORE_RET},
5db04b09
L
12947 {"mamd64", no_argument, NULL, OPTION_MAMD64},
12948 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
12949 {NULL, no_argument, NULL, 0}
12950};
12951size_t md_longopts_size = sizeof (md_longopts);
12952
12953int
17b9d67d 12954md_parse_option (int c, const char *arg)
252b5132 12955{
91d6fa6a 12956 unsigned int j;
e379e5f3 12957 char *arch, *next, *saved, *type;
9103f4f4 12958
252b5132
RH
12959 switch (c)
12960 {
12b55ccc
L
12961 case 'n':
12962 optimize_align_code = 0;
12963 break;
12964
a38cf1db
AM
12965 case 'q':
12966 quiet_warnings = 1;
252b5132
RH
12967 break;
12968
12969#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
12970 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
12971 should be emitted or not. FIXME: Not implemented. */
12972 case 'Q':
d4693039
JB
12973 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
12974 return 0;
252b5132
RH
12975 break;
12976
12977 /* -V: SVR4 argument to print version ID. */
12978 case 'V':
12979 print_version_id ();
12980 break;
12981
a38cf1db
AM
12982 /* -k: Ignore for FreeBSD compatibility. */
12983 case 'k':
252b5132 12984 break;
4cc782b5
ILT
12985
12986 case 's':
12987 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 12988 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 12989 break;
8dcea932
L
12990
12991 case OPTION_MSHARED:
12992 shared = 1;
12993 break;
b4a3a7b4
L
12994
12995 case OPTION_X86_USED_NOTE:
12996 if (strcasecmp (arg, "yes") == 0)
12997 x86_used_note = 1;
12998 else if (strcasecmp (arg, "no") == 0)
12999 x86_used_note = 0;
13000 else
13001 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
13002 break;
13003
13004
99ad8390 13005#endif
321098a5 13006#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 13007 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
13008 case OPTION_64:
13009 {
13010 const char **list, **l;
13011
3e73aa7c
JH
13012 list = bfd_target_list ();
13013 for (l = list; *l != NULL; l++)
08dedd66 13014 if (startswith (*l, "elf64-x86-64")
99ad8390
NC
13015 || strcmp (*l, "coff-x86-64") == 0
13016 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
13017 || strcmp (*l, "pei-x86-64") == 0
13018 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
13019 {
13020 default_arch = "x86_64";
13021 break;
13022 }
3e73aa7c 13023 if (*l == NULL)
2b5d6a91 13024 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
13025 free (list);
13026 }
13027 break;
13028#endif
252b5132 13029
351f65ca 13030#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 13031 case OPTION_X32:
351f65ca
L
13032 if (IS_ELF)
13033 {
13034 const char **list, **l;
13035
13036 list = bfd_target_list ();
13037 for (l = list; *l != NULL; l++)
08dedd66 13038 if (startswith (*l, "elf32-x86-64"))
351f65ca
L
13039 {
13040 default_arch = "x86_64:32";
13041 break;
13042 }
13043 if (*l == NULL)
2b5d6a91 13044 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
13045 free (list);
13046 }
13047 else
13048 as_fatal (_("32bit x86_64 is only supported for ELF"));
13049 break;
13050#endif
13051
6e0b89ee
AM
13052 case OPTION_32:
13053 default_arch = "i386";
13054 break;
13055
b3b91714
AM
13056 case OPTION_DIVIDE:
13057#ifdef SVR4_COMMENT_CHARS
13058 {
13059 char *n, *t;
13060 const char *s;
13061
add39d23 13062 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
13063 t = n;
13064 for (s = i386_comment_chars; *s != '\0'; s++)
13065 if (*s != '/')
13066 *t++ = *s;
13067 *t = '\0';
13068 i386_comment_chars = n;
13069 }
13070#endif
13071 break;
13072
9103f4f4 13073 case OPTION_MARCH:
293f5f65
L
13074 saved = xstrdup (arg);
13075 arch = saved;
13076 /* Allow -march=+nosse. */
13077 if (*arch == '+')
13078 arch++;
6305a203 13079 do
9103f4f4 13080 {
6305a203 13081 if (*arch == '.')
2b5d6a91 13082 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
13083 next = strchr (arch, '+');
13084 if (next)
13085 *next++ = '\0';
91d6fa6a 13086 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 13087 {
91d6fa6a 13088 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 13089 {
6305a203 13090 /* Processor. */
1ded5609
JB
13091 if (! cpu_arch[j].flags.bitfield.cpui386)
13092 continue;
13093
91d6fa6a 13094 cpu_arch_name = cpu_arch[j].name;
6305a203 13095 cpu_sub_arch_name = NULL;
91d6fa6a
NC
13096 cpu_arch_flags = cpu_arch[j].flags;
13097 cpu_arch_isa = cpu_arch[j].type;
13098 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
13099 if (!cpu_arch_tune_set)
13100 {
13101 cpu_arch_tune = cpu_arch_isa;
13102 cpu_arch_tune_flags = cpu_arch_isa_flags;
13103 }
13104 break;
13105 }
91d6fa6a
NC
13106 else if (*cpu_arch [j].name == '.'
13107 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 13108 {
33eaf5de 13109 /* ISA extension. */
6305a203 13110 i386_cpu_flags flags;
309d3373 13111
293f5f65
L
13112 flags = cpu_flags_or (cpu_arch_flags,
13113 cpu_arch[j].flags);
81486035 13114
5b64d091 13115 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
13116 {
13117 if (cpu_sub_arch_name)
13118 {
13119 char *name = cpu_sub_arch_name;
13120 cpu_sub_arch_name = concat (name,
91d6fa6a 13121 cpu_arch[j].name,
1bf57e9f 13122 (const char *) NULL);
6305a203
L
13123 free (name);
13124 }
13125 else
91d6fa6a 13126 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 13127 cpu_arch_flags = flags;
a586129e 13128 cpu_arch_isa_flags = flags;
6305a203 13129 }
0089dace
L
13130 else
13131 cpu_arch_isa_flags
13132 = cpu_flags_or (cpu_arch_isa_flags,
13133 cpu_arch[j].flags);
6305a203 13134 break;
ccc9c027 13135 }
9103f4f4 13136 }
6305a203 13137
293f5f65
L
13138 if (j >= ARRAY_SIZE (cpu_arch))
13139 {
33eaf5de 13140 /* Disable an ISA extension. */
293f5f65
L
13141 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13142 if (strcmp (arch, cpu_noarch [j].name) == 0)
13143 {
13144 i386_cpu_flags flags;
13145
13146 flags = cpu_flags_and_not (cpu_arch_flags,
13147 cpu_noarch[j].flags);
13148 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
13149 {
13150 if (cpu_sub_arch_name)
13151 {
13152 char *name = cpu_sub_arch_name;
13153 cpu_sub_arch_name = concat (arch,
13154 (const char *) NULL);
13155 free (name);
13156 }
13157 else
13158 cpu_sub_arch_name = xstrdup (arch);
13159 cpu_arch_flags = flags;
13160 cpu_arch_isa_flags = flags;
13161 }
13162 break;
13163 }
13164
13165 if (j >= ARRAY_SIZE (cpu_noarch))
13166 j = ARRAY_SIZE (cpu_arch);
13167 }
13168
91d6fa6a 13169 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 13170 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
13171
13172 arch = next;
9103f4f4 13173 }
293f5f65
L
13174 while (next != NULL);
13175 free (saved);
9103f4f4
L
13176 break;
13177
13178 case OPTION_MTUNE:
13179 if (*arg == '.')
2b5d6a91 13180 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 13181 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 13182 {
91d6fa6a 13183 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 13184 {
ccc9c027 13185 cpu_arch_tune_set = 1;
91d6fa6a
NC
13186 cpu_arch_tune = cpu_arch [j].type;
13187 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
13188 break;
13189 }
13190 }
91d6fa6a 13191 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 13192 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
13193 break;
13194
1efbbeb4
L
13195 case OPTION_MMNEMONIC:
13196 if (strcasecmp (arg, "att") == 0)
13197 intel_mnemonic = 0;
13198 else if (strcasecmp (arg, "intel") == 0)
13199 intel_mnemonic = 1;
13200 else
2b5d6a91 13201 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
13202 break;
13203
13204 case OPTION_MSYNTAX:
13205 if (strcasecmp (arg, "att") == 0)
13206 intel_syntax = 0;
13207 else if (strcasecmp (arg, "intel") == 0)
13208 intel_syntax = 1;
13209 else
2b5d6a91 13210 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
13211 break;
13212
13213 case OPTION_MINDEX_REG:
13214 allow_index_reg = 1;
13215 break;
13216
13217 case OPTION_MNAKED_REG:
13218 allow_naked_reg = 1;
13219 break;
13220
c0f3af97
L
13221 case OPTION_MSSE2AVX:
13222 sse2avx = 1;
13223 break;
13224
daf50ae7
L
13225 case OPTION_MSSE_CHECK:
13226 if (strcasecmp (arg, "error") == 0)
7bab8ab5 13227 sse_check = check_error;
daf50ae7 13228 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 13229 sse_check = check_warning;
daf50ae7 13230 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 13231 sse_check = check_none;
daf50ae7 13232 else
2b5d6a91 13233 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
13234 break;
13235
7bab8ab5
JB
13236 case OPTION_MOPERAND_CHECK:
13237 if (strcasecmp (arg, "error") == 0)
13238 operand_check = check_error;
13239 else if (strcasecmp (arg, "warning") == 0)
13240 operand_check = check_warning;
13241 else if (strcasecmp (arg, "none") == 0)
13242 operand_check = check_none;
13243 else
13244 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
13245 break;
13246
539f890d
L
13247 case OPTION_MAVXSCALAR:
13248 if (strcasecmp (arg, "128") == 0)
13249 avxscalar = vex128;
13250 else if (strcasecmp (arg, "256") == 0)
13251 avxscalar = vex256;
13252 else
2b5d6a91 13253 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
13254 break;
13255
03751133
L
13256 case OPTION_MVEXWIG:
13257 if (strcmp (arg, "0") == 0)
40c9c8de 13258 vexwig = vexw0;
03751133 13259 else if (strcmp (arg, "1") == 0)
40c9c8de 13260 vexwig = vexw1;
03751133
L
13261 else
13262 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
13263 break;
13264
7e8b059b
L
13265 case OPTION_MADD_BND_PREFIX:
13266 add_bnd_prefix = 1;
13267 break;
13268
43234a1e
L
13269 case OPTION_MEVEXLIG:
13270 if (strcmp (arg, "128") == 0)
13271 evexlig = evexl128;
13272 else if (strcmp (arg, "256") == 0)
13273 evexlig = evexl256;
13274 else if (strcmp (arg, "512") == 0)
13275 evexlig = evexl512;
13276 else
13277 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
13278 break;
13279
d3d3c6db
IT
13280 case OPTION_MEVEXRCIG:
13281 if (strcmp (arg, "rne") == 0)
13282 evexrcig = rne;
13283 else if (strcmp (arg, "rd") == 0)
13284 evexrcig = rd;
13285 else if (strcmp (arg, "ru") == 0)
13286 evexrcig = ru;
13287 else if (strcmp (arg, "rz") == 0)
13288 evexrcig = rz;
13289 else
13290 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
13291 break;
13292
43234a1e
L
13293 case OPTION_MEVEXWIG:
13294 if (strcmp (arg, "0") == 0)
13295 evexwig = evexw0;
13296 else if (strcmp (arg, "1") == 0)
13297 evexwig = evexw1;
13298 else
13299 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
13300 break;
13301
167ad85b
TG
13302# if defined (TE_PE) || defined (TE_PEP)
13303 case OPTION_MBIG_OBJ:
13304 use_big_obj = 1;
13305 break;
13306#endif
13307
d1982f93 13308 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
13309 if (strcasecmp (arg, "yes") == 0)
13310 omit_lock_prefix = 1;
13311 else if (strcasecmp (arg, "no") == 0)
13312 omit_lock_prefix = 0;
13313 else
13314 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
13315 break;
13316
e4e00185
AS
13317 case OPTION_MFENCE_AS_LOCK_ADD:
13318 if (strcasecmp (arg, "yes") == 0)
13319 avoid_fence = 1;
13320 else if (strcasecmp (arg, "no") == 0)
13321 avoid_fence = 0;
13322 else
13323 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
13324 break;
13325
ae531041
L
13326 case OPTION_MLFENCE_AFTER_LOAD:
13327 if (strcasecmp (arg, "yes") == 0)
13328 lfence_after_load = 1;
13329 else if (strcasecmp (arg, "no") == 0)
13330 lfence_after_load = 0;
13331 else
13332 as_fatal (_("invalid -mlfence-after-load= option: `%s'"), arg);
13333 break;
13334
13335 case OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH:
13336 if (strcasecmp (arg, "all") == 0)
a09f656b 13337 {
13338 lfence_before_indirect_branch = lfence_branch_all;
13339 if (lfence_before_ret == lfence_before_ret_none)
13340 lfence_before_ret = lfence_before_ret_shl;
13341 }
ae531041
L
13342 else if (strcasecmp (arg, "memory") == 0)
13343 lfence_before_indirect_branch = lfence_branch_memory;
13344 else if (strcasecmp (arg, "register") == 0)
13345 lfence_before_indirect_branch = lfence_branch_register;
13346 else if (strcasecmp (arg, "none") == 0)
13347 lfence_before_indirect_branch = lfence_branch_none;
13348 else
13349 as_fatal (_("invalid -mlfence-before-indirect-branch= option: `%s'"),
13350 arg);
13351 break;
13352
13353 case OPTION_MLFENCE_BEFORE_RET:
13354 if (strcasecmp (arg, "or") == 0)
13355 lfence_before_ret = lfence_before_ret_or;
13356 else if (strcasecmp (arg, "not") == 0)
13357 lfence_before_ret = lfence_before_ret_not;
a09f656b 13358 else if (strcasecmp (arg, "shl") == 0 || strcasecmp (arg, "yes") == 0)
13359 lfence_before_ret = lfence_before_ret_shl;
ae531041
L
13360 else if (strcasecmp (arg, "none") == 0)
13361 lfence_before_ret = lfence_before_ret_none;
13362 else
13363 as_fatal (_("invalid -mlfence-before-ret= option: `%s'"),
13364 arg);
13365 break;
13366
0cb4071e
L
13367 case OPTION_MRELAX_RELOCATIONS:
13368 if (strcasecmp (arg, "yes") == 0)
13369 generate_relax_relocations = 1;
13370 else if (strcasecmp (arg, "no") == 0)
13371 generate_relax_relocations = 0;
13372 else
13373 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
13374 break;
13375
e379e5f3
L
13376 case OPTION_MALIGN_BRANCH_BOUNDARY:
13377 {
13378 char *end;
13379 long int align = strtoul (arg, &end, 0);
13380 if (*end == '\0')
13381 {
13382 if (align == 0)
13383 {
13384 align_branch_power = 0;
13385 break;
13386 }
13387 else if (align >= 16)
13388 {
13389 int align_power;
13390 for (align_power = 0;
13391 (align & 1) == 0;
13392 align >>= 1, align_power++)
13393 continue;
13394 /* Limit alignment power to 31. */
13395 if (align == 1 && align_power < 32)
13396 {
13397 align_branch_power = align_power;
13398 break;
13399 }
13400 }
13401 }
13402 as_fatal (_("invalid -malign-branch-boundary= value: %s"), arg);
13403 }
13404 break;
13405
13406 case OPTION_MALIGN_BRANCH_PREFIX_SIZE:
13407 {
13408 char *end;
13409 int align = strtoul (arg, &end, 0);
13410 /* Some processors only support 5 prefixes. */
13411 if (*end == '\0' && align >= 0 && align < 6)
13412 {
13413 align_branch_prefix_size = align;
13414 break;
13415 }
13416 as_fatal (_("invalid -malign-branch-prefix-size= value: %s"),
13417 arg);
13418 }
13419 break;
13420
13421 case OPTION_MALIGN_BRANCH:
13422 align_branch = 0;
13423 saved = xstrdup (arg);
13424 type = saved;
13425 do
13426 {
13427 next = strchr (type, '+');
13428 if (next)
13429 *next++ = '\0';
13430 if (strcasecmp (type, "jcc") == 0)
13431 align_branch |= align_branch_jcc_bit;
13432 else if (strcasecmp (type, "fused") == 0)
13433 align_branch |= align_branch_fused_bit;
13434 else if (strcasecmp (type, "jmp") == 0)
13435 align_branch |= align_branch_jmp_bit;
13436 else if (strcasecmp (type, "call") == 0)
13437 align_branch |= align_branch_call_bit;
13438 else if (strcasecmp (type, "ret") == 0)
13439 align_branch |= align_branch_ret_bit;
13440 else if (strcasecmp (type, "indirect") == 0)
13441 align_branch |= align_branch_indirect_bit;
13442 else
13443 as_fatal (_("invalid -malign-branch= option: `%s'"), arg);
13444 type = next;
13445 }
13446 while (next != NULL);
13447 free (saved);
13448 break;
13449
76cf450b
L
13450 case OPTION_MBRANCHES_WITH_32B_BOUNDARIES:
13451 align_branch_power = 5;
13452 align_branch_prefix_size = 5;
13453 align_branch = (align_branch_jcc_bit
13454 | align_branch_fused_bit
13455 | align_branch_jmp_bit);
13456 break;
13457
5db04b09 13458 case OPTION_MAMD64:
4b5aaf5f 13459 isa64 = amd64;
5db04b09
L
13460 break;
13461
13462 case OPTION_MINTEL64:
4b5aaf5f 13463 isa64 = intel64;
5db04b09
L
13464 break;
13465
b6f8c7c4
L
13466 case 'O':
13467 if (arg == NULL)
13468 {
13469 optimize = 1;
13470 /* Turn off -Os. */
13471 optimize_for_space = 0;
13472 }
13473 else if (*arg == 's')
13474 {
13475 optimize_for_space = 1;
13476 /* Turn on all encoding optimizations. */
41fd2579 13477 optimize = INT_MAX;
b6f8c7c4
L
13478 }
13479 else
13480 {
13481 optimize = atoi (arg);
13482 /* Turn off -Os. */
13483 optimize_for_space = 0;
13484 }
13485 break;
13486
252b5132
RH
13487 default:
13488 return 0;
13489 }
13490 return 1;
13491}
13492
8a2c8fef
L
13493#define MESSAGE_TEMPLATE \
13494" "
13495
293f5f65
L
13496static char *
13497output_message (FILE *stream, char *p, char *message, char *start,
13498 int *left_p, const char *name, int len)
13499{
13500 int size = sizeof (MESSAGE_TEMPLATE);
13501 int left = *left_p;
13502
13503 /* Reserve 2 spaces for ", " or ",\0" */
13504 left -= len + 2;
13505
13506 /* Check if there is any room. */
13507 if (left >= 0)
13508 {
13509 if (p != start)
13510 {
13511 *p++ = ',';
13512 *p++ = ' ';
13513 }
13514 p = mempcpy (p, name, len);
13515 }
13516 else
13517 {
13518 /* Output the current message now and start a new one. */
13519 *p++ = ',';
13520 *p = '\0';
13521 fprintf (stream, "%s\n", message);
13522 p = start;
13523 left = size - (start - message) - len - 2;
13524
13525 gas_assert (left >= 0);
13526
13527 p = mempcpy (p, name, len);
13528 }
13529
13530 *left_p = left;
13531 return p;
13532}
13533
8a2c8fef 13534static void
1ded5609 13535show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
13536{
13537 static char message[] = MESSAGE_TEMPLATE;
13538 char *start = message + 27;
13539 char *p;
13540 int size = sizeof (MESSAGE_TEMPLATE);
13541 int left;
13542 const char *name;
13543 int len;
13544 unsigned int j;
13545
13546 p = start;
13547 left = size - (start - message);
13548 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
13549 {
13550 /* Should it be skipped? */
13551 if (cpu_arch [j].skip)
13552 continue;
13553
13554 name = cpu_arch [j].name;
13555 len = cpu_arch [j].len;
13556 if (*name == '.')
13557 {
13558 /* It is an extension. Skip if we aren't asked to show it. */
13559 if (ext)
13560 {
13561 name++;
13562 len--;
13563 }
13564 else
13565 continue;
13566 }
13567 else if (ext)
13568 {
13569 /* It is an processor. Skip if we show only extension. */
13570 continue;
13571 }
1ded5609
JB
13572 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
13573 {
13574 /* It is an impossible processor - skip. */
13575 continue;
13576 }
8a2c8fef 13577
293f5f65 13578 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
13579 }
13580
293f5f65
L
13581 /* Display disabled extensions. */
13582 if (ext)
13583 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13584 {
13585 name = cpu_noarch [j].name;
13586 len = cpu_noarch [j].len;
13587 p = output_message (stream, p, message, start, &left, name,
13588 len);
13589 }
13590
8a2c8fef
L
13591 *p = '\0';
13592 fprintf (stream, "%s\n", message);
13593}
13594
252b5132 13595void
8a2c8fef 13596md_show_usage (FILE *stream)
252b5132 13597{
4cc782b5
ILT
13598#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13599 fprintf (stream, _("\
d4693039 13600 -Qy, -Qn ignored\n\
a38cf1db 13601 -V print assembler version number\n\
b3b91714
AM
13602 -k ignored\n"));
13603#endif
13604 fprintf (stream, _("\
12b55ccc 13605 -n Do not optimize code alignment\n\
b3b91714
AM
13606 -q quieten some warnings\n"));
13607#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13608 fprintf (stream, _("\
a38cf1db 13609 -s ignored\n"));
b3b91714 13610#endif
d7f449c0
L
13611#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
13612 || defined (TE_PE) || defined (TE_PEP))
751d281c 13613 fprintf (stream, _("\
570561f7 13614 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 13615#endif
b3b91714
AM
13616#ifdef SVR4_COMMENT_CHARS
13617 fprintf (stream, _("\
13618 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
13619#else
13620 fprintf (stream, _("\
b3b91714 13621 --divide ignored\n"));
4cc782b5 13622#endif
9103f4f4 13623 fprintf (stream, _("\
6305a203 13624 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 13625 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 13626 show_arch (stream, 0, 1);
8a2c8fef
L
13627 fprintf (stream, _("\
13628 EXTENSION is combination of:\n"));
1ded5609 13629 show_arch (stream, 1, 0);
6305a203 13630 fprintf (stream, _("\
8a2c8fef 13631 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 13632 show_arch (stream, 0, 0);
ba104c83 13633 fprintf (stream, _("\
c0f3af97
L
13634 -msse2avx encode SSE instructions with VEX prefix\n"));
13635 fprintf (stream, _("\
7c5c05ef 13636 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
13637 check SSE instructions\n"));
13638 fprintf (stream, _("\
7c5c05ef 13639 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
13640 check operand combinations for validity\n"));
13641 fprintf (stream, _("\
7c5c05ef
L
13642 -mavxscalar=[128|256] (default: 128)\n\
13643 encode scalar AVX instructions with specific vector\n\
539f890d
L
13644 length\n"));
13645 fprintf (stream, _("\
03751133
L
13646 -mvexwig=[0|1] (default: 0)\n\
13647 encode VEX instructions with specific VEX.W value\n\
13648 for VEX.W bit ignored instructions\n"));
13649 fprintf (stream, _("\
7c5c05ef
L
13650 -mevexlig=[128|256|512] (default: 128)\n\
13651 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
13652 length\n"));
13653 fprintf (stream, _("\
7c5c05ef
L
13654 -mevexwig=[0|1] (default: 0)\n\
13655 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
13656 for EVEX.W bit ignored instructions\n"));
13657 fprintf (stream, _("\
7c5c05ef 13658 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
13659 encode EVEX instructions with specific EVEX.RC value\n\
13660 for SAE-only ignored instructions\n"));
13661 fprintf (stream, _("\
7c5c05ef
L
13662 -mmnemonic=[att|intel] "));
13663 if (SYSV386_COMPAT)
13664 fprintf (stream, _("(default: att)\n"));
13665 else
13666 fprintf (stream, _("(default: intel)\n"));
13667 fprintf (stream, _("\
13668 use AT&T/Intel mnemonic\n"));
ba104c83 13669 fprintf (stream, _("\
7c5c05ef
L
13670 -msyntax=[att|intel] (default: att)\n\
13671 use AT&T/Intel syntax\n"));
ba104c83
L
13672 fprintf (stream, _("\
13673 -mindex-reg support pseudo index registers\n"));
13674 fprintf (stream, _("\
13675 -mnaked-reg don't require `%%' prefix for registers\n"));
13676 fprintf (stream, _("\
7e8b059b 13677 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 13678#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
13679 fprintf (stream, _("\
13680 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
13681 fprintf (stream, _("\
13682 -mx86-used-note=[no|yes] "));
13683 if (DEFAULT_X86_USED_NOTE)
13684 fprintf (stream, _("(default: yes)\n"));
13685 else
13686 fprintf (stream, _("(default: no)\n"));
13687 fprintf (stream, _("\
13688 generate x86 used ISA and feature properties\n"));
13689#endif
13690#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
13691 fprintf (stream, _("\
13692 -mbig-obj generate big object files\n"));
13693#endif
d022bddd 13694 fprintf (stream, _("\
7c5c05ef 13695 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 13696 strip all lock prefixes\n"));
5db04b09 13697 fprintf (stream, _("\
7c5c05ef 13698 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
13699 encode lfence, mfence and sfence as\n\
13700 lock addl $0x0, (%%{re}sp)\n"));
13701 fprintf (stream, _("\
7c5c05ef
L
13702 -mrelax-relocations=[no|yes] "));
13703 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
13704 fprintf (stream, _("(default: yes)\n"));
13705 else
13706 fprintf (stream, _("(default: no)\n"));
13707 fprintf (stream, _("\
0cb4071e
L
13708 generate relax relocations\n"));
13709 fprintf (stream, _("\
e379e5f3
L
13710 -malign-branch-boundary=NUM (default: 0)\n\
13711 align branches within NUM byte boundary\n"));
13712 fprintf (stream, _("\
13713 -malign-branch=TYPE[+TYPE...] (default: jcc+fused+jmp)\n\
13714 TYPE is combination of jcc, fused, jmp, call, ret,\n\
13715 indirect\n\
13716 specify types of branches to align\n"));
13717 fprintf (stream, _("\
13718 -malign-branch-prefix-size=NUM (default: 5)\n\
13719 align branches with NUM prefixes per instruction\n"));
13720 fprintf (stream, _("\
76cf450b
L
13721 -mbranches-within-32B-boundaries\n\
13722 align branches within 32 byte boundary\n"));
13723 fprintf (stream, _("\
ae531041
L
13724 -mlfence-after-load=[no|yes] (default: no)\n\
13725 generate lfence after load\n"));
13726 fprintf (stream, _("\
13727 -mlfence-before-indirect-branch=[none|all|register|memory] (default: none)\n\
13728 generate lfence before indirect near branch\n"));
13729 fprintf (stream, _("\
a09f656b 13730 -mlfence-before-ret=[none|or|not|shl|yes] (default: none)\n\
ae531041
L
13731 generate lfence before ret\n"));
13732 fprintf (stream, _("\
7c5c05ef 13733 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
13734 fprintf (stream, _("\
13735 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
13736}
13737
3e73aa7c 13738#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 13739 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 13740 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
13741
13742/* Pick the target format to use. */
13743
47926f60 13744const char *
e3bb37b5 13745i386_target_format (void)
252b5132 13746{
d34049e8 13747 if (startswith (default_arch, "x86_64"))
351f65ca
L
13748 {
13749 update_code_flag (CODE_64BIT, 1);
13750 if (default_arch[6] == '\0')
7f56bc95 13751 x86_elf_abi = X86_64_ABI;
351f65ca 13752 else
7f56bc95 13753 x86_elf_abi = X86_64_X32_ABI;
351f65ca 13754 }
3e73aa7c 13755 else if (!strcmp (default_arch, "i386"))
78f12dd3 13756 update_code_flag (CODE_32BIT, 1);
5197d474
L
13757 else if (!strcmp (default_arch, "iamcu"))
13758 {
13759 update_code_flag (CODE_32BIT, 1);
13760 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
13761 {
13762 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
13763 cpu_arch_name = "iamcu";
13764 cpu_sub_arch_name = NULL;
13765 cpu_arch_flags = iamcu_flags;
13766 cpu_arch_isa = PROCESSOR_IAMCU;
13767 cpu_arch_isa_flags = iamcu_flags;
13768 if (!cpu_arch_tune_set)
13769 {
13770 cpu_arch_tune = cpu_arch_isa;
13771 cpu_arch_tune_flags = cpu_arch_isa_flags;
13772 }
13773 }
8d471ec1 13774 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
13775 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
13776 cpu_arch_name);
13777 }
3e73aa7c 13778 else
2b5d6a91 13779 as_fatal (_("unknown architecture"));
89507696
JB
13780
13781 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
13782 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13783 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
13784 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13785
252b5132
RH
13786 switch (OUTPUT_FLAVOR)
13787 {
9384f2ff 13788#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 13789 case bfd_target_aout_flavour:
47926f60 13790 return AOUT_TARGET_FORMAT;
4c63da97 13791#endif
9384f2ff
AM
13792#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
13793# if defined (TE_PE) || defined (TE_PEP)
13794 case bfd_target_coff_flavour:
167ad85b
TG
13795 if (flag_code == CODE_64BIT)
13796 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
13797 else
251dae91 13798 return use_big_obj ? "pe-bigobj-i386" : "pe-i386";
9384f2ff 13799# elif defined (TE_GO32)
0561d57c
JK
13800 case bfd_target_coff_flavour:
13801 return "coff-go32";
9384f2ff 13802# else
252b5132
RH
13803 case bfd_target_coff_flavour:
13804 return "coff-i386";
9384f2ff 13805# endif
4c63da97 13806#endif
3e73aa7c 13807#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 13808 case bfd_target_elf_flavour:
3e73aa7c 13809 {
351f65ca
L
13810 const char *format;
13811
13812 switch (x86_elf_abi)
4fa24527 13813 {
351f65ca
L
13814 default:
13815 format = ELF_TARGET_FORMAT;
e379e5f3
L
13816#ifndef TE_SOLARIS
13817 tls_get_addr = "___tls_get_addr";
13818#endif
351f65ca 13819 break;
7f56bc95 13820 case X86_64_ABI:
351f65ca 13821 use_rela_relocations = 1;
4fa24527 13822 object_64bit = 1;
e379e5f3
L
13823#ifndef TE_SOLARIS
13824 tls_get_addr = "__tls_get_addr";
13825#endif
351f65ca
L
13826 format = ELF_TARGET_FORMAT64;
13827 break;
7f56bc95 13828 case X86_64_X32_ABI:
4fa24527 13829 use_rela_relocations = 1;
351f65ca 13830 object_64bit = 1;
e379e5f3
L
13831#ifndef TE_SOLARIS
13832 tls_get_addr = "__tls_get_addr";
13833#endif
862be3fb 13834 disallow_64bit_reloc = 1;
351f65ca
L
13835 format = ELF_TARGET_FORMAT32;
13836 break;
4fa24527 13837 }
3632d14b 13838 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 13839 {
7f56bc95 13840 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
13841 as_fatal (_("Intel L1OM is 64bit only"));
13842 return ELF_TARGET_L1OM_FORMAT;
13843 }
b49f93f6 13844 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
13845 {
13846 if (x86_elf_abi != X86_64_ABI)
13847 as_fatal (_("Intel K1OM is 64bit only"));
13848 return ELF_TARGET_K1OM_FORMAT;
13849 }
81486035
L
13850 else if (cpu_arch_isa == PROCESSOR_IAMCU)
13851 {
13852 if (x86_elf_abi != I386_ABI)
13853 as_fatal (_("Intel MCU is 32bit only"));
13854 return ELF_TARGET_IAMCU_FORMAT;
13855 }
8a9036a4 13856 else
351f65ca 13857 return format;
3e73aa7c 13858 }
e57f8c65
TG
13859#endif
13860#if defined (OBJ_MACH_O)
13861 case bfd_target_mach_o_flavour:
d382c579
TG
13862 if (flag_code == CODE_64BIT)
13863 {
13864 use_rela_relocations = 1;
13865 object_64bit = 1;
13866 return "mach-o-x86-64";
13867 }
13868 else
13869 return "mach-o-i386";
4c63da97 13870#endif
252b5132
RH
13871 default:
13872 abort ();
13873 return NULL;
13874 }
13875}
13876
47926f60 13877#endif /* OBJ_MAYBE_ more than one */
252b5132 13878\f
252b5132 13879symbolS *
7016a5d5 13880md_undefined_symbol (char *name)
252b5132 13881{
18dc2407
ILT
13882 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
13883 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
13884 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
13885 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
13886 {
13887 if (!GOT_symbol)
13888 {
13889 if (symbol_find (name))
13890 as_bad (_("GOT already in symbol table"));
13891 GOT_symbol = symbol_new (name, undefined_section,
e01e1cee 13892 &zero_address_frag, 0);
24eab124
AM
13893 };
13894 return GOT_symbol;
13895 }
252b5132
RH
13896 return 0;
13897}
13898
13899/* Round up a section size to the appropriate boundary. */
47926f60 13900
252b5132 13901valueT
7016a5d5 13902md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 13903{
4c63da97
AM
13904#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
13905 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
13906 {
13907 /* For a.out, force the section size to be aligned. If we don't do
13908 this, BFD will align it for us, but it will not write out the
13909 final bytes of the section. This may be a bug in BFD, but it is
13910 easier to fix it here since that is how the other a.out targets
13911 work. */
13912 int align;
13913
fd361982 13914 align = bfd_section_alignment (segment);
8d3842cd 13915 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 13916 }
252b5132
RH
13917#endif
13918
13919 return size;
13920}
13921
13922/* On the i386, PC-relative offsets are relative to the start of the
13923 next instruction. That is, the address of the offset, plus its
13924 size, since the offset is always the last part of the insn. */
13925
13926long
e3bb37b5 13927md_pcrel_from (fixS *fixP)
252b5132
RH
13928{
13929 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
13930}
13931
13932#ifndef I386COFF
13933
13934static void
e3bb37b5 13935s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 13936{
29b0f896 13937 int temp;
252b5132 13938
8a75718c
JB
13939#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13940 if (IS_ELF)
13941 obj_elf_section_change_hook ();
13942#endif
252b5132
RH
13943 temp = get_absolute_expression ();
13944 subseg_set (bss_section, (subsegT) temp);
13945 demand_empty_rest_of_line ();
13946}
13947
13948#endif
13949
e379e5f3
L
13950/* Remember constant directive. */
13951
13952void
13953i386_cons_align (int ignore ATTRIBUTE_UNUSED)
13954{
13955 if (last_insn.kind != last_insn_directive
13956 && (bfd_section_flags (now_seg) & SEC_CODE))
13957 {
13958 last_insn.seg = now_seg;
13959 last_insn.kind = last_insn_directive;
13960 last_insn.name = "constant directive";
13961 last_insn.file = as_where (&last_insn.line);
ae531041
L
13962 if (lfence_before_ret != lfence_before_ret_none)
13963 {
13964 if (lfence_before_indirect_branch != lfence_branch_none)
13965 as_warn (_("constant directive skips -mlfence-before-ret "
13966 "and -mlfence-before-indirect-branch"));
13967 else
13968 as_warn (_("constant directive skips -mlfence-before-ret"));
13969 }
13970 else if (lfence_before_indirect_branch != lfence_branch_none)
13971 as_warn (_("constant directive skips -mlfence-before-indirect-branch"));
e379e5f3
L
13972 }
13973}
13974
252b5132 13975void
e3bb37b5 13976i386_validate_fix (fixS *fixp)
252b5132 13977{
02a86693 13978 if (fixp->fx_subsy)
252b5132 13979 {
02a86693 13980 if (fixp->fx_subsy == GOT_symbol)
23df1078 13981 {
02a86693
L
13982 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
13983 {
13984 if (!object_64bit)
13985 abort ();
13986#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13987 if (fixp->fx_tcbit2)
56ceb5b5
L
13988 fixp->fx_r_type = (fixp->fx_tcbit
13989 ? BFD_RELOC_X86_64_REX_GOTPCRELX
13990 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
13991 else
13992#endif
13993 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
13994 }
d6ab8113 13995 else
02a86693
L
13996 {
13997 if (!object_64bit)
13998 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
13999 else
14000 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
14001 }
14002 fixp->fx_subsy = 0;
23df1078 14003 }
252b5132 14004 }
02a86693 14005#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2585b7a5 14006 else
02a86693 14007 {
2585b7a5
L
14008 /* NB: Commit 292676c1 resolved PLT32 reloc aganst local symbol
14009 to section. Since PLT32 relocation must be against symbols,
14010 turn such PLT32 relocation into PC32 relocation. */
14011 if (fixp->fx_addsy
14012 && (fixp->fx_r_type == BFD_RELOC_386_PLT32
14013 || fixp->fx_r_type == BFD_RELOC_X86_64_PLT32)
14014 && symbol_section_p (fixp->fx_addsy))
14015 fixp->fx_r_type = BFD_RELOC_32_PCREL;
14016 if (!object_64bit)
14017 {
14018 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
14019 && fixp->fx_tcbit2)
14020 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
14021 }
02a86693
L
14022 }
14023#endif
252b5132
RH
14024}
14025
252b5132 14026arelent *
7016a5d5 14027tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
14028{
14029 arelent *rel;
14030 bfd_reloc_code_real_type code;
14031
14032 switch (fixp->fx_r_type)
14033 {
8ce3d284 14034#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
14035 case BFD_RELOC_SIZE32:
14036 case BFD_RELOC_SIZE64:
14037 if (S_IS_DEFINED (fixp->fx_addsy)
14038 && !S_IS_EXTERNAL (fixp->fx_addsy))
14039 {
14040 /* Resolve size relocation against local symbol to size of
14041 the symbol plus addend. */
14042 valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
14043 if (fixp->fx_r_type == BFD_RELOC_SIZE32
14044 && !fits_in_unsigned_long (value))
14045 as_bad_where (fixp->fx_file, fixp->fx_line,
14046 _("symbol size computation overflow"));
14047 fixp->fx_addsy = NULL;
14048 fixp->fx_subsy = NULL;
14049 md_apply_fix (fixp, (valueT *) &value, NULL);
14050 return NULL;
14051 }
8ce3d284 14052#endif
1a0670f3 14053 /* Fall through. */
8fd4256d 14054
3e73aa7c
JH
14055 case BFD_RELOC_X86_64_PLT32:
14056 case BFD_RELOC_X86_64_GOT32:
14057 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
14058 case BFD_RELOC_X86_64_GOTPCRELX:
14059 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
14060 case BFD_RELOC_386_PLT32:
14061 case BFD_RELOC_386_GOT32:
02a86693 14062 case BFD_RELOC_386_GOT32X:
252b5132
RH
14063 case BFD_RELOC_386_GOTOFF:
14064 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
14065 case BFD_RELOC_386_TLS_GD:
14066 case BFD_RELOC_386_TLS_LDM:
14067 case BFD_RELOC_386_TLS_LDO_32:
14068 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
14069 case BFD_RELOC_386_TLS_IE:
14070 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
14071 case BFD_RELOC_386_TLS_LE_32:
14072 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
14073 case BFD_RELOC_386_TLS_GOTDESC:
14074 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
14075 case BFD_RELOC_X86_64_TLSGD:
14076 case BFD_RELOC_X86_64_TLSLD:
14077 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 14078 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
14079 case BFD_RELOC_X86_64_GOTTPOFF:
14080 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
14081 case BFD_RELOC_X86_64_TPOFF64:
14082 case BFD_RELOC_X86_64_GOTOFF64:
14083 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
14084 case BFD_RELOC_X86_64_GOT64:
14085 case BFD_RELOC_X86_64_GOTPCREL64:
14086 case BFD_RELOC_X86_64_GOTPC64:
14087 case BFD_RELOC_X86_64_GOTPLT64:
14088 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
14089 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
14090 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
14091 case BFD_RELOC_RVA:
14092 case BFD_RELOC_VTABLE_ENTRY:
14093 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
14094#ifdef TE_PE
14095 case BFD_RELOC_32_SECREL:
14096#endif
252b5132
RH
14097 code = fixp->fx_r_type;
14098 break;
dbbaec26
L
14099 case BFD_RELOC_X86_64_32S:
14100 if (!fixp->fx_pcrel)
14101 {
14102 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
14103 code = fixp->fx_r_type;
14104 break;
14105 }
1a0670f3 14106 /* Fall through. */
252b5132 14107 default:
93382f6d 14108 if (fixp->fx_pcrel)
252b5132 14109 {
93382f6d
AM
14110 switch (fixp->fx_size)
14111 {
14112 default:
b091f402
AM
14113 as_bad_where (fixp->fx_file, fixp->fx_line,
14114 _("can not do %d byte pc-relative relocation"),
14115 fixp->fx_size);
93382f6d
AM
14116 code = BFD_RELOC_32_PCREL;
14117 break;
14118 case 1: code = BFD_RELOC_8_PCREL; break;
14119 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 14120 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
14121#ifdef BFD64
14122 case 8: code = BFD_RELOC_64_PCREL; break;
14123#endif
93382f6d
AM
14124 }
14125 }
14126 else
14127 {
14128 switch (fixp->fx_size)
14129 {
14130 default:
b091f402
AM
14131 as_bad_where (fixp->fx_file, fixp->fx_line,
14132 _("can not do %d byte relocation"),
14133 fixp->fx_size);
93382f6d
AM
14134 code = BFD_RELOC_32;
14135 break;
14136 case 1: code = BFD_RELOC_8; break;
14137 case 2: code = BFD_RELOC_16; break;
14138 case 4: code = BFD_RELOC_32; break;
937149dd 14139#ifdef BFD64
3e73aa7c 14140 case 8: code = BFD_RELOC_64; break;
937149dd 14141#endif
93382f6d 14142 }
252b5132
RH
14143 }
14144 break;
14145 }
252b5132 14146
d182319b
JB
14147 if ((code == BFD_RELOC_32
14148 || code == BFD_RELOC_32_PCREL
14149 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
14150 && GOT_symbol
14151 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 14152 {
4fa24527 14153 if (!object_64bit)
d6ab8113
JB
14154 code = BFD_RELOC_386_GOTPC;
14155 else
14156 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 14157 }
7b81dfbb
AJ
14158 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
14159 && GOT_symbol
14160 && fixp->fx_addsy == GOT_symbol)
14161 {
14162 code = BFD_RELOC_X86_64_GOTPC64;
14163 }
252b5132 14164
add39d23
TS
14165 rel = XNEW (arelent);
14166 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 14167 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
14168
14169 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 14170
3e73aa7c
JH
14171 if (!use_rela_relocations)
14172 {
14173 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
14174 vtable entry to be used in the relocation's section offset. */
14175 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14176 rel->address = fixp->fx_offset;
fbeb56a4
DK
14177#if defined (OBJ_COFF) && defined (TE_PE)
14178 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
14179 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
14180 else
14181#endif
c6682705 14182 rel->addend = 0;
3e73aa7c
JH
14183 }
14184 /* Use the rela in 64bit mode. */
252b5132 14185 else
3e73aa7c 14186 {
862be3fb
L
14187 if (disallow_64bit_reloc)
14188 switch (code)
14189 {
862be3fb
L
14190 case BFD_RELOC_X86_64_DTPOFF64:
14191 case BFD_RELOC_X86_64_TPOFF64:
14192 case BFD_RELOC_64_PCREL:
14193 case BFD_RELOC_X86_64_GOTOFF64:
14194 case BFD_RELOC_X86_64_GOT64:
14195 case BFD_RELOC_X86_64_GOTPCREL64:
14196 case BFD_RELOC_X86_64_GOTPC64:
14197 case BFD_RELOC_X86_64_GOTPLT64:
14198 case BFD_RELOC_X86_64_PLTOFF64:
14199 as_bad_where (fixp->fx_file, fixp->fx_line,
14200 _("cannot represent relocation type %s in x32 mode"),
14201 bfd_get_reloc_code_name (code));
14202 break;
14203 default:
14204 break;
14205 }
14206
062cd5e7
AS
14207 if (!fixp->fx_pcrel)
14208 rel->addend = fixp->fx_offset;
14209 else
14210 switch (code)
14211 {
14212 case BFD_RELOC_X86_64_PLT32:
14213 case BFD_RELOC_X86_64_GOT32:
14214 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
14215 case BFD_RELOC_X86_64_GOTPCRELX:
14216 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
14217 case BFD_RELOC_X86_64_TLSGD:
14218 case BFD_RELOC_X86_64_TLSLD:
14219 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
14220 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
14221 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
14222 rel->addend = fixp->fx_offset - fixp->fx_size;
14223 break;
14224 default:
14225 rel->addend = (section->vma
14226 - fixp->fx_size
14227 + fixp->fx_addnumber
14228 + md_pcrel_from (fixp));
14229 break;
14230 }
3e73aa7c
JH
14231 }
14232
252b5132
RH
14233 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
14234 if (rel->howto == NULL)
14235 {
14236 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 14237 _("cannot represent relocation type %s"),
252b5132
RH
14238 bfd_get_reloc_code_name (code));
14239 /* Set howto to a garbage value so that we can keep going. */
14240 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 14241 gas_assert (rel->howto != NULL);
252b5132
RH
14242 }
14243
14244 return rel;
14245}
14246
ee86248c 14247#include "tc-i386-intel.c"
54cfded0 14248
a60de03c
JB
14249void
14250tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 14251{
a60de03c
JB
14252 int saved_naked_reg;
14253 char saved_register_dot;
54cfded0 14254
a60de03c
JB
14255 saved_naked_reg = allow_naked_reg;
14256 allow_naked_reg = 1;
14257 saved_register_dot = register_chars['.'];
14258 register_chars['.'] = '.';
14259 allow_pseudo_reg = 1;
14260 expression_and_evaluate (exp);
14261 allow_pseudo_reg = 0;
14262 register_chars['.'] = saved_register_dot;
14263 allow_naked_reg = saved_naked_reg;
14264
e96d56a1 14265 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 14266 {
a60de03c
JB
14267 if ((addressT) exp->X_add_number < i386_regtab_size)
14268 {
14269 exp->X_op = O_constant;
14270 exp->X_add_number = i386_regtab[exp->X_add_number]
14271 .dw2_regnum[flag_code >> 1];
14272 }
14273 else
14274 exp->X_op = O_illegal;
54cfded0 14275 }
54cfded0
AM
14276}
14277
14278void
14279tc_x86_frame_initial_instructions (void)
14280{
a60de03c
JB
14281 static unsigned int sp_regno[2];
14282
14283 if (!sp_regno[flag_code >> 1])
14284 {
14285 char *saved_input = input_line_pointer;
14286 char sp[][4] = {"esp", "rsp"};
14287 expressionS exp;
a4447b93 14288
a60de03c
JB
14289 input_line_pointer = sp[flag_code >> 1];
14290 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 14291 gas_assert (exp.X_op == O_constant);
a60de03c
JB
14292 sp_regno[flag_code >> 1] = exp.X_add_number;
14293 input_line_pointer = saved_input;
14294 }
a4447b93 14295
61ff971f
L
14296 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
14297 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 14298}
d2b2c203 14299
d7921315
L
14300int
14301x86_dwarf2_addr_size (void)
14302{
14303#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
14304 if (x86_elf_abi == X86_64_X32_ABI)
14305 return 4;
14306#endif
14307 return bfd_arch_bits_per_address (stdoutput) / 8;
14308}
14309
d2b2c203
DJ
14310int
14311i386_elf_section_type (const char *str, size_t len)
14312{
14313 if (flag_code == CODE_64BIT
14314 && len == sizeof ("unwind") - 1
d34049e8 14315 && startswith (str, "unwind"))
d2b2c203
DJ
14316 return SHT_X86_64_UNWIND;
14317
14318 return -1;
14319}
bb41ade5 14320
ad5fec3b
EB
14321#ifdef TE_SOLARIS
14322void
14323i386_solaris_fix_up_eh_frame (segT sec)
14324{
14325 if (flag_code == CODE_64BIT)
14326 elf_section_type (sec) = SHT_X86_64_UNWIND;
14327}
14328#endif
14329
bb41ade5
AM
14330#ifdef TE_PE
14331void
14332tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
14333{
91d6fa6a 14334 expressionS exp;
bb41ade5 14335
91d6fa6a
NC
14336 exp.X_op = O_secrel;
14337 exp.X_add_symbol = symbol;
14338 exp.X_add_number = 0;
14339 emit_expr (&exp, size);
bb41ade5
AM
14340}
14341#endif
3b22753a
L
14342
14343#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14344/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
14345
01e1a5bc 14346bfd_vma
6d4af3c2 14347x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
14348{
14349 if (flag_code == CODE_64BIT)
14350 {
14351 if (letter == 'l')
14352 return SHF_X86_64_LARGE;
14353
8f3bae45 14354 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 14355 }
3b22753a 14356 else
8f3bae45 14357 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
14358 return -1;
14359}
14360
01e1a5bc 14361bfd_vma
3b22753a
L
14362x86_64_section_word (char *str, size_t len)
14363{
08dedd66 14364 if (len == 5 && flag_code == CODE_64BIT && startswith (str, "large"))
3b22753a
L
14365 return SHF_X86_64_LARGE;
14366
14367 return -1;
14368}
14369
14370static void
14371handle_large_common (int small ATTRIBUTE_UNUSED)
14372{
14373 if (flag_code != CODE_64BIT)
14374 {
14375 s_comm_internal (0, elf_common_parse);
14376 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
14377 }
14378 else
14379 {
14380 static segT lbss_section;
14381 asection *saved_com_section_ptr = elf_com_section_ptr;
14382 asection *saved_bss_section = bss_section;
14383
14384 if (lbss_section == NULL)
14385 {
14386 flagword applicable;
14387 segT seg = now_seg;
14388 subsegT subseg = now_subseg;
14389
14390 /* The .lbss section is for local .largecomm symbols. */
14391 lbss_section = subseg_new (".lbss", 0);
14392 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 14393 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
14394 seg_info (lbss_section)->bss = 1;
14395
14396 subseg_set (seg, subseg);
14397 }
14398
14399 elf_com_section_ptr = &_bfd_elf_large_com_section;
14400 bss_section = lbss_section;
14401
14402 s_comm_internal (0, elf_common_parse);
14403
14404 elf_com_section_ptr = saved_com_section_ptr;
14405 bss_section = saved_bss_section;
14406 }
14407}
14408#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
This page took 2.726734 seconds and 4 git commands to generate.