]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-i386.c
x86: derive opcode encoding space attribute from base opcode
[thirdparty/binutils-gdb.git] / gas / config / tc-i386.c
CommitLineData
b534c6d3 1/* tc-i386.c -- Assemble code for the Intel 80386
250d07de 2 Copyright (C) 1989-2021 Free Software Foundation, Inc.
252b5132
RH
3
4 This file is part of GAS, the GNU Assembler.
5
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
ec2655a6 8 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
9 any later version.
10
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
252b5132 20
47926f60
KH
21/* Intel 80386 machine specific gas.
22 Written by Eliot Dresselhaus (eliot@mgm.mit.edu).
3e73aa7c 23 x86_64 support by Jan Hubicka (jh@suse.cz)
0f10071e 24 VIA PadLock support by Michal Ludvig (mludvig@suse.cz)
47926f60
KH
25 Bugs & suggestions are completely welcome. This is free software.
26 Please help us make it better. */
252b5132 27
252b5132 28#include "as.h"
3882b010 29#include "safe-ctype.h"
252b5132 30#include "subsegs.h"
316e2c05 31#include "dwarf2dbg.h"
54cfded0 32#include "dw2gencfi.h"
d2b2c203 33#include "elf/x86-64.h"
40fb9820 34#include "opcodes/i386-init.h"
252b5132 35
41fd2579
L
36#ifdef HAVE_LIMITS_H
37#include <limits.h>
38#else
39#ifdef HAVE_SYS_PARAM_H
40#include <sys/param.h>
41#endif
42#ifndef INT_MAX
43#define INT_MAX (int) (((unsigned) (-1)) >> 1)
44#endif
45#endif
46
c3332e24 47#ifndef INFER_ADDR_PREFIX
eecb386c 48#define INFER_ADDR_PREFIX 1
c3332e24
AM
49#endif
50
29b0f896
AM
51#ifndef DEFAULT_ARCH
52#define DEFAULT_ARCH "i386"
246fcdee 53#endif
252b5132 54
edde18a5
AM
55#ifndef INLINE
56#if __GNUC__ >= 2
57#define INLINE __inline__
58#else
59#define INLINE
60#endif
61#endif
62
6305a203
L
63/* Prefixes will be emitted in the order defined below.
64 WAIT_PREFIX must be the first prefix since FWAIT is really is an
65 instruction, and so must come before any prefixes.
66 The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
42164a71 67 REP_PREFIX/HLE_PREFIX, LOCK_PREFIX. */
6305a203
L
68#define WAIT_PREFIX 0
69#define SEG_PREFIX 1
70#define ADDR_PREFIX 2
71#define DATA_PREFIX 3
c32fa91d 72#define REP_PREFIX 4
42164a71 73#define HLE_PREFIX REP_PREFIX
7e8b059b 74#define BND_PREFIX REP_PREFIX
c32fa91d 75#define LOCK_PREFIX 5
4e9ac44a
L
76#define REX_PREFIX 6 /* must come last. */
77#define MAX_PREFIXES 7 /* max prefixes per opcode */
6305a203
L
78
79/* we define the syntax here (modulo base,index,scale syntax) */
80#define REGISTER_PREFIX '%'
81#define IMMEDIATE_PREFIX '$'
82#define ABSOLUTE_PREFIX '*'
83
84/* these are the instruction mnemonic suffixes in AT&T syntax or
85 memory operand size in Intel syntax. */
86#define WORD_MNEM_SUFFIX 'w'
87#define BYTE_MNEM_SUFFIX 'b'
88#define SHORT_MNEM_SUFFIX 's'
89#define LONG_MNEM_SUFFIX 'l'
90#define QWORD_MNEM_SUFFIX 'q'
6305a203
L
91/* Intel Syntax. Use a non-ascii letter since since it never appears
92 in instructions. */
93#define LONG_DOUBLE_MNEM_SUFFIX '\1'
94
95#define END_OF_INSN '\0'
96
79dec6b7
JB
97/* This matches the C -> StaticRounding alias in the opcode table. */
98#define commutative staticrounding
99
6305a203
L
100/*
101 'templates' is for grouping together 'template' structures for opcodes
102 of the same name. This is only used for storing the insns in the grand
103 ole hash table of insns.
104 The templates themselves start at START and range up to (but not including)
105 END.
106 */
107typedef struct
108{
d3ce72d0
NC
109 const insn_template *start;
110 const insn_template *end;
6305a203
L
111}
112templates;
113
114/* 386 operand encoding bytes: see 386 book for details of this. */
115typedef struct
116{
117 unsigned int regmem; /* codes register or memory operand */
118 unsigned int reg; /* codes register operand (or extended opcode) */
119 unsigned int mode; /* how to interpret regmem & reg */
120}
121modrm_byte;
122
123/* x86-64 extension prefix. */
124typedef int rex_byte;
125
6305a203
L
126/* 386 opcode byte to code indirect addressing. */
127typedef struct
128{
129 unsigned base;
130 unsigned index;
131 unsigned scale;
132}
133sib_byte;
134
6305a203
L
135/* x86 arch names, types and features */
136typedef struct
137{
138 const char *name; /* arch name */
8a2c8fef 139 unsigned int len; /* arch string length */
6305a203
L
140 enum processor_type type; /* arch type */
141 i386_cpu_flags flags; /* cpu feature flags */
8a2c8fef 142 unsigned int skip; /* show_arch should skip this. */
6305a203
L
143}
144arch_entry;
145
293f5f65
L
146/* Used to turn off indicated flags. */
147typedef struct
148{
149 const char *name; /* arch name */
150 unsigned int len; /* arch string length */
151 i386_cpu_flags flags; /* cpu feature flags */
152}
153noarch_entry;
154
78f12dd3 155static void update_code_flag (int, int);
e3bb37b5
L
156static void set_code_flag (int);
157static void set_16bit_gcc_code_flag (int);
158static void set_intel_syntax (int);
1efbbeb4 159static void set_intel_mnemonic (int);
db51cc60 160static void set_allow_index_reg (int);
7bab8ab5 161static void set_check (int);
e3bb37b5 162static void set_cpu_arch (int);
6482c264 163#ifdef TE_PE
e3bb37b5 164static void pe_directive_secrel (int);
6482c264 165#endif
e3bb37b5
L
166static void signed_cons (int);
167static char *output_invalid (int c);
ee86248c
JB
168static int i386_finalize_immediate (segT, expressionS *, i386_operand_type,
169 const char *);
170static int i386_finalize_displacement (segT, expressionS *, i386_operand_type,
171 const char *);
a7619375 172static int i386_att_operand (char *);
e3bb37b5 173static int i386_intel_operand (char *, int);
ee86248c
JB
174static int i386_intel_simplify (expressionS *);
175static int i386_intel_parse_name (const char *, expressionS *);
e3bb37b5
L
176static const reg_entry *parse_register (char *, char **);
177static char *parse_insn (char *, char *);
178static char *parse_operands (char *, const char *);
179static void swap_operands (void);
4d456e3d 180static void swap_2_operands (int, int);
48bcea9f 181static enum flag_code i386_addressing_mode (void);
e3bb37b5
L
182static void optimize_imm (void);
183static void optimize_disp (void);
83b16ac6 184static const insn_template *match_template (char);
e3bb37b5
L
185static int check_string (void);
186static int process_suffix (void);
187static int check_byte_reg (void);
188static int check_long_reg (void);
189static int check_qword_reg (void);
190static int check_word_reg (void);
191static int finalize_imm (void);
192static int process_operands (void);
193static const seg_entry *build_modrm_byte (void);
194static void output_insn (void);
195static void output_imm (fragS *, offsetT);
196static void output_disp (fragS *, offsetT);
29b0f896 197#ifndef I386COFF
e3bb37b5 198static void s_bss (int);
252b5132 199#endif
17d4e2a2
L
200#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
201static void handle_large_common (int small ATTRIBUTE_UNUSED);
b4a3a7b4
L
202
203/* GNU_PROPERTY_X86_ISA_1_USED. */
204static unsigned int x86_isa_1_used;
205/* GNU_PROPERTY_X86_FEATURE_2_USED. */
206static unsigned int x86_feature_2_used;
207/* Generate x86 used ISA and feature properties. */
208static unsigned int x86_used_note = DEFAULT_X86_USED_NOTE;
17d4e2a2 209#endif
252b5132 210
a847613f 211static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 212
8a6fb3f9
JB
213/* parse_register() returns this when a register alias cannot be used. */
214static const reg_entry bad_reg = { "<bad>", OPERAND_TYPE_NONE, 0, 0,
215 { Dw2Inval, Dw2Inval } };
216
43234a1e
L
217/* This struct describes rounding control and SAE in the instruction. */
218struct RC_Operation
219{
220 enum rc_type
221 {
222 rne = 0,
223 rd,
224 ru,
225 rz,
226 saeonly
227 } type;
228 int operand;
229};
230
231static struct RC_Operation rc_op;
232
233/* The struct describes masking, applied to OPERAND in the instruction.
234 MASK is a pointer to the corresponding mask register. ZEROING tells
235 whether merging or zeroing mask is used. */
236struct Mask_Operation
237{
238 const reg_entry *mask;
239 unsigned int zeroing;
240 /* The operand where this operation is associated. */
241 int operand;
242};
243
244static struct Mask_Operation mask_op;
245
246/* The struct describes broadcasting, applied to OPERAND. FACTOR is
247 broadcast factor. */
248struct Broadcast_Operation
249{
8e6e0792 250 /* Type of broadcast: {1to2}, {1to4}, {1to8}, or {1to16}. */
43234a1e
L
251 int type;
252
253 /* Index of broadcasted operand. */
254 int operand;
4a1b91ea
L
255
256 /* Number of bytes to broadcast. */
257 int bytes;
43234a1e
L
258};
259
260static struct Broadcast_Operation broadcast_op;
261
c0f3af97
L
262/* VEX prefix. */
263typedef struct
264{
43234a1e
L
265 /* VEX prefix is either 2 byte or 3 byte. EVEX is 4 byte. */
266 unsigned char bytes[4];
c0f3af97
L
267 unsigned int length;
268 /* Destination or source register specifier. */
269 const reg_entry *register_specifier;
270} vex_prefix;
271
252b5132 272/* 'md_assemble ()' gathers together information and puts it into a
47926f60 273 i386_insn. */
252b5132 274
520dc8e8
AM
275union i386_op
276 {
277 expressionS *disps;
278 expressionS *imms;
279 const reg_entry *regs;
280 };
281
a65babc9
L
282enum i386_error
283 {
86e026a4 284 operand_size_mismatch,
a65babc9
L
285 operand_type_mismatch,
286 register_type_mismatch,
287 number_of_operands_mismatch,
288 invalid_instruction_suffix,
289 bad_imm4,
a65babc9
L
290 unsupported_with_intel_mnemonic,
291 unsupported_syntax,
6c30d220 292 unsupported,
260cd341 293 invalid_sib_address,
6c30d220 294 invalid_vsib_address,
7bab8ab5 295 invalid_vector_register_set,
260cd341 296 invalid_tmm_register_set,
43234a1e
L
297 unsupported_vector_index_register,
298 unsupported_broadcast,
43234a1e
L
299 broadcast_needed,
300 unsupported_masking,
301 mask_not_on_destination,
302 no_default_mask,
303 unsupported_rc_sae,
304 rc_sae_operand_not_last_imm,
305 invalid_register_operand,
a65babc9
L
306 };
307
252b5132
RH
308struct _i386_insn
309 {
47926f60 310 /* TM holds the template for the insn were currently assembling. */
d3ce72d0 311 insn_template tm;
252b5132 312
7d5e4556
L
313 /* SUFFIX holds the instruction size suffix for byte, word, dword
314 or qword, if given. */
252b5132
RH
315 char suffix;
316
9a182d04
JB
317 /* OPCODE_LENGTH holds the number of base opcode bytes. */
318 unsigned char opcode_length;
319
47926f60 320 /* OPERANDS gives the number of given operands. */
252b5132
RH
321 unsigned int operands;
322
323 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
324 of given register, displacement, memory operands and immediate
47926f60 325 operands. */
252b5132
RH
326 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
327
328 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 329 use OP[i] for the corresponding operand. */
40fb9820 330 i386_operand_type types[MAX_OPERANDS];
252b5132 331
520dc8e8
AM
332 /* Displacement expression, immediate expression, or register for each
333 operand. */
334 union i386_op op[MAX_OPERANDS];
252b5132 335
3e73aa7c
JH
336 /* Flags for operands. */
337 unsigned int flags[MAX_OPERANDS];
338#define Operand_PCrel 1
c48dadc9 339#define Operand_Mem 2
3e73aa7c 340
252b5132 341 /* Relocation type for operand */
f86103b7 342 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 343
252b5132
RH
344 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
345 the base index byte below. */
346 const reg_entry *base_reg;
347 const reg_entry *index_reg;
348 unsigned int log2_scale_factor;
349
350 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 351 explicit segment overrides are given. */
ce8a8b2f 352 const seg_entry *seg[2];
252b5132 353
8325cc63
JB
354 /* Copied first memory operand string, for re-checking. */
355 char *memop1_string;
356
252b5132
RH
357 /* PREFIX holds all the given prefix opcodes (usually null).
358 PREFIXES is the number of prefix opcodes. */
359 unsigned int prefixes;
360 unsigned char prefix[MAX_PREFIXES];
361
50128d0c
JB
362 /* Register is in low 3 bits of opcode. */
363 bfd_boolean short_form;
364
6f2f06be
JB
365 /* The operand to a branch insn indicates an absolute branch. */
366 bfd_boolean jumpabsolute;
367
921eafea
L
368 /* Extended states. */
369 enum
370 {
371 /* Use MMX state. */
372 xstate_mmx = 1 << 0,
373 /* Use XMM state. */
374 xstate_xmm = 1 << 1,
375 /* Use YMM state. */
376 xstate_ymm = 1 << 2 | xstate_xmm,
377 /* Use ZMM state. */
378 xstate_zmm = 1 << 3 | xstate_ymm,
379 /* Use TMM state. */
32930e4e
L
380 xstate_tmm = 1 << 4,
381 /* Use MASK state. */
382 xstate_mask = 1 << 5
921eafea 383 } xstate;
260cd341 384
e379e5f3
L
385 /* Has GOTPC or TLS relocation. */
386 bfd_boolean has_gotpc_tls_reloc;
387
252b5132 388 /* RM and SIB are the modrm byte and the sib byte where the
c1e679ec 389 addressing modes of this insn are encoded. */
252b5132 390 modrm_byte rm;
3e73aa7c 391 rex_byte rex;
43234a1e 392 rex_byte vrex;
252b5132 393 sib_byte sib;
c0f3af97 394 vex_prefix vex;
b6169b20 395
43234a1e
L
396 /* Masking attributes. */
397 struct Mask_Operation *mask;
398
399 /* Rounding control and SAE attributes. */
400 struct RC_Operation *rounding;
401
402 /* Broadcasting attributes. */
403 struct Broadcast_Operation *broadcast;
404
405 /* Compressed disp8*N attribute. */
406 unsigned int memshift;
407
86fa6981
L
408 /* Prefer load or store in encoding. */
409 enum
410 {
411 dir_encoding_default = 0,
412 dir_encoding_load,
64c49ab3
JB
413 dir_encoding_store,
414 dir_encoding_swap
86fa6981 415 } dir_encoding;
891edac4 416
41eb8e88 417 /* Prefer 8bit, 16bit, 32bit displacement in encoding. */
a501d77e
L
418 enum
419 {
420 disp_encoding_default = 0,
421 disp_encoding_8bit,
41eb8e88 422 disp_encoding_16bit,
a501d77e
L
423 disp_encoding_32bit
424 } disp_encoding;
f8a5c266 425
6b6b6807
L
426 /* Prefer the REX byte in encoding. */
427 bfd_boolean rex_encoding;
428
b6f8c7c4
L
429 /* Disable instruction size optimization. */
430 bfd_boolean no_optimize;
431
86fa6981
L
432 /* How to encode vector instructions. */
433 enum
434 {
435 vex_encoding_default = 0,
42e04b36 436 vex_encoding_vex,
86fa6981 437 vex_encoding_vex3,
da4977e0
JB
438 vex_encoding_evex,
439 vex_encoding_error
86fa6981
L
440 } vec_encoding;
441
d5de92cf
L
442 /* REP prefix. */
443 const char *rep_prefix;
444
165de32a
L
445 /* HLE prefix. */
446 const char *hle_prefix;
42164a71 447
7e8b059b
L
448 /* Have BND prefix. */
449 const char *bnd_prefix;
450
04ef582a
L
451 /* Have NOTRACK prefix. */
452 const char *notrack_prefix;
453
891edac4 454 /* Error message. */
a65babc9 455 enum i386_error error;
252b5132
RH
456 };
457
458typedef struct _i386_insn i386_insn;
459
43234a1e
L
460/* Link RC type with corresponding string, that'll be looked for in
461 asm. */
462struct RC_name
463{
464 enum rc_type type;
465 const char *name;
466 unsigned int len;
467};
468
469static const struct RC_name RC_NamesTable[] =
470{
471 { rne, STRING_COMMA_LEN ("rn-sae") },
472 { rd, STRING_COMMA_LEN ("rd-sae") },
473 { ru, STRING_COMMA_LEN ("ru-sae") },
474 { rz, STRING_COMMA_LEN ("rz-sae") },
475 { saeonly, STRING_COMMA_LEN ("sae") },
476};
477
252b5132
RH
478/* List of chars besides those in app.c:symbol_chars that can start an
479 operand. Used to prevent the scrubber eating vital white-space. */
86fa6981 480const char extra_symbol_chars[] = "*%-([{}"
252b5132 481#ifdef LEX_AT
32137342
NC
482 "@"
483#endif
484#ifdef LEX_QM
485 "?"
252b5132 486#endif
32137342 487 ;
252b5132 488
b3983e5f
JB
489#if ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
490 && !defined (TE_GNU) \
491 && !defined (TE_LINUX) \
492 && !defined (TE_FreeBSD) \
493 && !defined (TE_DragonFly) \
494 && !defined (TE_NetBSD))
252b5132 495/* This array holds the chars that always start a comment. If the
b3b91714
AM
496 pre-processor is disabled, these aren't very useful. The option
497 --divide will remove '/' from this list. */
498const char *i386_comment_chars = "#/";
499#define SVR4_COMMENT_CHARS 1
252b5132 500#define PREFIX_SEPARATOR '\\'
252b5132 501
b3b91714
AM
502#else
503const char *i386_comment_chars = "#";
504#define PREFIX_SEPARATOR '/'
505#endif
506
252b5132
RH
507/* This array holds the chars that only start a comment at the beginning of
508 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
509 .line and .file directives will appear in the pre-processed output.
510 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 511 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
512 #NO_APP at the beginning of its output.
513 Also note that comments started like this one will always work if
252b5132 514 '/' isn't otherwise defined. */
b3b91714 515const char line_comment_chars[] = "#/";
252b5132 516
63a0b638 517const char line_separator_chars[] = ";";
252b5132 518
ce8a8b2f
AM
519/* Chars that can be used to separate mant from exp in floating point
520 nums. */
252b5132
RH
521const char EXP_CHARS[] = "eE";
522
ce8a8b2f
AM
523/* Chars that mean this number is a floating point constant
524 As in 0f12.456
525 or 0d1.2345e12. */
252b5132
RH
526const char FLT_CHARS[] = "fFdDxX";
527
ce8a8b2f 528/* Tables for lexical analysis. */
252b5132
RH
529static char mnemonic_chars[256];
530static char register_chars[256];
531static char operand_chars[256];
532static char identifier_chars[256];
533static char digit_chars[256];
534
ce8a8b2f 535/* Lexical macros. */
252b5132
RH
536#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
537#define is_operand_char(x) (operand_chars[(unsigned char) x])
538#define is_register_char(x) (register_chars[(unsigned char) x])
539#define is_space_char(x) ((x) == ' ')
540#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
541#define is_digit_char(x) (digit_chars[(unsigned char) x])
542
0234cb7c 543/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
544static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
545
546/* md_assemble() always leaves the strings it's passed unaltered. To
547 effect this we maintain a stack of saved characters that we've smashed
548 with '\0's (indicating end of strings for various sub-fields of the
47926f60 549 assembler instruction). */
252b5132 550static char save_stack[32];
ce8a8b2f 551static char *save_stack_p;
252b5132
RH
552#define END_STRING_AND_SAVE(s) \
553 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
554#define RESTORE_END_STRING(s) \
555 do { *(s) = *--save_stack_p; } while (0)
556
47926f60 557/* The instruction we're assembling. */
252b5132
RH
558static i386_insn i;
559
560/* Possible templates for current insn. */
561static const templates *current_templates;
562
31b2323c
L
563/* Per instruction expressionS buffers: max displacements & immediates. */
564static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
565static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 566
47926f60 567/* Current operand we are working on. */
ee86248c 568static int this_operand = -1;
252b5132 569
3e73aa7c
JH
570/* We support four different modes. FLAG_CODE variable is used to distinguish
571 these. */
572
573enum flag_code {
574 CODE_32BIT,
575 CODE_16BIT,
576 CODE_64BIT };
577
578static enum flag_code flag_code;
4fa24527 579static unsigned int object_64bit;
862be3fb 580static unsigned int disallow_64bit_reloc;
3e73aa7c 581static int use_rela_relocations = 0;
e379e5f3
L
582/* __tls_get_addr/___tls_get_addr symbol for TLS. */
583static const char *tls_get_addr;
3e73aa7c 584
7af8ed2d
NC
585#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
586 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
587 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
588
351f65ca
L
589/* The ELF ABI to use. */
590enum x86_elf_abi
591{
592 I386_ABI,
7f56bc95
L
593 X86_64_ABI,
594 X86_64_X32_ABI
351f65ca
L
595};
596
597static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 598#endif
351f65ca 599
167ad85b
TG
600#if defined (TE_PE) || defined (TE_PEP)
601/* Use big object file format. */
602static int use_big_obj = 0;
603#endif
604
8dcea932
L
605#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
606/* 1 if generating code for a shared library. */
607static int shared = 0;
608#endif
609
47926f60
KH
610/* 1 for intel syntax,
611 0 if att syntax. */
612static int intel_syntax = 0;
252b5132 613
4b5aaf5f
L
614static enum x86_64_isa
615{
616 amd64 = 1, /* AMD64 ISA. */
617 intel64 /* Intel64 ISA. */
618} isa64;
e89c5eaa 619
1efbbeb4
L
620/* 1 for intel mnemonic,
621 0 if att mnemonic. */
622static int intel_mnemonic = !SYSV386_COMPAT;
623
a60de03c
JB
624/* 1 if pseudo registers are permitted. */
625static int allow_pseudo_reg = 0;
626
47926f60
KH
627/* 1 if register prefix % not required. */
628static int allow_naked_reg = 0;
252b5132 629
33eaf5de 630/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
631 instructions supporting it, even if this prefix wasn't specified
632 explicitly. */
633static int add_bnd_prefix = 0;
634
ba104c83 635/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
636static int allow_index_reg = 0;
637
d022bddd
IT
638/* 1 if the assembler should ignore LOCK prefix, even if it was
639 specified explicitly. */
640static int omit_lock_prefix = 0;
641
e4e00185
AS
642/* 1 if the assembler should encode lfence, mfence, and sfence as
643 "lock addl $0, (%{re}sp)". */
644static int avoid_fence = 0;
645
ae531041
L
646/* 1 if lfence should be inserted after every load. */
647static int lfence_after_load = 0;
648
649/* Non-zero if lfence should be inserted before indirect branch. */
650static enum lfence_before_indirect_branch_kind
651 {
652 lfence_branch_none = 0,
653 lfence_branch_register,
654 lfence_branch_memory,
655 lfence_branch_all
656 }
657lfence_before_indirect_branch;
658
659/* Non-zero if lfence should be inserted before ret. */
660static enum lfence_before_ret_kind
661 {
662 lfence_before_ret_none = 0,
663 lfence_before_ret_not,
a09f656b 664 lfence_before_ret_or,
665 lfence_before_ret_shl
ae531041
L
666 }
667lfence_before_ret;
668
669/* Types of previous instruction is .byte or prefix. */
e379e5f3
L
670static struct
671 {
672 segT seg;
673 const char *file;
674 const char *name;
675 unsigned int line;
676 enum last_insn_kind
677 {
678 last_insn_other = 0,
679 last_insn_directive,
680 last_insn_prefix
681 } kind;
682 } last_insn;
683
0cb4071e
L
684/* 1 if the assembler should generate relax relocations. */
685
686static int generate_relax_relocations
687 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
688
7bab8ab5 689static enum check_kind
daf50ae7 690 {
7bab8ab5
JB
691 check_none = 0,
692 check_warning,
693 check_error
daf50ae7 694 }
7bab8ab5 695sse_check, operand_check = check_warning;
daf50ae7 696
e379e5f3
L
697/* Non-zero if branches should be aligned within power of 2 boundary. */
698static int align_branch_power = 0;
699
700/* Types of branches to align. */
701enum align_branch_kind
702 {
703 align_branch_none = 0,
704 align_branch_jcc = 1,
705 align_branch_fused = 2,
706 align_branch_jmp = 3,
707 align_branch_call = 4,
708 align_branch_indirect = 5,
709 align_branch_ret = 6
710 };
711
712/* Type bits of branches to align. */
713enum align_branch_bit
714 {
715 align_branch_jcc_bit = 1 << align_branch_jcc,
716 align_branch_fused_bit = 1 << align_branch_fused,
717 align_branch_jmp_bit = 1 << align_branch_jmp,
718 align_branch_call_bit = 1 << align_branch_call,
719 align_branch_indirect_bit = 1 << align_branch_indirect,
720 align_branch_ret_bit = 1 << align_branch_ret
721 };
722
723static unsigned int align_branch = (align_branch_jcc_bit
724 | align_branch_fused_bit
725 | align_branch_jmp_bit);
726
79d72f45
HL
727/* Types of condition jump used by macro-fusion. */
728enum mf_jcc_kind
729 {
730 mf_jcc_jo = 0, /* base opcode 0x70 */
731 mf_jcc_jc, /* base opcode 0x72 */
732 mf_jcc_je, /* base opcode 0x74 */
733 mf_jcc_jna, /* base opcode 0x76 */
734 mf_jcc_js, /* base opcode 0x78 */
735 mf_jcc_jp, /* base opcode 0x7a */
736 mf_jcc_jl, /* base opcode 0x7c */
737 mf_jcc_jle, /* base opcode 0x7e */
738 };
739
740/* Types of compare flag-modifying insntructions used by macro-fusion. */
741enum mf_cmp_kind
742 {
743 mf_cmp_test_and, /* test/cmp */
744 mf_cmp_alu_cmp, /* add/sub/cmp */
745 mf_cmp_incdec /* inc/dec */
746 };
747
e379e5f3
L
748/* The maximum padding size for fused jcc. CMP like instruction can
749 be 9 bytes and jcc can be 6 bytes. Leave room just in case for
750 prefixes. */
751#define MAX_FUSED_JCC_PADDING_SIZE 20
752
753/* The maximum number of prefixes added for an instruction. */
754static unsigned int align_branch_prefix_size = 5;
755
b6f8c7c4
L
756/* Optimization:
757 1. Clear the REX_W bit with register operand if possible.
758 2. Above plus use 128bit vector instruction to clear the full vector
759 register.
760 */
761static int optimize = 0;
762
763/* Optimization:
764 1. Clear the REX_W bit with register operand if possible.
765 2. Above plus use 128bit vector instruction to clear the full vector
766 register.
767 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
768 "testb $imm7,%r8".
769 */
770static int optimize_for_space = 0;
771
2ca3ace5
L
772/* Register prefix used for error message. */
773static const char *register_prefix = "%";
774
47926f60
KH
775/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
776 leave, push, and pop instructions so that gcc has the same stack
777 frame as in 32 bit mode. */
778static char stackop_size = '\0';
eecb386c 779
12b55ccc
L
780/* Non-zero to optimize code alignment. */
781int optimize_align_code = 1;
782
47926f60
KH
783/* Non-zero to quieten some warnings. */
784static int quiet_warnings = 0;
a38cf1db 785
47926f60
KH
786/* CPU name. */
787static const char *cpu_arch_name = NULL;
6305a203 788static char *cpu_sub_arch_name = NULL;
a38cf1db 789
47926f60 790/* CPU feature flags. */
40fb9820
L
791static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
792
ccc9c027
L
793/* If we have selected a cpu we are generating instructions for. */
794static int cpu_arch_tune_set = 0;
795
9103f4f4 796/* Cpu we are generating instructions for. */
fbf3f584 797enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4
L
798
799/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 800static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 801
ccc9c027 802/* CPU instruction set architecture used. */
fbf3f584 803enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 804
9103f4f4 805/* CPU feature flags of instruction set architecture used. */
fbf3f584 806i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 807
fddf5b5b
AM
808/* If set, conditional jumps are not automatically promoted to handle
809 larger than a byte offset. */
810static unsigned int no_cond_jump_promotion = 0;
811
c0f3af97
L
812/* Encode SSE instructions with VEX prefix. */
813static unsigned int sse2avx;
814
539f890d
L
815/* Encode scalar AVX instructions with specific vector length. */
816static enum
817 {
818 vex128 = 0,
819 vex256
820 } avxscalar;
821
03751133
L
822/* Encode VEX WIG instructions with specific vex.w. */
823static enum
824 {
825 vexw0 = 0,
826 vexw1
827 } vexwig;
828
43234a1e
L
829/* Encode scalar EVEX LIG instructions with specific vector length. */
830static enum
831 {
832 evexl128 = 0,
833 evexl256,
834 evexl512
835 } evexlig;
836
837/* Encode EVEX WIG instructions with specific evex.w. */
838static enum
839 {
840 evexw0 = 0,
841 evexw1
842 } evexwig;
843
d3d3c6db
IT
844/* Value to encode in EVEX RC bits, for SAE-only instructions. */
845static enum rc_type evexrcig = rne;
846
29b0f896 847/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 848static symbolS *GOT_symbol;
29b0f896 849
a4447b93
RH
850/* The dwarf2 return column, adjusted for 32 or 64 bit. */
851unsigned int x86_dwarf2_return_column;
852
853/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
854int x86_cie_data_alignment;
855
252b5132 856/* Interface to relax_segment.
fddf5b5b
AM
857 There are 3 major relax states for 386 jump insns because the
858 different types of jumps add different sizes to frags when we're
e379e5f3
L
859 figuring out what sort of jump to choose to reach a given label.
860
861 BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING are used to align
862 branches which are handled by md_estimate_size_before_relax() and
863 i386_generic_table_relax_frag(). */
252b5132 864
47926f60 865/* Types. */
93c2a809
AM
866#define UNCOND_JUMP 0
867#define COND_JUMP 1
868#define COND_JUMP86 2
e379e5f3
L
869#define BRANCH_PADDING 3
870#define BRANCH_PREFIX 4
871#define FUSED_JCC_PADDING 5
fddf5b5b 872
47926f60 873/* Sizes. */
252b5132
RH
874#define CODE16 1
875#define SMALL 0
29b0f896 876#define SMALL16 (SMALL | CODE16)
252b5132 877#define BIG 2
29b0f896 878#define BIG16 (BIG | CODE16)
252b5132
RH
879
880#ifndef INLINE
881#ifdef __GNUC__
882#define INLINE __inline__
883#else
884#define INLINE
885#endif
886#endif
887
fddf5b5b
AM
888#define ENCODE_RELAX_STATE(type, size) \
889 ((relax_substateT) (((type) << 2) | (size)))
890#define TYPE_FROM_RELAX_STATE(s) \
891 ((s) >> 2)
892#define DISP_SIZE_FROM_RELAX_STATE(s) \
893 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
894
895/* This table is used by relax_frag to promote short jumps to long
896 ones where necessary. SMALL (short) jumps may be promoted to BIG
897 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
898 don't allow a short jump in a 32 bit code segment to be promoted to
899 a 16 bit offset jump because it's slower (requires data size
900 prefix), and doesn't work, unless the destination is in the bottom
901 64k of the code segment (The top 16 bits of eip are zeroed). */
902
903const relax_typeS md_relax_table[] =
904{
24eab124
AM
905 /* The fields are:
906 1) most positive reach of this state,
907 2) most negative reach of this state,
93c2a809 908 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 909 4) which index into the table to try if we can't fit into this one. */
252b5132 910
fddf5b5b 911 /* UNCOND_JUMP states. */
93c2a809
AM
912 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
913 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
914 /* dword jmp adds 4 bytes to frag:
915 0 extra opcode bytes, 4 displacement bytes. */
252b5132 916 {0, 0, 4, 0},
93c2a809
AM
917 /* word jmp adds 2 byte2 to frag:
918 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
919 {0, 0, 2, 0},
920
93c2a809
AM
921 /* COND_JUMP states. */
922 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
923 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
924 /* dword conditionals adds 5 bytes to frag:
925 1 extra opcode byte, 4 displacement bytes. */
926 {0, 0, 5, 0},
fddf5b5b 927 /* word conditionals add 3 bytes to frag:
93c2a809
AM
928 1 extra opcode byte, 2 displacement bytes. */
929 {0, 0, 3, 0},
930
931 /* COND_JUMP86 states. */
932 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
933 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
934 /* dword conditionals adds 5 bytes to frag:
935 1 extra opcode byte, 4 displacement bytes. */
936 {0, 0, 5, 0},
937 /* word conditionals add 4 bytes to frag:
938 1 displacement byte and a 3 byte long branch insn. */
939 {0, 0, 4, 0}
252b5132
RH
940};
941
9103f4f4
L
942static const arch_entry cpu_arch[] =
943{
89507696
JB
944 /* Do not replace the first two entries - i386_target_format()
945 relies on them being there in this order. */
8a2c8fef 946 { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
293f5f65 947 CPU_GENERIC32_FLAGS, 0 },
8a2c8fef 948 { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
293f5f65 949 CPU_GENERIC64_FLAGS, 0 },
8a2c8fef 950 { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
293f5f65 951 CPU_NONE_FLAGS, 0 },
8a2c8fef 952 { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
293f5f65 953 CPU_I186_FLAGS, 0 },
8a2c8fef 954 { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
293f5f65 955 CPU_I286_FLAGS, 0 },
8a2c8fef 956 { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
293f5f65 957 CPU_I386_FLAGS, 0 },
8a2c8fef 958 { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
293f5f65 959 CPU_I486_FLAGS, 0 },
8a2c8fef 960 { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
293f5f65 961 CPU_I586_FLAGS, 0 },
8a2c8fef 962 { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
293f5f65 963 CPU_I686_FLAGS, 0 },
8a2c8fef 964 { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
293f5f65 965 CPU_I586_FLAGS, 0 },
8a2c8fef 966 { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
293f5f65 967 CPU_PENTIUMPRO_FLAGS, 0 },
8a2c8fef 968 { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
293f5f65 969 CPU_P2_FLAGS, 0 },
8a2c8fef 970 { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
293f5f65 971 CPU_P3_FLAGS, 0 },
8a2c8fef 972 { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
293f5f65 973 CPU_P4_FLAGS, 0 },
8a2c8fef 974 { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
293f5f65 975 CPU_CORE_FLAGS, 0 },
8a2c8fef 976 { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
293f5f65 977 CPU_NOCONA_FLAGS, 0 },
8a2c8fef 978 { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
293f5f65 979 CPU_CORE_FLAGS, 1 },
8a2c8fef 980 { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
293f5f65 981 CPU_CORE_FLAGS, 0 },
8a2c8fef 982 { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
293f5f65 983 CPU_CORE2_FLAGS, 1 },
8a2c8fef 984 { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
293f5f65 985 CPU_CORE2_FLAGS, 0 },
8a2c8fef 986 { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
293f5f65 987 CPU_COREI7_FLAGS, 0 },
8a2c8fef 988 { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
293f5f65 989 CPU_L1OM_FLAGS, 0 },
7a9068fe 990 { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
293f5f65 991 CPU_K1OM_FLAGS, 0 },
81486035 992 { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
293f5f65 993 CPU_IAMCU_FLAGS, 0 },
8a2c8fef 994 { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
293f5f65 995 CPU_K6_FLAGS, 0 },
8a2c8fef 996 { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
293f5f65 997 CPU_K6_2_FLAGS, 0 },
8a2c8fef 998 { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
293f5f65 999 CPU_ATHLON_FLAGS, 0 },
8a2c8fef 1000 { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
293f5f65 1001 CPU_K8_FLAGS, 1 },
8a2c8fef 1002 { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
293f5f65 1003 CPU_K8_FLAGS, 0 },
8a2c8fef 1004 { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
293f5f65 1005 CPU_K8_FLAGS, 0 },
8a2c8fef 1006 { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
293f5f65 1007 CPU_AMDFAM10_FLAGS, 0 },
8aedb9fe 1008 { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
293f5f65 1009 CPU_BDVER1_FLAGS, 0 },
8aedb9fe 1010 { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
293f5f65 1011 CPU_BDVER2_FLAGS, 0 },
5e5c50d3 1012 { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
293f5f65 1013 CPU_BDVER3_FLAGS, 0 },
c7b0bd56 1014 { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
293f5f65 1015 CPU_BDVER4_FLAGS, 0 },
029f3522 1016 { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
293f5f65 1017 CPU_ZNVER1_FLAGS, 0 },
a9660a6f
AP
1018 { STRING_COMMA_LEN ("znver2"), PROCESSOR_ZNVER,
1019 CPU_ZNVER2_FLAGS, 0 },
646cc3e0
GG
1020 { STRING_COMMA_LEN ("znver3"), PROCESSOR_ZNVER,
1021 CPU_ZNVER3_FLAGS, 0 },
7b458c12 1022 { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
293f5f65 1023 CPU_BTVER1_FLAGS, 0 },
7b458c12 1024 { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
293f5f65 1025 CPU_BTVER2_FLAGS, 0 },
8a2c8fef 1026 { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
293f5f65 1027 CPU_8087_FLAGS, 0 },
8a2c8fef 1028 { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
293f5f65 1029 CPU_287_FLAGS, 0 },
8a2c8fef 1030 { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
293f5f65 1031 CPU_387_FLAGS, 0 },
1848e567
L
1032 { STRING_COMMA_LEN (".687"), PROCESSOR_UNKNOWN,
1033 CPU_687_FLAGS, 0 },
d871f3f4
L
1034 { STRING_COMMA_LEN (".cmov"), PROCESSOR_UNKNOWN,
1035 CPU_CMOV_FLAGS, 0 },
1036 { STRING_COMMA_LEN (".fxsr"), PROCESSOR_UNKNOWN,
1037 CPU_FXSR_FLAGS, 0 },
8a2c8fef 1038 { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
293f5f65 1039 CPU_MMX_FLAGS, 0 },
8a2c8fef 1040 { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
293f5f65 1041 CPU_SSE_FLAGS, 0 },
8a2c8fef 1042 { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
293f5f65 1043 CPU_SSE2_FLAGS, 0 },
8a2c8fef 1044 { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
293f5f65 1045 CPU_SSE3_FLAGS, 0 },
af5c13b0
L
1046 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
1047 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1048 { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
293f5f65 1049 CPU_SSSE3_FLAGS, 0 },
8a2c8fef 1050 { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
293f5f65 1051 CPU_SSE4_1_FLAGS, 0 },
8a2c8fef 1052 { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
293f5f65 1053 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1054 { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
293f5f65 1055 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1056 { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
293f5f65 1057 CPU_AVX_FLAGS, 0 },
6c30d220 1058 { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
293f5f65 1059 CPU_AVX2_FLAGS, 0 },
43234a1e 1060 { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
293f5f65 1061 CPU_AVX512F_FLAGS, 0 },
43234a1e 1062 { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
293f5f65 1063 CPU_AVX512CD_FLAGS, 0 },
43234a1e 1064 { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
293f5f65 1065 CPU_AVX512ER_FLAGS, 0 },
43234a1e 1066 { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
293f5f65 1067 CPU_AVX512PF_FLAGS, 0 },
1dfc6506 1068 { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
293f5f65 1069 CPU_AVX512DQ_FLAGS, 0 },
1dfc6506 1070 { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
293f5f65 1071 CPU_AVX512BW_FLAGS, 0 },
1dfc6506 1072 { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
293f5f65 1073 CPU_AVX512VL_FLAGS, 0 },
8a2c8fef 1074 { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
293f5f65 1075 CPU_VMX_FLAGS, 0 },
8729a6f6 1076 { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
293f5f65 1077 CPU_VMFUNC_FLAGS, 0 },
8a2c8fef 1078 { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
293f5f65 1079 CPU_SMX_FLAGS, 0 },
8a2c8fef 1080 { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
293f5f65 1081 CPU_XSAVE_FLAGS, 0 },
c7b8aa3a 1082 { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
293f5f65 1083 CPU_XSAVEOPT_FLAGS, 0 },
1dfc6506 1084 { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
293f5f65 1085 CPU_XSAVEC_FLAGS, 0 },
1dfc6506 1086 { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
293f5f65 1087 CPU_XSAVES_FLAGS, 0 },
8a2c8fef 1088 { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
293f5f65 1089 CPU_AES_FLAGS, 0 },
8a2c8fef 1090 { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
293f5f65 1091 CPU_PCLMUL_FLAGS, 0 },
8a2c8fef 1092 { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
293f5f65 1093 CPU_PCLMUL_FLAGS, 1 },
c7b8aa3a 1094 { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
293f5f65 1095 CPU_FSGSBASE_FLAGS, 0 },
c7b8aa3a 1096 { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
293f5f65 1097 CPU_RDRND_FLAGS, 0 },
c7b8aa3a 1098 { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
293f5f65 1099 CPU_F16C_FLAGS, 0 },
6c30d220 1100 { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
293f5f65 1101 CPU_BMI2_FLAGS, 0 },
8a2c8fef 1102 { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
293f5f65 1103 CPU_FMA_FLAGS, 0 },
8a2c8fef 1104 { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
293f5f65 1105 CPU_FMA4_FLAGS, 0 },
8a2c8fef 1106 { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
293f5f65 1107 CPU_XOP_FLAGS, 0 },
8a2c8fef 1108 { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
293f5f65 1109 CPU_LWP_FLAGS, 0 },
8a2c8fef 1110 { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
293f5f65 1111 CPU_MOVBE_FLAGS, 0 },
60aa667e 1112 { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
293f5f65 1113 CPU_CX16_FLAGS, 0 },
8a2c8fef 1114 { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
293f5f65 1115 CPU_EPT_FLAGS, 0 },
6c30d220 1116 { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
293f5f65 1117 CPU_LZCNT_FLAGS, 0 },
272a84b1
L
1118 { STRING_COMMA_LEN (".popcnt"), PROCESSOR_UNKNOWN,
1119 CPU_POPCNT_FLAGS, 0 },
42164a71 1120 { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
293f5f65 1121 CPU_HLE_FLAGS, 0 },
42164a71 1122 { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
293f5f65 1123 CPU_RTM_FLAGS, 0 },
6c30d220 1124 { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
293f5f65 1125 CPU_INVPCID_FLAGS, 0 },
8a2c8fef 1126 { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
293f5f65 1127 CPU_CLFLUSH_FLAGS, 0 },
22109423 1128 { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
293f5f65 1129 CPU_NOP_FLAGS, 0 },
8a2c8fef 1130 { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
293f5f65 1131 CPU_SYSCALL_FLAGS, 0 },
8a2c8fef 1132 { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
293f5f65 1133 CPU_RDTSCP_FLAGS, 0 },
8a2c8fef 1134 { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
293f5f65 1135 CPU_3DNOW_FLAGS, 0 },
8a2c8fef 1136 { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
293f5f65 1137 CPU_3DNOWA_FLAGS, 0 },
8a2c8fef 1138 { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
293f5f65 1139 CPU_PADLOCK_FLAGS, 0 },
8a2c8fef 1140 { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
293f5f65 1141 CPU_SVME_FLAGS, 1 },
8a2c8fef 1142 { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
293f5f65 1143 CPU_SVME_FLAGS, 0 },
8a2c8fef 1144 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
293f5f65 1145 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1146 { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
293f5f65 1147 CPU_ABM_FLAGS, 0 },
87973e9f 1148 { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
293f5f65 1149 CPU_BMI_FLAGS, 0 },
2a2a0f38 1150 { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
293f5f65 1151 CPU_TBM_FLAGS, 0 },
e2e1fcde 1152 { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
293f5f65 1153 CPU_ADX_FLAGS, 0 },
e2e1fcde 1154 { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
293f5f65 1155 CPU_RDSEED_FLAGS, 0 },
e2e1fcde 1156 { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
293f5f65 1157 CPU_PRFCHW_FLAGS, 0 },
5c111e37 1158 { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
293f5f65 1159 CPU_SMAP_FLAGS, 0 },
7e8b059b 1160 { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
293f5f65 1161 CPU_MPX_FLAGS, 0 },
a0046408 1162 { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
293f5f65 1163 CPU_SHA_FLAGS, 0 },
963f3586 1164 { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
293f5f65 1165 CPU_CLFLUSHOPT_FLAGS, 0 },
dcf893b5 1166 { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
293f5f65 1167 CPU_PREFETCHWT1_FLAGS, 0 },
2cf200a4 1168 { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
293f5f65 1169 CPU_SE1_FLAGS, 0 },
c5e7287a 1170 { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
293f5f65 1171 CPU_CLWB_FLAGS, 0 },
2cc1b5aa 1172 { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
293f5f65 1173 CPU_AVX512IFMA_FLAGS, 0 },
14f195c9 1174 { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
293f5f65 1175 CPU_AVX512VBMI_FLAGS, 0 },
920d2ddc
IT
1176 { STRING_COMMA_LEN (".avx512_4fmaps"), PROCESSOR_UNKNOWN,
1177 CPU_AVX512_4FMAPS_FLAGS, 0 },
47acf0bd
IT
1178 { STRING_COMMA_LEN (".avx512_4vnniw"), PROCESSOR_UNKNOWN,
1179 CPU_AVX512_4VNNIW_FLAGS, 0 },
620214f7
IT
1180 { STRING_COMMA_LEN (".avx512_vpopcntdq"), PROCESSOR_UNKNOWN,
1181 CPU_AVX512_VPOPCNTDQ_FLAGS, 0 },
53467f57
IT
1182 { STRING_COMMA_LEN (".avx512_vbmi2"), PROCESSOR_UNKNOWN,
1183 CPU_AVX512_VBMI2_FLAGS, 0 },
8cfcb765
IT
1184 { STRING_COMMA_LEN (".avx512_vnni"), PROCESSOR_UNKNOWN,
1185 CPU_AVX512_VNNI_FLAGS, 0 },
ee6872be
IT
1186 { STRING_COMMA_LEN (".avx512_bitalg"), PROCESSOR_UNKNOWN,
1187 CPU_AVX512_BITALG_FLAGS, 0 },
58bf9b6a
L
1188 { STRING_COMMA_LEN (".avx_vnni"), PROCESSOR_UNKNOWN,
1189 CPU_AVX_VNNI_FLAGS, 0 },
029f3522 1190 { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
293f5f65 1191 CPU_CLZERO_FLAGS, 0 },
9916071f 1192 { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
293f5f65 1193 CPU_MWAITX_FLAGS, 0 },
8eab4136 1194 { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
293f5f65 1195 CPU_OSPKE_FLAGS, 0 },
8bc52696 1196 { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
293f5f65 1197 CPU_RDPID_FLAGS, 0 },
6b40c462
L
1198 { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
1199 CPU_PTWRITE_FLAGS, 0 },
d777820b
IT
1200 { STRING_COMMA_LEN (".ibt"), PROCESSOR_UNKNOWN,
1201 CPU_IBT_FLAGS, 0 },
1202 { STRING_COMMA_LEN (".shstk"), PROCESSOR_UNKNOWN,
1203 CPU_SHSTK_FLAGS, 0 },
48521003
IT
1204 { STRING_COMMA_LEN (".gfni"), PROCESSOR_UNKNOWN,
1205 CPU_GFNI_FLAGS, 0 },
8dcf1fad
IT
1206 { STRING_COMMA_LEN (".vaes"), PROCESSOR_UNKNOWN,
1207 CPU_VAES_FLAGS, 0 },
ff1982d5
IT
1208 { STRING_COMMA_LEN (".vpclmulqdq"), PROCESSOR_UNKNOWN,
1209 CPU_VPCLMULQDQ_FLAGS, 0 },
3233d7d0
IT
1210 { STRING_COMMA_LEN (".wbnoinvd"), PROCESSOR_UNKNOWN,
1211 CPU_WBNOINVD_FLAGS, 0 },
be3a8dca
IT
1212 { STRING_COMMA_LEN (".pconfig"), PROCESSOR_UNKNOWN,
1213 CPU_PCONFIG_FLAGS, 0 },
de89d0a3
IT
1214 { STRING_COMMA_LEN (".waitpkg"), PROCESSOR_UNKNOWN,
1215 CPU_WAITPKG_FLAGS, 0 },
c48935d7
IT
1216 { STRING_COMMA_LEN (".cldemote"), PROCESSOR_UNKNOWN,
1217 CPU_CLDEMOTE_FLAGS, 0 },
260cd341
LC
1218 { STRING_COMMA_LEN (".amx_int8"), PROCESSOR_UNKNOWN,
1219 CPU_AMX_INT8_FLAGS, 0 },
1220 { STRING_COMMA_LEN (".amx_bf16"), PROCESSOR_UNKNOWN,
1221 CPU_AMX_BF16_FLAGS, 0 },
1222 { STRING_COMMA_LEN (".amx_tile"), PROCESSOR_UNKNOWN,
1223 CPU_AMX_TILE_FLAGS, 0 },
c0a30a9f
L
1224 { STRING_COMMA_LEN (".movdiri"), PROCESSOR_UNKNOWN,
1225 CPU_MOVDIRI_FLAGS, 0 },
1226 { STRING_COMMA_LEN (".movdir64b"), PROCESSOR_UNKNOWN,
1227 CPU_MOVDIR64B_FLAGS, 0 },
d6aab7a1
XG
1228 { STRING_COMMA_LEN (".avx512_bf16"), PROCESSOR_UNKNOWN,
1229 CPU_AVX512_BF16_FLAGS, 0 },
9186c494
L
1230 { STRING_COMMA_LEN (".avx512_vp2intersect"), PROCESSOR_UNKNOWN,
1231 CPU_AVX512_VP2INTERSECT_FLAGS, 0 },
81d54bb7
CL
1232 { STRING_COMMA_LEN (".tdx"), PROCESSOR_UNKNOWN,
1233 CPU_TDX_FLAGS, 0 },
dd455cf5
L
1234 { STRING_COMMA_LEN (".enqcmd"), PROCESSOR_UNKNOWN,
1235 CPU_ENQCMD_FLAGS, 0 },
4b27d27c
L
1236 { STRING_COMMA_LEN (".serialize"), PROCESSOR_UNKNOWN,
1237 CPU_SERIALIZE_FLAGS, 0 },
142861df
JB
1238 { STRING_COMMA_LEN (".rdpru"), PROCESSOR_UNKNOWN,
1239 CPU_RDPRU_FLAGS, 0 },
1240 { STRING_COMMA_LEN (".mcommit"), PROCESSOR_UNKNOWN,
1241 CPU_MCOMMIT_FLAGS, 0 },
a847e322
JB
1242 { STRING_COMMA_LEN (".sev_es"), PROCESSOR_UNKNOWN,
1243 CPU_SEV_ES_FLAGS, 0 },
bb651e8b
CL
1244 { STRING_COMMA_LEN (".tsxldtrk"), PROCESSOR_UNKNOWN,
1245 CPU_TSXLDTRK_FLAGS, 0 },
c4694f17
TG
1246 { STRING_COMMA_LEN (".kl"), PROCESSOR_UNKNOWN,
1247 CPU_KL_FLAGS, 0 },
1248 { STRING_COMMA_LEN (".widekl"), PROCESSOR_UNKNOWN,
1249 CPU_WIDEKL_FLAGS, 0 },
f64c42a9
LC
1250 { STRING_COMMA_LEN (".uintr"), PROCESSOR_UNKNOWN,
1251 CPU_UINTR_FLAGS, 0 },
c1fa250a
LC
1252 { STRING_COMMA_LEN (".hreset"), PROCESSOR_UNKNOWN,
1253 CPU_HRESET_FLAGS, 0 },
293f5f65
L
1254};
1255
1256static const noarch_entry cpu_noarch[] =
1257{
1258 { STRING_COMMA_LEN ("no87"), CPU_ANY_X87_FLAGS },
1848e567
L
1259 { STRING_COMMA_LEN ("no287"), CPU_ANY_287_FLAGS },
1260 { STRING_COMMA_LEN ("no387"), CPU_ANY_387_FLAGS },
1261 { STRING_COMMA_LEN ("no687"), CPU_ANY_687_FLAGS },
d871f3f4
L
1262 { STRING_COMMA_LEN ("nocmov"), CPU_ANY_CMOV_FLAGS },
1263 { STRING_COMMA_LEN ("nofxsr"), CPU_ANY_FXSR_FLAGS },
293f5f65
L
1264 { STRING_COMMA_LEN ("nommx"), CPU_ANY_MMX_FLAGS },
1265 { STRING_COMMA_LEN ("nosse"), CPU_ANY_SSE_FLAGS },
1848e567
L
1266 { STRING_COMMA_LEN ("nosse2"), CPU_ANY_SSE2_FLAGS },
1267 { STRING_COMMA_LEN ("nosse3"), CPU_ANY_SSE3_FLAGS },
af5c13b0 1268 { STRING_COMMA_LEN ("nosse4a"), CPU_ANY_SSE4A_FLAGS },
1848e567
L
1269 { STRING_COMMA_LEN ("nossse3"), CPU_ANY_SSSE3_FLAGS },
1270 { STRING_COMMA_LEN ("nosse4.1"), CPU_ANY_SSE4_1_FLAGS },
1271 { STRING_COMMA_LEN ("nosse4.2"), CPU_ANY_SSE4_2_FLAGS },
af5c13b0 1272 { STRING_COMMA_LEN ("nosse4"), CPU_ANY_SSE4_1_FLAGS },
293f5f65 1273 { STRING_COMMA_LEN ("noavx"), CPU_ANY_AVX_FLAGS },
1848e567 1274 { STRING_COMMA_LEN ("noavx2"), CPU_ANY_AVX2_FLAGS },
144b71e2
L
1275 { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
1276 { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
1277 { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
1278 { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
1279 { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
1280 { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
1281 { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
1282 { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
1283 { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
920d2ddc 1284 { STRING_COMMA_LEN ("noavx512_4fmaps"), CPU_ANY_AVX512_4FMAPS_FLAGS },
47acf0bd 1285 { STRING_COMMA_LEN ("noavx512_4vnniw"), CPU_ANY_AVX512_4VNNIW_FLAGS },
620214f7 1286 { STRING_COMMA_LEN ("noavx512_vpopcntdq"), CPU_ANY_AVX512_VPOPCNTDQ_FLAGS },
53467f57 1287 { STRING_COMMA_LEN ("noavx512_vbmi2"), CPU_ANY_AVX512_VBMI2_FLAGS },
8cfcb765 1288 { STRING_COMMA_LEN ("noavx512_vnni"), CPU_ANY_AVX512_VNNI_FLAGS },
ee6872be 1289 { STRING_COMMA_LEN ("noavx512_bitalg"), CPU_ANY_AVX512_BITALG_FLAGS },
58bf9b6a 1290 { STRING_COMMA_LEN ("noavx_vnni"), CPU_ANY_AVX_VNNI_FLAGS },
d777820b
IT
1291 { STRING_COMMA_LEN ("noibt"), CPU_ANY_IBT_FLAGS },
1292 { STRING_COMMA_LEN ("noshstk"), CPU_ANY_SHSTK_FLAGS },
260cd341
LC
1293 { STRING_COMMA_LEN ("noamx_int8"), CPU_ANY_AMX_INT8_FLAGS },
1294 { STRING_COMMA_LEN ("noamx_bf16"), CPU_ANY_AMX_BF16_FLAGS },
1295 { STRING_COMMA_LEN ("noamx_tile"), CPU_ANY_AMX_TILE_FLAGS },
c0a30a9f
L
1296 { STRING_COMMA_LEN ("nomovdiri"), CPU_ANY_MOVDIRI_FLAGS },
1297 { STRING_COMMA_LEN ("nomovdir64b"), CPU_ANY_MOVDIR64B_FLAGS },
d6aab7a1 1298 { STRING_COMMA_LEN ("noavx512_bf16"), CPU_ANY_AVX512_BF16_FLAGS },
708a2fff
CL
1299 { STRING_COMMA_LEN ("noavx512_vp2intersect"),
1300 CPU_ANY_AVX512_VP2INTERSECT_FLAGS },
81d54bb7 1301 { STRING_COMMA_LEN ("notdx"), CPU_ANY_TDX_FLAGS },
dd455cf5 1302 { STRING_COMMA_LEN ("noenqcmd"), CPU_ANY_ENQCMD_FLAGS },
4b27d27c 1303 { STRING_COMMA_LEN ("noserialize"), CPU_ANY_SERIALIZE_FLAGS },
bb651e8b 1304 { STRING_COMMA_LEN ("notsxldtrk"), CPU_ANY_TSXLDTRK_FLAGS },
c4694f17
TG
1305 { STRING_COMMA_LEN ("nokl"), CPU_ANY_KL_FLAGS },
1306 { STRING_COMMA_LEN ("nowidekl"), CPU_ANY_WIDEKL_FLAGS },
f64c42a9 1307 { STRING_COMMA_LEN ("nouintr"), CPU_ANY_UINTR_FLAGS },
c1fa250a 1308 { STRING_COMMA_LEN ("nohreset"), CPU_ANY_HRESET_FLAGS },
e413e4e9
AM
1309};
1310
704209c0 1311#ifdef I386COFF
a6c24e68
NC
1312/* Like s_lcomm_internal in gas/read.c but the alignment string
1313 is allowed to be optional. */
1314
1315static symbolS *
1316pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1317{
1318 addressT align = 0;
1319
1320 SKIP_WHITESPACE ();
1321
7ab9ffdd 1322 if (needs_align
a6c24e68
NC
1323 && *input_line_pointer == ',')
1324 {
1325 align = parse_align (needs_align - 1);
7ab9ffdd 1326
a6c24e68
NC
1327 if (align == (addressT) -1)
1328 return NULL;
1329 }
1330 else
1331 {
1332 if (size >= 8)
1333 align = 3;
1334 else if (size >= 4)
1335 align = 2;
1336 else if (size >= 2)
1337 align = 1;
1338 else
1339 align = 0;
1340 }
1341
1342 bss_alloc (symbolP, size, align);
1343 return symbolP;
1344}
1345
704209c0 1346static void
a6c24e68
NC
1347pe_lcomm (int needs_align)
1348{
1349 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1350}
704209c0 1351#endif
a6c24e68 1352
29b0f896
AM
1353const pseudo_typeS md_pseudo_table[] =
1354{
1355#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1356 {"align", s_align_bytes, 0},
1357#else
1358 {"align", s_align_ptwo, 0},
1359#endif
1360 {"arch", set_cpu_arch, 0},
1361#ifndef I386COFF
1362 {"bss", s_bss, 0},
a6c24e68
NC
1363#else
1364 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1365#endif
1366 {"ffloat", float_cons, 'f'},
1367 {"dfloat", float_cons, 'd'},
1368 {"tfloat", float_cons, 'x'},
1369 {"value", cons, 2},
d182319b 1370 {"slong", signed_cons, 4},
29b0f896
AM
1371 {"noopt", s_ignore, 0},
1372 {"optim", s_ignore, 0},
1373 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1374 {"code16", set_code_flag, CODE_16BIT},
1375 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1376#ifdef BFD64
29b0f896 1377 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1378#endif
29b0f896
AM
1379 {"intel_syntax", set_intel_syntax, 1},
1380 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1381 {"intel_mnemonic", set_intel_mnemonic, 1},
1382 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1383 {"allow_index_reg", set_allow_index_reg, 1},
1384 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1385 {"sse_check", set_check, 0},
1386 {"operand_check", set_check, 1},
3b22753a
L
1387#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1388 {"largecomm", handle_large_common, 0},
07a53e5c 1389#else
68d20676 1390 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1391 {"loc", dwarf2_directive_loc, 0},
1392 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1393#endif
6482c264
NC
1394#ifdef TE_PE
1395 {"secrel32", pe_directive_secrel, 0},
1396#endif
29b0f896
AM
1397 {0, 0, 0}
1398};
1399
1400/* For interface with expression (). */
1401extern char *input_line_pointer;
1402
1403/* Hash table for instruction mnemonic lookup. */
629310ab 1404static htab_t op_hash;
29b0f896
AM
1405
1406/* Hash table for register lookup. */
629310ab 1407static htab_t reg_hash;
29b0f896 1408\f
ce8a8b2f
AM
1409 /* Various efficient no-op patterns for aligning code labels.
1410 Note: Don't try to assemble the instructions in the comments.
1411 0L and 0w are not legal. */
62a02d25
L
1412static const unsigned char f32_1[] =
1413 {0x90}; /* nop */
1414static const unsigned char f32_2[] =
1415 {0x66,0x90}; /* xchg %ax,%ax */
1416static const unsigned char f32_3[] =
1417 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1418static const unsigned char f32_4[] =
1419 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
62a02d25
L
1420static const unsigned char f32_6[] =
1421 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1422static const unsigned char f32_7[] =
1423 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
62a02d25 1424static const unsigned char f16_3[] =
3ae729d5 1425 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
62a02d25 1426static const unsigned char f16_4[] =
3ae729d5
L
1427 {0x8d,0xb4,0x00,0x00}; /* lea 0W(%si),%si */
1428static const unsigned char jump_disp8[] =
1429 {0xeb}; /* jmp disp8 */
1430static const unsigned char jump32_disp32[] =
1431 {0xe9}; /* jmp disp32 */
1432static const unsigned char jump16_disp32[] =
1433 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1434/* 32-bit NOPs patterns. */
1435static const unsigned char *const f32_patt[] = {
3ae729d5 1436 f32_1, f32_2, f32_3, f32_4, NULL, f32_6, f32_7
62a02d25
L
1437};
1438/* 16-bit NOPs patterns. */
1439static const unsigned char *const f16_patt[] = {
3ae729d5 1440 f32_1, f32_2, f16_3, f16_4
62a02d25
L
1441};
1442/* nopl (%[re]ax) */
1443static const unsigned char alt_3[] =
1444 {0x0f,0x1f,0x00};
1445/* nopl 0(%[re]ax) */
1446static const unsigned char alt_4[] =
1447 {0x0f,0x1f,0x40,0x00};
1448/* nopl 0(%[re]ax,%[re]ax,1) */
1449static const unsigned char alt_5[] =
1450 {0x0f,0x1f,0x44,0x00,0x00};
1451/* nopw 0(%[re]ax,%[re]ax,1) */
1452static const unsigned char alt_6[] =
1453 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1454/* nopl 0L(%[re]ax) */
1455static const unsigned char alt_7[] =
1456 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1457/* nopl 0L(%[re]ax,%[re]ax,1) */
1458static const unsigned char alt_8[] =
1459 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1460/* nopw 0L(%[re]ax,%[re]ax,1) */
1461static const unsigned char alt_9[] =
1462 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1463/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1464static const unsigned char alt_10[] =
1465 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
3ae729d5
L
1466/* data16 nopw %cs:0L(%eax,%eax,1) */
1467static const unsigned char alt_11[] =
1468 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1469/* 32-bit and 64-bit NOPs patterns. */
1470static const unsigned char *const alt_patt[] = {
1471 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1472 alt_9, alt_10, alt_11
62a02d25
L
1473};
1474
1475/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1476 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1477
1478static void
1479i386_output_nops (char *where, const unsigned char *const *patt,
1480 int count, int max_single_nop_size)
1481
1482{
3ae729d5
L
1483 /* Place the longer NOP first. */
1484 int last;
1485 int offset;
3076e594
NC
1486 const unsigned char *nops;
1487
1488 if (max_single_nop_size < 1)
1489 {
1490 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1491 max_single_nop_size);
1492 return;
1493 }
1494
1495 nops = patt[max_single_nop_size - 1];
3ae729d5
L
1496
1497 /* Use the smaller one if the requsted one isn't available. */
1498 if (nops == NULL)
62a02d25 1499 {
3ae729d5
L
1500 max_single_nop_size--;
1501 nops = patt[max_single_nop_size - 1];
62a02d25
L
1502 }
1503
3ae729d5
L
1504 last = count % max_single_nop_size;
1505
1506 count -= last;
1507 for (offset = 0; offset < count; offset += max_single_nop_size)
1508 memcpy (where + offset, nops, max_single_nop_size);
1509
1510 if (last)
1511 {
1512 nops = patt[last - 1];
1513 if (nops == NULL)
1514 {
1515 /* Use the smaller one plus one-byte NOP if the needed one
1516 isn't available. */
1517 last--;
1518 nops = patt[last - 1];
1519 memcpy (where + offset, nops, last);
1520 where[offset + last] = *patt[0];
1521 }
1522 else
1523 memcpy (where + offset, nops, last);
1524 }
62a02d25
L
1525}
1526
3ae729d5
L
1527static INLINE int
1528fits_in_imm7 (offsetT num)
1529{
1530 return (num & 0x7f) == num;
1531}
1532
1533static INLINE int
1534fits_in_imm31 (offsetT num)
1535{
1536 return (num & 0x7fffffff) == num;
1537}
62a02d25
L
1538
1539/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1540 single NOP instruction LIMIT. */
1541
1542void
3ae729d5 1543i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1544{
3ae729d5 1545 const unsigned char *const *patt = NULL;
62a02d25 1546 int max_single_nop_size;
3ae729d5
L
1547 /* Maximum number of NOPs before switching to jump over NOPs. */
1548 int max_number_of_nops;
62a02d25 1549
3ae729d5 1550 switch (fragP->fr_type)
62a02d25 1551 {
3ae729d5
L
1552 case rs_fill_nop:
1553 case rs_align_code:
1554 break;
e379e5f3
L
1555 case rs_machine_dependent:
1556 /* Allow NOP padding for jumps and calls. */
1557 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
1558 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
1559 break;
1560 /* Fall through. */
3ae729d5 1561 default:
62a02d25
L
1562 return;
1563 }
1564
ccc9c027
L
1565 /* We need to decide which NOP sequence to use for 32bit and
1566 64bit. When -mtune= is used:
4eed87de 1567
76bc74dc
L
1568 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
1569 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1570 2. For the rest, alt_patt will be used.
1571
1572 When -mtune= isn't used, alt_patt will be used if
22109423 1573 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will
76bc74dc 1574 be used.
ccc9c027
L
1575
1576 When -march= or .arch is used, we can't use anything beyond
1577 cpu_arch_isa_flags. */
1578
1579 if (flag_code == CODE_16BIT)
1580 {
3ae729d5
L
1581 patt = f16_patt;
1582 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1583 /* Limit number of NOPs to 2 in 16-bit mode. */
1584 max_number_of_nops = 2;
252b5132 1585 }
33fef721 1586 else
ccc9c027 1587 {
fbf3f584 1588 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027
L
1589 {
1590 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
1591 switch (cpu_arch_tune)
1592 {
1593 case PROCESSOR_UNKNOWN:
1594 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423
L
1595 optimize with nops. */
1596 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1597 patt = alt_patt;
ccc9c027
L
1598 else
1599 patt = f32_patt;
1600 break;
ccc9c027
L
1601 case PROCESSOR_PENTIUM4:
1602 case PROCESSOR_NOCONA:
ef05d495 1603 case PROCESSOR_CORE:
76bc74dc 1604 case PROCESSOR_CORE2:
bd5295b2 1605 case PROCESSOR_COREI7:
3632d14b 1606 case PROCESSOR_L1OM:
7a9068fe 1607 case PROCESSOR_K1OM:
76bc74dc 1608 case PROCESSOR_GENERIC64:
ccc9c027
L
1609 case PROCESSOR_K6:
1610 case PROCESSOR_ATHLON:
1611 case PROCESSOR_K8:
4eed87de 1612 case PROCESSOR_AMDFAM10:
8aedb9fe 1613 case PROCESSOR_BD:
029f3522 1614 case PROCESSOR_ZNVER:
7b458c12 1615 case PROCESSOR_BT:
80b8656c 1616 patt = alt_patt;
ccc9c027 1617 break;
76bc74dc 1618 case PROCESSOR_I386:
ccc9c027
L
1619 case PROCESSOR_I486:
1620 case PROCESSOR_PENTIUM:
2dde1948 1621 case PROCESSOR_PENTIUMPRO:
81486035 1622 case PROCESSOR_IAMCU:
ccc9c027
L
1623 case PROCESSOR_GENERIC32:
1624 patt = f32_patt;
1625 break;
4eed87de 1626 }
ccc9c027
L
1627 }
1628 else
1629 {
fbf3f584 1630 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1631 {
1632 case PROCESSOR_UNKNOWN:
e6a14101 1633 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1634 PROCESSOR_UNKNOWN. */
1635 abort ();
1636 break;
1637
76bc74dc 1638 case PROCESSOR_I386:
ccc9c027
L
1639 case PROCESSOR_I486:
1640 case PROCESSOR_PENTIUM:
81486035 1641 case PROCESSOR_IAMCU:
ccc9c027
L
1642 case PROCESSOR_K6:
1643 case PROCESSOR_ATHLON:
1644 case PROCESSOR_K8:
4eed87de 1645 case PROCESSOR_AMDFAM10:
8aedb9fe 1646 case PROCESSOR_BD:
029f3522 1647 case PROCESSOR_ZNVER:
7b458c12 1648 case PROCESSOR_BT:
ccc9c027
L
1649 case PROCESSOR_GENERIC32:
1650 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423
L
1651 with nops. */
1652 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1653 patt = alt_patt;
ccc9c027
L
1654 else
1655 patt = f32_patt;
1656 break;
76bc74dc
L
1657 case PROCESSOR_PENTIUMPRO:
1658 case PROCESSOR_PENTIUM4:
1659 case PROCESSOR_NOCONA:
1660 case PROCESSOR_CORE:
ef05d495 1661 case PROCESSOR_CORE2:
bd5295b2 1662 case PROCESSOR_COREI7:
3632d14b 1663 case PROCESSOR_L1OM:
7a9068fe 1664 case PROCESSOR_K1OM:
22109423 1665 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1666 patt = alt_patt;
ccc9c027
L
1667 else
1668 patt = f32_patt;
1669 break;
1670 case PROCESSOR_GENERIC64:
80b8656c 1671 patt = alt_patt;
ccc9c027 1672 break;
4eed87de 1673 }
ccc9c027
L
1674 }
1675
76bc74dc
L
1676 if (patt == f32_patt)
1677 {
3ae729d5
L
1678 max_single_nop_size = sizeof (f32_patt) / sizeof (f32_patt[0]);
1679 /* Limit number of NOPs to 2 for older processors. */
1680 max_number_of_nops = 2;
76bc74dc
L
1681 }
1682 else
1683 {
3ae729d5
L
1684 max_single_nop_size = sizeof (alt_patt) / sizeof (alt_patt[0]);
1685 /* Limit number of NOPs to 7 for newer processors. */
1686 max_number_of_nops = 7;
1687 }
1688 }
1689
1690 if (limit == 0)
1691 limit = max_single_nop_size;
1692
1693 if (fragP->fr_type == rs_fill_nop)
1694 {
1695 /* Output NOPs for .nop directive. */
1696 if (limit > max_single_nop_size)
1697 {
1698 as_bad_where (fragP->fr_file, fragP->fr_line,
1699 _("invalid single nop size: %d "
1700 "(expect within [0, %d])"),
1701 limit, max_single_nop_size);
1702 return;
1703 }
1704 }
e379e5f3 1705 else if (fragP->fr_type != rs_machine_dependent)
3ae729d5
L
1706 fragP->fr_var = count;
1707
1708 if ((count / max_single_nop_size) > max_number_of_nops)
1709 {
1710 /* Generate jump over NOPs. */
1711 offsetT disp = count - 2;
1712 if (fits_in_imm7 (disp))
1713 {
1714 /* Use "jmp disp8" if possible. */
1715 count = disp;
1716 where[0] = jump_disp8[0];
1717 where[1] = count;
1718 where += 2;
1719 }
1720 else
1721 {
1722 unsigned int size_of_jump;
1723
1724 if (flag_code == CODE_16BIT)
1725 {
1726 where[0] = jump16_disp32[0];
1727 where[1] = jump16_disp32[1];
1728 size_of_jump = 2;
1729 }
1730 else
1731 {
1732 where[0] = jump32_disp32[0];
1733 size_of_jump = 1;
1734 }
1735
1736 count -= size_of_jump + 4;
1737 if (!fits_in_imm31 (count))
1738 {
1739 as_bad_where (fragP->fr_file, fragP->fr_line,
1740 _("jump over nop padding out of range"));
1741 return;
1742 }
1743
1744 md_number_to_chars (where + size_of_jump, count, 4);
1745 where += size_of_jump + 4;
76bc74dc 1746 }
ccc9c027 1747 }
3ae729d5
L
1748
1749 /* Generate multiple NOPs. */
1750 i386_output_nops (where, patt, count, limit);
252b5132
RH
1751}
1752
c6fb90c8 1753static INLINE int
0dfbf9d7 1754operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1755{
0dfbf9d7 1756 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1757 {
1758 case 3:
0dfbf9d7 1759 if (x->array[2])
c6fb90c8 1760 return 0;
1a0670f3 1761 /* Fall through. */
c6fb90c8 1762 case 2:
0dfbf9d7 1763 if (x->array[1])
c6fb90c8 1764 return 0;
1a0670f3 1765 /* Fall through. */
c6fb90c8 1766 case 1:
0dfbf9d7 1767 return !x->array[0];
c6fb90c8
L
1768 default:
1769 abort ();
1770 }
40fb9820
L
1771}
1772
c6fb90c8 1773static INLINE void
0dfbf9d7 1774operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1775{
0dfbf9d7 1776 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1777 {
1778 case 3:
0dfbf9d7 1779 x->array[2] = v;
1a0670f3 1780 /* Fall through. */
c6fb90c8 1781 case 2:
0dfbf9d7 1782 x->array[1] = v;
1a0670f3 1783 /* Fall through. */
c6fb90c8 1784 case 1:
0dfbf9d7 1785 x->array[0] = v;
1a0670f3 1786 /* Fall through. */
c6fb90c8
L
1787 break;
1788 default:
1789 abort ();
1790 }
bab6aec1
JB
1791
1792 x->bitfield.class = ClassNone;
75e5731b 1793 x->bitfield.instance = InstanceNone;
c6fb90c8 1794}
40fb9820 1795
c6fb90c8 1796static INLINE int
0dfbf9d7
L
1797operand_type_equal (const union i386_operand_type *x,
1798 const union i386_operand_type *y)
c6fb90c8 1799{
0dfbf9d7 1800 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1801 {
1802 case 3:
0dfbf9d7 1803 if (x->array[2] != y->array[2])
c6fb90c8 1804 return 0;
1a0670f3 1805 /* Fall through. */
c6fb90c8 1806 case 2:
0dfbf9d7 1807 if (x->array[1] != y->array[1])
c6fb90c8 1808 return 0;
1a0670f3 1809 /* Fall through. */
c6fb90c8 1810 case 1:
0dfbf9d7 1811 return x->array[0] == y->array[0];
c6fb90c8
L
1812 break;
1813 default:
1814 abort ();
1815 }
1816}
40fb9820 1817
0dfbf9d7
L
1818static INLINE int
1819cpu_flags_all_zero (const union i386_cpu_flags *x)
1820{
1821 switch (ARRAY_SIZE(x->array))
1822 {
53467f57
IT
1823 case 4:
1824 if (x->array[3])
1825 return 0;
1826 /* Fall through. */
0dfbf9d7
L
1827 case 3:
1828 if (x->array[2])
1829 return 0;
1a0670f3 1830 /* Fall through. */
0dfbf9d7
L
1831 case 2:
1832 if (x->array[1])
1833 return 0;
1a0670f3 1834 /* Fall through. */
0dfbf9d7
L
1835 case 1:
1836 return !x->array[0];
1837 default:
1838 abort ();
1839 }
1840}
1841
0dfbf9d7
L
1842static INLINE int
1843cpu_flags_equal (const union i386_cpu_flags *x,
1844 const union i386_cpu_flags *y)
1845{
1846 switch (ARRAY_SIZE(x->array))
1847 {
53467f57
IT
1848 case 4:
1849 if (x->array[3] != y->array[3])
1850 return 0;
1851 /* Fall through. */
0dfbf9d7
L
1852 case 3:
1853 if (x->array[2] != y->array[2])
1854 return 0;
1a0670f3 1855 /* Fall through. */
0dfbf9d7
L
1856 case 2:
1857 if (x->array[1] != y->array[1])
1858 return 0;
1a0670f3 1859 /* Fall through. */
0dfbf9d7
L
1860 case 1:
1861 return x->array[0] == y->array[0];
1862 break;
1863 default:
1864 abort ();
1865 }
1866}
c6fb90c8
L
1867
1868static INLINE int
1869cpu_flags_check_cpu64 (i386_cpu_flags f)
1870{
1871 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
1872 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
1873}
1874
c6fb90c8
L
1875static INLINE i386_cpu_flags
1876cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1877{
c6fb90c8
L
1878 switch (ARRAY_SIZE (x.array))
1879 {
53467f57
IT
1880 case 4:
1881 x.array [3] &= y.array [3];
1882 /* Fall through. */
c6fb90c8
L
1883 case 3:
1884 x.array [2] &= y.array [2];
1a0670f3 1885 /* Fall through. */
c6fb90c8
L
1886 case 2:
1887 x.array [1] &= y.array [1];
1a0670f3 1888 /* Fall through. */
c6fb90c8
L
1889 case 1:
1890 x.array [0] &= y.array [0];
1891 break;
1892 default:
1893 abort ();
1894 }
1895 return x;
1896}
40fb9820 1897
c6fb90c8
L
1898static INLINE i386_cpu_flags
1899cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1900{
c6fb90c8 1901 switch (ARRAY_SIZE (x.array))
40fb9820 1902 {
53467f57
IT
1903 case 4:
1904 x.array [3] |= y.array [3];
1905 /* Fall through. */
c6fb90c8
L
1906 case 3:
1907 x.array [2] |= y.array [2];
1a0670f3 1908 /* Fall through. */
c6fb90c8
L
1909 case 2:
1910 x.array [1] |= y.array [1];
1a0670f3 1911 /* Fall through. */
c6fb90c8
L
1912 case 1:
1913 x.array [0] |= y.array [0];
40fb9820
L
1914 break;
1915 default:
1916 abort ();
1917 }
40fb9820
L
1918 return x;
1919}
1920
309d3373
JB
1921static INLINE i386_cpu_flags
1922cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1923{
1924 switch (ARRAY_SIZE (x.array))
1925 {
53467f57
IT
1926 case 4:
1927 x.array [3] &= ~y.array [3];
1928 /* Fall through. */
309d3373
JB
1929 case 3:
1930 x.array [2] &= ~y.array [2];
1a0670f3 1931 /* Fall through. */
309d3373
JB
1932 case 2:
1933 x.array [1] &= ~y.array [1];
1a0670f3 1934 /* Fall through. */
309d3373
JB
1935 case 1:
1936 x.array [0] &= ~y.array [0];
1937 break;
1938 default:
1939 abort ();
1940 }
1941 return x;
1942}
1943
6c0946d0
JB
1944static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
1945
c0f3af97
L
1946#define CPU_FLAGS_ARCH_MATCH 0x1
1947#define CPU_FLAGS_64BIT_MATCH 0x2
1948
c0f3af97 1949#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1950 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1951
1952/* Return CPU flags match bits. */
3629bb00 1953
40fb9820 1954static int
d3ce72d0 1955cpu_flags_match (const insn_template *t)
40fb9820 1956{
c0f3af97
L
1957 i386_cpu_flags x = t->cpu_flags;
1958 int match = cpu_flags_check_cpu64 (x) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820
L
1959
1960 x.bitfield.cpu64 = 0;
1961 x.bitfield.cpuno64 = 0;
1962
0dfbf9d7 1963 if (cpu_flags_all_zero (&x))
c0f3af97
L
1964 {
1965 /* This instruction is available on all archs. */
db12e14e 1966 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1967 }
3629bb00
L
1968 else
1969 {
c0f3af97 1970 /* This instruction is available only on some archs. */
3629bb00
L
1971 i386_cpu_flags cpu = cpu_arch_flags;
1972
ab592e75
JB
1973 /* AVX512VL is no standalone feature - match it and then strip it. */
1974 if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl)
1975 return match;
1976 x.bitfield.cpuavx512vl = 0;
1977
3629bb00 1978 cpu = cpu_flags_and (x, cpu);
c0f3af97
L
1979 if (!cpu_flags_all_zero (&cpu))
1980 {
57392598 1981 if (x.bitfield.cpuavx)
a5ff0eb2 1982 {
929f69fa 1983 /* We need to check a few extra flags with AVX. */
b9d49817 1984 if (cpu.bitfield.cpuavx
40d231b4
JB
1985 && (!t->opcode_modifier.sse2avx
1986 || (sse2avx && !i.prefix[DATA_PREFIX]))
b9d49817 1987 && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
929f69fa 1988 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
b9d49817
JB
1989 && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
1990 match |= CPU_FLAGS_ARCH_MATCH;
a5ff0eb2 1991 }
929f69fa
JB
1992 else if (x.bitfield.cpuavx512f)
1993 {
1994 /* We need to check a few extra flags with AVX512F. */
1995 if (cpu.bitfield.cpuavx512f
1996 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
1997 && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes)
1998 && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq))
1999 match |= CPU_FLAGS_ARCH_MATCH;
2000 }
a5ff0eb2 2001 else
db12e14e 2002 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 2003 }
3629bb00 2004 }
c0f3af97 2005 return match;
40fb9820
L
2006}
2007
c6fb90c8
L
2008static INLINE i386_operand_type
2009operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 2010{
bab6aec1
JB
2011 if (x.bitfield.class != y.bitfield.class)
2012 x.bitfield.class = ClassNone;
75e5731b
JB
2013 if (x.bitfield.instance != y.bitfield.instance)
2014 x.bitfield.instance = InstanceNone;
bab6aec1 2015
c6fb90c8
L
2016 switch (ARRAY_SIZE (x.array))
2017 {
2018 case 3:
2019 x.array [2] &= y.array [2];
1a0670f3 2020 /* Fall through. */
c6fb90c8
L
2021 case 2:
2022 x.array [1] &= y.array [1];
1a0670f3 2023 /* Fall through. */
c6fb90c8
L
2024 case 1:
2025 x.array [0] &= y.array [0];
2026 break;
2027 default:
2028 abort ();
2029 }
2030 return x;
40fb9820
L
2031}
2032
73053c1f
JB
2033static INLINE i386_operand_type
2034operand_type_and_not (i386_operand_type x, i386_operand_type y)
2035{
bab6aec1 2036 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2037 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2038
73053c1f
JB
2039 switch (ARRAY_SIZE (x.array))
2040 {
2041 case 3:
2042 x.array [2] &= ~y.array [2];
2043 /* Fall through. */
2044 case 2:
2045 x.array [1] &= ~y.array [1];
2046 /* Fall through. */
2047 case 1:
2048 x.array [0] &= ~y.array [0];
2049 break;
2050 default:
2051 abort ();
2052 }
2053 return x;
2054}
2055
c6fb90c8
L
2056static INLINE i386_operand_type
2057operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 2058{
bab6aec1
JB
2059 gas_assert (x.bitfield.class == ClassNone ||
2060 y.bitfield.class == ClassNone ||
2061 x.bitfield.class == y.bitfield.class);
75e5731b
JB
2062 gas_assert (x.bitfield.instance == InstanceNone ||
2063 y.bitfield.instance == InstanceNone ||
2064 x.bitfield.instance == y.bitfield.instance);
bab6aec1 2065
c6fb90c8 2066 switch (ARRAY_SIZE (x.array))
40fb9820 2067 {
c6fb90c8
L
2068 case 3:
2069 x.array [2] |= y.array [2];
1a0670f3 2070 /* Fall through. */
c6fb90c8
L
2071 case 2:
2072 x.array [1] |= y.array [1];
1a0670f3 2073 /* Fall through. */
c6fb90c8
L
2074 case 1:
2075 x.array [0] |= y.array [0];
40fb9820
L
2076 break;
2077 default:
2078 abort ();
2079 }
c6fb90c8
L
2080 return x;
2081}
40fb9820 2082
c6fb90c8
L
2083static INLINE i386_operand_type
2084operand_type_xor (i386_operand_type x, i386_operand_type y)
2085{
bab6aec1 2086 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2087 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2088
c6fb90c8
L
2089 switch (ARRAY_SIZE (x.array))
2090 {
2091 case 3:
2092 x.array [2] ^= y.array [2];
1a0670f3 2093 /* Fall through. */
c6fb90c8
L
2094 case 2:
2095 x.array [1] ^= y.array [1];
1a0670f3 2096 /* Fall through. */
c6fb90c8
L
2097 case 1:
2098 x.array [0] ^= y.array [0];
2099 break;
2100 default:
2101 abort ();
2102 }
40fb9820
L
2103 return x;
2104}
2105
40fb9820
L
2106static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
2107static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
2108static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
2109static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
bab6aec1
JB
2110static const i386_operand_type anydisp = OPERAND_TYPE_ANYDISP;
2111static const i386_operand_type anyimm = OPERAND_TYPE_ANYIMM;
40fb9820 2112static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
43234a1e 2113static const i386_operand_type regmask = OPERAND_TYPE_REGMASK;
40fb9820
L
2114static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
2115static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
2116static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
2117static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
2118static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
2119static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
2120static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
2121static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
2122static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
2123
2124enum operand_type
2125{
2126 reg,
40fb9820
L
2127 imm,
2128 disp,
2129 anymem
2130};
2131
c6fb90c8 2132static INLINE int
40fb9820
L
2133operand_type_check (i386_operand_type t, enum operand_type c)
2134{
2135 switch (c)
2136 {
2137 case reg:
bab6aec1 2138 return t.bitfield.class == Reg;
40fb9820 2139
40fb9820
L
2140 case imm:
2141 return (t.bitfield.imm8
2142 || t.bitfield.imm8s
2143 || t.bitfield.imm16
2144 || t.bitfield.imm32
2145 || t.bitfield.imm32s
2146 || t.bitfield.imm64);
2147
2148 case disp:
2149 return (t.bitfield.disp8
2150 || t.bitfield.disp16
2151 || t.bitfield.disp32
2152 || t.bitfield.disp32s
2153 || t.bitfield.disp64);
2154
2155 case anymem:
2156 return (t.bitfield.disp8
2157 || t.bitfield.disp16
2158 || t.bitfield.disp32
2159 || t.bitfield.disp32s
2160 || t.bitfield.disp64
2161 || t.bitfield.baseindex);
2162
2163 default:
2164 abort ();
2165 }
2cfe26b6
AM
2166
2167 return 0;
40fb9820
L
2168}
2169
7a54636a
L
2170/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
2171 between operand GIVEN and opeand WANTED for instruction template T. */
5c07affc
L
2172
2173static INLINE int
7a54636a
L
2174match_operand_size (const insn_template *t, unsigned int wanted,
2175 unsigned int given)
5c07affc 2176{
3ac21baa
JB
2177 return !((i.types[given].bitfield.byte
2178 && !t->operand_types[wanted].bitfield.byte)
2179 || (i.types[given].bitfield.word
2180 && !t->operand_types[wanted].bitfield.word)
2181 || (i.types[given].bitfield.dword
2182 && !t->operand_types[wanted].bitfield.dword)
2183 || (i.types[given].bitfield.qword
2184 && !t->operand_types[wanted].bitfield.qword)
2185 || (i.types[given].bitfield.tbyte
2186 && !t->operand_types[wanted].bitfield.tbyte));
5c07affc
L
2187}
2188
dd40ce22
L
2189/* Return 1 if there is no conflict in SIMD register between operand
2190 GIVEN and opeand WANTED for instruction template T. */
1b54b8d7
JB
2191
2192static INLINE int
dd40ce22
L
2193match_simd_size (const insn_template *t, unsigned int wanted,
2194 unsigned int given)
1b54b8d7 2195{
3ac21baa
JB
2196 return !((i.types[given].bitfield.xmmword
2197 && !t->operand_types[wanted].bitfield.xmmword)
2198 || (i.types[given].bitfield.ymmword
2199 && !t->operand_types[wanted].bitfield.ymmword)
2200 || (i.types[given].bitfield.zmmword
260cd341
LC
2201 && !t->operand_types[wanted].bitfield.zmmword)
2202 || (i.types[given].bitfield.tmmword
2203 && !t->operand_types[wanted].bitfield.tmmword));
1b54b8d7
JB
2204}
2205
7a54636a
L
2206/* Return 1 if there is no conflict in any size between operand GIVEN
2207 and opeand WANTED for instruction template T. */
5c07affc
L
2208
2209static INLINE int
dd40ce22
L
2210match_mem_size (const insn_template *t, unsigned int wanted,
2211 unsigned int given)
5c07affc 2212{
7a54636a 2213 return (match_operand_size (t, wanted, given)
3ac21baa 2214 && !((i.types[given].bitfield.unspecified
af508cb9 2215 && !i.broadcast
3ac21baa
JB
2216 && !t->operand_types[wanted].bitfield.unspecified)
2217 || (i.types[given].bitfield.fword
2218 && !t->operand_types[wanted].bitfield.fword)
1b54b8d7
JB
2219 /* For scalar opcode templates to allow register and memory
2220 operands at the same time, some special casing is needed
d6793fa1
JB
2221 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2222 down-conversion vpmov*. */
3528c362 2223 || ((t->operand_types[wanted].bitfield.class == RegSIMD
bc49bfd8
JB
2224 && t->operand_types[wanted].bitfield.byte
2225 + t->operand_types[wanted].bitfield.word
2226 + t->operand_types[wanted].bitfield.dword
2227 + t->operand_types[wanted].bitfield.qword
2228 > !!t->opcode_modifier.broadcast)
3ac21baa
JB
2229 ? (i.types[given].bitfield.xmmword
2230 || i.types[given].bitfield.ymmword
2231 || i.types[given].bitfield.zmmword)
2232 : !match_simd_size(t, wanted, given))));
5c07affc
L
2233}
2234
3ac21baa
JB
2235/* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2236 operands for instruction template T, and it has MATCH_REVERSE set if there
2237 is no size conflict on any operands for the template with operands reversed
2238 (and the template allows for reversing in the first place). */
5c07affc 2239
3ac21baa
JB
2240#define MATCH_STRAIGHT 1
2241#define MATCH_REVERSE 2
2242
2243static INLINE unsigned int
d3ce72d0 2244operand_size_match (const insn_template *t)
5c07affc 2245{
3ac21baa 2246 unsigned int j, match = MATCH_STRAIGHT;
5c07affc 2247
0cfa3eb3 2248 /* Don't check non-absolute jump instructions. */
5c07affc 2249 if (t->opcode_modifier.jump
0cfa3eb3 2250 && t->opcode_modifier.jump != JUMP_ABSOLUTE)
5c07affc
L
2251 return match;
2252
2253 /* Check memory and accumulator operand size. */
2254 for (j = 0; j < i.operands; j++)
2255 {
3528c362
JB
2256 if (i.types[j].bitfield.class != Reg
2257 && i.types[j].bitfield.class != RegSIMD
601e8564 2258 && t->opcode_modifier.anysize)
5c07affc
L
2259 continue;
2260
bab6aec1 2261 if (t->operand_types[j].bitfield.class == Reg
7a54636a 2262 && !match_operand_size (t, j, j))
5c07affc
L
2263 {
2264 match = 0;
2265 break;
2266 }
2267
3528c362 2268 if (t->operand_types[j].bitfield.class == RegSIMD
3ac21baa 2269 && !match_simd_size (t, j, j))
1b54b8d7
JB
2270 {
2271 match = 0;
2272 break;
2273 }
2274
75e5731b 2275 if (t->operand_types[j].bitfield.instance == Accum
7a54636a 2276 && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
1b54b8d7
JB
2277 {
2278 match = 0;
2279 break;
2280 }
2281
c48dadc9 2282 if ((i.flags[j] & Operand_Mem) && !match_mem_size (t, j, j))
5c07affc
L
2283 {
2284 match = 0;
2285 break;
2286 }
2287 }
2288
3ac21baa 2289 if (!t->opcode_modifier.d)
891edac4 2290 {
dc1e8a47 2291 mismatch:
3ac21baa
JB
2292 if (!match)
2293 i.error = operand_size_mismatch;
2294 return match;
891edac4 2295 }
5c07affc
L
2296
2297 /* Check reverse. */
f5eb1d70 2298 gas_assert (i.operands >= 2 && i.operands <= 3);
5c07affc 2299
f5eb1d70 2300 for (j = 0; j < i.operands; j++)
5c07affc 2301 {
f5eb1d70
JB
2302 unsigned int given = i.operands - j - 1;
2303
bab6aec1 2304 if (t->operand_types[j].bitfield.class == Reg
f5eb1d70 2305 && !match_operand_size (t, j, given))
891edac4 2306 goto mismatch;
5c07affc 2307
3528c362 2308 if (t->operand_types[j].bitfield.class == RegSIMD
f5eb1d70 2309 && !match_simd_size (t, j, given))
dbbc8b7e
JB
2310 goto mismatch;
2311
75e5731b 2312 if (t->operand_types[j].bitfield.instance == Accum
f5eb1d70
JB
2313 && (!match_operand_size (t, j, given)
2314 || !match_simd_size (t, j, given)))
dbbc8b7e
JB
2315 goto mismatch;
2316
f5eb1d70 2317 if ((i.flags[given] & Operand_Mem) && !match_mem_size (t, j, given))
891edac4 2318 goto mismatch;
5c07affc
L
2319 }
2320
3ac21baa 2321 return match | MATCH_REVERSE;
5c07affc
L
2322}
2323
c6fb90c8 2324static INLINE int
40fb9820
L
2325operand_type_match (i386_operand_type overlap,
2326 i386_operand_type given)
2327{
2328 i386_operand_type temp = overlap;
2329
7d5e4556 2330 temp.bitfield.unspecified = 0;
5c07affc
L
2331 temp.bitfield.byte = 0;
2332 temp.bitfield.word = 0;
2333 temp.bitfield.dword = 0;
2334 temp.bitfield.fword = 0;
2335 temp.bitfield.qword = 0;
2336 temp.bitfield.tbyte = 0;
2337 temp.bitfield.xmmword = 0;
c0f3af97 2338 temp.bitfield.ymmword = 0;
43234a1e 2339 temp.bitfield.zmmword = 0;
260cd341 2340 temp.bitfield.tmmword = 0;
0dfbf9d7 2341 if (operand_type_all_zero (&temp))
891edac4 2342 goto mismatch;
40fb9820 2343
6f2f06be 2344 if (given.bitfield.baseindex == overlap.bitfield.baseindex)
891edac4
L
2345 return 1;
2346
dc1e8a47 2347 mismatch:
a65babc9 2348 i.error = operand_type_mismatch;
891edac4 2349 return 0;
40fb9820
L
2350}
2351
7d5e4556 2352/* If given types g0 and g1 are registers they must be of the same type
10c17abd 2353 unless the expected operand type register overlap is null.
5de4d9ef 2354 Some Intel syntax memory operand size checking also happens here. */
40fb9820 2355
c6fb90c8 2356static INLINE int
dc821c5f 2357operand_type_register_match (i386_operand_type g0,
40fb9820 2358 i386_operand_type t0,
40fb9820
L
2359 i386_operand_type g1,
2360 i386_operand_type t1)
2361{
bab6aec1 2362 if (g0.bitfield.class != Reg
3528c362 2363 && g0.bitfield.class != RegSIMD
10c17abd
JB
2364 && (!operand_type_check (g0, anymem)
2365 || g0.bitfield.unspecified
5de4d9ef
JB
2366 || (t0.bitfield.class != Reg
2367 && t0.bitfield.class != RegSIMD)))
40fb9820
L
2368 return 1;
2369
bab6aec1 2370 if (g1.bitfield.class != Reg
3528c362 2371 && g1.bitfield.class != RegSIMD
10c17abd
JB
2372 && (!operand_type_check (g1, anymem)
2373 || g1.bitfield.unspecified
5de4d9ef
JB
2374 || (t1.bitfield.class != Reg
2375 && t1.bitfield.class != RegSIMD)))
40fb9820
L
2376 return 1;
2377
dc821c5f
JB
2378 if (g0.bitfield.byte == g1.bitfield.byte
2379 && g0.bitfield.word == g1.bitfield.word
2380 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2381 && g0.bitfield.qword == g1.bitfield.qword
2382 && g0.bitfield.xmmword == g1.bitfield.xmmword
2383 && g0.bitfield.ymmword == g1.bitfield.ymmword
2384 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2385 return 1;
2386
dc821c5f
JB
2387 if (!(t0.bitfield.byte & t1.bitfield.byte)
2388 && !(t0.bitfield.word & t1.bitfield.word)
2389 && !(t0.bitfield.dword & t1.bitfield.dword)
10c17abd
JB
2390 && !(t0.bitfield.qword & t1.bitfield.qword)
2391 && !(t0.bitfield.xmmword & t1.bitfield.xmmword)
2392 && !(t0.bitfield.ymmword & t1.bitfield.ymmword)
2393 && !(t0.bitfield.zmmword & t1.bitfield.zmmword))
891edac4
L
2394 return 1;
2395
a65babc9 2396 i.error = register_type_mismatch;
891edac4
L
2397
2398 return 0;
40fb9820
L
2399}
2400
4c692bc7
JB
2401static INLINE unsigned int
2402register_number (const reg_entry *r)
2403{
2404 unsigned int nr = r->reg_num;
2405
2406 if (r->reg_flags & RegRex)
2407 nr += 8;
2408
200cbe0f
L
2409 if (r->reg_flags & RegVRex)
2410 nr += 16;
2411
4c692bc7
JB
2412 return nr;
2413}
2414
252b5132 2415static INLINE unsigned int
40fb9820 2416mode_from_disp_size (i386_operand_type t)
252b5132 2417{
b5014f7a 2418 if (t.bitfield.disp8)
40fb9820
L
2419 return 1;
2420 else if (t.bitfield.disp16
2421 || t.bitfield.disp32
2422 || t.bitfield.disp32s)
2423 return 2;
2424 else
2425 return 0;
252b5132
RH
2426}
2427
2428static INLINE int
65879393 2429fits_in_signed_byte (addressT num)
252b5132 2430{
65879393 2431 return num + 0x80 <= 0xff;
47926f60 2432}
252b5132
RH
2433
2434static INLINE int
65879393 2435fits_in_unsigned_byte (addressT num)
252b5132 2436{
65879393 2437 return num <= 0xff;
47926f60 2438}
252b5132
RH
2439
2440static INLINE int
65879393 2441fits_in_unsigned_word (addressT num)
252b5132 2442{
65879393 2443 return num <= 0xffff;
47926f60 2444}
252b5132
RH
2445
2446static INLINE int
65879393 2447fits_in_signed_word (addressT num)
252b5132 2448{
65879393 2449 return num + 0x8000 <= 0xffff;
47926f60 2450}
2a962e6d 2451
3e73aa7c 2452static INLINE int
65879393 2453fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2454{
2455#ifndef BFD64
2456 return 1;
2457#else
65879393 2458 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2459#endif
2460} /* fits_in_signed_long() */
2a962e6d 2461
3e73aa7c 2462static INLINE int
65879393 2463fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2464{
2465#ifndef BFD64
2466 return 1;
2467#else
65879393 2468 return num <= 0xffffffff;
3e73aa7c
JH
2469#endif
2470} /* fits_in_unsigned_long() */
252b5132 2471
43234a1e 2472static INLINE int
b5014f7a 2473fits_in_disp8 (offsetT num)
43234a1e
L
2474{
2475 int shift = i.memshift;
2476 unsigned int mask;
2477
2478 if (shift == -1)
2479 abort ();
2480
2481 mask = (1 << shift) - 1;
2482
2483 /* Return 0 if NUM isn't properly aligned. */
2484 if ((num & mask))
2485 return 0;
2486
2487 /* Check if NUM will fit in 8bit after shift. */
2488 return fits_in_signed_byte (num >> shift);
2489}
2490
a683cc34
SP
2491static INLINE int
2492fits_in_imm4 (offsetT num)
2493{
2494 return (num & 0xf) == num;
2495}
2496
40fb9820 2497static i386_operand_type
e3bb37b5 2498smallest_imm_type (offsetT num)
252b5132 2499{
40fb9820 2500 i386_operand_type t;
7ab9ffdd 2501
0dfbf9d7 2502 operand_type_set (&t, 0);
40fb9820
L
2503 t.bitfield.imm64 = 1;
2504
2505 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2506 {
2507 /* This code is disabled on the 486 because all the Imm1 forms
2508 in the opcode table are slower on the i486. They're the
2509 versions with the implicitly specified single-position
2510 displacement, which has another syntax if you really want to
2511 use that form. */
40fb9820
L
2512 t.bitfield.imm1 = 1;
2513 t.bitfield.imm8 = 1;
2514 t.bitfield.imm8s = 1;
2515 t.bitfield.imm16 = 1;
2516 t.bitfield.imm32 = 1;
2517 t.bitfield.imm32s = 1;
2518 }
2519 else if (fits_in_signed_byte (num))
2520 {
2521 t.bitfield.imm8 = 1;
2522 t.bitfield.imm8s = 1;
2523 t.bitfield.imm16 = 1;
2524 t.bitfield.imm32 = 1;
2525 t.bitfield.imm32s = 1;
2526 }
2527 else if (fits_in_unsigned_byte (num))
2528 {
2529 t.bitfield.imm8 = 1;
2530 t.bitfield.imm16 = 1;
2531 t.bitfield.imm32 = 1;
2532 t.bitfield.imm32s = 1;
2533 }
2534 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2535 {
2536 t.bitfield.imm16 = 1;
2537 t.bitfield.imm32 = 1;
2538 t.bitfield.imm32s = 1;
2539 }
2540 else if (fits_in_signed_long (num))
2541 {
2542 t.bitfield.imm32 = 1;
2543 t.bitfield.imm32s = 1;
2544 }
2545 else if (fits_in_unsigned_long (num))
2546 t.bitfield.imm32 = 1;
2547
2548 return t;
47926f60 2549}
252b5132 2550
847f7ad4 2551static offsetT
e3bb37b5 2552offset_in_range (offsetT val, int size)
847f7ad4 2553{
508866be 2554 addressT mask;
ba2adb93 2555
847f7ad4
AM
2556 switch (size)
2557 {
508866be
L
2558 case 1: mask = ((addressT) 1 << 8) - 1; break;
2559 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 2560 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
2561#ifdef BFD64
2562 case 8: mask = ((addressT) 2 << 63) - 1; break;
2563#endif
47926f60 2564 default: abort ();
847f7ad4
AM
2565 }
2566
47926f60 2567 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
2568 {
2569 char buf1[40], buf2[40];
2570
2571 sprint_value (buf1, val);
2572 sprint_value (buf2, val & mask);
2573 as_warn (_("%s shortened to %s"), buf1, buf2);
2574 }
2575 return val & mask;
2576}
2577
c32fa91d
L
2578enum PREFIX_GROUP
2579{
2580 PREFIX_EXIST = 0,
2581 PREFIX_LOCK,
2582 PREFIX_REP,
04ef582a 2583 PREFIX_DS,
c32fa91d
L
2584 PREFIX_OTHER
2585};
2586
2587/* Returns
2588 a. PREFIX_EXIST if attempting to add a prefix where one from the
2589 same class already exists.
2590 b. PREFIX_LOCK if lock prefix is added.
2591 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2592 d. PREFIX_DS if ds prefix is added.
2593 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2594 */
2595
2596static enum PREFIX_GROUP
e3bb37b5 2597add_prefix (unsigned int prefix)
252b5132 2598{
c32fa91d 2599 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2600 unsigned int q;
252b5132 2601
29b0f896
AM
2602 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2603 && flag_code == CODE_64BIT)
b1905489 2604 {
161a04f6 2605 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2606 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2607 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2608 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2609 ret = PREFIX_EXIST;
b1905489
JB
2610 q = REX_PREFIX;
2611 }
3e73aa7c 2612 else
b1905489
JB
2613 {
2614 switch (prefix)
2615 {
2616 default:
2617 abort ();
2618
b1905489 2619 case DS_PREFIX_OPCODE:
04ef582a
L
2620 ret = PREFIX_DS;
2621 /* Fall through. */
2622 case CS_PREFIX_OPCODE:
b1905489
JB
2623 case ES_PREFIX_OPCODE:
2624 case FS_PREFIX_OPCODE:
2625 case GS_PREFIX_OPCODE:
2626 case SS_PREFIX_OPCODE:
2627 q = SEG_PREFIX;
2628 break;
2629
2630 case REPNE_PREFIX_OPCODE:
2631 case REPE_PREFIX_OPCODE:
c32fa91d
L
2632 q = REP_PREFIX;
2633 ret = PREFIX_REP;
2634 break;
2635
b1905489 2636 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2637 q = LOCK_PREFIX;
2638 ret = PREFIX_LOCK;
b1905489
JB
2639 break;
2640
2641 case FWAIT_OPCODE:
2642 q = WAIT_PREFIX;
2643 break;
2644
2645 case ADDR_PREFIX_OPCODE:
2646 q = ADDR_PREFIX;
2647 break;
2648
2649 case DATA_PREFIX_OPCODE:
2650 q = DATA_PREFIX;
2651 break;
2652 }
2653 if (i.prefix[q] != 0)
c32fa91d 2654 ret = PREFIX_EXIST;
b1905489 2655 }
252b5132 2656
b1905489 2657 if (ret)
252b5132 2658 {
b1905489
JB
2659 if (!i.prefix[q])
2660 ++i.prefixes;
2661 i.prefix[q] |= prefix;
252b5132 2662 }
b1905489
JB
2663 else
2664 as_bad (_("same type of prefix used twice"));
252b5132 2665
252b5132
RH
2666 return ret;
2667}
2668
2669static void
78f12dd3 2670update_code_flag (int value, int check)
eecb386c 2671{
78f12dd3
L
2672 PRINTF_LIKE ((*as_error));
2673
1e9cc1c2 2674 flag_code = (enum flag_code) value;
40fb9820
L
2675 if (flag_code == CODE_64BIT)
2676 {
2677 cpu_arch_flags.bitfield.cpu64 = 1;
2678 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
2679 }
2680 else
2681 {
2682 cpu_arch_flags.bitfield.cpu64 = 0;
2683 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
2684 }
2685 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c 2686 {
78f12dd3
L
2687 if (check)
2688 as_error = as_fatal;
2689 else
2690 as_error = as_bad;
2691 (*as_error) (_("64bit mode not supported on `%s'."),
2692 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2693 }
40fb9820 2694 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c 2695 {
78f12dd3
L
2696 if (check)
2697 as_error = as_fatal;
2698 else
2699 as_error = as_bad;
2700 (*as_error) (_("32bit mode not supported on `%s'."),
2701 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2702 }
eecb386c
AM
2703 stackop_size = '\0';
2704}
2705
78f12dd3
L
2706static void
2707set_code_flag (int value)
2708{
2709 update_code_flag (value, 0);
2710}
2711
eecb386c 2712static void
e3bb37b5 2713set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2714{
1e9cc1c2 2715 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2716 if (flag_code != CODE_16BIT)
2717 abort ();
2718 cpu_arch_flags.bitfield.cpu64 = 0;
2719 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 2720 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2721}
2722
2723static void
e3bb37b5 2724set_intel_syntax (int syntax_flag)
252b5132
RH
2725{
2726 /* Find out if register prefixing is specified. */
2727 int ask_naked_reg = 0;
2728
2729 SKIP_WHITESPACE ();
29b0f896 2730 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2731 {
d02603dc
NC
2732 char *string;
2733 int e = get_symbol_name (&string);
252b5132 2734
47926f60 2735 if (strcmp (string, "prefix") == 0)
252b5132 2736 ask_naked_reg = 1;
47926f60 2737 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2738 ask_naked_reg = -1;
2739 else
d0b47220 2740 as_bad (_("bad argument to syntax directive."));
d02603dc 2741 (void) restore_line_pointer (e);
252b5132
RH
2742 }
2743 demand_empty_rest_of_line ();
c3332e24 2744
252b5132
RH
2745 intel_syntax = syntax_flag;
2746
2747 if (ask_naked_reg == 0)
f86103b7
AM
2748 allow_naked_reg = (intel_syntax
2749 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2750 else
2751 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2752
ee86248c 2753 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
7ab9ffdd 2754
e4a3b5a4 2755 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 2756 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 2757 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
2758}
2759
1efbbeb4
L
2760static void
2761set_intel_mnemonic (int mnemonic_flag)
2762{
e1d4d893 2763 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2764}
2765
db51cc60
L
2766static void
2767set_allow_index_reg (int flag)
2768{
2769 allow_index_reg = flag;
2770}
2771
cb19c032 2772static void
7bab8ab5 2773set_check (int what)
cb19c032 2774{
7bab8ab5
JB
2775 enum check_kind *kind;
2776 const char *str;
2777
2778 if (what)
2779 {
2780 kind = &operand_check;
2781 str = "operand";
2782 }
2783 else
2784 {
2785 kind = &sse_check;
2786 str = "sse";
2787 }
2788
cb19c032
L
2789 SKIP_WHITESPACE ();
2790
2791 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2792 {
d02603dc
NC
2793 char *string;
2794 int e = get_symbol_name (&string);
cb19c032
L
2795
2796 if (strcmp (string, "none") == 0)
7bab8ab5 2797 *kind = check_none;
cb19c032 2798 else if (strcmp (string, "warning") == 0)
7bab8ab5 2799 *kind = check_warning;
cb19c032 2800 else if (strcmp (string, "error") == 0)
7bab8ab5 2801 *kind = check_error;
cb19c032 2802 else
7bab8ab5 2803 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2804 (void) restore_line_pointer (e);
cb19c032
L
2805 }
2806 else
7bab8ab5 2807 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2808
2809 demand_empty_rest_of_line ();
2810}
2811
8a9036a4
L
2812static void
2813check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2814 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2815{
2816#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2817 static const char *arch;
2818
2819 /* Intel LIOM is only supported on ELF. */
2820 if (!IS_ELF)
2821 return;
2822
2823 if (!arch)
2824 {
2825 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2826 use default_arch. */
2827 arch = cpu_arch_name;
2828 if (!arch)
2829 arch = default_arch;
2830 }
2831
81486035
L
2832 /* If we are targeting Intel MCU, we must enable it. */
2833 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_IAMCU
2834 || new_flag.bitfield.cpuiamcu)
2835 return;
2836
3632d14b 2837 /* If we are targeting Intel L1OM, we must enable it. */
8a9036a4 2838 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_L1OM
1e9cc1c2 2839 || new_flag.bitfield.cpul1om)
8a9036a4 2840 return;
76ba9986 2841
7a9068fe
L
2842 /* If we are targeting Intel K1OM, we must enable it. */
2843 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_K1OM
2844 || new_flag.bitfield.cpuk1om)
2845 return;
2846
8a9036a4
L
2847 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2848#endif
2849}
2850
e413e4e9 2851static void
e3bb37b5 2852set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2853{
47926f60 2854 SKIP_WHITESPACE ();
e413e4e9 2855
29b0f896 2856 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9 2857 {
d02603dc
NC
2858 char *string;
2859 int e = get_symbol_name (&string);
91d6fa6a 2860 unsigned int j;
40fb9820 2861 i386_cpu_flags flags;
e413e4e9 2862
91d6fa6a 2863 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
e413e4e9 2864 {
91d6fa6a 2865 if (strcmp (string, cpu_arch[j].name) == 0)
e413e4e9 2866 {
91d6fa6a 2867 check_cpu_arch_compatible (string, cpu_arch[j].flags);
8a9036a4 2868
5c6af06e
JB
2869 if (*string != '.')
2870 {
91d6fa6a 2871 cpu_arch_name = cpu_arch[j].name;
5c6af06e 2872 cpu_sub_arch_name = NULL;
91d6fa6a 2873 cpu_arch_flags = cpu_arch[j].flags;
40fb9820
L
2874 if (flag_code == CODE_64BIT)
2875 {
2876 cpu_arch_flags.bitfield.cpu64 = 1;
2877 cpu_arch_flags.bitfield.cpuno64 = 0;
2878 }
2879 else
2880 {
2881 cpu_arch_flags.bitfield.cpu64 = 0;
2882 cpu_arch_flags.bitfield.cpuno64 = 1;
2883 }
91d6fa6a
NC
2884 cpu_arch_isa = cpu_arch[j].type;
2885 cpu_arch_isa_flags = cpu_arch[j].flags;
ccc9c027
L
2886 if (!cpu_arch_tune_set)
2887 {
2888 cpu_arch_tune = cpu_arch_isa;
2889 cpu_arch_tune_flags = cpu_arch_isa_flags;
2890 }
5c6af06e
JB
2891 break;
2892 }
40fb9820 2893
293f5f65
L
2894 flags = cpu_flags_or (cpu_arch_flags,
2895 cpu_arch[j].flags);
81486035 2896
5b64d091 2897 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
5c6af06e 2898 {
6305a203
L
2899 if (cpu_sub_arch_name)
2900 {
2901 char *name = cpu_sub_arch_name;
2902 cpu_sub_arch_name = concat (name,
91d6fa6a 2903 cpu_arch[j].name,
1bf57e9f 2904 (const char *) NULL);
6305a203
L
2905 free (name);
2906 }
2907 else
91d6fa6a 2908 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
40fb9820 2909 cpu_arch_flags = flags;
a586129e 2910 cpu_arch_isa_flags = flags;
5c6af06e 2911 }
0089dace
L
2912 else
2913 cpu_arch_isa_flags
2914 = cpu_flags_or (cpu_arch_isa_flags,
2915 cpu_arch[j].flags);
d02603dc 2916 (void) restore_line_pointer (e);
5c6af06e
JB
2917 demand_empty_rest_of_line ();
2918 return;
e413e4e9
AM
2919 }
2920 }
293f5f65
L
2921
2922 if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
2923 {
33eaf5de 2924 /* Disable an ISA extension. */
293f5f65
L
2925 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
2926 if (strcmp (string + 1, cpu_noarch [j].name) == 0)
2927 {
2928 flags = cpu_flags_and_not (cpu_arch_flags,
2929 cpu_noarch[j].flags);
2930 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2931 {
2932 if (cpu_sub_arch_name)
2933 {
2934 char *name = cpu_sub_arch_name;
2935 cpu_sub_arch_name = concat (name, string,
2936 (const char *) NULL);
2937 free (name);
2938 }
2939 else
2940 cpu_sub_arch_name = xstrdup (string);
2941 cpu_arch_flags = flags;
2942 cpu_arch_isa_flags = flags;
2943 }
2944 (void) restore_line_pointer (e);
2945 demand_empty_rest_of_line ();
2946 return;
2947 }
2948
2949 j = ARRAY_SIZE (cpu_arch);
2950 }
2951
91d6fa6a 2952 if (j >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
2953 as_bad (_("no such architecture: `%s'"), string);
2954
2955 *input_line_pointer = e;
2956 }
2957 else
2958 as_bad (_("missing cpu architecture"));
2959
fddf5b5b
AM
2960 no_cond_jump_promotion = 0;
2961 if (*input_line_pointer == ','
29b0f896 2962 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 2963 {
d02603dc
NC
2964 char *string;
2965 char e;
2966
2967 ++input_line_pointer;
2968 e = get_symbol_name (&string);
fddf5b5b
AM
2969
2970 if (strcmp (string, "nojumps") == 0)
2971 no_cond_jump_promotion = 1;
2972 else if (strcmp (string, "jumps") == 0)
2973 ;
2974 else
2975 as_bad (_("no such architecture modifier: `%s'"), string);
2976
d02603dc 2977 (void) restore_line_pointer (e);
fddf5b5b
AM
2978 }
2979
e413e4e9
AM
2980 demand_empty_rest_of_line ();
2981}
2982
8a9036a4
L
2983enum bfd_architecture
2984i386_arch (void)
2985{
3632d14b 2986 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4
L
2987 {
2988 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2989 || flag_code != CODE_64BIT)
2990 as_fatal (_("Intel L1OM is 64bit ELF only"));
2991 return bfd_arch_l1om;
2992 }
7a9068fe
L
2993 else if (cpu_arch_isa == PROCESSOR_K1OM)
2994 {
2995 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2996 || flag_code != CODE_64BIT)
2997 as_fatal (_("Intel K1OM is 64bit ELF only"));
2998 return bfd_arch_k1om;
2999 }
81486035
L
3000 else if (cpu_arch_isa == PROCESSOR_IAMCU)
3001 {
3002 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3003 || flag_code == CODE_64BIT)
3004 as_fatal (_("Intel MCU is 32bit ELF only"));
3005 return bfd_arch_iamcu;
3006 }
8a9036a4
L
3007 else
3008 return bfd_arch_i386;
3009}
3010
b9d79e03 3011unsigned long
7016a5d5 3012i386_mach (void)
b9d79e03 3013{
351f65ca 3014 if (!strncmp (default_arch, "x86_64", 6))
8a9036a4 3015 {
3632d14b 3016 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 3017 {
351f65ca
L
3018 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3019 || default_arch[6] != '\0')
8a9036a4
L
3020 as_fatal (_("Intel L1OM is 64bit ELF only"));
3021 return bfd_mach_l1om;
3022 }
7a9068fe
L
3023 else if (cpu_arch_isa == PROCESSOR_K1OM)
3024 {
3025 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3026 || default_arch[6] != '\0')
3027 as_fatal (_("Intel K1OM is 64bit ELF only"));
3028 return bfd_mach_k1om;
3029 }
351f65ca 3030 else if (default_arch[6] == '\0')
8a9036a4 3031 return bfd_mach_x86_64;
351f65ca
L
3032 else
3033 return bfd_mach_x64_32;
8a9036a4 3034 }
5197d474
L
3035 else if (!strcmp (default_arch, "i386")
3036 || !strcmp (default_arch, "iamcu"))
81486035
L
3037 {
3038 if (cpu_arch_isa == PROCESSOR_IAMCU)
3039 {
3040 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
3041 as_fatal (_("Intel MCU is 32bit ELF only"));
3042 return bfd_mach_i386_iamcu;
3043 }
3044 else
3045 return bfd_mach_i386_i386;
3046 }
b9d79e03 3047 else
2b5d6a91 3048 as_fatal (_("unknown architecture"));
b9d79e03 3049}
b9d79e03 3050\f
252b5132 3051void
7016a5d5 3052md_begin (void)
252b5132 3053{
86fa6981
L
3054 /* Support pseudo prefixes like {disp32}. */
3055 lex_type ['{'] = LEX_BEGIN_NAME;
3056
47926f60 3057 /* Initialize op_hash hash table. */
629310ab 3058 op_hash = str_htab_create ();
252b5132
RH
3059
3060 {
d3ce72d0 3061 const insn_template *optab;
29b0f896 3062 templates *core_optab;
252b5132 3063
47926f60
KH
3064 /* Setup for loop. */
3065 optab = i386_optab;
add39d23 3066 core_optab = XNEW (templates);
252b5132
RH
3067 core_optab->start = optab;
3068
3069 while (1)
3070 {
3071 ++optab;
3072 if (optab->name == NULL
3073 || strcmp (optab->name, (optab - 1)->name) != 0)
3074 {
3075 /* different name --> ship out current template list;
47926f60 3076 add to hash table; & begin anew. */
252b5132 3077 core_optab->end = optab;
fe0e921f
AM
3078 if (str_hash_insert (op_hash, (optab - 1)->name, core_optab, 0))
3079 as_fatal (_("duplicate %s"), (optab - 1)->name);
3080
252b5132
RH
3081 if (optab->name == NULL)
3082 break;
add39d23 3083 core_optab = XNEW (templates);
252b5132
RH
3084 core_optab->start = optab;
3085 }
3086 }
3087 }
3088
47926f60 3089 /* Initialize reg_hash hash table. */
629310ab 3090 reg_hash = str_htab_create ();
252b5132 3091 {
29b0f896 3092 const reg_entry *regtab;
c3fe08fa 3093 unsigned int regtab_size = i386_regtab_size;
252b5132 3094
c3fe08fa 3095 for (regtab = i386_regtab; regtab_size--; regtab++)
fe0e921f
AM
3096 if (str_hash_insert (reg_hash, regtab->reg_name, regtab, 0) != NULL)
3097 as_fatal (_("duplicate %s"), regtab->reg_name);
252b5132
RH
3098 }
3099
47926f60 3100 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 3101 {
29b0f896
AM
3102 int c;
3103 char *p;
252b5132
RH
3104
3105 for (c = 0; c < 256; c++)
3106 {
3882b010 3107 if (ISDIGIT (c))
252b5132
RH
3108 {
3109 digit_chars[c] = c;
3110 mnemonic_chars[c] = c;
3111 register_chars[c] = c;
3112 operand_chars[c] = c;
3113 }
3882b010 3114 else if (ISLOWER (c))
252b5132
RH
3115 {
3116 mnemonic_chars[c] = c;
3117 register_chars[c] = c;
3118 operand_chars[c] = c;
3119 }
3882b010 3120 else if (ISUPPER (c))
252b5132 3121 {
3882b010 3122 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
3123 register_chars[c] = mnemonic_chars[c];
3124 operand_chars[c] = c;
3125 }
43234a1e 3126 else if (c == '{' || c == '}')
86fa6981
L
3127 {
3128 mnemonic_chars[c] = c;
3129 operand_chars[c] = c;
3130 }
b3983e5f
JB
3131#ifdef SVR4_COMMENT_CHARS
3132 else if (c == '\\' && strchr (i386_comment_chars, '/'))
3133 operand_chars[c] = c;
3134#endif
252b5132 3135
3882b010 3136 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
3137 identifier_chars[c] = c;
3138 else if (c >= 128)
3139 {
3140 identifier_chars[c] = c;
3141 operand_chars[c] = c;
3142 }
3143 }
3144
3145#ifdef LEX_AT
3146 identifier_chars['@'] = '@';
32137342
NC
3147#endif
3148#ifdef LEX_QM
3149 identifier_chars['?'] = '?';
3150 operand_chars['?'] = '?';
252b5132 3151#endif
252b5132 3152 digit_chars['-'] = '-';
c0f3af97 3153 mnemonic_chars['_'] = '_';
791fe849 3154 mnemonic_chars['-'] = '-';
0003779b 3155 mnemonic_chars['.'] = '.';
252b5132
RH
3156 identifier_chars['_'] = '_';
3157 identifier_chars['.'] = '.';
3158
3159 for (p = operand_special_chars; *p != '\0'; p++)
3160 operand_chars[(unsigned char) *p] = *p;
3161 }
3162
a4447b93
RH
3163 if (flag_code == CODE_64BIT)
3164 {
ca19b261
KT
3165#if defined (OBJ_COFF) && defined (TE_PE)
3166 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
3167 ? 32 : 16);
3168#else
a4447b93 3169 x86_dwarf2_return_column = 16;
ca19b261 3170#endif
61ff971f 3171 x86_cie_data_alignment = -8;
a4447b93
RH
3172 }
3173 else
3174 {
3175 x86_dwarf2_return_column = 8;
3176 x86_cie_data_alignment = -4;
3177 }
e379e5f3
L
3178
3179 /* NB: FUSED_JCC_PADDING frag must have sufficient room so that it
3180 can be turned into BRANCH_PREFIX frag. */
3181 if (align_branch_prefix_size > MAX_FUSED_JCC_PADDING_SIZE)
3182 abort ();
252b5132
RH
3183}
3184
3185void
e3bb37b5 3186i386_print_statistics (FILE *file)
252b5132 3187{
629310ab
ML
3188 htab_print_statistics (file, "i386 opcode", op_hash);
3189 htab_print_statistics (file, "i386 register", reg_hash);
252b5132
RH
3190}
3191\f
252b5132
RH
3192#ifdef DEBUG386
3193
ce8a8b2f 3194/* Debugging routines for md_assemble. */
d3ce72d0 3195static void pte (insn_template *);
40fb9820 3196static void pt (i386_operand_type);
e3bb37b5
L
3197static void pe (expressionS *);
3198static void ps (symbolS *);
252b5132
RH
3199
3200static void
2c703856 3201pi (const char *line, i386_insn *x)
252b5132 3202{
09137c09 3203 unsigned int j;
252b5132
RH
3204
3205 fprintf (stdout, "%s: template ", line);
3206 pte (&x->tm);
09f131f2
JH
3207 fprintf (stdout, " address: base %s index %s scale %x\n",
3208 x->base_reg ? x->base_reg->reg_name : "none",
3209 x->index_reg ? x->index_reg->reg_name : "none",
3210 x->log2_scale_factor);
3211 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 3212 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
3213 fprintf (stdout, " sib: base %x index %x scale %x\n",
3214 x->sib.base, x->sib.index, x->sib.scale);
3215 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
3216 (x->rex & REX_W) != 0,
3217 (x->rex & REX_R) != 0,
3218 (x->rex & REX_X) != 0,
3219 (x->rex & REX_B) != 0);
09137c09 3220 for (j = 0; j < x->operands; j++)
252b5132 3221 {
09137c09
SP
3222 fprintf (stdout, " #%d: ", j + 1);
3223 pt (x->types[j]);
252b5132 3224 fprintf (stdout, "\n");
bab6aec1 3225 if (x->types[j].bitfield.class == Reg
3528c362
JB
3226 || x->types[j].bitfield.class == RegMMX
3227 || x->types[j].bitfield.class == RegSIMD
dd6b8a0b 3228 || x->types[j].bitfield.class == RegMask
00cee14f 3229 || x->types[j].bitfield.class == SReg
4a5c67ed
JB
3230 || x->types[j].bitfield.class == RegCR
3231 || x->types[j].bitfield.class == RegDR
dd6b8a0b
JB
3232 || x->types[j].bitfield.class == RegTR
3233 || x->types[j].bitfield.class == RegBND)
09137c09
SP
3234 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
3235 if (operand_type_check (x->types[j], imm))
3236 pe (x->op[j].imms);
3237 if (operand_type_check (x->types[j], disp))
3238 pe (x->op[j].disps);
252b5132
RH
3239 }
3240}
3241
3242static void
d3ce72d0 3243pte (insn_template *t)
252b5132 3244{
b933fa4b 3245 static const unsigned char opc_pfx[] = { 0, 0x66, 0xf3, 0xf2 };
441f6aca
JB
3246 static const char *const opc_spc[] = {
3247 NULL, "0f", "0f38", "0f3a", NULL, NULL, NULL, NULL,
3248 "XOP08", "XOP09", "XOP0A",
3249 };
09137c09 3250 unsigned int j;
441f6aca 3251
252b5132 3252 fprintf (stdout, " %d operands ", t->operands);
441f6aca
JB
3253 if (opc_pfx[t->opcode_modifier.opcodeprefix])
3254 fprintf (stdout, "pfx %x ", opc_pfx[t->opcode_modifier.opcodeprefix]);
3255 if (opc_spc[t->opcode_modifier.opcodespace])
3256 fprintf (stdout, "space %s ", opc_spc[t->opcode_modifier.opcodespace]);
47926f60 3257 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
3258 if (t->extension_opcode != None)
3259 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 3260 if (t->opcode_modifier.d)
252b5132 3261 fprintf (stdout, "D");
40fb9820 3262 if (t->opcode_modifier.w)
252b5132
RH
3263 fprintf (stdout, "W");
3264 fprintf (stdout, "\n");
09137c09 3265 for (j = 0; j < t->operands; j++)
252b5132 3266 {
09137c09
SP
3267 fprintf (stdout, " #%d type ", j + 1);
3268 pt (t->operand_types[j]);
252b5132
RH
3269 fprintf (stdout, "\n");
3270 }
3271}
3272
3273static void
e3bb37b5 3274pe (expressionS *e)
252b5132 3275{
24eab124 3276 fprintf (stdout, " operation %d\n", e->X_op);
b77ad1d4
AM
3277 fprintf (stdout, " add_number %ld (%lx)\n",
3278 (long) e->X_add_number, (long) e->X_add_number);
252b5132
RH
3279 if (e->X_add_symbol)
3280 {
3281 fprintf (stdout, " add_symbol ");
3282 ps (e->X_add_symbol);
3283 fprintf (stdout, "\n");
3284 }
3285 if (e->X_op_symbol)
3286 {
3287 fprintf (stdout, " op_symbol ");
3288 ps (e->X_op_symbol);
3289 fprintf (stdout, "\n");
3290 }
3291}
3292
3293static void
e3bb37b5 3294ps (symbolS *s)
252b5132
RH
3295{
3296 fprintf (stdout, "%s type %s%s",
3297 S_GET_NAME (s),
3298 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3299 segment_name (S_GET_SEGMENT (s)));
3300}
3301
7b81dfbb 3302static struct type_name
252b5132 3303 {
40fb9820
L
3304 i386_operand_type mask;
3305 const char *name;
252b5132 3306 }
7b81dfbb 3307const type_names[] =
252b5132 3308{
40fb9820
L
3309 { OPERAND_TYPE_REG8, "r8" },
3310 { OPERAND_TYPE_REG16, "r16" },
3311 { OPERAND_TYPE_REG32, "r32" },
3312 { OPERAND_TYPE_REG64, "r64" },
2c703856
JB
3313 { OPERAND_TYPE_ACC8, "acc8" },
3314 { OPERAND_TYPE_ACC16, "acc16" },
3315 { OPERAND_TYPE_ACC32, "acc32" },
3316 { OPERAND_TYPE_ACC64, "acc64" },
40fb9820
L
3317 { OPERAND_TYPE_IMM8, "i8" },
3318 { OPERAND_TYPE_IMM8, "i8s" },
3319 { OPERAND_TYPE_IMM16, "i16" },
3320 { OPERAND_TYPE_IMM32, "i32" },
3321 { OPERAND_TYPE_IMM32S, "i32s" },
3322 { OPERAND_TYPE_IMM64, "i64" },
3323 { OPERAND_TYPE_IMM1, "i1" },
3324 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
3325 { OPERAND_TYPE_DISP8, "d8" },
3326 { OPERAND_TYPE_DISP16, "d16" },
3327 { OPERAND_TYPE_DISP32, "d32" },
3328 { OPERAND_TYPE_DISP32S, "d32s" },
3329 { OPERAND_TYPE_DISP64, "d64" },
3330 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
3331 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
3332 { OPERAND_TYPE_CONTROL, "control reg" },
3333 { OPERAND_TYPE_TEST, "test reg" },
3334 { OPERAND_TYPE_DEBUG, "debug reg" },
3335 { OPERAND_TYPE_FLOATREG, "FReg" },
3336 { OPERAND_TYPE_FLOATACC, "FAcc" },
21df382b 3337 { OPERAND_TYPE_SREG, "SReg" },
40fb9820
L
3338 { OPERAND_TYPE_REGMMX, "rMMX" },
3339 { OPERAND_TYPE_REGXMM, "rXMM" },
0349dc08 3340 { OPERAND_TYPE_REGYMM, "rYMM" },
43234a1e 3341 { OPERAND_TYPE_REGZMM, "rZMM" },
260cd341 3342 { OPERAND_TYPE_REGTMM, "rTMM" },
43234a1e 3343 { OPERAND_TYPE_REGMASK, "Mask reg" },
252b5132
RH
3344};
3345
3346static void
40fb9820 3347pt (i386_operand_type t)
252b5132 3348{
40fb9820 3349 unsigned int j;
c6fb90c8 3350 i386_operand_type a;
252b5132 3351
40fb9820 3352 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3353 {
3354 a = operand_type_and (t, type_names[j].mask);
2c703856 3355 if (operand_type_equal (&a, &type_names[j].mask))
c6fb90c8
L
3356 fprintf (stdout, "%s, ", type_names[j].name);
3357 }
252b5132
RH
3358 fflush (stdout);
3359}
3360
3361#endif /* DEBUG386 */
3362\f
252b5132 3363static bfd_reloc_code_real_type
3956db08 3364reloc (unsigned int size,
64e74474
AM
3365 int pcrel,
3366 int sign,
3367 bfd_reloc_code_real_type other)
252b5132 3368{
47926f60 3369 if (other != NO_RELOC)
3956db08 3370 {
91d6fa6a 3371 reloc_howto_type *rel;
3956db08
JB
3372
3373 if (size == 8)
3374 switch (other)
3375 {
64e74474
AM
3376 case BFD_RELOC_X86_64_GOT32:
3377 return BFD_RELOC_X86_64_GOT64;
3378 break;
553d1284
L
3379 case BFD_RELOC_X86_64_GOTPLT64:
3380 return BFD_RELOC_X86_64_GOTPLT64;
3381 break;
64e74474
AM
3382 case BFD_RELOC_X86_64_PLTOFF64:
3383 return BFD_RELOC_X86_64_PLTOFF64;
3384 break;
3385 case BFD_RELOC_X86_64_GOTPC32:
3386 other = BFD_RELOC_X86_64_GOTPC64;
3387 break;
3388 case BFD_RELOC_X86_64_GOTPCREL:
3389 other = BFD_RELOC_X86_64_GOTPCREL64;
3390 break;
3391 case BFD_RELOC_X86_64_TPOFF32:
3392 other = BFD_RELOC_X86_64_TPOFF64;
3393 break;
3394 case BFD_RELOC_X86_64_DTPOFF32:
3395 other = BFD_RELOC_X86_64_DTPOFF64;
3396 break;
3397 default:
3398 break;
3956db08 3399 }
e05278af 3400
8ce3d284 3401#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3402 if (other == BFD_RELOC_SIZE32)
3403 {
3404 if (size == 8)
1ab668bf 3405 other = BFD_RELOC_SIZE64;
8fd4256d 3406 if (pcrel)
1ab668bf
AM
3407 {
3408 as_bad (_("there are no pc-relative size relocations"));
3409 return NO_RELOC;
3410 }
8fd4256d 3411 }
8ce3d284 3412#endif
8fd4256d 3413
e05278af 3414 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3415 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3416 sign = -1;
3417
91d6fa6a
NC
3418 rel = bfd_reloc_type_lookup (stdoutput, other);
3419 if (!rel)
3956db08 3420 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3421 else if (size != bfd_get_reloc_size (rel))
3956db08 3422 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3423 bfd_get_reloc_size (rel),
3956db08 3424 size);
91d6fa6a 3425 else if (pcrel && !rel->pc_relative)
3956db08 3426 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3427 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3428 && !sign)
91d6fa6a 3429 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3430 && sign > 0))
3956db08
JB
3431 as_bad (_("relocated field and relocation type differ in signedness"));
3432 else
3433 return other;
3434 return NO_RELOC;
3435 }
252b5132
RH
3436
3437 if (pcrel)
3438 {
3e73aa7c 3439 if (!sign)
3956db08 3440 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3441 switch (size)
3442 {
3443 case 1: return BFD_RELOC_8_PCREL;
3444 case 2: return BFD_RELOC_16_PCREL;
d258b828 3445 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3446 case 8: return BFD_RELOC_64_PCREL;
252b5132 3447 }
3956db08 3448 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3449 }
3450 else
3451 {
3956db08 3452 if (sign > 0)
e5cb08ac 3453 switch (size)
3e73aa7c
JH
3454 {
3455 case 4: return BFD_RELOC_X86_64_32S;
3456 }
3457 else
3458 switch (size)
3459 {
3460 case 1: return BFD_RELOC_8;
3461 case 2: return BFD_RELOC_16;
3462 case 4: return BFD_RELOC_32;
3463 case 8: return BFD_RELOC_64;
3464 }
3956db08
JB
3465 as_bad (_("cannot do %s %u byte relocation"),
3466 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3467 }
3468
0cc9e1d3 3469 return NO_RELOC;
252b5132
RH
3470}
3471
47926f60
KH
3472/* Here we decide which fixups can be adjusted to make them relative to
3473 the beginning of the section instead of the symbol. Basically we need
3474 to make sure that the dynamic relocations are done correctly, so in
3475 some cases we force the original symbol to be used. */
3476
252b5132 3477int
e3bb37b5 3478tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3479{
6d249963 3480#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3481 if (!IS_ELF)
31312f95
AM
3482 return 1;
3483
a161fe53
AM
3484 /* Don't adjust pc-relative references to merge sections in 64-bit
3485 mode. */
3486 if (use_rela_relocations
3487 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3488 && fixP->fx_pcrel)
252b5132 3489 return 0;
31312f95 3490
8d01d9a9
AJ
3491 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3492 and changed later by validate_fix. */
3493 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3494 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3495 return 0;
3496
8fd4256d
L
3497 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3498 for size relocations. */
3499 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3500 || fixP->fx_r_type == BFD_RELOC_SIZE64
3501 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132 3502 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3503 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3504 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3505 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3506 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3507 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3508 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3509 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3510 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3511 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3512 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3513 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c 3514 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3515 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3516 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3517 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3518 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3519 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3520 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3521 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3522 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3523 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3524 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3525 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3526 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3527 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3528 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3529 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3530 return 0;
31312f95 3531#endif
252b5132
RH
3532 return 1;
3533}
252b5132 3534
b4cac588 3535static int
e3bb37b5 3536intel_float_operand (const char *mnemonic)
252b5132 3537{
9306ca4a
JB
3538 /* Note that the value returned is meaningful only for opcodes with (memory)
3539 operands, hence the code here is free to improperly handle opcodes that
3540 have no operands (for better performance and smaller code). */
3541
3542 if (mnemonic[0] != 'f')
3543 return 0; /* non-math */
3544
3545 switch (mnemonic[1])
3546 {
3547 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3548 the fs segment override prefix not currently handled because no
3549 call path can make opcodes without operands get here */
3550 case 'i':
3551 return 2 /* integer op */;
3552 case 'l':
3553 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3554 return 3; /* fldcw/fldenv */
3555 break;
3556 case 'n':
3557 if (mnemonic[2] != 'o' /* fnop */)
3558 return 3; /* non-waiting control op */
3559 break;
3560 case 'r':
3561 if (mnemonic[2] == 's')
3562 return 3; /* frstor/frstpm */
3563 break;
3564 case 's':
3565 if (mnemonic[2] == 'a')
3566 return 3; /* fsave */
3567 if (mnemonic[2] == 't')
3568 {
3569 switch (mnemonic[3])
3570 {
3571 case 'c': /* fstcw */
3572 case 'd': /* fstdw */
3573 case 'e': /* fstenv */
3574 case 's': /* fsts[gw] */
3575 return 3;
3576 }
3577 }
3578 break;
3579 case 'x':
3580 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3581 return 0; /* fxsave/fxrstor are not really math ops */
3582 break;
3583 }
252b5132 3584
9306ca4a 3585 return 1;
252b5132
RH
3586}
3587
9a182d04
JB
3588static INLINE void
3589install_template (const insn_template *t)
3590{
3591 unsigned int l;
3592
3593 i.tm = *t;
3594
3595 /* Note that for pseudo prefixes this produces a length of 1. But for them
3596 the length isn't interesting at all. */
3597 for (l = 1; l < 4; ++l)
3598 if (!(t->base_opcode >> (8 * l)))
3599 break;
3600
3601 i.opcode_length = l;
3602}
3603
c0f3af97
L
3604/* Build the VEX prefix. */
3605
3606static void
d3ce72d0 3607build_vex_prefix (const insn_template *t)
c0f3af97
L
3608{
3609 unsigned int register_specifier;
c0f3af97 3610 unsigned int vector_length;
03751133 3611 unsigned int w;
c0f3af97
L
3612
3613 /* Check register specifier. */
3614 if (i.vex.register_specifier)
43234a1e
L
3615 {
3616 register_specifier =
3617 ~register_number (i.vex.register_specifier) & 0xf;
3618 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3619 }
c0f3af97
L
3620 else
3621 register_specifier = 0xf;
3622
79f0fa25
L
3623 /* Use 2-byte VEX prefix by swapping destination and source operand
3624 if there are more than 1 register operand. */
3625 if (i.reg_operands > 1
3626 && i.vec_encoding != vex_encoding_vex3
86fa6981 3627 && i.dir_encoding == dir_encoding_default
fa99fab2 3628 && i.operands == i.reg_operands
dbbc8b7e 3629 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
441f6aca 3630 && i.tm.opcode_modifier.opcodespace == SPACE_0F
dbbc8b7e 3631 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3632 && i.rex == REX_B)
3633 {
3634 unsigned int xchg = i.operands - 1;
3635 union i386_op temp_op;
3636 i386_operand_type temp_type;
3637
3638 temp_type = i.types[xchg];
3639 i.types[xchg] = i.types[0];
3640 i.types[0] = temp_type;
3641 temp_op = i.op[xchg];
3642 i.op[xchg] = i.op[0];
3643 i.op[0] = temp_op;
3644
9c2799c2 3645 gas_assert (i.rm.mode == 3);
fa99fab2
L
3646
3647 i.rex = REX_R;
3648 xchg = i.rm.regmem;
3649 i.rm.regmem = i.rm.reg;
3650 i.rm.reg = xchg;
3651
dbbc8b7e
JB
3652 if (i.tm.opcode_modifier.d)
3653 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
3654 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
3655 else /* Use the next insn. */
9a182d04 3656 install_template (&t[1]);
fa99fab2
L
3657 }
3658
79dec6b7
JB
3659 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3660 are no memory operands and at least 3 register ones. */
3661 if (i.reg_operands >= 3
3662 && i.vec_encoding != vex_encoding_vex3
3663 && i.reg_operands == i.operands - i.imm_operands
3664 && i.tm.opcode_modifier.vex
3665 && i.tm.opcode_modifier.commutative
3666 && (i.tm.opcode_modifier.sse2avx || optimize > 1)
3667 && i.rex == REX_B
3668 && i.vex.register_specifier
3669 && !(i.vex.register_specifier->reg_flags & RegRex))
3670 {
3671 unsigned int xchg = i.operands - i.reg_operands;
3672 union i386_op temp_op;
3673 i386_operand_type temp_type;
3674
441f6aca 3675 gas_assert (i.tm.opcode_modifier.opcodespace == SPACE_0F);
79dec6b7
JB
3676 gas_assert (!i.tm.opcode_modifier.sae);
3677 gas_assert (operand_type_equal (&i.types[i.operands - 2],
3678 &i.types[i.operands - 3]));
3679 gas_assert (i.rm.mode == 3);
3680
3681 temp_type = i.types[xchg];
3682 i.types[xchg] = i.types[xchg + 1];
3683 i.types[xchg + 1] = temp_type;
3684 temp_op = i.op[xchg];
3685 i.op[xchg] = i.op[xchg + 1];
3686 i.op[xchg + 1] = temp_op;
3687
3688 i.rex = 0;
3689 xchg = i.rm.regmem | 8;
3690 i.rm.regmem = ~register_specifier & 0xf;
3691 gas_assert (!(i.rm.regmem & 8));
3692 i.vex.register_specifier += xchg - i.rm.regmem;
3693 register_specifier = ~xchg & 0xf;
3694 }
3695
539f890d
L
3696 if (i.tm.opcode_modifier.vex == VEXScalar)
3697 vector_length = avxscalar;
10c17abd
JB
3698 else if (i.tm.opcode_modifier.vex == VEX256)
3699 vector_length = 1;
539f890d 3700 else
10c17abd 3701 {
56522fc5 3702 unsigned int op;
10c17abd 3703
c7213af9
L
3704 /* Determine vector length from the last multi-length vector
3705 operand. */
10c17abd 3706 vector_length = 0;
56522fc5 3707 for (op = t->operands; op--;)
10c17abd
JB
3708 if (t->operand_types[op].bitfield.xmmword
3709 && t->operand_types[op].bitfield.ymmword
3710 && i.types[op].bitfield.ymmword)
3711 {
3712 vector_length = 1;
3713 break;
3714 }
3715 }
c0f3af97 3716
03751133
L
3717 /* Check the REX.W bit and VEXW. */
3718 if (i.tm.opcode_modifier.vexw == VEXWIG)
3719 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
3720 else if (i.tm.opcode_modifier.vexw)
3721 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3722 else
931d03b7 3723 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3724
c0f3af97 3725 /* Use 2-byte VEX prefix if possible. */
03751133
L
3726 if (w == 0
3727 && i.vec_encoding != vex_encoding_vex3
441f6aca 3728 && i.tm.opcode_modifier.opcodespace == SPACE_0F
c0f3af97
L
3729 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3730 {
3731 /* 2-byte VEX prefix. */
3732 unsigned int r;
3733
3734 i.vex.length = 2;
3735 i.vex.bytes[0] = 0xc5;
3736
3737 /* Check the REX.R bit. */
3738 r = (i.rex & REX_R) ? 0 : 1;
3739 i.vex.bytes[1] = (r << 7
3740 | register_specifier << 3
3741 | vector_length << 2
35648716 3742 | i.tm.opcode_modifier.opcodeprefix);
c0f3af97
L
3743 }
3744 else
3745 {
3746 /* 3-byte VEX prefix. */
f88c9eb0 3747 i.vex.length = 3;
f88c9eb0 3748
441f6aca 3749 switch (i.tm.opcode_modifier.opcodespace)
5dd85c99 3750 {
441f6aca
JB
3751 case SPACE_0F:
3752 case SPACE_0F38:
3753 case SPACE_0F3A:
80de6e00 3754 i.vex.bytes[0] = 0xc4;
7f399153 3755 break;
441f6aca
JB
3756 case SPACE_XOP08:
3757 case SPACE_XOP09:
3758 case SPACE_XOP0A:
f88c9eb0 3759 i.vex.bytes[0] = 0x8f;
7f399153
L
3760 break;
3761 default:
3762 abort ();
f88c9eb0 3763 }
c0f3af97 3764
c0f3af97
L
3765 /* The high 3 bits of the second VEX byte are 1's compliment
3766 of RXB bits from REX. */
441f6aca 3767 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | i.tm.opcode_modifier.opcodespace;
c0f3af97 3768
c0f3af97
L
3769 i.vex.bytes[2] = (w << 7
3770 | register_specifier << 3
3771 | vector_length << 2
35648716 3772 | i.tm.opcode_modifier.opcodeprefix);
c0f3af97
L
3773 }
3774}
3775
e771e7c9
JB
3776static INLINE bfd_boolean
3777is_evex_encoding (const insn_template *t)
3778{
7091c612 3779 return t->opcode_modifier.evex || t->opcode_modifier.disp8memshift
e771e7c9 3780 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
a80195f1 3781 || t->opcode_modifier.sae;
e771e7c9
JB
3782}
3783
7a8655d2
JB
3784static INLINE bfd_boolean
3785is_any_vex_encoding (const insn_template *t)
3786{
7b47a312 3787 return t->opcode_modifier.vex || is_evex_encoding (t);
7a8655d2
JB
3788}
3789
43234a1e
L
3790/* Build the EVEX prefix. */
3791
3792static void
3793build_evex_prefix (void)
3794{
35648716 3795 unsigned int register_specifier, w;
43234a1e
L
3796 rex_byte vrex_used = 0;
3797
3798 /* Check register specifier. */
3799 if (i.vex.register_specifier)
3800 {
3801 gas_assert ((i.vrex & REX_X) == 0);
3802
3803 register_specifier = i.vex.register_specifier->reg_num;
3804 if ((i.vex.register_specifier->reg_flags & RegRex))
3805 register_specifier += 8;
3806 /* The upper 16 registers are encoded in the fourth byte of the
3807 EVEX prefix. */
3808 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3809 i.vex.bytes[3] = 0x8;
3810 register_specifier = ~register_specifier & 0xf;
3811 }
3812 else
3813 {
3814 register_specifier = 0xf;
3815
3816 /* Encode upper 16 vector index register in the fourth byte of
3817 the EVEX prefix. */
3818 if (!(i.vrex & REX_X))
3819 i.vex.bytes[3] = 0x8;
3820 else
3821 vrex_used |= REX_X;
3822 }
3823
43234a1e
L
3824 /* 4 byte EVEX prefix. */
3825 i.vex.length = 4;
3826 i.vex.bytes[0] = 0x62;
3827
43234a1e
L
3828 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3829 bits from REX. */
441f6aca
JB
3830 gas_assert (i.tm.opcode_modifier.opcodespace >= SPACE_0F);
3831 gas_assert (i.tm.opcode_modifier.opcodespace <= SPACE_0F3A);
3832 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | i.tm.opcode_modifier.opcodespace;
43234a1e
L
3833
3834 /* The fifth bit of the second EVEX byte is 1's compliment of the
3835 REX_R bit in VREX. */
3836 if (!(i.vrex & REX_R))
3837 i.vex.bytes[1] |= 0x10;
3838 else
3839 vrex_used |= REX_R;
3840
3841 if ((i.reg_operands + i.imm_operands) == i.operands)
3842 {
3843 /* When all operands are registers, the REX_X bit in REX is not
3844 used. We reuse it to encode the upper 16 registers, which is
3845 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3846 as 1's compliment. */
3847 if ((i.vrex & REX_B))
3848 {
3849 vrex_used |= REX_B;
3850 i.vex.bytes[1] &= ~0x40;
3851 }
3852 }
3853
3854 /* EVEX instructions shouldn't need the REX prefix. */
3855 i.vrex &= ~vrex_used;
3856 gas_assert (i.vrex == 0);
3857
6865c043
L
3858 /* Check the REX.W bit and VEXW. */
3859 if (i.tm.opcode_modifier.vexw == VEXWIG)
3860 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
3861 else if (i.tm.opcode_modifier.vexw)
3862 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3863 else
931d03b7 3864 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e 3865
43234a1e 3866 /* The third byte of the EVEX prefix. */
35648716
JB
3867 i.vex.bytes[2] = ((w << 7)
3868 | (register_specifier << 3)
3869 | 4 /* Encode the U bit. */
3870 | i.tm.opcode_modifier.opcodeprefix);
43234a1e
L
3871
3872 /* The fourth byte of the EVEX prefix. */
3873 /* The zeroing-masking bit. */
3874 if (i.mask && i.mask->zeroing)
3875 i.vex.bytes[3] |= 0x80;
3876
3877 /* Don't always set the broadcast bit if there is no RC. */
3878 if (!i.rounding)
3879 {
3880 /* Encode the vector length. */
3881 unsigned int vec_length;
3882
e771e7c9
JB
3883 if (!i.tm.opcode_modifier.evex
3884 || i.tm.opcode_modifier.evex == EVEXDYN)
3885 {
56522fc5 3886 unsigned int op;
e771e7c9 3887
c7213af9
L
3888 /* Determine vector length from the last multi-length vector
3889 operand. */
56522fc5 3890 for (op = i.operands; op--;)
e771e7c9
JB
3891 if (i.tm.operand_types[op].bitfield.xmmword
3892 + i.tm.operand_types[op].bitfield.ymmword
3893 + i.tm.operand_types[op].bitfield.zmmword > 1)
3894 {
3895 if (i.types[op].bitfield.zmmword)
c7213af9
L
3896 {
3897 i.tm.opcode_modifier.evex = EVEX512;
3898 break;
3899 }
e771e7c9 3900 else if (i.types[op].bitfield.ymmword)
c7213af9
L
3901 {
3902 i.tm.opcode_modifier.evex = EVEX256;
3903 break;
3904 }
e771e7c9 3905 else if (i.types[op].bitfield.xmmword)
c7213af9
L
3906 {
3907 i.tm.opcode_modifier.evex = EVEX128;
3908 break;
3909 }
625cbd7a
JB
3910 else if (i.broadcast && (int) op == i.broadcast->operand)
3911 {
4a1b91ea 3912 switch (i.broadcast->bytes)
625cbd7a
JB
3913 {
3914 case 64:
3915 i.tm.opcode_modifier.evex = EVEX512;
3916 break;
3917 case 32:
3918 i.tm.opcode_modifier.evex = EVEX256;
3919 break;
3920 case 16:
3921 i.tm.opcode_modifier.evex = EVEX128;
3922 break;
3923 default:
c7213af9 3924 abort ();
625cbd7a 3925 }
c7213af9 3926 break;
625cbd7a 3927 }
e771e7c9 3928 }
c7213af9 3929
56522fc5 3930 if (op >= MAX_OPERANDS)
c7213af9 3931 abort ();
e771e7c9
JB
3932 }
3933
43234a1e
L
3934 switch (i.tm.opcode_modifier.evex)
3935 {
3936 case EVEXLIG: /* LL' is ignored */
3937 vec_length = evexlig << 5;
3938 break;
3939 case EVEX128:
3940 vec_length = 0 << 5;
3941 break;
3942 case EVEX256:
3943 vec_length = 1 << 5;
3944 break;
3945 case EVEX512:
3946 vec_length = 2 << 5;
3947 break;
3948 default:
3949 abort ();
3950 break;
3951 }
3952 i.vex.bytes[3] |= vec_length;
3953 /* Encode the broadcast bit. */
3954 if (i.broadcast)
3955 i.vex.bytes[3] |= 0x10;
3956 }
3957 else
3958 {
3959 if (i.rounding->type != saeonly)
3960 i.vex.bytes[3] |= 0x10 | (i.rounding->type << 5);
3961 else
d3d3c6db 3962 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e
L
3963 }
3964
3965 if (i.mask && i.mask->mask)
3966 i.vex.bytes[3] |= i.mask->mask->reg_num;
3967}
3968
65da13b5
L
3969static void
3970process_immext (void)
3971{
3972 expressionS *exp;
3973
c0f3af97 3974 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
3975 which is coded in the same place as an 8-bit immediate field
3976 would be. Here we fake an 8-bit immediate operand from the
3977 opcode suffix stored in tm.extension_opcode.
3978
c1e679ec 3979 AVX instructions also use this encoding, for some of
c0f3af97 3980 3 argument instructions. */
65da13b5 3981
43234a1e 3982 gas_assert (i.imm_operands <= 1
7ab9ffdd 3983 && (i.operands <= 2
7a8655d2 3984 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 3985 && i.operands <= 4)));
65da13b5
L
3986
3987 exp = &im_expressions[i.imm_operands++];
3988 i.op[i.operands].imms = exp;
3989 i.types[i.operands] = imm8;
3990 i.operands++;
3991 exp->X_op = O_constant;
3992 exp->X_add_number = i.tm.extension_opcode;
3993 i.tm.extension_opcode = None;
3994}
3995
42164a71
L
3996
3997static int
3998check_hle (void)
3999{
742732c7 4000 switch (i.tm.opcode_modifier.prefixok)
42164a71
L
4001 {
4002 default:
4003 abort ();
742732c7
JB
4004 case PrefixLock:
4005 case PrefixNone:
4006 case PrefixNoTrack:
4007 case PrefixRep:
165de32a
L
4008 as_bad (_("invalid instruction `%s' after `%s'"),
4009 i.tm.name, i.hle_prefix);
42164a71 4010 return 0;
742732c7 4011 case PrefixHLELock:
42164a71
L
4012 if (i.prefix[LOCK_PREFIX])
4013 return 1;
165de32a 4014 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 4015 return 0;
742732c7 4016 case PrefixHLEAny:
42164a71 4017 return 1;
742732c7 4018 case PrefixHLERelease:
42164a71
L
4019 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
4020 {
4021 as_bad (_("instruction `%s' after `xacquire' not allowed"),
4022 i.tm.name);
4023 return 0;
4024 }
8dc0818e 4025 if (i.mem_operands == 0 || !(i.flags[i.operands - 1] & Operand_Mem))
42164a71
L
4026 {
4027 as_bad (_("memory destination needed for instruction `%s'"
4028 " after `xrelease'"), i.tm.name);
4029 return 0;
4030 }
4031 return 1;
4032 }
4033}
4034
b6f8c7c4
L
4035/* Try the shortest encoding by shortening operand size. */
4036
4037static void
4038optimize_encoding (void)
4039{
a0a1771e 4040 unsigned int j;
b6f8c7c4
L
4041
4042 if (optimize_for_space
389d00a5 4043 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
b6f8c7c4
L
4044 && i.reg_operands == 1
4045 && i.imm_operands == 1
4046 && !i.types[1].bitfield.byte
4047 && i.op[0].imms->X_op == O_constant
4048 && fits_in_imm7 (i.op[0].imms->X_add_number)
72aea328 4049 && (i.tm.base_opcode == 0xa8
b6f8c7c4
L
4050 || (i.tm.base_opcode == 0xf6
4051 && i.tm.extension_opcode == 0x0)))
4052 {
4053 /* Optimize: -Os:
4054 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
4055 */
4056 unsigned int base_regnum = i.op[1].regs->reg_num;
4057 if (flag_code == CODE_64BIT || base_regnum < 4)
4058 {
4059 i.types[1].bitfield.byte = 1;
4060 /* Ignore the suffix. */
4061 i.suffix = 0;
7697afb6
JB
4062 /* Convert to byte registers. */
4063 if (i.types[1].bitfield.word)
4064 j = 16;
4065 else if (i.types[1].bitfield.dword)
4066 j = 32;
4067 else
4068 j = 48;
4069 if (!(i.op[1].regs->reg_flags & RegRex) && base_regnum < 4)
4070 j += 8;
4071 i.op[1].regs -= j;
b6f8c7c4
L
4072 }
4073 }
4074 else if (flag_code == CODE_64BIT
389d00a5 4075 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
d3d50934
L
4076 && ((i.types[1].bitfield.qword
4077 && i.reg_operands == 1
b6f8c7c4
L
4078 && i.imm_operands == 1
4079 && i.op[0].imms->X_op == O_constant
507916b8 4080 && ((i.tm.base_opcode == 0xb8
b6f8c7c4
L
4081 && i.tm.extension_opcode == None
4082 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
4083 || (fits_in_imm31 (i.op[0].imms->X_add_number)
72aea328
JB
4084 && ((i.tm.base_opcode == 0x24
4085 || i.tm.base_opcode == 0xa8)
b6f8c7c4
L
4086 || (i.tm.base_opcode == 0x80
4087 && i.tm.extension_opcode == 0x4)
4088 || ((i.tm.base_opcode == 0xf6
507916b8 4089 || (i.tm.base_opcode | 1) == 0xc7)
b8364fa7
JB
4090 && i.tm.extension_opcode == 0x0)))
4091 || (fits_in_imm7 (i.op[0].imms->X_add_number)
4092 && i.tm.base_opcode == 0x83
4093 && i.tm.extension_opcode == 0x4)))
d3d50934
L
4094 || (i.types[0].bitfield.qword
4095 && ((i.reg_operands == 2
4096 && i.op[0].regs == i.op[1].regs
72aea328
JB
4097 && (i.tm.base_opcode == 0x30
4098 || i.tm.base_opcode == 0x28))
d3d50934
L
4099 || (i.reg_operands == 1
4100 && i.operands == 1
72aea328 4101 && i.tm.base_opcode == 0x30)))))
b6f8c7c4
L
4102 {
4103 /* Optimize: -O:
4104 andq $imm31, %r64 -> andl $imm31, %r32
b8364fa7 4105 andq $imm7, %r64 -> andl $imm7, %r32
b6f8c7c4
L
4106 testq $imm31, %r64 -> testl $imm31, %r32
4107 xorq %r64, %r64 -> xorl %r32, %r32
4108 subq %r64, %r64 -> subl %r32, %r32
4109 movq $imm31, %r64 -> movl $imm31, %r32
4110 movq $imm32, %r64 -> movl $imm32, %r32
4111 */
4112 i.tm.opcode_modifier.norex64 = 1;
507916b8 4113 if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4114 {
4115 /* Handle
4116 movq $imm31, %r64 -> movl $imm31, %r32
4117 movq $imm32, %r64 -> movl $imm32, %r32
4118 */
4119 i.tm.operand_types[0].bitfield.imm32 = 1;
4120 i.tm.operand_types[0].bitfield.imm32s = 0;
4121 i.tm.operand_types[0].bitfield.imm64 = 0;
4122 i.types[0].bitfield.imm32 = 1;
4123 i.types[0].bitfield.imm32s = 0;
4124 i.types[0].bitfield.imm64 = 0;
4125 i.types[1].bitfield.dword = 1;
4126 i.types[1].bitfield.qword = 0;
507916b8 4127 if ((i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4128 {
4129 /* Handle
4130 movq $imm31, %r64 -> movl $imm31, %r32
4131 */
507916b8 4132 i.tm.base_opcode = 0xb8;
b6f8c7c4 4133 i.tm.extension_opcode = None;
507916b8 4134 i.tm.opcode_modifier.w = 0;
b6f8c7c4
L
4135 i.tm.opcode_modifier.modrm = 0;
4136 }
4137 }
4138 }
5641ec01
JB
4139 else if (optimize > 1
4140 && !optimize_for_space
389d00a5 4141 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
5641ec01
JB
4142 && i.reg_operands == 2
4143 && i.op[0].regs == i.op[1].regs
4144 && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8
4145 || (i.tm.base_opcode & ~(Opcode_D | 1)) == 0x20)
4146 && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword))
4147 {
4148 /* Optimize: -O2:
4149 andb %rN, %rN -> testb %rN, %rN
4150 andw %rN, %rN -> testw %rN, %rN
4151 andq %rN, %rN -> testq %rN, %rN
4152 orb %rN, %rN -> testb %rN, %rN
4153 orw %rN, %rN -> testw %rN, %rN
4154 orq %rN, %rN -> testq %rN, %rN
4155
4156 and outside of 64-bit mode
4157
4158 andl %rN, %rN -> testl %rN, %rN
4159 orl %rN, %rN -> testl %rN, %rN
4160 */
4161 i.tm.base_opcode = 0x84 | (i.tm.base_opcode & 1);
4162 }
99112332 4163 else if (i.reg_operands == 3
b6f8c7c4
L
4164 && i.op[0].regs == i.op[1].regs
4165 && !i.types[2].bitfield.xmmword
4166 && (i.tm.opcode_modifier.vex
7a69eac3 4167 || ((!i.mask || i.mask->zeroing)
b6f8c7c4 4168 && !i.rounding
e771e7c9 4169 && is_evex_encoding (&i.tm)
80c34c38 4170 && (i.vec_encoding != vex_encoding_evex
dd22218c 4171 || cpu_arch_isa_flags.bitfield.cpuavx512vl
80c34c38 4172 || i.tm.cpu_flags.bitfield.cpuavx512vl
7091c612 4173 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4174 && i.types[2].bitfield.ymmword))))
b6f8c7c4 4175 && ((i.tm.base_opcode == 0x55
b6f8c7c4 4176 || i.tm.base_opcode == 0x57
35648716
JB
4177 || i.tm.base_opcode == 0xdf
4178 || i.tm.base_opcode == 0xef
4179 || i.tm.base_opcode == 0xf8
4180 || i.tm.base_opcode == 0xf9
4181 || i.tm.base_opcode == 0xfa
4182 || i.tm.base_opcode == 0xfb
1424ad86 4183 || i.tm.base_opcode == 0x42
35648716 4184 || i.tm.base_opcode == 0x47)
b6f8c7c4
L
4185 && i.tm.extension_opcode == None))
4186 {
99112332 4187 /* Optimize: -O1:
8305403a
L
4188 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4189 vpsubq and vpsubw:
b6f8c7c4
L
4190 EVEX VOP %zmmM, %zmmM, %zmmN
4191 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4192 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4193 EVEX VOP %ymmM, %ymmM, %ymmN
4194 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4195 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4196 VEX VOP %ymmM, %ymmM, %ymmN
4197 -> VEX VOP %xmmM, %xmmM, %xmmN
4198 VOP, one of vpandn and vpxor:
4199 VEX VOP %ymmM, %ymmM, %ymmN
4200 -> VEX VOP %xmmM, %xmmM, %xmmN
4201 VOP, one of vpandnd and vpandnq:
4202 EVEX VOP %zmmM, %zmmM, %zmmN
4203 -> VEX vpandn %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 vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4207 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4208 VOP, one of vpxord and vpxorq:
4209 EVEX VOP %zmmM, %zmmM, %zmmN
4210 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4211 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4212 EVEX VOP %ymmM, %ymmM, %ymmN
4213 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4214 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4215 VOP, one of kxord and kxorq:
4216 VEX VOP %kM, %kM, %kN
4217 -> VEX kxorw %kM, %kM, %kN
4218 VOP, one of kandnd and kandnq:
4219 VEX VOP %kM, %kM, %kN
4220 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4221 */
e771e7c9 4222 if (is_evex_encoding (&i.tm))
b6f8c7c4 4223 {
7b1d7ca1 4224 if (i.vec_encoding != vex_encoding_evex)
b6f8c7c4
L
4225 {
4226 i.tm.opcode_modifier.vex = VEX128;
4227 i.tm.opcode_modifier.vexw = VEXW0;
4228 i.tm.opcode_modifier.evex = 0;
4229 }
7b1d7ca1 4230 else if (optimize > 1)
dd22218c
L
4231 i.tm.opcode_modifier.evex = EVEX128;
4232 else
4233 return;
b6f8c7c4 4234 }
f74a6307 4235 else if (i.tm.operand_types[0].bitfield.class == RegMask)
1424ad86 4236 {
35648716 4237 i.tm.opcode_modifier.opcodeprefix = PREFIX_NONE;
1424ad86
JB
4238 i.tm.opcode_modifier.vexw = VEXW0;
4239 }
b6f8c7c4
L
4240 else
4241 i.tm.opcode_modifier.vex = VEX128;
4242
4243 if (i.tm.opcode_modifier.vex)
4244 for (j = 0; j < 3; j++)
4245 {
4246 i.types[j].bitfield.xmmword = 1;
4247 i.types[j].bitfield.ymmword = 0;
4248 }
4249 }
392a5972 4250 else if (i.vec_encoding != vex_encoding_evex
97ed31ae 4251 && !i.types[0].bitfield.zmmword
392a5972 4252 && !i.types[1].bitfield.zmmword
97ed31ae 4253 && !i.mask
a0a1771e 4254 && !i.broadcast
97ed31ae 4255 && is_evex_encoding (&i.tm)
35648716
JB
4256 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x6f
4257 || (i.tm.base_opcode & ~4) == 0xdb
4258 || (i.tm.base_opcode & ~4) == 0xeb)
97ed31ae
L
4259 && i.tm.extension_opcode == None)
4260 {
4261 /* Optimize: -O1:
4262 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4263 vmovdqu32 and vmovdqu64:
4264 EVEX VOP %xmmM, %xmmN
4265 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4266 EVEX VOP %ymmM, %ymmN
4267 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4268 EVEX VOP %xmmM, mem
4269 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4270 EVEX VOP %ymmM, mem
4271 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4272 EVEX VOP mem, %xmmN
4273 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4274 EVEX VOP mem, %ymmN
4275 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
a0a1771e
JB
4276 VOP, one of vpand, vpandn, vpor, vpxor:
4277 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4278 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4279 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4280 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4281 EVEX VOP{d,q} mem, %xmmM, %xmmN
4282 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4283 EVEX VOP{d,q} mem, %ymmM, %ymmN
4284 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
97ed31ae 4285 */
a0a1771e 4286 for (j = 0; j < i.operands; j++)
392a5972
L
4287 if (operand_type_check (i.types[j], disp)
4288 && i.op[j].disps->X_op == O_constant)
4289 {
4290 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4291 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4292 bytes, we choose EVEX Disp8 over VEX Disp32. */
4293 int evex_disp8, vex_disp8;
4294 unsigned int memshift = i.memshift;
4295 offsetT n = i.op[j].disps->X_add_number;
4296
4297 evex_disp8 = fits_in_disp8 (n);
4298 i.memshift = 0;
4299 vex_disp8 = fits_in_disp8 (n);
4300 if (evex_disp8 != vex_disp8)
4301 {
4302 i.memshift = memshift;
4303 return;
4304 }
4305
4306 i.types[j].bitfield.disp8 = vex_disp8;
4307 break;
4308 }
35648716
JB
4309 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x6f
4310 && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2)
4311 i.tm.opcode_modifier.opcodeprefix = PREFIX_0XF3;
97ed31ae
L
4312 i.tm.opcode_modifier.vex
4313 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4314 i.tm.opcode_modifier.vexw = VEXW0;
79dec6b7 4315 /* VPAND, VPOR, and VPXOR are commutative. */
35648716 4316 if (i.reg_operands == 3 && i.tm.base_opcode != 0xdf)
79dec6b7 4317 i.tm.opcode_modifier.commutative = 1;
97ed31ae
L
4318 i.tm.opcode_modifier.evex = 0;
4319 i.tm.opcode_modifier.masking = 0;
a0a1771e 4320 i.tm.opcode_modifier.broadcast = 0;
97ed31ae
L
4321 i.tm.opcode_modifier.disp8memshift = 0;
4322 i.memshift = 0;
a0a1771e
JB
4323 if (j < i.operands)
4324 i.types[j].bitfield.disp8
4325 = fits_in_disp8 (i.op[j].disps->X_add_number);
97ed31ae 4326 }
b6f8c7c4
L
4327}
4328
ae531041
L
4329/* Return non-zero for load instruction. */
4330
4331static int
4332load_insn_p (void)
4333{
4334 unsigned int dest;
4335 int any_vex_p = is_any_vex_encoding (&i.tm);
4336 unsigned int base_opcode = i.tm.base_opcode | 1;
4337
4338 if (!any_vex_p)
4339 {
a09f656b 4340 /* Anysize insns: lea, invlpg, clflush, prefetchnta, prefetcht0,
4341 prefetcht1, prefetcht2, prefetchtw, bndmk, bndcl, bndcu, bndcn,
4342 bndstx, bndldx, prefetchwt1, clflushopt, clwb, cldemote. */
4343 if (i.tm.opcode_modifier.anysize)
ae531041
L
4344 return 0;
4345
389d00a5
JB
4346 /* pop. */
4347 if (strcmp (i.tm.name, "pop") == 0)
4348 return 1;
4349 }
4350
4351 if (i.tm.opcode_modifier.opcodespace == SPACE_BASE)
4352 {
4353 /* popf, popa. */
4354 if (i.tm.base_opcode == 0x9d
a09f656b 4355 || i.tm.base_opcode == 0x61)
ae531041
L
4356 return 1;
4357
4358 /* movs, cmps, lods, scas. */
4359 if ((i.tm.base_opcode | 0xb) == 0xaf)
4360 return 1;
4361
a09f656b 4362 /* outs, xlatb. */
4363 if (base_opcode == 0x6f
4364 || i.tm.base_opcode == 0xd7)
ae531041 4365 return 1;
a09f656b 4366 /* NB: For AMD-specific insns with implicit memory operands,
4367 they're intentionally not covered. */
ae531041
L
4368 }
4369
4370 /* No memory operand. */
4371 if (!i.mem_operands)
4372 return 0;
4373
4374 if (any_vex_p)
4375 {
4376 /* vldmxcsr. */
4377 if (i.tm.base_opcode == 0xae
4378 && i.tm.opcode_modifier.vex
441f6aca 4379 && i.tm.opcode_modifier.opcodespace == SPACE_0F
35648716 4380 && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE
ae531041
L
4381 && i.tm.extension_opcode == 2)
4382 return 1;
4383 }
389d00a5 4384 else if (i.tm.opcode_modifier.opcodespace == SPACE_BASE)
ae531041
L
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
ae531041
L
4399 /* rol, ror, rcl, rcr, shl/sal, shr, sar. */
4400 if ((base_opcode == 0xc1
4401 || (i.tm.base_opcode >= 0xd0 && i.tm.base_opcode <= 0xd3))
4402 && i.tm.extension_opcode != 6)
4403 return 1;
4404
ae531041 4405 /* Check for x87 instructions. */
389d00a5 4406 if (base_opcode >= 0xd8 && base_opcode <= 0xdf)
ae531041
L
4407 {
4408 /* Skip fst, fstp, fstenv, fstcw. */
4409 if (i.tm.base_opcode == 0xd9
4410 && (i.tm.extension_opcode == 2
4411 || i.tm.extension_opcode == 3
4412 || i.tm.extension_opcode == 6
4413 || i.tm.extension_opcode == 7))
4414 return 0;
4415
4416 /* Skip fisttp, fist, fistp, fstp. */
4417 if (i.tm.base_opcode == 0xdb
4418 && (i.tm.extension_opcode == 1
4419 || i.tm.extension_opcode == 2
4420 || i.tm.extension_opcode == 3
4421 || i.tm.extension_opcode == 7))
4422 return 0;
4423
4424 /* Skip fisttp, fst, fstp, fsave, fstsw. */
4425 if (i.tm.base_opcode == 0xdd
4426 && (i.tm.extension_opcode == 1
4427 || i.tm.extension_opcode == 2
4428 || i.tm.extension_opcode == 3
4429 || i.tm.extension_opcode == 6
4430 || i.tm.extension_opcode == 7))
4431 return 0;
4432
4433 /* Skip fisttp, fist, fistp, fbstp, fistp. */
4434 if (i.tm.base_opcode == 0xdf
4435 && (i.tm.extension_opcode == 1
4436 || i.tm.extension_opcode == 2
4437 || i.tm.extension_opcode == 3
4438 || i.tm.extension_opcode == 6
4439 || i.tm.extension_opcode == 7))
4440 return 0;
4441
4442 return 1;
4443 }
4444 }
389d00a5
JB
4445 else if (i.tm.opcode_modifier.opcodespace == SPACE_0F)
4446 {
4447 /* bt, bts, btr, btc. */
4448 if (i.tm.base_opcode == 0xba
4449 && (i.tm.extension_opcode >= 4 && i.tm.extension_opcode <= 7))
4450 return 1;
4451
4452 /* cmpxchg8b, cmpxchg16b, xrstors, vmptrld. */
4453 if (i.tm.base_opcode == 0xc7
4454 && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE
4455 && (i.tm.extension_opcode == 1 || i.tm.extension_opcode == 3
4456 || i.tm.extension_opcode == 6))
4457 return 1;
4458
4459 /* fxrstor, ldmxcsr, xrstor. */
4460 if (i.tm.base_opcode == 0xae
4461 && (i.tm.extension_opcode == 1
4462 || i.tm.extension_opcode == 2
4463 || i.tm.extension_opcode == 5))
4464 return 1;
4465
4466 /* lgdt, lidt, lmsw. */
4467 if (i.tm.base_opcode == 0x01
4468 && (i.tm.extension_opcode == 2
4469 || i.tm.extension_opcode == 3
4470 || i.tm.extension_opcode == 6))
4471 return 1;
4472 }
ae531041
L
4473
4474 dest = i.operands - 1;
4475
4476 /* Check fake imm8 operand and 3 source operands. */
4477 if ((i.tm.opcode_modifier.immext
4478 || i.tm.opcode_modifier.vexsources == VEX3SOURCES)
4479 && i.types[dest].bitfield.imm8)
4480 dest--;
4481
389d00a5
JB
4482 /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg. */
4483 if (i.tm.opcode_modifier.opcodespace == SPACE_BASE
ae531041
L
4484 && (base_opcode == 0x1
4485 || base_opcode == 0x9
4486 || base_opcode == 0x11
4487 || base_opcode == 0x19
4488 || base_opcode == 0x21
4489 || base_opcode == 0x29
4490 || base_opcode == 0x31
4491 || base_opcode == 0x39
389d00a5
JB
4492 || (base_opcode | 2) == 0x87))
4493 return 1;
4494
4495 /* xadd. */
4496 if (i.tm.opcode_modifier.opcodespace == SPACE_0F
4497 && base_opcode == 0xc1)
ae531041
L
4498 return 1;
4499
4500 /* Check for load instruction. */
4501 return (i.types[dest].bitfield.class != ClassNone
4502 || i.types[dest].bitfield.instance == Accum);
4503}
4504
4505/* Output lfence, 0xfaee8, after instruction. */
4506
4507static void
4508insert_lfence_after (void)
4509{
4510 if (lfence_after_load && load_insn_p ())
4511 {
a09f656b 4512 /* There are also two REP string instructions that require
4513 special treatment. Specifically, the compare string (CMPS)
4514 and scan string (SCAS) instructions set EFLAGS in a manner
4515 that depends on the data being compared/scanned. When used
4516 with a REP prefix, the number of iterations may therefore
4517 vary depending on this data. If the data is a program secret
4518 chosen by the adversary using an LVI method,
4519 then this data-dependent behavior may leak some aspect
4520 of the secret. */
4521 if (((i.tm.base_opcode | 0x1) == 0xa7
4522 || (i.tm.base_opcode | 0x1) == 0xaf)
4523 && i.prefix[REP_PREFIX])
4524 {
4525 as_warn (_("`%s` changes flags which would affect control flow behavior"),
4526 i.tm.name);
4527 }
ae531041
L
4528 char *p = frag_more (3);
4529 *p++ = 0xf;
4530 *p++ = 0xae;
4531 *p = 0xe8;
4532 }
4533}
4534
4535/* Output lfence, 0xfaee8, before instruction. */
4536
4537static void
4538insert_lfence_before (void)
4539{
4540 char *p;
4541
389d00a5 4542 if (i.tm.opcode_modifier.opcodespace != SPACE_BASE)
ae531041
L
4543 return;
4544
4545 if (i.tm.base_opcode == 0xff
4546 && (i.tm.extension_opcode == 2 || i.tm.extension_opcode == 4))
4547 {
4548 /* Insert lfence before indirect branch if needed. */
4549
4550 if (lfence_before_indirect_branch == lfence_branch_none)
4551 return;
4552
4553 if (i.operands != 1)
4554 abort ();
4555
4556 if (i.reg_operands == 1)
4557 {
4558 /* Indirect branch via register. Don't insert lfence with
4559 -mlfence-after-load=yes. */
4560 if (lfence_after_load
4561 || lfence_before_indirect_branch == lfence_branch_memory)
4562 return;
4563 }
4564 else if (i.mem_operands == 1
4565 && lfence_before_indirect_branch != lfence_branch_register)
4566 {
4567 as_warn (_("indirect `%s` with memory operand should be avoided"),
4568 i.tm.name);
4569 return;
4570 }
4571 else
4572 return;
4573
4574 if (last_insn.kind != last_insn_other
4575 && last_insn.seg == now_seg)
4576 {
4577 as_warn_where (last_insn.file, last_insn.line,
4578 _("`%s` skips -mlfence-before-indirect-branch on `%s`"),
4579 last_insn.name, i.tm.name);
4580 return;
4581 }
4582
4583 p = frag_more (3);
4584 *p++ = 0xf;
4585 *p++ = 0xae;
4586 *p = 0xe8;
4587 return;
4588 }
4589
503648e4 4590 /* Output or/not/shl and lfence before near ret. */
ae531041
L
4591 if (lfence_before_ret != lfence_before_ret_none
4592 && (i.tm.base_opcode == 0xc2
503648e4 4593 || i.tm.base_opcode == 0xc3))
ae531041
L
4594 {
4595 if (last_insn.kind != last_insn_other
4596 && last_insn.seg == now_seg)
4597 {
4598 as_warn_where (last_insn.file, last_insn.line,
4599 _("`%s` skips -mlfence-before-ret on `%s`"),
4600 last_insn.name, i.tm.name);
4601 return;
4602 }
a09f656b 4603
a09f656b 4604 /* Near ret ingore operand size override under CPU64. */
503648e4 4605 char prefix = flag_code == CODE_64BIT
4606 ? 0x48
4607 : i.prefix[DATA_PREFIX] ? 0x66 : 0x0;
a09f656b 4608
4609 if (lfence_before_ret == lfence_before_ret_not)
4610 {
4611 /* not: 0xf71424, may add prefix
4612 for operand size override or 64-bit code. */
4613 p = frag_more ((prefix ? 2 : 0) + 6 + 3);
4614 if (prefix)
4615 *p++ = prefix;
ae531041
L
4616 *p++ = 0xf7;
4617 *p++ = 0x14;
4618 *p++ = 0x24;
a09f656b 4619 if (prefix)
4620 *p++ = prefix;
ae531041
L
4621 *p++ = 0xf7;
4622 *p++ = 0x14;
4623 *p++ = 0x24;
4624 }
a09f656b 4625 else
4626 {
4627 p = frag_more ((prefix ? 1 : 0) + 4 + 3);
4628 if (prefix)
4629 *p++ = prefix;
4630 if (lfence_before_ret == lfence_before_ret_or)
4631 {
4632 /* or: 0x830c2400, may add prefix
4633 for operand size override or 64-bit code. */
4634 *p++ = 0x83;
4635 *p++ = 0x0c;
4636 }
4637 else
4638 {
4639 /* shl: 0xc1242400, may add prefix
4640 for operand size override or 64-bit code. */
4641 *p++ = 0xc1;
4642 *p++ = 0x24;
4643 }
4644
4645 *p++ = 0x24;
4646 *p++ = 0x0;
4647 }
4648
ae531041
L
4649 *p++ = 0xf;
4650 *p++ = 0xae;
4651 *p = 0xe8;
4652 }
4653}
4654
252b5132
RH
4655/* This is the guts of the machine-dependent assembler. LINE points to a
4656 machine dependent instruction. This function is supposed to emit
4657 the frags/bytes it assembles to. */
4658
4659void
65da13b5 4660md_assemble (char *line)
252b5132 4661{
40fb9820 4662 unsigned int j;
83b16ac6 4663 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 4664 const insn_template *t;
252b5132 4665
47926f60 4666 /* Initialize globals. */
252b5132
RH
4667 memset (&i, '\0', sizeof (i));
4668 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 4669 i.reloc[j] = NO_RELOC;
252b5132
RH
4670 memset (disp_expressions, '\0', sizeof (disp_expressions));
4671 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 4672 save_stack_p = save_stack;
252b5132
RH
4673
4674 /* First parse an instruction mnemonic & call i386_operand for the operands.
4675 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 4676 start of a (possibly prefixed) mnemonic. */
252b5132 4677
29b0f896
AM
4678 line = parse_insn (line, mnemonic);
4679 if (line == NULL)
4680 return;
83b16ac6 4681 mnem_suffix = i.suffix;
252b5132 4682
29b0f896 4683 line = parse_operands (line, mnemonic);
ee86248c 4684 this_operand = -1;
8325cc63
JB
4685 xfree (i.memop1_string);
4686 i.memop1_string = NULL;
29b0f896
AM
4687 if (line == NULL)
4688 return;
252b5132 4689
29b0f896
AM
4690 /* Now we've parsed the mnemonic into a set of templates, and have the
4691 operands at hand. */
4692
b630c145 4693 /* All Intel opcodes have reversed operands except for "bound", "enter",
c0e54661
JB
4694 "invlpg*", "monitor*", "mwait*", "tpause", "umwait", "pvalidate",
4695 "rmpadjust", and "rmpupdate". We also don't reverse intersegment "jmp"
4696 and "call" instructions with 2 immediate operands so that the immediate
4697 segment precedes the offset consistently in Intel and AT&T modes. */
4d456e3d
L
4698 if (intel_syntax
4699 && i.operands > 1
29b0f896 4700 && (strcmp (mnemonic, "bound") != 0)
c0e54661 4701 && (strncmp (mnemonic, "invlpg", 6) != 0)
eedb0f2c
JB
4702 && (strncmp (mnemonic, "monitor", 7) != 0)
4703 && (strncmp (mnemonic, "mwait", 5) != 0)
c0e54661
JB
4704 && (strcmp (mnemonic, "pvalidate") != 0)
4705 && (strncmp (mnemonic, "rmp", 3) != 0)
b630c145
JB
4706 && (strcmp (mnemonic, "tpause") != 0)
4707 && (strcmp (mnemonic, "umwait") != 0)
40fb9820
L
4708 && !(operand_type_check (i.types[0], imm)
4709 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4710 swap_operands ();
4711
ec56d5c0
JB
4712 /* The order of the immediates should be reversed
4713 for 2 immediates extrq and insertq instructions */
4714 if (i.imm_operands == 2
4715 && (strcmp (mnemonic, "extrq") == 0
4716 || strcmp (mnemonic, "insertq") == 0))
4717 swap_2_operands (0, 1);
4718
29b0f896
AM
4719 if (i.imm_operands)
4720 optimize_imm ();
4721
b300c311
L
4722 /* Don't optimize displacement for movabs since it only takes 64bit
4723 displacement. */
4724 if (i.disp_operands
a501d77e 4725 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4726 && (flag_code != CODE_64BIT
4727 || strcmp (mnemonic, "movabs") != 0))
4728 optimize_disp ();
29b0f896
AM
4729
4730 /* Next, we find a template that matches the given insn,
4731 making sure the overlap of the given operands types is consistent
4732 with the template operand types. */
252b5132 4733
83b16ac6 4734 if (!(t = match_template (mnem_suffix)))
29b0f896 4735 return;
252b5132 4736
7bab8ab5 4737 if (sse_check != check_none
81f8a913 4738 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4739 && !i.tm.cpu_flags.bitfield.cpuavx
569d50f1 4740 && !i.tm.cpu_flags.bitfield.cpuavx512f
daf50ae7
L
4741 && (i.tm.cpu_flags.bitfield.cpusse
4742 || i.tm.cpu_flags.bitfield.cpusse2
4743 || i.tm.cpu_flags.bitfield.cpusse3
4744 || i.tm.cpu_flags.bitfield.cpussse3
4745 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e
JB
4746 || i.tm.cpu_flags.bitfield.cpusse4_2
4747 || i.tm.cpu_flags.bitfield.cpupclmul
4748 || i.tm.cpu_flags.bitfield.cpuaes
569d50f1 4749 || i.tm.cpu_flags.bitfield.cpusha
6e3e5c9e 4750 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4751 {
7bab8ab5 4752 (sse_check == check_warning
daf50ae7
L
4753 ? as_warn
4754 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4755 }
4756
40fb9820 4757 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4758 if (!add_prefix (FWAIT_OPCODE))
4759 return;
252b5132 4760
d5de92cf 4761 /* Check if REP prefix is OK. */
742732c7 4762 if (i.rep_prefix && i.tm.opcode_modifier.prefixok != PrefixRep)
d5de92cf
L
4763 {
4764 as_bad (_("invalid instruction `%s' after `%s'"),
4765 i.tm.name, i.rep_prefix);
4766 return;
4767 }
4768
c1ba0266
L
4769 /* Check for lock without a lockable instruction. Destination operand
4770 must be memory unless it is xchg (0x86). */
c32fa91d 4771 if (i.prefix[LOCK_PREFIX]
742732c7 4772 && (i.tm.opcode_modifier.prefixok < PrefixLock
c1ba0266
L
4773 || i.mem_operands == 0
4774 || (i.tm.base_opcode != 0x86
8dc0818e 4775 && !(i.flags[i.operands - 1] & Operand_Mem))))
c32fa91d
L
4776 {
4777 as_bad (_("expecting lockable instruction after `lock'"));
4778 return;
4779 }
4780
40d231b4
JB
4781 /* Check for data size prefix on VEX/XOP/EVEX encoded and SIMD insns. */
4782 if (i.prefix[DATA_PREFIX]
4783 && (is_any_vex_encoding (&i.tm)
4784 || i.tm.operand_types[i.imm_operands].bitfield.class >= RegMMX
4785 || i.tm.operand_types[i.imm_operands + 1].bitfield.class >= RegMMX))
7a8655d2
JB
4786 {
4787 as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
4788 return;
4789 }
4790
42164a71 4791 /* Check if HLE prefix is OK. */
165de32a 4792 if (i.hle_prefix && !check_hle ())
42164a71
L
4793 return;
4794
7e8b059b
L
4795 /* Check BND prefix. */
4796 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
4797 as_bad (_("expecting valid branch instruction after `bnd'"));
4798
04ef582a 4799 /* Check NOTRACK prefix. */
742732c7 4800 if (i.notrack_prefix && i.tm.opcode_modifier.prefixok != PrefixNoTrack)
9fef80d6 4801 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 4802
327e8c42
JB
4803 if (i.tm.cpu_flags.bitfield.cpumpx)
4804 {
4805 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4806 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
4807 else if (flag_code != CODE_16BIT
4808 ? i.prefix[ADDR_PREFIX]
4809 : i.mem_operands && !i.prefix[ADDR_PREFIX])
4810 as_bad (_("16-bit address isn't allowed in MPX instructions"));
4811 }
7e8b059b
L
4812
4813 /* Insert BND prefix. */
76d3a78a
JB
4814 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
4815 {
4816 if (!i.prefix[BND_PREFIX])
4817 add_prefix (BND_PREFIX_OPCODE);
4818 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
4819 {
4820 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
4821 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
4822 }
4823 }
7e8b059b 4824
29b0f896 4825 /* Check string instruction segment overrides. */
51c8edf6 4826 if (i.tm.opcode_modifier.isstring >= IS_STRING_ES_OP0)
29b0f896 4827 {
51c8edf6 4828 gas_assert (i.mem_operands);
29b0f896 4829 if (!check_string ())
5dd0794d 4830 return;
fc0763e6 4831 i.disp_operands = 0;
29b0f896 4832 }
5dd0794d 4833
b6f8c7c4
L
4834 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
4835 optimize_encoding ();
4836
29b0f896
AM
4837 if (!process_suffix ())
4838 return;
e413e4e9 4839
921eafea 4840 /* Update operand types and check extended states. */
bc0844ae 4841 for (j = 0; j < i.operands; j++)
921eafea
L
4842 {
4843 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
3d70986f 4844 switch (i.tm.operand_types[j].bitfield.class)
921eafea
L
4845 {
4846 default:
4847 break;
4848 case RegMMX:
4849 i.xstate |= xstate_mmx;
4850 break;
4851 case RegMask:
32930e4e 4852 i.xstate |= xstate_mask;
921eafea
L
4853 break;
4854 case RegSIMD:
3d70986f 4855 if (i.tm.operand_types[j].bitfield.tmmword)
921eafea 4856 i.xstate |= xstate_tmm;
3d70986f 4857 else if (i.tm.operand_types[j].bitfield.zmmword)
921eafea 4858 i.xstate |= xstate_zmm;
3d70986f 4859 else if (i.tm.operand_types[j].bitfield.ymmword)
921eafea 4860 i.xstate |= xstate_ymm;
3d70986f 4861 else if (i.tm.operand_types[j].bitfield.xmmword)
921eafea
L
4862 i.xstate |= xstate_xmm;
4863 break;
4864 }
4865 }
bc0844ae 4866
29b0f896
AM
4867 /* Make still unresolved immediate matches conform to size of immediate
4868 given in i.suffix. */
4869 if (!finalize_imm ())
4870 return;
252b5132 4871
40fb9820 4872 if (i.types[0].bitfield.imm1)
29b0f896 4873 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 4874
9afe6eb8
L
4875 /* We only need to check those implicit registers for instructions
4876 with 3 operands or less. */
4877 if (i.operands <= 3)
4878 for (j = 0; j < i.operands; j++)
75e5731b
JB
4879 if (i.types[j].bitfield.instance != InstanceNone
4880 && !i.types[j].bitfield.xmmword)
9afe6eb8 4881 i.reg_operands--;
40fb9820 4882
29b0f896
AM
4883 /* For insns with operands there are more diddles to do to the opcode. */
4884 if (i.operands)
4885 {
4886 if (!process_operands ())
4887 return;
4888 }
8c190ce0 4889 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
4890 {
4891 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
4892 as_warn (_("translating to `%sp'"), i.tm.name);
4893 }
252b5132 4894
7a8655d2 4895 if (is_any_vex_encoding (&i.tm))
9e5e5283 4896 {
c1dc7af5 4897 if (!cpu_arch_flags.bitfield.cpui286)
9e5e5283 4898 {
c1dc7af5 4899 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
9e5e5283
L
4900 i.tm.name);
4901 return;
4902 }
c0f3af97 4903
0b9404fd
JB
4904 /* Check for explicit REX prefix. */
4905 if (i.prefix[REX_PREFIX] || i.rex_encoding)
4906 {
4907 as_bad (_("REX prefix invalid with `%s'"), i.tm.name);
4908 return;
4909 }
4910
9e5e5283
L
4911 if (i.tm.opcode_modifier.vex)
4912 build_vex_prefix (t);
4913 else
4914 build_evex_prefix ();
0b9404fd
JB
4915
4916 /* The individual REX.RXBW bits got consumed. */
4917 i.rex &= REX_OPCODE;
9e5e5283 4918 }
43234a1e 4919
5dd85c99
SP
4920 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
4921 instructions may define INT_OPCODE as well, so avoid this corner
4922 case for those instructions that use MODRM. */
389d00a5
JB
4923 if (i.tm.opcode_modifier.opcodespace == SPACE_BASE
4924 && i.tm.base_opcode == INT_OPCODE
a6461c02
SP
4925 && !i.tm.opcode_modifier.modrm
4926 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
4927 {
4928 i.tm.base_opcode = INT3_OPCODE;
4929 i.imm_operands = 0;
4930 }
252b5132 4931
0cfa3eb3
JB
4932 if ((i.tm.opcode_modifier.jump == JUMP
4933 || i.tm.opcode_modifier.jump == JUMP_BYTE
4934 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896
AM
4935 && i.op[0].disps->X_op == O_constant)
4936 {
4937 /* Convert "jmp constant" (and "call constant") to a jump (call) to
4938 the absolute address given by the constant. Since ix86 jumps and
4939 calls are pc relative, we need to generate a reloc. */
4940 i.op[0].disps->X_add_symbol = &abs_symbol;
4941 i.op[0].disps->X_op = O_symbol;
4942 }
252b5132 4943
29b0f896
AM
4944 /* For 8 bit registers we need an empty rex prefix. Also if the
4945 instruction already has a prefix, we need to convert old
4946 registers to new ones. */
773f551c 4947
bab6aec1 4948 if ((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte
29b0f896 4949 && (i.op[0].regs->reg_flags & RegRex64) != 0)
bab6aec1 4950 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte
29b0f896 4951 && (i.op[1].regs->reg_flags & RegRex64) != 0)
bab6aec1
JB
4952 || (((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte)
4953 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte))
29b0f896
AM
4954 && i.rex != 0))
4955 {
4956 int x;
726c5dcd 4957
29b0f896
AM
4958 i.rex |= REX_OPCODE;
4959 for (x = 0; x < 2; x++)
4960 {
4961 /* Look for 8 bit operand that uses old registers. */
bab6aec1 4962 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
29b0f896 4963 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 4964 {
3f93af61 4965 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
29b0f896
AM
4966 /* In case it is "hi" register, give up. */
4967 if (i.op[x].regs->reg_num > 3)
a540244d 4968 as_bad (_("can't encode register '%s%s' in an "
4eed87de 4969 "instruction requiring REX prefix."),
a540244d 4970 register_prefix, i.op[x].regs->reg_name);
773f551c 4971
29b0f896
AM
4972 /* Otherwise it is equivalent to the extended register.
4973 Since the encoding doesn't change this is merely
4974 cosmetic cleanup for debug output. */
4975
4976 i.op[x].regs = i.op[x].regs + 8;
773f551c 4977 }
29b0f896
AM
4978 }
4979 }
773f551c 4980
6b6b6807
L
4981 if (i.rex == 0 && i.rex_encoding)
4982 {
4983 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
3f93af61 4984 that uses legacy register. If it is "hi" register, don't add
6b6b6807
L
4985 the REX_OPCODE byte. */
4986 int x;
4987 for (x = 0; x < 2; x++)
bab6aec1 4988 if (i.types[x].bitfield.class == Reg
6b6b6807
L
4989 && i.types[x].bitfield.byte
4990 && (i.op[x].regs->reg_flags & RegRex64) == 0
4991 && i.op[x].regs->reg_num > 3)
4992 {
3f93af61 4993 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
6b6b6807
L
4994 i.rex_encoding = FALSE;
4995 break;
4996 }
4997
4998 if (i.rex_encoding)
4999 i.rex = REX_OPCODE;
5000 }
5001
7ab9ffdd 5002 if (i.rex != 0)
29b0f896
AM
5003 add_prefix (REX_OPCODE | i.rex);
5004
ae531041
L
5005 insert_lfence_before ();
5006
29b0f896
AM
5007 /* We are ready to output the insn. */
5008 output_insn ();
e379e5f3 5009
ae531041
L
5010 insert_lfence_after ();
5011
e379e5f3
L
5012 last_insn.seg = now_seg;
5013
5014 if (i.tm.opcode_modifier.isprefix)
5015 {
5016 last_insn.kind = last_insn_prefix;
5017 last_insn.name = i.tm.name;
5018 last_insn.file = as_where (&last_insn.line);
5019 }
5020 else
5021 last_insn.kind = last_insn_other;
29b0f896
AM
5022}
5023
5024static char *
e3bb37b5 5025parse_insn (char *line, char *mnemonic)
29b0f896
AM
5026{
5027 char *l = line;
5028 char *token_start = l;
5029 char *mnem_p;
5c6af06e 5030 int supported;
d3ce72d0 5031 const insn_template *t;
b6169b20 5032 char *dot_p = NULL;
29b0f896 5033
29b0f896
AM
5034 while (1)
5035 {
5036 mnem_p = mnemonic;
5037 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
5038 {
b6169b20
L
5039 if (*mnem_p == '.')
5040 dot_p = mnem_p;
29b0f896
AM
5041 mnem_p++;
5042 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 5043 {
29b0f896
AM
5044 as_bad (_("no such instruction: `%s'"), token_start);
5045 return NULL;
5046 }
5047 l++;
5048 }
5049 if (!is_space_char (*l)
5050 && *l != END_OF_INSN
e44823cf
JB
5051 && (intel_syntax
5052 || (*l != PREFIX_SEPARATOR
5053 && *l != ',')))
29b0f896
AM
5054 {
5055 as_bad (_("invalid character %s in mnemonic"),
5056 output_invalid (*l));
5057 return NULL;
5058 }
5059 if (token_start == l)
5060 {
e44823cf 5061 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
5062 as_bad (_("expecting prefix; got nothing"));
5063 else
5064 as_bad (_("expecting mnemonic; got nothing"));
5065 return NULL;
5066 }
45288df1 5067
29b0f896 5068 /* Look up instruction (or prefix) via hash table. */
629310ab 5069 current_templates = (const templates *) str_hash_find (op_hash, mnemonic);
47926f60 5070
29b0f896
AM
5071 if (*l != END_OF_INSN
5072 && (!is_space_char (*l) || l[1] != END_OF_INSN)
5073 && current_templates
40fb9820 5074 && current_templates->start->opcode_modifier.isprefix)
29b0f896 5075 {
c6fb90c8 5076 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
5077 {
5078 as_bad ((flag_code != CODE_64BIT
5079 ? _("`%s' is only supported in 64-bit mode")
5080 : _("`%s' is not supported in 64-bit mode")),
5081 current_templates->start->name);
5082 return NULL;
5083 }
29b0f896
AM
5084 /* If we are in 16-bit mode, do not allow addr16 or data16.
5085 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
5086 if ((current_templates->start->opcode_modifier.size == SIZE16
5087 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 5088 && flag_code != CODE_64BIT
673fe0f0 5089 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
5090 ^ (flag_code == CODE_16BIT)))
5091 {
5092 as_bad (_("redundant %s prefix"),
5093 current_templates->start->name);
5094 return NULL;
45288df1 5095 }
31184569
JB
5096
5097 if (current_templates->start->base_opcode == PSEUDO_PREFIX)
29b0f896 5098 {
86fa6981 5099 /* Handle pseudo prefixes. */
31184569 5100 switch (current_templates->start->extension_opcode)
86fa6981 5101 {
41eb8e88 5102 case Prefix_Disp8:
86fa6981
L
5103 /* {disp8} */
5104 i.disp_encoding = disp_encoding_8bit;
5105 break;
41eb8e88
L
5106 case Prefix_Disp16:
5107 /* {disp16} */
5108 i.disp_encoding = disp_encoding_16bit;
5109 break;
5110 case Prefix_Disp32:
86fa6981
L
5111 /* {disp32} */
5112 i.disp_encoding = disp_encoding_32bit;
5113 break;
41eb8e88 5114 case Prefix_Load:
86fa6981
L
5115 /* {load} */
5116 i.dir_encoding = dir_encoding_load;
5117 break;
41eb8e88 5118 case Prefix_Store:
86fa6981
L
5119 /* {store} */
5120 i.dir_encoding = dir_encoding_store;
5121 break;
41eb8e88 5122 case Prefix_VEX:
42e04b36
L
5123 /* {vex} */
5124 i.vec_encoding = vex_encoding_vex;
86fa6981 5125 break;
41eb8e88 5126 case Prefix_VEX3:
86fa6981
L
5127 /* {vex3} */
5128 i.vec_encoding = vex_encoding_vex3;
5129 break;
41eb8e88 5130 case Prefix_EVEX:
86fa6981
L
5131 /* {evex} */
5132 i.vec_encoding = vex_encoding_evex;
5133 break;
41eb8e88 5134 case Prefix_REX:
6b6b6807
L
5135 /* {rex} */
5136 i.rex_encoding = TRUE;
5137 break;
41eb8e88 5138 case Prefix_NoOptimize:
b6f8c7c4
L
5139 /* {nooptimize} */
5140 i.no_optimize = TRUE;
5141 break;
86fa6981
L
5142 default:
5143 abort ();
5144 }
5145 }
5146 else
5147 {
5148 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 5149 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 5150 {
4e9ac44a
L
5151 case PREFIX_EXIST:
5152 return NULL;
5153 case PREFIX_DS:
d777820b 5154 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
5155 i.notrack_prefix = current_templates->start->name;
5156 break;
5157 case PREFIX_REP:
5158 if (current_templates->start->cpu_flags.bitfield.cpuhle)
5159 i.hle_prefix = current_templates->start->name;
5160 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
5161 i.bnd_prefix = current_templates->start->name;
5162 else
5163 i.rep_prefix = current_templates->start->name;
5164 break;
5165 default:
5166 break;
86fa6981 5167 }
29b0f896
AM
5168 }
5169 /* Skip past PREFIX_SEPARATOR and reset token_start. */
5170 token_start = ++l;
5171 }
5172 else
5173 break;
5174 }
45288df1 5175
30a55f88 5176 if (!current_templates)
b6169b20 5177 {
07d5e953
JB
5178 /* Deprecated functionality (new code should use pseudo-prefixes instead):
5179 Check if we should swap operand or force 32bit displacement in
f8a5c266 5180 encoding. */
30a55f88 5181 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 5182 i.dir_encoding = dir_encoding_swap;
8d63c93e 5183 else if (mnem_p - 3 == dot_p
a501d77e
L
5184 && dot_p[1] == 'd'
5185 && dot_p[2] == '8')
5186 i.disp_encoding = disp_encoding_8bit;
8d63c93e 5187 else if (mnem_p - 4 == dot_p
f8a5c266
L
5188 && dot_p[1] == 'd'
5189 && dot_p[2] == '3'
5190 && dot_p[3] == '2')
a501d77e 5191 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
5192 else
5193 goto check_suffix;
5194 mnem_p = dot_p;
5195 *dot_p = '\0';
629310ab 5196 current_templates = (const templates *) str_hash_find (op_hash, mnemonic);
b6169b20
L
5197 }
5198
29b0f896
AM
5199 if (!current_templates)
5200 {
dc1e8a47 5201 check_suffix:
1c529385 5202 if (mnem_p > mnemonic)
29b0f896 5203 {
1c529385
LH
5204 /* See if we can get a match by trimming off a suffix. */
5205 switch (mnem_p[-1])
29b0f896 5206 {
1c529385
LH
5207 case WORD_MNEM_SUFFIX:
5208 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
5209 i.suffix = SHORT_MNEM_SUFFIX;
5210 else
1c529385
LH
5211 /* Fall through. */
5212 case BYTE_MNEM_SUFFIX:
5213 case QWORD_MNEM_SUFFIX:
5214 i.suffix = mnem_p[-1];
29b0f896 5215 mnem_p[-1] = '\0';
fe0e921f
AM
5216 current_templates
5217 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5218 break;
5219 case SHORT_MNEM_SUFFIX:
5220 case LONG_MNEM_SUFFIX:
5221 if (!intel_syntax)
5222 {
5223 i.suffix = mnem_p[-1];
5224 mnem_p[-1] = '\0';
fe0e921f
AM
5225 current_templates
5226 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5227 }
5228 break;
5229
5230 /* Intel Syntax. */
5231 case 'd':
5232 if (intel_syntax)
5233 {
5234 if (intel_float_operand (mnemonic) == 1)
5235 i.suffix = SHORT_MNEM_SUFFIX;
5236 else
5237 i.suffix = LONG_MNEM_SUFFIX;
5238 mnem_p[-1] = '\0';
fe0e921f
AM
5239 current_templates
5240 = (const templates *) str_hash_find (op_hash, mnemonic);
1c529385
LH
5241 }
5242 break;
29b0f896 5243 }
29b0f896 5244 }
1c529385 5245
29b0f896
AM
5246 if (!current_templates)
5247 {
5248 as_bad (_("no such instruction: `%s'"), token_start);
5249 return NULL;
5250 }
5251 }
252b5132 5252
0cfa3eb3
JB
5253 if (current_templates->start->opcode_modifier.jump == JUMP
5254 || current_templates->start->opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
5255 {
5256 /* Check for a branch hint. We allow ",pt" and ",pn" for
5257 predict taken and predict not taken respectively.
5258 I'm not sure that branch hints actually do anything on loop
5259 and jcxz insns (JumpByte) for current Pentium4 chips. They
5260 may work in the future and it doesn't hurt to accept them
5261 now. */
5262 if (l[0] == ',' && l[1] == 'p')
5263 {
5264 if (l[2] == 't')
5265 {
5266 if (!add_prefix (DS_PREFIX_OPCODE))
5267 return NULL;
5268 l += 3;
5269 }
5270 else if (l[2] == 'n')
5271 {
5272 if (!add_prefix (CS_PREFIX_OPCODE))
5273 return NULL;
5274 l += 3;
5275 }
5276 }
5277 }
5278 /* Any other comma loses. */
5279 if (*l == ',')
5280 {
5281 as_bad (_("invalid character %s in mnemonic"),
5282 output_invalid (*l));
5283 return NULL;
5284 }
252b5132 5285
29b0f896 5286 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
5287 supported = 0;
5288 for (t = current_templates->start; t < current_templates->end; ++t)
5289 {
c0f3af97
L
5290 supported |= cpu_flags_match (t);
5291 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
5292 {
5293 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
5294 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 5295
548d0ee6
JB
5296 return l;
5297 }
29b0f896 5298 }
3629bb00 5299
548d0ee6
JB
5300 if (!(supported & CPU_FLAGS_64BIT_MATCH))
5301 as_bad (flag_code == CODE_64BIT
5302 ? _("`%s' is not supported in 64-bit mode")
5303 : _("`%s' is only supported in 64-bit mode"),
5304 current_templates->start->name);
5305 else
5306 as_bad (_("`%s' is not supported on `%s%s'"),
5307 current_templates->start->name,
5308 cpu_arch_name ? cpu_arch_name : default_arch,
5309 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 5310
548d0ee6 5311 return NULL;
29b0f896 5312}
252b5132 5313
29b0f896 5314static char *
e3bb37b5 5315parse_operands (char *l, const char *mnemonic)
29b0f896
AM
5316{
5317 char *token_start;
3138f287 5318
29b0f896
AM
5319 /* 1 if operand is pending after ','. */
5320 unsigned int expecting_operand = 0;
252b5132 5321
29b0f896
AM
5322 /* Non-zero if operand parens not balanced. */
5323 unsigned int paren_not_balanced;
5324
5325 while (*l != END_OF_INSN)
5326 {
5327 /* Skip optional white space before operand. */
5328 if (is_space_char (*l))
5329 ++l;
d02603dc 5330 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
5331 {
5332 as_bad (_("invalid character %s before operand %d"),
5333 output_invalid (*l),
5334 i.operands + 1);
5335 return NULL;
5336 }
d02603dc 5337 token_start = l; /* After white space. */
29b0f896
AM
5338 paren_not_balanced = 0;
5339 while (paren_not_balanced || *l != ',')
5340 {
5341 if (*l == END_OF_INSN)
5342 {
5343 if (paren_not_balanced)
5344 {
5345 if (!intel_syntax)
5346 as_bad (_("unbalanced parenthesis in operand %d."),
5347 i.operands + 1);
5348 else
5349 as_bad (_("unbalanced brackets in operand %d."),
5350 i.operands + 1);
5351 return NULL;
5352 }
5353 else
5354 break; /* we are done */
5355 }
d02603dc 5356 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
5357 {
5358 as_bad (_("invalid character %s in operand %d"),
5359 output_invalid (*l),
5360 i.operands + 1);
5361 return NULL;
5362 }
5363 if (!intel_syntax)
5364 {
5365 if (*l == '(')
5366 ++paren_not_balanced;
5367 if (*l == ')')
5368 --paren_not_balanced;
5369 }
5370 else
5371 {
5372 if (*l == '[')
5373 ++paren_not_balanced;
5374 if (*l == ']')
5375 --paren_not_balanced;
5376 }
5377 l++;
5378 }
5379 if (l != token_start)
5380 { /* Yes, we've read in another operand. */
5381 unsigned int operand_ok;
5382 this_operand = i.operands++;
5383 if (i.operands > MAX_OPERANDS)
5384 {
5385 as_bad (_("spurious operands; (%d operands/instruction max)"),
5386 MAX_OPERANDS);
5387 return NULL;
5388 }
9d46ce34 5389 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
5390 /* Now parse operand adding info to 'i' as we go along. */
5391 END_STRING_AND_SAVE (l);
5392
1286ab78
L
5393 if (i.mem_operands > 1)
5394 {
5395 as_bad (_("too many memory references for `%s'"),
5396 mnemonic);
5397 return 0;
5398 }
5399
29b0f896
AM
5400 if (intel_syntax)
5401 operand_ok =
5402 i386_intel_operand (token_start,
5403 intel_float_operand (mnemonic));
5404 else
a7619375 5405 operand_ok = i386_att_operand (token_start);
29b0f896
AM
5406
5407 RESTORE_END_STRING (l);
5408 if (!operand_ok)
5409 return NULL;
5410 }
5411 else
5412 {
5413 if (expecting_operand)
5414 {
5415 expecting_operand_after_comma:
5416 as_bad (_("expecting operand after ','; got nothing"));
5417 return NULL;
5418 }
5419 if (*l == ',')
5420 {
5421 as_bad (_("expecting operand before ','; got nothing"));
5422 return NULL;
5423 }
5424 }
7f3f1ea2 5425
29b0f896
AM
5426 /* Now *l must be either ',' or END_OF_INSN. */
5427 if (*l == ',')
5428 {
5429 if (*++l == END_OF_INSN)
5430 {
5431 /* Just skip it, if it's \n complain. */
5432 goto expecting_operand_after_comma;
5433 }
5434 expecting_operand = 1;
5435 }
5436 }
5437 return l;
5438}
7f3f1ea2 5439
050dfa73 5440static void
4d456e3d 5441swap_2_operands (int xchg1, int xchg2)
050dfa73
MM
5442{
5443 union i386_op temp_op;
40fb9820 5444 i386_operand_type temp_type;
c48dadc9 5445 unsigned int temp_flags;
050dfa73 5446 enum bfd_reloc_code_real temp_reloc;
4eed87de 5447
050dfa73
MM
5448 temp_type = i.types[xchg2];
5449 i.types[xchg2] = i.types[xchg1];
5450 i.types[xchg1] = temp_type;
c48dadc9
JB
5451
5452 temp_flags = i.flags[xchg2];
5453 i.flags[xchg2] = i.flags[xchg1];
5454 i.flags[xchg1] = temp_flags;
5455
050dfa73
MM
5456 temp_op = i.op[xchg2];
5457 i.op[xchg2] = i.op[xchg1];
5458 i.op[xchg1] = temp_op;
c48dadc9 5459
050dfa73
MM
5460 temp_reloc = i.reloc[xchg2];
5461 i.reloc[xchg2] = i.reloc[xchg1];
5462 i.reloc[xchg1] = temp_reloc;
43234a1e
L
5463
5464 if (i.mask)
5465 {
5466 if (i.mask->operand == xchg1)
5467 i.mask->operand = xchg2;
5468 else if (i.mask->operand == xchg2)
5469 i.mask->operand = xchg1;
5470 }
5471 if (i.broadcast)
5472 {
5473 if (i.broadcast->operand == xchg1)
5474 i.broadcast->operand = xchg2;
5475 else if (i.broadcast->operand == xchg2)
5476 i.broadcast->operand = xchg1;
5477 }
5478 if (i.rounding)
5479 {
5480 if (i.rounding->operand == xchg1)
5481 i.rounding->operand = xchg2;
5482 else if (i.rounding->operand == xchg2)
5483 i.rounding->operand = xchg1;
5484 }
050dfa73
MM
5485}
5486
29b0f896 5487static void
e3bb37b5 5488swap_operands (void)
29b0f896 5489{
b7c61d9a 5490 switch (i.operands)
050dfa73 5491 {
c0f3af97 5492 case 5:
b7c61d9a 5493 case 4:
4d456e3d 5494 swap_2_operands (1, i.operands - 2);
1a0670f3 5495 /* Fall through. */
b7c61d9a
L
5496 case 3:
5497 case 2:
4d456e3d 5498 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
5499 break;
5500 default:
5501 abort ();
29b0f896 5502 }
29b0f896
AM
5503
5504 if (i.mem_operands == 2)
5505 {
5506 const seg_entry *temp_seg;
5507 temp_seg = i.seg[0];
5508 i.seg[0] = i.seg[1];
5509 i.seg[1] = temp_seg;
5510 }
5511}
252b5132 5512
29b0f896
AM
5513/* Try to ensure constant immediates are represented in the smallest
5514 opcode possible. */
5515static void
e3bb37b5 5516optimize_imm (void)
29b0f896
AM
5517{
5518 char guess_suffix = 0;
5519 int op;
252b5132 5520
29b0f896
AM
5521 if (i.suffix)
5522 guess_suffix = i.suffix;
5523 else if (i.reg_operands)
5524 {
5525 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
5526 We can't do this properly yet, i.e. excluding special register
5527 instances, but the following works for instructions with
5528 immediates. In any case, we can't set i.suffix yet. */
29b0f896 5529 for (op = i.operands; --op >= 0;)
bab6aec1
JB
5530 if (i.types[op].bitfield.class != Reg)
5531 continue;
5532 else if (i.types[op].bitfield.byte)
7ab9ffdd 5533 {
40fb9820
L
5534 guess_suffix = BYTE_MNEM_SUFFIX;
5535 break;
5536 }
bab6aec1 5537 else if (i.types[op].bitfield.word)
252b5132 5538 {
40fb9820
L
5539 guess_suffix = WORD_MNEM_SUFFIX;
5540 break;
5541 }
bab6aec1 5542 else if (i.types[op].bitfield.dword)
40fb9820
L
5543 {
5544 guess_suffix = LONG_MNEM_SUFFIX;
5545 break;
5546 }
bab6aec1 5547 else if (i.types[op].bitfield.qword)
40fb9820
L
5548 {
5549 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5550 break;
252b5132 5551 }
29b0f896
AM
5552 }
5553 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5554 guess_suffix = WORD_MNEM_SUFFIX;
5555
5556 for (op = i.operands; --op >= 0;)
40fb9820 5557 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5558 {
5559 switch (i.op[op].imms->X_op)
252b5132 5560 {
29b0f896
AM
5561 case O_constant:
5562 /* If a suffix is given, this operand may be shortened. */
5563 switch (guess_suffix)
252b5132 5564 {
29b0f896 5565 case LONG_MNEM_SUFFIX:
40fb9820
L
5566 i.types[op].bitfield.imm32 = 1;
5567 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5568 break;
5569 case WORD_MNEM_SUFFIX:
40fb9820
L
5570 i.types[op].bitfield.imm16 = 1;
5571 i.types[op].bitfield.imm32 = 1;
5572 i.types[op].bitfield.imm32s = 1;
5573 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5574 break;
5575 case BYTE_MNEM_SUFFIX:
40fb9820
L
5576 i.types[op].bitfield.imm8 = 1;
5577 i.types[op].bitfield.imm8s = 1;
5578 i.types[op].bitfield.imm16 = 1;
5579 i.types[op].bitfield.imm32 = 1;
5580 i.types[op].bitfield.imm32s = 1;
5581 i.types[op].bitfield.imm64 = 1;
29b0f896 5582 break;
252b5132 5583 }
252b5132 5584
29b0f896
AM
5585 /* If this operand is at most 16 bits, convert it
5586 to a signed 16 bit number before trying to see
5587 whether it will fit in an even smaller size.
5588 This allows a 16-bit operand such as $0xffe0 to
5589 be recognised as within Imm8S range. */
40fb9820 5590 if ((i.types[op].bitfield.imm16)
29b0f896 5591 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5592 {
29b0f896
AM
5593 i.op[op].imms->X_add_number =
5594 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
5595 }
a28def75
L
5596#ifdef BFD64
5597 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5598 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5599 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5600 == 0))
5601 {
5602 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5603 ^ ((offsetT) 1 << 31))
5604 - ((offsetT) 1 << 31));
5605 }
a28def75 5606#endif
40fb9820 5607 i.types[op]
c6fb90c8
L
5608 = operand_type_or (i.types[op],
5609 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5610
29b0f896
AM
5611 /* We must avoid matching of Imm32 templates when 64bit
5612 only immediate is available. */
5613 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5614 i.types[op].bitfield.imm32 = 0;
29b0f896 5615 break;
252b5132 5616
29b0f896
AM
5617 case O_absent:
5618 case O_register:
5619 abort ();
5620
5621 /* Symbols and expressions. */
5622 default:
9cd96992
JB
5623 /* Convert symbolic operand to proper sizes for matching, but don't
5624 prevent matching a set of insns that only supports sizes other
5625 than those matching the insn suffix. */
5626 {
40fb9820 5627 i386_operand_type mask, allowed;
d3ce72d0 5628 const insn_template *t;
9cd96992 5629
0dfbf9d7
L
5630 operand_type_set (&mask, 0);
5631 operand_type_set (&allowed, 0);
40fb9820 5632
4eed87de
AM
5633 for (t = current_templates->start;
5634 t < current_templates->end;
5635 ++t)
bab6aec1
JB
5636 {
5637 allowed = operand_type_or (allowed, t->operand_types[op]);
5638 allowed = operand_type_and (allowed, anyimm);
5639 }
9cd96992
JB
5640 switch (guess_suffix)
5641 {
5642 case QWORD_MNEM_SUFFIX:
40fb9820
L
5643 mask.bitfield.imm64 = 1;
5644 mask.bitfield.imm32s = 1;
9cd96992
JB
5645 break;
5646 case LONG_MNEM_SUFFIX:
40fb9820 5647 mask.bitfield.imm32 = 1;
9cd96992
JB
5648 break;
5649 case WORD_MNEM_SUFFIX:
40fb9820 5650 mask.bitfield.imm16 = 1;
9cd96992
JB
5651 break;
5652 case BYTE_MNEM_SUFFIX:
40fb9820 5653 mask.bitfield.imm8 = 1;
9cd96992
JB
5654 break;
5655 default:
9cd96992
JB
5656 break;
5657 }
c6fb90c8 5658 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5659 if (!operand_type_all_zero (&allowed))
c6fb90c8 5660 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5661 }
29b0f896 5662 break;
252b5132 5663 }
29b0f896
AM
5664 }
5665}
47926f60 5666
29b0f896
AM
5667/* Try to use the smallest displacement type too. */
5668static void
e3bb37b5 5669optimize_disp (void)
29b0f896
AM
5670{
5671 int op;
3e73aa7c 5672
29b0f896 5673 for (op = i.operands; --op >= 0;)
40fb9820 5674 if (operand_type_check (i.types[op], disp))
252b5132 5675 {
b300c311 5676 if (i.op[op].disps->X_op == O_constant)
252b5132 5677 {
91d6fa6a 5678 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5679
40fb9820 5680 if (i.types[op].bitfield.disp16
91d6fa6a 5681 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
5682 {
5683 /* If this operand is at most 16 bits, convert
5684 to a signed 16 bit number and don't use 64bit
5685 displacement. */
91d6fa6a 5686 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 5687 i.types[op].bitfield.disp64 = 0;
b300c311 5688 }
a28def75
L
5689#ifdef BFD64
5690 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
40fb9820 5691 if (i.types[op].bitfield.disp32
91d6fa6a 5692 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
b300c311
L
5693 {
5694 /* If this operand is at most 32 bits, convert
5695 to a signed 32 bit number and don't use 64bit
5696 displacement. */
91d6fa6a
NC
5697 op_disp &= (((offsetT) 2 << 31) - 1);
5698 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 5699 i.types[op].bitfield.disp64 = 0;
b300c311 5700 }
a28def75 5701#endif
91d6fa6a 5702 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5703 {
40fb9820
L
5704 i.types[op].bitfield.disp8 = 0;
5705 i.types[op].bitfield.disp16 = 0;
5706 i.types[op].bitfield.disp32 = 0;
5707 i.types[op].bitfield.disp32s = 0;
5708 i.types[op].bitfield.disp64 = 0;
b300c311
L
5709 i.op[op].disps = 0;
5710 i.disp_operands--;
5711 }
5712 else if (flag_code == CODE_64BIT)
5713 {
91d6fa6a 5714 if (fits_in_signed_long (op_disp))
28a9d8f5 5715 {
40fb9820
L
5716 i.types[op].bitfield.disp64 = 0;
5717 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5718 }
0e1147d9 5719 if (i.prefix[ADDR_PREFIX]
91d6fa6a 5720 && fits_in_unsigned_long (op_disp))
40fb9820 5721 i.types[op].bitfield.disp32 = 1;
b300c311 5722 }
40fb9820
L
5723 if ((i.types[op].bitfield.disp32
5724 || i.types[op].bitfield.disp32s
5725 || i.types[op].bitfield.disp16)
b5014f7a 5726 && fits_in_disp8 (op_disp))
40fb9820 5727 i.types[op].bitfield.disp8 = 1;
252b5132 5728 }
67a4f2b7
AO
5729 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5730 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5731 {
5732 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5733 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
5734 i.types[op].bitfield.disp8 = 0;
5735 i.types[op].bitfield.disp16 = 0;
5736 i.types[op].bitfield.disp32 = 0;
5737 i.types[op].bitfield.disp32s = 0;
5738 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
5739 }
5740 else
b300c311 5741 /* We only support 64bit displacement on constants. */
40fb9820 5742 i.types[op].bitfield.disp64 = 0;
252b5132 5743 }
29b0f896
AM
5744}
5745
4a1b91ea
L
5746/* Return 1 if there is a match in broadcast bytes between operand
5747 GIVEN and instruction template T. */
5748
5749static INLINE int
5750match_broadcast_size (const insn_template *t, unsigned int given)
5751{
5752 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5753 && i.types[given].bitfield.byte)
5754 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5755 && i.types[given].bitfield.word)
5756 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5757 && i.types[given].bitfield.dword)
5758 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5759 && i.types[given].bitfield.qword));
5760}
5761
6c30d220
L
5762/* Check if operands are valid for the instruction. */
5763
5764static int
5765check_VecOperands (const insn_template *t)
5766{
43234a1e 5767 unsigned int op;
e2195274 5768 i386_cpu_flags cpu;
e2195274
JB
5769
5770 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5771 any one operand are implicity requiring AVX512VL support if the actual
5772 operand size is YMMword or XMMword. Since this function runs after
5773 template matching, there's no need to check for YMMword/XMMword in
5774 the template. */
5775 cpu = cpu_flags_and (t->cpu_flags, avx512);
5776 if (!cpu_flags_all_zero (&cpu)
5777 && !t->cpu_flags.bitfield.cpuavx512vl
5778 && !cpu_arch_flags.bitfield.cpuavx512vl)
5779 {
5780 for (op = 0; op < t->operands; ++op)
5781 {
5782 if (t->operand_types[op].bitfield.zmmword
5783 && (i.types[op].bitfield.ymmword
5784 || i.types[op].bitfield.xmmword))
5785 {
5786 i.error = unsupported;
5787 return 1;
5788 }
5789 }
5790 }
43234a1e 5791
6c30d220 5792 /* Without VSIB byte, we can't have a vector register for index. */
63112cd6 5793 if (!t->opcode_modifier.sib
6c30d220 5794 && i.index_reg
1b54b8d7
JB
5795 && (i.index_reg->reg_type.bitfield.xmmword
5796 || i.index_reg->reg_type.bitfield.ymmword
5797 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
5798 {
5799 i.error = unsupported_vector_index_register;
5800 return 1;
5801 }
5802
ad8ecc81
MZ
5803 /* Check if default mask is allowed. */
5804 if (t->opcode_modifier.nodefmask
5805 && (!i.mask || i.mask->mask->reg_num == 0))
5806 {
5807 i.error = no_default_mask;
5808 return 1;
5809 }
5810
7bab8ab5
JB
5811 /* For VSIB byte, we need a vector register for index, and all vector
5812 registers must be distinct. */
260cd341 5813 if (t->opcode_modifier.sib && t->opcode_modifier.sib != SIBMEM)
7bab8ab5
JB
5814 {
5815 if (!i.index_reg
63112cd6 5816 || !((t->opcode_modifier.sib == VECSIB128
1b54b8d7 5817 && i.index_reg->reg_type.bitfield.xmmword)
63112cd6 5818 || (t->opcode_modifier.sib == VECSIB256
1b54b8d7 5819 && i.index_reg->reg_type.bitfield.ymmword)
63112cd6 5820 || (t->opcode_modifier.sib == VECSIB512
1b54b8d7 5821 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
5822 {
5823 i.error = invalid_vsib_address;
5824 return 1;
5825 }
5826
43234a1e
L
5827 gas_assert (i.reg_operands == 2 || i.mask);
5828 if (i.reg_operands == 2 && !i.mask)
5829 {
3528c362 5830 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
5831 gas_assert (i.types[0].bitfield.xmmword
5832 || i.types[0].bitfield.ymmword);
3528c362 5833 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
5834 gas_assert (i.types[2].bitfield.xmmword
5835 || i.types[2].bitfield.ymmword);
43234a1e
L
5836 if (operand_check == check_none)
5837 return 0;
5838 if (register_number (i.op[0].regs)
5839 != register_number (i.index_reg)
5840 && register_number (i.op[2].regs)
5841 != register_number (i.index_reg)
5842 && register_number (i.op[0].regs)
5843 != register_number (i.op[2].regs))
5844 return 0;
5845 if (operand_check == check_error)
5846 {
5847 i.error = invalid_vector_register_set;
5848 return 1;
5849 }
5850 as_warn (_("mask, index, and destination registers should be distinct"));
5851 }
8444f82a
MZ
5852 else if (i.reg_operands == 1 && i.mask)
5853 {
3528c362 5854 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
5855 && (i.types[1].bitfield.xmmword
5856 || i.types[1].bitfield.ymmword
5857 || i.types[1].bitfield.zmmword)
8444f82a
MZ
5858 && (register_number (i.op[1].regs)
5859 == register_number (i.index_reg)))
5860 {
5861 if (operand_check == check_error)
5862 {
5863 i.error = invalid_vector_register_set;
5864 return 1;
5865 }
5866 if (operand_check != check_none)
5867 as_warn (_("index and destination registers should be distinct"));
5868 }
5869 }
43234a1e 5870 }
7bab8ab5 5871
260cd341
LC
5872 /* For AMX instructions with three tmmword operands, all tmmword operand must be
5873 distinct */
5874 if (t->operand_types[0].bitfield.tmmword
5875 && i.reg_operands == 3)
5876 {
5877 if (register_number (i.op[0].regs)
5878 == register_number (i.op[1].regs)
5879 || register_number (i.op[0].regs)
5880 == register_number (i.op[2].regs)
5881 || register_number (i.op[1].regs)
5882 == register_number (i.op[2].regs))
5883 {
5884 i.error = invalid_tmm_register_set;
5885 return 1;
5886 }
5887 }
5888
43234a1e
L
5889 /* Check if broadcast is supported by the instruction and is applied
5890 to the memory operand. */
5891 if (i.broadcast)
5892 {
8e6e0792 5893 i386_operand_type type, overlap;
43234a1e
L
5894
5895 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 5896 and its broadcast bytes match the memory operand. */
32546502 5897 op = i.broadcast->operand;
8e6e0792 5898 if (!t->opcode_modifier.broadcast
c48dadc9 5899 || !(i.flags[op] & Operand_Mem)
c39e5b26 5900 || (!i.types[op].bitfield.unspecified
4a1b91ea 5901 && !match_broadcast_size (t, op)))
43234a1e
L
5902 {
5903 bad_broadcast:
5904 i.error = unsupported_broadcast;
5905 return 1;
5906 }
8e6e0792 5907
4a1b91ea
L
5908 i.broadcast->bytes = ((1 << (t->opcode_modifier.broadcast - 1))
5909 * i.broadcast->type);
8e6e0792 5910 operand_type_set (&type, 0);
4a1b91ea 5911 switch (i.broadcast->bytes)
8e6e0792 5912 {
4a1b91ea
L
5913 case 2:
5914 type.bitfield.word = 1;
5915 break;
5916 case 4:
5917 type.bitfield.dword = 1;
5918 break;
8e6e0792
JB
5919 case 8:
5920 type.bitfield.qword = 1;
5921 break;
5922 case 16:
5923 type.bitfield.xmmword = 1;
5924 break;
5925 case 32:
5926 type.bitfield.ymmword = 1;
5927 break;
5928 case 64:
5929 type.bitfield.zmmword = 1;
5930 break;
5931 default:
5932 goto bad_broadcast;
5933 }
5934
5935 overlap = operand_type_and (type, t->operand_types[op]);
bc49bfd8
JB
5936 if (t->operand_types[op].bitfield.class == RegSIMD
5937 && t->operand_types[op].bitfield.byte
5938 + t->operand_types[op].bitfield.word
5939 + t->operand_types[op].bitfield.dword
5940 + t->operand_types[op].bitfield.qword > 1)
5941 {
5942 overlap.bitfield.xmmword = 0;
5943 overlap.bitfield.ymmword = 0;
5944 overlap.bitfield.zmmword = 0;
5945 }
8e6e0792
JB
5946 if (operand_type_all_zero (&overlap))
5947 goto bad_broadcast;
5948
5949 if (t->opcode_modifier.checkregsize)
5950 {
5951 unsigned int j;
5952
e2195274 5953 type.bitfield.baseindex = 1;
8e6e0792
JB
5954 for (j = 0; j < i.operands; ++j)
5955 {
5956 if (j != op
5957 && !operand_type_register_match(i.types[j],
5958 t->operand_types[j],
5959 type,
5960 t->operand_types[op]))
5961 goto bad_broadcast;
5962 }
5963 }
43234a1e
L
5964 }
5965 /* If broadcast is supported in this instruction, we need to check if
5966 operand of one-element size isn't specified without broadcast. */
5967 else if (t->opcode_modifier.broadcast && i.mem_operands)
5968 {
5969 /* Find memory operand. */
5970 for (op = 0; op < i.operands; op++)
8dc0818e 5971 if (i.flags[op] & Operand_Mem)
43234a1e
L
5972 break;
5973 gas_assert (op < i.operands);
5974 /* Check size of the memory operand. */
4a1b91ea 5975 if (match_broadcast_size (t, op))
43234a1e
L
5976 {
5977 i.error = broadcast_needed;
5978 return 1;
5979 }
5980 }
c39e5b26
JB
5981 else
5982 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
5983
5984 /* Check if requested masking is supported. */
ae2387fe 5985 if (i.mask)
43234a1e 5986 {
ae2387fe
JB
5987 switch (t->opcode_modifier.masking)
5988 {
5989 case BOTH_MASKING:
5990 break;
5991 case MERGING_MASKING:
5992 if (i.mask->zeroing)
5993 {
5994 case 0:
5995 i.error = unsupported_masking;
5996 return 1;
5997 }
5998 break;
5999 case DYNAMIC_MASKING:
6000 /* Memory destinations allow only merging masking. */
6001 if (i.mask->zeroing && i.mem_operands)
6002 {
6003 /* Find memory operand. */
6004 for (op = 0; op < i.operands; op++)
c48dadc9 6005 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
6006 break;
6007 gas_assert (op < i.operands);
6008 if (op == i.operands - 1)
6009 {
6010 i.error = unsupported_masking;
6011 return 1;
6012 }
6013 }
6014 break;
6015 default:
6016 abort ();
6017 }
43234a1e
L
6018 }
6019
6020 /* Check if masking is applied to dest operand. */
6021 if (i.mask && (i.mask->operand != (int) (i.operands - 1)))
6022 {
6023 i.error = mask_not_on_destination;
6024 return 1;
6025 }
6026
43234a1e
L
6027 /* Check RC/SAE. */
6028 if (i.rounding)
6029 {
a80195f1
JB
6030 if (!t->opcode_modifier.sae
6031 || (i.rounding->type != saeonly && !t->opcode_modifier.staticrounding))
43234a1e
L
6032 {
6033 i.error = unsupported_rc_sae;
6034 return 1;
6035 }
6036 /* If the instruction has several immediate operands and one of
6037 them is rounding, the rounding operand should be the last
6038 immediate operand. */
6039 if (i.imm_operands > 1
6040 && i.rounding->operand != (int) (i.imm_operands - 1))
7bab8ab5 6041 {
43234a1e 6042 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
6043 return 1;
6044 }
6c30d220
L
6045 }
6046
da4977e0
JB
6047 /* Check the special Imm4 cases; must be the first operand. */
6048 if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)
6049 {
6050 if (i.op[0].imms->X_op != O_constant
6051 || !fits_in_imm4 (i.op[0].imms->X_add_number))
6052 {
6053 i.error = bad_imm4;
6054 return 1;
6055 }
6056
6057 /* Turn off Imm<N> so that update_imm won't complain. */
6058 operand_type_set (&i.types[0], 0);
6059 }
6060
43234a1e 6061 /* Check vector Disp8 operand. */
b5014f7a
JB
6062 if (t->opcode_modifier.disp8memshift
6063 && i.disp_encoding != disp_encoding_32bit)
43234a1e
L
6064 {
6065 if (i.broadcast)
4a1b91ea 6066 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 6067 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 6068 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
6069 else
6070 {
6071 const i386_operand_type *type = NULL;
6072
6073 i.memshift = 0;
6074 for (op = 0; op < i.operands; op++)
8dc0818e 6075 if (i.flags[op] & Operand_Mem)
7091c612 6076 {
4174bfff
JB
6077 if (t->opcode_modifier.evex == EVEXLIG)
6078 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
6079 else if (t->operand_types[op].bitfield.xmmword
6080 + t->operand_types[op].bitfield.ymmword
6081 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
6082 type = &t->operand_types[op];
6083 else if (!i.types[op].bitfield.unspecified)
6084 type = &i.types[op];
6085 }
3528c362 6086 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 6087 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
6088 {
6089 if (i.types[op].bitfield.zmmword)
6090 i.memshift = 6;
6091 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
6092 i.memshift = 5;
6093 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
6094 i.memshift = 4;
6095 }
6096
6097 if (type)
6098 {
6099 if (type->bitfield.zmmword)
6100 i.memshift = 6;
6101 else if (type->bitfield.ymmword)
6102 i.memshift = 5;
6103 else if (type->bitfield.xmmword)
6104 i.memshift = 4;
6105 }
6106
6107 /* For the check in fits_in_disp8(). */
6108 if (i.memshift == 0)
6109 i.memshift = -1;
6110 }
43234a1e
L
6111
6112 for (op = 0; op < i.operands; op++)
6113 if (operand_type_check (i.types[op], disp)
6114 && i.op[op].disps->X_op == O_constant)
6115 {
b5014f7a 6116 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 6117 {
b5014f7a
JB
6118 i.types[op].bitfield.disp8 = 1;
6119 return 0;
43234a1e 6120 }
b5014f7a 6121 i.types[op].bitfield.disp8 = 0;
43234a1e
L
6122 }
6123 }
b5014f7a
JB
6124
6125 i.memshift = 0;
43234a1e 6126
6c30d220
L
6127 return 0;
6128}
6129
da4977e0 6130/* Check if encoding requirements are met by the instruction. */
a683cc34
SP
6131
6132static int
da4977e0 6133VEX_check_encoding (const insn_template *t)
a683cc34 6134{
da4977e0
JB
6135 if (i.vec_encoding == vex_encoding_error)
6136 {
6137 i.error = unsupported;
6138 return 1;
6139 }
6140
86fa6981 6141 if (i.vec_encoding == vex_encoding_evex)
43234a1e 6142 {
86fa6981 6143 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 6144 if (!is_evex_encoding (t))
86fa6981
L
6145 {
6146 i.error = unsupported;
6147 return 1;
6148 }
6149 return 0;
43234a1e
L
6150 }
6151
a683cc34 6152 if (!t->opcode_modifier.vex)
86fa6981
L
6153 {
6154 /* This instruction template doesn't have VEX prefix. */
6155 if (i.vec_encoding != vex_encoding_default)
6156 {
6157 i.error = unsupported;
6158 return 1;
6159 }
6160 return 0;
6161 }
a683cc34 6162
a683cc34
SP
6163 return 0;
6164}
6165
d3ce72d0 6166static const insn_template *
83b16ac6 6167match_template (char mnem_suffix)
29b0f896
AM
6168{
6169 /* Points to template once we've found it. */
d3ce72d0 6170 const insn_template *t;
40fb9820 6171 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 6172 i386_operand_type overlap4;
29b0f896 6173 unsigned int found_reverse_match;
dc2be329 6174 i386_opcode_modifier suffix_check;
40fb9820 6175 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 6176 int addr_prefix_disp;
45a4bb20 6177 unsigned int j, size_match, check_register;
5614d22c 6178 enum i386_error specific_error = 0;
29b0f896 6179
c0f3af97
L
6180#if MAX_OPERANDS != 5
6181# error "MAX_OPERANDS must be 5."
f48ff2ae
L
6182#endif
6183
29b0f896 6184 found_reverse_match = 0;
539e75ad 6185 addr_prefix_disp = -1;
40fb9820 6186
dc2be329 6187 /* Prepare for mnemonic suffix check. */
40fb9820 6188 memset (&suffix_check, 0, sizeof (suffix_check));
dc2be329
L
6189 switch (mnem_suffix)
6190 {
6191 case BYTE_MNEM_SUFFIX:
6192 suffix_check.no_bsuf = 1;
6193 break;
6194 case WORD_MNEM_SUFFIX:
6195 suffix_check.no_wsuf = 1;
6196 break;
6197 case SHORT_MNEM_SUFFIX:
6198 suffix_check.no_ssuf = 1;
6199 break;
6200 case LONG_MNEM_SUFFIX:
6201 suffix_check.no_lsuf = 1;
6202 break;
6203 case QWORD_MNEM_SUFFIX:
6204 suffix_check.no_qsuf = 1;
6205 break;
6206 default:
6207 /* NB: In Intel syntax, normally we can check for memory operand
6208 size when there is no mnemonic suffix. But jmp and call have
6209 2 different encodings with Dword memory operand size, one with
6210 No_ldSuf and the other without. i.suffix is set to
6211 LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
6212 if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
6213 suffix_check.no_ldsuf = 1;
83b16ac6
JB
6214 }
6215
01559ecc
L
6216 /* Must have right number of operands. */
6217 i.error = number_of_operands_mismatch;
6218
45aa61fe 6219 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 6220 {
539e75ad 6221 addr_prefix_disp = -1;
dbbc8b7e 6222 found_reverse_match = 0;
539e75ad 6223
29b0f896
AM
6224 if (i.operands != t->operands)
6225 continue;
6226
50aecf8c 6227 /* Check processor support. */
a65babc9 6228 i.error = unsupported;
45a4bb20 6229 if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH)
50aecf8c
L
6230 continue;
6231
57392598
CL
6232 /* Check Pseudo Prefix. */
6233 i.error = unsupported;
6234 if (t->opcode_modifier.pseudovexprefix
6235 && !(i.vec_encoding == vex_encoding_vex
6236 || i.vec_encoding == vex_encoding_vex3))
6237 continue;
6238
e1d4d893 6239 /* Check AT&T mnemonic. */
a65babc9 6240 i.error = unsupported_with_intel_mnemonic;
e1d4d893 6241 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
6242 continue;
6243
4b5aaf5f 6244 /* Check AT&T/Intel syntax. */
a65babc9 6245 i.error = unsupported_syntax;
5c07affc 6246 if ((intel_syntax && t->opcode_modifier.attsyntax)
4b5aaf5f 6247 || (!intel_syntax && t->opcode_modifier.intelsyntax))
1efbbeb4
L
6248 continue;
6249
4b5aaf5f
L
6250 /* Check Intel64/AMD64 ISA. */
6251 switch (isa64)
6252 {
6253 default:
6254 /* Default: Don't accept Intel64. */
6255 if (t->opcode_modifier.isa64 == INTEL64)
6256 continue;
6257 break;
6258 case amd64:
6259 /* -mamd64: Don't accept Intel64 and Intel64 only. */
6260 if (t->opcode_modifier.isa64 >= INTEL64)
6261 continue;
6262 break;
6263 case intel64:
6264 /* -mintel64: Don't accept AMD64. */
5990e377 6265 if (t->opcode_modifier.isa64 == AMD64 && flag_code == CODE_64BIT)
4b5aaf5f
L
6266 continue;
6267 break;
6268 }
6269
dc2be329 6270 /* Check the suffix. */
a65babc9 6271 i.error = invalid_instruction_suffix;
dc2be329
L
6272 if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
6273 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
6274 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
6275 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
6276 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
6277 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
83b16ac6 6278 continue;
29b0f896 6279
3ac21baa
JB
6280 size_match = operand_size_match (t);
6281 if (!size_match)
7d5e4556 6282 continue;
539e75ad 6283
6f2f06be
JB
6284 /* This is intentionally not
6285
0cfa3eb3 6286 if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
6f2f06be
JB
6287
6288 as the case of a missing * on the operand is accepted (perhaps with
6289 a warning, issued further down). */
0cfa3eb3 6290 if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
6f2f06be
JB
6291 {
6292 i.error = operand_type_mismatch;
6293 continue;
6294 }
6295
5c07affc
L
6296 for (j = 0; j < MAX_OPERANDS; j++)
6297 operand_types[j] = t->operand_types[j];
6298
e365e234
JB
6299 /* In general, don't allow
6300 - 64-bit operands outside of 64-bit mode,
6301 - 32-bit operands on pre-386. */
4873e243 6302 j = i.imm_operands + (t->operands > i.imm_operands + 1);
e365e234
JB
6303 if (((i.suffix == QWORD_MNEM_SUFFIX
6304 && flag_code != CODE_64BIT
389d00a5
JB
6305 && !(t->opcode_modifier.opcodespace == SPACE_0F
6306 && t->base_opcode == 0xc7
5e74b495 6307 && t->opcode_modifier.opcodeprefix == PREFIX_NONE
8b65b895 6308 && t->extension_opcode == 1) /* cmpxchg8b */)
e365e234
JB
6309 || (i.suffix == LONG_MNEM_SUFFIX
6310 && !cpu_arch_flags.bitfield.cpui386))
45aa61fe 6311 && (intel_syntax
3cd7f3e3 6312 ? (t->opcode_modifier.mnemonicsize != IGNORESIZE
45aa61fe
AM
6313 && !intel_float_operand (t->name))
6314 : intel_float_operand (t->name) != 2)
4873e243
JB
6315 && (t->operands == i.imm_operands
6316 || (operand_types[i.imm_operands].bitfield.class != RegMMX
6317 && operand_types[i.imm_operands].bitfield.class != RegSIMD
6318 && operand_types[i.imm_operands].bitfield.class != RegMask)
6319 || (operand_types[j].bitfield.class != RegMMX
6320 && operand_types[j].bitfield.class != RegSIMD
6321 && operand_types[j].bitfield.class != RegMask))
63112cd6 6322 && !t->opcode_modifier.sib)
192dc9c6
JB
6323 continue;
6324
29b0f896 6325 /* Do not verify operands when there are none. */
e365e234 6326 if (!t->operands)
da4977e0
JB
6327 {
6328 if (VEX_check_encoding (t))
6329 {
6330 specific_error = i.error;
6331 continue;
6332 }
6333
6334 /* We've found a match; break out of loop. */
6335 break;
6336 }
252b5132 6337
48bcea9f
JB
6338 if (!t->opcode_modifier.jump
6339 || t->opcode_modifier.jump == JUMP_ABSOLUTE)
6340 {
6341 /* There should be only one Disp operand. */
6342 for (j = 0; j < MAX_OPERANDS; j++)
6343 if (operand_type_check (operand_types[j], disp))
539e75ad 6344 break;
48bcea9f
JB
6345 if (j < MAX_OPERANDS)
6346 {
6347 bfd_boolean override = (i.prefix[ADDR_PREFIX] != 0);
6348
6349 addr_prefix_disp = j;
6350
6351 /* Address size prefix will turn Disp64/Disp32S/Disp32/Disp16
6352 operand into Disp32/Disp32/Disp16/Disp32 operand. */
6353 switch (flag_code)
40fb9820 6354 {
48bcea9f
JB
6355 case CODE_16BIT:
6356 override = !override;
6357 /* Fall through. */
6358 case CODE_32BIT:
6359 if (operand_types[j].bitfield.disp32
6360 && operand_types[j].bitfield.disp16)
40fb9820 6361 {
48bcea9f
JB
6362 operand_types[j].bitfield.disp16 = override;
6363 operand_types[j].bitfield.disp32 = !override;
40fb9820 6364 }
48bcea9f
JB
6365 operand_types[j].bitfield.disp32s = 0;
6366 operand_types[j].bitfield.disp64 = 0;
6367 break;
6368
6369 case CODE_64BIT:
6370 if (operand_types[j].bitfield.disp32s
6371 || operand_types[j].bitfield.disp64)
40fb9820 6372 {
48bcea9f
JB
6373 operand_types[j].bitfield.disp64 &= !override;
6374 operand_types[j].bitfield.disp32s &= !override;
6375 operand_types[j].bitfield.disp32 = override;
40fb9820 6376 }
48bcea9f
JB
6377 operand_types[j].bitfield.disp16 = 0;
6378 break;
40fb9820 6379 }
539e75ad 6380 }
48bcea9f 6381 }
539e75ad 6382
02a86693 6383 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
35648716
JB
6384 if (i.reloc[0] == BFD_RELOC_386_GOT32
6385 && t->base_opcode == 0xa0
6386 && t->opcode_modifier.opcodespace == SPACE_BASE)
02a86693
L
6387 continue;
6388
56ffb741 6389 /* We check register size if needed. */
e2195274
JB
6390 if (t->opcode_modifier.checkregsize)
6391 {
6392 check_register = (1 << t->operands) - 1;
6393 if (i.broadcast)
6394 check_register &= ~(1 << i.broadcast->operand);
6395 }
6396 else
6397 check_register = 0;
6398
c6fb90c8 6399 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
6400 switch (t->operands)
6401 {
6402 case 1:
40fb9820 6403 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
6404 continue;
6405 break;
6406 case 2:
33eaf5de 6407 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
6408 only in 32bit mode and we can use opcode 0x90. In 64bit
6409 mode, we can't use 0x90 for xchg %eax, %eax since it should
6410 zero-extend %eax to %rax. */
6411 if (flag_code == CODE_64BIT
6412 && t->base_opcode == 0x90
35648716 6413 && t->opcode_modifier.opcodespace == SPACE_BASE
75e5731b
JB
6414 && i.types[0].bitfield.instance == Accum
6415 && i.types[0].bitfield.dword
6416 && i.types[1].bitfield.instance == Accum
6417 && i.types[1].bitfield.dword)
8b38ad71 6418 continue;
1212781b
JB
6419 /* xrelease mov %eax, <disp> is another special case. It must not
6420 match the accumulator-only encoding of mov. */
6421 if (flag_code != CODE_64BIT
6422 && i.hle_prefix
6423 && t->base_opcode == 0xa0
35648716 6424 && t->opcode_modifier.opcodespace == SPACE_BASE
75e5731b 6425 && i.types[0].bitfield.instance == Accum
8dc0818e 6426 && (i.flags[1] & Operand_Mem))
1212781b 6427 continue;
f5eb1d70
JB
6428 /* Fall through. */
6429
6430 case 3:
3ac21baa
JB
6431 if (!(size_match & MATCH_STRAIGHT))
6432 goto check_reverse;
64c49ab3
JB
6433 /* Reverse direction of operands if swapping is possible in the first
6434 place (operands need to be symmetric) and
6435 - the load form is requested, and the template is a store form,
6436 - the store form is requested, and the template is a load form,
6437 - the non-default (swapped) form is requested. */
6438 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 6439 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
6440 && !operand_type_all_zero (&overlap1))
6441 switch (i.dir_encoding)
6442 {
6443 case dir_encoding_load:
6444 if (operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6445 || t->opcode_modifier.regmem)
64c49ab3
JB
6446 goto check_reverse;
6447 break;
6448
6449 case dir_encoding_store:
6450 if (!operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6451 && !t->opcode_modifier.regmem)
64c49ab3
JB
6452 goto check_reverse;
6453 break;
6454
6455 case dir_encoding_swap:
6456 goto check_reverse;
6457
6458 case dir_encoding_default:
6459 break;
6460 }
86fa6981 6461 /* If we want store form, we skip the current load. */
64c49ab3
JB
6462 if ((i.dir_encoding == dir_encoding_store
6463 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
6464 && i.mem_operands == 0
6465 && t->opcode_modifier.load)
fa99fab2 6466 continue;
1a0670f3 6467 /* Fall through. */
f48ff2ae 6468 case 4:
c0f3af97 6469 case 5:
c6fb90c8 6470 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
6471 if (!operand_type_match (overlap0, i.types[0])
6472 || !operand_type_match (overlap1, i.types[1])
e2195274 6473 || ((check_register & 3) == 3
dc821c5f 6474 && !operand_type_register_match (i.types[0],
40fb9820 6475 operand_types[0],
dc821c5f 6476 i.types[1],
40fb9820 6477 operand_types[1])))
29b0f896
AM
6478 {
6479 /* Check if other direction is valid ... */
38e314eb 6480 if (!t->opcode_modifier.d)
29b0f896
AM
6481 continue;
6482
dc1e8a47 6483 check_reverse:
3ac21baa
JB
6484 if (!(size_match & MATCH_REVERSE))
6485 continue;
29b0f896 6486 /* Try reversing direction of operands. */
f5eb1d70
JB
6487 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
6488 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 6489 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 6490 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 6491 || (check_register
dc821c5f 6492 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
6493 operand_types[i.operands - 1],
6494 i.types[i.operands - 1],
45664ddb 6495 operand_types[0])))
29b0f896
AM
6496 {
6497 /* Does not match either direction. */
6498 continue;
6499 }
38e314eb 6500 /* found_reverse_match holds which of D or FloatR
29b0f896 6501 we've found. */
38e314eb
JB
6502 if (!t->opcode_modifier.d)
6503 found_reverse_match = 0;
6504 else if (operand_types[0].bitfield.tbyte)
8a2ed489 6505 found_reverse_match = Opcode_FloatD;
dbbc8b7e 6506 else if (operand_types[0].bitfield.xmmword
f5eb1d70 6507 || operand_types[i.operands - 1].bitfield.xmmword
3528c362
JB
6508 || operand_types[0].bitfield.class == RegMMX
6509 || operand_types[i.operands - 1].bitfield.class == RegMMX
dbbc8b7e
JB
6510 || is_any_vex_encoding(t))
6511 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
6512 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 6513 else
38e314eb 6514 found_reverse_match = Opcode_D;
40fb9820 6515 if (t->opcode_modifier.floatr)
8a2ed489 6516 found_reverse_match |= Opcode_FloatR;
29b0f896 6517 }
f48ff2ae 6518 else
29b0f896 6519 {
f48ff2ae 6520 /* Found a forward 2 operand match here. */
d1cbb4db
L
6521 switch (t->operands)
6522 {
c0f3af97
L
6523 case 5:
6524 overlap4 = operand_type_and (i.types[4],
6525 operand_types[4]);
1a0670f3 6526 /* Fall through. */
d1cbb4db 6527 case 4:
c6fb90c8
L
6528 overlap3 = operand_type_and (i.types[3],
6529 operand_types[3]);
1a0670f3 6530 /* Fall through. */
d1cbb4db 6531 case 3:
c6fb90c8
L
6532 overlap2 = operand_type_and (i.types[2],
6533 operand_types[2]);
d1cbb4db
L
6534 break;
6535 }
29b0f896 6536
f48ff2ae
L
6537 switch (t->operands)
6538 {
c0f3af97
L
6539 case 5:
6540 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 6541 || !operand_type_register_match (i.types[3],
c0f3af97 6542 operand_types[3],
c0f3af97
L
6543 i.types[4],
6544 operand_types[4]))
6545 continue;
1a0670f3 6546 /* Fall through. */
f48ff2ae 6547 case 4:
40fb9820 6548 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
6549 || ((check_register & 0xa) == 0xa
6550 && !operand_type_register_match (i.types[1],
f7768225
JB
6551 operand_types[1],
6552 i.types[3],
e2195274
JB
6553 operand_types[3]))
6554 || ((check_register & 0xc) == 0xc
6555 && !operand_type_register_match (i.types[2],
6556 operand_types[2],
6557 i.types[3],
6558 operand_types[3])))
f48ff2ae 6559 continue;
1a0670f3 6560 /* Fall through. */
f48ff2ae
L
6561 case 3:
6562 /* Here we make use of the fact that there are no
23e42951 6563 reverse match 3 operand instructions. */
40fb9820 6564 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
6565 || ((check_register & 5) == 5
6566 && !operand_type_register_match (i.types[0],
23e42951
JB
6567 operand_types[0],
6568 i.types[2],
e2195274
JB
6569 operand_types[2]))
6570 || ((check_register & 6) == 6
6571 && !operand_type_register_match (i.types[1],
6572 operand_types[1],
6573 i.types[2],
6574 operand_types[2])))
f48ff2ae
L
6575 continue;
6576 break;
6577 }
29b0f896 6578 }
f48ff2ae 6579 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
6580 slip through to break. */
6581 }
c0f3af97 6582
da4977e0
JB
6583 /* Check if vector operands are valid. */
6584 if (check_VecOperands (t))
6585 {
6586 specific_error = i.error;
6587 continue;
6588 }
6589
6590 /* Check if VEX/EVEX encoding requirements can be satisfied. */
6591 if (VEX_check_encoding (t))
5614d22c
JB
6592 {
6593 specific_error = i.error;
6594 continue;
6595 }
a683cc34 6596
29b0f896
AM
6597 /* We've found a match; break out of loop. */
6598 break;
6599 }
6600
6601 if (t == current_templates->end)
6602 {
6603 /* We found no match. */
a65babc9 6604 const char *err_msg;
5614d22c 6605 switch (specific_error ? specific_error : i.error)
a65babc9
L
6606 {
6607 default:
6608 abort ();
86e026a4 6609 case operand_size_mismatch:
a65babc9
L
6610 err_msg = _("operand size mismatch");
6611 break;
6612 case operand_type_mismatch:
6613 err_msg = _("operand type mismatch");
6614 break;
6615 case register_type_mismatch:
6616 err_msg = _("register type mismatch");
6617 break;
6618 case number_of_operands_mismatch:
6619 err_msg = _("number of operands mismatch");
6620 break;
6621 case invalid_instruction_suffix:
6622 err_msg = _("invalid instruction suffix");
6623 break;
6624 case bad_imm4:
4a2608e3 6625 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6626 break;
a65babc9
L
6627 case unsupported_with_intel_mnemonic:
6628 err_msg = _("unsupported with Intel mnemonic");
6629 break;
6630 case unsupported_syntax:
6631 err_msg = _("unsupported syntax");
6632 break;
6633 case unsupported:
35262a23 6634 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6635 current_templates->start->name);
6636 return NULL;
260cd341
LC
6637 case invalid_sib_address:
6638 err_msg = _("invalid SIB address");
6639 break;
6c30d220
L
6640 case invalid_vsib_address:
6641 err_msg = _("invalid VSIB address");
6642 break;
7bab8ab5
JB
6643 case invalid_vector_register_set:
6644 err_msg = _("mask, index, and destination registers must be distinct");
6645 break;
260cd341
LC
6646 case invalid_tmm_register_set:
6647 err_msg = _("all tmm registers must be distinct");
6648 break;
6c30d220
L
6649 case unsupported_vector_index_register:
6650 err_msg = _("unsupported vector index register");
6651 break;
43234a1e
L
6652 case unsupported_broadcast:
6653 err_msg = _("unsupported broadcast");
6654 break;
43234a1e
L
6655 case broadcast_needed:
6656 err_msg = _("broadcast is needed for operand of such type");
6657 break;
6658 case unsupported_masking:
6659 err_msg = _("unsupported masking");
6660 break;
6661 case mask_not_on_destination:
6662 err_msg = _("mask not on destination operand");
6663 break;
6664 case no_default_mask:
6665 err_msg = _("default mask isn't allowed");
6666 break;
6667 case unsupported_rc_sae:
6668 err_msg = _("unsupported static rounding/sae");
6669 break;
6670 case rc_sae_operand_not_last_imm:
6671 if (intel_syntax)
6672 err_msg = _("RC/SAE operand must precede immediate operands");
6673 else
6674 err_msg = _("RC/SAE operand must follow immediate operands");
6675 break;
6676 case invalid_register_operand:
6677 err_msg = _("invalid register operand");
6678 break;
a65babc9
L
6679 }
6680 as_bad (_("%s for `%s'"), err_msg,
891edac4 6681 current_templates->start->name);
fa99fab2 6682 return NULL;
29b0f896 6683 }
252b5132 6684
29b0f896
AM
6685 if (!quiet_warnings)
6686 {
6687 if (!intel_syntax
0cfa3eb3 6688 && (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE)))
6f2f06be 6689 as_warn (_("indirect %s without `*'"), t->name);
29b0f896 6690
40fb9820 6691 if (t->opcode_modifier.isprefix
3cd7f3e3 6692 && t->opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6693 {
6694 /* Warn them that a data or address size prefix doesn't
6695 affect assembly of the next line of code. */
6696 as_warn (_("stand-alone `%s' prefix"), t->name);
6697 }
6698 }
6699
6700 /* Copy the template we found. */
9a182d04 6701 install_template (t);
539e75ad
L
6702
6703 if (addr_prefix_disp != -1)
6704 i.tm.operand_types[addr_prefix_disp]
6705 = operand_types[addr_prefix_disp];
6706
29b0f896
AM
6707 if (found_reverse_match)
6708 {
dfd69174
JB
6709 /* If we found a reverse match we must alter the opcode direction
6710 bit and clear/flip the regmem modifier one. found_reverse_match
6711 holds bits to change (different for int & float insns). */
29b0f896
AM
6712
6713 i.tm.base_opcode ^= found_reverse_match;
6714
f5eb1d70
JB
6715 i.tm.operand_types[0] = operand_types[i.operands - 1];
6716 i.tm.operand_types[i.operands - 1] = operand_types[0];
dfd69174
JB
6717
6718 /* Certain SIMD insns have their load forms specified in the opcode
6719 table, and hence we need to _set_ RegMem instead of clearing it.
6720 We need to avoid setting the bit though on insns like KMOVW. */
6721 i.tm.opcode_modifier.regmem
6722 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
6723 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
6724 && !i.tm.opcode_modifier.regmem;
29b0f896
AM
6725 }
6726
fa99fab2 6727 return t;
29b0f896
AM
6728}
6729
6730static int
e3bb37b5 6731check_string (void)
29b0f896 6732{
51c8edf6
JB
6733 unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
6734 unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
8dc0818e 6735
51c8edf6 6736 if (i.seg[op] != NULL && i.seg[op] != &es)
29b0f896 6737 {
51c8edf6
JB
6738 as_bad (_("`%s' operand %u must use `%ses' segment"),
6739 i.tm.name,
6740 intel_syntax ? i.tm.operands - es_op : es_op + 1,
6741 register_prefix);
6742 return 0;
29b0f896 6743 }
51c8edf6
JB
6744
6745 /* There's only ever one segment override allowed per instruction.
6746 This instruction possibly has a legal segment override on the
6747 second operand, so copy the segment to where non-string
6748 instructions store it, allowing common code. */
6749 i.seg[op] = i.seg[1];
6750
29b0f896
AM
6751 return 1;
6752}
6753
6754static int
543613e9 6755process_suffix (void)
29b0f896 6756{
389d00a5 6757 bfd_boolean is_crc32 = FALSE, is_movx = FALSE;
8b65b895 6758
29b0f896
AM
6759 /* If matched instruction specifies an explicit instruction mnemonic
6760 suffix, use it. */
673fe0f0 6761 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6762 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6763 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6764 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6765 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6766 i.suffix = QWORD_MNEM_SUFFIX;
13e600d0 6767 else if (i.reg_operands
c8f8eebc
JB
6768 && (i.operands > 1 || i.types[0].bitfield.class == Reg)
6769 && !i.tm.opcode_modifier.addrprefixopreg)
29b0f896 6770 {
65fca059 6771 unsigned int numop = i.operands;
389d00a5
JB
6772
6773 /* MOVSX/MOVZX */
6774 is_movx = (i.tm.opcode_modifier.opcodespace == SPACE_0F
6775 && (i.tm.base_opcode | 8) == 0xbe)
6776 || (i.tm.opcode_modifier.opcodespace == SPACE_BASE
6777 && i.tm.base_opcode == 0x63
6778 && i.tm.cpu_flags.bitfield.cpu64);
6779
8b65b895 6780 /* CRC32 */
389d00a5
JB
6781 is_crc32 = (i.tm.base_opcode == 0xf0
6782 && i.tm.opcode_modifier.opcodespace == SPACE_0F38
8b65b895 6783 && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2);
65fca059
JB
6784
6785 /* movsx/movzx want only their source operand considered here, for the
6786 ambiguity checking below. The suffix will be replaced afterwards
6787 to represent the destination (register). */
389d00a5 6788 if (is_movx && (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63))
65fca059
JB
6789 --i.operands;
6790
643bb870 6791 /* crc32 needs REX.W set regardless of suffix / source operand size. */
8b65b895 6792 if (is_crc32 && i.tm.operand_types[1].bitfield.qword)
643bb870
JB
6793 i.rex |= REX_W;
6794
29b0f896 6795 /* If there's no instruction mnemonic suffix we try to invent one
13e600d0 6796 based on GPR operands. */
29b0f896
AM
6797 if (!i.suffix)
6798 {
6799 /* We take i.suffix from the last register operand specified,
6800 Destination register type is more significant than source
381d071f
L
6801 register type. crc32 in SSE4.2 prefers source register
6802 type. */
8b65b895 6803 unsigned int op = is_crc32 ? 1 : i.operands;
20592a94 6804
1a035124
JB
6805 while (op--)
6806 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
6807 || i.tm.operand_types[op].bitfield.instance == Accum)
6808 {
6809 if (i.types[op].bitfield.class != Reg)
6810 continue;
6811 if (i.types[op].bitfield.byte)
6812 i.suffix = BYTE_MNEM_SUFFIX;
6813 else if (i.types[op].bitfield.word)
6814 i.suffix = WORD_MNEM_SUFFIX;
6815 else if (i.types[op].bitfield.dword)
6816 i.suffix = LONG_MNEM_SUFFIX;
6817 else if (i.types[op].bitfield.qword)
6818 i.suffix = QWORD_MNEM_SUFFIX;
6819 else
6820 continue;
6821 break;
6822 }
65fca059
JB
6823
6824 /* As an exception, movsx/movzx silently default to a byte source
6825 in AT&T mode. */
389d00a5 6826 if (is_movx && i.tm.opcode_modifier.w && !i.suffix && !intel_syntax)
65fca059 6827 i.suffix = BYTE_MNEM_SUFFIX;
29b0f896
AM
6828 }
6829 else if (i.suffix == BYTE_MNEM_SUFFIX)
6830 {
2eb952a4 6831 if (intel_syntax
3cd7f3e3 6832 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6833 && i.tm.opcode_modifier.no_bsuf)
6834 i.suffix = 0;
6835 else if (!check_byte_reg ())
29b0f896
AM
6836 return 0;
6837 }
6838 else if (i.suffix == LONG_MNEM_SUFFIX)
6839 {
2eb952a4 6840 if (intel_syntax
3cd7f3e3 6841 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6842 && i.tm.opcode_modifier.no_lsuf
6843 && !i.tm.opcode_modifier.todword
6844 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
6845 i.suffix = 0;
6846 else if (!check_long_reg ())
29b0f896
AM
6847 return 0;
6848 }
6849 else if (i.suffix == QWORD_MNEM_SUFFIX)
6850 {
955e1e6a 6851 if (intel_syntax
3cd7f3e3 6852 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6853 && i.tm.opcode_modifier.no_qsuf
6854 && !i.tm.opcode_modifier.todword
6855 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
6856 i.suffix = 0;
6857 else if (!check_qword_reg ())
29b0f896
AM
6858 return 0;
6859 }
6860 else if (i.suffix == WORD_MNEM_SUFFIX)
6861 {
2eb952a4 6862 if (intel_syntax
3cd7f3e3 6863 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6864 && i.tm.opcode_modifier.no_wsuf)
6865 i.suffix = 0;
6866 else if (!check_word_reg ())
29b0f896
AM
6867 return 0;
6868 }
3cd7f3e3
L
6869 else if (intel_syntax
6870 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6871 /* Do nothing if the instruction is going to ignore the prefix. */
6872 ;
6873 else
6874 abort ();
65fca059
JB
6875
6876 /* Undo the movsx/movzx change done above. */
6877 i.operands = numop;
29b0f896 6878 }
3cd7f3e3
L
6879 else if (i.tm.opcode_modifier.mnemonicsize == DEFAULTSIZE
6880 && !i.suffix)
29b0f896 6881 {
13e600d0
JB
6882 i.suffix = stackop_size;
6883 if (stackop_size == LONG_MNEM_SUFFIX)
06f74c5c
L
6884 {
6885 /* stackop_size is set to LONG_MNEM_SUFFIX for the
6886 .code16gcc directive to support 16-bit mode with
6887 32-bit address. For IRET without a suffix, generate
6888 16-bit IRET (opcode 0xcf) to return from an interrupt
6889 handler. */
13e600d0
JB
6890 if (i.tm.base_opcode == 0xcf)
6891 {
6892 i.suffix = WORD_MNEM_SUFFIX;
6893 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
6894 }
6895 /* Warn about changed behavior for segment register push/pop. */
6896 else if ((i.tm.base_opcode | 1) == 0x07)
6897 as_warn (_("generating 32-bit `%s', unlike earlier gas versions"),
6898 i.tm.name);
06f74c5c 6899 }
29b0f896 6900 }
c006a730 6901 else if (!i.suffix
0cfa3eb3
JB
6902 && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
6903 || i.tm.opcode_modifier.jump == JUMP_BYTE
6904 || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
389d00a5
JB
6905 || (i.tm.opcode_modifier.opcodespace == SPACE_0F
6906 && i.tm.base_opcode == 0x01 /* [ls][gi]dt */
64e74474 6907 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
6908 {
6909 switch (flag_code)
6910 {
6911 case CODE_64BIT:
40fb9820 6912 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a 6913 {
828c2a25
JB
6914 if (i.tm.opcode_modifier.jump == JUMP_BYTE
6915 || i.tm.opcode_modifier.no_lsuf)
6916 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a
JB
6917 break;
6918 }
1a0670f3 6919 /* Fall through. */
9306ca4a 6920 case CODE_32BIT:
40fb9820 6921 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
6922 i.suffix = LONG_MNEM_SUFFIX;
6923 break;
6924 case CODE_16BIT:
40fb9820 6925 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
6926 i.suffix = WORD_MNEM_SUFFIX;
6927 break;
6928 }
6929 }
252b5132 6930
c006a730 6931 if (!i.suffix
3cd7f3e3 6932 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8
JB
6933 /* Also cover lret/retf/iret in 64-bit mode. */
6934 || (flag_code == CODE_64BIT
6935 && !i.tm.opcode_modifier.no_lsuf
6936 && !i.tm.opcode_modifier.no_qsuf))
3cd7f3e3 6937 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
8bbb3ad8
JB
6938 /* Explicit sizing prefixes are assumed to disambiguate insns. */
6939 && !i.prefix[DATA_PREFIX] && !(i.prefix[REX_PREFIX] & REX_W)
62b3f548
JB
6940 /* Accept FLDENV et al without suffix. */
6941 && (i.tm.opcode_modifier.no_ssuf || i.tm.opcode_modifier.floatmf))
29b0f896 6942 {
6c0946d0 6943 unsigned int suffixes, evex = 0;
c006a730
JB
6944
6945 suffixes = !i.tm.opcode_modifier.no_bsuf;
6946 if (!i.tm.opcode_modifier.no_wsuf)
6947 suffixes |= 1 << 1;
6948 if (!i.tm.opcode_modifier.no_lsuf)
6949 suffixes |= 1 << 2;
6950 if (!i.tm.opcode_modifier.no_ldsuf)
6951 suffixes |= 1 << 3;
6952 if (!i.tm.opcode_modifier.no_ssuf)
6953 suffixes |= 1 << 4;
6954 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
6955 suffixes |= 1 << 5;
6956
6c0946d0
JB
6957 /* For [XYZ]MMWORD operands inspect operand sizes. While generally
6958 also suitable for AT&T syntax mode, it was requested that this be
6959 restricted to just Intel syntax. */
b9915cbc 6960 if (intel_syntax && is_any_vex_encoding (&i.tm) && !i.broadcast)
6c0946d0 6961 {
b9915cbc 6962 unsigned int op;
6c0946d0 6963
b9915cbc 6964 for (op = 0; op < i.tm.operands; ++op)
6c0946d0 6965 {
b9915cbc
JB
6966 if (is_evex_encoding (&i.tm)
6967 && !cpu_arch_flags.bitfield.cpuavx512vl)
6c0946d0 6968 {
b9915cbc
JB
6969 if (i.tm.operand_types[op].bitfield.ymmword)
6970 i.tm.operand_types[op].bitfield.xmmword = 0;
6971 if (i.tm.operand_types[op].bitfield.zmmword)
6972 i.tm.operand_types[op].bitfield.ymmword = 0;
6973 if (!i.tm.opcode_modifier.evex
6974 || i.tm.opcode_modifier.evex == EVEXDYN)
6975 i.tm.opcode_modifier.evex = EVEX512;
6976 }
6c0946d0 6977
b9915cbc
JB
6978 if (i.tm.operand_types[op].bitfield.xmmword
6979 + i.tm.operand_types[op].bitfield.ymmword
6980 + i.tm.operand_types[op].bitfield.zmmword < 2)
6981 continue;
6c0946d0 6982
b9915cbc
JB
6983 /* Any properly sized operand disambiguates the insn. */
6984 if (i.types[op].bitfield.xmmword
6985 || i.types[op].bitfield.ymmword
6986 || i.types[op].bitfield.zmmword)
6987 {
6988 suffixes &= ~(7 << 6);
6989 evex = 0;
6990 break;
6991 }
6c0946d0 6992
b9915cbc
JB
6993 if ((i.flags[op] & Operand_Mem)
6994 && i.tm.operand_types[op].bitfield.unspecified)
6995 {
6996 if (i.tm.operand_types[op].bitfield.xmmword)
6997 suffixes |= 1 << 6;
6998 if (i.tm.operand_types[op].bitfield.ymmword)
6999 suffixes |= 1 << 7;
7000 if (i.tm.operand_types[op].bitfield.zmmword)
7001 suffixes |= 1 << 8;
7002 if (is_evex_encoding (&i.tm))
7003 evex = EVEX512;
6c0946d0
JB
7004 }
7005 }
7006 }
7007
7008 /* Are multiple suffixes / operand sizes allowed? */
c006a730 7009 if (suffixes & (suffixes - 1))
9306ca4a 7010 {
873494c8 7011 if (intel_syntax
3cd7f3e3 7012 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8 7013 || operand_check == check_error))
9306ca4a 7014 {
c006a730 7015 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
9306ca4a
JB
7016 return 0;
7017 }
c006a730 7018 if (operand_check == check_error)
9306ca4a 7019 {
c006a730
JB
7020 as_bad (_("no instruction mnemonic suffix given and "
7021 "no register operands; can't size `%s'"), i.tm.name);
9306ca4a
JB
7022 return 0;
7023 }
c006a730 7024 if (operand_check == check_warning)
873494c8
JB
7025 as_warn (_("%s; using default for `%s'"),
7026 intel_syntax
7027 ? _("ambiguous operand size")
7028 : _("no instruction mnemonic suffix given and "
7029 "no register operands"),
7030 i.tm.name);
c006a730
JB
7031
7032 if (i.tm.opcode_modifier.floatmf)
7033 i.suffix = SHORT_MNEM_SUFFIX;
389d00a5 7034 else if (is_movx)
65fca059 7035 /* handled below */;
6c0946d0
JB
7036 else if (evex)
7037 i.tm.opcode_modifier.evex = evex;
c006a730
JB
7038 else if (flag_code == CODE_16BIT)
7039 i.suffix = WORD_MNEM_SUFFIX;
1a035124 7040 else if (!i.tm.opcode_modifier.no_lsuf)
c006a730 7041 i.suffix = LONG_MNEM_SUFFIX;
1a035124
JB
7042 else
7043 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a 7044 }
29b0f896 7045 }
252b5132 7046
389d00a5 7047 if (is_movx)
65fca059
JB
7048 {
7049 /* In Intel syntax, movsx/movzx must have a "suffix" (checked above).
7050 In AT&T syntax, if there is no suffix (warned about above), the default
7051 will be byte extension. */
7052 if (i.tm.opcode_modifier.w && i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
7053 i.tm.base_opcode |= 1;
7054
7055 /* For further processing, the suffix should represent the destination
7056 (register). This is already the case when one was used with
7057 mov[sz][bw]*, but we need to replace it for mov[sz]x, or if there was
7058 no suffix to begin with. */
7059 if (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63 || !i.suffix)
7060 {
7061 if (i.types[1].bitfield.word)
7062 i.suffix = WORD_MNEM_SUFFIX;
7063 else if (i.types[1].bitfield.qword)
7064 i.suffix = QWORD_MNEM_SUFFIX;
7065 else
7066 i.suffix = LONG_MNEM_SUFFIX;
7067
7068 i.tm.opcode_modifier.w = 0;
7069 }
7070 }
7071
50128d0c
JB
7072 if (!i.tm.opcode_modifier.modrm && i.reg_operands && i.tm.operands < 3)
7073 i.short_form = (i.tm.operand_types[0].bitfield.class == Reg)
7074 != (i.tm.operand_types[1].bitfield.class == Reg);
7075
d2224064
JB
7076 /* Change the opcode based on the operand size given by i.suffix. */
7077 switch (i.suffix)
29b0f896 7078 {
d2224064
JB
7079 /* Size floating point instruction. */
7080 case LONG_MNEM_SUFFIX:
7081 if (i.tm.opcode_modifier.floatmf)
7082 {
7083 i.tm.base_opcode ^= 4;
7084 break;
7085 }
7086 /* fall through */
7087 case WORD_MNEM_SUFFIX:
7088 case QWORD_MNEM_SUFFIX:
29b0f896 7089 /* It's not a byte, select word/dword operation. */
40fb9820 7090 if (i.tm.opcode_modifier.w)
29b0f896 7091 {
50128d0c 7092 if (i.short_form)
29b0f896
AM
7093 i.tm.base_opcode |= 8;
7094 else
7095 i.tm.base_opcode |= 1;
7096 }
d2224064
JB
7097 /* fall through */
7098 case SHORT_MNEM_SUFFIX:
29b0f896
AM
7099 /* Now select between word & dword operations via the operand
7100 size prefix, except for instructions that will ignore this
7101 prefix anyway. */
c8f8eebc 7102 if (i.suffix != QWORD_MNEM_SUFFIX
3cd7f3e3 7103 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
c8f8eebc
JB
7104 && !i.tm.opcode_modifier.floatmf
7105 && !is_any_vex_encoding (&i.tm)
7106 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
7107 || (flag_code == CODE_64BIT
7108 && i.tm.opcode_modifier.jump == JUMP_BYTE)))
24eab124
AM
7109 {
7110 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 7111
0cfa3eb3 7112 if (i.tm.opcode_modifier.jump == JUMP_BYTE) /* jcxz, loop */
29b0f896 7113 prefix = ADDR_PREFIX_OPCODE;
252b5132 7114
29b0f896
AM
7115 if (!add_prefix (prefix))
7116 return 0;
24eab124 7117 }
252b5132 7118
29b0f896
AM
7119 /* Set mode64 for an operand. */
7120 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 7121 && flag_code == CODE_64BIT
d2224064 7122 && !i.tm.opcode_modifier.norex64
4ed21b58 7123 && !i.tm.opcode_modifier.vexw
46e883c5 7124 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
7125 need rex64. */
7126 && ! (i.operands == 2
7127 && i.tm.base_opcode == 0x90
7128 && i.tm.extension_opcode == None
75e5731b
JB
7129 && i.types[0].bitfield.instance == Accum
7130 && i.types[0].bitfield.qword
7131 && i.types[1].bitfield.instance == Accum
7132 && i.types[1].bitfield.qword))
d2224064 7133 i.rex |= REX_W;
3e73aa7c 7134
d2224064 7135 break;
8bbb3ad8
JB
7136
7137 case 0:
f9a6a8f0 7138 /* Select word/dword/qword operation with explicit data sizing prefix
8bbb3ad8
JB
7139 when there are no suitable register operands. */
7140 if (i.tm.opcode_modifier.w
7141 && (i.prefix[DATA_PREFIX] || (i.prefix[REX_PREFIX] & REX_W))
7142 && (!i.reg_operands
7143 || (i.reg_operands == 1
7144 /* ShiftCount */
7145 && (i.tm.operand_types[0].bitfield.instance == RegC
7146 /* InOutPortReg */
7147 || i.tm.operand_types[0].bitfield.instance == RegD
7148 || i.tm.operand_types[1].bitfield.instance == RegD
7149 /* CRC32 */
8b65b895 7150 || is_crc32))))
8bbb3ad8
JB
7151 i.tm.base_opcode |= 1;
7152 break;
29b0f896 7153 }
7ecd2f8b 7154
c8f8eebc 7155 if (i.tm.opcode_modifier.addrprefixopreg)
c0a30a9f 7156 {
c8f8eebc
JB
7157 gas_assert (!i.suffix);
7158 gas_assert (i.reg_operands);
c0a30a9f 7159
c8f8eebc
JB
7160 if (i.tm.operand_types[0].bitfield.instance == Accum
7161 || i.operands == 1)
7162 {
7163 /* The address size override prefix changes the size of the
7164 first operand. */
7165 if (flag_code == CODE_64BIT
7166 && i.op[0].regs->reg_type.bitfield.word)
7167 {
7168 as_bad (_("16-bit addressing unavailable for `%s'"),
7169 i.tm.name);
7170 return 0;
7171 }
7172
7173 if ((flag_code == CODE_32BIT
7174 ? i.op[0].regs->reg_type.bitfield.word
7175 : i.op[0].regs->reg_type.bitfield.dword)
7176 && !add_prefix (ADDR_PREFIX_OPCODE))
7177 return 0;
7178 }
c0a30a9f
L
7179 else
7180 {
c8f8eebc
JB
7181 /* Check invalid register operand when the address size override
7182 prefix changes the size of register operands. */
7183 unsigned int op;
7184 enum { need_word, need_dword, need_qword } need;
7185
27f13469 7186 /* Check the register operand for the address size prefix if
b3a3496f 7187 the memory operand has no real registers, like symbol, DISP
829f3fe1 7188 or bogus (x32-only) symbol(%rip) when symbol(%eip) is meant. */
27f13469
L
7189 if (i.mem_operands == 1
7190 && i.reg_operands == 1
7191 && i.operands == 2
27f13469 7192 && i.types[1].bitfield.class == Reg
b3a3496f
L
7193 && (flag_code == CODE_32BIT
7194 ? i.op[1].regs->reg_type.bitfield.word
7195 : i.op[1].regs->reg_type.bitfield.dword)
7196 && ((i.base_reg == NULL && i.index_reg == NULL)
829f3fe1
JB
7197#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
7198 || (x86_elf_abi == X86_64_X32_ABI
7199 && i.base_reg
b3a3496f
L
7200 && i.base_reg->reg_num == RegIP
7201 && i.base_reg->reg_type.bitfield.qword))
829f3fe1
JB
7202#else
7203 || 0)
7204#endif
27f13469
L
7205 && !add_prefix (ADDR_PREFIX_OPCODE))
7206 return 0;
7207
c8f8eebc
JB
7208 if (flag_code == CODE_32BIT)
7209 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
7210 else if (i.prefix[ADDR_PREFIX])
c0a30a9f
L
7211 need = need_dword;
7212 else
7213 need = flag_code == CODE_64BIT ? need_qword : need_word;
c0a30a9f 7214
c8f8eebc
JB
7215 for (op = 0; op < i.operands; op++)
7216 {
7217 if (i.types[op].bitfield.class != Reg)
7218 continue;
7219
7220 switch (need)
7221 {
7222 case need_word:
7223 if (i.op[op].regs->reg_type.bitfield.word)
7224 continue;
7225 break;
7226 case need_dword:
7227 if (i.op[op].regs->reg_type.bitfield.dword)
7228 continue;
7229 break;
7230 case need_qword:
7231 if (i.op[op].regs->reg_type.bitfield.qword)
7232 continue;
7233 break;
7234 }
7235
7236 as_bad (_("invalid register operand size for `%s'"),
7237 i.tm.name);
7238 return 0;
7239 }
7240 }
c0a30a9f
L
7241 }
7242
29b0f896
AM
7243 return 1;
7244}
3e73aa7c 7245
29b0f896 7246static int
543613e9 7247check_byte_reg (void)
29b0f896
AM
7248{
7249 int op;
543613e9 7250
29b0f896
AM
7251 for (op = i.operands; --op >= 0;)
7252 {
dc821c5f 7253 /* Skip non-register operands. */
bab6aec1 7254 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
7255 continue;
7256
29b0f896
AM
7257 /* If this is an eight bit register, it's OK. If it's the 16 or
7258 32 bit version of an eight bit register, we will just use the
7259 low portion, and that's OK too. */
dc821c5f 7260 if (i.types[op].bitfield.byte)
29b0f896
AM
7261 continue;
7262
5a819eb9 7263 /* I/O port address operands are OK too. */
75e5731b
JB
7264 if (i.tm.operand_types[op].bitfield.instance == RegD
7265 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
7266 continue;
7267
9706160a 7268 /* crc32 only wants its source operand checked here. */
389d00a5
JB
7269 if (i.tm.base_opcode == 0xf0
7270 && i.tm.opcode_modifier.opcodespace == SPACE_0F38
8b65b895
L
7271 && i.tm.opcode_modifier.opcodeprefix == PREFIX_0XF2
7272 && op != 0)
9344ff29
L
7273 continue;
7274
29b0f896 7275 /* Any other register is bad. */
73c76375
JB
7276 as_bad (_("`%s%s' not allowed with `%s%c'"),
7277 register_prefix, i.op[op].regs->reg_name,
7278 i.tm.name, i.suffix);
7279 return 0;
29b0f896
AM
7280 }
7281 return 1;
7282}
7283
7284static int
e3bb37b5 7285check_long_reg (void)
29b0f896
AM
7286{
7287 int op;
7288
7289 for (op = i.operands; --op >= 0;)
dc821c5f 7290 /* Skip non-register operands. */
bab6aec1 7291 if (i.types[op].bitfield.class != Reg)
dc821c5f 7292 continue;
29b0f896
AM
7293 /* Reject eight bit registers, except where the template requires
7294 them. (eg. movzb) */
dc821c5f 7295 else if (i.types[op].bitfield.byte
bab6aec1 7296 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7297 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7298 && (i.tm.operand_types[op].bitfield.word
7299 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7300 {
a540244d
L
7301 as_bad (_("`%s%s' not allowed with `%s%c'"),
7302 register_prefix,
29b0f896
AM
7303 i.op[op].regs->reg_name,
7304 i.tm.name,
7305 i.suffix);
7306 return 0;
7307 }
be4c5e58
L
7308 /* Error if the e prefix on a general reg is missing. */
7309 else if (i.types[op].bitfield.word
bab6aec1 7310 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7311 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7312 && i.tm.operand_types[op].bitfield.dword)
29b0f896 7313 {
be4c5e58
L
7314 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7315 register_prefix, i.op[op].regs->reg_name,
7316 i.suffix);
7317 return 0;
252b5132 7318 }
e4630f71 7319 /* Warn if the r prefix on a general reg is present. */
dc821c5f 7320 else if (i.types[op].bitfield.qword
bab6aec1 7321 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7322 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7323 && i.tm.operand_types[op].bitfield.dword)
252b5132 7324 {
34828aad 7325 if (intel_syntax
65fca059 7326 && i.tm.opcode_modifier.toqword
3528c362 7327 && i.types[0].bitfield.class != RegSIMD)
34828aad 7328 {
ca61edf2 7329 /* Convert to QWORD. We want REX byte. */
34828aad
L
7330 i.suffix = QWORD_MNEM_SUFFIX;
7331 }
7332 else
7333 {
2b5d6a91 7334 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7335 register_prefix, i.op[op].regs->reg_name,
7336 i.suffix);
7337 return 0;
7338 }
29b0f896
AM
7339 }
7340 return 1;
7341}
252b5132 7342
29b0f896 7343static int
e3bb37b5 7344check_qword_reg (void)
29b0f896
AM
7345{
7346 int op;
252b5132 7347
29b0f896 7348 for (op = i.operands; --op >= 0; )
dc821c5f 7349 /* Skip non-register operands. */
bab6aec1 7350 if (i.types[op].bitfield.class != Reg)
dc821c5f 7351 continue;
29b0f896
AM
7352 /* Reject eight bit registers, except where the template requires
7353 them. (eg. movzb) */
dc821c5f 7354 else if (i.types[op].bitfield.byte
bab6aec1 7355 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7356 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7357 && (i.tm.operand_types[op].bitfield.word
7358 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7359 {
a540244d
L
7360 as_bad (_("`%s%s' not allowed with `%s%c'"),
7361 register_prefix,
29b0f896
AM
7362 i.op[op].regs->reg_name,
7363 i.tm.name,
7364 i.suffix);
7365 return 0;
7366 }
e4630f71 7367 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
7368 else if ((i.types[op].bitfield.word
7369 || i.types[op].bitfield.dword)
bab6aec1 7370 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7371 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7372 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
7373 {
7374 /* Prohibit these changes in the 64bit mode, since the
7375 lowering is more complicated. */
34828aad 7376 if (intel_syntax
ca61edf2 7377 && i.tm.opcode_modifier.todword
3528c362 7378 && i.types[0].bitfield.class != RegSIMD)
34828aad 7379 {
ca61edf2 7380 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
7381 i.suffix = LONG_MNEM_SUFFIX;
7382 }
7383 else
7384 {
2b5d6a91 7385 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7386 register_prefix, i.op[op].regs->reg_name,
7387 i.suffix);
7388 return 0;
7389 }
252b5132 7390 }
29b0f896
AM
7391 return 1;
7392}
252b5132 7393
29b0f896 7394static int
e3bb37b5 7395check_word_reg (void)
29b0f896
AM
7396{
7397 int op;
7398 for (op = i.operands; --op >= 0;)
dc821c5f 7399 /* Skip non-register operands. */
bab6aec1 7400 if (i.types[op].bitfield.class != Reg)
dc821c5f 7401 continue;
29b0f896
AM
7402 /* Reject eight bit registers, except where the template requires
7403 them. (eg. movzb) */
dc821c5f 7404 else if (i.types[op].bitfield.byte
bab6aec1 7405 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7406 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7407 && (i.tm.operand_types[op].bitfield.word
7408 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7409 {
a540244d
L
7410 as_bad (_("`%s%s' not allowed with `%s%c'"),
7411 register_prefix,
29b0f896
AM
7412 i.op[op].regs->reg_name,
7413 i.tm.name,
7414 i.suffix);
7415 return 0;
7416 }
9706160a
JB
7417 /* Error if the e or r prefix on a general reg is present. */
7418 else if ((i.types[op].bitfield.dword
dc821c5f 7419 || i.types[op].bitfield.qword)
bab6aec1 7420 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7421 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7422 && i.tm.operand_types[op].bitfield.word)
252b5132 7423 {
9706160a
JB
7424 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7425 register_prefix, i.op[op].regs->reg_name,
7426 i.suffix);
7427 return 0;
29b0f896
AM
7428 }
7429 return 1;
7430}
252b5132 7431
29b0f896 7432static int
40fb9820 7433update_imm (unsigned int j)
29b0f896 7434{
bc0844ae 7435 i386_operand_type overlap = i.types[j];
40fb9820
L
7436 if ((overlap.bitfield.imm8
7437 || overlap.bitfield.imm8s
7438 || overlap.bitfield.imm16
7439 || overlap.bitfield.imm32
7440 || overlap.bitfield.imm32s
7441 || overlap.bitfield.imm64)
0dfbf9d7
L
7442 && !operand_type_equal (&overlap, &imm8)
7443 && !operand_type_equal (&overlap, &imm8s)
7444 && !operand_type_equal (&overlap, &imm16)
7445 && !operand_type_equal (&overlap, &imm32)
7446 && !operand_type_equal (&overlap, &imm32s)
7447 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
7448 {
7449 if (i.suffix)
7450 {
40fb9820
L
7451 i386_operand_type temp;
7452
0dfbf9d7 7453 operand_type_set (&temp, 0);
7ab9ffdd 7454 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
7455 {
7456 temp.bitfield.imm8 = overlap.bitfield.imm8;
7457 temp.bitfield.imm8s = overlap.bitfield.imm8s;
7458 }
7459 else if (i.suffix == WORD_MNEM_SUFFIX)
7460 temp.bitfield.imm16 = overlap.bitfield.imm16;
7461 else if (i.suffix == QWORD_MNEM_SUFFIX)
7462 {
7463 temp.bitfield.imm64 = overlap.bitfield.imm64;
7464 temp.bitfield.imm32s = overlap.bitfield.imm32s;
7465 }
7466 else
7467 temp.bitfield.imm32 = overlap.bitfield.imm32;
7468 overlap = temp;
29b0f896 7469 }
0dfbf9d7
L
7470 else if (operand_type_equal (&overlap, &imm16_32_32s)
7471 || operand_type_equal (&overlap, &imm16_32)
7472 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 7473 {
40fb9820 7474 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 7475 overlap = imm16;
40fb9820 7476 else
65da13b5 7477 overlap = imm32s;
29b0f896 7478 }
8bbb3ad8
JB
7479 else if (i.prefix[REX_PREFIX] & REX_W)
7480 overlap = operand_type_and (overlap, imm32s);
7481 else if (i.prefix[DATA_PREFIX])
7482 overlap = operand_type_and (overlap,
7483 flag_code != CODE_16BIT ? imm16 : imm32);
0dfbf9d7
L
7484 if (!operand_type_equal (&overlap, &imm8)
7485 && !operand_type_equal (&overlap, &imm8s)
7486 && !operand_type_equal (&overlap, &imm16)
7487 && !operand_type_equal (&overlap, &imm32)
7488 && !operand_type_equal (&overlap, &imm32s)
7489 && !operand_type_equal (&overlap, &imm64))
29b0f896 7490 {
4eed87de
AM
7491 as_bad (_("no instruction mnemonic suffix given; "
7492 "can't determine immediate size"));
29b0f896
AM
7493 return 0;
7494 }
7495 }
40fb9820 7496 i.types[j] = overlap;
29b0f896 7497
40fb9820
L
7498 return 1;
7499}
7500
7501static int
7502finalize_imm (void)
7503{
bc0844ae 7504 unsigned int j, n;
29b0f896 7505
bc0844ae
L
7506 /* Update the first 2 immediate operands. */
7507 n = i.operands > 2 ? 2 : i.operands;
7508 if (n)
7509 {
7510 for (j = 0; j < n; j++)
7511 if (update_imm (j) == 0)
7512 return 0;
40fb9820 7513
bc0844ae
L
7514 /* The 3rd operand can't be immediate operand. */
7515 gas_assert (operand_type_check (i.types[2], imm) == 0);
7516 }
29b0f896
AM
7517
7518 return 1;
7519}
7520
7521static int
e3bb37b5 7522process_operands (void)
29b0f896
AM
7523{
7524 /* Default segment register this instruction will use for memory
7525 accesses. 0 means unknown. This is only for optimizing out
7526 unnecessary segment overrides. */
7527 const seg_entry *default_seg = 0;
7528
a5aeccd9
JB
7529 if (i.tm.opcode_modifier.sse2avx)
7530 {
7531 /* Legacy encoded insns allow explicit REX prefixes, so these prefixes
7532 need converting. */
7533 i.rex |= i.prefix[REX_PREFIX] & (REX_W | REX_R | REX_X | REX_B);
7534 i.prefix[REX_PREFIX] = 0;
7535 i.rex_encoding = 0;
7536 }
c423d21a
JB
7537 /* ImmExt should be processed after SSE2AVX. */
7538 else if (i.tm.opcode_modifier.immext)
7539 process_immext ();
a5aeccd9 7540
2426c15f 7541 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 7542 {
91d6fa6a
NC
7543 unsigned int dupl = i.operands;
7544 unsigned int dest = dupl - 1;
9fcfb3d7
L
7545 unsigned int j;
7546
c0f3af97 7547 /* The destination must be an xmm register. */
9c2799c2 7548 gas_assert (i.reg_operands
91d6fa6a 7549 && MAX_OPERANDS > dupl
7ab9ffdd 7550 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 7551
75e5731b 7552 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7553 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 7554 {
8cd7925b 7555 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
7556 {
7557 /* Keep xmm0 for instructions with VEX prefix and 3
7558 sources. */
75e5731b 7559 i.tm.operand_types[0].bitfield.instance = InstanceNone;
3528c362 7560 i.tm.operand_types[0].bitfield.class = RegSIMD;
c0f3af97
L
7561 goto duplicate;
7562 }
e2ec9d29 7563 else
c0f3af97
L
7564 {
7565 /* We remove the first xmm0 and keep the number of
7566 operands unchanged, which in fact duplicates the
7567 destination. */
7568 for (j = 1; j < i.operands; j++)
7569 {
7570 i.op[j - 1] = i.op[j];
7571 i.types[j - 1] = i.types[j];
7572 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
8dc0818e 7573 i.flags[j - 1] = i.flags[j];
c0f3af97
L
7574 }
7575 }
7576 }
7577 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 7578 {
91d6fa6a 7579 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
7580 && (i.tm.opcode_modifier.vexsources
7581 == VEX3SOURCES));
c0f3af97
L
7582
7583 /* Add the implicit xmm0 for instructions with VEX prefix
7584 and 3 sources. */
7585 for (j = i.operands; j > 0; j--)
7586 {
7587 i.op[j] = i.op[j - 1];
7588 i.types[j] = i.types[j - 1];
7589 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 7590 i.flags[j] = i.flags[j - 1];
c0f3af97
L
7591 }
7592 i.op[0].regs
629310ab 7593 = (const reg_entry *) str_hash_find (reg_hash, "xmm0");
7ab9ffdd 7594 i.types[0] = regxmm;
c0f3af97
L
7595 i.tm.operand_types[0] = regxmm;
7596
7597 i.operands += 2;
7598 i.reg_operands += 2;
7599 i.tm.operands += 2;
7600
91d6fa6a 7601 dupl++;
c0f3af97 7602 dest++;
91d6fa6a
NC
7603 i.op[dupl] = i.op[dest];
7604 i.types[dupl] = i.types[dest];
7605 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7606 i.flags[dupl] = i.flags[dest];
e2ec9d29 7607 }
c0f3af97
L
7608 else
7609 {
dc1e8a47 7610 duplicate:
c0f3af97
L
7611 i.operands++;
7612 i.reg_operands++;
7613 i.tm.operands++;
7614
91d6fa6a
NC
7615 i.op[dupl] = i.op[dest];
7616 i.types[dupl] = i.types[dest];
7617 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7618 i.flags[dupl] = i.flags[dest];
c0f3af97
L
7619 }
7620
7621 if (i.tm.opcode_modifier.immext)
7622 process_immext ();
7623 }
75e5731b 7624 else if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7625 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
7626 {
7627 unsigned int j;
7628
9fcfb3d7
L
7629 for (j = 1; j < i.operands; j++)
7630 {
7631 i.op[j - 1] = i.op[j];
7632 i.types[j - 1] = i.types[j];
7633
7634 /* We need to adjust fields in i.tm since they are used by
7635 build_modrm_byte. */
7636 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
7637
7638 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
7639 }
7640
e2ec9d29
L
7641 i.operands--;
7642 i.reg_operands--;
e2ec9d29
L
7643 i.tm.operands--;
7644 }
920d2ddc
IT
7645 else if (i.tm.opcode_modifier.implicitquadgroup)
7646 {
a477a8c4
JB
7647 unsigned int regnum, first_reg_in_group, last_reg_in_group;
7648
920d2ddc 7649 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 7650 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
7651 regnum = register_number (i.op[1].regs);
7652 first_reg_in_group = regnum & ~3;
7653 last_reg_in_group = first_reg_in_group + 3;
7654 if (regnum != first_reg_in_group)
7655 as_warn (_("source register `%s%s' implicitly denotes"
7656 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
7657 register_prefix, i.op[1].regs->reg_name,
7658 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
7659 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
7660 i.tm.name);
7661 }
e2ec9d29
L
7662 else if (i.tm.opcode_modifier.regkludge)
7663 {
7664 /* The imul $imm, %reg instruction is converted into
7665 imul $imm, %reg, %reg, and the clr %reg instruction
7666 is converted into xor %reg, %reg. */
7667
7668 unsigned int first_reg_op;
7669
7670 if (operand_type_check (i.types[0], reg))
7671 first_reg_op = 0;
7672 else
7673 first_reg_op = 1;
7674 /* Pretend we saw the extra register operand. */
9c2799c2 7675 gas_assert (i.reg_operands == 1
7ab9ffdd 7676 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
7677 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
7678 i.types[first_reg_op + 1] = i.types[first_reg_op];
7679 i.operands++;
7680 i.reg_operands++;
29b0f896
AM
7681 }
7682
85b80b0f 7683 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
7684 {
7685 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
7686 must be put into the modrm byte). Now, we make the modrm and
7687 index base bytes based on all the info we've collected. */
29b0f896
AM
7688
7689 default_seg = build_modrm_byte ();
7690 }
00cee14f 7691 else if (i.types[0].bitfield.class == SReg)
85b80b0f
JB
7692 {
7693 if (flag_code != CODE_64BIT
7694 ? i.tm.base_opcode == POP_SEG_SHORT
7695 && i.op[0].regs->reg_num == 1
389d00a5 7696 : (i.tm.base_opcode | 1) == (POP_SEG386_SHORT & 0xff)
85b80b0f
JB
7697 && i.op[0].regs->reg_num < 4)
7698 {
7699 as_bad (_("you can't `%s %s%s'"),
7700 i.tm.name, register_prefix, i.op[0].regs->reg_name);
7701 return 0;
7702 }
389d00a5
JB
7703 if (i.op[0].regs->reg_num > 3
7704 && i.tm.opcode_modifier.opcodespace == SPACE_BASE )
85b80b0f 7705 {
389d00a5
JB
7706 i.tm.base_opcode ^= (POP_SEG_SHORT ^ POP_SEG386_SHORT) & 0xff;
7707 i.tm.opcode_modifier.opcodespace = SPACE_0F;
85b80b0f
JB
7708 }
7709 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
7710 }
389d00a5
JB
7711 else if (i.tm.opcode_modifier.opcodespace == SPACE_BASE
7712 && (i.tm.base_opcode & ~3) == MOV_AX_DISP32)
29b0f896
AM
7713 {
7714 default_seg = &ds;
7715 }
40fb9820 7716 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
7717 {
7718 /* For the string instructions that allow a segment override
7719 on one of their operands, the default segment is ds. */
7720 default_seg = &ds;
7721 }
50128d0c 7722 else if (i.short_form)
85b80b0f
JB
7723 {
7724 /* The register or float register operand is in operand
7725 0 or 1. */
bab6aec1 7726 unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
85b80b0f
JB
7727
7728 /* Register goes in low 3 bits of opcode. */
7729 i.tm.base_opcode |= i.op[op].regs->reg_num;
7730 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7731 i.rex |= REX_B;
7732 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
7733 {
7734 /* Warn about some common errors, but press on regardless.
7735 The first case can be generated by gcc (<= 2.8.1). */
7736 if (i.operands == 2)
7737 {
7738 /* Reversed arguments on faddp, fsubp, etc. */
7739 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
7740 register_prefix, i.op[!intel_syntax].regs->reg_name,
7741 register_prefix, i.op[intel_syntax].regs->reg_name);
7742 }
7743 else
7744 {
7745 /* Extraneous `l' suffix on fp insn. */
7746 as_warn (_("translating to `%s %s%s'"), i.tm.name,
7747 register_prefix, i.op[0].regs->reg_name);
7748 }
7749 }
7750 }
29b0f896 7751
514a8bb0 7752 if ((i.seg[0] || i.prefix[SEG_PREFIX])
514a8bb0 7753 && i.tm.base_opcode == 0x8d /* lea */
35648716 7754 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
514a8bb0 7755 && !is_any_vex_encoding(&i.tm))
92334ad2
JB
7756 {
7757 if (!quiet_warnings)
7758 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
7759 if (optimize)
7760 {
7761 i.seg[0] = NULL;
7762 i.prefix[SEG_PREFIX] = 0;
7763 }
7764 }
52271982
AM
7765
7766 /* If a segment was explicitly specified, and the specified segment
b6773884
JB
7767 is neither the default nor the one already recorded from a prefix,
7768 use an opcode prefix to select it. If we never figured out what
7769 the default segment is, then default_seg will be zero at this
7770 point, and the specified segment prefix will always be used. */
7771 if (i.seg[0]
7772 && i.seg[0] != default_seg
7773 && i.seg[0]->seg_prefix != i.prefix[SEG_PREFIX])
29b0f896
AM
7774 {
7775 if (!add_prefix (i.seg[0]->seg_prefix))
7776 return 0;
7777 }
7778 return 1;
7779}
7780
a5aeccd9
JB
7781static INLINE void set_rex_vrex (const reg_entry *r, unsigned int rex_bit,
7782 bfd_boolean do_sse2avx)
7783{
7784 if (r->reg_flags & RegRex)
7785 {
7786 if (i.rex & rex_bit)
7787 as_bad (_("same type of prefix used twice"));
7788 i.rex |= rex_bit;
7789 }
7790 else if (do_sse2avx && (i.rex & rex_bit) && i.vex.register_specifier)
7791 {
7792 gas_assert (i.vex.register_specifier == r);
7793 i.vex.register_specifier += 8;
7794 }
7795
7796 if (r->reg_flags & RegVRex)
7797 i.vrex |= rex_bit;
7798}
7799
29b0f896 7800static const seg_entry *
e3bb37b5 7801build_modrm_byte (void)
29b0f896
AM
7802{
7803 const seg_entry *default_seg = 0;
c0f3af97 7804 unsigned int source, dest;
8cd7925b 7805 int vex_3_sources;
c0f3af97 7806
8cd7925b 7807 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
7808 if (vex_3_sources)
7809 {
91d6fa6a 7810 unsigned int nds, reg_slot;
4c2c6516 7811 expressionS *exp;
c0f3af97 7812
6b8d3588 7813 dest = i.operands - 1;
c0f3af97 7814 nds = dest - 1;
922d8de8 7815
a683cc34 7816 /* There are 2 kinds of instructions:
bed3d976 7817 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 7818 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 7819 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 7820 ZMM register.
bed3d976 7821 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 7822 plus 1 memory operand, with VexXDS. */
922d8de8 7823 gas_assert ((i.reg_operands == 4
bed3d976
JB
7824 || (i.reg_operands == 3 && i.mem_operands == 1))
7825 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323 7826 && i.tm.opcode_modifier.vexw
3528c362 7827 && i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 7828
48db9223
JB
7829 /* If VexW1 is set, the first non-immediate operand is the source and
7830 the second non-immediate one is encoded in the immediate operand. */
7831 if (i.tm.opcode_modifier.vexw == VEXW1)
7832 {
7833 source = i.imm_operands;
7834 reg_slot = i.imm_operands + 1;
7835 }
7836 else
7837 {
7838 source = i.imm_operands + 1;
7839 reg_slot = i.imm_operands;
7840 }
7841
a683cc34 7842 if (i.imm_operands == 0)
bed3d976
JB
7843 {
7844 /* When there is no immediate operand, generate an 8bit
7845 immediate operand to encode the first operand. */
7846 exp = &im_expressions[i.imm_operands++];
7847 i.op[i.operands].imms = exp;
7848 i.types[i.operands] = imm8;
7849 i.operands++;
7850
3528c362 7851 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
bed3d976
JB
7852 exp->X_op = O_constant;
7853 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
7854 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
7855 }
922d8de8 7856 else
bed3d976 7857 {
9d3bf266
JB
7858 gas_assert (i.imm_operands == 1);
7859 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
7860 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 7861
9d3bf266
JB
7862 /* Turn on Imm8 again so that output_imm will generate it. */
7863 i.types[0].bitfield.imm8 = 1;
bed3d976 7864
3528c362 7865 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
9d3bf266 7866 i.op[0].imms->X_add_number
bed3d976 7867 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 7868 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 7869 }
a683cc34 7870
3528c362 7871 gas_assert (i.tm.operand_types[nds].bitfield.class == RegSIMD);
dae39acc 7872 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
7873 }
7874 else
7875 source = dest = 0;
29b0f896
AM
7876
7877 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
7878 implicit registers do not count. If there are 3 register
7879 operands, it must be a instruction with VexNDS. For a
7880 instruction with VexNDD, the destination register is encoded
7881 in VEX prefix. If there are 4 register operands, it must be
7882 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
7883 if (i.mem_operands == 0
7884 && ((i.reg_operands == 2
2426c15f 7885 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 7886 || (i.reg_operands == 3
2426c15f 7887 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 7888 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 7889 {
cab737b9
L
7890 switch (i.operands)
7891 {
7892 case 2:
7893 source = 0;
7894 break;
7895 case 3:
c81128dc
L
7896 /* When there are 3 operands, one of them may be immediate,
7897 which may be the first or the last operand. Otherwise,
c0f3af97
L
7898 the first operand must be shift count register (cl) or it
7899 is an instruction with VexNDS. */
9c2799c2 7900 gas_assert (i.imm_operands == 1
7ab9ffdd 7901 || (i.imm_operands == 0
2426c15f 7902 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
75e5731b
JB
7903 || (i.types[0].bitfield.instance == RegC
7904 && i.types[0].bitfield.byte))));
40fb9820 7905 if (operand_type_check (i.types[0], imm)
75e5731b
JB
7906 || (i.types[0].bitfield.instance == RegC
7907 && i.types[0].bitfield.byte))
40fb9820
L
7908 source = 1;
7909 else
7910 source = 0;
cab737b9
L
7911 break;
7912 case 4:
368d64cc
L
7913 /* When there are 4 operands, the first two must be 8bit
7914 immediate operands. The source operand will be the 3rd
c0f3af97
L
7915 one.
7916
7917 For instructions with VexNDS, if the first operand
7918 an imm8, the source operand is the 2nd one. If the last
7919 operand is imm8, the source operand is the first one. */
9c2799c2 7920 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
7921 && i.types[0].bitfield.imm8
7922 && i.types[1].bitfield.imm8)
2426c15f 7923 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
7924 && i.imm_operands == 1
7925 && (i.types[0].bitfield.imm8
43234a1e
L
7926 || i.types[i.operands - 1].bitfield.imm8
7927 || i.rounding)));
9f2670f2
L
7928 if (i.imm_operands == 2)
7929 source = 2;
7930 else
c0f3af97
L
7931 {
7932 if (i.types[0].bitfield.imm8)
7933 source = 1;
7934 else
7935 source = 0;
7936 }
c0f3af97
L
7937 break;
7938 case 5:
e771e7c9 7939 if (is_evex_encoding (&i.tm))
43234a1e
L
7940 {
7941 /* For EVEX instructions, when there are 5 operands, the
7942 first one must be immediate operand. If the second one
7943 is immediate operand, the source operand is the 3th
7944 one. If the last one is immediate operand, the source
7945 operand is the 2nd one. */
7946 gas_assert (i.imm_operands == 2
7947 && i.tm.opcode_modifier.sae
7948 && operand_type_check (i.types[0], imm));
7949 if (operand_type_check (i.types[1], imm))
7950 source = 2;
7951 else if (operand_type_check (i.types[4], imm))
7952 source = 1;
7953 else
7954 abort ();
7955 }
cab737b9
L
7956 break;
7957 default:
7958 abort ();
7959 }
7960
c0f3af97
L
7961 if (!vex_3_sources)
7962 {
7963 dest = source + 1;
7964
43234a1e
L
7965 /* RC/SAE operand could be between DEST and SRC. That happens
7966 when one operand is GPR and the other one is XMM/YMM/ZMM
7967 register. */
7968 if (i.rounding && i.rounding->operand == (int) dest)
7969 dest++;
7970
2426c15f 7971 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 7972 {
43234a1e 7973 /* For instructions with VexNDS, the register-only source
c5d0745b 7974 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
dfd69174 7975 register. It is encoded in VEX prefix. */
f12dc422
L
7976
7977 i386_operand_type op;
7978 unsigned int vvvv;
7979
c2ecccb3
L
7980 /* Swap two source operands if needed. */
7981 if (i.tm.opcode_modifier.swapsources)
f12dc422
L
7982 {
7983 vvvv = source;
7984 source = dest;
7985 }
7986 else
7987 vvvv = dest;
7988
7989 op = i.tm.operand_types[vvvv];
c0f3af97 7990 if ((dest + 1) >= i.operands
bab6aec1 7991 || ((op.bitfield.class != Reg
dc821c5f 7992 || (!op.bitfield.dword && !op.bitfield.qword))
3528c362 7993 && op.bitfield.class != RegSIMD
43234a1e 7994 && !operand_type_equal (&op, &regmask)))
c0f3af97 7995 abort ();
f12dc422 7996 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
7997 dest++;
7998 }
7999 }
29b0f896
AM
8000
8001 i.rm.mode = 3;
dfd69174
JB
8002 /* One of the register operands will be encoded in the i.rm.reg
8003 field, the other in the combined i.rm.mode and i.rm.regmem
29b0f896
AM
8004 fields. If no form of this instruction supports a memory
8005 destination operand, then we assume the source operand may
8006 sometimes be a memory operand and so we need to store the
8007 destination in the i.rm.reg field. */
dfd69174 8008 if (!i.tm.opcode_modifier.regmem
40fb9820 8009 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
8010 {
8011 i.rm.reg = i.op[dest].regs->reg_num;
8012 i.rm.regmem = i.op[source].regs->reg_num;
a5aeccd9
JB
8013 set_rex_vrex (i.op[dest].regs, REX_R, i.tm.opcode_modifier.sse2avx);
8014 set_rex_vrex (i.op[source].regs, REX_B, FALSE);
29b0f896
AM
8015 }
8016 else
8017 {
8018 i.rm.reg = i.op[source].regs->reg_num;
8019 i.rm.regmem = i.op[dest].regs->reg_num;
a5aeccd9
JB
8020 set_rex_vrex (i.op[dest].regs, REX_B, i.tm.opcode_modifier.sse2avx);
8021 set_rex_vrex (i.op[source].regs, REX_R, FALSE);
29b0f896 8022 }
e0c7f900 8023 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 8024 {
4a5c67ed 8025 if (i.types[!i.tm.opcode_modifier.regmem].bitfield.class != RegCR)
c4a530c5 8026 abort ();
e0c7f900 8027 i.rex &= ~REX_R;
c4a530c5
JB
8028 add_prefix (LOCK_PREFIX_OPCODE);
8029 }
29b0f896
AM
8030 }
8031 else
8032 { /* If it's not 2 reg operands... */
c0f3af97
L
8033 unsigned int mem;
8034
29b0f896
AM
8035 if (i.mem_operands)
8036 {
8037 unsigned int fake_zero_displacement = 0;
99018f42 8038 unsigned int op;
4eed87de 8039
7ab9ffdd 8040 for (op = 0; op < i.operands; op++)
8dc0818e 8041 if (i.flags[op] & Operand_Mem)
7ab9ffdd 8042 break;
7ab9ffdd 8043 gas_assert (op < i.operands);
29b0f896 8044
63112cd6 8045 if (i.tm.opcode_modifier.sib)
6c30d220 8046 {
260cd341
LC
8047 /* The index register of VSIB shouldn't be RegIZ. */
8048 if (i.tm.opcode_modifier.sib != SIBMEM
8049 && i.index_reg->reg_num == RegIZ)
6c30d220
L
8050 abort ();
8051
8052 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8053 if (!i.base_reg)
8054 {
8055 i.sib.base = NO_BASE_REGISTER;
8056 i.sib.scale = i.log2_scale_factor;
8057 i.types[op].bitfield.disp8 = 0;
8058 i.types[op].bitfield.disp16 = 0;
8059 i.types[op].bitfield.disp64 = 0;
43083a50 8060 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
6c30d220
L
8061 {
8062 /* Must be 32 bit */
8063 i.types[op].bitfield.disp32 = 1;
8064 i.types[op].bitfield.disp32s = 0;
8065 }
8066 else
8067 {
8068 i.types[op].bitfield.disp32 = 0;
8069 i.types[op].bitfield.disp32s = 1;
8070 }
8071 }
260cd341
LC
8072
8073 /* Since the mandatory SIB always has index register, so
8074 the code logic remains unchanged. The non-mandatory SIB
8075 without index register is allowed and will be handled
8076 later. */
8077 if (i.index_reg)
8078 {
8079 if (i.index_reg->reg_num == RegIZ)
8080 i.sib.index = NO_INDEX_REGISTER;
8081 else
8082 i.sib.index = i.index_reg->reg_num;
8083 set_rex_vrex (i.index_reg, REX_X, FALSE);
8084 }
6c30d220
L
8085 }
8086
29b0f896
AM
8087 default_seg = &ds;
8088
8089 if (i.base_reg == 0)
8090 {
8091 i.rm.mode = 0;
8092 if (!i.disp_operands)
9bb129e8 8093 fake_zero_displacement = 1;
29b0f896
AM
8094 if (i.index_reg == 0)
8095 {
73053c1f
JB
8096 i386_operand_type newdisp;
8097
260cd341
LC
8098 /* Both check for VSIB and mandatory non-vector SIB. */
8099 gas_assert (!i.tm.opcode_modifier.sib
8100 || i.tm.opcode_modifier.sib == SIBMEM);
29b0f896 8101 /* Operand is just <disp> */
20f0a1fc 8102 if (flag_code == CODE_64BIT)
29b0f896
AM
8103 {
8104 /* 64bit mode overwrites the 32bit absolute
8105 addressing by RIP relative addressing and
8106 absolute addressing is encoded by one of the
8107 redundant SIB forms. */
8108 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8109 i.sib.base = NO_BASE_REGISTER;
8110 i.sib.index = NO_INDEX_REGISTER;
73053c1f 8111 newdisp = (!i.prefix[ADDR_PREFIX] ? disp32s : disp32);
20f0a1fc 8112 }
fc225355
L
8113 else if ((flag_code == CODE_16BIT)
8114 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
8115 {
8116 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 8117 newdisp = disp16;
20f0a1fc
NC
8118 }
8119 else
8120 {
8121 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 8122 newdisp = disp32;
29b0f896 8123 }
73053c1f
JB
8124 i.types[op] = operand_type_and_not (i.types[op], anydisp);
8125 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 8126 }
63112cd6 8127 else if (!i.tm.opcode_modifier.sib)
29b0f896 8128 {
6c30d220 8129 /* !i.base_reg && i.index_reg */
e968fc9b 8130 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8131 i.sib.index = NO_INDEX_REGISTER;
8132 else
8133 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8134 i.sib.base = NO_BASE_REGISTER;
8135 i.sib.scale = i.log2_scale_factor;
8136 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
8137 i.types[op].bitfield.disp8 = 0;
8138 i.types[op].bitfield.disp16 = 0;
8139 i.types[op].bitfield.disp64 = 0;
43083a50 8140 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
40fb9820
L
8141 {
8142 /* Must be 32 bit */
8143 i.types[op].bitfield.disp32 = 1;
8144 i.types[op].bitfield.disp32s = 0;
8145 }
29b0f896 8146 else
40fb9820
L
8147 {
8148 i.types[op].bitfield.disp32 = 0;
8149 i.types[op].bitfield.disp32s = 1;
8150 }
29b0f896 8151 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8152 i.rex |= REX_X;
29b0f896
AM
8153 }
8154 }
8155 /* RIP addressing for 64bit mode. */
e968fc9b 8156 else if (i.base_reg->reg_num == RegIP)
29b0f896 8157 {
63112cd6 8158 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896 8159 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
8160 i.types[op].bitfield.disp8 = 0;
8161 i.types[op].bitfield.disp16 = 0;
8162 i.types[op].bitfield.disp32 = 0;
8163 i.types[op].bitfield.disp32s = 1;
8164 i.types[op].bitfield.disp64 = 0;
71903a11 8165 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
8166 if (! i.disp_operands)
8167 fake_zero_displacement = 1;
29b0f896 8168 }
dc821c5f 8169 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 8170 {
63112cd6 8171 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896
AM
8172 switch (i.base_reg->reg_num)
8173 {
8174 case 3: /* (%bx) */
8175 if (i.index_reg == 0)
8176 i.rm.regmem = 7;
8177 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
8178 i.rm.regmem = i.index_reg->reg_num - 6;
8179 break;
8180 case 5: /* (%bp) */
8181 default_seg = &ss;
8182 if (i.index_reg == 0)
8183 {
8184 i.rm.regmem = 6;
40fb9820 8185 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
8186 {
8187 /* fake (%bp) into 0(%bp) */
41eb8e88 8188 if (i.disp_encoding == disp_encoding_16bit)
1a02d6b0
L
8189 i.types[op].bitfield.disp16 = 1;
8190 else
8191 i.types[op].bitfield.disp8 = 1;
252b5132 8192 fake_zero_displacement = 1;
29b0f896
AM
8193 }
8194 }
8195 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
8196 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
8197 break;
8198 default: /* (%si) -> 4 or (%di) -> 5 */
8199 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
8200 }
41eb8e88
L
8201 if (!fake_zero_displacement
8202 && !i.disp_operands
8203 && i.disp_encoding)
8204 {
8205 fake_zero_displacement = 1;
8206 if (i.disp_encoding == disp_encoding_8bit)
8207 i.types[op].bitfield.disp8 = 1;
8208 else
8209 i.types[op].bitfield.disp16 = 1;
8210 }
29b0f896
AM
8211 i.rm.mode = mode_from_disp_size (i.types[op]);
8212 }
8213 else /* i.base_reg and 32/64 bit mode */
8214 {
8215 if (flag_code == CODE_64BIT
40fb9820
L
8216 && operand_type_check (i.types[op], disp))
8217 {
73053c1f
JB
8218 i.types[op].bitfield.disp16 = 0;
8219 i.types[op].bitfield.disp64 = 0;
40fb9820 8220 if (i.prefix[ADDR_PREFIX] == 0)
73053c1f
JB
8221 {
8222 i.types[op].bitfield.disp32 = 0;
8223 i.types[op].bitfield.disp32s = 1;
8224 }
40fb9820 8225 else
73053c1f
JB
8226 {
8227 i.types[op].bitfield.disp32 = 1;
8228 i.types[op].bitfield.disp32s = 0;
8229 }
40fb9820 8230 }
20f0a1fc 8231
63112cd6 8232 if (!i.tm.opcode_modifier.sib)
6c30d220 8233 i.rm.regmem = i.base_reg->reg_num;
29b0f896 8234 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 8235 i.rex |= REX_B;
29b0f896
AM
8236 i.sib.base = i.base_reg->reg_num;
8237 /* x86-64 ignores REX prefix bit here to avoid decoder
8238 complications. */
848930b2
JB
8239 if (!(i.base_reg->reg_flags & RegRex)
8240 && (i.base_reg->reg_num == EBP_REG_NUM
8241 || i.base_reg->reg_num == ESP_REG_NUM))
29b0f896 8242 default_seg = &ss;
848930b2 8243 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 8244 {
848930b2 8245 fake_zero_displacement = 1;
1a02d6b0
L
8246 if (i.disp_encoding == disp_encoding_32bit)
8247 i.types[op].bitfield.disp32 = 1;
8248 else
8249 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
8250 }
8251 i.sib.scale = i.log2_scale_factor;
8252 if (i.index_reg == 0)
8253 {
260cd341
LC
8254 /* Only check for VSIB. */
8255 gas_assert (i.tm.opcode_modifier.sib != VECSIB128
8256 && i.tm.opcode_modifier.sib != VECSIB256
8257 && i.tm.opcode_modifier.sib != VECSIB512);
8258
29b0f896
AM
8259 /* <disp>(%esp) becomes two byte modrm with no index
8260 register. We've already stored the code for esp
8261 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
8262 Any base register besides %esp will not use the
8263 extra modrm byte. */
8264 i.sib.index = NO_INDEX_REGISTER;
29b0f896 8265 }
63112cd6 8266 else if (!i.tm.opcode_modifier.sib)
29b0f896 8267 {
e968fc9b 8268 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8269 i.sib.index = NO_INDEX_REGISTER;
8270 else
8271 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8272 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8273 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8274 i.rex |= REX_X;
29b0f896 8275 }
67a4f2b7
AO
8276
8277 if (i.disp_operands
8278 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
8279 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
8280 i.rm.mode = 0;
8281 else
a501d77e
L
8282 {
8283 if (!fake_zero_displacement
8284 && !i.disp_operands
8285 && i.disp_encoding)
8286 {
8287 fake_zero_displacement = 1;
8288 if (i.disp_encoding == disp_encoding_8bit)
8289 i.types[op].bitfield.disp8 = 1;
8290 else
8291 i.types[op].bitfield.disp32 = 1;
8292 }
8293 i.rm.mode = mode_from_disp_size (i.types[op]);
8294 }
29b0f896 8295 }
252b5132 8296
29b0f896
AM
8297 if (fake_zero_displacement)
8298 {
8299 /* Fakes a zero displacement assuming that i.types[op]
8300 holds the correct displacement size. */
8301 expressionS *exp;
8302
9c2799c2 8303 gas_assert (i.op[op].disps == 0);
29b0f896
AM
8304 exp = &disp_expressions[i.disp_operands++];
8305 i.op[op].disps = exp;
8306 exp->X_op = O_constant;
8307 exp->X_add_number = 0;
8308 exp->X_add_symbol = (symbolS *) 0;
8309 exp->X_op_symbol = (symbolS *) 0;
8310 }
c0f3af97
L
8311
8312 mem = op;
29b0f896 8313 }
c0f3af97
L
8314 else
8315 mem = ~0;
252b5132 8316
8c43a48b 8317 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
8318 {
8319 if (operand_type_check (i.types[0], imm))
8320 i.vex.register_specifier = NULL;
8321 else
8322 {
8323 /* VEX.vvvv encodes one of the sources when the first
8324 operand is not an immediate. */
1ef99a7b 8325 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8326 i.vex.register_specifier = i.op[0].regs;
8327 else
8328 i.vex.register_specifier = i.op[1].regs;
8329 }
8330
8331 /* Destination is a XMM register encoded in the ModRM.reg
8332 and VEX.R bit. */
8333 i.rm.reg = i.op[2].regs->reg_num;
8334 if ((i.op[2].regs->reg_flags & RegRex) != 0)
8335 i.rex |= REX_R;
8336
8337 /* ModRM.rm and VEX.B encodes the other source. */
8338 if (!i.mem_operands)
8339 {
8340 i.rm.mode = 3;
8341
1ef99a7b 8342 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8343 i.rm.regmem = i.op[1].regs->reg_num;
8344 else
8345 i.rm.regmem = i.op[0].regs->reg_num;
8346
8347 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8348 i.rex |= REX_B;
8349 }
8350 }
2426c15f 8351 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
8352 {
8353 i.vex.register_specifier = i.op[2].regs;
8354 if (!i.mem_operands)
8355 {
8356 i.rm.mode = 3;
8357 i.rm.regmem = i.op[1].regs->reg_num;
8358 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8359 i.rex |= REX_B;
8360 }
8361 }
29b0f896
AM
8362 /* Fill in i.rm.reg or i.rm.regmem field with register operand
8363 (if any) based on i.tm.extension_opcode. Again, we must be
8364 careful to make sure that segment/control/debug/test/MMX
8365 registers are coded into the i.rm.reg field. */
f88c9eb0 8366 else if (i.reg_operands)
29b0f896 8367 {
99018f42 8368 unsigned int op;
7ab9ffdd
L
8369 unsigned int vex_reg = ~0;
8370
8371 for (op = 0; op < i.operands; op++)
921eafea
L
8372 if (i.types[op].bitfield.class == Reg
8373 || i.types[op].bitfield.class == RegBND
8374 || i.types[op].bitfield.class == RegMask
8375 || i.types[op].bitfield.class == SReg
8376 || i.types[op].bitfield.class == RegCR
8377 || i.types[op].bitfield.class == RegDR
8378 || i.types[op].bitfield.class == RegTR
8379 || i.types[op].bitfield.class == RegSIMD
8380 || i.types[op].bitfield.class == RegMMX)
8381 break;
c0209578 8382
7ab9ffdd
L
8383 if (vex_3_sources)
8384 op = dest;
2426c15f 8385 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
8386 {
8387 /* For instructions with VexNDS, the register-only
8388 source operand is encoded in VEX prefix. */
8389 gas_assert (mem != (unsigned int) ~0);
c0f3af97 8390
7ab9ffdd 8391 if (op > mem)
c0f3af97 8392 {
7ab9ffdd
L
8393 vex_reg = op++;
8394 gas_assert (op < i.operands);
c0f3af97
L
8395 }
8396 else
c0f3af97 8397 {
f12dc422
L
8398 /* Check register-only source operand when two source
8399 operands are swapped. */
8400 if (!i.tm.operand_types[op].bitfield.baseindex
8401 && i.tm.operand_types[op + 1].bitfield.baseindex)
8402 {
8403 vex_reg = op;
8404 op += 2;
8405 gas_assert (mem == (vex_reg + 1)
8406 && op < i.operands);
8407 }
8408 else
8409 {
8410 vex_reg = op + 1;
8411 gas_assert (vex_reg < i.operands);
8412 }
c0f3af97 8413 }
7ab9ffdd 8414 }
2426c15f 8415 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 8416 {
f12dc422 8417 /* For instructions with VexNDD, the register destination
7ab9ffdd 8418 is encoded in VEX prefix. */
f12dc422
L
8419 if (i.mem_operands == 0)
8420 {
8421 /* There is no memory operand. */
8422 gas_assert ((op + 2) == i.operands);
8423 vex_reg = op + 1;
8424 }
8425 else
8d63c93e 8426 {
ed438a93
JB
8427 /* There are only 2 non-immediate operands. */
8428 gas_assert (op < i.imm_operands + 2
8429 && i.operands == i.imm_operands + 2);
8430 vex_reg = i.imm_operands + 1;
f12dc422 8431 }
7ab9ffdd
L
8432 }
8433 else
8434 gas_assert (op < i.operands);
99018f42 8435
7ab9ffdd
L
8436 if (vex_reg != (unsigned int) ~0)
8437 {
f12dc422 8438 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 8439
bab6aec1 8440 if ((type->bitfield.class != Reg
dc821c5f 8441 || (!type->bitfield.dword && !type->bitfield.qword))
3528c362 8442 && type->bitfield.class != RegSIMD
43234a1e 8443 && !operand_type_equal (type, &regmask))
7ab9ffdd 8444 abort ();
f88c9eb0 8445
7ab9ffdd
L
8446 i.vex.register_specifier = i.op[vex_reg].regs;
8447 }
8448
1b9f0c97
L
8449 /* Don't set OP operand twice. */
8450 if (vex_reg != op)
7ab9ffdd 8451 {
1b9f0c97
L
8452 /* If there is an extension opcode to put here, the
8453 register number must be put into the regmem field. */
8454 if (i.tm.extension_opcode != None)
8455 {
8456 i.rm.regmem = i.op[op].regs->reg_num;
a5aeccd9
JB
8457 set_rex_vrex (i.op[op].regs, REX_B,
8458 i.tm.opcode_modifier.sse2avx);
1b9f0c97
L
8459 }
8460 else
8461 {
8462 i.rm.reg = i.op[op].regs->reg_num;
a5aeccd9
JB
8463 set_rex_vrex (i.op[op].regs, REX_R,
8464 i.tm.opcode_modifier.sse2avx);
1b9f0c97 8465 }
7ab9ffdd 8466 }
252b5132 8467
29b0f896
AM
8468 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
8469 must set it to 3 to indicate this is a register operand
8470 in the regmem field. */
8471 if (!i.mem_operands)
8472 i.rm.mode = 3;
8473 }
252b5132 8474
29b0f896 8475 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 8476 if (i.tm.extension_opcode != None)
29b0f896
AM
8477 i.rm.reg = i.tm.extension_opcode;
8478 }
8479 return default_seg;
8480}
252b5132 8481
48ef937e
JB
8482static INLINE void
8483frag_opcode_byte (unsigned char byte)
8484{
8485 if (now_seg != absolute_section)
8486 FRAG_APPEND_1_CHAR (byte);
8487 else
8488 ++abs_section_offset;
8489}
8490
376cd056
JB
8491static unsigned int
8492flip_code16 (unsigned int code16)
8493{
8494 gas_assert (i.tm.operands == 1);
8495
8496 return !(i.prefix[REX_PREFIX] & REX_W)
8497 && (code16 ? i.tm.operand_types[0].bitfield.disp32
8498 || i.tm.operand_types[0].bitfield.disp32s
8499 : i.tm.operand_types[0].bitfield.disp16)
8500 ? CODE16 : 0;
8501}
8502
29b0f896 8503static void
e3bb37b5 8504output_branch (void)
29b0f896
AM
8505{
8506 char *p;
f8a5c266 8507 int size;
29b0f896
AM
8508 int code16;
8509 int prefix;
8510 relax_substateT subtype;
8511 symbolS *sym;
8512 offsetT off;
8513
48ef937e
JB
8514 if (now_seg == absolute_section)
8515 {
8516 as_bad (_("relaxable branches not supported in absolute section"));
8517 return;
8518 }
8519
f8a5c266 8520 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 8521 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
8522
8523 prefix = 0;
8524 if (i.prefix[DATA_PREFIX] != 0)
252b5132 8525 {
29b0f896
AM
8526 prefix = 1;
8527 i.prefixes -= 1;
376cd056 8528 code16 ^= flip_code16(code16);
252b5132 8529 }
29b0f896
AM
8530 /* Pentium4 branch hints. */
8531 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8532 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 8533 {
29b0f896
AM
8534 prefix++;
8535 i.prefixes--;
8536 }
8537 if (i.prefix[REX_PREFIX] != 0)
8538 {
8539 prefix++;
8540 i.prefixes--;
2f66722d
AM
8541 }
8542
7e8b059b
L
8543 /* BND prefixed jump. */
8544 if (i.prefix[BND_PREFIX] != 0)
8545 {
6cb0a70e
JB
8546 prefix++;
8547 i.prefixes--;
7e8b059b
L
8548 }
8549
f2810fe0
JB
8550 if (i.prefixes != 0)
8551 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
29b0f896
AM
8552
8553 /* It's always a symbol; End frag & setup for relax.
8554 Make sure there is enough room in this frag for the largest
8555 instruction we may generate in md_convert_frag. This is 2
8556 bytes for the opcode and room for the prefix and largest
8557 displacement. */
8558 frag_grow (prefix + 2 + 4);
8559 /* Prefix and 1 opcode byte go in fr_fix. */
8560 p = frag_more (prefix + 1);
8561 if (i.prefix[DATA_PREFIX] != 0)
8562 *p++ = DATA_PREFIX_OPCODE;
8563 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
8564 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
8565 *p++ = i.prefix[SEG_PREFIX];
6cb0a70e
JB
8566 if (i.prefix[BND_PREFIX] != 0)
8567 *p++ = BND_PREFIX_OPCODE;
29b0f896
AM
8568 if (i.prefix[REX_PREFIX] != 0)
8569 *p++ = i.prefix[REX_PREFIX];
8570 *p = i.tm.base_opcode;
8571
8572 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 8573 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 8574 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 8575 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 8576 else
f8a5c266 8577 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 8578 subtype |= code16;
3e73aa7c 8579
29b0f896
AM
8580 sym = i.op[0].disps->X_add_symbol;
8581 off = i.op[0].disps->X_add_number;
3e73aa7c 8582
29b0f896
AM
8583 if (i.op[0].disps->X_op != O_constant
8584 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 8585 {
29b0f896
AM
8586 /* Handle complex expressions. */
8587 sym = make_expr_symbol (i.op[0].disps);
8588 off = 0;
8589 }
3e73aa7c 8590
29b0f896
AM
8591 /* 1 possible extra opcode + 4 byte displacement go in var part.
8592 Pass reloc in fr_var. */
d258b828 8593 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 8594}
3e73aa7c 8595
bd7ab16b
L
8596#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8597/* Return TRUE iff PLT32 relocation should be used for branching to
8598 symbol S. */
8599
8600static bfd_boolean
8601need_plt32_p (symbolS *s)
8602{
8603 /* PLT32 relocation is ELF only. */
8604 if (!IS_ELF)
8605 return FALSE;
8606
a5def729
RO
8607#ifdef TE_SOLARIS
8608 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
8609 krtld support it. */
8610 return FALSE;
8611#endif
8612
bd7ab16b
L
8613 /* Since there is no need to prepare for PLT branch on x86-64, we
8614 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
8615 be used as a marker for 32-bit PC-relative branches. */
8616 if (!object_64bit)
8617 return FALSE;
8618
44365e88
AM
8619 if (s == NULL)
8620 return FALSE;
8621
bd7ab16b
L
8622 /* Weak or undefined symbol need PLT32 relocation. */
8623 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
8624 return TRUE;
8625
8626 /* Non-global symbol doesn't need PLT32 relocation. */
8627 if (! S_IS_EXTERNAL (s))
8628 return FALSE;
8629
8630 /* Other global symbols need PLT32 relocation. NB: Symbol with
8631 non-default visibilities are treated as normal global symbol
8632 so that PLT32 relocation can be used as a marker for 32-bit
8633 PC-relative branches. It is useful for linker relaxation. */
8634 return TRUE;
8635}
8636#endif
8637
29b0f896 8638static void
e3bb37b5 8639output_jump (void)
29b0f896
AM
8640{
8641 char *p;
8642 int size;
3e02c1cc 8643 fixS *fixP;
bd7ab16b 8644 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 8645
0cfa3eb3 8646 if (i.tm.opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
8647 {
8648 /* This is a loop or jecxz type instruction. */
8649 size = 1;
8650 if (i.prefix[ADDR_PREFIX] != 0)
8651 {
48ef937e 8652 frag_opcode_byte (ADDR_PREFIX_OPCODE);
29b0f896
AM
8653 i.prefixes -= 1;
8654 }
8655 /* Pentium4 branch hints. */
8656 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8657 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
8658 {
48ef937e 8659 frag_opcode_byte (i.prefix[SEG_PREFIX]);
29b0f896 8660 i.prefixes--;
3e73aa7c
JH
8661 }
8662 }
29b0f896
AM
8663 else
8664 {
8665 int code16;
3e73aa7c 8666
29b0f896
AM
8667 code16 = 0;
8668 if (flag_code == CODE_16BIT)
8669 code16 = CODE16;
3e73aa7c 8670
29b0f896
AM
8671 if (i.prefix[DATA_PREFIX] != 0)
8672 {
48ef937e 8673 frag_opcode_byte (DATA_PREFIX_OPCODE);
29b0f896 8674 i.prefixes -= 1;
376cd056 8675 code16 ^= flip_code16(code16);
29b0f896 8676 }
252b5132 8677
29b0f896
AM
8678 size = 4;
8679 if (code16)
8680 size = 2;
8681 }
9fcc94b6 8682
6cb0a70e
JB
8683 /* BND prefixed jump. */
8684 if (i.prefix[BND_PREFIX] != 0)
29b0f896 8685 {
48ef937e 8686 frag_opcode_byte (i.prefix[BND_PREFIX]);
29b0f896
AM
8687 i.prefixes -= 1;
8688 }
252b5132 8689
6cb0a70e 8690 if (i.prefix[REX_PREFIX] != 0)
7e8b059b 8691 {
48ef937e 8692 frag_opcode_byte (i.prefix[REX_PREFIX]);
7e8b059b
L
8693 i.prefixes -= 1;
8694 }
8695
f2810fe0
JB
8696 if (i.prefixes != 0)
8697 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
e0890092 8698
48ef937e
JB
8699 if (now_seg == absolute_section)
8700 {
9a182d04 8701 abs_section_offset += i.opcode_length + size;
48ef937e
JB
8702 return;
8703 }
8704
9a182d04
JB
8705 p = frag_more (i.opcode_length + size);
8706 switch (i.opcode_length)
42164a71
L
8707 {
8708 case 2:
8709 *p++ = i.tm.base_opcode >> 8;
1a0670f3 8710 /* Fall through. */
42164a71
L
8711 case 1:
8712 *p++ = i.tm.base_opcode;
8713 break;
8714 default:
8715 abort ();
8716 }
e0890092 8717
bd7ab16b
L
8718#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8719 if (size == 4
8720 && jump_reloc == NO_RELOC
8721 && need_plt32_p (i.op[0].disps->X_add_symbol))
8722 jump_reloc = BFD_RELOC_X86_64_PLT32;
8723#endif
8724
8725 jump_reloc = reloc (size, 1, 1, jump_reloc);
8726
3e02c1cc 8727 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 8728 i.op[0].disps, 1, jump_reloc);
3e02c1cc
AM
8729
8730 /* All jumps handled here are signed, but don't use a signed limit
8731 check for 32 and 16 bit jumps as we want to allow wrap around at
8732 4G and 64k respectively. */
8733 if (size == 1)
8734 fixP->fx_signed = 1;
29b0f896 8735}
e0890092 8736
29b0f896 8737static void
e3bb37b5 8738output_interseg_jump (void)
29b0f896
AM
8739{
8740 char *p;
8741 int size;
8742 int prefix;
8743 int code16;
252b5132 8744
29b0f896
AM
8745 code16 = 0;
8746 if (flag_code == CODE_16BIT)
8747 code16 = CODE16;
a217f122 8748
29b0f896
AM
8749 prefix = 0;
8750 if (i.prefix[DATA_PREFIX] != 0)
8751 {
8752 prefix = 1;
8753 i.prefixes -= 1;
8754 code16 ^= CODE16;
8755 }
6cb0a70e
JB
8756
8757 gas_assert (!i.prefix[REX_PREFIX]);
252b5132 8758
29b0f896
AM
8759 size = 4;
8760 if (code16)
8761 size = 2;
252b5132 8762
f2810fe0
JB
8763 if (i.prefixes != 0)
8764 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
252b5132 8765
48ef937e
JB
8766 if (now_seg == absolute_section)
8767 {
8768 abs_section_offset += prefix + 1 + 2 + size;
8769 return;
8770 }
8771
29b0f896
AM
8772 /* 1 opcode; 2 segment; offset */
8773 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 8774
29b0f896
AM
8775 if (i.prefix[DATA_PREFIX] != 0)
8776 *p++ = DATA_PREFIX_OPCODE;
252b5132 8777
29b0f896
AM
8778 if (i.prefix[REX_PREFIX] != 0)
8779 *p++ = i.prefix[REX_PREFIX];
252b5132 8780
29b0f896
AM
8781 *p++ = i.tm.base_opcode;
8782 if (i.op[1].imms->X_op == O_constant)
8783 {
8784 offsetT n = i.op[1].imms->X_add_number;
252b5132 8785
29b0f896
AM
8786 if (size == 2
8787 && !fits_in_unsigned_word (n)
8788 && !fits_in_signed_word (n))
8789 {
8790 as_bad (_("16-bit jump out of range"));
8791 return;
8792 }
8793 md_number_to_chars (p, n, size);
8794 }
8795 else
8796 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 8797 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
6d96a594
C
8798
8799 p += size;
8800 if (i.op[0].imms->X_op == O_constant)
8801 md_number_to_chars (p, (valueT) i.op[0].imms->X_add_number, 2);
8802 else
8803 fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
8804 i.op[0].imms, 0, reloc (2, 0, 0, i.reloc[0]));
29b0f896 8805}
a217f122 8806
b4a3a7b4
L
8807#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8808void
8809x86_cleanup (void)
8810{
8811 char *p;
8812 asection *seg = now_seg;
8813 subsegT subseg = now_subseg;
8814 asection *sec;
8815 unsigned int alignment, align_size_1;
8816 unsigned int isa_1_descsz, feature_2_descsz, descsz;
8817 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
8818 unsigned int padding;
8819
8820 if (!IS_ELF || !x86_used_note)
8821 return;
8822
b4a3a7b4
L
8823 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
8824
8825 /* The .note.gnu.property section layout:
8826
8827 Field Length Contents
8828 ---- ---- ----
8829 n_namsz 4 4
8830 n_descsz 4 The note descriptor size
8831 n_type 4 NT_GNU_PROPERTY_TYPE_0
8832 n_name 4 "GNU"
8833 n_desc n_descsz The program property array
8834 .... .... ....
8835 */
8836
8837 /* Create the .note.gnu.property section. */
8838 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 8839 bfd_set_section_flags (sec,
b4a3a7b4
L
8840 (SEC_ALLOC
8841 | SEC_LOAD
8842 | SEC_DATA
8843 | SEC_HAS_CONTENTS
8844 | SEC_READONLY));
8845
8846 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
8847 {
8848 align_size_1 = 7;
8849 alignment = 3;
8850 }
8851 else
8852 {
8853 align_size_1 = 3;
8854 alignment = 2;
8855 }
8856
fd361982 8857 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
8858 elf_section_type (sec) = SHT_NOTE;
8859
8860 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
8861 + 4-byte data */
8862 isa_1_descsz_raw = 4 + 4 + 4;
8863 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
8864 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
8865
8866 feature_2_descsz_raw = isa_1_descsz;
8867 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
8868 + 4-byte data */
8869 feature_2_descsz_raw += 4 + 4 + 4;
8870 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
8871 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
8872 & ~align_size_1);
8873
8874 descsz = feature_2_descsz;
8875 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
8876 p = frag_more (4 + 4 + 4 + 4 + descsz);
8877
8878 /* Write n_namsz. */
8879 md_number_to_chars (p, (valueT) 4, 4);
8880
8881 /* Write n_descsz. */
8882 md_number_to_chars (p + 4, (valueT) descsz, 4);
8883
8884 /* Write n_type. */
8885 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
8886
8887 /* Write n_name. */
8888 memcpy (p + 4 * 3, "GNU", 4);
8889
8890 /* Write 4-byte type. */
8891 md_number_to_chars (p + 4 * 4,
8892 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
8893
8894 /* Write 4-byte data size. */
8895 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
8896
8897 /* Write 4-byte data. */
8898 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
8899
8900 /* Zero out paddings. */
8901 padding = isa_1_descsz - isa_1_descsz_raw;
8902 if (padding)
8903 memset (p + 4 * 7, 0, padding);
8904
8905 /* Write 4-byte type. */
8906 md_number_to_chars (p + isa_1_descsz + 4 * 4,
8907 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
8908
8909 /* Write 4-byte data size. */
8910 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
8911
8912 /* Write 4-byte data. */
8913 md_number_to_chars (p + isa_1_descsz + 4 * 6,
8914 (valueT) x86_feature_2_used, 4);
8915
8916 /* Zero out paddings. */
8917 padding = feature_2_descsz - feature_2_descsz_raw;
8918 if (padding)
8919 memset (p + isa_1_descsz + 4 * 7, 0, padding);
8920
8921 /* We probably can't restore the current segment, for there likely
8922 isn't one yet... */
8923 if (seg && subseg)
8924 subseg_set (seg, subseg);
8925}
8926#endif
8927
9c33702b
JB
8928static unsigned int
8929encoding_length (const fragS *start_frag, offsetT start_off,
8930 const char *frag_now_ptr)
8931{
8932 unsigned int len = 0;
8933
8934 if (start_frag != frag_now)
8935 {
8936 const fragS *fr = start_frag;
8937
8938 do {
8939 len += fr->fr_fix;
8940 fr = fr->fr_next;
8941 } while (fr && fr != frag_now);
8942 }
8943
8944 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
8945}
8946
e379e5f3 8947/* Return 1 for test, and, cmp, add, sub, inc and dec which may
79d72f45
HL
8948 be macro-fused with conditional jumps.
8949 NB: If TEST/AND/CMP/ADD/SUB/INC/DEC is of RIP relative address,
8950 or is one of the following format:
8951
8952 cmp m, imm
8953 add m, imm
8954 sub m, imm
8955 test m, imm
8956 and m, imm
8957 inc m
8958 dec m
8959
8960 it is unfusible. */
e379e5f3
L
8961
8962static int
79d72f45 8963maybe_fused_with_jcc_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8964{
8965 /* No RIP address. */
8966 if (i.base_reg && i.base_reg->reg_num == RegIP)
8967 return 0;
8968
389d00a5
JB
8969 /* No opcodes outside of base encoding space. */
8970 if (i.tm.opcode_modifier.opcodespace != SPACE_BASE)
e379e5f3
L
8971 return 0;
8972
79d72f45
HL
8973 /* add, sub without add/sub m, imm. */
8974 if (i.tm.base_opcode <= 5
e379e5f3
L
8975 || (i.tm.base_opcode >= 0x28 && i.tm.base_opcode <= 0x2d)
8976 || ((i.tm.base_opcode | 3) == 0x83
79d72f45 8977 && (i.tm.extension_opcode == 0x5
e379e5f3 8978 || i.tm.extension_opcode == 0x0)))
79d72f45
HL
8979 {
8980 *mf_cmp_p = mf_cmp_alu_cmp;
8981 return !(i.mem_operands && i.imm_operands);
8982 }
e379e5f3 8983
79d72f45
HL
8984 /* and without and m, imm. */
8985 if ((i.tm.base_opcode >= 0x20 && i.tm.base_opcode <= 0x25)
8986 || ((i.tm.base_opcode | 3) == 0x83
8987 && i.tm.extension_opcode == 0x4))
8988 {
8989 *mf_cmp_p = mf_cmp_test_and;
8990 return !(i.mem_operands && i.imm_operands);
8991 }
8992
8993 /* test without test m imm. */
e379e5f3
L
8994 if ((i.tm.base_opcode | 1) == 0x85
8995 || (i.tm.base_opcode | 1) == 0xa9
8996 || ((i.tm.base_opcode | 1) == 0xf7
79d72f45
HL
8997 && i.tm.extension_opcode == 0))
8998 {
8999 *mf_cmp_p = mf_cmp_test_and;
9000 return !(i.mem_operands && i.imm_operands);
9001 }
9002
9003 /* cmp without cmp m, imm. */
9004 if ((i.tm.base_opcode >= 0x38 && i.tm.base_opcode <= 0x3d)
e379e5f3
L
9005 || ((i.tm.base_opcode | 3) == 0x83
9006 && (i.tm.extension_opcode == 0x7)))
79d72f45
HL
9007 {
9008 *mf_cmp_p = mf_cmp_alu_cmp;
9009 return !(i.mem_operands && i.imm_operands);
9010 }
e379e5f3 9011
79d72f45 9012 /* inc, dec without inc/dec m. */
e379e5f3
L
9013 if ((i.tm.cpu_flags.bitfield.cpuno64
9014 && (i.tm.base_opcode | 0xf) == 0x4f)
9015 || ((i.tm.base_opcode | 1) == 0xff
9016 && i.tm.extension_opcode <= 0x1))
79d72f45
HL
9017 {
9018 *mf_cmp_p = mf_cmp_incdec;
9019 return !i.mem_operands;
9020 }
e379e5f3
L
9021
9022 return 0;
9023}
9024
9025/* Return 1 if a FUSED_JCC_PADDING frag should be generated. */
9026
9027static int
79d72f45 9028add_fused_jcc_padding_frag_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
9029{
9030 /* NB: Don't work with COND_JUMP86 without i386. */
9031 if (!align_branch_power
9032 || now_seg == absolute_section
9033 || !cpu_arch_flags.bitfield.cpui386
9034 || !(align_branch & align_branch_fused_bit))
9035 return 0;
9036
79d72f45 9037 if (maybe_fused_with_jcc_p (mf_cmp_p))
e379e5f3
L
9038 {
9039 if (last_insn.kind == last_insn_other
9040 || last_insn.seg != now_seg)
9041 return 1;
9042 if (flag_debug)
9043 as_warn_where (last_insn.file, last_insn.line,
9044 _("`%s` skips -malign-branch-boundary on `%s`"),
9045 last_insn.name, i.tm.name);
9046 }
9047
9048 return 0;
9049}
9050
9051/* Return 1 if a BRANCH_PREFIX frag should be generated. */
9052
9053static int
9054add_branch_prefix_frag_p (void)
9055{
9056 /* NB: Don't work with COND_JUMP86 without i386. Don't add prefix
9057 to PadLock instructions since they include prefixes in opcode. */
9058 if (!align_branch_power
9059 || !align_branch_prefix_size
9060 || now_seg == absolute_section
9061 || i.tm.cpu_flags.bitfield.cpupadlock
9062 || !cpu_arch_flags.bitfield.cpui386)
9063 return 0;
9064
9065 /* Don't add prefix if it is a prefix or there is no operand in case
9066 that segment prefix is special. */
9067 if (!i.operands || i.tm.opcode_modifier.isprefix)
9068 return 0;
9069
9070 if (last_insn.kind == last_insn_other
9071 || last_insn.seg != now_seg)
9072 return 1;
9073
9074 if (flag_debug)
9075 as_warn_where (last_insn.file, last_insn.line,
9076 _("`%s` skips -malign-branch-boundary on `%s`"),
9077 last_insn.name, i.tm.name);
9078
9079 return 0;
9080}
9081
9082/* Return 1 if a BRANCH_PADDING frag should be generated. */
9083
9084static int
79d72f45
HL
9085add_branch_padding_frag_p (enum align_branch_kind *branch_p,
9086 enum mf_jcc_kind *mf_jcc_p)
e379e5f3
L
9087{
9088 int add_padding;
9089
9090 /* NB: Don't work with COND_JUMP86 without i386. */
9091 if (!align_branch_power
9092 || now_seg == absolute_section
389d00a5
JB
9093 || !cpu_arch_flags.bitfield.cpui386
9094 || i.tm.opcode_modifier.opcodespace != SPACE_BASE)
e379e5f3
L
9095 return 0;
9096
9097 add_padding = 0;
9098
9099 /* Check for jcc and direct jmp. */
9100 if (i.tm.opcode_modifier.jump == JUMP)
9101 {
9102 if (i.tm.base_opcode == JUMP_PC_RELATIVE)
9103 {
9104 *branch_p = align_branch_jmp;
9105 add_padding = align_branch & align_branch_jmp_bit;
9106 }
9107 else
9108 {
79d72f45
HL
9109 /* Because J<cc> and JN<cc> share same group in macro-fusible table,
9110 igore the lowest bit. */
9111 *mf_jcc_p = (i.tm.base_opcode & 0x0e) >> 1;
e379e5f3
L
9112 *branch_p = align_branch_jcc;
9113 if ((align_branch & align_branch_jcc_bit))
9114 add_padding = 1;
9115 }
9116 }
e379e5f3
L
9117 else if ((i.tm.base_opcode | 1) == 0xc3)
9118 {
9119 /* Near ret. */
9120 *branch_p = align_branch_ret;
9121 if ((align_branch & align_branch_ret_bit))
9122 add_padding = 1;
9123 }
9124 else
9125 {
9126 /* Check for indirect jmp, direct and indirect calls. */
9127 if (i.tm.base_opcode == 0xe8)
9128 {
9129 /* Direct call. */
9130 *branch_p = align_branch_call;
9131 if ((align_branch & align_branch_call_bit))
9132 add_padding = 1;
9133 }
9134 else if (i.tm.base_opcode == 0xff
9135 && (i.tm.extension_opcode == 2
9136 || i.tm.extension_opcode == 4))
9137 {
9138 /* Indirect call and jmp. */
9139 *branch_p = align_branch_indirect;
9140 if ((align_branch & align_branch_indirect_bit))
9141 add_padding = 1;
9142 }
9143
9144 if (add_padding
9145 && i.disp_operands
9146 && tls_get_addr
9147 && (i.op[0].disps->X_op == O_symbol
9148 || (i.op[0].disps->X_op == O_subtract
9149 && i.op[0].disps->X_op_symbol == GOT_symbol)))
9150 {
9151 symbolS *s = i.op[0].disps->X_add_symbol;
9152 /* No padding to call to global or undefined tls_get_addr. */
9153 if ((S_IS_EXTERNAL (s) || !S_IS_DEFINED (s))
9154 && strcmp (S_GET_NAME (s), tls_get_addr) == 0)
9155 return 0;
9156 }
9157 }
9158
9159 if (add_padding
9160 && last_insn.kind != last_insn_other
9161 && last_insn.seg == now_seg)
9162 {
9163 if (flag_debug)
9164 as_warn_where (last_insn.file, last_insn.line,
9165 _("`%s` skips -malign-branch-boundary on `%s`"),
9166 last_insn.name, i.tm.name);
9167 return 0;
9168 }
9169
9170 return add_padding;
9171}
9172
29b0f896 9173static void
e3bb37b5 9174output_insn (void)
29b0f896 9175{
2bbd9c25
JJ
9176 fragS *insn_start_frag;
9177 offsetT insn_start_off;
e379e5f3
L
9178 fragS *fragP = NULL;
9179 enum align_branch_kind branch = align_branch_none;
79d72f45
HL
9180 /* The initializer is arbitrary just to avoid uninitialized error.
9181 it's actually either assigned in add_branch_padding_frag_p
9182 or never be used. */
9183 enum mf_jcc_kind mf_jcc = mf_jcc_jo;
2bbd9c25 9184
b4a3a7b4 9185#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
48ef937e 9186 if (IS_ELF && x86_used_note && now_seg != absolute_section)
b4a3a7b4 9187 {
32930e4e
L
9188 if ((i.xstate & xstate_tmm) == xstate_tmm
9189 || i.tm.cpu_flags.bitfield.cpuamx_tile)
9190 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_TMM;
9191
b4a3a7b4
L
9192 if (i.tm.cpu_flags.bitfield.cpu8087
9193 || i.tm.cpu_flags.bitfield.cpu287
9194 || i.tm.cpu_flags.bitfield.cpu387
9195 || i.tm.cpu_flags.bitfield.cpu687
9196 || i.tm.cpu_flags.bitfield.cpufisttp)
9197 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
014d61ea 9198
921eafea 9199 if ((i.xstate & xstate_mmx)
389d00a5
JB
9200 || (i.tm.opcode_modifier.opcodespace == SPACE_0F
9201 && !is_any_vex_encoding (&i.tm)
9202 && (i.tm.base_opcode == 0x77 /* emms */
9203 || i.tm.base_opcode == 0x0e /* femms */)))
b4a3a7b4 9204 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
014d61ea 9205
32930e4e
L
9206 if (i.index_reg)
9207 {
9208 if (i.index_reg->reg_type.bitfield.zmmword)
9209 i.xstate |= xstate_zmm;
9210 else if (i.index_reg->reg_type.bitfield.ymmword)
9211 i.xstate |= xstate_ymm;
9212 else if (i.index_reg->reg_type.bitfield.xmmword)
9213 i.xstate |= xstate_xmm;
9214 }
014d61ea
JB
9215
9216 /* vzeroall / vzeroupper */
9217 if (i.tm.base_opcode == 0x77 && i.tm.cpu_flags.bitfield.cpuavx)
9218 i.xstate |= xstate_ymm;
9219
c4694f17 9220 if ((i.xstate & xstate_xmm)
389d00a5
JB
9221 /* ldmxcsr / stmxcsr / vldmxcsr / vstmxcsr */
9222 || (i.tm.base_opcode == 0xae
9223 && (i.tm.cpu_flags.bitfield.cpusse
9224 || i.tm.cpu_flags.bitfield.cpuavx))
c4694f17
TG
9225 || i.tm.cpu_flags.bitfield.cpuwidekl
9226 || i.tm.cpu_flags.bitfield.cpukl)
b4a3a7b4 9227 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
014d61ea 9228
921eafea 9229 if ((i.xstate & xstate_ymm) == xstate_ymm)
b4a3a7b4 9230 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
921eafea 9231 if ((i.xstate & xstate_zmm) == xstate_zmm)
b4a3a7b4 9232 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
32930e4e
L
9233 if (i.mask || (i.xstate & xstate_mask) == xstate_mask)
9234 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MASK;
b4a3a7b4
L
9235 if (i.tm.cpu_flags.bitfield.cpufxsr)
9236 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
9237 if (i.tm.cpu_flags.bitfield.cpuxsave)
9238 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
9239 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
9240 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
9241 if (i.tm.cpu_flags.bitfield.cpuxsavec)
9242 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
b0ab0693
L
9243
9244 if (x86_feature_2_used
9245 || i.tm.cpu_flags.bitfield.cpucmov
9246 || i.tm.cpu_flags.bitfield.cpusyscall
389d00a5
JB
9247 || (i.tm.opcode_modifier.opcodespace == SPACE_0F
9248 && i.tm.base_opcode == 0xc7
70e95837 9249 && i.tm.opcode_modifier.opcodeprefix == PREFIX_NONE
b0ab0693
L
9250 && i.tm.extension_opcode == 1) /* cmpxchg8b */)
9251 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_BASELINE;
9252 if (i.tm.cpu_flags.bitfield.cpusse3
9253 || i.tm.cpu_flags.bitfield.cpussse3
9254 || i.tm.cpu_flags.bitfield.cpusse4_1
9255 || i.tm.cpu_flags.bitfield.cpusse4_2
9256 || i.tm.cpu_flags.bitfield.cpucx16
9257 || i.tm.cpu_flags.bitfield.cpupopcnt
9258 /* LAHF-SAHF insns in 64-bit mode. */
9259 || (flag_code == CODE_64BIT
35648716
JB
9260 && (i.tm.base_opcode | 1) == 0x9f
9261 && i.tm.opcode_modifier.opcodespace == SPACE_BASE))
b0ab0693
L
9262 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V2;
9263 if (i.tm.cpu_flags.bitfield.cpuavx
9264 || i.tm.cpu_flags.bitfield.cpuavx2
9265 /* Any VEX encoded insns execpt for CpuAVX512F, CpuAVX512BW,
9266 CpuAVX512DQ, LPW, TBM and AMX. */
9267 || (i.tm.opcode_modifier.vex
9268 && !i.tm.cpu_flags.bitfield.cpuavx512f
9269 && !i.tm.cpu_flags.bitfield.cpuavx512bw
9270 && !i.tm.cpu_flags.bitfield.cpuavx512dq
9271 && !i.tm.cpu_flags.bitfield.cpulwp
9272 && !i.tm.cpu_flags.bitfield.cputbm
9273 && !(x86_feature_2_used & GNU_PROPERTY_X86_FEATURE_2_TMM))
9274 || i.tm.cpu_flags.bitfield.cpuf16c
9275 || i.tm.cpu_flags.bitfield.cpufma
9276 || i.tm.cpu_flags.bitfield.cpulzcnt
9277 || i.tm.cpu_flags.bitfield.cpumovbe
9278 || i.tm.cpu_flags.bitfield.cpuxsaves
9279 || (x86_feature_2_used
9280 & (GNU_PROPERTY_X86_FEATURE_2_XSAVE
9281 | GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT
9282 | GNU_PROPERTY_X86_FEATURE_2_XSAVEC)) != 0)
9283 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V3;
9284 if (i.tm.cpu_flags.bitfield.cpuavx512f
9285 || i.tm.cpu_flags.bitfield.cpuavx512bw
9286 || i.tm.cpu_flags.bitfield.cpuavx512dq
9287 || i.tm.cpu_flags.bitfield.cpuavx512vl
9288 /* Any EVEX encoded insns except for AVX512ER, AVX512PF and
9289 VNNIW. */
9290 || (i.tm.opcode_modifier.evex
9291 && !i.tm.cpu_flags.bitfield.cpuavx512er
9292 && !i.tm.cpu_flags.bitfield.cpuavx512pf
9293 && !i.tm.cpu_flags.bitfield.cpuavx512_4vnniw))
9294 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_V4;
b4a3a7b4
L
9295 }
9296#endif
9297
29b0f896
AM
9298 /* Tie dwarf2 debug info to the address at the start of the insn.
9299 We can't do this after the insn has been output as the current
9300 frag may have been closed off. eg. by frag_var. */
9301 dwarf2_emit_insn (0);
9302
2bbd9c25
JJ
9303 insn_start_frag = frag_now;
9304 insn_start_off = frag_now_fix ();
9305
79d72f45 9306 if (add_branch_padding_frag_p (&branch, &mf_jcc))
e379e5f3
L
9307 {
9308 char *p;
9309 /* Branch can be 8 bytes. Leave some room for prefixes. */
9310 unsigned int max_branch_padding_size = 14;
9311
9312 /* Align section to boundary. */
9313 record_alignment (now_seg, align_branch_power);
9314
9315 /* Make room for padding. */
9316 frag_grow (max_branch_padding_size);
9317
9318 /* Start of the padding. */
9319 p = frag_more (0);
9320
9321 fragP = frag_now;
9322
9323 frag_var (rs_machine_dependent, max_branch_padding_size, 0,
9324 ENCODE_RELAX_STATE (BRANCH_PADDING, 0),
9325 NULL, 0, p);
9326
79d72f45 9327 fragP->tc_frag_data.mf_type = mf_jcc;
e379e5f3
L
9328 fragP->tc_frag_data.branch_type = branch;
9329 fragP->tc_frag_data.max_bytes = max_branch_padding_size;
9330 }
9331
29b0f896 9332 /* Output jumps. */
0cfa3eb3 9333 if (i.tm.opcode_modifier.jump == JUMP)
29b0f896 9334 output_branch ();
0cfa3eb3
JB
9335 else if (i.tm.opcode_modifier.jump == JUMP_BYTE
9336 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896 9337 output_jump ();
0cfa3eb3 9338 else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT)
29b0f896
AM
9339 output_interseg_jump ();
9340 else
9341 {
9342 /* Output normal instructions here. */
9343 char *p;
9344 unsigned char *q;
47465058 9345 unsigned int j;
79d72f45 9346 enum mf_cmp_kind mf_cmp;
4dffcebc 9347
e4e00185 9348 if (avoid_fence
389d00a5
JB
9349 && (i.tm.base_opcode == 0xaee8
9350 || i.tm.base_opcode == 0xaef0
9351 || i.tm.base_opcode == 0xaef8))
48ef937e
JB
9352 {
9353 /* Encode lfence, mfence, and sfence as
9354 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
9355 if (now_seg != absolute_section)
9356 {
9357 offsetT val = 0x240483f0ULL;
9358
9359 p = frag_more (5);
9360 md_number_to_chars (p, val, 5);
9361 }
9362 else
9363 abs_section_offset += 5;
9364 return;
9365 }
e4e00185 9366
d022bddd
IT
9367 /* Some processors fail on LOCK prefix. This options makes
9368 assembler ignore LOCK prefix and serves as a workaround. */
9369 if (omit_lock_prefix)
9370 {
35648716
JB
9371 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE
9372 && i.tm.opcode_modifier.isprefix)
d022bddd
IT
9373 return;
9374 i.prefix[LOCK_PREFIX] = 0;
9375 }
9376
e379e5f3
L
9377 if (branch)
9378 /* Skip if this is a branch. */
9379 ;
79d72f45 9380 else if (add_fused_jcc_padding_frag_p (&mf_cmp))
e379e5f3
L
9381 {
9382 /* Make room for padding. */
9383 frag_grow (MAX_FUSED_JCC_PADDING_SIZE);
9384 p = frag_more (0);
9385
9386 fragP = frag_now;
9387
9388 frag_var (rs_machine_dependent, MAX_FUSED_JCC_PADDING_SIZE, 0,
9389 ENCODE_RELAX_STATE (FUSED_JCC_PADDING, 0),
9390 NULL, 0, p);
9391
79d72f45 9392 fragP->tc_frag_data.mf_type = mf_cmp;
e379e5f3
L
9393 fragP->tc_frag_data.branch_type = align_branch_fused;
9394 fragP->tc_frag_data.max_bytes = MAX_FUSED_JCC_PADDING_SIZE;
9395 }
9396 else if (add_branch_prefix_frag_p ())
9397 {
9398 unsigned int max_prefix_size = align_branch_prefix_size;
9399
9400 /* Make room for padding. */
9401 frag_grow (max_prefix_size);
9402 p = frag_more (0);
9403
9404 fragP = frag_now;
9405
9406 frag_var (rs_machine_dependent, max_prefix_size, 0,
9407 ENCODE_RELAX_STATE (BRANCH_PREFIX, 0),
9408 NULL, 0, p);
9409
9410 fragP->tc_frag_data.max_bytes = max_prefix_size;
9411 }
9412
43234a1e
L
9413 /* Since the VEX/EVEX prefix contains the implicit prefix, we
9414 don't need the explicit prefix. */
9415 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 9416 {
7b47a312 9417 switch (i.tm.opcode_modifier.opcodeprefix)
bc4bd9ab 9418 {
7b47a312
L
9419 case PREFIX_0X66:
9420 add_prefix (0x66);
9421 break;
9422 case PREFIX_0XF2:
9423 add_prefix (0xf2);
9424 break;
9425 case PREFIX_0XF3:
8b65b895
L
9426 if (!i.tm.cpu_flags.bitfield.cpupadlock
9427 || (i.prefix[REP_PREFIX] != 0xf3))
9428 add_prefix (0xf3);
c0f3af97 9429 break;
7b47a312 9430 case PREFIX_NONE:
9a182d04 9431 switch (i.opcode_length)
c0f3af97 9432 {
7b47a312 9433 case 2:
7b47a312 9434 break;
9a182d04 9435 case 1:
7b47a312 9436 /* Check for pseudo prefixes. */
9a182d04
JB
9437 if (!i.tm.opcode_modifier.isprefix || i.tm.base_opcode)
9438 break;
7b47a312
L
9439 as_bad_where (insn_start_frag->fr_file,
9440 insn_start_frag->fr_line,
9441 _("pseudo prefix without instruction"));
9442 return;
9443 default:
9444 abort ();
4dffcebc 9445 }
c0f3af97 9446 break;
c0f3af97
L
9447 default:
9448 abort ();
bc4bd9ab 9449 }
c0f3af97 9450
6d19a37a 9451#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
9452 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
9453 R_X86_64_GOTTPOFF relocation so that linker can safely
14470f07
L
9454 perform IE->LE optimization. A dummy REX_OPCODE prefix
9455 is also needed for lea with R_X86_64_GOTPC32_TLSDESC
9456 relocation for GDesc -> IE/LE optimization. */
cf61b747
L
9457 if (x86_elf_abi == X86_64_X32_ABI
9458 && i.operands == 2
14470f07
L
9459 && (i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
9460 || i.reloc[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
cf61b747
L
9461 && i.prefix[REX_PREFIX] == 0)
9462 add_prefix (REX_OPCODE);
6d19a37a 9463#endif
cf61b747 9464
c0f3af97
L
9465 /* The prefix bytes. */
9466 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
9467 if (*q)
48ef937e 9468 frag_opcode_byte (*q);
0f10071e 9469 }
ae5c1c7b 9470 else
c0f3af97
L
9471 {
9472 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
9473 if (*q)
9474 switch (j)
9475 {
c0f3af97
L
9476 case SEG_PREFIX:
9477 case ADDR_PREFIX:
48ef937e 9478 frag_opcode_byte (*q);
c0f3af97
L
9479 break;
9480 default:
9481 /* There should be no other prefixes for instructions
9482 with VEX prefix. */
9483 abort ();
9484 }
9485
43234a1e
L
9486 /* For EVEX instructions i.vrex should become 0 after
9487 build_evex_prefix. For VEX instructions upper 16 registers
9488 aren't available, so VREX should be 0. */
9489 if (i.vrex)
9490 abort ();
c0f3af97 9491 /* Now the VEX prefix. */
48ef937e
JB
9492 if (now_seg != absolute_section)
9493 {
9494 p = frag_more (i.vex.length);
9495 for (j = 0; j < i.vex.length; j++)
9496 p[j] = i.vex.bytes[j];
9497 }
9498 else
9499 abs_section_offset += i.vex.length;
c0f3af97 9500 }
252b5132 9501
29b0f896 9502 /* Now the opcode; be careful about word order here! */
389d00a5
JB
9503 j = i.opcode_length;
9504 if (!i.vex.length)
9505 switch (i.tm.opcode_modifier.opcodespace)
9506 {
9507 case SPACE_BASE:
9508 break;
9509 case SPACE_0F:
9510 ++j;
9511 break;
9512 case SPACE_0F38:
9513 case SPACE_0F3A:
9514 j += 2;
9515 break;
9516 default:
9517 abort ();
9518 }
9519
48ef937e 9520 if (now_seg == absolute_section)
389d00a5
JB
9521 abs_section_offset += j;
9522 else if (j == 1)
29b0f896
AM
9523 {
9524 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
9525 }
9526 else
9527 {
389d00a5
JB
9528 p = frag_more (j);
9529 if (!i.vex.length
9530 && i.tm.opcode_modifier.opcodespace != SPACE_BASE)
9531 {
9532 *p++ = 0x0f;
9533 if (i.tm.opcode_modifier.opcodespace != SPACE_0F)
9534 *p++ = i.tm.opcode_modifier.opcodespace == SPACE_0F38
9535 ? 0x38 : 0x3a;
9536 }
9537
9a182d04 9538 switch (i.opcode_length)
331d2d0d 9539 {
4dffcebc 9540 case 2:
389d00a5
JB
9541 /* Put out high byte first: can't use md_number_to_chars! */
9542 *p++ = (i.tm.base_opcode >> 8) & 0xff;
9543 /* Fall through. */
9544 case 1:
9545 *p = i.tm.base_opcode & 0xff;
4dffcebc
L
9546 break;
9547 default:
9548 abort ();
9549 break;
331d2d0d 9550 }
0f10071e 9551
29b0f896 9552 }
3e73aa7c 9553
29b0f896 9554 /* Now the modrm byte and sib byte (if present). */
40fb9820 9555 if (i.tm.opcode_modifier.modrm)
29b0f896 9556 {
48ef937e
JB
9557 frag_opcode_byte ((i.rm.regmem << 0)
9558 | (i.rm.reg << 3)
9559 | (i.rm.mode << 6));
29b0f896
AM
9560 /* If i.rm.regmem == ESP (4)
9561 && i.rm.mode != (Register mode)
9562 && not 16 bit
9563 ==> need second modrm byte. */
9564 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
9565 && i.rm.mode != 3
dc821c5f 9566 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
48ef937e
JB
9567 frag_opcode_byte ((i.sib.base << 0)
9568 | (i.sib.index << 3)
9569 | (i.sib.scale << 6));
29b0f896 9570 }
3e73aa7c 9571
29b0f896 9572 if (i.disp_operands)
2bbd9c25 9573 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 9574
29b0f896 9575 if (i.imm_operands)
2bbd9c25 9576 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
9577
9578 /*
9579 * frag_now_fix () returning plain abs_section_offset when we're in the
9580 * absolute section, and abs_section_offset not getting updated as data
9581 * gets added to the frag breaks the logic below.
9582 */
9583 if (now_seg != absolute_section)
9584 {
9585 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
9586 if (j > 15)
9587 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
9588 j);
e379e5f3
L
9589 else if (fragP)
9590 {
9591 /* NB: Don't add prefix with GOTPC relocation since
9592 output_disp() above depends on the fixed encoding
9593 length. Can't add prefix with TLS relocation since
9594 it breaks TLS linker optimization. */
9595 unsigned int max = i.has_gotpc_tls_reloc ? 0 : 15 - j;
9596 /* Prefix count on the current instruction. */
9597 unsigned int count = i.vex.length;
9598 unsigned int k;
9599 for (k = 0; k < ARRAY_SIZE (i.prefix); k++)
9600 /* REX byte is encoded in VEX/EVEX prefix. */
9601 if (i.prefix[k] && (k != REX_PREFIX || !i.vex.length))
9602 count++;
9603
9604 /* Count prefixes for extended opcode maps. */
9605 if (!i.vex.length)
389d00a5 9606 switch (i.tm.opcode_modifier.opcodespace)
e379e5f3 9607 {
389d00a5 9608 case SPACE_BASE:
e379e5f3 9609 break;
389d00a5
JB
9610 case SPACE_0F:
9611 count++;
e379e5f3 9612 break;
389d00a5
JB
9613 case SPACE_0F38:
9614 case SPACE_0F3A:
9615 count += 2;
e379e5f3
L
9616 break;
9617 default:
9618 abort ();
9619 }
9620
9621 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
9622 == BRANCH_PREFIX)
9623 {
9624 /* Set the maximum prefix size in BRANCH_PREFIX
9625 frag. */
9626 if (fragP->tc_frag_data.max_bytes > max)
9627 fragP->tc_frag_data.max_bytes = max;
9628 if (fragP->tc_frag_data.max_bytes > count)
9629 fragP->tc_frag_data.max_bytes -= count;
9630 else
9631 fragP->tc_frag_data.max_bytes = 0;
9632 }
9633 else
9634 {
9635 /* Remember the maximum prefix size in FUSED_JCC_PADDING
9636 frag. */
9637 unsigned int max_prefix_size;
9638 if (align_branch_prefix_size > max)
9639 max_prefix_size = max;
9640 else
9641 max_prefix_size = align_branch_prefix_size;
9642 if (max_prefix_size > count)
9643 fragP->tc_frag_data.max_prefix_length
9644 = max_prefix_size - count;
9645 }
9646
9647 /* Use existing segment prefix if possible. Use CS
9648 segment prefix in 64-bit mode. In 32-bit mode, use SS
9649 segment prefix with ESP/EBP base register and use DS
9650 segment prefix without ESP/EBP base register. */
9651 if (i.prefix[SEG_PREFIX])
9652 fragP->tc_frag_data.default_prefix = i.prefix[SEG_PREFIX];
9653 else if (flag_code == CODE_64BIT)
9654 fragP->tc_frag_data.default_prefix = CS_PREFIX_OPCODE;
9655 else if (i.base_reg
9656 && (i.base_reg->reg_num == 4
9657 || i.base_reg->reg_num == 5))
9658 fragP->tc_frag_data.default_prefix = SS_PREFIX_OPCODE;
9659 else
9660 fragP->tc_frag_data.default_prefix = DS_PREFIX_OPCODE;
9661 }
9c33702b 9662 }
29b0f896 9663 }
252b5132 9664
e379e5f3
L
9665 /* NB: Don't work with COND_JUMP86 without i386. */
9666 if (align_branch_power
9667 && now_seg != absolute_section
9668 && cpu_arch_flags.bitfield.cpui386)
9669 {
9670 /* Terminate each frag so that we can add prefix and check for
9671 fused jcc. */
9672 frag_wane (frag_now);
9673 frag_new (0);
9674 }
9675
29b0f896
AM
9676#ifdef DEBUG386
9677 if (flag_debug)
9678 {
7b81dfbb 9679 pi ("" /*line*/, &i);
29b0f896
AM
9680 }
9681#endif /* DEBUG386 */
9682}
252b5132 9683
e205caa7
L
9684/* Return the size of the displacement operand N. */
9685
9686static int
9687disp_size (unsigned int n)
9688{
9689 int size = 4;
43234a1e 9690
b5014f7a 9691 if (i.types[n].bitfield.disp64)
40fb9820
L
9692 size = 8;
9693 else if (i.types[n].bitfield.disp8)
9694 size = 1;
9695 else if (i.types[n].bitfield.disp16)
9696 size = 2;
e205caa7
L
9697 return size;
9698}
9699
9700/* Return the size of the immediate operand N. */
9701
9702static int
9703imm_size (unsigned int n)
9704{
9705 int size = 4;
40fb9820
L
9706 if (i.types[n].bitfield.imm64)
9707 size = 8;
9708 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
9709 size = 1;
9710 else if (i.types[n].bitfield.imm16)
9711 size = 2;
e205caa7
L
9712 return size;
9713}
9714
29b0f896 9715static void
64e74474 9716output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9717{
9718 char *p;
9719 unsigned int n;
252b5132 9720
29b0f896
AM
9721 for (n = 0; n < i.operands; n++)
9722 {
b5014f7a 9723 if (operand_type_check (i.types[n], disp))
29b0f896 9724 {
48ef937e
JB
9725 int size = disp_size (n);
9726
9727 if (now_seg == absolute_section)
9728 abs_section_offset += size;
9729 else if (i.op[n].disps->X_op == O_constant)
29b0f896 9730 {
43234a1e 9731 offsetT val = i.op[n].disps->X_add_number;
252b5132 9732
629cfaf1
JB
9733 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
9734 size);
29b0f896
AM
9735 p = frag_more (size);
9736 md_number_to_chars (p, val, size);
9737 }
9738 else
9739 {
f86103b7 9740 enum bfd_reloc_code_real reloc_type;
40fb9820 9741 int sign = i.types[n].bitfield.disp32s;
29b0f896 9742 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 9743 fixS *fixP;
29b0f896 9744
e205caa7 9745 /* We can't have 8 bit displacement here. */
9c2799c2 9746 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 9747
29b0f896
AM
9748 /* The PC relative address is computed relative
9749 to the instruction boundary, so in case immediate
9750 fields follows, we need to adjust the value. */
9751 if (pcrel && i.imm_operands)
9752 {
29b0f896 9753 unsigned int n1;
e205caa7 9754 int sz = 0;
252b5132 9755
29b0f896 9756 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 9757 if (operand_type_check (i.types[n1], imm))
252b5132 9758 {
e205caa7
L
9759 /* Only one immediate is allowed for PC
9760 relative address. */
9c2799c2 9761 gas_assert (sz == 0);
e205caa7
L
9762 sz = imm_size (n1);
9763 i.op[n].disps->X_add_number -= sz;
252b5132 9764 }
29b0f896 9765 /* We should find the immediate. */
9c2799c2 9766 gas_assert (sz != 0);
29b0f896 9767 }
520dc8e8 9768
29b0f896 9769 p = frag_more (size);
d258b828 9770 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 9771 if (GOT_symbol
2bbd9c25 9772 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 9773 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9774 || reloc_type == BFD_RELOC_X86_64_32S
9775 || (reloc_type == BFD_RELOC_64
9776 && object_64bit))
d6ab8113
JB
9777 && (i.op[n].disps->X_op == O_symbol
9778 || (i.op[n].disps->X_op == O_add
9779 && ((symbol_get_value_expression
9780 (i.op[n].disps->X_op_symbol)->X_op)
9781 == O_subtract))))
9782 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 9783 {
4fa24527 9784 if (!object_64bit)
7b81dfbb
AJ
9785 {
9786 reloc_type = BFD_RELOC_386_GOTPC;
e379e5f3 9787 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9788 i.op[n].imms->X_add_number +=
9789 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
9790 }
9791 else if (reloc_type == BFD_RELOC_64)
9792 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 9793 else
7b81dfbb
AJ
9794 /* Don't do the adjustment for x86-64, as there
9795 the pcrel addressing is relative to the _next_
9796 insn, and that is taken care of in other code. */
d6ab8113 9797 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 9798 }
e379e5f3
L
9799 else if (align_branch_power)
9800 {
9801 switch (reloc_type)
9802 {
9803 case BFD_RELOC_386_TLS_GD:
9804 case BFD_RELOC_386_TLS_LDM:
9805 case BFD_RELOC_386_TLS_IE:
9806 case BFD_RELOC_386_TLS_IE_32:
9807 case BFD_RELOC_386_TLS_GOTIE:
9808 case BFD_RELOC_386_TLS_GOTDESC:
9809 case BFD_RELOC_386_TLS_DESC_CALL:
9810 case BFD_RELOC_X86_64_TLSGD:
9811 case BFD_RELOC_X86_64_TLSLD:
9812 case BFD_RELOC_X86_64_GOTTPOFF:
9813 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
9814 case BFD_RELOC_X86_64_TLSDESC_CALL:
9815 i.has_gotpc_tls_reloc = TRUE;
9816 default:
9817 break;
9818 }
9819 }
02a86693
L
9820 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
9821 size, i.op[n].disps, pcrel,
9822 reloc_type);
9823 /* Check for "call/jmp *mem", "mov mem, %reg",
9824 "test %reg, mem" and "binop mem, %reg" where binop
9825 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
9826 instructions without data prefix. Always generate
9827 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
9828 if (i.prefix[DATA_PREFIX] == 0
9829 && (generate_relax_relocations
9830 || (!object_64bit
9831 && i.rm.mode == 0
9832 && i.rm.regmem == 5))
0cb4071e
L
9833 && (i.rm.mode == 2
9834 || (i.rm.mode == 0 && i.rm.regmem == 5))
389d00a5 9835 && i.tm.opcode_modifier.opcodespace == SPACE_BASE
02a86693
L
9836 && ((i.operands == 1
9837 && i.tm.base_opcode == 0xff
9838 && (i.rm.reg == 2 || i.rm.reg == 4))
9839 || (i.operands == 2
9840 && (i.tm.base_opcode == 0x8b
9841 || i.tm.base_opcode == 0x85
2ae4c703 9842 || (i.tm.base_opcode & ~0x38) == 0x03))))
02a86693
L
9843 {
9844 if (object_64bit)
9845 {
9846 fixP->fx_tcbit = i.rex != 0;
9847 if (i.base_reg
e968fc9b 9848 && (i.base_reg->reg_num == RegIP))
02a86693
L
9849 fixP->fx_tcbit2 = 1;
9850 }
9851 else
9852 fixP->fx_tcbit2 = 1;
9853 }
29b0f896
AM
9854 }
9855 }
9856 }
9857}
252b5132 9858
29b0f896 9859static void
64e74474 9860output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9861{
9862 char *p;
9863 unsigned int n;
252b5132 9864
29b0f896
AM
9865 for (n = 0; n < i.operands; n++)
9866 {
43234a1e
L
9867 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
9868 if (i.rounding && (int) n == i.rounding->operand)
9869 continue;
9870
40fb9820 9871 if (operand_type_check (i.types[n], imm))
29b0f896 9872 {
48ef937e
JB
9873 int size = imm_size (n);
9874
9875 if (now_seg == absolute_section)
9876 abs_section_offset += size;
9877 else if (i.op[n].imms->X_op == O_constant)
29b0f896 9878 {
29b0f896 9879 offsetT val;
b4cac588 9880
29b0f896
AM
9881 val = offset_in_range (i.op[n].imms->X_add_number,
9882 size);
9883 p = frag_more (size);
9884 md_number_to_chars (p, val, size);
9885 }
9886 else
9887 {
9888 /* Not absolute_section.
9889 Need a 32-bit fixup (don't support 8bit
9890 non-absolute imms). Try to support other
9891 sizes ... */
f86103b7 9892 enum bfd_reloc_code_real reloc_type;
e205caa7 9893 int sign;
29b0f896 9894
40fb9820 9895 if (i.types[n].bitfield.imm32s
a7d61044 9896 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 9897 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 9898 sign = 1;
e205caa7
L
9899 else
9900 sign = 0;
520dc8e8 9901
29b0f896 9902 p = frag_more (size);
d258b828 9903 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 9904
2bbd9c25
JJ
9905 /* This is tough to explain. We end up with this one if we
9906 * have operands that look like
9907 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
9908 * obtain the absolute address of the GOT, and it is strongly
9909 * preferable from a performance point of view to avoid using
9910 * a runtime relocation for this. The actual sequence of
9911 * instructions often look something like:
9912 *
9913 * call .L66
9914 * .L66:
9915 * popl %ebx
9916 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
9917 *
9918 * The call and pop essentially return the absolute address
9919 * of the label .L66 and store it in %ebx. The linker itself
9920 * will ultimately change the first operand of the addl so
9921 * that %ebx points to the GOT, but to keep things simple, the
9922 * .o file must have this operand set so that it generates not
9923 * the absolute address of .L66, but the absolute address of
9924 * itself. This allows the linker itself simply treat a GOTPC
9925 * relocation as asking for a pcrel offset to the GOT to be
9926 * added in, and the addend of the relocation is stored in the
9927 * operand field for the instruction itself.
9928 *
9929 * Our job here is to fix the operand so that it would add
9930 * the correct offset so that %ebx would point to itself. The
9931 * thing that is tricky is that .-.L66 will point to the
9932 * beginning of the instruction, so we need to further modify
9933 * the operand so that it will point to itself. There are
9934 * other cases where you have something like:
9935 *
9936 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
9937 *
9938 * and here no correction would be required. Internally in
9939 * the assembler we treat operands of this form as not being
9940 * pcrel since the '.' is explicitly mentioned, and I wonder
9941 * whether it would simplify matters to do it this way. Who
9942 * knows. In earlier versions of the PIC patches, the
9943 * pcrel_adjust field was used to store the correction, but
9944 * since the expression is not pcrel, I felt it would be
9945 * confusing to do it this way. */
9946
d6ab8113 9947 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9948 || reloc_type == BFD_RELOC_X86_64_32S
9949 || reloc_type == BFD_RELOC_64)
29b0f896
AM
9950 && GOT_symbol
9951 && GOT_symbol == i.op[n].imms->X_add_symbol
9952 && (i.op[n].imms->X_op == O_symbol
9953 || (i.op[n].imms->X_op == O_add
9954 && ((symbol_get_value_expression
9955 (i.op[n].imms->X_op_symbol)->X_op)
9956 == O_subtract))))
9957 {
4fa24527 9958 if (!object_64bit)
d6ab8113 9959 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 9960 else if (size == 4)
d6ab8113 9961 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
9962 else if (size == 8)
9963 reloc_type = BFD_RELOC_X86_64_GOTPC64;
e379e5f3 9964 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9965 i.op[n].imms->X_add_number +=
9966 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 9967 }
29b0f896
AM
9968 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
9969 i.op[n].imms, 0, reloc_type);
9970 }
9971 }
9972 }
252b5132
RH
9973}
9974\f
d182319b
JB
9975/* x86_cons_fix_new is called via the expression parsing code when a
9976 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
9977static int cons_sign = -1;
9978
9979void
e3bb37b5 9980x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 9981 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 9982{
d258b828 9983 r = reloc (len, 0, cons_sign, r);
d182319b
JB
9984
9985#ifdef TE_PE
9986 if (exp->X_op == O_secrel)
9987 {
9988 exp->X_op = O_symbol;
9989 r = BFD_RELOC_32_SECREL;
9990 }
9991#endif
9992
9993 fix_new_exp (frag, off, len, exp, 0, r);
9994}
9995
357d1bd8
L
9996/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
9997 purpose of the `.dc.a' internal pseudo-op. */
9998
9999int
10000x86_address_bytes (void)
10001{
10002 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
10003 return 4;
10004 return stdoutput->arch_info->bits_per_address / 8;
10005}
10006
d382c579
TG
10007#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
10008 || defined (LEX_AT)
d258b828 10009# define lex_got(reloc, adjust, types) NULL
718ddfc0 10010#else
f3c180ae
AM
10011/* Parse operands of the form
10012 <symbol>@GOTOFF+<nnn>
10013 and similar .plt or .got references.
10014
10015 If we find one, set up the correct relocation in RELOC and copy the
10016 input string, minus the `@GOTOFF' into a malloc'd buffer for
10017 parsing by the calling routine. Return this buffer, and if ADJUST
10018 is non-null set it to the length of the string we removed from the
10019 input line. Otherwise return NULL. */
10020static char *
91d6fa6a 10021lex_got (enum bfd_reloc_code_real *rel,
64e74474 10022 int *adjust,
d258b828 10023 i386_operand_type *types)
f3c180ae 10024{
7b81dfbb
AJ
10025 /* Some of the relocations depend on the size of what field is to
10026 be relocated. But in our callers i386_immediate and i386_displacement
10027 we don't yet know the operand size (this will be set by insn
10028 matching). Hence we record the word32 relocation here,
10029 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
10030 static const struct {
10031 const char *str;
cff8d58a 10032 int len;
4fa24527 10033 const enum bfd_reloc_code_real rel[2];
40fb9820 10034 const i386_operand_type types64;
844bf810 10035 bfd_boolean need_GOT_symbol;
f3c180ae 10036 } gotrel[] = {
8ce3d284 10037#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
10038 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
10039 BFD_RELOC_SIZE32 },
844bf810 10040 OPERAND_TYPE_IMM32_64, FALSE },
8ce3d284 10041#endif
cff8d58a
L
10042 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
10043 BFD_RELOC_X86_64_PLTOFF64 },
844bf810 10044 OPERAND_TYPE_IMM64, TRUE },
cff8d58a
L
10045 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
10046 BFD_RELOC_X86_64_PLT32 },
844bf810 10047 OPERAND_TYPE_IMM32_32S_DISP32, FALSE },
cff8d58a
L
10048 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
10049 BFD_RELOC_X86_64_GOTPLT64 },
844bf810 10050 OPERAND_TYPE_IMM64_DISP64, TRUE },
cff8d58a
L
10051 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
10052 BFD_RELOC_X86_64_GOTOFF64 },
844bf810 10053 OPERAND_TYPE_IMM64_DISP64, TRUE },
cff8d58a
L
10054 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
10055 BFD_RELOC_X86_64_GOTPCREL },
844bf810 10056 OPERAND_TYPE_IMM32_32S_DISP32, TRUE },
cff8d58a
L
10057 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
10058 BFD_RELOC_X86_64_TLSGD },
844bf810 10059 OPERAND_TYPE_IMM32_32S_DISP32, TRUE },
cff8d58a
L
10060 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
10061 _dummy_first_bfd_reloc_code_real },
844bf810 10062 OPERAND_TYPE_NONE, TRUE },
cff8d58a
L
10063 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
10064 BFD_RELOC_X86_64_TLSLD },
844bf810 10065 OPERAND_TYPE_IMM32_32S_DISP32, TRUE },
cff8d58a
L
10066 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
10067 BFD_RELOC_X86_64_GOTTPOFF },
844bf810 10068 OPERAND_TYPE_IMM32_32S_DISP32, TRUE },
cff8d58a
L
10069 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
10070 BFD_RELOC_X86_64_TPOFF32 },
844bf810 10071 OPERAND_TYPE_IMM32_32S_64_DISP32_64, TRUE },
cff8d58a
L
10072 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
10073 _dummy_first_bfd_reloc_code_real },
844bf810 10074 OPERAND_TYPE_NONE, TRUE },
cff8d58a
L
10075 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
10076 BFD_RELOC_X86_64_DTPOFF32 },
844bf810 10077 OPERAND_TYPE_IMM32_32S_64_DISP32_64, TRUE },
cff8d58a
L
10078 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
10079 _dummy_first_bfd_reloc_code_real },
844bf810 10080 OPERAND_TYPE_NONE, TRUE },
cff8d58a
L
10081 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
10082 _dummy_first_bfd_reloc_code_real },
844bf810 10083 OPERAND_TYPE_NONE, TRUE },
cff8d58a
L
10084 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
10085 BFD_RELOC_X86_64_GOT32 },
844bf810 10086 OPERAND_TYPE_IMM32_32S_64_DISP32, TRUE },
cff8d58a
L
10087 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
10088 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
844bf810 10089 OPERAND_TYPE_IMM32_32S_DISP32, TRUE },
cff8d58a
L
10090 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
10091 BFD_RELOC_X86_64_TLSDESC_CALL },
844bf810 10092 OPERAND_TYPE_IMM32_32S_DISP32, TRUE },
f3c180ae
AM
10093 };
10094 char *cp;
10095 unsigned int j;
10096
d382c579 10097#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
10098 if (!IS_ELF)
10099 return NULL;
d382c579 10100#endif
718ddfc0 10101
f3c180ae 10102 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 10103 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
10104 return NULL;
10105
47465058 10106 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 10107 {
cff8d58a 10108 int len = gotrel[j].len;
28f81592 10109 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 10110 {
4fa24527 10111 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 10112 {
28f81592
AM
10113 int first, second;
10114 char *tmpbuf, *past_reloc;
f3c180ae 10115
91d6fa6a 10116 *rel = gotrel[j].rel[object_64bit];
f3c180ae 10117
3956db08
JB
10118 if (types)
10119 {
10120 if (flag_code != CODE_64BIT)
40fb9820
L
10121 {
10122 types->bitfield.imm32 = 1;
10123 types->bitfield.disp32 = 1;
10124 }
3956db08
JB
10125 else
10126 *types = gotrel[j].types64;
10127 }
10128
844bf810 10129 if (gotrel[j].need_GOT_symbol && GOT_symbol == NULL)
f3c180ae
AM
10130 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
10131
28f81592 10132 /* The length of the first part of our input line. */
f3c180ae 10133 first = cp - input_line_pointer;
28f81592
AM
10134
10135 /* The second part goes from after the reloc token until
67c11a9b 10136 (and including) an end_of_line char or comma. */
28f81592 10137 past_reloc = cp + 1 + len;
67c11a9b
AM
10138 cp = past_reloc;
10139 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10140 ++cp;
10141 second = cp + 1 - past_reloc;
28f81592
AM
10142
10143 /* Allocate and copy string. The trailing NUL shouldn't
10144 be necessary, but be safe. */
add39d23 10145 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 10146 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
10147 if (second != 0 && *past_reloc != ' ')
10148 /* Replace the relocation token with ' ', so that
10149 errors like foo@GOTOFF1 will be detected. */
10150 tmpbuf[first++] = ' ';
af89796a
L
10151 else
10152 /* Increment length by 1 if the relocation token is
10153 removed. */
10154 len++;
10155 if (adjust)
10156 *adjust = len;
0787a12d
AM
10157 memcpy (tmpbuf + first, past_reloc, second);
10158 tmpbuf[first + second] = '\0';
f3c180ae
AM
10159 return tmpbuf;
10160 }
10161
4fa24527
JB
10162 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10163 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
10164 return NULL;
10165 }
10166 }
10167
10168 /* Might be a symbol version string. Don't as_bad here. */
10169 return NULL;
10170}
4e4f7c87 10171#endif
f3c180ae 10172
a988325c
NC
10173#ifdef TE_PE
10174#ifdef lex_got
10175#undef lex_got
10176#endif
10177/* Parse operands of the form
10178 <symbol>@SECREL32+<nnn>
10179
10180 If we find one, set up the correct relocation in RELOC and copy the
10181 input string, minus the `@SECREL32' into a malloc'd buffer for
10182 parsing by the calling routine. Return this buffer, and if ADJUST
10183 is non-null set it to the length of the string we removed from the
34bca508
L
10184 input line. Otherwise return NULL.
10185
a988325c
NC
10186 This function is copied from the ELF version above adjusted for PE targets. */
10187
10188static char *
10189lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
10190 int *adjust ATTRIBUTE_UNUSED,
d258b828 10191 i386_operand_type *types)
a988325c
NC
10192{
10193 static const struct
10194 {
10195 const char *str;
10196 int len;
10197 const enum bfd_reloc_code_real rel[2];
10198 const i386_operand_type types64;
10199 }
10200 gotrel[] =
10201 {
10202 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
10203 BFD_RELOC_32_SECREL },
10204 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
10205 };
10206
10207 char *cp;
10208 unsigned j;
10209
10210 for (cp = input_line_pointer; *cp != '@'; cp++)
10211 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
10212 return NULL;
10213
10214 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
10215 {
10216 int len = gotrel[j].len;
10217
10218 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
10219 {
10220 if (gotrel[j].rel[object_64bit] != 0)
10221 {
10222 int first, second;
10223 char *tmpbuf, *past_reloc;
10224
10225 *rel = gotrel[j].rel[object_64bit];
10226 if (adjust)
10227 *adjust = len;
10228
10229 if (types)
10230 {
10231 if (flag_code != CODE_64BIT)
10232 {
10233 types->bitfield.imm32 = 1;
10234 types->bitfield.disp32 = 1;
10235 }
10236 else
10237 *types = gotrel[j].types64;
10238 }
10239
10240 /* The length of the first part of our input line. */
10241 first = cp - input_line_pointer;
10242
10243 /* The second part goes from after the reloc token until
10244 (and including) an end_of_line char or comma. */
10245 past_reloc = cp + 1 + len;
10246 cp = past_reloc;
10247 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10248 ++cp;
10249 second = cp + 1 - past_reloc;
10250
10251 /* Allocate and copy string. The trailing NUL shouldn't
10252 be necessary, but be safe. */
add39d23 10253 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
10254 memcpy (tmpbuf, input_line_pointer, first);
10255 if (second != 0 && *past_reloc != ' ')
10256 /* Replace the relocation token with ' ', so that
10257 errors like foo@SECLREL321 will be detected. */
10258 tmpbuf[first++] = ' ';
10259 memcpy (tmpbuf + first, past_reloc, second);
10260 tmpbuf[first + second] = '\0';
10261 return tmpbuf;
10262 }
10263
10264 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10265 gotrel[j].str, 1 << (5 + object_64bit));
10266 return NULL;
10267 }
10268 }
10269
10270 /* Might be a symbol version string. Don't as_bad here. */
10271 return NULL;
10272}
10273
10274#endif /* TE_PE */
10275
62ebcb5c 10276bfd_reloc_code_real_type
e3bb37b5 10277x86_cons (expressionS *exp, int size)
f3c180ae 10278{
62ebcb5c
AM
10279 bfd_reloc_code_real_type got_reloc = NO_RELOC;
10280
ee86248c
JB
10281 intel_syntax = -intel_syntax;
10282
3c7b9c2c 10283 exp->X_md = 0;
4fa24527 10284 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
10285 {
10286 /* Handle @GOTOFF and the like in an expression. */
10287 char *save;
10288 char *gotfree_input_line;
4a57f2cf 10289 int adjust = 0;
f3c180ae
AM
10290
10291 save = input_line_pointer;
d258b828 10292 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
10293 if (gotfree_input_line)
10294 input_line_pointer = gotfree_input_line;
10295
10296 expression (exp);
10297
10298 if (gotfree_input_line)
10299 {
10300 /* expression () has merrily parsed up to the end of line,
10301 or a comma - in the wrong buffer. Transfer how far
10302 input_line_pointer has moved to the right buffer. */
10303 input_line_pointer = (save
10304 + (input_line_pointer - gotfree_input_line)
10305 + adjust);
10306 free (gotfree_input_line);
3992d3b7
AM
10307 if (exp->X_op == O_constant
10308 || exp->X_op == O_absent
10309 || exp->X_op == O_illegal
0398aac5 10310 || exp->X_op == O_register
3992d3b7
AM
10311 || exp->X_op == O_big)
10312 {
10313 char c = *input_line_pointer;
10314 *input_line_pointer = 0;
10315 as_bad (_("missing or invalid expression `%s'"), save);
10316 *input_line_pointer = c;
10317 }
b9519cfe
L
10318 else if ((got_reloc == BFD_RELOC_386_PLT32
10319 || got_reloc == BFD_RELOC_X86_64_PLT32)
10320 && exp->X_op != O_symbol)
10321 {
10322 char c = *input_line_pointer;
10323 *input_line_pointer = 0;
10324 as_bad (_("invalid PLT expression `%s'"), save);
10325 *input_line_pointer = c;
10326 }
f3c180ae
AM
10327 }
10328 }
10329 else
10330 expression (exp);
ee86248c
JB
10331
10332 intel_syntax = -intel_syntax;
10333
10334 if (intel_syntax)
10335 i386_intel_simplify (exp);
62ebcb5c
AM
10336
10337 return got_reloc;
f3c180ae 10338}
f3c180ae 10339
9f32dd5b
L
10340static void
10341signed_cons (int size)
6482c264 10342{
d182319b
JB
10343 if (flag_code == CODE_64BIT)
10344 cons_sign = 1;
10345 cons (size);
10346 cons_sign = -1;
6482c264
NC
10347}
10348
d182319b 10349#ifdef TE_PE
6482c264 10350static void
7016a5d5 10351pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
10352{
10353 expressionS exp;
10354
10355 do
10356 {
10357 expression (&exp);
10358 if (exp.X_op == O_symbol)
10359 exp.X_op = O_secrel;
10360
10361 emit_expr (&exp, 4);
10362 }
10363 while (*input_line_pointer++ == ',');
10364
10365 input_line_pointer--;
10366 demand_empty_rest_of_line ();
10367}
6482c264
NC
10368#endif
10369
43234a1e
L
10370/* Handle Vector operations. */
10371
10372static char *
10373check_VecOperations (char *op_string, char *op_end)
10374{
10375 const reg_entry *mask;
10376 const char *saved;
10377 char *end_op;
10378
10379 while (*op_string
10380 && (op_end == NULL || op_string < op_end))
10381 {
10382 saved = op_string;
10383 if (*op_string == '{')
10384 {
10385 op_string++;
10386
10387 /* Check broadcasts. */
10388 if (strncmp (op_string, "1to", 3) == 0)
10389 {
10390 int bcst_type;
10391
10392 if (i.broadcast)
10393 goto duplicated_vec_op;
10394
10395 op_string += 3;
10396 if (*op_string == '8')
8e6e0792 10397 bcst_type = 8;
b28d1bda 10398 else if (*op_string == '4')
8e6e0792 10399 bcst_type = 4;
b28d1bda 10400 else if (*op_string == '2')
8e6e0792 10401 bcst_type = 2;
43234a1e
L
10402 else if (*op_string == '1'
10403 && *(op_string+1) == '6')
10404 {
8e6e0792 10405 bcst_type = 16;
43234a1e
L
10406 op_string++;
10407 }
10408 else
10409 {
10410 as_bad (_("Unsupported broadcast: `%s'"), saved);
10411 return NULL;
10412 }
10413 op_string++;
10414
10415 broadcast_op.type = bcst_type;
10416 broadcast_op.operand = this_operand;
1f75763a 10417 broadcast_op.bytes = 0;
43234a1e
L
10418 i.broadcast = &broadcast_op;
10419 }
10420 /* Check masking operation. */
10421 else if ((mask = parse_register (op_string, &end_op)) != NULL)
10422 {
8a6fb3f9
JB
10423 if (mask == &bad_reg)
10424 return NULL;
10425
43234a1e 10426 /* k0 can't be used for write mask. */
f74a6307 10427 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 10428 {
6d2cd6b2
JB
10429 as_bad (_("`%s%s' can't be used for write mask"),
10430 register_prefix, mask->reg_name);
43234a1e
L
10431 return NULL;
10432 }
10433
10434 if (!i.mask)
10435 {
10436 mask_op.mask = mask;
10437 mask_op.zeroing = 0;
10438 mask_op.operand = this_operand;
10439 i.mask = &mask_op;
10440 }
10441 else
10442 {
10443 if (i.mask->mask)
10444 goto duplicated_vec_op;
10445
10446 i.mask->mask = mask;
10447
10448 /* Only "{z}" is allowed here. No need to check
10449 zeroing mask explicitly. */
10450 if (i.mask->operand != this_operand)
10451 {
10452 as_bad (_("invalid write mask `%s'"), saved);
10453 return NULL;
10454 }
10455 }
10456
10457 op_string = end_op;
10458 }
10459 /* Check zeroing-flag for masking operation. */
10460 else if (*op_string == 'z')
10461 {
10462 if (!i.mask)
10463 {
10464 mask_op.mask = NULL;
10465 mask_op.zeroing = 1;
10466 mask_op.operand = this_operand;
10467 i.mask = &mask_op;
10468 }
10469 else
10470 {
10471 if (i.mask->zeroing)
10472 {
10473 duplicated_vec_op:
10474 as_bad (_("duplicated `%s'"), saved);
10475 return NULL;
10476 }
10477
10478 i.mask->zeroing = 1;
10479
10480 /* Only "{%k}" is allowed here. No need to check mask
10481 register explicitly. */
10482 if (i.mask->operand != this_operand)
10483 {
10484 as_bad (_("invalid zeroing-masking `%s'"),
10485 saved);
10486 return NULL;
10487 }
10488 }
10489
10490 op_string++;
10491 }
10492 else
10493 goto unknown_vec_op;
10494
10495 if (*op_string != '}')
10496 {
10497 as_bad (_("missing `}' in `%s'"), saved);
10498 return NULL;
10499 }
10500 op_string++;
0ba3a731
L
10501
10502 /* Strip whitespace since the addition of pseudo prefixes
10503 changed how the scrubber treats '{'. */
10504 if (is_space_char (*op_string))
10505 ++op_string;
10506
43234a1e
L
10507 continue;
10508 }
10509 unknown_vec_op:
10510 /* We don't know this one. */
10511 as_bad (_("unknown vector operation: `%s'"), saved);
10512 return NULL;
10513 }
10514
6d2cd6b2
JB
10515 if (i.mask && i.mask->zeroing && !i.mask->mask)
10516 {
10517 as_bad (_("zeroing-masking only allowed with write mask"));
10518 return NULL;
10519 }
10520
43234a1e
L
10521 return op_string;
10522}
10523
252b5132 10524static int
70e41ade 10525i386_immediate (char *imm_start)
252b5132
RH
10526{
10527 char *save_input_line_pointer;
f3c180ae 10528 char *gotfree_input_line;
252b5132 10529 segT exp_seg = 0;
47926f60 10530 expressionS *exp;
40fb9820
L
10531 i386_operand_type types;
10532
0dfbf9d7 10533 operand_type_set (&types, ~0);
252b5132
RH
10534
10535 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
10536 {
31b2323c
L
10537 as_bad (_("at most %d immediate operands are allowed"),
10538 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
10539 return 0;
10540 }
10541
10542 exp = &im_expressions[i.imm_operands++];
520dc8e8 10543 i.op[this_operand].imms = exp;
252b5132
RH
10544
10545 if (is_space_char (*imm_start))
10546 ++imm_start;
10547
10548 save_input_line_pointer = input_line_pointer;
10549 input_line_pointer = imm_start;
10550
d258b828 10551 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10552 if (gotfree_input_line)
10553 input_line_pointer = gotfree_input_line;
252b5132
RH
10554
10555 exp_seg = expression (exp);
10556
83183c0c 10557 SKIP_WHITESPACE ();
43234a1e
L
10558
10559 /* Handle vector operations. */
10560 if (*input_line_pointer == '{')
10561 {
10562 input_line_pointer = check_VecOperations (input_line_pointer,
10563 NULL);
10564 if (input_line_pointer == NULL)
10565 return 0;
10566 }
10567
252b5132 10568 if (*input_line_pointer)
f3c180ae 10569 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
10570
10571 input_line_pointer = save_input_line_pointer;
f3c180ae 10572 if (gotfree_input_line)
ee86248c
JB
10573 {
10574 free (gotfree_input_line);
10575
10576 if (exp->X_op == O_constant || exp->X_op == O_register)
10577 exp->X_op = O_illegal;
10578 }
10579
10580 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
10581}
252b5132 10582
ee86248c
JB
10583static int
10584i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10585 i386_operand_type types, const char *imm_start)
10586{
10587 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 10588 {
313c53d1
L
10589 if (imm_start)
10590 as_bad (_("missing or invalid immediate expression `%s'"),
10591 imm_start);
3992d3b7 10592 return 0;
252b5132 10593 }
3e73aa7c 10594 else if (exp->X_op == O_constant)
252b5132 10595 {
47926f60 10596 /* Size it properly later. */
40fb9820 10597 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
10598 /* If not 64bit, sign extend val. */
10599 if (flag_code != CODE_64BIT
4eed87de
AM
10600 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
10601 exp->X_add_number
10602 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 10603 }
4c63da97 10604#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 10605 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 10606 && exp_seg != absolute_section
47926f60 10607 && exp_seg != text_section
24eab124
AM
10608 && exp_seg != data_section
10609 && exp_seg != bss_section
10610 && exp_seg != undefined_section
f86103b7 10611 && !bfd_is_com_section (exp_seg))
252b5132 10612 {
d0b47220 10613 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
10614 return 0;
10615 }
10616#endif
a841bdf5 10617 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 10618 {
313c53d1
L
10619 if (imm_start)
10620 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
10621 return 0;
10622 }
252b5132
RH
10623 else
10624 {
10625 /* This is an address. The size of the address will be
24eab124 10626 determined later, depending on destination register,
3e73aa7c 10627 suffix, or the default for the section. */
40fb9820
L
10628 i.types[this_operand].bitfield.imm8 = 1;
10629 i.types[this_operand].bitfield.imm16 = 1;
10630 i.types[this_operand].bitfield.imm32 = 1;
10631 i.types[this_operand].bitfield.imm32s = 1;
10632 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
10633 i.types[this_operand] = operand_type_and (i.types[this_operand],
10634 types);
252b5132
RH
10635 }
10636
10637 return 1;
10638}
10639
551c1ca1 10640static char *
e3bb37b5 10641i386_scale (char *scale)
252b5132 10642{
551c1ca1
AM
10643 offsetT val;
10644 char *save = input_line_pointer;
252b5132 10645
551c1ca1
AM
10646 input_line_pointer = scale;
10647 val = get_absolute_expression ();
10648
10649 switch (val)
252b5132 10650 {
551c1ca1 10651 case 1:
252b5132
RH
10652 i.log2_scale_factor = 0;
10653 break;
551c1ca1 10654 case 2:
252b5132
RH
10655 i.log2_scale_factor = 1;
10656 break;
551c1ca1 10657 case 4:
252b5132
RH
10658 i.log2_scale_factor = 2;
10659 break;
551c1ca1 10660 case 8:
252b5132
RH
10661 i.log2_scale_factor = 3;
10662 break;
10663 default:
a724f0f4
JB
10664 {
10665 char sep = *input_line_pointer;
10666
10667 *input_line_pointer = '\0';
10668 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
10669 scale);
10670 *input_line_pointer = sep;
10671 input_line_pointer = save;
10672 return NULL;
10673 }
252b5132 10674 }
29b0f896 10675 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
10676 {
10677 as_warn (_("scale factor of %d without an index register"),
24eab124 10678 1 << i.log2_scale_factor);
252b5132 10679 i.log2_scale_factor = 0;
252b5132 10680 }
551c1ca1
AM
10681 scale = input_line_pointer;
10682 input_line_pointer = save;
10683 return scale;
252b5132
RH
10684}
10685
252b5132 10686static int
e3bb37b5 10687i386_displacement (char *disp_start, char *disp_end)
252b5132 10688{
29b0f896 10689 expressionS *exp;
252b5132
RH
10690 segT exp_seg = 0;
10691 char *save_input_line_pointer;
f3c180ae 10692 char *gotfree_input_line;
40fb9820
L
10693 int override;
10694 i386_operand_type bigdisp, types = anydisp;
3992d3b7 10695 int ret;
252b5132 10696
31b2323c
L
10697 if (i.disp_operands == MAX_MEMORY_OPERANDS)
10698 {
10699 as_bad (_("at most %d displacement operands are allowed"),
10700 MAX_MEMORY_OPERANDS);
10701 return 0;
10702 }
10703
0dfbf9d7 10704 operand_type_set (&bigdisp, 0);
6f2f06be 10705 if (i.jumpabsolute
48bcea9f 10706 || i.types[this_operand].bitfield.baseindex
0cfa3eb3
JB
10707 || (current_templates->start->opcode_modifier.jump != JUMP
10708 && current_templates->start->opcode_modifier.jump != JUMP_DWORD))
e05278af 10709 {
48bcea9f 10710 i386_addressing_mode ();
e05278af 10711 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
10712 if (flag_code == CODE_64BIT)
10713 {
10714 if (!override)
10715 {
10716 bigdisp.bitfield.disp32s = 1;
10717 bigdisp.bitfield.disp64 = 1;
10718 }
48bcea9f
JB
10719 else
10720 bigdisp.bitfield.disp32 = 1;
40fb9820
L
10721 }
10722 else if ((flag_code == CODE_16BIT) ^ override)
40fb9820 10723 bigdisp.bitfield.disp16 = 1;
48bcea9f
JB
10724 else
10725 bigdisp.bitfield.disp32 = 1;
e05278af
JB
10726 }
10727 else
10728 {
376cd056
JB
10729 /* For PC-relative branches, the width of the displacement may be
10730 dependent upon data size, but is never dependent upon address size.
10731 Also make sure to not unintentionally match against a non-PC-relative
10732 branch template. */
10733 static templates aux_templates;
10734 const insn_template *t = current_templates->start;
10735 bfd_boolean has_intel64 = FALSE;
10736
10737 aux_templates.start = t;
10738 while (++t < current_templates->end)
10739 {
10740 if (t->opcode_modifier.jump
10741 != current_templates->start->opcode_modifier.jump)
10742 break;
4b5aaf5f 10743 if ((t->opcode_modifier.isa64 >= INTEL64))
376cd056
JB
10744 has_intel64 = TRUE;
10745 }
10746 if (t < current_templates->end)
10747 {
10748 aux_templates.end = t;
10749 current_templates = &aux_templates;
10750 }
10751
e05278af 10752 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
10753 if (flag_code == CODE_64BIT)
10754 {
376cd056
JB
10755 if ((override || i.suffix == WORD_MNEM_SUFFIX)
10756 && (!intel64 || !has_intel64))
40fb9820
L
10757 bigdisp.bitfield.disp16 = 1;
10758 else
48bcea9f 10759 bigdisp.bitfield.disp32s = 1;
40fb9820
L
10760 }
10761 else
e05278af
JB
10762 {
10763 if (!override)
10764 override = (i.suffix == (flag_code != CODE_16BIT
10765 ? WORD_MNEM_SUFFIX
10766 : LONG_MNEM_SUFFIX));
40fb9820
L
10767 bigdisp.bitfield.disp32 = 1;
10768 if ((flag_code == CODE_16BIT) ^ override)
10769 {
10770 bigdisp.bitfield.disp32 = 0;
10771 bigdisp.bitfield.disp16 = 1;
10772 }
e05278af 10773 }
e05278af 10774 }
c6fb90c8
L
10775 i.types[this_operand] = operand_type_or (i.types[this_operand],
10776 bigdisp);
252b5132
RH
10777
10778 exp = &disp_expressions[i.disp_operands];
520dc8e8 10779 i.op[this_operand].disps = exp;
252b5132
RH
10780 i.disp_operands++;
10781 save_input_line_pointer = input_line_pointer;
10782 input_line_pointer = disp_start;
10783 END_STRING_AND_SAVE (disp_end);
10784
10785#ifndef GCC_ASM_O_HACK
10786#define GCC_ASM_O_HACK 0
10787#endif
10788#if GCC_ASM_O_HACK
10789 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 10790 if (i.types[this_operand].bitfield.baseIndex
24eab124 10791 && displacement_string_end[-1] == '+')
252b5132
RH
10792 {
10793 /* This hack is to avoid a warning when using the "o"
24eab124
AM
10794 constraint within gcc asm statements.
10795 For instance:
10796
10797 #define _set_tssldt_desc(n,addr,limit,type) \
10798 __asm__ __volatile__ ( \
10799 "movw %w2,%0\n\t" \
10800 "movw %w1,2+%0\n\t" \
10801 "rorl $16,%1\n\t" \
10802 "movb %b1,4+%0\n\t" \
10803 "movb %4,5+%0\n\t" \
10804 "movb $0,6+%0\n\t" \
10805 "movb %h1,7+%0\n\t" \
10806 "rorl $16,%1" \
10807 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
10808
10809 This works great except that the output assembler ends
10810 up looking a bit weird if it turns out that there is
10811 no offset. You end up producing code that looks like:
10812
10813 #APP
10814 movw $235,(%eax)
10815 movw %dx,2+(%eax)
10816 rorl $16,%edx
10817 movb %dl,4+(%eax)
10818 movb $137,5+(%eax)
10819 movb $0,6+(%eax)
10820 movb %dh,7+(%eax)
10821 rorl $16,%edx
10822 #NO_APP
10823
47926f60 10824 So here we provide the missing zero. */
24eab124
AM
10825
10826 *displacement_string_end = '0';
252b5132
RH
10827 }
10828#endif
d258b828 10829 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10830 if (gotfree_input_line)
10831 input_line_pointer = gotfree_input_line;
252b5132 10832
24eab124 10833 exp_seg = expression (exp);
252b5132 10834
636c26b0
AM
10835 SKIP_WHITESPACE ();
10836 if (*input_line_pointer)
10837 as_bad (_("junk `%s' after expression"), input_line_pointer);
10838#if GCC_ASM_O_HACK
10839 RESTORE_END_STRING (disp_end + 1);
10840#endif
636c26b0 10841 input_line_pointer = save_input_line_pointer;
636c26b0 10842 if (gotfree_input_line)
ee86248c
JB
10843 {
10844 free (gotfree_input_line);
10845
10846 if (exp->X_op == O_constant || exp->X_op == O_register)
10847 exp->X_op = O_illegal;
10848 }
10849
10850 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
10851
10852 RESTORE_END_STRING (disp_end);
10853
10854 return ret;
10855}
10856
10857static int
10858i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10859 i386_operand_type types, const char *disp_start)
10860{
10861 i386_operand_type bigdisp;
10862 int ret = 1;
636c26b0 10863
24eab124
AM
10864 /* We do this to make sure that the section symbol is in
10865 the symbol table. We will ultimately change the relocation
47926f60 10866 to be relative to the beginning of the section. */
1ae12ab7 10867 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
10868 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
10869 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 10870 {
636c26b0 10871 if (exp->X_op != O_symbol)
3992d3b7 10872 goto inv_disp;
636c26b0 10873
e5cb08ac 10874 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
10875 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
10876 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 10877 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
10878 exp->X_op = O_subtract;
10879 exp->X_op_symbol = GOT_symbol;
1ae12ab7 10880 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 10881 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
10882 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
10883 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 10884 else
29b0f896 10885 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 10886 }
252b5132 10887
3992d3b7
AM
10888 else if (exp->X_op == O_absent
10889 || exp->X_op == O_illegal
ee86248c 10890 || exp->X_op == O_big)
2daf4fd8 10891 {
3992d3b7
AM
10892 inv_disp:
10893 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 10894 disp_start);
3992d3b7 10895 ret = 0;
2daf4fd8
AM
10896 }
10897
0e1147d9
L
10898 else if (flag_code == CODE_64BIT
10899 && !i.prefix[ADDR_PREFIX]
10900 && exp->X_op == O_constant)
10901 {
10902 /* Since displacement is signed extended to 64bit, don't allow
10903 disp32 and turn off disp32s if they are out of range. */
10904 i.types[this_operand].bitfield.disp32 = 0;
10905 if (!fits_in_signed_long (exp->X_add_number))
10906 {
10907 i.types[this_operand].bitfield.disp32s = 0;
10908 if (i.types[this_operand].bitfield.baseindex)
10909 {
10910 as_bad (_("0x%lx out range of signed 32bit displacement"),
10911 (long) exp->X_add_number);
10912 ret = 0;
10913 }
10914 }
10915 }
10916
4c63da97 10917#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
10918 else if (exp->X_op != O_constant
10919 && OUTPUT_FLAVOR == bfd_target_aout_flavour
10920 && exp_seg != absolute_section
10921 && exp_seg != text_section
10922 && exp_seg != data_section
10923 && exp_seg != bss_section
10924 && exp_seg != undefined_section
10925 && !bfd_is_com_section (exp_seg))
24eab124 10926 {
d0b47220 10927 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 10928 ret = 0;
24eab124 10929 }
252b5132 10930#endif
3956db08 10931
48bcea9f
JB
10932 if (current_templates->start->opcode_modifier.jump == JUMP_BYTE
10933 /* Constants get taken care of by optimize_disp(). */
10934 && exp->X_op != O_constant)
10935 i.types[this_operand].bitfield.disp8 = 1;
10936
40fb9820
L
10937 /* Check if this is a displacement only operand. */
10938 bigdisp = i.types[this_operand];
10939 bigdisp.bitfield.disp8 = 0;
10940 bigdisp.bitfield.disp16 = 0;
10941 bigdisp.bitfield.disp32 = 0;
10942 bigdisp.bitfield.disp32s = 0;
10943 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 10944 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
10945 i.types[this_operand] = operand_type_and (i.types[this_operand],
10946 types);
3956db08 10947
3992d3b7 10948 return ret;
252b5132
RH
10949}
10950
2abc2bec
JB
10951/* Return the active addressing mode, taking address override and
10952 registers forming the address into consideration. Update the
10953 address override prefix if necessary. */
47926f60 10954
2abc2bec
JB
10955static enum flag_code
10956i386_addressing_mode (void)
252b5132 10957{
be05d201
L
10958 enum flag_code addr_mode;
10959
10960 if (i.prefix[ADDR_PREFIX])
10961 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
a23b33b3
JB
10962 else if (flag_code == CODE_16BIT
10963 && current_templates->start->cpu_flags.bitfield.cpumpx
10964 /* Avoid replacing the "16-bit addressing not allowed" diagnostic
10965 from md_assemble() by "is not a valid base/index expression"
10966 when there is a base and/or index. */
10967 && !i.types[this_operand].bitfield.baseindex)
10968 {
10969 /* MPX insn memory operands with neither base nor index must be forced
10970 to use 32-bit addressing in 16-bit mode. */
10971 addr_mode = CODE_32BIT;
10972 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10973 ++i.prefixes;
10974 gas_assert (!i.types[this_operand].bitfield.disp16);
10975 gas_assert (!i.types[this_operand].bitfield.disp32);
10976 }
be05d201
L
10977 else
10978 {
10979 addr_mode = flag_code;
10980
24eab124 10981#if INFER_ADDR_PREFIX
be05d201
L
10982 if (i.mem_operands == 0)
10983 {
10984 /* Infer address prefix from the first memory operand. */
10985 const reg_entry *addr_reg = i.base_reg;
10986
10987 if (addr_reg == NULL)
10988 addr_reg = i.index_reg;
eecb386c 10989
be05d201
L
10990 if (addr_reg)
10991 {
e968fc9b 10992 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
10993 addr_mode = CODE_32BIT;
10994 else if (flag_code != CODE_64BIT
dc821c5f 10995 && addr_reg->reg_type.bitfield.word)
be05d201
L
10996 addr_mode = CODE_16BIT;
10997
10998 if (addr_mode != flag_code)
10999 {
11000 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
11001 i.prefixes += 1;
11002 /* Change the size of any displacement too. At most one
11003 of Disp16 or Disp32 is set.
11004 FIXME. There doesn't seem to be any real need for
11005 separate Disp16 and Disp32 flags. The same goes for
11006 Imm16 and Imm32. Removing them would probably clean
11007 up the code quite a lot. */
11008 if (flag_code != CODE_64BIT
11009 && (i.types[this_operand].bitfield.disp16
11010 || i.types[this_operand].bitfield.disp32))
11011 i.types[this_operand]
11012 = operand_type_xor (i.types[this_operand], disp16_32);
11013 }
11014 }
11015 }
24eab124 11016#endif
be05d201
L
11017 }
11018
2abc2bec
JB
11019 return addr_mode;
11020}
11021
11022/* Make sure the memory operand we've been dealt is valid.
11023 Return 1 on success, 0 on a failure. */
11024
11025static int
11026i386_index_check (const char *operand_string)
11027{
11028 const char *kind = "base/index";
11029 enum flag_code addr_mode = i386_addressing_mode ();
a152332d 11030 const insn_template *t = current_templates->start;
2abc2bec 11031
a152332d
JB
11032 if (t->opcode_modifier.isstring
11033 && !t->cpu_flags.bitfield.cpupadlock
fc0763e6
JB
11034 && (current_templates->end[-1].opcode_modifier.isstring
11035 || i.mem_operands))
11036 {
11037 /* Memory operands of string insns are special in that they only allow
11038 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
11039 const reg_entry *expected_reg;
11040 static const char *di_si[][2] =
11041 {
11042 { "esi", "edi" },
11043 { "si", "di" },
11044 { "rsi", "rdi" }
11045 };
11046 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
11047
11048 kind = "string address";
11049
a152332d 11050 if (t->opcode_modifier.prefixok == PrefixRep)
fc0763e6 11051 {
51c8edf6
JB
11052 int es_op = current_templates->end[-1].opcode_modifier.isstring
11053 - IS_STRING_ES_OP0;
11054 int op = 0;
fc0763e6 11055
51c8edf6 11056 if (!current_templates->end[-1].operand_types[0].bitfield.baseindex
fc0763e6
JB
11057 || ((!i.mem_operands != !intel_syntax)
11058 && current_templates->end[-1].operand_types[1]
11059 .bitfield.baseindex))
51c8edf6 11060 op = 1;
fe0e921f
AM
11061 expected_reg
11062 = (const reg_entry *) str_hash_find (reg_hash,
11063 di_si[addr_mode][op == es_op]);
fc0763e6
JB
11064 }
11065 else
fe0e921f
AM
11066 expected_reg
11067 = (const reg_entry *)str_hash_find (reg_hash, bx[addr_mode]);
fc0763e6 11068
be05d201
L
11069 if (i.base_reg != expected_reg
11070 || i.index_reg
fc0763e6 11071 || operand_type_check (i.types[this_operand], disp))
fc0763e6 11072 {
be05d201
L
11073 /* The second memory operand must have the same size as
11074 the first one. */
11075 if (i.mem_operands
11076 && i.base_reg
11077 && !((addr_mode == CODE_64BIT
dc821c5f 11078 && i.base_reg->reg_type.bitfield.qword)
be05d201 11079 || (addr_mode == CODE_32BIT
dc821c5f
JB
11080 ? i.base_reg->reg_type.bitfield.dword
11081 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
11082 goto bad_address;
11083
fc0763e6
JB
11084 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
11085 operand_string,
11086 intel_syntax ? '[' : '(',
11087 register_prefix,
be05d201 11088 expected_reg->reg_name,
fc0763e6 11089 intel_syntax ? ']' : ')');
be05d201 11090 return 1;
fc0763e6 11091 }
be05d201
L
11092 else
11093 return 1;
11094
dc1e8a47 11095 bad_address:
be05d201
L
11096 as_bad (_("`%s' is not a valid %s expression"),
11097 operand_string, kind);
11098 return 0;
3e73aa7c
JH
11099 }
11100 else
11101 {
be05d201
L
11102 if (addr_mode != CODE_16BIT)
11103 {
11104 /* 32-bit/64-bit checks. */
41eb8e88
L
11105 if (i.disp_encoding == disp_encoding_16bit)
11106 {
11107 bad_disp:
11108 as_bad (_("invalid `%s' prefix"),
11109 addr_mode == CODE_16BIT ? "{disp32}" : "{disp16}");
11110 return 0;
11111 }
11112
be05d201 11113 if ((i.base_reg
e968fc9b
JB
11114 && ((addr_mode == CODE_64BIT
11115 ? !i.base_reg->reg_type.bitfield.qword
11116 : !i.base_reg->reg_type.bitfield.dword)
11117 || (i.index_reg && i.base_reg->reg_num == RegIP)
11118 || i.base_reg->reg_num == RegIZ))
be05d201 11119 || (i.index_reg
1b54b8d7
JB
11120 && !i.index_reg->reg_type.bitfield.xmmword
11121 && !i.index_reg->reg_type.bitfield.ymmword
11122 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 11123 && ((addr_mode == CODE_64BIT
e968fc9b
JB
11124 ? !i.index_reg->reg_type.bitfield.qword
11125 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
11126 || !i.index_reg->reg_type.bitfield.baseindex)))
11127 goto bad_address;
8178be5b 11128
260cd341 11129 /* bndmk, bndldx, bndstx and mandatory non-vector SIB have special restrictions. */
a152332d 11130 if ((t->opcode_modifier.opcodeprefix == PREFIX_0XF3
389d00a5
JB
11131 && t->opcode_modifier.opcodespace == SPACE_0F
11132 && t->base_opcode == 0x1b)
a152332d 11133 || (t->opcode_modifier.opcodeprefix == PREFIX_NONE
389d00a5
JB
11134 && t->opcode_modifier.opcodespace == SPACE_0F
11135 && (t->base_opcode & ~1) == 0x1a)
a152332d 11136 || t->opcode_modifier.sib == SIBMEM)
8178be5b
JB
11137 {
11138 /* They cannot use RIP-relative addressing. */
e968fc9b 11139 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
11140 {
11141 as_bad (_("`%s' cannot be used here"), operand_string);
11142 return 0;
11143 }
11144
11145 /* bndldx and bndstx ignore their scale factor. */
a152332d 11146 if (t->opcode_modifier.opcodeprefix == PREFIX_NONE
389d00a5
JB
11147 && t->opcode_modifier.opcodespace == SPACE_0F
11148 && (t->base_opcode & ~1) == 0x1a
8178be5b
JB
11149 && i.log2_scale_factor)
11150 as_warn (_("register scaling is being ignored here"));
11151 }
be05d201
L
11152 }
11153 else
3e73aa7c 11154 {
be05d201 11155 /* 16-bit checks. */
41eb8e88
L
11156 if (i.disp_encoding == disp_encoding_32bit)
11157 goto bad_disp;
11158
3e73aa7c 11159 if ((i.base_reg
dc821c5f 11160 && (!i.base_reg->reg_type.bitfield.word
40fb9820 11161 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 11162 || (i.index_reg
dc821c5f 11163 && (!i.index_reg->reg_type.bitfield.word
40fb9820 11164 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
11165 || !(i.base_reg
11166 && i.base_reg->reg_num < 6
11167 && i.index_reg->reg_num >= 6
11168 && i.log2_scale_factor == 0))))
be05d201 11169 goto bad_address;
3e73aa7c
JH
11170 }
11171 }
be05d201 11172 return 1;
24eab124 11173}
252b5132 11174
43234a1e
L
11175/* Handle vector immediates. */
11176
11177static int
11178RC_SAE_immediate (const char *imm_start)
11179{
11180 unsigned int match_found, j;
11181 const char *pstr = imm_start;
11182 expressionS *exp;
11183
11184 if (*pstr != '{')
11185 return 0;
11186
11187 pstr++;
11188 match_found = 0;
11189 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
11190 {
11191 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
11192 {
11193 if (!i.rounding)
11194 {
11195 rc_op.type = RC_NamesTable[j].type;
11196 rc_op.operand = this_operand;
11197 i.rounding = &rc_op;
11198 }
11199 else
11200 {
11201 as_bad (_("duplicated `%s'"), imm_start);
11202 return 0;
11203 }
11204 pstr += RC_NamesTable[j].len;
11205 match_found = 1;
11206 break;
11207 }
11208 }
11209 if (!match_found)
11210 return 0;
11211
11212 if (*pstr++ != '}')
11213 {
11214 as_bad (_("Missing '}': '%s'"), imm_start);
11215 return 0;
11216 }
11217 /* RC/SAE immediate string should contain nothing more. */;
11218 if (*pstr != 0)
11219 {
11220 as_bad (_("Junk after '}': '%s'"), imm_start);
11221 return 0;
11222 }
11223
11224 exp = &im_expressions[i.imm_operands++];
11225 i.op[this_operand].imms = exp;
11226
11227 exp->X_op = O_constant;
11228 exp->X_add_number = 0;
11229 exp->X_add_symbol = (symbolS *) 0;
11230 exp->X_op_symbol = (symbolS *) 0;
11231
11232 i.types[this_operand].bitfield.imm8 = 1;
11233 return 1;
11234}
11235
8325cc63
JB
11236/* Only string instructions can have a second memory operand, so
11237 reduce current_templates to just those if it contains any. */
11238static int
11239maybe_adjust_templates (void)
11240{
11241 const insn_template *t;
11242
11243 gas_assert (i.mem_operands == 1);
11244
11245 for (t = current_templates->start; t < current_templates->end; ++t)
11246 if (t->opcode_modifier.isstring)
11247 break;
11248
11249 if (t < current_templates->end)
11250 {
11251 static templates aux_templates;
11252 bfd_boolean recheck;
11253
11254 aux_templates.start = t;
11255 for (; t < current_templates->end; ++t)
11256 if (!t->opcode_modifier.isstring)
11257 break;
11258 aux_templates.end = t;
11259
11260 /* Determine whether to re-check the first memory operand. */
11261 recheck = (aux_templates.start != current_templates->start
11262 || t != current_templates->end);
11263
11264 current_templates = &aux_templates;
11265
11266 if (recheck)
11267 {
11268 i.mem_operands = 0;
11269 if (i.memop1_string != NULL
11270 && i386_index_check (i.memop1_string) == 0)
11271 return 0;
11272 i.mem_operands = 1;
11273 }
11274 }
11275
11276 return 1;
11277}
11278
fc0763e6 11279/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 11280 on error. */
252b5132 11281
252b5132 11282static int
a7619375 11283i386_att_operand (char *operand_string)
252b5132 11284{
af6bdddf
AM
11285 const reg_entry *r;
11286 char *end_op;
24eab124 11287 char *op_string = operand_string;
252b5132 11288
24eab124 11289 if (is_space_char (*op_string))
252b5132
RH
11290 ++op_string;
11291
24eab124 11292 /* We check for an absolute prefix (differentiating,
47926f60 11293 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
11294 if (*op_string == ABSOLUTE_PREFIX)
11295 {
11296 ++op_string;
11297 if (is_space_char (*op_string))
11298 ++op_string;
6f2f06be 11299 i.jumpabsolute = TRUE;
24eab124 11300 }
252b5132 11301
47926f60 11302 /* Check if operand is a register. */
4d1bb795 11303 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 11304 {
40fb9820
L
11305 i386_operand_type temp;
11306
8a6fb3f9
JB
11307 if (r == &bad_reg)
11308 return 0;
11309
24eab124
AM
11310 /* Check for a segment override by searching for ':' after a
11311 segment register. */
11312 op_string = end_op;
11313 if (is_space_char (*op_string))
11314 ++op_string;
00cee14f 11315 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124
AM
11316 {
11317 switch (r->reg_num)
11318 {
11319 case 0:
11320 i.seg[i.mem_operands] = &es;
11321 break;
11322 case 1:
11323 i.seg[i.mem_operands] = &cs;
11324 break;
11325 case 2:
11326 i.seg[i.mem_operands] = &ss;
11327 break;
11328 case 3:
11329 i.seg[i.mem_operands] = &ds;
11330 break;
11331 case 4:
11332 i.seg[i.mem_operands] = &fs;
11333 break;
11334 case 5:
11335 i.seg[i.mem_operands] = &gs;
11336 break;
11337 }
252b5132 11338
24eab124 11339 /* Skip the ':' and whitespace. */
252b5132
RH
11340 ++op_string;
11341 if (is_space_char (*op_string))
24eab124 11342 ++op_string;
252b5132 11343
24eab124
AM
11344 if (!is_digit_char (*op_string)
11345 && !is_identifier_char (*op_string)
11346 && *op_string != '('
11347 && *op_string != ABSOLUTE_PREFIX)
11348 {
11349 as_bad (_("bad memory operand `%s'"), op_string);
11350 return 0;
11351 }
47926f60 11352 /* Handle case of %es:*foo. */
24eab124
AM
11353 if (*op_string == ABSOLUTE_PREFIX)
11354 {
11355 ++op_string;
11356 if (is_space_char (*op_string))
11357 ++op_string;
6f2f06be 11358 i.jumpabsolute = TRUE;
24eab124
AM
11359 }
11360 goto do_memory_reference;
11361 }
43234a1e
L
11362
11363 /* Handle vector operations. */
11364 if (*op_string == '{')
11365 {
11366 op_string = check_VecOperations (op_string, NULL);
11367 if (op_string == NULL)
11368 return 0;
11369 }
11370
24eab124
AM
11371 if (*op_string)
11372 {
d0b47220 11373 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
11374 return 0;
11375 }
40fb9820
L
11376 temp = r->reg_type;
11377 temp.bitfield.baseindex = 0;
c6fb90c8
L
11378 i.types[this_operand] = operand_type_or (i.types[this_operand],
11379 temp);
7d5e4556 11380 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 11381 i.op[this_operand].regs = r;
24eab124
AM
11382 i.reg_operands++;
11383 }
af6bdddf
AM
11384 else if (*op_string == REGISTER_PREFIX)
11385 {
11386 as_bad (_("bad register name `%s'"), op_string);
11387 return 0;
11388 }
24eab124 11389 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 11390 {
24eab124 11391 ++op_string;
6f2f06be 11392 if (i.jumpabsolute)
24eab124 11393 {
d0b47220 11394 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
11395 return 0;
11396 }
11397 if (!i386_immediate (op_string))
11398 return 0;
11399 }
43234a1e
L
11400 else if (RC_SAE_immediate (operand_string))
11401 {
11402 /* If it is a RC or SAE immediate, do nothing. */
11403 ;
11404 }
24eab124
AM
11405 else if (is_digit_char (*op_string)
11406 || is_identifier_char (*op_string)
d02603dc 11407 || *op_string == '"'
e5cb08ac 11408 || *op_string == '(')
24eab124 11409 {
47926f60 11410 /* This is a memory reference of some sort. */
af6bdddf 11411 char *base_string;
252b5132 11412
47926f60 11413 /* Start and end of displacement string expression (if found). */
eecb386c
AM
11414 char *displacement_string_start;
11415 char *displacement_string_end;
43234a1e 11416 char *vop_start;
252b5132 11417
24eab124 11418 do_memory_reference:
8325cc63
JB
11419 if (i.mem_operands == 1 && !maybe_adjust_templates ())
11420 return 0;
24eab124 11421 if ((i.mem_operands == 1
40fb9820 11422 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
11423 || i.mem_operands == 2)
11424 {
11425 as_bad (_("too many memory references for `%s'"),
11426 current_templates->start->name);
11427 return 0;
11428 }
252b5132 11429
24eab124
AM
11430 /* Check for base index form. We detect the base index form by
11431 looking for an ')' at the end of the operand, searching
11432 for the '(' matching it, and finding a REGISTER_PREFIX or ','
11433 after the '('. */
af6bdddf 11434 base_string = op_string + strlen (op_string);
c3332e24 11435
43234a1e
L
11436 /* Handle vector operations. */
11437 vop_start = strchr (op_string, '{');
11438 if (vop_start && vop_start < base_string)
11439 {
11440 if (check_VecOperations (vop_start, base_string) == NULL)
11441 return 0;
11442 base_string = vop_start;
11443 }
11444
af6bdddf
AM
11445 --base_string;
11446 if (is_space_char (*base_string))
11447 --base_string;
252b5132 11448
47926f60 11449 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
11450 displacement_string_start = op_string;
11451 displacement_string_end = base_string + 1;
252b5132 11452
24eab124
AM
11453 if (*base_string == ')')
11454 {
af6bdddf 11455 char *temp_string;
24eab124
AM
11456 unsigned int parens_balanced = 1;
11457 /* We've already checked that the number of left & right ()'s are
47926f60 11458 equal, so this loop will not be infinite. */
24eab124
AM
11459 do
11460 {
11461 base_string--;
11462 if (*base_string == ')')
11463 parens_balanced++;
11464 if (*base_string == '(')
11465 parens_balanced--;
11466 }
11467 while (parens_balanced);
c3332e24 11468
af6bdddf 11469 temp_string = base_string;
c3332e24 11470
24eab124 11471 /* Skip past '(' and whitespace. */
252b5132
RH
11472 ++base_string;
11473 if (is_space_char (*base_string))
24eab124 11474 ++base_string;
252b5132 11475
af6bdddf 11476 if (*base_string == ','
4eed87de
AM
11477 || ((i.base_reg = parse_register (base_string, &end_op))
11478 != NULL))
252b5132 11479 {
af6bdddf 11480 displacement_string_end = temp_string;
252b5132 11481
40fb9820 11482 i.types[this_operand].bitfield.baseindex = 1;
252b5132 11483
af6bdddf 11484 if (i.base_reg)
24eab124 11485 {
8a6fb3f9
JB
11486 if (i.base_reg == &bad_reg)
11487 return 0;
24eab124
AM
11488 base_string = end_op;
11489 if (is_space_char (*base_string))
11490 ++base_string;
af6bdddf
AM
11491 }
11492
11493 /* There may be an index reg or scale factor here. */
11494 if (*base_string == ',')
11495 {
11496 ++base_string;
11497 if (is_space_char (*base_string))
11498 ++base_string;
11499
4eed87de
AM
11500 if ((i.index_reg = parse_register (base_string, &end_op))
11501 != NULL)
24eab124 11502 {
8a6fb3f9
JB
11503 if (i.index_reg == &bad_reg)
11504 return 0;
af6bdddf 11505 base_string = end_op;
24eab124
AM
11506 if (is_space_char (*base_string))
11507 ++base_string;
af6bdddf
AM
11508 if (*base_string == ',')
11509 {
11510 ++base_string;
11511 if (is_space_char (*base_string))
11512 ++base_string;
11513 }
e5cb08ac 11514 else if (*base_string != ')')
af6bdddf 11515 {
4eed87de
AM
11516 as_bad (_("expecting `,' or `)' "
11517 "after index register in `%s'"),
af6bdddf
AM
11518 operand_string);
11519 return 0;
11520 }
24eab124 11521 }
af6bdddf 11522 else if (*base_string == REGISTER_PREFIX)
24eab124 11523 {
f76bf5e0
L
11524 end_op = strchr (base_string, ',');
11525 if (end_op)
11526 *end_op = '\0';
af6bdddf 11527 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
11528 return 0;
11529 }
252b5132 11530
47926f60 11531 /* Check for scale factor. */
551c1ca1 11532 if (*base_string != ')')
af6bdddf 11533 {
551c1ca1
AM
11534 char *end_scale = i386_scale (base_string);
11535
11536 if (!end_scale)
af6bdddf 11537 return 0;
24eab124 11538
551c1ca1 11539 base_string = end_scale;
af6bdddf
AM
11540 if (is_space_char (*base_string))
11541 ++base_string;
11542 if (*base_string != ')')
11543 {
4eed87de
AM
11544 as_bad (_("expecting `)' "
11545 "after scale factor in `%s'"),
af6bdddf
AM
11546 operand_string);
11547 return 0;
11548 }
11549 }
11550 else if (!i.index_reg)
24eab124 11551 {
4eed87de
AM
11552 as_bad (_("expecting index register or scale factor "
11553 "after `,'; got '%c'"),
af6bdddf 11554 *base_string);
24eab124
AM
11555 return 0;
11556 }
11557 }
af6bdddf 11558 else if (*base_string != ')')
24eab124 11559 {
4eed87de
AM
11560 as_bad (_("expecting `,' or `)' "
11561 "after base register in `%s'"),
af6bdddf 11562 operand_string);
24eab124
AM
11563 return 0;
11564 }
c3332e24 11565 }
af6bdddf 11566 else if (*base_string == REGISTER_PREFIX)
c3332e24 11567 {
f76bf5e0
L
11568 end_op = strchr (base_string, ',');
11569 if (end_op)
11570 *end_op = '\0';
af6bdddf 11571 as_bad (_("bad register name `%s'"), base_string);
24eab124 11572 return 0;
c3332e24 11573 }
24eab124
AM
11574 }
11575
11576 /* If there's an expression beginning the operand, parse it,
11577 assuming displacement_string_start and
11578 displacement_string_end are meaningful. */
11579 if (displacement_string_start != displacement_string_end)
11580 {
11581 if (!i386_displacement (displacement_string_start,
11582 displacement_string_end))
11583 return 0;
11584 }
11585
11586 /* Special case for (%dx) while doing input/output op. */
11587 if (i.base_reg
75e5731b
JB
11588 && i.base_reg->reg_type.bitfield.instance == RegD
11589 && i.base_reg->reg_type.bitfield.word
24eab124
AM
11590 && i.index_reg == 0
11591 && i.log2_scale_factor == 0
11592 && i.seg[i.mem_operands] == 0
40fb9820 11593 && !operand_type_check (i.types[this_operand], disp))
24eab124 11594 {
2fb5be8d 11595 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
11596 return 1;
11597 }
11598
eecb386c
AM
11599 if (i386_index_check (operand_string) == 0)
11600 return 0;
c48dadc9 11601 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
11602 if (i.mem_operands == 0)
11603 i.memop1_string = xstrdup (operand_string);
24eab124
AM
11604 i.mem_operands++;
11605 }
11606 else
ce8a8b2f
AM
11607 {
11608 /* It's not a memory operand; argh! */
24eab124
AM
11609 as_bad (_("invalid char %s beginning operand %d `%s'"),
11610 output_invalid (*op_string),
11611 this_operand + 1,
11612 op_string);
11613 return 0;
11614 }
47926f60 11615 return 1; /* Normal return. */
252b5132
RH
11616}
11617\f
fa94de6b
RM
11618/* Calculate the maximum variable size (i.e., excluding fr_fix)
11619 that an rs_machine_dependent frag may reach. */
11620
11621unsigned int
11622i386_frag_max_var (fragS *frag)
11623{
11624 /* The only relaxable frags are for jumps.
11625 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
11626 gas_assert (frag->fr_type == rs_machine_dependent);
11627 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
11628}
11629
b084df0b
L
11630#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11631static int
8dcea932 11632elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
11633{
11634 /* STT_GNU_IFUNC symbol must go through PLT. */
11635 if ((symbol_get_bfdsym (fr_symbol)->flags
11636 & BSF_GNU_INDIRECT_FUNCTION) != 0)
11637 return 0;
11638
11639 if (!S_IS_EXTERNAL (fr_symbol))
11640 /* Symbol may be weak or local. */
11641 return !S_IS_WEAK (fr_symbol);
11642
8dcea932
L
11643 /* Global symbols with non-default visibility can't be preempted. */
11644 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
11645 return 1;
11646
11647 if (fr_var != NO_RELOC)
11648 switch ((enum bfd_reloc_code_real) fr_var)
11649 {
11650 case BFD_RELOC_386_PLT32:
11651 case BFD_RELOC_X86_64_PLT32:
33eaf5de 11652 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
11653 return 0;
11654 default:
11655 abort ();
11656 }
11657
b084df0b
L
11658 /* Global symbols with default visibility in a shared library may be
11659 preempted by another definition. */
8dcea932 11660 return !shared;
b084df0b
L
11661}
11662#endif
11663
79d72f45
HL
11664/* Table 3-2. Macro-Fusible Instructions in Haswell Microarchitecture
11665 Note also work for Skylake and Cascadelake.
11666---------------------------------------------------------------------
11667| JCC | ADD/SUB/CMP | INC/DEC | TEST/AND |
11668| ------ | ----------- | ------- | -------- |
11669| Jo | N | N | Y |
11670| Jno | N | N | Y |
11671| Jc/Jb | Y | N | Y |
11672| Jae/Jnb | Y | N | Y |
11673| Je/Jz | Y | Y | Y |
11674| Jne/Jnz | Y | Y | Y |
11675| Jna/Jbe | Y | N | Y |
11676| Ja/Jnbe | Y | N | Y |
11677| Js | N | N | Y |
11678| Jns | N | N | Y |
11679| Jp/Jpe | N | N | Y |
11680| Jnp/Jpo | N | N | Y |
11681| Jl/Jnge | Y | Y | Y |
11682| Jge/Jnl | Y | Y | Y |
11683| Jle/Jng | Y | Y | Y |
11684| Jg/Jnle | Y | Y | Y |
11685--------------------------------------------------------------------- */
11686static int
11687i386_macro_fusible_p (enum mf_cmp_kind mf_cmp, enum mf_jcc_kind mf_jcc)
11688{
11689 if (mf_cmp == mf_cmp_alu_cmp)
11690 return ((mf_jcc >= mf_jcc_jc && mf_jcc <= mf_jcc_jna)
11691 || mf_jcc == mf_jcc_jl || mf_jcc == mf_jcc_jle);
11692 if (mf_cmp == mf_cmp_incdec)
11693 return (mf_jcc == mf_jcc_je || mf_jcc == mf_jcc_jl
11694 || mf_jcc == mf_jcc_jle);
11695 if (mf_cmp == mf_cmp_test_and)
11696 return 1;
11697 return 0;
11698}
11699
e379e5f3
L
11700/* Return the next non-empty frag. */
11701
11702static fragS *
11703i386_next_non_empty_frag (fragS *fragP)
11704{
11705 /* There may be a frag with a ".fill 0" when there is no room in
11706 the current frag for frag_grow in output_insn. */
11707 for (fragP = fragP->fr_next;
11708 (fragP != NULL
11709 && fragP->fr_type == rs_fill
11710 && fragP->fr_fix == 0);
11711 fragP = fragP->fr_next)
11712 ;
11713 return fragP;
11714}
11715
11716/* Return the next jcc frag after BRANCH_PADDING. */
11717
11718static fragS *
79d72f45 11719i386_next_fusible_jcc_frag (fragS *maybe_cmp_fragP, fragS *pad_fragP)
e379e5f3 11720{
79d72f45
HL
11721 fragS *branch_fragP;
11722 if (!pad_fragP)
e379e5f3
L
11723 return NULL;
11724
79d72f45
HL
11725 if (pad_fragP->fr_type == rs_machine_dependent
11726 && (TYPE_FROM_RELAX_STATE (pad_fragP->fr_subtype)
e379e5f3
L
11727 == BRANCH_PADDING))
11728 {
79d72f45
HL
11729 branch_fragP = i386_next_non_empty_frag (pad_fragP);
11730 if (branch_fragP->fr_type != rs_machine_dependent)
e379e5f3 11731 return NULL;
79d72f45
HL
11732 if (TYPE_FROM_RELAX_STATE (branch_fragP->fr_subtype) == COND_JUMP
11733 && i386_macro_fusible_p (maybe_cmp_fragP->tc_frag_data.mf_type,
11734 pad_fragP->tc_frag_data.mf_type))
11735 return branch_fragP;
e379e5f3
L
11736 }
11737
11738 return NULL;
11739}
11740
11741/* Classify BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags. */
11742
11743static void
11744i386_classify_machine_dependent_frag (fragS *fragP)
11745{
11746 fragS *cmp_fragP;
11747 fragS *pad_fragP;
11748 fragS *branch_fragP;
11749 fragS *next_fragP;
11750 unsigned int max_prefix_length;
11751
11752 if (fragP->tc_frag_data.classified)
11753 return;
11754
11755 /* First scan for BRANCH_PADDING and FUSED_JCC_PADDING. Convert
11756 FUSED_JCC_PADDING and merge BRANCH_PADDING. */
11757 for (next_fragP = fragP;
11758 next_fragP != NULL;
11759 next_fragP = next_fragP->fr_next)
11760 {
11761 next_fragP->tc_frag_data.classified = 1;
11762 if (next_fragP->fr_type == rs_machine_dependent)
11763 switch (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype))
11764 {
11765 case BRANCH_PADDING:
11766 /* The BRANCH_PADDING frag must be followed by a branch
11767 frag. */
11768 branch_fragP = i386_next_non_empty_frag (next_fragP);
11769 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11770 break;
11771 case FUSED_JCC_PADDING:
11772 /* Check if this is a fused jcc:
11773 FUSED_JCC_PADDING
11774 CMP like instruction
11775 BRANCH_PADDING
11776 COND_JUMP
11777 */
11778 cmp_fragP = i386_next_non_empty_frag (next_fragP);
11779 pad_fragP = i386_next_non_empty_frag (cmp_fragP);
79d72f45 11780 branch_fragP = i386_next_fusible_jcc_frag (next_fragP, pad_fragP);
e379e5f3
L
11781 if (branch_fragP)
11782 {
11783 /* The BRANCH_PADDING frag is merged with the
11784 FUSED_JCC_PADDING frag. */
11785 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11786 /* CMP like instruction size. */
11787 next_fragP->tc_frag_data.cmp_size = cmp_fragP->fr_fix;
11788 frag_wane (pad_fragP);
11789 /* Skip to branch_fragP. */
11790 next_fragP = branch_fragP;
11791 }
11792 else if (next_fragP->tc_frag_data.max_prefix_length)
11793 {
11794 /* Turn FUSED_JCC_PADDING into BRANCH_PREFIX if it isn't
11795 a fused jcc. */
11796 next_fragP->fr_subtype
11797 = ENCODE_RELAX_STATE (BRANCH_PREFIX, 0);
11798 next_fragP->tc_frag_data.max_bytes
11799 = next_fragP->tc_frag_data.max_prefix_length;
11800 /* This will be updated in the BRANCH_PREFIX scan. */
11801 next_fragP->tc_frag_data.max_prefix_length = 0;
11802 }
11803 else
11804 frag_wane (next_fragP);
11805 break;
11806 }
11807 }
11808
11809 /* Stop if there is no BRANCH_PREFIX. */
11810 if (!align_branch_prefix_size)
11811 return;
11812
11813 /* Scan for BRANCH_PREFIX. */
11814 for (; fragP != NULL; fragP = fragP->fr_next)
11815 {
11816 if (fragP->fr_type != rs_machine_dependent
11817 || (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11818 != BRANCH_PREFIX))
11819 continue;
11820
11821 /* Count all BRANCH_PREFIX frags before BRANCH_PADDING and
11822 COND_JUMP_PREFIX. */
11823 max_prefix_length = 0;
11824 for (next_fragP = fragP;
11825 next_fragP != NULL;
11826 next_fragP = next_fragP->fr_next)
11827 {
11828 if (next_fragP->fr_type == rs_fill)
11829 /* Skip rs_fill frags. */
11830 continue;
11831 else if (next_fragP->fr_type != rs_machine_dependent)
11832 /* Stop for all other frags. */
11833 break;
11834
11835 /* rs_machine_dependent frags. */
11836 if (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11837 == BRANCH_PREFIX)
11838 {
11839 /* Count BRANCH_PREFIX frags. */
11840 if (max_prefix_length >= MAX_FUSED_JCC_PADDING_SIZE)
11841 {
11842 max_prefix_length = MAX_FUSED_JCC_PADDING_SIZE;
11843 frag_wane (next_fragP);
11844 }
11845 else
11846 max_prefix_length
11847 += next_fragP->tc_frag_data.max_bytes;
11848 }
11849 else if ((TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11850 == BRANCH_PADDING)
11851 || (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11852 == FUSED_JCC_PADDING))
11853 {
11854 /* Stop at BRANCH_PADDING and FUSED_JCC_PADDING. */
11855 fragP->tc_frag_data.u.padding_fragP = next_fragP;
11856 break;
11857 }
11858 else
11859 /* Stop for other rs_machine_dependent frags. */
11860 break;
11861 }
11862
11863 fragP->tc_frag_data.max_prefix_length = max_prefix_length;
11864
11865 /* Skip to the next frag. */
11866 fragP = next_fragP;
11867 }
11868}
11869
11870/* Compute padding size for
11871
11872 FUSED_JCC_PADDING
11873 CMP like instruction
11874 BRANCH_PADDING
11875 COND_JUMP/UNCOND_JUMP
11876
11877 or
11878
11879 BRANCH_PADDING
11880 COND_JUMP/UNCOND_JUMP
11881 */
11882
11883static int
11884i386_branch_padding_size (fragS *fragP, offsetT address)
11885{
11886 unsigned int offset, size, padding_size;
11887 fragS *branch_fragP = fragP->tc_frag_data.u.branch_fragP;
11888
11889 /* The start address of the BRANCH_PADDING or FUSED_JCC_PADDING frag. */
11890 if (!address)
11891 address = fragP->fr_address;
11892 address += fragP->fr_fix;
11893
11894 /* CMP like instrunction size. */
11895 size = fragP->tc_frag_data.cmp_size;
11896
11897 /* The base size of the branch frag. */
11898 size += branch_fragP->fr_fix;
11899
11900 /* Add opcode and displacement bytes for the rs_machine_dependent
11901 branch frag. */
11902 if (branch_fragP->fr_type == rs_machine_dependent)
11903 size += md_relax_table[branch_fragP->fr_subtype].rlx_length;
11904
11905 /* Check if branch is within boundary and doesn't end at the last
11906 byte. */
11907 offset = address & ((1U << align_branch_power) - 1);
11908 if ((offset + size) >= (1U << align_branch_power))
11909 /* Padding needed to avoid crossing boundary. */
11910 padding_size = (1U << align_branch_power) - offset;
11911 else
11912 /* No padding needed. */
11913 padding_size = 0;
11914
11915 /* The return value may be saved in tc_frag_data.length which is
11916 unsigned byte. */
11917 if (!fits_in_unsigned_byte (padding_size))
11918 abort ();
11919
11920 return padding_size;
11921}
11922
11923/* i386_generic_table_relax_frag()
11924
11925 Handle BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags to
11926 grow/shrink padding to align branch frags. Hand others to
11927 relax_frag(). */
11928
11929long
11930i386_generic_table_relax_frag (segT segment, fragS *fragP, long stretch)
11931{
11932 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11933 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11934 {
11935 long padding_size = i386_branch_padding_size (fragP, 0);
11936 long grow = padding_size - fragP->tc_frag_data.length;
11937
11938 /* When the BRANCH_PREFIX frag is used, the computed address
11939 must match the actual address and there should be no padding. */
11940 if (fragP->tc_frag_data.padding_address
11941 && (fragP->tc_frag_data.padding_address != fragP->fr_address
11942 || padding_size))
11943 abort ();
11944
11945 /* Update the padding size. */
11946 if (grow)
11947 fragP->tc_frag_data.length = padding_size;
11948
11949 return grow;
11950 }
11951 else if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11952 {
11953 fragS *padding_fragP, *next_fragP;
11954 long padding_size, left_size, last_size;
11955
11956 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
11957 if (!padding_fragP)
11958 /* Use the padding set by the leading BRANCH_PREFIX frag. */
11959 return (fragP->tc_frag_data.length
11960 - fragP->tc_frag_data.last_length);
11961
11962 /* Compute the relative address of the padding frag in the very
11963 first time where the BRANCH_PREFIX frag sizes are zero. */
11964 if (!fragP->tc_frag_data.padding_address)
11965 fragP->tc_frag_data.padding_address
11966 = padding_fragP->fr_address - (fragP->fr_address - stretch);
11967
11968 /* First update the last length from the previous interation. */
11969 left_size = fragP->tc_frag_data.prefix_length;
11970 for (next_fragP = fragP;
11971 next_fragP != padding_fragP;
11972 next_fragP = next_fragP->fr_next)
11973 if (next_fragP->fr_type == rs_machine_dependent
11974 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11975 == BRANCH_PREFIX))
11976 {
11977 if (left_size)
11978 {
11979 int max = next_fragP->tc_frag_data.max_bytes;
11980 if (max)
11981 {
11982 int size;
11983 if (max > left_size)
11984 size = left_size;
11985 else
11986 size = max;
11987 left_size -= size;
11988 next_fragP->tc_frag_data.last_length = size;
11989 }
11990 }
11991 else
11992 next_fragP->tc_frag_data.last_length = 0;
11993 }
11994
11995 /* Check the padding size for the padding frag. */
11996 padding_size = i386_branch_padding_size
11997 (padding_fragP, (fragP->fr_address
11998 + fragP->tc_frag_data.padding_address));
11999
12000 last_size = fragP->tc_frag_data.prefix_length;
12001 /* Check if there is change from the last interation. */
12002 if (padding_size == last_size)
12003 {
12004 /* Update the expected address of the padding frag. */
12005 padding_fragP->tc_frag_data.padding_address
12006 = (fragP->fr_address + padding_size
12007 + fragP->tc_frag_data.padding_address);
12008 return 0;
12009 }
12010
12011 if (padding_size > fragP->tc_frag_data.max_prefix_length)
12012 {
12013 /* No padding if there is no sufficient room. Clear the
12014 expected address of the padding frag. */
12015 padding_fragP->tc_frag_data.padding_address = 0;
12016 padding_size = 0;
12017 }
12018 else
12019 /* Store the expected address of the padding frag. */
12020 padding_fragP->tc_frag_data.padding_address
12021 = (fragP->fr_address + padding_size
12022 + fragP->tc_frag_data.padding_address);
12023
12024 fragP->tc_frag_data.prefix_length = padding_size;
12025
12026 /* Update the length for the current interation. */
12027 left_size = padding_size;
12028 for (next_fragP = fragP;
12029 next_fragP != padding_fragP;
12030 next_fragP = next_fragP->fr_next)
12031 if (next_fragP->fr_type == rs_machine_dependent
12032 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
12033 == BRANCH_PREFIX))
12034 {
12035 if (left_size)
12036 {
12037 int max = next_fragP->tc_frag_data.max_bytes;
12038 if (max)
12039 {
12040 int size;
12041 if (max > left_size)
12042 size = left_size;
12043 else
12044 size = max;
12045 left_size -= size;
12046 next_fragP->tc_frag_data.length = size;
12047 }
12048 }
12049 else
12050 next_fragP->tc_frag_data.length = 0;
12051 }
12052
12053 return (fragP->tc_frag_data.length
12054 - fragP->tc_frag_data.last_length);
12055 }
12056 return relax_frag (segment, fragP, stretch);
12057}
12058
ee7fcc42
AM
12059/* md_estimate_size_before_relax()
12060
12061 Called just before relax() for rs_machine_dependent frags. The x86
12062 assembler uses these frags to handle variable size jump
12063 instructions.
12064
12065 Any symbol that is now undefined will not become defined.
12066 Return the correct fr_subtype in the frag.
12067 Return the initial "guess for variable size of frag" to caller.
12068 The guess is actually the growth beyond the fixed part. Whatever
12069 we do to grow the fixed or variable part contributes to our
12070 returned value. */
12071
252b5132 12072int
7016a5d5 12073md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 12074{
e379e5f3
L
12075 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12076 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX
12077 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
12078 {
12079 i386_classify_machine_dependent_frag (fragP);
12080 return fragP->tc_frag_data.length;
12081 }
12082
252b5132 12083 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
12084 check for un-relaxable symbols. On an ELF system, we can't relax
12085 an externally visible symbol, because it may be overridden by a
12086 shared library. */
12087 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 12088#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12089 || (IS_ELF
8dcea932
L
12090 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
12091 fragP->fr_var))
fbeb56a4
DK
12092#endif
12093#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 12094 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 12095 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
12096#endif
12097 )
252b5132 12098 {
b98ef147
AM
12099 /* Symbol is undefined in this segment, or we need to keep a
12100 reloc so that weak symbols can be overridden. */
12101 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 12102 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
12103 unsigned char *opcode;
12104 int old_fr_fix;
f6af82bd 12105
ee7fcc42 12106 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 12107 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 12108 else if (size == 2)
f6af82bd 12109 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
12110#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12111 else if (need_plt32_p (fragP->fr_symbol))
12112 reloc_type = BFD_RELOC_X86_64_PLT32;
12113#endif
f6af82bd
AM
12114 else
12115 reloc_type = BFD_RELOC_32_PCREL;
252b5132 12116
ee7fcc42
AM
12117 old_fr_fix = fragP->fr_fix;
12118 opcode = (unsigned char *) fragP->fr_opcode;
12119
fddf5b5b 12120 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 12121 {
fddf5b5b
AM
12122 case UNCOND_JUMP:
12123 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 12124 opcode[0] = 0xe9;
252b5132 12125 fragP->fr_fix += size;
062cd5e7
AS
12126 fix_new (fragP, old_fr_fix, size,
12127 fragP->fr_symbol,
12128 fragP->fr_offset, 1,
12129 reloc_type);
252b5132
RH
12130 break;
12131
fddf5b5b 12132 case COND_JUMP86:
412167cb
AM
12133 if (size == 2
12134 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
12135 {
12136 /* Negate the condition, and branch past an
12137 unconditional jump. */
12138 opcode[0] ^= 1;
12139 opcode[1] = 3;
12140 /* Insert an unconditional jump. */
12141 opcode[2] = 0xe9;
12142 /* We added two extra opcode bytes, and have a two byte
12143 offset. */
12144 fragP->fr_fix += 2 + 2;
062cd5e7
AS
12145 fix_new (fragP, old_fr_fix + 2, 2,
12146 fragP->fr_symbol,
12147 fragP->fr_offset, 1,
12148 reloc_type);
fddf5b5b
AM
12149 break;
12150 }
12151 /* Fall through. */
12152
12153 case COND_JUMP:
412167cb
AM
12154 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
12155 {
3e02c1cc
AM
12156 fixS *fixP;
12157
412167cb 12158 fragP->fr_fix += 1;
3e02c1cc
AM
12159 fixP = fix_new (fragP, old_fr_fix, 1,
12160 fragP->fr_symbol,
12161 fragP->fr_offset, 1,
12162 BFD_RELOC_8_PCREL);
12163 fixP->fx_signed = 1;
412167cb
AM
12164 break;
12165 }
93c2a809 12166
24eab124 12167 /* This changes the byte-displacement jump 0x7N
fddf5b5b 12168 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 12169 opcode[1] = opcode[0] + 0x10;
f6af82bd 12170 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
12171 /* We've added an opcode byte. */
12172 fragP->fr_fix += 1 + size;
062cd5e7
AS
12173 fix_new (fragP, old_fr_fix + 1, size,
12174 fragP->fr_symbol,
12175 fragP->fr_offset, 1,
12176 reloc_type);
252b5132 12177 break;
fddf5b5b
AM
12178
12179 default:
12180 BAD_CASE (fragP->fr_subtype);
12181 break;
252b5132
RH
12182 }
12183 frag_wane (fragP);
ee7fcc42 12184 return fragP->fr_fix - old_fr_fix;
252b5132 12185 }
93c2a809 12186
93c2a809
AM
12187 /* Guess size depending on current relax state. Initially the relax
12188 state will correspond to a short jump and we return 1, because
12189 the variable part of the frag (the branch offset) is one byte
12190 long. However, we can relax a section more than once and in that
12191 case we must either set fr_subtype back to the unrelaxed state,
12192 or return the value for the appropriate branch. */
12193 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
12194}
12195
47926f60
KH
12196/* Called after relax() is finished.
12197
12198 In: Address of frag.
12199 fr_type == rs_machine_dependent.
12200 fr_subtype is what the address relaxed to.
12201
12202 Out: Any fixSs and constants are set up.
12203 Caller will turn frag into a ".space 0". */
12204
252b5132 12205void
7016a5d5
TG
12206md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
12207 fragS *fragP)
252b5132 12208{
29b0f896 12209 unsigned char *opcode;
252b5132 12210 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
12211 offsetT target_address;
12212 offsetT opcode_address;
252b5132 12213 unsigned int extension = 0;
847f7ad4 12214 offsetT displacement_from_opcode_start;
252b5132 12215
e379e5f3
L
12216 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12217 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING
12218 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12219 {
12220 /* Generate nop padding. */
12221 unsigned int size = fragP->tc_frag_data.length;
12222 if (size)
12223 {
12224 if (size > fragP->tc_frag_data.max_bytes)
12225 abort ();
12226
12227 if (flag_debug)
12228 {
12229 const char *msg;
12230 const char *branch = "branch";
12231 const char *prefix = "";
12232 fragS *padding_fragP;
12233 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
12234 == BRANCH_PREFIX)
12235 {
12236 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
12237 switch (fragP->tc_frag_data.default_prefix)
12238 {
12239 default:
12240 abort ();
12241 break;
12242 case CS_PREFIX_OPCODE:
12243 prefix = " cs";
12244 break;
12245 case DS_PREFIX_OPCODE:
12246 prefix = " ds";
12247 break;
12248 case ES_PREFIX_OPCODE:
12249 prefix = " es";
12250 break;
12251 case FS_PREFIX_OPCODE:
12252 prefix = " fs";
12253 break;
12254 case GS_PREFIX_OPCODE:
12255 prefix = " gs";
12256 break;
12257 case SS_PREFIX_OPCODE:
12258 prefix = " ss";
12259 break;
12260 }
12261 if (padding_fragP)
12262 msg = _("%s:%u: add %d%s at 0x%llx to align "
12263 "%s within %d-byte boundary\n");
12264 else
12265 msg = _("%s:%u: add additional %d%s at 0x%llx to "
12266 "align %s within %d-byte boundary\n");
12267 }
12268 else
12269 {
12270 padding_fragP = fragP;
12271 msg = _("%s:%u: add %d%s-byte nop at 0x%llx to align "
12272 "%s within %d-byte boundary\n");
12273 }
12274
12275 if (padding_fragP)
12276 switch (padding_fragP->tc_frag_data.branch_type)
12277 {
12278 case align_branch_jcc:
12279 branch = "jcc";
12280 break;
12281 case align_branch_fused:
12282 branch = "fused jcc";
12283 break;
12284 case align_branch_jmp:
12285 branch = "jmp";
12286 break;
12287 case align_branch_call:
12288 branch = "call";
12289 break;
12290 case align_branch_indirect:
12291 branch = "indiret branch";
12292 break;
12293 case align_branch_ret:
12294 branch = "ret";
12295 break;
12296 default:
12297 break;
12298 }
12299
12300 fprintf (stdout, msg,
12301 fragP->fr_file, fragP->fr_line, size, prefix,
12302 (long long) fragP->fr_address, branch,
12303 1 << align_branch_power);
12304 }
12305 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12306 memset (fragP->fr_opcode,
12307 fragP->tc_frag_data.default_prefix, size);
12308 else
12309 i386_generate_nops (fragP, (char *) fragP->fr_opcode,
12310 size, 0);
12311 fragP->fr_fix += size;
12312 }
12313 return;
12314 }
12315
252b5132
RH
12316 opcode = (unsigned char *) fragP->fr_opcode;
12317
47926f60 12318 /* Address we want to reach in file space. */
252b5132 12319 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 12320
47926f60 12321 /* Address opcode resides at in file space. */
252b5132
RH
12322 opcode_address = fragP->fr_address + fragP->fr_fix;
12323
47926f60 12324 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
12325 displacement_from_opcode_start = target_address - opcode_address;
12326
fddf5b5b 12327 if ((fragP->fr_subtype & BIG) == 0)
252b5132 12328 {
47926f60
KH
12329 /* Don't have to change opcode. */
12330 extension = 1; /* 1 opcode + 1 displacement */
252b5132 12331 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
12332 }
12333 else
12334 {
12335 if (no_cond_jump_promotion
12336 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
12337 as_warn_where (fragP->fr_file, fragP->fr_line,
12338 _("long jump required"));
252b5132 12339
fddf5b5b
AM
12340 switch (fragP->fr_subtype)
12341 {
12342 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
12343 extension = 4; /* 1 opcode + 4 displacement */
12344 opcode[0] = 0xe9;
12345 where_to_put_displacement = &opcode[1];
12346 break;
252b5132 12347
fddf5b5b
AM
12348 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
12349 extension = 2; /* 1 opcode + 2 displacement */
12350 opcode[0] = 0xe9;
12351 where_to_put_displacement = &opcode[1];
12352 break;
252b5132 12353
fddf5b5b
AM
12354 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
12355 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
12356 extension = 5; /* 2 opcode + 4 displacement */
12357 opcode[1] = opcode[0] + 0x10;
12358 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12359 where_to_put_displacement = &opcode[2];
12360 break;
252b5132 12361
fddf5b5b
AM
12362 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
12363 extension = 3; /* 2 opcode + 2 displacement */
12364 opcode[1] = opcode[0] + 0x10;
12365 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12366 where_to_put_displacement = &opcode[2];
12367 break;
252b5132 12368
fddf5b5b
AM
12369 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
12370 extension = 4;
12371 opcode[0] ^= 1;
12372 opcode[1] = 3;
12373 opcode[2] = 0xe9;
12374 where_to_put_displacement = &opcode[3];
12375 break;
12376
12377 default:
12378 BAD_CASE (fragP->fr_subtype);
12379 break;
12380 }
252b5132 12381 }
fddf5b5b 12382
7b81dfbb
AJ
12383 /* If size if less then four we are sure that the operand fits,
12384 but if it's 4, then it could be that the displacement is larger
12385 then -/+ 2GB. */
12386 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
12387 && object_64bit
12388 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
12389 + ((addressT) 1 << 31))
12390 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
12391 {
12392 as_bad_where (fragP->fr_file, fragP->fr_line,
12393 _("jump target out of range"));
12394 /* Make us emit 0. */
12395 displacement_from_opcode_start = extension;
12396 }
47926f60 12397 /* Now put displacement after opcode. */
252b5132
RH
12398 md_number_to_chars ((char *) where_to_put_displacement,
12399 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 12400 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
12401 fragP->fr_fix += extension;
12402}
12403\f
7016a5d5 12404/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
12405 by our caller that we have all the info we need to fix it up.
12406
7016a5d5
TG
12407 Parameter valP is the pointer to the value of the bits.
12408
252b5132
RH
12409 On the 386, immediates, displacements, and data pointers are all in
12410 the same (little-endian) format, so we don't need to care about which
12411 we are handling. */
12412
94f592af 12413void
7016a5d5 12414md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 12415{
94f592af 12416 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 12417 valueT value = *valP;
252b5132 12418
f86103b7 12419#if !defined (TE_Mach)
93382f6d
AM
12420 if (fixP->fx_pcrel)
12421 {
12422 switch (fixP->fx_r_type)
12423 {
5865bb77
ILT
12424 default:
12425 break;
12426
d6ab8113
JB
12427 case BFD_RELOC_64:
12428 fixP->fx_r_type = BFD_RELOC_64_PCREL;
12429 break;
93382f6d 12430 case BFD_RELOC_32:
ae8887b5 12431 case BFD_RELOC_X86_64_32S:
93382f6d
AM
12432 fixP->fx_r_type = BFD_RELOC_32_PCREL;
12433 break;
12434 case BFD_RELOC_16:
12435 fixP->fx_r_type = BFD_RELOC_16_PCREL;
12436 break;
12437 case BFD_RELOC_8:
12438 fixP->fx_r_type = BFD_RELOC_8_PCREL;
12439 break;
12440 }
12441 }
252b5132 12442
a161fe53 12443 if (fixP->fx_addsy != NULL
31312f95 12444 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 12445 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 12446 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 12447 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 12448 && !use_rela_relocations)
252b5132 12449 {
31312f95
AM
12450 /* This is a hack. There should be a better way to handle this.
12451 This covers for the fact that bfd_install_relocation will
12452 subtract the current location (for partial_inplace, PC relative
12453 relocations); see more below. */
252b5132 12454#ifndef OBJ_AOUT
718ddfc0 12455 if (IS_ELF
252b5132
RH
12456#ifdef TE_PE
12457 || OUTPUT_FLAVOR == bfd_target_coff_flavour
12458#endif
12459 )
12460 value += fixP->fx_where + fixP->fx_frag->fr_address;
12461#endif
12462#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12463 if (IS_ELF)
252b5132 12464 {
6539b54b 12465 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 12466
6539b54b 12467 if ((sym_seg == seg
2f66722d 12468 || (symbol_section_p (fixP->fx_addsy)
6539b54b 12469 && sym_seg != absolute_section))
af65af87 12470 && !generic_force_reloc (fixP))
2f66722d
AM
12471 {
12472 /* Yes, we add the values in twice. This is because
6539b54b
AM
12473 bfd_install_relocation subtracts them out again. I think
12474 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
12475 it. FIXME. */
12476 value += fixP->fx_where + fixP->fx_frag->fr_address;
12477 }
252b5132
RH
12478 }
12479#endif
12480#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
12481 /* For some reason, the PE format does not store a
12482 section address offset for a PC relative symbol. */
12483 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 12484 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
12485 value += md_pcrel_from (fixP);
12486#endif
12487 }
fbeb56a4 12488#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
12489 if (fixP->fx_addsy != NULL
12490 && S_IS_WEAK (fixP->fx_addsy)
12491 /* PR 16858: Do not modify weak function references. */
12492 && ! fixP->fx_pcrel)
fbeb56a4 12493 {
296a8689
NC
12494#if !defined (TE_PEP)
12495 /* For x86 PE weak function symbols are neither PC-relative
12496 nor do they set S_IS_FUNCTION. So the only reliable way
12497 to detect them is to check the flags of their containing
12498 section. */
12499 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
12500 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
12501 ;
12502 else
12503#endif
fbeb56a4
DK
12504 value -= S_GET_VALUE (fixP->fx_addsy);
12505 }
12506#endif
252b5132
RH
12507
12508 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 12509 and we must not disappoint it. */
252b5132 12510#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12511 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
12512 switch (fixP->fx_r_type)
12513 {
12514 case BFD_RELOC_386_PLT32:
3e73aa7c 12515 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
12516 /* Make the jump instruction point to the address of the operand.
12517 At runtime we merely add the offset to the actual PLT entry.
12518 NB: Subtract the offset size only for jump instructions. */
12519 if (fixP->fx_pcrel)
12520 value = -4;
47926f60 12521 break;
31312f95 12522
13ae64f3
JJ
12523 case BFD_RELOC_386_TLS_GD:
12524 case BFD_RELOC_386_TLS_LDM:
13ae64f3 12525 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
12526 case BFD_RELOC_386_TLS_IE:
12527 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 12528 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
12529 case BFD_RELOC_X86_64_TLSGD:
12530 case BFD_RELOC_X86_64_TLSLD:
12531 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 12532 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
12533 value = 0; /* Fully resolved at runtime. No addend. */
12534 /* Fallthrough */
12535 case BFD_RELOC_386_TLS_LE:
12536 case BFD_RELOC_386_TLS_LDO_32:
12537 case BFD_RELOC_386_TLS_LE_32:
12538 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 12539 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 12540 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 12541 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
12542 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12543 break;
12544
67a4f2b7
AO
12545 case BFD_RELOC_386_TLS_DESC_CALL:
12546 case BFD_RELOC_X86_64_TLSDESC_CALL:
12547 value = 0; /* Fully resolved at runtime. No addend. */
12548 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12549 fixP->fx_done = 0;
12550 return;
12551
47926f60
KH
12552 case BFD_RELOC_VTABLE_INHERIT:
12553 case BFD_RELOC_VTABLE_ENTRY:
12554 fixP->fx_done = 0;
94f592af 12555 return;
47926f60
KH
12556
12557 default:
12558 break;
12559 }
12560#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 12561 *valP = value;
f86103b7 12562#endif /* !defined (TE_Mach) */
3e73aa7c 12563
3e73aa7c 12564 /* Are we finished with this relocation now? */
c6682705 12565 if (fixP->fx_addsy == NULL)
3e73aa7c 12566 fixP->fx_done = 1;
fbeb56a4
DK
12567#if defined (OBJ_COFF) && defined (TE_PE)
12568 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
12569 {
12570 fixP->fx_done = 0;
12571 /* Remember value for tc_gen_reloc. */
12572 fixP->fx_addnumber = value;
12573 /* Clear out the frag for now. */
12574 value = 0;
12575 }
12576#endif
3e73aa7c
JH
12577 else if (use_rela_relocations)
12578 {
12579 fixP->fx_no_overflow = 1;
062cd5e7
AS
12580 /* Remember value for tc_gen_reloc. */
12581 fixP->fx_addnumber = value;
3e73aa7c
JH
12582 value = 0;
12583 }
f86103b7 12584
94f592af 12585 md_number_to_chars (p, value, fixP->fx_size);
252b5132 12586}
252b5132 12587\f
6d4af3c2 12588const char *
499ac353 12589md_atof (int type, char *litP, int *sizeP)
252b5132 12590{
499ac353
NC
12591 /* This outputs the LITTLENUMs in REVERSE order;
12592 in accord with the bigendian 386. */
12593 return ieee_md_atof (type, litP, sizeP, FALSE);
252b5132
RH
12594}
12595\f
2d545b82 12596static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 12597
252b5132 12598static char *
e3bb37b5 12599output_invalid (int c)
252b5132 12600{
3882b010 12601 if (ISPRINT (c))
f9f21a03
L
12602 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
12603 "'%c'", c);
252b5132 12604 else
f9f21a03 12605 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 12606 "(0x%x)", (unsigned char) c);
252b5132
RH
12607 return output_invalid_buf;
12608}
12609
8a6fb3f9
JB
12610/* Verify that @r can be used in the current context. */
12611
12612static bfd_boolean check_register (const reg_entry *r)
12613{
12614 if (allow_pseudo_reg)
12615 return TRUE;
12616
12617 if (operand_type_all_zero (&r->reg_type))
12618 return FALSE;
12619
12620 if ((r->reg_type.bitfield.dword
12621 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
12622 || r->reg_type.bitfield.class == RegCR
22e00a3f 12623 || r->reg_type.bitfield.class == RegDR)
8a6fb3f9
JB
12624 && !cpu_arch_flags.bitfield.cpui386)
12625 return FALSE;
12626
22e00a3f
JB
12627 if (r->reg_type.bitfield.class == RegTR
12628 && (flag_code == CODE_64BIT
12629 || !cpu_arch_flags.bitfield.cpui386
12630 || cpu_arch_isa_flags.bitfield.cpui586
12631 || cpu_arch_isa_flags.bitfield.cpui686))
12632 return FALSE;
12633
8a6fb3f9
JB
12634 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
12635 return FALSE;
12636
12637 if (!cpu_arch_flags.bitfield.cpuavx512f)
12638 {
12639 if (r->reg_type.bitfield.zmmword
12640 || r->reg_type.bitfield.class == RegMask)
12641 return FALSE;
12642
12643 if (!cpu_arch_flags.bitfield.cpuavx)
12644 {
12645 if (r->reg_type.bitfield.ymmword)
12646 return FALSE;
12647
12648 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
12649 return FALSE;
12650 }
12651 }
12652
260cd341
LC
12653 if (r->reg_type.bitfield.tmmword
12654 && (!cpu_arch_flags.bitfield.cpuamx_tile
12655 || flag_code != CODE_64BIT))
12656 return FALSE;
12657
8a6fb3f9
JB
12658 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
12659 return FALSE;
12660
12661 /* Don't allow fake index register unless allow_index_reg isn't 0. */
12662 if (!allow_index_reg && r->reg_num == RegIZ)
12663 return FALSE;
12664
12665 /* Upper 16 vector registers are only available with VREX in 64bit
12666 mode, and require EVEX encoding. */
12667 if (r->reg_flags & RegVRex)
12668 {
12669 if (!cpu_arch_flags.bitfield.cpuavx512f
12670 || flag_code != CODE_64BIT)
12671 return FALSE;
12672
da4977e0
JB
12673 if (i.vec_encoding == vex_encoding_default)
12674 i.vec_encoding = vex_encoding_evex;
12675 else if (i.vec_encoding != vex_encoding_evex)
12676 i.vec_encoding = vex_encoding_error;
8a6fb3f9
JB
12677 }
12678
12679 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
12680 && (!cpu_arch_flags.bitfield.cpulm || r->reg_type.bitfield.class != RegCR)
12681 && flag_code != CODE_64BIT)
12682 return FALSE;
12683
12684 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
12685 && !intel_syntax)
12686 return FALSE;
12687
12688 return TRUE;
12689}
12690
af6bdddf 12691/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
12692
12693static const reg_entry *
4d1bb795 12694parse_real_register (char *reg_string, char **end_op)
252b5132 12695{
af6bdddf
AM
12696 char *s = reg_string;
12697 char *p;
252b5132
RH
12698 char reg_name_given[MAX_REG_NAME_SIZE + 1];
12699 const reg_entry *r;
12700
12701 /* Skip possible REGISTER_PREFIX and possible whitespace. */
12702 if (*s == REGISTER_PREFIX)
12703 ++s;
12704
12705 if (is_space_char (*s))
12706 ++s;
12707
12708 p = reg_name_given;
af6bdddf 12709 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
12710 {
12711 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
12712 return (const reg_entry *) NULL;
12713 s++;
252b5132
RH
12714 }
12715
6588847e
DN
12716 /* For naked regs, make sure that we are not dealing with an identifier.
12717 This prevents confusing an identifier like `eax_var' with register
12718 `eax'. */
12719 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
12720 return (const reg_entry *) NULL;
12721
af6bdddf 12722 *end_op = s;
252b5132 12723
629310ab 12724 r = (const reg_entry *) str_hash_find (reg_hash, reg_name_given);
252b5132 12725
5f47d35b 12726 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 12727 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 12728 {
0e0eea78
JB
12729 if (!cpu_arch_flags.bitfield.cpu8087
12730 && !cpu_arch_flags.bitfield.cpu287
af32b722
JB
12731 && !cpu_arch_flags.bitfield.cpu387
12732 && !allow_pseudo_reg)
0e0eea78
JB
12733 return (const reg_entry *) NULL;
12734
5f47d35b
AM
12735 if (is_space_char (*s))
12736 ++s;
12737 if (*s == '(')
12738 {
af6bdddf 12739 ++s;
5f47d35b
AM
12740 if (is_space_char (*s))
12741 ++s;
12742 if (*s >= '0' && *s <= '7')
12743 {
db557034 12744 int fpr = *s - '0';
af6bdddf 12745 ++s;
5f47d35b
AM
12746 if (is_space_char (*s))
12747 ++s;
12748 if (*s == ')')
12749 {
12750 *end_op = s + 1;
629310ab 12751 r = (const reg_entry *) str_hash_find (reg_hash, "st(0)");
db557034
AM
12752 know (r);
12753 return r + fpr;
5f47d35b 12754 }
5f47d35b 12755 }
47926f60 12756 /* We have "%st(" then garbage. */
5f47d35b
AM
12757 return (const reg_entry *) NULL;
12758 }
12759 }
12760
8a6fb3f9 12761 return r && check_register (r) ? r : NULL;
252b5132 12762}
4d1bb795
JB
12763
12764/* REG_STRING starts *before* REGISTER_PREFIX. */
12765
12766static const reg_entry *
12767parse_register (char *reg_string, char **end_op)
12768{
12769 const reg_entry *r;
12770
12771 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
12772 r = parse_real_register (reg_string, end_op);
12773 else
12774 r = NULL;
12775 if (!r)
12776 {
12777 char *save = input_line_pointer;
12778 char c;
12779 symbolS *symbolP;
12780
12781 input_line_pointer = reg_string;
d02603dc 12782 c = get_symbol_name (&reg_string);
4d1bb795
JB
12783 symbolP = symbol_find (reg_string);
12784 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
12785 {
12786 const expressionS *e = symbol_get_value_expression (symbolP);
12787
0398aac5 12788 know (e->X_op == O_register);
4eed87de 12789 know (e->X_add_number >= 0
c3fe08fa 12790 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 12791 r = i386_regtab + e->X_add_number;
8a6fb3f9
JB
12792 if (!check_register (r))
12793 {
12794 as_bad (_("register '%s%s' cannot be used here"),
12795 register_prefix, r->reg_name);
12796 r = &bad_reg;
12797 }
4d1bb795
JB
12798 *end_op = input_line_pointer;
12799 }
12800 *input_line_pointer = c;
12801 input_line_pointer = save;
12802 }
12803 return r;
12804}
12805
12806int
12807i386_parse_name (char *name, expressionS *e, char *nextcharP)
12808{
12809 const reg_entry *r;
12810 char *end = input_line_pointer;
12811
12812 *end = *nextcharP;
12813 r = parse_register (name, &input_line_pointer);
12814 if (r && end <= input_line_pointer)
12815 {
12816 *nextcharP = *input_line_pointer;
12817 *input_line_pointer = 0;
8a6fb3f9
JB
12818 if (r != &bad_reg)
12819 {
12820 e->X_op = O_register;
12821 e->X_add_number = r - i386_regtab;
12822 }
12823 else
12824 e->X_op = O_illegal;
4d1bb795
JB
12825 return 1;
12826 }
12827 input_line_pointer = end;
12828 *end = 0;
ee86248c 12829 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
12830}
12831
12832void
12833md_operand (expressionS *e)
12834{
ee86248c
JB
12835 char *end;
12836 const reg_entry *r;
4d1bb795 12837
ee86248c
JB
12838 switch (*input_line_pointer)
12839 {
12840 case REGISTER_PREFIX:
12841 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
12842 if (r)
12843 {
12844 e->X_op = O_register;
12845 e->X_add_number = r - i386_regtab;
12846 input_line_pointer = end;
12847 }
ee86248c
JB
12848 break;
12849
12850 case '[':
9c2799c2 12851 gas_assert (intel_syntax);
ee86248c
JB
12852 end = input_line_pointer++;
12853 expression (e);
12854 if (*input_line_pointer == ']')
12855 {
12856 ++input_line_pointer;
12857 e->X_op_symbol = make_expr_symbol (e);
12858 e->X_add_symbol = NULL;
12859 e->X_add_number = 0;
12860 e->X_op = O_index;
12861 }
12862 else
12863 {
12864 e->X_op = O_absent;
12865 input_line_pointer = end;
12866 }
12867 break;
4d1bb795
JB
12868 }
12869}
12870
252b5132 12871\f
4cc782b5 12872#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 12873const char *md_shortopts = "kVQ:sqnO::";
252b5132 12874#else
b6f8c7c4 12875const char *md_shortopts = "qnO::";
252b5132 12876#endif
6e0b89ee 12877
3e73aa7c 12878#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
12879#define OPTION_64 (OPTION_MD_BASE + 1)
12880#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
12881#define OPTION_MARCH (OPTION_MD_BASE + 3)
12882#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
12883#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
12884#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
12885#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
12886#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 12887#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 12888#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 12889#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
12890#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
12891#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
12892#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 12893#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
12894#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
12895#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 12896#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 12897#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 12898#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 12899#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
12900#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
12901#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 12902#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 12903#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 12904#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
e379e5f3
L
12905#define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27)
12906#define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
12907#define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
76cf450b 12908#define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
ae531041
L
12909#define OPTION_MLFENCE_AFTER_LOAD (OPTION_MD_BASE + 31)
12910#define OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH (OPTION_MD_BASE + 32)
12911#define OPTION_MLFENCE_BEFORE_RET (OPTION_MD_BASE + 33)
b3b91714 12912
99ad8390
NC
12913struct option md_longopts[] =
12914{
3e73aa7c 12915 {"32", no_argument, NULL, OPTION_32},
321098a5 12916#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12917 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 12918 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
12919#endif
12920#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12921 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 12922 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 12923 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 12924#endif
b3b91714 12925 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
12926 {"march", required_argument, NULL, OPTION_MARCH},
12927 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
12928 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
12929 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
12930 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
12931 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 12932 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 12933 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 12934 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 12935 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 12936 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 12937 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
12938 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
12939 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
12940# if defined (TE_PE) || defined (TE_PEP)
12941 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
12942#endif
d1982f93 12943 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 12944 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 12945 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 12946 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
e379e5f3
L
12947 {"malign-branch-boundary", required_argument, NULL, OPTION_MALIGN_BRANCH_BOUNDARY},
12948 {"malign-branch-prefix-size", required_argument, NULL, OPTION_MALIGN_BRANCH_PREFIX_SIZE},
12949 {"malign-branch", required_argument, NULL, OPTION_MALIGN_BRANCH},
76cf450b 12950 {"mbranches-within-32B-boundaries", no_argument, NULL, OPTION_MBRANCHES_WITH_32B_BOUNDARIES},
ae531041
L
12951 {"mlfence-after-load", required_argument, NULL, OPTION_MLFENCE_AFTER_LOAD},
12952 {"mlfence-before-indirect-branch", required_argument, NULL,
12953 OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH},
12954 {"mlfence-before-ret", required_argument, NULL, OPTION_MLFENCE_BEFORE_RET},
5db04b09
L
12955 {"mamd64", no_argument, NULL, OPTION_MAMD64},
12956 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
12957 {NULL, no_argument, NULL, 0}
12958};
12959size_t md_longopts_size = sizeof (md_longopts);
12960
12961int
17b9d67d 12962md_parse_option (int c, const char *arg)
252b5132 12963{
91d6fa6a 12964 unsigned int j;
e379e5f3 12965 char *arch, *next, *saved, *type;
9103f4f4 12966
252b5132
RH
12967 switch (c)
12968 {
12b55ccc
L
12969 case 'n':
12970 optimize_align_code = 0;
12971 break;
12972
a38cf1db
AM
12973 case 'q':
12974 quiet_warnings = 1;
252b5132
RH
12975 break;
12976
12977#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
12978 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
12979 should be emitted or not. FIXME: Not implemented. */
12980 case 'Q':
d4693039
JB
12981 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
12982 return 0;
252b5132
RH
12983 break;
12984
12985 /* -V: SVR4 argument to print version ID. */
12986 case 'V':
12987 print_version_id ();
12988 break;
12989
a38cf1db
AM
12990 /* -k: Ignore for FreeBSD compatibility. */
12991 case 'k':
252b5132 12992 break;
4cc782b5
ILT
12993
12994 case 's':
12995 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 12996 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 12997 break;
8dcea932
L
12998
12999 case OPTION_MSHARED:
13000 shared = 1;
13001 break;
b4a3a7b4
L
13002
13003 case OPTION_X86_USED_NOTE:
13004 if (strcasecmp (arg, "yes") == 0)
13005 x86_used_note = 1;
13006 else if (strcasecmp (arg, "no") == 0)
13007 x86_used_note = 0;
13008 else
13009 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
13010 break;
13011
13012
99ad8390 13013#endif
321098a5 13014#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 13015 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
13016 case OPTION_64:
13017 {
13018 const char **list, **l;
13019
3e73aa7c
JH
13020 list = bfd_target_list ();
13021 for (l = list; *l != NULL; l++)
08dedd66 13022 if (startswith (*l, "elf64-x86-64")
99ad8390
NC
13023 || strcmp (*l, "coff-x86-64") == 0
13024 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
13025 || strcmp (*l, "pei-x86-64") == 0
13026 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
13027 {
13028 default_arch = "x86_64";
13029 break;
13030 }
3e73aa7c 13031 if (*l == NULL)
2b5d6a91 13032 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
13033 free (list);
13034 }
13035 break;
13036#endif
252b5132 13037
351f65ca 13038#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 13039 case OPTION_X32:
351f65ca
L
13040 if (IS_ELF)
13041 {
13042 const char **list, **l;
13043
13044 list = bfd_target_list ();
13045 for (l = list; *l != NULL; l++)
08dedd66 13046 if (startswith (*l, "elf32-x86-64"))
351f65ca
L
13047 {
13048 default_arch = "x86_64:32";
13049 break;
13050 }
13051 if (*l == NULL)
2b5d6a91 13052 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
13053 free (list);
13054 }
13055 else
13056 as_fatal (_("32bit x86_64 is only supported for ELF"));
13057 break;
13058#endif
13059
6e0b89ee
AM
13060 case OPTION_32:
13061 default_arch = "i386";
13062 break;
13063
b3b91714
AM
13064 case OPTION_DIVIDE:
13065#ifdef SVR4_COMMENT_CHARS
13066 {
13067 char *n, *t;
13068 const char *s;
13069
add39d23 13070 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
13071 t = n;
13072 for (s = i386_comment_chars; *s != '\0'; s++)
13073 if (*s != '/')
13074 *t++ = *s;
13075 *t = '\0';
13076 i386_comment_chars = n;
13077 }
13078#endif
13079 break;
13080
9103f4f4 13081 case OPTION_MARCH:
293f5f65
L
13082 saved = xstrdup (arg);
13083 arch = saved;
13084 /* Allow -march=+nosse. */
13085 if (*arch == '+')
13086 arch++;
6305a203 13087 do
9103f4f4 13088 {
6305a203 13089 if (*arch == '.')
2b5d6a91 13090 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
13091 next = strchr (arch, '+');
13092 if (next)
13093 *next++ = '\0';
91d6fa6a 13094 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 13095 {
91d6fa6a 13096 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 13097 {
6305a203 13098 /* Processor. */
1ded5609
JB
13099 if (! cpu_arch[j].flags.bitfield.cpui386)
13100 continue;
13101
91d6fa6a 13102 cpu_arch_name = cpu_arch[j].name;
6305a203 13103 cpu_sub_arch_name = NULL;
91d6fa6a
NC
13104 cpu_arch_flags = cpu_arch[j].flags;
13105 cpu_arch_isa = cpu_arch[j].type;
13106 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
13107 if (!cpu_arch_tune_set)
13108 {
13109 cpu_arch_tune = cpu_arch_isa;
13110 cpu_arch_tune_flags = cpu_arch_isa_flags;
13111 }
13112 break;
13113 }
91d6fa6a
NC
13114 else if (*cpu_arch [j].name == '.'
13115 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 13116 {
33eaf5de 13117 /* ISA extension. */
6305a203 13118 i386_cpu_flags flags;
309d3373 13119
293f5f65
L
13120 flags = cpu_flags_or (cpu_arch_flags,
13121 cpu_arch[j].flags);
81486035 13122
5b64d091 13123 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
13124 {
13125 if (cpu_sub_arch_name)
13126 {
13127 char *name = cpu_sub_arch_name;
13128 cpu_sub_arch_name = concat (name,
91d6fa6a 13129 cpu_arch[j].name,
1bf57e9f 13130 (const char *) NULL);
6305a203
L
13131 free (name);
13132 }
13133 else
91d6fa6a 13134 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 13135 cpu_arch_flags = flags;
a586129e 13136 cpu_arch_isa_flags = flags;
6305a203 13137 }
0089dace
L
13138 else
13139 cpu_arch_isa_flags
13140 = cpu_flags_or (cpu_arch_isa_flags,
13141 cpu_arch[j].flags);
6305a203 13142 break;
ccc9c027 13143 }
9103f4f4 13144 }
6305a203 13145
293f5f65
L
13146 if (j >= ARRAY_SIZE (cpu_arch))
13147 {
33eaf5de 13148 /* Disable an ISA extension. */
293f5f65
L
13149 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13150 if (strcmp (arch, cpu_noarch [j].name) == 0)
13151 {
13152 i386_cpu_flags flags;
13153
13154 flags = cpu_flags_and_not (cpu_arch_flags,
13155 cpu_noarch[j].flags);
13156 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
13157 {
13158 if (cpu_sub_arch_name)
13159 {
13160 char *name = cpu_sub_arch_name;
13161 cpu_sub_arch_name = concat (arch,
13162 (const char *) NULL);
13163 free (name);
13164 }
13165 else
13166 cpu_sub_arch_name = xstrdup (arch);
13167 cpu_arch_flags = flags;
13168 cpu_arch_isa_flags = flags;
13169 }
13170 break;
13171 }
13172
13173 if (j >= ARRAY_SIZE (cpu_noarch))
13174 j = ARRAY_SIZE (cpu_arch);
13175 }
13176
91d6fa6a 13177 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 13178 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
13179
13180 arch = next;
9103f4f4 13181 }
293f5f65
L
13182 while (next != NULL);
13183 free (saved);
9103f4f4
L
13184 break;
13185
13186 case OPTION_MTUNE:
13187 if (*arg == '.')
2b5d6a91 13188 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 13189 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 13190 {
91d6fa6a 13191 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 13192 {
ccc9c027 13193 cpu_arch_tune_set = 1;
91d6fa6a
NC
13194 cpu_arch_tune = cpu_arch [j].type;
13195 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
13196 break;
13197 }
13198 }
91d6fa6a 13199 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 13200 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
13201 break;
13202
1efbbeb4
L
13203 case OPTION_MMNEMONIC:
13204 if (strcasecmp (arg, "att") == 0)
13205 intel_mnemonic = 0;
13206 else if (strcasecmp (arg, "intel") == 0)
13207 intel_mnemonic = 1;
13208 else
2b5d6a91 13209 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
13210 break;
13211
13212 case OPTION_MSYNTAX:
13213 if (strcasecmp (arg, "att") == 0)
13214 intel_syntax = 0;
13215 else if (strcasecmp (arg, "intel") == 0)
13216 intel_syntax = 1;
13217 else
2b5d6a91 13218 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
13219 break;
13220
13221 case OPTION_MINDEX_REG:
13222 allow_index_reg = 1;
13223 break;
13224
13225 case OPTION_MNAKED_REG:
13226 allow_naked_reg = 1;
13227 break;
13228
c0f3af97
L
13229 case OPTION_MSSE2AVX:
13230 sse2avx = 1;
13231 break;
13232
daf50ae7
L
13233 case OPTION_MSSE_CHECK:
13234 if (strcasecmp (arg, "error") == 0)
7bab8ab5 13235 sse_check = check_error;
daf50ae7 13236 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 13237 sse_check = check_warning;
daf50ae7 13238 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 13239 sse_check = check_none;
daf50ae7 13240 else
2b5d6a91 13241 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
13242 break;
13243
7bab8ab5
JB
13244 case OPTION_MOPERAND_CHECK:
13245 if (strcasecmp (arg, "error") == 0)
13246 operand_check = check_error;
13247 else if (strcasecmp (arg, "warning") == 0)
13248 operand_check = check_warning;
13249 else if (strcasecmp (arg, "none") == 0)
13250 operand_check = check_none;
13251 else
13252 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
13253 break;
13254
539f890d
L
13255 case OPTION_MAVXSCALAR:
13256 if (strcasecmp (arg, "128") == 0)
13257 avxscalar = vex128;
13258 else if (strcasecmp (arg, "256") == 0)
13259 avxscalar = vex256;
13260 else
2b5d6a91 13261 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
13262 break;
13263
03751133
L
13264 case OPTION_MVEXWIG:
13265 if (strcmp (arg, "0") == 0)
40c9c8de 13266 vexwig = vexw0;
03751133 13267 else if (strcmp (arg, "1") == 0)
40c9c8de 13268 vexwig = vexw1;
03751133
L
13269 else
13270 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
13271 break;
13272
7e8b059b
L
13273 case OPTION_MADD_BND_PREFIX:
13274 add_bnd_prefix = 1;
13275 break;
13276
43234a1e
L
13277 case OPTION_MEVEXLIG:
13278 if (strcmp (arg, "128") == 0)
13279 evexlig = evexl128;
13280 else if (strcmp (arg, "256") == 0)
13281 evexlig = evexl256;
13282 else if (strcmp (arg, "512") == 0)
13283 evexlig = evexl512;
13284 else
13285 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
13286 break;
13287
d3d3c6db
IT
13288 case OPTION_MEVEXRCIG:
13289 if (strcmp (arg, "rne") == 0)
13290 evexrcig = rne;
13291 else if (strcmp (arg, "rd") == 0)
13292 evexrcig = rd;
13293 else if (strcmp (arg, "ru") == 0)
13294 evexrcig = ru;
13295 else if (strcmp (arg, "rz") == 0)
13296 evexrcig = rz;
13297 else
13298 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
13299 break;
13300
43234a1e
L
13301 case OPTION_MEVEXWIG:
13302 if (strcmp (arg, "0") == 0)
13303 evexwig = evexw0;
13304 else if (strcmp (arg, "1") == 0)
13305 evexwig = evexw1;
13306 else
13307 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
13308 break;
13309
167ad85b
TG
13310# if defined (TE_PE) || defined (TE_PEP)
13311 case OPTION_MBIG_OBJ:
13312 use_big_obj = 1;
13313 break;
13314#endif
13315
d1982f93 13316 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
13317 if (strcasecmp (arg, "yes") == 0)
13318 omit_lock_prefix = 1;
13319 else if (strcasecmp (arg, "no") == 0)
13320 omit_lock_prefix = 0;
13321 else
13322 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
13323 break;
13324
e4e00185
AS
13325 case OPTION_MFENCE_AS_LOCK_ADD:
13326 if (strcasecmp (arg, "yes") == 0)
13327 avoid_fence = 1;
13328 else if (strcasecmp (arg, "no") == 0)
13329 avoid_fence = 0;
13330 else
13331 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
13332 break;
13333
ae531041
L
13334 case OPTION_MLFENCE_AFTER_LOAD:
13335 if (strcasecmp (arg, "yes") == 0)
13336 lfence_after_load = 1;
13337 else if (strcasecmp (arg, "no") == 0)
13338 lfence_after_load = 0;
13339 else
13340 as_fatal (_("invalid -mlfence-after-load= option: `%s'"), arg);
13341 break;
13342
13343 case OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH:
13344 if (strcasecmp (arg, "all") == 0)
a09f656b 13345 {
13346 lfence_before_indirect_branch = lfence_branch_all;
13347 if (lfence_before_ret == lfence_before_ret_none)
13348 lfence_before_ret = lfence_before_ret_shl;
13349 }
ae531041
L
13350 else if (strcasecmp (arg, "memory") == 0)
13351 lfence_before_indirect_branch = lfence_branch_memory;
13352 else if (strcasecmp (arg, "register") == 0)
13353 lfence_before_indirect_branch = lfence_branch_register;
13354 else if (strcasecmp (arg, "none") == 0)
13355 lfence_before_indirect_branch = lfence_branch_none;
13356 else
13357 as_fatal (_("invalid -mlfence-before-indirect-branch= option: `%s'"),
13358 arg);
13359 break;
13360
13361 case OPTION_MLFENCE_BEFORE_RET:
13362 if (strcasecmp (arg, "or") == 0)
13363 lfence_before_ret = lfence_before_ret_or;
13364 else if (strcasecmp (arg, "not") == 0)
13365 lfence_before_ret = lfence_before_ret_not;
a09f656b 13366 else if (strcasecmp (arg, "shl") == 0 || strcasecmp (arg, "yes") == 0)
13367 lfence_before_ret = lfence_before_ret_shl;
ae531041
L
13368 else if (strcasecmp (arg, "none") == 0)
13369 lfence_before_ret = lfence_before_ret_none;
13370 else
13371 as_fatal (_("invalid -mlfence-before-ret= option: `%s'"),
13372 arg);
13373 break;
13374
0cb4071e
L
13375 case OPTION_MRELAX_RELOCATIONS:
13376 if (strcasecmp (arg, "yes") == 0)
13377 generate_relax_relocations = 1;
13378 else if (strcasecmp (arg, "no") == 0)
13379 generate_relax_relocations = 0;
13380 else
13381 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
13382 break;
13383
e379e5f3
L
13384 case OPTION_MALIGN_BRANCH_BOUNDARY:
13385 {
13386 char *end;
13387 long int align = strtoul (arg, &end, 0);
13388 if (*end == '\0')
13389 {
13390 if (align == 0)
13391 {
13392 align_branch_power = 0;
13393 break;
13394 }
13395 else if (align >= 16)
13396 {
13397 int align_power;
13398 for (align_power = 0;
13399 (align & 1) == 0;
13400 align >>= 1, align_power++)
13401 continue;
13402 /* Limit alignment power to 31. */
13403 if (align == 1 && align_power < 32)
13404 {
13405 align_branch_power = align_power;
13406 break;
13407 }
13408 }
13409 }
13410 as_fatal (_("invalid -malign-branch-boundary= value: %s"), arg);
13411 }
13412 break;
13413
13414 case OPTION_MALIGN_BRANCH_PREFIX_SIZE:
13415 {
13416 char *end;
13417 int align = strtoul (arg, &end, 0);
13418 /* Some processors only support 5 prefixes. */
13419 if (*end == '\0' && align >= 0 && align < 6)
13420 {
13421 align_branch_prefix_size = align;
13422 break;
13423 }
13424 as_fatal (_("invalid -malign-branch-prefix-size= value: %s"),
13425 arg);
13426 }
13427 break;
13428
13429 case OPTION_MALIGN_BRANCH:
13430 align_branch = 0;
13431 saved = xstrdup (arg);
13432 type = saved;
13433 do
13434 {
13435 next = strchr (type, '+');
13436 if (next)
13437 *next++ = '\0';
13438 if (strcasecmp (type, "jcc") == 0)
13439 align_branch |= align_branch_jcc_bit;
13440 else if (strcasecmp (type, "fused") == 0)
13441 align_branch |= align_branch_fused_bit;
13442 else if (strcasecmp (type, "jmp") == 0)
13443 align_branch |= align_branch_jmp_bit;
13444 else if (strcasecmp (type, "call") == 0)
13445 align_branch |= align_branch_call_bit;
13446 else if (strcasecmp (type, "ret") == 0)
13447 align_branch |= align_branch_ret_bit;
13448 else if (strcasecmp (type, "indirect") == 0)
13449 align_branch |= align_branch_indirect_bit;
13450 else
13451 as_fatal (_("invalid -malign-branch= option: `%s'"), arg);
13452 type = next;
13453 }
13454 while (next != NULL);
13455 free (saved);
13456 break;
13457
76cf450b
L
13458 case OPTION_MBRANCHES_WITH_32B_BOUNDARIES:
13459 align_branch_power = 5;
13460 align_branch_prefix_size = 5;
13461 align_branch = (align_branch_jcc_bit
13462 | align_branch_fused_bit
13463 | align_branch_jmp_bit);
13464 break;
13465
5db04b09 13466 case OPTION_MAMD64:
4b5aaf5f 13467 isa64 = amd64;
5db04b09
L
13468 break;
13469
13470 case OPTION_MINTEL64:
4b5aaf5f 13471 isa64 = intel64;
5db04b09
L
13472 break;
13473
b6f8c7c4
L
13474 case 'O':
13475 if (arg == NULL)
13476 {
13477 optimize = 1;
13478 /* Turn off -Os. */
13479 optimize_for_space = 0;
13480 }
13481 else if (*arg == 's')
13482 {
13483 optimize_for_space = 1;
13484 /* Turn on all encoding optimizations. */
41fd2579 13485 optimize = INT_MAX;
b6f8c7c4
L
13486 }
13487 else
13488 {
13489 optimize = atoi (arg);
13490 /* Turn off -Os. */
13491 optimize_for_space = 0;
13492 }
13493 break;
13494
252b5132
RH
13495 default:
13496 return 0;
13497 }
13498 return 1;
13499}
13500
8a2c8fef
L
13501#define MESSAGE_TEMPLATE \
13502" "
13503
293f5f65
L
13504static char *
13505output_message (FILE *stream, char *p, char *message, char *start,
13506 int *left_p, const char *name, int len)
13507{
13508 int size = sizeof (MESSAGE_TEMPLATE);
13509 int left = *left_p;
13510
13511 /* Reserve 2 spaces for ", " or ",\0" */
13512 left -= len + 2;
13513
13514 /* Check if there is any room. */
13515 if (left >= 0)
13516 {
13517 if (p != start)
13518 {
13519 *p++ = ',';
13520 *p++ = ' ';
13521 }
13522 p = mempcpy (p, name, len);
13523 }
13524 else
13525 {
13526 /* Output the current message now and start a new one. */
13527 *p++ = ',';
13528 *p = '\0';
13529 fprintf (stream, "%s\n", message);
13530 p = start;
13531 left = size - (start - message) - len - 2;
13532
13533 gas_assert (left >= 0);
13534
13535 p = mempcpy (p, name, len);
13536 }
13537
13538 *left_p = left;
13539 return p;
13540}
13541
8a2c8fef 13542static void
1ded5609 13543show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
13544{
13545 static char message[] = MESSAGE_TEMPLATE;
13546 char *start = message + 27;
13547 char *p;
13548 int size = sizeof (MESSAGE_TEMPLATE);
13549 int left;
13550 const char *name;
13551 int len;
13552 unsigned int j;
13553
13554 p = start;
13555 left = size - (start - message);
13556 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
13557 {
13558 /* Should it be skipped? */
13559 if (cpu_arch [j].skip)
13560 continue;
13561
13562 name = cpu_arch [j].name;
13563 len = cpu_arch [j].len;
13564 if (*name == '.')
13565 {
13566 /* It is an extension. Skip if we aren't asked to show it. */
13567 if (ext)
13568 {
13569 name++;
13570 len--;
13571 }
13572 else
13573 continue;
13574 }
13575 else if (ext)
13576 {
13577 /* It is an processor. Skip if we show only extension. */
13578 continue;
13579 }
1ded5609
JB
13580 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
13581 {
13582 /* It is an impossible processor - skip. */
13583 continue;
13584 }
8a2c8fef 13585
293f5f65 13586 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
13587 }
13588
293f5f65
L
13589 /* Display disabled extensions. */
13590 if (ext)
13591 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13592 {
13593 name = cpu_noarch [j].name;
13594 len = cpu_noarch [j].len;
13595 p = output_message (stream, p, message, start, &left, name,
13596 len);
13597 }
13598
8a2c8fef
L
13599 *p = '\0';
13600 fprintf (stream, "%s\n", message);
13601}
13602
252b5132 13603void
8a2c8fef 13604md_show_usage (FILE *stream)
252b5132 13605{
4cc782b5
ILT
13606#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13607 fprintf (stream, _("\
d4693039 13608 -Qy, -Qn ignored\n\
a38cf1db 13609 -V print assembler version number\n\
b3b91714
AM
13610 -k ignored\n"));
13611#endif
13612 fprintf (stream, _("\
12b55ccc 13613 -n Do not optimize code alignment\n\
b3b91714
AM
13614 -q quieten some warnings\n"));
13615#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13616 fprintf (stream, _("\
a38cf1db 13617 -s ignored\n"));
b3b91714 13618#endif
d7f449c0
L
13619#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
13620 || defined (TE_PE) || defined (TE_PEP))
751d281c 13621 fprintf (stream, _("\
570561f7 13622 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 13623#endif
b3b91714
AM
13624#ifdef SVR4_COMMENT_CHARS
13625 fprintf (stream, _("\
13626 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
13627#else
13628 fprintf (stream, _("\
b3b91714 13629 --divide ignored\n"));
4cc782b5 13630#endif
9103f4f4 13631 fprintf (stream, _("\
6305a203 13632 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 13633 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 13634 show_arch (stream, 0, 1);
8a2c8fef
L
13635 fprintf (stream, _("\
13636 EXTENSION is combination of:\n"));
1ded5609 13637 show_arch (stream, 1, 0);
6305a203 13638 fprintf (stream, _("\
8a2c8fef 13639 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 13640 show_arch (stream, 0, 0);
ba104c83 13641 fprintf (stream, _("\
c0f3af97
L
13642 -msse2avx encode SSE instructions with VEX prefix\n"));
13643 fprintf (stream, _("\
7c5c05ef 13644 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
13645 check SSE instructions\n"));
13646 fprintf (stream, _("\
7c5c05ef 13647 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
13648 check operand combinations for validity\n"));
13649 fprintf (stream, _("\
7c5c05ef
L
13650 -mavxscalar=[128|256] (default: 128)\n\
13651 encode scalar AVX instructions with specific vector\n\
539f890d
L
13652 length\n"));
13653 fprintf (stream, _("\
03751133
L
13654 -mvexwig=[0|1] (default: 0)\n\
13655 encode VEX instructions with specific VEX.W value\n\
13656 for VEX.W bit ignored instructions\n"));
13657 fprintf (stream, _("\
7c5c05ef
L
13658 -mevexlig=[128|256|512] (default: 128)\n\
13659 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
13660 length\n"));
13661 fprintf (stream, _("\
7c5c05ef
L
13662 -mevexwig=[0|1] (default: 0)\n\
13663 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
13664 for EVEX.W bit ignored instructions\n"));
13665 fprintf (stream, _("\
7c5c05ef 13666 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
13667 encode EVEX instructions with specific EVEX.RC value\n\
13668 for SAE-only ignored instructions\n"));
13669 fprintf (stream, _("\
7c5c05ef
L
13670 -mmnemonic=[att|intel] "));
13671 if (SYSV386_COMPAT)
13672 fprintf (stream, _("(default: att)\n"));
13673 else
13674 fprintf (stream, _("(default: intel)\n"));
13675 fprintf (stream, _("\
13676 use AT&T/Intel mnemonic\n"));
ba104c83 13677 fprintf (stream, _("\
7c5c05ef
L
13678 -msyntax=[att|intel] (default: att)\n\
13679 use AT&T/Intel syntax\n"));
ba104c83
L
13680 fprintf (stream, _("\
13681 -mindex-reg support pseudo index registers\n"));
13682 fprintf (stream, _("\
13683 -mnaked-reg don't require `%%' prefix for registers\n"));
13684 fprintf (stream, _("\
7e8b059b 13685 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 13686#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
13687 fprintf (stream, _("\
13688 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
13689 fprintf (stream, _("\
13690 -mx86-used-note=[no|yes] "));
13691 if (DEFAULT_X86_USED_NOTE)
13692 fprintf (stream, _("(default: yes)\n"));
13693 else
13694 fprintf (stream, _("(default: no)\n"));
13695 fprintf (stream, _("\
13696 generate x86 used ISA and feature properties\n"));
13697#endif
13698#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
13699 fprintf (stream, _("\
13700 -mbig-obj generate big object files\n"));
13701#endif
d022bddd 13702 fprintf (stream, _("\
7c5c05ef 13703 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 13704 strip all lock prefixes\n"));
5db04b09 13705 fprintf (stream, _("\
7c5c05ef 13706 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
13707 encode lfence, mfence and sfence as\n\
13708 lock addl $0x0, (%%{re}sp)\n"));
13709 fprintf (stream, _("\
7c5c05ef
L
13710 -mrelax-relocations=[no|yes] "));
13711 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
13712 fprintf (stream, _("(default: yes)\n"));
13713 else
13714 fprintf (stream, _("(default: no)\n"));
13715 fprintf (stream, _("\
0cb4071e
L
13716 generate relax relocations\n"));
13717 fprintf (stream, _("\
e379e5f3
L
13718 -malign-branch-boundary=NUM (default: 0)\n\
13719 align branches within NUM byte boundary\n"));
13720 fprintf (stream, _("\
13721 -malign-branch=TYPE[+TYPE...] (default: jcc+fused+jmp)\n\
13722 TYPE is combination of jcc, fused, jmp, call, ret,\n\
13723 indirect\n\
13724 specify types of branches to align\n"));
13725 fprintf (stream, _("\
13726 -malign-branch-prefix-size=NUM (default: 5)\n\
13727 align branches with NUM prefixes per instruction\n"));
13728 fprintf (stream, _("\
76cf450b
L
13729 -mbranches-within-32B-boundaries\n\
13730 align branches within 32 byte boundary\n"));
13731 fprintf (stream, _("\
ae531041
L
13732 -mlfence-after-load=[no|yes] (default: no)\n\
13733 generate lfence after load\n"));
13734 fprintf (stream, _("\
13735 -mlfence-before-indirect-branch=[none|all|register|memory] (default: none)\n\
13736 generate lfence before indirect near branch\n"));
13737 fprintf (stream, _("\
a09f656b 13738 -mlfence-before-ret=[none|or|not|shl|yes] (default: none)\n\
ae531041
L
13739 generate lfence before ret\n"));
13740 fprintf (stream, _("\
7c5c05ef 13741 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
13742 fprintf (stream, _("\
13743 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
13744}
13745
3e73aa7c 13746#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 13747 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 13748 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
13749
13750/* Pick the target format to use. */
13751
47926f60 13752const char *
e3bb37b5 13753i386_target_format (void)
252b5132 13754{
351f65ca
L
13755 if (!strncmp (default_arch, "x86_64", 6))
13756 {
13757 update_code_flag (CODE_64BIT, 1);
13758 if (default_arch[6] == '\0')
7f56bc95 13759 x86_elf_abi = X86_64_ABI;
351f65ca 13760 else
7f56bc95 13761 x86_elf_abi = X86_64_X32_ABI;
351f65ca 13762 }
3e73aa7c 13763 else if (!strcmp (default_arch, "i386"))
78f12dd3 13764 update_code_flag (CODE_32BIT, 1);
5197d474
L
13765 else if (!strcmp (default_arch, "iamcu"))
13766 {
13767 update_code_flag (CODE_32BIT, 1);
13768 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
13769 {
13770 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
13771 cpu_arch_name = "iamcu";
13772 cpu_sub_arch_name = NULL;
13773 cpu_arch_flags = iamcu_flags;
13774 cpu_arch_isa = PROCESSOR_IAMCU;
13775 cpu_arch_isa_flags = iamcu_flags;
13776 if (!cpu_arch_tune_set)
13777 {
13778 cpu_arch_tune = cpu_arch_isa;
13779 cpu_arch_tune_flags = cpu_arch_isa_flags;
13780 }
13781 }
8d471ec1 13782 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
13783 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
13784 cpu_arch_name);
13785 }
3e73aa7c 13786 else
2b5d6a91 13787 as_fatal (_("unknown architecture"));
89507696
JB
13788
13789 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
13790 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13791 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
13792 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13793
252b5132
RH
13794 switch (OUTPUT_FLAVOR)
13795 {
9384f2ff 13796#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 13797 case bfd_target_aout_flavour:
47926f60 13798 return AOUT_TARGET_FORMAT;
4c63da97 13799#endif
9384f2ff
AM
13800#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
13801# if defined (TE_PE) || defined (TE_PEP)
13802 case bfd_target_coff_flavour:
167ad85b
TG
13803 if (flag_code == CODE_64BIT)
13804 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
13805 else
251dae91 13806 return use_big_obj ? "pe-bigobj-i386" : "pe-i386";
9384f2ff 13807# elif defined (TE_GO32)
0561d57c
JK
13808 case bfd_target_coff_flavour:
13809 return "coff-go32";
9384f2ff 13810# else
252b5132
RH
13811 case bfd_target_coff_flavour:
13812 return "coff-i386";
9384f2ff 13813# endif
4c63da97 13814#endif
3e73aa7c 13815#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 13816 case bfd_target_elf_flavour:
3e73aa7c 13817 {
351f65ca
L
13818 const char *format;
13819
13820 switch (x86_elf_abi)
4fa24527 13821 {
351f65ca
L
13822 default:
13823 format = ELF_TARGET_FORMAT;
e379e5f3
L
13824#ifndef TE_SOLARIS
13825 tls_get_addr = "___tls_get_addr";
13826#endif
351f65ca 13827 break;
7f56bc95 13828 case X86_64_ABI:
351f65ca 13829 use_rela_relocations = 1;
4fa24527 13830 object_64bit = 1;
e379e5f3
L
13831#ifndef TE_SOLARIS
13832 tls_get_addr = "__tls_get_addr";
13833#endif
351f65ca
L
13834 format = ELF_TARGET_FORMAT64;
13835 break;
7f56bc95 13836 case X86_64_X32_ABI:
4fa24527 13837 use_rela_relocations = 1;
351f65ca 13838 object_64bit = 1;
e379e5f3
L
13839#ifndef TE_SOLARIS
13840 tls_get_addr = "__tls_get_addr";
13841#endif
862be3fb 13842 disallow_64bit_reloc = 1;
351f65ca
L
13843 format = ELF_TARGET_FORMAT32;
13844 break;
4fa24527 13845 }
3632d14b 13846 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 13847 {
7f56bc95 13848 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
13849 as_fatal (_("Intel L1OM is 64bit only"));
13850 return ELF_TARGET_L1OM_FORMAT;
13851 }
b49f93f6 13852 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
13853 {
13854 if (x86_elf_abi != X86_64_ABI)
13855 as_fatal (_("Intel K1OM is 64bit only"));
13856 return ELF_TARGET_K1OM_FORMAT;
13857 }
81486035
L
13858 else if (cpu_arch_isa == PROCESSOR_IAMCU)
13859 {
13860 if (x86_elf_abi != I386_ABI)
13861 as_fatal (_("Intel MCU is 32bit only"));
13862 return ELF_TARGET_IAMCU_FORMAT;
13863 }
8a9036a4 13864 else
351f65ca 13865 return format;
3e73aa7c 13866 }
e57f8c65
TG
13867#endif
13868#if defined (OBJ_MACH_O)
13869 case bfd_target_mach_o_flavour:
d382c579
TG
13870 if (flag_code == CODE_64BIT)
13871 {
13872 use_rela_relocations = 1;
13873 object_64bit = 1;
13874 return "mach-o-x86-64";
13875 }
13876 else
13877 return "mach-o-i386";
4c63da97 13878#endif
252b5132
RH
13879 default:
13880 abort ();
13881 return NULL;
13882 }
13883}
13884
47926f60 13885#endif /* OBJ_MAYBE_ more than one */
252b5132 13886\f
252b5132 13887symbolS *
7016a5d5 13888md_undefined_symbol (char *name)
252b5132 13889{
18dc2407
ILT
13890 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
13891 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
13892 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
13893 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
13894 {
13895 if (!GOT_symbol)
13896 {
13897 if (symbol_find (name))
13898 as_bad (_("GOT already in symbol table"));
13899 GOT_symbol = symbol_new (name, undefined_section,
e01e1cee 13900 &zero_address_frag, 0);
24eab124
AM
13901 };
13902 return GOT_symbol;
13903 }
252b5132
RH
13904 return 0;
13905}
13906
13907/* Round up a section size to the appropriate boundary. */
47926f60 13908
252b5132 13909valueT
7016a5d5 13910md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 13911{
4c63da97
AM
13912#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
13913 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
13914 {
13915 /* For a.out, force the section size to be aligned. If we don't do
13916 this, BFD will align it for us, but it will not write out the
13917 final bytes of the section. This may be a bug in BFD, but it is
13918 easier to fix it here since that is how the other a.out targets
13919 work. */
13920 int align;
13921
fd361982 13922 align = bfd_section_alignment (segment);
8d3842cd 13923 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 13924 }
252b5132
RH
13925#endif
13926
13927 return size;
13928}
13929
13930/* On the i386, PC-relative offsets are relative to the start of the
13931 next instruction. That is, the address of the offset, plus its
13932 size, since the offset is always the last part of the insn. */
13933
13934long
e3bb37b5 13935md_pcrel_from (fixS *fixP)
252b5132
RH
13936{
13937 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
13938}
13939
13940#ifndef I386COFF
13941
13942static void
e3bb37b5 13943s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 13944{
29b0f896 13945 int temp;
252b5132 13946
8a75718c
JB
13947#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13948 if (IS_ELF)
13949 obj_elf_section_change_hook ();
13950#endif
252b5132
RH
13951 temp = get_absolute_expression ();
13952 subseg_set (bss_section, (subsegT) temp);
13953 demand_empty_rest_of_line ();
13954}
13955
13956#endif
13957
e379e5f3
L
13958/* Remember constant directive. */
13959
13960void
13961i386_cons_align (int ignore ATTRIBUTE_UNUSED)
13962{
13963 if (last_insn.kind != last_insn_directive
13964 && (bfd_section_flags (now_seg) & SEC_CODE))
13965 {
13966 last_insn.seg = now_seg;
13967 last_insn.kind = last_insn_directive;
13968 last_insn.name = "constant directive";
13969 last_insn.file = as_where (&last_insn.line);
ae531041
L
13970 if (lfence_before_ret != lfence_before_ret_none)
13971 {
13972 if (lfence_before_indirect_branch != lfence_branch_none)
13973 as_warn (_("constant directive skips -mlfence-before-ret "
13974 "and -mlfence-before-indirect-branch"));
13975 else
13976 as_warn (_("constant directive skips -mlfence-before-ret"));
13977 }
13978 else if (lfence_before_indirect_branch != lfence_branch_none)
13979 as_warn (_("constant directive skips -mlfence-before-indirect-branch"));
e379e5f3
L
13980 }
13981}
13982
252b5132 13983void
e3bb37b5 13984i386_validate_fix (fixS *fixp)
252b5132 13985{
02a86693 13986 if (fixp->fx_subsy)
252b5132 13987 {
02a86693 13988 if (fixp->fx_subsy == GOT_symbol)
23df1078 13989 {
02a86693
L
13990 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
13991 {
13992 if (!object_64bit)
13993 abort ();
13994#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13995 if (fixp->fx_tcbit2)
56ceb5b5
L
13996 fixp->fx_r_type = (fixp->fx_tcbit
13997 ? BFD_RELOC_X86_64_REX_GOTPCRELX
13998 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
13999 else
14000#endif
14001 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
14002 }
d6ab8113 14003 else
02a86693
L
14004 {
14005 if (!object_64bit)
14006 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
14007 else
14008 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
14009 }
14010 fixp->fx_subsy = 0;
23df1078 14011 }
252b5132 14012 }
02a86693 14013#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2585b7a5 14014 else
02a86693 14015 {
2585b7a5
L
14016 /* NB: Commit 292676c1 resolved PLT32 reloc aganst local symbol
14017 to section. Since PLT32 relocation must be against symbols,
14018 turn such PLT32 relocation into PC32 relocation. */
14019 if (fixp->fx_addsy
14020 && (fixp->fx_r_type == BFD_RELOC_386_PLT32
14021 || fixp->fx_r_type == BFD_RELOC_X86_64_PLT32)
14022 && symbol_section_p (fixp->fx_addsy))
14023 fixp->fx_r_type = BFD_RELOC_32_PCREL;
14024 if (!object_64bit)
14025 {
14026 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
14027 && fixp->fx_tcbit2)
14028 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
14029 }
02a86693
L
14030 }
14031#endif
252b5132
RH
14032}
14033
252b5132 14034arelent *
7016a5d5 14035tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
14036{
14037 arelent *rel;
14038 bfd_reloc_code_real_type code;
14039
14040 switch (fixp->fx_r_type)
14041 {
8ce3d284 14042#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
14043 case BFD_RELOC_SIZE32:
14044 case BFD_RELOC_SIZE64:
14045 if (S_IS_DEFINED (fixp->fx_addsy)
14046 && !S_IS_EXTERNAL (fixp->fx_addsy))
14047 {
14048 /* Resolve size relocation against local symbol to size of
14049 the symbol plus addend. */
14050 valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
14051 if (fixp->fx_r_type == BFD_RELOC_SIZE32
14052 && !fits_in_unsigned_long (value))
14053 as_bad_where (fixp->fx_file, fixp->fx_line,
14054 _("symbol size computation overflow"));
14055 fixp->fx_addsy = NULL;
14056 fixp->fx_subsy = NULL;
14057 md_apply_fix (fixp, (valueT *) &value, NULL);
14058 return NULL;
14059 }
8ce3d284 14060#endif
1a0670f3 14061 /* Fall through. */
8fd4256d 14062
3e73aa7c
JH
14063 case BFD_RELOC_X86_64_PLT32:
14064 case BFD_RELOC_X86_64_GOT32:
14065 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
14066 case BFD_RELOC_X86_64_GOTPCRELX:
14067 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
14068 case BFD_RELOC_386_PLT32:
14069 case BFD_RELOC_386_GOT32:
02a86693 14070 case BFD_RELOC_386_GOT32X:
252b5132
RH
14071 case BFD_RELOC_386_GOTOFF:
14072 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
14073 case BFD_RELOC_386_TLS_GD:
14074 case BFD_RELOC_386_TLS_LDM:
14075 case BFD_RELOC_386_TLS_LDO_32:
14076 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
14077 case BFD_RELOC_386_TLS_IE:
14078 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
14079 case BFD_RELOC_386_TLS_LE_32:
14080 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
14081 case BFD_RELOC_386_TLS_GOTDESC:
14082 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
14083 case BFD_RELOC_X86_64_TLSGD:
14084 case BFD_RELOC_X86_64_TLSLD:
14085 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 14086 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
14087 case BFD_RELOC_X86_64_GOTTPOFF:
14088 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
14089 case BFD_RELOC_X86_64_TPOFF64:
14090 case BFD_RELOC_X86_64_GOTOFF64:
14091 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
14092 case BFD_RELOC_X86_64_GOT64:
14093 case BFD_RELOC_X86_64_GOTPCREL64:
14094 case BFD_RELOC_X86_64_GOTPC64:
14095 case BFD_RELOC_X86_64_GOTPLT64:
14096 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
14097 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
14098 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
14099 case BFD_RELOC_RVA:
14100 case BFD_RELOC_VTABLE_ENTRY:
14101 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
14102#ifdef TE_PE
14103 case BFD_RELOC_32_SECREL:
14104#endif
252b5132
RH
14105 code = fixp->fx_r_type;
14106 break;
dbbaec26
L
14107 case BFD_RELOC_X86_64_32S:
14108 if (!fixp->fx_pcrel)
14109 {
14110 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
14111 code = fixp->fx_r_type;
14112 break;
14113 }
1a0670f3 14114 /* Fall through. */
252b5132 14115 default:
93382f6d 14116 if (fixp->fx_pcrel)
252b5132 14117 {
93382f6d
AM
14118 switch (fixp->fx_size)
14119 {
14120 default:
b091f402
AM
14121 as_bad_where (fixp->fx_file, fixp->fx_line,
14122 _("can not do %d byte pc-relative relocation"),
14123 fixp->fx_size);
93382f6d
AM
14124 code = BFD_RELOC_32_PCREL;
14125 break;
14126 case 1: code = BFD_RELOC_8_PCREL; break;
14127 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 14128 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
14129#ifdef BFD64
14130 case 8: code = BFD_RELOC_64_PCREL; break;
14131#endif
93382f6d
AM
14132 }
14133 }
14134 else
14135 {
14136 switch (fixp->fx_size)
14137 {
14138 default:
b091f402
AM
14139 as_bad_where (fixp->fx_file, fixp->fx_line,
14140 _("can not do %d byte relocation"),
14141 fixp->fx_size);
93382f6d
AM
14142 code = BFD_RELOC_32;
14143 break;
14144 case 1: code = BFD_RELOC_8; break;
14145 case 2: code = BFD_RELOC_16; break;
14146 case 4: code = BFD_RELOC_32; break;
937149dd 14147#ifdef BFD64
3e73aa7c 14148 case 8: code = BFD_RELOC_64; break;
937149dd 14149#endif
93382f6d 14150 }
252b5132
RH
14151 }
14152 break;
14153 }
252b5132 14154
d182319b
JB
14155 if ((code == BFD_RELOC_32
14156 || code == BFD_RELOC_32_PCREL
14157 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
14158 && GOT_symbol
14159 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 14160 {
4fa24527 14161 if (!object_64bit)
d6ab8113
JB
14162 code = BFD_RELOC_386_GOTPC;
14163 else
14164 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 14165 }
7b81dfbb
AJ
14166 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
14167 && GOT_symbol
14168 && fixp->fx_addsy == GOT_symbol)
14169 {
14170 code = BFD_RELOC_X86_64_GOTPC64;
14171 }
252b5132 14172
add39d23
TS
14173 rel = XNEW (arelent);
14174 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 14175 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
14176
14177 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 14178
3e73aa7c
JH
14179 if (!use_rela_relocations)
14180 {
14181 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
14182 vtable entry to be used in the relocation's section offset. */
14183 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14184 rel->address = fixp->fx_offset;
fbeb56a4
DK
14185#if defined (OBJ_COFF) && defined (TE_PE)
14186 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
14187 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
14188 else
14189#endif
c6682705 14190 rel->addend = 0;
3e73aa7c
JH
14191 }
14192 /* Use the rela in 64bit mode. */
252b5132 14193 else
3e73aa7c 14194 {
862be3fb
L
14195 if (disallow_64bit_reloc)
14196 switch (code)
14197 {
862be3fb
L
14198 case BFD_RELOC_X86_64_DTPOFF64:
14199 case BFD_RELOC_X86_64_TPOFF64:
14200 case BFD_RELOC_64_PCREL:
14201 case BFD_RELOC_X86_64_GOTOFF64:
14202 case BFD_RELOC_X86_64_GOT64:
14203 case BFD_RELOC_X86_64_GOTPCREL64:
14204 case BFD_RELOC_X86_64_GOTPC64:
14205 case BFD_RELOC_X86_64_GOTPLT64:
14206 case BFD_RELOC_X86_64_PLTOFF64:
14207 as_bad_where (fixp->fx_file, fixp->fx_line,
14208 _("cannot represent relocation type %s in x32 mode"),
14209 bfd_get_reloc_code_name (code));
14210 break;
14211 default:
14212 break;
14213 }
14214
062cd5e7
AS
14215 if (!fixp->fx_pcrel)
14216 rel->addend = fixp->fx_offset;
14217 else
14218 switch (code)
14219 {
14220 case BFD_RELOC_X86_64_PLT32:
14221 case BFD_RELOC_X86_64_GOT32:
14222 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
14223 case BFD_RELOC_X86_64_GOTPCRELX:
14224 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
14225 case BFD_RELOC_X86_64_TLSGD:
14226 case BFD_RELOC_X86_64_TLSLD:
14227 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
14228 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
14229 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
14230 rel->addend = fixp->fx_offset - fixp->fx_size;
14231 break;
14232 default:
14233 rel->addend = (section->vma
14234 - fixp->fx_size
14235 + fixp->fx_addnumber
14236 + md_pcrel_from (fixp));
14237 break;
14238 }
3e73aa7c
JH
14239 }
14240
252b5132
RH
14241 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
14242 if (rel->howto == NULL)
14243 {
14244 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 14245 _("cannot represent relocation type %s"),
252b5132
RH
14246 bfd_get_reloc_code_name (code));
14247 /* Set howto to a garbage value so that we can keep going. */
14248 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 14249 gas_assert (rel->howto != NULL);
252b5132
RH
14250 }
14251
14252 return rel;
14253}
14254
ee86248c 14255#include "tc-i386-intel.c"
54cfded0 14256
a60de03c
JB
14257void
14258tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 14259{
a60de03c
JB
14260 int saved_naked_reg;
14261 char saved_register_dot;
54cfded0 14262
a60de03c
JB
14263 saved_naked_reg = allow_naked_reg;
14264 allow_naked_reg = 1;
14265 saved_register_dot = register_chars['.'];
14266 register_chars['.'] = '.';
14267 allow_pseudo_reg = 1;
14268 expression_and_evaluate (exp);
14269 allow_pseudo_reg = 0;
14270 register_chars['.'] = saved_register_dot;
14271 allow_naked_reg = saved_naked_reg;
14272
e96d56a1 14273 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 14274 {
a60de03c
JB
14275 if ((addressT) exp->X_add_number < i386_regtab_size)
14276 {
14277 exp->X_op = O_constant;
14278 exp->X_add_number = i386_regtab[exp->X_add_number]
14279 .dw2_regnum[flag_code >> 1];
14280 }
14281 else
14282 exp->X_op = O_illegal;
54cfded0 14283 }
54cfded0
AM
14284}
14285
14286void
14287tc_x86_frame_initial_instructions (void)
14288{
a60de03c
JB
14289 static unsigned int sp_regno[2];
14290
14291 if (!sp_regno[flag_code >> 1])
14292 {
14293 char *saved_input = input_line_pointer;
14294 char sp[][4] = {"esp", "rsp"};
14295 expressionS exp;
a4447b93 14296
a60de03c
JB
14297 input_line_pointer = sp[flag_code >> 1];
14298 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 14299 gas_assert (exp.X_op == O_constant);
a60de03c
JB
14300 sp_regno[flag_code >> 1] = exp.X_add_number;
14301 input_line_pointer = saved_input;
14302 }
a4447b93 14303
61ff971f
L
14304 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
14305 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 14306}
d2b2c203 14307
d7921315
L
14308int
14309x86_dwarf2_addr_size (void)
14310{
14311#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
14312 if (x86_elf_abi == X86_64_X32_ABI)
14313 return 4;
14314#endif
14315 return bfd_arch_bits_per_address (stdoutput) / 8;
14316}
14317
d2b2c203
DJ
14318int
14319i386_elf_section_type (const char *str, size_t len)
14320{
14321 if (flag_code == CODE_64BIT
14322 && len == sizeof ("unwind") - 1
14323 && strncmp (str, "unwind", 6) == 0)
14324 return SHT_X86_64_UNWIND;
14325
14326 return -1;
14327}
bb41ade5 14328
ad5fec3b
EB
14329#ifdef TE_SOLARIS
14330void
14331i386_solaris_fix_up_eh_frame (segT sec)
14332{
14333 if (flag_code == CODE_64BIT)
14334 elf_section_type (sec) = SHT_X86_64_UNWIND;
14335}
14336#endif
14337
bb41ade5
AM
14338#ifdef TE_PE
14339void
14340tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
14341{
91d6fa6a 14342 expressionS exp;
bb41ade5 14343
91d6fa6a
NC
14344 exp.X_op = O_secrel;
14345 exp.X_add_symbol = symbol;
14346 exp.X_add_number = 0;
14347 emit_expr (&exp, size);
bb41ade5
AM
14348}
14349#endif
3b22753a
L
14350
14351#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14352/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
14353
01e1a5bc 14354bfd_vma
6d4af3c2 14355x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
14356{
14357 if (flag_code == CODE_64BIT)
14358 {
14359 if (letter == 'l')
14360 return SHF_X86_64_LARGE;
14361
8f3bae45 14362 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 14363 }
3b22753a 14364 else
8f3bae45 14365 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
14366 return -1;
14367}
14368
01e1a5bc 14369bfd_vma
3b22753a
L
14370x86_64_section_word (char *str, size_t len)
14371{
08dedd66 14372 if (len == 5 && flag_code == CODE_64BIT && startswith (str, "large"))
3b22753a
L
14373 return SHF_X86_64_LARGE;
14374
14375 return -1;
14376}
14377
14378static void
14379handle_large_common (int small ATTRIBUTE_UNUSED)
14380{
14381 if (flag_code != CODE_64BIT)
14382 {
14383 s_comm_internal (0, elf_common_parse);
14384 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
14385 }
14386 else
14387 {
14388 static segT lbss_section;
14389 asection *saved_com_section_ptr = elf_com_section_ptr;
14390 asection *saved_bss_section = bss_section;
14391
14392 if (lbss_section == NULL)
14393 {
14394 flagword applicable;
14395 segT seg = now_seg;
14396 subsegT subseg = now_subseg;
14397
14398 /* The .lbss section is for local .largecomm symbols. */
14399 lbss_section = subseg_new (".lbss", 0);
14400 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 14401 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
14402 seg_info (lbss_section)->bss = 1;
14403
14404 subseg_set (seg, subseg);
14405 }
14406
14407 elf_com_section_ptr = &_bfd_elf_large_com_section;
14408 bss_section = lbss_section;
14409
14410 s_comm_internal (0, elf_common_parse);
14411
14412 elf_com_section_ptr = saved_com_section_ptr;
14413 bss_section = saved_bss_section;
14414 }
14415}
14416#endif /* OBJ_ELF || OBJ_MAYBE_ELF */