[gdb/symtab] Find filename in shared psymtab
[deliverable/binutils-gdb.git] / gas / config / tc-i386.c
CommitLineData
b534c6d3 1/* tc-i386.c -- Assemble code for the Intel 80386
b3adc24a 2 Copyright (C) 1989-2020 Free Software Foundation, Inc.
252b5132
RH
3
4 This file is part of GAS, the GNU Assembler.
5
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
ec2655a6 8 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
9 any later version.
10
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
252b5132 20
47926f60
KH
21/* Intel 80386 machine specific gas.
22 Written by Eliot Dresselhaus (eliot@mgm.mit.edu).
3e73aa7c 23 x86_64 support by Jan Hubicka (jh@suse.cz)
0f10071e 24 VIA PadLock support by Michal Ludvig (mludvig@suse.cz)
47926f60
KH
25 Bugs & suggestions are completely welcome. This is free software.
26 Please help us make it better. */
252b5132 27
252b5132 28#include "as.h"
3882b010 29#include "safe-ctype.h"
252b5132 30#include "subsegs.h"
316e2c05 31#include "dwarf2dbg.h"
54cfded0 32#include "dw2gencfi.h"
d2b2c203 33#include "elf/x86-64.h"
40fb9820 34#include "opcodes/i386-init.h"
252b5132 35
41fd2579
L
36#ifdef HAVE_LIMITS_H
37#include <limits.h>
38#else
39#ifdef HAVE_SYS_PARAM_H
40#include <sys/param.h>
41#endif
42#ifndef INT_MAX
43#define INT_MAX (int) (((unsigned) (-1)) >> 1)
44#endif
45#endif
46
c3332e24 47#ifndef INFER_ADDR_PREFIX
eecb386c 48#define INFER_ADDR_PREFIX 1
c3332e24
AM
49#endif
50
29b0f896
AM
51#ifndef DEFAULT_ARCH
52#define DEFAULT_ARCH "i386"
246fcdee 53#endif
252b5132 54
edde18a5
AM
55#ifndef INLINE
56#if __GNUC__ >= 2
57#define INLINE __inline__
58#else
59#define INLINE
60#endif
61#endif
62
6305a203
L
63/* Prefixes will be emitted in the order defined below.
64 WAIT_PREFIX must be the first prefix since FWAIT is really is an
65 instruction, and so must come before any prefixes.
66 The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
42164a71 67 REP_PREFIX/HLE_PREFIX, LOCK_PREFIX. */
6305a203
L
68#define WAIT_PREFIX 0
69#define SEG_PREFIX 1
70#define ADDR_PREFIX 2
71#define DATA_PREFIX 3
c32fa91d 72#define REP_PREFIX 4
42164a71 73#define HLE_PREFIX REP_PREFIX
7e8b059b 74#define BND_PREFIX REP_PREFIX
c32fa91d 75#define LOCK_PREFIX 5
4e9ac44a
L
76#define REX_PREFIX 6 /* must come last. */
77#define MAX_PREFIXES 7 /* max prefixes per opcode */
6305a203
L
78
79/* we define the syntax here (modulo base,index,scale syntax) */
80#define REGISTER_PREFIX '%'
81#define IMMEDIATE_PREFIX '$'
82#define ABSOLUTE_PREFIX '*'
83
84/* these are the instruction mnemonic suffixes in AT&T syntax or
85 memory operand size in Intel syntax. */
86#define WORD_MNEM_SUFFIX 'w'
87#define BYTE_MNEM_SUFFIX 'b'
88#define SHORT_MNEM_SUFFIX 's'
89#define LONG_MNEM_SUFFIX 'l'
90#define QWORD_MNEM_SUFFIX 'q'
6305a203
L
91/* Intel Syntax. Use a non-ascii letter since since it never appears
92 in instructions. */
93#define LONG_DOUBLE_MNEM_SUFFIX '\1'
94
95#define END_OF_INSN '\0'
96
79dec6b7
JB
97/* This matches the C -> StaticRounding alias in the opcode table. */
98#define commutative staticrounding
99
6305a203
L
100/*
101 'templates' is for grouping together 'template' structures for opcodes
102 of the same name. This is only used for storing the insns in the grand
103 ole hash table of insns.
104 The templates themselves start at START and range up to (but not including)
105 END.
106 */
107typedef struct
108{
d3ce72d0
NC
109 const insn_template *start;
110 const insn_template *end;
6305a203
L
111}
112templates;
113
114/* 386 operand encoding bytes: see 386 book for details of this. */
115typedef struct
116{
117 unsigned int regmem; /* codes register or memory operand */
118 unsigned int reg; /* codes register operand (or extended opcode) */
119 unsigned int mode; /* how to interpret regmem & reg */
120}
121modrm_byte;
122
123/* x86-64 extension prefix. */
124typedef int rex_byte;
125
6305a203
L
126/* 386 opcode byte to code indirect addressing. */
127typedef struct
128{
129 unsigned base;
130 unsigned index;
131 unsigned scale;
132}
133sib_byte;
134
6305a203
L
135/* x86 arch names, types and features */
136typedef struct
137{
138 const char *name; /* arch name */
8a2c8fef 139 unsigned int len; /* arch string length */
6305a203
L
140 enum processor_type type; /* arch type */
141 i386_cpu_flags flags; /* cpu feature flags */
8a2c8fef 142 unsigned int skip; /* show_arch should skip this. */
6305a203
L
143}
144arch_entry;
145
293f5f65
L
146/* Used to turn off indicated flags. */
147typedef struct
148{
149 const char *name; /* arch name */
150 unsigned int len; /* arch string length */
151 i386_cpu_flags flags; /* cpu feature flags */
152}
153noarch_entry;
154
78f12dd3 155static void update_code_flag (int, int);
e3bb37b5
L
156static void set_code_flag (int);
157static void set_16bit_gcc_code_flag (int);
158static void set_intel_syntax (int);
1efbbeb4 159static void set_intel_mnemonic (int);
db51cc60 160static void set_allow_index_reg (int);
7bab8ab5 161static void set_check (int);
e3bb37b5 162static void set_cpu_arch (int);
6482c264 163#ifdef TE_PE
e3bb37b5 164static void pe_directive_secrel (int);
6482c264 165#endif
e3bb37b5
L
166static void signed_cons (int);
167static char *output_invalid (int c);
ee86248c
JB
168static int i386_finalize_immediate (segT, expressionS *, i386_operand_type,
169 const char *);
170static int i386_finalize_displacement (segT, expressionS *, i386_operand_type,
171 const char *);
a7619375 172static int i386_att_operand (char *);
e3bb37b5 173static int i386_intel_operand (char *, int);
ee86248c
JB
174static int i386_intel_simplify (expressionS *);
175static int i386_intel_parse_name (const char *, expressionS *);
e3bb37b5
L
176static const reg_entry *parse_register (char *, char **);
177static char *parse_insn (char *, char *);
178static char *parse_operands (char *, const char *);
179static void swap_operands (void);
4d456e3d 180static void swap_2_operands (int, int);
48bcea9f 181static enum flag_code i386_addressing_mode (void);
e3bb37b5
L
182static void optimize_imm (void);
183static void optimize_disp (void);
83b16ac6 184static const insn_template *match_template (char);
e3bb37b5
L
185static int check_string (void);
186static int process_suffix (void);
187static int check_byte_reg (void);
188static int check_long_reg (void);
189static int check_qword_reg (void);
190static int check_word_reg (void);
191static int finalize_imm (void);
192static int process_operands (void);
193static const seg_entry *build_modrm_byte (void);
194static void output_insn (void);
195static void output_imm (fragS *, offsetT);
196static void output_disp (fragS *, offsetT);
29b0f896 197#ifndef I386COFF
e3bb37b5 198static void s_bss (int);
252b5132 199#endif
17d4e2a2
L
200#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
201static void handle_large_common (int small ATTRIBUTE_UNUSED);
b4a3a7b4
L
202
203/* GNU_PROPERTY_X86_ISA_1_USED. */
204static unsigned int x86_isa_1_used;
205/* GNU_PROPERTY_X86_FEATURE_2_USED. */
206static unsigned int x86_feature_2_used;
207/* Generate x86 used ISA and feature properties. */
208static unsigned int x86_used_note = DEFAULT_X86_USED_NOTE;
17d4e2a2 209#endif
252b5132 210
a847613f 211static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 212
43234a1e
L
213/* This struct describes rounding control and SAE in the instruction. */
214struct RC_Operation
215{
216 enum rc_type
217 {
218 rne = 0,
219 rd,
220 ru,
221 rz,
222 saeonly
223 } type;
224 int operand;
225};
226
227static struct RC_Operation rc_op;
228
229/* The struct describes masking, applied to OPERAND in the instruction.
230 MASK is a pointer to the corresponding mask register. ZEROING tells
231 whether merging or zeroing mask is used. */
232struct Mask_Operation
233{
234 const reg_entry *mask;
235 unsigned int zeroing;
236 /* The operand where this operation is associated. */
237 int operand;
238};
239
240static struct Mask_Operation mask_op;
241
242/* The struct describes broadcasting, applied to OPERAND. FACTOR is
243 broadcast factor. */
244struct Broadcast_Operation
245{
8e6e0792 246 /* Type of broadcast: {1to2}, {1to4}, {1to8}, or {1to16}. */
43234a1e
L
247 int type;
248
249 /* Index of broadcasted operand. */
250 int operand;
4a1b91ea
L
251
252 /* Number of bytes to broadcast. */
253 int bytes;
43234a1e
L
254};
255
256static struct Broadcast_Operation broadcast_op;
257
c0f3af97
L
258/* VEX prefix. */
259typedef struct
260{
43234a1e
L
261 /* VEX prefix is either 2 byte or 3 byte. EVEX is 4 byte. */
262 unsigned char bytes[4];
c0f3af97
L
263 unsigned int length;
264 /* Destination or source register specifier. */
265 const reg_entry *register_specifier;
266} vex_prefix;
267
252b5132 268/* 'md_assemble ()' gathers together information and puts it into a
47926f60 269 i386_insn. */
252b5132 270
520dc8e8
AM
271union i386_op
272 {
273 expressionS *disps;
274 expressionS *imms;
275 const reg_entry *regs;
276 };
277
a65babc9
L
278enum i386_error
279 {
86e026a4 280 operand_size_mismatch,
a65babc9
L
281 operand_type_mismatch,
282 register_type_mismatch,
283 number_of_operands_mismatch,
284 invalid_instruction_suffix,
285 bad_imm4,
a65babc9
L
286 unsupported_with_intel_mnemonic,
287 unsupported_syntax,
6c30d220
L
288 unsupported,
289 invalid_vsib_address,
7bab8ab5 290 invalid_vector_register_set,
43234a1e
L
291 unsupported_vector_index_register,
292 unsupported_broadcast,
43234a1e
L
293 broadcast_needed,
294 unsupported_masking,
295 mask_not_on_destination,
296 no_default_mask,
297 unsupported_rc_sae,
298 rc_sae_operand_not_last_imm,
299 invalid_register_operand,
a65babc9
L
300 };
301
252b5132
RH
302struct _i386_insn
303 {
47926f60 304 /* TM holds the template for the insn were currently assembling. */
d3ce72d0 305 insn_template tm;
252b5132 306
7d5e4556
L
307 /* SUFFIX holds the instruction size suffix for byte, word, dword
308 or qword, if given. */
252b5132
RH
309 char suffix;
310
47926f60 311 /* OPERANDS gives the number of given operands. */
252b5132
RH
312 unsigned int operands;
313
314 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
315 of given register, displacement, memory operands and immediate
47926f60 316 operands. */
252b5132
RH
317 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
318
319 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 320 use OP[i] for the corresponding operand. */
40fb9820 321 i386_operand_type types[MAX_OPERANDS];
252b5132 322
520dc8e8
AM
323 /* Displacement expression, immediate expression, or register for each
324 operand. */
325 union i386_op op[MAX_OPERANDS];
252b5132 326
3e73aa7c
JH
327 /* Flags for operands. */
328 unsigned int flags[MAX_OPERANDS];
329#define Operand_PCrel 1
c48dadc9 330#define Operand_Mem 2
3e73aa7c 331
252b5132 332 /* Relocation type for operand */
f86103b7 333 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 334
252b5132
RH
335 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
336 the base index byte below. */
337 const reg_entry *base_reg;
338 const reg_entry *index_reg;
339 unsigned int log2_scale_factor;
340
341 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 342 explicit segment overrides are given. */
ce8a8b2f 343 const seg_entry *seg[2];
252b5132 344
8325cc63
JB
345 /* Copied first memory operand string, for re-checking. */
346 char *memop1_string;
347
252b5132
RH
348 /* PREFIX holds all the given prefix opcodes (usually null).
349 PREFIXES is the number of prefix opcodes. */
350 unsigned int prefixes;
351 unsigned char prefix[MAX_PREFIXES];
352
50128d0c
JB
353 /* Register is in low 3 bits of opcode. */
354 bfd_boolean short_form;
355
6f2f06be
JB
356 /* The operand to a branch insn indicates an absolute branch. */
357 bfd_boolean jumpabsolute;
358
b4a3a7b4
L
359 /* Has MMX register operands. */
360 bfd_boolean has_regmmx;
361
362 /* Has XMM register operands. */
363 bfd_boolean has_regxmm;
364
365 /* Has YMM register operands. */
366 bfd_boolean has_regymm;
367
368 /* Has ZMM register operands. */
369 bfd_boolean has_regzmm;
370
e379e5f3
L
371 /* Has GOTPC or TLS relocation. */
372 bfd_boolean has_gotpc_tls_reloc;
373
252b5132 374 /* RM and SIB are the modrm byte and the sib byte where the
c1e679ec 375 addressing modes of this insn are encoded. */
252b5132 376 modrm_byte rm;
3e73aa7c 377 rex_byte rex;
43234a1e 378 rex_byte vrex;
252b5132 379 sib_byte sib;
c0f3af97 380 vex_prefix vex;
b6169b20 381
43234a1e
L
382 /* Masking attributes. */
383 struct Mask_Operation *mask;
384
385 /* Rounding control and SAE attributes. */
386 struct RC_Operation *rounding;
387
388 /* Broadcasting attributes. */
389 struct Broadcast_Operation *broadcast;
390
391 /* Compressed disp8*N attribute. */
392 unsigned int memshift;
393
86fa6981
L
394 /* Prefer load or store in encoding. */
395 enum
396 {
397 dir_encoding_default = 0,
398 dir_encoding_load,
64c49ab3
JB
399 dir_encoding_store,
400 dir_encoding_swap
86fa6981 401 } dir_encoding;
891edac4 402
a501d77e
L
403 /* Prefer 8bit or 32bit displacement in encoding. */
404 enum
405 {
406 disp_encoding_default = 0,
407 disp_encoding_8bit,
408 disp_encoding_32bit
409 } disp_encoding;
f8a5c266 410
6b6b6807
L
411 /* Prefer the REX byte in encoding. */
412 bfd_boolean rex_encoding;
413
b6f8c7c4
L
414 /* Disable instruction size optimization. */
415 bfd_boolean no_optimize;
416
86fa6981
L
417 /* How to encode vector instructions. */
418 enum
419 {
420 vex_encoding_default = 0,
42e04b36 421 vex_encoding_vex,
86fa6981
L
422 vex_encoding_vex3,
423 vex_encoding_evex
424 } vec_encoding;
425
d5de92cf
L
426 /* REP prefix. */
427 const char *rep_prefix;
428
165de32a
L
429 /* HLE prefix. */
430 const char *hle_prefix;
42164a71 431
7e8b059b
L
432 /* Have BND prefix. */
433 const char *bnd_prefix;
434
04ef582a
L
435 /* Have NOTRACK prefix. */
436 const char *notrack_prefix;
437
891edac4 438 /* Error message. */
a65babc9 439 enum i386_error error;
252b5132
RH
440 };
441
442typedef struct _i386_insn i386_insn;
443
43234a1e
L
444/* Link RC type with corresponding string, that'll be looked for in
445 asm. */
446struct RC_name
447{
448 enum rc_type type;
449 const char *name;
450 unsigned int len;
451};
452
453static const struct RC_name RC_NamesTable[] =
454{
455 { rne, STRING_COMMA_LEN ("rn-sae") },
456 { rd, STRING_COMMA_LEN ("rd-sae") },
457 { ru, STRING_COMMA_LEN ("ru-sae") },
458 { rz, STRING_COMMA_LEN ("rz-sae") },
459 { saeonly, STRING_COMMA_LEN ("sae") },
460};
461
252b5132
RH
462/* List of chars besides those in app.c:symbol_chars that can start an
463 operand. Used to prevent the scrubber eating vital white-space. */
86fa6981 464const char extra_symbol_chars[] = "*%-([{}"
252b5132 465#ifdef LEX_AT
32137342
NC
466 "@"
467#endif
468#ifdef LEX_QM
469 "?"
252b5132 470#endif
32137342 471 ;
252b5132 472
29b0f896
AM
473#if (defined (TE_I386AIX) \
474 || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
3896cfd5 475 && !defined (TE_GNU) \
29b0f896 476 && !defined (TE_LINUX) \
8d63c93e 477 && !defined (TE_NACL) \
29b0f896 478 && !defined (TE_FreeBSD) \
5b806d27 479 && !defined (TE_DragonFly) \
29b0f896 480 && !defined (TE_NetBSD)))
252b5132 481/* This array holds the chars that always start a comment. If the
b3b91714
AM
482 pre-processor is disabled, these aren't very useful. The option
483 --divide will remove '/' from this list. */
484const char *i386_comment_chars = "#/";
485#define SVR4_COMMENT_CHARS 1
252b5132 486#define PREFIX_SEPARATOR '\\'
252b5132 487
b3b91714
AM
488#else
489const char *i386_comment_chars = "#";
490#define PREFIX_SEPARATOR '/'
491#endif
492
252b5132
RH
493/* This array holds the chars that only start a comment at the beginning of
494 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
495 .line and .file directives will appear in the pre-processed output.
496 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 497 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
498 #NO_APP at the beginning of its output.
499 Also note that comments started like this one will always work if
252b5132 500 '/' isn't otherwise defined. */
b3b91714 501const char line_comment_chars[] = "#/";
252b5132 502
63a0b638 503const char line_separator_chars[] = ";";
252b5132 504
ce8a8b2f
AM
505/* Chars that can be used to separate mant from exp in floating point
506 nums. */
252b5132
RH
507const char EXP_CHARS[] = "eE";
508
ce8a8b2f
AM
509/* Chars that mean this number is a floating point constant
510 As in 0f12.456
511 or 0d1.2345e12. */
252b5132
RH
512const char FLT_CHARS[] = "fFdDxX";
513
ce8a8b2f 514/* Tables for lexical analysis. */
252b5132
RH
515static char mnemonic_chars[256];
516static char register_chars[256];
517static char operand_chars[256];
518static char identifier_chars[256];
519static char digit_chars[256];
520
ce8a8b2f 521/* Lexical macros. */
252b5132
RH
522#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
523#define is_operand_char(x) (operand_chars[(unsigned char) x])
524#define is_register_char(x) (register_chars[(unsigned char) x])
525#define is_space_char(x) ((x) == ' ')
526#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
527#define is_digit_char(x) (digit_chars[(unsigned char) x])
528
0234cb7c 529/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
530static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
531
532/* md_assemble() always leaves the strings it's passed unaltered. To
533 effect this we maintain a stack of saved characters that we've smashed
534 with '\0's (indicating end of strings for various sub-fields of the
47926f60 535 assembler instruction). */
252b5132 536static char save_stack[32];
ce8a8b2f 537static char *save_stack_p;
252b5132
RH
538#define END_STRING_AND_SAVE(s) \
539 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
540#define RESTORE_END_STRING(s) \
541 do { *(s) = *--save_stack_p; } while (0)
542
47926f60 543/* The instruction we're assembling. */
252b5132
RH
544static i386_insn i;
545
546/* Possible templates for current insn. */
547static const templates *current_templates;
548
31b2323c
L
549/* Per instruction expressionS buffers: max displacements & immediates. */
550static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
551static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 552
47926f60 553/* Current operand we are working on. */
ee86248c 554static int this_operand = -1;
252b5132 555
3e73aa7c
JH
556/* We support four different modes. FLAG_CODE variable is used to distinguish
557 these. */
558
559enum flag_code {
560 CODE_32BIT,
561 CODE_16BIT,
562 CODE_64BIT };
563
564static enum flag_code flag_code;
4fa24527 565static unsigned int object_64bit;
862be3fb 566static unsigned int disallow_64bit_reloc;
3e73aa7c 567static int use_rela_relocations = 0;
e379e5f3
L
568/* __tls_get_addr/___tls_get_addr symbol for TLS. */
569static const char *tls_get_addr;
3e73aa7c 570
7af8ed2d
NC
571#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
572 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
573 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
574
351f65ca
L
575/* The ELF ABI to use. */
576enum x86_elf_abi
577{
578 I386_ABI,
7f56bc95
L
579 X86_64_ABI,
580 X86_64_X32_ABI
351f65ca
L
581};
582
583static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 584#endif
351f65ca 585
167ad85b
TG
586#if defined (TE_PE) || defined (TE_PEP)
587/* Use big object file format. */
588static int use_big_obj = 0;
589#endif
590
8dcea932
L
591#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
592/* 1 if generating code for a shared library. */
593static int shared = 0;
594#endif
595
47926f60
KH
596/* 1 for intel syntax,
597 0 if att syntax. */
598static int intel_syntax = 0;
252b5132 599
4b5aaf5f
L
600static enum x86_64_isa
601{
602 amd64 = 1, /* AMD64 ISA. */
603 intel64 /* Intel64 ISA. */
604} isa64;
e89c5eaa 605
1efbbeb4
L
606/* 1 for intel mnemonic,
607 0 if att mnemonic. */
608static int intel_mnemonic = !SYSV386_COMPAT;
609
a60de03c
JB
610/* 1 if pseudo registers are permitted. */
611static int allow_pseudo_reg = 0;
612
47926f60
KH
613/* 1 if register prefix % not required. */
614static int allow_naked_reg = 0;
252b5132 615
33eaf5de 616/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
617 instructions supporting it, even if this prefix wasn't specified
618 explicitly. */
619static int add_bnd_prefix = 0;
620
ba104c83 621/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
622static int allow_index_reg = 0;
623
d022bddd
IT
624/* 1 if the assembler should ignore LOCK prefix, even if it was
625 specified explicitly. */
626static int omit_lock_prefix = 0;
627
e4e00185
AS
628/* 1 if the assembler should encode lfence, mfence, and sfence as
629 "lock addl $0, (%{re}sp)". */
630static int avoid_fence = 0;
631
ae531041
L
632/* 1 if lfence should be inserted after every load. */
633static int lfence_after_load = 0;
634
635/* Non-zero if lfence should be inserted before indirect branch. */
636static enum lfence_before_indirect_branch_kind
637 {
638 lfence_branch_none = 0,
639 lfence_branch_register,
640 lfence_branch_memory,
641 lfence_branch_all
642 }
643lfence_before_indirect_branch;
644
645/* Non-zero if lfence should be inserted before ret. */
646static enum lfence_before_ret_kind
647 {
648 lfence_before_ret_none = 0,
649 lfence_before_ret_not,
650 lfence_before_ret_or
651 }
652lfence_before_ret;
653
654/* Types of previous instruction is .byte or prefix. */
e379e5f3
L
655static struct
656 {
657 segT seg;
658 const char *file;
659 const char *name;
660 unsigned int line;
661 enum last_insn_kind
662 {
663 last_insn_other = 0,
664 last_insn_directive,
665 last_insn_prefix
666 } kind;
667 } last_insn;
668
0cb4071e
L
669/* 1 if the assembler should generate relax relocations. */
670
671static int generate_relax_relocations
672 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
673
7bab8ab5 674static enum check_kind
daf50ae7 675 {
7bab8ab5
JB
676 check_none = 0,
677 check_warning,
678 check_error
daf50ae7 679 }
7bab8ab5 680sse_check, operand_check = check_warning;
daf50ae7 681
e379e5f3
L
682/* Non-zero if branches should be aligned within power of 2 boundary. */
683static int align_branch_power = 0;
684
685/* Types of branches to align. */
686enum align_branch_kind
687 {
688 align_branch_none = 0,
689 align_branch_jcc = 1,
690 align_branch_fused = 2,
691 align_branch_jmp = 3,
692 align_branch_call = 4,
693 align_branch_indirect = 5,
694 align_branch_ret = 6
695 };
696
697/* Type bits of branches to align. */
698enum align_branch_bit
699 {
700 align_branch_jcc_bit = 1 << align_branch_jcc,
701 align_branch_fused_bit = 1 << align_branch_fused,
702 align_branch_jmp_bit = 1 << align_branch_jmp,
703 align_branch_call_bit = 1 << align_branch_call,
704 align_branch_indirect_bit = 1 << align_branch_indirect,
705 align_branch_ret_bit = 1 << align_branch_ret
706 };
707
708static unsigned int align_branch = (align_branch_jcc_bit
709 | align_branch_fused_bit
710 | align_branch_jmp_bit);
711
79d72f45
HL
712/* Types of condition jump used by macro-fusion. */
713enum mf_jcc_kind
714 {
715 mf_jcc_jo = 0, /* base opcode 0x70 */
716 mf_jcc_jc, /* base opcode 0x72 */
717 mf_jcc_je, /* base opcode 0x74 */
718 mf_jcc_jna, /* base opcode 0x76 */
719 mf_jcc_js, /* base opcode 0x78 */
720 mf_jcc_jp, /* base opcode 0x7a */
721 mf_jcc_jl, /* base opcode 0x7c */
722 mf_jcc_jle, /* base opcode 0x7e */
723 };
724
725/* Types of compare flag-modifying insntructions used by macro-fusion. */
726enum mf_cmp_kind
727 {
728 mf_cmp_test_and, /* test/cmp */
729 mf_cmp_alu_cmp, /* add/sub/cmp */
730 mf_cmp_incdec /* inc/dec */
731 };
732
e379e5f3
L
733/* The maximum padding size for fused jcc. CMP like instruction can
734 be 9 bytes and jcc can be 6 bytes. Leave room just in case for
735 prefixes. */
736#define MAX_FUSED_JCC_PADDING_SIZE 20
737
738/* The maximum number of prefixes added for an instruction. */
739static unsigned int align_branch_prefix_size = 5;
740
b6f8c7c4
L
741/* Optimization:
742 1. Clear the REX_W bit with register operand if possible.
743 2. Above plus use 128bit vector instruction to clear the full vector
744 register.
745 */
746static int optimize = 0;
747
748/* Optimization:
749 1. Clear the REX_W bit with register operand if possible.
750 2. Above plus use 128bit vector instruction to clear the full vector
751 register.
752 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
753 "testb $imm7,%r8".
754 */
755static int optimize_for_space = 0;
756
2ca3ace5
L
757/* Register prefix used for error message. */
758static const char *register_prefix = "%";
759
47926f60
KH
760/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
761 leave, push, and pop instructions so that gcc has the same stack
762 frame as in 32 bit mode. */
763static char stackop_size = '\0';
eecb386c 764
12b55ccc
L
765/* Non-zero to optimize code alignment. */
766int optimize_align_code = 1;
767
47926f60
KH
768/* Non-zero to quieten some warnings. */
769static int quiet_warnings = 0;
a38cf1db 770
47926f60
KH
771/* CPU name. */
772static const char *cpu_arch_name = NULL;
6305a203 773static char *cpu_sub_arch_name = NULL;
a38cf1db 774
47926f60 775/* CPU feature flags. */
40fb9820
L
776static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
777
ccc9c027
L
778/* If we have selected a cpu we are generating instructions for. */
779static int cpu_arch_tune_set = 0;
780
9103f4f4 781/* Cpu we are generating instructions for. */
fbf3f584 782enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4
L
783
784/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 785static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 786
ccc9c027 787/* CPU instruction set architecture used. */
fbf3f584 788enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 789
9103f4f4 790/* CPU feature flags of instruction set architecture used. */
fbf3f584 791i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 792
fddf5b5b
AM
793/* If set, conditional jumps are not automatically promoted to handle
794 larger than a byte offset. */
795static unsigned int no_cond_jump_promotion = 0;
796
c0f3af97
L
797/* Encode SSE instructions with VEX prefix. */
798static unsigned int sse2avx;
799
539f890d
L
800/* Encode scalar AVX instructions with specific vector length. */
801static enum
802 {
803 vex128 = 0,
804 vex256
805 } avxscalar;
806
03751133
L
807/* Encode VEX WIG instructions with specific vex.w. */
808static enum
809 {
810 vexw0 = 0,
811 vexw1
812 } vexwig;
813
43234a1e
L
814/* Encode scalar EVEX LIG instructions with specific vector length. */
815static enum
816 {
817 evexl128 = 0,
818 evexl256,
819 evexl512
820 } evexlig;
821
822/* Encode EVEX WIG instructions with specific evex.w. */
823static enum
824 {
825 evexw0 = 0,
826 evexw1
827 } evexwig;
828
d3d3c6db
IT
829/* Value to encode in EVEX RC bits, for SAE-only instructions. */
830static enum rc_type evexrcig = rne;
831
29b0f896 832/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 833static symbolS *GOT_symbol;
29b0f896 834
a4447b93
RH
835/* The dwarf2 return column, adjusted for 32 or 64 bit. */
836unsigned int x86_dwarf2_return_column;
837
838/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
839int x86_cie_data_alignment;
840
252b5132 841/* Interface to relax_segment.
fddf5b5b
AM
842 There are 3 major relax states for 386 jump insns because the
843 different types of jumps add different sizes to frags when we're
e379e5f3
L
844 figuring out what sort of jump to choose to reach a given label.
845
846 BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING are used to align
847 branches which are handled by md_estimate_size_before_relax() and
848 i386_generic_table_relax_frag(). */
252b5132 849
47926f60 850/* Types. */
93c2a809
AM
851#define UNCOND_JUMP 0
852#define COND_JUMP 1
853#define COND_JUMP86 2
e379e5f3
L
854#define BRANCH_PADDING 3
855#define BRANCH_PREFIX 4
856#define FUSED_JCC_PADDING 5
fddf5b5b 857
47926f60 858/* Sizes. */
252b5132
RH
859#define CODE16 1
860#define SMALL 0
29b0f896 861#define SMALL16 (SMALL | CODE16)
252b5132 862#define BIG 2
29b0f896 863#define BIG16 (BIG | CODE16)
252b5132
RH
864
865#ifndef INLINE
866#ifdef __GNUC__
867#define INLINE __inline__
868#else
869#define INLINE
870#endif
871#endif
872
fddf5b5b
AM
873#define ENCODE_RELAX_STATE(type, size) \
874 ((relax_substateT) (((type) << 2) | (size)))
875#define TYPE_FROM_RELAX_STATE(s) \
876 ((s) >> 2)
877#define DISP_SIZE_FROM_RELAX_STATE(s) \
878 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
879
880/* This table is used by relax_frag to promote short jumps to long
881 ones where necessary. SMALL (short) jumps may be promoted to BIG
882 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
883 don't allow a short jump in a 32 bit code segment to be promoted to
884 a 16 bit offset jump because it's slower (requires data size
885 prefix), and doesn't work, unless the destination is in the bottom
886 64k of the code segment (The top 16 bits of eip are zeroed). */
887
888const relax_typeS md_relax_table[] =
889{
24eab124
AM
890 /* The fields are:
891 1) most positive reach of this state,
892 2) most negative reach of this state,
93c2a809 893 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 894 4) which index into the table to try if we can't fit into this one. */
252b5132 895
fddf5b5b 896 /* UNCOND_JUMP states. */
93c2a809
AM
897 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
898 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
899 /* dword jmp adds 4 bytes to frag:
900 0 extra opcode bytes, 4 displacement bytes. */
252b5132 901 {0, 0, 4, 0},
93c2a809
AM
902 /* word jmp adds 2 byte2 to frag:
903 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
904 {0, 0, 2, 0},
905
93c2a809
AM
906 /* COND_JUMP states. */
907 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
908 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
909 /* dword conditionals adds 5 bytes to frag:
910 1 extra opcode byte, 4 displacement bytes. */
911 {0, 0, 5, 0},
fddf5b5b 912 /* word conditionals add 3 bytes to frag:
93c2a809
AM
913 1 extra opcode byte, 2 displacement bytes. */
914 {0, 0, 3, 0},
915
916 /* COND_JUMP86 states. */
917 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
918 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
919 /* dword conditionals adds 5 bytes to frag:
920 1 extra opcode byte, 4 displacement bytes. */
921 {0, 0, 5, 0},
922 /* word conditionals add 4 bytes to frag:
923 1 displacement byte and a 3 byte long branch insn. */
924 {0, 0, 4, 0}
252b5132
RH
925};
926
9103f4f4
L
927static const arch_entry cpu_arch[] =
928{
89507696
JB
929 /* Do not replace the first two entries - i386_target_format()
930 relies on them being there in this order. */
8a2c8fef 931 { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
293f5f65 932 CPU_GENERIC32_FLAGS, 0 },
8a2c8fef 933 { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
293f5f65 934 CPU_GENERIC64_FLAGS, 0 },
8a2c8fef 935 { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
293f5f65 936 CPU_NONE_FLAGS, 0 },
8a2c8fef 937 { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
293f5f65 938 CPU_I186_FLAGS, 0 },
8a2c8fef 939 { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
293f5f65 940 CPU_I286_FLAGS, 0 },
8a2c8fef 941 { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
293f5f65 942 CPU_I386_FLAGS, 0 },
8a2c8fef 943 { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
293f5f65 944 CPU_I486_FLAGS, 0 },
8a2c8fef 945 { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
293f5f65 946 CPU_I586_FLAGS, 0 },
8a2c8fef 947 { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
293f5f65 948 CPU_I686_FLAGS, 0 },
8a2c8fef 949 { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
293f5f65 950 CPU_I586_FLAGS, 0 },
8a2c8fef 951 { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
293f5f65 952 CPU_PENTIUMPRO_FLAGS, 0 },
8a2c8fef 953 { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
293f5f65 954 CPU_P2_FLAGS, 0 },
8a2c8fef 955 { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
293f5f65 956 CPU_P3_FLAGS, 0 },
8a2c8fef 957 { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
293f5f65 958 CPU_P4_FLAGS, 0 },
8a2c8fef 959 { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
293f5f65 960 CPU_CORE_FLAGS, 0 },
8a2c8fef 961 { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
293f5f65 962 CPU_NOCONA_FLAGS, 0 },
8a2c8fef 963 { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
293f5f65 964 CPU_CORE_FLAGS, 1 },
8a2c8fef 965 { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
293f5f65 966 CPU_CORE_FLAGS, 0 },
8a2c8fef 967 { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
293f5f65 968 CPU_CORE2_FLAGS, 1 },
8a2c8fef 969 { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
293f5f65 970 CPU_CORE2_FLAGS, 0 },
8a2c8fef 971 { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
293f5f65 972 CPU_COREI7_FLAGS, 0 },
8a2c8fef 973 { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
293f5f65 974 CPU_L1OM_FLAGS, 0 },
7a9068fe 975 { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
293f5f65 976 CPU_K1OM_FLAGS, 0 },
81486035 977 { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
293f5f65 978 CPU_IAMCU_FLAGS, 0 },
8a2c8fef 979 { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
293f5f65 980 CPU_K6_FLAGS, 0 },
8a2c8fef 981 { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
293f5f65 982 CPU_K6_2_FLAGS, 0 },
8a2c8fef 983 { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
293f5f65 984 CPU_ATHLON_FLAGS, 0 },
8a2c8fef 985 { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
293f5f65 986 CPU_K8_FLAGS, 1 },
8a2c8fef 987 { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
293f5f65 988 CPU_K8_FLAGS, 0 },
8a2c8fef 989 { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
293f5f65 990 CPU_K8_FLAGS, 0 },
8a2c8fef 991 { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
293f5f65 992 CPU_AMDFAM10_FLAGS, 0 },
8aedb9fe 993 { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
293f5f65 994 CPU_BDVER1_FLAGS, 0 },
8aedb9fe 995 { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
293f5f65 996 CPU_BDVER2_FLAGS, 0 },
5e5c50d3 997 { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
293f5f65 998 CPU_BDVER3_FLAGS, 0 },
c7b0bd56 999 { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
293f5f65 1000 CPU_BDVER4_FLAGS, 0 },
029f3522 1001 { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
293f5f65 1002 CPU_ZNVER1_FLAGS, 0 },
a9660a6f
AP
1003 { STRING_COMMA_LEN ("znver2"), PROCESSOR_ZNVER,
1004 CPU_ZNVER2_FLAGS, 0 },
7b458c12 1005 { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
293f5f65 1006 CPU_BTVER1_FLAGS, 0 },
7b458c12 1007 { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
293f5f65 1008 CPU_BTVER2_FLAGS, 0 },
8a2c8fef 1009 { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
293f5f65 1010 CPU_8087_FLAGS, 0 },
8a2c8fef 1011 { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
293f5f65 1012 CPU_287_FLAGS, 0 },
8a2c8fef 1013 { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
293f5f65 1014 CPU_387_FLAGS, 0 },
1848e567
L
1015 { STRING_COMMA_LEN (".687"), PROCESSOR_UNKNOWN,
1016 CPU_687_FLAGS, 0 },
d871f3f4
L
1017 { STRING_COMMA_LEN (".cmov"), PROCESSOR_UNKNOWN,
1018 CPU_CMOV_FLAGS, 0 },
1019 { STRING_COMMA_LEN (".fxsr"), PROCESSOR_UNKNOWN,
1020 CPU_FXSR_FLAGS, 0 },
8a2c8fef 1021 { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
293f5f65 1022 CPU_MMX_FLAGS, 0 },
8a2c8fef 1023 { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
293f5f65 1024 CPU_SSE_FLAGS, 0 },
8a2c8fef 1025 { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
293f5f65 1026 CPU_SSE2_FLAGS, 0 },
8a2c8fef 1027 { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
293f5f65 1028 CPU_SSE3_FLAGS, 0 },
af5c13b0
L
1029 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
1030 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1031 { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
293f5f65 1032 CPU_SSSE3_FLAGS, 0 },
8a2c8fef 1033 { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
293f5f65 1034 CPU_SSE4_1_FLAGS, 0 },
8a2c8fef 1035 { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
293f5f65 1036 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1037 { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
293f5f65 1038 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1039 { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
293f5f65 1040 CPU_AVX_FLAGS, 0 },
6c30d220 1041 { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
293f5f65 1042 CPU_AVX2_FLAGS, 0 },
43234a1e 1043 { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
293f5f65 1044 CPU_AVX512F_FLAGS, 0 },
43234a1e 1045 { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
293f5f65 1046 CPU_AVX512CD_FLAGS, 0 },
43234a1e 1047 { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
293f5f65 1048 CPU_AVX512ER_FLAGS, 0 },
43234a1e 1049 { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
293f5f65 1050 CPU_AVX512PF_FLAGS, 0 },
1dfc6506 1051 { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
293f5f65 1052 CPU_AVX512DQ_FLAGS, 0 },
1dfc6506 1053 { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
293f5f65 1054 CPU_AVX512BW_FLAGS, 0 },
1dfc6506 1055 { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
293f5f65 1056 CPU_AVX512VL_FLAGS, 0 },
8a2c8fef 1057 { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
293f5f65 1058 CPU_VMX_FLAGS, 0 },
8729a6f6 1059 { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
293f5f65 1060 CPU_VMFUNC_FLAGS, 0 },
8a2c8fef 1061 { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
293f5f65 1062 CPU_SMX_FLAGS, 0 },
8a2c8fef 1063 { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
293f5f65 1064 CPU_XSAVE_FLAGS, 0 },
c7b8aa3a 1065 { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
293f5f65 1066 CPU_XSAVEOPT_FLAGS, 0 },
1dfc6506 1067 { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
293f5f65 1068 CPU_XSAVEC_FLAGS, 0 },
1dfc6506 1069 { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
293f5f65 1070 CPU_XSAVES_FLAGS, 0 },
8a2c8fef 1071 { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
293f5f65 1072 CPU_AES_FLAGS, 0 },
8a2c8fef 1073 { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
293f5f65 1074 CPU_PCLMUL_FLAGS, 0 },
8a2c8fef 1075 { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
293f5f65 1076 CPU_PCLMUL_FLAGS, 1 },
c7b8aa3a 1077 { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
293f5f65 1078 CPU_FSGSBASE_FLAGS, 0 },
c7b8aa3a 1079 { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
293f5f65 1080 CPU_RDRND_FLAGS, 0 },
c7b8aa3a 1081 { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
293f5f65 1082 CPU_F16C_FLAGS, 0 },
6c30d220 1083 { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
293f5f65 1084 CPU_BMI2_FLAGS, 0 },
8a2c8fef 1085 { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
293f5f65 1086 CPU_FMA_FLAGS, 0 },
8a2c8fef 1087 { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
293f5f65 1088 CPU_FMA4_FLAGS, 0 },
8a2c8fef 1089 { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
293f5f65 1090 CPU_XOP_FLAGS, 0 },
8a2c8fef 1091 { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
293f5f65 1092 CPU_LWP_FLAGS, 0 },
8a2c8fef 1093 { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
293f5f65 1094 CPU_MOVBE_FLAGS, 0 },
60aa667e 1095 { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
293f5f65 1096 CPU_CX16_FLAGS, 0 },
8a2c8fef 1097 { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
293f5f65 1098 CPU_EPT_FLAGS, 0 },
6c30d220 1099 { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
293f5f65 1100 CPU_LZCNT_FLAGS, 0 },
272a84b1
L
1101 { STRING_COMMA_LEN (".popcnt"), PROCESSOR_UNKNOWN,
1102 CPU_POPCNT_FLAGS, 0 },
42164a71 1103 { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
293f5f65 1104 CPU_HLE_FLAGS, 0 },
42164a71 1105 { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
293f5f65 1106 CPU_RTM_FLAGS, 0 },
6c30d220 1107 { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
293f5f65 1108 CPU_INVPCID_FLAGS, 0 },
8a2c8fef 1109 { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
293f5f65 1110 CPU_CLFLUSH_FLAGS, 0 },
22109423 1111 { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
293f5f65 1112 CPU_NOP_FLAGS, 0 },
8a2c8fef 1113 { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
293f5f65 1114 CPU_SYSCALL_FLAGS, 0 },
8a2c8fef 1115 { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
293f5f65 1116 CPU_RDTSCP_FLAGS, 0 },
8a2c8fef 1117 { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
293f5f65 1118 CPU_3DNOW_FLAGS, 0 },
8a2c8fef 1119 { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
293f5f65 1120 CPU_3DNOWA_FLAGS, 0 },
8a2c8fef 1121 { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
293f5f65 1122 CPU_PADLOCK_FLAGS, 0 },
8a2c8fef 1123 { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
293f5f65 1124 CPU_SVME_FLAGS, 1 },
8a2c8fef 1125 { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
293f5f65 1126 CPU_SVME_FLAGS, 0 },
8a2c8fef 1127 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
293f5f65 1128 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1129 { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
293f5f65 1130 CPU_ABM_FLAGS, 0 },
87973e9f 1131 { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
293f5f65 1132 CPU_BMI_FLAGS, 0 },
2a2a0f38 1133 { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
293f5f65 1134 CPU_TBM_FLAGS, 0 },
e2e1fcde 1135 { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
293f5f65 1136 CPU_ADX_FLAGS, 0 },
e2e1fcde 1137 { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
293f5f65 1138 CPU_RDSEED_FLAGS, 0 },
e2e1fcde 1139 { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
293f5f65 1140 CPU_PRFCHW_FLAGS, 0 },
5c111e37 1141 { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
293f5f65 1142 CPU_SMAP_FLAGS, 0 },
7e8b059b 1143 { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
293f5f65 1144 CPU_MPX_FLAGS, 0 },
a0046408 1145 { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
293f5f65 1146 CPU_SHA_FLAGS, 0 },
963f3586 1147 { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
293f5f65 1148 CPU_CLFLUSHOPT_FLAGS, 0 },
dcf893b5 1149 { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
293f5f65 1150 CPU_PREFETCHWT1_FLAGS, 0 },
2cf200a4 1151 { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
293f5f65 1152 CPU_SE1_FLAGS, 0 },
c5e7287a 1153 { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
293f5f65 1154 CPU_CLWB_FLAGS, 0 },
2cc1b5aa 1155 { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
293f5f65 1156 CPU_AVX512IFMA_FLAGS, 0 },
14f195c9 1157 { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
293f5f65 1158 CPU_AVX512VBMI_FLAGS, 0 },
920d2ddc
IT
1159 { STRING_COMMA_LEN (".avx512_4fmaps"), PROCESSOR_UNKNOWN,
1160 CPU_AVX512_4FMAPS_FLAGS, 0 },
47acf0bd
IT
1161 { STRING_COMMA_LEN (".avx512_4vnniw"), PROCESSOR_UNKNOWN,
1162 CPU_AVX512_4VNNIW_FLAGS, 0 },
620214f7
IT
1163 { STRING_COMMA_LEN (".avx512_vpopcntdq"), PROCESSOR_UNKNOWN,
1164 CPU_AVX512_VPOPCNTDQ_FLAGS, 0 },
53467f57
IT
1165 { STRING_COMMA_LEN (".avx512_vbmi2"), PROCESSOR_UNKNOWN,
1166 CPU_AVX512_VBMI2_FLAGS, 0 },
8cfcb765
IT
1167 { STRING_COMMA_LEN (".avx512_vnni"), PROCESSOR_UNKNOWN,
1168 CPU_AVX512_VNNI_FLAGS, 0 },
ee6872be
IT
1169 { STRING_COMMA_LEN (".avx512_bitalg"), PROCESSOR_UNKNOWN,
1170 CPU_AVX512_BITALG_FLAGS, 0 },
029f3522 1171 { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
293f5f65 1172 CPU_CLZERO_FLAGS, 0 },
9916071f 1173 { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
293f5f65 1174 CPU_MWAITX_FLAGS, 0 },
8eab4136 1175 { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
293f5f65 1176 CPU_OSPKE_FLAGS, 0 },
8bc52696 1177 { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
293f5f65 1178 CPU_RDPID_FLAGS, 0 },
6b40c462
L
1179 { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
1180 CPU_PTWRITE_FLAGS, 0 },
d777820b
IT
1181 { STRING_COMMA_LEN (".ibt"), PROCESSOR_UNKNOWN,
1182 CPU_IBT_FLAGS, 0 },
1183 { STRING_COMMA_LEN (".shstk"), PROCESSOR_UNKNOWN,
1184 CPU_SHSTK_FLAGS, 0 },
48521003
IT
1185 { STRING_COMMA_LEN (".gfni"), PROCESSOR_UNKNOWN,
1186 CPU_GFNI_FLAGS, 0 },
8dcf1fad
IT
1187 { STRING_COMMA_LEN (".vaes"), PROCESSOR_UNKNOWN,
1188 CPU_VAES_FLAGS, 0 },
ff1982d5
IT
1189 { STRING_COMMA_LEN (".vpclmulqdq"), PROCESSOR_UNKNOWN,
1190 CPU_VPCLMULQDQ_FLAGS, 0 },
3233d7d0
IT
1191 { STRING_COMMA_LEN (".wbnoinvd"), PROCESSOR_UNKNOWN,
1192 CPU_WBNOINVD_FLAGS, 0 },
be3a8dca
IT
1193 { STRING_COMMA_LEN (".pconfig"), PROCESSOR_UNKNOWN,
1194 CPU_PCONFIG_FLAGS, 0 },
de89d0a3
IT
1195 { STRING_COMMA_LEN (".waitpkg"), PROCESSOR_UNKNOWN,
1196 CPU_WAITPKG_FLAGS, 0 },
c48935d7
IT
1197 { STRING_COMMA_LEN (".cldemote"), PROCESSOR_UNKNOWN,
1198 CPU_CLDEMOTE_FLAGS, 0 },
c0a30a9f
L
1199 { STRING_COMMA_LEN (".movdiri"), PROCESSOR_UNKNOWN,
1200 CPU_MOVDIRI_FLAGS, 0 },
1201 { STRING_COMMA_LEN (".movdir64b"), PROCESSOR_UNKNOWN,
1202 CPU_MOVDIR64B_FLAGS, 0 },
d6aab7a1
XG
1203 { STRING_COMMA_LEN (".avx512_bf16"), PROCESSOR_UNKNOWN,
1204 CPU_AVX512_BF16_FLAGS, 0 },
9186c494
L
1205 { STRING_COMMA_LEN (".avx512_vp2intersect"), PROCESSOR_UNKNOWN,
1206 CPU_AVX512_VP2INTERSECT_FLAGS, 0 },
dd455cf5
L
1207 { STRING_COMMA_LEN (".enqcmd"), PROCESSOR_UNKNOWN,
1208 CPU_ENQCMD_FLAGS, 0 },
4b27d27c
L
1209 { STRING_COMMA_LEN (".serialize"), PROCESSOR_UNKNOWN,
1210 CPU_SERIALIZE_FLAGS, 0 },
142861df
JB
1211 { STRING_COMMA_LEN (".rdpru"), PROCESSOR_UNKNOWN,
1212 CPU_RDPRU_FLAGS, 0 },
1213 { STRING_COMMA_LEN (".mcommit"), PROCESSOR_UNKNOWN,
1214 CPU_MCOMMIT_FLAGS, 0 },
a847e322
JB
1215 { STRING_COMMA_LEN (".sev_es"), PROCESSOR_UNKNOWN,
1216 CPU_SEV_ES_FLAGS, 0 },
bb651e8b
CL
1217 { STRING_COMMA_LEN (".tsxldtrk"), PROCESSOR_UNKNOWN,
1218 CPU_TSXLDTRK_FLAGS, 0 },
293f5f65
L
1219};
1220
1221static const noarch_entry cpu_noarch[] =
1222{
1223 { STRING_COMMA_LEN ("no87"), CPU_ANY_X87_FLAGS },
1848e567
L
1224 { STRING_COMMA_LEN ("no287"), CPU_ANY_287_FLAGS },
1225 { STRING_COMMA_LEN ("no387"), CPU_ANY_387_FLAGS },
1226 { STRING_COMMA_LEN ("no687"), CPU_ANY_687_FLAGS },
d871f3f4
L
1227 { STRING_COMMA_LEN ("nocmov"), CPU_ANY_CMOV_FLAGS },
1228 { STRING_COMMA_LEN ("nofxsr"), CPU_ANY_FXSR_FLAGS },
293f5f65
L
1229 { STRING_COMMA_LEN ("nommx"), CPU_ANY_MMX_FLAGS },
1230 { STRING_COMMA_LEN ("nosse"), CPU_ANY_SSE_FLAGS },
1848e567
L
1231 { STRING_COMMA_LEN ("nosse2"), CPU_ANY_SSE2_FLAGS },
1232 { STRING_COMMA_LEN ("nosse3"), CPU_ANY_SSE3_FLAGS },
af5c13b0 1233 { STRING_COMMA_LEN ("nosse4a"), CPU_ANY_SSE4A_FLAGS },
1848e567
L
1234 { STRING_COMMA_LEN ("nossse3"), CPU_ANY_SSSE3_FLAGS },
1235 { STRING_COMMA_LEN ("nosse4.1"), CPU_ANY_SSE4_1_FLAGS },
1236 { STRING_COMMA_LEN ("nosse4.2"), CPU_ANY_SSE4_2_FLAGS },
af5c13b0 1237 { STRING_COMMA_LEN ("nosse4"), CPU_ANY_SSE4_1_FLAGS },
293f5f65 1238 { STRING_COMMA_LEN ("noavx"), CPU_ANY_AVX_FLAGS },
1848e567 1239 { STRING_COMMA_LEN ("noavx2"), CPU_ANY_AVX2_FLAGS },
144b71e2
L
1240 { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
1241 { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
1242 { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
1243 { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
1244 { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
1245 { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
1246 { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
1247 { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
1248 { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
920d2ddc 1249 { STRING_COMMA_LEN ("noavx512_4fmaps"), CPU_ANY_AVX512_4FMAPS_FLAGS },
47acf0bd 1250 { STRING_COMMA_LEN ("noavx512_4vnniw"), CPU_ANY_AVX512_4VNNIW_FLAGS },
620214f7 1251 { STRING_COMMA_LEN ("noavx512_vpopcntdq"), CPU_ANY_AVX512_VPOPCNTDQ_FLAGS },
53467f57 1252 { STRING_COMMA_LEN ("noavx512_vbmi2"), CPU_ANY_AVX512_VBMI2_FLAGS },
8cfcb765 1253 { STRING_COMMA_LEN ("noavx512_vnni"), CPU_ANY_AVX512_VNNI_FLAGS },
ee6872be 1254 { STRING_COMMA_LEN ("noavx512_bitalg"), CPU_ANY_AVX512_BITALG_FLAGS },
d777820b
IT
1255 { STRING_COMMA_LEN ("noibt"), CPU_ANY_IBT_FLAGS },
1256 { STRING_COMMA_LEN ("noshstk"), CPU_ANY_SHSTK_FLAGS },
c0a30a9f
L
1257 { STRING_COMMA_LEN ("nomovdiri"), CPU_ANY_MOVDIRI_FLAGS },
1258 { STRING_COMMA_LEN ("nomovdir64b"), CPU_ANY_MOVDIR64B_FLAGS },
d6aab7a1 1259 { STRING_COMMA_LEN ("noavx512_bf16"), CPU_ANY_AVX512_BF16_FLAGS },
9186c494 1260 { STRING_COMMA_LEN ("noavx512_vp2intersect"), CPU_ANY_SHSTK_FLAGS },
dd455cf5 1261 { STRING_COMMA_LEN ("noenqcmd"), CPU_ANY_ENQCMD_FLAGS },
4b27d27c 1262 { STRING_COMMA_LEN ("noserialize"), CPU_ANY_SERIALIZE_FLAGS },
bb651e8b 1263 { STRING_COMMA_LEN ("notsxldtrk"), CPU_ANY_TSXLDTRK_FLAGS },
e413e4e9
AM
1264};
1265
704209c0 1266#ifdef I386COFF
a6c24e68
NC
1267/* Like s_lcomm_internal in gas/read.c but the alignment string
1268 is allowed to be optional. */
1269
1270static symbolS *
1271pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1272{
1273 addressT align = 0;
1274
1275 SKIP_WHITESPACE ();
1276
7ab9ffdd 1277 if (needs_align
a6c24e68
NC
1278 && *input_line_pointer == ',')
1279 {
1280 align = parse_align (needs_align - 1);
7ab9ffdd 1281
a6c24e68
NC
1282 if (align == (addressT) -1)
1283 return NULL;
1284 }
1285 else
1286 {
1287 if (size >= 8)
1288 align = 3;
1289 else if (size >= 4)
1290 align = 2;
1291 else if (size >= 2)
1292 align = 1;
1293 else
1294 align = 0;
1295 }
1296
1297 bss_alloc (symbolP, size, align);
1298 return symbolP;
1299}
1300
704209c0 1301static void
a6c24e68
NC
1302pe_lcomm (int needs_align)
1303{
1304 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1305}
704209c0 1306#endif
a6c24e68 1307
29b0f896
AM
1308const pseudo_typeS md_pseudo_table[] =
1309{
1310#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1311 {"align", s_align_bytes, 0},
1312#else
1313 {"align", s_align_ptwo, 0},
1314#endif
1315 {"arch", set_cpu_arch, 0},
1316#ifndef I386COFF
1317 {"bss", s_bss, 0},
a6c24e68
NC
1318#else
1319 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1320#endif
1321 {"ffloat", float_cons, 'f'},
1322 {"dfloat", float_cons, 'd'},
1323 {"tfloat", float_cons, 'x'},
1324 {"value", cons, 2},
d182319b 1325 {"slong", signed_cons, 4},
29b0f896
AM
1326 {"noopt", s_ignore, 0},
1327 {"optim", s_ignore, 0},
1328 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1329 {"code16", set_code_flag, CODE_16BIT},
1330 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1331#ifdef BFD64
29b0f896 1332 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1333#endif
29b0f896
AM
1334 {"intel_syntax", set_intel_syntax, 1},
1335 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1336 {"intel_mnemonic", set_intel_mnemonic, 1},
1337 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1338 {"allow_index_reg", set_allow_index_reg, 1},
1339 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1340 {"sse_check", set_check, 0},
1341 {"operand_check", set_check, 1},
3b22753a
L
1342#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1343 {"largecomm", handle_large_common, 0},
07a53e5c 1344#else
68d20676 1345 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1346 {"loc", dwarf2_directive_loc, 0},
1347 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1348#endif
6482c264
NC
1349#ifdef TE_PE
1350 {"secrel32", pe_directive_secrel, 0},
1351#endif
29b0f896
AM
1352 {0, 0, 0}
1353};
1354
1355/* For interface with expression (). */
1356extern char *input_line_pointer;
1357
1358/* Hash table for instruction mnemonic lookup. */
1359static struct hash_control *op_hash;
1360
1361/* Hash table for register lookup. */
1362static struct hash_control *reg_hash;
1363\f
ce8a8b2f
AM
1364 /* Various efficient no-op patterns for aligning code labels.
1365 Note: Don't try to assemble the instructions in the comments.
1366 0L and 0w are not legal. */
62a02d25
L
1367static const unsigned char f32_1[] =
1368 {0x90}; /* nop */
1369static const unsigned char f32_2[] =
1370 {0x66,0x90}; /* xchg %ax,%ax */
1371static const unsigned char f32_3[] =
1372 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1373static const unsigned char f32_4[] =
1374 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
62a02d25
L
1375static const unsigned char f32_6[] =
1376 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1377static const unsigned char f32_7[] =
1378 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
62a02d25 1379static const unsigned char f16_3[] =
3ae729d5 1380 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
62a02d25 1381static const unsigned char f16_4[] =
3ae729d5
L
1382 {0x8d,0xb4,0x00,0x00}; /* lea 0W(%si),%si */
1383static const unsigned char jump_disp8[] =
1384 {0xeb}; /* jmp disp8 */
1385static const unsigned char jump32_disp32[] =
1386 {0xe9}; /* jmp disp32 */
1387static const unsigned char jump16_disp32[] =
1388 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1389/* 32-bit NOPs patterns. */
1390static const unsigned char *const f32_patt[] = {
3ae729d5 1391 f32_1, f32_2, f32_3, f32_4, NULL, f32_6, f32_7
62a02d25
L
1392};
1393/* 16-bit NOPs patterns. */
1394static const unsigned char *const f16_patt[] = {
3ae729d5 1395 f32_1, f32_2, f16_3, f16_4
62a02d25
L
1396};
1397/* nopl (%[re]ax) */
1398static const unsigned char alt_3[] =
1399 {0x0f,0x1f,0x00};
1400/* nopl 0(%[re]ax) */
1401static const unsigned char alt_4[] =
1402 {0x0f,0x1f,0x40,0x00};
1403/* nopl 0(%[re]ax,%[re]ax,1) */
1404static const unsigned char alt_5[] =
1405 {0x0f,0x1f,0x44,0x00,0x00};
1406/* nopw 0(%[re]ax,%[re]ax,1) */
1407static const unsigned char alt_6[] =
1408 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1409/* nopl 0L(%[re]ax) */
1410static const unsigned char alt_7[] =
1411 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1412/* nopl 0L(%[re]ax,%[re]ax,1) */
1413static const unsigned char alt_8[] =
1414 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1415/* nopw 0L(%[re]ax,%[re]ax,1) */
1416static const unsigned char alt_9[] =
1417 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1418/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1419static const unsigned char alt_10[] =
1420 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
3ae729d5
L
1421/* data16 nopw %cs:0L(%eax,%eax,1) */
1422static const unsigned char alt_11[] =
1423 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1424/* 32-bit and 64-bit NOPs patterns. */
1425static const unsigned char *const alt_patt[] = {
1426 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1427 alt_9, alt_10, alt_11
62a02d25
L
1428};
1429
1430/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1431 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1432
1433static void
1434i386_output_nops (char *where, const unsigned char *const *patt,
1435 int count, int max_single_nop_size)
1436
1437{
3ae729d5
L
1438 /* Place the longer NOP first. */
1439 int last;
1440 int offset;
3076e594
NC
1441 const unsigned char *nops;
1442
1443 if (max_single_nop_size < 1)
1444 {
1445 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1446 max_single_nop_size);
1447 return;
1448 }
1449
1450 nops = patt[max_single_nop_size - 1];
3ae729d5
L
1451
1452 /* Use the smaller one if the requsted one isn't available. */
1453 if (nops == NULL)
62a02d25 1454 {
3ae729d5
L
1455 max_single_nop_size--;
1456 nops = patt[max_single_nop_size - 1];
62a02d25
L
1457 }
1458
3ae729d5
L
1459 last = count % max_single_nop_size;
1460
1461 count -= last;
1462 for (offset = 0; offset < count; offset += max_single_nop_size)
1463 memcpy (where + offset, nops, max_single_nop_size);
1464
1465 if (last)
1466 {
1467 nops = patt[last - 1];
1468 if (nops == NULL)
1469 {
1470 /* Use the smaller one plus one-byte NOP if the needed one
1471 isn't available. */
1472 last--;
1473 nops = patt[last - 1];
1474 memcpy (where + offset, nops, last);
1475 where[offset + last] = *patt[0];
1476 }
1477 else
1478 memcpy (where + offset, nops, last);
1479 }
62a02d25
L
1480}
1481
3ae729d5
L
1482static INLINE int
1483fits_in_imm7 (offsetT num)
1484{
1485 return (num & 0x7f) == num;
1486}
1487
1488static INLINE int
1489fits_in_imm31 (offsetT num)
1490{
1491 return (num & 0x7fffffff) == num;
1492}
62a02d25
L
1493
1494/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1495 single NOP instruction LIMIT. */
1496
1497void
3ae729d5 1498i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1499{
3ae729d5 1500 const unsigned char *const *patt = NULL;
62a02d25 1501 int max_single_nop_size;
3ae729d5
L
1502 /* Maximum number of NOPs before switching to jump over NOPs. */
1503 int max_number_of_nops;
62a02d25 1504
3ae729d5 1505 switch (fragP->fr_type)
62a02d25 1506 {
3ae729d5
L
1507 case rs_fill_nop:
1508 case rs_align_code:
1509 break;
e379e5f3
L
1510 case rs_machine_dependent:
1511 /* Allow NOP padding for jumps and calls. */
1512 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
1513 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
1514 break;
1515 /* Fall through. */
3ae729d5 1516 default:
62a02d25
L
1517 return;
1518 }
1519
ccc9c027
L
1520 /* We need to decide which NOP sequence to use for 32bit and
1521 64bit. When -mtune= is used:
4eed87de 1522
76bc74dc
L
1523 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
1524 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1525 2. For the rest, alt_patt will be used.
1526
1527 When -mtune= isn't used, alt_patt will be used if
22109423 1528 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will
76bc74dc 1529 be used.
ccc9c027
L
1530
1531 When -march= or .arch is used, we can't use anything beyond
1532 cpu_arch_isa_flags. */
1533
1534 if (flag_code == CODE_16BIT)
1535 {
3ae729d5
L
1536 patt = f16_patt;
1537 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1538 /* Limit number of NOPs to 2 in 16-bit mode. */
1539 max_number_of_nops = 2;
252b5132 1540 }
33fef721 1541 else
ccc9c027 1542 {
fbf3f584 1543 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027
L
1544 {
1545 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
1546 switch (cpu_arch_tune)
1547 {
1548 case PROCESSOR_UNKNOWN:
1549 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423
L
1550 optimize with nops. */
1551 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1552 patt = alt_patt;
ccc9c027
L
1553 else
1554 patt = f32_patt;
1555 break;
ccc9c027
L
1556 case PROCESSOR_PENTIUM4:
1557 case PROCESSOR_NOCONA:
ef05d495 1558 case PROCESSOR_CORE:
76bc74dc 1559 case PROCESSOR_CORE2:
bd5295b2 1560 case PROCESSOR_COREI7:
3632d14b 1561 case PROCESSOR_L1OM:
7a9068fe 1562 case PROCESSOR_K1OM:
76bc74dc 1563 case PROCESSOR_GENERIC64:
ccc9c027
L
1564 case PROCESSOR_K6:
1565 case PROCESSOR_ATHLON:
1566 case PROCESSOR_K8:
4eed87de 1567 case PROCESSOR_AMDFAM10:
8aedb9fe 1568 case PROCESSOR_BD:
029f3522 1569 case PROCESSOR_ZNVER:
7b458c12 1570 case PROCESSOR_BT:
80b8656c 1571 patt = alt_patt;
ccc9c027 1572 break;
76bc74dc 1573 case PROCESSOR_I386:
ccc9c027
L
1574 case PROCESSOR_I486:
1575 case PROCESSOR_PENTIUM:
2dde1948 1576 case PROCESSOR_PENTIUMPRO:
81486035 1577 case PROCESSOR_IAMCU:
ccc9c027
L
1578 case PROCESSOR_GENERIC32:
1579 patt = f32_patt;
1580 break;
4eed87de 1581 }
ccc9c027
L
1582 }
1583 else
1584 {
fbf3f584 1585 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1586 {
1587 case PROCESSOR_UNKNOWN:
e6a14101 1588 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1589 PROCESSOR_UNKNOWN. */
1590 abort ();
1591 break;
1592
76bc74dc 1593 case PROCESSOR_I386:
ccc9c027
L
1594 case PROCESSOR_I486:
1595 case PROCESSOR_PENTIUM:
81486035 1596 case PROCESSOR_IAMCU:
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:
ccc9c027
L
1604 case PROCESSOR_GENERIC32:
1605 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423
L
1606 with nops. */
1607 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1608 patt = alt_patt;
ccc9c027
L
1609 else
1610 patt = f32_patt;
1611 break;
76bc74dc
L
1612 case PROCESSOR_PENTIUMPRO:
1613 case PROCESSOR_PENTIUM4:
1614 case PROCESSOR_NOCONA:
1615 case PROCESSOR_CORE:
ef05d495 1616 case PROCESSOR_CORE2:
bd5295b2 1617 case PROCESSOR_COREI7:
3632d14b 1618 case PROCESSOR_L1OM:
7a9068fe 1619 case PROCESSOR_K1OM:
22109423 1620 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1621 patt = alt_patt;
ccc9c027
L
1622 else
1623 patt = f32_patt;
1624 break;
1625 case PROCESSOR_GENERIC64:
80b8656c 1626 patt = alt_patt;
ccc9c027 1627 break;
4eed87de 1628 }
ccc9c027
L
1629 }
1630
76bc74dc
L
1631 if (patt == f32_patt)
1632 {
3ae729d5
L
1633 max_single_nop_size = sizeof (f32_patt) / sizeof (f32_patt[0]);
1634 /* Limit number of NOPs to 2 for older processors. */
1635 max_number_of_nops = 2;
76bc74dc
L
1636 }
1637 else
1638 {
3ae729d5
L
1639 max_single_nop_size = sizeof (alt_patt) / sizeof (alt_patt[0]);
1640 /* Limit number of NOPs to 7 for newer processors. */
1641 max_number_of_nops = 7;
1642 }
1643 }
1644
1645 if (limit == 0)
1646 limit = max_single_nop_size;
1647
1648 if (fragP->fr_type == rs_fill_nop)
1649 {
1650 /* Output NOPs for .nop directive. */
1651 if (limit > max_single_nop_size)
1652 {
1653 as_bad_where (fragP->fr_file, fragP->fr_line,
1654 _("invalid single nop size: %d "
1655 "(expect within [0, %d])"),
1656 limit, max_single_nop_size);
1657 return;
1658 }
1659 }
e379e5f3 1660 else if (fragP->fr_type != rs_machine_dependent)
3ae729d5
L
1661 fragP->fr_var = count;
1662
1663 if ((count / max_single_nop_size) > max_number_of_nops)
1664 {
1665 /* Generate jump over NOPs. */
1666 offsetT disp = count - 2;
1667 if (fits_in_imm7 (disp))
1668 {
1669 /* Use "jmp disp8" if possible. */
1670 count = disp;
1671 where[0] = jump_disp8[0];
1672 where[1] = count;
1673 where += 2;
1674 }
1675 else
1676 {
1677 unsigned int size_of_jump;
1678
1679 if (flag_code == CODE_16BIT)
1680 {
1681 where[0] = jump16_disp32[0];
1682 where[1] = jump16_disp32[1];
1683 size_of_jump = 2;
1684 }
1685 else
1686 {
1687 where[0] = jump32_disp32[0];
1688 size_of_jump = 1;
1689 }
1690
1691 count -= size_of_jump + 4;
1692 if (!fits_in_imm31 (count))
1693 {
1694 as_bad_where (fragP->fr_file, fragP->fr_line,
1695 _("jump over nop padding out of range"));
1696 return;
1697 }
1698
1699 md_number_to_chars (where + size_of_jump, count, 4);
1700 where += size_of_jump + 4;
76bc74dc 1701 }
ccc9c027 1702 }
3ae729d5
L
1703
1704 /* Generate multiple NOPs. */
1705 i386_output_nops (where, patt, count, limit);
252b5132
RH
1706}
1707
c6fb90c8 1708static INLINE int
0dfbf9d7 1709operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1710{
0dfbf9d7 1711 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1712 {
1713 case 3:
0dfbf9d7 1714 if (x->array[2])
c6fb90c8 1715 return 0;
1a0670f3 1716 /* Fall through. */
c6fb90c8 1717 case 2:
0dfbf9d7 1718 if (x->array[1])
c6fb90c8 1719 return 0;
1a0670f3 1720 /* Fall through. */
c6fb90c8 1721 case 1:
0dfbf9d7 1722 return !x->array[0];
c6fb90c8
L
1723 default:
1724 abort ();
1725 }
40fb9820
L
1726}
1727
c6fb90c8 1728static INLINE void
0dfbf9d7 1729operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1730{
0dfbf9d7 1731 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1732 {
1733 case 3:
0dfbf9d7 1734 x->array[2] = v;
1a0670f3 1735 /* Fall through. */
c6fb90c8 1736 case 2:
0dfbf9d7 1737 x->array[1] = v;
1a0670f3 1738 /* Fall through. */
c6fb90c8 1739 case 1:
0dfbf9d7 1740 x->array[0] = v;
1a0670f3 1741 /* Fall through. */
c6fb90c8
L
1742 break;
1743 default:
1744 abort ();
1745 }
bab6aec1
JB
1746
1747 x->bitfield.class = ClassNone;
75e5731b 1748 x->bitfield.instance = InstanceNone;
c6fb90c8 1749}
40fb9820 1750
c6fb90c8 1751static INLINE int
0dfbf9d7
L
1752operand_type_equal (const union i386_operand_type *x,
1753 const union i386_operand_type *y)
c6fb90c8 1754{
0dfbf9d7 1755 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1756 {
1757 case 3:
0dfbf9d7 1758 if (x->array[2] != y->array[2])
c6fb90c8 1759 return 0;
1a0670f3 1760 /* Fall through. */
c6fb90c8 1761 case 2:
0dfbf9d7 1762 if (x->array[1] != y->array[1])
c6fb90c8 1763 return 0;
1a0670f3 1764 /* Fall through. */
c6fb90c8 1765 case 1:
0dfbf9d7 1766 return x->array[0] == y->array[0];
c6fb90c8
L
1767 break;
1768 default:
1769 abort ();
1770 }
1771}
40fb9820 1772
0dfbf9d7
L
1773static INLINE int
1774cpu_flags_all_zero (const union i386_cpu_flags *x)
1775{
1776 switch (ARRAY_SIZE(x->array))
1777 {
53467f57
IT
1778 case 4:
1779 if (x->array[3])
1780 return 0;
1781 /* Fall through. */
0dfbf9d7
L
1782 case 3:
1783 if (x->array[2])
1784 return 0;
1a0670f3 1785 /* Fall through. */
0dfbf9d7
L
1786 case 2:
1787 if (x->array[1])
1788 return 0;
1a0670f3 1789 /* Fall through. */
0dfbf9d7
L
1790 case 1:
1791 return !x->array[0];
1792 default:
1793 abort ();
1794 }
1795}
1796
0dfbf9d7
L
1797static INLINE int
1798cpu_flags_equal (const union i386_cpu_flags *x,
1799 const union i386_cpu_flags *y)
1800{
1801 switch (ARRAY_SIZE(x->array))
1802 {
53467f57
IT
1803 case 4:
1804 if (x->array[3] != y->array[3])
1805 return 0;
1806 /* Fall through. */
0dfbf9d7
L
1807 case 3:
1808 if (x->array[2] != y->array[2])
1809 return 0;
1a0670f3 1810 /* Fall through. */
0dfbf9d7
L
1811 case 2:
1812 if (x->array[1] != y->array[1])
1813 return 0;
1a0670f3 1814 /* Fall through. */
0dfbf9d7
L
1815 case 1:
1816 return x->array[0] == y->array[0];
1817 break;
1818 default:
1819 abort ();
1820 }
1821}
c6fb90c8
L
1822
1823static INLINE int
1824cpu_flags_check_cpu64 (i386_cpu_flags f)
1825{
1826 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
1827 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
1828}
1829
c6fb90c8
L
1830static INLINE i386_cpu_flags
1831cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1832{
c6fb90c8
L
1833 switch (ARRAY_SIZE (x.array))
1834 {
53467f57
IT
1835 case 4:
1836 x.array [3] &= y.array [3];
1837 /* Fall through. */
c6fb90c8
L
1838 case 3:
1839 x.array [2] &= y.array [2];
1a0670f3 1840 /* Fall through. */
c6fb90c8
L
1841 case 2:
1842 x.array [1] &= y.array [1];
1a0670f3 1843 /* Fall through. */
c6fb90c8
L
1844 case 1:
1845 x.array [0] &= y.array [0];
1846 break;
1847 default:
1848 abort ();
1849 }
1850 return x;
1851}
40fb9820 1852
c6fb90c8
L
1853static INLINE i386_cpu_flags
1854cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1855{
c6fb90c8 1856 switch (ARRAY_SIZE (x.array))
40fb9820 1857 {
53467f57
IT
1858 case 4:
1859 x.array [3] |= y.array [3];
1860 /* Fall through. */
c6fb90c8
L
1861 case 3:
1862 x.array [2] |= y.array [2];
1a0670f3 1863 /* Fall through. */
c6fb90c8
L
1864 case 2:
1865 x.array [1] |= y.array [1];
1a0670f3 1866 /* Fall through. */
c6fb90c8
L
1867 case 1:
1868 x.array [0] |= y.array [0];
40fb9820
L
1869 break;
1870 default:
1871 abort ();
1872 }
40fb9820
L
1873 return x;
1874}
1875
309d3373
JB
1876static INLINE i386_cpu_flags
1877cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1878{
1879 switch (ARRAY_SIZE (x.array))
1880 {
53467f57
IT
1881 case 4:
1882 x.array [3] &= ~y.array [3];
1883 /* Fall through. */
309d3373
JB
1884 case 3:
1885 x.array [2] &= ~y.array [2];
1a0670f3 1886 /* Fall through. */
309d3373
JB
1887 case 2:
1888 x.array [1] &= ~y.array [1];
1a0670f3 1889 /* Fall through. */
309d3373
JB
1890 case 1:
1891 x.array [0] &= ~y.array [0];
1892 break;
1893 default:
1894 abort ();
1895 }
1896 return x;
1897}
1898
6c0946d0
JB
1899static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
1900
c0f3af97
L
1901#define CPU_FLAGS_ARCH_MATCH 0x1
1902#define CPU_FLAGS_64BIT_MATCH 0x2
1903
c0f3af97 1904#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1905 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1906
1907/* Return CPU flags match bits. */
3629bb00 1908
40fb9820 1909static int
d3ce72d0 1910cpu_flags_match (const insn_template *t)
40fb9820 1911{
c0f3af97
L
1912 i386_cpu_flags x = t->cpu_flags;
1913 int match = cpu_flags_check_cpu64 (x) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820
L
1914
1915 x.bitfield.cpu64 = 0;
1916 x.bitfield.cpuno64 = 0;
1917
0dfbf9d7 1918 if (cpu_flags_all_zero (&x))
c0f3af97
L
1919 {
1920 /* This instruction is available on all archs. */
db12e14e 1921 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1922 }
3629bb00
L
1923 else
1924 {
c0f3af97 1925 /* This instruction is available only on some archs. */
3629bb00
L
1926 i386_cpu_flags cpu = cpu_arch_flags;
1927
ab592e75
JB
1928 /* AVX512VL is no standalone feature - match it and then strip it. */
1929 if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl)
1930 return match;
1931 x.bitfield.cpuavx512vl = 0;
1932
3629bb00 1933 cpu = cpu_flags_and (x, cpu);
c0f3af97
L
1934 if (!cpu_flags_all_zero (&cpu))
1935 {
a5ff0eb2
L
1936 if (x.bitfield.cpuavx)
1937 {
929f69fa 1938 /* We need to check a few extra flags with AVX. */
b9d49817
JB
1939 if (cpu.bitfield.cpuavx
1940 && (!t->opcode_modifier.sse2avx || sse2avx)
1941 && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
929f69fa 1942 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
b9d49817
JB
1943 && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
1944 match |= CPU_FLAGS_ARCH_MATCH;
a5ff0eb2 1945 }
929f69fa
JB
1946 else if (x.bitfield.cpuavx512f)
1947 {
1948 /* We need to check a few extra flags with AVX512F. */
1949 if (cpu.bitfield.cpuavx512f
1950 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
1951 && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes)
1952 && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq))
1953 match |= CPU_FLAGS_ARCH_MATCH;
1954 }
a5ff0eb2 1955 else
db12e14e 1956 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1957 }
3629bb00 1958 }
c0f3af97 1959 return match;
40fb9820
L
1960}
1961
c6fb90c8
L
1962static INLINE i386_operand_type
1963operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 1964{
bab6aec1
JB
1965 if (x.bitfield.class != y.bitfield.class)
1966 x.bitfield.class = ClassNone;
75e5731b
JB
1967 if (x.bitfield.instance != y.bitfield.instance)
1968 x.bitfield.instance = InstanceNone;
bab6aec1 1969
c6fb90c8
L
1970 switch (ARRAY_SIZE (x.array))
1971 {
1972 case 3:
1973 x.array [2] &= y.array [2];
1a0670f3 1974 /* Fall through. */
c6fb90c8
L
1975 case 2:
1976 x.array [1] &= y.array [1];
1a0670f3 1977 /* Fall through. */
c6fb90c8
L
1978 case 1:
1979 x.array [0] &= y.array [0];
1980 break;
1981 default:
1982 abort ();
1983 }
1984 return x;
40fb9820
L
1985}
1986
73053c1f
JB
1987static INLINE i386_operand_type
1988operand_type_and_not (i386_operand_type x, i386_operand_type y)
1989{
bab6aec1 1990 gas_assert (y.bitfield.class == ClassNone);
75e5731b 1991 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 1992
73053c1f
JB
1993 switch (ARRAY_SIZE (x.array))
1994 {
1995 case 3:
1996 x.array [2] &= ~y.array [2];
1997 /* Fall through. */
1998 case 2:
1999 x.array [1] &= ~y.array [1];
2000 /* Fall through. */
2001 case 1:
2002 x.array [0] &= ~y.array [0];
2003 break;
2004 default:
2005 abort ();
2006 }
2007 return x;
2008}
2009
c6fb90c8
L
2010static INLINE i386_operand_type
2011operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 2012{
bab6aec1
JB
2013 gas_assert (x.bitfield.class == ClassNone ||
2014 y.bitfield.class == ClassNone ||
2015 x.bitfield.class == y.bitfield.class);
75e5731b
JB
2016 gas_assert (x.bitfield.instance == InstanceNone ||
2017 y.bitfield.instance == InstanceNone ||
2018 x.bitfield.instance == y.bitfield.instance);
bab6aec1 2019
c6fb90c8 2020 switch (ARRAY_SIZE (x.array))
40fb9820 2021 {
c6fb90c8
L
2022 case 3:
2023 x.array [2] |= y.array [2];
1a0670f3 2024 /* Fall through. */
c6fb90c8
L
2025 case 2:
2026 x.array [1] |= y.array [1];
1a0670f3 2027 /* Fall through. */
c6fb90c8
L
2028 case 1:
2029 x.array [0] |= y.array [0];
40fb9820
L
2030 break;
2031 default:
2032 abort ();
2033 }
c6fb90c8
L
2034 return x;
2035}
40fb9820 2036
c6fb90c8
L
2037static INLINE i386_operand_type
2038operand_type_xor (i386_operand_type x, i386_operand_type y)
2039{
bab6aec1 2040 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2041 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2042
c6fb90c8
L
2043 switch (ARRAY_SIZE (x.array))
2044 {
2045 case 3:
2046 x.array [2] ^= y.array [2];
1a0670f3 2047 /* Fall through. */
c6fb90c8
L
2048 case 2:
2049 x.array [1] ^= y.array [1];
1a0670f3 2050 /* Fall through. */
c6fb90c8
L
2051 case 1:
2052 x.array [0] ^= y.array [0];
2053 break;
2054 default:
2055 abort ();
2056 }
40fb9820
L
2057 return x;
2058}
2059
40fb9820
L
2060static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
2061static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
2062static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
2063static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
bab6aec1
JB
2064static const i386_operand_type anydisp = OPERAND_TYPE_ANYDISP;
2065static const i386_operand_type anyimm = OPERAND_TYPE_ANYIMM;
40fb9820 2066static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
43234a1e 2067static const i386_operand_type regmask = OPERAND_TYPE_REGMASK;
40fb9820
L
2068static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
2069static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
2070static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
2071static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
2072static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
2073static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
2074static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
2075static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
2076static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
2077
2078enum operand_type
2079{
2080 reg,
40fb9820
L
2081 imm,
2082 disp,
2083 anymem
2084};
2085
c6fb90c8 2086static INLINE int
40fb9820
L
2087operand_type_check (i386_operand_type t, enum operand_type c)
2088{
2089 switch (c)
2090 {
2091 case reg:
bab6aec1 2092 return t.bitfield.class == Reg;
40fb9820 2093
40fb9820
L
2094 case imm:
2095 return (t.bitfield.imm8
2096 || t.bitfield.imm8s
2097 || t.bitfield.imm16
2098 || t.bitfield.imm32
2099 || t.bitfield.imm32s
2100 || t.bitfield.imm64);
2101
2102 case disp:
2103 return (t.bitfield.disp8
2104 || t.bitfield.disp16
2105 || t.bitfield.disp32
2106 || t.bitfield.disp32s
2107 || t.bitfield.disp64);
2108
2109 case anymem:
2110 return (t.bitfield.disp8
2111 || t.bitfield.disp16
2112 || t.bitfield.disp32
2113 || t.bitfield.disp32s
2114 || t.bitfield.disp64
2115 || t.bitfield.baseindex);
2116
2117 default:
2118 abort ();
2119 }
2cfe26b6
AM
2120
2121 return 0;
40fb9820
L
2122}
2123
7a54636a
L
2124/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
2125 between operand GIVEN and opeand WANTED for instruction template T. */
5c07affc
L
2126
2127static INLINE int
7a54636a
L
2128match_operand_size (const insn_template *t, unsigned int wanted,
2129 unsigned int given)
5c07affc 2130{
3ac21baa
JB
2131 return !((i.types[given].bitfield.byte
2132 && !t->operand_types[wanted].bitfield.byte)
2133 || (i.types[given].bitfield.word
2134 && !t->operand_types[wanted].bitfield.word)
2135 || (i.types[given].bitfield.dword
2136 && !t->operand_types[wanted].bitfield.dword)
2137 || (i.types[given].bitfield.qword
2138 && !t->operand_types[wanted].bitfield.qword)
2139 || (i.types[given].bitfield.tbyte
2140 && !t->operand_types[wanted].bitfield.tbyte));
5c07affc
L
2141}
2142
dd40ce22
L
2143/* Return 1 if there is no conflict in SIMD register between operand
2144 GIVEN and opeand WANTED for instruction template T. */
1b54b8d7
JB
2145
2146static INLINE int
dd40ce22
L
2147match_simd_size (const insn_template *t, unsigned int wanted,
2148 unsigned int given)
1b54b8d7 2149{
3ac21baa
JB
2150 return !((i.types[given].bitfield.xmmword
2151 && !t->operand_types[wanted].bitfield.xmmword)
2152 || (i.types[given].bitfield.ymmword
2153 && !t->operand_types[wanted].bitfield.ymmword)
2154 || (i.types[given].bitfield.zmmword
2155 && !t->operand_types[wanted].bitfield.zmmword));
1b54b8d7
JB
2156}
2157
7a54636a
L
2158/* Return 1 if there is no conflict in any size between operand GIVEN
2159 and opeand WANTED for instruction template T. */
5c07affc
L
2160
2161static INLINE int
dd40ce22
L
2162match_mem_size (const insn_template *t, unsigned int wanted,
2163 unsigned int given)
5c07affc 2164{
7a54636a 2165 return (match_operand_size (t, wanted, given)
3ac21baa 2166 && !((i.types[given].bitfield.unspecified
af508cb9 2167 && !i.broadcast
3ac21baa
JB
2168 && !t->operand_types[wanted].bitfield.unspecified)
2169 || (i.types[given].bitfield.fword
2170 && !t->operand_types[wanted].bitfield.fword)
1b54b8d7
JB
2171 /* For scalar opcode templates to allow register and memory
2172 operands at the same time, some special casing is needed
d6793fa1
JB
2173 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2174 down-conversion vpmov*. */
3528c362 2175 || ((t->operand_types[wanted].bitfield.class == RegSIMD
bc49bfd8
JB
2176 && t->operand_types[wanted].bitfield.byte
2177 + t->operand_types[wanted].bitfield.word
2178 + t->operand_types[wanted].bitfield.dword
2179 + t->operand_types[wanted].bitfield.qword
2180 > !!t->opcode_modifier.broadcast)
3ac21baa
JB
2181 ? (i.types[given].bitfield.xmmword
2182 || i.types[given].bitfield.ymmword
2183 || i.types[given].bitfield.zmmword)
2184 : !match_simd_size(t, wanted, given))));
5c07affc
L
2185}
2186
3ac21baa
JB
2187/* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2188 operands for instruction template T, and it has MATCH_REVERSE set if there
2189 is no size conflict on any operands for the template with operands reversed
2190 (and the template allows for reversing in the first place). */
5c07affc 2191
3ac21baa
JB
2192#define MATCH_STRAIGHT 1
2193#define MATCH_REVERSE 2
2194
2195static INLINE unsigned int
d3ce72d0 2196operand_size_match (const insn_template *t)
5c07affc 2197{
3ac21baa 2198 unsigned int j, match = MATCH_STRAIGHT;
5c07affc 2199
0cfa3eb3 2200 /* Don't check non-absolute jump instructions. */
5c07affc 2201 if (t->opcode_modifier.jump
0cfa3eb3 2202 && t->opcode_modifier.jump != JUMP_ABSOLUTE)
5c07affc
L
2203 return match;
2204
2205 /* Check memory and accumulator operand size. */
2206 for (j = 0; j < i.operands; j++)
2207 {
3528c362
JB
2208 if (i.types[j].bitfield.class != Reg
2209 && i.types[j].bitfield.class != RegSIMD
601e8564 2210 && t->opcode_modifier.anysize)
5c07affc
L
2211 continue;
2212
bab6aec1 2213 if (t->operand_types[j].bitfield.class == Reg
7a54636a 2214 && !match_operand_size (t, j, j))
5c07affc
L
2215 {
2216 match = 0;
2217 break;
2218 }
2219
3528c362 2220 if (t->operand_types[j].bitfield.class == RegSIMD
3ac21baa 2221 && !match_simd_size (t, j, j))
1b54b8d7
JB
2222 {
2223 match = 0;
2224 break;
2225 }
2226
75e5731b 2227 if (t->operand_types[j].bitfield.instance == Accum
7a54636a 2228 && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
1b54b8d7
JB
2229 {
2230 match = 0;
2231 break;
2232 }
2233
c48dadc9 2234 if ((i.flags[j] & Operand_Mem) && !match_mem_size (t, j, j))
5c07affc
L
2235 {
2236 match = 0;
2237 break;
2238 }
2239 }
2240
3ac21baa 2241 if (!t->opcode_modifier.d)
891edac4 2242 {
dc1e8a47 2243 mismatch:
3ac21baa
JB
2244 if (!match)
2245 i.error = operand_size_mismatch;
2246 return match;
891edac4 2247 }
5c07affc
L
2248
2249 /* Check reverse. */
f5eb1d70 2250 gas_assert (i.operands >= 2 && i.operands <= 3);
5c07affc 2251
f5eb1d70 2252 for (j = 0; j < i.operands; j++)
5c07affc 2253 {
f5eb1d70
JB
2254 unsigned int given = i.operands - j - 1;
2255
bab6aec1 2256 if (t->operand_types[j].bitfield.class == Reg
f5eb1d70 2257 && !match_operand_size (t, j, given))
891edac4 2258 goto mismatch;
5c07affc 2259
3528c362 2260 if (t->operand_types[j].bitfield.class == RegSIMD
f5eb1d70 2261 && !match_simd_size (t, j, given))
dbbc8b7e
JB
2262 goto mismatch;
2263
75e5731b 2264 if (t->operand_types[j].bitfield.instance == Accum
f5eb1d70
JB
2265 && (!match_operand_size (t, j, given)
2266 || !match_simd_size (t, j, given)))
dbbc8b7e
JB
2267 goto mismatch;
2268
f5eb1d70 2269 if ((i.flags[given] & Operand_Mem) && !match_mem_size (t, j, given))
891edac4 2270 goto mismatch;
5c07affc
L
2271 }
2272
3ac21baa 2273 return match | MATCH_REVERSE;
5c07affc
L
2274}
2275
c6fb90c8 2276static INLINE int
40fb9820
L
2277operand_type_match (i386_operand_type overlap,
2278 i386_operand_type given)
2279{
2280 i386_operand_type temp = overlap;
2281
7d5e4556 2282 temp.bitfield.unspecified = 0;
5c07affc
L
2283 temp.bitfield.byte = 0;
2284 temp.bitfield.word = 0;
2285 temp.bitfield.dword = 0;
2286 temp.bitfield.fword = 0;
2287 temp.bitfield.qword = 0;
2288 temp.bitfield.tbyte = 0;
2289 temp.bitfield.xmmword = 0;
c0f3af97 2290 temp.bitfield.ymmword = 0;
43234a1e 2291 temp.bitfield.zmmword = 0;
0dfbf9d7 2292 if (operand_type_all_zero (&temp))
891edac4 2293 goto mismatch;
40fb9820 2294
6f2f06be 2295 if (given.bitfield.baseindex == overlap.bitfield.baseindex)
891edac4
L
2296 return 1;
2297
dc1e8a47 2298 mismatch:
a65babc9 2299 i.error = operand_type_mismatch;
891edac4 2300 return 0;
40fb9820
L
2301}
2302
7d5e4556 2303/* If given types g0 and g1 are registers they must be of the same type
10c17abd 2304 unless the expected operand type register overlap is null.
5de4d9ef 2305 Some Intel syntax memory operand size checking also happens here. */
40fb9820 2306
c6fb90c8 2307static INLINE int
dc821c5f 2308operand_type_register_match (i386_operand_type g0,
40fb9820 2309 i386_operand_type t0,
40fb9820
L
2310 i386_operand_type g1,
2311 i386_operand_type t1)
2312{
bab6aec1 2313 if (g0.bitfield.class != Reg
3528c362 2314 && g0.bitfield.class != RegSIMD
10c17abd
JB
2315 && (!operand_type_check (g0, anymem)
2316 || g0.bitfield.unspecified
5de4d9ef
JB
2317 || (t0.bitfield.class != Reg
2318 && t0.bitfield.class != RegSIMD)))
40fb9820
L
2319 return 1;
2320
bab6aec1 2321 if (g1.bitfield.class != Reg
3528c362 2322 && g1.bitfield.class != RegSIMD
10c17abd
JB
2323 && (!operand_type_check (g1, anymem)
2324 || g1.bitfield.unspecified
5de4d9ef
JB
2325 || (t1.bitfield.class != Reg
2326 && t1.bitfield.class != RegSIMD)))
40fb9820
L
2327 return 1;
2328
dc821c5f
JB
2329 if (g0.bitfield.byte == g1.bitfield.byte
2330 && g0.bitfield.word == g1.bitfield.word
2331 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2332 && g0.bitfield.qword == g1.bitfield.qword
2333 && g0.bitfield.xmmword == g1.bitfield.xmmword
2334 && g0.bitfield.ymmword == g1.bitfield.ymmword
2335 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2336 return 1;
2337
dc821c5f
JB
2338 if (!(t0.bitfield.byte & t1.bitfield.byte)
2339 && !(t0.bitfield.word & t1.bitfield.word)
2340 && !(t0.bitfield.dword & t1.bitfield.dword)
10c17abd
JB
2341 && !(t0.bitfield.qword & t1.bitfield.qword)
2342 && !(t0.bitfield.xmmword & t1.bitfield.xmmword)
2343 && !(t0.bitfield.ymmword & t1.bitfield.ymmword)
2344 && !(t0.bitfield.zmmword & t1.bitfield.zmmword))
891edac4
L
2345 return 1;
2346
a65babc9 2347 i.error = register_type_mismatch;
891edac4
L
2348
2349 return 0;
40fb9820
L
2350}
2351
4c692bc7
JB
2352static INLINE unsigned int
2353register_number (const reg_entry *r)
2354{
2355 unsigned int nr = r->reg_num;
2356
2357 if (r->reg_flags & RegRex)
2358 nr += 8;
2359
200cbe0f
L
2360 if (r->reg_flags & RegVRex)
2361 nr += 16;
2362
4c692bc7
JB
2363 return nr;
2364}
2365
252b5132 2366static INLINE unsigned int
40fb9820 2367mode_from_disp_size (i386_operand_type t)
252b5132 2368{
b5014f7a 2369 if (t.bitfield.disp8)
40fb9820
L
2370 return 1;
2371 else if (t.bitfield.disp16
2372 || t.bitfield.disp32
2373 || t.bitfield.disp32s)
2374 return 2;
2375 else
2376 return 0;
252b5132
RH
2377}
2378
2379static INLINE int
65879393 2380fits_in_signed_byte (addressT num)
252b5132 2381{
65879393 2382 return num + 0x80 <= 0xff;
47926f60 2383}
252b5132
RH
2384
2385static INLINE int
65879393 2386fits_in_unsigned_byte (addressT num)
252b5132 2387{
65879393 2388 return num <= 0xff;
47926f60 2389}
252b5132
RH
2390
2391static INLINE int
65879393 2392fits_in_unsigned_word (addressT num)
252b5132 2393{
65879393 2394 return num <= 0xffff;
47926f60 2395}
252b5132
RH
2396
2397static INLINE int
65879393 2398fits_in_signed_word (addressT num)
252b5132 2399{
65879393 2400 return num + 0x8000 <= 0xffff;
47926f60 2401}
2a962e6d 2402
3e73aa7c 2403static INLINE int
65879393 2404fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2405{
2406#ifndef BFD64
2407 return 1;
2408#else
65879393 2409 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2410#endif
2411} /* fits_in_signed_long() */
2a962e6d 2412
3e73aa7c 2413static INLINE int
65879393 2414fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2415{
2416#ifndef BFD64
2417 return 1;
2418#else
65879393 2419 return num <= 0xffffffff;
3e73aa7c
JH
2420#endif
2421} /* fits_in_unsigned_long() */
252b5132 2422
43234a1e 2423static INLINE int
b5014f7a 2424fits_in_disp8 (offsetT num)
43234a1e
L
2425{
2426 int shift = i.memshift;
2427 unsigned int mask;
2428
2429 if (shift == -1)
2430 abort ();
2431
2432 mask = (1 << shift) - 1;
2433
2434 /* Return 0 if NUM isn't properly aligned. */
2435 if ((num & mask))
2436 return 0;
2437
2438 /* Check if NUM will fit in 8bit after shift. */
2439 return fits_in_signed_byte (num >> shift);
2440}
2441
a683cc34
SP
2442static INLINE int
2443fits_in_imm4 (offsetT num)
2444{
2445 return (num & 0xf) == num;
2446}
2447
40fb9820 2448static i386_operand_type
e3bb37b5 2449smallest_imm_type (offsetT num)
252b5132 2450{
40fb9820 2451 i386_operand_type t;
7ab9ffdd 2452
0dfbf9d7 2453 operand_type_set (&t, 0);
40fb9820
L
2454 t.bitfield.imm64 = 1;
2455
2456 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2457 {
2458 /* This code is disabled on the 486 because all the Imm1 forms
2459 in the opcode table are slower on the i486. They're the
2460 versions with the implicitly specified single-position
2461 displacement, which has another syntax if you really want to
2462 use that form. */
40fb9820
L
2463 t.bitfield.imm1 = 1;
2464 t.bitfield.imm8 = 1;
2465 t.bitfield.imm8s = 1;
2466 t.bitfield.imm16 = 1;
2467 t.bitfield.imm32 = 1;
2468 t.bitfield.imm32s = 1;
2469 }
2470 else if (fits_in_signed_byte (num))
2471 {
2472 t.bitfield.imm8 = 1;
2473 t.bitfield.imm8s = 1;
2474 t.bitfield.imm16 = 1;
2475 t.bitfield.imm32 = 1;
2476 t.bitfield.imm32s = 1;
2477 }
2478 else if (fits_in_unsigned_byte (num))
2479 {
2480 t.bitfield.imm8 = 1;
2481 t.bitfield.imm16 = 1;
2482 t.bitfield.imm32 = 1;
2483 t.bitfield.imm32s = 1;
2484 }
2485 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2486 {
2487 t.bitfield.imm16 = 1;
2488 t.bitfield.imm32 = 1;
2489 t.bitfield.imm32s = 1;
2490 }
2491 else if (fits_in_signed_long (num))
2492 {
2493 t.bitfield.imm32 = 1;
2494 t.bitfield.imm32s = 1;
2495 }
2496 else if (fits_in_unsigned_long (num))
2497 t.bitfield.imm32 = 1;
2498
2499 return t;
47926f60 2500}
252b5132 2501
847f7ad4 2502static offsetT
e3bb37b5 2503offset_in_range (offsetT val, int size)
847f7ad4 2504{
508866be 2505 addressT mask;
ba2adb93 2506
847f7ad4
AM
2507 switch (size)
2508 {
508866be
L
2509 case 1: mask = ((addressT) 1 << 8) - 1; break;
2510 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 2511 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
2512#ifdef BFD64
2513 case 8: mask = ((addressT) 2 << 63) - 1; break;
2514#endif
47926f60 2515 default: abort ();
847f7ad4
AM
2516 }
2517
9de868bf
L
2518#ifdef BFD64
2519 /* If BFD64, sign extend val for 32bit address mode. */
2520 if (flag_code != CODE_64BIT
2521 || i.prefix[ADDR_PREFIX])
3e73aa7c
JH
2522 if ((val & ~(((addressT) 2 << 31) - 1)) == 0)
2523 val = (val ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
fa289fb8 2524#endif
ba2adb93 2525
47926f60 2526 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
2527 {
2528 char buf1[40], buf2[40];
2529
2530 sprint_value (buf1, val);
2531 sprint_value (buf2, val & mask);
2532 as_warn (_("%s shortened to %s"), buf1, buf2);
2533 }
2534 return val & mask;
2535}
2536
c32fa91d
L
2537enum PREFIX_GROUP
2538{
2539 PREFIX_EXIST = 0,
2540 PREFIX_LOCK,
2541 PREFIX_REP,
04ef582a 2542 PREFIX_DS,
c32fa91d
L
2543 PREFIX_OTHER
2544};
2545
2546/* Returns
2547 a. PREFIX_EXIST if attempting to add a prefix where one from the
2548 same class already exists.
2549 b. PREFIX_LOCK if lock prefix is added.
2550 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2551 d. PREFIX_DS if ds prefix is added.
2552 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2553 */
2554
2555static enum PREFIX_GROUP
e3bb37b5 2556add_prefix (unsigned int prefix)
252b5132 2557{
c32fa91d 2558 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2559 unsigned int q;
252b5132 2560
29b0f896
AM
2561 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2562 && flag_code == CODE_64BIT)
b1905489 2563 {
161a04f6 2564 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2565 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2566 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2567 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2568 ret = PREFIX_EXIST;
b1905489
JB
2569 q = REX_PREFIX;
2570 }
3e73aa7c 2571 else
b1905489
JB
2572 {
2573 switch (prefix)
2574 {
2575 default:
2576 abort ();
2577
b1905489 2578 case DS_PREFIX_OPCODE:
04ef582a
L
2579 ret = PREFIX_DS;
2580 /* Fall through. */
2581 case CS_PREFIX_OPCODE:
b1905489
JB
2582 case ES_PREFIX_OPCODE:
2583 case FS_PREFIX_OPCODE:
2584 case GS_PREFIX_OPCODE:
2585 case SS_PREFIX_OPCODE:
2586 q = SEG_PREFIX;
2587 break;
2588
2589 case REPNE_PREFIX_OPCODE:
2590 case REPE_PREFIX_OPCODE:
c32fa91d
L
2591 q = REP_PREFIX;
2592 ret = PREFIX_REP;
2593 break;
2594
b1905489 2595 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2596 q = LOCK_PREFIX;
2597 ret = PREFIX_LOCK;
b1905489
JB
2598 break;
2599
2600 case FWAIT_OPCODE:
2601 q = WAIT_PREFIX;
2602 break;
2603
2604 case ADDR_PREFIX_OPCODE:
2605 q = ADDR_PREFIX;
2606 break;
2607
2608 case DATA_PREFIX_OPCODE:
2609 q = DATA_PREFIX;
2610 break;
2611 }
2612 if (i.prefix[q] != 0)
c32fa91d 2613 ret = PREFIX_EXIST;
b1905489 2614 }
252b5132 2615
b1905489 2616 if (ret)
252b5132 2617 {
b1905489
JB
2618 if (!i.prefix[q])
2619 ++i.prefixes;
2620 i.prefix[q] |= prefix;
252b5132 2621 }
b1905489
JB
2622 else
2623 as_bad (_("same type of prefix used twice"));
252b5132 2624
252b5132
RH
2625 return ret;
2626}
2627
2628static void
78f12dd3 2629update_code_flag (int value, int check)
eecb386c 2630{
78f12dd3
L
2631 PRINTF_LIKE ((*as_error));
2632
1e9cc1c2 2633 flag_code = (enum flag_code) value;
40fb9820
L
2634 if (flag_code == CODE_64BIT)
2635 {
2636 cpu_arch_flags.bitfield.cpu64 = 1;
2637 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
2638 }
2639 else
2640 {
2641 cpu_arch_flags.bitfield.cpu64 = 0;
2642 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
2643 }
2644 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c 2645 {
78f12dd3
L
2646 if (check)
2647 as_error = as_fatal;
2648 else
2649 as_error = as_bad;
2650 (*as_error) (_("64bit mode not supported on `%s'."),
2651 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2652 }
40fb9820 2653 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c 2654 {
78f12dd3
L
2655 if (check)
2656 as_error = as_fatal;
2657 else
2658 as_error = as_bad;
2659 (*as_error) (_("32bit mode not supported on `%s'."),
2660 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2661 }
eecb386c
AM
2662 stackop_size = '\0';
2663}
2664
78f12dd3
L
2665static void
2666set_code_flag (int value)
2667{
2668 update_code_flag (value, 0);
2669}
2670
eecb386c 2671static void
e3bb37b5 2672set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2673{
1e9cc1c2 2674 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2675 if (flag_code != CODE_16BIT)
2676 abort ();
2677 cpu_arch_flags.bitfield.cpu64 = 0;
2678 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 2679 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2680}
2681
2682static void
e3bb37b5 2683set_intel_syntax (int syntax_flag)
252b5132
RH
2684{
2685 /* Find out if register prefixing is specified. */
2686 int ask_naked_reg = 0;
2687
2688 SKIP_WHITESPACE ();
29b0f896 2689 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2690 {
d02603dc
NC
2691 char *string;
2692 int e = get_symbol_name (&string);
252b5132 2693
47926f60 2694 if (strcmp (string, "prefix") == 0)
252b5132 2695 ask_naked_reg = 1;
47926f60 2696 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2697 ask_naked_reg = -1;
2698 else
d0b47220 2699 as_bad (_("bad argument to syntax directive."));
d02603dc 2700 (void) restore_line_pointer (e);
252b5132
RH
2701 }
2702 demand_empty_rest_of_line ();
c3332e24 2703
252b5132
RH
2704 intel_syntax = syntax_flag;
2705
2706 if (ask_naked_reg == 0)
f86103b7
AM
2707 allow_naked_reg = (intel_syntax
2708 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2709 else
2710 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2711
ee86248c 2712 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
7ab9ffdd 2713
e4a3b5a4 2714 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 2715 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 2716 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
2717}
2718
1efbbeb4
L
2719static void
2720set_intel_mnemonic (int mnemonic_flag)
2721{
e1d4d893 2722 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2723}
2724
db51cc60
L
2725static void
2726set_allow_index_reg (int flag)
2727{
2728 allow_index_reg = flag;
2729}
2730
cb19c032 2731static void
7bab8ab5 2732set_check (int what)
cb19c032 2733{
7bab8ab5
JB
2734 enum check_kind *kind;
2735 const char *str;
2736
2737 if (what)
2738 {
2739 kind = &operand_check;
2740 str = "operand";
2741 }
2742 else
2743 {
2744 kind = &sse_check;
2745 str = "sse";
2746 }
2747
cb19c032
L
2748 SKIP_WHITESPACE ();
2749
2750 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2751 {
d02603dc
NC
2752 char *string;
2753 int e = get_symbol_name (&string);
cb19c032
L
2754
2755 if (strcmp (string, "none") == 0)
7bab8ab5 2756 *kind = check_none;
cb19c032 2757 else if (strcmp (string, "warning") == 0)
7bab8ab5 2758 *kind = check_warning;
cb19c032 2759 else if (strcmp (string, "error") == 0)
7bab8ab5 2760 *kind = check_error;
cb19c032 2761 else
7bab8ab5 2762 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2763 (void) restore_line_pointer (e);
cb19c032
L
2764 }
2765 else
7bab8ab5 2766 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2767
2768 demand_empty_rest_of_line ();
2769}
2770
8a9036a4
L
2771static void
2772check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2773 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2774{
2775#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2776 static const char *arch;
2777
2778 /* Intel LIOM is only supported on ELF. */
2779 if (!IS_ELF)
2780 return;
2781
2782 if (!arch)
2783 {
2784 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2785 use default_arch. */
2786 arch = cpu_arch_name;
2787 if (!arch)
2788 arch = default_arch;
2789 }
2790
81486035
L
2791 /* If we are targeting Intel MCU, we must enable it. */
2792 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_IAMCU
2793 || new_flag.bitfield.cpuiamcu)
2794 return;
2795
3632d14b 2796 /* If we are targeting Intel L1OM, we must enable it. */
8a9036a4 2797 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_L1OM
1e9cc1c2 2798 || new_flag.bitfield.cpul1om)
8a9036a4 2799 return;
76ba9986 2800
7a9068fe
L
2801 /* If we are targeting Intel K1OM, we must enable it. */
2802 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_K1OM
2803 || new_flag.bitfield.cpuk1om)
2804 return;
2805
8a9036a4
L
2806 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2807#endif
2808}
2809
e413e4e9 2810static void
e3bb37b5 2811set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2812{
47926f60 2813 SKIP_WHITESPACE ();
e413e4e9 2814
29b0f896 2815 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9 2816 {
d02603dc
NC
2817 char *string;
2818 int e = get_symbol_name (&string);
91d6fa6a 2819 unsigned int j;
40fb9820 2820 i386_cpu_flags flags;
e413e4e9 2821
91d6fa6a 2822 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
e413e4e9 2823 {
91d6fa6a 2824 if (strcmp (string, cpu_arch[j].name) == 0)
e413e4e9 2825 {
91d6fa6a 2826 check_cpu_arch_compatible (string, cpu_arch[j].flags);
8a9036a4 2827
5c6af06e
JB
2828 if (*string != '.')
2829 {
91d6fa6a 2830 cpu_arch_name = cpu_arch[j].name;
5c6af06e 2831 cpu_sub_arch_name = NULL;
91d6fa6a 2832 cpu_arch_flags = cpu_arch[j].flags;
40fb9820
L
2833 if (flag_code == CODE_64BIT)
2834 {
2835 cpu_arch_flags.bitfield.cpu64 = 1;
2836 cpu_arch_flags.bitfield.cpuno64 = 0;
2837 }
2838 else
2839 {
2840 cpu_arch_flags.bitfield.cpu64 = 0;
2841 cpu_arch_flags.bitfield.cpuno64 = 1;
2842 }
91d6fa6a
NC
2843 cpu_arch_isa = cpu_arch[j].type;
2844 cpu_arch_isa_flags = cpu_arch[j].flags;
ccc9c027
L
2845 if (!cpu_arch_tune_set)
2846 {
2847 cpu_arch_tune = cpu_arch_isa;
2848 cpu_arch_tune_flags = cpu_arch_isa_flags;
2849 }
5c6af06e
JB
2850 break;
2851 }
40fb9820 2852
293f5f65
L
2853 flags = cpu_flags_or (cpu_arch_flags,
2854 cpu_arch[j].flags);
81486035 2855
5b64d091 2856 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
5c6af06e 2857 {
6305a203
L
2858 if (cpu_sub_arch_name)
2859 {
2860 char *name = cpu_sub_arch_name;
2861 cpu_sub_arch_name = concat (name,
91d6fa6a 2862 cpu_arch[j].name,
1bf57e9f 2863 (const char *) NULL);
6305a203
L
2864 free (name);
2865 }
2866 else
91d6fa6a 2867 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
40fb9820 2868 cpu_arch_flags = flags;
a586129e 2869 cpu_arch_isa_flags = flags;
5c6af06e 2870 }
0089dace
L
2871 else
2872 cpu_arch_isa_flags
2873 = cpu_flags_or (cpu_arch_isa_flags,
2874 cpu_arch[j].flags);
d02603dc 2875 (void) restore_line_pointer (e);
5c6af06e
JB
2876 demand_empty_rest_of_line ();
2877 return;
e413e4e9
AM
2878 }
2879 }
293f5f65
L
2880
2881 if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
2882 {
33eaf5de 2883 /* Disable an ISA extension. */
293f5f65
L
2884 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
2885 if (strcmp (string + 1, cpu_noarch [j].name) == 0)
2886 {
2887 flags = cpu_flags_and_not (cpu_arch_flags,
2888 cpu_noarch[j].flags);
2889 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2890 {
2891 if (cpu_sub_arch_name)
2892 {
2893 char *name = cpu_sub_arch_name;
2894 cpu_sub_arch_name = concat (name, string,
2895 (const char *) NULL);
2896 free (name);
2897 }
2898 else
2899 cpu_sub_arch_name = xstrdup (string);
2900 cpu_arch_flags = flags;
2901 cpu_arch_isa_flags = flags;
2902 }
2903 (void) restore_line_pointer (e);
2904 demand_empty_rest_of_line ();
2905 return;
2906 }
2907
2908 j = ARRAY_SIZE (cpu_arch);
2909 }
2910
91d6fa6a 2911 if (j >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
2912 as_bad (_("no such architecture: `%s'"), string);
2913
2914 *input_line_pointer = e;
2915 }
2916 else
2917 as_bad (_("missing cpu architecture"));
2918
fddf5b5b
AM
2919 no_cond_jump_promotion = 0;
2920 if (*input_line_pointer == ','
29b0f896 2921 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 2922 {
d02603dc
NC
2923 char *string;
2924 char e;
2925
2926 ++input_line_pointer;
2927 e = get_symbol_name (&string);
fddf5b5b
AM
2928
2929 if (strcmp (string, "nojumps") == 0)
2930 no_cond_jump_promotion = 1;
2931 else if (strcmp (string, "jumps") == 0)
2932 ;
2933 else
2934 as_bad (_("no such architecture modifier: `%s'"), string);
2935
d02603dc 2936 (void) restore_line_pointer (e);
fddf5b5b
AM
2937 }
2938
e413e4e9
AM
2939 demand_empty_rest_of_line ();
2940}
2941
8a9036a4
L
2942enum bfd_architecture
2943i386_arch (void)
2944{
3632d14b 2945 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4
L
2946 {
2947 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2948 || flag_code != CODE_64BIT)
2949 as_fatal (_("Intel L1OM is 64bit ELF only"));
2950 return bfd_arch_l1om;
2951 }
7a9068fe
L
2952 else if (cpu_arch_isa == PROCESSOR_K1OM)
2953 {
2954 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2955 || flag_code != CODE_64BIT)
2956 as_fatal (_("Intel K1OM is 64bit ELF only"));
2957 return bfd_arch_k1om;
2958 }
81486035
L
2959 else if (cpu_arch_isa == PROCESSOR_IAMCU)
2960 {
2961 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2962 || flag_code == CODE_64BIT)
2963 as_fatal (_("Intel MCU is 32bit ELF only"));
2964 return bfd_arch_iamcu;
2965 }
8a9036a4
L
2966 else
2967 return bfd_arch_i386;
2968}
2969
b9d79e03 2970unsigned long
7016a5d5 2971i386_mach (void)
b9d79e03 2972{
351f65ca 2973 if (!strncmp (default_arch, "x86_64", 6))
8a9036a4 2974 {
3632d14b 2975 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 2976 {
351f65ca
L
2977 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2978 || default_arch[6] != '\0')
8a9036a4
L
2979 as_fatal (_("Intel L1OM is 64bit ELF only"));
2980 return bfd_mach_l1om;
2981 }
7a9068fe
L
2982 else if (cpu_arch_isa == PROCESSOR_K1OM)
2983 {
2984 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2985 || default_arch[6] != '\0')
2986 as_fatal (_("Intel K1OM is 64bit ELF only"));
2987 return bfd_mach_k1om;
2988 }
351f65ca 2989 else if (default_arch[6] == '\0')
8a9036a4 2990 return bfd_mach_x86_64;
351f65ca
L
2991 else
2992 return bfd_mach_x64_32;
8a9036a4 2993 }
5197d474
L
2994 else if (!strcmp (default_arch, "i386")
2995 || !strcmp (default_arch, "iamcu"))
81486035
L
2996 {
2997 if (cpu_arch_isa == PROCESSOR_IAMCU)
2998 {
2999 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
3000 as_fatal (_("Intel MCU is 32bit ELF only"));
3001 return bfd_mach_i386_iamcu;
3002 }
3003 else
3004 return bfd_mach_i386_i386;
3005 }
b9d79e03 3006 else
2b5d6a91 3007 as_fatal (_("unknown architecture"));
b9d79e03 3008}
b9d79e03 3009\f
252b5132 3010void
7016a5d5 3011md_begin (void)
252b5132
RH
3012{
3013 const char *hash_err;
3014
86fa6981
L
3015 /* Support pseudo prefixes like {disp32}. */
3016 lex_type ['{'] = LEX_BEGIN_NAME;
3017
47926f60 3018 /* Initialize op_hash hash table. */
252b5132
RH
3019 op_hash = hash_new ();
3020
3021 {
d3ce72d0 3022 const insn_template *optab;
29b0f896 3023 templates *core_optab;
252b5132 3024
47926f60
KH
3025 /* Setup for loop. */
3026 optab = i386_optab;
add39d23 3027 core_optab = XNEW (templates);
252b5132
RH
3028 core_optab->start = optab;
3029
3030 while (1)
3031 {
3032 ++optab;
3033 if (optab->name == NULL
3034 || strcmp (optab->name, (optab - 1)->name) != 0)
3035 {
3036 /* different name --> ship out current template list;
47926f60 3037 add to hash table; & begin anew. */
252b5132
RH
3038 core_optab->end = optab;
3039 hash_err = hash_insert (op_hash,
3040 (optab - 1)->name,
5a49b8ac 3041 (void *) core_optab);
252b5132
RH
3042 if (hash_err)
3043 {
b37df7c4 3044 as_fatal (_("can't hash %s: %s"),
252b5132
RH
3045 (optab - 1)->name,
3046 hash_err);
3047 }
3048 if (optab->name == NULL)
3049 break;
add39d23 3050 core_optab = XNEW (templates);
252b5132
RH
3051 core_optab->start = optab;
3052 }
3053 }
3054 }
3055
47926f60 3056 /* Initialize reg_hash hash table. */
252b5132
RH
3057 reg_hash = hash_new ();
3058 {
29b0f896 3059 const reg_entry *regtab;
c3fe08fa 3060 unsigned int regtab_size = i386_regtab_size;
252b5132 3061
c3fe08fa 3062 for (regtab = i386_regtab; regtab_size--; regtab++)
252b5132 3063 {
5a49b8ac 3064 hash_err = hash_insert (reg_hash, regtab->reg_name, (void *) regtab);
252b5132 3065 if (hash_err)
b37df7c4 3066 as_fatal (_("can't hash %s: %s"),
3e73aa7c
JH
3067 regtab->reg_name,
3068 hash_err);
252b5132
RH
3069 }
3070 }
3071
47926f60 3072 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 3073 {
29b0f896
AM
3074 int c;
3075 char *p;
252b5132
RH
3076
3077 for (c = 0; c < 256; c++)
3078 {
3882b010 3079 if (ISDIGIT (c))
252b5132
RH
3080 {
3081 digit_chars[c] = c;
3082 mnemonic_chars[c] = c;
3083 register_chars[c] = c;
3084 operand_chars[c] = c;
3085 }
3882b010 3086 else if (ISLOWER (c))
252b5132
RH
3087 {
3088 mnemonic_chars[c] = c;
3089 register_chars[c] = c;
3090 operand_chars[c] = c;
3091 }
3882b010 3092 else if (ISUPPER (c))
252b5132 3093 {
3882b010 3094 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
3095 register_chars[c] = mnemonic_chars[c];
3096 operand_chars[c] = c;
3097 }
43234a1e 3098 else if (c == '{' || c == '}')
86fa6981
L
3099 {
3100 mnemonic_chars[c] = c;
3101 operand_chars[c] = c;
3102 }
252b5132 3103
3882b010 3104 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
3105 identifier_chars[c] = c;
3106 else if (c >= 128)
3107 {
3108 identifier_chars[c] = c;
3109 operand_chars[c] = c;
3110 }
3111 }
3112
3113#ifdef LEX_AT
3114 identifier_chars['@'] = '@';
32137342
NC
3115#endif
3116#ifdef LEX_QM
3117 identifier_chars['?'] = '?';
3118 operand_chars['?'] = '?';
252b5132 3119#endif
252b5132 3120 digit_chars['-'] = '-';
c0f3af97 3121 mnemonic_chars['_'] = '_';
791fe849 3122 mnemonic_chars['-'] = '-';
0003779b 3123 mnemonic_chars['.'] = '.';
252b5132
RH
3124 identifier_chars['_'] = '_';
3125 identifier_chars['.'] = '.';
3126
3127 for (p = operand_special_chars; *p != '\0'; p++)
3128 operand_chars[(unsigned char) *p] = *p;
3129 }
3130
a4447b93
RH
3131 if (flag_code == CODE_64BIT)
3132 {
ca19b261
KT
3133#if defined (OBJ_COFF) && defined (TE_PE)
3134 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
3135 ? 32 : 16);
3136#else
a4447b93 3137 x86_dwarf2_return_column = 16;
ca19b261 3138#endif
61ff971f 3139 x86_cie_data_alignment = -8;
a4447b93
RH
3140 }
3141 else
3142 {
3143 x86_dwarf2_return_column = 8;
3144 x86_cie_data_alignment = -4;
3145 }
e379e5f3
L
3146
3147 /* NB: FUSED_JCC_PADDING frag must have sufficient room so that it
3148 can be turned into BRANCH_PREFIX frag. */
3149 if (align_branch_prefix_size > MAX_FUSED_JCC_PADDING_SIZE)
3150 abort ();
252b5132
RH
3151}
3152
3153void
e3bb37b5 3154i386_print_statistics (FILE *file)
252b5132
RH
3155{
3156 hash_print_statistics (file, "i386 opcode", op_hash);
3157 hash_print_statistics (file, "i386 register", reg_hash);
3158}
3159\f
252b5132
RH
3160#ifdef DEBUG386
3161
ce8a8b2f 3162/* Debugging routines for md_assemble. */
d3ce72d0 3163static void pte (insn_template *);
40fb9820 3164static void pt (i386_operand_type);
e3bb37b5
L
3165static void pe (expressionS *);
3166static void ps (symbolS *);
252b5132
RH
3167
3168static void
2c703856 3169pi (const char *line, i386_insn *x)
252b5132 3170{
09137c09 3171 unsigned int j;
252b5132
RH
3172
3173 fprintf (stdout, "%s: template ", line);
3174 pte (&x->tm);
09f131f2
JH
3175 fprintf (stdout, " address: base %s index %s scale %x\n",
3176 x->base_reg ? x->base_reg->reg_name : "none",
3177 x->index_reg ? x->index_reg->reg_name : "none",
3178 x->log2_scale_factor);
3179 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 3180 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
3181 fprintf (stdout, " sib: base %x index %x scale %x\n",
3182 x->sib.base, x->sib.index, x->sib.scale);
3183 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
3184 (x->rex & REX_W) != 0,
3185 (x->rex & REX_R) != 0,
3186 (x->rex & REX_X) != 0,
3187 (x->rex & REX_B) != 0);
09137c09 3188 for (j = 0; j < x->operands; j++)
252b5132 3189 {
09137c09
SP
3190 fprintf (stdout, " #%d: ", j + 1);
3191 pt (x->types[j]);
252b5132 3192 fprintf (stdout, "\n");
bab6aec1 3193 if (x->types[j].bitfield.class == Reg
3528c362
JB
3194 || x->types[j].bitfield.class == RegMMX
3195 || x->types[j].bitfield.class == RegSIMD
00cee14f 3196 || x->types[j].bitfield.class == SReg
4a5c67ed
JB
3197 || x->types[j].bitfield.class == RegCR
3198 || x->types[j].bitfield.class == RegDR
3199 || x->types[j].bitfield.class == RegTR)
09137c09
SP
3200 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
3201 if (operand_type_check (x->types[j], imm))
3202 pe (x->op[j].imms);
3203 if (operand_type_check (x->types[j], disp))
3204 pe (x->op[j].disps);
252b5132
RH
3205 }
3206}
3207
3208static void
d3ce72d0 3209pte (insn_template *t)
252b5132 3210{
09137c09 3211 unsigned int j;
252b5132 3212 fprintf (stdout, " %d operands ", t->operands);
47926f60 3213 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
3214 if (t->extension_opcode != None)
3215 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 3216 if (t->opcode_modifier.d)
252b5132 3217 fprintf (stdout, "D");
40fb9820 3218 if (t->opcode_modifier.w)
252b5132
RH
3219 fprintf (stdout, "W");
3220 fprintf (stdout, "\n");
09137c09 3221 for (j = 0; j < t->operands; j++)
252b5132 3222 {
09137c09
SP
3223 fprintf (stdout, " #%d type ", j + 1);
3224 pt (t->operand_types[j]);
252b5132
RH
3225 fprintf (stdout, "\n");
3226 }
3227}
3228
3229static void
e3bb37b5 3230pe (expressionS *e)
252b5132 3231{
24eab124 3232 fprintf (stdout, " operation %d\n", e->X_op);
b77ad1d4
AM
3233 fprintf (stdout, " add_number %ld (%lx)\n",
3234 (long) e->X_add_number, (long) e->X_add_number);
252b5132
RH
3235 if (e->X_add_symbol)
3236 {
3237 fprintf (stdout, " add_symbol ");
3238 ps (e->X_add_symbol);
3239 fprintf (stdout, "\n");
3240 }
3241 if (e->X_op_symbol)
3242 {
3243 fprintf (stdout, " op_symbol ");
3244 ps (e->X_op_symbol);
3245 fprintf (stdout, "\n");
3246 }
3247}
3248
3249static void
e3bb37b5 3250ps (symbolS *s)
252b5132
RH
3251{
3252 fprintf (stdout, "%s type %s%s",
3253 S_GET_NAME (s),
3254 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3255 segment_name (S_GET_SEGMENT (s)));
3256}
3257
7b81dfbb 3258static struct type_name
252b5132 3259 {
40fb9820
L
3260 i386_operand_type mask;
3261 const char *name;
252b5132 3262 }
7b81dfbb 3263const type_names[] =
252b5132 3264{
40fb9820
L
3265 { OPERAND_TYPE_REG8, "r8" },
3266 { OPERAND_TYPE_REG16, "r16" },
3267 { OPERAND_TYPE_REG32, "r32" },
3268 { OPERAND_TYPE_REG64, "r64" },
2c703856
JB
3269 { OPERAND_TYPE_ACC8, "acc8" },
3270 { OPERAND_TYPE_ACC16, "acc16" },
3271 { OPERAND_TYPE_ACC32, "acc32" },
3272 { OPERAND_TYPE_ACC64, "acc64" },
40fb9820
L
3273 { OPERAND_TYPE_IMM8, "i8" },
3274 { OPERAND_TYPE_IMM8, "i8s" },
3275 { OPERAND_TYPE_IMM16, "i16" },
3276 { OPERAND_TYPE_IMM32, "i32" },
3277 { OPERAND_TYPE_IMM32S, "i32s" },
3278 { OPERAND_TYPE_IMM64, "i64" },
3279 { OPERAND_TYPE_IMM1, "i1" },
3280 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
3281 { OPERAND_TYPE_DISP8, "d8" },
3282 { OPERAND_TYPE_DISP16, "d16" },
3283 { OPERAND_TYPE_DISP32, "d32" },
3284 { OPERAND_TYPE_DISP32S, "d32s" },
3285 { OPERAND_TYPE_DISP64, "d64" },
3286 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
3287 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
3288 { OPERAND_TYPE_CONTROL, "control reg" },
3289 { OPERAND_TYPE_TEST, "test reg" },
3290 { OPERAND_TYPE_DEBUG, "debug reg" },
3291 { OPERAND_TYPE_FLOATREG, "FReg" },
3292 { OPERAND_TYPE_FLOATACC, "FAcc" },
21df382b 3293 { OPERAND_TYPE_SREG, "SReg" },
40fb9820
L
3294 { OPERAND_TYPE_REGMMX, "rMMX" },
3295 { OPERAND_TYPE_REGXMM, "rXMM" },
0349dc08 3296 { OPERAND_TYPE_REGYMM, "rYMM" },
43234a1e
L
3297 { OPERAND_TYPE_REGZMM, "rZMM" },
3298 { OPERAND_TYPE_REGMASK, "Mask reg" },
252b5132
RH
3299};
3300
3301static void
40fb9820 3302pt (i386_operand_type t)
252b5132 3303{
40fb9820 3304 unsigned int j;
c6fb90c8 3305 i386_operand_type a;
252b5132 3306
40fb9820 3307 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3308 {
3309 a = operand_type_and (t, type_names[j].mask);
2c703856 3310 if (operand_type_equal (&a, &type_names[j].mask))
c6fb90c8
L
3311 fprintf (stdout, "%s, ", type_names[j].name);
3312 }
252b5132
RH
3313 fflush (stdout);
3314}
3315
3316#endif /* DEBUG386 */
3317\f
252b5132 3318static bfd_reloc_code_real_type
3956db08 3319reloc (unsigned int size,
64e74474
AM
3320 int pcrel,
3321 int sign,
3322 bfd_reloc_code_real_type other)
252b5132 3323{
47926f60 3324 if (other != NO_RELOC)
3956db08 3325 {
91d6fa6a 3326 reloc_howto_type *rel;
3956db08
JB
3327
3328 if (size == 8)
3329 switch (other)
3330 {
64e74474
AM
3331 case BFD_RELOC_X86_64_GOT32:
3332 return BFD_RELOC_X86_64_GOT64;
3333 break;
553d1284
L
3334 case BFD_RELOC_X86_64_GOTPLT64:
3335 return BFD_RELOC_X86_64_GOTPLT64;
3336 break;
64e74474
AM
3337 case BFD_RELOC_X86_64_PLTOFF64:
3338 return BFD_RELOC_X86_64_PLTOFF64;
3339 break;
3340 case BFD_RELOC_X86_64_GOTPC32:
3341 other = BFD_RELOC_X86_64_GOTPC64;
3342 break;
3343 case BFD_RELOC_X86_64_GOTPCREL:
3344 other = BFD_RELOC_X86_64_GOTPCREL64;
3345 break;
3346 case BFD_RELOC_X86_64_TPOFF32:
3347 other = BFD_RELOC_X86_64_TPOFF64;
3348 break;
3349 case BFD_RELOC_X86_64_DTPOFF32:
3350 other = BFD_RELOC_X86_64_DTPOFF64;
3351 break;
3352 default:
3353 break;
3956db08 3354 }
e05278af 3355
8ce3d284 3356#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3357 if (other == BFD_RELOC_SIZE32)
3358 {
3359 if (size == 8)
1ab668bf 3360 other = BFD_RELOC_SIZE64;
8fd4256d 3361 if (pcrel)
1ab668bf
AM
3362 {
3363 as_bad (_("there are no pc-relative size relocations"));
3364 return NO_RELOC;
3365 }
8fd4256d 3366 }
8ce3d284 3367#endif
8fd4256d 3368
e05278af 3369 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3370 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3371 sign = -1;
3372
91d6fa6a
NC
3373 rel = bfd_reloc_type_lookup (stdoutput, other);
3374 if (!rel)
3956db08 3375 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3376 else if (size != bfd_get_reloc_size (rel))
3956db08 3377 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3378 bfd_get_reloc_size (rel),
3956db08 3379 size);
91d6fa6a 3380 else if (pcrel && !rel->pc_relative)
3956db08 3381 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3382 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3383 && !sign)
91d6fa6a 3384 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3385 && sign > 0))
3956db08
JB
3386 as_bad (_("relocated field and relocation type differ in signedness"));
3387 else
3388 return other;
3389 return NO_RELOC;
3390 }
252b5132
RH
3391
3392 if (pcrel)
3393 {
3e73aa7c 3394 if (!sign)
3956db08 3395 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3396 switch (size)
3397 {
3398 case 1: return BFD_RELOC_8_PCREL;
3399 case 2: return BFD_RELOC_16_PCREL;
d258b828 3400 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3401 case 8: return BFD_RELOC_64_PCREL;
252b5132 3402 }
3956db08 3403 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3404 }
3405 else
3406 {
3956db08 3407 if (sign > 0)
e5cb08ac 3408 switch (size)
3e73aa7c
JH
3409 {
3410 case 4: return BFD_RELOC_X86_64_32S;
3411 }
3412 else
3413 switch (size)
3414 {
3415 case 1: return BFD_RELOC_8;
3416 case 2: return BFD_RELOC_16;
3417 case 4: return BFD_RELOC_32;
3418 case 8: return BFD_RELOC_64;
3419 }
3956db08
JB
3420 as_bad (_("cannot do %s %u byte relocation"),
3421 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3422 }
3423
0cc9e1d3 3424 return NO_RELOC;
252b5132
RH
3425}
3426
47926f60
KH
3427/* Here we decide which fixups can be adjusted to make them relative to
3428 the beginning of the section instead of the symbol. Basically we need
3429 to make sure that the dynamic relocations are done correctly, so in
3430 some cases we force the original symbol to be used. */
3431
252b5132 3432int
e3bb37b5 3433tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3434{
6d249963 3435#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3436 if (!IS_ELF)
31312f95
AM
3437 return 1;
3438
a161fe53
AM
3439 /* Don't adjust pc-relative references to merge sections in 64-bit
3440 mode. */
3441 if (use_rela_relocations
3442 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3443 && fixP->fx_pcrel)
252b5132 3444 return 0;
31312f95 3445
8d01d9a9
AJ
3446 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3447 and changed later by validate_fix. */
3448 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3449 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3450 return 0;
3451
8fd4256d
L
3452 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3453 for size relocations. */
3454 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3455 || fixP->fx_r_type == BFD_RELOC_SIZE64
3456 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132 3457 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3458 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3459 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3460 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3461 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3462 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3463 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3464 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3465 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3466 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3467 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3468 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c 3469 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3470 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3471 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3472 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3473 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3474 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3475 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3476 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3477 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3478 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3479 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3480 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3481 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3482 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3483 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3484 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3485 return 0;
31312f95 3486#endif
252b5132
RH
3487 return 1;
3488}
252b5132 3489
b4cac588 3490static int
e3bb37b5 3491intel_float_operand (const char *mnemonic)
252b5132 3492{
9306ca4a
JB
3493 /* Note that the value returned is meaningful only for opcodes with (memory)
3494 operands, hence the code here is free to improperly handle opcodes that
3495 have no operands (for better performance and smaller code). */
3496
3497 if (mnemonic[0] != 'f')
3498 return 0; /* non-math */
3499
3500 switch (mnemonic[1])
3501 {
3502 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3503 the fs segment override prefix not currently handled because no
3504 call path can make opcodes without operands get here */
3505 case 'i':
3506 return 2 /* integer op */;
3507 case 'l':
3508 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3509 return 3; /* fldcw/fldenv */
3510 break;
3511 case 'n':
3512 if (mnemonic[2] != 'o' /* fnop */)
3513 return 3; /* non-waiting control op */
3514 break;
3515 case 'r':
3516 if (mnemonic[2] == 's')
3517 return 3; /* frstor/frstpm */
3518 break;
3519 case 's':
3520 if (mnemonic[2] == 'a')
3521 return 3; /* fsave */
3522 if (mnemonic[2] == 't')
3523 {
3524 switch (mnemonic[3])
3525 {
3526 case 'c': /* fstcw */
3527 case 'd': /* fstdw */
3528 case 'e': /* fstenv */
3529 case 's': /* fsts[gw] */
3530 return 3;
3531 }
3532 }
3533 break;
3534 case 'x':
3535 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3536 return 0; /* fxsave/fxrstor are not really math ops */
3537 break;
3538 }
252b5132 3539
9306ca4a 3540 return 1;
252b5132
RH
3541}
3542
c0f3af97
L
3543/* Build the VEX prefix. */
3544
3545static void
d3ce72d0 3546build_vex_prefix (const insn_template *t)
c0f3af97
L
3547{
3548 unsigned int register_specifier;
3549 unsigned int implied_prefix;
3550 unsigned int vector_length;
03751133 3551 unsigned int w;
c0f3af97
L
3552
3553 /* Check register specifier. */
3554 if (i.vex.register_specifier)
43234a1e
L
3555 {
3556 register_specifier =
3557 ~register_number (i.vex.register_specifier) & 0xf;
3558 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3559 }
c0f3af97
L
3560 else
3561 register_specifier = 0xf;
3562
79f0fa25
L
3563 /* Use 2-byte VEX prefix by swapping destination and source operand
3564 if there are more than 1 register operand. */
3565 if (i.reg_operands > 1
3566 && i.vec_encoding != vex_encoding_vex3
86fa6981 3567 && i.dir_encoding == dir_encoding_default
fa99fab2 3568 && i.operands == i.reg_operands
dbbc8b7e 3569 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
7f399153 3570 && i.tm.opcode_modifier.vexopcode == VEX0F
dbbc8b7e 3571 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3572 && i.rex == REX_B)
3573 {
3574 unsigned int xchg = i.operands - 1;
3575 union i386_op temp_op;
3576 i386_operand_type temp_type;
3577
3578 temp_type = i.types[xchg];
3579 i.types[xchg] = i.types[0];
3580 i.types[0] = temp_type;
3581 temp_op = i.op[xchg];
3582 i.op[xchg] = i.op[0];
3583 i.op[0] = temp_op;
3584
9c2799c2 3585 gas_assert (i.rm.mode == 3);
fa99fab2
L
3586
3587 i.rex = REX_R;
3588 xchg = i.rm.regmem;
3589 i.rm.regmem = i.rm.reg;
3590 i.rm.reg = xchg;
3591
dbbc8b7e
JB
3592 if (i.tm.opcode_modifier.d)
3593 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
3594 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
3595 else /* Use the next insn. */
3596 i.tm = t[1];
fa99fab2
L
3597 }
3598
79dec6b7
JB
3599 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3600 are no memory operands and at least 3 register ones. */
3601 if (i.reg_operands >= 3
3602 && i.vec_encoding != vex_encoding_vex3
3603 && i.reg_operands == i.operands - i.imm_operands
3604 && i.tm.opcode_modifier.vex
3605 && i.tm.opcode_modifier.commutative
3606 && (i.tm.opcode_modifier.sse2avx || optimize > 1)
3607 && i.rex == REX_B
3608 && i.vex.register_specifier
3609 && !(i.vex.register_specifier->reg_flags & RegRex))
3610 {
3611 unsigned int xchg = i.operands - i.reg_operands;
3612 union i386_op temp_op;
3613 i386_operand_type temp_type;
3614
3615 gas_assert (i.tm.opcode_modifier.vexopcode == VEX0F);
3616 gas_assert (!i.tm.opcode_modifier.sae);
3617 gas_assert (operand_type_equal (&i.types[i.operands - 2],
3618 &i.types[i.operands - 3]));
3619 gas_assert (i.rm.mode == 3);
3620
3621 temp_type = i.types[xchg];
3622 i.types[xchg] = i.types[xchg + 1];
3623 i.types[xchg + 1] = temp_type;
3624 temp_op = i.op[xchg];
3625 i.op[xchg] = i.op[xchg + 1];
3626 i.op[xchg + 1] = temp_op;
3627
3628 i.rex = 0;
3629 xchg = i.rm.regmem | 8;
3630 i.rm.regmem = ~register_specifier & 0xf;
3631 gas_assert (!(i.rm.regmem & 8));
3632 i.vex.register_specifier += xchg - i.rm.regmem;
3633 register_specifier = ~xchg & 0xf;
3634 }
3635
539f890d
L
3636 if (i.tm.opcode_modifier.vex == VEXScalar)
3637 vector_length = avxscalar;
10c17abd
JB
3638 else if (i.tm.opcode_modifier.vex == VEX256)
3639 vector_length = 1;
539f890d 3640 else
10c17abd 3641 {
56522fc5 3642 unsigned int op;
10c17abd 3643
c7213af9
L
3644 /* Determine vector length from the last multi-length vector
3645 operand. */
10c17abd 3646 vector_length = 0;
56522fc5 3647 for (op = t->operands; op--;)
10c17abd
JB
3648 if (t->operand_types[op].bitfield.xmmword
3649 && t->operand_types[op].bitfield.ymmword
3650 && i.types[op].bitfield.ymmword)
3651 {
3652 vector_length = 1;
3653 break;
3654 }
3655 }
c0f3af97
L
3656
3657 switch ((i.tm.base_opcode >> 8) & 0xff)
3658 {
3659 case 0:
3660 implied_prefix = 0;
3661 break;
3662 case DATA_PREFIX_OPCODE:
3663 implied_prefix = 1;
3664 break;
3665 case REPE_PREFIX_OPCODE:
3666 implied_prefix = 2;
3667 break;
3668 case REPNE_PREFIX_OPCODE:
3669 implied_prefix = 3;
3670 break;
3671 default:
3672 abort ();
3673 }
3674
03751133
L
3675 /* Check the REX.W bit and VEXW. */
3676 if (i.tm.opcode_modifier.vexw == VEXWIG)
3677 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
3678 else if (i.tm.opcode_modifier.vexw)
3679 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3680 else
931d03b7 3681 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3682
c0f3af97 3683 /* Use 2-byte VEX prefix if possible. */
03751133
L
3684 if (w == 0
3685 && i.vec_encoding != vex_encoding_vex3
86fa6981 3686 && i.tm.opcode_modifier.vexopcode == VEX0F
c0f3af97
L
3687 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3688 {
3689 /* 2-byte VEX prefix. */
3690 unsigned int r;
3691
3692 i.vex.length = 2;
3693 i.vex.bytes[0] = 0xc5;
3694
3695 /* Check the REX.R bit. */
3696 r = (i.rex & REX_R) ? 0 : 1;
3697 i.vex.bytes[1] = (r << 7
3698 | register_specifier << 3
3699 | vector_length << 2
3700 | implied_prefix);
3701 }
3702 else
3703 {
3704 /* 3-byte VEX prefix. */
03751133 3705 unsigned int m;
c0f3af97 3706
f88c9eb0 3707 i.vex.length = 3;
f88c9eb0 3708
7f399153 3709 switch (i.tm.opcode_modifier.vexopcode)
5dd85c99 3710 {
7f399153
L
3711 case VEX0F:
3712 m = 0x1;
80de6e00 3713 i.vex.bytes[0] = 0xc4;
7f399153
L
3714 break;
3715 case VEX0F38:
3716 m = 0x2;
80de6e00 3717 i.vex.bytes[0] = 0xc4;
7f399153
L
3718 break;
3719 case VEX0F3A:
3720 m = 0x3;
80de6e00 3721 i.vex.bytes[0] = 0xc4;
7f399153
L
3722 break;
3723 case XOP08:
5dd85c99
SP
3724 m = 0x8;
3725 i.vex.bytes[0] = 0x8f;
7f399153
L
3726 break;
3727 case XOP09:
f88c9eb0
SP
3728 m = 0x9;
3729 i.vex.bytes[0] = 0x8f;
7f399153
L
3730 break;
3731 case XOP0A:
f88c9eb0
SP
3732 m = 0xa;
3733 i.vex.bytes[0] = 0x8f;
7f399153
L
3734 break;
3735 default:
3736 abort ();
f88c9eb0 3737 }
c0f3af97 3738
c0f3af97
L
3739 /* The high 3 bits of the second VEX byte are 1's compliment
3740 of RXB bits from REX. */
3741 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3742
c0f3af97
L
3743 i.vex.bytes[2] = (w << 7
3744 | register_specifier << 3
3745 | vector_length << 2
3746 | implied_prefix);
3747 }
3748}
3749
e771e7c9
JB
3750static INLINE bfd_boolean
3751is_evex_encoding (const insn_template *t)
3752{
7091c612 3753 return t->opcode_modifier.evex || t->opcode_modifier.disp8memshift
e771e7c9 3754 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
a80195f1 3755 || t->opcode_modifier.sae;
e771e7c9
JB
3756}
3757
7a8655d2
JB
3758static INLINE bfd_boolean
3759is_any_vex_encoding (const insn_template *t)
3760{
3761 return t->opcode_modifier.vex || t->opcode_modifier.vexopcode
3762 || is_evex_encoding (t);
3763}
3764
43234a1e
L
3765/* Build the EVEX prefix. */
3766
3767static void
3768build_evex_prefix (void)
3769{
3770 unsigned int register_specifier;
3771 unsigned int implied_prefix;
3772 unsigned int m, w;
3773 rex_byte vrex_used = 0;
3774
3775 /* Check register specifier. */
3776 if (i.vex.register_specifier)
3777 {
3778 gas_assert ((i.vrex & REX_X) == 0);
3779
3780 register_specifier = i.vex.register_specifier->reg_num;
3781 if ((i.vex.register_specifier->reg_flags & RegRex))
3782 register_specifier += 8;
3783 /* The upper 16 registers are encoded in the fourth byte of the
3784 EVEX prefix. */
3785 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3786 i.vex.bytes[3] = 0x8;
3787 register_specifier = ~register_specifier & 0xf;
3788 }
3789 else
3790 {
3791 register_specifier = 0xf;
3792
3793 /* Encode upper 16 vector index register in the fourth byte of
3794 the EVEX prefix. */
3795 if (!(i.vrex & REX_X))
3796 i.vex.bytes[3] = 0x8;
3797 else
3798 vrex_used |= REX_X;
3799 }
3800
3801 switch ((i.tm.base_opcode >> 8) & 0xff)
3802 {
3803 case 0:
3804 implied_prefix = 0;
3805 break;
3806 case DATA_PREFIX_OPCODE:
3807 implied_prefix = 1;
3808 break;
3809 case REPE_PREFIX_OPCODE:
3810 implied_prefix = 2;
3811 break;
3812 case REPNE_PREFIX_OPCODE:
3813 implied_prefix = 3;
3814 break;
3815 default:
3816 abort ();
3817 }
3818
3819 /* 4 byte EVEX prefix. */
3820 i.vex.length = 4;
3821 i.vex.bytes[0] = 0x62;
3822
3823 /* mmmm bits. */
3824 switch (i.tm.opcode_modifier.vexopcode)
3825 {
3826 case VEX0F:
3827 m = 1;
3828 break;
3829 case VEX0F38:
3830 m = 2;
3831 break;
3832 case VEX0F3A:
3833 m = 3;
3834 break;
3835 default:
3836 abort ();
3837 break;
3838 }
3839
3840 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3841 bits from REX. */
3842 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3843
3844 /* The fifth bit of the second EVEX byte is 1's compliment of the
3845 REX_R bit in VREX. */
3846 if (!(i.vrex & REX_R))
3847 i.vex.bytes[1] |= 0x10;
3848 else
3849 vrex_used |= REX_R;
3850
3851 if ((i.reg_operands + i.imm_operands) == i.operands)
3852 {
3853 /* When all operands are registers, the REX_X bit in REX is not
3854 used. We reuse it to encode the upper 16 registers, which is
3855 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3856 as 1's compliment. */
3857 if ((i.vrex & REX_B))
3858 {
3859 vrex_used |= REX_B;
3860 i.vex.bytes[1] &= ~0x40;
3861 }
3862 }
3863
3864 /* EVEX instructions shouldn't need the REX prefix. */
3865 i.vrex &= ~vrex_used;
3866 gas_assert (i.vrex == 0);
3867
6865c043
L
3868 /* Check the REX.W bit and VEXW. */
3869 if (i.tm.opcode_modifier.vexw == VEXWIG)
3870 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
3871 else if (i.tm.opcode_modifier.vexw)
3872 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3873 else
931d03b7 3874 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e
L
3875
3876 /* Encode the U bit. */
3877 implied_prefix |= 0x4;
3878
3879 /* The third byte of the EVEX prefix. */
3880 i.vex.bytes[2] = (w << 7 | register_specifier << 3 | implied_prefix);
3881
3882 /* The fourth byte of the EVEX prefix. */
3883 /* The zeroing-masking bit. */
3884 if (i.mask && i.mask->zeroing)
3885 i.vex.bytes[3] |= 0x80;
3886
3887 /* Don't always set the broadcast bit if there is no RC. */
3888 if (!i.rounding)
3889 {
3890 /* Encode the vector length. */
3891 unsigned int vec_length;
3892
e771e7c9
JB
3893 if (!i.tm.opcode_modifier.evex
3894 || i.tm.opcode_modifier.evex == EVEXDYN)
3895 {
56522fc5 3896 unsigned int op;
e771e7c9 3897
c7213af9
L
3898 /* Determine vector length from the last multi-length vector
3899 operand. */
e771e7c9 3900 vec_length = 0;
56522fc5 3901 for (op = i.operands; op--;)
e771e7c9
JB
3902 if (i.tm.operand_types[op].bitfield.xmmword
3903 + i.tm.operand_types[op].bitfield.ymmword
3904 + i.tm.operand_types[op].bitfield.zmmword > 1)
3905 {
3906 if (i.types[op].bitfield.zmmword)
c7213af9
L
3907 {
3908 i.tm.opcode_modifier.evex = EVEX512;
3909 break;
3910 }
e771e7c9 3911 else if (i.types[op].bitfield.ymmword)
c7213af9
L
3912 {
3913 i.tm.opcode_modifier.evex = EVEX256;
3914 break;
3915 }
e771e7c9 3916 else if (i.types[op].bitfield.xmmword)
c7213af9
L
3917 {
3918 i.tm.opcode_modifier.evex = EVEX128;
3919 break;
3920 }
625cbd7a
JB
3921 else if (i.broadcast && (int) op == i.broadcast->operand)
3922 {
4a1b91ea 3923 switch (i.broadcast->bytes)
625cbd7a
JB
3924 {
3925 case 64:
3926 i.tm.opcode_modifier.evex = EVEX512;
3927 break;
3928 case 32:
3929 i.tm.opcode_modifier.evex = EVEX256;
3930 break;
3931 case 16:
3932 i.tm.opcode_modifier.evex = EVEX128;
3933 break;
3934 default:
c7213af9 3935 abort ();
625cbd7a 3936 }
c7213af9 3937 break;
625cbd7a 3938 }
e771e7c9 3939 }
c7213af9 3940
56522fc5 3941 if (op >= MAX_OPERANDS)
c7213af9 3942 abort ();
e771e7c9
JB
3943 }
3944
43234a1e
L
3945 switch (i.tm.opcode_modifier.evex)
3946 {
3947 case EVEXLIG: /* LL' is ignored */
3948 vec_length = evexlig << 5;
3949 break;
3950 case EVEX128:
3951 vec_length = 0 << 5;
3952 break;
3953 case EVEX256:
3954 vec_length = 1 << 5;
3955 break;
3956 case EVEX512:
3957 vec_length = 2 << 5;
3958 break;
3959 default:
3960 abort ();
3961 break;
3962 }
3963 i.vex.bytes[3] |= vec_length;
3964 /* Encode the broadcast bit. */
3965 if (i.broadcast)
3966 i.vex.bytes[3] |= 0x10;
3967 }
3968 else
3969 {
3970 if (i.rounding->type != saeonly)
3971 i.vex.bytes[3] |= 0x10 | (i.rounding->type << 5);
3972 else
d3d3c6db 3973 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e
L
3974 }
3975
3976 if (i.mask && i.mask->mask)
3977 i.vex.bytes[3] |= i.mask->mask->reg_num;
3978}
3979
65da13b5
L
3980static void
3981process_immext (void)
3982{
3983 expressionS *exp;
3984
c0f3af97 3985 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
3986 which is coded in the same place as an 8-bit immediate field
3987 would be. Here we fake an 8-bit immediate operand from the
3988 opcode suffix stored in tm.extension_opcode.
3989
c1e679ec 3990 AVX instructions also use this encoding, for some of
c0f3af97 3991 3 argument instructions. */
65da13b5 3992
43234a1e 3993 gas_assert (i.imm_operands <= 1
7ab9ffdd 3994 && (i.operands <= 2
7a8655d2 3995 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 3996 && i.operands <= 4)));
65da13b5
L
3997
3998 exp = &im_expressions[i.imm_operands++];
3999 i.op[i.operands].imms = exp;
4000 i.types[i.operands] = imm8;
4001 i.operands++;
4002 exp->X_op = O_constant;
4003 exp->X_add_number = i.tm.extension_opcode;
4004 i.tm.extension_opcode = None;
4005}
4006
42164a71
L
4007
4008static int
4009check_hle (void)
4010{
4011 switch (i.tm.opcode_modifier.hleprefixok)
4012 {
4013 default:
4014 abort ();
82c2def5 4015 case HLEPrefixNone:
165de32a
L
4016 as_bad (_("invalid instruction `%s' after `%s'"),
4017 i.tm.name, i.hle_prefix);
42164a71 4018 return 0;
82c2def5 4019 case HLEPrefixLock:
42164a71
L
4020 if (i.prefix[LOCK_PREFIX])
4021 return 1;
165de32a 4022 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 4023 return 0;
82c2def5 4024 case HLEPrefixAny:
42164a71 4025 return 1;
82c2def5 4026 case HLEPrefixRelease:
42164a71
L
4027 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
4028 {
4029 as_bad (_("instruction `%s' after `xacquire' not allowed"),
4030 i.tm.name);
4031 return 0;
4032 }
8dc0818e 4033 if (i.mem_operands == 0 || !(i.flags[i.operands - 1] & Operand_Mem))
42164a71
L
4034 {
4035 as_bad (_("memory destination needed for instruction `%s'"
4036 " after `xrelease'"), i.tm.name);
4037 return 0;
4038 }
4039 return 1;
4040 }
4041}
4042
b6f8c7c4
L
4043/* Try the shortest encoding by shortening operand size. */
4044
4045static void
4046optimize_encoding (void)
4047{
a0a1771e 4048 unsigned int j;
b6f8c7c4
L
4049
4050 if (optimize_for_space
72aea328 4051 && !is_any_vex_encoding (&i.tm)
b6f8c7c4
L
4052 && i.reg_operands == 1
4053 && i.imm_operands == 1
4054 && !i.types[1].bitfield.byte
4055 && i.op[0].imms->X_op == O_constant
4056 && fits_in_imm7 (i.op[0].imms->X_add_number)
72aea328 4057 && (i.tm.base_opcode == 0xa8
b6f8c7c4
L
4058 || (i.tm.base_opcode == 0xf6
4059 && i.tm.extension_opcode == 0x0)))
4060 {
4061 /* Optimize: -Os:
4062 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
4063 */
4064 unsigned int base_regnum = i.op[1].regs->reg_num;
4065 if (flag_code == CODE_64BIT || base_regnum < 4)
4066 {
4067 i.types[1].bitfield.byte = 1;
4068 /* Ignore the suffix. */
4069 i.suffix = 0;
7697afb6
JB
4070 /* Convert to byte registers. */
4071 if (i.types[1].bitfield.word)
4072 j = 16;
4073 else if (i.types[1].bitfield.dword)
4074 j = 32;
4075 else
4076 j = 48;
4077 if (!(i.op[1].regs->reg_flags & RegRex) && base_regnum < 4)
4078 j += 8;
4079 i.op[1].regs -= j;
b6f8c7c4
L
4080 }
4081 }
4082 else if (flag_code == CODE_64BIT
72aea328 4083 && !is_any_vex_encoding (&i.tm)
d3d50934
L
4084 && ((i.types[1].bitfield.qword
4085 && i.reg_operands == 1
b6f8c7c4
L
4086 && i.imm_operands == 1
4087 && i.op[0].imms->X_op == O_constant
507916b8 4088 && ((i.tm.base_opcode == 0xb8
b6f8c7c4
L
4089 && i.tm.extension_opcode == None
4090 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
4091 || (fits_in_imm31 (i.op[0].imms->X_add_number)
72aea328
JB
4092 && ((i.tm.base_opcode == 0x24
4093 || i.tm.base_opcode == 0xa8)
b6f8c7c4
L
4094 || (i.tm.base_opcode == 0x80
4095 && i.tm.extension_opcode == 0x4)
4096 || ((i.tm.base_opcode == 0xf6
507916b8 4097 || (i.tm.base_opcode | 1) == 0xc7)
b8364fa7
JB
4098 && i.tm.extension_opcode == 0x0)))
4099 || (fits_in_imm7 (i.op[0].imms->X_add_number)
4100 && i.tm.base_opcode == 0x83
4101 && i.tm.extension_opcode == 0x4)))
d3d50934
L
4102 || (i.types[0].bitfield.qword
4103 && ((i.reg_operands == 2
4104 && i.op[0].regs == i.op[1].regs
72aea328
JB
4105 && (i.tm.base_opcode == 0x30
4106 || i.tm.base_opcode == 0x28))
d3d50934
L
4107 || (i.reg_operands == 1
4108 && i.operands == 1
72aea328 4109 && i.tm.base_opcode == 0x30)))))
b6f8c7c4
L
4110 {
4111 /* Optimize: -O:
4112 andq $imm31, %r64 -> andl $imm31, %r32
b8364fa7 4113 andq $imm7, %r64 -> andl $imm7, %r32
b6f8c7c4
L
4114 testq $imm31, %r64 -> testl $imm31, %r32
4115 xorq %r64, %r64 -> xorl %r32, %r32
4116 subq %r64, %r64 -> subl %r32, %r32
4117 movq $imm31, %r64 -> movl $imm31, %r32
4118 movq $imm32, %r64 -> movl $imm32, %r32
4119 */
4120 i.tm.opcode_modifier.norex64 = 1;
507916b8 4121 if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4122 {
4123 /* Handle
4124 movq $imm31, %r64 -> movl $imm31, %r32
4125 movq $imm32, %r64 -> movl $imm32, %r32
4126 */
4127 i.tm.operand_types[0].bitfield.imm32 = 1;
4128 i.tm.operand_types[0].bitfield.imm32s = 0;
4129 i.tm.operand_types[0].bitfield.imm64 = 0;
4130 i.types[0].bitfield.imm32 = 1;
4131 i.types[0].bitfield.imm32s = 0;
4132 i.types[0].bitfield.imm64 = 0;
4133 i.types[1].bitfield.dword = 1;
4134 i.types[1].bitfield.qword = 0;
507916b8 4135 if ((i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4136 {
4137 /* Handle
4138 movq $imm31, %r64 -> movl $imm31, %r32
4139 */
507916b8 4140 i.tm.base_opcode = 0xb8;
b6f8c7c4 4141 i.tm.extension_opcode = None;
507916b8 4142 i.tm.opcode_modifier.w = 0;
b6f8c7c4
L
4143 i.tm.opcode_modifier.modrm = 0;
4144 }
4145 }
4146 }
5641ec01
JB
4147 else if (optimize > 1
4148 && !optimize_for_space
72aea328 4149 && !is_any_vex_encoding (&i.tm)
5641ec01
JB
4150 && i.reg_operands == 2
4151 && i.op[0].regs == i.op[1].regs
4152 && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8
4153 || (i.tm.base_opcode & ~(Opcode_D | 1)) == 0x20)
4154 && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword))
4155 {
4156 /* Optimize: -O2:
4157 andb %rN, %rN -> testb %rN, %rN
4158 andw %rN, %rN -> testw %rN, %rN
4159 andq %rN, %rN -> testq %rN, %rN
4160 orb %rN, %rN -> testb %rN, %rN
4161 orw %rN, %rN -> testw %rN, %rN
4162 orq %rN, %rN -> testq %rN, %rN
4163
4164 and outside of 64-bit mode
4165
4166 andl %rN, %rN -> testl %rN, %rN
4167 orl %rN, %rN -> testl %rN, %rN
4168 */
4169 i.tm.base_opcode = 0x84 | (i.tm.base_opcode & 1);
4170 }
99112332 4171 else if (i.reg_operands == 3
b6f8c7c4
L
4172 && i.op[0].regs == i.op[1].regs
4173 && !i.types[2].bitfield.xmmword
4174 && (i.tm.opcode_modifier.vex
7a69eac3 4175 || ((!i.mask || i.mask->zeroing)
b6f8c7c4 4176 && !i.rounding
e771e7c9 4177 && is_evex_encoding (&i.tm)
80c34c38 4178 && (i.vec_encoding != vex_encoding_evex
dd22218c 4179 || cpu_arch_isa_flags.bitfield.cpuavx512vl
80c34c38 4180 || i.tm.cpu_flags.bitfield.cpuavx512vl
7091c612 4181 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4182 && i.types[2].bitfield.ymmword))))
b6f8c7c4
L
4183 && ((i.tm.base_opcode == 0x55
4184 || i.tm.base_opcode == 0x6655
4185 || i.tm.base_opcode == 0x66df
4186 || i.tm.base_opcode == 0x57
4187 || i.tm.base_opcode == 0x6657
8305403a
L
4188 || i.tm.base_opcode == 0x66ef
4189 || i.tm.base_opcode == 0x66f8
4190 || i.tm.base_opcode == 0x66f9
4191 || i.tm.base_opcode == 0x66fa
1424ad86
JB
4192 || i.tm.base_opcode == 0x66fb
4193 || i.tm.base_opcode == 0x42
4194 || i.tm.base_opcode == 0x6642
4195 || i.tm.base_opcode == 0x47
4196 || i.tm.base_opcode == 0x6647)
b6f8c7c4
L
4197 && i.tm.extension_opcode == None))
4198 {
99112332 4199 /* Optimize: -O1:
8305403a
L
4200 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4201 vpsubq and vpsubw:
b6f8c7c4
L
4202 EVEX VOP %zmmM, %zmmM, %zmmN
4203 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4204 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4205 EVEX VOP %ymmM, %ymmM, %ymmN
4206 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4207 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4208 VEX VOP %ymmM, %ymmM, %ymmN
4209 -> VEX VOP %xmmM, %xmmM, %xmmN
4210 VOP, one of vpandn and vpxor:
4211 VEX VOP %ymmM, %ymmM, %ymmN
4212 -> VEX VOP %xmmM, %xmmM, %xmmN
4213 VOP, one of vpandnd and vpandnq:
4214 EVEX VOP %zmmM, %zmmM, %zmmN
4215 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4216 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4217 EVEX VOP %ymmM, %ymmM, %ymmN
4218 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4219 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4220 VOP, one of vpxord and vpxorq:
4221 EVEX VOP %zmmM, %zmmM, %zmmN
4222 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4223 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4224 EVEX VOP %ymmM, %ymmM, %ymmN
4225 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4226 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4227 VOP, one of kxord and kxorq:
4228 VEX VOP %kM, %kM, %kN
4229 -> VEX kxorw %kM, %kM, %kN
4230 VOP, one of kandnd and kandnq:
4231 VEX VOP %kM, %kM, %kN
4232 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4233 */
e771e7c9 4234 if (is_evex_encoding (&i.tm))
b6f8c7c4 4235 {
7b1d7ca1 4236 if (i.vec_encoding != vex_encoding_evex)
b6f8c7c4
L
4237 {
4238 i.tm.opcode_modifier.vex = VEX128;
4239 i.tm.opcode_modifier.vexw = VEXW0;
4240 i.tm.opcode_modifier.evex = 0;
4241 }
7b1d7ca1 4242 else if (optimize > 1)
dd22218c
L
4243 i.tm.opcode_modifier.evex = EVEX128;
4244 else
4245 return;
b6f8c7c4 4246 }
f74a6307 4247 else if (i.tm.operand_types[0].bitfield.class == RegMask)
1424ad86
JB
4248 {
4249 i.tm.base_opcode &= 0xff;
4250 i.tm.opcode_modifier.vexw = VEXW0;
4251 }
b6f8c7c4
L
4252 else
4253 i.tm.opcode_modifier.vex = VEX128;
4254
4255 if (i.tm.opcode_modifier.vex)
4256 for (j = 0; j < 3; j++)
4257 {
4258 i.types[j].bitfield.xmmword = 1;
4259 i.types[j].bitfield.ymmword = 0;
4260 }
4261 }
392a5972 4262 else if (i.vec_encoding != vex_encoding_evex
97ed31ae 4263 && !i.types[0].bitfield.zmmword
392a5972 4264 && !i.types[1].bitfield.zmmword
97ed31ae 4265 && !i.mask
a0a1771e 4266 && !i.broadcast
97ed31ae 4267 && is_evex_encoding (&i.tm)
392a5972
L
4268 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x666f
4269 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf36f
a0a1771e
JB
4270 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f
4271 || (i.tm.base_opcode & ~4) == 0x66db
4272 || (i.tm.base_opcode & ~4) == 0x66eb)
97ed31ae
L
4273 && i.tm.extension_opcode == None)
4274 {
4275 /* Optimize: -O1:
4276 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4277 vmovdqu32 and vmovdqu64:
4278 EVEX VOP %xmmM, %xmmN
4279 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4280 EVEX VOP %ymmM, %ymmN
4281 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4282 EVEX VOP %xmmM, mem
4283 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4284 EVEX VOP %ymmM, mem
4285 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4286 EVEX VOP mem, %xmmN
4287 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4288 EVEX VOP mem, %ymmN
4289 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
a0a1771e
JB
4290 VOP, one of vpand, vpandn, vpor, vpxor:
4291 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4292 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4293 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4294 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4295 EVEX VOP{d,q} mem, %xmmM, %xmmN
4296 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4297 EVEX VOP{d,q} mem, %ymmM, %ymmN
4298 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
97ed31ae 4299 */
a0a1771e 4300 for (j = 0; j < i.operands; j++)
392a5972
L
4301 if (operand_type_check (i.types[j], disp)
4302 && i.op[j].disps->X_op == O_constant)
4303 {
4304 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4305 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4306 bytes, we choose EVEX Disp8 over VEX Disp32. */
4307 int evex_disp8, vex_disp8;
4308 unsigned int memshift = i.memshift;
4309 offsetT n = i.op[j].disps->X_add_number;
4310
4311 evex_disp8 = fits_in_disp8 (n);
4312 i.memshift = 0;
4313 vex_disp8 = fits_in_disp8 (n);
4314 if (evex_disp8 != vex_disp8)
4315 {
4316 i.memshift = memshift;
4317 return;
4318 }
4319
4320 i.types[j].bitfield.disp8 = vex_disp8;
4321 break;
4322 }
4323 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f)
4324 i.tm.base_opcode ^= 0xf36f ^ 0xf26f;
97ed31ae
L
4325 i.tm.opcode_modifier.vex
4326 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4327 i.tm.opcode_modifier.vexw = VEXW0;
79dec6b7
JB
4328 /* VPAND, VPOR, and VPXOR are commutative. */
4329 if (i.reg_operands == 3 && i.tm.base_opcode != 0x66df)
4330 i.tm.opcode_modifier.commutative = 1;
97ed31ae
L
4331 i.tm.opcode_modifier.evex = 0;
4332 i.tm.opcode_modifier.masking = 0;
a0a1771e 4333 i.tm.opcode_modifier.broadcast = 0;
97ed31ae
L
4334 i.tm.opcode_modifier.disp8memshift = 0;
4335 i.memshift = 0;
a0a1771e
JB
4336 if (j < i.operands)
4337 i.types[j].bitfield.disp8
4338 = fits_in_disp8 (i.op[j].disps->X_add_number);
97ed31ae 4339 }
b6f8c7c4
L
4340}
4341
ae531041
L
4342/* Return non-zero for load instruction. */
4343
4344static int
4345load_insn_p (void)
4346{
4347 unsigned int dest;
4348 int any_vex_p = is_any_vex_encoding (&i.tm);
4349 unsigned int base_opcode = i.tm.base_opcode | 1;
4350
4351 if (!any_vex_p)
4352 {
4353 /* lea */
4354 if (i.tm.base_opcode == 0x8d)
4355 return 0;
4356
4357 /* pop */
4358 if ((i.tm.base_opcode & ~7) == 0x58
4359 || (i.tm.base_opcode == 0x8f && i.tm.extension_opcode == 0))
4360 return 1;
4361
4362 /* movs, cmps, lods, scas. */
4363 if ((i.tm.base_opcode | 0xb) == 0xaf)
4364 return 1;
4365
4366 /* outs */
4367 if (base_opcode == 0x6f)
4368 return 1;
4369 }
4370
4371 /* No memory operand. */
4372 if (!i.mem_operands)
4373 return 0;
4374
4375 if (any_vex_p)
4376 {
4377 /* vldmxcsr. */
4378 if (i.tm.base_opcode == 0xae
4379 && i.tm.opcode_modifier.vex
4380 && i.tm.opcode_modifier.vexopcode == VEX0F
4381 && i.tm.extension_opcode == 2)
4382 return 1;
4383 }
4384 else
4385 {
4386 /* test, not, neg, mul, imul, div, idiv. */
4387 if ((i.tm.base_opcode == 0xf6 || i.tm.base_opcode == 0xf7)
4388 && i.tm.extension_opcode != 1)
4389 return 1;
4390
4391 /* inc, dec. */
4392 if (base_opcode == 0xff && i.tm.extension_opcode <= 1)
4393 return 1;
4394
4395 /* add, or, adc, sbb, and, sub, xor, cmp. */
4396 if (i.tm.base_opcode >= 0x80 && i.tm.base_opcode <= 0x83)
4397 return 1;
4398
4399 /* bt, bts, btr, btc. */
4400 if (i.tm.base_opcode == 0xfba
4401 && (i.tm.extension_opcode >= 4 && i.tm.extension_opcode <= 7))
4402 return 1;
4403
4404 /* rol, ror, rcl, rcr, shl/sal, shr, sar. */
4405 if ((base_opcode == 0xc1
4406 || (i.tm.base_opcode >= 0xd0 && i.tm.base_opcode <= 0xd3))
4407 && i.tm.extension_opcode != 6)
4408 return 1;
4409
4410 /* cmpxchg8b, cmpxchg16b, xrstors. */
4411 if (i.tm.base_opcode == 0xfc7
4412 && (i.tm.extension_opcode == 1 || i.tm.extension_opcode == 3))
4413 return 1;
4414
4415 /* fxrstor, ldmxcsr, xrstor. */
4416 if (i.tm.base_opcode == 0xfae
4417 && (i.tm.extension_opcode == 1
4418 || i.tm.extension_opcode == 2
4419 || i.tm.extension_opcode == 5))
4420 return 1;
4421
4422 /* lgdt, lidt, lmsw. */
4423 if (i.tm.base_opcode == 0xf01
4424 && (i.tm.extension_opcode == 2
4425 || i.tm.extension_opcode == 3
4426 || i.tm.extension_opcode == 6))
4427 return 1;
4428
4429 /* vmptrld */
4430 if (i.tm.base_opcode == 0xfc7
4431 && i.tm.extension_opcode == 6)
4432 return 1;
4433
4434 /* Check for x87 instructions. */
4435 if (i.tm.base_opcode >= 0xd8 && i.tm.base_opcode <= 0xdf)
4436 {
4437 /* Skip fst, fstp, fstenv, fstcw. */
4438 if (i.tm.base_opcode == 0xd9
4439 && (i.tm.extension_opcode == 2
4440 || i.tm.extension_opcode == 3
4441 || i.tm.extension_opcode == 6
4442 || i.tm.extension_opcode == 7))
4443 return 0;
4444
4445 /* Skip fisttp, fist, fistp, fstp. */
4446 if (i.tm.base_opcode == 0xdb
4447 && (i.tm.extension_opcode == 1
4448 || i.tm.extension_opcode == 2
4449 || i.tm.extension_opcode == 3
4450 || i.tm.extension_opcode == 7))
4451 return 0;
4452
4453 /* Skip fisttp, fst, fstp, fsave, fstsw. */
4454 if (i.tm.base_opcode == 0xdd
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 /* Skip fisttp, fist, fistp, fbstp, fistp. */
4463 if (i.tm.base_opcode == 0xdf
4464 && (i.tm.extension_opcode == 1
4465 || i.tm.extension_opcode == 2
4466 || i.tm.extension_opcode == 3
4467 || i.tm.extension_opcode == 6
4468 || i.tm.extension_opcode == 7))
4469 return 0;
4470
4471 return 1;
4472 }
4473 }
4474
4475 dest = i.operands - 1;
4476
4477 /* Check fake imm8 operand and 3 source operands. */
4478 if ((i.tm.opcode_modifier.immext
4479 || i.tm.opcode_modifier.vexsources == VEX3SOURCES)
4480 && i.types[dest].bitfield.imm8)
4481 dest--;
4482
4483 /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg, xadd */
4484 if (!any_vex_p
4485 && (base_opcode == 0x1
4486 || base_opcode == 0x9
4487 || base_opcode == 0x11
4488 || base_opcode == 0x19
4489 || base_opcode == 0x21
4490 || base_opcode == 0x29
4491 || base_opcode == 0x31
4492 || base_opcode == 0x39
4493 || (i.tm.base_opcode >= 0x84 && i.tm.base_opcode <= 0x87)
4494 || base_opcode == 0xfc1))
4495 return 1;
4496
4497 /* Check for load instruction. */
4498 return (i.types[dest].bitfield.class != ClassNone
4499 || i.types[dest].bitfield.instance == Accum);
4500}
4501
4502/* Output lfence, 0xfaee8, after instruction. */
4503
4504static void
4505insert_lfence_after (void)
4506{
4507 if (lfence_after_load && load_insn_p ())
4508 {
4509 char *p = frag_more (3);
4510 *p++ = 0xf;
4511 *p++ = 0xae;
4512 *p = 0xe8;
4513 }
4514}
4515
4516/* Output lfence, 0xfaee8, before instruction. */
4517
4518static void
4519insert_lfence_before (void)
4520{
4521 char *p;
4522
4523 if (is_any_vex_encoding (&i.tm))
4524 return;
4525
4526 if (i.tm.base_opcode == 0xff
4527 && (i.tm.extension_opcode == 2 || i.tm.extension_opcode == 4))
4528 {
4529 /* Insert lfence before indirect branch if needed. */
4530
4531 if (lfence_before_indirect_branch == lfence_branch_none)
4532 return;
4533
4534 if (i.operands != 1)
4535 abort ();
4536
4537 if (i.reg_operands == 1)
4538 {
4539 /* Indirect branch via register. Don't insert lfence with
4540 -mlfence-after-load=yes. */
4541 if (lfence_after_load
4542 || lfence_before_indirect_branch == lfence_branch_memory)
4543 return;
4544 }
4545 else if (i.mem_operands == 1
4546 && lfence_before_indirect_branch != lfence_branch_register)
4547 {
4548 as_warn (_("indirect `%s` with memory operand should be avoided"),
4549 i.tm.name);
4550 return;
4551 }
4552 else
4553 return;
4554
4555 if (last_insn.kind != last_insn_other
4556 && last_insn.seg == now_seg)
4557 {
4558 as_warn_where (last_insn.file, last_insn.line,
4559 _("`%s` skips -mlfence-before-indirect-branch on `%s`"),
4560 last_insn.name, i.tm.name);
4561 return;
4562 }
4563
4564 p = frag_more (3);
4565 *p++ = 0xf;
4566 *p++ = 0xae;
4567 *p = 0xe8;
4568 return;
4569 }
4570
4571 /* Output or/not and lfence before ret. */
4572 if (lfence_before_ret != lfence_before_ret_none
4573 && (i.tm.base_opcode == 0xc2
4574 || i.tm.base_opcode == 0xc3
4575 || i.tm.base_opcode == 0xca
4576 || i.tm.base_opcode == 0xcb))
4577 {
4578 if (last_insn.kind != last_insn_other
4579 && last_insn.seg == now_seg)
4580 {
4581 as_warn_where (last_insn.file, last_insn.line,
4582 _("`%s` skips -mlfence-before-ret on `%s`"),
4583 last_insn.name, i.tm.name);
4584 return;
4585 }
4586 if (lfence_before_ret == lfence_before_ret_or)
4587 {
4588 /* orl: 0x830c2400. */
4589 p = frag_more ((flag_code == CODE_64BIT ? 1 : 0) + 4 + 3);
4590 if (flag_code == CODE_64BIT)
4591 *p++ = 0x48;
4592 *p++ = 0x83;
4593 *p++ = 0xc;
4594 *p++ = 0x24;
4595 *p++ = 0x0;
4596 }
4597 else
4598 {
4599 p = frag_more ((flag_code == CODE_64BIT ? 2 : 0) + 6 + 3);
4600 /* notl: 0xf71424. */
4601 if (flag_code == CODE_64BIT)
4602 *p++ = 0x48;
4603 *p++ = 0xf7;
4604 *p++ = 0x14;
4605 *p++ = 0x24;
4606 /* notl: 0xf71424. */
4607 if (flag_code == CODE_64BIT)
4608 *p++ = 0x48;
4609 *p++ = 0xf7;
4610 *p++ = 0x14;
4611 *p++ = 0x24;
4612 }
4613 *p++ = 0xf;
4614 *p++ = 0xae;
4615 *p = 0xe8;
4616 }
4617}
4618
252b5132
RH
4619/* This is the guts of the machine-dependent assembler. LINE points to a
4620 machine dependent instruction. This function is supposed to emit
4621 the frags/bytes it assembles to. */
4622
4623void
65da13b5 4624md_assemble (char *line)
252b5132 4625{
40fb9820 4626 unsigned int j;
83b16ac6 4627 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 4628 const insn_template *t;
252b5132 4629
47926f60 4630 /* Initialize globals. */
252b5132
RH
4631 memset (&i, '\0', sizeof (i));
4632 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 4633 i.reloc[j] = NO_RELOC;
252b5132
RH
4634 memset (disp_expressions, '\0', sizeof (disp_expressions));
4635 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 4636 save_stack_p = save_stack;
252b5132
RH
4637
4638 /* First parse an instruction mnemonic & call i386_operand for the operands.
4639 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 4640 start of a (possibly prefixed) mnemonic. */
252b5132 4641
29b0f896
AM
4642 line = parse_insn (line, mnemonic);
4643 if (line == NULL)
4644 return;
83b16ac6 4645 mnem_suffix = i.suffix;
252b5132 4646
29b0f896 4647 line = parse_operands (line, mnemonic);
ee86248c 4648 this_operand = -1;
8325cc63
JB
4649 xfree (i.memop1_string);
4650 i.memop1_string = NULL;
29b0f896
AM
4651 if (line == NULL)
4652 return;
252b5132 4653
29b0f896
AM
4654 /* Now we've parsed the mnemonic into a set of templates, and have the
4655 operands at hand. */
4656
b630c145
JB
4657 /* All Intel opcodes have reversed operands except for "bound", "enter",
4658 "monitor*", "mwait*", "tpause", and "umwait". We also don't reverse
4659 intersegment "jmp" and "call" instructions with 2 immediate operands so
4660 that the immediate segment precedes the offset, as it does when in AT&T
4661 mode. */
4d456e3d
L
4662 if (intel_syntax
4663 && i.operands > 1
29b0f896 4664 && (strcmp (mnemonic, "bound") != 0)
30123838 4665 && (strcmp (mnemonic, "invlpga") != 0)
eedb0f2c
JB
4666 && (strncmp (mnemonic, "monitor", 7) != 0)
4667 && (strncmp (mnemonic, "mwait", 5) != 0)
b630c145
JB
4668 && (strcmp (mnemonic, "tpause") != 0)
4669 && (strcmp (mnemonic, "umwait") != 0)
40fb9820
L
4670 && !(operand_type_check (i.types[0], imm)
4671 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4672 swap_operands ();
4673
ec56d5c0
JB
4674 /* The order of the immediates should be reversed
4675 for 2 immediates extrq and insertq instructions */
4676 if (i.imm_operands == 2
4677 && (strcmp (mnemonic, "extrq") == 0
4678 || strcmp (mnemonic, "insertq") == 0))
4679 swap_2_operands (0, 1);
4680
29b0f896
AM
4681 if (i.imm_operands)
4682 optimize_imm ();
4683
b300c311
L
4684 /* Don't optimize displacement for movabs since it only takes 64bit
4685 displacement. */
4686 if (i.disp_operands
a501d77e 4687 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4688 && (flag_code != CODE_64BIT
4689 || strcmp (mnemonic, "movabs") != 0))
4690 optimize_disp ();
29b0f896
AM
4691
4692 /* Next, we find a template that matches the given insn,
4693 making sure the overlap of the given operands types is consistent
4694 with the template operand types. */
252b5132 4695
83b16ac6 4696 if (!(t = match_template (mnem_suffix)))
29b0f896 4697 return;
252b5132 4698
7bab8ab5 4699 if (sse_check != check_none
81f8a913 4700 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4701 && !i.tm.cpu_flags.bitfield.cpuavx
569d50f1 4702 && !i.tm.cpu_flags.bitfield.cpuavx512f
daf50ae7
L
4703 && (i.tm.cpu_flags.bitfield.cpusse
4704 || i.tm.cpu_flags.bitfield.cpusse2
4705 || i.tm.cpu_flags.bitfield.cpusse3
4706 || i.tm.cpu_flags.bitfield.cpussse3
4707 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e 4708 || i.tm.cpu_flags.bitfield.cpusse4_2
569d50f1 4709 || i.tm.cpu_flags.bitfield.cpusse4a
6e3e5c9e
JB
4710 || i.tm.cpu_flags.bitfield.cpupclmul
4711 || i.tm.cpu_flags.bitfield.cpuaes
569d50f1 4712 || i.tm.cpu_flags.bitfield.cpusha
6e3e5c9e 4713 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4714 {
7bab8ab5 4715 (sse_check == check_warning
daf50ae7
L
4716 ? as_warn
4717 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4718 }
4719
40fb9820 4720 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4721 if (!add_prefix (FWAIT_OPCODE))
4722 return;
252b5132 4723
d5de92cf
L
4724 /* Check if REP prefix is OK. */
4725 if (i.rep_prefix && !i.tm.opcode_modifier.repprefixok)
4726 {
4727 as_bad (_("invalid instruction `%s' after `%s'"),
4728 i.tm.name, i.rep_prefix);
4729 return;
4730 }
4731
c1ba0266
L
4732 /* Check for lock without a lockable instruction. Destination operand
4733 must be memory unless it is xchg (0x86). */
c32fa91d
L
4734 if (i.prefix[LOCK_PREFIX]
4735 && (!i.tm.opcode_modifier.islockable
c1ba0266
L
4736 || i.mem_operands == 0
4737 || (i.tm.base_opcode != 0x86
8dc0818e 4738 && !(i.flags[i.operands - 1] & Operand_Mem))))
c32fa91d
L
4739 {
4740 as_bad (_("expecting lockable instruction after `lock'"));
4741 return;
4742 }
4743
7a8655d2
JB
4744 /* Check for data size prefix on VEX/XOP/EVEX encoded insns. */
4745 if (i.prefix[DATA_PREFIX] && is_any_vex_encoding (&i.tm))
4746 {
4747 as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
4748 return;
4749 }
4750
42164a71 4751 /* Check if HLE prefix is OK. */
165de32a 4752 if (i.hle_prefix && !check_hle ())
42164a71
L
4753 return;
4754
7e8b059b
L
4755 /* Check BND prefix. */
4756 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
4757 as_bad (_("expecting valid branch instruction after `bnd'"));
4758
04ef582a 4759 /* Check NOTRACK prefix. */
9fef80d6
L
4760 if (i.notrack_prefix && !i.tm.opcode_modifier.notrackprefixok)
4761 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 4762
327e8c42
JB
4763 if (i.tm.cpu_flags.bitfield.cpumpx)
4764 {
4765 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4766 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
4767 else if (flag_code != CODE_16BIT
4768 ? i.prefix[ADDR_PREFIX]
4769 : i.mem_operands && !i.prefix[ADDR_PREFIX])
4770 as_bad (_("16-bit address isn't allowed in MPX instructions"));
4771 }
7e8b059b
L
4772
4773 /* Insert BND prefix. */
76d3a78a
JB
4774 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
4775 {
4776 if (!i.prefix[BND_PREFIX])
4777 add_prefix (BND_PREFIX_OPCODE);
4778 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
4779 {
4780 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
4781 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
4782 }
4783 }
7e8b059b 4784
29b0f896 4785 /* Check string instruction segment overrides. */
51c8edf6 4786 if (i.tm.opcode_modifier.isstring >= IS_STRING_ES_OP0)
29b0f896 4787 {
51c8edf6 4788 gas_assert (i.mem_operands);
29b0f896 4789 if (!check_string ())
5dd0794d 4790 return;
fc0763e6 4791 i.disp_operands = 0;
29b0f896 4792 }
5dd0794d 4793
b6f8c7c4
L
4794 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
4795 optimize_encoding ();
4796
29b0f896
AM
4797 if (!process_suffix ())
4798 return;
e413e4e9 4799
bc0844ae
L
4800 /* Update operand types. */
4801 for (j = 0; j < i.operands; j++)
4802 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
4803
29b0f896
AM
4804 /* Make still unresolved immediate matches conform to size of immediate
4805 given in i.suffix. */
4806 if (!finalize_imm ())
4807 return;
252b5132 4808
40fb9820 4809 if (i.types[0].bitfield.imm1)
29b0f896 4810 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 4811
9afe6eb8
L
4812 /* We only need to check those implicit registers for instructions
4813 with 3 operands or less. */
4814 if (i.operands <= 3)
4815 for (j = 0; j < i.operands; j++)
75e5731b
JB
4816 if (i.types[j].bitfield.instance != InstanceNone
4817 && !i.types[j].bitfield.xmmword)
9afe6eb8 4818 i.reg_operands--;
40fb9820 4819
c0f3af97
L
4820 /* ImmExt should be processed after SSE2AVX. */
4821 if (!i.tm.opcode_modifier.sse2avx
4822 && i.tm.opcode_modifier.immext)
65da13b5 4823 process_immext ();
252b5132 4824
29b0f896
AM
4825 /* For insns with operands there are more diddles to do to the opcode. */
4826 if (i.operands)
4827 {
4828 if (!process_operands ())
4829 return;
4830 }
40fb9820 4831 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
4832 {
4833 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
4834 as_warn (_("translating to `%sp'"), i.tm.name);
4835 }
252b5132 4836
7a8655d2 4837 if (is_any_vex_encoding (&i.tm))
9e5e5283 4838 {
c1dc7af5 4839 if (!cpu_arch_flags.bitfield.cpui286)
9e5e5283 4840 {
c1dc7af5 4841 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
9e5e5283
L
4842 i.tm.name);
4843 return;
4844 }
c0f3af97 4845
9e5e5283
L
4846 if (i.tm.opcode_modifier.vex)
4847 build_vex_prefix (t);
4848 else
4849 build_evex_prefix ();
4850 }
43234a1e 4851
5dd85c99
SP
4852 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
4853 instructions may define INT_OPCODE as well, so avoid this corner
4854 case for those instructions that use MODRM. */
4855 if (i.tm.base_opcode == INT_OPCODE
a6461c02
SP
4856 && !i.tm.opcode_modifier.modrm
4857 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
4858 {
4859 i.tm.base_opcode = INT3_OPCODE;
4860 i.imm_operands = 0;
4861 }
252b5132 4862
0cfa3eb3
JB
4863 if ((i.tm.opcode_modifier.jump == JUMP
4864 || i.tm.opcode_modifier.jump == JUMP_BYTE
4865 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896
AM
4866 && i.op[0].disps->X_op == O_constant)
4867 {
4868 /* Convert "jmp constant" (and "call constant") to a jump (call) to
4869 the absolute address given by the constant. Since ix86 jumps and
4870 calls are pc relative, we need to generate a reloc. */
4871 i.op[0].disps->X_add_symbol = &abs_symbol;
4872 i.op[0].disps->X_op = O_symbol;
4873 }
252b5132 4874
29b0f896
AM
4875 /* For 8 bit registers we need an empty rex prefix. Also if the
4876 instruction already has a prefix, we need to convert old
4877 registers to new ones. */
773f551c 4878
bab6aec1 4879 if ((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte
29b0f896 4880 && (i.op[0].regs->reg_flags & RegRex64) != 0)
bab6aec1 4881 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte
29b0f896 4882 && (i.op[1].regs->reg_flags & RegRex64) != 0)
bab6aec1
JB
4883 || (((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte)
4884 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte))
29b0f896
AM
4885 && i.rex != 0))
4886 {
4887 int x;
726c5dcd 4888
29b0f896
AM
4889 i.rex |= REX_OPCODE;
4890 for (x = 0; x < 2; x++)
4891 {
4892 /* Look for 8 bit operand that uses old registers. */
bab6aec1 4893 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
29b0f896 4894 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 4895 {
3f93af61 4896 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
29b0f896
AM
4897 /* In case it is "hi" register, give up. */
4898 if (i.op[x].regs->reg_num > 3)
a540244d 4899 as_bad (_("can't encode register '%s%s' in an "
4eed87de 4900 "instruction requiring REX prefix."),
a540244d 4901 register_prefix, i.op[x].regs->reg_name);
773f551c 4902
29b0f896
AM
4903 /* Otherwise it is equivalent to the extended register.
4904 Since the encoding doesn't change this is merely
4905 cosmetic cleanup for debug output. */
4906
4907 i.op[x].regs = i.op[x].regs + 8;
773f551c 4908 }
29b0f896
AM
4909 }
4910 }
773f551c 4911
6b6b6807
L
4912 if (i.rex == 0 && i.rex_encoding)
4913 {
4914 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
3f93af61 4915 that uses legacy register. If it is "hi" register, don't add
6b6b6807
L
4916 the REX_OPCODE byte. */
4917 int x;
4918 for (x = 0; x < 2; x++)
bab6aec1 4919 if (i.types[x].bitfield.class == Reg
6b6b6807
L
4920 && i.types[x].bitfield.byte
4921 && (i.op[x].regs->reg_flags & RegRex64) == 0
4922 && i.op[x].regs->reg_num > 3)
4923 {
3f93af61 4924 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
6b6b6807
L
4925 i.rex_encoding = FALSE;
4926 break;
4927 }
4928
4929 if (i.rex_encoding)
4930 i.rex = REX_OPCODE;
4931 }
4932
7ab9ffdd 4933 if (i.rex != 0)
29b0f896
AM
4934 add_prefix (REX_OPCODE | i.rex);
4935
ae531041
L
4936 insert_lfence_before ();
4937
29b0f896
AM
4938 /* We are ready to output the insn. */
4939 output_insn ();
e379e5f3 4940
ae531041
L
4941 insert_lfence_after ();
4942
e379e5f3
L
4943 last_insn.seg = now_seg;
4944
4945 if (i.tm.opcode_modifier.isprefix)
4946 {
4947 last_insn.kind = last_insn_prefix;
4948 last_insn.name = i.tm.name;
4949 last_insn.file = as_where (&last_insn.line);
4950 }
4951 else
4952 last_insn.kind = last_insn_other;
29b0f896
AM
4953}
4954
4955static char *
e3bb37b5 4956parse_insn (char *line, char *mnemonic)
29b0f896
AM
4957{
4958 char *l = line;
4959 char *token_start = l;
4960 char *mnem_p;
5c6af06e 4961 int supported;
d3ce72d0 4962 const insn_template *t;
b6169b20 4963 char *dot_p = NULL;
29b0f896 4964
29b0f896
AM
4965 while (1)
4966 {
4967 mnem_p = mnemonic;
4968 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
4969 {
b6169b20
L
4970 if (*mnem_p == '.')
4971 dot_p = mnem_p;
29b0f896
AM
4972 mnem_p++;
4973 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 4974 {
29b0f896
AM
4975 as_bad (_("no such instruction: `%s'"), token_start);
4976 return NULL;
4977 }
4978 l++;
4979 }
4980 if (!is_space_char (*l)
4981 && *l != END_OF_INSN
e44823cf
JB
4982 && (intel_syntax
4983 || (*l != PREFIX_SEPARATOR
4984 && *l != ',')))
29b0f896
AM
4985 {
4986 as_bad (_("invalid character %s in mnemonic"),
4987 output_invalid (*l));
4988 return NULL;
4989 }
4990 if (token_start == l)
4991 {
e44823cf 4992 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
4993 as_bad (_("expecting prefix; got nothing"));
4994 else
4995 as_bad (_("expecting mnemonic; got nothing"));
4996 return NULL;
4997 }
45288df1 4998
29b0f896 4999 /* Look up instruction (or prefix) via hash table. */
d3ce72d0 5000 current_templates = (const templates *) hash_find (op_hash, mnemonic);
47926f60 5001
29b0f896
AM
5002 if (*l != END_OF_INSN
5003 && (!is_space_char (*l) || l[1] != END_OF_INSN)
5004 && current_templates
40fb9820 5005 && current_templates->start->opcode_modifier.isprefix)
29b0f896 5006 {
c6fb90c8 5007 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
5008 {
5009 as_bad ((flag_code != CODE_64BIT
5010 ? _("`%s' is only supported in 64-bit mode")
5011 : _("`%s' is not supported in 64-bit mode")),
5012 current_templates->start->name);
5013 return NULL;
5014 }
29b0f896
AM
5015 /* If we are in 16-bit mode, do not allow addr16 or data16.
5016 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
5017 if ((current_templates->start->opcode_modifier.size == SIZE16
5018 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 5019 && flag_code != CODE_64BIT
673fe0f0 5020 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
5021 ^ (flag_code == CODE_16BIT)))
5022 {
5023 as_bad (_("redundant %s prefix"),
5024 current_templates->start->name);
5025 return NULL;
45288df1 5026 }
86fa6981 5027 if (current_templates->start->opcode_length == 0)
29b0f896 5028 {
86fa6981
L
5029 /* Handle pseudo prefixes. */
5030 switch (current_templates->start->base_opcode)
5031 {
5032 case 0x0:
5033 /* {disp8} */
5034 i.disp_encoding = disp_encoding_8bit;
5035 break;
5036 case 0x1:
5037 /* {disp32} */
5038 i.disp_encoding = disp_encoding_32bit;
5039 break;
5040 case 0x2:
5041 /* {load} */
5042 i.dir_encoding = dir_encoding_load;
5043 break;
5044 case 0x3:
5045 /* {store} */
5046 i.dir_encoding = dir_encoding_store;
5047 break;
5048 case 0x4:
42e04b36
L
5049 /* {vex} */
5050 i.vec_encoding = vex_encoding_vex;
86fa6981
L
5051 break;
5052 case 0x5:
5053 /* {vex3} */
5054 i.vec_encoding = vex_encoding_vex3;
5055 break;
5056 case 0x6:
5057 /* {evex} */
5058 i.vec_encoding = vex_encoding_evex;
5059 break;
6b6b6807
L
5060 case 0x7:
5061 /* {rex} */
5062 i.rex_encoding = TRUE;
5063 break;
b6f8c7c4
L
5064 case 0x8:
5065 /* {nooptimize} */
5066 i.no_optimize = TRUE;
5067 break;
86fa6981
L
5068 default:
5069 abort ();
5070 }
5071 }
5072 else
5073 {
5074 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 5075 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 5076 {
4e9ac44a
L
5077 case PREFIX_EXIST:
5078 return NULL;
5079 case PREFIX_DS:
d777820b 5080 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
5081 i.notrack_prefix = current_templates->start->name;
5082 break;
5083 case PREFIX_REP:
5084 if (current_templates->start->cpu_flags.bitfield.cpuhle)
5085 i.hle_prefix = current_templates->start->name;
5086 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
5087 i.bnd_prefix = current_templates->start->name;
5088 else
5089 i.rep_prefix = current_templates->start->name;
5090 break;
5091 default:
5092 break;
86fa6981 5093 }
29b0f896
AM
5094 }
5095 /* Skip past PREFIX_SEPARATOR and reset token_start. */
5096 token_start = ++l;
5097 }
5098 else
5099 break;
5100 }
45288df1 5101
30a55f88 5102 if (!current_templates)
b6169b20 5103 {
07d5e953
JB
5104 /* Deprecated functionality (new code should use pseudo-prefixes instead):
5105 Check if we should swap operand or force 32bit displacement in
f8a5c266 5106 encoding. */
30a55f88 5107 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 5108 i.dir_encoding = dir_encoding_swap;
8d63c93e 5109 else if (mnem_p - 3 == dot_p
a501d77e
L
5110 && dot_p[1] == 'd'
5111 && dot_p[2] == '8')
5112 i.disp_encoding = disp_encoding_8bit;
8d63c93e 5113 else if (mnem_p - 4 == dot_p
f8a5c266
L
5114 && dot_p[1] == 'd'
5115 && dot_p[2] == '3'
5116 && dot_p[3] == '2')
a501d77e 5117 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
5118 else
5119 goto check_suffix;
5120 mnem_p = dot_p;
5121 *dot_p = '\0';
d3ce72d0 5122 current_templates = (const templates *) hash_find (op_hash, mnemonic);
b6169b20
L
5123 }
5124
29b0f896
AM
5125 if (!current_templates)
5126 {
dc1e8a47 5127 check_suffix:
1c529385 5128 if (mnem_p > mnemonic)
29b0f896 5129 {
1c529385
LH
5130 /* See if we can get a match by trimming off a suffix. */
5131 switch (mnem_p[-1])
29b0f896 5132 {
1c529385
LH
5133 case WORD_MNEM_SUFFIX:
5134 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
5135 i.suffix = SHORT_MNEM_SUFFIX;
5136 else
1c529385
LH
5137 /* Fall through. */
5138 case BYTE_MNEM_SUFFIX:
5139 case QWORD_MNEM_SUFFIX:
5140 i.suffix = mnem_p[-1];
29b0f896 5141 mnem_p[-1] = '\0';
d3ce72d0 5142 current_templates = (const templates *) hash_find (op_hash,
1c529385
LH
5143 mnemonic);
5144 break;
5145 case SHORT_MNEM_SUFFIX:
5146 case LONG_MNEM_SUFFIX:
5147 if (!intel_syntax)
5148 {
5149 i.suffix = mnem_p[-1];
5150 mnem_p[-1] = '\0';
5151 current_templates = (const templates *) hash_find (op_hash,
5152 mnemonic);
5153 }
5154 break;
5155
5156 /* Intel Syntax. */
5157 case 'd':
5158 if (intel_syntax)
5159 {
5160 if (intel_float_operand (mnemonic) == 1)
5161 i.suffix = SHORT_MNEM_SUFFIX;
5162 else
5163 i.suffix = LONG_MNEM_SUFFIX;
5164 mnem_p[-1] = '\0';
5165 current_templates = (const templates *) hash_find (op_hash,
5166 mnemonic);
5167 }
5168 break;
29b0f896 5169 }
29b0f896 5170 }
1c529385 5171
29b0f896
AM
5172 if (!current_templates)
5173 {
5174 as_bad (_("no such instruction: `%s'"), token_start);
5175 return NULL;
5176 }
5177 }
252b5132 5178
0cfa3eb3
JB
5179 if (current_templates->start->opcode_modifier.jump == JUMP
5180 || current_templates->start->opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
5181 {
5182 /* Check for a branch hint. We allow ",pt" and ",pn" for
5183 predict taken and predict not taken respectively.
5184 I'm not sure that branch hints actually do anything on loop
5185 and jcxz insns (JumpByte) for current Pentium4 chips. They
5186 may work in the future and it doesn't hurt to accept them
5187 now. */
5188 if (l[0] == ',' && l[1] == 'p')
5189 {
5190 if (l[2] == 't')
5191 {
5192 if (!add_prefix (DS_PREFIX_OPCODE))
5193 return NULL;
5194 l += 3;
5195 }
5196 else if (l[2] == 'n')
5197 {
5198 if (!add_prefix (CS_PREFIX_OPCODE))
5199 return NULL;
5200 l += 3;
5201 }
5202 }
5203 }
5204 /* Any other comma loses. */
5205 if (*l == ',')
5206 {
5207 as_bad (_("invalid character %s in mnemonic"),
5208 output_invalid (*l));
5209 return NULL;
5210 }
252b5132 5211
29b0f896 5212 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
5213 supported = 0;
5214 for (t = current_templates->start; t < current_templates->end; ++t)
5215 {
c0f3af97
L
5216 supported |= cpu_flags_match (t);
5217 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
5218 {
5219 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
5220 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 5221
548d0ee6
JB
5222 return l;
5223 }
29b0f896 5224 }
3629bb00 5225
548d0ee6
JB
5226 if (!(supported & CPU_FLAGS_64BIT_MATCH))
5227 as_bad (flag_code == CODE_64BIT
5228 ? _("`%s' is not supported in 64-bit mode")
5229 : _("`%s' is only supported in 64-bit mode"),
5230 current_templates->start->name);
5231 else
5232 as_bad (_("`%s' is not supported on `%s%s'"),
5233 current_templates->start->name,
5234 cpu_arch_name ? cpu_arch_name : default_arch,
5235 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 5236
548d0ee6 5237 return NULL;
29b0f896 5238}
252b5132 5239
29b0f896 5240static char *
e3bb37b5 5241parse_operands (char *l, const char *mnemonic)
29b0f896
AM
5242{
5243 char *token_start;
3138f287 5244
29b0f896
AM
5245 /* 1 if operand is pending after ','. */
5246 unsigned int expecting_operand = 0;
252b5132 5247
29b0f896
AM
5248 /* Non-zero if operand parens not balanced. */
5249 unsigned int paren_not_balanced;
5250
5251 while (*l != END_OF_INSN)
5252 {
5253 /* Skip optional white space before operand. */
5254 if (is_space_char (*l))
5255 ++l;
d02603dc 5256 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
5257 {
5258 as_bad (_("invalid character %s before operand %d"),
5259 output_invalid (*l),
5260 i.operands + 1);
5261 return NULL;
5262 }
d02603dc 5263 token_start = l; /* After white space. */
29b0f896
AM
5264 paren_not_balanced = 0;
5265 while (paren_not_balanced || *l != ',')
5266 {
5267 if (*l == END_OF_INSN)
5268 {
5269 if (paren_not_balanced)
5270 {
5271 if (!intel_syntax)
5272 as_bad (_("unbalanced parenthesis in operand %d."),
5273 i.operands + 1);
5274 else
5275 as_bad (_("unbalanced brackets in operand %d."),
5276 i.operands + 1);
5277 return NULL;
5278 }
5279 else
5280 break; /* we are done */
5281 }
d02603dc 5282 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
5283 {
5284 as_bad (_("invalid character %s in operand %d"),
5285 output_invalid (*l),
5286 i.operands + 1);
5287 return NULL;
5288 }
5289 if (!intel_syntax)
5290 {
5291 if (*l == '(')
5292 ++paren_not_balanced;
5293 if (*l == ')')
5294 --paren_not_balanced;
5295 }
5296 else
5297 {
5298 if (*l == '[')
5299 ++paren_not_balanced;
5300 if (*l == ']')
5301 --paren_not_balanced;
5302 }
5303 l++;
5304 }
5305 if (l != token_start)
5306 { /* Yes, we've read in another operand. */
5307 unsigned int operand_ok;
5308 this_operand = i.operands++;
5309 if (i.operands > MAX_OPERANDS)
5310 {
5311 as_bad (_("spurious operands; (%d operands/instruction max)"),
5312 MAX_OPERANDS);
5313 return NULL;
5314 }
9d46ce34 5315 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
5316 /* Now parse operand adding info to 'i' as we go along. */
5317 END_STRING_AND_SAVE (l);
5318
1286ab78
L
5319 if (i.mem_operands > 1)
5320 {
5321 as_bad (_("too many memory references for `%s'"),
5322 mnemonic);
5323 return 0;
5324 }
5325
29b0f896
AM
5326 if (intel_syntax)
5327 operand_ok =
5328 i386_intel_operand (token_start,
5329 intel_float_operand (mnemonic));
5330 else
a7619375 5331 operand_ok = i386_att_operand (token_start);
29b0f896
AM
5332
5333 RESTORE_END_STRING (l);
5334 if (!operand_ok)
5335 return NULL;
5336 }
5337 else
5338 {
5339 if (expecting_operand)
5340 {
5341 expecting_operand_after_comma:
5342 as_bad (_("expecting operand after ','; got nothing"));
5343 return NULL;
5344 }
5345 if (*l == ',')
5346 {
5347 as_bad (_("expecting operand before ','; got nothing"));
5348 return NULL;
5349 }
5350 }
7f3f1ea2 5351
29b0f896
AM
5352 /* Now *l must be either ',' or END_OF_INSN. */
5353 if (*l == ',')
5354 {
5355 if (*++l == END_OF_INSN)
5356 {
5357 /* Just skip it, if it's \n complain. */
5358 goto expecting_operand_after_comma;
5359 }
5360 expecting_operand = 1;
5361 }
5362 }
5363 return l;
5364}
7f3f1ea2 5365
050dfa73 5366static void
4d456e3d 5367swap_2_operands (int xchg1, int xchg2)
050dfa73
MM
5368{
5369 union i386_op temp_op;
40fb9820 5370 i386_operand_type temp_type;
c48dadc9 5371 unsigned int temp_flags;
050dfa73 5372 enum bfd_reloc_code_real temp_reloc;
4eed87de 5373
050dfa73
MM
5374 temp_type = i.types[xchg2];
5375 i.types[xchg2] = i.types[xchg1];
5376 i.types[xchg1] = temp_type;
c48dadc9
JB
5377
5378 temp_flags = i.flags[xchg2];
5379 i.flags[xchg2] = i.flags[xchg1];
5380 i.flags[xchg1] = temp_flags;
5381
050dfa73
MM
5382 temp_op = i.op[xchg2];
5383 i.op[xchg2] = i.op[xchg1];
5384 i.op[xchg1] = temp_op;
c48dadc9 5385
050dfa73
MM
5386 temp_reloc = i.reloc[xchg2];
5387 i.reloc[xchg2] = i.reloc[xchg1];
5388 i.reloc[xchg1] = temp_reloc;
43234a1e
L
5389
5390 if (i.mask)
5391 {
5392 if (i.mask->operand == xchg1)
5393 i.mask->operand = xchg2;
5394 else if (i.mask->operand == xchg2)
5395 i.mask->operand = xchg1;
5396 }
5397 if (i.broadcast)
5398 {
5399 if (i.broadcast->operand == xchg1)
5400 i.broadcast->operand = xchg2;
5401 else if (i.broadcast->operand == xchg2)
5402 i.broadcast->operand = xchg1;
5403 }
5404 if (i.rounding)
5405 {
5406 if (i.rounding->operand == xchg1)
5407 i.rounding->operand = xchg2;
5408 else if (i.rounding->operand == xchg2)
5409 i.rounding->operand = xchg1;
5410 }
050dfa73
MM
5411}
5412
29b0f896 5413static void
e3bb37b5 5414swap_operands (void)
29b0f896 5415{
b7c61d9a 5416 switch (i.operands)
050dfa73 5417 {
c0f3af97 5418 case 5:
b7c61d9a 5419 case 4:
4d456e3d 5420 swap_2_operands (1, i.operands - 2);
1a0670f3 5421 /* Fall through. */
b7c61d9a
L
5422 case 3:
5423 case 2:
4d456e3d 5424 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
5425 break;
5426 default:
5427 abort ();
29b0f896 5428 }
29b0f896
AM
5429
5430 if (i.mem_operands == 2)
5431 {
5432 const seg_entry *temp_seg;
5433 temp_seg = i.seg[0];
5434 i.seg[0] = i.seg[1];
5435 i.seg[1] = temp_seg;
5436 }
5437}
252b5132 5438
29b0f896
AM
5439/* Try to ensure constant immediates are represented in the smallest
5440 opcode possible. */
5441static void
e3bb37b5 5442optimize_imm (void)
29b0f896
AM
5443{
5444 char guess_suffix = 0;
5445 int op;
252b5132 5446
29b0f896
AM
5447 if (i.suffix)
5448 guess_suffix = i.suffix;
5449 else if (i.reg_operands)
5450 {
5451 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
5452 We can't do this properly yet, i.e. excluding special register
5453 instances, but the following works for instructions with
5454 immediates. In any case, we can't set i.suffix yet. */
29b0f896 5455 for (op = i.operands; --op >= 0;)
bab6aec1
JB
5456 if (i.types[op].bitfield.class != Reg)
5457 continue;
5458 else if (i.types[op].bitfield.byte)
7ab9ffdd 5459 {
40fb9820
L
5460 guess_suffix = BYTE_MNEM_SUFFIX;
5461 break;
5462 }
bab6aec1 5463 else if (i.types[op].bitfield.word)
252b5132 5464 {
40fb9820
L
5465 guess_suffix = WORD_MNEM_SUFFIX;
5466 break;
5467 }
bab6aec1 5468 else if (i.types[op].bitfield.dword)
40fb9820
L
5469 {
5470 guess_suffix = LONG_MNEM_SUFFIX;
5471 break;
5472 }
bab6aec1 5473 else if (i.types[op].bitfield.qword)
40fb9820
L
5474 {
5475 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5476 break;
252b5132 5477 }
29b0f896
AM
5478 }
5479 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5480 guess_suffix = WORD_MNEM_SUFFIX;
5481
5482 for (op = i.operands; --op >= 0;)
40fb9820 5483 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5484 {
5485 switch (i.op[op].imms->X_op)
252b5132 5486 {
29b0f896
AM
5487 case O_constant:
5488 /* If a suffix is given, this operand may be shortened. */
5489 switch (guess_suffix)
252b5132 5490 {
29b0f896 5491 case LONG_MNEM_SUFFIX:
40fb9820
L
5492 i.types[op].bitfield.imm32 = 1;
5493 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5494 break;
5495 case WORD_MNEM_SUFFIX:
40fb9820
L
5496 i.types[op].bitfield.imm16 = 1;
5497 i.types[op].bitfield.imm32 = 1;
5498 i.types[op].bitfield.imm32s = 1;
5499 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5500 break;
5501 case BYTE_MNEM_SUFFIX:
40fb9820
L
5502 i.types[op].bitfield.imm8 = 1;
5503 i.types[op].bitfield.imm8s = 1;
5504 i.types[op].bitfield.imm16 = 1;
5505 i.types[op].bitfield.imm32 = 1;
5506 i.types[op].bitfield.imm32s = 1;
5507 i.types[op].bitfield.imm64 = 1;
29b0f896 5508 break;
252b5132 5509 }
252b5132 5510
29b0f896
AM
5511 /* If this operand is at most 16 bits, convert it
5512 to a signed 16 bit number before trying to see
5513 whether it will fit in an even smaller size.
5514 This allows a 16-bit operand such as $0xffe0 to
5515 be recognised as within Imm8S range. */
40fb9820 5516 if ((i.types[op].bitfield.imm16)
29b0f896 5517 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5518 {
29b0f896
AM
5519 i.op[op].imms->X_add_number =
5520 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
5521 }
a28def75
L
5522#ifdef BFD64
5523 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5524 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5525 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5526 == 0))
5527 {
5528 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5529 ^ ((offsetT) 1 << 31))
5530 - ((offsetT) 1 << 31));
5531 }
a28def75 5532#endif
40fb9820 5533 i.types[op]
c6fb90c8
L
5534 = operand_type_or (i.types[op],
5535 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5536
29b0f896
AM
5537 /* We must avoid matching of Imm32 templates when 64bit
5538 only immediate is available. */
5539 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5540 i.types[op].bitfield.imm32 = 0;
29b0f896 5541 break;
252b5132 5542
29b0f896
AM
5543 case O_absent:
5544 case O_register:
5545 abort ();
5546
5547 /* Symbols and expressions. */
5548 default:
9cd96992
JB
5549 /* Convert symbolic operand to proper sizes for matching, but don't
5550 prevent matching a set of insns that only supports sizes other
5551 than those matching the insn suffix. */
5552 {
40fb9820 5553 i386_operand_type mask, allowed;
d3ce72d0 5554 const insn_template *t;
9cd96992 5555
0dfbf9d7
L
5556 operand_type_set (&mask, 0);
5557 operand_type_set (&allowed, 0);
40fb9820 5558
4eed87de
AM
5559 for (t = current_templates->start;
5560 t < current_templates->end;
5561 ++t)
bab6aec1
JB
5562 {
5563 allowed = operand_type_or (allowed, t->operand_types[op]);
5564 allowed = operand_type_and (allowed, anyimm);
5565 }
9cd96992
JB
5566 switch (guess_suffix)
5567 {
5568 case QWORD_MNEM_SUFFIX:
40fb9820
L
5569 mask.bitfield.imm64 = 1;
5570 mask.bitfield.imm32s = 1;
9cd96992
JB
5571 break;
5572 case LONG_MNEM_SUFFIX:
40fb9820 5573 mask.bitfield.imm32 = 1;
9cd96992
JB
5574 break;
5575 case WORD_MNEM_SUFFIX:
40fb9820 5576 mask.bitfield.imm16 = 1;
9cd96992
JB
5577 break;
5578 case BYTE_MNEM_SUFFIX:
40fb9820 5579 mask.bitfield.imm8 = 1;
9cd96992
JB
5580 break;
5581 default:
9cd96992
JB
5582 break;
5583 }
c6fb90c8 5584 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5585 if (!operand_type_all_zero (&allowed))
c6fb90c8 5586 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5587 }
29b0f896 5588 break;
252b5132 5589 }
29b0f896
AM
5590 }
5591}
47926f60 5592
29b0f896
AM
5593/* Try to use the smallest displacement type too. */
5594static void
e3bb37b5 5595optimize_disp (void)
29b0f896
AM
5596{
5597 int op;
3e73aa7c 5598
29b0f896 5599 for (op = i.operands; --op >= 0;)
40fb9820 5600 if (operand_type_check (i.types[op], disp))
252b5132 5601 {
b300c311 5602 if (i.op[op].disps->X_op == O_constant)
252b5132 5603 {
91d6fa6a 5604 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5605
40fb9820 5606 if (i.types[op].bitfield.disp16
91d6fa6a 5607 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
5608 {
5609 /* If this operand is at most 16 bits, convert
5610 to a signed 16 bit number and don't use 64bit
5611 displacement. */
91d6fa6a 5612 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 5613 i.types[op].bitfield.disp64 = 0;
b300c311 5614 }
a28def75
L
5615#ifdef BFD64
5616 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
40fb9820 5617 if (i.types[op].bitfield.disp32
91d6fa6a 5618 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
b300c311
L
5619 {
5620 /* If this operand is at most 32 bits, convert
5621 to a signed 32 bit number and don't use 64bit
5622 displacement. */
91d6fa6a
NC
5623 op_disp &= (((offsetT) 2 << 31) - 1);
5624 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 5625 i.types[op].bitfield.disp64 = 0;
b300c311 5626 }
a28def75 5627#endif
91d6fa6a 5628 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5629 {
40fb9820
L
5630 i.types[op].bitfield.disp8 = 0;
5631 i.types[op].bitfield.disp16 = 0;
5632 i.types[op].bitfield.disp32 = 0;
5633 i.types[op].bitfield.disp32s = 0;
5634 i.types[op].bitfield.disp64 = 0;
b300c311
L
5635 i.op[op].disps = 0;
5636 i.disp_operands--;
5637 }
5638 else if (flag_code == CODE_64BIT)
5639 {
91d6fa6a 5640 if (fits_in_signed_long (op_disp))
28a9d8f5 5641 {
40fb9820
L
5642 i.types[op].bitfield.disp64 = 0;
5643 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5644 }
0e1147d9 5645 if (i.prefix[ADDR_PREFIX]
91d6fa6a 5646 && fits_in_unsigned_long (op_disp))
40fb9820 5647 i.types[op].bitfield.disp32 = 1;
b300c311 5648 }
40fb9820
L
5649 if ((i.types[op].bitfield.disp32
5650 || i.types[op].bitfield.disp32s
5651 || i.types[op].bitfield.disp16)
b5014f7a 5652 && fits_in_disp8 (op_disp))
40fb9820 5653 i.types[op].bitfield.disp8 = 1;
252b5132 5654 }
67a4f2b7
AO
5655 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5656 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5657 {
5658 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5659 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
5660 i.types[op].bitfield.disp8 = 0;
5661 i.types[op].bitfield.disp16 = 0;
5662 i.types[op].bitfield.disp32 = 0;
5663 i.types[op].bitfield.disp32s = 0;
5664 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
5665 }
5666 else
b300c311 5667 /* We only support 64bit displacement on constants. */
40fb9820 5668 i.types[op].bitfield.disp64 = 0;
252b5132 5669 }
29b0f896
AM
5670}
5671
4a1b91ea
L
5672/* Return 1 if there is a match in broadcast bytes between operand
5673 GIVEN and instruction template T. */
5674
5675static INLINE int
5676match_broadcast_size (const insn_template *t, unsigned int given)
5677{
5678 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5679 && i.types[given].bitfield.byte)
5680 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5681 && i.types[given].bitfield.word)
5682 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5683 && i.types[given].bitfield.dword)
5684 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5685 && i.types[given].bitfield.qword));
5686}
5687
6c30d220
L
5688/* Check if operands are valid for the instruction. */
5689
5690static int
5691check_VecOperands (const insn_template *t)
5692{
43234a1e 5693 unsigned int op;
e2195274 5694 i386_cpu_flags cpu;
e2195274
JB
5695
5696 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5697 any one operand are implicity requiring AVX512VL support if the actual
5698 operand size is YMMword or XMMword. Since this function runs after
5699 template matching, there's no need to check for YMMword/XMMword in
5700 the template. */
5701 cpu = cpu_flags_and (t->cpu_flags, avx512);
5702 if (!cpu_flags_all_zero (&cpu)
5703 && !t->cpu_flags.bitfield.cpuavx512vl
5704 && !cpu_arch_flags.bitfield.cpuavx512vl)
5705 {
5706 for (op = 0; op < t->operands; ++op)
5707 {
5708 if (t->operand_types[op].bitfield.zmmword
5709 && (i.types[op].bitfield.ymmword
5710 || i.types[op].bitfield.xmmword))
5711 {
5712 i.error = unsupported;
5713 return 1;
5714 }
5715 }
5716 }
43234a1e 5717
6c30d220
L
5718 /* Without VSIB byte, we can't have a vector register for index. */
5719 if (!t->opcode_modifier.vecsib
5720 && i.index_reg
1b54b8d7
JB
5721 && (i.index_reg->reg_type.bitfield.xmmword
5722 || i.index_reg->reg_type.bitfield.ymmword
5723 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
5724 {
5725 i.error = unsupported_vector_index_register;
5726 return 1;
5727 }
5728
ad8ecc81
MZ
5729 /* Check if default mask is allowed. */
5730 if (t->opcode_modifier.nodefmask
5731 && (!i.mask || i.mask->mask->reg_num == 0))
5732 {
5733 i.error = no_default_mask;
5734 return 1;
5735 }
5736
7bab8ab5
JB
5737 /* For VSIB byte, we need a vector register for index, and all vector
5738 registers must be distinct. */
5739 if (t->opcode_modifier.vecsib)
5740 {
5741 if (!i.index_reg
6c30d220 5742 || !((t->opcode_modifier.vecsib == VecSIB128
1b54b8d7 5743 && i.index_reg->reg_type.bitfield.xmmword)
6c30d220 5744 || (t->opcode_modifier.vecsib == VecSIB256
1b54b8d7 5745 && i.index_reg->reg_type.bitfield.ymmword)
43234a1e 5746 || (t->opcode_modifier.vecsib == VecSIB512
1b54b8d7 5747 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
5748 {
5749 i.error = invalid_vsib_address;
5750 return 1;
5751 }
5752
43234a1e
L
5753 gas_assert (i.reg_operands == 2 || i.mask);
5754 if (i.reg_operands == 2 && !i.mask)
5755 {
3528c362 5756 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
5757 gas_assert (i.types[0].bitfield.xmmword
5758 || i.types[0].bitfield.ymmword);
3528c362 5759 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
5760 gas_assert (i.types[2].bitfield.xmmword
5761 || i.types[2].bitfield.ymmword);
43234a1e
L
5762 if (operand_check == check_none)
5763 return 0;
5764 if (register_number (i.op[0].regs)
5765 != register_number (i.index_reg)
5766 && register_number (i.op[2].regs)
5767 != register_number (i.index_reg)
5768 && register_number (i.op[0].regs)
5769 != register_number (i.op[2].regs))
5770 return 0;
5771 if (operand_check == check_error)
5772 {
5773 i.error = invalid_vector_register_set;
5774 return 1;
5775 }
5776 as_warn (_("mask, index, and destination registers should be distinct"));
5777 }
8444f82a
MZ
5778 else if (i.reg_operands == 1 && i.mask)
5779 {
3528c362 5780 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
5781 && (i.types[1].bitfield.xmmword
5782 || i.types[1].bitfield.ymmword
5783 || i.types[1].bitfield.zmmword)
8444f82a
MZ
5784 && (register_number (i.op[1].regs)
5785 == register_number (i.index_reg)))
5786 {
5787 if (operand_check == check_error)
5788 {
5789 i.error = invalid_vector_register_set;
5790 return 1;
5791 }
5792 if (operand_check != check_none)
5793 as_warn (_("index and destination registers should be distinct"));
5794 }
5795 }
43234a1e 5796 }
7bab8ab5 5797
43234a1e
L
5798 /* Check if broadcast is supported by the instruction and is applied
5799 to the memory operand. */
5800 if (i.broadcast)
5801 {
8e6e0792 5802 i386_operand_type type, overlap;
43234a1e
L
5803
5804 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 5805 and its broadcast bytes match the memory operand. */
32546502 5806 op = i.broadcast->operand;
8e6e0792 5807 if (!t->opcode_modifier.broadcast
c48dadc9 5808 || !(i.flags[op] & Operand_Mem)
c39e5b26 5809 || (!i.types[op].bitfield.unspecified
4a1b91ea 5810 && !match_broadcast_size (t, op)))
43234a1e
L
5811 {
5812 bad_broadcast:
5813 i.error = unsupported_broadcast;
5814 return 1;
5815 }
8e6e0792 5816
4a1b91ea
L
5817 i.broadcast->bytes = ((1 << (t->opcode_modifier.broadcast - 1))
5818 * i.broadcast->type);
8e6e0792 5819 operand_type_set (&type, 0);
4a1b91ea 5820 switch (i.broadcast->bytes)
8e6e0792 5821 {
4a1b91ea
L
5822 case 2:
5823 type.bitfield.word = 1;
5824 break;
5825 case 4:
5826 type.bitfield.dword = 1;
5827 break;
8e6e0792
JB
5828 case 8:
5829 type.bitfield.qword = 1;
5830 break;
5831 case 16:
5832 type.bitfield.xmmword = 1;
5833 break;
5834 case 32:
5835 type.bitfield.ymmword = 1;
5836 break;
5837 case 64:
5838 type.bitfield.zmmword = 1;
5839 break;
5840 default:
5841 goto bad_broadcast;
5842 }
5843
5844 overlap = operand_type_and (type, t->operand_types[op]);
bc49bfd8
JB
5845 if (t->operand_types[op].bitfield.class == RegSIMD
5846 && t->operand_types[op].bitfield.byte
5847 + t->operand_types[op].bitfield.word
5848 + t->operand_types[op].bitfield.dword
5849 + t->operand_types[op].bitfield.qword > 1)
5850 {
5851 overlap.bitfield.xmmword = 0;
5852 overlap.bitfield.ymmword = 0;
5853 overlap.bitfield.zmmword = 0;
5854 }
8e6e0792
JB
5855 if (operand_type_all_zero (&overlap))
5856 goto bad_broadcast;
5857
5858 if (t->opcode_modifier.checkregsize)
5859 {
5860 unsigned int j;
5861
e2195274 5862 type.bitfield.baseindex = 1;
8e6e0792
JB
5863 for (j = 0; j < i.operands; ++j)
5864 {
5865 if (j != op
5866 && !operand_type_register_match(i.types[j],
5867 t->operand_types[j],
5868 type,
5869 t->operand_types[op]))
5870 goto bad_broadcast;
5871 }
5872 }
43234a1e
L
5873 }
5874 /* If broadcast is supported in this instruction, we need to check if
5875 operand of one-element size isn't specified without broadcast. */
5876 else if (t->opcode_modifier.broadcast && i.mem_operands)
5877 {
5878 /* Find memory operand. */
5879 for (op = 0; op < i.operands; op++)
8dc0818e 5880 if (i.flags[op] & Operand_Mem)
43234a1e
L
5881 break;
5882 gas_assert (op < i.operands);
5883 /* Check size of the memory operand. */
4a1b91ea 5884 if (match_broadcast_size (t, op))
43234a1e
L
5885 {
5886 i.error = broadcast_needed;
5887 return 1;
5888 }
5889 }
c39e5b26
JB
5890 else
5891 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
5892
5893 /* Check if requested masking is supported. */
ae2387fe 5894 if (i.mask)
43234a1e 5895 {
ae2387fe
JB
5896 switch (t->opcode_modifier.masking)
5897 {
5898 case BOTH_MASKING:
5899 break;
5900 case MERGING_MASKING:
5901 if (i.mask->zeroing)
5902 {
5903 case 0:
5904 i.error = unsupported_masking;
5905 return 1;
5906 }
5907 break;
5908 case DYNAMIC_MASKING:
5909 /* Memory destinations allow only merging masking. */
5910 if (i.mask->zeroing && i.mem_operands)
5911 {
5912 /* Find memory operand. */
5913 for (op = 0; op < i.operands; op++)
c48dadc9 5914 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
5915 break;
5916 gas_assert (op < i.operands);
5917 if (op == i.operands - 1)
5918 {
5919 i.error = unsupported_masking;
5920 return 1;
5921 }
5922 }
5923 break;
5924 default:
5925 abort ();
5926 }
43234a1e
L
5927 }
5928
5929 /* Check if masking is applied to dest operand. */
5930 if (i.mask && (i.mask->operand != (int) (i.operands - 1)))
5931 {
5932 i.error = mask_not_on_destination;
5933 return 1;
5934 }
5935
43234a1e
L
5936 /* Check RC/SAE. */
5937 if (i.rounding)
5938 {
a80195f1
JB
5939 if (!t->opcode_modifier.sae
5940 || (i.rounding->type != saeonly && !t->opcode_modifier.staticrounding))
43234a1e
L
5941 {
5942 i.error = unsupported_rc_sae;
5943 return 1;
5944 }
5945 /* If the instruction has several immediate operands and one of
5946 them is rounding, the rounding operand should be the last
5947 immediate operand. */
5948 if (i.imm_operands > 1
5949 && i.rounding->operand != (int) (i.imm_operands - 1))
7bab8ab5 5950 {
43234a1e 5951 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
5952 return 1;
5953 }
6c30d220
L
5954 }
5955
43234a1e 5956 /* Check vector Disp8 operand. */
b5014f7a
JB
5957 if (t->opcode_modifier.disp8memshift
5958 && i.disp_encoding != disp_encoding_32bit)
43234a1e
L
5959 {
5960 if (i.broadcast)
4a1b91ea 5961 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 5962 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 5963 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
5964 else
5965 {
5966 const i386_operand_type *type = NULL;
5967
5968 i.memshift = 0;
5969 for (op = 0; op < i.operands; op++)
8dc0818e 5970 if (i.flags[op] & Operand_Mem)
7091c612 5971 {
4174bfff
JB
5972 if (t->opcode_modifier.evex == EVEXLIG)
5973 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
5974 else if (t->operand_types[op].bitfield.xmmword
5975 + t->operand_types[op].bitfield.ymmword
5976 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
5977 type = &t->operand_types[op];
5978 else if (!i.types[op].bitfield.unspecified)
5979 type = &i.types[op];
5980 }
3528c362 5981 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 5982 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
5983 {
5984 if (i.types[op].bitfield.zmmword)
5985 i.memshift = 6;
5986 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
5987 i.memshift = 5;
5988 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
5989 i.memshift = 4;
5990 }
5991
5992 if (type)
5993 {
5994 if (type->bitfield.zmmword)
5995 i.memshift = 6;
5996 else if (type->bitfield.ymmword)
5997 i.memshift = 5;
5998 else if (type->bitfield.xmmword)
5999 i.memshift = 4;
6000 }
6001
6002 /* For the check in fits_in_disp8(). */
6003 if (i.memshift == 0)
6004 i.memshift = -1;
6005 }
43234a1e
L
6006
6007 for (op = 0; op < i.operands; op++)
6008 if (operand_type_check (i.types[op], disp)
6009 && i.op[op].disps->X_op == O_constant)
6010 {
b5014f7a 6011 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 6012 {
b5014f7a
JB
6013 i.types[op].bitfield.disp8 = 1;
6014 return 0;
43234a1e 6015 }
b5014f7a 6016 i.types[op].bitfield.disp8 = 0;
43234a1e
L
6017 }
6018 }
b5014f7a
JB
6019
6020 i.memshift = 0;
43234a1e 6021
6c30d220
L
6022 return 0;
6023}
6024
43f3e2ee 6025/* Check if operands are valid for the instruction. Update VEX
a683cc34
SP
6026 operand types. */
6027
6028static int
6029VEX_check_operands (const insn_template *t)
6030{
86fa6981 6031 if (i.vec_encoding == vex_encoding_evex)
43234a1e 6032 {
86fa6981 6033 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 6034 if (!is_evex_encoding (t))
86fa6981
L
6035 {
6036 i.error = unsupported;
6037 return 1;
6038 }
6039 return 0;
43234a1e
L
6040 }
6041
a683cc34 6042 if (!t->opcode_modifier.vex)
86fa6981
L
6043 {
6044 /* This instruction template doesn't have VEX prefix. */
6045 if (i.vec_encoding != vex_encoding_default)
6046 {
6047 i.error = unsupported;
6048 return 1;
6049 }
6050 return 0;
6051 }
a683cc34 6052
9d3bf266
JB
6053 /* Check the special Imm4 cases; must be the first operand. */
6054 if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)
a683cc34
SP
6055 {
6056 if (i.op[0].imms->X_op != O_constant
6057 || !fits_in_imm4 (i.op[0].imms->X_add_number))
891edac4 6058 {
a65babc9 6059 i.error = bad_imm4;
891edac4
L
6060 return 1;
6061 }
a683cc34 6062
9d3bf266
JB
6063 /* Turn off Imm<N> so that update_imm won't complain. */
6064 operand_type_set (&i.types[0], 0);
a683cc34
SP
6065 }
6066
6067 return 0;
6068}
6069
d3ce72d0 6070static const insn_template *
83b16ac6 6071match_template (char mnem_suffix)
29b0f896
AM
6072{
6073 /* Points to template once we've found it. */
d3ce72d0 6074 const insn_template *t;
40fb9820 6075 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 6076 i386_operand_type overlap4;
29b0f896 6077 unsigned int found_reverse_match;
dc2be329 6078 i386_opcode_modifier suffix_check;
40fb9820 6079 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 6080 int addr_prefix_disp;
45a4bb20 6081 unsigned int j, size_match, check_register;
5614d22c 6082 enum i386_error specific_error = 0;
29b0f896 6083
c0f3af97
L
6084#if MAX_OPERANDS != 5
6085# error "MAX_OPERANDS must be 5."
f48ff2ae
L
6086#endif
6087
29b0f896 6088 found_reverse_match = 0;
539e75ad 6089 addr_prefix_disp = -1;
40fb9820 6090
dc2be329 6091 /* Prepare for mnemonic suffix check. */
40fb9820 6092 memset (&suffix_check, 0, sizeof (suffix_check));
dc2be329
L
6093 switch (mnem_suffix)
6094 {
6095 case BYTE_MNEM_SUFFIX:
6096 suffix_check.no_bsuf = 1;
6097 break;
6098 case WORD_MNEM_SUFFIX:
6099 suffix_check.no_wsuf = 1;
6100 break;
6101 case SHORT_MNEM_SUFFIX:
6102 suffix_check.no_ssuf = 1;
6103 break;
6104 case LONG_MNEM_SUFFIX:
6105 suffix_check.no_lsuf = 1;
6106 break;
6107 case QWORD_MNEM_SUFFIX:
6108 suffix_check.no_qsuf = 1;
6109 break;
6110 default:
6111 /* NB: In Intel syntax, normally we can check for memory operand
6112 size when there is no mnemonic suffix. But jmp and call have
6113 2 different encodings with Dword memory operand size, one with
6114 No_ldSuf and the other without. i.suffix is set to
6115 LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
6116 if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
6117 suffix_check.no_ldsuf = 1;
83b16ac6
JB
6118 }
6119
01559ecc
L
6120 /* Must have right number of operands. */
6121 i.error = number_of_operands_mismatch;
6122
45aa61fe 6123 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 6124 {
539e75ad 6125 addr_prefix_disp = -1;
dbbc8b7e 6126 found_reverse_match = 0;
539e75ad 6127
29b0f896
AM
6128 if (i.operands != t->operands)
6129 continue;
6130
50aecf8c 6131 /* Check processor support. */
a65babc9 6132 i.error = unsupported;
45a4bb20 6133 if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH)
50aecf8c
L
6134 continue;
6135
e1d4d893 6136 /* Check AT&T mnemonic. */
a65babc9 6137 i.error = unsupported_with_intel_mnemonic;
e1d4d893 6138 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
6139 continue;
6140
4b5aaf5f 6141 /* Check AT&T/Intel syntax. */
a65babc9 6142 i.error = unsupported_syntax;
5c07affc 6143 if ((intel_syntax && t->opcode_modifier.attsyntax)
4b5aaf5f 6144 || (!intel_syntax && t->opcode_modifier.intelsyntax))
1efbbeb4
L
6145 continue;
6146
4b5aaf5f
L
6147 /* Check Intel64/AMD64 ISA. */
6148 switch (isa64)
6149 {
6150 default:
6151 /* Default: Don't accept Intel64. */
6152 if (t->opcode_modifier.isa64 == INTEL64)
6153 continue;
6154 break;
6155 case amd64:
6156 /* -mamd64: Don't accept Intel64 and Intel64 only. */
6157 if (t->opcode_modifier.isa64 >= INTEL64)
6158 continue;
6159 break;
6160 case intel64:
6161 /* -mintel64: Don't accept AMD64. */
5990e377 6162 if (t->opcode_modifier.isa64 == AMD64 && flag_code == CODE_64BIT)
4b5aaf5f
L
6163 continue;
6164 break;
6165 }
6166
dc2be329 6167 /* Check the suffix. */
a65babc9 6168 i.error = invalid_instruction_suffix;
dc2be329
L
6169 if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
6170 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
6171 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
6172 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
6173 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
6174 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
83b16ac6 6175 continue;
29b0f896 6176
3ac21baa
JB
6177 size_match = operand_size_match (t);
6178 if (!size_match)
7d5e4556 6179 continue;
539e75ad 6180
6f2f06be
JB
6181 /* This is intentionally not
6182
0cfa3eb3 6183 if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
6f2f06be
JB
6184
6185 as the case of a missing * on the operand is accepted (perhaps with
6186 a warning, issued further down). */
0cfa3eb3 6187 if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
6f2f06be
JB
6188 {
6189 i.error = operand_type_mismatch;
6190 continue;
6191 }
6192
5c07affc
L
6193 for (j = 0; j < MAX_OPERANDS; j++)
6194 operand_types[j] = t->operand_types[j];
6195
e365e234
JB
6196 /* In general, don't allow
6197 - 64-bit operands outside of 64-bit mode,
6198 - 32-bit operands on pre-386. */
4873e243 6199 j = i.imm_operands + (t->operands > i.imm_operands + 1);
e365e234
JB
6200 if (((i.suffix == QWORD_MNEM_SUFFIX
6201 && flag_code != CODE_64BIT
6202 && (t->base_opcode != 0x0fc7
6203 || t->extension_opcode != 1 /* cmpxchg8b */))
6204 || (i.suffix == LONG_MNEM_SUFFIX
6205 && !cpu_arch_flags.bitfield.cpui386))
45aa61fe 6206 && (intel_syntax
3cd7f3e3 6207 ? (t->opcode_modifier.mnemonicsize != IGNORESIZE
45aa61fe
AM
6208 && !intel_float_operand (t->name))
6209 : intel_float_operand (t->name) != 2)
4873e243
JB
6210 && (t->operands == i.imm_operands
6211 || (operand_types[i.imm_operands].bitfield.class != RegMMX
6212 && operand_types[i.imm_operands].bitfield.class != RegSIMD
6213 && operand_types[i.imm_operands].bitfield.class != RegMask)
6214 || (operand_types[j].bitfield.class != RegMMX
6215 && operand_types[j].bitfield.class != RegSIMD
6216 && operand_types[j].bitfield.class != RegMask))
6217 && !t->opcode_modifier.vecsib)
192dc9c6
JB
6218 continue;
6219
29b0f896 6220 /* Do not verify operands when there are none. */
e365e234
JB
6221 if (!t->operands)
6222 /* We've found a match; break out of loop. */
6223 break;
252b5132 6224
48bcea9f
JB
6225 if (!t->opcode_modifier.jump
6226 || t->opcode_modifier.jump == JUMP_ABSOLUTE)
6227 {
6228 /* There should be only one Disp operand. */
6229 for (j = 0; j < MAX_OPERANDS; j++)
6230 if (operand_type_check (operand_types[j], disp))
539e75ad 6231 break;
48bcea9f
JB
6232 if (j < MAX_OPERANDS)
6233 {
6234 bfd_boolean override = (i.prefix[ADDR_PREFIX] != 0);
6235
6236 addr_prefix_disp = j;
6237
6238 /* Address size prefix will turn Disp64/Disp32S/Disp32/Disp16
6239 operand into Disp32/Disp32/Disp16/Disp32 operand. */
6240 switch (flag_code)
40fb9820 6241 {
48bcea9f
JB
6242 case CODE_16BIT:
6243 override = !override;
6244 /* Fall through. */
6245 case CODE_32BIT:
6246 if (operand_types[j].bitfield.disp32
6247 && operand_types[j].bitfield.disp16)
40fb9820 6248 {
48bcea9f
JB
6249 operand_types[j].bitfield.disp16 = override;
6250 operand_types[j].bitfield.disp32 = !override;
40fb9820 6251 }
48bcea9f
JB
6252 operand_types[j].bitfield.disp32s = 0;
6253 operand_types[j].bitfield.disp64 = 0;
6254 break;
6255
6256 case CODE_64BIT:
6257 if (operand_types[j].bitfield.disp32s
6258 || operand_types[j].bitfield.disp64)
40fb9820 6259 {
48bcea9f
JB
6260 operand_types[j].bitfield.disp64 &= !override;
6261 operand_types[j].bitfield.disp32s &= !override;
6262 operand_types[j].bitfield.disp32 = override;
40fb9820 6263 }
48bcea9f
JB
6264 operand_types[j].bitfield.disp16 = 0;
6265 break;
40fb9820 6266 }
539e75ad 6267 }
48bcea9f 6268 }
539e75ad 6269
02a86693
L
6270 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
6271 if (i.reloc[0] == BFD_RELOC_386_GOT32 && t->base_opcode == 0xa0)
6272 continue;
6273
56ffb741 6274 /* We check register size if needed. */
e2195274
JB
6275 if (t->opcode_modifier.checkregsize)
6276 {
6277 check_register = (1 << t->operands) - 1;
6278 if (i.broadcast)
6279 check_register &= ~(1 << i.broadcast->operand);
6280 }
6281 else
6282 check_register = 0;
6283
c6fb90c8 6284 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
6285 switch (t->operands)
6286 {
6287 case 1:
40fb9820 6288 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
6289 continue;
6290 break;
6291 case 2:
33eaf5de 6292 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
6293 only in 32bit mode and we can use opcode 0x90. In 64bit
6294 mode, we can't use 0x90 for xchg %eax, %eax since it should
6295 zero-extend %eax to %rax. */
6296 if (flag_code == CODE_64BIT
6297 && t->base_opcode == 0x90
75e5731b
JB
6298 && i.types[0].bitfield.instance == Accum
6299 && i.types[0].bitfield.dword
6300 && i.types[1].bitfield.instance == Accum
6301 && i.types[1].bitfield.dword)
8b38ad71 6302 continue;
1212781b
JB
6303 /* xrelease mov %eax, <disp> is another special case. It must not
6304 match the accumulator-only encoding of mov. */
6305 if (flag_code != CODE_64BIT
6306 && i.hle_prefix
6307 && t->base_opcode == 0xa0
75e5731b 6308 && i.types[0].bitfield.instance == Accum
8dc0818e 6309 && (i.flags[1] & Operand_Mem))
1212781b 6310 continue;
f5eb1d70
JB
6311 /* Fall through. */
6312
6313 case 3:
3ac21baa
JB
6314 if (!(size_match & MATCH_STRAIGHT))
6315 goto check_reverse;
64c49ab3
JB
6316 /* Reverse direction of operands if swapping is possible in the first
6317 place (operands need to be symmetric) and
6318 - the load form is requested, and the template is a store form,
6319 - the store form is requested, and the template is a load form,
6320 - the non-default (swapped) form is requested. */
6321 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 6322 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
6323 && !operand_type_all_zero (&overlap1))
6324 switch (i.dir_encoding)
6325 {
6326 case dir_encoding_load:
6327 if (operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6328 || t->opcode_modifier.regmem)
64c49ab3
JB
6329 goto check_reverse;
6330 break;
6331
6332 case dir_encoding_store:
6333 if (!operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6334 && !t->opcode_modifier.regmem)
64c49ab3
JB
6335 goto check_reverse;
6336 break;
6337
6338 case dir_encoding_swap:
6339 goto check_reverse;
6340
6341 case dir_encoding_default:
6342 break;
6343 }
86fa6981 6344 /* If we want store form, we skip the current load. */
64c49ab3
JB
6345 if ((i.dir_encoding == dir_encoding_store
6346 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
6347 && i.mem_operands == 0
6348 && t->opcode_modifier.load)
fa99fab2 6349 continue;
1a0670f3 6350 /* Fall through. */
f48ff2ae 6351 case 4:
c0f3af97 6352 case 5:
c6fb90c8 6353 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
6354 if (!operand_type_match (overlap0, i.types[0])
6355 || !operand_type_match (overlap1, i.types[1])
e2195274 6356 || ((check_register & 3) == 3
dc821c5f 6357 && !operand_type_register_match (i.types[0],
40fb9820 6358 operand_types[0],
dc821c5f 6359 i.types[1],
40fb9820 6360 operand_types[1])))
29b0f896
AM
6361 {
6362 /* Check if other direction is valid ... */
38e314eb 6363 if (!t->opcode_modifier.d)
29b0f896
AM
6364 continue;
6365
dc1e8a47 6366 check_reverse:
3ac21baa
JB
6367 if (!(size_match & MATCH_REVERSE))
6368 continue;
29b0f896 6369 /* Try reversing direction of operands. */
f5eb1d70
JB
6370 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
6371 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 6372 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 6373 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 6374 || (check_register
dc821c5f 6375 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
6376 operand_types[i.operands - 1],
6377 i.types[i.operands - 1],
45664ddb 6378 operand_types[0])))
29b0f896
AM
6379 {
6380 /* Does not match either direction. */
6381 continue;
6382 }
38e314eb 6383 /* found_reverse_match holds which of D or FloatR
29b0f896 6384 we've found. */
38e314eb
JB
6385 if (!t->opcode_modifier.d)
6386 found_reverse_match = 0;
6387 else if (operand_types[0].bitfield.tbyte)
8a2ed489 6388 found_reverse_match = Opcode_FloatD;
dbbc8b7e 6389 else if (operand_types[0].bitfield.xmmword
f5eb1d70 6390 || operand_types[i.operands - 1].bitfield.xmmword
3528c362
JB
6391 || operand_types[0].bitfield.class == RegMMX
6392 || operand_types[i.operands - 1].bitfield.class == RegMMX
dbbc8b7e
JB
6393 || is_any_vex_encoding(t))
6394 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
6395 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 6396 else
38e314eb 6397 found_reverse_match = Opcode_D;
40fb9820 6398 if (t->opcode_modifier.floatr)
8a2ed489 6399 found_reverse_match |= Opcode_FloatR;
29b0f896 6400 }
f48ff2ae 6401 else
29b0f896 6402 {
f48ff2ae 6403 /* Found a forward 2 operand match here. */
d1cbb4db
L
6404 switch (t->operands)
6405 {
c0f3af97
L
6406 case 5:
6407 overlap4 = operand_type_and (i.types[4],
6408 operand_types[4]);
1a0670f3 6409 /* Fall through. */
d1cbb4db 6410 case 4:
c6fb90c8
L
6411 overlap3 = operand_type_and (i.types[3],
6412 operand_types[3]);
1a0670f3 6413 /* Fall through. */
d1cbb4db 6414 case 3:
c6fb90c8
L
6415 overlap2 = operand_type_and (i.types[2],
6416 operand_types[2]);
d1cbb4db
L
6417 break;
6418 }
29b0f896 6419
f48ff2ae
L
6420 switch (t->operands)
6421 {
c0f3af97
L
6422 case 5:
6423 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 6424 || !operand_type_register_match (i.types[3],
c0f3af97 6425 operand_types[3],
c0f3af97
L
6426 i.types[4],
6427 operand_types[4]))
6428 continue;
1a0670f3 6429 /* Fall through. */
f48ff2ae 6430 case 4:
40fb9820 6431 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
6432 || ((check_register & 0xa) == 0xa
6433 && !operand_type_register_match (i.types[1],
f7768225
JB
6434 operand_types[1],
6435 i.types[3],
e2195274
JB
6436 operand_types[3]))
6437 || ((check_register & 0xc) == 0xc
6438 && !operand_type_register_match (i.types[2],
6439 operand_types[2],
6440 i.types[3],
6441 operand_types[3])))
f48ff2ae 6442 continue;
1a0670f3 6443 /* Fall through. */
f48ff2ae
L
6444 case 3:
6445 /* Here we make use of the fact that there are no
23e42951 6446 reverse match 3 operand instructions. */
40fb9820 6447 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
6448 || ((check_register & 5) == 5
6449 && !operand_type_register_match (i.types[0],
23e42951
JB
6450 operand_types[0],
6451 i.types[2],
e2195274
JB
6452 operand_types[2]))
6453 || ((check_register & 6) == 6
6454 && !operand_type_register_match (i.types[1],
6455 operand_types[1],
6456 i.types[2],
6457 operand_types[2])))
f48ff2ae
L
6458 continue;
6459 break;
6460 }
29b0f896 6461 }
f48ff2ae 6462 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
6463 slip through to break. */
6464 }
c0f3af97 6465
5614d22c
JB
6466 /* Check if vector and VEX operands are valid. */
6467 if (check_VecOperands (t) || VEX_check_operands (t))
6468 {
6469 specific_error = i.error;
6470 continue;
6471 }
a683cc34 6472
29b0f896
AM
6473 /* We've found a match; break out of loop. */
6474 break;
6475 }
6476
6477 if (t == current_templates->end)
6478 {
6479 /* We found no match. */
a65babc9 6480 const char *err_msg;
5614d22c 6481 switch (specific_error ? specific_error : i.error)
a65babc9
L
6482 {
6483 default:
6484 abort ();
86e026a4 6485 case operand_size_mismatch:
a65babc9
L
6486 err_msg = _("operand size mismatch");
6487 break;
6488 case operand_type_mismatch:
6489 err_msg = _("operand type mismatch");
6490 break;
6491 case register_type_mismatch:
6492 err_msg = _("register type mismatch");
6493 break;
6494 case number_of_operands_mismatch:
6495 err_msg = _("number of operands mismatch");
6496 break;
6497 case invalid_instruction_suffix:
6498 err_msg = _("invalid instruction suffix");
6499 break;
6500 case bad_imm4:
4a2608e3 6501 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6502 break;
a65babc9
L
6503 case unsupported_with_intel_mnemonic:
6504 err_msg = _("unsupported with Intel mnemonic");
6505 break;
6506 case unsupported_syntax:
6507 err_msg = _("unsupported syntax");
6508 break;
6509 case unsupported:
35262a23 6510 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6511 current_templates->start->name);
6512 return NULL;
6c30d220
L
6513 case invalid_vsib_address:
6514 err_msg = _("invalid VSIB address");
6515 break;
7bab8ab5
JB
6516 case invalid_vector_register_set:
6517 err_msg = _("mask, index, and destination registers must be distinct");
6518 break;
6c30d220
L
6519 case unsupported_vector_index_register:
6520 err_msg = _("unsupported vector index register");
6521 break;
43234a1e
L
6522 case unsupported_broadcast:
6523 err_msg = _("unsupported broadcast");
6524 break;
43234a1e
L
6525 case broadcast_needed:
6526 err_msg = _("broadcast is needed for operand of such type");
6527 break;
6528 case unsupported_masking:
6529 err_msg = _("unsupported masking");
6530 break;
6531 case mask_not_on_destination:
6532 err_msg = _("mask not on destination operand");
6533 break;
6534 case no_default_mask:
6535 err_msg = _("default mask isn't allowed");
6536 break;
6537 case unsupported_rc_sae:
6538 err_msg = _("unsupported static rounding/sae");
6539 break;
6540 case rc_sae_operand_not_last_imm:
6541 if (intel_syntax)
6542 err_msg = _("RC/SAE operand must precede immediate operands");
6543 else
6544 err_msg = _("RC/SAE operand must follow immediate operands");
6545 break;
6546 case invalid_register_operand:
6547 err_msg = _("invalid register operand");
6548 break;
a65babc9
L
6549 }
6550 as_bad (_("%s for `%s'"), err_msg,
891edac4 6551 current_templates->start->name);
fa99fab2 6552 return NULL;
29b0f896 6553 }
252b5132 6554
29b0f896
AM
6555 if (!quiet_warnings)
6556 {
6557 if (!intel_syntax
0cfa3eb3 6558 && (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE)))
6f2f06be 6559 as_warn (_("indirect %s without `*'"), t->name);
29b0f896 6560
40fb9820 6561 if (t->opcode_modifier.isprefix
3cd7f3e3 6562 && t->opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6563 {
6564 /* Warn them that a data or address size prefix doesn't
6565 affect assembly of the next line of code. */
6566 as_warn (_("stand-alone `%s' prefix"), t->name);
6567 }
6568 }
6569
6570 /* Copy the template we found. */
6571 i.tm = *t;
539e75ad
L
6572
6573 if (addr_prefix_disp != -1)
6574 i.tm.operand_types[addr_prefix_disp]
6575 = operand_types[addr_prefix_disp];
6576
29b0f896
AM
6577 if (found_reverse_match)
6578 {
dfd69174
JB
6579 /* If we found a reverse match we must alter the opcode direction
6580 bit and clear/flip the regmem modifier one. found_reverse_match
6581 holds bits to change (different for int & float insns). */
29b0f896
AM
6582
6583 i.tm.base_opcode ^= found_reverse_match;
6584
f5eb1d70
JB
6585 i.tm.operand_types[0] = operand_types[i.operands - 1];
6586 i.tm.operand_types[i.operands - 1] = operand_types[0];
dfd69174
JB
6587
6588 /* Certain SIMD insns have their load forms specified in the opcode
6589 table, and hence we need to _set_ RegMem instead of clearing it.
6590 We need to avoid setting the bit though on insns like KMOVW. */
6591 i.tm.opcode_modifier.regmem
6592 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
6593 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
6594 && !i.tm.opcode_modifier.regmem;
29b0f896
AM
6595 }
6596
fa99fab2 6597 return t;
29b0f896
AM
6598}
6599
6600static int
e3bb37b5 6601check_string (void)
29b0f896 6602{
51c8edf6
JB
6603 unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
6604 unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
8dc0818e 6605
51c8edf6 6606 if (i.seg[op] != NULL && i.seg[op] != &es)
29b0f896 6607 {
51c8edf6
JB
6608 as_bad (_("`%s' operand %u must use `%ses' segment"),
6609 i.tm.name,
6610 intel_syntax ? i.tm.operands - es_op : es_op + 1,
6611 register_prefix);
6612 return 0;
29b0f896 6613 }
51c8edf6
JB
6614
6615 /* There's only ever one segment override allowed per instruction.
6616 This instruction possibly has a legal segment override on the
6617 second operand, so copy the segment to where non-string
6618 instructions store it, allowing common code. */
6619 i.seg[op] = i.seg[1];
6620
29b0f896
AM
6621 return 1;
6622}
6623
6624static int
543613e9 6625process_suffix (void)
29b0f896
AM
6626{
6627 /* If matched instruction specifies an explicit instruction mnemonic
6628 suffix, use it. */
673fe0f0 6629 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6630 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6631 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6632 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6633 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6634 i.suffix = QWORD_MNEM_SUFFIX;
13e600d0 6635 else if (i.reg_operands
c8f8eebc
JB
6636 && (i.operands > 1 || i.types[0].bitfield.class == Reg)
6637 && !i.tm.opcode_modifier.addrprefixopreg)
29b0f896 6638 {
65fca059
JB
6639 unsigned int numop = i.operands;
6640
6641 /* movsx/movzx want only their source operand considered here, for the
6642 ambiguity checking below. The suffix will be replaced afterwards
6643 to represent the destination (register). */
6644 if (((i.tm.base_opcode | 8) == 0xfbe && i.tm.opcode_modifier.w)
6645 || (i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64))
6646 --i.operands;
6647
643bb870
JB
6648 /* crc32 needs REX.W set regardless of suffix / source operand size. */
6649 if (i.tm.base_opcode == 0xf20f38f0
6650 && i.tm.operand_types[1].bitfield.qword)
6651 i.rex |= REX_W;
6652
29b0f896 6653 /* If there's no instruction mnemonic suffix we try to invent one
13e600d0 6654 based on GPR operands. */
29b0f896
AM
6655 if (!i.suffix)
6656 {
6657 /* We take i.suffix from the last register operand specified,
6658 Destination register type is more significant than source
381d071f
L
6659 register type. crc32 in SSE4.2 prefers source register
6660 type. */
1a035124 6661 unsigned int op = i.tm.base_opcode != 0xf20f38f0 ? i.operands : 1;
20592a94 6662
1a035124
JB
6663 while (op--)
6664 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
6665 || i.tm.operand_types[op].bitfield.instance == Accum)
6666 {
6667 if (i.types[op].bitfield.class != Reg)
6668 continue;
6669 if (i.types[op].bitfield.byte)
6670 i.suffix = BYTE_MNEM_SUFFIX;
6671 else if (i.types[op].bitfield.word)
6672 i.suffix = WORD_MNEM_SUFFIX;
6673 else if (i.types[op].bitfield.dword)
6674 i.suffix = LONG_MNEM_SUFFIX;
6675 else if (i.types[op].bitfield.qword)
6676 i.suffix = QWORD_MNEM_SUFFIX;
6677 else
6678 continue;
6679 break;
6680 }
65fca059
JB
6681
6682 /* As an exception, movsx/movzx silently default to a byte source
6683 in AT&T mode. */
6684 if ((i.tm.base_opcode | 8) == 0xfbe && i.tm.opcode_modifier.w
6685 && !i.suffix && !intel_syntax)
6686 i.suffix = BYTE_MNEM_SUFFIX;
29b0f896
AM
6687 }
6688 else if (i.suffix == BYTE_MNEM_SUFFIX)
6689 {
2eb952a4 6690 if (intel_syntax
3cd7f3e3 6691 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6692 && i.tm.opcode_modifier.no_bsuf)
6693 i.suffix = 0;
6694 else if (!check_byte_reg ())
29b0f896
AM
6695 return 0;
6696 }
6697 else if (i.suffix == LONG_MNEM_SUFFIX)
6698 {
2eb952a4 6699 if (intel_syntax
3cd7f3e3 6700 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6701 && i.tm.opcode_modifier.no_lsuf
6702 && !i.tm.opcode_modifier.todword
6703 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
6704 i.suffix = 0;
6705 else if (!check_long_reg ())
29b0f896
AM
6706 return 0;
6707 }
6708 else if (i.suffix == QWORD_MNEM_SUFFIX)
6709 {
955e1e6a 6710 if (intel_syntax
3cd7f3e3 6711 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6712 && i.tm.opcode_modifier.no_qsuf
6713 && !i.tm.opcode_modifier.todword
6714 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
6715 i.suffix = 0;
6716 else if (!check_qword_reg ())
29b0f896
AM
6717 return 0;
6718 }
6719 else if (i.suffix == WORD_MNEM_SUFFIX)
6720 {
2eb952a4 6721 if (intel_syntax
3cd7f3e3 6722 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6723 && i.tm.opcode_modifier.no_wsuf)
6724 i.suffix = 0;
6725 else if (!check_word_reg ())
29b0f896
AM
6726 return 0;
6727 }
3cd7f3e3
L
6728 else if (intel_syntax
6729 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6730 /* Do nothing if the instruction is going to ignore the prefix. */
6731 ;
6732 else
6733 abort ();
65fca059
JB
6734
6735 /* Undo the movsx/movzx change done above. */
6736 i.operands = numop;
29b0f896 6737 }
3cd7f3e3
L
6738 else if (i.tm.opcode_modifier.mnemonicsize == DEFAULTSIZE
6739 && !i.suffix)
29b0f896 6740 {
13e600d0
JB
6741 i.suffix = stackop_size;
6742 if (stackop_size == LONG_MNEM_SUFFIX)
06f74c5c
L
6743 {
6744 /* stackop_size is set to LONG_MNEM_SUFFIX for the
6745 .code16gcc directive to support 16-bit mode with
6746 32-bit address. For IRET without a suffix, generate
6747 16-bit IRET (opcode 0xcf) to return from an interrupt
6748 handler. */
13e600d0
JB
6749 if (i.tm.base_opcode == 0xcf)
6750 {
6751 i.suffix = WORD_MNEM_SUFFIX;
6752 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
6753 }
6754 /* Warn about changed behavior for segment register push/pop. */
6755 else if ((i.tm.base_opcode | 1) == 0x07)
6756 as_warn (_("generating 32-bit `%s', unlike earlier gas versions"),
6757 i.tm.name);
06f74c5c 6758 }
29b0f896 6759 }
c006a730 6760 else if (!i.suffix
0cfa3eb3
JB
6761 && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
6762 || i.tm.opcode_modifier.jump == JUMP_BYTE
6763 || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
64e74474
AM
6764 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
6765 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
6766 {
6767 switch (flag_code)
6768 {
6769 case CODE_64BIT:
40fb9820 6770 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a
JB
6771 {
6772 i.suffix = QWORD_MNEM_SUFFIX;
6773 break;
6774 }
1a0670f3 6775 /* Fall through. */
9306ca4a 6776 case CODE_32BIT:
40fb9820 6777 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
6778 i.suffix = LONG_MNEM_SUFFIX;
6779 break;
6780 case CODE_16BIT:
40fb9820 6781 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
6782 i.suffix = WORD_MNEM_SUFFIX;
6783 break;
6784 }
6785 }
252b5132 6786
c006a730 6787 if (!i.suffix
3cd7f3e3 6788 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8
JB
6789 /* Also cover lret/retf/iret in 64-bit mode. */
6790 || (flag_code == CODE_64BIT
6791 && !i.tm.opcode_modifier.no_lsuf
6792 && !i.tm.opcode_modifier.no_qsuf))
3cd7f3e3 6793 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
62b3f548
JB
6794 /* Accept FLDENV et al without suffix. */
6795 && (i.tm.opcode_modifier.no_ssuf || i.tm.opcode_modifier.floatmf))
29b0f896 6796 {
6c0946d0 6797 unsigned int suffixes, evex = 0;
c006a730
JB
6798
6799 suffixes = !i.tm.opcode_modifier.no_bsuf;
6800 if (!i.tm.opcode_modifier.no_wsuf)
6801 suffixes |= 1 << 1;
6802 if (!i.tm.opcode_modifier.no_lsuf)
6803 suffixes |= 1 << 2;
6804 if (!i.tm.opcode_modifier.no_ldsuf)
6805 suffixes |= 1 << 3;
6806 if (!i.tm.opcode_modifier.no_ssuf)
6807 suffixes |= 1 << 4;
6808 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
6809 suffixes |= 1 << 5;
6810
6c0946d0
JB
6811 /* For [XYZ]MMWORD operands inspect operand sizes. While generally
6812 also suitable for AT&T syntax mode, it was requested that this be
6813 restricted to just Intel syntax. */
b9915cbc 6814 if (intel_syntax && is_any_vex_encoding (&i.tm) && !i.broadcast)
6c0946d0 6815 {
b9915cbc 6816 unsigned int op;
6c0946d0 6817
b9915cbc 6818 for (op = 0; op < i.tm.operands; ++op)
6c0946d0 6819 {
b9915cbc
JB
6820 if (is_evex_encoding (&i.tm)
6821 && !cpu_arch_flags.bitfield.cpuavx512vl)
6c0946d0 6822 {
b9915cbc
JB
6823 if (i.tm.operand_types[op].bitfield.ymmword)
6824 i.tm.operand_types[op].bitfield.xmmword = 0;
6825 if (i.tm.operand_types[op].bitfield.zmmword)
6826 i.tm.operand_types[op].bitfield.ymmword = 0;
6827 if (!i.tm.opcode_modifier.evex
6828 || i.tm.opcode_modifier.evex == EVEXDYN)
6829 i.tm.opcode_modifier.evex = EVEX512;
6830 }
6c0946d0 6831
b9915cbc
JB
6832 if (i.tm.operand_types[op].bitfield.xmmword
6833 + i.tm.operand_types[op].bitfield.ymmword
6834 + i.tm.operand_types[op].bitfield.zmmword < 2)
6835 continue;
6c0946d0 6836
b9915cbc
JB
6837 /* Any properly sized operand disambiguates the insn. */
6838 if (i.types[op].bitfield.xmmword
6839 || i.types[op].bitfield.ymmword
6840 || i.types[op].bitfield.zmmword)
6841 {
6842 suffixes &= ~(7 << 6);
6843 evex = 0;
6844 break;
6845 }
6c0946d0 6846
b9915cbc
JB
6847 if ((i.flags[op] & Operand_Mem)
6848 && i.tm.operand_types[op].bitfield.unspecified)
6849 {
6850 if (i.tm.operand_types[op].bitfield.xmmword)
6851 suffixes |= 1 << 6;
6852 if (i.tm.operand_types[op].bitfield.ymmword)
6853 suffixes |= 1 << 7;
6854 if (i.tm.operand_types[op].bitfield.zmmword)
6855 suffixes |= 1 << 8;
6856 if (is_evex_encoding (&i.tm))
6857 evex = EVEX512;
6c0946d0
JB
6858 }
6859 }
6860 }
6861
6862 /* Are multiple suffixes / operand sizes allowed? */
c006a730 6863 if (suffixes & (suffixes - 1))
9306ca4a 6864 {
873494c8 6865 if (intel_syntax
3cd7f3e3 6866 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8 6867 || operand_check == check_error))
9306ca4a 6868 {
c006a730 6869 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
9306ca4a
JB
6870 return 0;
6871 }
c006a730 6872 if (operand_check == check_error)
9306ca4a 6873 {
c006a730
JB
6874 as_bad (_("no instruction mnemonic suffix given and "
6875 "no register operands; can't size `%s'"), i.tm.name);
9306ca4a
JB
6876 return 0;
6877 }
c006a730 6878 if (operand_check == check_warning)
873494c8
JB
6879 as_warn (_("%s; using default for `%s'"),
6880 intel_syntax
6881 ? _("ambiguous operand size")
6882 : _("no instruction mnemonic suffix given and "
6883 "no register operands"),
6884 i.tm.name);
c006a730
JB
6885
6886 if (i.tm.opcode_modifier.floatmf)
6887 i.suffix = SHORT_MNEM_SUFFIX;
65fca059
JB
6888 else if ((i.tm.base_opcode | 8) == 0xfbe
6889 || (i.tm.base_opcode == 0x63
6890 && i.tm.cpu_flags.bitfield.cpu64))
6891 /* handled below */;
6c0946d0
JB
6892 else if (evex)
6893 i.tm.opcode_modifier.evex = evex;
c006a730
JB
6894 else if (flag_code == CODE_16BIT)
6895 i.suffix = WORD_MNEM_SUFFIX;
1a035124 6896 else if (!i.tm.opcode_modifier.no_lsuf)
c006a730 6897 i.suffix = LONG_MNEM_SUFFIX;
1a035124
JB
6898 else
6899 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a 6900 }
29b0f896 6901 }
252b5132 6902
65fca059
JB
6903 if ((i.tm.base_opcode | 8) == 0xfbe
6904 || (i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64))
6905 {
6906 /* In Intel syntax, movsx/movzx must have a "suffix" (checked above).
6907 In AT&T syntax, if there is no suffix (warned about above), the default
6908 will be byte extension. */
6909 if (i.tm.opcode_modifier.w && i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
6910 i.tm.base_opcode |= 1;
6911
6912 /* For further processing, the suffix should represent the destination
6913 (register). This is already the case when one was used with
6914 mov[sz][bw]*, but we need to replace it for mov[sz]x, or if there was
6915 no suffix to begin with. */
6916 if (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63 || !i.suffix)
6917 {
6918 if (i.types[1].bitfield.word)
6919 i.suffix = WORD_MNEM_SUFFIX;
6920 else if (i.types[1].bitfield.qword)
6921 i.suffix = QWORD_MNEM_SUFFIX;
6922 else
6923 i.suffix = LONG_MNEM_SUFFIX;
6924
6925 i.tm.opcode_modifier.w = 0;
6926 }
6927 }
6928
50128d0c
JB
6929 if (!i.tm.opcode_modifier.modrm && i.reg_operands && i.tm.operands < 3)
6930 i.short_form = (i.tm.operand_types[0].bitfield.class == Reg)
6931 != (i.tm.operand_types[1].bitfield.class == Reg);
6932
d2224064
JB
6933 /* Change the opcode based on the operand size given by i.suffix. */
6934 switch (i.suffix)
29b0f896 6935 {
d2224064
JB
6936 /* Size floating point instruction. */
6937 case LONG_MNEM_SUFFIX:
6938 if (i.tm.opcode_modifier.floatmf)
6939 {
6940 i.tm.base_opcode ^= 4;
6941 break;
6942 }
6943 /* fall through */
6944 case WORD_MNEM_SUFFIX:
6945 case QWORD_MNEM_SUFFIX:
29b0f896 6946 /* It's not a byte, select word/dword operation. */
40fb9820 6947 if (i.tm.opcode_modifier.w)
29b0f896 6948 {
50128d0c 6949 if (i.short_form)
29b0f896
AM
6950 i.tm.base_opcode |= 8;
6951 else
6952 i.tm.base_opcode |= 1;
6953 }
d2224064
JB
6954 /* fall through */
6955 case SHORT_MNEM_SUFFIX:
29b0f896
AM
6956 /* Now select between word & dword operations via the operand
6957 size prefix, except for instructions that will ignore this
6958 prefix anyway. */
c8f8eebc 6959 if (i.suffix != QWORD_MNEM_SUFFIX
3cd7f3e3 6960 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
c8f8eebc
JB
6961 && !i.tm.opcode_modifier.floatmf
6962 && !is_any_vex_encoding (&i.tm)
6963 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
6964 || (flag_code == CODE_64BIT
6965 && i.tm.opcode_modifier.jump == JUMP_BYTE)))
24eab124
AM
6966 {
6967 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 6968
0cfa3eb3 6969 if (i.tm.opcode_modifier.jump == JUMP_BYTE) /* jcxz, loop */
29b0f896 6970 prefix = ADDR_PREFIX_OPCODE;
252b5132 6971
29b0f896
AM
6972 if (!add_prefix (prefix))
6973 return 0;
24eab124 6974 }
252b5132 6975
29b0f896
AM
6976 /* Set mode64 for an operand. */
6977 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 6978 && flag_code == CODE_64BIT
d2224064 6979 && !i.tm.opcode_modifier.norex64
4ed21b58 6980 && !i.tm.opcode_modifier.vexw
46e883c5 6981 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
6982 need rex64. */
6983 && ! (i.operands == 2
6984 && i.tm.base_opcode == 0x90
6985 && i.tm.extension_opcode == None
75e5731b
JB
6986 && i.types[0].bitfield.instance == Accum
6987 && i.types[0].bitfield.qword
6988 && i.types[1].bitfield.instance == Accum
6989 && i.types[1].bitfield.qword))
d2224064 6990 i.rex |= REX_W;
3e73aa7c 6991
d2224064 6992 break;
29b0f896 6993 }
7ecd2f8b 6994
c8f8eebc 6995 if (i.tm.opcode_modifier.addrprefixopreg)
c0a30a9f 6996 {
c8f8eebc
JB
6997 gas_assert (!i.suffix);
6998 gas_assert (i.reg_operands);
c0a30a9f 6999
c8f8eebc
JB
7000 if (i.tm.operand_types[0].bitfield.instance == Accum
7001 || i.operands == 1)
7002 {
7003 /* The address size override prefix changes the size of the
7004 first operand. */
7005 if (flag_code == CODE_64BIT
7006 && i.op[0].regs->reg_type.bitfield.word)
7007 {
7008 as_bad (_("16-bit addressing unavailable for `%s'"),
7009 i.tm.name);
7010 return 0;
7011 }
7012
7013 if ((flag_code == CODE_32BIT
7014 ? i.op[0].regs->reg_type.bitfield.word
7015 : i.op[0].regs->reg_type.bitfield.dword)
7016 && !add_prefix (ADDR_PREFIX_OPCODE))
7017 return 0;
7018 }
c0a30a9f
L
7019 else
7020 {
c8f8eebc
JB
7021 /* Check invalid register operand when the address size override
7022 prefix changes the size of register operands. */
7023 unsigned int op;
7024 enum { need_word, need_dword, need_qword } need;
7025
7026 if (flag_code == CODE_32BIT)
7027 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
7028 else if (i.prefix[ADDR_PREFIX])
c0a30a9f
L
7029 need = need_dword;
7030 else
7031 need = flag_code == CODE_64BIT ? need_qword : need_word;
c0a30a9f 7032
c8f8eebc
JB
7033 for (op = 0; op < i.operands; op++)
7034 {
7035 if (i.types[op].bitfield.class != Reg)
7036 continue;
7037
7038 switch (need)
7039 {
7040 case need_word:
7041 if (i.op[op].regs->reg_type.bitfield.word)
7042 continue;
7043 break;
7044 case need_dword:
7045 if (i.op[op].regs->reg_type.bitfield.dword)
7046 continue;
7047 break;
7048 case need_qword:
7049 if (i.op[op].regs->reg_type.bitfield.qword)
7050 continue;
7051 break;
7052 }
7053
7054 as_bad (_("invalid register operand size for `%s'"),
7055 i.tm.name);
7056 return 0;
7057 }
7058 }
c0a30a9f
L
7059 }
7060
29b0f896
AM
7061 return 1;
7062}
3e73aa7c 7063
29b0f896 7064static int
543613e9 7065check_byte_reg (void)
29b0f896
AM
7066{
7067 int op;
543613e9 7068
29b0f896
AM
7069 for (op = i.operands; --op >= 0;)
7070 {
dc821c5f 7071 /* Skip non-register operands. */
bab6aec1 7072 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
7073 continue;
7074
29b0f896
AM
7075 /* If this is an eight bit register, it's OK. If it's the 16 or
7076 32 bit version of an eight bit register, we will just use the
7077 low portion, and that's OK too. */
dc821c5f 7078 if (i.types[op].bitfield.byte)
29b0f896
AM
7079 continue;
7080
5a819eb9 7081 /* I/O port address operands are OK too. */
75e5731b
JB
7082 if (i.tm.operand_types[op].bitfield.instance == RegD
7083 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
7084 continue;
7085
9706160a
JB
7086 /* crc32 only wants its source operand checked here. */
7087 if (i.tm.base_opcode == 0xf20f38f0 && op)
9344ff29
L
7088 continue;
7089
29b0f896 7090 /* Any other register is bad. */
bab6aec1 7091 if (i.types[op].bitfield.class == Reg
3528c362
JB
7092 || i.types[op].bitfield.class == RegMMX
7093 || i.types[op].bitfield.class == RegSIMD
00cee14f 7094 || i.types[op].bitfield.class == SReg
4a5c67ed
JB
7095 || i.types[op].bitfield.class == RegCR
7096 || i.types[op].bitfield.class == RegDR
7097 || i.types[op].bitfield.class == RegTR)
29b0f896 7098 {
a540244d
L
7099 as_bad (_("`%s%s' not allowed with `%s%c'"),
7100 register_prefix,
29b0f896
AM
7101 i.op[op].regs->reg_name,
7102 i.tm.name,
7103 i.suffix);
7104 return 0;
7105 }
7106 }
7107 return 1;
7108}
7109
7110static int
e3bb37b5 7111check_long_reg (void)
29b0f896
AM
7112{
7113 int op;
7114
7115 for (op = i.operands; --op >= 0;)
dc821c5f 7116 /* Skip non-register operands. */
bab6aec1 7117 if (i.types[op].bitfield.class != Reg)
dc821c5f 7118 continue;
29b0f896
AM
7119 /* Reject eight bit registers, except where the template requires
7120 them. (eg. movzb) */
dc821c5f 7121 else if (i.types[op].bitfield.byte
bab6aec1 7122 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7123 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7124 && (i.tm.operand_types[op].bitfield.word
7125 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7126 {
a540244d
L
7127 as_bad (_("`%s%s' not allowed with `%s%c'"),
7128 register_prefix,
29b0f896
AM
7129 i.op[op].regs->reg_name,
7130 i.tm.name,
7131 i.suffix);
7132 return 0;
7133 }
be4c5e58
L
7134 /* Error if the e prefix on a general reg is missing. */
7135 else if (i.types[op].bitfield.word
bab6aec1 7136 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7137 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7138 && i.tm.operand_types[op].bitfield.dword)
29b0f896 7139 {
be4c5e58
L
7140 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7141 register_prefix, i.op[op].regs->reg_name,
7142 i.suffix);
7143 return 0;
252b5132 7144 }
e4630f71 7145 /* Warn if the r prefix on a general reg is present. */
dc821c5f 7146 else if (i.types[op].bitfield.qword
bab6aec1 7147 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7148 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7149 && i.tm.operand_types[op].bitfield.dword)
252b5132 7150 {
34828aad 7151 if (intel_syntax
65fca059 7152 && i.tm.opcode_modifier.toqword
3528c362 7153 && i.types[0].bitfield.class != RegSIMD)
34828aad 7154 {
ca61edf2 7155 /* Convert to QWORD. We want REX byte. */
34828aad
L
7156 i.suffix = QWORD_MNEM_SUFFIX;
7157 }
7158 else
7159 {
2b5d6a91 7160 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7161 register_prefix, i.op[op].regs->reg_name,
7162 i.suffix);
7163 return 0;
7164 }
29b0f896
AM
7165 }
7166 return 1;
7167}
252b5132 7168
29b0f896 7169static int
e3bb37b5 7170check_qword_reg (void)
29b0f896
AM
7171{
7172 int op;
252b5132 7173
29b0f896 7174 for (op = i.operands; --op >= 0; )
dc821c5f 7175 /* Skip non-register operands. */
bab6aec1 7176 if (i.types[op].bitfield.class != Reg)
dc821c5f 7177 continue;
29b0f896
AM
7178 /* Reject eight bit registers, except where the template requires
7179 them. (eg. movzb) */
dc821c5f 7180 else if (i.types[op].bitfield.byte
bab6aec1 7181 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7182 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7183 && (i.tm.operand_types[op].bitfield.word
7184 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7185 {
a540244d
L
7186 as_bad (_("`%s%s' not allowed with `%s%c'"),
7187 register_prefix,
29b0f896
AM
7188 i.op[op].regs->reg_name,
7189 i.tm.name,
7190 i.suffix);
7191 return 0;
7192 }
e4630f71 7193 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
7194 else if ((i.types[op].bitfield.word
7195 || i.types[op].bitfield.dword)
bab6aec1 7196 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7197 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7198 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
7199 {
7200 /* Prohibit these changes in the 64bit mode, since the
7201 lowering is more complicated. */
34828aad 7202 if (intel_syntax
ca61edf2 7203 && i.tm.opcode_modifier.todword
3528c362 7204 && i.types[0].bitfield.class != RegSIMD)
34828aad 7205 {
ca61edf2 7206 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
7207 i.suffix = LONG_MNEM_SUFFIX;
7208 }
7209 else
7210 {
2b5d6a91 7211 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7212 register_prefix, i.op[op].regs->reg_name,
7213 i.suffix);
7214 return 0;
7215 }
252b5132 7216 }
29b0f896
AM
7217 return 1;
7218}
252b5132 7219
29b0f896 7220static int
e3bb37b5 7221check_word_reg (void)
29b0f896
AM
7222{
7223 int op;
7224 for (op = i.operands; --op >= 0;)
dc821c5f 7225 /* Skip non-register operands. */
bab6aec1 7226 if (i.types[op].bitfield.class != Reg)
dc821c5f 7227 continue;
29b0f896
AM
7228 /* Reject eight bit registers, except where the template requires
7229 them. (eg. movzb) */
dc821c5f 7230 else if (i.types[op].bitfield.byte
bab6aec1 7231 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7232 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7233 && (i.tm.operand_types[op].bitfield.word
7234 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7235 {
a540244d
L
7236 as_bad (_("`%s%s' not allowed with `%s%c'"),
7237 register_prefix,
29b0f896
AM
7238 i.op[op].regs->reg_name,
7239 i.tm.name,
7240 i.suffix);
7241 return 0;
7242 }
9706160a
JB
7243 /* Error if the e or r prefix on a general reg is present. */
7244 else if ((i.types[op].bitfield.dword
dc821c5f 7245 || i.types[op].bitfield.qword)
bab6aec1 7246 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7247 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7248 && i.tm.operand_types[op].bitfield.word)
252b5132 7249 {
9706160a
JB
7250 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7251 register_prefix, i.op[op].regs->reg_name,
7252 i.suffix);
7253 return 0;
29b0f896
AM
7254 }
7255 return 1;
7256}
252b5132 7257
29b0f896 7258static int
40fb9820 7259update_imm (unsigned int j)
29b0f896 7260{
bc0844ae 7261 i386_operand_type overlap = i.types[j];
40fb9820
L
7262 if ((overlap.bitfield.imm8
7263 || overlap.bitfield.imm8s
7264 || overlap.bitfield.imm16
7265 || overlap.bitfield.imm32
7266 || overlap.bitfield.imm32s
7267 || overlap.bitfield.imm64)
0dfbf9d7
L
7268 && !operand_type_equal (&overlap, &imm8)
7269 && !operand_type_equal (&overlap, &imm8s)
7270 && !operand_type_equal (&overlap, &imm16)
7271 && !operand_type_equal (&overlap, &imm32)
7272 && !operand_type_equal (&overlap, &imm32s)
7273 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
7274 {
7275 if (i.suffix)
7276 {
40fb9820
L
7277 i386_operand_type temp;
7278
0dfbf9d7 7279 operand_type_set (&temp, 0);
7ab9ffdd 7280 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
7281 {
7282 temp.bitfield.imm8 = overlap.bitfield.imm8;
7283 temp.bitfield.imm8s = overlap.bitfield.imm8s;
7284 }
7285 else if (i.suffix == WORD_MNEM_SUFFIX)
7286 temp.bitfield.imm16 = overlap.bitfield.imm16;
7287 else if (i.suffix == QWORD_MNEM_SUFFIX)
7288 {
7289 temp.bitfield.imm64 = overlap.bitfield.imm64;
7290 temp.bitfield.imm32s = overlap.bitfield.imm32s;
7291 }
7292 else
7293 temp.bitfield.imm32 = overlap.bitfield.imm32;
7294 overlap = temp;
29b0f896 7295 }
0dfbf9d7
L
7296 else if (operand_type_equal (&overlap, &imm16_32_32s)
7297 || operand_type_equal (&overlap, &imm16_32)
7298 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 7299 {
40fb9820 7300 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 7301 overlap = imm16;
40fb9820 7302 else
65da13b5 7303 overlap = imm32s;
29b0f896 7304 }
0dfbf9d7
L
7305 if (!operand_type_equal (&overlap, &imm8)
7306 && !operand_type_equal (&overlap, &imm8s)
7307 && !operand_type_equal (&overlap, &imm16)
7308 && !operand_type_equal (&overlap, &imm32)
7309 && !operand_type_equal (&overlap, &imm32s)
7310 && !operand_type_equal (&overlap, &imm64))
29b0f896 7311 {
4eed87de
AM
7312 as_bad (_("no instruction mnemonic suffix given; "
7313 "can't determine immediate size"));
29b0f896
AM
7314 return 0;
7315 }
7316 }
40fb9820 7317 i.types[j] = overlap;
29b0f896 7318
40fb9820
L
7319 return 1;
7320}
7321
7322static int
7323finalize_imm (void)
7324{
bc0844ae 7325 unsigned int j, n;
29b0f896 7326
bc0844ae
L
7327 /* Update the first 2 immediate operands. */
7328 n = i.operands > 2 ? 2 : i.operands;
7329 if (n)
7330 {
7331 for (j = 0; j < n; j++)
7332 if (update_imm (j) == 0)
7333 return 0;
40fb9820 7334
bc0844ae
L
7335 /* The 3rd operand can't be immediate operand. */
7336 gas_assert (operand_type_check (i.types[2], imm) == 0);
7337 }
29b0f896
AM
7338
7339 return 1;
7340}
7341
7342static int
e3bb37b5 7343process_operands (void)
29b0f896
AM
7344{
7345 /* Default segment register this instruction will use for memory
7346 accesses. 0 means unknown. This is only for optimizing out
7347 unnecessary segment overrides. */
7348 const seg_entry *default_seg = 0;
7349
2426c15f 7350 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 7351 {
91d6fa6a
NC
7352 unsigned int dupl = i.operands;
7353 unsigned int dest = dupl - 1;
9fcfb3d7
L
7354 unsigned int j;
7355
c0f3af97 7356 /* The destination must be an xmm register. */
9c2799c2 7357 gas_assert (i.reg_operands
91d6fa6a 7358 && MAX_OPERANDS > dupl
7ab9ffdd 7359 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 7360
75e5731b 7361 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7362 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 7363 {
8cd7925b 7364 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
7365 {
7366 /* Keep xmm0 for instructions with VEX prefix and 3
7367 sources. */
75e5731b 7368 i.tm.operand_types[0].bitfield.instance = InstanceNone;
3528c362 7369 i.tm.operand_types[0].bitfield.class = RegSIMD;
c0f3af97
L
7370 goto duplicate;
7371 }
e2ec9d29 7372 else
c0f3af97
L
7373 {
7374 /* We remove the first xmm0 and keep the number of
7375 operands unchanged, which in fact duplicates the
7376 destination. */
7377 for (j = 1; j < i.operands; j++)
7378 {
7379 i.op[j - 1] = i.op[j];
7380 i.types[j - 1] = i.types[j];
7381 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
8dc0818e 7382 i.flags[j - 1] = i.flags[j];
c0f3af97
L
7383 }
7384 }
7385 }
7386 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 7387 {
91d6fa6a 7388 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
7389 && (i.tm.opcode_modifier.vexsources
7390 == VEX3SOURCES));
c0f3af97
L
7391
7392 /* Add the implicit xmm0 for instructions with VEX prefix
7393 and 3 sources. */
7394 for (j = i.operands; j > 0; j--)
7395 {
7396 i.op[j] = i.op[j - 1];
7397 i.types[j] = i.types[j - 1];
7398 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 7399 i.flags[j] = i.flags[j - 1];
c0f3af97
L
7400 }
7401 i.op[0].regs
7402 = (const reg_entry *) hash_find (reg_hash, "xmm0");
7ab9ffdd 7403 i.types[0] = regxmm;
c0f3af97
L
7404 i.tm.operand_types[0] = regxmm;
7405
7406 i.operands += 2;
7407 i.reg_operands += 2;
7408 i.tm.operands += 2;
7409
91d6fa6a 7410 dupl++;
c0f3af97 7411 dest++;
91d6fa6a
NC
7412 i.op[dupl] = i.op[dest];
7413 i.types[dupl] = i.types[dest];
7414 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7415 i.flags[dupl] = i.flags[dest];
e2ec9d29 7416 }
c0f3af97
L
7417 else
7418 {
dc1e8a47 7419 duplicate:
c0f3af97
L
7420 i.operands++;
7421 i.reg_operands++;
7422 i.tm.operands++;
7423
91d6fa6a
NC
7424 i.op[dupl] = i.op[dest];
7425 i.types[dupl] = i.types[dest];
7426 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7427 i.flags[dupl] = i.flags[dest];
c0f3af97
L
7428 }
7429
7430 if (i.tm.opcode_modifier.immext)
7431 process_immext ();
7432 }
75e5731b 7433 else if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7434 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
7435 {
7436 unsigned int j;
7437
9fcfb3d7
L
7438 for (j = 1; j < i.operands; j++)
7439 {
7440 i.op[j - 1] = i.op[j];
7441 i.types[j - 1] = i.types[j];
7442
7443 /* We need to adjust fields in i.tm since they are used by
7444 build_modrm_byte. */
7445 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
7446
7447 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
7448 }
7449
e2ec9d29
L
7450 i.operands--;
7451 i.reg_operands--;
e2ec9d29
L
7452 i.tm.operands--;
7453 }
920d2ddc
IT
7454 else if (i.tm.opcode_modifier.implicitquadgroup)
7455 {
a477a8c4
JB
7456 unsigned int regnum, first_reg_in_group, last_reg_in_group;
7457
920d2ddc 7458 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 7459 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
7460 regnum = register_number (i.op[1].regs);
7461 first_reg_in_group = regnum & ~3;
7462 last_reg_in_group = first_reg_in_group + 3;
7463 if (regnum != first_reg_in_group)
7464 as_warn (_("source register `%s%s' implicitly denotes"
7465 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
7466 register_prefix, i.op[1].regs->reg_name,
7467 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
7468 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
7469 i.tm.name);
7470 }
e2ec9d29
L
7471 else if (i.tm.opcode_modifier.regkludge)
7472 {
7473 /* The imul $imm, %reg instruction is converted into
7474 imul $imm, %reg, %reg, and the clr %reg instruction
7475 is converted into xor %reg, %reg. */
7476
7477 unsigned int first_reg_op;
7478
7479 if (operand_type_check (i.types[0], reg))
7480 first_reg_op = 0;
7481 else
7482 first_reg_op = 1;
7483 /* Pretend we saw the extra register operand. */
9c2799c2 7484 gas_assert (i.reg_operands == 1
7ab9ffdd 7485 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
7486 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
7487 i.types[first_reg_op + 1] = i.types[first_reg_op];
7488 i.operands++;
7489 i.reg_operands++;
29b0f896
AM
7490 }
7491
85b80b0f 7492 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
7493 {
7494 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
7495 must be put into the modrm byte). Now, we make the modrm and
7496 index base bytes based on all the info we've collected. */
29b0f896
AM
7497
7498 default_seg = build_modrm_byte ();
7499 }
00cee14f 7500 else if (i.types[0].bitfield.class == SReg)
85b80b0f
JB
7501 {
7502 if (flag_code != CODE_64BIT
7503 ? i.tm.base_opcode == POP_SEG_SHORT
7504 && i.op[0].regs->reg_num == 1
7505 : (i.tm.base_opcode | 1) == POP_SEG386_SHORT
7506 && i.op[0].regs->reg_num < 4)
7507 {
7508 as_bad (_("you can't `%s %s%s'"),
7509 i.tm.name, register_prefix, i.op[0].regs->reg_name);
7510 return 0;
7511 }
7512 if ( i.op[0].regs->reg_num > 3 && i.tm.opcode_length == 1 )
7513 {
7514 i.tm.base_opcode ^= POP_SEG_SHORT ^ POP_SEG386_SHORT;
7515 i.tm.opcode_length = 2;
7516 }
7517 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
7518 }
8a2ed489 7519 else if ((i.tm.base_opcode & ~0x3) == MOV_AX_DISP32)
29b0f896
AM
7520 {
7521 default_seg = &ds;
7522 }
40fb9820 7523 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
7524 {
7525 /* For the string instructions that allow a segment override
7526 on one of their operands, the default segment is ds. */
7527 default_seg = &ds;
7528 }
50128d0c 7529 else if (i.short_form)
85b80b0f
JB
7530 {
7531 /* The register or float register operand is in operand
7532 0 or 1. */
bab6aec1 7533 unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
85b80b0f
JB
7534
7535 /* Register goes in low 3 bits of opcode. */
7536 i.tm.base_opcode |= i.op[op].regs->reg_num;
7537 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7538 i.rex |= REX_B;
7539 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
7540 {
7541 /* Warn about some common errors, but press on regardless.
7542 The first case can be generated by gcc (<= 2.8.1). */
7543 if (i.operands == 2)
7544 {
7545 /* Reversed arguments on faddp, fsubp, etc. */
7546 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
7547 register_prefix, i.op[!intel_syntax].regs->reg_name,
7548 register_prefix, i.op[intel_syntax].regs->reg_name);
7549 }
7550 else
7551 {
7552 /* Extraneous `l' suffix on fp insn. */
7553 as_warn (_("translating to `%s %s%s'"), i.tm.name,
7554 register_prefix, i.op[0].regs->reg_name);
7555 }
7556 }
7557 }
29b0f896 7558
514a8bb0 7559 if ((i.seg[0] || i.prefix[SEG_PREFIX])
514a8bb0
JB
7560 && i.tm.base_opcode == 0x8d /* lea */
7561 && !is_any_vex_encoding(&i.tm))
92334ad2
JB
7562 {
7563 if (!quiet_warnings)
7564 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
7565 if (optimize)
7566 {
7567 i.seg[0] = NULL;
7568 i.prefix[SEG_PREFIX] = 0;
7569 }
7570 }
52271982
AM
7571
7572 /* If a segment was explicitly specified, and the specified segment
b6773884
JB
7573 is neither the default nor the one already recorded from a prefix,
7574 use an opcode prefix to select it. If we never figured out what
7575 the default segment is, then default_seg will be zero at this
7576 point, and the specified segment prefix will always be used. */
7577 if (i.seg[0]
7578 && i.seg[0] != default_seg
7579 && i.seg[0]->seg_prefix != i.prefix[SEG_PREFIX])
29b0f896
AM
7580 {
7581 if (!add_prefix (i.seg[0]->seg_prefix))
7582 return 0;
7583 }
7584 return 1;
7585}
7586
7587static const seg_entry *
e3bb37b5 7588build_modrm_byte (void)
29b0f896
AM
7589{
7590 const seg_entry *default_seg = 0;
c0f3af97 7591 unsigned int source, dest;
8cd7925b 7592 int vex_3_sources;
c0f3af97 7593
8cd7925b 7594 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
7595 if (vex_3_sources)
7596 {
91d6fa6a 7597 unsigned int nds, reg_slot;
4c2c6516 7598 expressionS *exp;
c0f3af97 7599
6b8d3588 7600 dest = i.operands - 1;
c0f3af97 7601 nds = dest - 1;
922d8de8 7602
a683cc34 7603 /* There are 2 kinds of instructions:
bed3d976 7604 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 7605 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 7606 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 7607 ZMM register.
bed3d976 7608 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 7609 plus 1 memory operand, with VexXDS. */
922d8de8 7610 gas_assert ((i.reg_operands == 4
bed3d976
JB
7611 || (i.reg_operands == 3 && i.mem_operands == 1))
7612 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323 7613 && i.tm.opcode_modifier.vexw
3528c362 7614 && i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 7615
48db9223
JB
7616 /* If VexW1 is set, the first non-immediate operand is the source and
7617 the second non-immediate one is encoded in the immediate operand. */
7618 if (i.tm.opcode_modifier.vexw == VEXW1)
7619 {
7620 source = i.imm_operands;
7621 reg_slot = i.imm_operands + 1;
7622 }
7623 else
7624 {
7625 source = i.imm_operands + 1;
7626 reg_slot = i.imm_operands;
7627 }
7628
a683cc34 7629 if (i.imm_operands == 0)
bed3d976
JB
7630 {
7631 /* When there is no immediate operand, generate an 8bit
7632 immediate operand to encode the first operand. */
7633 exp = &im_expressions[i.imm_operands++];
7634 i.op[i.operands].imms = exp;
7635 i.types[i.operands] = imm8;
7636 i.operands++;
7637
3528c362 7638 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
bed3d976
JB
7639 exp->X_op = O_constant;
7640 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
7641 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
7642 }
922d8de8 7643 else
bed3d976 7644 {
9d3bf266
JB
7645 gas_assert (i.imm_operands == 1);
7646 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
7647 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 7648
9d3bf266
JB
7649 /* Turn on Imm8 again so that output_imm will generate it. */
7650 i.types[0].bitfield.imm8 = 1;
bed3d976 7651
3528c362 7652 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
9d3bf266 7653 i.op[0].imms->X_add_number
bed3d976 7654 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 7655 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 7656 }
a683cc34 7657
3528c362 7658 gas_assert (i.tm.operand_types[nds].bitfield.class == RegSIMD);
dae39acc 7659 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
7660 }
7661 else
7662 source = dest = 0;
29b0f896
AM
7663
7664 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
7665 implicit registers do not count. If there are 3 register
7666 operands, it must be a instruction with VexNDS. For a
7667 instruction with VexNDD, the destination register is encoded
7668 in VEX prefix. If there are 4 register operands, it must be
7669 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
7670 if (i.mem_operands == 0
7671 && ((i.reg_operands == 2
2426c15f 7672 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 7673 || (i.reg_operands == 3
2426c15f 7674 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 7675 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 7676 {
cab737b9
L
7677 switch (i.operands)
7678 {
7679 case 2:
7680 source = 0;
7681 break;
7682 case 3:
c81128dc
L
7683 /* When there are 3 operands, one of them may be immediate,
7684 which may be the first or the last operand. Otherwise,
c0f3af97
L
7685 the first operand must be shift count register (cl) or it
7686 is an instruction with VexNDS. */
9c2799c2 7687 gas_assert (i.imm_operands == 1
7ab9ffdd 7688 || (i.imm_operands == 0
2426c15f 7689 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
75e5731b
JB
7690 || (i.types[0].bitfield.instance == RegC
7691 && i.types[0].bitfield.byte))));
40fb9820 7692 if (operand_type_check (i.types[0], imm)
75e5731b
JB
7693 || (i.types[0].bitfield.instance == RegC
7694 && i.types[0].bitfield.byte))
40fb9820
L
7695 source = 1;
7696 else
7697 source = 0;
cab737b9
L
7698 break;
7699 case 4:
368d64cc
L
7700 /* When there are 4 operands, the first two must be 8bit
7701 immediate operands. The source operand will be the 3rd
c0f3af97
L
7702 one.
7703
7704 For instructions with VexNDS, if the first operand
7705 an imm8, the source operand is the 2nd one. If the last
7706 operand is imm8, the source operand is the first one. */
9c2799c2 7707 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
7708 && i.types[0].bitfield.imm8
7709 && i.types[1].bitfield.imm8)
2426c15f 7710 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
7711 && i.imm_operands == 1
7712 && (i.types[0].bitfield.imm8
43234a1e
L
7713 || i.types[i.operands - 1].bitfield.imm8
7714 || i.rounding)));
9f2670f2
L
7715 if (i.imm_operands == 2)
7716 source = 2;
7717 else
c0f3af97
L
7718 {
7719 if (i.types[0].bitfield.imm8)
7720 source = 1;
7721 else
7722 source = 0;
7723 }
c0f3af97
L
7724 break;
7725 case 5:
e771e7c9 7726 if (is_evex_encoding (&i.tm))
43234a1e
L
7727 {
7728 /* For EVEX instructions, when there are 5 operands, the
7729 first one must be immediate operand. If the second one
7730 is immediate operand, the source operand is the 3th
7731 one. If the last one is immediate operand, the source
7732 operand is the 2nd one. */
7733 gas_assert (i.imm_operands == 2
7734 && i.tm.opcode_modifier.sae
7735 && operand_type_check (i.types[0], imm));
7736 if (operand_type_check (i.types[1], imm))
7737 source = 2;
7738 else if (operand_type_check (i.types[4], imm))
7739 source = 1;
7740 else
7741 abort ();
7742 }
cab737b9
L
7743 break;
7744 default:
7745 abort ();
7746 }
7747
c0f3af97
L
7748 if (!vex_3_sources)
7749 {
7750 dest = source + 1;
7751
43234a1e
L
7752 /* RC/SAE operand could be between DEST and SRC. That happens
7753 when one operand is GPR and the other one is XMM/YMM/ZMM
7754 register. */
7755 if (i.rounding && i.rounding->operand == (int) dest)
7756 dest++;
7757
2426c15f 7758 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 7759 {
43234a1e 7760 /* For instructions with VexNDS, the register-only source
c5d0745b 7761 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
dfd69174 7762 register. It is encoded in VEX prefix. */
f12dc422
L
7763
7764 i386_operand_type op;
7765 unsigned int vvvv;
7766
7767 /* Check register-only source operand when two source
7768 operands are swapped. */
7769 if (!i.tm.operand_types[source].bitfield.baseindex
7770 && i.tm.operand_types[dest].bitfield.baseindex)
7771 {
7772 vvvv = source;
7773 source = dest;
7774 }
7775 else
7776 vvvv = dest;
7777
7778 op = i.tm.operand_types[vvvv];
c0f3af97 7779 if ((dest + 1) >= i.operands
bab6aec1 7780 || ((op.bitfield.class != Reg
dc821c5f 7781 || (!op.bitfield.dword && !op.bitfield.qword))
3528c362 7782 && op.bitfield.class != RegSIMD
43234a1e 7783 && !operand_type_equal (&op, &regmask)))
c0f3af97 7784 abort ();
f12dc422 7785 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
7786 dest++;
7787 }
7788 }
29b0f896
AM
7789
7790 i.rm.mode = 3;
dfd69174
JB
7791 /* One of the register operands will be encoded in the i.rm.reg
7792 field, the other in the combined i.rm.mode and i.rm.regmem
29b0f896
AM
7793 fields. If no form of this instruction supports a memory
7794 destination operand, then we assume the source operand may
7795 sometimes be a memory operand and so we need to store the
7796 destination in the i.rm.reg field. */
dfd69174 7797 if (!i.tm.opcode_modifier.regmem
40fb9820 7798 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
7799 {
7800 i.rm.reg = i.op[dest].regs->reg_num;
7801 i.rm.regmem = i.op[source].regs->reg_num;
3528c362
JB
7802 if (i.op[dest].regs->reg_type.bitfield.class == RegMMX
7803 || i.op[source].regs->reg_type.bitfield.class == RegMMX)
b4a3a7b4 7804 i.has_regmmx = TRUE;
3528c362
JB
7805 else if (i.op[dest].regs->reg_type.bitfield.class == RegSIMD
7806 || i.op[source].regs->reg_type.bitfield.class == RegSIMD)
b4a3a7b4
L
7807 {
7808 if (i.types[dest].bitfield.zmmword
7809 || i.types[source].bitfield.zmmword)
7810 i.has_regzmm = TRUE;
7811 else if (i.types[dest].bitfield.ymmword
7812 || i.types[source].bitfield.ymmword)
7813 i.has_regymm = TRUE;
7814 else
7815 i.has_regxmm = TRUE;
7816 }
29b0f896 7817 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 7818 i.rex |= REX_R;
43234a1e
L
7819 if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
7820 i.vrex |= REX_R;
29b0f896 7821 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 7822 i.rex |= REX_B;
43234a1e
L
7823 if ((i.op[source].regs->reg_flags & RegVRex) != 0)
7824 i.vrex |= REX_B;
29b0f896
AM
7825 }
7826 else
7827 {
7828 i.rm.reg = i.op[source].regs->reg_num;
7829 i.rm.regmem = i.op[dest].regs->reg_num;
7830 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 7831 i.rex |= REX_B;
43234a1e
L
7832 if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
7833 i.vrex |= REX_B;
29b0f896 7834 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 7835 i.rex |= REX_R;
43234a1e
L
7836 if ((i.op[source].regs->reg_flags & RegVRex) != 0)
7837 i.vrex |= REX_R;
29b0f896 7838 }
e0c7f900 7839 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 7840 {
4a5c67ed 7841 if (i.types[!i.tm.opcode_modifier.regmem].bitfield.class != RegCR)
c4a530c5 7842 abort ();
e0c7f900 7843 i.rex &= ~REX_R;
c4a530c5
JB
7844 add_prefix (LOCK_PREFIX_OPCODE);
7845 }
29b0f896
AM
7846 }
7847 else
7848 { /* If it's not 2 reg operands... */
c0f3af97
L
7849 unsigned int mem;
7850
29b0f896
AM
7851 if (i.mem_operands)
7852 {
7853 unsigned int fake_zero_displacement = 0;
99018f42 7854 unsigned int op;
4eed87de 7855
7ab9ffdd 7856 for (op = 0; op < i.operands; op++)
8dc0818e 7857 if (i.flags[op] & Operand_Mem)
7ab9ffdd 7858 break;
7ab9ffdd 7859 gas_assert (op < i.operands);
29b0f896 7860
6c30d220
L
7861 if (i.tm.opcode_modifier.vecsib)
7862 {
e968fc9b 7863 if (i.index_reg->reg_num == RegIZ)
6c30d220
L
7864 abort ();
7865
7866 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7867 if (!i.base_reg)
7868 {
7869 i.sib.base = NO_BASE_REGISTER;
7870 i.sib.scale = i.log2_scale_factor;
7871 i.types[op].bitfield.disp8 = 0;
7872 i.types[op].bitfield.disp16 = 0;
7873 i.types[op].bitfield.disp64 = 0;
43083a50 7874 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
6c30d220
L
7875 {
7876 /* Must be 32 bit */
7877 i.types[op].bitfield.disp32 = 1;
7878 i.types[op].bitfield.disp32s = 0;
7879 }
7880 else
7881 {
7882 i.types[op].bitfield.disp32 = 0;
7883 i.types[op].bitfield.disp32s = 1;
7884 }
7885 }
7886 i.sib.index = i.index_reg->reg_num;
7887 if ((i.index_reg->reg_flags & RegRex) != 0)
7888 i.rex |= REX_X;
43234a1e
L
7889 if ((i.index_reg->reg_flags & RegVRex) != 0)
7890 i.vrex |= REX_X;
6c30d220
L
7891 }
7892
29b0f896
AM
7893 default_seg = &ds;
7894
7895 if (i.base_reg == 0)
7896 {
7897 i.rm.mode = 0;
7898 if (!i.disp_operands)
9bb129e8 7899 fake_zero_displacement = 1;
29b0f896
AM
7900 if (i.index_reg == 0)
7901 {
73053c1f
JB
7902 i386_operand_type newdisp;
7903
6c30d220 7904 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 7905 /* Operand is just <disp> */
20f0a1fc 7906 if (flag_code == CODE_64BIT)
29b0f896
AM
7907 {
7908 /* 64bit mode overwrites the 32bit absolute
7909 addressing by RIP relative addressing and
7910 absolute addressing is encoded by one of the
7911 redundant SIB forms. */
7912 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7913 i.sib.base = NO_BASE_REGISTER;
7914 i.sib.index = NO_INDEX_REGISTER;
73053c1f 7915 newdisp = (!i.prefix[ADDR_PREFIX] ? disp32s : disp32);
20f0a1fc 7916 }
fc225355
L
7917 else if ((flag_code == CODE_16BIT)
7918 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
7919 {
7920 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 7921 newdisp = disp16;
20f0a1fc
NC
7922 }
7923 else
7924 {
7925 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 7926 newdisp = disp32;
29b0f896 7927 }
73053c1f
JB
7928 i.types[op] = operand_type_and_not (i.types[op], anydisp);
7929 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 7930 }
6c30d220 7931 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 7932 {
6c30d220 7933 /* !i.base_reg && i.index_reg */
e968fc9b 7934 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
7935 i.sib.index = NO_INDEX_REGISTER;
7936 else
7937 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
7938 i.sib.base = NO_BASE_REGISTER;
7939 i.sib.scale = i.log2_scale_factor;
7940 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
7941 i.types[op].bitfield.disp8 = 0;
7942 i.types[op].bitfield.disp16 = 0;
7943 i.types[op].bitfield.disp64 = 0;
43083a50 7944 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
40fb9820
L
7945 {
7946 /* Must be 32 bit */
7947 i.types[op].bitfield.disp32 = 1;
7948 i.types[op].bitfield.disp32s = 0;
7949 }
29b0f896 7950 else
40fb9820
L
7951 {
7952 i.types[op].bitfield.disp32 = 0;
7953 i.types[op].bitfield.disp32s = 1;
7954 }
29b0f896 7955 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 7956 i.rex |= REX_X;
29b0f896
AM
7957 }
7958 }
7959 /* RIP addressing for 64bit mode. */
e968fc9b 7960 else if (i.base_reg->reg_num == RegIP)
29b0f896 7961 {
6c30d220 7962 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 7963 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
7964 i.types[op].bitfield.disp8 = 0;
7965 i.types[op].bitfield.disp16 = 0;
7966 i.types[op].bitfield.disp32 = 0;
7967 i.types[op].bitfield.disp32s = 1;
7968 i.types[op].bitfield.disp64 = 0;
71903a11 7969 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
7970 if (! i.disp_operands)
7971 fake_zero_displacement = 1;
29b0f896 7972 }
dc821c5f 7973 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 7974 {
6c30d220 7975 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
7976 switch (i.base_reg->reg_num)
7977 {
7978 case 3: /* (%bx) */
7979 if (i.index_reg == 0)
7980 i.rm.regmem = 7;
7981 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
7982 i.rm.regmem = i.index_reg->reg_num - 6;
7983 break;
7984 case 5: /* (%bp) */
7985 default_seg = &ss;
7986 if (i.index_reg == 0)
7987 {
7988 i.rm.regmem = 6;
40fb9820 7989 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
7990 {
7991 /* fake (%bp) into 0(%bp) */
b5014f7a 7992 i.types[op].bitfield.disp8 = 1;
252b5132 7993 fake_zero_displacement = 1;
29b0f896
AM
7994 }
7995 }
7996 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
7997 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
7998 break;
7999 default: /* (%si) -> 4 or (%di) -> 5 */
8000 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
8001 }
8002 i.rm.mode = mode_from_disp_size (i.types[op]);
8003 }
8004 else /* i.base_reg and 32/64 bit mode */
8005 {
8006 if (flag_code == CODE_64BIT
40fb9820
L
8007 && operand_type_check (i.types[op], disp))
8008 {
73053c1f
JB
8009 i.types[op].bitfield.disp16 = 0;
8010 i.types[op].bitfield.disp64 = 0;
40fb9820 8011 if (i.prefix[ADDR_PREFIX] == 0)
73053c1f
JB
8012 {
8013 i.types[op].bitfield.disp32 = 0;
8014 i.types[op].bitfield.disp32s = 1;
8015 }
40fb9820 8016 else
73053c1f
JB
8017 {
8018 i.types[op].bitfield.disp32 = 1;
8019 i.types[op].bitfield.disp32s = 0;
8020 }
40fb9820 8021 }
20f0a1fc 8022
6c30d220
L
8023 if (!i.tm.opcode_modifier.vecsib)
8024 i.rm.regmem = i.base_reg->reg_num;
29b0f896 8025 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 8026 i.rex |= REX_B;
29b0f896
AM
8027 i.sib.base = i.base_reg->reg_num;
8028 /* x86-64 ignores REX prefix bit here to avoid decoder
8029 complications. */
848930b2
JB
8030 if (!(i.base_reg->reg_flags & RegRex)
8031 && (i.base_reg->reg_num == EBP_REG_NUM
8032 || i.base_reg->reg_num == ESP_REG_NUM))
29b0f896 8033 default_seg = &ss;
848930b2 8034 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 8035 {
848930b2 8036 fake_zero_displacement = 1;
b5014f7a 8037 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
8038 }
8039 i.sib.scale = i.log2_scale_factor;
8040 if (i.index_reg == 0)
8041 {
6c30d220 8042 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
8043 /* <disp>(%esp) becomes two byte modrm with no index
8044 register. We've already stored the code for esp
8045 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
8046 Any base register besides %esp will not use the
8047 extra modrm byte. */
8048 i.sib.index = NO_INDEX_REGISTER;
29b0f896 8049 }
6c30d220 8050 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 8051 {
e968fc9b 8052 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8053 i.sib.index = NO_INDEX_REGISTER;
8054 else
8055 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8056 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8057 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8058 i.rex |= REX_X;
29b0f896 8059 }
67a4f2b7
AO
8060
8061 if (i.disp_operands
8062 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
8063 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
8064 i.rm.mode = 0;
8065 else
a501d77e
L
8066 {
8067 if (!fake_zero_displacement
8068 && !i.disp_operands
8069 && i.disp_encoding)
8070 {
8071 fake_zero_displacement = 1;
8072 if (i.disp_encoding == disp_encoding_8bit)
8073 i.types[op].bitfield.disp8 = 1;
8074 else
8075 i.types[op].bitfield.disp32 = 1;
8076 }
8077 i.rm.mode = mode_from_disp_size (i.types[op]);
8078 }
29b0f896 8079 }
252b5132 8080
29b0f896
AM
8081 if (fake_zero_displacement)
8082 {
8083 /* Fakes a zero displacement assuming that i.types[op]
8084 holds the correct displacement size. */
8085 expressionS *exp;
8086
9c2799c2 8087 gas_assert (i.op[op].disps == 0);
29b0f896
AM
8088 exp = &disp_expressions[i.disp_operands++];
8089 i.op[op].disps = exp;
8090 exp->X_op = O_constant;
8091 exp->X_add_number = 0;
8092 exp->X_add_symbol = (symbolS *) 0;
8093 exp->X_op_symbol = (symbolS *) 0;
8094 }
c0f3af97
L
8095
8096 mem = op;
29b0f896 8097 }
c0f3af97
L
8098 else
8099 mem = ~0;
252b5132 8100
8c43a48b 8101 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
8102 {
8103 if (operand_type_check (i.types[0], imm))
8104 i.vex.register_specifier = NULL;
8105 else
8106 {
8107 /* VEX.vvvv encodes one of the sources when the first
8108 operand is not an immediate. */
1ef99a7b 8109 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8110 i.vex.register_specifier = i.op[0].regs;
8111 else
8112 i.vex.register_specifier = i.op[1].regs;
8113 }
8114
8115 /* Destination is a XMM register encoded in the ModRM.reg
8116 and VEX.R bit. */
8117 i.rm.reg = i.op[2].regs->reg_num;
8118 if ((i.op[2].regs->reg_flags & RegRex) != 0)
8119 i.rex |= REX_R;
8120
8121 /* ModRM.rm and VEX.B encodes the other source. */
8122 if (!i.mem_operands)
8123 {
8124 i.rm.mode = 3;
8125
1ef99a7b 8126 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8127 i.rm.regmem = i.op[1].regs->reg_num;
8128 else
8129 i.rm.regmem = i.op[0].regs->reg_num;
8130
8131 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8132 i.rex |= REX_B;
8133 }
8134 }
2426c15f 8135 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
8136 {
8137 i.vex.register_specifier = i.op[2].regs;
8138 if (!i.mem_operands)
8139 {
8140 i.rm.mode = 3;
8141 i.rm.regmem = i.op[1].regs->reg_num;
8142 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8143 i.rex |= REX_B;
8144 }
8145 }
29b0f896
AM
8146 /* Fill in i.rm.reg or i.rm.regmem field with register operand
8147 (if any) based on i.tm.extension_opcode. Again, we must be
8148 careful to make sure that segment/control/debug/test/MMX
8149 registers are coded into the i.rm.reg field. */
f88c9eb0 8150 else if (i.reg_operands)
29b0f896 8151 {
99018f42 8152 unsigned int op;
7ab9ffdd
L
8153 unsigned int vex_reg = ~0;
8154
8155 for (op = 0; op < i.operands; op++)
b4a3a7b4 8156 {
bab6aec1 8157 if (i.types[op].bitfield.class == Reg
f74a6307
JB
8158 || i.types[op].bitfield.class == RegBND
8159 || i.types[op].bitfield.class == RegMask
00cee14f 8160 || i.types[op].bitfield.class == SReg
4a5c67ed
JB
8161 || i.types[op].bitfield.class == RegCR
8162 || i.types[op].bitfield.class == RegDR
8163 || i.types[op].bitfield.class == RegTR)
b4a3a7b4 8164 break;
3528c362 8165 if (i.types[op].bitfield.class == RegSIMD)
b4a3a7b4
L
8166 {
8167 if (i.types[op].bitfield.zmmword)
8168 i.has_regzmm = TRUE;
8169 else if (i.types[op].bitfield.ymmword)
8170 i.has_regymm = TRUE;
8171 else
8172 i.has_regxmm = TRUE;
8173 break;
8174 }
3528c362 8175 if (i.types[op].bitfield.class == RegMMX)
b4a3a7b4
L
8176 {
8177 i.has_regmmx = TRUE;
8178 break;
8179 }
8180 }
c0209578 8181
7ab9ffdd
L
8182 if (vex_3_sources)
8183 op = dest;
2426c15f 8184 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
8185 {
8186 /* For instructions with VexNDS, the register-only
8187 source operand is encoded in VEX prefix. */
8188 gas_assert (mem != (unsigned int) ~0);
c0f3af97 8189
7ab9ffdd 8190 if (op > mem)
c0f3af97 8191 {
7ab9ffdd
L
8192 vex_reg = op++;
8193 gas_assert (op < i.operands);
c0f3af97
L
8194 }
8195 else
c0f3af97 8196 {
f12dc422
L
8197 /* Check register-only source operand when two source
8198 operands are swapped. */
8199 if (!i.tm.operand_types[op].bitfield.baseindex
8200 && i.tm.operand_types[op + 1].bitfield.baseindex)
8201 {
8202 vex_reg = op;
8203 op += 2;
8204 gas_assert (mem == (vex_reg + 1)
8205 && op < i.operands);
8206 }
8207 else
8208 {
8209 vex_reg = op + 1;
8210 gas_assert (vex_reg < i.operands);
8211 }
c0f3af97 8212 }
7ab9ffdd 8213 }
2426c15f 8214 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 8215 {
f12dc422 8216 /* For instructions with VexNDD, the register destination
7ab9ffdd 8217 is encoded in VEX prefix. */
f12dc422
L
8218 if (i.mem_operands == 0)
8219 {
8220 /* There is no memory operand. */
8221 gas_assert ((op + 2) == i.operands);
8222 vex_reg = op + 1;
8223 }
8224 else
8d63c93e 8225 {
ed438a93
JB
8226 /* There are only 2 non-immediate operands. */
8227 gas_assert (op < i.imm_operands + 2
8228 && i.operands == i.imm_operands + 2);
8229 vex_reg = i.imm_operands + 1;
f12dc422 8230 }
7ab9ffdd
L
8231 }
8232 else
8233 gas_assert (op < i.operands);
99018f42 8234
7ab9ffdd
L
8235 if (vex_reg != (unsigned int) ~0)
8236 {
f12dc422 8237 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 8238
bab6aec1 8239 if ((type->bitfield.class != Reg
dc821c5f 8240 || (!type->bitfield.dword && !type->bitfield.qword))
3528c362 8241 && type->bitfield.class != RegSIMD
43234a1e 8242 && !operand_type_equal (type, &regmask))
7ab9ffdd 8243 abort ();
f88c9eb0 8244
7ab9ffdd
L
8245 i.vex.register_specifier = i.op[vex_reg].regs;
8246 }
8247
1b9f0c97
L
8248 /* Don't set OP operand twice. */
8249 if (vex_reg != op)
7ab9ffdd 8250 {
1b9f0c97
L
8251 /* If there is an extension opcode to put here, the
8252 register number must be put into the regmem field. */
8253 if (i.tm.extension_opcode != None)
8254 {
8255 i.rm.regmem = i.op[op].regs->reg_num;
8256 if ((i.op[op].regs->reg_flags & RegRex) != 0)
8257 i.rex |= REX_B;
43234a1e
L
8258 if ((i.op[op].regs->reg_flags & RegVRex) != 0)
8259 i.vrex |= REX_B;
1b9f0c97
L
8260 }
8261 else
8262 {
8263 i.rm.reg = i.op[op].regs->reg_num;
8264 if ((i.op[op].regs->reg_flags & RegRex) != 0)
8265 i.rex |= REX_R;
43234a1e
L
8266 if ((i.op[op].regs->reg_flags & RegVRex) != 0)
8267 i.vrex |= REX_R;
1b9f0c97 8268 }
7ab9ffdd 8269 }
252b5132 8270
29b0f896
AM
8271 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
8272 must set it to 3 to indicate this is a register operand
8273 in the regmem field. */
8274 if (!i.mem_operands)
8275 i.rm.mode = 3;
8276 }
252b5132 8277
29b0f896 8278 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 8279 if (i.tm.extension_opcode != None)
29b0f896
AM
8280 i.rm.reg = i.tm.extension_opcode;
8281 }
8282 return default_seg;
8283}
252b5132 8284
376cd056
JB
8285static unsigned int
8286flip_code16 (unsigned int code16)
8287{
8288 gas_assert (i.tm.operands == 1);
8289
8290 return !(i.prefix[REX_PREFIX] & REX_W)
8291 && (code16 ? i.tm.operand_types[0].bitfield.disp32
8292 || i.tm.operand_types[0].bitfield.disp32s
8293 : i.tm.operand_types[0].bitfield.disp16)
8294 ? CODE16 : 0;
8295}
8296
29b0f896 8297static void
e3bb37b5 8298output_branch (void)
29b0f896
AM
8299{
8300 char *p;
f8a5c266 8301 int size;
29b0f896
AM
8302 int code16;
8303 int prefix;
8304 relax_substateT subtype;
8305 symbolS *sym;
8306 offsetT off;
8307
f8a5c266 8308 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 8309 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
8310
8311 prefix = 0;
8312 if (i.prefix[DATA_PREFIX] != 0)
252b5132 8313 {
29b0f896
AM
8314 prefix = 1;
8315 i.prefixes -= 1;
376cd056 8316 code16 ^= flip_code16(code16);
252b5132 8317 }
29b0f896
AM
8318 /* Pentium4 branch hints. */
8319 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8320 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 8321 {
29b0f896
AM
8322 prefix++;
8323 i.prefixes--;
8324 }
8325 if (i.prefix[REX_PREFIX] != 0)
8326 {
8327 prefix++;
8328 i.prefixes--;
2f66722d
AM
8329 }
8330
7e8b059b
L
8331 /* BND prefixed jump. */
8332 if (i.prefix[BND_PREFIX] != 0)
8333 {
6cb0a70e
JB
8334 prefix++;
8335 i.prefixes--;
7e8b059b
L
8336 }
8337
f2810fe0
JB
8338 if (i.prefixes != 0)
8339 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
29b0f896
AM
8340
8341 /* It's always a symbol; End frag & setup for relax.
8342 Make sure there is enough room in this frag for the largest
8343 instruction we may generate in md_convert_frag. This is 2
8344 bytes for the opcode and room for the prefix and largest
8345 displacement. */
8346 frag_grow (prefix + 2 + 4);
8347 /* Prefix and 1 opcode byte go in fr_fix. */
8348 p = frag_more (prefix + 1);
8349 if (i.prefix[DATA_PREFIX] != 0)
8350 *p++ = DATA_PREFIX_OPCODE;
8351 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
8352 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
8353 *p++ = i.prefix[SEG_PREFIX];
6cb0a70e
JB
8354 if (i.prefix[BND_PREFIX] != 0)
8355 *p++ = BND_PREFIX_OPCODE;
29b0f896
AM
8356 if (i.prefix[REX_PREFIX] != 0)
8357 *p++ = i.prefix[REX_PREFIX];
8358 *p = i.tm.base_opcode;
8359
8360 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 8361 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 8362 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 8363 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 8364 else
f8a5c266 8365 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 8366 subtype |= code16;
3e73aa7c 8367
29b0f896
AM
8368 sym = i.op[0].disps->X_add_symbol;
8369 off = i.op[0].disps->X_add_number;
3e73aa7c 8370
29b0f896
AM
8371 if (i.op[0].disps->X_op != O_constant
8372 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 8373 {
29b0f896
AM
8374 /* Handle complex expressions. */
8375 sym = make_expr_symbol (i.op[0].disps);
8376 off = 0;
8377 }
3e73aa7c 8378
29b0f896
AM
8379 /* 1 possible extra opcode + 4 byte displacement go in var part.
8380 Pass reloc in fr_var. */
d258b828 8381 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 8382}
3e73aa7c 8383
bd7ab16b
L
8384#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8385/* Return TRUE iff PLT32 relocation should be used for branching to
8386 symbol S. */
8387
8388static bfd_boolean
8389need_plt32_p (symbolS *s)
8390{
8391 /* PLT32 relocation is ELF only. */
8392 if (!IS_ELF)
8393 return FALSE;
8394
a5def729
RO
8395#ifdef TE_SOLARIS
8396 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
8397 krtld support it. */
8398 return FALSE;
8399#endif
8400
bd7ab16b
L
8401 /* Since there is no need to prepare for PLT branch on x86-64, we
8402 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
8403 be used as a marker for 32-bit PC-relative branches. */
8404 if (!object_64bit)
8405 return FALSE;
8406
8407 /* Weak or undefined symbol need PLT32 relocation. */
8408 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
8409 return TRUE;
8410
8411 /* Non-global symbol doesn't need PLT32 relocation. */
8412 if (! S_IS_EXTERNAL (s))
8413 return FALSE;
8414
8415 /* Other global symbols need PLT32 relocation. NB: Symbol with
8416 non-default visibilities are treated as normal global symbol
8417 so that PLT32 relocation can be used as a marker for 32-bit
8418 PC-relative branches. It is useful for linker relaxation. */
8419 return TRUE;
8420}
8421#endif
8422
29b0f896 8423static void
e3bb37b5 8424output_jump (void)
29b0f896
AM
8425{
8426 char *p;
8427 int size;
3e02c1cc 8428 fixS *fixP;
bd7ab16b 8429 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 8430
0cfa3eb3 8431 if (i.tm.opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
8432 {
8433 /* This is a loop or jecxz type instruction. */
8434 size = 1;
8435 if (i.prefix[ADDR_PREFIX] != 0)
8436 {
8437 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
8438 i.prefixes -= 1;
8439 }
8440 /* Pentium4 branch hints. */
8441 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8442 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
8443 {
8444 FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
8445 i.prefixes--;
3e73aa7c
JH
8446 }
8447 }
29b0f896
AM
8448 else
8449 {
8450 int code16;
3e73aa7c 8451
29b0f896
AM
8452 code16 = 0;
8453 if (flag_code == CODE_16BIT)
8454 code16 = CODE16;
3e73aa7c 8455
29b0f896
AM
8456 if (i.prefix[DATA_PREFIX] != 0)
8457 {
8458 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
8459 i.prefixes -= 1;
376cd056 8460 code16 ^= flip_code16(code16);
29b0f896 8461 }
252b5132 8462
29b0f896
AM
8463 size = 4;
8464 if (code16)
8465 size = 2;
8466 }
9fcc94b6 8467
6cb0a70e
JB
8468 /* BND prefixed jump. */
8469 if (i.prefix[BND_PREFIX] != 0)
29b0f896 8470 {
6cb0a70e 8471 FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
29b0f896
AM
8472 i.prefixes -= 1;
8473 }
252b5132 8474
6cb0a70e 8475 if (i.prefix[REX_PREFIX] != 0)
7e8b059b 8476 {
6cb0a70e 8477 FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
7e8b059b
L
8478 i.prefixes -= 1;
8479 }
8480
f2810fe0
JB
8481 if (i.prefixes != 0)
8482 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
e0890092 8483
42164a71
L
8484 p = frag_more (i.tm.opcode_length + size);
8485 switch (i.tm.opcode_length)
8486 {
8487 case 2:
8488 *p++ = i.tm.base_opcode >> 8;
1a0670f3 8489 /* Fall through. */
42164a71
L
8490 case 1:
8491 *p++ = i.tm.base_opcode;
8492 break;
8493 default:
8494 abort ();
8495 }
e0890092 8496
bd7ab16b
L
8497#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8498 if (size == 4
8499 && jump_reloc == NO_RELOC
8500 && need_plt32_p (i.op[0].disps->X_add_symbol))
8501 jump_reloc = BFD_RELOC_X86_64_PLT32;
8502#endif
8503
8504 jump_reloc = reloc (size, 1, 1, jump_reloc);
8505
3e02c1cc 8506 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 8507 i.op[0].disps, 1, jump_reloc);
3e02c1cc
AM
8508
8509 /* All jumps handled here are signed, but don't use a signed limit
8510 check for 32 and 16 bit jumps as we want to allow wrap around at
8511 4G and 64k respectively. */
8512 if (size == 1)
8513 fixP->fx_signed = 1;
29b0f896 8514}
e0890092 8515
29b0f896 8516static void
e3bb37b5 8517output_interseg_jump (void)
29b0f896
AM
8518{
8519 char *p;
8520 int size;
8521 int prefix;
8522 int code16;
252b5132 8523
29b0f896
AM
8524 code16 = 0;
8525 if (flag_code == CODE_16BIT)
8526 code16 = CODE16;
a217f122 8527
29b0f896
AM
8528 prefix = 0;
8529 if (i.prefix[DATA_PREFIX] != 0)
8530 {
8531 prefix = 1;
8532 i.prefixes -= 1;
8533 code16 ^= CODE16;
8534 }
6cb0a70e
JB
8535
8536 gas_assert (!i.prefix[REX_PREFIX]);
252b5132 8537
29b0f896
AM
8538 size = 4;
8539 if (code16)
8540 size = 2;
252b5132 8541
f2810fe0
JB
8542 if (i.prefixes != 0)
8543 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
252b5132 8544
29b0f896
AM
8545 /* 1 opcode; 2 segment; offset */
8546 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 8547
29b0f896
AM
8548 if (i.prefix[DATA_PREFIX] != 0)
8549 *p++ = DATA_PREFIX_OPCODE;
252b5132 8550
29b0f896
AM
8551 if (i.prefix[REX_PREFIX] != 0)
8552 *p++ = i.prefix[REX_PREFIX];
252b5132 8553
29b0f896
AM
8554 *p++ = i.tm.base_opcode;
8555 if (i.op[1].imms->X_op == O_constant)
8556 {
8557 offsetT n = i.op[1].imms->X_add_number;
252b5132 8558
29b0f896
AM
8559 if (size == 2
8560 && !fits_in_unsigned_word (n)
8561 && !fits_in_signed_word (n))
8562 {
8563 as_bad (_("16-bit jump out of range"));
8564 return;
8565 }
8566 md_number_to_chars (p, n, size);
8567 }
8568 else
8569 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 8570 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
29b0f896
AM
8571 if (i.op[0].imms->X_op != O_constant)
8572 as_bad (_("can't handle non absolute segment in `%s'"),
8573 i.tm.name);
8574 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
8575}
a217f122 8576
b4a3a7b4
L
8577#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8578void
8579x86_cleanup (void)
8580{
8581 char *p;
8582 asection *seg = now_seg;
8583 subsegT subseg = now_subseg;
8584 asection *sec;
8585 unsigned int alignment, align_size_1;
8586 unsigned int isa_1_descsz, feature_2_descsz, descsz;
8587 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
8588 unsigned int padding;
8589
8590 if (!IS_ELF || !x86_used_note)
8591 return;
8592
b4a3a7b4
L
8593 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
8594
8595 /* The .note.gnu.property section layout:
8596
8597 Field Length Contents
8598 ---- ---- ----
8599 n_namsz 4 4
8600 n_descsz 4 The note descriptor size
8601 n_type 4 NT_GNU_PROPERTY_TYPE_0
8602 n_name 4 "GNU"
8603 n_desc n_descsz The program property array
8604 .... .... ....
8605 */
8606
8607 /* Create the .note.gnu.property section. */
8608 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 8609 bfd_set_section_flags (sec,
b4a3a7b4
L
8610 (SEC_ALLOC
8611 | SEC_LOAD
8612 | SEC_DATA
8613 | SEC_HAS_CONTENTS
8614 | SEC_READONLY));
8615
8616 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
8617 {
8618 align_size_1 = 7;
8619 alignment = 3;
8620 }
8621 else
8622 {
8623 align_size_1 = 3;
8624 alignment = 2;
8625 }
8626
fd361982 8627 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
8628 elf_section_type (sec) = SHT_NOTE;
8629
8630 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
8631 + 4-byte data */
8632 isa_1_descsz_raw = 4 + 4 + 4;
8633 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
8634 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
8635
8636 feature_2_descsz_raw = isa_1_descsz;
8637 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
8638 + 4-byte data */
8639 feature_2_descsz_raw += 4 + 4 + 4;
8640 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
8641 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
8642 & ~align_size_1);
8643
8644 descsz = feature_2_descsz;
8645 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
8646 p = frag_more (4 + 4 + 4 + 4 + descsz);
8647
8648 /* Write n_namsz. */
8649 md_number_to_chars (p, (valueT) 4, 4);
8650
8651 /* Write n_descsz. */
8652 md_number_to_chars (p + 4, (valueT) descsz, 4);
8653
8654 /* Write n_type. */
8655 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
8656
8657 /* Write n_name. */
8658 memcpy (p + 4 * 3, "GNU", 4);
8659
8660 /* Write 4-byte type. */
8661 md_number_to_chars (p + 4 * 4,
8662 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
8663
8664 /* Write 4-byte data size. */
8665 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
8666
8667 /* Write 4-byte data. */
8668 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
8669
8670 /* Zero out paddings. */
8671 padding = isa_1_descsz - isa_1_descsz_raw;
8672 if (padding)
8673 memset (p + 4 * 7, 0, padding);
8674
8675 /* Write 4-byte type. */
8676 md_number_to_chars (p + isa_1_descsz + 4 * 4,
8677 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
8678
8679 /* Write 4-byte data size. */
8680 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
8681
8682 /* Write 4-byte data. */
8683 md_number_to_chars (p + isa_1_descsz + 4 * 6,
8684 (valueT) x86_feature_2_used, 4);
8685
8686 /* Zero out paddings. */
8687 padding = feature_2_descsz - feature_2_descsz_raw;
8688 if (padding)
8689 memset (p + isa_1_descsz + 4 * 7, 0, padding);
8690
8691 /* We probably can't restore the current segment, for there likely
8692 isn't one yet... */
8693 if (seg && subseg)
8694 subseg_set (seg, subseg);
8695}
8696#endif
8697
9c33702b
JB
8698static unsigned int
8699encoding_length (const fragS *start_frag, offsetT start_off,
8700 const char *frag_now_ptr)
8701{
8702 unsigned int len = 0;
8703
8704 if (start_frag != frag_now)
8705 {
8706 const fragS *fr = start_frag;
8707
8708 do {
8709 len += fr->fr_fix;
8710 fr = fr->fr_next;
8711 } while (fr && fr != frag_now);
8712 }
8713
8714 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
8715}
8716
e379e5f3 8717/* Return 1 for test, and, cmp, add, sub, inc and dec which may
79d72f45
HL
8718 be macro-fused with conditional jumps.
8719 NB: If TEST/AND/CMP/ADD/SUB/INC/DEC is of RIP relative address,
8720 or is one of the following format:
8721
8722 cmp m, imm
8723 add m, imm
8724 sub m, imm
8725 test m, imm
8726 and m, imm
8727 inc m
8728 dec m
8729
8730 it is unfusible. */
e379e5f3
L
8731
8732static int
79d72f45 8733maybe_fused_with_jcc_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8734{
8735 /* No RIP address. */
8736 if (i.base_reg && i.base_reg->reg_num == RegIP)
8737 return 0;
8738
8739 /* No VEX/EVEX encoding. */
8740 if (is_any_vex_encoding (&i.tm))
8741 return 0;
8742
79d72f45
HL
8743 /* add, sub without add/sub m, imm. */
8744 if (i.tm.base_opcode <= 5
e379e5f3
L
8745 || (i.tm.base_opcode >= 0x28 && i.tm.base_opcode <= 0x2d)
8746 || ((i.tm.base_opcode | 3) == 0x83
79d72f45 8747 && (i.tm.extension_opcode == 0x5
e379e5f3 8748 || i.tm.extension_opcode == 0x0)))
79d72f45
HL
8749 {
8750 *mf_cmp_p = mf_cmp_alu_cmp;
8751 return !(i.mem_operands && i.imm_operands);
8752 }
e379e5f3 8753
79d72f45
HL
8754 /* and without and m, imm. */
8755 if ((i.tm.base_opcode >= 0x20 && i.tm.base_opcode <= 0x25)
8756 || ((i.tm.base_opcode | 3) == 0x83
8757 && i.tm.extension_opcode == 0x4))
8758 {
8759 *mf_cmp_p = mf_cmp_test_and;
8760 return !(i.mem_operands && i.imm_operands);
8761 }
8762
8763 /* test without test m imm. */
e379e5f3
L
8764 if ((i.tm.base_opcode | 1) == 0x85
8765 || (i.tm.base_opcode | 1) == 0xa9
8766 || ((i.tm.base_opcode | 1) == 0xf7
79d72f45
HL
8767 && i.tm.extension_opcode == 0))
8768 {
8769 *mf_cmp_p = mf_cmp_test_and;
8770 return !(i.mem_operands && i.imm_operands);
8771 }
8772
8773 /* cmp without cmp m, imm. */
8774 if ((i.tm.base_opcode >= 0x38 && i.tm.base_opcode <= 0x3d)
e379e5f3
L
8775 || ((i.tm.base_opcode | 3) == 0x83
8776 && (i.tm.extension_opcode == 0x7)))
79d72f45
HL
8777 {
8778 *mf_cmp_p = mf_cmp_alu_cmp;
8779 return !(i.mem_operands && i.imm_operands);
8780 }
e379e5f3 8781
79d72f45 8782 /* inc, dec without inc/dec m. */
e379e5f3
L
8783 if ((i.tm.cpu_flags.bitfield.cpuno64
8784 && (i.tm.base_opcode | 0xf) == 0x4f)
8785 || ((i.tm.base_opcode | 1) == 0xff
8786 && i.tm.extension_opcode <= 0x1))
79d72f45
HL
8787 {
8788 *mf_cmp_p = mf_cmp_incdec;
8789 return !i.mem_operands;
8790 }
e379e5f3
L
8791
8792 return 0;
8793}
8794
8795/* Return 1 if a FUSED_JCC_PADDING frag should be generated. */
8796
8797static int
79d72f45 8798add_fused_jcc_padding_frag_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8799{
8800 /* NB: Don't work with COND_JUMP86 without i386. */
8801 if (!align_branch_power
8802 || now_seg == absolute_section
8803 || !cpu_arch_flags.bitfield.cpui386
8804 || !(align_branch & align_branch_fused_bit))
8805 return 0;
8806
79d72f45 8807 if (maybe_fused_with_jcc_p (mf_cmp_p))
e379e5f3
L
8808 {
8809 if (last_insn.kind == last_insn_other
8810 || last_insn.seg != now_seg)
8811 return 1;
8812 if (flag_debug)
8813 as_warn_where (last_insn.file, last_insn.line,
8814 _("`%s` skips -malign-branch-boundary on `%s`"),
8815 last_insn.name, i.tm.name);
8816 }
8817
8818 return 0;
8819}
8820
8821/* Return 1 if a BRANCH_PREFIX frag should be generated. */
8822
8823static int
8824add_branch_prefix_frag_p (void)
8825{
8826 /* NB: Don't work with COND_JUMP86 without i386. Don't add prefix
8827 to PadLock instructions since they include prefixes in opcode. */
8828 if (!align_branch_power
8829 || !align_branch_prefix_size
8830 || now_seg == absolute_section
8831 || i.tm.cpu_flags.bitfield.cpupadlock
8832 || !cpu_arch_flags.bitfield.cpui386)
8833 return 0;
8834
8835 /* Don't add prefix if it is a prefix or there is no operand in case
8836 that segment prefix is special. */
8837 if (!i.operands || i.tm.opcode_modifier.isprefix)
8838 return 0;
8839
8840 if (last_insn.kind == last_insn_other
8841 || last_insn.seg != now_seg)
8842 return 1;
8843
8844 if (flag_debug)
8845 as_warn_where (last_insn.file, last_insn.line,
8846 _("`%s` skips -malign-branch-boundary on `%s`"),
8847 last_insn.name, i.tm.name);
8848
8849 return 0;
8850}
8851
8852/* Return 1 if a BRANCH_PADDING frag should be generated. */
8853
8854static int
79d72f45
HL
8855add_branch_padding_frag_p (enum align_branch_kind *branch_p,
8856 enum mf_jcc_kind *mf_jcc_p)
e379e5f3
L
8857{
8858 int add_padding;
8859
8860 /* NB: Don't work with COND_JUMP86 without i386. */
8861 if (!align_branch_power
8862 || now_seg == absolute_section
8863 || !cpu_arch_flags.bitfield.cpui386)
8864 return 0;
8865
8866 add_padding = 0;
8867
8868 /* Check for jcc and direct jmp. */
8869 if (i.tm.opcode_modifier.jump == JUMP)
8870 {
8871 if (i.tm.base_opcode == JUMP_PC_RELATIVE)
8872 {
8873 *branch_p = align_branch_jmp;
8874 add_padding = align_branch & align_branch_jmp_bit;
8875 }
8876 else
8877 {
79d72f45
HL
8878 /* Because J<cc> and JN<cc> share same group in macro-fusible table,
8879 igore the lowest bit. */
8880 *mf_jcc_p = (i.tm.base_opcode & 0x0e) >> 1;
e379e5f3
L
8881 *branch_p = align_branch_jcc;
8882 if ((align_branch & align_branch_jcc_bit))
8883 add_padding = 1;
8884 }
8885 }
8886 else if (is_any_vex_encoding (&i.tm))
8887 return 0;
8888 else if ((i.tm.base_opcode | 1) == 0xc3)
8889 {
8890 /* Near ret. */
8891 *branch_p = align_branch_ret;
8892 if ((align_branch & align_branch_ret_bit))
8893 add_padding = 1;
8894 }
8895 else
8896 {
8897 /* Check for indirect jmp, direct and indirect calls. */
8898 if (i.tm.base_opcode == 0xe8)
8899 {
8900 /* Direct call. */
8901 *branch_p = align_branch_call;
8902 if ((align_branch & align_branch_call_bit))
8903 add_padding = 1;
8904 }
8905 else if (i.tm.base_opcode == 0xff
8906 && (i.tm.extension_opcode == 2
8907 || i.tm.extension_opcode == 4))
8908 {
8909 /* Indirect call and jmp. */
8910 *branch_p = align_branch_indirect;
8911 if ((align_branch & align_branch_indirect_bit))
8912 add_padding = 1;
8913 }
8914
8915 if (add_padding
8916 && i.disp_operands
8917 && tls_get_addr
8918 && (i.op[0].disps->X_op == O_symbol
8919 || (i.op[0].disps->X_op == O_subtract
8920 && i.op[0].disps->X_op_symbol == GOT_symbol)))
8921 {
8922 symbolS *s = i.op[0].disps->X_add_symbol;
8923 /* No padding to call to global or undefined tls_get_addr. */
8924 if ((S_IS_EXTERNAL (s) || !S_IS_DEFINED (s))
8925 && strcmp (S_GET_NAME (s), tls_get_addr) == 0)
8926 return 0;
8927 }
8928 }
8929
8930 if (add_padding
8931 && last_insn.kind != last_insn_other
8932 && last_insn.seg == now_seg)
8933 {
8934 if (flag_debug)
8935 as_warn_where (last_insn.file, last_insn.line,
8936 _("`%s` skips -malign-branch-boundary on `%s`"),
8937 last_insn.name, i.tm.name);
8938 return 0;
8939 }
8940
8941 return add_padding;
8942}
8943
29b0f896 8944static void
e3bb37b5 8945output_insn (void)
29b0f896 8946{
2bbd9c25
JJ
8947 fragS *insn_start_frag;
8948 offsetT insn_start_off;
e379e5f3
L
8949 fragS *fragP = NULL;
8950 enum align_branch_kind branch = align_branch_none;
79d72f45
HL
8951 /* The initializer is arbitrary just to avoid uninitialized error.
8952 it's actually either assigned in add_branch_padding_frag_p
8953 or never be used. */
8954 enum mf_jcc_kind mf_jcc = mf_jcc_jo;
2bbd9c25 8955
b4a3a7b4
L
8956#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8957 if (IS_ELF && x86_used_note)
8958 {
8959 if (i.tm.cpu_flags.bitfield.cpucmov)
8960 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_CMOV;
8961 if (i.tm.cpu_flags.bitfield.cpusse)
8962 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE;
8963 if (i.tm.cpu_flags.bitfield.cpusse2)
8964 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE2;
8965 if (i.tm.cpu_flags.bitfield.cpusse3)
8966 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE3;
8967 if (i.tm.cpu_flags.bitfield.cpussse3)
8968 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSSE3;
8969 if (i.tm.cpu_flags.bitfield.cpusse4_1)
8970 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_1;
8971 if (i.tm.cpu_flags.bitfield.cpusse4_2)
8972 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_2;
8973 if (i.tm.cpu_flags.bitfield.cpuavx)
8974 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX;
8975 if (i.tm.cpu_flags.bitfield.cpuavx2)
8976 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX2;
8977 if (i.tm.cpu_flags.bitfield.cpufma)
8978 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_FMA;
8979 if (i.tm.cpu_flags.bitfield.cpuavx512f)
8980 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512F;
8981 if (i.tm.cpu_flags.bitfield.cpuavx512cd)
8982 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512CD;
8983 if (i.tm.cpu_flags.bitfield.cpuavx512er)
8984 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512ER;
8985 if (i.tm.cpu_flags.bitfield.cpuavx512pf)
8986 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512PF;
8987 if (i.tm.cpu_flags.bitfield.cpuavx512vl)
8988 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512VL;
8989 if (i.tm.cpu_flags.bitfield.cpuavx512dq)
8990 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512DQ;
8991 if (i.tm.cpu_flags.bitfield.cpuavx512bw)
8992 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512BW;
8993 if (i.tm.cpu_flags.bitfield.cpuavx512_4fmaps)
8994 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS;
8995 if (i.tm.cpu_flags.bitfield.cpuavx512_4vnniw)
8996 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW;
8997 if (i.tm.cpu_flags.bitfield.cpuavx512_bitalg)
8998 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BITALG;
8999 if (i.tm.cpu_flags.bitfield.cpuavx512ifma)
9000 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_IFMA;
9001 if (i.tm.cpu_flags.bitfield.cpuavx512vbmi)
9002 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI;
9003 if (i.tm.cpu_flags.bitfield.cpuavx512_vbmi2)
9004 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2;
9005 if (i.tm.cpu_flags.bitfield.cpuavx512_vnni)
9006 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VNNI;
462cac58
L
9007 if (i.tm.cpu_flags.bitfield.cpuavx512_bf16)
9008 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BF16;
b4a3a7b4
L
9009
9010 if (i.tm.cpu_flags.bitfield.cpu8087
9011 || i.tm.cpu_flags.bitfield.cpu287
9012 || i.tm.cpu_flags.bitfield.cpu387
9013 || i.tm.cpu_flags.bitfield.cpu687
9014 || i.tm.cpu_flags.bitfield.cpufisttp)
9015 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
319ff62c
JB
9016 if (i.has_regmmx
9017 || i.tm.base_opcode == 0xf77 /* emms */
a7e12755
L
9018 || i.tm.base_opcode == 0xf0e /* femms */
9019 || i.tm.base_opcode == 0xf2a /* cvtpi2ps */
9020 || i.tm.base_opcode == 0x660f2a /* cvtpi2pd */)
b4a3a7b4
L
9021 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
9022 if (i.has_regxmm)
9023 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
9024 if (i.has_regymm)
9025 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
9026 if (i.has_regzmm)
9027 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
9028 if (i.tm.cpu_flags.bitfield.cpufxsr)
9029 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
9030 if (i.tm.cpu_flags.bitfield.cpuxsave)
9031 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
9032 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
9033 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
9034 if (i.tm.cpu_flags.bitfield.cpuxsavec)
9035 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
9036 }
9037#endif
9038
29b0f896
AM
9039 /* Tie dwarf2 debug info to the address at the start of the insn.
9040 We can't do this after the insn has been output as the current
9041 frag may have been closed off. eg. by frag_var. */
9042 dwarf2_emit_insn (0);
9043
2bbd9c25
JJ
9044 insn_start_frag = frag_now;
9045 insn_start_off = frag_now_fix ();
9046
79d72f45 9047 if (add_branch_padding_frag_p (&branch, &mf_jcc))
e379e5f3
L
9048 {
9049 char *p;
9050 /* Branch can be 8 bytes. Leave some room for prefixes. */
9051 unsigned int max_branch_padding_size = 14;
9052
9053 /* Align section to boundary. */
9054 record_alignment (now_seg, align_branch_power);
9055
9056 /* Make room for padding. */
9057 frag_grow (max_branch_padding_size);
9058
9059 /* Start of the padding. */
9060 p = frag_more (0);
9061
9062 fragP = frag_now;
9063
9064 frag_var (rs_machine_dependent, max_branch_padding_size, 0,
9065 ENCODE_RELAX_STATE (BRANCH_PADDING, 0),
9066 NULL, 0, p);
9067
79d72f45 9068 fragP->tc_frag_data.mf_type = mf_jcc;
e379e5f3
L
9069 fragP->tc_frag_data.branch_type = branch;
9070 fragP->tc_frag_data.max_bytes = max_branch_padding_size;
9071 }
9072
29b0f896 9073 /* Output jumps. */
0cfa3eb3 9074 if (i.tm.opcode_modifier.jump == JUMP)
29b0f896 9075 output_branch ();
0cfa3eb3
JB
9076 else if (i.tm.opcode_modifier.jump == JUMP_BYTE
9077 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896 9078 output_jump ();
0cfa3eb3 9079 else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT)
29b0f896
AM
9080 output_interseg_jump ();
9081 else
9082 {
9083 /* Output normal instructions here. */
9084 char *p;
9085 unsigned char *q;
47465058 9086 unsigned int j;
331d2d0d 9087 unsigned int prefix;
79d72f45 9088 enum mf_cmp_kind mf_cmp;
4dffcebc 9089
e4e00185 9090 if (avoid_fence
c3949f43
JB
9091 && (i.tm.base_opcode == 0xfaee8
9092 || i.tm.base_opcode == 0xfaef0
9093 || i.tm.base_opcode == 0xfaef8))
e4e00185
AS
9094 {
9095 /* Encode lfence, mfence, and sfence as
9096 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
9097 offsetT val = 0x240483f0ULL;
9098 p = frag_more (5);
9099 md_number_to_chars (p, val, 5);
9100 return;
9101 }
9102
d022bddd
IT
9103 /* Some processors fail on LOCK prefix. This options makes
9104 assembler ignore LOCK prefix and serves as a workaround. */
9105 if (omit_lock_prefix)
9106 {
9107 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE)
9108 return;
9109 i.prefix[LOCK_PREFIX] = 0;
9110 }
9111
e379e5f3
L
9112 if (branch)
9113 /* Skip if this is a branch. */
9114 ;
79d72f45 9115 else if (add_fused_jcc_padding_frag_p (&mf_cmp))
e379e5f3
L
9116 {
9117 /* Make room for padding. */
9118 frag_grow (MAX_FUSED_JCC_PADDING_SIZE);
9119 p = frag_more (0);
9120
9121 fragP = frag_now;
9122
9123 frag_var (rs_machine_dependent, MAX_FUSED_JCC_PADDING_SIZE, 0,
9124 ENCODE_RELAX_STATE (FUSED_JCC_PADDING, 0),
9125 NULL, 0, p);
9126
79d72f45 9127 fragP->tc_frag_data.mf_type = mf_cmp;
e379e5f3
L
9128 fragP->tc_frag_data.branch_type = align_branch_fused;
9129 fragP->tc_frag_data.max_bytes = MAX_FUSED_JCC_PADDING_SIZE;
9130 }
9131 else if (add_branch_prefix_frag_p ())
9132 {
9133 unsigned int max_prefix_size = align_branch_prefix_size;
9134
9135 /* Make room for padding. */
9136 frag_grow (max_prefix_size);
9137 p = frag_more (0);
9138
9139 fragP = frag_now;
9140
9141 frag_var (rs_machine_dependent, max_prefix_size, 0,
9142 ENCODE_RELAX_STATE (BRANCH_PREFIX, 0),
9143 NULL, 0, p);
9144
9145 fragP->tc_frag_data.max_bytes = max_prefix_size;
9146 }
9147
43234a1e
L
9148 /* Since the VEX/EVEX prefix contains the implicit prefix, we
9149 don't need the explicit prefix. */
9150 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 9151 {
c0f3af97 9152 switch (i.tm.opcode_length)
bc4bd9ab 9153 {
c0f3af97
L
9154 case 3:
9155 if (i.tm.base_opcode & 0xff000000)
4dffcebc 9156 {
c0f3af97 9157 prefix = (i.tm.base_opcode >> 24) & 0xff;
c3949f43
JB
9158 if (!i.tm.cpu_flags.bitfield.cpupadlock
9159 || prefix != REPE_PREFIX_OPCODE
9160 || (i.prefix[REP_PREFIX] != REPE_PREFIX_OPCODE))
9161 add_prefix (prefix);
c0f3af97
L
9162 }
9163 break;
9164 case 2:
9165 if ((i.tm.base_opcode & 0xff0000) != 0)
9166 {
9167 prefix = (i.tm.base_opcode >> 16) & 0xff;
c3949f43 9168 add_prefix (prefix);
4dffcebc 9169 }
c0f3af97
L
9170 break;
9171 case 1:
9172 break;
390c91cf
L
9173 case 0:
9174 /* Check for pseudo prefixes. */
9175 as_bad_where (insn_start_frag->fr_file,
9176 insn_start_frag->fr_line,
9177 _("pseudo prefix without instruction"));
9178 return;
c0f3af97
L
9179 default:
9180 abort ();
bc4bd9ab 9181 }
c0f3af97 9182
6d19a37a 9183#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
9184 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
9185 R_X86_64_GOTTPOFF relocation so that linker can safely
14470f07
L
9186 perform IE->LE optimization. A dummy REX_OPCODE prefix
9187 is also needed for lea with R_X86_64_GOTPC32_TLSDESC
9188 relocation for GDesc -> IE/LE optimization. */
cf61b747
L
9189 if (x86_elf_abi == X86_64_X32_ABI
9190 && i.operands == 2
14470f07
L
9191 && (i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
9192 || i.reloc[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
cf61b747
L
9193 && i.prefix[REX_PREFIX] == 0)
9194 add_prefix (REX_OPCODE);
6d19a37a 9195#endif
cf61b747 9196
c0f3af97
L
9197 /* The prefix bytes. */
9198 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
9199 if (*q)
9200 FRAG_APPEND_1_CHAR (*q);
0f10071e 9201 }
ae5c1c7b 9202 else
c0f3af97
L
9203 {
9204 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
9205 if (*q)
9206 switch (j)
9207 {
9208 case REX_PREFIX:
9209 /* REX byte is encoded in VEX prefix. */
9210 break;
9211 case SEG_PREFIX:
9212 case ADDR_PREFIX:
9213 FRAG_APPEND_1_CHAR (*q);
9214 break;
9215 default:
9216 /* There should be no other prefixes for instructions
9217 with VEX prefix. */
9218 abort ();
9219 }
9220
43234a1e
L
9221 /* For EVEX instructions i.vrex should become 0 after
9222 build_evex_prefix. For VEX instructions upper 16 registers
9223 aren't available, so VREX should be 0. */
9224 if (i.vrex)
9225 abort ();
c0f3af97
L
9226 /* Now the VEX prefix. */
9227 p = frag_more (i.vex.length);
9228 for (j = 0; j < i.vex.length; j++)
9229 p[j] = i.vex.bytes[j];
9230 }
252b5132 9231
29b0f896 9232 /* Now the opcode; be careful about word order here! */
4dffcebc 9233 if (i.tm.opcode_length == 1)
29b0f896
AM
9234 {
9235 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
9236 }
9237 else
9238 {
4dffcebc 9239 switch (i.tm.opcode_length)
331d2d0d 9240 {
43234a1e
L
9241 case 4:
9242 p = frag_more (4);
9243 *p++ = (i.tm.base_opcode >> 24) & 0xff;
9244 *p++ = (i.tm.base_opcode >> 16) & 0xff;
9245 break;
4dffcebc 9246 case 3:
331d2d0d
L
9247 p = frag_more (3);
9248 *p++ = (i.tm.base_opcode >> 16) & 0xff;
4dffcebc
L
9249 break;
9250 case 2:
9251 p = frag_more (2);
9252 break;
9253 default:
9254 abort ();
9255 break;
331d2d0d 9256 }
0f10071e 9257
29b0f896
AM
9258 /* Put out high byte first: can't use md_number_to_chars! */
9259 *p++ = (i.tm.base_opcode >> 8) & 0xff;
9260 *p = i.tm.base_opcode & 0xff;
9261 }
3e73aa7c 9262
29b0f896 9263 /* Now the modrm byte and sib byte (if present). */
40fb9820 9264 if (i.tm.opcode_modifier.modrm)
29b0f896 9265 {
4a3523fa
L
9266 FRAG_APPEND_1_CHAR ((i.rm.regmem << 0
9267 | i.rm.reg << 3
9268 | i.rm.mode << 6));
29b0f896
AM
9269 /* If i.rm.regmem == ESP (4)
9270 && i.rm.mode != (Register mode)
9271 && not 16 bit
9272 ==> need second modrm byte. */
9273 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
9274 && i.rm.mode != 3
dc821c5f 9275 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
4a3523fa
L
9276 FRAG_APPEND_1_CHAR ((i.sib.base << 0
9277 | i.sib.index << 3
9278 | i.sib.scale << 6));
29b0f896 9279 }
3e73aa7c 9280
29b0f896 9281 if (i.disp_operands)
2bbd9c25 9282 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 9283
29b0f896 9284 if (i.imm_operands)
2bbd9c25 9285 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
9286
9287 /*
9288 * frag_now_fix () returning plain abs_section_offset when we're in the
9289 * absolute section, and abs_section_offset not getting updated as data
9290 * gets added to the frag breaks the logic below.
9291 */
9292 if (now_seg != absolute_section)
9293 {
9294 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
9295 if (j > 15)
9296 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
9297 j);
e379e5f3
L
9298 else if (fragP)
9299 {
9300 /* NB: Don't add prefix with GOTPC relocation since
9301 output_disp() above depends on the fixed encoding
9302 length. Can't add prefix with TLS relocation since
9303 it breaks TLS linker optimization. */
9304 unsigned int max = i.has_gotpc_tls_reloc ? 0 : 15 - j;
9305 /* Prefix count on the current instruction. */
9306 unsigned int count = i.vex.length;
9307 unsigned int k;
9308 for (k = 0; k < ARRAY_SIZE (i.prefix); k++)
9309 /* REX byte is encoded in VEX/EVEX prefix. */
9310 if (i.prefix[k] && (k != REX_PREFIX || !i.vex.length))
9311 count++;
9312
9313 /* Count prefixes for extended opcode maps. */
9314 if (!i.vex.length)
9315 switch (i.tm.opcode_length)
9316 {
9317 case 3:
9318 if (((i.tm.base_opcode >> 16) & 0xff) == 0xf)
9319 {
9320 count++;
9321 switch ((i.tm.base_opcode >> 8) & 0xff)
9322 {
9323 case 0x38:
9324 case 0x3a:
9325 count++;
9326 break;
9327 default:
9328 break;
9329 }
9330 }
9331 break;
9332 case 2:
9333 if (((i.tm.base_opcode >> 8) & 0xff) == 0xf)
9334 count++;
9335 break;
9336 case 1:
9337 break;
9338 default:
9339 abort ();
9340 }
9341
9342 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
9343 == BRANCH_PREFIX)
9344 {
9345 /* Set the maximum prefix size in BRANCH_PREFIX
9346 frag. */
9347 if (fragP->tc_frag_data.max_bytes > max)
9348 fragP->tc_frag_data.max_bytes = max;
9349 if (fragP->tc_frag_data.max_bytes > count)
9350 fragP->tc_frag_data.max_bytes -= count;
9351 else
9352 fragP->tc_frag_data.max_bytes = 0;
9353 }
9354 else
9355 {
9356 /* Remember the maximum prefix size in FUSED_JCC_PADDING
9357 frag. */
9358 unsigned int max_prefix_size;
9359 if (align_branch_prefix_size > max)
9360 max_prefix_size = max;
9361 else
9362 max_prefix_size = align_branch_prefix_size;
9363 if (max_prefix_size > count)
9364 fragP->tc_frag_data.max_prefix_length
9365 = max_prefix_size - count;
9366 }
9367
9368 /* Use existing segment prefix if possible. Use CS
9369 segment prefix in 64-bit mode. In 32-bit mode, use SS
9370 segment prefix with ESP/EBP base register and use DS
9371 segment prefix without ESP/EBP base register. */
9372 if (i.prefix[SEG_PREFIX])
9373 fragP->tc_frag_data.default_prefix = i.prefix[SEG_PREFIX];
9374 else if (flag_code == CODE_64BIT)
9375 fragP->tc_frag_data.default_prefix = CS_PREFIX_OPCODE;
9376 else if (i.base_reg
9377 && (i.base_reg->reg_num == 4
9378 || i.base_reg->reg_num == 5))
9379 fragP->tc_frag_data.default_prefix = SS_PREFIX_OPCODE;
9380 else
9381 fragP->tc_frag_data.default_prefix = DS_PREFIX_OPCODE;
9382 }
9c33702b 9383 }
29b0f896 9384 }
252b5132 9385
e379e5f3
L
9386 /* NB: Don't work with COND_JUMP86 without i386. */
9387 if (align_branch_power
9388 && now_seg != absolute_section
9389 && cpu_arch_flags.bitfield.cpui386)
9390 {
9391 /* Terminate each frag so that we can add prefix and check for
9392 fused jcc. */
9393 frag_wane (frag_now);
9394 frag_new (0);
9395 }
9396
29b0f896
AM
9397#ifdef DEBUG386
9398 if (flag_debug)
9399 {
7b81dfbb 9400 pi ("" /*line*/, &i);
29b0f896
AM
9401 }
9402#endif /* DEBUG386 */
9403}
252b5132 9404
e205caa7
L
9405/* Return the size of the displacement operand N. */
9406
9407static int
9408disp_size (unsigned int n)
9409{
9410 int size = 4;
43234a1e 9411
b5014f7a 9412 if (i.types[n].bitfield.disp64)
40fb9820
L
9413 size = 8;
9414 else if (i.types[n].bitfield.disp8)
9415 size = 1;
9416 else if (i.types[n].bitfield.disp16)
9417 size = 2;
e205caa7
L
9418 return size;
9419}
9420
9421/* Return the size of the immediate operand N. */
9422
9423static int
9424imm_size (unsigned int n)
9425{
9426 int size = 4;
40fb9820
L
9427 if (i.types[n].bitfield.imm64)
9428 size = 8;
9429 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
9430 size = 1;
9431 else if (i.types[n].bitfield.imm16)
9432 size = 2;
e205caa7
L
9433 return size;
9434}
9435
29b0f896 9436static void
64e74474 9437output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9438{
9439 char *p;
9440 unsigned int n;
252b5132 9441
29b0f896
AM
9442 for (n = 0; n < i.operands; n++)
9443 {
b5014f7a 9444 if (operand_type_check (i.types[n], disp))
29b0f896
AM
9445 {
9446 if (i.op[n].disps->X_op == O_constant)
9447 {
e205caa7 9448 int size = disp_size (n);
43234a1e 9449 offsetT val = i.op[n].disps->X_add_number;
252b5132 9450
629cfaf1
JB
9451 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
9452 size);
29b0f896
AM
9453 p = frag_more (size);
9454 md_number_to_chars (p, val, size);
9455 }
9456 else
9457 {
f86103b7 9458 enum bfd_reloc_code_real reloc_type;
e205caa7 9459 int size = disp_size (n);
40fb9820 9460 int sign = i.types[n].bitfield.disp32s;
29b0f896 9461 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 9462 fixS *fixP;
29b0f896 9463
e205caa7 9464 /* We can't have 8 bit displacement here. */
9c2799c2 9465 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 9466
29b0f896
AM
9467 /* The PC relative address is computed relative
9468 to the instruction boundary, so in case immediate
9469 fields follows, we need to adjust the value. */
9470 if (pcrel && i.imm_operands)
9471 {
29b0f896 9472 unsigned int n1;
e205caa7 9473 int sz = 0;
252b5132 9474
29b0f896 9475 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 9476 if (operand_type_check (i.types[n1], imm))
252b5132 9477 {
e205caa7
L
9478 /* Only one immediate is allowed for PC
9479 relative address. */
9c2799c2 9480 gas_assert (sz == 0);
e205caa7
L
9481 sz = imm_size (n1);
9482 i.op[n].disps->X_add_number -= sz;
252b5132 9483 }
29b0f896 9484 /* We should find the immediate. */
9c2799c2 9485 gas_assert (sz != 0);
29b0f896 9486 }
520dc8e8 9487
29b0f896 9488 p = frag_more (size);
d258b828 9489 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 9490 if (GOT_symbol
2bbd9c25 9491 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 9492 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9493 || reloc_type == BFD_RELOC_X86_64_32S
9494 || (reloc_type == BFD_RELOC_64
9495 && object_64bit))
d6ab8113
JB
9496 && (i.op[n].disps->X_op == O_symbol
9497 || (i.op[n].disps->X_op == O_add
9498 && ((symbol_get_value_expression
9499 (i.op[n].disps->X_op_symbol)->X_op)
9500 == O_subtract))))
9501 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 9502 {
4fa24527 9503 if (!object_64bit)
7b81dfbb
AJ
9504 {
9505 reloc_type = BFD_RELOC_386_GOTPC;
e379e5f3 9506 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9507 i.op[n].imms->X_add_number +=
9508 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
9509 }
9510 else if (reloc_type == BFD_RELOC_64)
9511 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 9512 else
7b81dfbb
AJ
9513 /* Don't do the adjustment for x86-64, as there
9514 the pcrel addressing is relative to the _next_
9515 insn, and that is taken care of in other code. */
d6ab8113 9516 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 9517 }
e379e5f3
L
9518 else if (align_branch_power)
9519 {
9520 switch (reloc_type)
9521 {
9522 case BFD_RELOC_386_TLS_GD:
9523 case BFD_RELOC_386_TLS_LDM:
9524 case BFD_RELOC_386_TLS_IE:
9525 case BFD_RELOC_386_TLS_IE_32:
9526 case BFD_RELOC_386_TLS_GOTIE:
9527 case BFD_RELOC_386_TLS_GOTDESC:
9528 case BFD_RELOC_386_TLS_DESC_CALL:
9529 case BFD_RELOC_X86_64_TLSGD:
9530 case BFD_RELOC_X86_64_TLSLD:
9531 case BFD_RELOC_X86_64_GOTTPOFF:
9532 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
9533 case BFD_RELOC_X86_64_TLSDESC_CALL:
9534 i.has_gotpc_tls_reloc = TRUE;
9535 default:
9536 break;
9537 }
9538 }
02a86693
L
9539 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
9540 size, i.op[n].disps, pcrel,
9541 reloc_type);
9542 /* Check for "call/jmp *mem", "mov mem, %reg",
9543 "test %reg, mem" and "binop mem, %reg" where binop
9544 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
9545 instructions without data prefix. Always generate
9546 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
9547 if (i.prefix[DATA_PREFIX] == 0
9548 && (generate_relax_relocations
9549 || (!object_64bit
9550 && i.rm.mode == 0
9551 && i.rm.regmem == 5))
0cb4071e
L
9552 && (i.rm.mode == 2
9553 || (i.rm.mode == 0 && i.rm.regmem == 5))
2ae4c703 9554 && !is_any_vex_encoding(&i.tm)
02a86693
L
9555 && ((i.operands == 1
9556 && i.tm.base_opcode == 0xff
9557 && (i.rm.reg == 2 || i.rm.reg == 4))
9558 || (i.operands == 2
9559 && (i.tm.base_opcode == 0x8b
9560 || i.tm.base_opcode == 0x85
2ae4c703 9561 || (i.tm.base_opcode & ~0x38) == 0x03))))
02a86693
L
9562 {
9563 if (object_64bit)
9564 {
9565 fixP->fx_tcbit = i.rex != 0;
9566 if (i.base_reg
e968fc9b 9567 && (i.base_reg->reg_num == RegIP))
02a86693
L
9568 fixP->fx_tcbit2 = 1;
9569 }
9570 else
9571 fixP->fx_tcbit2 = 1;
9572 }
29b0f896
AM
9573 }
9574 }
9575 }
9576}
252b5132 9577
29b0f896 9578static void
64e74474 9579output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9580{
9581 char *p;
9582 unsigned int n;
252b5132 9583
29b0f896
AM
9584 for (n = 0; n < i.operands; n++)
9585 {
43234a1e
L
9586 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
9587 if (i.rounding && (int) n == i.rounding->operand)
9588 continue;
9589
40fb9820 9590 if (operand_type_check (i.types[n], imm))
29b0f896
AM
9591 {
9592 if (i.op[n].imms->X_op == O_constant)
9593 {
e205caa7 9594 int size = imm_size (n);
29b0f896 9595 offsetT val;
b4cac588 9596
29b0f896
AM
9597 val = offset_in_range (i.op[n].imms->X_add_number,
9598 size);
9599 p = frag_more (size);
9600 md_number_to_chars (p, val, size);
9601 }
9602 else
9603 {
9604 /* Not absolute_section.
9605 Need a 32-bit fixup (don't support 8bit
9606 non-absolute imms). Try to support other
9607 sizes ... */
f86103b7 9608 enum bfd_reloc_code_real reloc_type;
e205caa7
L
9609 int size = imm_size (n);
9610 int sign;
29b0f896 9611
40fb9820 9612 if (i.types[n].bitfield.imm32s
a7d61044 9613 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 9614 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 9615 sign = 1;
e205caa7
L
9616 else
9617 sign = 0;
520dc8e8 9618
29b0f896 9619 p = frag_more (size);
d258b828 9620 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 9621
2bbd9c25
JJ
9622 /* This is tough to explain. We end up with this one if we
9623 * have operands that look like
9624 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
9625 * obtain the absolute address of the GOT, and it is strongly
9626 * preferable from a performance point of view to avoid using
9627 * a runtime relocation for this. The actual sequence of
9628 * instructions often look something like:
9629 *
9630 * call .L66
9631 * .L66:
9632 * popl %ebx
9633 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
9634 *
9635 * The call and pop essentially return the absolute address
9636 * of the label .L66 and store it in %ebx. The linker itself
9637 * will ultimately change the first operand of the addl so
9638 * that %ebx points to the GOT, but to keep things simple, the
9639 * .o file must have this operand set so that it generates not
9640 * the absolute address of .L66, but the absolute address of
9641 * itself. This allows the linker itself simply treat a GOTPC
9642 * relocation as asking for a pcrel offset to the GOT to be
9643 * added in, and the addend of the relocation is stored in the
9644 * operand field for the instruction itself.
9645 *
9646 * Our job here is to fix the operand so that it would add
9647 * the correct offset so that %ebx would point to itself. The
9648 * thing that is tricky is that .-.L66 will point to the
9649 * beginning of the instruction, so we need to further modify
9650 * the operand so that it will point to itself. There are
9651 * other cases where you have something like:
9652 *
9653 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
9654 *
9655 * and here no correction would be required. Internally in
9656 * the assembler we treat operands of this form as not being
9657 * pcrel since the '.' is explicitly mentioned, and I wonder
9658 * whether it would simplify matters to do it this way. Who
9659 * knows. In earlier versions of the PIC patches, the
9660 * pcrel_adjust field was used to store the correction, but
9661 * since the expression is not pcrel, I felt it would be
9662 * confusing to do it this way. */
9663
d6ab8113 9664 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9665 || reloc_type == BFD_RELOC_X86_64_32S
9666 || reloc_type == BFD_RELOC_64)
29b0f896
AM
9667 && GOT_symbol
9668 && GOT_symbol == i.op[n].imms->X_add_symbol
9669 && (i.op[n].imms->X_op == O_symbol
9670 || (i.op[n].imms->X_op == O_add
9671 && ((symbol_get_value_expression
9672 (i.op[n].imms->X_op_symbol)->X_op)
9673 == O_subtract))))
9674 {
4fa24527 9675 if (!object_64bit)
d6ab8113 9676 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 9677 else if (size == 4)
d6ab8113 9678 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
9679 else if (size == 8)
9680 reloc_type = BFD_RELOC_X86_64_GOTPC64;
e379e5f3 9681 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9682 i.op[n].imms->X_add_number +=
9683 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 9684 }
29b0f896
AM
9685 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
9686 i.op[n].imms, 0, reloc_type);
9687 }
9688 }
9689 }
252b5132
RH
9690}
9691\f
d182319b
JB
9692/* x86_cons_fix_new is called via the expression parsing code when a
9693 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
9694static int cons_sign = -1;
9695
9696void
e3bb37b5 9697x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 9698 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 9699{
d258b828 9700 r = reloc (len, 0, cons_sign, r);
d182319b
JB
9701
9702#ifdef TE_PE
9703 if (exp->X_op == O_secrel)
9704 {
9705 exp->X_op = O_symbol;
9706 r = BFD_RELOC_32_SECREL;
9707 }
9708#endif
9709
9710 fix_new_exp (frag, off, len, exp, 0, r);
9711}
9712
357d1bd8
L
9713/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
9714 purpose of the `.dc.a' internal pseudo-op. */
9715
9716int
9717x86_address_bytes (void)
9718{
9719 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
9720 return 4;
9721 return stdoutput->arch_info->bits_per_address / 8;
9722}
9723
d382c579
TG
9724#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
9725 || defined (LEX_AT)
d258b828 9726# define lex_got(reloc, adjust, types) NULL
718ddfc0 9727#else
f3c180ae
AM
9728/* Parse operands of the form
9729 <symbol>@GOTOFF+<nnn>
9730 and similar .plt or .got references.
9731
9732 If we find one, set up the correct relocation in RELOC and copy the
9733 input string, minus the `@GOTOFF' into a malloc'd buffer for
9734 parsing by the calling routine. Return this buffer, and if ADJUST
9735 is non-null set it to the length of the string we removed from the
9736 input line. Otherwise return NULL. */
9737static char *
91d6fa6a 9738lex_got (enum bfd_reloc_code_real *rel,
64e74474 9739 int *adjust,
d258b828 9740 i386_operand_type *types)
f3c180ae 9741{
7b81dfbb
AJ
9742 /* Some of the relocations depend on the size of what field is to
9743 be relocated. But in our callers i386_immediate and i386_displacement
9744 we don't yet know the operand size (this will be set by insn
9745 matching). Hence we record the word32 relocation here,
9746 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
9747 static const struct {
9748 const char *str;
cff8d58a 9749 int len;
4fa24527 9750 const enum bfd_reloc_code_real rel[2];
40fb9820 9751 const i386_operand_type types64;
f3c180ae 9752 } gotrel[] = {
8ce3d284 9753#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
9754 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
9755 BFD_RELOC_SIZE32 },
9756 OPERAND_TYPE_IMM32_64 },
8ce3d284 9757#endif
cff8d58a
L
9758 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
9759 BFD_RELOC_X86_64_PLTOFF64 },
40fb9820 9760 OPERAND_TYPE_IMM64 },
cff8d58a
L
9761 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
9762 BFD_RELOC_X86_64_PLT32 },
40fb9820 9763 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9764 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
9765 BFD_RELOC_X86_64_GOTPLT64 },
40fb9820 9766 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
9767 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
9768 BFD_RELOC_X86_64_GOTOFF64 },
40fb9820 9769 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
9770 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
9771 BFD_RELOC_X86_64_GOTPCREL },
40fb9820 9772 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9773 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
9774 BFD_RELOC_X86_64_TLSGD },
40fb9820 9775 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9776 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
9777 _dummy_first_bfd_reloc_code_real },
40fb9820 9778 OPERAND_TYPE_NONE },
cff8d58a
L
9779 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
9780 BFD_RELOC_X86_64_TLSLD },
40fb9820 9781 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9782 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
9783 BFD_RELOC_X86_64_GOTTPOFF },
40fb9820 9784 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9785 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
9786 BFD_RELOC_X86_64_TPOFF32 },
40fb9820 9787 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
9788 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
9789 _dummy_first_bfd_reloc_code_real },
40fb9820 9790 OPERAND_TYPE_NONE },
cff8d58a
L
9791 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
9792 BFD_RELOC_X86_64_DTPOFF32 },
40fb9820 9793 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
9794 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
9795 _dummy_first_bfd_reloc_code_real },
40fb9820 9796 OPERAND_TYPE_NONE },
cff8d58a
L
9797 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
9798 _dummy_first_bfd_reloc_code_real },
40fb9820 9799 OPERAND_TYPE_NONE },
cff8d58a
L
9800 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
9801 BFD_RELOC_X86_64_GOT32 },
40fb9820 9802 OPERAND_TYPE_IMM32_32S_64_DISP32 },
cff8d58a
L
9803 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
9804 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
40fb9820 9805 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9806 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
9807 BFD_RELOC_X86_64_TLSDESC_CALL },
40fb9820 9808 OPERAND_TYPE_IMM32_32S_DISP32 },
f3c180ae
AM
9809 };
9810 char *cp;
9811 unsigned int j;
9812
d382c579 9813#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
9814 if (!IS_ELF)
9815 return NULL;
d382c579 9816#endif
718ddfc0 9817
f3c180ae 9818 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 9819 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
9820 return NULL;
9821
47465058 9822 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 9823 {
cff8d58a 9824 int len = gotrel[j].len;
28f81592 9825 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 9826 {
4fa24527 9827 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 9828 {
28f81592
AM
9829 int first, second;
9830 char *tmpbuf, *past_reloc;
f3c180ae 9831
91d6fa6a 9832 *rel = gotrel[j].rel[object_64bit];
f3c180ae 9833
3956db08
JB
9834 if (types)
9835 {
9836 if (flag_code != CODE_64BIT)
40fb9820
L
9837 {
9838 types->bitfield.imm32 = 1;
9839 types->bitfield.disp32 = 1;
9840 }
3956db08
JB
9841 else
9842 *types = gotrel[j].types64;
9843 }
9844
8fd4256d 9845 if (j != 0 && GOT_symbol == NULL)
f3c180ae
AM
9846 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
9847
28f81592 9848 /* The length of the first part of our input line. */
f3c180ae 9849 first = cp - input_line_pointer;
28f81592
AM
9850
9851 /* The second part goes from after the reloc token until
67c11a9b 9852 (and including) an end_of_line char or comma. */
28f81592 9853 past_reloc = cp + 1 + len;
67c11a9b
AM
9854 cp = past_reloc;
9855 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
9856 ++cp;
9857 second = cp + 1 - past_reloc;
28f81592
AM
9858
9859 /* Allocate and copy string. The trailing NUL shouldn't
9860 be necessary, but be safe. */
add39d23 9861 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 9862 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
9863 if (second != 0 && *past_reloc != ' ')
9864 /* Replace the relocation token with ' ', so that
9865 errors like foo@GOTOFF1 will be detected. */
9866 tmpbuf[first++] = ' ';
af89796a
L
9867 else
9868 /* Increment length by 1 if the relocation token is
9869 removed. */
9870 len++;
9871 if (adjust)
9872 *adjust = len;
0787a12d
AM
9873 memcpy (tmpbuf + first, past_reloc, second);
9874 tmpbuf[first + second] = '\0';
f3c180ae
AM
9875 return tmpbuf;
9876 }
9877
4fa24527
JB
9878 as_bad (_("@%s reloc is not supported with %d-bit output format"),
9879 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
9880 return NULL;
9881 }
9882 }
9883
9884 /* Might be a symbol version string. Don't as_bad here. */
9885 return NULL;
9886}
4e4f7c87 9887#endif
f3c180ae 9888
a988325c
NC
9889#ifdef TE_PE
9890#ifdef lex_got
9891#undef lex_got
9892#endif
9893/* Parse operands of the form
9894 <symbol>@SECREL32+<nnn>
9895
9896 If we find one, set up the correct relocation in RELOC and copy the
9897 input string, minus the `@SECREL32' into a malloc'd buffer for
9898 parsing by the calling routine. Return this buffer, and if ADJUST
9899 is non-null set it to the length of the string we removed from the
34bca508
L
9900 input line. Otherwise return NULL.
9901
a988325c
NC
9902 This function is copied from the ELF version above adjusted for PE targets. */
9903
9904static char *
9905lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
9906 int *adjust ATTRIBUTE_UNUSED,
d258b828 9907 i386_operand_type *types)
a988325c
NC
9908{
9909 static const struct
9910 {
9911 const char *str;
9912 int len;
9913 const enum bfd_reloc_code_real rel[2];
9914 const i386_operand_type types64;
9915 }
9916 gotrel[] =
9917 {
9918 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
9919 BFD_RELOC_32_SECREL },
9920 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
9921 };
9922
9923 char *cp;
9924 unsigned j;
9925
9926 for (cp = input_line_pointer; *cp != '@'; cp++)
9927 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
9928 return NULL;
9929
9930 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
9931 {
9932 int len = gotrel[j].len;
9933
9934 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
9935 {
9936 if (gotrel[j].rel[object_64bit] != 0)
9937 {
9938 int first, second;
9939 char *tmpbuf, *past_reloc;
9940
9941 *rel = gotrel[j].rel[object_64bit];
9942 if (adjust)
9943 *adjust = len;
9944
9945 if (types)
9946 {
9947 if (flag_code != CODE_64BIT)
9948 {
9949 types->bitfield.imm32 = 1;
9950 types->bitfield.disp32 = 1;
9951 }
9952 else
9953 *types = gotrel[j].types64;
9954 }
9955
9956 /* The length of the first part of our input line. */
9957 first = cp - input_line_pointer;
9958
9959 /* The second part goes from after the reloc token until
9960 (and including) an end_of_line char or comma. */
9961 past_reloc = cp + 1 + len;
9962 cp = past_reloc;
9963 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
9964 ++cp;
9965 second = cp + 1 - past_reloc;
9966
9967 /* Allocate and copy string. The trailing NUL shouldn't
9968 be necessary, but be safe. */
add39d23 9969 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
9970 memcpy (tmpbuf, input_line_pointer, first);
9971 if (second != 0 && *past_reloc != ' ')
9972 /* Replace the relocation token with ' ', so that
9973 errors like foo@SECLREL321 will be detected. */
9974 tmpbuf[first++] = ' ';
9975 memcpy (tmpbuf + first, past_reloc, second);
9976 tmpbuf[first + second] = '\0';
9977 return tmpbuf;
9978 }
9979
9980 as_bad (_("@%s reloc is not supported with %d-bit output format"),
9981 gotrel[j].str, 1 << (5 + object_64bit));
9982 return NULL;
9983 }
9984 }
9985
9986 /* Might be a symbol version string. Don't as_bad here. */
9987 return NULL;
9988}
9989
9990#endif /* TE_PE */
9991
62ebcb5c 9992bfd_reloc_code_real_type
e3bb37b5 9993x86_cons (expressionS *exp, int size)
f3c180ae 9994{
62ebcb5c
AM
9995 bfd_reloc_code_real_type got_reloc = NO_RELOC;
9996
ee86248c
JB
9997 intel_syntax = -intel_syntax;
9998
3c7b9c2c 9999 exp->X_md = 0;
4fa24527 10000 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
10001 {
10002 /* Handle @GOTOFF and the like in an expression. */
10003 char *save;
10004 char *gotfree_input_line;
4a57f2cf 10005 int adjust = 0;
f3c180ae
AM
10006
10007 save = input_line_pointer;
d258b828 10008 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
10009 if (gotfree_input_line)
10010 input_line_pointer = gotfree_input_line;
10011
10012 expression (exp);
10013
10014 if (gotfree_input_line)
10015 {
10016 /* expression () has merrily parsed up to the end of line,
10017 or a comma - in the wrong buffer. Transfer how far
10018 input_line_pointer has moved to the right buffer. */
10019 input_line_pointer = (save
10020 + (input_line_pointer - gotfree_input_line)
10021 + adjust);
10022 free (gotfree_input_line);
3992d3b7
AM
10023 if (exp->X_op == O_constant
10024 || exp->X_op == O_absent
10025 || exp->X_op == O_illegal
0398aac5 10026 || exp->X_op == O_register
3992d3b7
AM
10027 || exp->X_op == O_big)
10028 {
10029 char c = *input_line_pointer;
10030 *input_line_pointer = 0;
10031 as_bad (_("missing or invalid expression `%s'"), save);
10032 *input_line_pointer = c;
10033 }
b9519cfe
L
10034 else if ((got_reloc == BFD_RELOC_386_PLT32
10035 || got_reloc == BFD_RELOC_X86_64_PLT32)
10036 && exp->X_op != O_symbol)
10037 {
10038 char c = *input_line_pointer;
10039 *input_line_pointer = 0;
10040 as_bad (_("invalid PLT expression `%s'"), save);
10041 *input_line_pointer = c;
10042 }
f3c180ae
AM
10043 }
10044 }
10045 else
10046 expression (exp);
ee86248c
JB
10047
10048 intel_syntax = -intel_syntax;
10049
10050 if (intel_syntax)
10051 i386_intel_simplify (exp);
62ebcb5c
AM
10052
10053 return got_reloc;
f3c180ae 10054}
f3c180ae 10055
9f32dd5b
L
10056static void
10057signed_cons (int size)
6482c264 10058{
d182319b
JB
10059 if (flag_code == CODE_64BIT)
10060 cons_sign = 1;
10061 cons (size);
10062 cons_sign = -1;
6482c264
NC
10063}
10064
d182319b 10065#ifdef TE_PE
6482c264 10066static void
7016a5d5 10067pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
10068{
10069 expressionS exp;
10070
10071 do
10072 {
10073 expression (&exp);
10074 if (exp.X_op == O_symbol)
10075 exp.X_op = O_secrel;
10076
10077 emit_expr (&exp, 4);
10078 }
10079 while (*input_line_pointer++ == ',');
10080
10081 input_line_pointer--;
10082 demand_empty_rest_of_line ();
10083}
6482c264
NC
10084#endif
10085
43234a1e
L
10086/* Handle Vector operations. */
10087
10088static char *
10089check_VecOperations (char *op_string, char *op_end)
10090{
10091 const reg_entry *mask;
10092 const char *saved;
10093 char *end_op;
10094
10095 while (*op_string
10096 && (op_end == NULL || op_string < op_end))
10097 {
10098 saved = op_string;
10099 if (*op_string == '{')
10100 {
10101 op_string++;
10102
10103 /* Check broadcasts. */
10104 if (strncmp (op_string, "1to", 3) == 0)
10105 {
10106 int bcst_type;
10107
10108 if (i.broadcast)
10109 goto duplicated_vec_op;
10110
10111 op_string += 3;
10112 if (*op_string == '8')
8e6e0792 10113 bcst_type = 8;
b28d1bda 10114 else if (*op_string == '4')
8e6e0792 10115 bcst_type = 4;
b28d1bda 10116 else if (*op_string == '2')
8e6e0792 10117 bcst_type = 2;
43234a1e
L
10118 else if (*op_string == '1'
10119 && *(op_string+1) == '6')
10120 {
8e6e0792 10121 bcst_type = 16;
43234a1e
L
10122 op_string++;
10123 }
10124 else
10125 {
10126 as_bad (_("Unsupported broadcast: `%s'"), saved);
10127 return NULL;
10128 }
10129 op_string++;
10130
10131 broadcast_op.type = bcst_type;
10132 broadcast_op.operand = this_operand;
1f75763a 10133 broadcast_op.bytes = 0;
43234a1e
L
10134 i.broadcast = &broadcast_op;
10135 }
10136 /* Check masking operation. */
10137 else if ((mask = parse_register (op_string, &end_op)) != NULL)
10138 {
10139 /* k0 can't be used for write mask. */
f74a6307 10140 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 10141 {
6d2cd6b2
JB
10142 as_bad (_("`%s%s' can't be used for write mask"),
10143 register_prefix, mask->reg_name);
43234a1e
L
10144 return NULL;
10145 }
10146
10147 if (!i.mask)
10148 {
10149 mask_op.mask = mask;
10150 mask_op.zeroing = 0;
10151 mask_op.operand = this_operand;
10152 i.mask = &mask_op;
10153 }
10154 else
10155 {
10156 if (i.mask->mask)
10157 goto duplicated_vec_op;
10158
10159 i.mask->mask = mask;
10160
10161 /* Only "{z}" is allowed here. No need to check
10162 zeroing mask explicitly. */
10163 if (i.mask->operand != this_operand)
10164 {
10165 as_bad (_("invalid write mask `%s'"), saved);
10166 return NULL;
10167 }
10168 }
10169
10170 op_string = end_op;
10171 }
10172 /* Check zeroing-flag for masking operation. */
10173 else if (*op_string == 'z')
10174 {
10175 if (!i.mask)
10176 {
10177 mask_op.mask = NULL;
10178 mask_op.zeroing = 1;
10179 mask_op.operand = this_operand;
10180 i.mask = &mask_op;
10181 }
10182 else
10183 {
10184 if (i.mask->zeroing)
10185 {
10186 duplicated_vec_op:
10187 as_bad (_("duplicated `%s'"), saved);
10188 return NULL;
10189 }
10190
10191 i.mask->zeroing = 1;
10192
10193 /* Only "{%k}" is allowed here. No need to check mask
10194 register explicitly. */
10195 if (i.mask->operand != this_operand)
10196 {
10197 as_bad (_("invalid zeroing-masking `%s'"),
10198 saved);
10199 return NULL;
10200 }
10201 }
10202
10203 op_string++;
10204 }
10205 else
10206 goto unknown_vec_op;
10207
10208 if (*op_string != '}')
10209 {
10210 as_bad (_("missing `}' in `%s'"), saved);
10211 return NULL;
10212 }
10213 op_string++;
0ba3a731
L
10214
10215 /* Strip whitespace since the addition of pseudo prefixes
10216 changed how the scrubber treats '{'. */
10217 if (is_space_char (*op_string))
10218 ++op_string;
10219
43234a1e
L
10220 continue;
10221 }
10222 unknown_vec_op:
10223 /* We don't know this one. */
10224 as_bad (_("unknown vector operation: `%s'"), saved);
10225 return NULL;
10226 }
10227
6d2cd6b2
JB
10228 if (i.mask && i.mask->zeroing && !i.mask->mask)
10229 {
10230 as_bad (_("zeroing-masking only allowed with write mask"));
10231 return NULL;
10232 }
10233
43234a1e
L
10234 return op_string;
10235}
10236
252b5132 10237static int
70e41ade 10238i386_immediate (char *imm_start)
252b5132
RH
10239{
10240 char *save_input_line_pointer;
f3c180ae 10241 char *gotfree_input_line;
252b5132 10242 segT exp_seg = 0;
47926f60 10243 expressionS *exp;
40fb9820
L
10244 i386_operand_type types;
10245
0dfbf9d7 10246 operand_type_set (&types, ~0);
252b5132
RH
10247
10248 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
10249 {
31b2323c
L
10250 as_bad (_("at most %d immediate operands are allowed"),
10251 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
10252 return 0;
10253 }
10254
10255 exp = &im_expressions[i.imm_operands++];
520dc8e8 10256 i.op[this_operand].imms = exp;
252b5132
RH
10257
10258 if (is_space_char (*imm_start))
10259 ++imm_start;
10260
10261 save_input_line_pointer = input_line_pointer;
10262 input_line_pointer = imm_start;
10263
d258b828 10264 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10265 if (gotfree_input_line)
10266 input_line_pointer = gotfree_input_line;
252b5132
RH
10267
10268 exp_seg = expression (exp);
10269
83183c0c 10270 SKIP_WHITESPACE ();
43234a1e
L
10271
10272 /* Handle vector operations. */
10273 if (*input_line_pointer == '{')
10274 {
10275 input_line_pointer = check_VecOperations (input_line_pointer,
10276 NULL);
10277 if (input_line_pointer == NULL)
10278 return 0;
10279 }
10280
252b5132 10281 if (*input_line_pointer)
f3c180ae 10282 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
10283
10284 input_line_pointer = save_input_line_pointer;
f3c180ae 10285 if (gotfree_input_line)
ee86248c
JB
10286 {
10287 free (gotfree_input_line);
10288
10289 if (exp->X_op == O_constant || exp->X_op == O_register)
10290 exp->X_op = O_illegal;
10291 }
10292
10293 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
10294}
252b5132 10295
ee86248c
JB
10296static int
10297i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10298 i386_operand_type types, const char *imm_start)
10299{
10300 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 10301 {
313c53d1
L
10302 if (imm_start)
10303 as_bad (_("missing or invalid immediate expression `%s'"),
10304 imm_start);
3992d3b7 10305 return 0;
252b5132 10306 }
3e73aa7c 10307 else if (exp->X_op == O_constant)
252b5132 10308 {
47926f60 10309 /* Size it properly later. */
40fb9820 10310 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
10311 /* If not 64bit, sign extend val. */
10312 if (flag_code != CODE_64BIT
4eed87de
AM
10313 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
10314 exp->X_add_number
10315 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 10316 }
4c63da97 10317#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 10318 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 10319 && exp_seg != absolute_section
47926f60 10320 && exp_seg != text_section
24eab124
AM
10321 && exp_seg != data_section
10322 && exp_seg != bss_section
10323 && exp_seg != undefined_section
f86103b7 10324 && !bfd_is_com_section (exp_seg))
252b5132 10325 {
d0b47220 10326 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
10327 return 0;
10328 }
10329#endif
a841bdf5 10330 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 10331 {
313c53d1
L
10332 if (imm_start)
10333 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
10334 return 0;
10335 }
252b5132
RH
10336 else
10337 {
10338 /* This is an address. The size of the address will be
24eab124 10339 determined later, depending on destination register,
3e73aa7c 10340 suffix, or the default for the section. */
40fb9820
L
10341 i.types[this_operand].bitfield.imm8 = 1;
10342 i.types[this_operand].bitfield.imm16 = 1;
10343 i.types[this_operand].bitfield.imm32 = 1;
10344 i.types[this_operand].bitfield.imm32s = 1;
10345 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
10346 i.types[this_operand] = operand_type_and (i.types[this_operand],
10347 types);
252b5132
RH
10348 }
10349
10350 return 1;
10351}
10352
551c1ca1 10353static char *
e3bb37b5 10354i386_scale (char *scale)
252b5132 10355{
551c1ca1
AM
10356 offsetT val;
10357 char *save = input_line_pointer;
252b5132 10358
551c1ca1
AM
10359 input_line_pointer = scale;
10360 val = get_absolute_expression ();
10361
10362 switch (val)
252b5132 10363 {
551c1ca1 10364 case 1:
252b5132
RH
10365 i.log2_scale_factor = 0;
10366 break;
551c1ca1 10367 case 2:
252b5132
RH
10368 i.log2_scale_factor = 1;
10369 break;
551c1ca1 10370 case 4:
252b5132
RH
10371 i.log2_scale_factor = 2;
10372 break;
551c1ca1 10373 case 8:
252b5132
RH
10374 i.log2_scale_factor = 3;
10375 break;
10376 default:
a724f0f4
JB
10377 {
10378 char sep = *input_line_pointer;
10379
10380 *input_line_pointer = '\0';
10381 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
10382 scale);
10383 *input_line_pointer = sep;
10384 input_line_pointer = save;
10385 return NULL;
10386 }
252b5132 10387 }
29b0f896 10388 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
10389 {
10390 as_warn (_("scale factor of %d without an index register"),
24eab124 10391 1 << i.log2_scale_factor);
252b5132 10392 i.log2_scale_factor = 0;
252b5132 10393 }
551c1ca1
AM
10394 scale = input_line_pointer;
10395 input_line_pointer = save;
10396 return scale;
252b5132
RH
10397}
10398
252b5132 10399static int
e3bb37b5 10400i386_displacement (char *disp_start, char *disp_end)
252b5132 10401{
29b0f896 10402 expressionS *exp;
252b5132
RH
10403 segT exp_seg = 0;
10404 char *save_input_line_pointer;
f3c180ae 10405 char *gotfree_input_line;
40fb9820
L
10406 int override;
10407 i386_operand_type bigdisp, types = anydisp;
3992d3b7 10408 int ret;
252b5132 10409
31b2323c
L
10410 if (i.disp_operands == MAX_MEMORY_OPERANDS)
10411 {
10412 as_bad (_("at most %d displacement operands are allowed"),
10413 MAX_MEMORY_OPERANDS);
10414 return 0;
10415 }
10416
0dfbf9d7 10417 operand_type_set (&bigdisp, 0);
6f2f06be 10418 if (i.jumpabsolute
48bcea9f 10419 || i.types[this_operand].bitfield.baseindex
0cfa3eb3
JB
10420 || (current_templates->start->opcode_modifier.jump != JUMP
10421 && current_templates->start->opcode_modifier.jump != JUMP_DWORD))
e05278af 10422 {
48bcea9f 10423 i386_addressing_mode ();
e05278af 10424 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
10425 if (flag_code == CODE_64BIT)
10426 {
10427 if (!override)
10428 {
10429 bigdisp.bitfield.disp32s = 1;
10430 bigdisp.bitfield.disp64 = 1;
10431 }
48bcea9f
JB
10432 else
10433 bigdisp.bitfield.disp32 = 1;
40fb9820
L
10434 }
10435 else if ((flag_code == CODE_16BIT) ^ override)
40fb9820 10436 bigdisp.bitfield.disp16 = 1;
48bcea9f
JB
10437 else
10438 bigdisp.bitfield.disp32 = 1;
e05278af
JB
10439 }
10440 else
10441 {
376cd056
JB
10442 /* For PC-relative branches, the width of the displacement may be
10443 dependent upon data size, but is never dependent upon address size.
10444 Also make sure to not unintentionally match against a non-PC-relative
10445 branch template. */
10446 static templates aux_templates;
10447 const insn_template *t = current_templates->start;
10448 bfd_boolean has_intel64 = FALSE;
10449
10450 aux_templates.start = t;
10451 while (++t < current_templates->end)
10452 {
10453 if (t->opcode_modifier.jump
10454 != current_templates->start->opcode_modifier.jump)
10455 break;
4b5aaf5f 10456 if ((t->opcode_modifier.isa64 >= INTEL64))
376cd056
JB
10457 has_intel64 = TRUE;
10458 }
10459 if (t < current_templates->end)
10460 {
10461 aux_templates.end = t;
10462 current_templates = &aux_templates;
10463 }
10464
e05278af 10465 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
10466 if (flag_code == CODE_64BIT)
10467 {
376cd056
JB
10468 if ((override || i.suffix == WORD_MNEM_SUFFIX)
10469 && (!intel64 || !has_intel64))
40fb9820
L
10470 bigdisp.bitfield.disp16 = 1;
10471 else
48bcea9f 10472 bigdisp.bitfield.disp32s = 1;
40fb9820
L
10473 }
10474 else
e05278af
JB
10475 {
10476 if (!override)
10477 override = (i.suffix == (flag_code != CODE_16BIT
10478 ? WORD_MNEM_SUFFIX
10479 : LONG_MNEM_SUFFIX));
40fb9820
L
10480 bigdisp.bitfield.disp32 = 1;
10481 if ((flag_code == CODE_16BIT) ^ override)
10482 {
10483 bigdisp.bitfield.disp32 = 0;
10484 bigdisp.bitfield.disp16 = 1;
10485 }
e05278af 10486 }
e05278af 10487 }
c6fb90c8
L
10488 i.types[this_operand] = operand_type_or (i.types[this_operand],
10489 bigdisp);
252b5132
RH
10490
10491 exp = &disp_expressions[i.disp_operands];
520dc8e8 10492 i.op[this_operand].disps = exp;
252b5132
RH
10493 i.disp_operands++;
10494 save_input_line_pointer = input_line_pointer;
10495 input_line_pointer = disp_start;
10496 END_STRING_AND_SAVE (disp_end);
10497
10498#ifndef GCC_ASM_O_HACK
10499#define GCC_ASM_O_HACK 0
10500#endif
10501#if GCC_ASM_O_HACK
10502 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 10503 if (i.types[this_operand].bitfield.baseIndex
24eab124 10504 && displacement_string_end[-1] == '+')
252b5132
RH
10505 {
10506 /* This hack is to avoid a warning when using the "o"
24eab124
AM
10507 constraint within gcc asm statements.
10508 For instance:
10509
10510 #define _set_tssldt_desc(n,addr,limit,type) \
10511 __asm__ __volatile__ ( \
10512 "movw %w2,%0\n\t" \
10513 "movw %w1,2+%0\n\t" \
10514 "rorl $16,%1\n\t" \
10515 "movb %b1,4+%0\n\t" \
10516 "movb %4,5+%0\n\t" \
10517 "movb $0,6+%0\n\t" \
10518 "movb %h1,7+%0\n\t" \
10519 "rorl $16,%1" \
10520 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
10521
10522 This works great except that the output assembler ends
10523 up looking a bit weird if it turns out that there is
10524 no offset. You end up producing code that looks like:
10525
10526 #APP
10527 movw $235,(%eax)
10528 movw %dx,2+(%eax)
10529 rorl $16,%edx
10530 movb %dl,4+(%eax)
10531 movb $137,5+(%eax)
10532 movb $0,6+(%eax)
10533 movb %dh,7+(%eax)
10534 rorl $16,%edx
10535 #NO_APP
10536
47926f60 10537 So here we provide the missing zero. */
24eab124
AM
10538
10539 *displacement_string_end = '0';
252b5132
RH
10540 }
10541#endif
d258b828 10542 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10543 if (gotfree_input_line)
10544 input_line_pointer = gotfree_input_line;
252b5132 10545
24eab124 10546 exp_seg = expression (exp);
252b5132 10547
636c26b0
AM
10548 SKIP_WHITESPACE ();
10549 if (*input_line_pointer)
10550 as_bad (_("junk `%s' after expression"), input_line_pointer);
10551#if GCC_ASM_O_HACK
10552 RESTORE_END_STRING (disp_end + 1);
10553#endif
636c26b0 10554 input_line_pointer = save_input_line_pointer;
636c26b0 10555 if (gotfree_input_line)
ee86248c
JB
10556 {
10557 free (gotfree_input_line);
10558
10559 if (exp->X_op == O_constant || exp->X_op == O_register)
10560 exp->X_op = O_illegal;
10561 }
10562
10563 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
10564
10565 RESTORE_END_STRING (disp_end);
10566
10567 return ret;
10568}
10569
10570static int
10571i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10572 i386_operand_type types, const char *disp_start)
10573{
10574 i386_operand_type bigdisp;
10575 int ret = 1;
636c26b0 10576
24eab124
AM
10577 /* We do this to make sure that the section symbol is in
10578 the symbol table. We will ultimately change the relocation
47926f60 10579 to be relative to the beginning of the section. */
1ae12ab7 10580 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
10581 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
10582 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 10583 {
636c26b0 10584 if (exp->X_op != O_symbol)
3992d3b7 10585 goto inv_disp;
636c26b0 10586
e5cb08ac 10587 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
10588 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
10589 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 10590 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
10591 exp->X_op = O_subtract;
10592 exp->X_op_symbol = GOT_symbol;
1ae12ab7 10593 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 10594 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
10595 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
10596 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 10597 else
29b0f896 10598 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 10599 }
252b5132 10600
3992d3b7
AM
10601 else if (exp->X_op == O_absent
10602 || exp->X_op == O_illegal
ee86248c 10603 || exp->X_op == O_big)
2daf4fd8 10604 {
3992d3b7
AM
10605 inv_disp:
10606 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 10607 disp_start);
3992d3b7 10608 ret = 0;
2daf4fd8
AM
10609 }
10610
0e1147d9
L
10611 else if (flag_code == CODE_64BIT
10612 && !i.prefix[ADDR_PREFIX]
10613 && exp->X_op == O_constant)
10614 {
10615 /* Since displacement is signed extended to 64bit, don't allow
10616 disp32 and turn off disp32s if they are out of range. */
10617 i.types[this_operand].bitfield.disp32 = 0;
10618 if (!fits_in_signed_long (exp->X_add_number))
10619 {
10620 i.types[this_operand].bitfield.disp32s = 0;
10621 if (i.types[this_operand].bitfield.baseindex)
10622 {
10623 as_bad (_("0x%lx out range of signed 32bit displacement"),
10624 (long) exp->X_add_number);
10625 ret = 0;
10626 }
10627 }
10628 }
10629
4c63da97 10630#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
10631 else if (exp->X_op != O_constant
10632 && OUTPUT_FLAVOR == bfd_target_aout_flavour
10633 && exp_seg != absolute_section
10634 && exp_seg != text_section
10635 && exp_seg != data_section
10636 && exp_seg != bss_section
10637 && exp_seg != undefined_section
10638 && !bfd_is_com_section (exp_seg))
24eab124 10639 {
d0b47220 10640 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 10641 ret = 0;
24eab124 10642 }
252b5132 10643#endif
3956db08 10644
48bcea9f
JB
10645 if (current_templates->start->opcode_modifier.jump == JUMP_BYTE
10646 /* Constants get taken care of by optimize_disp(). */
10647 && exp->X_op != O_constant)
10648 i.types[this_operand].bitfield.disp8 = 1;
10649
40fb9820
L
10650 /* Check if this is a displacement only operand. */
10651 bigdisp = i.types[this_operand];
10652 bigdisp.bitfield.disp8 = 0;
10653 bigdisp.bitfield.disp16 = 0;
10654 bigdisp.bitfield.disp32 = 0;
10655 bigdisp.bitfield.disp32s = 0;
10656 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 10657 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
10658 i.types[this_operand] = operand_type_and (i.types[this_operand],
10659 types);
3956db08 10660
3992d3b7 10661 return ret;
252b5132
RH
10662}
10663
2abc2bec
JB
10664/* Return the active addressing mode, taking address override and
10665 registers forming the address into consideration. Update the
10666 address override prefix if necessary. */
47926f60 10667
2abc2bec
JB
10668static enum flag_code
10669i386_addressing_mode (void)
252b5132 10670{
be05d201
L
10671 enum flag_code addr_mode;
10672
10673 if (i.prefix[ADDR_PREFIX])
10674 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
a23b33b3
JB
10675 else if (flag_code == CODE_16BIT
10676 && current_templates->start->cpu_flags.bitfield.cpumpx
10677 /* Avoid replacing the "16-bit addressing not allowed" diagnostic
10678 from md_assemble() by "is not a valid base/index expression"
10679 when there is a base and/or index. */
10680 && !i.types[this_operand].bitfield.baseindex)
10681 {
10682 /* MPX insn memory operands with neither base nor index must be forced
10683 to use 32-bit addressing in 16-bit mode. */
10684 addr_mode = CODE_32BIT;
10685 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10686 ++i.prefixes;
10687 gas_assert (!i.types[this_operand].bitfield.disp16);
10688 gas_assert (!i.types[this_operand].bitfield.disp32);
10689 }
be05d201
L
10690 else
10691 {
10692 addr_mode = flag_code;
10693
24eab124 10694#if INFER_ADDR_PREFIX
be05d201
L
10695 if (i.mem_operands == 0)
10696 {
10697 /* Infer address prefix from the first memory operand. */
10698 const reg_entry *addr_reg = i.base_reg;
10699
10700 if (addr_reg == NULL)
10701 addr_reg = i.index_reg;
eecb386c 10702
be05d201
L
10703 if (addr_reg)
10704 {
e968fc9b 10705 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
10706 addr_mode = CODE_32BIT;
10707 else if (flag_code != CODE_64BIT
dc821c5f 10708 && addr_reg->reg_type.bitfield.word)
be05d201
L
10709 addr_mode = CODE_16BIT;
10710
10711 if (addr_mode != flag_code)
10712 {
10713 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10714 i.prefixes += 1;
10715 /* Change the size of any displacement too. At most one
10716 of Disp16 or Disp32 is set.
10717 FIXME. There doesn't seem to be any real need for
10718 separate Disp16 and Disp32 flags. The same goes for
10719 Imm16 and Imm32. Removing them would probably clean
10720 up the code quite a lot. */
10721 if (flag_code != CODE_64BIT
10722 && (i.types[this_operand].bitfield.disp16
10723 || i.types[this_operand].bitfield.disp32))
10724 i.types[this_operand]
10725 = operand_type_xor (i.types[this_operand], disp16_32);
10726 }
10727 }
10728 }
24eab124 10729#endif
be05d201
L
10730 }
10731
2abc2bec
JB
10732 return addr_mode;
10733}
10734
10735/* Make sure the memory operand we've been dealt is valid.
10736 Return 1 on success, 0 on a failure. */
10737
10738static int
10739i386_index_check (const char *operand_string)
10740{
10741 const char *kind = "base/index";
10742 enum flag_code addr_mode = i386_addressing_mode ();
10743
fc0763e6 10744 if (current_templates->start->opcode_modifier.isstring
c3949f43 10745 && !current_templates->start->cpu_flags.bitfield.cpupadlock
fc0763e6
JB
10746 && (current_templates->end[-1].opcode_modifier.isstring
10747 || i.mem_operands))
10748 {
10749 /* Memory operands of string insns are special in that they only allow
10750 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
10751 const reg_entry *expected_reg;
10752 static const char *di_si[][2] =
10753 {
10754 { "esi", "edi" },
10755 { "si", "di" },
10756 { "rsi", "rdi" }
10757 };
10758 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
10759
10760 kind = "string address";
10761
8325cc63 10762 if (current_templates->start->opcode_modifier.repprefixok)
fc0763e6 10763 {
51c8edf6
JB
10764 int es_op = current_templates->end[-1].opcode_modifier.isstring
10765 - IS_STRING_ES_OP0;
10766 int op = 0;
fc0763e6 10767
51c8edf6 10768 if (!current_templates->end[-1].operand_types[0].bitfield.baseindex
fc0763e6
JB
10769 || ((!i.mem_operands != !intel_syntax)
10770 && current_templates->end[-1].operand_types[1]
10771 .bitfield.baseindex))
51c8edf6
JB
10772 op = 1;
10773 expected_reg = hash_find (reg_hash, di_si[addr_mode][op == es_op]);
fc0763e6
JB
10774 }
10775 else
be05d201 10776 expected_reg = hash_find (reg_hash, bx[addr_mode]);
fc0763e6 10777
be05d201
L
10778 if (i.base_reg != expected_reg
10779 || i.index_reg
fc0763e6 10780 || operand_type_check (i.types[this_operand], disp))
fc0763e6 10781 {
be05d201
L
10782 /* The second memory operand must have the same size as
10783 the first one. */
10784 if (i.mem_operands
10785 && i.base_reg
10786 && !((addr_mode == CODE_64BIT
dc821c5f 10787 && i.base_reg->reg_type.bitfield.qword)
be05d201 10788 || (addr_mode == CODE_32BIT
dc821c5f
JB
10789 ? i.base_reg->reg_type.bitfield.dword
10790 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
10791 goto bad_address;
10792
fc0763e6
JB
10793 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
10794 operand_string,
10795 intel_syntax ? '[' : '(',
10796 register_prefix,
be05d201 10797 expected_reg->reg_name,
fc0763e6 10798 intel_syntax ? ']' : ')');
be05d201 10799 return 1;
fc0763e6 10800 }
be05d201
L
10801 else
10802 return 1;
10803
dc1e8a47 10804 bad_address:
be05d201
L
10805 as_bad (_("`%s' is not a valid %s expression"),
10806 operand_string, kind);
10807 return 0;
3e73aa7c
JH
10808 }
10809 else
10810 {
be05d201
L
10811 if (addr_mode != CODE_16BIT)
10812 {
10813 /* 32-bit/64-bit checks. */
10814 if ((i.base_reg
e968fc9b
JB
10815 && ((addr_mode == CODE_64BIT
10816 ? !i.base_reg->reg_type.bitfield.qword
10817 : !i.base_reg->reg_type.bitfield.dword)
10818 || (i.index_reg && i.base_reg->reg_num == RegIP)
10819 || i.base_reg->reg_num == RegIZ))
be05d201 10820 || (i.index_reg
1b54b8d7
JB
10821 && !i.index_reg->reg_type.bitfield.xmmword
10822 && !i.index_reg->reg_type.bitfield.ymmword
10823 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 10824 && ((addr_mode == CODE_64BIT
e968fc9b
JB
10825 ? !i.index_reg->reg_type.bitfield.qword
10826 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
10827 || !i.index_reg->reg_type.bitfield.baseindex)))
10828 goto bad_address;
8178be5b
JB
10829
10830 /* bndmk, bndldx, and bndstx have special restrictions. */
10831 if (current_templates->start->base_opcode == 0xf30f1b
10832 || (current_templates->start->base_opcode & ~1) == 0x0f1a)
10833 {
10834 /* They cannot use RIP-relative addressing. */
e968fc9b 10835 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
10836 {
10837 as_bad (_("`%s' cannot be used here"), operand_string);
10838 return 0;
10839 }
10840
10841 /* bndldx and bndstx ignore their scale factor. */
10842 if (current_templates->start->base_opcode != 0xf30f1b
10843 && i.log2_scale_factor)
10844 as_warn (_("register scaling is being ignored here"));
10845 }
be05d201
L
10846 }
10847 else
3e73aa7c 10848 {
be05d201 10849 /* 16-bit checks. */
3e73aa7c 10850 if ((i.base_reg
dc821c5f 10851 && (!i.base_reg->reg_type.bitfield.word
40fb9820 10852 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 10853 || (i.index_reg
dc821c5f 10854 && (!i.index_reg->reg_type.bitfield.word
40fb9820 10855 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
10856 || !(i.base_reg
10857 && i.base_reg->reg_num < 6
10858 && i.index_reg->reg_num >= 6
10859 && i.log2_scale_factor == 0))))
be05d201 10860 goto bad_address;
3e73aa7c
JH
10861 }
10862 }
be05d201 10863 return 1;
24eab124 10864}
252b5132 10865
43234a1e
L
10866/* Handle vector immediates. */
10867
10868static int
10869RC_SAE_immediate (const char *imm_start)
10870{
10871 unsigned int match_found, j;
10872 const char *pstr = imm_start;
10873 expressionS *exp;
10874
10875 if (*pstr != '{')
10876 return 0;
10877
10878 pstr++;
10879 match_found = 0;
10880 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
10881 {
10882 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
10883 {
10884 if (!i.rounding)
10885 {
10886 rc_op.type = RC_NamesTable[j].type;
10887 rc_op.operand = this_operand;
10888 i.rounding = &rc_op;
10889 }
10890 else
10891 {
10892 as_bad (_("duplicated `%s'"), imm_start);
10893 return 0;
10894 }
10895 pstr += RC_NamesTable[j].len;
10896 match_found = 1;
10897 break;
10898 }
10899 }
10900 if (!match_found)
10901 return 0;
10902
10903 if (*pstr++ != '}')
10904 {
10905 as_bad (_("Missing '}': '%s'"), imm_start);
10906 return 0;
10907 }
10908 /* RC/SAE immediate string should contain nothing more. */;
10909 if (*pstr != 0)
10910 {
10911 as_bad (_("Junk after '}': '%s'"), imm_start);
10912 return 0;
10913 }
10914
10915 exp = &im_expressions[i.imm_operands++];
10916 i.op[this_operand].imms = exp;
10917
10918 exp->X_op = O_constant;
10919 exp->X_add_number = 0;
10920 exp->X_add_symbol = (symbolS *) 0;
10921 exp->X_op_symbol = (symbolS *) 0;
10922
10923 i.types[this_operand].bitfield.imm8 = 1;
10924 return 1;
10925}
10926
8325cc63
JB
10927/* Only string instructions can have a second memory operand, so
10928 reduce current_templates to just those if it contains any. */
10929static int
10930maybe_adjust_templates (void)
10931{
10932 const insn_template *t;
10933
10934 gas_assert (i.mem_operands == 1);
10935
10936 for (t = current_templates->start; t < current_templates->end; ++t)
10937 if (t->opcode_modifier.isstring)
10938 break;
10939
10940 if (t < current_templates->end)
10941 {
10942 static templates aux_templates;
10943 bfd_boolean recheck;
10944
10945 aux_templates.start = t;
10946 for (; t < current_templates->end; ++t)
10947 if (!t->opcode_modifier.isstring)
10948 break;
10949 aux_templates.end = t;
10950
10951 /* Determine whether to re-check the first memory operand. */
10952 recheck = (aux_templates.start != current_templates->start
10953 || t != current_templates->end);
10954
10955 current_templates = &aux_templates;
10956
10957 if (recheck)
10958 {
10959 i.mem_operands = 0;
10960 if (i.memop1_string != NULL
10961 && i386_index_check (i.memop1_string) == 0)
10962 return 0;
10963 i.mem_operands = 1;
10964 }
10965 }
10966
10967 return 1;
10968}
10969
fc0763e6 10970/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 10971 on error. */
252b5132 10972
252b5132 10973static int
a7619375 10974i386_att_operand (char *operand_string)
252b5132 10975{
af6bdddf
AM
10976 const reg_entry *r;
10977 char *end_op;
24eab124 10978 char *op_string = operand_string;
252b5132 10979
24eab124 10980 if (is_space_char (*op_string))
252b5132
RH
10981 ++op_string;
10982
24eab124 10983 /* We check for an absolute prefix (differentiating,
47926f60 10984 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
10985 if (*op_string == ABSOLUTE_PREFIX)
10986 {
10987 ++op_string;
10988 if (is_space_char (*op_string))
10989 ++op_string;
6f2f06be 10990 i.jumpabsolute = TRUE;
24eab124 10991 }
252b5132 10992
47926f60 10993 /* Check if operand is a register. */
4d1bb795 10994 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 10995 {
40fb9820
L
10996 i386_operand_type temp;
10997
24eab124
AM
10998 /* Check for a segment override by searching for ':' after a
10999 segment register. */
11000 op_string = end_op;
11001 if (is_space_char (*op_string))
11002 ++op_string;
00cee14f 11003 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124
AM
11004 {
11005 switch (r->reg_num)
11006 {
11007 case 0:
11008 i.seg[i.mem_operands] = &es;
11009 break;
11010 case 1:
11011 i.seg[i.mem_operands] = &cs;
11012 break;
11013 case 2:
11014 i.seg[i.mem_operands] = &ss;
11015 break;
11016 case 3:
11017 i.seg[i.mem_operands] = &ds;
11018 break;
11019 case 4:
11020 i.seg[i.mem_operands] = &fs;
11021 break;
11022 case 5:
11023 i.seg[i.mem_operands] = &gs;
11024 break;
11025 }
252b5132 11026
24eab124 11027 /* Skip the ':' and whitespace. */
252b5132
RH
11028 ++op_string;
11029 if (is_space_char (*op_string))
24eab124 11030 ++op_string;
252b5132 11031
24eab124
AM
11032 if (!is_digit_char (*op_string)
11033 && !is_identifier_char (*op_string)
11034 && *op_string != '('
11035 && *op_string != ABSOLUTE_PREFIX)
11036 {
11037 as_bad (_("bad memory operand `%s'"), op_string);
11038 return 0;
11039 }
47926f60 11040 /* Handle case of %es:*foo. */
24eab124
AM
11041 if (*op_string == ABSOLUTE_PREFIX)
11042 {
11043 ++op_string;
11044 if (is_space_char (*op_string))
11045 ++op_string;
6f2f06be 11046 i.jumpabsolute = TRUE;
24eab124
AM
11047 }
11048 goto do_memory_reference;
11049 }
43234a1e
L
11050
11051 /* Handle vector operations. */
11052 if (*op_string == '{')
11053 {
11054 op_string = check_VecOperations (op_string, NULL);
11055 if (op_string == NULL)
11056 return 0;
11057 }
11058
24eab124
AM
11059 if (*op_string)
11060 {
d0b47220 11061 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
11062 return 0;
11063 }
40fb9820
L
11064 temp = r->reg_type;
11065 temp.bitfield.baseindex = 0;
c6fb90c8
L
11066 i.types[this_operand] = operand_type_or (i.types[this_operand],
11067 temp);
7d5e4556 11068 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 11069 i.op[this_operand].regs = r;
24eab124
AM
11070 i.reg_operands++;
11071 }
af6bdddf
AM
11072 else if (*op_string == REGISTER_PREFIX)
11073 {
11074 as_bad (_("bad register name `%s'"), op_string);
11075 return 0;
11076 }
24eab124 11077 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 11078 {
24eab124 11079 ++op_string;
6f2f06be 11080 if (i.jumpabsolute)
24eab124 11081 {
d0b47220 11082 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
11083 return 0;
11084 }
11085 if (!i386_immediate (op_string))
11086 return 0;
11087 }
43234a1e
L
11088 else if (RC_SAE_immediate (operand_string))
11089 {
11090 /* If it is a RC or SAE immediate, do nothing. */
11091 ;
11092 }
24eab124
AM
11093 else if (is_digit_char (*op_string)
11094 || is_identifier_char (*op_string)
d02603dc 11095 || *op_string == '"'
e5cb08ac 11096 || *op_string == '(')
24eab124 11097 {
47926f60 11098 /* This is a memory reference of some sort. */
af6bdddf 11099 char *base_string;
252b5132 11100
47926f60 11101 /* Start and end of displacement string expression (if found). */
eecb386c
AM
11102 char *displacement_string_start;
11103 char *displacement_string_end;
43234a1e 11104 char *vop_start;
252b5132 11105
24eab124 11106 do_memory_reference:
8325cc63
JB
11107 if (i.mem_operands == 1 && !maybe_adjust_templates ())
11108 return 0;
24eab124 11109 if ((i.mem_operands == 1
40fb9820 11110 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
11111 || i.mem_operands == 2)
11112 {
11113 as_bad (_("too many memory references for `%s'"),
11114 current_templates->start->name);
11115 return 0;
11116 }
252b5132 11117
24eab124
AM
11118 /* Check for base index form. We detect the base index form by
11119 looking for an ')' at the end of the operand, searching
11120 for the '(' matching it, and finding a REGISTER_PREFIX or ','
11121 after the '('. */
af6bdddf 11122 base_string = op_string + strlen (op_string);
c3332e24 11123
43234a1e
L
11124 /* Handle vector operations. */
11125 vop_start = strchr (op_string, '{');
11126 if (vop_start && vop_start < base_string)
11127 {
11128 if (check_VecOperations (vop_start, base_string) == NULL)
11129 return 0;
11130 base_string = vop_start;
11131 }
11132
af6bdddf
AM
11133 --base_string;
11134 if (is_space_char (*base_string))
11135 --base_string;
252b5132 11136
47926f60 11137 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
11138 displacement_string_start = op_string;
11139 displacement_string_end = base_string + 1;
252b5132 11140
24eab124
AM
11141 if (*base_string == ')')
11142 {
af6bdddf 11143 char *temp_string;
24eab124
AM
11144 unsigned int parens_balanced = 1;
11145 /* We've already checked that the number of left & right ()'s are
47926f60 11146 equal, so this loop will not be infinite. */
24eab124
AM
11147 do
11148 {
11149 base_string--;
11150 if (*base_string == ')')
11151 parens_balanced++;
11152 if (*base_string == '(')
11153 parens_balanced--;
11154 }
11155 while (parens_balanced);
c3332e24 11156
af6bdddf 11157 temp_string = base_string;
c3332e24 11158
24eab124 11159 /* Skip past '(' and whitespace. */
252b5132
RH
11160 ++base_string;
11161 if (is_space_char (*base_string))
24eab124 11162 ++base_string;
252b5132 11163
af6bdddf 11164 if (*base_string == ','
4eed87de
AM
11165 || ((i.base_reg = parse_register (base_string, &end_op))
11166 != NULL))
252b5132 11167 {
af6bdddf 11168 displacement_string_end = temp_string;
252b5132 11169
40fb9820 11170 i.types[this_operand].bitfield.baseindex = 1;
252b5132 11171
af6bdddf 11172 if (i.base_reg)
24eab124 11173 {
24eab124
AM
11174 base_string = end_op;
11175 if (is_space_char (*base_string))
11176 ++base_string;
af6bdddf
AM
11177 }
11178
11179 /* There may be an index reg or scale factor here. */
11180 if (*base_string == ',')
11181 {
11182 ++base_string;
11183 if (is_space_char (*base_string))
11184 ++base_string;
11185
4eed87de
AM
11186 if ((i.index_reg = parse_register (base_string, &end_op))
11187 != NULL)
24eab124 11188 {
af6bdddf 11189 base_string = end_op;
24eab124
AM
11190 if (is_space_char (*base_string))
11191 ++base_string;
af6bdddf
AM
11192 if (*base_string == ',')
11193 {
11194 ++base_string;
11195 if (is_space_char (*base_string))
11196 ++base_string;
11197 }
e5cb08ac 11198 else if (*base_string != ')')
af6bdddf 11199 {
4eed87de
AM
11200 as_bad (_("expecting `,' or `)' "
11201 "after index register in `%s'"),
af6bdddf
AM
11202 operand_string);
11203 return 0;
11204 }
24eab124 11205 }
af6bdddf 11206 else if (*base_string == REGISTER_PREFIX)
24eab124 11207 {
f76bf5e0
L
11208 end_op = strchr (base_string, ',');
11209 if (end_op)
11210 *end_op = '\0';
af6bdddf 11211 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
11212 return 0;
11213 }
252b5132 11214
47926f60 11215 /* Check for scale factor. */
551c1ca1 11216 if (*base_string != ')')
af6bdddf 11217 {
551c1ca1
AM
11218 char *end_scale = i386_scale (base_string);
11219
11220 if (!end_scale)
af6bdddf 11221 return 0;
24eab124 11222
551c1ca1 11223 base_string = end_scale;
af6bdddf
AM
11224 if (is_space_char (*base_string))
11225 ++base_string;
11226 if (*base_string != ')')
11227 {
4eed87de
AM
11228 as_bad (_("expecting `)' "
11229 "after scale factor in `%s'"),
af6bdddf
AM
11230 operand_string);
11231 return 0;
11232 }
11233 }
11234 else if (!i.index_reg)
24eab124 11235 {
4eed87de
AM
11236 as_bad (_("expecting index register or scale factor "
11237 "after `,'; got '%c'"),
af6bdddf 11238 *base_string);
24eab124
AM
11239 return 0;
11240 }
11241 }
af6bdddf 11242 else if (*base_string != ')')
24eab124 11243 {
4eed87de
AM
11244 as_bad (_("expecting `,' or `)' "
11245 "after base register in `%s'"),
af6bdddf 11246 operand_string);
24eab124
AM
11247 return 0;
11248 }
c3332e24 11249 }
af6bdddf 11250 else if (*base_string == REGISTER_PREFIX)
c3332e24 11251 {
f76bf5e0
L
11252 end_op = strchr (base_string, ',');
11253 if (end_op)
11254 *end_op = '\0';
af6bdddf 11255 as_bad (_("bad register name `%s'"), base_string);
24eab124 11256 return 0;
c3332e24 11257 }
24eab124
AM
11258 }
11259
11260 /* If there's an expression beginning the operand, parse it,
11261 assuming displacement_string_start and
11262 displacement_string_end are meaningful. */
11263 if (displacement_string_start != displacement_string_end)
11264 {
11265 if (!i386_displacement (displacement_string_start,
11266 displacement_string_end))
11267 return 0;
11268 }
11269
11270 /* Special case for (%dx) while doing input/output op. */
11271 if (i.base_reg
75e5731b
JB
11272 && i.base_reg->reg_type.bitfield.instance == RegD
11273 && i.base_reg->reg_type.bitfield.word
24eab124
AM
11274 && i.index_reg == 0
11275 && i.log2_scale_factor == 0
11276 && i.seg[i.mem_operands] == 0
40fb9820 11277 && !operand_type_check (i.types[this_operand], disp))
24eab124 11278 {
2fb5be8d 11279 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
11280 return 1;
11281 }
11282
eecb386c
AM
11283 if (i386_index_check (operand_string) == 0)
11284 return 0;
c48dadc9 11285 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
11286 if (i.mem_operands == 0)
11287 i.memop1_string = xstrdup (operand_string);
24eab124
AM
11288 i.mem_operands++;
11289 }
11290 else
ce8a8b2f
AM
11291 {
11292 /* It's not a memory operand; argh! */
24eab124
AM
11293 as_bad (_("invalid char %s beginning operand %d `%s'"),
11294 output_invalid (*op_string),
11295 this_operand + 1,
11296 op_string);
11297 return 0;
11298 }
47926f60 11299 return 1; /* Normal return. */
252b5132
RH
11300}
11301\f
fa94de6b
RM
11302/* Calculate the maximum variable size (i.e., excluding fr_fix)
11303 that an rs_machine_dependent frag may reach. */
11304
11305unsigned int
11306i386_frag_max_var (fragS *frag)
11307{
11308 /* The only relaxable frags are for jumps.
11309 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
11310 gas_assert (frag->fr_type == rs_machine_dependent);
11311 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
11312}
11313
b084df0b
L
11314#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11315static int
8dcea932 11316elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
11317{
11318 /* STT_GNU_IFUNC symbol must go through PLT. */
11319 if ((symbol_get_bfdsym (fr_symbol)->flags
11320 & BSF_GNU_INDIRECT_FUNCTION) != 0)
11321 return 0;
11322
11323 if (!S_IS_EXTERNAL (fr_symbol))
11324 /* Symbol may be weak or local. */
11325 return !S_IS_WEAK (fr_symbol);
11326
8dcea932
L
11327 /* Global symbols with non-default visibility can't be preempted. */
11328 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
11329 return 1;
11330
11331 if (fr_var != NO_RELOC)
11332 switch ((enum bfd_reloc_code_real) fr_var)
11333 {
11334 case BFD_RELOC_386_PLT32:
11335 case BFD_RELOC_X86_64_PLT32:
33eaf5de 11336 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
11337 return 0;
11338 default:
11339 abort ();
11340 }
11341
b084df0b
L
11342 /* Global symbols with default visibility in a shared library may be
11343 preempted by another definition. */
8dcea932 11344 return !shared;
b084df0b
L
11345}
11346#endif
11347
79d72f45
HL
11348/* Table 3-2. Macro-Fusible Instructions in Haswell Microarchitecture
11349 Note also work for Skylake and Cascadelake.
11350---------------------------------------------------------------------
11351| JCC | ADD/SUB/CMP | INC/DEC | TEST/AND |
11352| ------ | ----------- | ------- | -------- |
11353| Jo | N | N | Y |
11354| Jno | N | N | Y |
11355| Jc/Jb | Y | N | Y |
11356| Jae/Jnb | Y | N | Y |
11357| Je/Jz | Y | Y | Y |
11358| Jne/Jnz | Y | Y | Y |
11359| Jna/Jbe | Y | N | Y |
11360| Ja/Jnbe | Y | N | Y |
11361| Js | N | N | Y |
11362| Jns | N | N | Y |
11363| Jp/Jpe | N | N | Y |
11364| Jnp/Jpo | N | N | Y |
11365| Jl/Jnge | Y | Y | Y |
11366| Jge/Jnl | Y | Y | Y |
11367| Jle/Jng | Y | Y | Y |
11368| Jg/Jnle | Y | Y | Y |
11369--------------------------------------------------------------------- */
11370static int
11371i386_macro_fusible_p (enum mf_cmp_kind mf_cmp, enum mf_jcc_kind mf_jcc)
11372{
11373 if (mf_cmp == mf_cmp_alu_cmp)
11374 return ((mf_jcc >= mf_jcc_jc && mf_jcc <= mf_jcc_jna)
11375 || mf_jcc == mf_jcc_jl || mf_jcc == mf_jcc_jle);
11376 if (mf_cmp == mf_cmp_incdec)
11377 return (mf_jcc == mf_jcc_je || mf_jcc == mf_jcc_jl
11378 || mf_jcc == mf_jcc_jle);
11379 if (mf_cmp == mf_cmp_test_and)
11380 return 1;
11381 return 0;
11382}
11383
e379e5f3
L
11384/* Return the next non-empty frag. */
11385
11386static fragS *
11387i386_next_non_empty_frag (fragS *fragP)
11388{
11389 /* There may be a frag with a ".fill 0" when there is no room in
11390 the current frag for frag_grow in output_insn. */
11391 for (fragP = fragP->fr_next;
11392 (fragP != NULL
11393 && fragP->fr_type == rs_fill
11394 && fragP->fr_fix == 0);
11395 fragP = fragP->fr_next)
11396 ;
11397 return fragP;
11398}
11399
11400/* Return the next jcc frag after BRANCH_PADDING. */
11401
11402static fragS *
79d72f45 11403i386_next_fusible_jcc_frag (fragS *maybe_cmp_fragP, fragS *pad_fragP)
e379e5f3 11404{
79d72f45
HL
11405 fragS *branch_fragP;
11406 if (!pad_fragP)
e379e5f3
L
11407 return NULL;
11408
79d72f45
HL
11409 if (pad_fragP->fr_type == rs_machine_dependent
11410 && (TYPE_FROM_RELAX_STATE (pad_fragP->fr_subtype)
e379e5f3
L
11411 == BRANCH_PADDING))
11412 {
79d72f45
HL
11413 branch_fragP = i386_next_non_empty_frag (pad_fragP);
11414 if (branch_fragP->fr_type != rs_machine_dependent)
e379e5f3 11415 return NULL;
79d72f45
HL
11416 if (TYPE_FROM_RELAX_STATE (branch_fragP->fr_subtype) == COND_JUMP
11417 && i386_macro_fusible_p (maybe_cmp_fragP->tc_frag_data.mf_type,
11418 pad_fragP->tc_frag_data.mf_type))
11419 return branch_fragP;
e379e5f3
L
11420 }
11421
11422 return NULL;
11423}
11424
11425/* Classify BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags. */
11426
11427static void
11428i386_classify_machine_dependent_frag (fragS *fragP)
11429{
11430 fragS *cmp_fragP;
11431 fragS *pad_fragP;
11432 fragS *branch_fragP;
11433 fragS *next_fragP;
11434 unsigned int max_prefix_length;
11435
11436 if (fragP->tc_frag_data.classified)
11437 return;
11438
11439 /* First scan for BRANCH_PADDING and FUSED_JCC_PADDING. Convert
11440 FUSED_JCC_PADDING and merge BRANCH_PADDING. */
11441 for (next_fragP = fragP;
11442 next_fragP != NULL;
11443 next_fragP = next_fragP->fr_next)
11444 {
11445 next_fragP->tc_frag_data.classified = 1;
11446 if (next_fragP->fr_type == rs_machine_dependent)
11447 switch (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype))
11448 {
11449 case BRANCH_PADDING:
11450 /* The BRANCH_PADDING frag must be followed by a branch
11451 frag. */
11452 branch_fragP = i386_next_non_empty_frag (next_fragP);
11453 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11454 break;
11455 case FUSED_JCC_PADDING:
11456 /* Check if this is a fused jcc:
11457 FUSED_JCC_PADDING
11458 CMP like instruction
11459 BRANCH_PADDING
11460 COND_JUMP
11461 */
11462 cmp_fragP = i386_next_non_empty_frag (next_fragP);
11463 pad_fragP = i386_next_non_empty_frag (cmp_fragP);
79d72f45 11464 branch_fragP = i386_next_fusible_jcc_frag (next_fragP, pad_fragP);
e379e5f3
L
11465 if (branch_fragP)
11466 {
11467 /* The BRANCH_PADDING frag is merged with the
11468 FUSED_JCC_PADDING frag. */
11469 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11470 /* CMP like instruction size. */
11471 next_fragP->tc_frag_data.cmp_size = cmp_fragP->fr_fix;
11472 frag_wane (pad_fragP);
11473 /* Skip to branch_fragP. */
11474 next_fragP = branch_fragP;
11475 }
11476 else if (next_fragP->tc_frag_data.max_prefix_length)
11477 {
11478 /* Turn FUSED_JCC_PADDING into BRANCH_PREFIX if it isn't
11479 a fused jcc. */
11480 next_fragP->fr_subtype
11481 = ENCODE_RELAX_STATE (BRANCH_PREFIX, 0);
11482 next_fragP->tc_frag_data.max_bytes
11483 = next_fragP->tc_frag_data.max_prefix_length;
11484 /* This will be updated in the BRANCH_PREFIX scan. */
11485 next_fragP->tc_frag_data.max_prefix_length = 0;
11486 }
11487 else
11488 frag_wane (next_fragP);
11489 break;
11490 }
11491 }
11492
11493 /* Stop if there is no BRANCH_PREFIX. */
11494 if (!align_branch_prefix_size)
11495 return;
11496
11497 /* Scan for BRANCH_PREFIX. */
11498 for (; fragP != NULL; fragP = fragP->fr_next)
11499 {
11500 if (fragP->fr_type != rs_machine_dependent
11501 || (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11502 != BRANCH_PREFIX))
11503 continue;
11504
11505 /* Count all BRANCH_PREFIX frags before BRANCH_PADDING and
11506 COND_JUMP_PREFIX. */
11507 max_prefix_length = 0;
11508 for (next_fragP = fragP;
11509 next_fragP != NULL;
11510 next_fragP = next_fragP->fr_next)
11511 {
11512 if (next_fragP->fr_type == rs_fill)
11513 /* Skip rs_fill frags. */
11514 continue;
11515 else if (next_fragP->fr_type != rs_machine_dependent)
11516 /* Stop for all other frags. */
11517 break;
11518
11519 /* rs_machine_dependent frags. */
11520 if (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11521 == BRANCH_PREFIX)
11522 {
11523 /* Count BRANCH_PREFIX frags. */
11524 if (max_prefix_length >= MAX_FUSED_JCC_PADDING_SIZE)
11525 {
11526 max_prefix_length = MAX_FUSED_JCC_PADDING_SIZE;
11527 frag_wane (next_fragP);
11528 }
11529 else
11530 max_prefix_length
11531 += next_fragP->tc_frag_data.max_bytes;
11532 }
11533 else if ((TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11534 == BRANCH_PADDING)
11535 || (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11536 == FUSED_JCC_PADDING))
11537 {
11538 /* Stop at BRANCH_PADDING and FUSED_JCC_PADDING. */
11539 fragP->tc_frag_data.u.padding_fragP = next_fragP;
11540 break;
11541 }
11542 else
11543 /* Stop for other rs_machine_dependent frags. */
11544 break;
11545 }
11546
11547 fragP->tc_frag_data.max_prefix_length = max_prefix_length;
11548
11549 /* Skip to the next frag. */
11550 fragP = next_fragP;
11551 }
11552}
11553
11554/* Compute padding size for
11555
11556 FUSED_JCC_PADDING
11557 CMP like instruction
11558 BRANCH_PADDING
11559 COND_JUMP/UNCOND_JUMP
11560
11561 or
11562
11563 BRANCH_PADDING
11564 COND_JUMP/UNCOND_JUMP
11565 */
11566
11567static int
11568i386_branch_padding_size (fragS *fragP, offsetT address)
11569{
11570 unsigned int offset, size, padding_size;
11571 fragS *branch_fragP = fragP->tc_frag_data.u.branch_fragP;
11572
11573 /* The start address of the BRANCH_PADDING or FUSED_JCC_PADDING frag. */
11574 if (!address)
11575 address = fragP->fr_address;
11576 address += fragP->fr_fix;
11577
11578 /* CMP like instrunction size. */
11579 size = fragP->tc_frag_data.cmp_size;
11580
11581 /* The base size of the branch frag. */
11582 size += branch_fragP->fr_fix;
11583
11584 /* Add opcode and displacement bytes for the rs_machine_dependent
11585 branch frag. */
11586 if (branch_fragP->fr_type == rs_machine_dependent)
11587 size += md_relax_table[branch_fragP->fr_subtype].rlx_length;
11588
11589 /* Check if branch is within boundary and doesn't end at the last
11590 byte. */
11591 offset = address & ((1U << align_branch_power) - 1);
11592 if ((offset + size) >= (1U << align_branch_power))
11593 /* Padding needed to avoid crossing boundary. */
11594 padding_size = (1U << align_branch_power) - offset;
11595 else
11596 /* No padding needed. */
11597 padding_size = 0;
11598
11599 /* The return value may be saved in tc_frag_data.length which is
11600 unsigned byte. */
11601 if (!fits_in_unsigned_byte (padding_size))
11602 abort ();
11603
11604 return padding_size;
11605}
11606
11607/* i386_generic_table_relax_frag()
11608
11609 Handle BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags to
11610 grow/shrink padding to align branch frags. Hand others to
11611 relax_frag(). */
11612
11613long
11614i386_generic_table_relax_frag (segT segment, fragS *fragP, long stretch)
11615{
11616 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11617 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11618 {
11619 long padding_size = i386_branch_padding_size (fragP, 0);
11620 long grow = padding_size - fragP->tc_frag_data.length;
11621
11622 /* When the BRANCH_PREFIX frag is used, the computed address
11623 must match the actual address and there should be no padding. */
11624 if (fragP->tc_frag_data.padding_address
11625 && (fragP->tc_frag_data.padding_address != fragP->fr_address
11626 || padding_size))
11627 abort ();
11628
11629 /* Update the padding size. */
11630 if (grow)
11631 fragP->tc_frag_data.length = padding_size;
11632
11633 return grow;
11634 }
11635 else if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11636 {
11637 fragS *padding_fragP, *next_fragP;
11638 long padding_size, left_size, last_size;
11639
11640 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
11641 if (!padding_fragP)
11642 /* Use the padding set by the leading BRANCH_PREFIX frag. */
11643 return (fragP->tc_frag_data.length
11644 - fragP->tc_frag_data.last_length);
11645
11646 /* Compute the relative address of the padding frag in the very
11647 first time where the BRANCH_PREFIX frag sizes are zero. */
11648 if (!fragP->tc_frag_data.padding_address)
11649 fragP->tc_frag_data.padding_address
11650 = padding_fragP->fr_address - (fragP->fr_address - stretch);
11651
11652 /* First update the last length from the previous interation. */
11653 left_size = fragP->tc_frag_data.prefix_length;
11654 for (next_fragP = fragP;
11655 next_fragP != padding_fragP;
11656 next_fragP = next_fragP->fr_next)
11657 if (next_fragP->fr_type == rs_machine_dependent
11658 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11659 == BRANCH_PREFIX))
11660 {
11661 if (left_size)
11662 {
11663 int max = next_fragP->tc_frag_data.max_bytes;
11664 if (max)
11665 {
11666 int size;
11667 if (max > left_size)
11668 size = left_size;
11669 else
11670 size = max;
11671 left_size -= size;
11672 next_fragP->tc_frag_data.last_length = size;
11673 }
11674 }
11675 else
11676 next_fragP->tc_frag_data.last_length = 0;
11677 }
11678
11679 /* Check the padding size for the padding frag. */
11680 padding_size = i386_branch_padding_size
11681 (padding_fragP, (fragP->fr_address
11682 + fragP->tc_frag_data.padding_address));
11683
11684 last_size = fragP->tc_frag_data.prefix_length;
11685 /* Check if there is change from the last interation. */
11686 if (padding_size == last_size)
11687 {
11688 /* Update the expected address of the padding frag. */
11689 padding_fragP->tc_frag_data.padding_address
11690 = (fragP->fr_address + padding_size
11691 + fragP->tc_frag_data.padding_address);
11692 return 0;
11693 }
11694
11695 if (padding_size > fragP->tc_frag_data.max_prefix_length)
11696 {
11697 /* No padding if there is no sufficient room. Clear the
11698 expected address of the padding frag. */
11699 padding_fragP->tc_frag_data.padding_address = 0;
11700 padding_size = 0;
11701 }
11702 else
11703 /* Store the expected address of the padding frag. */
11704 padding_fragP->tc_frag_data.padding_address
11705 = (fragP->fr_address + padding_size
11706 + fragP->tc_frag_data.padding_address);
11707
11708 fragP->tc_frag_data.prefix_length = padding_size;
11709
11710 /* Update the length for the current interation. */
11711 left_size = padding_size;
11712 for (next_fragP = fragP;
11713 next_fragP != padding_fragP;
11714 next_fragP = next_fragP->fr_next)
11715 if (next_fragP->fr_type == rs_machine_dependent
11716 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11717 == BRANCH_PREFIX))
11718 {
11719 if (left_size)
11720 {
11721 int max = next_fragP->tc_frag_data.max_bytes;
11722 if (max)
11723 {
11724 int size;
11725 if (max > left_size)
11726 size = left_size;
11727 else
11728 size = max;
11729 left_size -= size;
11730 next_fragP->tc_frag_data.length = size;
11731 }
11732 }
11733 else
11734 next_fragP->tc_frag_data.length = 0;
11735 }
11736
11737 return (fragP->tc_frag_data.length
11738 - fragP->tc_frag_data.last_length);
11739 }
11740 return relax_frag (segment, fragP, stretch);
11741}
11742
ee7fcc42
AM
11743/* md_estimate_size_before_relax()
11744
11745 Called just before relax() for rs_machine_dependent frags. The x86
11746 assembler uses these frags to handle variable size jump
11747 instructions.
11748
11749 Any symbol that is now undefined will not become defined.
11750 Return the correct fr_subtype in the frag.
11751 Return the initial "guess for variable size of frag" to caller.
11752 The guess is actually the growth beyond the fixed part. Whatever
11753 we do to grow the fixed or variable part contributes to our
11754 returned value. */
11755
252b5132 11756int
7016a5d5 11757md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 11758{
e379e5f3
L
11759 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11760 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX
11761 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11762 {
11763 i386_classify_machine_dependent_frag (fragP);
11764 return fragP->tc_frag_data.length;
11765 }
11766
252b5132 11767 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
11768 check for un-relaxable symbols. On an ELF system, we can't relax
11769 an externally visible symbol, because it may be overridden by a
11770 shared library. */
11771 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 11772#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 11773 || (IS_ELF
8dcea932
L
11774 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
11775 fragP->fr_var))
fbeb56a4
DK
11776#endif
11777#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 11778 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 11779 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
11780#endif
11781 )
252b5132 11782 {
b98ef147
AM
11783 /* Symbol is undefined in this segment, or we need to keep a
11784 reloc so that weak symbols can be overridden. */
11785 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 11786 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
11787 unsigned char *opcode;
11788 int old_fr_fix;
f6af82bd 11789
ee7fcc42 11790 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 11791 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 11792 else if (size == 2)
f6af82bd 11793 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
11794#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11795 else if (need_plt32_p (fragP->fr_symbol))
11796 reloc_type = BFD_RELOC_X86_64_PLT32;
11797#endif
f6af82bd
AM
11798 else
11799 reloc_type = BFD_RELOC_32_PCREL;
252b5132 11800
ee7fcc42
AM
11801 old_fr_fix = fragP->fr_fix;
11802 opcode = (unsigned char *) fragP->fr_opcode;
11803
fddf5b5b 11804 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 11805 {
fddf5b5b
AM
11806 case UNCOND_JUMP:
11807 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 11808 opcode[0] = 0xe9;
252b5132 11809 fragP->fr_fix += size;
062cd5e7
AS
11810 fix_new (fragP, old_fr_fix, size,
11811 fragP->fr_symbol,
11812 fragP->fr_offset, 1,
11813 reloc_type);
252b5132
RH
11814 break;
11815
fddf5b5b 11816 case COND_JUMP86:
412167cb
AM
11817 if (size == 2
11818 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
11819 {
11820 /* Negate the condition, and branch past an
11821 unconditional jump. */
11822 opcode[0] ^= 1;
11823 opcode[1] = 3;
11824 /* Insert an unconditional jump. */
11825 opcode[2] = 0xe9;
11826 /* We added two extra opcode bytes, and have a two byte
11827 offset. */
11828 fragP->fr_fix += 2 + 2;
062cd5e7
AS
11829 fix_new (fragP, old_fr_fix + 2, 2,
11830 fragP->fr_symbol,
11831 fragP->fr_offset, 1,
11832 reloc_type);
fddf5b5b
AM
11833 break;
11834 }
11835 /* Fall through. */
11836
11837 case COND_JUMP:
412167cb
AM
11838 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
11839 {
3e02c1cc
AM
11840 fixS *fixP;
11841
412167cb 11842 fragP->fr_fix += 1;
3e02c1cc
AM
11843 fixP = fix_new (fragP, old_fr_fix, 1,
11844 fragP->fr_symbol,
11845 fragP->fr_offset, 1,
11846 BFD_RELOC_8_PCREL);
11847 fixP->fx_signed = 1;
412167cb
AM
11848 break;
11849 }
93c2a809 11850
24eab124 11851 /* This changes the byte-displacement jump 0x7N
fddf5b5b 11852 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 11853 opcode[1] = opcode[0] + 0x10;
f6af82bd 11854 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
11855 /* We've added an opcode byte. */
11856 fragP->fr_fix += 1 + size;
062cd5e7
AS
11857 fix_new (fragP, old_fr_fix + 1, size,
11858 fragP->fr_symbol,
11859 fragP->fr_offset, 1,
11860 reloc_type);
252b5132 11861 break;
fddf5b5b
AM
11862
11863 default:
11864 BAD_CASE (fragP->fr_subtype);
11865 break;
252b5132
RH
11866 }
11867 frag_wane (fragP);
ee7fcc42 11868 return fragP->fr_fix - old_fr_fix;
252b5132 11869 }
93c2a809 11870
93c2a809
AM
11871 /* Guess size depending on current relax state. Initially the relax
11872 state will correspond to a short jump and we return 1, because
11873 the variable part of the frag (the branch offset) is one byte
11874 long. However, we can relax a section more than once and in that
11875 case we must either set fr_subtype back to the unrelaxed state,
11876 or return the value for the appropriate branch. */
11877 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
11878}
11879
47926f60
KH
11880/* Called after relax() is finished.
11881
11882 In: Address of frag.
11883 fr_type == rs_machine_dependent.
11884 fr_subtype is what the address relaxed to.
11885
11886 Out: Any fixSs and constants are set up.
11887 Caller will turn frag into a ".space 0". */
11888
252b5132 11889void
7016a5d5
TG
11890md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
11891 fragS *fragP)
252b5132 11892{
29b0f896 11893 unsigned char *opcode;
252b5132 11894 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
11895 offsetT target_address;
11896 offsetT opcode_address;
252b5132 11897 unsigned int extension = 0;
847f7ad4 11898 offsetT displacement_from_opcode_start;
252b5132 11899
e379e5f3
L
11900 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11901 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING
11902 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11903 {
11904 /* Generate nop padding. */
11905 unsigned int size = fragP->tc_frag_data.length;
11906 if (size)
11907 {
11908 if (size > fragP->tc_frag_data.max_bytes)
11909 abort ();
11910
11911 if (flag_debug)
11912 {
11913 const char *msg;
11914 const char *branch = "branch";
11915 const char *prefix = "";
11916 fragS *padding_fragP;
11917 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11918 == BRANCH_PREFIX)
11919 {
11920 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
11921 switch (fragP->tc_frag_data.default_prefix)
11922 {
11923 default:
11924 abort ();
11925 break;
11926 case CS_PREFIX_OPCODE:
11927 prefix = " cs";
11928 break;
11929 case DS_PREFIX_OPCODE:
11930 prefix = " ds";
11931 break;
11932 case ES_PREFIX_OPCODE:
11933 prefix = " es";
11934 break;
11935 case FS_PREFIX_OPCODE:
11936 prefix = " fs";
11937 break;
11938 case GS_PREFIX_OPCODE:
11939 prefix = " gs";
11940 break;
11941 case SS_PREFIX_OPCODE:
11942 prefix = " ss";
11943 break;
11944 }
11945 if (padding_fragP)
11946 msg = _("%s:%u: add %d%s at 0x%llx to align "
11947 "%s within %d-byte boundary\n");
11948 else
11949 msg = _("%s:%u: add additional %d%s at 0x%llx to "
11950 "align %s within %d-byte boundary\n");
11951 }
11952 else
11953 {
11954 padding_fragP = fragP;
11955 msg = _("%s:%u: add %d%s-byte nop at 0x%llx to align "
11956 "%s within %d-byte boundary\n");
11957 }
11958
11959 if (padding_fragP)
11960 switch (padding_fragP->tc_frag_data.branch_type)
11961 {
11962 case align_branch_jcc:
11963 branch = "jcc";
11964 break;
11965 case align_branch_fused:
11966 branch = "fused jcc";
11967 break;
11968 case align_branch_jmp:
11969 branch = "jmp";
11970 break;
11971 case align_branch_call:
11972 branch = "call";
11973 break;
11974 case align_branch_indirect:
11975 branch = "indiret branch";
11976 break;
11977 case align_branch_ret:
11978 branch = "ret";
11979 break;
11980 default:
11981 break;
11982 }
11983
11984 fprintf (stdout, msg,
11985 fragP->fr_file, fragP->fr_line, size, prefix,
11986 (long long) fragP->fr_address, branch,
11987 1 << align_branch_power);
11988 }
11989 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11990 memset (fragP->fr_opcode,
11991 fragP->tc_frag_data.default_prefix, size);
11992 else
11993 i386_generate_nops (fragP, (char *) fragP->fr_opcode,
11994 size, 0);
11995 fragP->fr_fix += size;
11996 }
11997 return;
11998 }
11999
252b5132
RH
12000 opcode = (unsigned char *) fragP->fr_opcode;
12001
47926f60 12002 /* Address we want to reach in file space. */
252b5132 12003 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 12004
47926f60 12005 /* Address opcode resides at in file space. */
252b5132
RH
12006 opcode_address = fragP->fr_address + fragP->fr_fix;
12007
47926f60 12008 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
12009 displacement_from_opcode_start = target_address - opcode_address;
12010
fddf5b5b 12011 if ((fragP->fr_subtype & BIG) == 0)
252b5132 12012 {
47926f60
KH
12013 /* Don't have to change opcode. */
12014 extension = 1; /* 1 opcode + 1 displacement */
252b5132 12015 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
12016 }
12017 else
12018 {
12019 if (no_cond_jump_promotion
12020 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
12021 as_warn_where (fragP->fr_file, fragP->fr_line,
12022 _("long jump required"));
252b5132 12023
fddf5b5b
AM
12024 switch (fragP->fr_subtype)
12025 {
12026 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
12027 extension = 4; /* 1 opcode + 4 displacement */
12028 opcode[0] = 0xe9;
12029 where_to_put_displacement = &opcode[1];
12030 break;
252b5132 12031
fddf5b5b
AM
12032 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
12033 extension = 2; /* 1 opcode + 2 displacement */
12034 opcode[0] = 0xe9;
12035 where_to_put_displacement = &opcode[1];
12036 break;
252b5132 12037
fddf5b5b
AM
12038 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
12039 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
12040 extension = 5; /* 2 opcode + 4 displacement */
12041 opcode[1] = opcode[0] + 0x10;
12042 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12043 where_to_put_displacement = &opcode[2];
12044 break;
252b5132 12045
fddf5b5b
AM
12046 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
12047 extension = 3; /* 2 opcode + 2 displacement */
12048 opcode[1] = opcode[0] + 0x10;
12049 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12050 where_to_put_displacement = &opcode[2];
12051 break;
252b5132 12052
fddf5b5b
AM
12053 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
12054 extension = 4;
12055 opcode[0] ^= 1;
12056 opcode[1] = 3;
12057 opcode[2] = 0xe9;
12058 where_to_put_displacement = &opcode[3];
12059 break;
12060
12061 default:
12062 BAD_CASE (fragP->fr_subtype);
12063 break;
12064 }
252b5132 12065 }
fddf5b5b 12066
7b81dfbb
AJ
12067 /* If size if less then four we are sure that the operand fits,
12068 but if it's 4, then it could be that the displacement is larger
12069 then -/+ 2GB. */
12070 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
12071 && object_64bit
12072 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
12073 + ((addressT) 1 << 31))
12074 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
12075 {
12076 as_bad_where (fragP->fr_file, fragP->fr_line,
12077 _("jump target out of range"));
12078 /* Make us emit 0. */
12079 displacement_from_opcode_start = extension;
12080 }
47926f60 12081 /* Now put displacement after opcode. */
252b5132
RH
12082 md_number_to_chars ((char *) where_to_put_displacement,
12083 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 12084 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
12085 fragP->fr_fix += extension;
12086}
12087\f
7016a5d5 12088/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
12089 by our caller that we have all the info we need to fix it up.
12090
7016a5d5
TG
12091 Parameter valP is the pointer to the value of the bits.
12092
252b5132
RH
12093 On the 386, immediates, displacements, and data pointers are all in
12094 the same (little-endian) format, so we don't need to care about which
12095 we are handling. */
12096
94f592af 12097void
7016a5d5 12098md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 12099{
94f592af 12100 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 12101 valueT value = *valP;
252b5132 12102
f86103b7 12103#if !defined (TE_Mach)
93382f6d
AM
12104 if (fixP->fx_pcrel)
12105 {
12106 switch (fixP->fx_r_type)
12107 {
5865bb77
ILT
12108 default:
12109 break;
12110
d6ab8113
JB
12111 case BFD_RELOC_64:
12112 fixP->fx_r_type = BFD_RELOC_64_PCREL;
12113 break;
93382f6d 12114 case BFD_RELOC_32:
ae8887b5 12115 case BFD_RELOC_X86_64_32S:
93382f6d
AM
12116 fixP->fx_r_type = BFD_RELOC_32_PCREL;
12117 break;
12118 case BFD_RELOC_16:
12119 fixP->fx_r_type = BFD_RELOC_16_PCREL;
12120 break;
12121 case BFD_RELOC_8:
12122 fixP->fx_r_type = BFD_RELOC_8_PCREL;
12123 break;
12124 }
12125 }
252b5132 12126
a161fe53 12127 if (fixP->fx_addsy != NULL
31312f95 12128 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 12129 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 12130 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 12131 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 12132 && !use_rela_relocations)
252b5132 12133 {
31312f95
AM
12134 /* This is a hack. There should be a better way to handle this.
12135 This covers for the fact that bfd_install_relocation will
12136 subtract the current location (for partial_inplace, PC relative
12137 relocations); see more below. */
252b5132 12138#ifndef OBJ_AOUT
718ddfc0 12139 if (IS_ELF
252b5132
RH
12140#ifdef TE_PE
12141 || OUTPUT_FLAVOR == bfd_target_coff_flavour
12142#endif
12143 )
12144 value += fixP->fx_where + fixP->fx_frag->fr_address;
12145#endif
12146#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12147 if (IS_ELF)
252b5132 12148 {
6539b54b 12149 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 12150
6539b54b 12151 if ((sym_seg == seg
2f66722d 12152 || (symbol_section_p (fixP->fx_addsy)
6539b54b 12153 && sym_seg != absolute_section))
af65af87 12154 && !generic_force_reloc (fixP))
2f66722d
AM
12155 {
12156 /* Yes, we add the values in twice. This is because
6539b54b
AM
12157 bfd_install_relocation subtracts them out again. I think
12158 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
12159 it. FIXME. */
12160 value += fixP->fx_where + fixP->fx_frag->fr_address;
12161 }
252b5132
RH
12162 }
12163#endif
12164#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
12165 /* For some reason, the PE format does not store a
12166 section address offset for a PC relative symbol. */
12167 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 12168 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
12169 value += md_pcrel_from (fixP);
12170#endif
12171 }
fbeb56a4 12172#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
12173 if (fixP->fx_addsy != NULL
12174 && S_IS_WEAK (fixP->fx_addsy)
12175 /* PR 16858: Do not modify weak function references. */
12176 && ! fixP->fx_pcrel)
fbeb56a4 12177 {
296a8689
NC
12178#if !defined (TE_PEP)
12179 /* For x86 PE weak function symbols are neither PC-relative
12180 nor do they set S_IS_FUNCTION. So the only reliable way
12181 to detect them is to check the flags of their containing
12182 section. */
12183 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
12184 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
12185 ;
12186 else
12187#endif
fbeb56a4
DK
12188 value -= S_GET_VALUE (fixP->fx_addsy);
12189 }
12190#endif
252b5132
RH
12191
12192 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 12193 and we must not disappoint it. */
252b5132 12194#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12195 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
12196 switch (fixP->fx_r_type)
12197 {
12198 case BFD_RELOC_386_PLT32:
3e73aa7c 12199 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
12200 /* Make the jump instruction point to the address of the operand.
12201 At runtime we merely add the offset to the actual PLT entry.
12202 NB: Subtract the offset size only for jump instructions. */
12203 if (fixP->fx_pcrel)
12204 value = -4;
47926f60 12205 break;
31312f95 12206
13ae64f3
JJ
12207 case BFD_RELOC_386_TLS_GD:
12208 case BFD_RELOC_386_TLS_LDM:
13ae64f3 12209 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
12210 case BFD_RELOC_386_TLS_IE:
12211 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 12212 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
12213 case BFD_RELOC_X86_64_TLSGD:
12214 case BFD_RELOC_X86_64_TLSLD:
12215 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 12216 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
12217 value = 0; /* Fully resolved at runtime. No addend. */
12218 /* Fallthrough */
12219 case BFD_RELOC_386_TLS_LE:
12220 case BFD_RELOC_386_TLS_LDO_32:
12221 case BFD_RELOC_386_TLS_LE_32:
12222 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 12223 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 12224 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 12225 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
12226 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12227 break;
12228
67a4f2b7
AO
12229 case BFD_RELOC_386_TLS_DESC_CALL:
12230 case BFD_RELOC_X86_64_TLSDESC_CALL:
12231 value = 0; /* Fully resolved at runtime. No addend. */
12232 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12233 fixP->fx_done = 0;
12234 return;
12235
47926f60
KH
12236 case BFD_RELOC_VTABLE_INHERIT:
12237 case BFD_RELOC_VTABLE_ENTRY:
12238 fixP->fx_done = 0;
94f592af 12239 return;
47926f60
KH
12240
12241 default:
12242 break;
12243 }
12244#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 12245 *valP = value;
f86103b7 12246#endif /* !defined (TE_Mach) */
3e73aa7c 12247
3e73aa7c 12248 /* Are we finished with this relocation now? */
c6682705 12249 if (fixP->fx_addsy == NULL)
3e73aa7c 12250 fixP->fx_done = 1;
fbeb56a4
DK
12251#if defined (OBJ_COFF) && defined (TE_PE)
12252 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
12253 {
12254 fixP->fx_done = 0;
12255 /* Remember value for tc_gen_reloc. */
12256 fixP->fx_addnumber = value;
12257 /* Clear out the frag for now. */
12258 value = 0;
12259 }
12260#endif
3e73aa7c
JH
12261 else if (use_rela_relocations)
12262 {
12263 fixP->fx_no_overflow = 1;
062cd5e7
AS
12264 /* Remember value for tc_gen_reloc. */
12265 fixP->fx_addnumber = value;
3e73aa7c
JH
12266 value = 0;
12267 }
f86103b7 12268
94f592af 12269 md_number_to_chars (p, value, fixP->fx_size);
252b5132 12270}
252b5132 12271\f
6d4af3c2 12272const char *
499ac353 12273md_atof (int type, char *litP, int *sizeP)
252b5132 12274{
499ac353
NC
12275 /* This outputs the LITTLENUMs in REVERSE order;
12276 in accord with the bigendian 386. */
12277 return ieee_md_atof (type, litP, sizeP, FALSE);
252b5132
RH
12278}
12279\f
2d545b82 12280static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 12281
252b5132 12282static char *
e3bb37b5 12283output_invalid (int c)
252b5132 12284{
3882b010 12285 if (ISPRINT (c))
f9f21a03
L
12286 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
12287 "'%c'", c);
252b5132 12288 else
f9f21a03 12289 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 12290 "(0x%x)", (unsigned char) c);
252b5132
RH
12291 return output_invalid_buf;
12292}
12293
af6bdddf 12294/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
12295
12296static const reg_entry *
4d1bb795 12297parse_real_register (char *reg_string, char **end_op)
252b5132 12298{
af6bdddf
AM
12299 char *s = reg_string;
12300 char *p;
252b5132
RH
12301 char reg_name_given[MAX_REG_NAME_SIZE + 1];
12302 const reg_entry *r;
12303
12304 /* Skip possible REGISTER_PREFIX and possible whitespace. */
12305 if (*s == REGISTER_PREFIX)
12306 ++s;
12307
12308 if (is_space_char (*s))
12309 ++s;
12310
12311 p = reg_name_given;
af6bdddf 12312 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
12313 {
12314 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
12315 return (const reg_entry *) NULL;
12316 s++;
252b5132
RH
12317 }
12318
6588847e
DN
12319 /* For naked regs, make sure that we are not dealing with an identifier.
12320 This prevents confusing an identifier like `eax_var' with register
12321 `eax'. */
12322 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
12323 return (const reg_entry *) NULL;
12324
af6bdddf 12325 *end_op = s;
252b5132
RH
12326
12327 r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
12328
5f47d35b 12329 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 12330 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 12331 {
0e0eea78
JB
12332 if (!cpu_arch_flags.bitfield.cpu8087
12333 && !cpu_arch_flags.bitfield.cpu287
12334 && !cpu_arch_flags.bitfield.cpu387)
12335 return (const reg_entry *) NULL;
12336
5f47d35b
AM
12337 if (is_space_char (*s))
12338 ++s;
12339 if (*s == '(')
12340 {
af6bdddf 12341 ++s;
5f47d35b
AM
12342 if (is_space_char (*s))
12343 ++s;
12344 if (*s >= '0' && *s <= '7')
12345 {
db557034 12346 int fpr = *s - '0';
af6bdddf 12347 ++s;
5f47d35b
AM
12348 if (is_space_char (*s))
12349 ++s;
12350 if (*s == ')')
12351 {
12352 *end_op = s + 1;
1e9cc1c2 12353 r = (const reg_entry *) hash_find (reg_hash, "st(0)");
db557034
AM
12354 know (r);
12355 return r + fpr;
5f47d35b 12356 }
5f47d35b 12357 }
47926f60 12358 /* We have "%st(" then garbage. */
5f47d35b
AM
12359 return (const reg_entry *) NULL;
12360 }
12361 }
12362
a60de03c
JB
12363 if (r == NULL || allow_pseudo_reg)
12364 return r;
12365
0dfbf9d7 12366 if (operand_type_all_zero (&r->reg_type))
a60de03c
JB
12367 return (const reg_entry *) NULL;
12368
dc821c5f 12369 if ((r->reg_type.bitfield.dword
00cee14f 12370 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
4a5c67ed
JB
12371 || r->reg_type.bitfield.class == RegCR
12372 || r->reg_type.bitfield.class == RegDR
12373 || r->reg_type.bitfield.class == RegTR)
192dc9c6
JB
12374 && !cpu_arch_flags.bitfield.cpui386)
12375 return (const reg_entry *) NULL;
12376
3528c362 12377 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
192dc9c6
JB
12378 return (const reg_entry *) NULL;
12379
6e041cf4
JB
12380 if (!cpu_arch_flags.bitfield.cpuavx512f)
12381 {
f74a6307
JB
12382 if (r->reg_type.bitfield.zmmword
12383 || r->reg_type.bitfield.class == RegMask)
6e041cf4 12384 return (const reg_entry *) NULL;
40f12533 12385
6e041cf4
JB
12386 if (!cpu_arch_flags.bitfield.cpuavx)
12387 {
12388 if (r->reg_type.bitfield.ymmword)
12389 return (const reg_entry *) NULL;
1848e567 12390
6e041cf4
JB
12391 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
12392 return (const reg_entry *) NULL;
12393 }
12394 }
43234a1e 12395
f74a6307 12396 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
1adf7f56
JB
12397 return (const reg_entry *) NULL;
12398
db51cc60 12399 /* Don't allow fake index register unless allow_index_reg isn't 0. */
e968fc9b 12400 if (!allow_index_reg && r->reg_num == RegIZ)
db51cc60
L
12401 return (const reg_entry *) NULL;
12402
1d3f8286
JB
12403 /* Upper 16 vector registers are only available with VREX in 64bit
12404 mode, and require EVEX encoding. */
12405 if (r->reg_flags & RegVRex)
43234a1e 12406 {
e951d5ca 12407 if (!cpu_arch_flags.bitfield.cpuavx512f
43234a1e
L
12408 || flag_code != CODE_64BIT)
12409 return (const reg_entry *) NULL;
1d3f8286
JB
12410
12411 i.vec_encoding = vex_encoding_evex;
43234a1e
L
12412 }
12413
4787f4a5 12414 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
4a5c67ed 12415 && (!cpu_arch_flags.bitfield.cpulm || r->reg_type.bitfield.class != RegCR)
1ae00879 12416 && flag_code != CODE_64BIT)
20f0a1fc 12417 return (const reg_entry *) NULL;
1ae00879 12418
00cee14f
JB
12419 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
12420 && !intel_syntax)
b7240065
JB
12421 return (const reg_entry *) NULL;
12422
252b5132
RH
12423 return r;
12424}
4d1bb795
JB
12425
12426/* REG_STRING starts *before* REGISTER_PREFIX. */
12427
12428static const reg_entry *
12429parse_register (char *reg_string, char **end_op)
12430{
12431 const reg_entry *r;
12432
12433 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
12434 r = parse_real_register (reg_string, end_op);
12435 else
12436 r = NULL;
12437 if (!r)
12438 {
12439 char *save = input_line_pointer;
12440 char c;
12441 symbolS *symbolP;
12442
12443 input_line_pointer = reg_string;
d02603dc 12444 c = get_symbol_name (&reg_string);
4d1bb795
JB
12445 symbolP = symbol_find (reg_string);
12446 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
12447 {
12448 const expressionS *e = symbol_get_value_expression (symbolP);
12449
0398aac5 12450 know (e->X_op == O_register);
4eed87de 12451 know (e->X_add_number >= 0
c3fe08fa 12452 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 12453 r = i386_regtab + e->X_add_number;
d3bb6b49 12454 if ((r->reg_flags & RegVRex))
86fa6981 12455 i.vec_encoding = vex_encoding_evex;
4d1bb795
JB
12456 *end_op = input_line_pointer;
12457 }
12458 *input_line_pointer = c;
12459 input_line_pointer = save;
12460 }
12461 return r;
12462}
12463
12464int
12465i386_parse_name (char *name, expressionS *e, char *nextcharP)
12466{
12467 const reg_entry *r;
12468 char *end = input_line_pointer;
12469
12470 *end = *nextcharP;
12471 r = parse_register (name, &input_line_pointer);
12472 if (r && end <= input_line_pointer)
12473 {
12474 *nextcharP = *input_line_pointer;
12475 *input_line_pointer = 0;
12476 e->X_op = O_register;
12477 e->X_add_number = r - i386_regtab;
12478 return 1;
12479 }
12480 input_line_pointer = end;
12481 *end = 0;
ee86248c 12482 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
12483}
12484
12485void
12486md_operand (expressionS *e)
12487{
ee86248c
JB
12488 char *end;
12489 const reg_entry *r;
4d1bb795 12490
ee86248c
JB
12491 switch (*input_line_pointer)
12492 {
12493 case REGISTER_PREFIX:
12494 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
12495 if (r)
12496 {
12497 e->X_op = O_register;
12498 e->X_add_number = r - i386_regtab;
12499 input_line_pointer = end;
12500 }
ee86248c
JB
12501 break;
12502
12503 case '[':
9c2799c2 12504 gas_assert (intel_syntax);
ee86248c
JB
12505 end = input_line_pointer++;
12506 expression (e);
12507 if (*input_line_pointer == ']')
12508 {
12509 ++input_line_pointer;
12510 e->X_op_symbol = make_expr_symbol (e);
12511 e->X_add_symbol = NULL;
12512 e->X_add_number = 0;
12513 e->X_op = O_index;
12514 }
12515 else
12516 {
12517 e->X_op = O_absent;
12518 input_line_pointer = end;
12519 }
12520 break;
4d1bb795
JB
12521 }
12522}
12523
252b5132 12524\f
4cc782b5 12525#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 12526const char *md_shortopts = "kVQ:sqnO::";
252b5132 12527#else
b6f8c7c4 12528const char *md_shortopts = "qnO::";
252b5132 12529#endif
6e0b89ee 12530
3e73aa7c 12531#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
12532#define OPTION_64 (OPTION_MD_BASE + 1)
12533#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
12534#define OPTION_MARCH (OPTION_MD_BASE + 3)
12535#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
12536#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
12537#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
12538#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
12539#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 12540#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 12541#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 12542#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
12543#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
12544#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
12545#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 12546#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
12547#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
12548#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 12549#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 12550#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 12551#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 12552#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
12553#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
12554#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 12555#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 12556#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 12557#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
e379e5f3
L
12558#define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27)
12559#define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
12560#define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
76cf450b 12561#define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
ae531041
L
12562#define OPTION_MLFENCE_AFTER_LOAD (OPTION_MD_BASE + 31)
12563#define OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH (OPTION_MD_BASE + 32)
12564#define OPTION_MLFENCE_BEFORE_RET (OPTION_MD_BASE + 33)
b3b91714 12565
99ad8390
NC
12566struct option md_longopts[] =
12567{
3e73aa7c 12568 {"32", no_argument, NULL, OPTION_32},
321098a5 12569#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12570 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 12571 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
12572#endif
12573#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12574 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 12575 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 12576 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 12577#endif
b3b91714 12578 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
12579 {"march", required_argument, NULL, OPTION_MARCH},
12580 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
12581 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
12582 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
12583 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
12584 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 12585 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 12586 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 12587 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 12588 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 12589 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 12590 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
12591 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
12592 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
12593# if defined (TE_PE) || defined (TE_PEP)
12594 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
12595#endif
d1982f93 12596 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 12597 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 12598 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 12599 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
e379e5f3
L
12600 {"malign-branch-boundary", required_argument, NULL, OPTION_MALIGN_BRANCH_BOUNDARY},
12601 {"malign-branch-prefix-size", required_argument, NULL, OPTION_MALIGN_BRANCH_PREFIX_SIZE},
12602 {"malign-branch", required_argument, NULL, OPTION_MALIGN_BRANCH},
76cf450b 12603 {"mbranches-within-32B-boundaries", no_argument, NULL, OPTION_MBRANCHES_WITH_32B_BOUNDARIES},
ae531041
L
12604 {"mlfence-after-load", required_argument, NULL, OPTION_MLFENCE_AFTER_LOAD},
12605 {"mlfence-before-indirect-branch", required_argument, NULL,
12606 OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH},
12607 {"mlfence-before-ret", required_argument, NULL, OPTION_MLFENCE_BEFORE_RET},
5db04b09
L
12608 {"mamd64", no_argument, NULL, OPTION_MAMD64},
12609 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
12610 {NULL, no_argument, NULL, 0}
12611};
12612size_t md_longopts_size = sizeof (md_longopts);
12613
12614int
17b9d67d 12615md_parse_option (int c, const char *arg)
252b5132 12616{
91d6fa6a 12617 unsigned int j;
e379e5f3 12618 char *arch, *next, *saved, *type;
9103f4f4 12619
252b5132
RH
12620 switch (c)
12621 {
12b55ccc
L
12622 case 'n':
12623 optimize_align_code = 0;
12624 break;
12625
a38cf1db
AM
12626 case 'q':
12627 quiet_warnings = 1;
252b5132
RH
12628 break;
12629
12630#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
12631 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
12632 should be emitted or not. FIXME: Not implemented. */
12633 case 'Q':
d4693039
JB
12634 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
12635 return 0;
252b5132
RH
12636 break;
12637
12638 /* -V: SVR4 argument to print version ID. */
12639 case 'V':
12640 print_version_id ();
12641 break;
12642
a38cf1db
AM
12643 /* -k: Ignore for FreeBSD compatibility. */
12644 case 'k':
252b5132 12645 break;
4cc782b5
ILT
12646
12647 case 's':
12648 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 12649 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 12650 break;
8dcea932
L
12651
12652 case OPTION_MSHARED:
12653 shared = 1;
12654 break;
b4a3a7b4
L
12655
12656 case OPTION_X86_USED_NOTE:
12657 if (strcasecmp (arg, "yes") == 0)
12658 x86_used_note = 1;
12659 else if (strcasecmp (arg, "no") == 0)
12660 x86_used_note = 0;
12661 else
12662 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
12663 break;
12664
12665
99ad8390 12666#endif
321098a5 12667#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12668 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
12669 case OPTION_64:
12670 {
12671 const char **list, **l;
12672
3e73aa7c
JH
12673 list = bfd_target_list ();
12674 for (l = list; *l != NULL; l++)
8620418b 12675 if (CONST_STRNEQ (*l, "elf64-x86-64")
99ad8390
NC
12676 || strcmp (*l, "coff-x86-64") == 0
12677 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
12678 || strcmp (*l, "pei-x86-64") == 0
12679 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
12680 {
12681 default_arch = "x86_64";
12682 break;
12683 }
3e73aa7c 12684 if (*l == NULL)
2b5d6a91 12685 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
12686 free (list);
12687 }
12688 break;
12689#endif
252b5132 12690
351f65ca 12691#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12692 case OPTION_X32:
351f65ca
L
12693 if (IS_ELF)
12694 {
12695 const char **list, **l;
12696
12697 list = bfd_target_list ();
12698 for (l = list; *l != NULL; l++)
12699 if (CONST_STRNEQ (*l, "elf32-x86-64"))
12700 {
12701 default_arch = "x86_64:32";
12702 break;
12703 }
12704 if (*l == NULL)
2b5d6a91 12705 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
12706 free (list);
12707 }
12708 else
12709 as_fatal (_("32bit x86_64 is only supported for ELF"));
12710 break;
12711#endif
12712
6e0b89ee
AM
12713 case OPTION_32:
12714 default_arch = "i386";
12715 break;
12716
b3b91714
AM
12717 case OPTION_DIVIDE:
12718#ifdef SVR4_COMMENT_CHARS
12719 {
12720 char *n, *t;
12721 const char *s;
12722
add39d23 12723 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
12724 t = n;
12725 for (s = i386_comment_chars; *s != '\0'; s++)
12726 if (*s != '/')
12727 *t++ = *s;
12728 *t = '\0';
12729 i386_comment_chars = n;
12730 }
12731#endif
12732 break;
12733
9103f4f4 12734 case OPTION_MARCH:
293f5f65
L
12735 saved = xstrdup (arg);
12736 arch = saved;
12737 /* Allow -march=+nosse. */
12738 if (*arch == '+')
12739 arch++;
6305a203 12740 do
9103f4f4 12741 {
6305a203 12742 if (*arch == '.')
2b5d6a91 12743 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
12744 next = strchr (arch, '+');
12745 if (next)
12746 *next++ = '\0';
91d6fa6a 12747 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 12748 {
91d6fa6a 12749 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 12750 {
6305a203 12751 /* Processor. */
1ded5609
JB
12752 if (! cpu_arch[j].flags.bitfield.cpui386)
12753 continue;
12754
91d6fa6a 12755 cpu_arch_name = cpu_arch[j].name;
6305a203 12756 cpu_sub_arch_name = NULL;
91d6fa6a
NC
12757 cpu_arch_flags = cpu_arch[j].flags;
12758 cpu_arch_isa = cpu_arch[j].type;
12759 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
12760 if (!cpu_arch_tune_set)
12761 {
12762 cpu_arch_tune = cpu_arch_isa;
12763 cpu_arch_tune_flags = cpu_arch_isa_flags;
12764 }
12765 break;
12766 }
91d6fa6a
NC
12767 else if (*cpu_arch [j].name == '.'
12768 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 12769 {
33eaf5de 12770 /* ISA extension. */
6305a203 12771 i386_cpu_flags flags;
309d3373 12772
293f5f65
L
12773 flags = cpu_flags_or (cpu_arch_flags,
12774 cpu_arch[j].flags);
81486035 12775
5b64d091 12776 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
12777 {
12778 if (cpu_sub_arch_name)
12779 {
12780 char *name = cpu_sub_arch_name;
12781 cpu_sub_arch_name = concat (name,
91d6fa6a 12782 cpu_arch[j].name,
1bf57e9f 12783 (const char *) NULL);
6305a203
L
12784 free (name);
12785 }
12786 else
91d6fa6a 12787 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 12788 cpu_arch_flags = flags;
a586129e 12789 cpu_arch_isa_flags = flags;
6305a203 12790 }
0089dace
L
12791 else
12792 cpu_arch_isa_flags
12793 = cpu_flags_or (cpu_arch_isa_flags,
12794 cpu_arch[j].flags);
6305a203 12795 break;
ccc9c027 12796 }
9103f4f4 12797 }
6305a203 12798
293f5f65
L
12799 if (j >= ARRAY_SIZE (cpu_arch))
12800 {
33eaf5de 12801 /* Disable an ISA extension. */
293f5f65
L
12802 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
12803 if (strcmp (arch, cpu_noarch [j].name) == 0)
12804 {
12805 i386_cpu_flags flags;
12806
12807 flags = cpu_flags_and_not (cpu_arch_flags,
12808 cpu_noarch[j].flags);
12809 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
12810 {
12811 if (cpu_sub_arch_name)
12812 {
12813 char *name = cpu_sub_arch_name;
12814 cpu_sub_arch_name = concat (arch,
12815 (const char *) NULL);
12816 free (name);
12817 }
12818 else
12819 cpu_sub_arch_name = xstrdup (arch);
12820 cpu_arch_flags = flags;
12821 cpu_arch_isa_flags = flags;
12822 }
12823 break;
12824 }
12825
12826 if (j >= ARRAY_SIZE (cpu_noarch))
12827 j = ARRAY_SIZE (cpu_arch);
12828 }
12829
91d6fa6a 12830 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 12831 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
12832
12833 arch = next;
9103f4f4 12834 }
293f5f65
L
12835 while (next != NULL);
12836 free (saved);
9103f4f4
L
12837 break;
12838
12839 case OPTION_MTUNE:
12840 if (*arg == '.')
2b5d6a91 12841 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 12842 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 12843 {
91d6fa6a 12844 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 12845 {
ccc9c027 12846 cpu_arch_tune_set = 1;
91d6fa6a
NC
12847 cpu_arch_tune = cpu_arch [j].type;
12848 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
12849 break;
12850 }
12851 }
91d6fa6a 12852 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 12853 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
12854 break;
12855
1efbbeb4
L
12856 case OPTION_MMNEMONIC:
12857 if (strcasecmp (arg, "att") == 0)
12858 intel_mnemonic = 0;
12859 else if (strcasecmp (arg, "intel") == 0)
12860 intel_mnemonic = 1;
12861 else
2b5d6a91 12862 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
12863 break;
12864
12865 case OPTION_MSYNTAX:
12866 if (strcasecmp (arg, "att") == 0)
12867 intel_syntax = 0;
12868 else if (strcasecmp (arg, "intel") == 0)
12869 intel_syntax = 1;
12870 else
2b5d6a91 12871 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
12872 break;
12873
12874 case OPTION_MINDEX_REG:
12875 allow_index_reg = 1;
12876 break;
12877
12878 case OPTION_MNAKED_REG:
12879 allow_naked_reg = 1;
12880 break;
12881
c0f3af97
L
12882 case OPTION_MSSE2AVX:
12883 sse2avx = 1;
12884 break;
12885
daf50ae7
L
12886 case OPTION_MSSE_CHECK:
12887 if (strcasecmp (arg, "error") == 0)
7bab8ab5 12888 sse_check = check_error;
daf50ae7 12889 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 12890 sse_check = check_warning;
daf50ae7 12891 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 12892 sse_check = check_none;
daf50ae7 12893 else
2b5d6a91 12894 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
12895 break;
12896
7bab8ab5
JB
12897 case OPTION_MOPERAND_CHECK:
12898 if (strcasecmp (arg, "error") == 0)
12899 operand_check = check_error;
12900 else if (strcasecmp (arg, "warning") == 0)
12901 operand_check = check_warning;
12902 else if (strcasecmp (arg, "none") == 0)
12903 operand_check = check_none;
12904 else
12905 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
12906 break;
12907
539f890d
L
12908 case OPTION_MAVXSCALAR:
12909 if (strcasecmp (arg, "128") == 0)
12910 avxscalar = vex128;
12911 else if (strcasecmp (arg, "256") == 0)
12912 avxscalar = vex256;
12913 else
2b5d6a91 12914 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
12915 break;
12916
03751133
L
12917 case OPTION_MVEXWIG:
12918 if (strcmp (arg, "0") == 0)
40c9c8de 12919 vexwig = vexw0;
03751133 12920 else if (strcmp (arg, "1") == 0)
40c9c8de 12921 vexwig = vexw1;
03751133
L
12922 else
12923 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
12924 break;
12925
7e8b059b
L
12926 case OPTION_MADD_BND_PREFIX:
12927 add_bnd_prefix = 1;
12928 break;
12929
43234a1e
L
12930 case OPTION_MEVEXLIG:
12931 if (strcmp (arg, "128") == 0)
12932 evexlig = evexl128;
12933 else if (strcmp (arg, "256") == 0)
12934 evexlig = evexl256;
12935 else if (strcmp (arg, "512") == 0)
12936 evexlig = evexl512;
12937 else
12938 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
12939 break;
12940
d3d3c6db
IT
12941 case OPTION_MEVEXRCIG:
12942 if (strcmp (arg, "rne") == 0)
12943 evexrcig = rne;
12944 else if (strcmp (arg, "rd") == 0)
12945 evexrcig = rd;
12946 else if (strcmp (arg, "ru") == 0)
12947 evexrcig = ru;
12948 else if (strcmp (arg, "rz") == 0)
12949 evexrcig = rz;
12950 else
12951 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
12952 break;
12953
43234a1e
L
12954 case OPTION_MEVEXWIG:
12955 if (strcmp (arg, "0") == 0)
12956 evexwig = evexw0;
12957 else if (strcmp (arg, "1") == 0)
12958 evexwig = evexw1;
12959 else
12960 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
12961 break;
12962
167ad85b
TG
12963# if defined (TE_PE) || defined (TE_PEP)
12964 case OPTION_MBIG_OBJ:
12965 use_big_obj = 1;
12966 break;
12967#endif
12968
d1982f93 12969 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
12970 if (strcasecmp (arg, "yes") == 0)
12971 omit_lock_prefix = 1;
12972 else if (strcasecmp (arg, "no") == 0)
12973 omit_lock_prefix = 0;
12974 else
12975 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
12976 break;
12977
e4e00185
AS
12978 case OPTION_MFENCE_AS_LOCK_ADD:
12979 if (strcasecmp (arg, "yes") == 0)
12980 avoid_fence = 1;
12981 else if (strcasecmp (arg, "no") == 0)
12982 avoid_fence = 0;
12983 else
12984 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
12985 break;
12986
ae531041
L
12987 case OPTION_MLFENCE_AFTER_LOAD:
12988 if (strcasecmp (arg, "yes") == 0)
12989 lfence_after_load = 1;
12990 else if (strcasecmp (arg, "no") == 0)
12991 lfence_after_load = 0;
12992 else
12993 as_fatal (_("invalid -mlfence-after-load= option: `%s'"), arg);
12994 break;
12995
12996 case OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH:
12997 if (strcasecmp (arg, "all") == 0)
12998 lfence_before_indirect_branch = lfence_branch_all;
12999 else if (strcasecmp (arg, "memory") == 0)
13000 lfence_before_indirect_branch = lfence_branch_memory;
13001 else if (strcasecmp (arg, "register") == 0)
13002 lfence_before_indirect_branch = lfence_branch_register;
13003 else if (strcasecmp (arg, "none") == 0)
13004 lfence_before_indirect_branch = lfence_branch_none;
13005 else
13006 as_fatal (_("invalid -mlfence-before-indirect-branch= option: `%s'"),
13007 arg);
13008 break;
13009
13010 case OPTION_MLFENCE_BEFORE_RET:
13011 if (strcasecmp (arg, "or") == 0)
13012 lfence_before_ret = lfence_before_ret_or;
13013 else if (strcasecmp (arg, "not") == 0)
13014 lfence_before_ret = lfence_before_ret_not;
13015 else if (strcasecmp (arg, "none") == 0)
13016 lfence_before_ret = lfence_before_ret_none;
13017 else
13018 as_fatal (_("invalid -mlfence-before-ret= option: `%s'"),
13019 arg);
13020 break;
13021
0cb4071e
L
13022 case OPTION_MRELAX_RELOCATIONS:
13023 if (strcasecmp (arg, "yes") == 0)
13024 generate_relax_relocations = 1;
13025 else if (strcasecmp (arg, "no") == 0)
13026 generate_relax_relocations = 0;
13027 else
13028 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
13029 break;
13030
e379e5f3
L
13031 case OPTION_MALIGN_BRANCH_BOUNDARY:
13032 {
13033 char *end;
13034 long int align = strtoul (arg, &end, 0);
13035 if (*end == '\0')
13036 {
13037 if (align == 0)
13038 {
13039 align_branch_power = 0;
13040 break;
13041 }
13042 else if (align >= 16)
13043 {
13044 int align_power;
13045 for (align_power = 0;
13046 (align & 1) == 0;
13047 align >>= 1, align_power++)
13048 continue;
13049 /* Limit alignment power to 31. */
13050 if (align == 1 && align_power < 32)
13051 {
13052 align_branch_power = align_power;
13053 break;
13054 }
13055 }
13056 }
13057 as_fatal (_("invalid -malign-branch-boundary= value: %s"), arg);
13058 }
13059 break;
13060
13061 case OPTION_MALIGN_BRANCH_PREFIX_SIZE:
13062 {
13063 char *end;
13064 int align = strtoul (arg, &end, 0);
13065 /* Some processors only support 5 prefixes. */
13066 if (*end == '\0' && align >= 0 && align < 6)
13067 {
13068 align_branch_prefix_size = align;
13069 break;
13070 }
13071 as_fatal (_("invalid -malign-branch-prefix-size= value: %s"),
13072 arg);
13073 }
13074 break;
13075
13076 case OPTION_MALIGN_BRANCH:
13077 align_branch = 0;
13078 saved = xstrdup (arg);
13079 type = saved;
13080 do
13081 {
13082 next = strchr (type, '+');
13083 if (next)
13084 *next++ = '\0';
13085 if (strcasecmp (type, "jcc") == 0)
13086 align_branch |= align_branch_jcc_bit;
13087 else if (strcasecmp (type, "fused") == 0)
13088 align_branch |= align_branch_fused_bit;
13089 else if (strcasecmp (type, "jmp") == 0)
13090 align_branch |= align_branch_jmp_bit;
13091 else if (strcasecmp (type, "call") == 0)
13092 align_branch |= align_branch_call_bit;
13093 else if (strcasecmp (type, "ret") == 0)
13094 align_branch |= align_branch_ret_bit;
13095 else if (strcasecmp (type, "indirect") == 0)
13096 align_branch |= align_branch_indirect_bit;
13097 else
13098 as_fatal (_("invalid -malign-branch= option: `%s'"), arg);
13099 type = next;
13100 }
13101 while (next != NULL);
13102 free (saved);
13103 break;
13104
76cf450b
L
13105 case OPTION_MBRANCHES_WITH_32B_BOUNDARIES:
13106 align_branch_power = 5;
13107 align_branch_prefix_size = 5;
13108 align_branch = (align_branch_jcc_bit
13109 | align_branch_fused_bit
13110 | align_branch_jmp_bit);
13111 break;
13112
5db04b09 13113 case OPTION_MAMD64:
4b5aaf5f 13114 isa64 = amd64;
5db04b09
L
13115 break;
13116
13117 case OPTION_MINTEL64:
4b5aaf5f 13118 isa64 = intel64;
5db04b09
L
13119 break;
13120
b6f8c7c4
L
13121 case 'O':
13122 if (arg == NULL)
13123 {
13124 optimize = 1;
13125 /* Turn off -Os. */
13126 optimize_for_space = 0;
13127 }
13128 else if (*arg == 's')
13129 {
13130 optimize_for_space = 1;
13131 /* Turn on all encoding optimizations. */
41fd2579 13132 optimize = INT_MAX;
b6f8c7c4
L
13133 }
13134 else
13135 {
13136 optimize = atoi (arg);
13137 /* Turn off -Os. */
13138 optimize_for_space = 0;
13139 }
13140 break;
13141
252b5132
RH
13142 default:
13143 return 0;
13144 }
13145 return 1;
13146}
13147
8a2c8fef
L
13148#define MESSAGE_TEMPLATE \
13149" "
13150
293f5f65
L
13151static char *
13152output_message (FILE *stream, char *p, char *message, char *start,
13153 int *left_p, const char *name, int len)
13154{
13155 int size = sizeof (MESSAGE_TEMPLATE);
13156 int left = *left_p;
13157
13158 /* Reserve 2 spaces for ", " or ",\0" */
13159 left -= len + 2;
13160
13161 /* Check if there is any room. */
13162 if (left >= 0)
13163 {
13164 if (p != start)
13165 {
13166 *p++ = ',';
13167 *p++ = ' ';
13168 }
13169 p = mempcpy (p, name, len);
13170 }
13171 else
13172 {
13173 /* Output the current message now and start a new one. */
13174 *p++ = ',';
13175 *p = '\0';
13176 fprintf (stream, "%s\n", message);
13177 p = start;
13178 left = size - (start - message) - len - 2;
13179
13180 gas_assert (left >= 0);
13181
13182 p = mempcpy (p, name, len);
13183 }
13184
13185 *left_p = left;
13186 return p;
13187}
13188
8a2c8fef 13189static void
1ded5609 13190show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
13191{
13192 static char message[] = MESSAGE_TEMPLATE;
13193 char *start = message + 27;
13194 char *p;
13195 int size = sizeof (MESSAGE_TEMPLATE);
13196 int left;
13197 const char *name;
13198 int len;
13199 unsigned int j;
13200
13201 p = start;
13202 left = size - (start - message);
13203 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
13204 {
13205 /* Should it be skipped? */
13206 if (cpu_arch [j].skip)
13207 continue;
13208
13209 name = cpu_arch [j].name;
13210 len = cpu_arch [j].len;
13211 if (*name == '.')
13212 {
13213 /* It is an extension. Skip if we aren't asked to show it. */
13214 if (ext)
13215 {
13216 name++;
13217 len--;
13218 }
13219 else
13220 continue;
13221 }
13222 else if (ext)
13223 {
13224 /* It is an processor. Skip if we show only extension. */
13225 continue;
13226 }
1ded5609
JB
13227 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
13228 {
13229 /* It is an impossible processor - skip. */
13230 continue;
13231 }
8a2c8fef 13232
293f5f65 13233 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
13234 }
13235
293f5f65
L
13236 /* Display disabled extensions. */
13237 if (ext)
13238 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13239 {
13240 name = cpu_noarch [j].name;
13241 len = cpu_noarch [j].len;
13242 p = output_message (stream, p, message, start, &left, name,
13243 len);
13244 }
13245
8a2c8fef
L
13246 *p = '\0';
13247 fprintf (stream, "%s\n", message);
13248}
13249
252b5132 13250void
8a2c8fef 13251md_show_usage (FILE *stream)
252b5132 13252{
4cc782b5
ILT
13253#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13254 fprintf (stream, _("\
d4693039 13255 -Qy, -Qn ignored\n\
a38cf1db 13256 -V print assembler version number\n\
b3b91714
AM
13257 -k ignored\n"));
13258#endif
13259 fprintf (stream, _("\
12b55ccc 13260 -n Do not optimize code alignment\n\
b3b91714
AM
13261 -q quieten some warnings\n"));
13262#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13263 fprintf (stream, _("\
a38cf1db 13264 -s ignored\n"));
b3b91714 13265#endif
d7f449c0
L
13266#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
13267 || defined (TE_PE) || defined (TE_PEP))
751d281c 13268 fprintf (stream, _("\
570561f7 13269 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 13270#endif
b3b91714
AM
13271#ifdef SVR4_COMMENT_CHARS
13272 fprintf (stream, _("\
13273 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
13274#else
13275 fprintf (stream, _("\
b3b91714 13276 --divide ignored\n"));
4cc782b5 13277#endif
9103f4f4 13278 fprintf (stream, _("\
6305a203 13279 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 13280 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 13281 show_arch (stream, 0, 1);
8a2c8fef
L
13282 fprintf (stream, _("\
13283 EXTENSION is combination of:\n"));
1ded5609 13284 show_arch (stream, 1, 0);
6305a203 13285 fprintf (stream, _("\
8a2c8fef 13286 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 13287 show_arch (stream, 0, 0);
ba104c83 13288 fprintf (stream, _("\
c0f3af97
L
13289 -msse2avx encode SSE instructions with VEX prefix\n"));
13290 fprintf (stream, _("\
7c5c05ef 13291 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
13292 check SSE instructions\n"));
13293 fprintf (stream, _("\
7c5c05ef 13294 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
13295 check operand combinations for validity\n"));
13296 fprintf (stream, _("\
7c5c05ef
L
13297 -mavxscalar=[128|256] (default: 128)\n\
13298 encode scalar AVX instructions with specific vector\n\
539f890d
L
13299 length\n"));
13300 fprintf (stream, _("\
03751133
L
13301 -mvexwig=[0|1] (default: 0)\n\
13302 encode VEX instructions with specific VEX.W value\n\
13303 for VEX.W bit ignored instructions\n"));
13304 fprintf (stream, _("\
7c5c05ef
L
13305 -mevexlig=[128|256|512] (default: 128)\n\
13306 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
13307 length\n"));
13308 fprintf (stream, _("\
7c5c05ef
L
13309 -mevexwig=[0|1] (default: 0)\n\
13310 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
13311 for EVEX.W bit ignored instructions\n"));
13312 fprintf (stream, _("\
7c5c05ef 13313 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
13314 encode EVEX instructions with specific EVEX.RC value\n\
13315 for SAE-only ignored instructions\n"));
13316 fprintf (stream, _("\
7c5c05ef
L
13317 -mmnemonic=[att|intel] "));
13318 if (SYSV386_COMPAT)
13319 fprintf (stream, _("(default: att)\n"));
13320 else
13321 fprintf (stream, _("(default: intel)\n"));
13322 fprintf (stream, _("\
13323 use AT&T/Intel mnemonic\n"));
ba104c83 13324 fprintf (stream, _("\
7c5c05ef
L
13325 -msyntax=[att|intel] (default: att)\n\
13326 use AT&T/Intel syntax\n"));
ba104c83
L
13327 fprintf (stream, _("\
13328 -mindex-reg support pseudo index registers\n"));
13329 fprintf (stream, _("\
13330 -mnaked-reg don't require `%%' prefix for registers\n"));
13331 fprintf (stream, _("\
7e8b059b 13332 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 13333#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
13334 fprintf (stream, _("\
13335 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
13336 fprintf (stream, _("\
13337 -mx86-used-note=[no|yes] "));
13338 if (DEFAULT_X86_USED_NOTE)
13339 fprintf (stream, _("(default: yes)\n"));
13340 else
13341 fprintf (stream, _("(default: no)\n"));
13342 fprintf (stream, _("\
13343 generate x86 used ISA and feature properties\n"));
13344#endif
13345#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
13346 fprintf (stream, _("\
13347 -mbig-obj generate big object files\n"));
13348#endif
d022bddd 13349 fprintf (stream, _("\
7c5c05ef 13350 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 13351 strip all lock prefixes\n"));
5db04b09 13352 fprintf (stream, _("\
7c5c05ef 13353 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
13354 encode lfence, mfence and sfence as\n\
13355 lock addl $0x0, (%%{re}sp)\n"));
13356 fprintf (stream, _("\
7c5c05ef
L
13357 -mrelax-relocations=[no|yes] "));
13358 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
13359 fprintf (stream, _("(default: yes)\n"));
13360 else
13361 fprintf (stream, _("(default: no)\n"));
13362 fprintf (stream, _("\
0cb4071e
L
13363 generate relax relocations\n"));
13364 fprintf (stream, _("\
e379e5f3
L
13365 -malign-branch-boundary=NUM (default: 0)\n\
13366 align branches within NUM byte boundary\n"));
13367 fprintf (stream, _("\
13368 -malign-branch=TYPE[+TYPE...] (default: jcc+fused+jmp)\n\
13369 TYPE is combination of jcc, fused, jmp, call, ret,\n\
13370 indirect\n\
13371 specify types of branches to align\n"));
13372 fprintf (stream, _("\
13373 -malign-branch-prefix-size=NUM (default: 5)\n\
13374 align branches with NUM prefixes per instruction\n"));
13375 fprintf (stream, _("\
76cf450b
L
13376 -mbranches-within-32B-boundaries\n\
13377 align branches within 32 byte boundary\n"));
13378 fprintf (stream, _("\
ae531041
L
13379 -mlfence-after-load=[no|yes] (default: no)\n\
13380 generate lfence after load\n"));
13381 fprintf (stream, _("\
13382 -mlfence-before-indirect-branch=[none|all|register|memory] (default: none)\n\
13383 generate lfence before indirect near branch\n"));
13384 fprintf (stream, _("\
13385 -mlfence-before-ret=[none|or|not] (default: none)\n\
13386 generate lfence before ret\n"));
13387 fprintf (stream, _("\
7c5c05ef 13388 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
13389 fprintf (stream, _("\
13390 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
13391}
13392
3e73aa7c 13393#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 13394 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 13395 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
13396
13397/* Pick the target format to use. */
13398
47926f60 13399const char *
e3bb37b5 13400i386_target_format (void)
252b5132 13401{
351f65ca
L
13402 if (!strncmp (default_arch, "x86_64", 6))
13403 {
13404 update_code_flag (CODE_64BIT, 1);
13405 if (default_arch[6] == '\0')
7f56bc95 13406 x86_elf_abi = X86_64_ABI;
351f65ca 13407 else
7f56bc95 13408 x86_elf_abi = X86_64_X32_ABI;
351f65ca 13409 }
3e73aa7c 13410 else if (!strcmp (default_arch, "i386"))
78f12dd3 13411 update_code_flag (CODE_32BIT, 1);
5197d474
L
13412 else if (!strcmp (default_arch, "iamcu"))
13413 {
13414 update_code_flag (CODE_32BIT, 1);
13415 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
13416 {
13417 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
13418 cpu_arch_name = "iamcu";
13419 cpu_sub_arch_name = NULL;
13420 cpu_arch_flags = iamcu_flags;
13421 cpu_arch_isa = PROCESSOR_IAMCU;
13422 cpu_arch_isa_flags = iamcu_flags;
13423 if (!cpu_arch_tune_set)
13424 {
13425 cpu_arch_tune = cpu_arch_isa;
13426 cpu_arch_tune_flags = cpu_arch_isa_flags;
13427 }
13428 }
8d471ec1 13429 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
13430 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
13431 cpu_arch_name);
13432 }
3e73aa7c 13433 else
2b5d6a91 13434 as_fatal (_("unknown architecture"));
89507696
JB
13435
13436 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
13437 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13438 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
13439 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13440
252b5132
RH
13441 switch (OUTPUT_FLAVOR)
13442 {
9384f2ff 13443#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 13444 case bfd_target_aout_flavour:
47926f60 13445 return AOUT_TARGET_FORMAT;
4c63da97 13446#endif
9384f2ff
AM
13447#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
13448# if defined (TE_PE) || defined (TE_PEP)
13449 case bfd_target_coff_flavour:
167ad85b
TG
13450 if (flag_code == CODE_64BIT)
13451 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
13452 else
13453 return "pe-i386";
9384f2ff 13454# elif defined (TE_GO32)
0561d57c
JK
13455 case bfd_target_coff_flavour:
13456 return "coff-go32";
9384f2ff 13457# else
252b5132
RH
13458 case bfd_target_coff_flavour:
13459 return "coff-i386";
9384f2ff 13460# endif
4c63da97 13461#endif
3e73aa7c 13462#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 13463 case bfd_target_elf_flavour:
3e73aa7c 13464 {
351f65ca
L
13465 const char *format;
13466
13467 switch (x86_elf_abi)
4fa24527 13468 {
351f65ca
L
13469 default:
13470 format = ELF_TARGET_FORMAT;
e379e5f3
L
13471#ifndef TE_SOLARIS
13472 tls_get_addr = "___tls_get_addr";
13473#endif
351f65ca 13474 break;
7f56bc95 13475 case X86_64_ABI:
351f65ca 13476 use_rela_relocations = 1;
4fa24527 13477 object_64bit = 1;
e379e5f3
L
13478#ifndef TE_SOLARIS
13479 tls_get_addr = "__tls_get_addr";
13480#endif
351f65ca
L
13481 format = ELF_TARGET_FORMAT64;
13482 break;
7f56bc95 13483 case X86_64_X32_ABI:
4fa24527 13484 use_rela_relocations = 1;
351f65ca 13485 object_64bit = 1;
e379e5f3
L
13486#ifndef TE_SOLARIS
13487 tls_get_addr = "__tls_get_addr";
13488#endif
862be3fb 13489 disallow_64bit_reloc = 1;
351f65ca
L
13490 format = ELF_TARGET_FORMAT32;
13491 break;
4fa24527 13492 }
3632d14b 13493 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 13494 {
7f56bc95 13495 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
13496 as_fatal (_("Intel L1OM is 64bit only"));
13497 return ELF_TARGET_L1OM_FORMAT;
13498 }
b49f93f6 13499 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
13500 {
13501 if (x86_elf_abi != X86_64_ABI)
13502 as_fatal (_("Intel K1OM is 64bit only"));
13503 return ELF_TARGET_K1OM_FORMAT;
13504 }
81486035
L
13505 else if (cpu_arch_isa == PROCESSOR_IAMCU)
13506 {
13507 if (x86_elf_abi != I386_ABI)
13508 as_fatal (_("Intel MCU is 32bit only"));
13509 return ELF_TARGET_IAMCU_FORMAT;
13510 }
8a9036a4 13511 else
351f65ca 13512 return format;
3e73aa7c 13513 }
e57f8c65
TG
13514#endif
13515#if defined (OBJ_MACH_O)
13516 case bfd_target_mach_o_flavour:
d382c579
TG
13517 if (flag_code == CODE_64BIT)
13518 {
13519 use_rela_relocations = 1;
13520 object_64bit = 1;
13521 return "mach-o-x86-64";
13522 }
13523 else
13524 return "mach-o-i386";
4c63da97 13525#endif
252b5132
RH
13526 default:
13527 abort ();
13528 return NULL;
13529 }
13530}
13531
47926f60 13532#endif /* OBJ_MAYBE_ more than one */
252b5132 13533\f
252b5132 13534symbolS *
7016a5d5 13535md_undefined_symbol (char *name)
252b5132 13536{
18dc2407
ILT
13537 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
13538 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
13539 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
13540 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
13541 {
13542 if (!GOT_symbol)
13543 {
13544 if (symbol_find (name))
13545 as_bad (_("GOT already in symbol table"));
13546 GOT_symbol = symbol_new (name, undefined_section,
13547 (valueT) 0, &zero_address_frag);
13548 };
13549 return GOT_symbol;
13550 }
252b5132
RH
13551 return 0;
13552}
13553
13554/* Round up a section size to the appropriate boundary. */
47926f60 13555
252b5132 13556valueT
7016a5d5 13557md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 13558{
4c63da97
AM
13559#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
13560 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
13561 {
13562 /* For a.out, force the section size to be aligned. If we don't do
13563 this, BFD will align it for us, but it will not write out the
13564 final bytes of the section. This may be a bug in BFD, but it is
13565 easier to fix it here since that is how the other a.out targets
13566 work. */
13567 int align;
13568
fd361982 13569 align = bfd_section_alignment (segment);
8d3842cd 13570 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 13571 }
252b5132
RH
13572#endif
13573
13574 return size;
13575}
13576
13577/* On the i386, PC-relative offsets are relative to the start of the
13578 next instruction. That is, the address of the offset, plus its
13579 size, since the offset is always the last part of the insn. */
13580
13581long
e3bb37b5 13582md_pcrel_from (fixS *fixP)
252b5132
RH
13583{
13584 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
13585}
13586
13587#ifndef I386COFF
13588
13589static void
e3bb37b5 13590s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 13591{
29b0f896 13592 int temp;
252b5132 13593
8a75718c
JB
13594#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13595 if (IS_ELF)
13596 obj_elf_section_change_hook ();
13597#endif
252b5132
RH
13598 temp = get_absolute_expression ();
13599 subseg_set (bss_section, (subsegT) temp);
13600 demand_empty_rest_of_line ();
13601}
13602
13603#endif
13604
e379e5f3
L
13605/* Remember constant directive. */
13606
13607void
13608i386_cons_align (int ignore ATTRIBUTE_UNUSED)
13609{
13610 if (last_insn.kind != last_insn_directive
13611 && (bfd_section_flags (now_seg) & SEC_CODE))
13612 {
13613 last_insn.seg = now_seg;
13614 last_insn.kind = last_insn_directive;
13615 last_insn.name = "constant directive";
13616 last_insn.file = as_where (&last_insn.line);
ae531041
L
13617 if (lfence_before_ret != lfence_before_ret_none)
13618 {
13619 if (lfence_before_indirect_branch != lfence_branch_none)
13620 as_warn (_("constant directive skips -mlfence-before-ret "
13621 "and -mlfence-before-indirect-branch"));
13622 else
13623 as_warn (_("constant directive skips -mlfence-before-ret"));
13624 }
13625 else if (lfence_before_indirect_branch != lfence_branch_none)
13626 as_warn (_("constant directive skips -mlfence-before-indirect-branch"));
e379e5f3
L
13627 }
13628}
13629
252b5132 13630void
e3bb37b5 13631i386_validate_fix (fixS *fixp)
252b5132 13632{
02a86693 13633 if (fixp->fx_subsy)
252b5132 13634 {
02a86693 13635 if (fixp->fx_subsy == GOT_symbol)
23df1078 13636 {
02a86693
L
13637 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
13638 {
13639 if (!object_64bit)
13640 abort ();
13641#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13642 if (fixp->fx_tcbit2)
56ceb5b5
L
13643 fixp->fx_r_type = (fixp->fx_tcbit
13644 ? BFD_RELOC_X86_64_REX_GOTPCRELX
13645 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
13646 else
13647#endif
13648 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
13649 }
d6ab8113 13650 else
02a86693
L
13651 {
13652 if (!object_64bit)
13653 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
13654 else
13655 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
13656 }
13657 fixp->fx_subsy = 0;
23df1078 13658 }
252b5132 13659 }
02a86693
L
13660#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13661 else if (!object_64bit)
13662 {
13663 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
13664 && fixp->fx_tcbit2)
13665 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
13666 }
13667#endif
252b5132
RH
13668}
13669
252b5132 13670arelent *
7016a5d5 13671tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
13672{
13673 arelent *rel;
13674 bfd_reloc_code_real_type code;
13675
13676 switch (fixp->fx_r_type)
13677 {
8ce3d284 13678#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
13679 case BFD_RELOC_SIZE32:
13680 case BFD_RELOC_SIZE64:
13681 if (S_IS_DEFINED (fixp->fx_addsy)
13682 && !S_IS_EXTERNAL (fixp->fx_addsy))
13683 {
13684 /* Resolve size relocation against local symbol to size of
13685 the symbol plus addend. */
13686 valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
13687 if (fixp->fx_r_type == BFD_RELOC_SIZE32
13688 && !fits_in_unsigned_long (value))
13689 as_bad_where (fixp->fx_file, fixp->fx_line,
13690 _("symbol size computation overflow"));
13691 fixp->fx_addsy = NULL;
13692 fixp->fx_subsy = NULL;
13693 md_apply_fix (fixp, (valueT *) &value, NULL);
13694 return NULL;
13695 }
8ce3d284 13696#endif
1a0670f3 13697 /* Fall through. */
8fd4256d 13698
3e73aa7c
JH
13699 case BFD_RELOC_X86_64_PLT32:
13700 case BFD_RELOC_X86_64_GOT32:
13701 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
13702 case BFD_RELOC_X86_64_GOTPCRELX:
13703 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
13704 case BFD_RELOC_386_PLT32:
13705 case BFD_RELOC_386_GOT32:
02a86693 13706 case BFD_RELOC_386_GOT32X:
252b5132
RH
13707 case BFD_RELOC_386_GOTOFF:
13708 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
13709 case BFD_RELOC_386_TLS_GD:
13710 case BFD_RELOC_386_TLS_LDM:
13711 case BFD_RELOC_386_TLS_LDO_32:
13712 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
13713 case BFD_RELOC_386_TLS_IE:
13714 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
13715 case BFD_RELOC_386_TLS_LE_32:
13716 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
13717 case BFD_RELOC_386_TLS_GOTDESC:
13718 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
13719 case BFD_RELOC_X86_64_TLSGD:
13720 case BFD_RELOC_X86_64_TLSLD:
13721 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 13722 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
13723 case BFD_RELOC_X86_64_GOTTPOFF:
13724 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
13725 case BFD_RELOC_X86_64_TPOFF64:
13726 case BFD_RELOC_X86_64_GOTOFF64:
13727 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
13728 case BFD_RELOC_X86_64_GOT64:
13729 case BFD_RELOC_X86_64_GOTPCREL64:
13730 case BFD_RELOC_X86_64_GOTPC64:
13731 case BFD_RELOC_X86_64_GOTPLT64:
13732 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
13733 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
13734 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
13735 case BFD_RELOC_RVA:
13736 case BFD_RELOC_VTABLE_ENTRY:
13737 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
13738#ifdef TE_PE
13739 case BFD_RELOC_32_SECREL:
13740#endif
252b5132
RH
13741 code = fixp->fx_r_type;
13742 break;
dbbaec26
L
13743 case BFD_RELOC_X86_64_32S:
13744 if (!fixp->fx_pcrel)
13745 {
13746 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
13747 code = fixp->fx_r_type;
13748 break;
13749 }
1a0670f3 13750 /* Fall through. */
252b5132 13751 default:
93382f6d 13752 if (fixp->fx_pcrel)
252b5132 13753 {
93382f6d
AM
13754 switch (fixp->fx_size)
13755 {
13756 default:
b091f402
AM
13757 as_bad_where (fixp->fx_file, fixp->fx_line,
13758 _("can not do %d byte pc-relative relocation"),
13759 fixp->fx_size);
93382f6d
AM
13760 code = BFD_RELOC_32_PCREL;
13761 break;
13762 case 1: code = BFD_RELOC_8_PCREL; break;
13763 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 13764 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
13765#ifdef BFD64
13766 case 8: code = BFD_RELOC_64_PCREL; break;
13767#endif
93382f6d
AM
13768 }
13769 }
13770 else
13771 {
13772 switch (fixp->fx_size)
13773 {
13774 default:
b091f402
AM
13775 as_bad_where (fixp->fx_file, fixp->fx_line,
13776 _("can not do %d byte relocation"),
13777 fixp->fx_size);
93382f6d
AM
13778 code = BFD_RELOC_32;
13779 break;
13780 case 1: code = BFD_RELOC_8; break;
13781 case 2: code = BFD_RELOC_16; break;
13782 case 4: code = BFD_RELOC_32; break;
937149dd 13783#ifdef BFD64
3e73aa7c 13784 case 8: code = BFD_RELOC_64; break;
937149dd 13785#endif
93382f6d 13786 }
252b5132
RH
13787 }
13788 break;
13789 }
252b5132 13790
d182319b
JB
13791 if ((code == BFD_RELOC_32
13792 || code == BFD_RELOC_32_PCREL
13793 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
13794 && GOT_symbol
13795 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 13796 {
4fa24527 13797 if (!object_64bit)
d6ab8113
JB
13798 code = BFD_RELOC_386_GOTPC;
13799 else
13800 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 13801 }
7b81dfbb
AJ
13802 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
13803 && GOT_symbol
13804 && fixp->fx_addsy == GOT_symbol)
13805 {
13806 code = BFD_RELOC_X86_64_GOTPC64;
13807 }
252b5132 13808
add39d23
TS
13809 rel = XNEW (arelent);
13810 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 13811 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
13812
13813 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 13814
3e73aa7c
JH
13815 if (!use_rela_relocations)
13816 {
13817 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
13818 vtable entry to be used in the relocation's section offset. */
13819 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13820 rel->address = fixp->fx_offset;
fbeb56a4
DK
13821#if defined (OBJ_COFF) && defined (TE_PE)
13822 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
13823 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
13824 else
13825#endif
c6682705 13826 rel->addend = 0;
3e73aa7c
JH
13827 }
13828 /* Use the rela in 64bit mode. */
252b5132 13829 else
3e73aa7c 13830 {
862be3fb
L
13831 if (disallow_64bit_reloc)
13832 switch (code)
13833 {
862be3fb
L
13834 case BFD_RELOC_X86_64_DTPOFF64:
13835 case BFD_RELOC_X86_64_TPOFF64:
13836 case BFD_RELOC_64_PCREL:
13837 case BFD_RELOC_X86_64_GOTOFF64:
13838 case BFD_RELOC_X86_64_GOT64:
13839 case BFD_RELOC_X86_64_GOTPCREL64:
13840 case BFD_RELOC_X86_64_GOTPC64:
13841 case BFD_RELOC_X86_64_GOTPLT64:
13842 case BFD_RELOC_X86_64_PLTOFF64:
13843 as_bad_where (fixp->fx_file, fixp->fx_line,
13844 _("cannot represent relocation type %s in x32 mode"),
13845 bfd_get_reloc_code_name (code));
13846 break;
13847 default:
13848 break;
13849 }
13850
062cd5e7
AS
13851 if (!fixp->fx_pcrel)
13852 rel->addend = fixp->fx_offset;
13853 else
13854 switch (code)
13855 {
13856 case BFD_RELOC_X86_64_PLT32:
13857 case BFD_RELOC_X86_64_GOT32:
13858 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
13859 case BFD_RELOC_X86_64_GOTPCRELX:
13860 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
13861 case BFD_RELOC_X86_64_TLSGD:
13862 case BFD_RELOC_X86_64_TLSLD:
13863 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
13864 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
13865 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
13866 rel->addend = fixp->fx_offset - fixp->fx_size;
13867 break;
13868 default:
13869 rel->addend = (section->vma
13870 - fixp->fx_size
13871 + fixp->fx_addnumber
13872 + md_pcrel_from (fixp));
13873 break;
13874 }
3e73aa7c
JH
13875 }
13876
252b5132
RH
13877 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
13878 if (rel->howto == NULL)
13879 {
13880 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 13881 _("cannot represent relocation type %s"),
252b5132
RH
13882 bfd_get_reloc_code_name (code));
13883 /* Set howto to a garbage value so that we can keep going. */
13884 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 13885 gas_assert (rel->howto != NULL);
252b5132
RH
13886 }
13887
13888 return rel;
13889}
13890
ee86248c 13891#include "tc-i386-intel.c"
54cfded0 13892
a60de03c
JB
13893void
13894tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 13895{
a60de03c
JB
13896 int saved_naked_reg;
13897 char saved_register_dot;
54cfded0 13898
a60de03c
JB
13899 saved_naked_reg = allow_naked_reg;
13900 allow_naked_reg = 1;
13901 saved_register_dot = register_chars['.'];
13902 register_chars['.'] = '.';
13903 allow_pseudo_reg = 1;
13904 expression_and_evaluate (exp);
13905 allow_pseudo_reg = 0;
13906 register_chars['.'] = saved_register_dot;
13907 allow_naked_reg = saved_naked_reg;
13908
e96d56a1 13909 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 13910 {
a60de03c
JB
13911 if ((addressT) exp->X_add_number < i386_regtab_size)
13912 {
13913 exp->X_op = O_constant;
13914 exp->X_add_number = i386_regtab[exp->X_add_number]
13915 .dw2_regnum[flag_code >> 1];
13916 }
13917 else
13918 exp->X_op = O_illegal;
54cfded0 13919 }
54cfded0
AM
13920}
13921
13922void
13923tc_x86_frame_initial_instructions (void)
13924{
a60de03c
JB
13925 static unsigned int sp_regno[2];
13926
13927 if (!sp_regno[flag_code >> 1])
13928 {
13929 char *saved_input = input_line_pointer;
13930 char sp[][4] = {"esp", "rsp"};
13931 expressionS exp;
a4447b93 13932
a60de03c
JB
13933 input_line_pointer = sp[flag_code >> 1];
13934 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 13935 gas_assert (exp.X_op == O_constant);
a60de03c
JB
13936 sp_regno[flag_code >> 1] = exp.X_add_number;
13937 input_line_pointer = saved_input;
13938 }
a4447b93 13939
61ff971f
L
13940 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
13941 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 13942}
d2b2c203 13943
d7921315
L
13944int
13945x86_dwarf2_addr_size (void)
13946{
13947#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
13948 if (x86_elf_abi == X86_64_X32_ABI)
13949 return 4;
13950#endif
13951 return bfd_arch_bits_per_address (stdoutput) / 8;
13952}
13953
d2b2c203
DJ
13954int
13955i386_elf_section_type (const char *str, size_t len)
13956{
13957 if (flag_code == CODE_64BIT
13958 && len == sizeof ("unwind") - 1
13959 && strncmp (str, "unwind", 6) == 0)
13960 return SHT_X86_64_UNWIND;
13961
13962 return -1;
13963}
bb41ade5 13964
ad5fec3b
EB
13965#ifdef TE_SOLARIS
13966void
13967i386_solaris_fix_up_eh_frame (segT sec)
13968{
13969 if (flag_code == CODE_64BIT)
13970 elf_section_type (sec) = SHT_X86_64_UNWIND;
13971}
13972#endif
13973
bb41ade5
AM
13974#ifdef TE_PE
13975void
13976tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
13977{
91d6fa6a 13978 expressionS exp;
bb41ade5 13979
91d6fa6a
NC
13980 exp.X_op = O_secrel;
13981 exp.X_add_symbol = symbol;
13982 exp.X_add_number = 0;
13983 emit_expr (&exp, size);
bb41ade5
AM
13984}
13985#endif
3b22753a
L
13986
13987#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13988/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
13989
01e1a5bc 13990bfd_vma
6d4af3c2 13991x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
13992{
13993 if (flag_code == CODE_64BIT)
13994 {
13995 if (letter == 'l')
13996 return SHF_X86_64_LARGE;
13997
8f3bae45 13998 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 13999 }
3b22753a 14000 else
8f3bae45 14001 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
14002 return -1;
14003}
14004
01e1a5bc 14005bfd_vma
3b22753a
L
14006x86_64_section_word (char *str, size_t len)
14007{
8620418b 14008 if (len == 5 && flag_code == CODE_64BIT && CONST_STRNEQ (str, "large"))
3b22753a
L
14009 return SHF_X86_64_LARGE;
14010
14011 return -1;
14012}
14013
14014static void
14015handle_large_common (int small ATTRIBUTE_UNUSED)
14016{
14017 if (flag_code != CODE_64BIT)
14018 {
14019 s_comm_internal (0, elf_common_parse);
14020 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
14021 }
14022 else
14023 {
14024 static segT lbss_section;
14025 asection *saved_com_section_ptr = elf_com_section_ptr;
14026 asection *saved_bss_section = bss_section;
14027
14028 if (lbss_section == NULL)
14029 {
14030 flagword applicable;
14031 segT seg = now_seg;
14032 subsegT subseg = now_subseg;
14033
14034 /* The .lbss section is for local .largecomm symbols. */
14035 lbss_section = subseg_new (".lbss", 0);
14036 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 14037 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
14038 seg_info (lbss_section)->bss = 1;
14039
14040 subseg_set (seg, subseg);
14041 }
14042
14043 elf_com_section_ptr = &_bfd_elf_large_com_section;
14044 bss_section = lbss_section;
14045
14046 s_comm_internal (0, elf_common_parse);
14047
14048 elf_com_section_ptr = saved_com_section_ptr;
14049 bss_section = saved_bss_section;
14050 }
14051}
14052#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
This page took 2.292865 seconds and 4 git commands to generate.