ix86: enable 2nd CFI test
[deliverable/binutils-gdb.git] / gas / config / tc-i386.c
CommitLineData
b534c6d3 1/* tc-i386.c -- Assemble code for the Intel 80386
b3adc24a 2 Copyright (C) 1989-2020 Free Software Foundation, Inc.
252b5132
RH
3
4 This file is part of GAS, the GNU Assembler.
5
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
ec2655a6 8 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
9 any later version.
10
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
252b5132 20
47926f60
KH
21/* Intel 80386 machine specific gas.
22 Written by Eliot Dresselhaus (eliot@mgm.mit.edu).
3e73aa7c 23 x86_64 support by Jan Hubicka (jh@suse.cz)
0f10071e 24 VIA PadLock support by Michal Ludvig (mludvig@suse.cz)
47926f60
KH
25 Bugs & suggestions are completely welcome. This is free software.
26 Please help us make it better. */
252b5132 27
252b5132 28#include "as.h"
3882b010 29#include "safe-ctype.h"
252b5132 30#include "subsegs.h"
316e2c05 31#include "dwarf2dbg.h"
54cfded0 32#include "dw2gencfi.h"
d2b2c203 33#include "elf/x86-64.h"
40fb9820 34#include "opcodes/i386-init.h"
252b5132 35
41fd2579
L
36#ifdef HAVE_LIMITS_H
37#include <limits.h>
38#else
39#ifdef HAVE_SYS_PARAM_H
40#include <sys/param.h>
41#endif
42#ifndef INT_MAX
43#define INT_MAX (int) (((unsigned) (-1)) >> 1)
44#endif
45#endif
46
c3332e24 47#ifndef INFER_ADDR_PREFIX
eecb386c 48#define INFER_ADDR_PREFIX 1
c3332e24
AM
49#endif
50
29b0f896
AM
51#ifndef DEFAULT_ARCH
52#define DEFAULT_ARCH "i386"
246fcdee 53#endif
252b5132 54
edde18a5
AM
55#ifndef INLINE
56#if __GNUC__ >= 2
57#define INLINE __inline__
58#else
59#define INLINE
60#endif
61#endif
62
6305a203
L
63/* Prefixes will be emitted in the order defined below.
64 WAIT_PREFIX must be the first prefix since FWAIT is really is an
65 instruction, and so must come before any prefixes.
66 The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
42164a71 67 REP_PREFIX/HLE_PREFIX, LOCK_PREFIX. */
6305a203
L
68#define WAIT_PREFIX 0
69#define SEG_PREFIX 1
70#define ADDR_PREFIX 2
71#define DATA_PREFIX 3
c32fa91d 72#define REP_PREFIX 4
42164a71 73#define HLE_PREFIX REP_PREFIX
7e8b059b 74#define BND_PREFIX REP_PREFIX
c32fa91d 75#define LOCK_PREFIX 5
4e9ac44a
L
76#define REX_PREFIX 6 /* must come last. */
77#define MAX_PREFIXES 7 /* max prefixes per opcode */
6305a203
L
78
79/* we define the syntax here (modulo base,index,scale syntax) */
80#define REGISTER_PREFIX '%'
81#define IMMEDIATE_PREFIX '$'
82#define ABSOLUTE_PREFIX '*'
83
84/* these are the instruction mnemonic suffixes in AT&T syntax or
85 memory operand size in Intel syntax. */
86#define WORD_MNEM_SUFFIX 'w'
87#define BYTE_MNEM_SUFFIX 'b'
88#define SHORT_MNEM_SUFFIX 's'
89#define LONG_MNEM_SUFFIX 'l'
90#define QWORD_MNEM_SUFFIX 'q'
6305a203
L
91/* Intel Syntax. Use a non-ascii letter since since it never appears
92 in instructions. */
93#define LONG_DOUBLE_MNEM_SUFFIX '\1'
94
95#define END_OF_INSN '\0'
96
79dec6b7
JB
97/* This matches the C -> StaticRounding alias in the opcode table. */
98#define commutative staticrounding
99
6305a203
L
100/*
101 'templates' is for grouping together 'template' structures for opcodes
102 of the same name. This is only used for storing the insns in the grand
103 ole hash table of insns.
104 The templates themselves start at START and range up to (but not including)
105 END.
106 */
107typedef struct
108{
d3ce72d0
NC
109 const insn_template *start;
110 const insn_template *end;
6305a203
L
111}
112templates;
113
114/* 386 operand encoding bytes: see 386 book for details of this. */
115typedef struct
116{
117 unsigned int regmem; /* codes register or memory operand */
118 unsigned int reg; /* codes register operand (or extended opcode) */
119 unsigned int mode; /* how to interpret regmem & reg */
120}
121modrm_byte;
122
123/* x86-64 extension prefix. */
124typedef int rex_byte;
125
6305a203
L
126/* 386 opcode byte to code indirect addressing. */
127typedef struct
128{
129 unsigned base;
130 unsigned index;
131 unsigned scale;
132}
133sib_byte;
134
6305a203
L
135/* x86 arch names, types and features */
136typedef struct
137{
138 const char *name; /* arch name */
8a2c8fef 139 unsigned int len; /* arch string length */
6305a203
L
140 enum processor_type type; /* arch type */
141 i386_cpu_flags flags; /* cpu feature flags */
8a2c8fef 142 unsigned int skip; /* show_arch should skip this. */
6305a203
L
143}
144arch_entry;
145
293f5f65
L
146/* Used to turn off indicated flags. */
147typedef struct
148{
149 const char *name; /* arch name */
150 unsigned int len; /* arch string length */
151 i386_cpu_flags flags; /* cpu feature flags */
152}
153noarch_entry;
154
78f12dd3 155static void update_code_flag (int, int);
e3bb37b5
L
156static void set_code_flag (int);
157static void set_16bit_gcc_code_flag (int);
158static void set_intel_syntax (int);
1efbbeb4 159static void set_intel_mnemonic (int);
db51cc60 160static void set_allow_index_reg (int);
7bab8ab5 161static void set_check (int);
e3bb37b5 162static void set_cpu_arch (int);
6482c264 163#ifdef TE_PE
e3bb37b5 164static void pe_directive_secrel (int);
6482c264 165#endif
e3bb37b5
L
166static void signed_cons (int);
167static char *output_invalid (int c);
ee86248c
JB
168static int i386_finalize_immediate (segT, expressionS *, i386_operand_type,
169 const char *);
170static int i386_finalize_displacement (segT, expressionS *, i386_operand_type,
171 const char *);
a7619375 172static int i386_att_operand (char *);
e3bb37b5 173static int i386_intel_operand (char *, int);
ee86248c
JB
174static int i386_intel_simplify (expressionS *);
175static int i386_intel_parse_name (const char *, expressionS *);
e3bb37b5
L
176static const reg_entry *parse_register (char *, char **);
177static char *parse_insn (char *, char *);
178static char *parse_operands (char *, const char *);
179static void swap_operands (void);
4d456e3d 180static void swap_2_operands (int, int);
48bcea9f 181static enum flag_code i386_addressing_mode (void);
e3bb37b5
L
182static void optimize_imm (void);
183static void optimize_disp (void);
83b16ac6 184static const insn_template *match_template (char);
e3bb37b5
L
185static int check_string (void);
186static int process_suffix (void);
187static int check_byte_reg (void);
188static int check_long_reg (void);
189static int check_qword_reg (void);
190static int check_word_reg (void);
191static int finalize_imm (void);
192static int process_operands (void);
193static const seg_entry *build_modrm_byte (void);
194static void output_insn (void);
195static void output_imm (fragS *, offsetT);
196static void output_disp (fragS *, offsetT);
29b0f896 197#ifndef I386COFF
e3bb37b5 198static void s_bss (int);
252b5132 199#endif
17d4e2a2
L
200#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
201static void handle_large_common (int small ATTRIBUTE_UNUSED);
b4a3a7b4
L
202
203/* GNU_PROPERTY_X86_ISA_1_USED. */
204static unsigned int x86_isa_1_used;
205/* GNU_PROPERTY_X86_FEATURE_2_USED. */
206static unsigned int x86_feature_2_used;
207/* Generate x86 used ISA and feature properties. */
208static unsigned int x86_used_note = DEFAULT_X86_USED_NOTE;
17d4e2a2 209#endif
252b5132 210
a847613f 211static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 212
8a6fb3f9
JB
213/* parse_register() returns this when a register alias cannot be used. */
214static const reg_entry bad_reg = { "<bad>", OPERAND_TYPE_NONE, 0, 0,
215 { Dw2Inval, Dw2Inval } };
216
43234a1e
L
217/* This struct describes rounding control and SAE in the instruction. */
218struct RC_Operation
219{
220 enum rc_type
221 {
222 rne = 0,
223 rd,
224 ru,
225 rz,
226 saeonly
227 } type;
228 int operand;
229};
230
231static struct RC_Operation rc_op;
232
233/* The struct describes masking, applied to OPERAND in the instruction.
234 MASK is a pointer to the corresponding mask register. ZEROING tells
235 whether merging or zeroing mask is used. */
236struct Mask_Operation
237{
238 const reg_entry *mask;
239 unsigned int zeroing;
240 /* The operand where this operation is associated. */
241 int operand;
242};
243
244static struct Mask_Operation mask_op;
245
246/* The struct describes broadcasting, applied to OPERAND. FACTOR is
247 broadcast factor. */
248struct Broadcast_Operation
249{
8e6e0792 250 /* Type of broadcast: {1to2}, {1to4}, {1to8}, or {1to16}. */
43234a1e
L
251 int type;
252
253 /* Index of broadcasted operand. */
254 int operand;
4a1b91ea
L
255
256 /* Number of bytes to broadcast. */
257 int bytes;
43234a1e
L
258};
259
260static struct Broadcast_Operation broadcast_op;
261
c0f3af97
L
262/* VEX prefix. */
263typedef struct
264{
43234a1e
L
265 /* VEX prefix is either 2 byte or 3 byte. EVEX is 4 byte. */
266 unsigned char bytes[4];
c0f3af97
L
267 unsigned int length;
268 /* Destination or source register specifier. */
269 const reg_entry *register_specifier;
270} vex_prefix;
271
252b5132 272/* 'md_assemble ()' gathers together information and puts it into a
47926f60 273 i386_insn. */
252b5132 274
520dc8e8
AM
275union i386_op
276 {
277 expressionS *disps;
278 expressionS *imms;
279 const reg_entry *regs;
280 };
281
a65babc9
L
282enum i386_error
283 {
86e026a4 284 operand_size_mismatch,
a65babc9
L
285 operand_type_mismatch,
286 register_type_mismatch,
287 number_of_operands_mismatch,
288 invalid_instruction_suffix,
289 bad_imm4,
a65babc9
L
290 unsupported_with_intel_mnemonic,
291 unsupported_syntax,
6c30d220
L
292 unsupported,
293 invalid_vsib_address,
7bab8ab5 294 invalid_vector_register_set,
43234a1e
L
295 unsupported_vector_index_register,
296 unsupported_broadcast,
43234a1e
L
297 broadcast_needed,
298 unsupported_masking,
299 mask_not_on_destination,
300 no_default_mask,
301 unsupported_rc_sae,
302 rc_sae_operand_not_last_imm,
303 invalid_register_operand,
a65babc9
L
304 };
305
252b5132
RH
306struct _i386_insn
307 {
47926f60 308 /* TM holds the template for the insn were currently assembling. */
d3ce72d0 309 insn_template tm;
252b5132 310
7d5e4556
L
311 /* SUFFIX holds the instruction size suffix for byte, word, dword
312 or qword, if given. */
252b5132
RH
313 char suffix;
314
47926f60 315 /* OPERANDS gives the number of given operands. */
252b5132
RH
316 unsigned int operands;
317
318 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
319 of given register, displacement, memory operands and immediate
47926f60 320 operands. */
252b5132
RH
321 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
322
323 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 324 use OP[i] for the corresponding operand. */
40fb9820 325 i386_operand_type types[MAX_OPERANDS];
252b5132 326
520dc8e8
AM
327 /* Displacement expression, immediate expression, or register for each
328 operand. */
329 union i386_op op[MAX_OPERANDS];
252b5132 330
3e73aa7c
JH
331 /* Flags for operands. */
332 unsigned int flags[MAX_OPERANDS];
333#define Operand_PCrel 1
c48dadc9 334#define Operand_Mem 2
3e73aa7c 335
252b5132 336 /* Relocation type for operand */
f86103b7 337 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 338
252b5132
RH
339 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
340 the base index byte below. */
341 const reg_entry *base_reg;
342 const reg_entry *index_reg;
343 unsigned int log2_scale_factor;
344
345 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 346 explicit segment overrides are given. */
ce8a8b2f 347 const seg_entry *seg[2];
252b5132 348
8325cc63
JB
349 /* Copied first memory operand string, for re-checking. */
350 char *memop1_string;
351
252b5132
RH
352 /* PREFIX holds all the given prefix opcodes (usually null).
353 PREFIXES is the number of prefix opcodes. */
354 unsigned int prefixes;
355 unsigned char prefix[MAX_PREFIXES];
356
50128d0c
JB
357 /* Register is in low 3 bits of opcode. */
358 bfd_boolean short_form;
359
6f2f06be
JB
360 /* The operand to a branch insn indicates an absolute branch. */
361 bfd_boolean jumpabsolute;
362
b4a3a7b4
L
363 /* Has MMX register operands. */
364 bfd_boolean has_regmmx;
365
366 /* Has XMM register operands. */
367 bfd_boolean has_regxmm;
368
369 /* Has YMM register operands. */
370 bfd_boolean has_regymm;
371
372 /* Has ZMM register operands. */
373 bfd_boolean has_regzmm;
374
e379e5f3
L
375 /* Has GOTPC or TLS relocation. */
376 bfd_boolean has_gotpc_tls_reloc;
377
252b5132 378 /* RM and SIB are the modrm byte and the sib byte where the
c1e679ec 379 addressing modes of this insn are encoded. */
252b5132 380 modrm_byte rm;
3e73aa7c 381 rex_byte rex;
43234a1e 382 rex_byte vrex;
252b5132 383 sib_byte sib;
c0f3af97 384 vex_prefix vex;
b6169b20 385
43234a1e
L
386 /* Masking attributes. */
387 struct Mask_Operation *mask;
388
389 /* Rounding control and SAE attributes. */
390 struct RC_Operation *rounding;
391
392 /* Broadcasting attributes. */
393 struct Broadcast_Operation *broadcast;
394
395 /* Compressed disp8*N attribute. */
396 unsigned int memshift;
397
86fa6981
L
398 /* Prefer load or store in encoding. */
399 enum
400 {
401 dir_encoding_default = 0,
402 dir_encoding_load,
64c49ab3
JB
403 dir_encoding_store,
404 dir_encoding_swap
86fa6981 405 } dir_encoding;
891edac4 406
a501d77e
L
407 /* Prefer 8bit or 32bit displacement in encoding. */
408 enum
409 {
410 disp_encoding_default = 0,
411 disp_encoding_8bit,
412 disp_encoding_32bit
413 } disp_encoding;
f8a5c266 414
6b6b6807
L
415 /* Prefer the REX byte in encoding. */
416 bfd_boolean rex_encoding;
417
b6f8c7c4
L
418 /* Disable instruction size optimization. */
419 bfd_boolean no_optimize;
420
86fa6981
L
421 /* How to encode vector instructions. */
422 enum
423 {
424 vex_encoding_default = 0,
42e04b36 425 vex_encoding_vex,
86fa6981
L
426 vex_encoding_vex3,
427 vex_encoding_evex
428 } vec_encoding;
429
d5de92cf
L
430 /* REP prefix. */
431 const char *rep_prefix;
432
165de32a
L
433 /* HLE prefix. */
434 const char *hle_prefix;
42164a71 435
7e8b059b
L
436 /* Have BND prefix. */
437 const char *bnd_prefix;
438
04ef582a
L
439 /* Have NOTRACK prefix. */
440 const char *notrack_prefix;
441
891edac4 442 /* Error message. */
a65babc9 443 enum i386_error error;
252b5132
RH
444 };
445
446typedef struct _i386_insn i386_insn;
447
43234a1e
L
448/* Link RC type with corresponding string, that'll be looked for in
449 asm. */
450struct RC_name
451{
452 enum rc_type type;
453 const char *name;
454 unsigned int len;
455};
456
457static const struct RC_name RC_NamesTable[] =
458{
459 { rne, STRING_COMMA_LEN ("rn-sae") },
460 { rd, STRING_COMMA_LEN ("rd-sae") },
461 { ru, STRING_COMMA_LEN ("ru-sae") },
462 { rz, STRING_COMMA_LEN ("rz-sae") },
463 { saeonly, STRING_COMMA_LEN ("sae") },
464};
465
252b5132
RH
466/* List of chars besides those in app.c:symbol_chars that can start an
467 operand. Used to prevent the scrubber eating vital white-space. */
86fa6981 468const char extra_symbol_chars[] = "*%-([{}"
252b5132 469#ifdef LEX_AT
32137342
NC
470 "@"
471#endif
472#ifdef LEX_QM
473 "?"
252b5132 474#endif
32137342 475 ;
252b5132 476
29b0f896
AM
477#if (defined (TE_I386AIX) \
478 || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
3896cfd5 479 && !defined (TE_GNU) \
29b0f896 480 && !defined (TE_LINUX) \
8d63c93e 481 && !defined (TE_NACL) \
29b0f896 482 && !defined (TE_FreeBSD) \
5b806d27 483 && !defined (TE_DragonFly) \
29b0f896 484 && !defined (TE_NetBSD)))
252b5132 485/* This array holds the chars that always start a comment. If the
b3b91714
AM
486 pre-processor is disabled, these aren't very useful. The option
487 --divide will remove '/' from this list. */
488const char *i386_comment_chars = "#/";
489#define SVR4_COMMENT_CHARS 1
252b5132 490#define PREFIX_SEPARATOR '\\'
252b5132 491
b3b91714
AM
492#else
493const char *i386_comment_chars = "#";
494#define PREFIX_SEPARATOR '/'
495#endif
496
252b5132
RH
497/* This array holds the chars that only start a comment at the beginning of
498 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
499 .line and .file directives will appear in the pre-processed output.
500 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 501 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
502 #NO_APP at the beginning of its output.
503 Also note that comments started like this one will always work if
252b5132 504 '/' isn't otherwise defined. */
b3b91714 505const char line_comment_chars[] = "#/";
252b5132 506
63a0b638 507const char line_separator_chars[] = ";";
252b5132 508
ce8a8b2f
AM
509/* Chars that can be used to separate mant from exp in floating point
510 nums. */
252b5132
RH
511const char EXP_CHARS[] = "eE";
512
ce8a8b2f
AM
513/* Chars that mean this number is a floating point constant
514 As in 0f12.456
515 or 0d1.2345e12. */
252b5132
RH
516const char FLT_CHARS[] = "fFdDxX";
517
ce8a8b2f 518/* Tables for lexical analysis. */
252b5132
RH
519static char mnemonic_chars[256];
520static char register_chars[256];
521static char operand_chars[256];
522static char identifier_chars[256];
523static char digit_chars[256];
524
ce8a8b2f 525/* Lexical macros. */
252b5132
RH
526#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
527#define is_operand_char(x) (operand_chars[(unsigned char) x])
528#define is_register_char(x) (register_chars[(unsigned char) x])
529#define is_space_char(x) ((x) == ' ')
530#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
531#define is_digit_char(x) (digit_chars[(unsigned char) x])
532
0234cb7c 533/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
534static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
535
536/* md_assemble() always leaves the strings it's passed unaltered. To
537 effect this we maintain a stack of saved characters that we've smashed
538 with '\0's (indicating end of strings for various sub-fields of the
47926f60 539 assembler instruction). */
252b5132 540static char save_stack[32];
ce8a8b2f 541static char *save_stack_p;
252b5132
RH
542#define END_STRING_AND_SAVE(s) \
543 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
544#define RESTORE_END_STRING(s) \
545 do { *(s) = *--save_stack_p; } while (0)
546
47926f60 547/* The instruction we're assembling. */
252b5132
RH
548static i386_insn i;
549
550/* Possible templates for current insn. */
551static const templates *current_templates;
552
31b2323c
L
553/* Per instruction expressionS buffers: max displacements & immediates. */
554static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
555static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 556
47926f60 557/* Current operand we are working on. */
ee86248c 558static int this_operand = -1;
252b5132 559
3e73aa7c
JH
560/* We support four different modes. FLAG_CODE variable is used to distinguish
561 these. */
562
563enum flag_code {
564 CODE_32BIT,
565 CODE_16BIT,
566 CODE_64BIT };
567
568static enum flag_code flag_code;
4fa24527 569static unsigned int object_64bit;
862be3fb 570static unsigned int disallow_64bit_reloc;
3e73aa7c 571static int use_rela_relocations = 0;
e379e5f3
L
572/* __tls_get_addr/___tls_get_addr symbol for TLS. */
573static const char *tls_get_addr;
3e73aa7c 574
7af8ed2d
NC
575#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
576 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
577 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
578
351f65ca
L
579/* The ELF ABI to use. */
580enum x86_elf_abi
581{
582 I386_ABI,
7f56bc95
L
583 X86_64_ABI,
584 X86_64_X32_ABI
351f65ca
L
585};
586
587static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 588#endif
351f65ca 589
167ad85b
TG
590#if defined (TE_PE) || defined (TE_PEP)
591/* Use big object file format. */
592static int use_big_obj = 0;
593#endif
594
8dcea932
L
595#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
596/* 1 if generating code for a shared library. */
597static int shared = 0;
598#endif
599
47926f60
KH
600/* 1 for intel syntax,
601 0 if att syntax. */
602static int intel_syntax = 0;
252b5132 603
4b5aaf5f
L
604static enum x86_64_isa
605{
606 amd64 = 1, /* AMD64 ISA. */
607 intel64 /* Intel64 ISA. */
608} isa64;
e89c5eaa 609
1efbbeb4
L
610/* 1 for intel mnemonic,
611 0 if att mnemonic. */
612static int intel_mnemonic = !SYSV386_COMPAT;
613
a60de03c
JB
614/* 1 if pseudo registers are permitted. */
615static int allow_pseudo_reg = 0;
616
47926f60
KH
617/* 1 if register prefix % not required. */
618static int allow_naked_reg = 0;
252b5132 619
33eaf5de 620/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
621 instructions supporting it, even if this prefix wasn't specified
622 explicitly. */
623static int add_bnd_prefix = 0;
624
ba104c83 625/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
626static int allow_index_reg = 0;
627
d022bddd
IT
628/* 1 if the assembler should ignore LOCK prefix, even if it was
629 specified explicitly. */
630static int omit_lock_prefix = 0;
631
e4e00185
AS
632/* 1 if the assembler should encode lfence, mfence, and sfence as
633 "lock addl $0, (%{re}sp)". */
634static int avoid_fence = 0;
635
ae531041
L
636/* 1 if lfence should be inserted after every load. */
637static int lfence_after_load = 0;
638
639/* Non-zero if lfence should be inserted before indirect branch. */
640static enum lfence_before_indirect_branch_kind
641 {
642 lfence_branch_none = 0,
643 lfence_branch_register,
644 lfence_branch_memory,
645 lfence_branch_all
646 }
647lfence_before_indirect_branch;
648
649/* Non-zero if lfence should be inserted before ret. */
650static enum lfence_before_ret_kind
651 {
652 lfence_before_ret_none = 0,
653 lfence_before_ret_not,
a09f656b 654 lfence_before_ret_or,
655 lfence_before_ret_shl
ae531041
L
656 }
657lfence_before_ret;
658
659/* Types of previous instruction is .byte or prefix. */
e379e5f3
L
660static struct
661 {
662 segT seg;
663 const char *file;
664 const char *name;
665 unsigned int line;
666 enum last_insn_kind
667 {
668 last_insn_other = 0,
669 last_insn_directive,
670 last_insn_prefix
671 } kind;
672 } last_insn;
673
0cb4071e
L
674/* 1 if the assembler should generate relax relocations. */
675
676static int generate_relax_relocations
677 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
678
7bab8ab5 679static enum check_kind
daf50ae7 680 {
7bab8ab5
JB
681 check_none = 0,
682 check_warning,
683 check_error
daf50ae7 684 }
7bab8ab5 685sse_check, operand_check = check_warning;
daf50ae7 686
e379e5f3
L
687/* Non-zero if branches should be aligned within power of 2 boundary. */
688static int align_branch_power = 0;
689
690/* Types of branches to align. */
691enum align_branch_kind
692 {
693 align_branch_none = 0,
694 align_branch_jcc = 1,
695 align_branch_fused = 2,
696 align_branch_jmp = 3,
697 align_branch_call = 4,
698 align_branch_indirect = 5,
699 align_branch_ret = 6
700 };
701
702/* Type bits of branches to align. */
703enum align_branch_bit
704 {
705 align_branch_jcc_bit = 1 << align_branch_jcc,
706 align_branch_fused_bit = 1 << align_branch_fused,
707 align_branch_jmp_bit = 1 << align_branch_jmp,
708 align_branch_call_bit = 1 << align_branch_call,
709 align_branch_indirect_bit = 1 << align_branch_indirect,
710 align_branch_ret_bit = 1 << align_branch_ret
711 };
712
713static unsigned int align_branch = (align_branch_jcc_bit
714 | align_branch_fused_bit
715 | align_branch_jmp_bit);
716
79d72f45
HL
717/* Types of condition jump used by macro-fusion. */
718enum mf_jcc_kind
719 {
720 mf_jcc_jo = 0, /* base opcode 0x70 */
721 mf_jcc_jc, /* base opcode 0x72 */
722 mf_jcc_je, /* base opcode 0x74 */
723 mf_jcc_jna, /* base opcode 0x76 */
724 mf_jcc_js, /* base opcode 0x78 */
725 mf_jcc_jp, /* base opcode 0x7a */
726 mf_jcc_jl, /* base opcode 0x7c */
727 mf_jcc_jle, /* base opcode 0x7e */
728 };
729
730/* Types of compare flag-modifying insntructions used by macro-fusion. */
731enum mf_cmp_kind
732 {
733 mf_cmp_test_and, /* test/cmp */
734 mf_cmp_alu_cmp, /* add/sub/cmp */
735 mf_cmp_incdec /* inc/dec */
736 };
737
e379e5f3
L
738/* The maximum padding size for fused jcc. CMP like instruction can
739 be 9 bytes and jcc can be 6 bytes. Leave room just in case for
740 prefixes. */
741#define MAX_FUSED_JCC_PADDING_SIZE 20
742
743/* The maximum number of prefixes added for an instruction. */
744static unsigned int align_branch_prefix_size = 5;
745
b6f8c7c4
L
746/* Optimization:
747 1. Clear the REX_W bit with register operand if possible.
748 2. Above plus use 128bit vector instruction to clear the full vector
749 register.
750 */
751static int optimize = 0;
752
753/* Optimization:
754 1. Clear the REX_W bit with register operand if possible.
755 2. Above plus use 128bit vector instruction to clear the full vector
756 register.
757 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
758 "testb $imm7,%r8".
759 */
760static int optimize_for_space = 0;
761
2ca3ace5
L
762/* Register prefix used for error message. */
763static const char *register_prefix = "%";
764
47926f60
KH
765/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
766 leave, push, and pop instructions so that gcc has the same stack
767 frame as in 32 bit mode. */
768static char stackop_size = '\0';
eecb386c 769
12b55ccc
L
770/* Non-zero to optimize code alignment. */
771int optimize_align_code = 1;
772
47926f60
KH
773/* Non-zero to quieten some warnings. */
774static int quiet_warnings = 0;
a38cf1db 775
47926f60
KH
776/* CPU name. */
777static const char *cpu_arch_name = NULL;
6305a203 778static char *cpu_sub_arch_name = NULL;
a38cf1db 779
47926f60 780/* CPU feature flags. */
40fb9820
L
781static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
782
ccc9c027
L
783/* If we have selected a cpu we are generating instructions for. */
784static int cpu_arch_tune_set = 0;
785
9103f4f4 786/* Cpu we are generating instructions for. */
fbf3f584 787enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4
L
788
789/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 790static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 791
ccc9c027 792/* CPU instruction set architecture used. */
fbf3f584 793enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 794
9103f4f4 795/* CPU feature flags of instruction set architecture used. */
fbf3f584 796i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 797
fddf5b5b
AM
798/* If set, conditional jumps are not automatically promoted to handle
799 larger than a byte offset. */
800static unsigned int no_cond_jump_promotion = 0;
801
c0f3af97
L
802/* Encode SSE instructions with VEX prefix. */
803static unsigned int sse2avx;
804
539f890d
L
805/* Encode scalar AVX instructions with specific vector length. */
806static enum
807 {
808 vex128 = 0,
809 vex256
810 } avxscalar;
811
03751133
L
812/* Encode VEX WIG instructions with specific vex.w. */
813static enum
814 {
815 vexw0 = 0,
816 vexw1
817 } vexwig;
818
43234a1e
L
819/* Encode scalar EVEX LIG instructions with specific vector length. */
820static enum
821 {
822 evexl128 = 0,
823 evexl256,
824 evexl512
825 } evexlig;
826
827/* Encode EVEX WIG instructions with specific evex.w. */
828static enum
829 {
830 evexw0 = 0,
831 evexw1
832 } evexwig;
833
d3d3c6db
IT
834/* Value to encode in EVEX RC bits, for SAE-only instructions. */
835static enum rc_type evexrcig = rne;
836
29b0f896 837/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 838static symbolS *GOT_symbol;
29b0f896 839
a4447b93
RH
840/* The dwarf2 return column, adjusted for 32 or 64 bit. */
841unsigned int x86_dwarf2_return_column;
842
843/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
844int x86_cie_data_alignment;
845
252b5132 846/* Interface to relax_segment.
fddf5b5b
AM
847 There are 3 major relax states for 386 jump insns because the
848 different types of jumps add different sizes to frags when we're
e379e5f3
L
849 figuring out what sort of jump to choose to reach a given label.
850
851 BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING are used to align
852 branches which are handled by md_estimate_size_before_relax() and
853 i386_generic_table_relax_frag(). */
252b5132 854
47926f60 855/* Types. */
93c2a809
AM
856#define UNCOND_JUMP 0
857#define COND_JUMP 1
858#define COND_JUMP86 2
e379e5f3
L
859#define BRANCH_PADDING 3
860#define BRANCH_PREFIX 4
861#define FUSED_JCC_PADDING 5
fddf5b5b 862
47926f60 863/* Sizes. */
252b5132
RH
864#define CODE16 1
865#define SMALL 0
29b0f896 866#define SMALL16 (SMALL | CODE16)
252b5132 867#define BIG 2
29b0f896 868#define BIG16 (BIG | CODE16)
252b5132
RH
869
870#ifndef INLINE
871#ifdef __GNUC__
872#define INLINE __inline__
873#else
874#define INLINE
875#endif
876#endif
877
fddf5b5b
AM
878#define ENCODE_RELAX_STATE(type, size) \
879 ((relax_substateT) (((type) << 2) | (size)))
880#define TYPE_FROM_RELAX_STATE(s) \
881 ((s) >> 2)
882#define DISP_SIZE_FROM_RELAX_STATE(s) \
883 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
884
885/* This table is used by relax_frag to promote short jumps to long
886 ones where necessary. SMALL (short) jumps may be promoted to BIG
887 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
888 don't allow a short jump in a 32 bit code segment to be promoted to
889 a 16 bit offset jump because it's slower (requires data size
890 prefix), and doesn't work, unless the destination is in the bottom
891 64k of the code segment (The top 16 bits of eip are zeroed). */
892
893const relax_typeS md_relax_table[] =
894{
24eab124
AM
895 /* The fields are:
896 1) most positive reach of this state,
897 2) most negative reach of this state,
93c2a809 898 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 899 4) which index into the table to try if we can't fit into this one. */
252b5132 900
fddf5b5b 901 /* UNCOND_JUMP states. */
93c2a809
AM
902 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
903 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
904 /* dword jmp adds 4 bytes to frag:
905 0 extra opcode bytes, 4 displacement bytes. */
252b5132 906 {0, 0, 4, 0},
93c2a809
AM
907 /* word jmp adds 2 byte2 to frag:
908 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
909 {0, 0, 2, 0},
910
93c2a809
AM
911 /* COND_JUMP states. */
912 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
913 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
914 /* dword conditionals adds 5 bytes to frag:
915 1 extra opcode byte, 4 displacement bytes. */
916 {0, 0, 5, 0},
fddf5b5b 917 /* word conditionals add 3 bytes to frag:
93c2a809
AM
918 1 extra opcode byte, 2 displacement bytes. */
919 {0, 0, 3, 0},
920
921 /* COND_JUMP86 states. */
922 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
923 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
924 /* dword conditionals adds 5 bytes to frag:
925 1 extra opcode byte, 4 displacement bytes. */
926 {0, 0, 5, 0},
927 /* word conditionals add 4 bytes to frag:
928 1 displacement byte and a 3 byte long branch insn. */
929 {0, 0, 4, 0}
252b5132
RH
930};
931
9103f4f4
L
932static const arch_entry cpu_arch[] =
933{
89507696
JB
934 /* Do not replace the first two entries - i386_target_format()
935 relies on them being there in this order. */
8a2c8fef 936 { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
293f5f65 937 CPU_GENERIC32_FLAGS, 0 },
8a2c8fef 938 { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
293f5f65 939 CPU_GENERIC64_FLAGS, 0 },
8a2c8fef 940 { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
293f5f65 941 CPU_NONE_FLAGS, 0 },
8a2c8fef 942 { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
293f5f65 943 CPU_I186_FLAGS, 0 },
8a2c8fef 944 { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
293f5f65 945 CPU_I286_FLAGS, 0 },
8a2c8fef 946 { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
293f5f65 947 CPU_I386_FLAGS, 0 },
8a2c8fef 948 { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
293f5f65 949 CPU_I486_FLAGS, 0 },
8a2c8fef 950 { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
293f5f65 951 CPU_I586_FLAGS, 0 },
8a2c8fef 952 { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
293f5f65 953 CPU_I686_FLAGS, 0 },
8a2c8fef 954 { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
293f5f65 955 CPU_I586_FLAGS, 0 },
8a2c8fef 956 { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
293f5f65 957 CPU_PENTIUMPRO_FLAGS, 0 },
8a2c8fef 958 { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
293f5f65 959 CPU_P2_FLAGS, 0 },
8a2c8fef 960 { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
293f5f65 961 CPU_P3_FLAGS, 0 },
8a2c8fef 962 { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
293f5f65 963 CPU_P4_FLAGS, 0 },
8a2c8fef 964 { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
293f5f65 965 CPU_CORE_FLAGS, 0 },
8a2c8fef 966 { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
293f5f65 967 CPU_NOCONA_FLAGS, 0 },
8a2c8fef 968 { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
293f5f65 969 CPU_CORE_FLAGS, 1 },
8a2c8fef 970 { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
293f5f65 971 CPU_CORE_FLAGS, 0 },
8a2c8fef 972 { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
293f5f65 973 CPU_CORE2_FLAGS, 1 },
8a2c8fef 974 { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
293f5f65 975 CPU_CORE2_FLAGS, 0 },
8a2c8fef 976 { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
293f5f65 977 CPU_COREI7_FLAGS, 0 },
8a2c8fef 978 { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
293f5f65 979 CPU_L1OM_FLAGS, 0 },
7a9068fe 980 { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
293f5f65 981 CPU_K1OM_FLAGS, 0 },
81486035 982 { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
293f5f65 983 CPU_IAMCU_FLAGS, 0 },
8a2c8fef 984 { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
293f5f65 985 CPU_K6_FLAGS, 0 },
8a2c8fef 986 { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
293f5f65 987 CPU_K6_2_FLAGS, 0 },
8a2c8fef 988 { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
293f5f65 989 CPU_ATHLON_FLAGS, 0 },
8a2c8fef 990 { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
293f5f65 991 CPU_K8_FLAGS, 1 },
8a2c8fef 992 { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
293f5f65 993 CPU_K8_FLAGS, 0 },
8a2c8fef 994 { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
293f5f65 995 CPU_K8_FLAGS, 0 },
8a2c8fef 996 { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
293f5f65 997 CPU_AMDFAM10_FLAGS, 0 },
8aedb9fe 998 { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
293f5f65 999 CPU_BDVER1_FLAGS, 0 },
8aedb9fe 1000 { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
293f5f65 1001 CPU_BDVER2_FLAGS, 0 },
5e5c50d3 1002 { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
293f5f65 1003 CPU_BDVER3_FLAGS, 0 },
c7b0bd56 1004 { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
293f5f65 1005 CPU_BDVER4_FLAGS, 0 },
029f3522 1006 { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
293f5f65 1007 CPU_ZNVER1_FLAGS, 0 },
a9660a6f
AP
1008 { STRING_COMMA_LEN ("znver2"), PROCESSOR_ZNVER,
1009 CPU_ZNVER2_FLAGS, 0 },
7b458c12 1010 { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
293f5f65 1011 CPU_BTVER1_FLAGS, 0 },
7b458c12 1012 { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
293f5f65 1013 CPU_BTVER2_FLAGS, 0 },
8a2c8fef 1014 { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
293f5f65 1015 CPU_8087_FLAGS, 0 },
8a2c8fef 1016 { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
293f5f65 1017 CPU_287_FLAGS, 0 },
8a2c8fef 1018 { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
293f5f65 1019 CPU_387_FLAGS, 0 },
1848e567
L
1020 { STRING_COMMA_LEN (".687"), PROCESSOR_UNKNOWN,
1021 CPU_687_FLAGS, 0 },
d871f3f4
L
1022 { STRING_COMMA_LEN (".cmov"), PROCESSOR_UNKNOWN,
1023 CPU_CMOV_FLAGS, 0 },
1024 { STRING_COMMA_LEN (".fxsr"), PROCESSOR_UNKNOWN,
1025 CPU_FXSR_FLAGS, 0 },
8a2c8fef 1026 { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
293f5f65 1027 CPU_MMX_FLAGS, 0 },
8a2c8fef 1028 { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
293f5f65 1029 CPU_SSE_FLAGS, 0 },
8a2c8fef 1030 { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
293f5f65 1031 CPU_SSE2_FLAGS, 0 },
8a2c8fef 1032 { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
293f5f65 1033 CPU_SSE3_FLAGS, 0 },
af5c13b0
L
1034 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
1035 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1036 { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
293f5f65 1037 CPU_SSSE3_FLAGS, 0 },
8a2c8fef 1038 { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
293f5f65 1039 CPU_SSE4_1_FLAGS, 0 },
8a2c8fef 1040 { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
293f5f65 1041 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1042 { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
293f5f65 1043 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1044 { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
293f5f65 1045 CPU_AVX_FLAGS, 0 },
6c30d220 1046 { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
293f5f65 1047 CPU_AVX2_FLAGS, 0 },
43234a1e 1048 { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
293f5f65 1049 CPU_AVX512F_FLAGS, 0 },
43234a1e 1050 { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
293f5f65 1051 CPU_AVX512CD_FLAGS, 0 },
43234a1e 1052 { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
293f5f65 1053 CPU_AVX512ER_FLAGS, 0 },
43234a1e 1054 { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
293f5f65 1055 CPU_AVX512PF_FLAGS, 0 },
1dfc6506 1056 { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
293f5f65 1057 CPU_AVX512DQ_FLAGS, 0 },
1dfc6506 1058 { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
293f5f65 1059 CPU_AVX512BW_FLAGS, 0 },
1dfc6506 1060 { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
293f5f65 1061 CPU_AVX512VL_FLAGS, 0 },
8a2c8fef 1062 { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
293f5f65 1063 CPU_VMX_FLAGS, 0 },
8729a6f6 1064 { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
293f5f65 1065 CPU_VMFUNC_FLAGS, 0 },
8a2c8fef 1066 { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
293f5f65 1067 CPU_SMX_FLAGS, 0 },
8a2c8fef 1068 { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
293f5f65 1069 CPU_XSAVE_FLAGS, 0 },
c7b8aa3a 1070 { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
293f5f65 1071 CPU_XSAVEOPT_FLAGS, 0 },
1dfc6506 1072 { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
293f5f65 1073 CPU_XSAVEC_FLAGS, 0 },
1dfc6506 1074 { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
293f5f65 1075 CPU_XSAVES_FLAGS, 0 },
8a2c8fef 1076 { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
293f5f65 1077 CPU_AES_FLAGS, 0 },
8a2c8fef 1078 { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
293f5f65 1079 CPU_PCLMUL_FLAGS, 0 },
8a2c8fef 1080 { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
293f5f65 1081 CPU_PCLMUL_FLAGS, 1 },
c7b8aa3a 1082 { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
293f5f65 1083 CPU_FSGSBASE_FLAGS, 0 },
c7b8aa3a 1084 { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
293f5f65 1085 CPU_RDRND_FLAGS, 0 },
c7b8aa3a 1086 { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
293f5f65 1087 CPU_F16C_FLAGS, 0 },
6c30d220 1088 { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
293f5f65 1089 CPU_BMI2_FLAGS, 0 },
8a2c8fef 1090 { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
293f5f65 1091 CPU_FMA_FLAGS, 0 },
8a2c8fef 1092 { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
293f5f65 1093 CPU_FMA4_FLAGS, 0 },
8a2c8fef 1094 { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
293f5f65 1095 CPU_XOP_FLAGS, 0 },
8a2c8fef 1096 { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
293f5f65 1097 CPU_LWP_FLAGS, 0 },
8a2c8fef 1098 { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
293f5f65 1099 CPU_MOVBE_FLAGS, 0 },
60aa667e 1100 { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
293f5f65 1101 CPU_CX16_FLAGS, 0 },
8a2c8fef 1102 { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
293f5f65 1103 CPU_EPT_FLAGS, 0 },
6c30d220 1104 { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
293f5f65 1105 CPU_LZCNT_FLAGS, 0 },
272a84b1
L
1106 { STRING_COMMA_LEN (".popcnt"), PROCESSOR_UNKNOWN,
1107 CPU_POPCNT_FLAGS, 0 },
42164a71 1108 { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
293f5f65 1109 CPU_HLE_FLAGS, 0 },
42164a71 1110 { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
293f5f65 1111 CPU_RTM_FLAGS, 0 },
6c30d220 1112 { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
293f5f65 1113 CPU_INVPCID_FLAGS, 0 },
8a2c8fef 1114 { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
293f5f65 1115 CPU_CLFLUSH_FLAGS, 0 },
22109423 1116 { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
293f5f65 1117 CPU_NOP_FLAGS, 0 },
8a2c8fef 1118 { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
293f5f65 1119 CPU_SYSCALL_FLAGS, 0 },
8a2c8fef 1120 { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
293f5f65 1121 CPU_RDTSCP_FLAGS, 0 },
8a2c8fef 1122 { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
293f5f65 1123 CPU_3DNOW_FLAGS, 0 },
8a2c8fef 1124 { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
293f5f65 1125 CPU_3DNOWA_FLAGS, 0 },
8a2c8fef 1126 { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
293f5f65 1127 CPU_PADLOCK_FLAGS, 0 },
8a2c8fef 1128 { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
293f5f65 1129 CPU_SVME_FLAGS, 1 },
8a2c8fef 1130 { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
293f5f65 1131 CPU_SVME_FLAGS, 0 },
8a2c8fef 1132 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
293f5f65 1133 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1134 { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
293f5f65 1135 CPU_ABM_FLAGS, 0 },
87973e9f 1136 { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
293f5f65 1137 CPU_BMI_FLAGS, 0 },
2a2a0f38 1138 { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
293f5f65 1139 CPU_TBM_FLAGS, 0 },
e2e1fcde 1140 { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
293f5f65 1141 CPU_ADX_FLAGS, 0 },
e2e1fcde 1142 { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
293f5f65 1143 CPU_RDSEED_FLAGS, 0 },
e2e1fcde 1144 { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
293f5f65 1145 CPU_PRFCHW_FLAGS, 0 },
5c111e37 1146 { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
293f5f65 1147 CPU_SMAP_FLAGS, 0 },
7e8b059b 1148 { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
293f5f65 1149 CPU_MPX_FLAGS, 0 },
a0046408 1150 { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
293f5f65 1151 CPU_SHA_FLAGS, 0 },
963f3586 1152 { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
293f5f65 1153 CPU_CLFLUSHOPT_FLAGS, 0 },
dcf893b5 1154 { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
293f5f65 1155 CPU_PREFETCHWT1_FLAGS, 0 },
2cf200a4 1156 { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
293f5f65 1157 CPU_SE1_FLAGS, 0 },
c5e7287a 1158 { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
293f5f65 1159 CPU_CLWB_FLAGS, 0 },
2cc1b5aa 1160 { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
293f5f65 1161 CPU_AVX512IFMA_FLAGS, 0 },
14f195c9 1162 { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
293f5f65 1163 CPU_AVX512VBMI_FLAGS, 0 },
920d2ddc
IT
1164 { STRING_COMMA_LEN (".avx512_4fmaps"), PROCESSOR_UNKNOWN,
1165 CPU_AVX512_4FMAPS_FLAGS, 0 },
47acf0bd
IT
1166 { STRING_COMMA_LEN (".avx512_4vnniw"), PROCESSOR_UNKNOWN,
1167 CPU_AVX512_4VNNIW_FLAGS, 0 },
620214f7
IT
1168 { STRING_COMMA_LEN (".avx512_vpopcntdq"), PROCESSOR_UNKNOWN,
1169 CPU_AVX512_VPOPCNTDQ_FLAGS, 0 },
53467f57
IT
1170 { STRING_COMMA_LEN (".avx512_vbmi2"), PROCESSOR_UNKNOWN,
1171 CPU_AVX512_VBMI2_FLAGS, 0 },
8cfcb765
IT
1172 { STRING_COMMA_LEN (".avx512_vnni"), PROCESSOR_UNKNOWN,
1173 CPU_AVX512_VNNI_FLAGS, 0 },
ee6872be
IT
1174 { STRING_COMMA_LEN (".avx512_bitalg"), PROCESSOR_UNKNOWN,
1175 CPU_AVX512_BITALG_FLAGS, 0 },
029f3522 1176 { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
293f5f65 1177 CPU_CLZERO_FLAGS, 0 },
9916071f 1178 { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
293f5f65 1179 CPU_MWAITX_FLAGS, 0 },
8eab4136 1180 { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
293f5f65 1181 CPU_OSPKE_FLAGS, 0 },
8bc52696 1182 { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
293f5f65 1183 CPU_RDPID_FLAGS, 0 },
6b40c462
L
1184 { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
1185 CPU_PTWRITE_FLAGS, 0 },
d777820b
IT
1186 { STRING_COMMA_LEN (".ibt"), PROCESSOR_UNKNOWN,
1187 CPU_IBT_FLAGS, 0 },
1188 { STRING_COMMA_LEN (".shstk"), PROCESSOR_UNKNOWN,
1189 CPU_SHSTK_FLAGS, 0 },
48521003
IT
1190 { STRING_COMMA_LEN (".gfni"), PROCESSOR_UNKNOWN,
1191 CPU_GFNI_FLAGS, 0 },
8dcf1fad
IT
1192 { STRING_COMMA_LEN (".vaes"), PROCESSOR_UNKNOWN,
1193 CPU_VAES_FLAGS, 0 },
ff1982d5
IT
1194 { STRING_COMMA_LEN (".vpclmulqdq"), PROCESSOR_UNKNOWN,
1195 CPU_VPCLMULQDQ_FLAGS, 0 },
3233d7d0
IT
1196 { STRING_COMMA_LEN (".wbnoinvd"), PROCESSOR_UNKNOWN,
1197 CPU_WBNOINVD_FLAGS, 0 },
be3a8dca
IT
1198 { STRING_COMMA_LEN (".pconfig"), PROCESSOR_UNKNOWN,
1199 CPU_PCONFIG_FLAGS, 0 },
de89d0a3
IT
1200 { STRING_COMMA_LEN (".waitpkg"), PROCESSOR_UNKNOWN,
1201 CPU_WAITPKG_FLAGS, 0 },
c48935d7
IT
1202 { STRING_COMMA_LEN (".cldemote"), PROCESSOR_UNKNOWN,
1203 CPU_CLDEMOTE_FLAGS, 0 },
c0a30a9f
L
1204 { STRING_COMMA_LEN (".movdiri"), PROCESSOR_UNKNOWN,
1205 CPU_MOVDIRI_FLAGS, 0 },
1206 { STRING_COMMA_LEN (".movdir64b"), PROCESSOR_UNKNOWN,
1207 CPU_MOVDIR64B_FLAGS, 0 },
d6aab7a1
XG
1208 { STRING_COMMA_LEN (".avx512_bf16"), PROCESSOR_UNKNOWN,
1209 CPU_AVX512_BF16_FLAGS, 0 },
9186c494
L
1210 { STRING_COMMA_LEN (".avx512_vp2intersect"), PROCESSOR_UNKNOWN,
1211 CPU_AVX512_VP2INTERSECT_FLAGS, 0 },
dd455cf5
L
1212 { STRING_COMMA_LEN (".enqcmd"), PROCESSOR_UNKNOWN,
1213 CPU_ENQCMD_FLAGS, 0 },
4b27d27c
L
1214 { STRING_COMMA_LEN (".serialize"), PROCESSOR_UNKNOWN,
1215 CPU_SERIALIZE_FLAGS, 0 },
142861df
JB
1216 { STRING_COMMA_LEN (".rdpru"), PROCESSOR_UNKNOWN,
1217 CPU_RDPRU_FLAGS, 0 },
1218 { STRING_COMMA_LEN (".mcommit"), PROCESSOR_UNKNOWN,
1219 CPU_MCOMMIT_FLAGS, 0 },
a847e322
JB
1220 { STRING_COMMA_LEN (".sev_es"), PROCESSOR_UNKNOWN,
1221 CPU_SEV_ES_FLAGS, 0 },
bb651e8b
CL
1222 { STRING_COMMA_LEN (".tsxldtrk"), PROCESSOR_UNKNOWN,
1223 CPU_TSXLDTRK_FLAGS, 0 },
293f5f65
L
1224};
1225
1226static const noarch_entry cpu_noarch[] =
1227{
1228 { STRING_COMMA_LEN ("no87"), CPU_ANY_X87_FLAGS },
1848e567
L
1229 { STRING_COMMA_LEN ("no287"), CPU_ANY_287_FLAGS },
1230 { STRING_COMMA_LEN ("no387"), CPU_ANY_387_FLAGS },
1231 { STRING_COMMA_LEN ("no687"), CPU_ANY_687_FLAGS },
d871f3f4
L
1232 { STRING_COMMA_LEN ("nocmov"), CPU_ANY_CMOV_FLAGS },
1233 { STRING_COMMA_LEN ("nofxsr"), CPU_ANY_FXSR_FLAGS },
293f5f65
L
1234 { STRING_COMMA_LEN ("nommx"), CPU_ANY_MMX_FLAGS },
1235 { STRING_COMMA_LEN ("nosse"), CPU_ANY_SSE_FLAGS },
1848e567
L
1236 { STRING_COMMA_LEN ("nosse2"), CPU_ANY_SSE2_FLAGS },
1237 { STRING_COMMA_LEN ("nosse3"), CPU_ANY_SSE3_FLAGS },
af5c13b0 1238 { STRING_COMMA_LEN ("nosse4a"), CPU_ANY_SSE4A_FLAGS },
1848e567
L
1239 { STRING_COMMA_LEN ("nossse3"), CPU_ANY_SSSE3_FLAGS },
1240 { STRING_COMMA_LEN ("nosse4.1"), CPU_ANY_SSE4_1_FLAGS },
1241 { STRING_COMMA_LEN ("nosse4.2"), CPU_ANY_SSE4_2_FLAGS },
af5c13b0 1242 { STRING_COMMA_LEN ("nosse4"), CPU_ANY_SSE4_1_FLAGS },
293f5f65 1243 { STRING_COMMA_LEN ("noavx"), CPU_ANY_AVX_FLAGS },
1848e567 1244 { STRING_COMMA_LEN ("noavx2"), CPU_ANY_AVX2_FLAGS },
144b71e2
L
1245 { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
1246 { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
1247 { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
1248 { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
1249 { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
1250 { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
1251 { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
1252 { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
1253 { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
920d2ddc 1254 { STRING_COMMA_LEN ("noavx512_4fmaps"), CPU_ANY_AVX512_4FMAPS_FLAGS },
47acf0bd 1255 { STRING_COMMA_LEN ("noavx512_4vnniw"), CPU_ANY_AVX512_4VNNIW_FLAGS },
620214f7 1256 { STRING_COMMA_LEN ("noavx512_vpopcntdq"), CPU_ANY_AVX512_VPOPCNTDQ_FLAGS },
53467f57 1257 { STRING_COMMA_LEN ("noavx512_vbmi2"), CPU_ANY_AVX512_VBMI2_FLAGS },
8cfcb765 1258 { STRING_COMMA_LEN ("noavx512_vnni"), CPU_ANY_AVX512_VNNI_FLAGS },
ee6872be 1259 { STRING_COMMA_LEN ("noavx512_bitalg"), CPU_ANY_AVX512_BITALG_FLAGS },
d777820b
IT
1260 { STRING_COMMA_LEN ("noibt"), CPU_ANY_IBT_FLAGS },
1261 { STRING_COMMA_LEN ("noshstk"), CPU_ANY_SHSTK_FLAGS },
c0a30a9f
L
1262 { STRING_COMMA_LEN ("nomovdiri"), CPU_ANY_MOVDIRI_FLAGS },
1263 { STRING_COMMA_LEN ("nomovdir64b"), CPU_ANY_MOVDIR64B_FLAGS },
d6aab7a1 1264 { STRING_COMMA_LEN ("noavx512_bf16"), CPU_ANY_AVX512_BF16_FLAGS },
9186c494 1265 { STRING_COMMA_LEN ("noavx512_vp2intersect"), CPU_ANY_SHSTK_FLAGS },
dd455cf5 1266 { STRING_COMMA_LEN ("noenqcmd"), CPU_ANY_ENQCMD_FLAGS },
4b27d27c 1267 { STRING_COMMA_LEN ("noserialize"), CPU_ANY_SERIALIZE_FLAGS },
bb651e8b 1268 { STRING_COMMA_LEN ("notsxldtrk"), CPU_ANY_TSXLDTRK_FLAGS },
e413e4e9
AM
1269};
1270
704209c0 1271#ifdef I386COFF
a6c24e68
NC
1272/* Like s_lcomm_internal in gas/read.c but the alignment string
1273 is allowed to be optional. */
1274
1275static symbolS *
1276pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1277{
1278 addressT align = 0;
1279
1280 SKIP_WHITESPACE ();
1281
7ab9ffdd 1282 if (needs_align
a6c24e68
NC
1283 && *input_line_pointer == ',')
1284 {
1285 align = parse_align (needs_align - 1);
7ab9ffdd 1286
a6c24e68
NC
1287 if (align == (addressT) -1)
1288 return NULL;
1289 }
1290 else
1291 {
1292 if (size >= 8)
1293 align = 3;
1294 else if (size >= 4)
1295 align = 2;
1296 else if (size >= 2)
1297 align = 1;
1298 else
1299 align = 0;
1300 }
1301
1302 bss_alloc (symbolP, size, align);
1303 return symbolP;
1304}
1305
704209c0 1306static void
a6c24e68
NC
1307pe_lcomm (int needs_align)
1308{
1309 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1310}
704209c0 1311#endif
a6c24e68 1312
29b0f896
AM
1313const pseudo_typeS md_pseudo_table[] =
1314{
1315#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1316 {"align", s_align_bytes, 0},
1317#else
1318 {"align", s_align_ptwo, 0},
1319#endif
1320 {"arch", set_cpu_arch, 0},
1321#ifndef I386COFF
1322 {"bss", s_bss, 0},
a6c24e68
NC
1323#else
1324 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1325#endif
1326 {"ffloat", float_cons, 'f'},
1327 {"dfloat", float_cons, 'd'},
1328 {"tfloat", float_cons, 'x'},
1329 {"value", cons, 2},
d182319b 1330 {"slong", signed_cons, 4},
29b0f896
AM
1331 {"noopt", s_ignore, 0},
1332 {"optim", s_ignore, 0},
1333 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1334 {"code16", set_code_flag, CODE_16BIT},
1335 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1336#ifdef BFD64
29b0f896 1337 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1338#endif
29b0f896
AM
1339 {"intel_syntax", set_intel_syntax, 1},
1340 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1341 {"intel_mnemonic", set_intel_mnemonic, 1},
1342 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1343 {"allow_index_reg", set_allow_index_reg, 1},
1344 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1345 {"sse_check", set_check, 0},
1346 {"operand_check", set_check, 1},
3b22753a
L
1347#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1348 {"largecomm", handle_large_common, 0},
07a53e5c 1349#else
68d20676 1350 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1351 {"loc", dwarf2_directive_loc, 0},
1352 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1353#endif
6482c264
NC
1354#ifdef TE_PE
1355 {"secrel32", pe_directive_secrel, 0},
1356#endif
29b0f896
AM
1357 {0, 0, 0}
1358};
1359
1360/* For interface with expression (). */
1361extern char *input_line_pointer;
1362
1363/* Hash table for instruction mnemonic lookup. */
1364static struct hash_control *op_hash;
1365
1366/* Hash table for register lookup. */
1367static struct hash_control *reg_hash;
1368\f
ce8a8b2f
AM
1369 /* Various efficient no-op patterns for aligning code labels.
1370 Note: Don't try to assemble the instructions in the comments.
1371 0L and 0w are not legal. */
62a02d25
L
1372static const unsigned char f32_1[] =
1373 {0x90}; /* nop */
1374static const unsigned char f32_2[] =
1375 {0x66,0x90}; /* xchg %ax,%ax */
1376static const unsigned char f32_3[] =
1377 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1378static const unsigned char f32_4[] =
1379 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
62a02d25
L
1380static const unsigned char f32_6[] =
1381 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1382static const unsigned char f32_7[] =
1383 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
62a02d25 1384static const unsigned char f16_3[] =
3ae729d5 1385 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
62a02d25 1386static const unsigned char f16_4[] =
3ae729d5
L
1387 {0x8d,0xb4,0x00,0x00}; /* lea 0W(%si),%si */
1388static const unsigned char jump_disp8[] =
1389 {0xeb}; /* jmp disp8 */
1390static const unsigned char jump32_disp32[] =
1391 {0xe9}; /* jmp disp32 */
1392static const unsigned char jump16_disp32[] =
1393 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1394/* 32-bit NOPs patterns. */
1395static const unsigned char *const f32_patt[] = {
3ae729d5 1396 f32_1, f32_2, f32_3, f32_4, NULL, f32_6, f32_7
62a02d25
L
1397};
1398/* 16-bit NOPs patterns. */
1399static const unsigned char *const f16_patt[] = {
3ae729d5 1400 f32_1, f32_2, f16_3, f16_4
62a02d25
L
1401};
1402/* nopl (%[re]ax) */
1403static const unsigned char alt_3[] =
1404 {0x0f,0x1f,0x00};
1405/* nopl 0(%[re]ax) */
1406static const unsigned char alt_4[] =
1407 {0x0f,0x1f,0x40,0x00};
1408/* nopl 0(%[re]ax,%[re]ax,1) */
1409static const unsigned char alt_5[] =
1410 {0x0f,0x1f,0x44,0x00,0x00};
1411/* nopw 0(%[re]ax,%[re]ax,1) */
1412static const unsigned char alt_6[] =
1413 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1414/* nopl 0L(%[re]ax) */
1415static const unsigned char alt_7[] =
1416 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1417/* nopl 0L(%[re]ax,%[re]ax,1) */
1418static const unsigned char alt_8[] =
1419 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1420/* nopw 0L(%[re]ax,%[re]ax,1) */
1421static const unsigned char alt_9[] =
1422 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1423/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1424static const unsigned char alt_10[] =
1425 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
3ae729d5
L
1426/* data16 nopw %cs:0L(%eax,%eax,1) */
1427static const unsigned char alt_11[] =
1428 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1429/* 32-bit and 64-bit NOPs patterns. */
1430static const unsigned char *const alt_patt[] = {
1431 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1432 alt_9, alt_10, alt_11
62a02d25
L
1433};
1434
1435/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1436 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1437
1438static void
1439i386_output_nops (char *where, const unsigned char *const *patt,
1440 int count, int max_single_nop_size)
1441
1442{
3ae729d5
L
1443 /* Place the longer NOP first. */
1444 int last;
1445 int offset;
3076e594
NC
1446 const unsigned char *nops;
1447
1448 if (max_single_nop_size < 1)
1449 {
1450 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1451 max_single_nop_size);
1452 return;
1453 }
1454
1455 nops = patt[max_single_nop_size - 1];
3ae729d5
L
1456
1457 /* Use the smaller one if the requsted one isn't available. */
1458 if (nops == NULL)
62a02d25 1459 {
3ae729d5
L
1460 max_single_nop_size--;
1461 nops = patt[max_single_nop_size - 1];
62a02d25
L
1462 }
1463
3ae729d5
L
1464 last = count % max_single_nop_size;
1465
1466 count -= last;
1467 for (offset = 0; offset < count; offset += max_single_nop_size)
1468 memcpy (where + offset, nops, max_single_nop_size);
1469
1470 if (last)
1471 {
1472 nops = patt[last - 1];
1473 if (nops == NULL)
1474 {
1475 /* Use the smaller one plus one-byte NOP if the needed one
1476 isn't available. */
1477 last--;
1478 nops = patt[last - 1];
1479 memcpy (where + offset, nops, last);
1480 where[offset + last] = *patt[0];
1481 }
1482 else
1483 memcpy (where + offset, nops, last);
1484 }
62a02d25
L
1485}
1486
3ae729d5
L
1487static INLINE int
1488fits_in_imm7 (offsetT num)
1489{
1490 return (num & 0x7f) == num;
1491}
1492
1493static INLINE int
1494fits_in_imm31 (offsetT num)
1495{
1496 return (num & 0x7fffffff) == num;
1497}
62a02d25
L
1498
1499/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1500 single NOP instruction LIMIT. */
1501
1502void
3ae729d5 1503i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1504{
3ae729d5 1505 const unsigned char *const *patt = NULL;
62a02d25 1506 int max_single_nop_size;
3ae729d5
L
1507 /* Maximum number of NOPs before switching to jump over NOPs. */
1508 int max_number_of_nops;
62a02d25 1509
3ae729d5 1510 switch (fragP->fr_type)
62a02d25 1511 {
3ae729d5
L
1512 case rs_fill_nop:
1513 case rs_align_code:
1514 break;
e379e5f3
L
1515 case rs_machine_dependent:
1516 /* Allow NOP padding for jumps and calls. */
1517 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
1518 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
1519 break;
1520 /* Fall through. */
3ae729d5 1521 default:
62a02d25
L
1522 return;
1523 }
1524
ccc9c027
L
1525 /* We need to decide which NOP sequence to use for 32bit and
1526 64bit. When -mtune= is used:
4eed87de 1527
76bc74dc
L
1528 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
1529 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1530 2. For the rest, alt_patt will be used.
1531
1532 When -mtune= isn't used, alt_patt will be used if
22109423 1533 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will
76bc74dc 1534 be used.
ccc9c027
L
1535
1536 When -march= or .arch is used, we can't use anything beyond
1537 cpu_arch_isa_flags. */
1538
1539 if (flag_code == CODE_16BIT)
1540 {
3ae729d5
L
1541 patt = f16_patt;
1542 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1543 /* Limit number of NOPs to 2 in 16-bit mode. */
1544 max_number_of_nops = 2;
252b5132 1545 }
33fef721 1546 else
ccc9c027 1547 {
fbf3f584 1548 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027
L
1549 {
1550 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
1551 switch (cpu_arch_tune)
1552 {
1553 case PROCESSOR_UNKNOWN:
1554 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423
L
1555 optimize with nops. */
1556 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1557 patt = alt_patt;
ccc9c027
L
1558 else
1559 patt = f32_patt;
1560 break;
ccc9c027
L
1561 case PROCESSOR_PENTIUM4:
1562 case PROCESSOR_NOCONA:
ef05d495 1563 case PROCESSOR_CORE:
76bc74dc 1564 case PROCESSOR_CORE2:
bd5295b2 1565 case PROCESSOR_COREI7:
3632d14b 1566 case PROCESSOR_L1OM:
7a9068fe 1567 case PROCESSOR_K1OM:
76bc74dc 1568 case PROCESSOR_GENERIC64:
ccc9c027
L
1569 case PROCESSOR_K6:
1570 case PROCESSOR_ATHLON:
1571 case PROCESSOR_K8:
4eed87de 1572 case PROCESSOR_AMDFAM10:
8aedb9fe 1573 case PROCESSOR_BD:
029f3522 1574 case PROCESSOR_ZNVER:
7b458c12 1575 case PROCESSOR_BT:
80b8656c 1576 patt = alt_patt;
ccc9c027 1577 break;
76bc74dc 1578 case PROCESSOR_I386:
ccc9c027
L
1579 case PROCESSOR_I486:
1580 case PROCESSOR_PENTIUM:
2dde1948 1581 case PROCESSOR_PENTIUMPRO:
81486035 1582 case PROCESSOR_IAMCU:
ccc9c027
L
1583 case PROCESSOR_GENERIC32:
1584 patt = f32_patt;
1585 break;
4eed87de 1586 }
ccc9c027
L
1587 }
1588 else
1589 {
fbf3f584 1590 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1591 {
1592 case PROCESSOR_UNKNOWN:
e6a14101 1593 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1594 PROCESSOR_UNKNOWN. */
1595 abort ();
1596 break;
1597
76bc74dc 1598 case PROCESSOR_I386:
ccc9c027
L
1599 case PROCESSOR_I486:
1600 case PROCESSOR_PENTIUM:
81486035 1601 case PROCESSOR_IAMCU:
ccc9c027
L
1602 case PROCESSOR_K6:
1603 case PROCESSOR_ATHLON:
1604 case PROCESSOR_K8:
4eed87de 1605 case PROCESSOR_AMDFAM10:
8aedb9fe 1606 case PROCESSOR_BD:
029f3522 1607 case PROCESSOR_ZNVER:
7b458c12 1608 case PROCESSOR_BT:
ccc9c027
L
1609 case PROCESSOR_GENERIC32:
1610 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423
L
1611 with nops. */
1612 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1613 patt = alt_patt;
ccc9c027
L
1614 else
1615 patt = f32_patt;
1616 break;
76bc74dc
L
1617 case PROCESSOR_PENTIUMPRO:
1618 case PROCESSOR_PENTIUM4:
1619 case PROCESSOR_NOCONA:
1620 case PROCESSOR_CORE:
ef05d495 1621 case PROCESSOR_CORE2:
bd5295b2 1622 case PROCESSOR_COREI7:
3632d14b 1623 case PROCESSOR_L1OM:
7a9068fe 1624 case PROCESSOR_K1OM:
22109423 1625 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1626 patt = alt_patt;
ccc9c027
L
1627 else
1628 patt = f32_patt;
1629 break;
1630 case PROCESSOR_GENERIC64:
80b8656c 1631 patt = alt_patt;
ccc9c027 1632 break;
4eed87de 1633 }
ccc9c027
L
1634 }
1635
76bc74dc
L
1636 if (patt == f32_patt)
1637 {
3ae729d5
L
1638 max_single_nop_size = sizeof (f32_patt) / sizeof (f32_patt[0]);
1639 /* Limit number of NOPs to 2 for older processors. */
1640 max_number_of_nops = 2;
76bc74dc
L
1641 }
1642 else
1643 {
3ae729d5
L
1644 max_single_nop_size = sizeof (alt_patt) / sizeof (alt_patt[0]);
1645 /* Limit number of NOPs to 7 for newer processors. */
1646 max_number_of_nops = 7;
1647 }
1648 }
1649
1650 if (limit == 0)
1651 limit = max_single_nop_size;
1652
1653 if (fragP->fr_type == rs_fill_nop)
1654 {
1655 /* Output NOPs for .nop directive. */
1656 if (limit > max_single_nop_size)
1657 {
1658 as_bad_where (fragP->fr_file, fragP->fr_line,
1659 _("invalid single nop size: %d "
1660 "(expect within [0, %d])"),
1661 limit, max_single_nop_size);
1662 return;
1663 }
1664 }
e379e5f3 1665 else if (fragP->fr_type != rs_machine_dependent)
3ae729d5
L
1666 fragP->fr_var = count;
1667
1668 if ((count / max_single_nop_size) > max_number_of_nops)
1669 {
1670 /* Generate jump over NOPs. */
1671 offsetT disp = count - 2;
1672 if (fits_in_imm7 (disp))
1673 {
1674 /* Use "jmp disp8" if possible. */
1675 count = disp;
1676 where[0] = jump_disp8[0];
1677 where[1] = count;
1678 where += 2;
1679 }
1680 else
1681 {
1682 unsigned int size_of_jump;
1683
1684 if (flag_code == CODE_16BIT)
1685 {
1686 where[0] = jump16_disp32[0];
1687 where[1] = jump16_disp32[1];
1688 size_of_jump = 2;
1689 }
1690 else
1691 {
1692 where[0] = jump32_disp32[0];
1693 size_of_jump = 1;
1694 }
1695
1696 count -= size_of_jump + 4;
1697 if (!fits_in_imm31 (count))
1698 {
1699 as_bad_where (fragP->fr_file, fragP->fr_line,
1700 _("jump over nop padding out of range"));
1701 return;
1702 }
1703
1704 md_number_to_chars (where + size_of_jump, count, 4);
1705 where += size_of_jump + 4;
76bc74dc 1706 }
ccc9c027 1707 }
3ae729d5
L
1708
1709 /* Generate multiple NOPs. */
1710 i386_output_nops (where, patt, count, limit);
252b5132
RH
1711}
1712
c6fb90c8 1713static INLINE int
0dfbf9d7 1714operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1715{
0dfbf9d7 1716 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1717 {
1718 case 3:
0dfbf9d7 1719 if (x->array[2])
c6fb90c8 1720 return 0;
1a0670f3 1721 /* Fall through. */
c6fb90c8 1722 case 2:
0dfbf9d7 1723 if (x->array[1])
c6fb90c8 1724 return 0;
1a0670f3 1725 /* Fall through. */
c6fb90c8 1726 case 1:
0dfbf9d7 1727 return !x->array[0];
c6fb90c8
L
1728 default:
1729 abort ();
1730 }
40fb9820
L
1731}
1732
c6fb90c8 1733static INLINE void
0dfbf9d7 1734operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1735{
0dfbf9d7 1736 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1737 {
1738 case 3:
0dfbf9d7 1739 x->array[2] = v;
1a0670f3 1740 /* Fall through. */
c6fb90c8 1741 case 2:
0dfbf9d7 1742 x->array[1] = v;
1a0670f3 1743 /* Fall through. */
c6fb90c8 1744 case 1:
0dfbf9d7 1745 x->array[0] = v;
1a0670f3 1746 /* Fall through. */
c6fb90c8
L
1747 break;
1748 default:
1749 abort ();
1750 }
bab6aec1
JB
1751
1752 x->bitfield.class = ClassNone;
75e5731b 1753 x->bitfield.instance = InstanceNone;
c6fb90c8 1754}
40fb9820 1755
c6fb90c8 1756static INLINE int
0dfbf9d7
L
1757operand_type_equal (const union i386_operand_type *x,
1758 const union i386_operand_type *y)
c6fb90c8 1759{
0dfbf9d7 1760 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1761 {
1762 case 3:
0dfbf9d7 1763 if (x->array[2] != y->array[2])
c6fb90c8 1764 return 0;
1a0670f3 1765 /* Fall through. */
c6fb90c8 1766 case 2:
0dfbf9d7 1767 if (x->array[1] != y->array[1])
c6fb90c8 1768 return 0;
1a0670f3 1769 /* Fall through. */
c6fb90c8 1770 case 1:
0dfbf9d7 1771 return x->array[0] == y->array[0];
c6fb90c8
L
1772 break;
1773 default:
1774 abort ();
1775 }
1776}
40fb9820 1777
0dfbf9d7
L
1778static INLINE int
1779cpu_flags_all_zero (const union i386_cpu_flags *x)
1780{
1781 switch (ARRAY_SIZE(x->array))
1782 {
53467f57
IT
1783 case 4:
1784 if (x->array[3])
1785 return 0;
1786 /* Fall through. */
0dfbf9d7
L
1787 case 3:
1788 if (x->array[2])
1789 return 0;
1a0670f3 1790 /* Fall through. */
0dfbf9d7
L
1791 case 2:
1792 if (x->array[1])
1793 return 0;
1a0670f3 1794 /* Fall through. */
0dfbf9d7
L
1795 case 1:
1796 return !x->array[0];
1797 default:
1798 abort ();
1799 }
1800}
1801
0dfbf9d7
L
1802static INLINE int
1803cpu_flags_equal (const union i386_cpu_flags *x,
1804 const union i386_cpu_flags *y)
1805{
1806 switch (ARRAY_SIZE(x->array))
1807 {
53467f57
IT
1808 case 4:
1809 if (x->array[3] != y->array[3])
1810 return 0;
1811 /* Fall through. */
0dfbf9d7
L
1812 case 3:
1813 if (x->array[2] != y->array[2])
1814 return 0;
1a0670f3 1815 /* Fall through. */
0dfbf9d7
L
1816 case 2:
1817 if (x->array[1] != y->array[1])
1818 return 0;
1a0670f3 1819 /* Fall through. */
0dfbf9d7
L
1820 case 1:
1821 return x->array[0] == y->array[0];
1822 break;
1823 default:
1824 abort ();
1825 }
1826}
c6fb90c8
L
1827
1828static INLINE int
1829cpu_flags_check_cpu64 (i386_cpu_flags f)
1830{
1831 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
1832 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
1833}
1834
c6fb90c8
L
1835static INLINE i386_cpu_flags
1836cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1837{
c6fb90c8
L
1838 switch (ARRAY_SIZE (x.array))
1839 {
53467f57
IT
1840 case 4:
1841 x.array [3] &= y.array [3];
1842 /* Fall through. */
c6fb90c8
L
1843 case 3:
1844 x.array [2] &= y.array [2];
1a0670f3 1845 /* Fall through. */
c6fb90c8
L
1846 case 2:
1847 x.array [1] &= y.array [1];
1a0670f3 1848 /* Fall through. */
c6fb90c8
L
1849 case 1:
1850 x.array [0] &= y.array [0];
1851 break;
1852 default:
1853 abort ();
1854 }
1855 return x;
1856}
40fb9820 1857
c6fb90c8
L
1858static INLINE i386_cpu_flags
1859cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1860{
c6fb90c8 1861 switch (ARRAY_SIZE (x.array))
40fb9820 1862 {
53467f57
IT
1863 case 4:
1864 x.array [3] |= y.array [3];
1865 /* Fall through. */
c6fb90c8
L
1866 case 3:
1867 x.array [2] |= y.array [2];
1a0670f3 1868 /* Fall through. */
c6fb90c8
L
1869 case 2:
1870 x.array [1] |= y.array [1];
1a0670f3 1871 /* Fall through. */
c6fb90c8
L
1872 case 1:
1873 x.array [0] |= y.array [0];
40fb9820
L
1874 break;
1875 default:
1876 abort ();
1877 }
40fb9820
L
1878 return x;
1879}
1880
309d3373
JB
1881static INLINE i386_cpu_flags
1882cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1883{
1884 switch (ARRAY_SIZE (x.array))
1885 {
53467f57
IT
1886 case 4:
1887 x.array [3] &= ~y.array [3];
1888 /* Fall through. */
309d3373
JB
1889 case 3:
1890 x.array [2] &= ~y.array [2];
1a0670f3 1891 /* Fall through. */
309d3373
JB
1892 case 2:
1893 x.array [1] &= ~y.array [1];
1a0670f3 1894 /* Fall through. */
309d3373
JB
1895 case 1:
1896 x.array [0] &= ~y.array [0];
1897 break;
1898 default:
1899 abort ();
1900 }
1901 return x;
1902}
1903
6c0946d0
JB
1904static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
1905
c0f3af97
L
1906#define CPU_FLAGS_ARCH_MATCH 0x1
1907#define CPU_FLAGS_64BIT_MATCH 0x2
1908
c0f3af97 1909#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1910 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1911
1912/* Return CPU flags match bits. */
3629bb00 1913
40fb9820 1914static int
d3ce72d0 1915cpu_flags_match (const insn_template *t)
40fb9820 1916{
c0f3af97
L
1917 i386_cpu_flags x = t->cpu_flags;
1918 int match = cpu_flags_check_cpu64 (x) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820
L
1919
1920 x.bitfield.cpu64 = 0;
1921 x.bitfield.cpuno64 = 0;
1922
0dfbf9d7 1923 if (cpu_flags_all_zero (&x))
c0f3af97
L
1924 {
1925 /* This instruction is available on all archs. */
db12e14e 1926 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1927 }
3629bb00
L
1928 else
1929 {
c0f3af97 1930 /* This instruction is available only on some archs. */
3629bb00
L
1931 i386_cpu_flags cpu = cpu_arch_flags;
1932
ab592e75
JB
1933 /* AVX512VL is no standalone feature - match it and then strip it. */
1934 if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl)
1935 return match;
1936 x.bitfield.cpuavx512vl = 0;
1937
3629bb00 1938 cpu = cpu_flags_and (x, cpu);
c0f3af97
L
1939 if (!cpu_flags_all_zero (&cpu))
1940 {
a5ff0eb2
L
1941 if (x.bitfield.cpuavx)
1942 {
929f69fa 1943 /* We need to check a few extra flags with AVX. */
b9d49817
JB
1944 if (cpu.bitfield.cpuavx
1945 && (!t->opcode_modifier.sse2avx || sse2avx)
1946 && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
929f69fa 1947 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
b9d49817
JB
1948 && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
1949 match |= CPU_FLAGS_ARCH_MATCH;
a5ff0eb2 1950 }
929f69fa
JB
1951 else if (x.bitfield.cpuavx512f)
1952 {
1953 /* We need to check a few extra flags with AVX512F. */
1954 if (cpu.bitfield.cpuavx512f
1955 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
1956 && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes)
1957 && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq))
1958 match |= CPU_FLAGS_ARCH_MATCH;
1959 }
a5ff0eb2 1960 else
db12e14e 1961 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1962 }
3629bb00 1963 }
c0f3af97 1964 return match;
40fb9820
L
1965}
1966
c6fb90c8
L
1967static INLINE i386_operand_type
1968operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 1969{
bab6aec1
JB
1970 if (x.bitfield.class != y.bitfield.class)
1971 x.bitfield.class = ClassNone;
75e5731b
JB
1972 if (x.bitfield.instance != y.bitfield.instance)
1973 x.bitfield.instance = InstanceNone;
bab6aec1 1974
c6fb90c8
L
1975 switch (ARRAY_SIZE (x.array))
1976 {
1977 case 3:
1978 x.array [2] &= y.array [2];
1a0670f3 1979 /* Fall through. */
c6fb90c8
L
1980 case 2:
1981 x.array [1] &= y.array [1];
1a0670f3 1982 /* Fall through. */
c6fb90c8
L
1983 case 1:
1984 x.array [0] &= y.array [0];
1985 break;
1986 default:
1987 abort ();
1988 }
1989 return x;
40fb9820
L
1990}
1991
73053c1f
JB
1992static INLINE i386_operand_type
1993operand_type_and_not (i386_operand_type x, i386_operand_type y)
1994{
bab6aec1 1995 gas_assert (y.bitfield.class == ClassNone);
75e5731b 1996 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 1997
73053c1f
JB
1998 switch (ARRAY_SIZE (x.array))
1999 {
2000 case 3:
2001 x.array [2] &= ~y.array [2];
2002 /* Fall through. */
2003 case 2:
2004 x.array [1] &= ~y.array [1];
2005 /* Fall through. */
2006 case 1:
2007 x.array [0] &= ~y.array [0];
2008 break;
2009 default:
2010 abort ();
2011 }
2012 return x;
2013}
2014
c6fb90c8
L
2015static INLINE i386_operand_type
2016operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 2017{
bab6aec1
JB
2018 gas_assert (x.bitfield.class == ClassNone ||
2019 y.bitfield.class == ClassNone ||
2020 x.bitfield.class == y.bitfield.class);
75e5731b
JB
2021 gas_assert (x.bitfield.instance == InstanceNone ||
2022 y.bitfield.instance == InstanceNone ||
2023 x.bitfield.instance == y.bitfield.instance);
bab6aec1 2024
c6fb90c8 2025 switch (ARRAY_SIZE (x.array))
40fb9820 2026 {
c6fb90c8
L
2027 case 3:
2028 x.array [2] |= y.array [2];
1a0670f3 2029 /* Fall through. */
c6fb90c8
L
2030 case 2:
2031 x.array [1] |= y.array [1];
1a0670f3 2032 /* Fall through. */
c6fb90c8
L
2033 case 1:
2034 x.array [0] |= y.array [0];
40fb9820
L
2035 break;
2036 default:
2037 abort ();
2038 }
c6fb90c8
L
2039 return x;
2040}
40fb9820 2041
c6fb90c8
L
2042static INLINE i386_operand_type
2043operand_type_xor (i386_operand_type x, i386_operand_type y)
2044{
bab6aec1 2045 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2046 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2047
c6fb90c8
L
2048 switch (ARRAY_SIZE (x.array))
2049 {
2050 case 3:
2051 x.array [2] ^= y.array [2];
1a0670f3 2052 /* Fall through. */
c6fb90c8
L
2053 case 2:
2054 x.array [1] ^= y.array [1];
1a0670f3 2055 /* Fall through. */
c6fb90c8
L
2056 case 1:
2057 x.array [0] ^= y.array [0];
2058 break;
2059 default:
2060 abort ();
2061 }
40fb9820
L
2062 return x;
2063}
2064
40fb9820
L
2065static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
2066static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
2067static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
2068static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
bab6aec1
JB
2069static const i386_operand_type anydisp = OPERAND_TYPE_ANYDISP;
2070static const i386_operand_type anyimm = OPERAND_TYPE_ANYIMM;
40fb9820 2071static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
43234a1e 2072static const i386_operand_type regmask = OPERAND_TYPE_REGMASK;
40fb9820
L
2073static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
2074static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
2075static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
2076static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
2077static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
2078static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
2079static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
2080static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
2081static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
2082
2083enum operand_type
2084{
2085 reg,
40fb9820
L
2086 imm,
2087 disp,
2088 anymem
2089};
2090
c6fb90c8 2091static INLINE int
40fb9820
L
2092operand_type_check (i386_operand_type t, enum operand_type c)
2093{
2094 switch (c)
2095 {
2096 case reg:
bab6aec1 2097 return t.bitfield.class == Reg;
40fb9820 2098
40fb9820
L
2099 case imm:
2100 return (t.bitfield.imm8
2101 || t.bitfield.imm8s
2102 || t.bitfield.imm16
2103 || t.bitfield.imm32
2104 || t.bitfield.imm32s
2105 || t.bitfield.imm64);
2106
2107 case disp:
2108 return (t.bitfield.disp8
2109 || t.bitfield.disp16
2110 || t.bitfield.disp32
2111 || t.bitfield.disp32s
2112 || t.bitfield.disp64);
2113
2114 case anymem:
2115 return (t.bitfield.disp8
2116 || t.bitfield.disp16
2117 || t.bitfield.disp32
2118 || t.bitfield.disp32s
2119 || t.bitfield.disp64
2120 || t.bitfield.baseindex);
2121
2122 default:
2123 abort ();
2124 }
2cfe26b6
AM
2125
2126 return 0;
40fb9820
L
2127}
2128
7a54636a
L
2129/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
2130 between operand GIVEN and opeand WANTED for instruction template T. */
5c07affc
L
2131
2132static INLINE int
7a54636a
L
2133match_operand_size (const insn_template *t, unsigned int wanted,
2134 unsigned int given)
5c07affc 2135{
3ac21baa
JB
2136 return !((i.types[given].bitfield.byte
2137 && !t->operand_types[wanted].bitfield.byte)
2138 || (i.types[given].bitfield.word
2139 && !t->operand_types[wanted].bitfield.word)
2140 || (i.types[given].bitfield.dword
2141 && !t->operand_types[wanted].bitfield.dword)
2142 || (i.types[given].bitfield.qword
2143 && !t->operand_types[wanted].bitfield.qword)
2144 || (i.types[given].bitfield.tbyte
2145 && !t->operand_types[wanted].bitfield.tbyte));
5c07affc
L
2146}
2147
dd40ce22
L
2148/* Return 1 if there is no conflict in SIMD register between operand
2149 GIVEN and opeand WANTED for instruction template T. */
1b54b8d7
JB
2150
2151static INLINE int
dd40ce22
L
2152match_simd_size (const insn_template *t, unsigned int wanted,
2153 unsigned int given)
1b54b8d7 2154{
3ac21baa
JB
2155 return !((i.types[given].bitfield.xmmword
2156 && !t->operand_types[wanted].bitfield.xmmword)
2157 || (i.types[given].bitfield.ymmword
2158 && !t->operand_types[wanted].bitfield.ymmword)
2159 || (i.types[given].bitfield.zmmword
2160 && !t->operand_types[wanted].bitfield.zmmword));
1b54b8d7
JB
2161}
2162
7a54636a
L
2163/* Return 1 if there is no conflict in any size between operand GIVEN
2164 and opeand WANTED for instruction template T. */
5c07affc
L
2165
2166static INLINE int
dd40ce22
L
2167match_mem_size (const insn_template *t, unsigned int wanted,
2168 unsigned int given)
5c07affc 2169{
7a54636a 2170 return (match_operand_size (t, wanted, given)
3ac21baa 2171 && !((i.types[given].bitfield.unspecified
af508cb9 2172 && !i.broadcast
3ac21baa
JB
2173 && !t->operand_types[wanted].bitfield.unspecified)
2174 || (i.types[given].bitfield.fword
2175 && !t->operand_types[wanted].bitfield.fword)
1b54b8d7
JB
2176 /* For scalar opcode templates to allow register and memory
2177 operands at the same time, some special casing is needed
d6793fa1
JB
2178 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2179 down-conversion vpmov*. */
3528c362 2180 || ((t->operand_types[wanted].bitfield.class == RegSIMD
bc49bfd8
JB
2181 && t->operand_types[wanted].bitfield.byte
2182 + t->operand_types[wanted].bitfield.word
2183 + t->operand_types[wanted].bitfield.dword
2184 + t->operand_types[wanted].bitfield.qword
2185 > !!t->opcode_modifier.broadcast)
3ac21baa
JB
2186 ? (i.types[given].bitfield.xmmword
2187 || i.types[given].bitfield.ymmword
2188 || i.types[given].bitfield.zmmword)
2189 : !match_simd_size(t, wanted, given))));
5c07affc
L
2190}
2191
3ac21baa
JB
2192/* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2193 operands for instruction template T, and it has MATCH_REVERSE set if there
2194 is no size conflict on any operands for the template with operands reversed
2195 (and the template allows for reversing in the first place). */
5c07affc 2196
3ac21baa
JB
2197#define MATCH_STRAIGHT 1
2198#define MATCH_REVERSE 2
2199
2200static INLINE unsigned int
d3ce72d0 2201operand_size_match (const insn_template *t)
5c07affc 2202{
3ac21baa 2203 unsigned int j, match = MATCH_STRAIGHT;
5c07affc 2204
0cfa3eb3 2205 /* Don't check non-absolute jump instructions. */
5c07affc 2206 if (t->opcode_modifier.jump
0cfa3eb3 2207 && t->opcode_modifier.jump != JUMP_ABSOLUTE)
5c07affc
L
2208 return match;
2209
2210 /* Check memory and accumulator operand size. */
2211 for (j = 0; j < i.operands; j++)
2212 {
3528c362
JB
2213 if (i.types[j].bitfield.class != Reg
2214 && i.types[j].bitfield.class != RegSIMD
601e8564 2215 && t->opcode_modifier.anysize)
5c07affc
L
2216 continue;
2217
bab6aec1 2218 if (t->operand_types[j].bitfield.class == Reg
7a54636a 2219 && !match_operand_size (t, j, j))
5c07affc
L
2220 {
2221 match = 0;
2222 break;
2223 }
2224
3528c362 2225 if (t->operand_types[j].bitfield.class == RegSIMD
3ac21baa 2226 && !match_simd_size (t, j, j))
1b54b8d7
JB
2227 {
2228 match = 0;
2229 break;
2230 }
2231
75e5731b 2232 if (t->operand_types[j].bitfield.instance == Accum
7a54636a 2233 && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
1b54b8d7
JB
2234 {
2235 match = 0;
2236 break;
2237 }
2238
c48dadc9 2239 if ((i.flags[j] & Operand_Mem) && !match_mem_size (t, j, j))
5c07affc
L
2240 {
2241 match = 0;
2242 break;
2243 }
2244 }
2245
3ac21baa 2246 if (!t->opcode_modifier.d)
891edac4 2247 {
dc1e8a47 2248 mismatch:
3ac21baa
JB
2249 if (!match)
2250 i.error = operand_size_mismatch;
2251 return match;
891edac4 2252 }
5c07affc
L
2253
2254 /* Check reverse. */
f5eb1d70 2255 gas_assert (i.operands >= 2 && i.operands <= 3);
5c07affc 2256
f5eb1d70 2257 for (j = 0; j < i.operands; j++)
5c07affc 2258 {
f5eb1d70
JB
2259 unsigned int given = i.operands - j - 1;
2260
bab6aec1 2261 if (t->operand_types[j].bitfield.class == Reg
f5eb1d70 2262 && !match_operand_size (t, j, given))
891edac4 2263 goto mismatch;
5c07affc 2264
3528c362 2265 if (t->operand_types[j].bitfield.class == RegSIMD
f5eb1d70 2266 && !match_simd_size (t, j, given))
dbbc8b7e
JB
2267 goto mismatch;
2268
75e5731b 2269 if (t->operand_types[j].bitfield.instance == Accum
f5eb1d70
JB
2270 && (!match_operand_size (t, j, given)
2271 || !match_simd_size (t, j, given)))
dbbc8b7e
JB
2272 goto mismatch;
2273
f5eb1d70 2274 if ((i.flags[given] & Operand_Mem) && !match_mem_size (t, j, given))
891edac4 2275 goto mismatch;
5c07affc
L
2276 }
2277
3ac21baa 2278 return match | MATCH_REVERSE;
5c07affc
L
2279}
2280
c6fb90c8 2281static INLINE int
40fb9820
L
2282operand_type_match (i386_operand_type overlap,
2283 i386_operand_type given)
2284{
2285 i386_operand_type temp = overlap;
2286
7d5e4556 2287 temp.bitfield.unspecified = 0;
5c07affc
L
2288 temp.bitfield.byte = 0;
2289 temp.bitfield.word = 0;
2290 temp.bitfield.dword = 0;
2291 temp.bitfield.fword = 0;
2292 temp.bitfield.qword = 0;
2293 temp.bitfield.tbyte = 0;
2294 temp.bitfield.xmmword = 0;
c0f3af97 2295 temp.bitfield.ymmword = 0;
43234a1e 2296 temp.bitfield.zmmword = 0;
0dfbf9d7 2297 if (operand_type_all_zero (&temp))
891edac4 2298 goto mismatch;
40fb9820 2299
6f2f06be 2300 if (given.bitfield.baseindex == overlap.bitfield.baseindex)
891edac4
L
2301 return 1;
2302
dc1e8a47 2303 mismatch:
a65babc9 2304 i.error = operand_type_mismatch;
891edac4 2305 return 0;
40fb9820
L
2306}
2307
7d5e4556 2308/* If given types g0 and g1 are registers they must be of the same type
10c17abd 2309 unless the expected operand type register overlap is null.
5de4d9ef 2310 Some Intel syntax memory operand size checking also happens here. */
40fb9820 2311
c6fb90c8 2312static INLINE int
dc821c5f 2313operand_type_register_match (i386_operand_type g0,
40fb9820 2314 i386_operand_type t0,
40fb9820
L
2315 i386_operand_type g1,
2316 i386_operand_type t1)
2317{
bab6aec1 2318 if (g0.bitfield.class != Reg
3528c362 2319 && g0.bitfield.class != RegSIMD
10c17abd
JB
2320 && (!operand_type_check (g0, anymem)
2321 || g0.bitfield.unspecified
5de4d9ef
JB
2322 || (t0.bitfield.class != Reg
2323 && t0.bitfield.class != RegSIMD)))
40fb9820
L
2324 return 1;
2325
bab6aec1 2326 if (g1.bitfield.class != Reg
3528c362 2327 && g1.bitfield.class != RegSIMD
10c17abd
JB
2328 && (!operand_type_check (g1, anymem)
2329 || g1.bitfield.unspecified
5de4d9ef
JB
2330 || (t1.bitfield.class != Reg
2331 && t1.bitfield.class != RegSIMD)))
40fb9820
L
2332 return 1;
2333
dc821c5f
JB
2334 if (g0.bitfield.byte == g1.bitfield.byte
2335 && g0.bitfield.word == g1.bitfield.word
2336 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2337 && g0.bitfield.qword == g1.bitfield.qword
2338 && g0.bitfield.xmmword == g1.bitfield.xmmword
2339 && g0.bitfield.ymmword == g1.bitfield.ymmword
2340 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2341 return 1;
2342
dc821c5f
JB
2343 if (!(t0.bitfield.byte & t1.bitfield.byte)
2344 && !(t0.bitfield.word & t1.bitfield.word)
2345 && !(t0.bitfield.dword & t1.bitfield.dword)
10c17abd
JB
2346 && !(t0.bitfield.qword & t1.bitfield.qword)
2347 && !(t0.bitfield.xmmword & t1.bitfield.xmmword)
2348 && !(t0.bitfield.ymmword & t1.bitfield.ymmword)
2349 && !(t0.bitfield.zmmword & t1.bitfield.zmmword))
891edac4
L
2350 return 1;
2351
a65babc9 2352 i.error = register_type_mismatch;
891edac4
L
2353
2354 return 0;
40fb9820
L
2355}
2356
4c692bc7
JB
2357static INLINE unsigned int
2358register_number (const reg_entry *r)
2359{
2360 unsigned int nr = r->reg_num;
2361
2362 if (r->reg_flags & RegRex)
2363 nr += 8;
2364
200cbe0f
L
2365 if (r->reg_flags & RegVRex)
2366 nr += 16;
2367
4c692bc7
JB
2368 return nr;
2369}
2370
252b5132 2371static INLINE unsigned int
40fb9820 2372mode_from_disp_size (i386_operand_type t)
252b5132 2373{
b5014f7a 2374 if (t.bitfield.disp8)
40fb9820
L
2375 return 1;
2376 else if (t.bitfield.disp16
2377 || t.bitfield.disp32
2378 || t.bitfield.disp32s)
2379 return 2;
2380 else
2381 return 0;
252b5132
RH
2382}
2383
2384static INLINE int
65879393 2385fits_in_signed_byte (addressT num)
252b5132 2386{
65879393 2387 return num + 0x80 <= 0xff;
47926f60 2388}
252b5132
RH
2389
2390static INLINE int
65879393 2391fits_in_unsigned_byte (addressT num)
252b5132 2392{
65879393 2393 return num <= 0xff;
47926f60 2394}
252b5132
RH
2395
2396static INLINE int
65879393 2397fits_in_unsigned_word (addressT num)
252b5132 2398{
65879393 2399 return num <= 0xffff;
47926f60 2400}
252b5132
RH
2401
2402static INLINE int
65879393 2403fits_in_signed_word (addressT num)
252b5132 2404{
65879393 2405 return num + 0x8000 <= 0xffff;
47926f60 2406}
2a962e6d 2407
3e73aa7c 2408static INLINE int
65879393 2409fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2410{
2411#ifndef BFD64
2412 return 1;
2413#else
65879393 2414 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2415#endif
2416} /* fits_in_signed_long() */
2a962e6d 2417
3e73aa7c 2418static INLINE int
65879393 2419fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2420{
2421#ifndef BFD64
2422 return 1;
2423#else
65879393 2424 return num <= 0xffffffff;
3e73aa7c
JH
2425#endif
2426} /* fits_in_unsigned_long() */
252b5132 2427
43234a1e 2428static INLINE int
b5014f7a 2429fits_in_disp8 (offsetT num)
43234a1e
L
2430{
2431 int shift = i.memshift;
2432 unsigned int mask;
2433
2434 if (shift == -1)
2435 abort ();
2436
2437 mask = (1 << shift) - 1;
2438
2439 /* Return 0 if NUM isn't properly aligned. */
2440 if ((num & mask))
2441 return 0;
2442
2443 /* Check if NUM will fit in 8bit after shift. */
2444 return fits_in_signed_byte (num >> shift);
2445}
2446
a683cc34
SP
2447static INLINE int
2448fits_in_imm4 (offsetT num)
2449{
2450 return (num & 0xf) == num;
2451}
2452
40fb9820 2453static i386_operand_type
e3bb37b5 2454smallest_imm_type (offsetT num)
252b5132 2455{
40fb9820 2456 i386_operand_type t;
7ab9ffdd 2457
0dfbf9d7 2458 operand_type_set (&t, 0);
40fb9820
L
2459 t.bitfield.imm64 = 1;
2460
2461 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2462 {
2463 /* This code is disabled on the 486 because all the Imm1 forms
2464 in the opcode table are slower on the i486. They're the
2465 versions with the implicitly specified single-position
2466 displacement, which has another syntax if you really want to
2467 use that form. */
40fb9820
L
2468 t.bitfield.imm1 = 1;
2469 t.bitfield.imm8 = 1;
2470 t.bitfield.imm8s = 1;
2471 t.bitfield.imm16 = 1;
2472 t.bitfield.imm32 = 1;
2473 t.bitfield.imm32s = 1;
2474 }
2475 else if (fits_in_signed_byte (num))
2476 {
2477 t.bitfield.imm8 = 1;
2478 t.bitfield.imm8s = 1;
2479 t.bitfield.imm16 = 1;
2480 t.bitfield.imm32 = 1;
2481 t.bitfield.imm32s = 1;
2482 }
2483 else if (fits_in_unsigned_byte (num))
2484 {
2485 t.bitfield.imm8 = 1;
2486 t.bitfield.imm16 = 1;
2487 t.bitfield.imm32 = 1;
2488 t.bitfield.imm32s = 1;
2489 }
2490 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2491 {
2492 t.bitfield.imm16 = 1;
2493 t.bitfield.imm32 = 1;
2494 t.bitfield.imm32s = 1;
2495 }
2496 else if (fits_in_signed_long (num))
2497 {
2498 t.bitfield.imm32 = 1;
2499 t.bitfield.imm32s = 1;
2500 }
2501 else if (fits_in_unsigned_long (num))
2502 t.bitfield.imm32 = 1;
2503
2504 return t;
47926f60 2505}
252b5132 2506
847f7ad4 2507static offsetT
e3bb37b5 2508offset_in_range (offsetT val, int size)
847f7ad4 2509{
508866be 2510 addressT mask;
ba2adb93 2511
847f7ad4
AM
2512 switch (size)
2513 {
508866be
L
2514 case 1: mask = ((addressT) 1 << 8) - 1; break;
2515 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 2516 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
2517#ifdef BFD64
2518 case 8: mask = ((addressT) 2 << 63) - 1; break;
2519#endif
47926f60 2520 default: abort ();
847f7ad4
AM
2521 }
2522
9de868bf
L
2523#ifdef BFD64
2524 /* If BFD64, sign extend val for 32bit address mode. */
2525 if (flag_code != CODE_64BIT
2526 || i.prefix[ADDR_PREFIX])
3e73aa7c
JH
2527 if ((val & ~(((addressT) 2 << 31) - 1)) == 0)
2528 val = (val ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
fa289fb8 2529#endif
ba2adb93 2530
47926f60 2531 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
2532 {
2533 char buf1[40], buf2[40];
2534
2535 sprint_value (buf1, val);
2536 sprint_value (buf2, val & mask);
2537 as_warn (_("%s shortened to %s"), buf1, buf2);
2538 }
2539 return val & mask;
2540}
2541
c32fa91d
L
2542enum PREFIX_GROUP
2543{
2544 PREFIX_EXIST = 0,
2545 PREFIX_LOCK,
2546 PREFIX_REP,
04ef582a 2547 PREFIX_DS,
c32fa91d
L
2548 PREFIX_OTHER
2549};
2550
2551/* Returns
2552 a. PREFIX_EXIST if attempting to add a prefix where one from the
2553 same class already exists.
2554 b. PREFIX_LOCK if lock prefix is added.
2555 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2556 d. PREFIX_DS if ds prefix is added.
2557 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2558 */
2559
2560static enum PREFIX_GROUP
e3bb37b5 2561add_prefix (unsigned int prefix)
252b5132 2562{
c32fa91d 2563 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2564 unsigned int q;
252b5132 2565
29b0f896
AM
2566 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2567 && flag_code == CODE_64BIT)
b1905489 2568 {
161a04f6 2569 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2570 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2571 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2572 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2573 ret = PREFIX_EXIST;
b1905489
JB
2574 q = REX_PREFIX;
2575 }
3e73aa7c 2576 else
b1905489
JB
2577 {
2578 switch (prefix)
2579 {
2580 default:
2581 abort ();
2582
b1905489 2583 case DS_PREFIX_OPCODE:
04ef582a
L
2584 ret = PREFIX_DS;
2585 /* Fall through. */
2586 case CS_PREFIX_OPCODE:
b1905489
JB
2587 case ES_PREFIX_OPCODE:
2588 case FS_PREFIX_OPCODE:
2589 case GS_PREFIX_OPCODE:
2590 case SS_PREFIX_OPCODE:
2591 q = SEG_PREFIX;
2592 break;
2593
2594 case REPNE_PREFIX_OPCODE:
2595 case REPE_PREFIX_OPCODE:
c32fa91d
L
2596 q = REP_PREFIX;
2597 ret = PREFIX_REP;
2598 break;
2599
b1905489 2600 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2601 q = LOCK_PREFIX;
2602 ret = PREFIX_LOCK;
b1905489
JB
2603 break;
2604
2605 case FWAIT_OPCODE:
2606 q = WAIT_PREFIX;
2607 break;
2608
2609 case ADDR_PREFIX_OPCODE:
2610 q = ADDR_PREFIX;
2611 break;
2612
2613 case DATA_PREFIX_OPCODE:
2614 q = DATA_PREFIX;
2615 break;
2616 }
2617 if (i.prefix[q] != 0)
c32fa91d 2618 ret = PREFIX_EXIST;
b1905489 2619 }
252b5132 2620
b1905489 2621 if (ret)
252b5132 2622 {
b1905489
JB
2623 if (!i.prefix[q])
2624 ++i.prefixes;
2625 i.prefix[q] |= prefix;
252b5132 2626 }
b1905489
JB
2627 else
2628 as_bad (_("same type of prefix used twice"));
252b5132 2629
252b5132
RH
2630 return ret;
2631}
2632
2633static void
78f12dd3 2634update_code_flag (int value, int check)
eecb386c 2635{
78f12dd3
L
2636 PRINTF_LIKE ((*as_error));
2637
1e9cc1c2 2638 flag_code = (enum flag_code) value;
40fb9820
L
2639 if (flag_code == CODE_64BIT)
2640 {
2641 cpu_arch_flags.bitfield.cpu64 = 1;
2642 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
2643 }
2644 else
2645 {
2646 cpu_arch_flags.bitfield.cpu64 = 0;
2647 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
2648 }
2649 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c 2650 {
78f12dd3
L
2651 if (check)
2652 as_error = as_fatal;
2653 else
2654 as_error = as_bad;
2655 (*as_error) (_("64bit mode not supported on `%s'."),
2656 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2657 }
40fb9820 2658 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c 2659 {
78f12dd3
L
2660 if (check)
2661 as_error = as_fatal;
2662 else
2663 as_error = as_bad;
2664 (*as_error) (_("32bit mode not supported on `%s'."),
2665 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2666 }
eecb386c
AM
2667 stackop_size = '\0';
2668}
2669
78f12dd3
L
2670static void
2671set_code_flag (int value)
2672{
2673 update_code_flag (value, 0);
2674}
2675
eecb386c 2676static void
e3bb37b5 2677set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2678{
1e9cc1c2 2679 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2680 if (flag_code != CODE_16BIT)
2681 abort ();
2682 cpu_arch_flags.bitfield.cpu64 = 0;
2683 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 2684 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2685}
2686
2687static void
e3bb37b5 2688set_intel_syntax (int syntax_flag)
252b5132
RH
2689{
2690 /* Find out if register prefixing is specified. */
2691 int ask_naked_reg = 0;
2692
2693 SKIP_WHITESPACE ();
29b0f896 2694 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2695 {
d02603dc
NC
2696 char *string;
2697 int e = get_symbol_name (&string);
252b5132 2698
47926f60 2699 if (strcmp (string, "prefix") == 0)
252b5132 2700 ask_naked_reg = 1;
47926f60 2701 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2702 ask_naked_reg = -1;
2703 else
d0b47220 2704 as_bad (_("bad argument to syntax directive."));
d02603dc 2705 (void) restore_line_pointer (e);
252b5132
RH
2706 }
2707 demand_empty_rest_of_line ();
c3332e24 2708
252b5132
RH
2709 intel_syntax = syntax_flag;
2710
2711 if (ask_naked_reg == 0)
f86103b7
AM
2712 allow_naked_reg = (intel_syntax
2713 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2714 else
2715 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2716
ee86248c 2717 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
7ab9ffdd 2718
e4a3b5a4 2719 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 2720 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 2721 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
2722}
2723
1efbbeb4
L
2724static void
2725set_intel_mnemonic (int mnemonic_flag)
2726{
e1d4d893 2727 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2728}
2729
db51cc60
L
2730static void
2731set_allow_index_reg (int flag)
2732{
2733 allow_index_reg = flag;
2734}
2735
cb19c032 2736static void
7bab8ab5 2737set_check (int what)
cb19c032 2738{
7bab8ab5
JB
2739 enum check_kind *kind;
2740 const char *str;
2741
2742 if (what)
2743 {
2744 kind = &operand_check;
2745 str = "operand";
2746 }
2747 else
2748 {
2749 kind = &sse_check;
2750 str = "sse";
2751 }
2752
cb19c032
L
2753 SKIP_WHITESPACE ();
2754
2755 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2756 {
d02603dc
NC
2757 char *string;
2758 int e = get_symbol_name (&string);
cb19c032
L
2759
2760 if (strcmp (string, "none") == 0)
7bab8ab5 2761 *kind = check_none;
cb19c032 2762 else if (strcmp (string, "warning") == 0)
7bab8ab5 2763 *kind = check_warning;
cb19c032 2764 else if (strcmp (string, "error") == 0)
7bab8ab5 2765 *kind = check_error;
cb19c032 2766 else
7bab8ab5 2767 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2768 (void) restore_line_pointer (e);
cb19c032
L
2769 }
2770 else
7bab8ab5 2771 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2772
2773 demand_empty_rest_of_line ();
2774}
2775
8a9036a4
L
2776static void
2777check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2778 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2779{
2780#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2781 static const char *arch;
2782
2783 /* Intel LIOM is only supported on ELF. */
2784 if (!IS_ELF)
2785 return;
2786
2787 if (!arch)
2788 {
2789 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2790 use default_arch. */
2791 arch = cpu_arch_name;
2792 if (!arch)
2793 arch = default_arch;
2794 }
2795
81486035
L
2796 /* If we are targeting Intel MCU, we must enable it. */
2797 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_IAMCU
2798 || new_flag.bitfield.cpuiamcu)
2799 return;
2800
3632d14b 2801 /* If we are targeting Intel L1OM, we must enable it. */
8a9036a4 2802 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_L1OM
1e9cc1c2 2803 || new_flag.bitfield.cpul1om)
8a9036a4 2804 return;
76ba9986 2805
7a9068fe
L
2806 /* If we are targeting Intel K1OM, we must enable it. */
2807 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_K1OM
2808 || new_flag.bitfield.cpuk1om)
2809 return;
2810
8a9036a4
L
2811 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2812#endif
2813}
2814
e413e4e9 2815static void
e3bb37b5 2816set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2817{
47926f60 2818 SKIP_WHITESPACE ();
e413e4e9 2819
29b0f896 2820 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9 2821 {
d02603dc
NC
2822 char *string;
2823 int e = get_symbol_name (&string);
91d6fa6a 2824 unsigned int j;
40fb9820 2825 i386_cpu_flags flags;
e413e4e9 2826
91d6fa6a 2827 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
e413e4e9 2828 {
91d6fa6a 2829 if (strcmp (string, cpu_arch[j].name) == 0)
e413e4e9 2830 {
91d6fa6a 2831 check_cpu_arch_compatible (string, cpu_arch[j].flags);
8a9036a4 2832
5c6af06e
JB
2833 if (*string != '.')
2834 {
91d6fa6a 2835 cpu_arch_name = cpu_arch[j].name;
5c6af06e 2836 cpu_sub_arch_name = NULL;
91d6fa6a 2837 cpu_arch_flags = cpu_arch[j].flags;
40fb9820
L
2838 if (flag_code == CODE_64BIT)
2839 {
2840 cpu_arch_flags.bitfield.cpu64 = 1;
2841 cpu_arch_flags.bitfield.cpuno64 = 0;
2842 }
2843 else
2844 {
2845 cpu_arch_flags.bitfield.cpu64 = 0;
2846 cpu_arch_flags.bitfield.cpuno64 = 1;
2847 }
91d6fa6a
NC
2848 cpu_arch_isa = cpu_arch[j].type;
2849 cpu_arch_isa_flags = cpu_arch[j].flags;
ccc9c027
L
2850 if (!cpu_arch_tune_set)
2851 {
2852 cpu_arch_tune = cpu_arch_isa;
2853 cpu_arch_tune_flags = cpu_arch_isa_flags;
2854 }
5c6af06e
JB
2855 break;
2856 }
40fb9820 2857
293f5f65
L
2858 flags = cpu_flags_or (cpu_arch_flags,
2859 cpu_arch[j].flags);
81486035 2860
5b64d091 2861 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
5c6af06e 2862 {
6305a203
L
2863 if (cpu_sub_arch_name)
2864 {
2865 char *name = cpu_sub_arch_name;
2866 cpu_sub_arch_name = concat (name,
91d6fa6a 2867 cpu_arch[j].name,
1bf57e9f 2868 (const char *) NULL);
6305a203
L
2869 free (name);
2870 }
2871 else
91d6fa6a 2872 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
40fb9820 2873 cpu_arch_flags = flags;
a586129e 2874 cpu_arch_isa_flags = flags;
5c6af06e 2875 }
0089dace
L
2876 else
2877 cpu_arch_isa_flags
2878 = cpu_flags_or (cpu_arch_isa_flags,
2879 cpu_arch[j].flags);
d02603dc 2880 (void) restore_line_pointer (e);
5c6af06e
JB
2881 demand_empty_rest_of_line ();
2882 return;
e413e4e9
AM
2883 }
2884 }
293f5f65
L
2885
2886 if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
2887 {
33eaf5de 2888 /* Disable an ISA extension. */
293f5f65
L
2889 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
2890 if (strcmp (string + 1, cpu_noarch [j].name) == 0)
2891 {
2892 flags = cpu_flags_and_not (cpu_arch_flags,
2893 cpu_noarch[j].flags);
2894 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2895 {
2896 if (cpu_sub_arch_name)
2897 {
2898 char *name = cpu_sub_arch_name;
2899 cpu_sub_arch_name = concat (name, string,
2900 (const char *) NULL);
2901 free (name);
2902 }
2903 else
2904 cpu_sub_arch_name = xstrdup (string);
2905 cpu_arch_flags = flags;
2906 cpu_arch_isa_flags = flags;
2907 }
2908 (void) restore_line_pointer (e);
2909 demand_empty_rest_of_line ();
2910 return;
2911 }
2912
2913 j = ARRAY_SIZE (cpu_arch);
2914 }
2915
91d6fa6a 2916 if (j >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
2917 as_bad (_("no such architecture: `%s'"), string);
2918
2919 *input_line_pointer = e;
2920 }
2921 else
2922 as_bad (_("missing cpu architecture"));
2923
fddf5b5b
AM
2924 no_cond_jump_promotion = 0;
2925 if (*input_line_pointer == ','
29b0f896 2926 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 2927 {
d02603dc
NC
2928 char *string;
2929 char e;
2930
2931 ++input_line_pointer;
2932 e = get_symbol_name (&string);
fddf5b5b
AM
2933
2934 if (strcmp (string, "nojumps") == 0)
2935 no_cond_jump_promotion = 1;
2936 else if (strcmp (string, "jumps") == 0)
2937 ;
2938 else
2939 as_bad (_("no such architecture modifier: `%s'"), string);
2940
d02603dc 2941 (void) restore_line_pointer (e);
fddf5b5b
AM
2942 }
2943
e413e4e9
AM
2944 demand_empty_rest_of_line ();
2945}
2946
8a9036a4
L
2947enum bfd_architecture
2948i386_arch (void)
2949{
3632d14b 2950 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4
L
2951 {
2952 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2953 || flag_code != CODE_64BIT)
2954 as_fatal (_("Intel L1OM is 64bit ELF only"));
2955 return bfd_arch_l1om;
2956 }
7a9068fe
L
2957 else if (cpu_arch_isa == PROCESSOR_K1OM)
2958 {
2959 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2960 || flag_code != CODE_64BIT)
2961 as_fatal (_("Intel K1OM is 64bit ELF only"));
2962 return bfd_arch_k1om;
2963 }
81486035
L
2964 else if (cpu_arch_isa == PROCESSOR_IAMCU)
2965 {
2966 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2967 || flag_code == CODE_64BIT)
2968 as_fatal (_("Intel MCU is 32bit ELF only"));
2969 return bfd_arch_iamcu;
2970 }
8a9036a4
L
2971 else
2972 return bfd_arch_i386;
2973}
2974
b9d79e03 2975unsigned long
7016a5d5 2976i386_mach (void)
b9d79e03 2977{
351f65ca 2978 if (!strncmp (default_arch, "x86_64", 6))
8a9036a4 2979 {
3632d14b 2980 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 2981 {
351f65ca
L
2982 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2983 || default_arch[6] != '\0')
8a9036a4
L
2984 as_fatal (_("Intel L1OM is 64bit ELF only"));
2985 return bfd_mach_l1om;
2986 }
7a9068fe
L
2987 else if (cpu_arch_isa == PROCESSOR_K1OM)
2988 {
2989 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2990 || default_arch[6] != '\0')
2991 as_fatal (_("Intel K1OM is 64bit ELF only"));
2992 return bfd_mach_k1om;
2993 }
351f65ca 2994 else if (default_arch[6] == '\0')
8a9036a4 2995 return bfd_mach_x86_64;
351f65ca
L
2996 else
2997 return bfd_mach_x64_32;
8a9036a4 2998 }
5197d474
L
2999 else if (!strcmp (default_arch, "i386")
3000 || !strcmp (default_arch, "iamcu"))
81486035
L
3001 {
3002 if (cpu_arch_isa == PROCESSOR_IAMCU)
3003 {
3004 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
3005 as_fatal (_("Intel MCU is 32bit ELF only"));
3006 return bfd_mach_i386_iamcu;
3007 }
3008 else
3009 return bfd_mach_i386_i386;
3010 }
b9d79e03 3011 else
2b5d6a91 3012 as_fatal (_("unknown architecture"));
b9d79e03 3013}
b9d79e03 3014\f
252b5132 3015void
7016a5d5 3016md_begin (void)
252b5132
RH
3017{
3018 const char *hash_err;
3019
86fa6981
L
3020 /* Support pseudo prefixes like {disp32}. */
3021 lex_type ['{'] = LEX_BEGIN_NAME;
3022
47926f60 3023 /* Initialize op_hash hash table. */
252b5132
RH
3024 op_hash = hash_new ();
3025
3026 {
d3ce72d0 3027 const insn_template *optab;
29b0f896 3028 templates *core_optab;
252b5132 3029
47926f60
KH
3030 /* Setup for loop. */
3031 optab = i386_optab;
add39d23 3032 core_optab = XNEW (templates);
252b5132
RH
3033 core_optab->start = optab;
3034
3035 while (1)
3036 {
3037 ++optab;
3038 if (optab->name == NULL
3039 || strcmp (optab->name, (optab - 1)->name) != 0)
3040 {
3041 /* different name --> ship out current template list;
47926f60 3042 add to hash table; & begin anew. */
252b5132
RH
3043 core_optab->end = optab;
3044 hash_err = hash_insert (op_hash,
3045 (optab - 1)->name,
5a49b8ac 3046 (void *) core_optab);
252b5132
RH
3047 if (hash_err)
3048 {
b37df7c4 3049 as_fatal (_("can't hash %s: %s"),
252b5132
RH
3050 (optab - 1)->name,
3051 hash_err);
3052 }
3053 if (optab->name == NULL)
3054 break;
add39d23 3055 core_optab = XNEW (templates);
252b5132
RH
3056 core_optab->start = optab;
3057 }
3058 }
3059 }
3060
47926f60 3061 /* Initialize reg_hash hash table. */
252b5132
RH
3062 reg_hash = hash_new ();
3063 {
29b0f896 3064 const reg_entry *regtab;
c3fe08fa 3065 unsigned int regtab_size = i386_regtab_size;
252b5132 3066
c3fe08fa 3067 for (regtab = i386_regtab; regtab_size--; regtab++)
252b5132 3068 {
5a49b8ac 3069 hash_err = hash_insert (reg_hash, regtab->reg_name, (void *) regtab);
252b5132 3070 if (hash_err)
b37df7c4 3071 as_fatal (_("can't hash %s: %s"),
3e73aa7c
JH
3072 regtab->reg_name,
3073 hash_err);
252b5132
RH
3074 }
3075 }
3076
47926f60 3077 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 3078 {
29b0f896
AM
3079 int c;
3080 char *p;
252b5132
RH
3081
3082 for (c = 0; c < 256; c++)
3083 {
3882b010 3084 if (ISDIGIT (c))
252b5132
RH
3085 {
3086 digit_chars[c] = c;
3087 mnemonic_chars[c] = c;
3088 register_chars[c] = c;
3089 operand_chars[c] = c;
3090 }
3882b010 3091 else if (ISLOWER (c))
252b5132
RH
3092 {
3093 mnemonic_chars[c] = c;
3094 register_chars[c] = c;
3095 operand_chars[c] = c;
3096 }
3882b010 3097 else if (ISUPPER (c))
252b5132 3098 {
3882b010 3099 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
3100 register_chars[c] = mnemonic_chars[c];
3101 operand_chars[c] = c;
3102 }
43234a1e 3103 else if (c == '{' || c == '}')
86fa6981
L
3104 {
3105 mnemonic_chars[c] = c;
3106 operand_chars[c] = c;
3107 }
252b5132 3108
3882b010 3109 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
3110 identifier_chars[c] = c;
3111 else if (c >= 128)
3112 {
3113 identifier_chars[c] = c;
3114 operand_chars[c] = c;
3115 }
3116 }
3117
3118#ifdef LEX_AT
3119 identifier_chars['@'] = '@';
32137342
NC
3120#endif
3121#ifdef LEX_QM
3122 identifier_chars['?'] = '?';
3123 operand_chars['?'] = '?';
252b5132 3124#endif
252b5132 3125 digit_chars['-'] = '-';
c0f3af97 3126 mnemonic_chars['_'] = '_';
791fe849 3127 mnemonic_chars['-'] = '-';
0003779b 3128 mnemonic_chars['.'] = '.';
252b5132
RH
3129 identifier_chars['_'] = '_';
3130 identifier_chars['.'] = '.';
3131
3132 for (p = operand_special_chars; *p != '\0'; p++)
3133 operand_chars[(unsigned char) *p] = *p;
3134 }
3135
a4447b93
RH
3136 if (flag_code == CODE_64BIT)
3137 {
ca19b261
KT
3138#if defined (OBJ_COFF) && defined (TE_PE)
3139 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
3140 ? 32 : 16);
3141#else
a4447b93 3142 x86_dwarf2_return_column = 16;
ca19b261 3143#endif
61ff971f 3144 x86_cie_data_alignment = -8;
a4447b93
RH
3145 }
3146 else
3147 {
3148 x86_dwarf2_return_column = 8;
3149 x86_cie_data_alignment = -4;
3150 }
e379e5f3
L
3151
3152 /* NB: FUSED_JCC_PADDING frag must have sufficient room so that it
3153 can be turned into BRANCH_PREFIX frag. */
3154 if (align_branch_prefix_size > MAX_FUSED_JCC_PADDING_SIZE)
3155 abort ();
252b5132
RH
3156}
3157
3158void
e3bb37b5 3159i386_print_statistics (FILE *file)
252b5132
RH
3160{
3161 hash_print_statistics (file, "i386 opcode", op_hash);
3162 hash_print_statistics (file, "i386 register", reg_hash);
3163}
3164\f
252b5132
RH
3165#ifdef DEBUG386
3166
ce8a8b2f 3167/* Debugging routines for md_assemble. */
d3ce72d0 3168static void pte (insn_template *);
40fb9820 3169static void pt (i386_operand_type);
e3bb37b5
L
3170static void pe (expressionS *);
3171static void ps (symbolS *);
252b5132
RH
3172
3173static void
2c703856 3174pi (const char *line, i386_insn *x)
252b5132 3175{
09137c09 3176 unsigned int j;
252b5132
RH
3177
3178 fprintf (stdout, "%s: template ", line);
3179 pte (&x->tm);
09f131f2
JH
3180 fprintf (stdout, " address: base %s index %s scale %x\n",
3181 x->base_reg ? x->base_reg->reg_name : "none",
3182 x->index_reg ? x->index_reg->reg_name : "none",
3183 x->log2_scale_factor);
3184 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 3185 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
3186 fprintf (stdout, " sib: base %x index %x scale %x\n",
3187 x->sib.base, x->sib.index, x->sib.scale);
3188 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
3189 (x->rex & REX_W) != 0,
3190 (x->rex & REX_R) != 0,
3191 (x->rex & REX_X) != 0,
3192 (x->rex & REX_B) != 0);
09137c09 3193 for (j = 0; j < x->operands; j++)
252b5132 3194 {
09137c09
SP
3195 fprintf (stdout, " #%d: ", j + 1);
3196 pt (x->types[j]);
252b5132 3197 fprintf (stdout, "\n");
bab6aec1 3198 if (x->types[j].bitfield.class == Reg
3528c362
JB
3199 || x->types[j].bitfield.class == RegMMX
3200 || x->types[j].bitfield.class == RegSIMD
00cee14f 3201 || x->types[j].bitfield.class == SReg
4a5c67ed
JB
3202 || x->types[j].bitfield.class == RegCR
3203 || x->types[j].bitfield.class == RegDR
3204 || x->types[j].bitfield.class == RegTR)
09137c09
SP
3205 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
3206 if (operand_type_check (x->types[j], imm))
3207 pe (x->op[j].imms);
3208 if (operand_type_check (x->types[j], disp))
3209 pe (x->op[j].disps);
252b5132
RH
3210 }
3211}
3212
3213static void
d3ce72d0 3214pte (insn_template *t)
252b5132 3215{
09137c09 3216 unsigned int j;
252b5132 3217 fprintf (stdout, " %d operands ", t->operands);
47926f60 3218 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
3219 if (t->extension_opcode != None)
3220 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 3221 if (t->opcode_modifier.d)
252b5132 3222 fprintf (stdout, "D");
40fb9820 3223 if (t->opcode_modifier.w)
252b5132
RH
3224 fprintf (stdout, "W");
3225 fprintf (stdout, "\n");
09137c09 3226 for (j = 0; j < t->operands; j++)
252b5132 3227 {
09137c09
SP
3228 fprintf (stdout, " #%d type ", j + 1);
3229 pt (t->operand_types[j]);
252b5132
RH
3230 fprintf (stdout, "\n");
3231 }
3232}
3233
3234static void
e3bb37b5 3235pe (expressionS *e)
252b5132 3236{
24eab124 3237 fprintf (stdout, " operation %d\n", e->X_op);
b77ad1d4
AM
3238 fprintf (stdout, " add_number %ld (%lx)\n",
3239 (long) e->X_add_number, (long) e->X_add_number);
252b5132
RH
3240 if (e->X_add_symbol)
3241 {
3242 fprintf (stdout, " add_symbol ");
3243 ps (e->X_add_symbol);
3244 fprintf (stdout, "\n");
3245 }
3246 if (e->X_op_symbol)
3247 {
3248 fprintf (stdout, " op_symbol ");
3249 ps (e->X_op_symbol);
3250 fprintf (stdout, "\n");
3251 }
3252}
3253
3254static void
e3bb37b5 3255ps (symbolS *s)
252b5132
RH
3256{
3257 fprintf (stdout, "%s type %s%s",
3258 S_GET_NAME (s),
3259 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3260 segment_name (S_GET_SEGMENT (s)));
3261}
3262
7b81dfbb 3263static struct type_name
252b5132 3264 {
40fb9820
L
3265 i386_operand_type mask;
3266 const char *name;
252b5132 3267 }
7b81dfbb 3268const type_names[] =
252b5132 3269{
40fb9820
L
3270 { OPERAND_TYPE_REG8, "r8" },
3271 { OPERAND_TYPE_REG16, "r16" },
3272 { OPERAND_TYPE_REG32, "r32" },
3273 { OPERAND_TYPE_REG64, "r64" },
2c703856
JB
3274 { OPERAND_TYPE_ACC8, "acc8" },
3275 { OPERAND_TYPE_ACC16, "acc16" },
3276 { OPERAND_TYPE_ACC32, "acc32" },
3277 { OPERAND_TYPE_ACC64, "acc64" },
40fb9820
L
3278 { OPERAND_TYPE_IMM8, "i8" },
3279 { OPERAND_TYPE_IMM8, "i8s" },
3280 { OPERAND_TYPE_IMM16, "i16" },
3281 { OPERAND_TYPE_IMM32, "i32" },
3282 { OPERAND_TYPE_IMM32S, "i32s" },
3283 { OPERAND_TYPE_IMM64, "i64" },
3284 { OPERAND_TYPE_IMM1, "i1" },
3285 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
3286 { OPERAND_TYPE_DISP8, "d8" },
3287 { OPERAND_TYPE_DISP16, "d16" },
3288 { OPERAND_TYPE_DISP32, "d32" },
3289 { OPERAND_TYPE_DISP32S, "d32s" },
3290 { OPERAND_TYPE_DISP64, "d64" },
3291 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
3292 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
3293 { OPERAND_TYPE_CONTROL, "control reg" },
3294 { OPERAND_TYPE_TEST, "test reg" },
3295 { OPERAND_TYPE_DEBUG, "debug reg" },
3296 { OPERAND_TYPE_FLOATREG, "FReg" },
3297 { OPERAND_TYPE_FLOATACC, "FAcc" },
21df382b 3298 { OPERAND_TYPE_SREG, "SReg" },
40fb9820
L
3299 { OPERAND_TYPE_REGMMX, "rMMX" },
3300 { OPERAND_TYPE_REGXMM, "rXMM" },
0349dc08 3301 { OPERAND_TYPE_REGYMM, "rYMM" },
43234a1e
L
3302 { OPERAND_TYPE_REGZMM, "rZMM" },
3303 { OPERAND_TYPE_REGMASK, "Mask reg" },
252b5132
RH
3304};
3305
3306static void
40fb9820 3307pt (i386_operand_type t)
252b5132 3308{
40fb9820 3309 unsigned int j;
c6fb90c8 3310 i386_operand_type a;
252b5132 3311
40fb9820 3312 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3313 {
3314 a = operand_type_and (t, type_names[j].mask);
2c703856 3315 if (operand_type_equal (&a, &type_names[j].mask))
c6fb90c8
L
3316 fprintf (stdout, "%s, ", type_names[j].name);
3317 }
252b5132
RH
3318 fflush (stdout);
3319}
3320
3321#endif /* DEBUG386 */
3322\f
252b5132 3323static bfd_reloc_code_real_type
3956db08 3324reloc (unsigned int size,
64e74474
AM
3325 int pcrel,
3326 int sign,
3327 bfd_reloc_code_real_type other)
252b5132 3328{
47926f60 3329 if (other != NO_RELOC)
3956db08 3330 {
91d6fa6a 3331 reloc_howto_type *rel;
3956db08
JB
3332
3333 if (size == 8)
3334 switch (other)
3335 {
64e74474
AM
3336 case BFD_RELOC_X86_64_GOT32:
3337 return BFD_RELOC_X86_64_GOT64;
3338 break;
553d1284
L
3339 case BFD_RELOC_X86_64_GOTPLT64:
3340 return BFD_RELOC_X86_64_GOTPLT64;
3341 break;
64e74474
AM
3342 case BFD_RELOC_X86_64_PLTOFF64:
3343 return BFD_RELOC_X86_64_PLTOFF64;
3344 break;
3345 case BFD_RELOC_X86_64_GOTPC32:
3346 other = BFD_RELOC_X86_64_GOTPC64;
3347 break;
3348 case BFD_RELOC_X86_64_GOTPCREL:
3349 other = BFD_RELOC_X86_64_GOTPCREL64;
3350 break;
3351 case BFD_RELOC_X86_64_TPOFF32:
3352 other = BFD_RELOC_X86_64_TPOFF64;
3353 break;
3354 case BFD_RELOC_X86_64_DTPOFF32:
3355 other = BFD_RELOC_X86_64_DTPOFF64;
3356 break;
3357 default:
3358 break;
3956db08 3359 }
e05278af 3360
8ce3d284 3361#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3362 if (other == BFD_RELOC_SIZE32)
3363 {
3364 if (size == 8)
1ab668bf 3365 other = BFD_RELOC_SIZE64;
8fd4256d 3366 if (pcrel)
1ab668bf
AM
3367 {
3368 as_bad (_("there are no pc-relative size relocations"));
3369 return NO_RELOC;
3370 }
8fd4256d 3371 }
8ce3d284 3372#endif
8fd4256d 3373
e05278af 3374 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3375 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3376 sign = -1;
3377
91d6fa6a
NC
3378 rel = bfd_reloc_type_lookup (stdoutput, other);
3379 if (!rel)
3956db08 3380 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3381 else if (size != bfd_get_reloc_size (rel))
3956db08 3382 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3383 bfd_get_reloc_size (rel),
3956db08 3384 size);
91d6fa6a 3385 else if (pcrel && !rel->pc_relative)
3956db08 3386 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3387 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3388 && !sign)
91d6fa6a 3389 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3390 && sign > 0))
3956db08
JB
3391 as_bad (_("relocated field and relocation type differ in signedness"));
3392 else
3393 return other;
3394 return NO_RELOC;
3395 }
252b5132
RH
3396
3397 if (pcrel)
3398 {
3e73aa7c 3399 if (!sign)
3956db08 3400 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3401 switch (size)
3402 {
3403 case 1: return BFD_RELOC_8_PCREL;
3404 case 2: return BFD_RELOC_16_PCREL;
d258b828 3405 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3406 case 8: return BFD_RELOC_64_PCREL;
252b5132 3407 }
3956db08 3408 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3409 }
3410 else
3411 {
3956db08 3412 if (sign > 0)
e5cb08ac 3413 switch (size)
3e73aa7c
JH
3414 {
3415 case 4: return BFD_RELOC_X86_64_32S;
3416 }
3417 else
3418 switch (size)
3419 {
3420 case 1: return BFD_RELOC_8;
3421 case 2: return BFD_RELOC_16;
3422 case 4: return BFD_RELOC_32;
3423 case 8: return BFD_RELOC_64;
3424 }
3956db08
JB
3425 as_bad (_("cannot do %s %u byte relocation"),
3426 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3427 }
3428
0cc9e1d3 3429 return NO_RELOC;
252b5132
RH
3430}
3431
47926f60
KH
3432/* Here we decide which fixups can be adjusted to make them relative to
3433 the beginning of the section instead of the symbol. Basically we need
3434 to make sure that the dynamic relocations are done correctly, so in
3435 some cases we force the original symbol to be used. */
3436
252b5132 3437int
e3bb37b5 3438tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3439{
6d249963 3440#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3441 if (!IS_ELF)
31312f95
AM
3442 return 1;
3443
a161fe53
AM
3444 /* Don't adjust pc-relative references to merge sections in 64-bit
3445 mode. */
3446 if (use_rela_relocations
3447 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3448 && fixP->fx_pcrel)
252b5132 3449 return 0;
31312f95 3450
8d01d9a9
AJ
3451 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3452 and changed later by validate_fix. */
3453 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3454 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3455 return 0;
3456
8fd4256d
L
3457 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3458 for size relocations. */
3459 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3460 || fixP->fx_r_type == BFD_RELOC_SIZE64
3461 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132 3462 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3463 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3464 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3465 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3466 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3467 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3468 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3469 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3470 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3471 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3472 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3473 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c 3474 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3475 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3476 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3477 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3478 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3479 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3480 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3481 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3482 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3483 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3484 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3485 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3486 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3487 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3488 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3489 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3490 return 0;
31312f95 3491#endif
252b5132
RH
3492 return 1;
3493}
252b5132 3494
b4cac588 3495static int
e3bb37b5 3496intel_float_operand (const char *mnemonic)
252b5132 3497{
9306ca4a
JB
3498 /* Note that the value returned is meaningful only for opcodes with (memory)
3499 operands, hence the code here is free to improperly handle opcodes that
3500 have no operands (for better performance and smaller code). */
3501
3502 if (mnemonic[0] != 'f')
3503 return 0; /* non-math */
3504
3505 switch (mnemonic[1])
3506 {
3507 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3508 the fs segment override prefix not currently handled because no
3509 call path can make opcodes without operands get here */
3510 case 'i':
3511 return 2 /* integer op */;
3512 case 'l':
3513 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3514 return 3; /* fldcw/fldenv */
3515 break;
3516 case 'n':
3517 if (mnemonic[2] != 'o' /* fnop */)
3518 return 3; /* non-waiting control op */
3519 break;
3520 case 'r':
3521 if (mnemonic[2] == 's')
3522 return 3; /* frstor/frstpm */
3523 break;
3524 case 's':
3525 if (mnemonic[2] == 'a')
3526 return 3; /* fsave */
3527 if (mnemonic[2] == 't')
3528 {
3529 switch (mnemonic[3])
3530 {
3531 case 'c': /* fstcw */
3532 case 'd': /* fstdw */
3533 case 'e': /* fstenv */
3534 case 's': /* fsts[gw] */
3535 return 3;
3536 }
3537 }
3538 break;
3539 case 'x':
3540 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3541 return 0; /* fxsave/fxrstor are not really math ops */
3542 break;
3543 }
252b5132 3544
9306ca4a 3545 return 1;
252b5132
RH
3546}
3547
c0f3af97
L
3548/* Build the VEX prefix. */
3549
3550static void
d3ce72d0 3551build_vex_prefix (const insn_template *t)
c0f3af97
L
3552{
3553 unsigned int register_specifier;
3554 unsigned int implied_prefix;
3555 unsigned int vector_length;
03751133 3556 unsigned int w;
c0f3af97
L
3557
3558 /* Check register specifier. */
3559 if (i.vex.register_specifier)
43234a1e
L
3560 {
3561 register_specifier =
3562 ~register_number (i.vex.register_specifier) & 0xf;
3563 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3564 }
c0f3af97
L
3565 else
3566 register_specifier = 0xf;
3567
79f0fa25
L
3568 /* Use 2-byte VEX prefix by swapping destination and source operand
3569 if there are more than 1 register operand. */
3570 if (i.reg_operands > 1
3571 && i.vec_encoding != vex_encoding_vex3
86fa6981 3572 && i.dir_encoding == dir_encoding_default
fa99fab2 3573 && i.operands == i.reg_operands
dbbc8b7e 3574 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
7f399153 3575 && i.tm.opcode_modifier.vexopcode == VEX0F
dbbc8b7e 3576 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3577 && i.rex == REX_B)
3578 {
3579 unsigned int xchg = i.operands - 1;
3580 union i386_op temp_op;
3581 i386_operand_type temp_type;
3582
3583 temp_type = i.types[xchg];
3584 i.types[xchg] = i.types[0];
3585 i.types[0] = temp_type;
3586 temp_op = i.op[xchg];
3587 i.op[xchg] = i.op[0];
3588 i.op[0] = temp_op;
3589
9c2799c2 3590 gas_assert (i.rm.mode == 3);
fa99fab2
L
3591
3592 i.rex = REX_R;
3593 xchg = i.rm.regmem;
3594 i.rm.regmem = i.rm.reg;
3595 i.rm.reg = xchg;
3596
dbbc8b7e
JB
3597 if (i.tm.opcode_modifier.d)
3598 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
3599 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
3600 else /* Use the next insn. */
3601 i.tm = t[1];
fa99fab2
L
3602 }
3603
79dec6b7
JB
3604 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3605 are no memory operands and at least 3 register ones. */
3606 if (i.reg_operands >= 3
3607 && i.vec_encoding != vex_encoding_vex3
3608 && i.reg_operands == i.operands - i.imm_operands
3609 && i.tm.opcode_modifier.vex
3610 && i.tm.opcode_modifier.commutative
3611 && (i.tm.opcode_modifier.sse2avx || optimize > 1)
3612 && i.rex == REX_B
3613 && i.vex.register_specifier
3614 && !(i.vex.register_specifier->reg_flags & RegRex))
3615 {
3616 unsigned int xchg = i.operands - i.reg_operands;
3617 union i386_op temp_op;
3618 i386_operand_type temp_type;
3619
3620 gas_assert (i.tm.opcode_modifier.vexopcode == VEX0F);
3621 gas_assert (!i.tm.opcode_modifier.sae);
3622 gas_assert (operand_type_equal (&i.types[i.operands - 2],
3623 &i.types[i.operands - 3]));
3624 gas_assert (i.rm.mode == 3);
3625
3626 temp_type = i.types[xchg];
3627 i.types[xchg] = i.types[xchg + 1];
3628 i.types[xchg + 1] = temp_type;
3629 temp_op = i.op[xchg];
3630 i.op[xchg] = i.op[xchg + 1];
3631 i.op[xchg + 1] = temp_op;
3632
3633 i.rex = 0;
3634 xchg = i.rm.regmem | 8;
3635 i.rm.regmem = ~register_specifier & 0xf;
3636 gas_assert (!(i.rm.regmem & 8));
3637 i.vex.register_specifier += xchg - i.rm.regmem;
3638 register_specifier = ~xchg & 0xf;
3639 }
3640
539f890d
L
3641 if (i.tm.opcode_modifier.vex == VEXScalar)
3642 vector_length = avxscalar;
10c17abd
JB
3643 else if (i.tm.opcode_modifier.vex == VEX256)
3644 vector_length = 1;
539f890d 3645 else
10c17abd 3646 {
56522fc5 3647 unsigned int op;
10c17abd 3648
c7213af9
L
3649 /* Determine vector length from the last multi-length vector
3650 operand. */
10c17abd 3651 vector_length = 0;
56522fc5 3652 for (op = t->operands; op--;)
10c17abd
JB
3653 if (t->operand_types[op].bitfield.xmmword
3654 && t->operand_types[op].bitfield.ymmword
3655 && i.types[op].bitfield.ymmword)
3656 {
3657 vector_length = 1;
3658 break;
3659 }
3660 }
c0f3af97
L
3661
3662 switch ((i.tm.base_opcode >> 8) & 0xff)
3663 {
3664 case 0:
3665 implied_prefix = 0;
3666 break;
3667 case DATA_PREFIX_OPCODE:
3668 implied_prefix = 1;
3669 break;
3670 case REPE_PREFIX_OPCODE:
3671 implied_prefix = 2;
3672 break;
3673 case REPNE_PREFIX_OPCODE:
3674 implied_prefix = 3;
3675 break;
3676 default:
3677 abort ();
3678 }
3679
03751133
L
3680 /* Check the REX.W bit and VEXW. */
3681 if (i.tm.opcode_modifier.vexw == VEXWIG)
3682 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
3683 else if (i.tm.opcode_modifier.vexw)
3684 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3685 else
931d03b7 3686 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3687
c0f3af97 3688 /* Use 2-byte VEX prefix if possible. */
03751133
L
3689 if (w == 0
3690 && i.vec_encoding != vex_encoding_vex3
86fa6981 3691 && i.tm.opcode_modifier.vexopcode == VEX0F
c0f3af97
L
3692 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3693 {
3694 /* 2-byte VEX prefix. */
3695 unsigned int r;
3696
3697 i.vex.length = 2;
3698 i.vex.bytes[0] = 0xc5;
3699
3700 /* Check the REX.R bit. */
3701 r = (i.rex & REX_R) ? 0 : 1;
3702 i.vex.bytes[1] = (r << 7
3703 | register_specifier << 3
3704 | vector_length << 2
3705 | implied_prefix);
3706 }
3707 else
3708 {
3709 /* 3-byte VEX prefix. */
03751133 3710 unsigned int m;
c0f3af97 3711
f88c9eb0 3712 i.vex.length = 3;
f88c9eb0 3713
7f399153 3714 switch (i.tm.opcode_modifier.vexopcode)
5dd85c99 3715 {
7f399153
L
3716 case VEX0F:
3717 m = 0x1;
80de6e00 3718 i.vex.bytes[0] = 0xc4;
7f399153
L
3719 break;
3720 case VEX0F38:
3721 m = 0x2;
80de6e00 3722 i.vex.bytes[0] = 0xc4;
7f399153
L
3723 break;
3724 case VEX0F3A:
3725 m = 0x3;
80de6e00 3726 i.vex.bytes[0] = 0xc4;
7f399153
L
3727 break;
3728 case XOP08:
5dd85c99
SP
3729 m = 0x8;
3730 i.vex.bytes[0] = 0x8f;
7f399153
L
3731 break;
3732 case XOP09:
f88c9eb0
SP
3733 m = 0x9;
3734 i.vex.bytes[0] = 0x8f;
7f399153
L
3735 break;
3736 case XOP0A:
f88c9eb0
SP
3737 m = 0xa;
3738 i.vex.bytes[0] = 0x8f;
7f399153
L
3739 break;
3740 default:
3741 abort ();
f88c9eb0 3742 }
c0f3af97 3743
c0f3af97
L
3744 /* The high 3 bits of the second VEX byte are 1's compliment
3745 of RXB bits from REX. */
3746 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3747
c0f3af97
L
3748 i.vex.bytes[2] = (w << 7
3749 | register_specifier << 3
3750 | vector_length << 2
3751 | implied_prefix);
3752 }
3753}
3754
e771e7c9
JB
3755static INLINE bfd_boolean
3756is_evex_encoding (const insn_template *t)
3757{
7091c612 3758 return t->opcode_modifier.evex || t->opcode_modifier.disp8memshift
e771e7c9 3759 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
a80195f1 3760 || t->opcode_modifier.sae;
e771e7c9
JB
3761}
3762
7a8655d2
JB
3763static INLINE bfd_boolean
3764is_any_vex_encoding (const insn_template *t)
3765{
3766 return t->opcode_modifier.vex || t->opcode_modifier.vexopcode
3767 || is_evex_encoding (t);
3768}
3769
43234a1e
L
3770/* Build the EVEX prefix. */
3771
3772static void
3773build_evex_prefix (void)
3774{
3775 unsigned int register_specifier;
3776 unsigned int implied_prefix;
3777 unsigned int m, w;
3778 rex_byte vrex_used = 0;
3779
3780 /* Check register specifier. */
3781 if (i.vex.register_specifier)
3782 {
3783 gas_assert ((i.vrex & REX_X) == 0);
3784
3785 register_specifier = i.vex.register_specifier->reg_num;
3786 if ((i.vex.register_specifier->reg_flags & RegRex))
3787 register_specifier += 8;
3788 /* The upper 16 registers are encoded in the fourth byte of the
3789 EVEX prefix. */
3790 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3791 i.vex.bytes[3] = 0x8;
3792 register_specifier = ~register_specifier & 0xf;
3793 }
3794 else
3795 {
3796 register_specifier = 0xf;
3797
3798 /* Encode upper 16 vector index register in the fourth byte of
3799 the EVEX prefix. */
3800 if (!(i.vrex & REX_X))
3801 i.vex.bytes[3] = 0x8;
3802 else
3803 vrex_used |= REX_X;
3804 }
3805
3806 switch ((i.tm.base_opcode >> 8) & 0xff)
3807 {
3808 case 0:
3809 implied_prefix = 0;
3810 break;
3811 case DATA_PREFIX_OPCODE:
3812 implied_prefix = 1;
3813 break;
3814 case REPE_PREFIX_OPCODE:
3815 implied_prefix = 2;
3816 break;
3817 case REPNE_PREFIX_OPCODE:
3818 implied_prefix = 3;
3819 break;
3820 default:
3821 abort ();
3822 }
3823
3824 /* 4 byte EVEX prefix. */
3825 i.vex.length = 4;
3826 i.vex.bytes[0] = 0x62;
3827
3828 /* mmmm bits. */
3829 switch (i.tm.opcode_modifier.vexopcode)
3830 {
3831 case VEX0F:
3832 m = 1;
3833 break;
3834 case VEX0F38:
3835 m = 2;
3836 break;
3837 case VEX0F3A:
3838 m = 3;
3839 break;
3840 default:
3841 abort ();
3842 break;
3843 }
3844
3845 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3846 bits from REX. */
3847 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3848
3849 /* The fifth bit of the second EVEX byte is 1's compliment of the
3850 REX_R bit in VREX. */
3851 if (!(i.vrex & REX_R))
3852 i.vex.bytes[1] |= 0x10;
3853 else
3854 vrex_used |= REX_R;
3855
3856 if ((i.reg_operands + i.imm_operands) == i.operands)
3857 {
3858 /* When all operands are registers, the REX_X bit in REX is not
3859 used. We reuse it to encode the upper 16 registers, which is
3860 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3861 as 1's compliment. */
3862 if ((i.vrex & REX_B))
3863 {
3864 vrex_used |= REX_B;
3865 i.vex.bytes[1] &= ~0x40;
3866 }
3867 }
3868
3869 /* EVEX instructions shouldn't need the REX prefix. */
3870 i.vrex &= ~vrex_used;
3871 gas_assert (i.vrex == 0);
3872
6865c043
L
3873 /* Check the REX.W bit and VEXW. */
3874 if (i.tm.opcode_modifier.vexw == VEXWIG)
3875 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
3876 else if (i.tm.opcode_modifier.vexw)
3877 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3878 else
931d03b7 3879 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e
L
3880
3881 /* Encode the U bit. */
3882 implied_prefix |= 0x4;
3883
3884 /* The third byte of the EVEX prefix. */
3885 i.vex.bytes[2] = (w << 7 | register_specifier << 3 | implied_prefix);
3886
3887 /* The fourth byte of the EVEX prefix. */
3888 /* The zeroing-masking bit. */
3889 if (i.mask && i.mask->zeroing)
3890 i.vex.bytes[3] |= 0x80;
3891
3892 /* Don't always set the broadcast bit if there is no RC. */
3893 if (!i.rounding)
3894 {
3895 /* Encode the vector length. */
3896 unsigned int vec_length;
3897
e771e7c9
JB
3898 if (!i.tm.opcode_modifier.evex
3899 || i.tm.opcode_modifier.evex == EVEXDYN)
3900 {
56522fc5 3901 unsigned int op;
e771e7c9 3902
c7213af9
L
3903 /* Determine vector length from the last multi-length vector
3904 operand. */
e771e7c9 3905 vec_length = 0;
56522fc5 3906 for (op = i.operands; op--;)
e771e7c9
JB
3907 if (i.tm.operand_types[op].bitfield.xmmword
3908 + i.tm.operand_types[op].bitfield.ymmword
3909 + i.tm.operand_types[op].bitfield.zmmword > 1)
3910 {
3911 if (i.types[op].bitfield.zmmword)
c7213af9
L
3912 {
3913 i.tm.opcode_modifier.evex = EVEX512;
3914 break;
3915 }
e771e7c9 3916 else if (i.types[op].bitfield.ymmword)
c7213af9
L
3917 {
3918 i.tm.opcode_modifier.evex = EVEX256;
3919 break;
3920 }
e771e7c9 3921 else if (i.types[op].bitfield.xmmword)
c7213af9
L
3922 {
3923 i.tm.opcode_modifier.evex = EVEX128;
3924 break;
3925 }
625cbd7a
JB
3926 else if (i.broadcast && (int) op == i.broadcast->operand)
3927 {
4a1b91ea 3928 switch (i.broadcast->bytes)
625cbd7a
JB
3929 {
3930 case 64:
3931 i.tm.opcode_modifier.evex = EVEX512;
3932 break;
3933 case 32:
3934 i.tm.opcode_modifier.evex = EVEX256;
3935 break;
3936 case 16:
3937 i.tm.opcode_modifier.evex = EVEX128;
3938 break;
3939 default:
c7213af9 3940 abort ();
625cbd7a 3941 }
c7213af9 3942 break;
625cbd7a 3943 }
e771e7c9 3944 }
c7213af9 3945
56522fc5 3946 if (op >= MAX_OPERANDS)
c7213af9 3947 abort ();
e771e7c9
JB
3948 }
3949
43234a1e
L
3950 switch (i.tm.opcode_modifier.evex)
3951 {
3952 case EVEXLIG: /* LL' is ignored */
3953 vec_length = evexlig << 5;
3954 break;
3955 case EVEX128:
3956 vec_length = 0 << 5;
3957 break;
3958 case EVEX256:
3959 vec_length = 1 << 5;
3960 break;
3961 case EVEX512:
3962 vec_length = 2 << 5;
3963 break;
3964 default:
3965 abort ();
3966 break;
3967 }
3968 i.vex.bytes[3] |= vec_length;
3969 /* Encode the broadcast bit. */
3970 if (i.broadcast)
3971 i.vex.bytes[3] |= 0x10;
3972 }
3973 else
3974 {
3975 if (i.rounding->type != saeonly)
3976 i.vex.bytes[3] |= 0x10 | (i.rounding->type << 5);
3977 else
d3d3c6db 3978 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e
L
3979 }
3980
3981 if (i.mask && i.mask->mask)
3982 i.vex.bytes[3] |= i.mask->mask->reg_num;
3983}
3984
65da13b5
L
3985static void
3986process_immext (void)
3987{
3988 expressionS *exp;
3989
c0f3af97 3990 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
3991 which is coded in the same place as an 8-bit immediate field
3992 would be. Here we fake an 8-bit immediate operand from the
3993 opcode suffix stored in tm.extension_opcode.
3994
c1e679ec 3995 AVX instructions also use this encoding, for some of
c0f3af97 3996 3 argument instructions. */
65da13b5 3997
43234a1e 3998 gas_assert (i.imm_operands <= 1
7ab9ffdd 3999 && (i.operands <= 2
7a8655d2 4000 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 4001 && i.operands <= 4)));
65da13b5
L
4002
4003 exp = &im_expressions[i.imm_operands++];
4004 i.op[i.operands].imms = exp;
4005 i.types[i.operands] = imm8;
4006 i.operands++;
4007 exp->X_op = O_constant;
4008 exp->X_add_number = i.tm.extension_opcode;
4009 i.tm.extension_opcode = None;
4010}
4011
42164a71
L
4012
4013static int
4014check_hle (void)
4015{
4016 switch (i.tm.opcode_modifier.hleprefixok)
4017 {
4018 default:
4019 abort ();
82c2def5 4020 case HLEPrefixNone:
165de32a
L
4021 as_bad (_("invalid instruction `%s' after `%s'"),
4022 i.tm.name, i.hle_prefix);
42164a71 4023 return 0;
82c2def5 4024 case HLEPrefixLock:
42164a71
L
4025 if (i.prefix[LOCK_PREFIX])
4026 return 1;
165de32a 4027 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 4028 return 0;
82c2def5 4029 case HLEPrefixAny:
42164a71 4030 return 1;
82c2def5 4031 case HLEPrefixRelease:
42164a71
L
4032 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
4033 {
4034 as_bad (_("instruction `%s' after `xacquire' not allowed"),
4035 i.tm.name);
4036 return 0;
4037 }
8dc0818e 4038 if (i.mem_operands == 0 || !(i.flags[i.operands - 1] & Operand_Mem))
42164a71
L
4039 {
4040 as_bad (_("memory destination needed for instruction `%s'"
4041 " after `xrelease'"), i.tm.name);
4042 return 0;
4043 }
4044 return 1;
4045 }
4046}
4047
b6f8c7c4
L
4048/* Try the shortest encoding by shortening operand size. */
4049
4050static void
4051optimize_encoding (void)
4052{
a0a1771e 4053 unsigned int j;
b6f8c7c4
L
4054
4055 if (optimize_for_space
72aea328 4056 && !is_any_vex_encoding (&i.tm)
b6f8c7c4
L
4057 && i.reg_operands == 1
4058 && i.imm_operands == 1
4059 && !i.types[1].bitfield.byte
4060 && i.op[0].imms->X_op == O_constant
4061 && fits_in_imm7 (i.op[0].imms->X_add_number)
72aea328 4062 && (i.tm.base_opcode == 0xa8
b6f8c7c4
L
4063 || (i.tm.base_opcode == 0xf6
4064 && i.tm.extension_opcode == 0x0)))
4065 {
4066 /* Optimize: -Os:
4067 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
4068 */
4069 unsigned int base_regnum = i.op[1].regs->reg_num;
4070 if (flag_code == CODE_64BIT || base_regnum < 4)
4071 {
4072 i.types[1].bitfield.byte = 1;
4073 /* Ignore the suffix. */
4074 i.suffix = 0;
7697afb6
JB
4075 /* Convert to byte registers. */
4076 if (i.types[1].bitfield.word)
4077 j = 16;
4078 else if (i.types[1].bitfield.dword)
4079 j = 32;
4080 else
4081 j = 48;
4082 if (!(i.op[1].regs->reg_flags & RegRex) && base_regnum < 4)
4083 j += 8;
4084 i.op[1].regs -= j;
b6f8c7c4
L
4085 }
4086 }
4087 else if (flag_code == CODE_64BIT
72aea328 4088 && !is_any_vex_encoding (&i.tm)
d3d50934
L
4089 && ((i.types[1].bitfield.qword
4090 && i.reg_operands == 1
b6f8c7c4
L
4091 && i.imm_operands == 1
4092 && i.op[0].imms->X_op == O_constant
507916b8 4093 && ((i.tm.base_opcode == 0xb8
b6f8c7c4
L
4094 && i.tm.extension_opcode == None
4095 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
4096 || (fits_in_imm31 (i.op[0].imms->X_add_number)
72aea328
JB
4097 && ((i.tm.base_opcode == 0x24
4098 || i.tm.base_opcode == 0xa8)
b6f8c7c4
L
4099 || (i.tm.base_opcode == 0x80
4100 && i.tm.extension_opcode == 0x4)
4101 || ((i.tm.base_opcode == 0xf6
507916b8 4102 || (i.tm.base_opcode | 1) == 0xc7)
b8364fa7
JB
4103 && i.tm.extension_opcode == 0x0)))
4104 || (fits_in_imm7 (i.op[0].imms->X_add_number)
4105 && i.tm.base_opcode == 0x83
4106 && i.tm.extension_opcode == 0x4)))
d3d50934
L
4107 || (i.types[0].bitfield.qword
4108 && ((i.reg_operands == 2
4109 && i.op[0].regs == i.op[1].regs
72aea328
JB
4110 && (i.tm.base_opcode == 0x30
4111 || i.tm.base_opcode == 0x28))
d3d50934
L
4112 || (i.reg_operands == 1
4113 && i.operands == 1
72aea328 4114 && i.tm.base_opcode == 0x30)))))
b6f8c7c4
L
4115 {
4116 /* Optimize: -O:
4117 andq $imm31, %r64 -> andl $imm31, %r32
b8364fa7 4118 andq $imm7, %r64 -> andl $imm7, %r32
b6f8c7c4
L
4119 testq $imm31, %r64 -> testl $imm31, %r32
4120 xorq %r64, %r64 -> xorl %r32, %r32
4121 subq %r64, %r64 -> subl %r32, %r32
4122 movq $imm31, %r64 -> movl $imm31, %r32
4123 movq $imm32, %r64 -> movl $imm32, %r32
4124 */
4125 i.tm.opcode_modifier.norex64 = 1;
507916b8 4126 if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4127 {
4128 /* Handle
4129 movq $imm31, %r64 -> movl $imm31, %r32
4130 movq $imm32, %r64 -> movl $imm32, %r32
4131 */
4132 i.tm.operand_types[0].bitfield.imm32 = 1;
4133 i.tm.operand_types[0].bitfield.imm32s = 0;
4134 i.tm.operand_types[0].bitfield.imm64 = 0;
4135 i.types[0].bitfield.imm32 = 1;
4136 i.types[0].bitfield.imm32s = 0;
4137 i.types[0].bitfield.imm64 = 0;
4138 i.types[1].bitfield.dword = 1;
4139 i.types[1].bitfield.qword = 0;
507916b8 4140 if ((i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4141 {
4142 /* Handle
4143 movq $imm31, %r64 -> movl $imm31, %r32
4144 */
507916b8 4145 i.tm.base_opcode = 0xb8;
b6f8c7c4 4146 i.tm.extension_opcode = None;
507916b8 4147 i.tm.opcode_modifier.w = 0;
b6f8c7c4
L
4148 i.tm.opcode_modifier.modrm = 0;
4149 }
4150 }
4151 }
5641ec01
JB
4152 else if (optimize > 1
4153 && !optimize_for_space
72aea328 4154 && !is_any_vex_encoding (&i.tm)
5641ec01
JB
4155 && i.reg_operands == 2
4156 && i.op[0].regs == i.op[1].regs
4157 && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8
4158 || (i.tm.base_opcode & ~(Opcode_D | 1)) == 0x20)
4159 && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword))
4160 {
4161 /* Optimize: -O2:
4162 andb %rN, %rN -> testb %rN, %rN
4163 andw %rN, %rN -> testw %rN, %rN
4164 andq %rN, %rN -> testq %rN, %rN
4165 orb %rN, %rN -> testb %rN, %rN
4166 orw %rN, %rN -> testw %rN, %rN
4167 orq %rN, %rN -> testq %rN, %rN
4168
4169 and outside of 64-bit mode
4170
4171 andl %rN, %rN -> testl %rN, %rN
4172 orl %rN, %rN -> testl %rN, %rN
4173 */
4174 i.tm.base_opcode = 0x84 | (i.tm.base_opcode & 1);
4175 }
99112332 4176 else if (i.reg_operands == 3
b6f8c7c4
L
4177 && i.op[0].regs == i.op[1].regs
4178 && !i.types[2].bitfield.xmmword
4179 && (i.tm.opcode_modifier.vex
7a69eac3 4180 || ((!i.mask || i.mask->zeroing)
b6f8c7c4 4181 && !i.rounding
e771e7c9 4182 && is_evex_encoding (&i.tm)
80c34c38 4183 && (i.vec_encoding != vex_encoding_evex
dd22218c 4184 || cpu_arch_isa_flags.bitfield.cpuavx512vl
80c34c38 4185 || i.tm.cpu_flags.bitfield.cpuavx512vl
7091c612 4186 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4187 && i.types[2].bitfield.ymmword))))
b6f8c7c4
L
4188 && ((i.tm.base_opcode == 0x55
4189 || i.tm.base_opcode == 0x6655
4190 || i.tm.base_opcode == 0x66df
4191 || i.tm.base_opcode == 0x57
4192 || i.tm.base_opcode == 0x6657
8305403a
L
4193 || i.tm.base_opcode == 0x66ef
4194 || i.tm.base_opcode == 0x66f8
4195 || i.tm.base_opcode == 0x66f9
4196 || i.tm.base_opcode == 0x66fa
1424ad86
JB
4197 || i.tm.base_opcode == 0x66fb
4198 || i.tm.base_opcode == 0x42
4199 || i.tm.base_opcode == 0x6642
4200 || i.tm.base_opcode == 0x47
4201 || i.tm.base_opcode == 0x6647)
b6f8c7c4
L
4202 && i.tm.extension_opcode == None))
4203 {
99112332 4204 /* Optimize: -O1:
8305403a
L
4205 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4206 vpsubq and vpsubw:
b6f8c7c4
L
4207 EVEX VOP %zmmM, %zmmM, %zmmN
4208 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4209 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4210 EVEX VOP %ymmM, %ymmM, %ymmN
4211 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4212 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4213 VEX VOP %ymmM, %ymmM, %ymmN
4214 -> VEX VOP %xmmM, %xmmM, %xmmN
4215 VOP, one of vpandn and vpxor:
4216 VEX VOP %ymmM, %ymmM, %ymmN
4217 -> VEX VOP %xmmM, %xmmM, %xmmN
4218 VOP, one of vpandnd and vpandnq:
4219 EVEX VOP %zmmM, %zmmM, %zmmN
4220 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4221 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4222 EVEX VOP %ymmM, %ymmM, %ymmN
4223 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4224 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4225 VOP, one of vpxord and vpxorq:
4226 EVEX VOP %zmmM, %zmmM, %zmmN
4227 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4228 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4229 EVEX VOP %ymmM, %ymmM, %ymmN
4230 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4231 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4232 VOP, one of kxord and kxorq:
4233 VEX VOP %kM, %kM, %kN
4234 -> VEX kxorw %kM, %kM, %kN
4235 VOP, one of kandnd and kandnq:
4236 VEX VOP %kM, %kM, %kN
4237 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4238 */
e771e7c9 4239 if (is_evex_encoding (&i.tm))
b6f8c7c4 4240 {
7b1d7ca1 4241 if (i.vec_encoding != vex_encoding_evex)
b6f8c7c4
L
4242 {
4243 i.tm.opcode_modifier.vex = VEX128;
4244 i.tm.opcode_modifier.vexw = VEXW0;
4245 i.tm.opcode_modifier.evex = 0;
4246 }
7b1d7ca1 4247 else if (optimize > 1)
dd22218c
L
4248 i.tm.opcode_modifier.evex = EVEX128;
4249 else
4250 return;
b6f8c7c4 4251 }
f74a6307 4252 else if (i.tm.operand_types[0].bitfield.class == RegMask)
1424ad86
JB
4253 {
4254 i.tm.base_opcode &= 0xff;
4255 i.tm.opcode_modifier.vexw = VEXW0;
4256 }
b6f8c7c4
L
4257 else
4258 i.tm.opcode_modifier.vex = VEX128;
4259
4260 if (i.tm.opcode_modifier.vex)
4261 for (j = 0; j < 3; j++)
4262 {
4263 i.types[j].bitfield.xmmword = 1;
4264 i.types[j].bitfield.ymmword = 0;
4265 }
4266 }
392a5972 4267 else if (i.vec_encoding != vex_encoding_evex
97ed31ae 4268 && !i.types[0].bitfield.zmmword
392a5972 4269 && !i.types[1].bitfield.zmmword
97ed31ae 4270 && !i.mask
a0a1771e 4271 && !i.broadcast
97ed31ae 4272 && is_evex_encoding (&i.tm)
392a5972
L
4273 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x666f
4274 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf36f
a0a1771e
JB
4275 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f
4276 || (i.tm.base_opcode & ~4) == 0x66db
4277 || (i.tm.base_opcode & ~4) == 0x66eb)
97ed31ae
L
4278 && i.tm.extension_opcode == None)
4279 {
4280 /* Optimize: -O1:
4281 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4282 vmovdqu32 and vmovdqu64:
4283 EVEX VOP %xmmM, %xmmN
4284 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4285 EVEX VOP %ymmM, %ymmN
4286 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4287 EVEX VOP %xmmM, mem
4288 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4289 EVEX VOP %ymmM, mem
4290 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4291 EVEX VOP mem, %xmmN
4292 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4293 EVEX VOP mem, %ymmN
4294 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
a0a1771e
JB
4295 VOP, one of vpand, vpandn, vpor, vpxor:
4296 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4297 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4298 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4299 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4300 EVEX VOP{d,q} mem, %xmmM, %xmmN
4301 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4302 EVEX VOP{d,q} mem, %ymmM, %ymmN
4303 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
97ed31ae 4304 */
a0a1771e 4305 for (j = 0; j < i.operands; j++)
392a5972
L
4306 if (operand_type_check (i.types[j], disp)
4307 && i.op[j].disps->X_op == O_constant)
4308 {
4309 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4310 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4311 bytes, we choose EVEX Disp8 over VEX Disp32. */
4312 int evex_disp8, vex_disp8;
4313 unsigned int memshift = i.memshift;
4314 offsetT n = i.op[j].disps->X_add_number;
4315
4316 evex_disp8 = fits_in_disp8 (n);
4317 i.memshift = 0;
4318 vex_disp8 = fits_in_disp8 (n);
4319 if (evex_disp8 != vex_disp8)
4320 {
4321 i.memshift = memshift;
4322 return;
4323 }
4324
4325 i.types[j].bitfield.disp8 = vex_disp8;
4326 break;
4327 }
4328 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f)
4329 i.tm.base_opcode ^= 0xf36f ^ 0xf26f;
97ed31ae
L
4330 i.tm.opcode_modifier.vex
4331 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4332 i.tm.opcode_modifier.vexw = VEXW0;
79dec6b7
JB
4333 /* VPAND, VPOR, and VPXOR are commutative. */
4334 if (i.reg_operands == 3 && i.tm.base_opcode != 0x66df)
4335 i.tm.opcode_modifier.commutative = 1;
97ed31ae
L
4336 i.tm.opcode_modifier.evex = 0;
4337 i.tm.opcode_modifier.masking = 0;
a0a1771e 4338 i.tm.opcode_modifier.broadcast = 0;
97ed31ae
L
4339 i.tm.opcode_modifier.disp8memshift = 0;
4340 i.memshift = 0;
a0a1771e
JB
4341 if (j < i.operands)
4342 i.types[j].bitfield.disp8
4343 = fits_in_disp8 (i.op[j].disps->X_add_number);
97ed31ae 4344 }
b6f8c7c4
L
4345}
4346
ae531041
L
4347/* Return non-zero for load instruction. */
4348
4349static int
4350load_insn_p (void)
4351{
4352 unsigned int dest;
4353 int any_vex_p = is_any_vex_encoding (&i.tm);
4354 unsigned int base_opcode = i.tm.base_opcode | 1;
4355
4356 if (!any_vex_p)
4357 {
a09f656b 4358 /* Anysize insns: lea, invlpg, clflush, prefetchnta, prefetcht0,
4359 prefetcht1, prefetcht2, prefetchtw, bndmk, bndcl, bndcu, bndcn,
4360 bndstx, bndldx, prefetchwt1, clflushopt, clwb, cldemote. */
4361 if (i.tm.opcode_modifier.anysize)
ae531041
L
4362 return 0;
4363
a09f656b 4364 /* pop, popf, popa. */
4365 if (strcmp (i.tm.name, "pop") == 0
4366 || i.tm.base_opcode == 0x9d
4367 || i.tm.base_opcode == 0x61)
ae531041
L
4368 return 1;
4369
4370 /* movs, cmps, lods, scas. */
4371 if ((i.tm.base_opcode | 0xb) == 0xaf)
4372 return 1;
4373
a09f656b 4374 /* outs, xlatb. */
4375 if (base_opcode == 0x6f
4376 || i.tm.base_opcode == 0xd7)
ae531041 4377 return 1;
a09f656b 4378 /* NB: For AMD-specific insns with implicit memory operands,
4379 they're intentionally not covered. */
ae531041
L
4380 }
4381
4382 /* No memory operand. */
4383 if (!i.mem_operands)
4384 return 0;
4385
4386 if (any_vex_p)
4387 {
4388 /* vldmxcsr. */
4389 if (i.tm.base_opcode == 0xae
4390 && i.tm.opcode_modifier.vex
4391 && i.tm.opcode_modifier.vexopcode == VEX0F
4392 && i.tm.extension_opcode == 2)
4393 return 1;
4394 }
4395 else
4396 {
4397 /* test, not, neg, mul, imul, div, idiv. */
4398 if ((i.tm.base_opcode == 0xf6 || i.tm.base_opcode == 0xf7)
4399 && i.tm.extension_opcode != 1)
4400 return 1;
4401
4402 /* inc, dec. */
4403 if (base_opcode == 0xff && i.tm.extension_opcode <= 1)
4404 return 1;
4405
4406 /* add, or, adc, sbb, and, sub, xor, cmp. */
4407 if (i.tm.base_opcode >= 0x80 && i.tm.base_opcode <= 0x83)
4408 return 1;
4409
4410 /* bt, bts, btr, btc. */
4411 if (i.tm.base_opcode == 0xfba
4412 && (i.tm.extension_opcode >= 4 && i.tm.extension_opcode <= 7))
4413 return 1;
4414
4415 /* rol, ror, rcl, rcr, shl/sal, shr, sar. */
4416 if ((base_opcode == 0xc1
4417 || (i.tm.base_opcode >= 0xd0 && i.tm.base_opcode <= 0xd3))
4418 && i.tm.extension_opcode != 6)
4419 return 1;
4420
4421 /* cmpxchg8b, cmpxchg16b, xrstors. */
4422 if (i.tm.base_opcode == 0xfc7
4423 && (i.tm.extension_opcode == 1 || i.tm.extension_opcode == 3))
4424 return 1;
4425
4426 /* fxrstor, ldmxcsr, xrstor. */
4427 if (i.tm.base_opcode == 0xfae
4428 && (i.tm.extension_opcode == 1
4429 || i.tm.extension_opcode == 2
4430 || i.tm.extension_opcode == 5))
4431 return 1;
4432
4433 /* lgdt, lidt, lmsw. */
4434 if (i.tm.base_opcode == 0xf01
4435 && (i.tm.extension_opcode == 2
4436 || i.tm.extension_opcode == 3
4437 || i.tm.extension_opcode == 6))
4438 return 1;
4439
4440 /* vmptrld */
4441 if (i.tm.base_opcode == 0xfc7
4442 && i.tm.extension_opcode == 6)
4443 return 1;
4444
4445 /* Check for x87 instructions. */
4446 if (i.tm.base_opcode >= 0xd8 && i.tm.base_opcode <= 0xdf)
4447 {
4448 /* Skip fst, fstp, fstenv, fstcw. */
4449 if (i.tm.base_opcode == 0xd9
4450 && (i.tm.extension_opcode == 2
4451 || i.tm.extension_opcode == 3
4452 || i.tm.extension_opcode == 6
4453 || i.tm.extension_opcode == 7))
4454 return 0;
4455
4456 /* Skip fisttp, fist, fistp, fstp. */
4457 if (i.tm.base_opcode == 0xdb
4458 && (i.tm.extension_opcode == 1
4459 || i.tm.extension_opcode == 2
4460 || i.tm.extension_opcode == 3
4461 || i.tm.extension_opcode == 7))
4462 return 0;
4463
4464 /* Skip fisttp, fst, fstp, fsave, fstsw. */
4465 if (i.tm.base_opcode == 0xdd
4466 && (i.tm.extension_opcode == 1
4467 || i.tm.extension_opcode == 2
4468 || i.tm.extension_opcode == 3
4469 || i.tm.extension_opcode == 6
4470 || i.tm.extension_opcode == 7))
4471 return 0;
4472
4473 /* Skip fisttp, fist, fistp, fbstp, fistp. */
4474 if (i.tm.base_opcode == 0xdf
4475 && (i.tm.extension_opcode == 1
4476 || i.tm.extension_opcode == 2
4477 || i.tm.extension_opcode == 3
4478 || i.tm.extension_opcode == 6
4479 || i.tm.extension_opcode == 7))
4480 return 0;
4481
4482 return 1;
4483 }
4484 }
4485
4486 dest = i.operands - 1;
4487
4488 /* Check fake imm8 operand and 3 source operands. */
4489 if ((i.tm.opcode_modifier.immext
4490 || i.tm.opcode_modifier.vexsources == VEX3SOURCES)
4491 && i.types[dest].bitfield.imm8)
4492 dest--;
4493
4494 /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg, xadd */
4495 if (!any_vex_p
4496 && (base_opcode == 0x1
4497 || base_opcode == 0x9
4498 || base_opcode == 0x11
4499 || base_opcode == 0x19
4500 || base_opcode == 0x21
4501 || base_opcode == 0x29
4502 || base_opcode == 0x31
4503 || base_opcode == 0x39
4504 || (i.tm.base_opcode >= 0x84 && i.tm.base_opcode <= 0x87)
4505 || base_opcode == 0xfc1))
4506 return 1;
4507
4508 /* Check for load instruction. */
4509 return (i.types[dest].bitfield.class != ClassNone
4510 || i.types[dest].bitfield.instance == Accum);
4511}
4512
4513/* Output lfence, 0xfaee8, after instruction. */
4514
4515static void
4516insert_lfence_after (void)
4517{
4518 if (lfence_after_load && load_insn_p ())
4519 {
a09f656b 4520 /* There are also two REP string instructions that require
4521 special treatment. Specifically, the compare string (CMPS)
4522 and scan string (SCAS) instructions set EFLAGS in a manner
4523 that depends on the data being compared/scanned. When used
4524 with a REP prefix, the number of iterations may therefore
4525 vary depending on this data. If the data is a program secret
4526 chosen by the adversary using an LVI method,
4527 then this data-dependent behavior may leak some aspect
4528 of the secret. */
4529 if (((i.tm.base_opcode | 0x1) == 0xa7
4530 || (i.tm.base_opcode | 0x1) == 0xaf)
4531 && i.prefix[REP_PREFIX])
4532 {
4533 as_warn (_("`%s` changes flags which would affect control flow behavior"),
4534 i.tm.name);
4535 }
ae531041
L
4536 char *p = frag_more (3);
4537 *p++ = 0xf;
4538 *p++ = 0xae;
4539 *p = 0xe8;
4540 }
4541}
4542
4543/* Output lfence, 0xfaee8, before instruction. */
4544
4545static void
4546insert_lfence_before (void)
4547{
4548 char *p;
4549
4550 if (is_any_vex_encoding (&i.tm))
4551 return;
4552
4553 if (i.tm.base_opcode == 0xff
4554 && (i.tm.extension_opcode == 2 || i.tm.extension_opcode == 4))
4555 {
4556 /* Insert lfence before indirect branch if needed. */
4557
4558 if (lfence_before_indirect_branch == lfence_branch_none)
4559 return;
4560
4561 if (i.operands != 1)
4562 abort ();
4563
4564 if (i.reg_operands == 1)
4565 {
4566 /* Indirect branch via register. Don't insert lfence with
4567 -mlfence-after-load=yes. */
4568 if (lfence_after_load
4569 || lfence_before_indirect_branch == lfence_branch_memory)
4570 return;
4571 }
4572 else if (i.mem_operands == 1
4573 && lfence_before_indirect_branch != lfence_branch_register)
4574 {
4575 as_warn (_("indirect `%s` with memory operand should be avoided"),
4576 i.tm.name);
4577 return;
4578 }
4579 else
4580 return;
4581
4582 if (last_insn.kind != last_insn_other
4583 && last_insn.seg == now_seg)
4584 {
4585 as_warn_where (last_insn.file, last_insn.line,
4586 _("`%s` skips -mlfence-before-indirect-branch on `%s`"),
4587 last_insn.name, i.tm.name);
4588 return;
4589 }
4590
4591 p = frag_more (3);
4592 *p++ = 0xf;
4593 *p++ = 0xae;
4594 *p = 0xe8;
4595 return;
4596 }
4597
503648e4 4598 /* Output or/not/shl and lfence before near ret. */
ae531041
L
4599 if (lfence_before_ret != lfence_before_ret_none
4600 && (i.tm.base_opcode == 0xc2
503648e4 4601 || i.tm.base_opcode == 0xc3))
ae531041
L
4602 {
4603 if (last_insn.kind != last_insn_other
4604 && last_insn.seg == now_seg)
4605 {
4606 as_warn_where (last_insn.file, last_insn.line,
4607 _("`%s` skips -mlfence-before-ret on `%s`"),
4608 last_insn.name, i.tm.name);
4609 return;
4610 }
a09f656b 4611
a09f656b 4612 /* Near ret ingore operand size override under CPU64. */
503648e4 4613 char prefix = flag_code == CODE_64BIT
4614 ? 0x48
4615 : i.prefix[DATA_PREFIX] ? 0x66 : 0x0;
a09f656b 4616
4617 if (lfence_before_ret == lfence_before_ret_not)
4618 {
4619 /* not: 0xf71424, may add prefix
4620 for operand size override or 64-bit code. */
4621 p = frag_more ((prefix ? 2 : 0) + 6 + 3);
4622 if (prefix)
4623 *p++ = prefix;
ae531041
L
4624 *p++ = 0xf7;
4625 *p++ = 0x14;
4626 *p++ = 0x24;
a09f656b 4627 if (prefix)
4628 *p++ = prefix;
ae531041
L
4629 *p++ = 0xf7;
4630 *p++ = 0x14;
4631 *p++ = 0x24;
4632 }
a09f656b 4633 else
4634 {
4635 p = frag_more ((prefix ? 1 : 0) + 4 + 3);
4636 if (prefix)
4637 *p++ = prefix;
4638 if (lfence_before_ret == lfence_before_ret_or)
4639 {
4640 /* or: 0x830c2400, may add prefix
4641 for operand size override or 64-bit code. */
4642 *p++ = 0x83;
4643 *p++ = 0x0c;
4644 }
4645 else
4646 {
4647 /* shl: 0xc1242400, may add prefix
4648 for operand size override or 64-bit code. */
4649 *p++ = 0xc1;
4650 *p++ = 0x24;
4651 }
4652
4653 *p++ = 0x24;
4654 *p++ = 0x0;
4655 }
4656
ae531041
L
4657 *p++ = 0xf;
4658 *p++ = 0xae;
4659 *p = 0xe8;
4660 }
4661}
4662
252b5132
RH
4663/* This is the guts of the machine-dependent assembler. LINE points to a
4664 machine dependent instruction. This function is supposed to emit
4665 the frags/bytes it assembles to. */
4666
4667void
65da13b5 4668md_assemble (char *line)
252b5132 4669{
40fb9820 4670 unsigned int j;
83b16ac6 4671 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 4672 const insn_template *t;
252b5132 4673
47926f60 4674 /* Initialize globals. */
252b5132
RH
4675 memset (&i, '\0', sizeof (i));
4676 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 4677 i.reloc[j] = NO_RELOC;
252b5132
RH
4678 memset (disp_expressions, '\0', sizeof (disp_expressions));
4679 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 4680 save_stack_p = save_stack;
252b5132
RH
4681
4682 /* First parse an instruction mnemonic & call i386_operand for the operands.
4683 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 4684 start of a (possibly prefixed) mnemonic. */
252b5132 4685
29b0f896
AM
4686 line = parse_insn (line, mnemonic);
4687 if (line == NULL)
4688 return;
83b16ac6 4689 mnem_suffix = i.suffix;
252b5132 4690
29b0f896 4691 line = parse_operands (line, mnemonic);
ee86248c 4692 this_operand = -1;
8325cc63
JB
4693 xfree (i.memop1_string);
4694 i.memop1_string = NULL;
29b0f896
AM
4695 if (line == NULL)
4696 return;
252b5132 4697
29b0f896
AM
4698 /* Now we've parsed the mnemonic into a set of templates, and have the
4699 operands at hand. */
4700
b630c145
JB
4701 /* All Intel opcodes have reversed operands except for "bound", "enter",
4702 "monitor*", "mwait*", "tpause", and "umwait". We also don't reverse
4703 intersegment "jmp" and "call" instructions with 2 immediate operands so
4704 that the immediate segment precedes the offset, as it does when in AT&T
4705 mode. */
4d456e3d
L
4706 if (intel_syntax
4707 && i.operands > 1
29b0f896 4708 && (strcmp (mnemonic, "bound") != 0)
30123838 4709 && (strcmp (mnemonic, "invlpga") != 0)
eedb0f2c
JB
4710 && (strncmp (mnemonic, "monitor", 7) != 0)
4711 && (strncmp (mnemonic, "mwait", 5) != 0)
b630c145
JB
4712 && (strcmp (mnemonic, "tpause") != 0)
4713 && (strcmp (mnemonic, "umwait") != 0)
40fb9820
L
4714 && !(operand_type_check (i.types[0], imm)
4715 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4716 swap_operands ();
4717
ec56d5c0
JB
4718 /* The order of the immediates should be reversed
4719 for 2 immediates extrq and insertq instructions */
4720 if (i.imm_operands == 2
4721 && (strcmp (mnemonic, "extrq") == 0
4722 || strcmp (mnemonic, "insertq") == 0))
4723 swap_2_operands (0, 1);
4724
29b0f896
AM
4725 if (i.imm_operands)
4726 optimize_imm ();
4727
b300c311
L
4728 /* Don't optimize displacement for movabs since it only takes 64bit
4729 displacement. */
4730 if (i.disp_operands
a501d77e 4731 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4732 && (flag_code != CODE_64BIT
4733 || strcmp (mnemonic, "movabs") != 0))
4734 optimize_disp ();
29b0f896
AM
4735
4736 /* Next, we find a template that matches the given insn,
4737 making sure the overlap of the given operands types is consistent
4738 with the template operand types. */
252b5132 4739
83b16ac6 4740 if (!(t = match_template (mnem_suffix)))
29b0f896 4741 return;
252b5132 4742
7bab8ab5 4743 if (sse_check != check_none
81f8a913 4744 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4745 && !i.tm.cpu_flags.bitfield.cpuavx
569d50f1 4746 && !i.tm.cpu_flags.bitfield.cpuavx512f
daf50ae7
L
4747 && (i.tm.cpu_flags.bitfield.cpusse
4748 || i.tm.cpu_flags.bitfield.cpusse2
4749 || i.tm.cpu_flags.bitfield.cpusse3
4750 || i.tm.cpu_flags.bitfield.cpussse3
4751 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e 4752 || i.tm.cpu_flags.bitfield.cpusse4_2
569d50f1 4753 || i.tm.cpu_flags.bitfield.cpusse4a
6e3e5c9e
JB
4754 || i.tm.cpu_flags.bitfield.cpupclmul
4755 || i.tm.cpu_flags.bitfield.cpuaes
569d50f1 4756 || i.tm.cpu_flags.bitfield.cpusha
6e3e5c9e 4757 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4758 {
7bab8ab5 4759 (sse_check == check_warning
daf50ae7
L
4760 ? as_warn
4761 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4762 }
4763
40fb9820 4764 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4765 if (!add_prefix (FWAIT_OPCODE))
4766 return;
252b5132 4767
d5de92cf
L
4768 /* Check if REP prefix is OK. */
4769 if (i.rep_prefix && !i.tm.opcode_modifier.repprefixok)
4770 {
4771 as_bad (_("invalid instruction `%s' after `%s'"),
4772 i.tm.name, i.rep_prefix);
4773 return;
4774 }
4775
c1ba0266
L
4776 /* Check for lock without a lockable instruction. Destination operand
4777 must be memory unless it is xchg (0x86). */
c32fa91d
L
4778 if (i.prefix[LOCK_PREFIX]
4779 && (!i.tm.opcode_modifier.islockable
c1ba0266
L
4780 || i.mem_operands == 0
4781 || (i.tm.base_opcode != 0x86
8dc0818e 4782 && !(i.flags[i.operands - 1] & Operand_Mem))))
c32fa91d
L
4783 {
4784 as_bad (_("expecting lockable instruction after `lock'"));
4785 return;
4786 }
4787
7a8655d2
JB
4788 /* Check for data size prefix on VEX/XOP/EVEX encoded insns. */
4789 if (i.prefix[DATA_PREFIX] && is_any_vex_encoding (&i.tm))
4790 {
4791 as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
4792 return;
4793 }
4794
42164a71 4795 /* Check if HLE prefix is OK. */
165de32a 4796 if (i.hle_prefix && !check_hle ())
42164a71
L
4797 return;
4798
7e8b059b
L
4799 /* Check BND prefix. */
4800 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
4801 as_bad (_("expecting valid branch instruction after `bnd'"));
4802
04ef582a 4803 /* Check NOTRACK prefix. */
9fef80d6
L
4804 if (i.notrack_prefix && !i.tm.opcode_modifier.notrackprefixok)
4805 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 4806
327e8c42
JB
4807 if (i.tm.cpu_flags.bitfield.cpumpx)
4808 {
4809 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4810 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
4811 else if (flag_code != CODE_16BIT
4812 ? i.prefix[ADDR_PREFIX]
4813 : i.mem_operands && !i.prefix[ADDR_PREFIX])
4814 as_bad (_("16-bit address isn't allowed in MPX instructions"));
4815 }
7e8b059b
L
4816
4817 /* Insert BND prefix. */
76d3a78a
JB
4818 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
4819 {
4820 if (!i.prefix[BND_PREFIX])
4821 add_prefix (BND_PREFIX_OPCODE);
4822 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
4823 {
4824 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
4825 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
4826 }
4827 }
7e8b059b 4828
29b0f896 4829 /* Check string instruction segment overrides. */
51c8edf6 4830 if (i.tm.opcode_modifier.isstring >= IS_STRING_ES_OP0)
29b0f896 4831 {
51c8edf6 4832 gas_assert (i.mem_operands);
29b0f896 4833 if (!check_string ())
5dd0794d 4834 return;
fc0763e6 4835 i.disp_operands = 0;
29b0f896 4836 }
5dd0794d 4837
b6f8c7c4
L
4838 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
4839 optimize_encoding ();
4840
29b0f896
AM
4841 if (!process_suffix ())
4842 return;
e413e4e9 4843
bc0844ae
L
4844 /* Update operand types. */
4845 for (j = 0; j < i.operands; j++)
4846 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
4847
29b0f896
AM
4848 /* Make still unresolved immediate matches conform to size of immediate
4849 given in i.suffix. */
4850 if (!finalize_imm ())
4851 return;
252b5132 4852
40fb9820 4853 if (i.types[0].bitfield.imm1)
29b0f896 4854 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 4855
9afe6eb8
L
4856 /* We only need to check those implicit registers for instructions
4857 with 3 operands or less. */
4858 if (i.operands <= 3)
4859 for (j = 0; j < i.operands; j++)
75e5731b
JB
4860 if (i.types[j].bitfield.instance != InstanceNone
4861 && !i.types[j].bitfield.xmmword)
9afe6eb8 4862 i.reg_operands--;
40fb9820 4863
c0f3af97
L
4864 /* ImmExt should be processed after SSE2AVX. */
4865 if (!i.tm.opcode_modifier.sse2avx
4866 && i.tm.opcode_modifier.immext)
65da13b5 4867 process_immext ();
252b5132 4868
29b0f896
AM
4869 /* For insns with operands there are more diddles to do to the opcode. */
4870 if (i.operands)
4871 {
4872 if (!process_operands ())
4873 return;
4874 }
40fb9820 4875 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
4876 {
4877 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
4878 as_warn (_("translating to `%sp'"), i.tm.name);
4879 }
252b5132 4880
7a8655d2 4881 if (is_any_vex_encoding (&i.tm))
9e5e5283 4882 {
c1dc7af5 4883 if (!cpu_arch_flags.bitfield.cpui286)
9e5e5283 4884 {
c1dc7af5 4885 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
9e5e5283
L
4886 i.tm.name);
4887 return;
4888 }
c0f3af97 4889
9e5e5283
L
4890 if (i.tm.opcode_modifier.vex)
4891 build_vex_prefix (t);
4892 else
4893 build_evex_prefix ();
4894 }
43234a1e 4895
5dd85c99
SP
4896 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
4897 instructions may define INT_OPCODE as well, so avoid this corner
4898 case for those instructions that use MODRM. */
4899 if (i.tm.base_opcode == INT_OPCODE
a6461c02
SP
4900 && !i.tm.opcode_modifier.modrm
4901 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
4902 {
4903 i.tm.base_opcode = INT3_OPCODE;
4904 i.imm_operands = 0;
4905 }
252b5132 4906
0cfa3eb3
JB
4907 if ((i.tm.opcode_modifier.jump == JUMP
4908 || i.tm.opcode_modifier.jump == JUMP_BYTE
4909 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896
AM
4910 && i.op[0].disps->X_op == O_constant)
4911 {
4912 /* Convert "jmp constant" (and "call constant") to a jump (call) to
4913 the absolute address given by the constant. Since ix86 jumps and
4914 calls are pc relative, we need to generate a reloc. */
4915 i.op[0].disps->X_add_symbol = &abs_symbol;
4916 i.op[0].disps->X_op = O_symbol;
4917 }
252b5132 4918
29b0f896
AM
4919 /* For 8 bit registers we need an empty rex prefix. Also if the
4920 instruction already has a prefix, we need to convert old
4921 registers to new ones. */
773f551c 4922
bab6aec1 4923 if ((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte
29b0f896 4924 && (i.op[0].regs->reg_flags & RegRex64) != 0)
bab6aec1 4925 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte
29b0f896 4926 && (i.op[1].regs->reg_flags & RegRex64) != 0)
bab6aec1
JB
4927 || (((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte)
4928 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte))
29b0f896
AM
4929 && i.rex != 0))
4930 {
4931 int x;
726c5dcd 4932
29b0f896
AM
4933 i.rex |= REX_OPCODE;
4934 for (x = 0; x < 2; x++)
4935 {
4936 /* Look for 8 bit operand that uses old registers. */
bab6aec1 4937 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
29b0f896 4938 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 4939 {
3f93af61 4940 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
29b0f896
AM
4941 /* In case it is "hi" register, give up. */
4942 if (i.op[x].regs->reg_num > 3)
a540244d 4943 as_bad (_("can't encode register '%s%s' in an "
4eed87de 4944 "instruction requiring REX prefix."),
a540244d 4945 register_prefix, i.op[x].regs->reg_name);
773f551c 4946
29b0f896
AM
4947 /* Otherwise it is equivalent to the extended register.
4948 Since the encoding doesn't change this is merely
4949 cosmetic cleanup for debug output. */
4950
4951 i.op[x].regs = i.op[x].regs + 8;
773f551c 4952 }
29b0f896
AM
4953 }
4954 }
773f551c 4955
6b6b6807
L
4956 if (i.rex == 0 && i.rex_encoding)
4957 {
4958 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
3f93af61 4959 that uses legacy register. If it is "hi" register, don't add
6b6b6807
L
4960 the REX_OPCODE byte. */
4961 int x;
4962 for (x = 0; x < 2; x++)
bab6aec1 4963 if (i.types[x].bitfield.class == Reg
6b6b6807
L
4964 && i.types[x].bitfield.byte
4965 && (i.op[x].regs->reg_flags & RegRex64) == 0
4966 && i.op[x].regs->reg_num > 3)
4967 {
3f93af61 4968 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
6b6b6807
L
4969 i.rex_encoding = FALSE;
4970 break;
4971 }
4972
4973 if (i.rex_encoding)
4974 i.rex = REX_OPCODE;
4975 }
4976
7ab9ffdd 4977 if (i.rex != 0)
29b0f896
AM
4978 add_prefix (REX_OPCODE | i.rex);
4979
ae531041
L
4980 insert_lfence_before ();
4981
29b0f896
AM
4982 /* We are ready to output the insn. */
4983 output_insn ();
e379e5f3 4984
ae531041
L
4985 insert_lfence_after ();
4986
e379e5f3
L
4987 last_insn.seg = now_seg;
4988
4989 if (i.tm.opcode_modifier.isprefix)
4990 {
4991 last_insn.kind = last_insn_prefix;
4992 last_insn.name = i.tm.name;
4993 last_insn.file = as_where (&last_insn.line);
4994 }
4995 else
4996 last_insn.kind = last_insn_other;
29b0f896
AM
4997}
4998
4999static char *
e3bb37b5 5000parse_insn (char *line, char *mnemonic)
29b0f896
AM
5001{
5002 char *l = line;
5003 char *token_start = l;
5004 char *mnem_p;
5c6af06e 5005 int supported;
d3ce72d0 5006 const insn_template *t;
b6169b20 5007 char *dot_p = NULL;
29b0f896 5008
29b0f896
AM
5009 while (1)
5010 {
5011 mnem_p = mnemonic;
5012 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
5013 {
b6169b20
L
5014 if (*mnem_p == '.')
5015 dot_p = mnem_p;
29b0f896
AM
5016 mnem_p++;
5017 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 5018 {
29b0f896
AM
5019 as_bad (_("no such instruction: `%s'"), token_start);
5020 return NULL;
5021 }
5022 l++;
5023 }
5024 if (!is_space_char (*l)
5025 && *l != END_OF_INSN
e44823cf
JB
5026 && (intel_syntax
5027 || (*l != PREFIX_SEPARATOR
5028 && *l != ',')))
29b0f896
AM
5029 {
5030 as_bad (_("invalid character %s in mnemonic"),
5031 output_invalid (*l));
5032 return NULL;
5033 }
5034 if (token_start == l)
5035 {
e44823cf 5036 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
5037 as_bad (_("expecting prefix; got nothing"));
5038 else
5039 as_bad (_("expecting mnemonic; got nothing"));
5040 return NULL;
5041 }
45288df1 5042
29b0f896 5043 /* Look up instruction (or prefix) via hash table. */
d3ce72d0 5044 current_templates = (const templates *) hash_find (op_hash, mnemonic);
47926f60 5045
29b0f896
AM
5046 if (*l != END_OF_INSN
5047 && (!is_space_char (*l) || l[1] != END_OF_INSN)
5048 && current_templates
40fb9820 5049 && current_templates->start->opcode_modifier.isprefix)
29b0f896 5050 {
c6fb90c8 5051 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
5052 {
5053 as_bad ((flag_code != CODE_64BIT
5054 ? _("`%s' is only supported in 64-bit mode")
5055 : _("`%s' is not supported in 64-bit mode")),
5056 current_templates->start->name);
5057 return NULL;
5058 }
29b0f896
AM
5059 /* If we are in 16-bit mode, do not allow addr16 or data16.
5060 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
5061 if ((current_templates->start->opcode_modifier.size == SIZE16
5062 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 5063 && flag_code != CODE_64BIT
673fe0f0 5064 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
5065 ^ (flag_code == CODE_16BIT)))
5066 {
5067 as_bad (_("redundant %s prefix"),
5068 current_templates->start->name);
5069 return NULL;
45288df1 5070 }
86fa6981 5071 if (current_templates->start->opcode_length == 0)
29b0f896 5072 {
86fa6981
L
5073 /* Handle pseudo prefixes. */
5074 switch (current_templates->start->base_opcode)
5075 {
5076 case 0x0:
5077 /* {disp8} */
5078 i.disp_encoding = disp_encoding_8bit;
5079 break;
5080 case 0x1:
5081 /* {disp32} */
5082 i.disp_encoding = disp_encoding_32bit;
5083 break;
5084 case 0x2:
5085 /* {load} */
5086 i.dir_encoding = dir_encoding_load;
5087 break;
5088 case 0x3:
5089 /* {store} */
5090 i.dir_encoding = dir_encoding_store;
5091 break;
5092 case 0x4:
42e04b36
L
5093 /* {vex} */
5094 i.vec_encoding = vex_encoding_vex;
86fa6981
L
5095 break;
5096 case 0x5:
5097 /* {vex3} */
5098 i.vec_encoding = vex_encoding_vex3;
5099 break;
5100 case 0x6:
5101 /* {evex} */
5102 i.vec_encoding = vex_encoding_evex;
5103 break;
6b6b6807
L
5104 case 0x7:
5105 /* {rex} */
5106 i.rex_encoding = TRUE;
5107 break;
b6f8c7c4
L
5108 case 0x8:
5109 /* {nooptimize} */
5110 i.no_optimize = TRUE;
5111 break;
86fa6981
L
5112 default:
5113 abort ();
5114 }
5115 }
5116 else
5117 {
5118 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 5119 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 5120 {
4e9ac44a
L
5121 case PREFIX_EXIST:
5122 return NULL;
5123 case PREFIX_DS:
d777820b 5124 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
5125 i.notrack_prefix = current_templates->start->name;
5126 break;
5127 case PREFIX_REP:
5128 if (current_templates->start->cpu_flags.bitfield.cpuhle)
5129 i.hle_prefix = current_templates->start->name;
5130 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
5131 i.bnd_prefix = current_templates->start->name;
5132 else
5133 i.rep_prefix = current_templates->start->name;
5134 break;
5135 default:
5136 break;
86fa6981 5137 }
29b0f896
AM
5138 }
5139 /* Skip past PREFIX_SEPARATOR and reset token_start. */
5140 token_start = ++l;
5141 }
5142 else
5143 break;
5144 }
45288df1 5145
30a55f88 5146 if (!current_templates)
b6169b20 5147 {
07d5e953
JB
5148 /* Deprecated functionality (new code should use pseudo-prefixes instead):
5149 Check if we should swap operand or force 32bit displacement in
f8a5c266 5150 encoding. */
30a55f88 5151 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 5152 i.dir_encoding = dir_encoding_swap;
8d63c93e 5153 else if (mnem_p - 3 == dot_p
a501d77e
L
5154 && dot_p[1] == 'd'
5155 && dot_p[2] == '8')
5156 i.disp_encoding = disp_encoding_8bit;
8d63c93e 5157 else if (mnem_p - 4 == dot_p
f8a5c266
L
5158 && dot_p[1] == 'd'
5159 && dot_p[2] == '3'
5160 && dot_p[3] == '2')
a501d77e 5161 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
5162 else
5163 goto check_suffix;
5164 mnem_p = dot_p;
5165 *dot_p = '\0';
d3ce72d0 5166 current_templates = (const templates *) hash_find (op_hash, mnemonic);
b6169b20
L
5167 }
5168
29b0f896
AM
5169 if (!current_templates)
5170 {
dc1e8a47 5171 check_suffix:
1c529385 5172 if (mnem_p > mnemonic)
29b0f896 5173 {
1c529385
LH
5174 /* See if we can get a match by trimming off a suffix. */
5175 switch (mnem_p[-1])
29b0f896 5176 {
1c529385
LH
5177 case WORD_MNEM_SUFFIX:
5178 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
5179 i.suffix = SHORT_MNEM_SUFFIX;
5180 else
1c529385
LH
5181 /* Fall through. */
5182 case BYTE_MNEM_SUFFIX:
5183 case QWORD_MNEM_SUFFIX:
5184 i.suffix = mnem_p[-1];
29b0f896 5185 mnem_p[-1] = '\0';
d3ce72d0 5186 current_templates = (const templates *) hash_find (op_hash,
1c529385
LH
5187 mnemonic);
5188 break;
5189 case SHORT_MNEM_SUFFIX:
5190 case LONG_MNEM_SUFFIX:
5191 if (!intel_syntax)
5192 {
5193 i.suffix = mnem_p[-1];
5194 mnem_p[-1] = '\0';
5195 current_templates = (const templates *) hash_find (op_hash,
5196 mnemonic);
5197 }
5198 break;
5199
5200 /* Intel Syntax. */
5201 case 'd':
5202 if (intel_syntax)
5203 {
5204 if (intel_float_operand (mnemonic) == 1)
5205 i.suffix = SHORT_MNEM_SUFFIX;
5206 else
5207 i.suffix = LONG_MNEM_SUFFIX;
5208 mnem_p[-1] = '\0';
5209 current_templates = (const templates *) hash_find (op_hash,
5210 mnemonic);
5211 }
5212 break;
29b0f896 5213 }
29b0f896 5214 }
1c529385 5215
29b0f896
AM
5216 if (!current_templates)
5217 {
5218 as_bad (_("no such instruction: `%s'"), token_start);
5219 return NULL;
5220 }
5221 }
252b5132 5222
0cfa3eb3
JB
5223 if (current_templates->start->opcode_modifier.jump == JUMP
5224 || current_templates->start->opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
5225 {
5226 /* Check for a branch hint. We allow ",pt" and ",pn" for
5227 predict taken and predict not taken respectively.
5228 I'm not sure that branch hints actually do anything on loop
5229 and jcxz insns (JumpByte) for current Pentium4 chips. They
5230 may work in the future and it doesn't hurt to accept them
5231 now. */
5232 if (l[0] == ',' && l[1] == 'p')
5233 {
5234 if (l[2] == 't')
5235 {
5236 if (!add_prefix (DS_PREFIX_OPCODE))
5237 return NULL;
5238 l += 3;
5239 }
5240 else if (l[2] == 'n')
5241 {
5242 if (!add_prefix (CS_PREFIX_OPCODE))
5243 return NULL;
5244 l += 3;
5245 }
5246 }
5247 }
5248 /* Any other comma loses. */
5249 if (*l == ',')
5250 {
5251 as_bad (_("invalid character %s in mnemonic"),
5252 output_invalid (*l));
5253 return NULL;
5254 }
252b5132 5255
29b0f896 5256 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
5257 supported = 0;
5258 for (t = current_templates->start; t < current_templates->end; ++t)
5259 {
c0f3af97
L
5260 supported |= cpu_flags_match (t);
5261 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
5262 {
5263 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
5264 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 5265
548d0ee6
JB
5266 return l;
5267 }
29b0f896 5268 }
3629bb00 5269
548d0ee6
JB
5270 if (!(supported & CPU_FLAGS_64BIT_MATCH))
5271 as_bad (flag_code == CODE_64BIT
5272 ? _("`%s' is not supported in 64-bit mode")
5273 : _("`%s' is only supported in 64-bit mode"),
5274 current_templates->start->name);
5275 else
5276 as_bad (_("`%s' is not supported on `%s%s'"),
5277 current_templates->start->name,
5278 cpu_arch_name ? cpu_arch_name : default_arch,
5279 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 5280
548d0ee6 5281 return NULL;
29b0f896 5282}
252b5132 5283
29b0f896 5284static char *
e3bb37b5 5285parse_operands (char *l, const char *mnemonic)
29b0f896
AM
5286{
5287 char *token_start;
3138f287 5288
29b0f896
AM
5289 /* 1 if operand is pending after ','. */
5290 unsigned int expecting_operand = 0;
252b5132 5291
29b0f896
AM
5292 /* Non-zero if operand parens not balanced. */
5293 unsigned int paren_not_balanced;
5294
5295 while (*l != END_OF_INSN)
5296 {
5297 /* Skip optional white space before operand. */
5298 if (is_space_char (*l))
5299 ++l;
d02603dc 5300 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
5301 {
5302 as_bad (_("invalid character %s before operand %d"),
5303 output_invalid (*l),
5304 i.operands + 1);
5305 return NULL;
5306 }
d02603dc 5307 token_start = l; /* After white space. */
29b0f896
AM
5308 paren_not_balanced = 0;
5309 while (paren_not_balanced || *l != ',')
5310 {
5311 if (*l == END_OF_INSN)
5312 {
5313 if (paren_not_balanced)
5314 {
5315 if (!intel_syntax)
5316 as_bad (_("unbalanced parenthesis in operand %d."),
5317 i.operands + 1);
5318 else
5319 as_bad (_("unbalanced brackets in operand %d."),
5320 i.operands + 1);
5321 return NULL;
5322 }
5323 else
5324 break; /* we are done */
5325 }
d02603dc 5326 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
5327 {
5328 as_bad (_("invalid character %s in operand %d"),
5329 output_invalid (*l),
5330 i.operands + 1);
5331 return NULL;
5332 }
5333 if (!intel_syntax)
5334 {
5335 if (*l == '(')
5336 ++paren_not_balanced;
5337 if (*l == ')')
5338 --paren_not_balanced;
5339 }
5340 else
5341 {
5342 if (*l == '[')
5343 ++paren_not_balanced;
5344 if (*l == ']')
5345 --paren_not_balanced;
5346 }
5347 l++;
5348 }
5349 if (l != token_start)
5350 { /* Yes, we've read in another operand. */
5351 unsigned int operand_ok;
5352 this_operand = i.operands++;
5353 if (i.operands > MAX_OPERANDS)
5354 {
5355 as_bad (_("spurious operands; (%d operands/instruction max)"),
5356 MAX_OPERANDS);
5357 return NULL;
5358 }
9d46ce34 5359 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
5360 /* Now parse operand adding info to 'i' as we go along. */
5361 END_STRING_AND_SAVE (l);
5362
1286ab78
L
5363 if (i.mem_operands > 1)
5364 {
5365 as_bad (_("too many memory references for `%s'"),
5366 mnemonic);
5367 return 0;
5368 }
5369
29b0f896
AM
5370 if (intel_syntax)
5371 operand_ok =
5372 i386_intel_operand (token_start,
5373 intel_float_operand (mnemonic));
5374 else
a7619375 5375 operand_ok = i386_att_operand (token_start);
29b0f896
AM
5376
5377 RESTORE_END_STRING (l);
5378 if (!operand_ok)
5379 return NULL;
5380 }
5381 else
5382 {
5383 if (expecting_operand)
5384 {
5385 expecting_operand_after_comma:
5386 as_bad (_("expecting operand after ','; got nothing"));
5387 return NULL;
5388 }
5389 if (*l == ',')
5390 {
5391 as_bad (_("expecting operand before ','; got nothing"));
5392 return NULL;
5393 }
5394 }
7f3f1ea2 5395
29b0f896
AM
5396 /* Now *l must be either ',' or END_OF_INSN. */
5397 if (*l == ',')
5398 {
5399 if (*++l == END_OF_INSN)
5400 {
5401 /* Just skip it, if it's \n complain. */
5402 goto expecting_operand_after_comma;
5403 }
5404 expecting_operand = 1;
5405 }
5406 }
5407 return l;
5408}
7f3f1ea2 5409
050dfa73 5410static void
4d456e3d 5411swap_2_operands (int xchg1, int xchg2)
050dfa73
MM
5412{
5413 union i386_op temp_op;
40fb9820 5414 i386_operand_type temp_type;
c48dadc9 5415 unsigned int temp_flags;
050dfa73 5416 enum bfd_reloc_code_real temp_reloc;
4eed87de 5417
050dfa73
MM
5418 temp_type = i.types[xchg2];
5419 i.types[xchg2] = i.types[xchg1];
5420 i.types[xchg1] = temp_type;
c48dadc9
JB
5421
5422 temp_flags = i.flags[xchg2];
5423 i.flags[xchg2] = i.flags[xchg1];
5424 i.flags[xchg1] = temp_flags;
5425
050dfa73
MM
5426 temp_op = i.op[xchg2];
5427 i.op[xchg2] = i.op[xchg1];
5428 i.op[xchg1] = temp_op;
c48dadc9 5429
050dfa73
MM
5430 temp_reloc = i.reloc[xchg2];
5431 i.reloc[xchg2] = i.reloc[xchg1];
5432 i.reloc[xchg1] = temp_reloc;
43234a1e
L
5433
5434 if (i.mask)
5435 {
5436 if (i.mask->operand == xchg1)
5437 i.mask->operand = xchg2;
5438 else if (i.mask->operand == xchg2)
5439 i.mask->operand = xchg1;
5440 }
5441 if (i.broadcast)
5442 {
5443 if (i.broadcast->operand == xchg1)
5444 i.broadcast->operand = xchg2;
5445 else if (i.broadcast->operand == xchg2)
5446 i.broadcast->operand = xchg1;
5447 }
5448 if (i.rounding)
5449 {
5450 if (i.rounding->operand == xchg1)
5451 i.rounding->operand = xchg2;
5452 else if (i.rounding->operand == xchg2)
5453 i.rounding->operand = xchg1;
5454 }
050dfa73
MM
5455}
5456
29b0f896 5457static void
e3bb37b5 5458swap_operands (void)
29b0f896 5459{
b7c61d9a 5460 switch (i.operands)
050dfa73 5461 {
c0f3af97 5462 case 5:
b7c61d9a 5463 case 4:
4d456e3d 5464 swap_2_operands (1, i.operands - 2);
1a0670f3 5465 /* Fall through. */
b7c61d9a
L
5466 case 3:
5467 case 2:
4d456e3d 5468 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
5469 break;
5470 default:
5471 abort ();
29b0f896 5472 }
29b0f896
AM
5473
5474 if (i.mem_operands == 2)
5475 {
5476 const seg_entry *temp_seg;
5477 temp_seg = i.seg[0];
5478 i.seg[0] = i.seg[1];
5479 i.seg[1] = temp_seg;
5480 }
5481}
252b5132 5482
29b0f896
AM
5483/* Try to ensure constant immediates are represented in the smallest
5484 opcode possible. */
5485static void
e3bb37b5 5486optimize_imm (void)
29b0f896
AM
5487{
5488 char guess_suffix = 0;
5489 int op;
252b5132 5490
29b0f896
AM
5491 if (i.suffix)
5492 guess_suffix = i.suffix;
5493 else if (i.reg_operands)
5494 {
5495 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
5496 We can't do this properly yet, i.e. excluding special register
5497 instances, but the following works for instructions with
5498 immediates. In any case, we can't set i.suffix yet. */
29b0f896 5499 for (op = i.operands; --op >= 0;)
bab6aec1
JB
5500 if (i.types[op].bitfield.class != Reg)
5501 continue;
5502 else if (i.types[op].bitfield.byte)
7ab9ffdd 5503 {
40fb9820
L
5504 guess_suffix = BYTE_MNEM_SUFFIX;
5505 break;
5506 }
bab6aec1 5507 else if (i.types[op].bitfield.word)
252b5132 5508 {
40fb9820
L
5509 guess_suffix = WORD_MNEM_SUFFIX;
5510 break;
5511 }
bab6aec1 5512 else if (i.types[op].bitfield.dword)
40fb9820
L
5513 {
5514 guess_suffix = LONG_MNEM_SUFFIX;
5515 break;
5516 }
bab6aec1 5517 else if (i.types[op].bitfield.qword)
40fb9820
L
5518 {
5519 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5520 break;
252b5132 5521 }
29b0f896
AM
5522 }
5523 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5524 guess_suffix = WORD_MNEM_SUFFIX;
5525
5526 for (op = i.operands; --op >= 0;)
40fb9820 5527 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5528 {
5529 switch (i.op[op].imms->X_op)
252b5132 5530 {
29b0f896
AM
5531 case O_constant:
5532 /* If a suffix is given, this operand may be shortened. */
5533 switch (guess_suffix)
252b5132 5534 {
29b0f896 5535 case LONG_MNEM_SUFFIX:
40fb9820
L
5536 i.types[op].bitfield.imm32 = 1;
5537 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5538 break;
5539 case WORD_MNEM_SUFFIX:
40fb9820
L
5540 i.types[op].bitfield.imm16 = 1;
5541 i.types[op].bitfield.imm32 = 1;
5542 i.types[op].bitfield.imm32s = 1;
5543 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5544 break;
5545 case BYTE_MNEM_SUFFIX:
40fb9820
L
5546 i.types[op].bitfield.imm8 = 1;
5547 i.types[op].bitfield.imm8s = 1;
5548 i.types[op].bitfield.imm16 = 1;
5549 i.types[op].bitfield.imm32 = 1;
5550 i.types[op].bitfield.imm32s = 1;
5551 i.types[op].bitfield.imm64 = 1;
29b0f896 5552 break;
252b5132 5553 }
252b5132 5554
29b0f896
AM
5555 /* If this operand is at most 16 bits, convert it
5556 to a signed 16 bit number before trying to see
5557 whether it will fit in an even smaller size.
5558 This allows a 16-bit operand such as $0xffe0 to
5559 be recognised as within Imm8S range. */
40fb9820 5560 if ((i.types[op].bitfield.imm16)
29b0f896 5561 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5562 {
29b0f896
AM
5563 i.op[op].imms->X_add_number =
5564 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
5565 }
a28def75
L
5566#ifdef BFD64
5567 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5568 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5569 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5570 == 0))
5571 {
5572 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5573 ^ ((offsetT) 1 << 31))
5574 - ((offsetT) 1 << 31));
5575 }
a28def75 5576#endif
40fb9820 5577 i.types[op]
c6fb90c8
L
5578 = operand_type_or (i.types[op],
5579 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5580
29b0f896
AM
5581 /* We must avoid matching of Imm32 templates when 64bit
5582 only immediate is available. */
5583 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5584 i.types[op].bitfield.imm32 = 0;
29b0f896 5585 break;
252b5132 5586
29b0f896
AM
5587 case O_absent:
5588 case O_register:
5589 abort ();
5590
5591 /* Symbols and expressions. */
5592 default:
9cd96992
JB
5593 /* Convert symbolic operand to proper sizes for matching, but don't
5594 prevent matching a set of insns that only supports sizes other
5595 than those matching the insn suffix. */
5596 {
40fb9820 5597 i386_operand_type mask, allowed;
d3ce72d0 5598 const insn_template *t;
9cd96992 5599
0dfbf9d7
L
5600 operand_type_set (&mask, 0);
5601 operand_type_set (&allowed, 0);
40fb9820 5602
4eed87de
AM
5603 for (t = current_templates->start;
5604 t < current_templates->end;
5605 ++t)
bab6aec1
JB
5606 {
5607 allowed = operand_type_or (allowed, t->operand_types[op]);
5608 allowed = operand_type_and (allowed, anyimm);
5609 }
9cd96992
JB
5610 switch (guess_suffix)
5611 {
5612 case QWORD_MNEM_SUFFIX:
40fb9820
L
5613 mask.bitfield.imm64 = 1;
5614 mask.bitfield.imm32s = 1;
9cd96992
JB
5615 break;
5616 case LONG_MNEM_SUFFIX:
40fb9820 5617 mask.bitfield.imm32 = 1;
9cd96992
JB
5618 break;
5619 case WORD_MNEM_SUFFIX:
40fb9820 5620 mask.bitfield.imm16 = 1;
9cd96992
JB
5621 break;
5622 case BYTE_MNEM_SUFFIX:
40fb9820 5623 mask.bitfield.imm8 = 1;
9cd96992
JB
5624 break;
5625 default:
9cd96992
JB
5626 break;
5627 }
c6fb90c8 5628 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5629 if (!operand_type_all_zero (&allowed))
c6fb90c8 5630 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5631 }
29b0f896 5632 break;
252b5132 5633 }
29b0f896
AM
5634 }
5635}
47926f60 5636
29b0f896
AM
5637/* Try to use the smallest displacement type too. */
5638static void
e3bb37b5 5639optimize_disp (void)
29b0f896
AM
5640{
5641 int op;
3e73aa7c 5642
29b0f896 5643 for (op = i.operands; --op >= 0;)
40fb9820 5644 if (operand_type_check (i.types[op], disp))
252b5132 5645 {
b300c311 5646 if (i.op[op].disps->X_op == O_constant)
252b5132 5647 {
91d6fa6a 5648 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5649
40fb9820 5650 if (i.types[op].bitfield.disp16
91d6fa6a 5651 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
5652 {
5653 /* If this operand is at most 16 bits, convert
5654 to a signed 16 bit number and don't use 64bit
5655 displacement. */
91d6fa6a 5656 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 5657 i.types[op].bitfield.disp64 = 0;
b300c311 5658 }
a28def75
L
5659#ifdef BFD64
5660 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
40fb9820 5661 if (i.types[op].bitfield.disp32
91d6fa6a 5662 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
b300c311
L
5663 {
5664 /* If this operand is at most 32 bits, convert
5665 to a signed 32 bit number and don't use 64bit
5666 displacement. */
91d6fa6a
NC
5667 op_disp &= (((offsetT) 2 << 31) - 1);
5668 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 5669 i.types[op].bitfield.disp64 = 0;
b300c311 5670 }
a28def75 5671#endif
91d6fa6a 5672 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5673 {
40fb9820
L
5674 i.types[op].bitfield.disp8 = 0;
5675 i.types[op].bitfield.disp16 = 0;
5676 i.types[op].bitfield.disp32 = 0;
5677 i.types[op].bitfield.disp32s = 0;
5678 i.types[op].bitfield.disp64 = 0;
b300c311
L
5679 i.op[op].disps = 0;
5680 i.disp_operands--;
5681 }
5682 else if (flag_code == CODE_64BIT)
5683 {
91d6fa6a 5684 if (fits_in_signed_long (op_disp))
28a9d8f5 5685 {
40fb9820
L
5686 i.types[op].bitfield.disp64 = 0;
5687 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5688 }
0e1147d9 5689 if (i.prefix[ADDR_PREFIX]
91d6fa6a 5690 && fits_in_unsigned_long (op_disp))
40fb9820 5691 i.types[op].bitfield.disp32 = 1;
b300c311 5692 }
40fb9820
L
5693 if ((i.types[op].bitfield.disp32
5694 || i.types[op].bitfield.disp32s
5695 || i.types[op].bitfield.disp16)
b5014f7a 5696 && fits_in_disp8 (op_disp))
40fb9820 5697 i.types[op].bitfield.disp8 = 1;
252b5132 5698 }
67a4f2b7
AO
5699 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5700 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5701 {
5702 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5703 i.op[op].disps, 0, i.reloc[op]);
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;
67a4f2b7
AO
5709 }
5710 else
b300c311 5711 /* We only support 64bit displacement on constants. */
40fb9820 5712 i.types[op].bitfield.disp64 = 0;
252b5132 5713 }
29b0f896
AM
5714}
5715
4a1b91ea
L
5716/* Return 1 if there is a match in broadcast bytes between operand
5717 GIVEN and instruction template T. */
5718
5719static INLINE int
5720match_broadcast_size (const insn_template *t, unsigned int given)
5721{
5722 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5723 && i.types[given].bitfield.byte)
5724 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5725 && i.types[given].bitfield.word)
5726 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5727 && i.types[given].bitfield.dword)
5728 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5729 && i.types[given].bitfield.qword));
5730}
5731
6c30d220
L
5732/* Check if operands are valid for the instruction. */
5733
5734static int
5735check_VecOperands (const insn_template *t)
5736{
43234a1e 5737 unsigned int op;
e2195274 5738 i386_cpu_flags cpu;
e2195274
JB
5739
5740 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5741 any one operand are implicity requiring AVX512VL support if the actual
5742 operand size is YMMword or XMMword. Since this function runs after
5743 template matching, there's no need to check for YMMword/XMMword in
5744 the template. */
5745 cpu = cpu_flags_and (t->cpu_flags, avx512);
5746 if (!cpu_flags_all_zero (&cpu)
5747 && !t->cpu_flags.bitfield.cpuavx512vl
5748 && !cpu_arch_flags.bitfield.cpuavx512vl)
5749 {
5750 for (op = 0; op < t->operands; ++op)
5751 {
5752 if (t->operand_types[op].bitfield.zmmword
5753 && (i.types[op].bitfield.ymmword
5754 || i.types[op].bitfield.xmmword))
5755 {
5756 i.error = unsupported;
5757 return 1;
5758 }
5759 }
5760 }
43234a1e 5761
6c30d220
L
5762 /* Without VSIB byte, we can't have a vector register for index. */
5763 if (!t->opcode_modifier.vecsib
5764 && i.index_reg
1b54b8d7
JB
5765 && (i.index_reg->reg_type.bitfield.xmmword
5766 || i.index_reg->reg_type.bitfield.ymmword
5767 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
5768 {
5769 i.error = unsupported_vector_index_register;
5770 return 1;
5771 }
5772
ad8ecc81
MZ
5773 /* Check if default mask is allowed. */
5774 if (t->opcode_modifier.nodefmask
5775 && (!i.mask || i.mask->mask->reg_num == 0))
5776 {
5777 i.error = no_default_mask;
5778 return 1;
5779 }
5780
7bab8ab5
JB
5781 /* For VSIB byte, we need a vector register for index, and all vector
5782 registers must be distinct. */
5783 if (t->opcode_modifier.vecsib)
5784 {
5785 if (!i.index_reg
6c30d220 5786 || !((t->opcode_modifier.vecsib == VecSIB128
1b54b8d7 5787 && i.index_reg->reg_type.bitfield.xmmword)
6c30d220 5788 || (t->opcode_modifier.vecsib == VecSIB256
1b54b8d7 5789 && i.index_reg->reg_type.bitfield.ymmword)
43234a1e 5790 || (t->opcode_modifier.vecsib == VecSIB512
1b54b8d7 5791 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
5792 {
5793 i.error = invalid_vsib_address;
5794 return 1;
5795 }
5796
43234a1e
L
5797 gas_assert (i.reg_operands == 2 || i.mask);
5798 if (i.reg_operands == 2 && !i.mask)
5799 {
3528c362 5800 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
5801 gas_assert (i.types[0].bitfield.xmmword
5802 || i.types[0].bitfield.ymmword);
3528c362 5803 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
5804 gas_assert (i.types[2].bitfield.xmmword
5805 || i.types[2].bitfield.ymmword);
43234a1e
L
5806 if (operand_check == check_none)
5807 return 0;
5808 if (register_number (i.op[0].regs)
5809 != register_number (i.index_reg)
5810 && register_number (i.op[2].regs)
5811 != register_number (i.index_reg)
5812 && register_number (i.op[0].regs)
5813 != register_number (i.op[2].regs))
5814 return 0;
5815 if (operand_check == check_error)
5816 {
5817 i.error = invalid_vector_register_set;
5818 return 1;
5819 }
5820 as_warn (_("mask, index, and destination registers should be distinct"));
5821 }
8444f82a
MZ
5822 else if (i.reg_operands == 1 && i.mask)
5823 {
3528c362 5824 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
5825 && (i.types[1].bitfield.xmmword
5826 || i.types[1].bitfield.ymmword
5827 || i.types[1].bitfield.zmmword)
8444f82a
MZ
5828 && (register_number (i.op[1].regs)
5829 == register_number (i.index_reg)))
5830 {
5831 if (operand_check == check_error)
5832 {
5833 i.error = invalid_vector_register_set;
5834 return 1;
5835 }
5836 if (operand_check != check_none)
5837 as_warn (_("index and destination registers should be distinct"));
5838 }
5839 }
43234a1e 5840 }
7bab8ab5 5841
43234a1e
L
5842 /* Check if broadcast is supported by the instruction and is applied
5843 to the memory operand. */
5844 if (i.broadcast)
5845 {
8e6e0792 5846 i386_operand_type type, overlap;
43234a1e
L
5847
5848 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 5849 and its broadcast bytes match the memory operand. */
32546502 5850 op = i.broadcast->operand;
8e6e0792 5851 if (!t->opcode_modifier.broadcast
c48dadc9 5852 || !(i.flags[op] & Operand_Mem)
c39e5b26 5853 || (!i.types[op].bitfield.unspecified
4a1b91ea 5854 && !match_broadcast_size (t, op)))
43234a1e
L
5855 {
5856 bad_broadcast:
5857 i.error = unsupported_broadcast;
5858 return 1;
5859 }
8e6e0792 5860
4a1b91ea
L
5861 i.broadcast->bytes = ((1 << (t->opcode_modifier.broadcast - 1))
5862 * i.broadcast->type);
8e6e0792 5863 operand_type_set (&type, 0);
4a1b91ea 5864 switch (i.broadcast->bytes)
8e6e0792 5865 {
4a1b91ea
L
5866 case 2:
5867 type.bitfield.word = 1;
5868 break;
5869 case 4:
5870 type.bitfield.dword = 1;
5871 break;
8e6e0792
JB
5872 case 8:
5873 type.bitfield.qword = 1;
5874 break;
5875 case 16:
5876 type.bitfield.xmmword = 1;
5877 break;
5878 case 32:
5879 type.bitfield.ymmword = 1;
5880 break;
5881 case 64:
5882 type.bitfield.zmmword = 1;
5883 break;
5884 default:
5885 goto bad_broadcast;
5886 }
5887
5888 overlap = operand_type_and (type, t->operand_types[op]);
bc49bfd8
JB
5889 if (t->operand_types[op].bitfield.class == RegSIMD
5890 && t->operand_types[op].bitfield.byte
5891 + t->operand_types[op].bitfield.word
5892 + t->operand_types[op].bitfield.dword
5893 + t->operand_types[op].bitfield.qword > 1)
5894 {
5895 overlap.bitfield.xmmword = 0;
5896 overlap.bitfield.ymmword = 0;
5897 overlap.bitfield.zmmword = 0;
5898 }
8e6e0792
JB
5899 if (operand_type_all_zero (&overlap))
5900 goto bad_broadcast;
5901
5902 if (t->opcode_modifier.checkregsize)
5903 {
5904 unsigned int j;
5905
e2195274 5906 type.bitfield.baseindex = 1;
8e6e0792
JB
5907 for (j = 0; j < i.operands; ++j)
5908 {
5909 if (j != op
5910 && !operand_type_register_match(i.types[j],
5911 t->operand_types[j],
5912 type,
5913 t->operand_types[op]))
5914 goto bad_broadcast;
5915 }
5916 }
43234a1e
L
5917 }
5918 /* If broadcast is supported in this instruction, we need to check if
5919 operand of one-element size isn't specified without broadcast. */
5920 else if (t->opcode_modifier.broadcast && i.mem_operands)
5921 {
5922 /* Find memory operand. */
5923 for (op = 0; op < i.operands; op++)
8dc0818e 5924 if (i.flags[op] & Operand_Mem)
43234a1e
L
5925 break;
5926 gas_assert (op < i.operands);
5927 /* Check size of the memory operand. */
4a1b91ea 5928 if (match_broadcast_size (t, op))
43234a1e
L
5929 {
5930 i.error = broadcast_needed;
5931 return 1;
5932 }
5933 }
c39e5b26
JB
5934 else
5935 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
5936
5937 /* Check if requested masking is supported. */
ae2387fe 5938 if (i.mask)
43234a1e 5939 {
ae2387fe
JB
5940 switch (t->opcode_modifier.masking)
5941 {
5942 case BOTH_MASKING:
5943 break;
5944 case MERGING_MASKING:
5945 if (i.mask->zeroing)
5946 {
5947 case 0:
5948 i.error = unsupported_masking;
5949 return 1;
5950 }
5951 break;
5952 case DYNAMIC_MASKING:
5953 /* Memory destinations allow only merging masking. */
5954 if (i.mask->zeroing && i.mem_operands)
5955 {
5956 /* Find memory operand. */
5957 for (op = 0; op < i.operands; op++)
c48dadc9 5958 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
5959 break;
5960 gas_assert (op < i.operands);
5961 if (op == i.operands - 1)
5962 {
5963 i.error = unsupported_masking;
5964 return 1;
5965 }
5966 }
5967 break;
5968 default:
5969 abort ();
5970 }
43234a1e
L
5971 }
5972
5973 /* Check if masking is applied to dest operand. */
5974 if (i.mask && (i.mask->operand != (int) (i.operands - 1)))
5975 {
5976 i.error = mask_not_on_destination;
5977 return 1;
5978 }
5979
43234a1e
L
5980 /* Check RC/SAE. */
5981 if (i.rounding)
5982 {
a80195f1
JB
5983 if (!t->opcode_modifier.sae
5984 || (i.rounding->type != saeonly && !t->opcode_modifier.staticrounding))
43234a1e
L
5985 {
5986 i.error = unsupported_rc_sae;
5987 return 1;
5988 }
5989 /* If the instruction has several immediate operands and one of
5990 them is rounding, the rounding operand should be the last
5991 immediate operand. */
5992 if (i.imm_operands > 1
5993 && i.rounding->operand != (int) (i.imm_operands - 1))
7bab8ab5 5994 {
43234a1e 5995 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
5996 return 1;
5997 }
6c30d220
L
5998 }
5999
43234a1e 6000 /* Check vector Disp8 operand. */
b5014f7a
JB
6001 if (t->opcode_modifier.disp8memshift
6002 && i.disp_encoding != disp_encoding_32bit)
43234a1e
L
6003 {
6004 if (i.broadcast)
4a1b91ea 6005 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 6006 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 6007 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
6008 else
6009 {
6010 const i386_operand_type *type = NULL;
6011
6012 i.memshift = 0;
6013 for (op = 0; op < i.operands; op++)
8dc0818e 6014 if (i.flags[op] & Operand_Mem)
7091c612 6015 {
4174bfff
JB
6016 if (t->opcode_modifier.evex == EVEXLIG)
6017 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
6018 else if (t->operand_types[op].bitfield.xmmword
6019 + t->operand_types[op].bitfield.ymmword
6020 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
6021 type = &t->operand_types[op];
6022 else if (!i.types[op].bitfield.unspecified)
6023 type = &i.types[op];
6024 }
3528c362 6025 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 6026 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
6027 {
6028 if (i.types[op].bitfield.zmmword)
6029 i.memshift = 6;
6030 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
6031 i.memshift = 5;
6032 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
6033 i.memshift = 4;
6034 }
6035
6036 if (type)
6037 {
6038 if (type->bitfield.zmmword)
6039 i.memshift = 6;
6040 else if (type->bitfield.ymmword)
6041 i.memshift = 5;
6042 else if (type->bitfield.xmmword)
6043 i.memshift = 4;
6044 }
6045
6046 /* For the check in fits_in_disp8(). */
6047 if (i.memshift == 0)
6048 i.memshift = -1;
6049 }
43234a1e
L
6050
6051 for (op = 0; op < i.operands; op++)
6052 if (operand_type_check (i.types[op], disp)
6053 && i.op[op].disps->X_op == O_constant)
6054 {
b5014f7a 6055 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 6056 {
b5014f7a
JB
6057 i.types[op].bitfield.disp8 = 1;
6058 return 0;
43234a1e 6059 }
b5014f7a 6060 i.types[op].bitfield.disp8 = 0;
43234a1e
L
6061 }
6062 }
b5014f7a
JB
6063
6064 i.memshift = 0;
43234a1e 6065
6c30d220
L
6066 return 0;
6067}
6068
43f3e2ee 6069/* Check if operands are valid for the instruction. Update VEX
a683cc34
SP
6070 operand types. */
6071
6072static int
6073VEX_check_operands (const insn_template *t)
6074{
86fa6981 6075 if (i.vec_encoding == vex_encoding_evex)
43234a1e 6076 {
86fa6981 6077 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 6078 if (!is_evex_encoding (t))
86fa6981
L
6079 {
6080 i.error = unsupported;
6081 return 1;
6082 }
6083 return 0;
43234a1e
L
6084 }
6085
a683cc34 6086 if (!t->opcode_modifier.vex)
86fa6981
L
6087 {
6088 /* This instruction template doesn't have VEX prefix. */
6089 if (i.vec_encoding != vex_encoding_default)
6090 {
6091 i.error = unsupported;
6092 return 1;
6093 }
6094 return 0;
6095 }
a683cc34 6096
9d3bf266
JB
6097 /* Check the special Imm4 cases; must be the first operand. */
6098 if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)
a683cc34
SP
6099 {
6100 if (i.op[0].imms->X_op != O_constant
6101 || !fits_in_imm4 (i.op[0].imms->X_add_number))
891edac4 6102 {
a65babc9 6103 i.error = bad_imm4;
891edac4
L
6104 return 1;
6105 }
a683cc34 6106
9d3bf266
JB
6107 /* Turn off Imm<N> so that update_imm won't complain. */
6108 operand_type_set (&i.types[0], 0);
a683cc34
SP
6109 }
6110
6111 return 0;
6112}
6113
d3ce72d0 6114static const insn_template *
83b16ac6 6115match_template (char mnem_suffix)
29b0f896
AM
6116{
6117 /* Points to template once we've found it. */
d3ce72d0 6118 const insn_template *t;
40fb9820 6119 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 6120 i386_operand_type overlap4;
29b0f896 6121 unsigned int found_reverse_match;
dc2be329 6122 i386_opcode_modifier suffix_check;
40fb9820 6123 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 6124 int addr_prefix_disp;
45a4bb20 6125 unsigned int j, size_match, check_register;
5614d22c 6126 enum i386_error specific_error = 0;
29b0f896 6127
c0f3af97
L
6128#if MAX_OPERANDS != 5
6129# error "MAX_OPERANDS must be 5."
f48ff2ae
L
6130#endif
6131
29b0f896 6132 found_reverse_match = 0;
539e75ad 6133 addr_prefix_disp = -1;
40fb9820 6134
dc2be329 6135 /* Prepare for mnemonic suffix check. */
40fb9820 6136 memset (&suffix_check, 0, sizeof (suffix_check));
dc2be329
L
6137 switch (mnem_suffix)
6138 {
6139 case BYTE_MNEM_SUFFIX:
6140 suffix_check.no_bsuf = 1;
6141 break;
6142 case WORD_MNEM_SUFFIX:
6143 suffix_check.no_wsuf = 1;
6144 break;
6145 case SHORT_MNEM_SUFFIX:
6146 suffix_check.no_ssuf = 1;
6147 break;
6148 case LONG_MNEM_SUFFIX:
6149 suffix_check.no_lsuf = 1;
6150 break;
6151 case QWORD_MNEM_SUFFIX:
6152 suffix_check.no_qsuf = 1;
6153 break;
6154 default:
6155 /* NB: In Intel syntax, normally we can check for memory operand
6156 size when there is no mnemonic suffix. But jmp and call have
6157 2 different encodings with Dword memory operand size, one with
6158 No_ldSuf and the other without. i.suffix is set to
6159 LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
6160 if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
6161 suffix_check.no_ldsuf = 1;
83b16ac6
JB
6162 }
6163
01559ecc
L
6164 /* Must have right number of operands. */
6165 i.error = number_of_operands_mismatch;
6166
45aa61fe 6167 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 6168 {
539e75ad 6169 addr_prefix_disp = -1;
dbbc8b7e 6170 found_reverse_match = 0;
539e75ad 6171
29b0f896
AM
6172 if (i.operands != t->operands)
6173 continue;
6174
50aecf8c 6175 /* Check processor support. */
a65babc9 6176 i.error = unsupported;
45a4bb20 6177 if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH)
50aecf8c
L
6178 continue;
6179
e1d4d893 6180 /* Check AT&T mnemonic. */
a65babc9 6181 i.error = unsupported_with_intel_mnemonic;
e1d4d893 6182 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
6183 continue;
6184
4b5aaf5f 6185 /* Check AT&T/Intel syntax. */
a65babc9 6186 i.error = unsupported_syntax;
5c07affc 6187 if ((intel_syntax && t->opcode_modifier.attsyntax)
4b5aaf5f 6188 || (!intel_syntax && t->opcode_modifier.intelsyntax))
1efbbeb4
L
6189 continue;
6190
4b5aaf5f
L
6191 /* Check Intel64/AMD64 ISA. */
6192 switch (isa64)
6193 {
6194 default:
6195 /* Default: Don't accept Intel64. */
6196 if (t->opcode_modifier.isa64 == INTEL64)
6197 continue;
6198 break;
6199 case amd64:
6200 /* -mamd64: Don't accept Intel64 and Intel64 only. */
6201 if (t->opcode_modifier.isa64 >= INTEL64)
6202 continue;
6203 break;
6204 case intel64:
6205 /* -mintel64: Don't accept AMD64. */
5990e377 6206 if (t->opcode_modifier.isa64 == AMD64 && flag_code == CODE_64BIT)
4b5aaf5f
L
6207 continue;
6208 break;
6209 }
6210
dc2be329 6211 /* Check the suffix. */
a65babc9 6212 i.error = invalid_instruction_suffix;
dc2be329
L
6213 if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
6214 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
6215 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
6216 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
6217 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
6218 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
83b16ac6 6219 continue;
29b0f896 6220
3ac21baa
JB
6221 size_match = operand_size_match (t);
6222 if (!size_match)
7d5e4556 6223 continue;
539e75ad 6224
6f2f06be
JB
6225 /* This is intentionally not
6226
0cfa3eb3 6227 if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
6f2f06be
JB
6228
6229 as the case of a missing * on the operand is accepted (perhaps with
6230 a warning, issued further down). */
0cfa3eb3 6231 if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
6f2f06be
JB
6232 {
6233 i.error = operand_type_mismatch;
6234 continue;
6235 }
6236
5c07affc
L
6237 for (j = 0; j < MAX_OPERANDS; j++)
6238 operand_types[j] = t->operand_types[j];
6239
e365e234
JB
6240 /* In general, don't allow
6241 - 64-bit operands outside of 64-bit mode,
6242 - 32-bit operands on pre-386. */
4873e243 6243 j = i.imm_operands + (t->operands > i.imm_operands + 1);
e365e234
JB
6244 if (((i.suffix == QWORD_MNEM_SUFFIX
6245 && flag_code != CODE_64BIT
6246 && (t->base_opcode != 0x0fc7
6247 || t->extension_opcode != 1 /* cmpxchg8b */))
6248 || (i.suffix == LONG_MNEM_SUFFIX
6249 && !cpu_arch_flags.bitfield.cpui386))
45aa61fe 6250 && (intel_syntax
3cd7f3e3 6251 ? (t->opcode_modifier.mnemonicsize != IGNORESIZE
45aa61fe
AM
6252 && !intel_float_operand (t->name))
6253 : intel_float_operand (t->name) != 2)
4873e243
JB
6254 && (t->operands == i.imm_operands
6255 || (operand_types[i.imm_operands].bitfield.class != RegMMX
6256 && operand_types[i.imm_operands].bitfield.class != RegSIMD
6257 && operand_types[i.imm_operands].bitfield.class != RegMask)
6258 || (operand_types[j].bitfield.class != RegMMX
6259 && operand_types[j].bitfield.class != RegSIMD
6260 && operand_types[j].bitfield.class != RegMask))
6261 && !t->opcode_modifier.vecsib)
192dc9c6
JB
6262 continue;
6263
29b0f896 6264 /* Do not verify operands when there are none. */
e365e234
JB
6265 if (!t->operands)
6266 /* We've found a match; break out of loop. */
6267 break;
252b5132 6268
48bcea9f
JB
6269 if (!t->opcode_modifier.jump
6270 || t->opcode_modifier.jump == JUMP_ABSOLUTE)
6271 {
6272 /* There should be only one Disp operand. */
6273 for (j = 0; j < MAX_OPERANDS; j++)
6274 if (operand_type_check (operand_types[j], disp))
539e75ad 6275 break;
48bcea9f
JB
6276 if (j < MAX_OPERANDS)
6277 {
6278 bfd_boolean override = (i.prefix[ADDR_PREFIX] != 0);
6279
6280 addr_prefix_disp = j;
6281
6282 /* Address size prefix will turn Disp64/Disp32S/Disp32/Disp16
6283 operand into Disp32/Disp32/Disp16/Disp32 operand. */
6284 switch (flag_code)
40fb9820 6285 {
48bcea9f
JB
6286 case CODE_16BIT:
6287 override = !override;
6288 /* Fall through. */
6289 case CODE_32BIT:
6290 if (operand_types[j].bitfield.disp32
6291 && operand_types[j].bitfield.disp16)
40fb9820 6292 {
48bcea9f
JB
6293 operand_types[j].bitfield.disp16 = override;
6294 operand_types[j].bitfield.disp32 = !override;
40fb9820 6295 }
48bcea9f
JB
6296 operand_types[j].bitfield.disp32s = 0;
6297 operand_types[j].bitfield.disp64 = 0;
6298 break;
6299
6300 case CODE_64BIT:
6301 if (operand_types[j].bitfield.disp32s
6302 || operand_types[j].bitfield.disp64)
40fb9820 6303 {
48bcea9f
JB
6304 operand_types[j].bitfield.disp64 &= !override;
6305 operand_types[j].bitfield.disp32s &= !override;
6306 operand_types[j].bitfield.disp32 = override;
40fb9820 6307 }
48bcea9f
JB
6308 operand_types[j].bitfield.disp16 = 0;
6309 break;
40fb9820 6310 }
539e75ad 6311 }
48bcea9f 6312 }
539e75ad 6313
02a86693
L
6314 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
6315 if (i.reloc[0] == BFD_RELOC_386_GOT32 && t->base_opcode == 0xa0)
6316 continue;
6317
56ffb741 6318 /* We check register size if needed. */
e2195274
JB
6319 if (t->opcode_modifier.checkregsize)
6320 {
6321 check_register = (1 << t->operands) - 1;
6322 if (i.broadcast)
6323 check_register &= ~(1 << i.broadcast->operand);
6324 }
6325 else
6326 check_register = 0;
6327
c6fb90c8 6328 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
6329 switch (t->operands)
6330 {
6331 case 1:
40fb9820 6332 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
6333 continue;
6334 break;
6335 case 2:
33eaf5de 6336 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
6337 only in 32bit mode and we can use opcode 0x90. In 64bit
6338 mode, we can't use 0x90 for xchg %eax, %eax since it should
6339 zero-extend %eax to %rax. */
6340 if (flag_code == CODE_64BIT
6341 && t->base_opcode == 0x90
75e5731b
JB
6342 && i.types[0].bitfield.instance == Accum
6343 && i.types[0].bitfield.dword
6344 && i.types[1].bitfield.instance == Accum
6345 && i.types[1].bitfield.dword)
8b38ad71 6346 continue;
1212781b
JB
6347 /* xrelease mov %eax, <disp> is another special case. It must not
6348 match the accumulator-only encoding of mov. */
6349 if (flag_code != CODE_64BIT
6350 && i.hle_prefix
6351 && t->base_opcode == 0xa0
75e5731b 6352 && i.types[0].bitfield.instance == Accum
8dc0818e 6353 && (i.flags[1] & Operand_Mem))
1212781b 6354 continue;
f5eb1d70
JB
6355 /* Fall through. */
6356
6357 case 3:
3ac21baa
JB
6358 if (!(size_match & MATCH_STRAIGHT))
6359 goto check_reverse;
64c49ab3
JB
6360 /* Reverse direction of operands if swapping is possible in the first
6361 place (operands need to be symmetric) and
6362 - the load form is requested, and the template is a store form,
6363 - the store form is requested, and the template is a load form,
6364 - the non-default (swapped) form is requested. */
6365 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 6366 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
6367 && !operand_type_all_zero (&overlap1))
6368 switch (i.dir_encoding)
6369 {
6370 case dir_encoding_load:
6371 if (operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6372 || t->opcode_modifier.regmem)
64c49ab3
JB
6373 goto check_reverse;
6374 break;
6375
6376 case dir_encoding_store:
6377 if (!operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6378 && !t->opcode_modifier.regmem)
64c49ab3
JB
6379 goto check_reverse;
6380 break;
6381
6382 case dir_encoding_swap:
6383 goto check_reverse;
6384
6385 case dir_encoding_default:
6386 break;
6387 }
86fa6981 6388 /* If we want store form, we skip the current load. */
64c49ab3
JB
6389 if ((i.dir_encoding == dir_encoding_store
6390 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
6391 && i.mem_operands == 0
6392 && t->opcode_modifier.load)
fa99fab2 6393 continue;
1a0670f3 6394 /* Fall through. */
f48ff2ae 6395 case 4:
c0f3af97 6396 case 5:
c6fb90c8 6397 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
6398 if (!operand_type_match (overlap0, i.types[0])
6399 || !operand_type_match (overlap1, i.types[1])
e2195274 6400 || ((check_register & 3) == 3
dc821c5f 6401 && !operand_type_register_match (i.types[0],
40fb9820 6402 operand_types[0],
dc821c5f 6403 i.types[1],
40fb9820 6404 operand_types[1])))
29b0f896
AM
6405 {
6406 /* Check if other direction is valid ... */
38e314eb 6407 if (!t->opcode_modifier.d)
29b0f896
AM
6408 continue;
6409
dc1e8a47 6410 check_reverse:
3ac21baa
JB
6411 if (!(size_match & MATCH_REVERSE))
6412 continue;
29b0f896 6413 /* Try reversing direction of operands. */
f5eb1d70
JB
6414 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
6415 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 6416 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 6417 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 6418 || (check_register
dc821c5f 6419 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
6420 operand_types[i.operands - 1],
6421 i.types[i.operands - 1],
45664ddb 6422 operand_types[0])))
29b0f896
AM
6423 {
6424 /* Does not match either direction. */
6425 continue;
6426 }
38e314eb 6427 /* found_reverse_match holds which of D or FloatR
29b0f896 6428 we've found. */
38e314eb
JB
6429 if (!t->opcode_modifier.d)
6430 found_reverse_match = 0;
6431 else if (operand_types[0].bitfield.tbyte)
8a2ed489 6432 found_reverse_match = Opcode_FloatD;
dbbc8b7e 6433 else if (operand_types[0].bitfield.xmmword
f5eb1d70 6434 || operand_types[i.operands - 1].bitfield.xmmword
3528c362
JB
6435 || operand_types[0].bitfield.class == RegMMX
6436 || operand_types[i.operands - 1].bitfield.class == RegMMX
dbbc8b7e
JB
6437 || is_any_vex_encoding(t))
6438 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
6439 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 6440 else
38e314eb 6441 found_reverse_match = Opcode_D;
40fb9820 6442 if (t->opcode_modifier.floatr)
8a2ed489 6443 found_reverse_match |= Opcode_FloatR;
29b0f896 6444 }
f48ff2ae 6445 else
29b0f896 6446 {
f48ff2ae 6447 /* Found a forward 2 operand match here. */
d1cbb4db
L
6448 switch (t->operands)
6449 {
c0f3af97
L
6450 case 5:
6451 overlap4 = operand_type_and (i.types[4],
6452 operand_types[4]);
1a0670f3 6453 /* Fall through. */
d1cbb4db 6454 case 4:
c6fb90c8
L
6455 overlap3 = operand_type_and (i.types[3],
6456 operand_types[3]);
1a0670f3 6457 /* Fall through. */
d1cbb4db 6458 case 3:
c6fb90c8
L
6459 overlap2 = operand_type_and (i.types[2],
6460 operand_types[2]);
d1cbb4db
L
6461 break;
6462 }
29b0f896 6463
f48ff2ae
L
6464 switch (t->operands)
6465 {
c0f3af97
L
6466 case 5:
6467 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 6468 || !operand_type_register_match (i.types[3],
c0f3af97 6469 operand_types[3],
c0f3af97
L
6470 i.types[4],
6471 operand_types[4]))
6472 continue;
1a0670f3 6473 /* Fall through. */
f48ff2ae 6474 case 4:
40fb9820 6475 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
6476 || ((check_register & 0xa) == 0xa
6477 && !operand_type_register_match (i.types[1],
f7768225
JB
6478 operand_types[1],
6479 i.types[3],
e2195274
JB
6480 operand_types[3]))
6481 || ((check_register & 0xc) == 0xc
6482 && !operand_type_register_match (i.types[2],
6483 operand_types[2],
6484 i.types[3],
6485 operand_types[3])))
f48ff2ae 6486 continue;
1a0670f3 6487 /* Fall through. */
f48ff2ae
L
6488 case 3:
6489 /* Here we make use of the fact that there are no
23e42951 6490 reverse match 3 operand instructions. */
40fb9820 6491 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
6492 || ((check_register & 5) == 5
6493 && !operand_type_register_match (i.types[0],
23e42951
JB
6494 operand_types[0],
6495 i.types[2],
e2195274
JB
6496 operand_types[2]))
6497 || ((check_register & 6) == 6
6498 && !operand_type_register_match (i.types[1],
6499 operand_types[1],
6500 i.types[2],
6501 operand_types[2])))
f48ff2ae
L
6502 continue;
6503 break;
6504 }
29b0f896 6505 }
f48ff2ae 6506 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
6507 slip through to break. */
6508 }
c0f3af97 6509
5614d22c
JB
6510 /* Check if vector and VEX operands are valid. */
6511 if (check_VecOperands (t) || VEX_check_operands (t))
6512 {
6513 specific_error = i.error;
6514 continue;
6515 }
a683cc34 6516
29b0f896
AM
6517 /* We've found a match; break out of loop. */
6518 break;
6519 }
6520
6521 if (t == current_templates->end)
6522 {
6523 /* We found no match. */
a65babc9 6524 const char *err_msg;
5614d22c 6525 switch (specific_error ? specific_error : i.error)
a65babc9
L
6526 {
6527 default:
6528 abort ();
86e026a4 6529 case operand_size_mismatch:
a65babc9
L
6530 err_msg = _("operand size mismatch");
6531 break;
6532 case operand_type_mismatch:
6533 err_msg = _("operand type mismatch");
6534 break;
6535 case register_type_mismatch:
6536 err_msg = _("register type mismatch");
6537 break;
6538 case number_of_operands_mismatch:
6539 err_msg = _("number of operands mismatch");
6540 break;
6541 case invalid_instruction_suffix:
6542 err_msg = _("invalid instruction suffix");
6543 break;
6544 case bad_imm4:
4a2608e3 6545 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6546 break;
a65babc9
L
6547 case unsupported_with_intel_mnemonic:
6548 err_msg = _("unsupported with Intel mnemonic");
6549 break;
6550 case unsupported_syntax:
6551 err_msg = _("unsupported syntax");
6552 break;
6553 case unsupported:
35262a23 6554 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6555 current_templates->start->name);
6556 return NULL;
6c30d220
L
6557 case invalid_vsib_address:
6558 err_msg = _("invalid VSIB address");
6559 break;
7bab8ab5
JB
6560 case invalid_vector_register_set:
6561 err_msg = _("mask, index, and destination registers must be distinct");
6562 break;
6c30d220
L
6563 case unsupported_vector_index_register:
6564 err_msg = _("unsupported vector index register");
6565 break;
43234a1e
L
6566 case unsupported_broadcast:
6567 err_msg = _("unsupported broadcast");
6568 break;
43234a1e
L
6569 case broadcast_needed:
6570 err_msg = _("broadcast is needed for operand of such type");
6571 break;
6572 case unsupported_masking:
6573 err_msg = _("unsupported masking");
6574 break;
6575 case mask_not_on_destination:
6576 err_msg = _("mask not on destination operand");
6577 break;
6578 case no_default_mask:
6579 err_msg = _("default mask isn't allowed");
6580 break;
6581 case unsupported_rc_sae:
6582 err_msg = _("unsupported static rounding/sae");
6583 break;
6584 case rc_sae_operand_not_last_imm:
6585 if (intel_syntax)
6586 err_msg = _("RC/SAE operand must precede immediate operands");
6587 else
6588 err_msg = _("RC/SAE operand must follow immediate operands");
6589 break;
6590 case invalid_register_operand:
6591 err_msg = _("invalid register operand");
6592 break;
a65babc9
L
6593 }
6594 as_bad (_("%s for `%s'"), err_msg,
891edac4 6595 current_templates->start->name);
fa99fab2 6596 return NULL;
29b0f896 6597 }
252b5132 6598
29b0f896
AM
6599 if (!quiet_warnings)
6600 {
6601 if (!intel_syntax
0cfa3eb3 6602 && (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE)))
6f2f06be 6603 as_warn (_("indirect %s without `*'"), t->name);
29b0f896 6604
40fb9820 6605 if (t->opcode_modifier.isprefix
3cd7f3e3 6606 && t->opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6607 {
6608 /* Warn them that a data or address size prefix doesn't
6609 affect assembly of the next line of code. */
6610 as_warn (_("stand-alone `%s' prefix"), t->name);
6611 }
6612 }
6613
6614 /* Copy the template we found. */
6615 i.tm = *t;
539e75ad
L
6616
6617 if (addr_prefix_disp != -1)
6618 i.tm.operand_types[addr_prefix_disp]
6619 = operand_types[addr_prefix_disp];
6620
29b0f896
AM
6621 if (found_reverse_match)
6622 {
dfd69174
JB
6623 /* If we found a reverse match we must alter the opcode direction
6624 bit and clear/flip the regmem modifier one. found_reverse_match
6625 holds bits to change (different for int & float insns). */
29b0f896
AM
6626
6627 i.tm.base_opcode ^= found_reverse_match;
6628
f5eb1d70
JB
6629 i.tm.operand_types[0] = operand_types[i.operands - 1];
6630 i.tm.operand_types[i.operands - 1] = operand_types[0];
dfd69174
JB
6631
6632 /* Certain SIMD insns have their load forms specified in the opcode
6633 table, and hence we need to _set_ RegMem instead of clearing it.
6634 We need to avoid setting the bit though on insns like KMOVW. */
6635 i.tm.opcode_modifier.regmem
6636 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
6637 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
6638 && !i.tm.opcode_modifier.regmem;
29b0f896
AM
6639 }
6640
fa99fab2 6641 return t;
29b0f896
AM
6642}
6643
6644static int
e3bb37b5 6645check_string (void)
29b0f896 6646{
51c8edf6
JB
6647 unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
6648 unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
8dc0818e 6649
51c8edf6 6650 if (i.seg[op] != NULL && i.seg[op] != &es)
29b0f896 6651 {
51c8edf6
JB
6652 as_bad (_("`%s' operand %u must use `%ses' segment"),
6653 i.tm.name,
6654 intel_syntax ? i.tm.operands - es_op : es_op + 1,
6655 register_prefix);
6656 return 0;
29b0f896 6657 }
51c8edf6
JB
6658
6659 /* There's only ever one segment override allowed per instruction.
6660 This instruction possibly has a legal segment override on the
6661 second operand, so copy the segment to where non-string
6662 instructions store it, allowing common code. */
6663 i.seg[op] = i.seg[1];
6664
29b0f896
AM
6665 return 1;
6666}
6667
6668static int
543613e9 6669process_suffix (void)
29b0f896
AM
6670{
6671 /* If matched instruction specifies an explicit instruction mnemonic
6672 suffix, use it. */
673fe0f0 6673 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6674 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6675 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6676 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6677 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6678 i.suffix = QWORD_MNEM_SUFFIX;
13e600d0 6679 else if (i.reg_operands
c8f8eebc
JB
6680 && (i.operands > 1 || i.types[0].bitfield.class == Reg)
6681 && !i.tm.opcode_modifier.addrprefixopreg)
29b0f896 6682 {
65fca059
JB
6683 unsigned int numop = i.operands;
6684
6685 /* movsx/movzx want only their source operand considered here, for the
6686 ambiguity checking below. The suffix will be replaced afterwards
6687 to represent the destination (register). */
6688 if (((i.tm.base_opcode | 8) == 0xfbe && i.tm.opcode_modifier.w)
6689 || (i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64))
6690 --i.operands;
6691
643bb870
JB
6692 /* crc32 needs REX.W set regardless of suffix / source operand size. */
6693 if (i.tm.base_opcode == 0xf20f38f0
6694 && i.tm.operand_types[1].bitfield.qword)
6695 i.rex |= REX_W;
6696
29b0f896 6697 /* If there's no instruction mnemonic suffix we try to invent one
13e600d0 6698 based on GPR operands. */
29b0f896
AM
6699 if (!i.suffix)
6700 {
6701 /* We take i.suffix from the last register operand specified,
6702 Destination register type is more significant than source
381d071f
L
6703 register type. crc32 in SSE4.2 prefers source register
6704 type. */
1a035124 6705 unsigned int op = i.tm.base_opcode != 0xf20f38f0 ? i.operands : 1;
20592a94 6706
1a035124
JB
6707 while (op--)
6708 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
6709 || i.tm.operand_types[op].bitfield.instance == Accum)
6710 {
6711 if (i.types[op].bitfield.class != Reg)
6712 continue;
6713 if (i.types[op].bitfield.byte)
6714 i.suffix = BYTE_MNEM_SUFFIX;
6715 else if (i.types[op].bitfield.word)
6716 i.suffix = WORD_MNEM_SUFFIX;
6717 else if (i.types[op].bitfield.dword)
6718 i.suffix = LONG_MNEM_SUFFIX;
6719 else if (i.types[op].bitfield.qword)
6720 i.suffix = QWORD_MNEM_SUFFIX;
6721 else
6722 continue;
6723 break;
6724 }
65fca059
JB
6725
6726 /* As an exception, movsx/movzx silently default to a byte source
6727 in AT&T mode. */
6728 if ((i.tm.base_opcode | 8) == 0xfbe && i.tm.opcode_modifier.w
6729 && !i.suffix && !intel_syntax)
6730 i.suffix = BYTE_MNEM_SUFFIX;
29b0f896
AM
6731 }
6732 else if (i.suffix == BYTE_MNEM_SUFFIX)
6733 {
2eb952a4 6734 if (intel_syntax
3cd7f3e3 6735 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6736 && i.tm.opcode_modifier.no_bsuf)
6737 i.suffix = 0;
6738 else if (!check_byte_reg ())
29b0f896
AM
6739 return 0;
6740 }
6741 else if (i.suffix == LONG_MNEM_SUFFIX)
6742 {
2eb952a4 6743 if (intel_syntax
3cd7f3e3 6744 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6745 && i.tm.opcode_modifier.no_lsuf
6746 && !i.tm.opcode_modifier.todword
6747 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
6748 i.suffix = 0;
6749 else if (!check_long_reg ())
29b0f896
AM
6750 return 0;
6751 }
6752 else if (i.suffix == QWORD_MNEM_SUFFIX)
6753 {
955e1e6a 6754 if (intel_syntax
3cd7f3e3 6755 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6756 && i.tm.opcode_modifier.no_qsuf
6757 && !i.tm.opcode_modifier.todword
6758 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
6759 i.suffix = 0;
6760 else if (!check_qword_reg ())
29b0f896
AM
6761 return 0;
6762 }
6763 else if (i.suffix == WORD_MNEM_SUFFIX)
6764 {
2eb952a4 6765 if (intel_syntax
3cd7f3e3 6766 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6767 && i.tm.opcode_modifier.no_wsuf)
6768 i.suffix = 0;
6769 else if (!check_word_reg ())
29b0f896
AM
6770 return 0;
6771 }
3cd7f3e3
L
6772 else if (intel_syntax
6773 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6774 /* Do nothing if the instruction is going to ignore the prefix. */
6775 ;
6776 else
6777 abort ();
65fca059
JB
6778
6779 /* Undo the movsx/movzx change done above. */
6780 i.operands = numop;
29b0f896 6781 }
3cd7f3e3
L
6782 else if (i.tm.opcode_modifier.mnemonicsize == DEFAULTSIZE
6783 && !i.suffix)
29b0f896 6784 {
13e600d0
JB
6785 i.suffix = stackop_size;
6786 if (stackop_size == LONG_MNEM_SUFFIX)
06f74c5c
L
6787 {
6788 /* stackop_size is set to LONG_MNEM_SUFFIX for the
6789 .code16gcc directive to support 16-bit mode with
6790 32-bit address. For IRET without a suffix, generate
6791 16-bit IRET (opcode 0xcf) to return from an interrupt
6792 handler. */
13e600d0
JB
6793 if (i.tm.base_opcode == 0xcf)
6794 {
6795 i.suffix = WORD_MNEM_SUFFIX;
6796 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
6797 }
6798 /* Warn about changed behavior for segment register push/pop. */
6799 else if ((i.tm.base_opcode | 1) == 0x07)
6800 as_warn (_("generating 32-bit `%s', unlike earlier gas versions"),
6801 i.tm.name);
06f74c5c 6802 }
29b0f896 6803 }
c006a730 6804 else if (!i.suffix
0cfa3eb3
JB
6805 && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
6806 || i.tm.opcode_modifier.jump == JUMP_BYTE
6807 || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
64e74474
AM
6808 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
6809 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
6810 {
6811 switch (flag_code)
6812 {
6813 case CODE_64BIT:
40fb9820 6814 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a
JB
6815 {
6816 i.suffix = QWORD_MNEM_SUFFIX;
6817 break;
6818 }
1a0670f3 6819 /* Fall through. */
9306ca4a 6820 case CODE_32BIT:
40fb9820 6821 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
6822 i.suffix = LONG_MNEM_SUFFIX;
6823 break;
6824 case CODE_16BIT:
40fb9820 6825 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
6826 i.suffix = WORD_MNEM_SUFFIX;
6827 break;
6828 }
6829 }
252b5132 6830
c006a730 6831 if (!i.suffix
3cd7f3e3 6832 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8
JB
6833 /* Also cover lret/retf/iret in 64-bit mode. */
6834 || (flag_code == CODE_64BIT
6835 && !i.tm.opcode_modifier.no_lsuf
6836 && !i.tm.opcode_modifier.no_qsuf))
3cd7f3e3 6837 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
62b3f548
JB
6838 /* Accept FLDENV et al without suffix. */
6839 && (i.tm.opcode_modifier.no_ssuf || i.tm.opcode_modifier.floatmf))
29b0f896 6840 {
6c0946d0 6841 unsigned int suffixes, evex = 0;
c006a730
JB
6842
6843 suffixes = !i.tm.opcode_modifier.no_bsuf;
6844 if (!i.tm.opcode_modifier.no_wsuf)
6845 suffixes |= 1 << 1;
6846 if (!i.tm.opcode_modifier.no_lsuf)
6847 suffixes |= 1 << 2;
6848 if (!i.tm.opcode_modifier.no_ldsuf)
6849 suffixes |= 1 << 3;
6850 if (!i.tm.opcode_modifier.no_ssuf)
6851 suffixes |= 1 << 4;
6852 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
6853 suffixes |= 1 << 5;
6854
6c0946d0
JB
6855 /* For [XYZ]MMWORD operands inspect operand sizes. While generally
6856 also suitable for AT&T syntax mode, it was requested that this be
6857 restricted to just Intel syntax. */
b9915cbc 6858 if (intel_syntax && is_any_vex_encoding (&i.tm) && !i.broadcast)
6c0946d0 6859 {
b9915cbc 6860 unsigned int op;
6c0946d0 6861
b9915cbc 6862 for (op = 0; op < i.tm.operands; ++op)
6c0946d0 6863 {
b9915cbc
JB
6864 if (is_evex_encoding (&i.tm)
6865 && !cpu_arch_flags.bitfield.cpuavx512vl)
6c0946d0 6866 {
b9915cbc
JB
6867 if (i.tm.operand_types[op].bitfield.ymmword)
6868 i.tm.operand_types[op].bitfield.xmmword = 0;
6869 if (i.tm.operand_types[op].bitfield.zmmword)
6870 i.tm.operand_types[op].bitfield.ymmword = 0;
6871 if (!i.tm.opcode_modifier.evex
6872 || i.tm.opcode_modifier.evex == EVEXDYN)
6873 i.tm.opcode_modifier.evex = EVEX512;
6874 }
6c0946d0 6875
b9915cbc
JB
6876 if (i.tm.operand_types[op].bitfield.xmmword
6877 + i.tm.operand_types[op].bitfield.ymmword
6878 + i.tm.operand_types[op].bitfield.zmmword < 2)
6879 continue;
6c0946d0 6880
b9915cbc
JB
6881 /* Any properly sized operand disambiguates the insn. */
6882 if (i.types[op].bitfield.xmmword
6883 || i.types[op].bitfield.ymmword
6884 || i.types[op].bitfield.zmmword)
6885 {
6886 suffixes &= ~(7 << 6);
6887 evex = 0;
6888 break;
6889 }
6c0946d0 6890
b9915cbc
JB
6891 if ((i.flags[op] & Operand_Mem)
6892 && i.tm.operand_types[op].bitfield.unspecified)
6893 {
6894 if (i.tm.operand_types[op].bitfield.xmmword)
6895 suffixes |= 1 << 6;
6896 if (i.tm.operand_types[op].bitfield.ymmword)
6897 suffixes |= 1 << 7;
6898 if (i.tm.operand_types[op].bitfield.zmmword)
6899 suffixes |= 1 << 8;
6900 if (is_evex_encoding (&i.tm))
6901 evex = EVEX512;
6c0946d0
JB
6902 }
6903 }
6904 }
6905
6906 /* Are multiple suffixes / operand sizes allowed? */
c006a730 6907 if (suffixes & (suffixes - 1))
9306ca4a 6908 {
873494c8 6909 if (intel_syntax
3cd7f3e3 6910 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8 6911 || operand_check == check_error))
9306ca4a 6912 {
c006a730 6913 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
9306ca4a
JB
6914 return 0;
6915 }
c006a730 6916 if (operand_check == check_error)
9306ca4a 6917 {
c006a730
JB
6918 as_bad (_("no instruction mnemonic suffix given and "
6919 "no register operands; can't size `%s'"), i.tm.name);
9306ca4a
JB
6920 return 0;
6921 }
c006a730 6922 if (operand_check == check_warning)
873494c8
JB
6923 as_warn (_("%s; using default for `%s'"),
6924 intel_syntax
6925 ? _("ambiguous operand size")
6926 : _("no instruction mnemonic suffix given and "
6927 "no register operands"),
6928 i.tm.name);
c006a730
JB
6929
6930 if (i.tm.opcode_modifier.floatmf)
6931 i.suffix = SHORT_MNEM_SUFFIX;
65fca059
JB
6932 else if ((i.tm.base_opcode | 8) == 0xfbe
6933 || (i.tm.base_opcode == 0x63
6934 && i.tm.cpu_flags.bitfield.cpu64))
6935 /* handled below */;
6c0946d0
JB
6936 else if (evex)
6937 i.tm.opcode_modifier.evex = evex;
c006a730
JB
6938 else if (flag_code == CODE_16BIT)
6939 i.suffix = WORD_MNEM_SUFFIX;
1a035124 6940 else if (!i.tm.opcode_modifier.no_lsuf)
c006a730 6941 i.suffix = LONG_MNEM_SUFFIX;
1a035124
JB
6942 else
6943 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a 6944 }
29b0f896 6945 }
252b5132 6946
65fca059
JB
6947 if ((i.tm.base_opcode | 8) == 0xfbe
6948 || (i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64))
6949 {
6950 /* In Intel syntax, movsx/movzx must have a "suffix" (checked above).
6951 In AT&T syntax, if there is no suffix (warned about above), the default
6952 will be byte extension. */
6953 if (i.tm.opcode_modifier.w && i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
6954 i.tm.base_opcode |= 1;
6955
6956 /* For further processing, the suffix should represent the destination
6957 (register). This is already the case when one was used with
6958 mov[sz][bw]*, but we need to replace it for mov[sz]x, or if there was
6959 no suffix to begin with. */
6960 if (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63 || !i.suffix)
6961 {
6962 if (i.types[1].bitfield.word)
6963 i.suffix = WORD_MNEM_SUFFIX;
6964 else if (i.types[1].bitfield.qword)
6965 i.suffix = QWORD_MNEM_SUFFIX;
6966 else
6967 i.suffix = LONG_MNEM_SUFFIX;
6968
6969 i.tm.opcode_modifier.w = 0;
6970 }
6971 }
6972
50128d0c
JB
6973 if (!i.tm.opcode_modifier.modrm && i.reg_operands && i.tm.operands < 3)
6974 i.short_form = (i.tm.operand_types[0].bitfield.class == Reg)
6975 != (i.tm.operand_types[1].bitfield.class == Reg);
6976
d2224064
JB
6977 /* Change the opcode based on the operand size given by i.suffix. */
6978 switch (i.suffix)
29b0f896 6979 {
d2224064
JB
6980 /* Size floating point instruction. */
6981 case LONG_MNEM_SUFFIX:
6982 if (i.tm.opcode_modifier.floatmf)
6983 {
6984 i.tm.base_opcode ^= 4;
6985 break;
6986 }
6987 /* fall through */
6988 case WORD_MNEM_SUFFIX:
6989 case QWORD_MNEM_SUFFIX:
29b0f896 6990 /* It's not a byte, select word/dword operation. */
40fb9820 6991 if (i.tm.opcode_modifier.w)
29b0f896 6992 {
50128d0c 6993 if (i.short_form)
29b0f896
AM
6994 i.tm.base_opcode |= 8;
6995 else
6996 i.tm.base_opcode |= 1;
6997 }
d2224064
JB
6998 /* fall through */
6999 case SHORT_MNEM_SUFFIX:
29b0f896
AM
7000 /* Now select between word & dword operations via the operand
7001 size prefix, except for instructions that will ignore this
7002 prefix anyway. */
c8f8eebc 7003 if (i.suffix != QWORD_MNEM_SUFFIX
3cd7f3e3 7004 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
c8f8eebc
JB
7005 && !i.tm.opcode_modifier.floatmf
7006 && !is_any_vex_encoding (&i.tm)
7007 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
7008 || (flag_code == CODE_64BIT
7009 && i.tm.opcode_modifier.jump == JUMP_BYTE)))
24eab124
AM
7010 {
7011 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 7012
0cfa3eb3 7013 if (i.tm.opcode_modifier.jump == JUMP_BYTE) /* jcxz, loop */
29b0f896 7014 prefix = ADDR_PREFIX_OPCODE;
252b5132 7015
29b0f896
AM
7016 if (!add_prefix (prefix))
7017 return 0;
24eab124 7018 }
252b5132 7019
29b0f896
AM
7020 /* Set mode64 for an operand. */
7021 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 7022 && flag_code == CODE_64BIT
d2224064 7023 && !i.tm.opcode_modifier.norex64
4ed21b58 7024 && !i.tm.opcode_modifier.vexw
46e883c5 7025 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
7026 need rex64. */
7027 && ! (i.operands == 2
7028 && i.tm.base_opcode == 0x90
7029 && i.tm.extension_opcode == None
75e5731b
JB
7030 && i.types[0].bitfield.instance == Accum
7031 && i.types[0].bitfield.qword
7032 && i.types[1].bitfield.instance == Accum
7033 && i.types[1].bitfield.qword))
d2224064 7034 i.rex |= REX_W;
3e73aa7c 7035
d2224064 7036 break;
29b0f896 7037 }
7ecd2f8b 7038
c8f8eebc 7039 if (i.tm.opcode_modifier.addrprefixopreg)
c0a30a9f 7040 {
c8f8eebc
JB
7041 gas_assert (!i.suffix);
7042 gas_assert (i.reg_operands);
c0a30a9f 7043
c8f8eebc
JB
7044 if (i.tm.operand_types[0].bitfield.instance == Accum
7045 || i.operands == 1)
7046 {
7047 /* The address size override prefix changes the size of the
7048 first operand. */
7049 if (flag_code == CODE_64BIT
7050 && i.op[0].regs->reg_type.bitfield.word)
7051 {
7052 as_bad (_("16-bit addressing unavailable for `%s'"),
7053 i.tm.name);
7054 return 0;
7055 }
7056
7057 if ((flag_code == CODE_32BIT
7058 ? i.op[0].regs->reg_type.bitfield.word
7059 : i.op[0].regs->reg_type.bitfield.dword)
7060 && !add_prefix (ADDR_PREFIX_OPCODE))
7061 return 0;
7062 }
c0a30a9f
L
7063 else
7064 {
c8f8eebc
JB
7065 /* Check invalid register operand when the address size override
7066 prefix changes the size of register operands. */
7067 unsigned int op;
7068 enum { need_word, need_dword, need_qword } need;
7069
7070 if (flag_code == CODE_32BIT)
7071 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
7072 else if (i.prefix[ADDR_PREFIX])
c0a30a9f
L
7073 need = need_dword;
7074 else
7075 need = flag_code == CODE_64BIT ? need_qword : need_word;
c0a30a9f 7076
c8f8eebc
JB
7077 for (op = 0; op < i.operands; op++)
7078 {
7079 if (i.types[op].bitfield.class != Reg)
7080 continue;
7081
7082 switch (need)
7083 {
7084 case need_word:
7085 if (i.op[op].regs->reg_type.bitfield.word)
7086 continue;
7087 break;
7088 case need_dword:
7089 if (i.op[op].regs->reg_type.bitfield.dword)
7090 continue;
7091 break;
7092 case need_qword:
7093 if (i.op[op].regs->reg_type.bitfield.qword)
7094 continue;
7095 break;
7096 }
7097
7098 as_bad (_("invalid register operand size for `%s'"),
7099 i.tm.name);
7100 return 0;
7101 }
7102 }
c0a30a9f
L
7103 }
7104
29b0f896
AM
7105 return 1;
7106}
3e73aa7c 7107
29b0f896 7108static int
543613e9 7109check_byte_reg (void)
29b0f896
AM
7110{
7111 int op;
543613e9 7112
29b0f896
AM
7113 for (op = i.operands; --op >= 0;)
7114 {
dc821c5f 7115 /* Skip non-register operands. */
bab6aec1 7116 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
7117 continue;
7118
29b0f896
AM
7119 /* If this is an eight bit register, it's OK. If it's the 16 or
7120 32 bit version of an eight bit register, we will just use the
7121 low portion, and that's OK too. */
dc821c5f 7122 if (i.types[op].bitfield.byte)
29b0f896
AM
7123 continue;
7124
5a819eb9 7125 /* I/O port address operands are OK too. */
75e5731b
JB
7126 if (i.tm.operand_types[op].bitfield.instance == RegD
7127 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
7128 continue;
7129
9706160a
JB
7130 /* crc32 only wants its source operand checked here. */
7131 if (i.tm.base_opcode == 0xf20f38f0 && op)
9344ff29
L
7132 continue;
7133
29b0f896 7134 /* Any other register is bad. */
bab6aec1 7135 if (i.types[op].bitfield.class == Reg
3528c362
JB
7136 || i.types[op].bitfield.class == RegMMX
7137 || i.types[op].bitfield.class == RegSIMD
00cee14f 7138 || i.types[op].bitfield.class == SReg
4a5c67ed
JB
7139 || i.types[op].bitfield.class == RegCR
7140 || i.types[op].bitfield.class == RegDR
7141 || i.types[op].bitfield.class == RegTR)
29b0f896 7142 {
a540244d
L
7143 as_bad (_("`%s%s' not allowed with `%s%c'"),
7144 register_prefix,
29b0f896
AM
7145 i.op[op].regs->reg_name,
7146 i.tm.name,
7147 i.suffix);
7148 return 0;
7149 }
7150 }
7151 return 1;
7152}
7153
7154static int
e3bb37b5 7155check_long_reg (void)
29b0f896
AM
7156{
7157 int op;
7158
7159 for (op = i.operands; --op >= 0;)
dc821c5f 7160 /* Skip non-register operands. */
bab6aec1 7161 if (i.types[op].bitfield.class != Reg)
dc821c5f 7162 continue;
29b0f896
AM
7163 /* Reject eight bit registers, except where the template requires
7164 them. (eg. movzb) */
dc821c5f 7165 else if (i.types[op].bitfield.byte
bab6aec1 7166 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7167 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7168 && (i.tm.operand_types[op].bitfield.word
7169 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7170 {
a540244d
L
7171 as_bad (_("`%s%s' not allowed with `%s%c'"),
7172 register_prefix,
29b0f896
AM
7173 i.op[op].regs->reg_name,
7174 i.tm.name,
7175 i.suffix);
7176 return 0;
7177 }
be4c5e58
L
7178 /* Error if the e prefix on a general reg is missing. */
7179 else if (i.types[op].bitfield.word
bab6aec1 7180 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7181 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7182 && i.tm.operand_types[op].bitfield.dword)
29b0f896 7183 {
be4c5e58
L
7184 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7185 register_prefix, i.op[op].regs->reg_name,
7186 i.suffix);
7187 return 0;
252b5132 7188 }
e4630f71 7189 /* Warn if the r prefix on a general reg is present. */
dc821c5f 7190 else if (i.types[op].bitfield.qword
bab6aec1 7191 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7192 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7193 && i.tm.operand_types[op].bitfield.dword)
252b5132 7194 {
34828aad 7195 if (intel_syntax
65fca059 7196 && i.tm.opcode_modifier.toqword
3528c362 7197 && i.types[0].bitfield.class != RegSIMD)
34828aad 7198 {
ca61edf2 7199 /* Convert to QWORD. We want REX byte. */
34828aad
L
7200 i.suffix = QWORD_MNEM_SUFFIX;
7201 }
7202 else
7203 {
2b5d6a91 7204 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7205 register_prefix, i.op[op].regs->reg_name,
7206 i.suffix);
7207 return 0;
7208 }
29b0f896
AM
7209 }
7210 return 1;
7211}
252b5132 7212
29b0f896 7213static int
e3bb37b5 7214check_qword_reg (void)
29b0f896
AM
7215{
7216 int op;
252b5132 7217
29b0f896 7218 for (op = i.operands; --op >= 0; )
dc821c5f 7219 /* Skip non-register operands. */
bab6aec1 7220 if (i.types[op].bitfield.class != Reg)
dc821c5f 7221 continue;
29b0f896
AM
7222 /* Reject eight bit registers, except where the template requires
7223 them. (eg. movzb) */
dc821c5f 7224 else if (i.types[op].bitfield.byte
bab6aec1 7225 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7226 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7227 && (i.tm.operand_types[op].bitfield.word
7228 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7229 {
a540244d
L
7230 as_bad (_("`%s%s' not allowed with `%s%c'"),
7231 register_prefix,
29b0f896
AM
7232 i.op[op].regs->reg_name,
7233 i.tm.name,
7234 i.suffix);
7235 return 0;
7236 }
e4630f71 7237 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
7238 else if ((i.types[op].bitfield.word
7239 || i.types[op].bitfield.dword)
bab6aec1 7240 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7241 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7242 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
7243 {
7244 /* Prohibit these changes in the 64bit mode, since the
7245 lowering is more complicated. */
34828aad 7246 if (intel_syntax
ca61edf2 7247 && i.tm.opcode_modifier.todword
3528c362 7248 && i.types[0].bitfield.class != RegSIMD)
34828aad 7249 {
ca61edf2 7250 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
7251 i.suffix = LONG_MNEM_SUFFIX;
7252 }
7253 else
7254 {
2b5d6a91 7255 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7256 register_prefix, i.op[op].regs->reg_name,
7257 i.suffix);
7258 return 0;
7259 }
252b5132 7260 }
29b0f896
AM
7261 return 1;
7262}
252b5132 7263
29b0f896 7264static int
e3bb37b5 7265check_word_reg (void)
29b0f896
AM
7266{
7267 int op;
7268 for (op = i.operands; --op >= 0;)
dc821c5f 7269 /* Skip non-register operands. */
bab6aec1 7270 if (i.types[op].bitfield.class != Reg)
dc821c5f 7271 continue;
29b0f896
AM
7272 /* Reject eight bit registers, except where the template requires
7273 them. (eg. movzb) */
dc821c5f 7274 else if (i.types[op].bitfield.byte
bab6aec1 7275 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7276 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7277 && (i.tm.operand_types[op].bitfield.word
7278 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7279 {
a540244d
L
7280 as_bad (_("`%s%s' not allowed with `%s%c'"),
7281 register_prefix,
29b0f896
AM
7282 i.op[op].regs->reg_name,
7283 i.tm.name,
7284 i.suffix);
7285 return 0;
7286 }
9706160a
JB
7287 /* Error if the e or r prefix on a general reg is present. */
7288 else if ((i.types[op].bitfield.dword
dc821c5f 7289 || i.types[op].bitfield.qword)
bab6aec1 7290 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7291 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7292 && i.tm.operand_types[op].bitfield.word)
252b5132 7293 {
9706160a
JB
7294 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7295 register_prefix, i.op[op].regs->reg_name,
7296 i.suffix);
7297 return 0;
29b0f896
AM
7298 }
7299 return 1;
7300}
252b5132 7301
29b0f896 7302static int
40fb9820 7303update_imm (unsigned int j)
29b0f896 7304{
bc0844ae 7305 i386_operand_type overlap = i.types[j];
40fb9820
L
7306 if ((overlap.bitfield.imm8
7307 || overlap.bitfield.imm8s
7308 || overlap.bitfield.imm16
7309 || overlap.bitfield.imm32
7310 || overlap.bitfield.imm32s
7311 || overlap.bitfield.imm64)
0dfbf9d7
L
7312 && !operand_type_equal (&overlap, &imm8)
7313 && !operand_type_equal (&overlap, &imm8s)
7314 && !operand_type_equal (&overlap, &imm16)
7315 && !operand_type_equal (&overlap, &imm32)
7316 && !operand_type_equal (&overlap, &imm32s)
7317 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
7318 {
7319 if (i.suffix)
7320 {
40fb9820
L
7321 i386_operand_type temp;
7322
0dfbf9d7 7323 operand_type_set (&temp, 0);
7ab9ffdd 7324 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
7325 {
7326 temp.bitfield.imm8 = overlap.bitfield.imm8;
7327 temp.bitfield.imm8s = overlap.bitfield.imm8s;
7328 }
7329 else if (i.suffix == WORD_MNEM_SUFFIX)
7330 temp.bitfield.imm16 = overlap.bitfield.imm16;
7331 else if (i.suffix == QWORD_MNEM_SUFFIX)
7332 {
7333 temp.bitfield.imm64 = overlap.bitfield.imm64;
7334 temp.bitfield.imm32s = overlap.bitfield.imm32s;
7335 }
7336 else
7337 temp.bitfield.imm32 = overlap.bitfield.imm32;
7338 overlap = temp;
29b0f896 7339 }
0dfbf9d7
L
7340 else if (operand_type_equal (&overlap, &imm16_32_32s)
7341 || operand_type_equal (&overlap, &imm16_32)
7342 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 7343 {
40fb9820 7344 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 7345 overlap = imm16;
40fb9820 7346 else
65da13b5 7347 overlap = imm32s;
29b0f896 7348 }
0dfbf9d7
L
7349 if (!operand_type_equal (&overlap, &imm8)
7350 && !operand_type_equal (&overlap, &imm8s)
7351 && !operand_type_equal (&overlap, &imm16)
7352 && !operand_type_equal (&overlap, &imm32)
7353 && !operand_type_equal (&overlap, &imm32s)
7354 && !operand_type_equal (&overlap, &imm64))
29b0f896 7355 {
4eed87de
AM
7356 as_bad (_("no instruction mnemonic suffix given; "
7357 "can't determine immediate size"));
29b0f896
AM
7358 return 0;
7359 }
7360 }
40fb9820 7361 i.types[j] = overlap;
29b0f896 7362
40fb9820
L
7363 return 1;
7364}
7365
7366static int
7367finalize_imm (void)
7368{
bc0844ae 7369 unsigned int j, n;
29b0f896 7370
bc0844ae
L
7371 /* Update the first 2 immediate operands. */
7372 n = i.operands > 2 ? 2 : i.operands;
7373 if (n)
7374 {
7375 for (j = 0; j < n; j++)
7376 if (update_imm (j) == 0)
7377 return 0;
40fb9820 7378
bc0844ae
L
7379 /* The 3rd operand can't be immediate operand. */
7380 gas_assert (operand_type_check (i.types[2], imm) == 0);
7381 }
29b0f896
AM
7382
7383 return 1;
7384}
7385
7386static int
e3bb37b5 7387process_operands (void)
29b0f896
AM
7388{
7389 /* Default segment register this instruction will use for memory
7390 accesses. 0 means unknown. This is only for optimizing out
7391 unnecessary segment overrides. */
7392 const seg_entry *default_seg = 0;
7393
2426c15f 7394 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 7395 {
91d6fa6a
NC
7396 unsigned int dupl = i.operands;
7397 unsigned int dest = dupl - 1;
9fcfb3d7
L
7398 unsigned int j;
7399
c0f3af97 7400 /* The destination must be an xmm register. */
9c2799c2 7401 gas_assert (i.reg_operands
91d6fa6a 7402 && MAX_OPERANDS > dupl
7ab9ffdd 7403 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 7404
75e5731b 7405 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7406 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 7407 {
8cd7925b 7408 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
7409 {
7410 /* Keep xmm0 for instructions with VEX prefix and 3
7411 sources. */
75e5731b 7412 i.tm.operand_types[0].bitfield.instance = InstanceNone;
3528c362 7413 i.tm.operand_types[0].bitfield.class = RegSIMD;
c0f3af97
L
7414 goto duplicate;
7415 }
e2ec9d29 7416 else
c0f3af97
L
7417 {
7418 /* We remove the first xmm0 and keep the number of
7419 operands unchanged, which in fact duplicates the
7420 destination. */
7421 for (j = 1; j < i.operands; j++)
7422 {
7423 i.op[j - 1] = i.op[j];
7424 i.types[j - 1] = i.types[j];
7425 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
8dc0818e 7426 i.flags[j - 1] = i.flags[j];
c0f3af97
L
7427 }
7428 }
7429 }
7430 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 7431 {
91d6fa6a 7432 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
7433 && (i.tm.opcode_modifier.vexsources
7434 == VEX3SOURCES));
c0f3af97
L
7435
7436 /* Add the implicit xmm0 for instructions with VEX prefix
7437 and 3 sources. */
7438 for (j = i.operands; j > 0; j--)
7439 {
7440 i.op[j] = i.op[j - 1];
7441 i.types[j] = i.types[j - 1];
7442 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 7443 i.flags[j] = i.flags[j - 1];
c0f3af97
L
7444 }
7445 i.op[0].regs
7446 = (const reg_entry *) hash_find (reg_hash, "xmm0");
7ab9ffdd 7447 i.types[0] = regxmm;
c0f3af97
L
7448 i.tm.operand_types[0] = regxmm;
7449
7450 i.operands += 2;
7451 i.reg_operands += 2;
7452 i.tm.operands += 2;
7453
91d6fa6a 7454 dupl++;
c0f3af97 7455 dest++;
91d6fa6a
NC
7456 i.op[dupl] = i.op[dest];
7457 i.types[dupl] = i.types[dest];
7458 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7459 i.flags[dupl] = i.flags[dest];
e2ec9d29 7460 }
c0f3af97
L
7461 else
7462 {
dc1e8a47 7463 duplicate:
c0f3af97
L
7464 i.operands++;
7465 i.reg_operands++;
7466 i.tm.operands++;
7467
91d6fa6a
NC
7468 i.op[dupl] = i.op[dest];
7469 i.types[dupl] = i.types[dest];
7470 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7471 i.flags[dupl] = i.flags[dest];
c0f3af97
L
7472 }
7473
7474 if (i.tm.opcode_modifier.immext)
7475 process_immext ();
7476 }
75e5731b 7477 else if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7478 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
7479 {
7480 unsigned int j;
7481
9fcfb3d7
L
7482 for (j = 1; j < i.operands; j++)
7483 {
7484 i.op[j - 1] = i.op[j];
7485 i.types[j - 1] = i.types[j];
7486
7487 /* We need to adjust fields in i.tm since they are used by
7488 build_modrm_byte. */
7489 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
7490
7491 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
7492 }
7493
e2ec9d29
L
7494 i.operands--;
7495 i.reg_operands--;
e2ec9d29
L
7496 i.tm.operands--;
7497 }
920d2ddc
IT
7498 else if (i.tm.opcode_modifier.implicitquadgroup)
7499 {
a477a8c4
JB
7500 unsigned int regnum, first_reg_in_group, last_reg_in_group;
7501
920d2ddc 7502 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 7503 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
7504 regnum = register_number (i.op[1].regs);
7505 first_reg_in_group = regnum & ~3;
7506 last_reg_in_group = first_reg_in_group + 3;
7507 if (regnum != first_reg_in_group)
7508 as_warn (_("source register `%s%s' implicitly denotes"
7509 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
7510 register_prefix, i.op[1].regs->reg_name,
7511 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
7512 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
7513 i.tm.name);
7514 }
e2ec9d29
L
7515 else if (i.tm.opcode_modifier.regkludge)
7516 {
7517 /* The imul $imm, %reg instruction is converted into
7518 imul $imm, %reg, %reg, and the clr %reg instruction
7519 is converted into xor %reg, %reg. */
7520
7521 unsigned int first_reg_op;
7522
7523 if (operand_type_check (i.types[0], reg))
7524 first_reg_op = 0;
7525 else
7526 first_reg_op = 1;
7527 /* Pretend we saw the extra register operand. */
9c2799c2 7528 gas_assert (i.reg_operands == 1
7ab9ffdd 7529 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
7530 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
7531 i.types[first_reg_op + 1] = i.types[first_reg_op];
7532 i.operands++;
7533 i.reg_operands++;
29b0f896
AM
7534 }
7535
85b80b0f 7536 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
7537 {
7538 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
7539 must be put into the modrm byte). Now, we make the modrm and
7540 index base bytes based on all the info we've collected. */
29b0f896
AM
7541
7542 default_seg = build_modrm_byte ();
7543 }
00cee14f 7544 else if (i.types[0].bitfield.class == SReg)
85b80b0f
JB
7545 {
7546 if (flag_code != CODE_64BIT
7547 ? i.tm.base_opcode == POP_SEG_SHORT
7548 && i.op[0].regs->reg_num == 1
7549 : (i.tm.base_opcode | 1) == POP_SEG386_SHORT
7550 && i.op[0].regs->reg_num < 4)
7551 {
7552 as_bad (_("you can't `%s %s%s'"),
7553 i.tm.name, register_prefix, i.op[0].regs->reg_name);
7554 return 0;
7555 }
7556 if ( i.op[0].regs->reg_num > 3 && i.tm.opcode_length == 1 )
7557 {
7558 i.tm.base_opcode ^= POP_SEG_SHORT ^ POP_SEG386_SHORT;
7559 i.tm.opcode_length = 2;
7560 }
7561 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
7562 }
8a2ed489 7563 else if ((i.tm.base_opcode & ~0x3) == MOV_AX_DISP32)
29b0f896
AM
7564 {
7565 default_seg = &ds;
7566 }
40fb9820 7567 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
7568 {
7569 /* For the string instructions that allow a segment override
7570 on one of their operands, the default segment is ds. */
7571 default_seg = &ds;
7572 }
50128d0c 7573 else if (i.short_form)
85b80b0f
JB
7574 {
7575 /* The register or float register operand is in operand
7576 0 or 1. */
bab6aec1 7577 unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
85b80b0f
JB
7578
7579 /* Register goes in low 3 bits of opcode. */
7580 i.tm.base_opcode |= i.op[op].regs->reg_num;
7581 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7582 i.rex |= REX_B;
7583 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
7584 {
7585 /* Warn about some common errors, but press on regardless.
7586 The first case can be generated by gcc (<= 2.8.1). */
7587 if (i.operands == 2)
7588 {
7589 /* Reversed arguments on faddp, fsubp, etc. */
7590 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
7591 register_prefix, i.op[!intel_syntax].regs->reg_name,
7592 register_prefix, i.op[intel_syntax].regs->reg_name);
7593 }
7594 else
7595 {
7596 /* Extraneous `l' suffix on fp insn. */
7597 as_warn (_("translating to `%s %s%s'"), i.tm.name,
7598 register_prefix, i.op[0].regs->reg_name);
7599 }
7600 }
7601 }
29b0f896 7602
514a8bb0 7603 if ((i.seg[0] || i.prefix[SEG_PREFIX])
514a8bb0
JB
7604 && i.tm.base_opcode == 0x8d /* lea */
7605 && !is_any_vex_encoding(&i.tm))
92334ad2
JB
7606 {
7607 if (!quiet_warnings)
7608 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
7609 if (optimize)
7610 {
7611 i.seg[0] = NULL;
7612 i.prefix[SEG_PREFIX] = 0;
7613 }
7614 }
52271982
AM
7615
7616 /* If a segment was explicitly specified, and the specified segment
b6773884
JB
7617 is neither the default nor the one already recorded from a prefix,
7618 use an opcode prefix to select it. If we never figured out what
7619 the default segment is, then default_seg will be zero at this
7620 point, and the specified segment prefix will always be used. */
7621 if (i.seg[0]
7622 && i.seg[0] != default_seg
7623 && i.seg[0]->seg_prefix != i.prefix[SEG_PREFIX])
29b0f896
AM
7624 {
7625 if (!add_prefix (i.seg[0]->seg_prefix))
7626 return 0;
7627 }
7628 return 1;
7629}
7630
7631static const seg_entry *
e3bb37b5 7632build_modrm_byte (void)
29b0f896
AM
7633{
7634 const seg_entry *default_seg = 0;
c0f3af97 7635 unsigned int source, dest;
8cd7925b 7636 int vex_3_sources;
c0f3af97 7637
8cd7925b 7638 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
7639 if (vex_3_sources)
7640 {
91d6fa6a 7641 unsigned int nds, reg_slot;
4c2c6516 7642 expressionS *exp;
c0f3af97 7643
6b8d3588 7644 dest = i.operands - 1;
c0f3af97 7645 nds = dest - 1;
922d8de8 7646
a683cc34 7647 /* There are 2 kinds of instructions:
bed3d976 7648 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 7649 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 7650 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 7651 ZMM register.
bed3d976 7652 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 7653 plus 1 memory operand, with VexXDS. */
922d8de8 7654 gas_assert ((i.reg_operands == 4
bed3d976
JB
7655 || (i.reg_operands == 3 && i.mem_operands == 1))
7656 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323 7657 && i.tm.opcode_modifier.vexw
3528c362 7658 && i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 7659
48db9223
JB
7660 /* If VexW1 is set, the first non-immediate operand is the source and
7661 the second non-immediate one is encoded in the immediate operand. */
7662 if (i.tm.opcode_modifier.vexw == VEXW1)
7663 {
7664 source = i.imm_operands;
7665 reg_slot = i.imm_operands + 1;
7666 }
7667 else
7668 {
7669 source = i.imm_operands + 1;
7670 reg_slot = i.imm_operands;
7671 }
7672
a683cc34 7673 if (i.imm_operands == 0)
bed3d976
JB
7674 {
7675 /* When there is no immediate operand, generate an 8bit
7676 immediate operand to encode the first operand. */
7677 exp = &im_expressions[i.imm_operands++];
7678 i.op[i.operands].imms = exp;
7679 i.types[i.operands] = imm8;
7680 i.operands++;
7681
3528c362 7682 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
bed3d976
JB
7683 exp->X_op = O_constant;
7684 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
7685 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
7686 }
922d8de8 7687 else
bed3d976 7688 {
9d3bf266
JB
7689 gas_assert (i.imm_operands == 1);
7690 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
7691 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 7692
9d3bf266
JB
7693 /* Turn on Imm8 again so that output_imm will generate it. */
7694 i.types[0].bitfield.imm8 = 1;
bed3d976 7695
3528c362 7696 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
9d3bf266 7697 i.op[0].imms->X_add_number
bed3d976 7698 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 7699 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 7700 }
a683cc34 7701
3528c362 7702 gas_assert (i.tm.operand_types[nds].bitfield.class == RegSIMD);
dae39acc 7703 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
7704 }
7705 else
7706 source = dest = 0;
29b0f896
AM
7707
7708 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
7709 implicit registers do not count. If there are 3 register
7710 operands, it must be a instruction with VexNDS. For a
7711 instruction with VexNDD, the destination register is encoded
7712 in VEX prefix. If there are 4 register operands, it must be
7713 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
7714 if (i.mem_operands == 0
7715 && ((i.reg_operands == 2
2426c15f 7716 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 7717 || (i.reg_operands == 3
2426c15f 7718 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 7719 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 7720 {
cab737b9
L
7721 switch (i.operands)
7722 {
7723 case 2:
7724 source = 0;
7725 break;
7726 case 3:
c81128dc
L
7727 /* When there are 3 operands, one of them may be immediate,
7728 which may be the first or the last operand. Otherwise,
c0f3af97
L
7729 the first operand must be shift count register (cl) or it
7730 is an instruction with VexNDS. */
9c2799c2 7731 gas_assert (i.imm_operands == 1
7ab9ffdd 7732 || (i.imm_operands == 0
2426c15f 7733 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
75e5731b
JB
7734 || (i.types[0].bitfield.instance == RegC
7735 && i.types[0].bitfield.byte))));
40fb9820 7736 if (operand_type_check (i.types[0], imm)
75e5731b
JB
7737 || (i.types[0].bitfield.instance == RegC
7738 && i.types[0].bitfield.byte))
40fb9820
L
7739 source = 1;
7740 else
7741 source = 0;
cab737b9
L
7742 break;
7743 case 4:
368d64cc
L
7744 /* When there are 4 operands, the first two must be 8bit
7745 immediate operands. The source operand will be the 3rd
c0f3af97
L
7746 one.
7747
7748 For instructions with VexNDS, if the first operand
7749 an imm8, the source operand is the 2nd one. If the last
7750 operand is imm8, the source operand is the first one. */
9c2799c2 7751 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
7752 && i.types[0].bitfield.imm8
7753 && i.types[1].bitfield.imm8)
2426c15f 7754 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
7755 && i.imm_operands == 1
7756 && (i.types[0].bitfield.imm8
43234a1e
L
7757 || i.types[i.operands - 1].bitfield.imm8
7758 || i.rounding)));
9f2670f2
L
7759 if (i.imm_operands == 2)
7760 source = 2;
7761 else
c0f3af97
L
7762 {
7763 if (i.types[0].bitfield.imm8)
7764 source = 1;
7765 else
7766 source = 0;
7767 }
c0f3af97
L
7768 break;
7769 case 5:
e771e7c9 7770 if (is_evex_encoding (&i.tm))
43234a1e
L
7771 {
7772 /* For EVEX instructions, when there are 5 operands, the
7773 first one must be immediate operand. If the second one
7774 is immediate operand, the source operand is the 3th
7775 one. If the last one is immediate operand, the source
7776 operand is the 2nd one. */
7777 gas_assert (i.imm_operands == 2
7778 && i.tm.opcode_modifier.sae
7779 && operand_type_check (i.types[0], imm));
7780 if (operand_type_check (i.types[1], imm))
7781 source = 2;
7782 else if (operand_type_check (i.types[4], imm))
7783 source = 1;
7784 else
7785 abort ();
7786 }
cab737b9
L
7787 break;
7788 default:
7789 abort ();
7790 }
7791
c0f3af97
L
7792 if (!vex_3_sources)
7793 {
7794 dest = source + 1;
7795
43234a1e
L
7796 /* RC/SAE operand could be between DEST and SRC. That happens
7797 when one operand is GPR and the other one is XMM/YMM/ZMM
7798 register. */
7799 if (i.rounding && i.rounding->operand == (int) dest)
7800 dest++;
7801
2426c15f 7802 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 7803 {
43234a1e 7804 /* For instructions with VexNDS, the register-only source
c5d0745b 7805 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
dfd69174 7806 register. It is encoded in VEX prefix. */
f12dc422
L
7807
7808 i386_operand_type op;
7809 unsigned int vvvv;
7810
7811 /* Check register-only source operand when two source
7812 operands are swapped. */
7813 if (!i.tm.operand_types[source].bitfield.baseindex
7814 && i.tm.operand_types[dest].bitfield.baseindex)
7815 {
7816 vvvv = source;
7817 source = dest;
7818 }
7819 else
7820 vvvv = dest;
7821
7822 op = i.tm.operand_types[vvvv];
c0f3af97 7823 if ((dest + 1) >= i.operands
bab6aec1 7824 || ((op.bitfield.class != Reg
dc821c5f 7825 || (!op.bitfield.dword && !op.bitfield.qword))
3528c362 7826 && op.bitfield.class != RegSIMD
43234a1e 7827 && !operand_type_equal (&op, &regmask)))
c0f3af97 7828 abort ();
f12dc422 7829 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
7830 dest++;
7831 }
7832 }
29b0f896
AM
7833
7834 i.rm.mode = 3;
dfd69174
JB
7835 /* One of the register operands will be encoded in the i.rm.reg
7836 field, the other in the combined i.rm.mode and i.rm.regmem
29b0f896
AM
7837 fields. If no form of this instruction supports a memory
7838 destination operand, then we assume the source operand may
7839 sometimes be a memory operand and so we need to store the
7840 destination in the i.rm.reg field. */
dfd69174 7841 if (!i.tm.opcode_modifier.regmem
40fb9820 7842 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
7843 {
7844 i.rm.reg = i.op[dest].regs->reg_num;
7845 i.rm.regmem = i.op[source].regs->reg_num;
3528c362
JB
7846 if (i.op[dest].regs->reg_type.bitfield.class == RegMMX
7847 || i.op[source].regs->reg_type.bitfield.class == RegMMX)
b4a3a7b4 7848 i.has_regmmx = TRUE;
3528c362
JB
7849 else if (i.op[dest].regs->reg_type.bitfield.class == RegSIMD
7850 || i.op[source].regs->reg_type.bitfield.class == RegSIMD)
b4a3a7b4
L
7851 {
7852 if (i.types[dest].bitfield.zmmword
7853 || i.types[source].bitfield.zmmword)
7854 i.has_regzmm = TRUE;
7855 else if (i.types[dest].bitfield.ymmword
7856 || i.types[source].bitfield.ymmword)
7857 i.has_regymm = TRUE;
7858 else
7859 i.has_regxmm = TRUE;
7860 }
29b0f896 7861 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 7862 i.rex |= REX_R;
43234a1e
L
7863 if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
7864 i.vrex |= REX_R;
29b0f896 7865 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 7866 i.rex |= REX_B;
43234a1e
L
7867 if ((i.op[source].regs->reg_flags & RegVRex) != 0)
7868 i.vrex |= REX_B;
29b0f896
AM
7869 }
7870 else
7871 {
7872 i.rm.reg = i.op[source].regs->reg_num;
7873 i.rm.regmem = i.op[dest].regs->reg_num;
7874 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 7875 i.rex |= REX_B;
43234a1e
L
7876 if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
7877 i.vrex |= REX_B;
29b0f896 7878 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 7879 i.rex |= REX_R;
43234a1e
L
7880 if ((i.op[source].regs->reg_flags & RegVRex) != 0)
7881 i.vrex |= REX_R;
29b0f896 7882 }
e0c7f900 7883 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 7884 {
4a5c67ed 7885 if (i.types[!i.tm.opcode_modifier.regmem].bitfield.class != RegCR)
c4a530c5 7886 abort ();
e0c7f900 7887 i.rex &= ~REX_R;
c4a530c5
JB
7888 add_prefix (LOCK_PREFIX_OPCODE);
7889 }
29b0f896
AM
7890 }
7891 else
7892 { /* If it's not 2 reg operands... */
c0f3af97
L
7893 unsigned int mem;
7894
29b0f896
AM
7895 if (i.mem_operands)
7896 {
7897 unsigned int fake_zero_displacement = 0;
99018f42 7898 unsigned int op;
4eed87de 7899
7ab9ffdd 7900 for (op = 0; op < i.operands; op++)
8dc0818e 7901 if (i.flags[op] & Operand_Mem)
7ab9ffdd 7902 break;
7ab9ffdd 7903 gas_assert (op < i.operands);
29b0f896 7904
6c30d220
L
7905 if (i.tm.opcode_modifier.vecsib)
7906 {
e968fc9b 7907 if (i.index_reg->reg_num == RegIZ)
6c30d220
L
7908 abort ();
7909
7910 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7911 if (!i.base_reg)
7912 {
7913 i.sib.base = NO_BASE_REGISTER;
7914 i.sib.scale = i.log2_scale_factor;
7915 i.types[op].bitfield.disp8 = 0;
7916 i.types[op].bitfield.disp16 = 0;
7917 i.types[op].bitfield.disp64 = 0;
43083a50 7918 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
6c30d220
L
7919 {
7920 /* Must be 32 bit */
7921 i.types[op].bitfield.disp32 = 1;
7922 i.types[op].bitfield.disp32s = 0;
7923 }
7924 else
7925 {
7926 i.types[op].bitfield.disp32 = 0;
7927 i.types[op].bitfield.disp32s = 1;
7928 }
7929 }
7930 i.sib.index = i.index_reg->reg_num;
7931 if ((i.index_reg->reg_flags & RegRex) != 0)
7932 i.rex |= REX_X;
43234a1e
L
7933 if ((i.index_reg->reg_flags & RegVRex) != 0)
7934 i.vrex |= REX_X;
6c30d220
L
7935 }
7936
29b0f896
AM
7937 default_seg = &ds;
7938
7939 if (i.base_reg == 0)
7940 {
7941 i.rm.mode = 0;
7942 if (!i.disp_operands)
9bb129e8 7943 fake_zero_displacement = 1;
29b0f896
AM
7944 if (i.index_reg == 0)
7945 {
73053c1f
JB
7946 i386_operand_type newdisp;
7947
6c30d220 7948 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 7949 /* Operand is just <disp> */
20f0a1fc 7950 if (flag_code == CODE_64BIT)
29b0f896
AM
7951 {
7952 /* 64bit mode overwrites the 32bit absolute
7953 addressing by RIP relative addressing and
7954 absolute addressing is encoded by one of the
7955 redundant SIB forms. */
7956 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7957 i.sib.base = NO_BASE_REGISTER;
7958 i.sib.index = NO_INDEX_REGISTER;
73053c1f 7959 newdisp = (!i.prefix[ADDR_PREFIX] ? disp32s : disp32);
20f0a1fc 7960 }
fc225355
L
7961 else if ((flag_code == CODE_16BIT)
7962 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
7963 {
7964 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 7965 newdisp = disp16;
20f0a1fc
NC
7966 }
7967 else
7968 {
7969 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 7970 newdisp = disp32;
29b0f896 7971 }
73053c1f
JB
7972 i.types[op] = operand_type_and_not (i.types[op], anydisp);
7973 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 7974 }
6c30d220 7975 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 7976 {
6c30d220 7977 /* !i.base_reg && i.index_reg */
e968fc9b 7978 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
7979 i.sib.index = NO_INDEX_REGISTER;
7980 else
7981 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
7982 i.sib.base = NO_BASE_REGISTER;
7983 i.sib.scale = i.log2_scale_factor;
7984 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
7985 i.types[op].bitfield.disp8 = 0;
7986 i.types[op].bitfield.disp16 = 0;
7987 i.types[op].bitfield.disp64 = 0;
43083a50 7988 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
40fb9820
L
7989 {
7990 /* Must be 32 bit */
7991 i.types[op].bitfield.disp32 = 1;
7992 i.types[op].bitfield.disp32s = 0;
7993 }
29b0f896 7994 else
40fb9820
L
7995 {
7996 i.types[op].bitfield.disp32 = 0;
7997 i.types[op].bitfield.disp32s = 1;
7998 }
29b0f896 7999 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8000 i.rex |= REX_X;
29b0f896
AM
8001 }
8002 }
8003 /* RIP addressing for 64bit mode. */
e968fc9b 8004 else if (i.base_reg->reg_num == RegIP)
29b0f896 8005 {
6c30d220 8006 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 8007 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
8008 i.types[op].bitfield.disp8 = 0;
8009 i.types[op].bitfield.disp16 = 0;
8010 i.types[op].bitfield.disp32 = 0;
8011 i.types[op].bitfield.disp32s = 1;
8012 i.types[op].bitfield.disp64 = 0;
71903a11 8013 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
8014 if (! i.disp_operands)
8015 fake_zero_displacement = 1;
29b0f896 8016 }
dc821c5f 8017 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 8018 {
6c30d220 8019 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
8020 switch (i.base_reg->reg_num)
8021 {
8022 case 3: /* (%bx) */
8023 if (i.index_reg == 0)
8024 i.rm.regmem = 7;
8025 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
8026 i.rm.regmem = i.index_reg->reg_num - 6;
8027 break;
8028 case 5: /* (%bp) */
8029 default_seg = &ss;
8030 if (i.index_reg == 0)
8031 {
8032 i.rm.regmem = 6;
40fb9820 8033 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
8034 {
8035 /* fake (%bp) into 0(%bp) */
b5014f7a 8036 i.types[op].bitfield.disp8 = 1;
252b5132 8037 fake_zero_displacement = 1;
29b0f896
AM
8038 }
8039 }
8040 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
8041 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
8042 break;
8043 default: /* (%si) -> 4 or (%di) -> 5 */
8044 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
8045 }
8046 i.rm.mode = mode_from_disp_size (i.types[op]);
8047 }
8048 else /* i.base_reg and 32/64 bit mode */
8049 {
8050 if (flag_code == CODE_64BIT
40fb9820
L
8051 && operand_type_check (i.types[op], disp))
8052 {
73053c1f
JB
8053 i.types[op].bitfield.disp16 = 0;
8054 i.types[op].bitfield.disp64 = 0;
40fb9820 8055 if (i.prefix[ADDR_PREFIX] == 0)
73053c1f
JB
8056 {
8057 i.types[op].bitfield.disp32 = 0;
8058 i.types[op].bitfield.disp32s = 1;
8059 }
40fb9820 8060 else
73053c1f
JB
8061 {
8062 i.types[op].bitfield.disp32 = 1;
8063 i.types[op].bitfield.disp32s = 0;
8064 }
40fb9820 8065 }
20f0a1fc 8066
6c30d220
L
8067 if (!i.tm.opcode_modifier.vecsib)
8068 i.rm.regmem = i.base_reg->reg_num;
29b0f896 8069 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 8070 i.rex |= REX_B;
29b0f896
AM
8071 i.sib.base = i.base_reg->reg_num;
8072 /* x86-64 ignores REX prefix bit here to avoid decoder
8073 complications. */
848930b2
JB
8074 if (!(i.base_reg->reg_flags & RegRex)
8075 && (i.base_reg->reg_num == EBP_REG_NUM
8076 || i.base_reg->reg_num == ESP_REG_NUM))
29b0f896 8077 default_seg = &ss;
848930b2 8078 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 8079 {
848930b2 8080 fake_zero_displacement = 1;
b5014f7a 8081 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
8082 }
8083 i.sib.scale = i.log2_scale_factor;
8084 if (i.index_reg == 0)
8085 {
6c30d220 8086 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
8087 /* <disp>(%esp) becomes two byte modrm with no index
8088 register. We've already stored the code for esp
8089 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
8090 Any base register besides %esp will not use the
8091 extra modrm byte. */
8092 i.sib.index = NO_INDEX_REGISTER;
29b0f896 8093 }
6c30d220 8094 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 8095 {
e968fc9b 8096 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8097 i.sib.index = NO_INDEX_REGISTER;
8098 else
8099 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8100 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8101 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8102 i.rex |= REX_X;
29b0f896 8103 }
67a4f2b7
AO
8104
8105 if (i.disp_operands
8106 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
8107 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
8108 i.rm.mode = 0;
8109 else
a501d77e
L
8110 {
8111 if (!fake_zero_displacement
8112 && !i.disp_operands
8113 && i.disp_encoding)
8114 {
8115 fake_zero_displacement = 1;
8116 if (i.disp_encoding == disp_encoding_8bit)
8117 i.types[op].bitfield.disp8 = 1;
8118 else
8119 i.types[op].bitfield.disp32 = 1;
8120 }
8121 i.rm.mode = mode_from_disp_size (i.types[op]);
8122 }
29b0f896 8123 }
252b5132 8124
29b0f896
AM
8125 if (fake_zero_displacement)
8126 {
8127 /* Fakes a zero displacement assuming that i.types[op]
8128 holds the correct displacement size. */
8129 expressionS *exp;
8130
9c2799c2 8131 gas_assert (i.op[op].disps == 0);
29b0f896
AM
8132 exp = &disp_expressions[i.disp_operands++];
8133 i.op[op].disps = exp;
8134 exp->X_op = O_constant;
8135 exp->X_add_number = 0;
8136 exp->X_add_symbol = (symbolS *) 0;
8137 exp->X_op_symbol = (symbolS *) 0;
8138 }
c0f3af97
L
8139
8140 mem = op;
29b0f896 8141 }
c0f3af97
L
8142 else
8143 mem = ~0;
252b5132 8144
8c43a48b 8145 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
8146 {
8147 if (operand_type_check (i.types[0], imm))
8148 i.vex.register_specifier = NULL;
8149 else
8150 {
8151 /* VEX.vvvv encodes one of the sources when the first
8152 operand is not an immediate. */
1ef99a7b 8153 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8154 i.vex.register_specifier = i.op[0].regs;
8155 else
8156 i.vex.register_specifier = i.op[1].regs;
8157 }
8158
8159 /* Destination is a XMM register encoded in the ModRM.reg
8160 and VEX.R bit. */
8161 i.rm.reg = i.op[2].regs->reg_num;
8162 if ((i.op[2].regs->reg_flags & RegRex) != 0)
8163 i.rex |= REX_R;
8164
8165 /* ModRM.rm and VEX.B encodes the other source. */
8166 if (!i.mem_operands)
8167 {
8168 i.rm.mode = 3;
8169
1ef99a7b 8170 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8171 i.rm.regmem = i.op[1].regs->reg_num;
8172 else
8173 i.rm.regmem = i.op[0].regs->reg_num;
8174
8175 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8176 i.rex |= REX_B;
8177 }
8178 }
2426c15f 8179 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
8180 {
8181 i.vex.register_specifier = i.op[2].regs;
8182 if (!i.mem_operands)
8183 {
8184 i.rm.mode = 3;
8185 i.rm.regmem = i.op[1].regs->reg_num;
8186 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8187 i.rex |= REX_B;
8188 }
8189 }
29b0f896
AM
8190 /* Fill in i.rm.reg or i.rm.regmem field with register operand
8191 (if any) based on i.tm.extension_opcode. Again, we must be
8192 careful to make sure that segment/control/debug/test/MMX
8193 registers are coded into the i.rm.reg field. */
f88c9eb0 8194 else if (i.reg_operands)
29b0f896 8195 {
99018f42 8196 unsigned int op;
7ab9ffdd
L
8197 unsigned int vex_reg = ~0;
8198
8199 for (op = 0; op < i.operands; op++)
b4a3a7b4 8200 {
bab6aec1 8201 if (i.types[op].bitfield.class == Reg
f74a6307
JB
8202 || i.types[op].bitfield.class == RegBND
8203 || i.types[op].bitfield.class == RegMask
00cee14f 8204 || i.types[op].bitfield.class == SReg
4a5c67ed
JB
8205 || i.types[op].bitfield.class == RegCR
8206 || i.types[op].bitfield.class == RegDR
8207 || i.types[op].bitfield.class == RegTR)
b4a3a7b4 8208 break;
3528c362 8209 if (i.types[op].bitfield.class == RegSIMD)
b4a3a7b4
L
8210 {
8211 if (i.types[op].bitfield.zmmword)
8212 i.has_regzmm = TRUE;
8213 else if (i.types[op].bitfield.ymmword)
8214 i.has_regymm = TRUE;
8215 else
8216 i.has_regxmm = TRUE;
8217 break;
8218 }
3528c362 8219 if (i.types[op].bitfield.class == RegMMX)
b4a3a7b4
L
8220 {
8221 i.has_regmmx = TRUE;
8222 break;
8223 }
8224 }
c0209578 8225
7ab9ffdd
L
8226 if (vex_3_sources)
8227 op = dest;
2426c15f 8228 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
8229 {
8230 /* For instructions with VexNDS, the register-only
8231 source operand is encoded in VEX prefix. */
8232 gas_assert (mem != (unsigned int) ~0);
c0f3af97 8233
7ab9ffdd 8234 if (op > mem)
c0f3af97 8235 {
7ab9ffdd
L
8236 vex_reg = op++;
8237 gas_assert (op < i.operands);
c0f3af97
L
8238 }
8239 else
c0f3af97 8240 {
f12dc422
L
8241 /* Check register-only source operand when two source
8242 operands are swapped. */
8243 if (!i.tm.operand_types[op].bitfield.baseindex
8244 && i.tm.operand_types[op + 1].bitfield.baseindex)
8245 {
8246 vex_reg = op;
8247 op += 2;
8248 gas_assert (mem == (vex_reg + 1)
8249 && op < i.operands);
8250 }
8251 else
8252 {
8253 vex_reg = op + 1;
8254 gas_assert (vex_reg < i.operands);
8255 }
c0f3af97 8256 }
7ab9ffdd 8257 }
2426c15f 8258 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 8259 {
f12dc422 8260 /* For instructions with VexNDD, the register destination
7ab9ffdd 8261 is encoded in VEX prefix. */
f12dc422
L
8262 if (i.mem_operands == 0)
8263 {
8264 /* There is no memory operand. */
8265 gas_assert ((op + 2) == i.operands);
8266 vex_reg = op + 1;
8267 }
8268 else
8d63c93e 8269 {
ed438a93
JB
8270 /* There are only 2 non-immediate operands. */
8271 gas_assert (op < i.imm_operands + 2
8272 && i.operands == i.imm_operands + 2);
8273 vex_reg = i.imm_operands + 1;
f12dc422 8274 }
7ab9ffdd
L
8275 }
8276 else
8277 gas_assert (op < i.operands);
99018f42 8278
7ab9ffdd
L
8279 if (vex_reg != (unsigned int) ~0)
8280 {
f12dc422 8281 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 8282
bab6aec1 8283 if ((type->bitfield.class != Reg
dc821c5f 8284 || (!type->bitfield.dword && !type->bitfield.qword))
3528c362 8285 && type->bitfield.class != RegSIMD
43234a1e 8286 && !operand_type_equal (type, &regmask))
7ab9ffdd 8287 abort ();
f88c9eb0 8288
7ab9ffdd
L
8289 i.vex.register_specifier = i.op[vex_reg].regs;
8290 }
8291
1b9f0c97
L
8292 /* Don't set OP operand twice. */
8293 if (vex_reg != op)
7ab9ffdd 8294 {
1b9f0c97
L
8295 /* If there is an extension opcode to put here, the
8296 register number must be put into the regmem field. */
8297 if (i.tm.extension_opcode != None)
8298 {
8299 i.rm.regmem = i.op[op].regs->reg_num;
8300 if ((i.op[op].regs->reg_flags & RegRex) != 0)
8301 i.rex |= REX_B;
43234a1e
L
8302 if ((i.op[op].regs->reg_flags & RegVRex) != 0)
8303 i.vrex |= REX_B;
1b9f0c97
L
8304 }
8305 else
8306 {
8307 i.rm.reg = i.op[op].regs->reg_num;
8308 if ((i.op[op].regs->reg_flags & RegRex) != 0)
8309 i.rex |= REX_R;
43234a1e
L
8310 if ((i.op[op].regs->reg_flags & RegVRex) != 0)
8311 i.vrex |= REX_R;
1b9f0c97 8312 }
7ab9ffdd 8313 }
252b5132 8314
29b0f896
AM
8315 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
8316 must set it to 3 to indicate this is a register operand
8317 in the regmem field. */
8318 if (!i.mem_operands)
8319 i.rm.mode = 3;
8320 }
252b5132 8321
29b0f896 8322 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 8323 if (i.tm.extension_opcode != None)
29b0f896
AM
8324 i.rm.reg = i.tm.extension_opcode;
8325 }
8326 return default_seg;
8327}
252b5132 8328
376cd056
JB
8329static unsigned int
8330flip_code16 (unsigned int code16)
8331{
8332 gas_assert (i.tm.operands == 1);
8333
8334 return !(i.prefix[REX_PREFIX] & REX_W)
8335 && (code16 ? i.tm.operand_types[0].bitfield.disp32
8336 || i.tm.operand_types[0].bitfield.disp32s
8337 : i.tm.operand_types[0].bitfield.disp16)
8338 ? CODE16 : 0;
8339}
8340
29b0f896 8341static void
e3bb37b5 8342output_branch (void)
29b0f896
AM
8343{
8344 char *p;
f8a5c266 8345 int size;
29b0f896
AM
8346 int code16;
8347 int prefix;
8348 relax_substateT subtype;
8349 symbolS *sym;
8350 offsetT off;
8351
f8a5c266 8352 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 8353 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
8354
8355 prefix = 0;
8356 if (i.prefix[DATA_PREFIX] != 0)
252b5132 8357 {
29b0f896
AM
8358 prefix = 1;
8359 i.prefixes -= 1;
376cd056 8360 code16 ^= flip_code16(code16);
252b5132 8361 }
29b0f896
AM
8362 /* Pentium4 branch hints. */
8363 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8364 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 8365 {
29b0f896
AM
8366 prefix++;
8367 i.prefixes--;
8368 }
8369 if (i.prefix[REX_PREFIX] != 0)
8370 {
8371 prefix++;
8372 i.prefixes--;
2f66722d
AM
8373 }
8374
7e8b059b
L
8375 /* BND prefixed jump. */
8376 if (i.prefix[BND_PREFIX] != 0)
8377 {
6cb0a70e
JB
8378 prefix++;
8379 i.prefixes--;
7e8b059b
L
8380 }
8381
f2810fe0
JB
8382 if (i.prefixes != 0)
8383 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
29b0f896
AM
8384
8385 /* It's always a symbol; End frag & setup for relax.
8386 Make sure there is enough room in this frag for the largest
8387 instruction we may generate in md_convert_frag. This is 2
8388 bytes for the opcode and room for the prefix and largest
8389 displacement. */
8390 frag_grow (prefix + 2 + 4);
8391 /* Prefix and 1 opcode byte go in fr_fix. */
8392 p = frag_more (prefix + 1);
8393 if (i.prefix[DATA_PREFIX] != 0)
8394 *p++ = DATA_PREFIX_OPCODE;
8395 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
8396 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
8397 *p++ = i.prefix[SEG_PREFIX];
6cb0a70e
JB
8398 if (i.prefix[BND_PREFIX] != 0)
8399 *p++ = BND_PREFIX_OPCODE;
29b0f896
AM
8400 if (i.prefix[REX_PREFIX] != 0)
8401 *p++ = i.prefix[REX_PREFIX];
8402 *p = i.tm.base_opcode;
8403
8404 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 8405 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 8406 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 8407 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 8408 else
f8a5c266 8409 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 8410 subtype |= code16;
3e73aa7c 8411
29b0f896
AM
8412 sym = i.op[0].disps->X_add_symbol;
8413 off = i.op[0].disps->X_add_number;
3e73aa7c 8414
29b0f896
AM
8415 if (i.op[0].disps->X_op != O_constant
8416 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 8417 {
29b0f896
AM
8418 /* Handle complex expressions. */
8419 sym = make_expr_symbol (i.op[0].disps);
8420 off = 0;
8421 }
3e73aa7c 8422
29b0f896
AM
8423 /* 1 possible extra opcode + 4 byte displacement go in var part.
8424 Pass reloc in fr_var. */
d258b828 8425 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 8426}
3e73aa7c 8427
bd7ab16b
L
8428#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8429/* Return TRUE iff PLT32 relocation should be used for branching to
8430 symbol S. */
8431
8432static bfd_boolean
8433need_plt32_p (symbolS *s)
8434{
8435 /* PLT32 relocation is ELF only. */
8436 if (!IS_ELF)
8437 return FALSE;
8438
a5def729
RO
8439#ifdef TE_SOLARIS
8440 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
8441 krtld support it. */
8442 return FALSE;
8443#endif
8444
bd7ab16b
L
8445 /* Since there is no need to prepare for PLT branch on x86-64, we
8446 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
8447 be used as a marker for 32-bit PC-relative branches. */
8448 if (!object_64bit)
8449 return FALSE;
8450
8451 /* Weak or undefined symbol need PLT32 relocation. */
8452 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
8453 return TRUE;
8454
8455 /* Non-global symbol doesn't need PLT32 relocation. */
8456 if (! S_IS_EXTERNAL (s))
8457 return FALSE;
8458
8459 /* Other global symbols need PLT32 relocation. NB: Symbol with
8460 non-default visibilities are treated as normal global symbol
8461 so that PLT32 relocation can be used as a marker for 32-bit
8462 PC-relative branches. It is useful for linker relaxation. */
8463 return TRUE;
8464}
8465#endif
8466
29b0f896 8467static void
e3bb37b5 8468output_jump (void)
29b0f896
AM
8469{
8470 char *p;
8471 int size;
3e02c1cc 8472 fixS *fixP;
bd7ab16b 8473 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 8474
0cfa3eb3 8475 if (i.tm.opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
8476 {
8477 /* This is a loop or jecxz type instruction. */
8478 size = 1;
8479 if (i.prefix[ADDR_PREFIX] != 0)
8480 {
8481 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
8482 i.prefixes -= 1;
8483 }
8484 /* Pentium4 branch hints. */
8485 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8486 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
8487 {
8488 FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
8489 i.prefixes--;
3e73aa7c
JH
8490 }
8491 }
29b0f896
AM
8492 else
8493 {
8494 int code16;
3e73aa7c 8495
29b0f896
AM
8496 code16 = 0;
8497 if (flag_code == CODE_16BIT)
8498 code16 = CODE16;
3e73aa7c 8499
29b0f896
AM
8500 if (i.prefix[DATA_PREFIX] != 0)
8501 {
8502 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
8503 i.prefixes -= 1;
376cd056 8504 code16 ^= flip_code16(code16);
29b0f896 8505 }
252b5132 8506
29b0f896
AM
8507 size = 4;
8508 if (code16)
8509 size = 2;
8510 }
9fcc94b6 8511
6cb0a70e
JB
8512 /* BND prefixed jump. */
8513 if (i.prefix[BND_PREFIX] != 0)
29b0f896 8514 {
6cb0a70e 8515 FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
29b0f896
AM
8516 i.prefixes -= 1;
8517 }
252b5132 8518
6cb0a70e 8519 if (i.prefix[REX_PREFIX] != 0)
7e8b059b 8520 {
6cb0a70e 8521 FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
7e8b059b
L
8522 i.prefixes -= 1;
8523 }
8524
f2810fe0
JB
8525 if (i.prefixes != 0)
8526 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
e0890092 8527
42164a71
L
8528 p = frag_more (i.tm.opcode_length + size);
8529 switch (i.tm.opcode_length)
8530 {
8531 case 2:
8532 *p++ = i.tm.base_opcode >> 8;
1a0670f3 8533 /* Fall through. */
42164a71
L
8534 case 1:
8535 *p++ = i.tm.base_opcode;
8536 break;
8537 default:
8538 abort ();
8539 }
e0890092 8540
bd7ab16b
L
8541#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8542 if (size == 4
8543 && jump_reloc == NO_RELOC
8544 && need_plt32_p (i.op[0].disps->X_add_symbol))
8545 jump_reloc = BFD_RELOC_X86_64_PLT32;
8546#endif
8547
8548 jump_reloc = reloc (size, 1, 1, jump_reloc);
8549
3e02c1cc 8550 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 8551 i.op[0].disps, 1, jump_reloc);
3e02c1cc
AM
8552
8553 /* All jumps handled here are signed, but don't use a signed limit
8554 check for 32 and 16 bit jumps as we want to allow wrap around at
8555 4G and 64k respectively. */
8556 if (size == 1)
8557 fixP->fx_signed = 1;
29b0f896 8558}
e0890092 8559
29b0f896 8560static void
e3bb37b5 8561output_interseg_jump (void)
29b0f896
AM
8562{
8563 char *p;
8564 int size;
8565 int prefix;
8566 int code16;
252b5132 8567
29b0f896
AM
8568 code16 = 0;
8569 if (flag_code == CODE_16BIT)
8570 code16 = CODE16;
a217f122 8571
29b0f896
AM
8572 prefix = 0;
8573 if (i.prefix[DATA_PREFIX] != 0)
8574 {
8575 prefix = 1;
8576 i.prefixes -= 1;
8577 code16 ^= CODE16;
8578 }
6cb0a70e
JB
8579
8580 gas_assert (!i.prefix[REX_PREFIX]);
252b5132 8581
29b0f896
AM
8582 size = 4;
8583 if (code16)
8584 size = 2;
252b5132 8585
f2810fe0
JB
8586 if (i.prefixes != 0)
8587 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
252b5132 8588
29b0f896
AM
8589 /* 1 opcode; 2 segment; offset */
8590 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 8591
29b0f896
AM
8592 if (i.prefix[DATA_PREFIX] != 0)
8593 *p++ = DATA_PREFIX_OPCODE;
252b5132 8594
29b0f896
AM
8595 if (i.prefix[REX_PREFIX] != 0)
8596 *p++ = i.prefix[REX_PREFIX];
252b5132 8597
29b0f896
AM
8598 *p++ = i.tm.base_opcode;
8599 if (i.op[1].imms->X_op == O_constant)
8600 {
8601 offsetT n = i.op[1].imms->X_add_number;
252b5132 8602
29b0f896
AM
8603 if (size == 2
8604 && !fits_in_unsigned_word (n)
8605 && !fits_in_signed_word (n))
8606 {
8607 as_bad (_("16-bit jump out of range"));
8608 return;
8609 }
8610 md_number_to_chars (p, n, size);
8611 }
8612 else
8613 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 8614 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
29b0f896
AM
8615 if (i.op[0].imms->X_op != O_constant)
8616 as_bad (_("can't handle non absolute segment in `%s'"),
8617 i.tm.name);
8618 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
8619}
a217f122 8620
b4a3a7b4
L
8621#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8622void
8623x86_cleanup (void)
8624{
8625 char *p;
8626 asection *seg = now_seg;
8627 subsegT subseg = now_subseg;
8628 asection *sec;
8629 unsigned int alignment, align_size_1;
8630 unsigned int isa_1_descsz, feature_2_descsz, descsz;
8631 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
8632 unsigned int padding;
8633
8634 if (!IS_ELF || !x86_used_note)
8635 return;
8636
b4a3a7b4
L
8637 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
8638
8639 /* The .note.gnu.property section layout:
8640
8641 Field Length Contents
8642 ---- ---- ----
8643 n_namsz 4 4
8644 n_descsz 4 The note descriptor size
8645 n_type 4 NT_GNU_PROPERTY_TYPE_0
8646 n_name 4 "GNU"
8647 n_desc n_descsz The program property array
8648 .... .... ....
8649 */
8650
8651 /* Create the .note.gnu.property section. */
8652 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 8653 bfd_set_section_flags (sec,
b4a3a7b4
L
8654 (SEC_ALLOC
8655 | SEC_LOAD
8656 | SEC_DATA
8657 | SEC_HAS_CONTENTS
8658 | SEC_READONLY));
8659
8660 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
8661 {
8662 align_size_1 = 7;
8663 alignment = 3;
8664 }
8665 else
8666 {
8667 align_size_1 = 3;
8668 alignment = 2;
8669 }
8670
fd361982 8671 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
8672 elf_section_type (sec) = SHT_NOTE;
8673
8674 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
8675 + 4-byte data */
8676 isa_1_descsz_raw = 4 + 4 + 4;
8677 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
8678 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
8679
8680 feature_2_descsz_raw = isa_1_descsz;
8681 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
8682 + 4-byte data */
8683 feature_2_descsz_raw += 4 + 4 + 4;
8684 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
8685 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
8686 & ~align_size_1);
8687
8688 descsz = feature_2_descsz;
8689 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
8690 p = frag_more (4 + 4 + 4 + 4 + descsz);
8691
8692 /* Write n_namsz. */
8693 md_number_to_chars (p, (valueT) 4, 4);
8694
8695 /* Write n_descsz. */
8696 md_number_to_chars (p + 4, (valueT) descsz, 4);
8697
8698 /* Write n_type. */
8699 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
8700
8701 /* Write n_name. */
8702 memcpy (p + 4 * 3, "GNU", 4);
8703
8704 /* Write 4-byte type. */
8705 md_number_to_chars (p + 4 * 4,
8706 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
8707
8708 /* Write 4-byte data size. */
8709 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
8710
8711 /* Write 4-byte data. */
8712 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
8713
8714 /* Zero out paddings. */
8715 padding = isa_1_descsz - isa_1_descsz_raw;
8716 if (padding)
8717 memset (p + 4 * 7, 0, padding);
8718
8719 /* Write 4-byte type. */
8720 md_number_to_chars (p + isa_1_descsz + 4 * 4,
8721 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
8722
8723 /* Write 4-byte data size. */
8724 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
8725
8726 /* Write 4-byte data. */
8727 md_number_to_chars (p + isa_1_descsz + 4 * 6,
8728 (valueT) x86_feature_2_used, 4);
8729
8730 /* Zero out paddings. */
8731 padding = feature_2_descsz - feature_2_descsz_raw;
8732 if (padding)
8733 memset (p + isa_1_descsz + 4 * 7, 0, padding);
8734
8735 /* We probably can't restore the current segment, for there likely
8736 isn't one yet... */
8737 if (seg && subseg)
8738 subseg_set (seg, subseg);
8739}
8740#endif
8741
9c33702b
JB
8742static unsigned int
8743encoding_length (const fragS *start_frag, offsetT start_off,
8744 const char *frag_now_ptr)
8745{
8746 unsigned int len = 0;
8747
8748 if (start_frag != frag_now)
8749 {
8750 const fragS *fr = start_frag;
8751
8752 do {
8753 len += fr->fr_fix;
8754 fr = fr->fr_next;
8755 } while (fr && fr != frag_now);
8756 }
8757
8758 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
8759}
8760
e379e5f3 8761/* Return 1 for test, and, cmp, add, sub, inc and dec which may
79d72f45
HL
8762 be macro-fused with conditional jumps.
8763 NB: If TEST/AND/CMP/ADD/SUB/INC/DEC is of RIP relative address,
8764 or is one of the following format:
8765
8766 cmp m, imm
8767 add m, imm
8768 sub m, imm
8769 test m, imm
8770 and m, imm
8771 inc m
8772 dec m
8773
8774 it is unfusible. */
e379e5f3
L
8775
8776static int
79d72f45 8777maybe_fused_with_jcc_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8778{
8779 /* No RIP address. */
8780 if (i.base_reg && i.base_reg->reg_num == RegIP)
8781 return 0;
8782
8783 /* No VEX/EVEX encoding. */
8784 if (is_any_vex_encoding (&i.tm))
8785 return 0;
8786
79d72f45
HL
8787 /* add, sub without add/sub m, imm. */
8788 if (i.tm.base_opcode <= 5
e379e5f3
L
8789 || (i.tm.base_opcode >= 0x28 && i.tm.base_opcode <= 0x2d)
8790 || ((i.tm.base_opcode | 3) == 0x83
79d72f45 8791 && (i.tm.extension_opcode == 0x5
e379e5f3 8792 || i.tm.extension_opcode == 0x0)))
79d72f45
HL
8793 {
8794 *mf_cmp_p = mf_cmp_alu_cmp;
8795 return !(i.mem_operands && i.imm_operands);
8796 }
e379e5f3 8797
79d72f45
HL
8798 /* and without and m, imm. */
8799 if ((i.tm.base_opcode >= 0x20 && i.tm.base_opcode <= 0x25)
8800 || ((i.tm.base_opcode | 3) == 0x83
8801 && i.tm.extension_opcode == 0x4))
8802 {
8803 *mf_cmp_p = mf_cmp_test_and;
8804 return !(i.mem_operands && i.imm_operands);
8805 }
8806
8807 /* test without test m imm. */
e379e5f3
L
8808 if ((i.tm.base_opcode | 1) == 0x85
8809 || (i.tm.base_opcode | 1) == 0xa9
8810 || ((i.tm.base_opcode | 1) == 0xf7
79d72f45
HL
8811 && i.tm.extension_opcode == 0))
8812 {
8813 *mf_cmp_p = mf_cmp_test_and;
8814 return !(i.mem_operands && i.imm_operands);
8815 }
8816
8817 /* cmp without cmp m, imm. */
8818 if ((i.tm.base_opcode >= 0x38 && i.tm.base_opcode <= 0x3d)
e379e5f3
L
8819 || ((i.tm.base_opcode | 3) == 0x83
8820 && (i.tm.extension_opcode == 0x7)))
79d72f45
HL
8821 {
8822 *mf_cmp_p = mf_cmp_alu_cmp;
8823 return !(i.mem_operands && i.imm_operands);
8824 }
e379e5f3 8825
79d72f45 8826 /* inc, dec without inc/dec m. */
e379e5f3
L
8827 if ((i.tm.cpu_flags.bitfield.cpuno64
8828 && (i.tm.base_opcode | 0xf) == 0x4f)
8829 || ((i.tm.base_opcode | 1) == 0xff
8830 && i.tm.extension_opcode <= 0x1))
79d72f45
HL
8831 {
8832 *mf_cmp_p = mf_cmp_incdec;
8833 return !i.mem_operands;
8834 }
e379e5f3
L
8835
8836 return 0;
8837}
8838
8839/* Return 1 if a FUSED_JCC_PADDING frag should be generated. */
8840
8841static int
79d72f45 8842add_fused_jcc_padding_frag_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8843{
8844 /* NB: Don't work with COND_JUMP86 without i386. */
8845 if (!align_branch_power
8846 || now_seg == absolute_section
8847 || !cpu_arch_flags.bitfield.cpui386
8848 || !(align_branch & align_branch_fused_bit))
8849 return 0;
8850
79d72f45 8851 if (maybe_fused_with_jcc_p (mf_cmp_p))
e379e5f3
L
8852 {
8853 if (last_insn.kind == last_insn_other
8854 || last_insn.seg != now_seg)
8855 return 1;
8856 if (flag_debug)
8857 as_warn_where (last_insn.file, last_insn.line,
8858 _("`%s` skips -malign-branch-boundary on `%s`"),
8859 last_insn.name, i.tm.name);
8860 }
8861
8862 return 0;
8863}
8864
8865/* Return 1 if a BRANCH_PREFIX frag should be generated. */
8866
8867static int
8868add_branch_prefix_frag_p (void)
8869{
8870 /* NB: Don't work with COND_JUMP86 without i386. Don't add prefix
8871 to PadLock instructions since they include prefixes in opcode. */
8872 if (!align_branch_power
8873 || !align_branch_prefix_size
8874 || now_seg == absolute_section
8875 || i.tm.cpu_flags.bitfield.cpupadlock
8876 || !cpu_arch_flags.bitfield.cpui386)
8877 return 0;
8878
8879 /* Don't add prefix if it is a prefix or there is no operand in case
8880 that segment prefix is special. */
8881 if (!i.operands || i.tm.opcode_modifier.isprefix)
8882 return 0;
8883
8884 if (last_insn.kind == last_insn_other
8885 || last_insn.seg != now_seg)
8886 return 1;
8887
8888 if (flag_debug)
8889 as_warn_where (last_insn.file, last_insn.line,
8890 _("`%s` skips -malign-branch-boundary on `%s`"),
8891 last_insn.name, i.tm.name);
8892
8893 return 0;
8894}
8895
8896/* Return 1 if a BRANCH_PADDING frag should be generated. */
8897
8898static int
79d72f45
HL
8899add_branch_padding_frag_p (enum align_branch_kind *branch_p,
8900 enum mf_jcc_kind *mf_jcc_p)
e379e5f3
L
8901{
8902 int add_padding;
8903
8904 /* NB: Don't work with COND_JUMP86 without i386. */
8905 if (!align_branch_power
8906 || now_seg == absolute_section
8907 || !cpu_arch_flags.bitfield.cpui386)
8908 return 0;
8909
8910 add_padding = 0;
8911
8912 /* Check for jcc and direct jmp. */
8913 if (i.tm.opcode_modifier.jump == JUMP)
8914 {
8915 if (i.tm.base_opcode == JUMP_PC_RELATIVE)
8916 {
8917 *branch_p = align_branch_jmp;
8918 add_padding = align_branch & align_branch_jmp_bit;
8919 }
8920 else
8921 {
79d72f45
HL
8922 /* Because J<cc> and JN<cc> share same group in macro-fusible table,
8923 igore the lowest bit. */
8924 *mf_jcc_p = (i.tm.base_opcode & 0x0e) >> 1;
e379e5f3
L
8925 *branch_p = align_branch_jcc;
8926 if ((align_branch & align_branch_jcc_bit))
8927 add_padding = 1;
8928 }
8929 }
8930 else if (is_any_vex_encoding (&i.tm))
8931 return 0;
8932 else if ((i.tm.base_opcode | 1) == 0xc3)
8933 {
8934 /* Near ret. */
8935 *branch_p = align_branch_ret;
8936 if ((align_branch & align_branch_ret_bit))
8937 add_padding = 1;
8938 }
8939 else
8940 {
8941 /* Check for indirect jmp, direct and indirect calls. */
8942 if (i.tm.base_opcode == 0xe8)
8943 {
8944 /* Direct call. */
8945 *branch_p = align_branch_call;
8946 if ((align_branch & align_branch_call_bit))
8947 add_padding = 1;
8948 }
8949 else if (i.tm.base_opcode == 0xff
8950 && (i.tm.extension_opcode == 2
8951 || i.tm.extension_opcode == 4))
8952 {
8953 /* Indirect call and jmp. */
8954 *branch_p = align_branch_indirect;
8955 if ((align_branch & align_branch_indirect_bit))
8956 add_padding = 1;
8957 }
8958
8959 if (add_padding
8960 && i.disp_operands
8961 && tls_get_addr
8962 && (i.op[0].disps->X_op == O_symbol
8963 || (i.op[0].disps->X_op == O_subtract
8964 && i.op[0].disps->X_op_symbol == GOT_symbol)))
8965 {
8966 symbolS *s = i.op[0].disps->X_add_symbol;
8967 /* No padding to call to global or undefined tls_get_addr. */
8968 if ((S_IS_EXTERNAL (s) || !S_IS_DEFINED (s))
8969 && strcmp (S_GET_NAME (s), tls_get_addr) == 0)
8970 return 0;
8971 }
8972 }
8973
8974 if (add_padding
8975 && last_insn.kind != last_insn_other
8976 && last_insn.seg == now_seg)
8977 {
8978 if (flag_debug)
8979 as_warn_where (last_insn.file, last_insn.line,
8980 _("`%s` skips -malign-branch-boundary on `%s`"),
8981 last_insn.name, i.tm.name);
8982 return 0;
8983 }
8984
8985 return add_padding;
8986}
8987
29b0f896 8988static void
e3bb37b5 8989output_insn (void)
29b0f896 8990{
2bbd9c25
JJ
8991 fragS *insn_start_frag;
8992 offsetT insn_start_off;
e379e5f3
L
8993 fragS *fragP = NULL;
8994 enum align_branch_kind branch = align_branch_none;
79d72f45
HL
8995 /* The initializer is arbitrary just to avoid uninitialized error.
8996 it's actually either assigned in add_branch_padding_frag_p
8997 or never be used. */
8998 enum mf_jcc_kind mf_jcc = mf_jcc_jo;
2bbd9c25 8999
b4a3a7b4
L
9000#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
9001 if (IS_ELF && x86_used_note)
9002 {
9003 if (i.tm.cpu_flags.bitfield.cpucmov)
9004 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_CMOV;
9005 if (i.tm.cpu_flags.bitfield.cpusse)
9006 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE;
9007 if (i.tm.cpu_flags.bitfield.cpusse2)
9008 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE2;
9009 if (i.tm.cpu_flags.bitfield.cpusse3)
9010 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE3;
9011 if (i.tm.cpu_flags.bitfield.cpussse3)
9012 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSSE3;
9013 if (i.tm.cpu_flags.bitfield.cpusse4_1)
9014 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_1;
9015 if (i.tm.cpu_flags.bitfield.cpusse4_2)
9016 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_2;
9017 if (i.tm.cpu_flags.bitfield.cpuavx)
9018 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX;
9019 if (i.tm.cpu_flags.bitfield.cpuavx2)
9020 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX2;
9021 if (i.tm.cpu_flags.bitfield.cpufma)
9022 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_FMA;
9023 if (i.tm.cpu_flags.bitfield.cpuavx512f)
9024 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512F;
9025 if (i.tm.cpu_flags.bitfield.cpuavx512cd)
9026 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512CD;
9027 if (i.tm.cpu_flags.bitfield.cpuavx512er)
9028 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512ER;
9029 if (i.tm.cpu_flags.bitfield.cpuavx512pf)
9030 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512PF;
9031 if (i.tm.cpu_flags.bitfield.cpuavx512vl)
9032 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512VL;
9033 if (i.tm.cpu_flags.bitfield.cpuavx512dq)
9034 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512DQ;
9035 if (i.tm.cpu_flags.bitfield.cpuavx512bw)
9036 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512BW;
9037 if (i.tm.cpu_flags.bitfield.cpuavx512_4fmaps)
9038 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS;
9039 if (i.tm.cpu_flags.bitfield.cpuavx512_4vnniw)
9040 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW;
9041 if (i.tm.cpu_flags.bitfield.cpuavx512_bitalg)
9042 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BITALG;
9043 if (i.tm.cpu_flags.bitfield.cpuavx512ifma)
9044 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_IFMA;
9045 if (i.tm.cpu_flags.bitfield.cpuavx512vbmi)
9046 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI;
9047 if (i.tm.cpu_flags.bitfield.cpuavx512_vbmi2)
9048 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2;
9049 if (i.tm.cpu_flags.bitfield.cpuavx512_vnni)
9050 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VNNI;
462cac58
L
9051 if (i.tm.cpu_flags.bitfield.cpuavx512_bf16)
9052 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BF16;
b4a3a7b4
L
9053
9054 if (i.tm.cpu_flags.bitfield.cpu8087
9055 || i.tm.cpu_flags.bitfield.cpu287
9056 || i.tm.cpu_flags.bitfield.cpu387
9057 || i.tm.cpu_flags.bitfield.cpu687
9058 || i.tm.cpu_flags.bitfield.cpufisttp)
9059 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
319ff62c
JB
9060 if (i.has_regmmx
9061 || i.tm.base_opcode == 0xf77 /* emms */
a7e12755
L
9062 || i.tm.base_opcode == 0xf0e /* femms */
9063 || i.tm.base_opcode == 0xf2a /* cvtpi2ps */
9064 || i.tm.base_opcode == 0x660f2a /* cvtpi2pd */)
b4a3a7b4
L
9065 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
9066 if (i.has_regxmm)
9067 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
9068 if (i.has_regymm)
9069 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
9070 if (i.has_regzmm)
9071 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
9072 if (i.tm.cpu_flags.bitfield.cpufxsr)
9073 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
9074 if (i.tm.cpu_flags.bitfield.cpuxsave)
9075 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
9076 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
9077 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
9078 if (i.tm.cpu_flags.bitfield.cpuxsavec)
9079 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
9080 }
9081#endif
9082
29b0f896
AM
9083 /* Tie dwarf2 debug info to the address at the start of the insn.
9084 We can't do this after the insn has been output as the current
9085 frag may have been closed off. eg. by frag_var. */
9086 dwarf2_emit_insn (0);
9087
2bbd9c25
JJ
9088 insn_start_frag = frag_now;
9089 insn_start_off = frag_now_fix ();
9090
79d72f45 9091 if (add_branch_padding_frag_p (&branch, &mf_jcc))
e379e5f3
L
9092 {
9093 char *p;
9094 /* Branch can be 8 bytes. Leave some room for prefixes. */
9095 unsigned int max_branch_padding_size = 14;
9096
9097 /* Align section to boundary. */
9098 record_alignment (now_seg, align_branch_power);
9099
9100 /* Make room for padding. */
9101 frag_grow (max_branch_padding_size);
9102
9103 /* Start of the padding. */
9104 p = frag_more (0);
9105
9106 fragP = frag_now;
9107
9108 frag_var (rs_machine_dependent, max_branch_padding_size, 0,
9109 ENCODE_RELAX_STATE (BRANCH_PADDING, 0),
9110 NULL, 0, p);
9111
79d72f45 9112 fragP->tc_frag_data.mf_type = mf_jcc;
e379e5f3
L
9113 fragP->tc_frag_data.branch_type = branch;
9114 fragP->tc_frag_data.max_bytes = max_branch_padding_size;
9115 }
9116
29b0f896 9117 /* Output jumps. */
0cfa3eb3 9118 if (i.tm.opcode_modifier.jump == JUMP)
29b0f896 9119 output_branch ();
0cfa3eb3
JB
9120 else if (i.tm.opcode_modifier.jump == JUMP_BYTE
9121 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896 9122 output_jump ();
0cfa3eb3 9123 else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT)
29b0f896
AM
9124 output_interseg_jump ();
9125 else
9126 {
9127 /* Output normal instructions here. */
9128 char *p;
9129 unsigned char *q;
47465058 9130 unsigned int j;
331d2d0d 9131 unsigned int prefix;
79d72f45 9132 enum mf_cmp_kind mf_cmp;
4dffcebc 9133
e4e00185 9134 if (avoid_fence
c3949f43
JB
9135 && (i.tm.base_opcode == 0xfaee8
9136 || i.tm.base_opcode == 0xfaef0
9137 || i.tm.base_opcode == 0xfaef8))
e4e00185
AS
9138 {
9139 /* Encode lfence, mfence, and sfence as
9140 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
9141 offsetT val = 0x240483f0ULL;
9142 p = frag_more (5);
9143 md_number_to_chars (p, val, 5);
9144 return;
9145 }
9146
d022bddd
IT
9147 /* Some processors fail on LOCK prefix. This options makes
9148 assembler ignore LOCK prefix and serves as a workaround. */
9149 if (omit_lock_prefix)
9150 {
9151 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE)
9152 return;
9153 i.prefix[LOCK_PREFIX] = 0;
9154 }
9155
e379e5f3
L
9156 if (branch)
9157 /* Skip if this is a branch. */
9158 ;
79d72f45 9159 else if (add_fused_jcc_padding_frag_p (&mf_cmp))
e379e5f3
L
9160 {
9161 /* Make room for padding. */
9162 frag_grow (MAX_FUSED_JCC_PADDING_SIZE);
9163 p = frag_more (0);
9164
9165 fragP = frag_now;
9166
9167 frag_var (rs_machine_dependent, MAX_FUSED_JCC_PADDING_SIZE, 0,
9168 ENCODE_RELAX_STATE (FUSED_JCC_PADDING, 0),
9169 NULL, 0, p);
9170
79d72f45 9171 fragP->tc_frag_data.mf_type = mf_cmp;
e379e5f3
L
9172 fragP->tc_frag_data.branch_type = align_branch_fused;
9173 fragP->tc_frag_data.max_bytes = MAX_FUSED_JCC_PADDING_SIZE;
9174 }
9175 else if (add_branch_prefix_frag_p ())
9176 {
9177 unsigned int max_prefix_size = align_branch_prefix_size;
9178
9179 /* Make room for padding. */
9180 frag_grow (max_prefix_size);
9181 p = frag_more (0);
9182
9183 fragP = frag_now;
9184
9185 frag_var (rs_machine_dependent, max_prefix_size, 0,
9186 ENCODE_RELAX_STATE (BRANCH_PREFIX, 0),
9187 NULL, 0, p);
9188
9189 fragP->tc_frag_data.max_bytes = max_prefix_size;
9190 }
9191
43234a1e
L
9192 /* Since the VEX/EVEX prefix contains the implicit prefix, we
9193 don't need the explicit prefix. */
9194 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 9195 {
c0f3af97 9196 switch (i.tm.opcode_length)
bc4bd9ab 9197 {
c0f3af97
L
9198 case 3:
9199 if (i.tm.base_opcode & 0xff000000)
4dffcebc 9200 {
c0f3af97 9201 prefix = (i.tm.base_opcode >> 24) & 0xff;
c3949f43
JB
9202 if (!i.tm.cpu_flags.bitfield.cpupadlock
9203 || prefix != REPE_PREFIX_OPCODE
9204 || (i.prefix[REP_PREFIX] != REPE_PREFIX_OPCODE))
9205 add_prefix (prefix);
c0f3af97
L
9206 }
9207 break;
9208 case 2:
9209 if ((i.tm.base_opcode & 0xff0000) != 0)
9210 {
9211 prefix = (i.tm.base_opcode >> 16) & 0xff;
c3949f43 9212 add_prefix (prefix);
4dffcebc 9213 }
c0f3af97
L
9214 break;
9215 case 1:
9216 break;
390c91cf
L
9217 case 0:
9218 /* Check for pseudo prefixes. */
9219 as_bad_where (insn_start_frag->fr_file,
9220 insn_start_frag->fr_line,
9221 _("pseudo prefix without instruction"));
9222 return;
c0f3af97
L
9223 default:
9224 abort ();
bc4bd9ab 9225 }
c0f3af97 9226
6d19a37a 9227#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
9228 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
9229 R_X86_64_GOTTPOFF relocation so that linker can safely
14470f07
L
9230 perform IE->LE optimization. A dummy REX_OPCODE prefix
9231 is also needed for lea with R_X86_64_GOTPC32_TLSDESC
9232 relocation for GDesc -> IE/LE optimization. */
cf61b747
L
9233 if (x86_elf_abi == X86_64_X32_ABI
9234 && i.operands == 2
14470f07
L
9235 && (i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
9236 || i.reloc[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
cf61b747
L
9237 && i.prefix[REX_PREFIX] == 0)
9238 add_prefix (REX_OPCODE);
6d19a37a 9239#endif
cf61b747 9240
c0f3af97
L
9241 /* The prefix bytes. */
9242 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
9243 if (*q)
9244 FRAG_APPEND_1_CHAR (*q);
0f10071e 9245 }
ae5c1c7b 9246 else
c0f3af97
L
9247 {
9248 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
9249 if (*q)
9250 switch (j)
9251 {
9252 case REX_PREFIX:
9253 /* REX byte is encoded in VEX prefix. */
9254 break;
9255 case SEG_PREFIX:
9256 case ADDR_PREFIX:
9257 FRAG_APPEND_1_CHAR (*q);
9258 break;
9259 default:
9260 /* There should be no other prefixes for instructions
9261 with VEX prefix. */
9262 abort ();
9263 }
9264
43234a1e
L
9265 /* For EVEX instructions i.vrex should become 0 after
9266 build_evex_prefix. For VEX instructions upper 16 registers
9267 aren't available, so VREX should be 0. */
9268 if (i.vrex)
9269 abort ();
c0f3af97
L
9270 /* Now the VEX prefix. */
9271 p = frag_more (i.vex.length);
9272 for (j = 0; j < i.vex.length; j++)
9273 p[j] = i.vex.bytes[j];
9274 }
252b5132 9275
29b0f896 9276 /* Now the opcode; be careful about word order here! */
4dffcebc 9277 if (i.tm.opcode_length == 1)
29b0f896
AM
9278 {
9279 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
9280 }
9281 else
9282 {
4dffcebc 9283 switch (i.tm.opcode_length)
331d2d0d 9284 {
43234a1e
L
9285 case 4:
9286 p = frag_more (4);
9287 *p++ = (i.tm.base_opcode >> 24) & 0xff;
9288 *p++ = (i.tm.base_opcode >> 16) & 0xff;
9289 break;
4dffcebc 9290 case 3:
331d2d0d
L
9291 p = frag_more (3);
9292 *p++ = (i.tm.base_opcode >> 16) & 0xff;
4dffcebc
L
9293 break;
9294 case 2:
9295 p = frag_more (2);
9296 break;
9297 default:
9298 abort ();
9299 break;
331d2d0d 9300 }
0f10071e 9301
29b0f896
AM
9302 /* Put out high byte first: can't use md_number_to_chars! */
9303 *p++ = (i.tm.base_opcode >> 8) & 0xff;
9304 *p = i.tm.base_opcode & 0xff;
9305 }
3e73aa7c 9306
29b0f896 9307 /* Now the modrm byte and sib byte (if present). */
40fb9820 9308 if (i.tm.opcode_modifier.modrm)
29b0f896 9309 {
4a3523fa
L
9310 FRAG_APPEND_1_CHAR ((i.rm.regmem << 0
9311 | i.rm.reg << 3
9312 | i.rm.mode << 6));
29b0f896
AM
9313 /* If i.rm.regmem == ESP (4)
9314 && i.rm.mode != (Register mode)
9315 && not 16 bit
9316 ==> need second modrm byte. */
9317 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
9318 && i.rm.mode != 3
dc821c5f 9319 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
4a3523fa
L
9320 FRAG_APPEND_1_CHAR ((i.sib.base << 0
9321 | i.sib.index << 3
9322 | i.sib.scale << 6));
29b0f896 9323 }
3e73aa7c 9324
29b0f896 9325 if (i.disp_operands)
2bbd9c25 9326 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 9327
29b0f896 9328 if (i.imm_operands)
2bbd9c25 9329 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
9330
9331 /*
9332 * frag_now_fix () returning plain abs_section_offset when we're in the
9333 * absolute section, and abs_section_offset not getting updated as data
9334 * gets added to the frag breaks the logic below.
9335 */
9336 if (now_seg != absolute_section)
9337 {
9338 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
9339 if (j > 15)
9340 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
9341 j);
e379e5f3
L
9342 else if (fragP)
9343 {
9344 /* NB: Don't add prefix with GOTPC relocation since
9345 output_disp() above depends on the fixed encoding
9346 length. Can't add prefix with TLS relocation since
9347 it breaks TLS linker optimization. */
9348 unsigned int max = i.has_gotpc_tls_reloc ? 0 : 15 - j;
9349 /* Prefix count on the current instruction. */
9350 unsigned int count = i.vex.length;
9351 unsigned int k;
9352 for (k = 0; k < ARRAY_SIZE (i.prefix); k++)
9353 /* REX byte is encoded in VEX/EVEX prefix. */
9354 if (i.prefix[k] && (k != REX_PREFIX || !i.vex.length))
9355 count++;
9356
9357 /* Count prefixes for extended opcode maps. */
9358 if (!i.vex.length)
9359 switch (i.tm.opcode_length)
9360 {
9361 case 3:
9362 if (((i.tm.base_opcode >> 16) & 0xff) == 0xf)
9363 {
9364 count++;
9365 switch ((i.tm.base_opcode >> 8) & 0xff)
9366 {
9367 case 0x38:
9368 case 0x3a:
9369 count++;
9370 break;
9371 default:
9372 break;
9373 }
9374 }
9375 break;
9376 case 2:
9377 if (((i.tm.base_opcode >> 8) & 0xff) == 0xf)
9378 count++;
9379 break;
9380 case 1:
9381 break;
9382 default:
9383 abort ();
9384 }
9385
9386 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
9387 == BRANCH_PREFIX)
9388 {
9389 /* Set the maximum prefix size in BRANCH_PREFIX
9390 frag. */
9391 if (fragP->tc_frag_data.max_bytes > max)
9392 fragP->tc_frag_data.max_bytes = max;
9393 if (fragP->tc_frag_data.max_bytes > count)
9394 fragP->tc_frag_data.max_bytes -= count;
9395 else
9396 fragP->tc_frag_data.max_bytes = 0;
9397 }
9398 else
9399 {
9400 /* Remember the maximum prefix size in FUSED_JCC_PADDING
9401 frag. */
9402 unsigned int max_prefix_size;
9403 if (align_branch_prefix_size > max)
9404 max_prefix_size = max;
9405 else
9406 max_prefix_size = align_branch_prefix_size;
9407 if (max_prefix_size > count)
9408 fragP->tc_frag_data.max_prefix_length
9409 = max_prefix_size - count;
9410 }
9411
9412 /* Use existing segment prefix if possible. Use CS
9413 segment prefix in 64-bit mode. In 32-bit mode, use SS
9414 segment prefix with ESP/EBP base register and use DS
9415 segment prefix without ESP/EBP base register. */
9416 if (i.prefix[SEG_PREFIX])
9417 fragP->tc_frag_data.default_prefix = i.prefix[SEG_PREFIX];
9418 else if (flag_code == CODE_64BIT)
9419 fragP->tc_frag_data.default_prefix = CS_PREFIX_OPCODE;
9420 else if (i.base_reg
9421 && (i.base_reg->reg_num == 4
9422 || i.base_reg->reg_num == 5))
9423 fragP->tc_frag_data.default_prefix = SS_PREFIX_OPCODE;
9424 else
9425 fragP->tc_frag_data.default_prefix = DS_PREFIX_OPCODE;
9426 }
9c33702b 9427 }
29b0f896 9428 }
252b5132 9429
e379e5f3
L
9430 /* NB: Don't work with COND_JUMP86 without i386. */
9431 if (align_branch_power
9432 && now_seg != absolute_section
9433 && cpu_arch_flags.bitfield.cpui386)
9434 {
9435 /* Terminate each frag so that we can add prefix and check for
9436 fused jcc. */
9437 frag_wane (frag_now);
9438 frag_new (0);
9439 }
9440
29b0f896
AM
9441#ifdef DEBUG386
9442 if (flag_debug)
9443 {
7b81dfbb 9444 pi ("" /*line*/, &i);
29b0f896
AM
9445 }
9446#endif /* DEBUG386 */
9447}
252b5132 9448
e205caa7
L
9449/* Return the size of the displacement operand N. */
9450
9451static int
9452disp_size (unsigned int n)
9453{
9454 int size = 4;
43234a1e 9455
b5014f7a 9456 if (i.types[n].bitfield.disp64)
40fb9820
L
9457 size = 8;
9458 else if (i.types[n].bitfield.disp8)
9459 size = 1;
9460 else if (i.types[n].bitfield.disp16)
9461 size = 2;
e205caa7
L
9462 return size;
9463}
9464
9465/* Return the size of the immediate operand N. */
9466
9467static int
9468imm_size (unsigned int n)
9469{
9470 int size = 4;
40fb9820
L
9471 if (i.types[n].bitfield.imm64)
9472 size = 8;
9473 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
9474 size = 1;
9475 else if (i.types[n].bitfield.imm16)
9476 size = 2;
e205caa7
L
9477 return size;
9478}
9479
29b0f896 9480static void
64e74474 9481output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9482{
9483 char *p;
9484 unsigned int n;
252b5132 9485
29b0f896
AM
9486 for (n = 0; n < i.operands; n++)
9487 {
b5014f7a 9488 if (operand_type_check (i.types[n], disp))
29b0f896
AM
9489 {
9490 if (i.op[n].disps->X_op == O_constant)
9491 {
e205caa7 9492 int size = disp_size (n);
43234a1e 9493 offsetT val = i.op[n].disps->X_add_number;
252b5132 9494
629cfaf1
JB
9495 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
9496 size);
29b0f896
AM
9497 p = frag_more (size);
9498 md_number_to_chars (p, val, size);
9499 }
9500 else
9501 {
f86103b7 9502 enum bfd_reloc_code_real reloc_type;
e205caa7 9503 int size = disp_size (n);
40fb9820 9504 int sign = i.types[n].bitfield.disp32s;
29b0f896 9505 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 9506 fixS *fixP;
29b0f896 9507
e205caa7 9508 /* We can't have 8 bit displacement here. */
9c2799c2 9509 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 9510
29b0f896
AM
9511 /* The PC relative address is computed relative
9512 to the instruction boundary, so in case immediate
9513 fields follows, we need to adjust the value. */
9514 if (pcrel && i.imm_operands)
9515 {
29b0f896 9516 unsigned int n1;
e205caa7 9517 int sz = 0;
252b5132 9518
29b0f896 9519 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 9520 if (operand_type_check (i.types[n1], imm))
252b5132 9521 {
e205caa7
L
9522 /* Only one immediate is allowed for PC
9523 relative address. */
9c2799c2 9524 gas_assert (sz == 0);
e205caa7
L
9525 sz = imm_size (n1);
9526 i.op[n].disps->X_add_number -= sz;
252b5132 9527 }
29b0f896 9528 /* We should find the immediate. */
9c2799c2 9529 gas_assert (sz != 0);
29b0f896 9530 }
520dc8e8 9531
29b0f896 9532 p = frag_more (size);
d258b828 9533 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 9534 if (GOT_symbol
2bbd9c25 9535 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 9536 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9537 || reloc_type == BFD_RELOC_X86_64_32S
9538 || (reloc_type == BFD_RELOC_64
9539 && object_64bit))
d6ab8113
JB
9540 && (i.op[n].disps->X_op == O_symbol
9541 || (i.op[n].disps->X_op == O_add
9542 && ((symbol_get_value_expression
9543 (i.op[n].disps->X_op_symbol)->X_op)
9544 == O_subtract))))
9545 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 9546 {
4fa24527 9547 if (!object_64bit)
7b81dfbb
AJ
9548 {
9549 reloc_type = BFD_RELOC_386_GOTPC;
e379e5f3 9550 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9551 i.op[n].imms->X_add_number +=
9552 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
9553 }
9554 else if (reloc_type == BFD_RELOC_64)
9555 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 9556 else
7b81dfbb
AJ
9557 /* Don't do the adjustment for x86-64, as there
9558 the pcrel addressing is relative to the _next_
9559 insn, and that is taken care of in other code. */
d6ab8113 9560 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 9561 }
e379e5f3
L
9562 else if (align_branch_power)
9563 {
9564 switch (reloc_type)
9565 {
9566 case BFD_RELOC_386_TLS_GD:
9567 case BFD_RELOC_386_TLS_LDM:
9568 case BFD_RELOC_386_TLS_IE:
9569 case BFD_RELOC_386_TLS_IE_32:
9570 case BFD_RELOC_386_TLS_GOTIE:
9571 case BFD_RELOC_386_TLS_GOTDESC:
9572 case BFD_RELOC_386_TLS_DESC_CALL:
9573 case BFD_RELOC_X86_64_TLSGD:
9574 case BFD_RELOC_X86_64_TLSLD:
9575 case BFD_RELOC_X86_64_GOTTPOFF:
9576 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
9577 case BFD_RELOC_X86_64_TLSDESC_CALL:
9578 i.has_gotpc_tls_reloc = TRUE;
9579 default:
9580 break;
9581 }
9582 }
02a86693
L
9583 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
9584 size, i.op[n].disps, pcrel,
9585 reloc_type);
9586 /* Check for "call/jmp *mem", "mov mem, %reg",
9587 "test %reg, mem" and "binop mem, %reg" where binop
9588 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
9589 instructions without data prefix. Always generate
9590 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
9591 if (i.prefix[DATA_PREFIX] == 0
9592 && (generate_relax_relocations
9593 || (!object_64bit
9594 && i.rm.mode == 0
9595 && i.rm.regmem == 5))
0cb4071e
L
9596 && (i.rm.mode == 2
9597 || (i.rm.mode == 0 && i.rm.regmem == 5))
2ae4c703 9598 && !is_any_vex_encoding(&i.tm)
02a86693
L
9599 && ((i.operands == 1
9600 && i.tm.base_opcode == 0xff
9601 && (i.rm.reg == 2 || i.rm.reg == 4))
9602 || (i.operands == 2
9603 && (i.tm.base_opcode == 0x8b
9604 || i.tm.base_opcode == 0x85
2ae4c703 9605 || (i.tm.base_opcode & ~0x38) == 0x03))))
02a86693
L
9606 {
9607 if (object_64bit)
9608 {
9609 fixP->fx_tcbit = i.rex != 0;
9610 if (i.base_reg
e968fc9b 9611 && (i.base_reg->reg_num == RegIP))
02a86693
L
9612 fixP->fx_tcbit2 = 1;
9613 }
9614 else
9615 fixP->fx_tcbit2 = 1;
9616 }
29b0f896
AM
9617 }
9618 }
9619 }
9620}
252b5132 9621
29b0f896 9622static void
64e74474 9623output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9624{
9625 char *p;
9626 unsigned int n;
252b5132 9627
29b0f896
AM
9628 for (n = 0; n < i.operands; n++)
9629 {
43234a1e
L
9630 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
9631 if (i.rounding && (int) n == i.rounding->operand)
9632 continue;
9633
40fb9820 9634 if (operand_type_check (i.types[n], imm))
29b0f896
AM
9635 {
9636 if (i.op[n].imms->X_op == O_constant)
9637 {
e205caa7 9638 int size = imm_size (n);
29b0f896 9639 offsetT val;
b4cac588 9640
29b0f896
AM
9641 val = offset_in_range (i.op[n].imms->X_add_number,
9642 size);
9643 p = frag_more (size);
9644 md_number_to_chars (p, val, size);
9645 }
9646 else
9647 {
9648 /* Not absolute_section.
9649 Need a 32-bit fixup (don't support 8bit
9650 non-absolute imms). Try to support other
9651 sizes ... */
f86103b7 9652 enum bfd_reloc_code_real reloc_type;
e205caa7
L
9653 int size = imm_size (n);
9654 int sign;
29b0f896 9655
40fb9820 9656 if (i.types[n].bitfield.imm32s
a7d61044 9657 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 9658 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 9659 sign = 1;
e205caa7
L
9660 else
9661 sign = 0;
520dc8e8 9662
29b0f896 9663 p = frag_more (size);
d258b828 9664 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 9665
2bbd9c25
JJ
9666 /* This is tough to explain. We end up with this one if we
9667 * have operands that look like
9668 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
9669 * obtain the absolute address of the GOT, and it is strongly
9670 * preferable from a performance point of view to avoid using
9671 * a runtime relocation for this. The actual sequence of
9672 * instructions often look something like:
9673 *
9674 * call .L66
9675 * .L66:
9676 * popl %ebx
9677 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
9678 *
9679 * The call and pop essentially return the absolute address
9680 * of the label .L66 and store it in %ebx. The linker itself
9681 * will ultimately change the first operand of the addl so
9682 * that %ebx points to the GOT, but to keep things simple, the
9683 * .o file must have this operand set so that it generates not
9684 * the absolute address of .L66, but the absolute address of
9685 * itself. This allows the linker itself simply treat a GOTPC
9686 * relocation as asking for a pcrel offset to the GOT to be
9687 * added in, and the addend of the relocation is stored in the
9688 * operand field for the instruction itself.
9689 *
9690 * Our job here is to fix the operand so that it would add
9691 * the correct offset so that %ebx would point to itself. The
9692 * thing that is tricky is that .-.L66 will point to the
9693 * beginning of the instruction, so we need to further modify
9694 * the operand so that it will point to itself. There are
9695 * other cases where you have something like:
9696 *
9697 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
9698 *
9699 * and here no correction would be required. Internally in
9700 * the assembler we treat operands of this form as not being
9701 * pcrel since the '.' is explicitly mentioned, and I wonder
9702 * whether it would simplify matters to do it this way. Who
9703 * knows. In earlier versions of the PIC patches, the
9704 * pcrel_adjust field was used to store the correction, but
9705 * since the expression is not pcrel, I felt it would be
9706 * confusing to do it this way. */
9707
d6ab8113 9708 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9709 || reloc_type == BFD_RELOC_X86_64_32S
9710 || reloc_type == BFD_RELOC_64)
29b0f896
AM
9711 && GOT_symbol
9712 && GOT_symbol == i.op[n].imms->X_add_symbol
9713 && (i.op[n].imms->X_op == O_symbol
9714 || (i.op[n].imms->X_op == O_add
9715 && ((symbol_get_value_expression
9716 (i.op[n].imms->X_op_symbol)->X_op)
9717 == O_subtract))))
9718 {
4fa24527 9719 if (!object_64bit)
d6ab8113 9720 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 9721 else if (size == 4)
d6ab8113 9722 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
9723 else if (size == 8)
9724 reloc_type = BFD_RELOC_X86_64_GOTPC64;
e379e5f3 9725 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9726 i.op[n].imms->X_add_number +=
9727 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 9728 }
29b0f896
AM
9729 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
9730 i.op[n].imms, 0, reloc_type);
9731 }
9732 }
9733 }
252b5132
RH
9734}
9735\f
d182319b
JB
9736/* x86_cons_fix_new is called via the expression parsing code when a
9737 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
9738static int cons_sign = -1;
9739
9740void
e3bb37b5 9741x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 9742 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 9743{
d258b828 9744 r = reloc (len, 0, cons_sign, r);
d182319b
JB
9745
9746#ifdef TE_PE
9747 if (exp->X_op == O_secrel)
9748 {
9749 exp->X_op = O_symbol;
9750 r = BFD_RELOC_32_SECREL;
9751 }
9752#endif
9753
9754 fix_new_exp (frag, off, len, exp, 0, r);
9755}
9756
357d1bd8
L
9757/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
9758 purpose of the `.dc.a' internal pseudo-op. */
9759
9760int
9761x86_address_bytes (void)
9762{
9763 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
9764 return 4;
9765 return stdoutput->arch_info->bits_per_address / 8;
9766}
9767
d382c579
TG
9768#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
9769 || defined (LEX_AT)
d258b828 9770# define lex_got(reloc, adjust, types) NULL
718ddfc0 9771#else
f3c180ae
AM
9772/* Parse operands of the form
9773 <symbol>@GOTOFF+<nnn>
9774 and similar .plt or .got references.
9775
9776 If we find one, set up the correct relocation in RELOC and copy the
9777 input string, minus the `@GOTOFF' into a malloc'd buffer for
9778 parsing by the calling routine. Return this buffer, and if ADJUST
9779 is non-null set it to the length of the string we removed from the
9780 input line. Otherwise return NULL. */
9781static char *
91d6fa6a 9782lex_got (enum bfd_reloc_code_real *rel,
64e74474 9783 int *adjust,
d258b828 9784 i386_operand_type *types)
f3c180ae 9785{
7b81dfbb
AJ
9786 /* Some of the relocations depend on the size of what field is to
9787 be relocated. But in our callers i386_immediate and i386_displacement
9788 we don't yet know the operand size (this will be set by insn
9789 matching). Hence we record the word32 relocation here,
9790 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
9791 static const struct {
9792 const char *str;
cff8d58a 9793 int len;
4fa24527 9794 const enum bfd_reloc_code_real rel[2];
40fb9820 9795 const i386_operand_type types64;
f3c180ae 9796 } gotrel[] = {
8ce3d284 9797#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
9798 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
9799 BFD_RELOC_SIZE32 },
9800 OPERAND_TYPE_IMM32_64 },
8ce3d284 9801#endif
cff8d58a
L
9802 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
9803 BFD_RELOC_X86_64_PLTOFF64 },
40fb9820 9804 OPERAND_TYPE_IMM64 },
cff8d58a
L
9805 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
9806 BFD_RELOC_X86_64_PLT32 },
40fb9820 9807 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9808 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
9809 BFD_RELOC_X86_64_GOTPLT64 },
40fb9820 9810 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
9811 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
9812 BFD_RELOC_X86_64_GOTOFF64 },
40fb9820 9813 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
9814 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
9815 BFD_RELOC_X86_64_GOTPCREL },
40fb9820 9816 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9817 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
9818 BFD_RELOC_X86_64_TLSGD },
40fb9820 9819 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9820 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
9821 _dummy_first_bfd_reloc_code_real },
40fb9820 9822 OPERAND_TYPE_NONE },
cff8d58a
L
9823 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
9824 BFD_RELOC_X86_64_TLSLD },
40fb9820 9825 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9826 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
9827 BFD_RELOC_X86_64_GOTTPOFF },
40fb9820 9828 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9829 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
9830 BFD_RELOC_X86_64_TPOFF32 },
40fb9820 9831 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
9832 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
9833 _dummy_first_bfd_reloc_code_real },
40fb9820 9834 OPERAND_TYPE_NONE },
cff8d58a
L
9835 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
9836 BFD_RELOC_X86_64_DTPOFF32 },
40fb9820 9837 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
9838 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
9839 _dummy_first_bfd_reloc_code_real },
40fb9820 9840 OPERAND_TYPE_NONE },
cff8d58a
L
9841 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
9842 _dummy_first_bfd_reloc_code_real },
40fb9820 9843 OPERAND_TYPE_NONE },
cff8d58a
L
9844 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
9845 BFD_RELOC_X86_64_GOT32 },
40fb9820 9846 OPERAND_TYPE_IMM32_32S_64_DISP32 },
cff8d58a
L
9847 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
9848 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
40fb9820 9849 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9850 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
9851 BFD_RELOC_X86_64_TLSDESC_CALL },
40fb9820 9852 OPERAND_TYPE_IMM32_32S_DISP32 },
f3c180ae
AM
9853 };
9854 char *cp;
9855 unsigned int j;
9856
d382c579 9857#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
9858 if (!IS_ELF)
9859 return NULL;
d382c579 9860#endif
718ddfc0 9861
f3c180ae 9862 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 9863 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
9864 return NULL;
9865
47465058 9866 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 9867 {
cff8d58a 9868 int len = gotrel[j].len;
28f81592 9869 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 9870 {
4fa24527 9871 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 9872 {
28f81592
AM
9873 int first, second;
9874 char *tmpbuf, *past_reloc;
f3c180ae 9875
91d6fa6a 9876 *rel = gotrel[j].rel[object_64bit];
f3c180ae 9877
3956db08
JB
9878 if (types)
9879 {
9880 if (flag_code != CODE_64BIT)
40fb9820
L
9881 {
9882 types->bitfield.imm32 = 1;
9883 types->bitfield.disp32 = 1;
9884 }
3956db08
JB
9885 else
9886 *types = gotrel[j].types64;
9887 }
9888
8fd4256d 9889 if (j != 0 && GOT_symbol == NULL)
f3c180ae
AM
9890 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
9891
28f81592 9892 /* The length of the first part of our input line. */
f3c180ae 9893 first = cp - input_line_pointer;
28f81592
AM
9894
9895 /* The second part goes from after the reloc token until
67c11a9b 9896 (and including) an end_of_line char or comma. */
28f81592 9897 past_reloc = cp + 1 + len;
67c11a9b
AM
9898 cp = past_reloc;
9899 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
9900 ++cp;
9901 second = cp + 1 - past_reloc;
28f81592
AM
9902
9903 /* Allocate and copy string. The trailing NUL shouldn't
9904 be necessary, but be safe. */
add39d23 9905 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 9906 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
9907 if (second != 0 && *past_reloc != ' ')
9908 /* Replace the relocation token with ' ', so that
9909 errors like foo@GOTOFF1 will be detected. */
9910 tmpbuf[first++] = ' ';
af89796a
L
9911 else
9912 /* Increment length by 1 if the relocation token is
9913 removed. */
9914 len++;
9915 if (adjust)
9916 *adjust = len;
0787a12d
AM
9917 memcpy (tmpbuf + first, past_reloc, second);
9918 tmpbuf[first + second] = '\0';
f3c180ae
AM
9919 return tmpbuf;
9920 }
9921
4fa24527
JB
9922 as_bad (_("@%s reloc is not supported with %d-bit output format"),
9923 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
9924 return NULL;
9925 }
9926 }
9927
9928 /* Might be a symbol version string. Don't as_bad here. */
9929 return NULL;
9930}
4e4f7c87 9931#endif
f3c180ae 9932
a988325c
NC
9933#ifdef TE_PE
9934#ifdef lex_got
9935#undef lex_got
9936#endif
9937/* Parse operands of the form
9938 <symbol>@SECREL32+<nnn>
9939
9940 If we find one, set up the correct relocation in RELOC and copy the
9941 input string, minus the `@SECREL32' into a malloc'd buffer for
9942 parsing by the calling routine. Return this buffer, and if ADJUST
9943 is non-null set it to the length of the string we removed from the
34bca508
L
9944 input line. Otherwise return NULL.
9945
a988325c
NC
9946 This function is copied from the ELF version above adjusted for PE targets. */
9947
9948static char *
9949lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
9950 int *adjust ATTRIBUTE_UNUSED,
d258b828 9951 i386_operand_type *types)
a988325c
NC
9952{
9953 static const struct
9954 {
9955 const char *str;
9956 int len;
9957 const enum bfd_reloc_code_real rel[2];
9958 const i386_operand_type types64;
9959 }
9960 gotrel[] =
9961 {
9962 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
9963 BFD_RELOC_32_SECREL },
9964 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
9965 };
9966
9967 char *cp;
9968 unsigned j;
9969
9970 for (cp = input_line_pointer; *cp != '@'; cp++)
9971 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
9972 return NULL;
9973
9974 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
9975 {
9976 int len = gotrel[j].len;
9977
9978 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
9979 {
9980 if (gotrel[j].rel[object_64bit] != 0)
9981 {
9982 int first, second;
9983 char *tmpbuf, *past_reloc;
9984
9985 *rel = gotrel[j].rel[object_64bit];
9986 if (adjust)
9987 *adjust = len;
9988
9989 if (types)
9990 {
9991 if (flag_code != CODE_64BIT)
9992 {
9993 types->bitfield.imm32 = 1;
9994 types->bitfield.disp32 = 1;
9995 }
9996 else
9997 *types = gotrel[j].types64;
9998 }
9999
10000 /* The length of the first part of our input line. */
10001 first = cp - input_line_pointer;
10002
10003 /* The second part goes from after the reloc token until
10004 (and including) an end_of_line char or comma. */
10005 past_reloc = cp + 1 + len;
10006 cp = past_reloc;
10007 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10008 ++cp;
10009 second = cp + 1 - past_reloc;
10010
10011 /* Allocate and copy string. The trailing NUL shouldn't
10012 be necessary, but be safe. */
add39d23 10013 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
10014 memcpy (tmpbuf, input_line_pointer, first);
10015 if (second != 0 && *past_reloc != ' ')
10016 /* Replace the relocation token with ' ', so that
10017 errors like foo@SECLREL321 will be detected. */
10018 tmpbuf[first++] = ' ';
10019 memcpy (tmpbuf + first, past_reloc, second);
10020 tmpbuf[first + second] = '\0';
10021 return tmpbuf;
10022 }
10023
10024 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10025 gotrel[j].str, 1 << (5 + object_64bit));
10026 return NULL;
10027 }
10028 }
10029
10030 /* Might be a symbol version string. Don't as_bad here. */
10031 return NULL;
10032}
10033
10034#endif /* TE_PE */
10035
62ebcb5c 10036bfd_reloc_code_real_type
e3bb37b5 10037x86_cons (expressionS *exp, int size)
f3c180ae 10038{
62ebcb5c
AM
10039 bfd_reloc_code_real_type got_reloc = NO_RELOC;
10040
ee86248c
JB
10041 intel_syntax = -intel_syntax;
10042
3c7b9c2c 10043 exp->X_md = 0;
4fa24527 10044 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
10045 {
10046 /* Handle @GOTOFF and the like in an expression. */
10047 char *save;
10048 char *gotfree_input_line;
4a57f2cf 10049 int adjust = 0;
f3c180ae
AM
10050
10051 save = input_line_pointer;
d258b828 10052 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
10053 if (gotfree_input_line)
10054 input_line_pointer = gotfree_input_line;
10055
10056 expression (exp);
10057
10058 if (gotfree_input_line)
10059 {
10060 /* expression () has merrily parsed up to the end of line,
10061 or a comma - in the wrong buffer. Transfer how far
10062 input_line_pointer has moved to the right buffer. */
10063 input_line_pointer = (save
10064 + (input_line_pointer - gotfree_input_line)
10065 + adjust);
10066 free (gotfree_input_line);
3992d3b7
AM
10067 if (exp->X_op == O_constant
10068 || exp->X_op == O_absent
10069 || exp->X_op == O_illegal
0398aac5 10070 || exp->X_op == O_register
3992d3b7
AM
10071 || exp->X_op == O_big)
10072 {
10073 char c = *input_line_pointer;
10074 *input_line_pointer = 0;
10075 as_bad (_("missing or invalid expression `%s'"), save);
10076 *input_line_pointer = c;
10077 }
b9519cfe
L
10078 else if ((got_reloc == BFD_RELOC_386_PLT32
10079 || got_reloc == BFD_RELOC_X86_64_PLT32)
10080 && exp->X_op != O_symbol)
10081 {
10082 char c = *input_line_pointer;
10083 *input_line_pointer = 0;
10084 as_bad (_("invalid PLT expression `%s'"), save);
10085 *input_line_pointer = c;
10086 }
f3c180ae
AM
10087 }
10088 }
10089 else
10090 expression (exp);
ee86248c
JB
10091
10092 intel_syntax = -intel_syntax;
10093
10094 if (intel_syntax)
10095 i386_intel_simplify (exp);
62ebcb5c
AM
10096
10097 return got_reloc;
f3c180ae 10098}
f3c180ae 10099
9f32dd5b
L
10100static void
10101signed_cons (int size)
6482c264 10102{
d182319b
JB
10103 if (flag_code == CODE_64BIT)
10104 cons_sign = 1;
10105 cons (size);
10106 cons_sign = -1;
6482c264
NC
10107}
10108
d182319b 10109#ifdef TE_PE
6482c264 10110static void
7016a5d5 10111pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
10112{
10113 expressionS exp;
10114
10115 do
10116 {
10117 expression (&exp);
10118 if (exp.X_op == O_symbol)
10119 exp.X_op = O_secrel;
10120
10121 emit_expr (&exp, 4);
10122 }
10123 while (*input_line_pointer++ == ',');
10124
10125 input_line_pointer--;
10126 demand_empty_rest_of_line ();
10127}
6482c264
NC
10128#endif
10129
43234a1e
L
10130/* Handle Vector operations. */
10131
10132static char *
10133check_VecOperations (char *op_string, char *op_end)
10134{
10135 const reg_entry *mask;
10136 const char *saved;
10137 char *end_op;
10138
10139 while (*op_string
10140 && (op_end == NULL || op_string < op_end))
10141 {
10142 saved = op_string;
10143 if (*op_string == '{')
10144 {
10145 op_string++;
10146
10147 /* Check broadcasts. */
10148 if (strncmp (op_string, "1to", 3) == 0)
10149 {
10150 int bcst_type;
10151
10152 if (i.broadcast)
10153 goto duplicated_vec_op;
10154
10155 op_string += 3;
10156 if (*op_string == '8')
8e6e0792 10157 bcst_type = 8;
b28d1bda 10158 else if (*op_string == '4')
8e6e0792 10159 bcst_type = 4;
b28d1bda 10160 else if (*op_string == '2')
8e6e0792 10161 bcst_type = 2;
43234a1e
L
10162 else if (*op_string == '1'
10163 && *(op_string+1) == '6')
10164 {
8e6e0792 10165 bcst_type = 16;
43234a1e
L
10166 op_string++;
10167 }
10168 else
10169 {
10170 as_bad (_("Unsupported broadcast: `%s'"), saved);
10171 return NULL;
10172 }
10173 op_string++;
10174
10175 broadcast_op.type = bcst_type;
10176 broadcast_op.operand = this_operand;
1f75763a 10177 broadcast_op.bytes = 0;
43234a1e
L
10178 i.broadcast = &broadcast_op;
10179 }
10180 /* Check masking operation. */
10181 else if ((mask = parse_register (op_string, &end_op)) != NULL)
10182 {
8a6fb3f9
JB
10183 if (mask == &bad_reg)
10184 return NULL;
10185
43234a1e 10186 /* k0 can't be used for write mask. */
f74a6307 10187 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 10188 {
6d2cd6b2
JB
10189 as_bad (_("`%s%s' can't be used for write mask"),
10190 register_prefix, mask->reg_name);
43234a1e
L
10191 return NULL;
10192 }
10193
10194 if (!i.mask)
10195 {
10196 mask_op.mask = mask;
10197 mask_op.zeroing = 0;
10198 mask_op.operand = this_operand;
10199 i.mask = &mask_op;
10200 }
10201 else
10202 {
10203 if (i.mask->mask)
10204 goto duplicated_vec_op;
10205
10206 i.mask->mask = mask;
10207
10208 /* Only "{z}" is allowed here. No need to check
10209 zeroing mask explicitly. */
10210 if (i.mask->operand != this_operand)
10211 {
10212 as_bad (_("invalid write mask `%s'"), saved);
10213 return NULL;
10214 }
10215 }
10216
10217 op_string = end_op;
10218 }
10219 /* Check zeroing-flag for masking operation. */
10220 else if (*op_string == 'z')
10221 {
10222 if (!i.mask)
10223 {
10224 mask_op.mask = NULL;
10225 mask_op.zeroing = 1;
10226 mask_op.operand = this_operand;
10227 i.mask = &mask_op;
10228 }
10229 else
10230 {
10231 if (i.mask->zeroing)
10232 {
10233 duplicated_vec_op:
10234 as_bad (_("duplicated `%s'"), saved);
10235 return NULL;
10236 }
10237
10238 i.mask->zeroing = 1;
10239
10240 /* Only "{%k}" is allowed here. No need to check mask
10241 register explicitly. */
10242 if (i.mask->operand != this_operand)
10243 {
10244 as_bad (_("invalid zeroing-masking `%s'"),
10245 saved);
10246 return NULL;
10247 }
10248 }
10249
10250 op_string++;
10251 }
10252 else
10253 goto unknown_vec_op;
10254
10255 if (*op_string != '}')
10256 {
10257 as_bad (_("missing `}' in `%s'"), saved);
10258 return NULL;
10259 }
10260 op_string++;
0ba3a731
L
10261
10262 /* Strip whitespace since the addition of pseudo prefixes
10263 changed how the scrubber treats '{'. */
10264 if (is_space_char (*op_string))
10265 ++op_string;
10266
43234a1e
L
10267 continue;
10268 }
10269 unknown_vec_op:
10270 /* We don't know this one. */
10271 as_bad (_("unknown vector operation: `%s'"), saved);
10272 return NULL;
10273 }
10274
6d2cd6b2
JB
10275 if (i.mask && i.mask->zeroing && !i.mask->mask)
10276 {
10277 as_bad (_("zeroing-masking only allowed with write mask"));
10278 return NULL;
10279 }
10280
43234a1e
L
10281 return op_string;
10282}
10283
252b5132 10284static int
70e41ade 10285i386_immediate (char *imm_start)
252b5132
RH
10286{
10287 char *save_input_line_pointer;
f3c180ae 10288 char *gotfree_input_line;
252b5132 10289 segT exp_seg = 0;
47926f60 10290 expressionS *exp;
40fb9820
L
10291 i386_operand_type types;
10292
0dfbf9d7 10293 operand_type_set (&types, ~0);
252b5132
RH
10294
10295 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
10296 {
31b2323c
L
10297 as_bad (_("at most %d immediate operands are allowed"),
10298 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
10299 return 0;
10300 }
10301
10302 exp = &im_expressions[i.imm_operands++];
520dc8e8 10303 i.op[this_operand].imms = exp;
252b5132
RH
10304
10305 if (is_space_char (*imm_start))
10306 ++imm_start;
10307
10308 save_input_line_pointer = input_line_pointer;
10309 input_line_pointer = imm_start;
10310
d258b828 10311 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10312 if (gotfree_input_line)
10313 input_line_pointer = gotfree_input_line;
252b5132
RH
10314
10315 exp_seg = expression (exp);
10316
83183c0c 10317 SKIP_WHITESPACE ();
43234a1e
L
10318
10319 /* Handle vector operations. */
10320 if (*input_line_pointer == '{')
10321 {
10322 input_line_pointer = check_VecOperations (input_line_pointer,
10323 NULL);
10324 if (input_line_pointer == NULL)
10325 return 0;
10326 }
10327
252b5132 10328 if (*input_line_pointer)
f3c180ae 10329 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
10330
10331 input_line_pointer = save_input_line_pointer;
f3c180ae 10332 if (gotfree_input_line)
ee86248c
JB
10333 {
10334 free (gotfree_input_line);
10335
10336 if (exp->X_op == O_constant || exp->X_op == O_register)
10337 exp->X_op = O_illegal;
10338 }
10339
10340 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
10341}
252b5132 10342
ee86248c
JB
10343static int
10344i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10345 i386_operand_type types, const char *imm_start)
10346{
10347 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 10348 {
313c53d1
L
10349 if (imm_start)
10350 as_bad (_("missing or invalid immediate expression `%s'"),
10351 imm_start);
3992d3b7 10352 return 0;
252b5132 10353 }
3e73aa7c 10354 else if (exp->X_op == O_constant)
252b5132 10355 {
47926f60 10356 /* Size it properly later. */
40fb9820 10357 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
10358 /* If not 64bit, sign extend val. */
10359 if (flag_code != CODE_64BIT
4eed87de
AM
10360 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
10361 exp->X_add_number
10362 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 10363 }
4c63da97 10364#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 10365 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 10366 && exp_seg != absolute_section
47926f60 10367 && exp_seg != text_section
24eab124
AM
10368 && exp_seg != data_section
10369 && exp_seg != bss_section
10370 && exp_seg != undefined_section
f86103b7 10371 && !bfd_is_com_section (exp_seg))
252b5132 10372 {
d0b47220 10373 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
10374 return 0;
10375 }
10376#endif
a841bdf5 10377 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 10378 {
313c53d1
L
10379 if (imm_start)
10380 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
10381 return 0;
10382 }
252b5132
RH
10383 else
10384 {
10385 /* This is an address. The size of the address will be
24eab124 10386 determined later, depending on destination register,
3e73aa7c 10387 suffix, or the default for the section. */
40fb9820
L
10388 i.types[this_operand].bitfield.imm8 = 1;
10389 i.types[this_operand].bitfield.imm16 = 1;
10390 i.types[this_operand].bitfield.imm32 = 1;
10391 i.types[this_operand].bitfield.imm32s = 1;
10392 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
10393 i.types[this_operand] = operand_type_and (i.types[this_operand],
10394 types);
252b5132
RH
10395 }
10396
10397 return 1;
10398}
10399
551c1ca1 10400static char *
e3bb37b5 10401i386_scale (char *scale)
252b5132 10402{
551c1ca1
AM
10403 offsetT val;
10404 char *save = input_line_pointer;
252b5132 10405
551c1ca1
AM
10406 input_line_pointer = scale;
10407 val = get_absolute_expression ();
10408
10409 switch (val)
252b5132 10410 {
551c1ca1 10411 case 1:
252b5132
RH
10412 i.log2_scale_factor = 0;
10413 break;
551c1ca1 10414 case 2:
252b5132
RH
10415 i.log2_scale_factor = 1;
10416 break;
551c1ca1 10417 case 4:
252b5132
RH
10418 i.log2_scale_factor = 2;
10419 break;
551c1ca1 10420 case 8:
252b5132
RH
10421 i.log2_scale_factor = 3;
10422 break;
10423 default:
a724f0f4
JB
10424 {
10425 char sep = *input_line_pointer;
10426
10427 *input_line_pointer = '\0';
10428 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
10429 scale);
10430 *input_line_pointer = sep;
10431 input_line_pointer = save;
10432 return NULL;
10433 }
252b5132 10434 }
29b0f896 10435 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
10436 {
10437 as_warn (_("scale factor of %d without an index register"),
24eab124 10438 1 << i.log2_scale_factor);
252b5132 10439 i.log2_scale_factor = 0;
252b5132 10440 }
551c1ca1
AM
10441 scale = input_line_pointer;
10442 input_line_pointer = save;
10443 return scale;
252b5132
RH
10444}
10445
252b5132 10446static int
e3bb37b5 10447i386_displacement (char *disp_start, char *disp_end)
252b5132 10448{
29b0f896 10449 expressionS *exp;
252b5132
RH
10450 segT exp_seg = 0;
10451 char *save_input_line_pointer;
f3c180ae 10452 char *gotfree_input_line;
40fb9820
L
10453 int override;
10454 i386_operand_type bigdisp, types = anydisp;
3992d3b7 10455 int ret;
252b5132 10456
31b2323c
L
10457 if (i.disp_operands == MAX_MEMORY_OPERANDS)
10458 {
10459 as_bad (_("at most %d displacement operands are allowed"),
10460 MAX_MEMORY_OPERANDS);
10461 return 0;
10462 }
10463
0dfbf9d7 10464 operand_type_set (&bigdisp, 0);
6f2f06be 10465 if (i.jumpabsolute
48bcea9f 10466 || i.types[this_operand].bitfield.baseindex
0cfa3eb3
JB
10467 || (current_templates->start->opcode_modifier.jump != JUMP
10468 && current_templates->start->opcode_modifier.jump != JUMP_DWORD))
e05278af 10469 {
48bcea9f 10470 i386_addressing_mode ();
e05278af 10471 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
10472 if (flag_code == CODE_64BIT)
10473 {
10474 if (!override)
10475 {
10476 bigdisp.bitfield.disp32s = 1;
10477 bigdisp.bitfield.disp64 = 1;
10478 }
48bcea9f
JB
10479 else
10480 bigdisp.bitfield.disp32 = 1;
40fb9820
L
10481 }
10482 else if ((flag_code == CODE_16BIT) ^ override)
40fb9820 10483 bigdisp.bitfield.disp16 = 1;
48bcea9f
JB
10484 else
10485 bigdisp.bitfield.disp32 = 1;
e05278af
JB
10486 }
10487 else
10488 {
376cd056
JB
10489 /* For PC-relative branches, the width of the displacement may be
10490 dependent upon data size, but is never dependent upon address size.
10491 Also make sure to not unintentionally match against a non-PC-relative
10492 branch template. */
10493 static templates aux_templates;
10494 const insn_template *t = current_templates->start;
10495 bfd_boolean has_intel64 = FALSE;
10496
10497 aux_templates.start = t;
10498 while (++t < current_templates->end)
10499 {
10500 if (t->opcode_modifier.jump
10501 != current_templates->start->opcode_modifier.jump)
10502 break;
4b5aaf5f 10503 if ((t->opcode_modifier.isa64 >= INTEL64))
376cd056
JB
10504 has_intel64 = TRUE;
10505 }
10506 if (t < current_templates->end)
10507 {
10508 aux_templates.end = t;
10509 current_templates = &aux_templates;
10510 }
10511
e05278af 10512 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
10513 if (flag_code == CODE_64BIT)
10514 {
376cd056
JB
10515 if ((override || i.suffix == WORD_MNEM_SUFFIX)
10516 && (!intel64 || !has_intel64))
40fb9820
L
10517 bigdisp.bitfield.disp16 = 1;
10518 else
48bcea9f 10519 bigdisp.bitfield.disp32s = 1;
40fb9820
L
10520 }
10521 else
e05278af
JB
10522 {
10523 if (!override)
10524 override = (i.suffix == (flag_code != CODE_16BIT
10525 ? WORD_MNEM_SUFFIX
10526 : LONG_MNEM_SUFFIX));
40fb9820
L
10527 bigdisp.bitfield.disp32 = 1;
10528 if ((flag_code == CODE_16BIT) ^ override)
10529 {
10530 bigdisp.bitfield.disp32 = 0;
10531 bigdisp.bitfield.disp16 = 1;
10532 }
e05278af 10533 }
e05278af 10534 }
c6fb90c8
L
10535 i.types[this_operand] = operand_type_or (i.types[this_operand],
10536 bigdisp);
252b5132
RH
10537
10538 exp = &disp_expressions[i.disp_operands];
520dc8e8 10539 i.op[this_operand].disps = exp;
252b5132
RH
10540 i.disp_operands++;
10541 save_input_line_pointer = input_line_pointer;
10542 input_line_pointer = disp_start;
10543 END_STRING_AND_SAVE (disp_end);
10544
10545#ifndef GCC_ASM_O_HACK
10546#define GCC_ASM_O_HACK 0
10547#endif
10548#if GCC_ASM_O_HACK
10549 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 10550 if (i.types[this_operand].bitfield.baseIndex
24eab124 10551 && displacement_string_end[-1] == '+')
252b5132
RH
10552 {
10553 /* This hack is to avoid a warning when using the "o"
24eab124
AM
10554 constraint within gcc asm statements.
10555 For instance:
10556
10557 #define _set_tssldt_desc(n,addr,limit,type) \
10558 __asm__ __volatile__ ( \
10559 "movw %w2,%0\n\t" \
10560 "movw %w1,2+%0\n\t" \
10561 "rorl $16,%1\n\t" \
10562 "movb %b1,4+%0\n\t" \
10563 "movb %4,5+%0\n\t" \
10564 "movb $0,6+%0\n\t" \
10565 "movb %h1,7+%0\n\t" \
10566 "rorl $16,%1" \
10567 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
10568
10569 This works great except that the output assembler ends
10570 up looking a bit weird if it turns out that there is
10571 no offset. You end up producing code that looks like:
10572
10573 #APP
10574 movw $235,(%eax)
10575 movw %dx,2+(%eax)
10576 rorl $16,%edx
10577 movb %dl,4+(%eax)
10578 movb $137,5+(%eax)
10579 movb $0,6+(%eax)
10580 movb %dh,7+(%eax)
10581 rorl $16,%edx
10582 #NO_APP
10583
47926f60 10584 So here we provide the missing zero. */
24eab124
AM
10585
10586 *displacement_string_end = '0';
252b5132
RH
10587 }
10588#endif
d258b828 10589 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10590 if (gotfree_input_line)
10591 input_line_pointer = gotfree_input_line;
252b5132 10592
24eab124 10593 exp_seg = expression (exp);
252b5132 10594
636c26b0
AM
10595 SKIP_WHITESPACE ();
10596 if (*input_line_pointer)
10597 as_bad (_("junk `%s' after expression"), input_line_pointer);
10598#if GCC_ASM_O_HACK
10599 RESTORE_END_STRING (disp_end + 1);
10600#endif
636c26b0 10601 input_line_pointer = save_input_line_pointer;
636c26b0 10602 if (gotfree_input_line)
ee86248c
JB
10603 {
10604 free (gotfree_input_line);
10605
10606 if (exp->X_op == O_constant || exp->X_op == O_register)
10607 exp->X_op = O_illegal;
10608 }
10609
10610 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
10611
10612 RESTORE_END_STRING (disp_end);
10613
10614 return ret;
10615}
10616
10617static int
10618i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10619 i386_operand_type types, const char *disp_start)
10620{
10621 i386_operand_type bigdisp;
10622 int ret = 1;
636c26b0 10623
24eab124
AM
10624 /* We do this to make sure that the section symbol is in
10625 the symbol table. We will ultimately change the relocation
47926f60 10626 to be relative to the beginning of the section. */
1ae12ab7 10627 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
10628 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
10629 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 10630 {
636c26b0 10631 if (exp->X_op != O_symbol)
3992d3b7 10632 goto inv_disp;
636c26b0 10633
e5cb08ac 10634 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
10635 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
10636 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 10637 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
10638 exp->X_op = O_subtract;
10639 exp->X_op_symbol = GOT_symbol;
1ae12ab7 10640 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 10641 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
10642 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
10643 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 10644 else
29b0f896 10645 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 10646 }
252b5132 10647
3992d3b7
AM
10648 else if (exp->X_op == O_absent
10649 || exp->X_op == O_illegal
ee86248c 10650 || exp->X_op == O_big)
2daf4fd8 10651 {
3992d3b7
AM
10652 inv_disp:
10653 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 10654 disp_start);
3992d3b7 10655 ret = 0;
2daf4fd8
AM
10656 }
10657
0e1147d9
L
10658 else if (flag_code == CODE_64BIT
10659 && !i.prefix[ADDR_PREFIX]
10660 && exp->X_op == O_constant)
10661 {
10662 /* Since displacement is signed extended to 64bit, don't allow
10663 disp32 and turn off disp32s if they are out of range. */
10664 i.types[this_operand].bitfield.disp32 = 0;
10665 if (!fits_in_signed_long (exp->X_add_number))
10666 {
10667 i.types[this_operand].bitfield.disp32s = 0;
10668 if (i.types[this_operand].bitfield.baseindex)
10669 {
10670 as_bad (_("0x%lx out range of signed 32bit displacement"),
10671 (long) exp->X_add_number);
10672 ret = 0;
10673 }
10674 }
10675 }
10676
4c63da97 10677#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
10678 else if (exp->X_op != O_constant
10679 && OUTPUT_FLAVOR == bfd_target_aout_flavour
10680 && exp_seg != absolute_section
10681 && exp_seg != text_section
10682 && exp_seg != data_section
10683 && exp_seg != bss_section
10684 && exp_seg != undefined_section
10685 && !bfd_is_com_section (exp_seg))
24eab124 10686 {
d0b47220 10687 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 10688 ret = 0;
24eab124 10689 }
252b5132 10690#endif
3956db08 10691
48bcea9f
JB
10692 if (current_templates->start->opcode_modifier.jump == JUMP_BYTE
10693 /* Constants get taken care of by optimize_disp(). */
10694 && exp->X_op != O_constant)
10695 i.types[this_operand].bitfield.disp8 = 1;
10696
40fb9820
L
10697 /* Check if this is a displacement only operand. */
10698 bigdisp = i.types[this_operand];
10699 bigdisp.bitfield.disp8 = 0;
10700 bigdisp.bitfield.disp16 = 0;
10701 bigdisp.bitfield.disp32 = 0;
10702 bigdisp.bitfield.disp32s = 0;
10703 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 10704 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
10705 i.types[this_operand] = operand_type_and (i.types[this_operand],
10706 types);
3956db08 10707
3992d3b7 10708 return ret;
252b5132
RH
10709}
10710
2abc2bec
JB
10711/* Return the active addressing mode, taking address override and
10712 registers forming the address into consideration. Update the
10713 address override prefix if necessary. */
47926f60 10714
2abc2bec
JB
10715static enum flag_code
10716i386_addressing_mode (void)
252b5132 10717{
be05d201
L
10718 enum flag_code addr_mode;
10719
10720 if (i.prefix[ADDR_PREFIX])
10721 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
a23b33b3
JB
10722 else if (flag_code == CODE_16BIT
10723 && current_templates->start->cpu_flags.bitfield.cpumpx
10724 /* Avoid replacing the "16-bit addressing not allowed" diagnostic
10725 from md_assemble() by "is not a valid base/index expression"
10726 when there is a base and/or index. */
10727 && !i.types[this_operand].bitfield.baseindex)
10728 {
10729 /* MPX insn memory operands with neither base nor index must be forced
10730 to use 32-bit addressing in 16-bit mode. */
10731 addr_mode = CODE_32BIT;
10732 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10733 ++i.prefixes;
10734 gas_assert (!i.types[this_operand].bitfield.disp16);
10735 gas_assert (!i.types[this_operand].bitfield.disp32);
10736 }
be05d201
L
10737 else
10738 {
10739 addr_mode = flag_code;
10740
24eab124 10741#if INFER_ADDR_PREFIX
be05d201
L
10742 if (i.mem_operands == 0)
10743 {
10744 /* Infer address prefix from the first memory operand. */
10745 const reg_entry *addr_reg = i.base_reg;
10746
10747 if (addr_reg == NULL)
10748 addr_reg = i.index_reg;
eecb386c 10749
be05d201
L
10750 if (addr_reg)
10751 {
e968fc9b 10752 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
10753 addr_mode = CODE_32BIT;
10754 else if (flag_code != CODE_64BIT
dc821c5f 10755 && addr_reg->reg_type.bitfield.word)
be05d201
L
10756 addr_mode = CODE_16BIT;
10757
10758 if (addr_mode != flag_code)
10759 {
10760 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10761 i.prefixes += 1;
10762 /* Change the size of any displacement too. At most one
10763 of Disp16 or Disp32 is set.
10764 FIXME. There doesn't seem to be any real need for
10765 separate Disp16 and Disp32 flags. The same goes for
10766 Imm16 and Imm32. Removing them would probably clean
10767 up the code quite a lot. */
10768 if (flag_code != CODE_64BIT
10769 && (i.types[this_operand].bitfield.disp16
10770 || i.types[this_operand].bitfield.disp32))
10771 i.types[this_operand]
10772 = operand_type_xor (i.types[this_operand], disp16_32);
10773 }
10774 }
10775 }
24eab124 10776#endif
be05d201
L
10777 }
10778
2abc2bec
JB
10779 return addr_mode;
10780}
10781
10782/* Make sure the memory operand we've been dealt is valid.
10783 Return 1 on success, 0 on a failure. */
10784
10785static int
10786i386_index_check (const char *operand_string)
10787{
10788 const char *kind = "base/index";
10789 enum flag_code addr_mode = i386_addressing_mode ();
10790
fc0763e6 10791 if (current_templates->start->opcode_modifier.isstring
c3949f43 10792 && !current_templates->start->cpu_flags.bitfield.cpupadlock
fc0763e6
JB
10793 && (current_templates->end[-1].opcode_modifier.isstring
10794 || i.mem_operands))
10795 {
10796 /* Memory operands of string insns are special in that they only allow
10797 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
10798 const reg_entry *expected_reg;
10799 static const char *di_si[][2] =
10800 {
10801 { "esi", "edi" },
10802 { "si", "di" },
10803 { "rsi", "rdi" }
10804 };
10805 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
10806
10807 kind = "string address";
10808
8325cc63 10809 if (current_templates->start->opcode_modifier.repprefixok)
fc0763e6 10810 {
51c8edf6
JB
10811 int es_op = current_templates->end[-1].opcode_modifier.isstring
10812 - IS_STRING_ES_OP0;
10813 int op = 0;
fc0763e6 10814
51c8edf6 10815 if (!current_templates->end[-1].operand_types[0].bitfield.baseindex
fc0763e6
JB
10816 || ((!i.mem_operands != !intel_syntax)
10817 && current_templates->end[-1].operand_types[1]
10818 .bitfield.baseindex))
51c8edf6
JB
10819 op = 1;
10820 expected_reg = hash_find (reg_hash, di_si[addr_mode][op == es_op]);
fc0763e6
JB
10821 }
10822 else
be05d201 10823 expected_reg = hash_find (reg_hash, bx[addr_mode]);
fc0763e6 10824
be05d201
L
10825 if (i.base_reg != expected_reg
10826 || i.index_reg
fc0763e6 10827 || operand_type_check (i.types[this_operand], disp))
fc0763e6 10828 {
be05d201
L
10829 /* The second memory operand must have the same size as
10830 the first one. */
10831 if (i.mem_operands
10832 && i.base_reg
10833 && !((addr_mode == CODE_64BIT
dc821c5f 10834 && i.base_reg->reg_type.bitfield.qword)
be05d201 10835 || (addr_mode == CODE_32BIT
dc821c5f
JB
10836 ? i.base_reg->reg_type.bitfield.dword
10837 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
10838 goto bad_address;
10839
fc0763e6
JB
10840 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
10841 operand_string,
10842 intel_syntax ? '[' : '(',
10843 register_prefix,
be05d201 10844 expected_reg->reg_name,
fc0763e6 10845 intel_syntax ? ']' : ')');
be05d201 10846 return 1;
fc0763e6 10847 }
be05d201
L
10848 else
10849 return 1;
10850
dc1e8a47 10851 bad_address:
be05d201
L
10852 as_bad (_("`%s' is not a valid %s expression"),
10853 operand_string, kind);
10854 return 0;
3e73aa7c
JH
10855 }
10856 else
10857 {
be05d201
L
10858 if (addr_mode != CODE_16BIT)
10859 {
10860 /* 32-bit/64-bit checks. */
10861 if ((i.base_reg
e968fc9b
JB
10862 && ((addr_mode == CODE_64BIT
10863 ? !i.base_reg->reg_type.bitfield.qword
10864 : !i.base_reg->reg_type.bitfield.dword)
10865 || (i.index_reg && i.base_reg->reg_num == RegIP)
10866 || i.base_reg->reg_num == RegIZ))
be05d201 10867 || (i.index_reg
1b54b8d7
JB
10868 && !i.index_reg->reg_type.bitfield.xmmword
10869 && !i.index_reg->reg_type.bitfield.ymmword
10870 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 10871 && ((addr_mode == CODE_64BIT
e968fc9b
JB
10872 ? !i.index_reg->reg_type.bitfield.qword
10873 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
10874 || !i.index_reg->reg_type.bitfield.baseindex)))
10875 goto bad_address;
8178be5b
JB
10876
10877 /* bndmk, bndldx, and bndstx have special restrictions. */
10878 if (current_templates->start->base_opcode == 0xf30f1b
10879 || (current_templates->start->base_opcode & ~1) == 0x0f1a)
10880 {
10881 /* They cannot use RIP-relative addressing. */
e968fc9b 10882 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
10883 {
10884 as_bad (_("`%s' cannot be used here"), operand_string);
10885 return 0;
10886 }
10887
10888 /* bndldx and bndstx ignore their scale factor. */
10889 if (current_templates->start->base_opcode != 0xf30f1b
10890 && i.log2_scale_factor)
10891 as_warn (_("register scaling is being ignored here"));
10892 }
be05d201
L
10893 }
10894 else
3e73aa7c 10895 {
be05d201 10896 /* 16-bit checks. */
3e73aa7c 10897 if ((i.base_reg
dc821c5f 10898 && (!i.base_reg->reg_type.bitfield.word
40fb9820 10899 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 10900 || (i.index_reg
dc821c5f 10901 && (!i.index_reg->reg_type.bitfield.word
40fb9820 10902 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
10903 || !(i.base_reg
10904 && i.base_reg->reg_num < 6
10905 && i.index_reg->reg_num >= 6
10906 && i.log2_scale_factor == 0))))
be05d201 10907 goto bad_address;
3e73aa7c
JH
10908 }
10909 }
be05d201 10910 return 1;
24eab124 10911}
252b5132 10912
43234a1e
L
10913/* Handle vector immediates. */
10914
10915static int
10916RC_SAE_immediate (const char *imm_start)
10917{
10918 unsigned int match_found, j;
10919 const char *pstr = imm_start;
10920 expressionS *exp;
10921
10922 if (*pstr != '{')
10923 return 0;
10924
10925 pstr++;
10926 match_found = 0;
10927 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
10928 {
10929 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
10930 {
10931 if (!i.rounding)
10932 {
10933 rc_op.type = RC_NamesTable[j].type;
10934 rc_op.operand = this_operand;
10935 i.rounding = &rc_op;
10936 }
10937 else
10938 {
10939 as_bad (_("duplicated `%s'"), imm_start);
10940 return 0;
10941 }
10942 pstr += RC_NamesTable[j].len;
10943 match_found = 1;
10944 break;
10945 }
10946 }
10947 if (!match_found)
10948 return 0;
10949
10950 if (*pstr++ != '}')
10951 {
10952 as_bad (_("Missing '}': '%s'"), imm_start);
10953 return 0;
10954 }
10955 /* RC/SAE immediate string should contain nothing more. */;
10956 if (*pstr != 0)
10957 {
10958 as_bad (_("Junk after '}': '%s'"), imm_start);
10959 return 0;
10960 }
10961
10962 exp = &im_expressions[i.imm_operands++];
10963 i.op[this_operand].imms = exp;
10964
10965 exp->X_op = O_constant;
10966 exp->X_add_number = 0;
10967 exp->X_add_symbol = (symbolS *) 0;
10968 exp->X_op_symbol = (symbolS *) 0;
10969
10970 i.types[this_operand].bitfield.imm8 = 1;
10971 return 1;
10972}
10973
8325cc63
JB
10974/* Only string instructions can have a second memory operand, so
10975 reduce current_templates to just those if it contains any. */
10976static int
10977maybe_adjust_templates (void)
10978{
10979 const insn_template *t;
10980
10981 gas_assert (i.mem_operands == 1);
10982
10983 for (t = current_templates->start; t < current_templates->end; ++t)
10984 if (t->opcode_modifier.isstring)
10985 break;
10986
10987 if (t < current_templates->end)
10988 {
10989 static templates aux_templates;
10990 bfd_boolean recheck;
10991
10992 aux_templates.start = t;
10993 for (; t < current_templates->end; ++t)
10994 if (!t->opcode_modifier.isstring)
10995 break;
10996 aux_templates.end = t;
10997
10998 /* Determine whether to re-check the first memory operand. */
10999 recheck = (aux_templates.start != current_templates->start
11000 || t != current_templates->end);
11001
11002 current_templates = &aux_templates;
11003
11004 if (recheck)
11005 {
11006 i.mem_operands = 0;
11007 if (i.memop1_string != NULL
11008 && i386_index_check (i.memop1_string) == 0)
11009 return 0;
11010 i.mem_operands = 1;
11011 }
11012 }
11013
11014 return 1;
11015}
11016
fc0763e6 11017/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 11018 on error. */
252b5132 11019
252b5132 11020static int
a7619375 11021i386_att_operand (char *operand_string)
252b5132 11022{
af6bdddf
AM
11023 const reg_entry *r;
11024 char *end_op;
24eab124 11025 char *op_string = operand_string;
252b5132 11026
24eab124 11027 if (is_space_char (*op_string))
252b5132
RH
11028 ++op_string;
11029
24eab124 11030 /* We check for an absolute prefix (differentiating,
47926f60 11031 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
11032 if (*op_string == ABSOLUTE_PREFIX)
11033 {
11034 ++op_string;
11035 if (is_space_char (*op_string))
11036 ++op_string;
6f2f06be 11037 i.jumpabsolute = TRUE;
24eab124 11038 }
252b5132 11039
47926f60 11040 /* Check if operand is a register. */
4d1bb795 11041 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 11042 {
40fb9820
L
11043 i386_operand_type temp;
11044
8a6fb3f9
JB
11045 if (r == &bad_reg)
11046 return 0;
11047
24eab124
AM
11048 /* Check for a segment override by searching for ':' after a
11049 segment register. */
11050 op_string = end_op;
11051 if (is_space_char (*op_string))
11052 ++op_string;
00cee14f 11053 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124
AM
11054 {
11055 switch (r->reg_num)
11056 {
11057 case 0:
11058 i.seg[i.mem_operands] = &es;
11059 break;
11060 case 1:
11061 i.seg[i.mem_operands] = &cs;
11062 break;
11063 case 2:
11064 i.seg[i.mem_operands] = &ss;
11065 break;
11066 case 3:
11067 i.seg[i.mem_operands] = &ds;
11068 break;
11069 case 4:
11070 i.seg[i.mem_operands] = &fs;
11071 break;
11072 case 5:
11073 i.seg[i.mem_operands] = &gs;
11074 break;
11075 }
252b5132 11076
24eab124 11077 /* Skip the ':' and whitespace. */
252b5132
RH
11078 ++op_string;
11079 if (is_space_char (*op_string))
24eab124 11080 ++op_string;
252b5132 11081
24eab124
AM
11082 if (!is_digit_char (*op_string)
11083 && !is_identifier_char (*op_string)
11084 && *op_string != '('
11085 && *op_string != ABSOLUTE_PREFIX)
11086 {
11087 as_bad (_("bad memory operand `%s'"), op_string);
11088 return 0;
11089 }
47926f60 11090 /* Handle case of %es:*foo. */
24eab124
AM
11091 if (*op_string == ABSOLUTE_PREFIX)
11092 {
11093 ++op_string;
11094 if (is_space_char (*op_string))
11095 ++op_string;
6f2f06be 11096 i.jumpabsolute = TRUE;
24eab124
AM
11097 }
11098 goto do_memory_reference;
11099 }
43234a1e
L
11100
11101 /* Handle vector operations. */
11102 if (*op_string == '{')
11103 {
11104 op_string = check_VecOperations (op_string, NULL);
11105 if (op_string == NULL)
11106 return 0;
11107 }
11108
24eab124
AM
11109 if (*op_string)
11110 {
d0b47220 11111 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
11112 return 0;
11113 }
40fb9820
L
11114 temp = r->reg_type;
11115 temp.bitfield.baseindex = 0;
c6fb90c8
L
11116 i.types[this_operand] = operand_type_or (i.types[this_operand],
11117 temp);
7d5e4556 11118 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 11119 i.op[this_operand].regs = r;
24eab124
AM
11120 i.reg_operands++;
11121 }
af6bdddf
AM
11122 else if (*op_string == REGISTER_PREFIX)
11123 {
11124 as_bad (_("bad register name `%s'"), op_string);
11125 return 0;
11126 }
24eab124 11127 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 11128 {
24eab124 11129 ++op_string;
6f2f06be 11130 if (i.jumpabsolute)
24eab124 11131 {
d0b47220 11132 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
11133 return 0;
11134 }
11135 if (!i386_immediate (op_string))
11136 return 0;
11137 }
43234a1e
L
11138 else if (RC_SAE_immediate (operand_string))
11139 {
11140 /* If it is a RC or SAE immediate, do nothing. */
11141 ;
11142 }
24eab124
AM
11143 else if (is_digit_char (*op_string)
11144 || is_identifier_char (*op_string)
d02603dc 11145 || *op_string == '"'
e5cb08ac 11146 || *op_string == '(')
24eab124 11147 {
47926f60 11148 /* This is a memory reference of some sort. */
af6bdddf 11149 char *base_string;
252b5132 11150
47926f60 11151 /* Start and end of displacement string expression (if found). */
eecb386c
AM
11152 char *displacement_string_start;
11153 char *displacement_string_end;
43234a1e 11154 char *vop_start;
252b5132 11155
24eab124 11156 do_memory_reference:
8325cc63
JB
11157 if (i.mem_operands == 1 && !maybe_adjust_templates ())
11158 return 0;
24eab124 11159 if ((i.mem_operands == 1
40fb9820 11160 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
11161 || i.mem_operands == 2)
11162 {
11163 as_bad (_("too many memory references for `%s'"),
11164 current_templates->start->name);
11165 return 0;
11166 }
252b5132 11167
24eab124
AM
11168 /* Check for base index form. We detect the base index form by
11169 looking for an ')' at the end of the operand, searching
11170 for the '(' matching it, and finding a REGISTER_PREFIX or ','
11171 after the '('. */
af6bdddf 11172 base_string = op_string + strlen (op_string);
c3332e24 11173
43234a1e
L
11174 /* Handle vector operations. */
11175 vop_start = strchr (op_string, '{');
11176 if (vop_start && vop_start < base_string)
11177 {
11178 if (check_VecOperations (vop_start, base_string) == NULL)
11179 return 0;
11180 base_string = vop_start;
11181 }
11182
af6bdddf
AM
11183 --base_string;
11184 if (is_space_char (*base_string))
11185 --base_string;
252b5132 11186
47926f60 11187 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
11188 displacement_string_start = op_string;
11189 displacement_string_end = base_string + 1;
252b5132 11190
24eab124
AM
11191 if (*base_string == ')')
11192 {
af6bdddf 11193 char *temp_string;
24eab124
AM
11194 unsigned int parens_balanced = 1;
11195 /* We've already checked that the number of left & right ()'s are
47926f60 11196 equal, so this loop will not be infinite. */
24eab124
AM
11197 do
11198 {
11199 base_string--;
11200 if (*base_string == ')')
11201 parens_balanced++;
11202 if (*base_string == '(')
11203 parens_balanced--;
11204 }
11205 while (parens_balanced);
c3332e24 11206
af6bdddf 11207 temp_string = base_string;
c3332e24 11208
24eab124 11209 /* Skip past '(' and whitespace. */
252b5132
RH
11210 ++base_string;
11211 if (is_space_char (*base_string))
24eab124 11212 ++base_string;
252b5132 11213
af6bdddf 11214 if (*base_string == ','
4eed87de
AM
11215 || ((i.base_reg = parse_register (base_string, &end_op))
11216 != NULL))
252b5132 11217 {
af6bdddf 11218 displacement_string_end = temp_string;
252b5132 11219
40fb9820 11220 i.types[this_operand].bitfield.baseindex = 1;
252b5132 11221
af6bdddf 11222 if (i.base_reg)
24eab124 11223 {
8a6fb3f9
JB
11224 if (i.base_reg == &bad_reg)
11225 return 0;
24eab124
AM
11226 base_string = end_op;
11227 if (is_space_char (*base_string))
11228 ++base_string;
af6bdddf
AM
11229 }
11230
11231 /* There may be an index reg or scale factor here. */
11232 if (*base_string == ',')
11233 {
11234 ++base_string;
11235 if (is_space_char (*base_string))
11236 ++base_string;
11237
4eed87de
AM
11238 if ((i.index_reg = parse_register (base_string, &end_op))
11239 != NULL)
24eab124 11240 {
8a6fb3f9
JB
11241 if (i.index_reg == &bad_reg)
11242 return 0;
af6bdddf 11243 base_string = end_op;
24eab124
AM
11244 if (is_space_char (*base_string))
11245 ++base_string;
af6bdddf
AM
11246 if (*base_string == ',')
11247 {
11248 ++base_string;
11249 if (is_space_char (*base_string))
11250 ++base_string;
11251 }
e5cb08ac 11252 else if (*base_string != ')')
af6bdddf 11253 {
4eed87de
AM
11254 as_bad (_("expecting `,' or `)' "
11255 "after index register in `%s'"),
af6bdddf
AM
11256 operand_string);
11257 return 0;
11258 }
24eab124 11259 }
af6bdddf 11260 else if (*base_string == REGISTER_PREFIX)
24eab124 11261 {
f76bf5e0
L
11262 end_op = strchr (base_string, ',');
11263 if (end_op)
11264 *end_op = '\0';
af6bdddf 11265 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
11266 return 0;
11267 }
252b5132 11268
47926f60 11269 /* Check for scale factor. */
551c1ca1 11270 if (*base_string != ')')
af6bdddf 11271 {
551c1ca1
AM
11272 char *end_scale = i386_scale (base_string);
11273
11274 if (!end_scale)
af6bdddf 11275 return 0;
24eab124 11276
551c1ca1 11277 base_string = end_scale;
af6bdddf
AM
11278 if (is_space_char (*base_string))
11279 ++base_string;
11280 if (*base_string != ')')
11281 {
4eed87de
AM
11282 as_bad (_("expecting `)' "
11283 "after scale factor in `%s'"),
af6bdddf
AM
11284 operand_string);
11285 return 0;
11286 }
11287 }
11288 else if (!i.index_reg)
24eab124 11289 {
4eed87de
AM
11290 as_bad (_("expecting index register or scale factor "
11291 "after `,'; got '%c'"),
af6bdddf 11292 *base_string);
24eab124
AM
11293 return 0;
11294 }
11295 }
af6bdddf 11296 else if (*base_string != ')')
24eab124 11297 {
4eed87de
AM
11298 as_bad (_("expecting `,' or `)' "
11299 "after base register in `%s'"),
af6bdddf 11300 operand_string);
24eab124
AM
11301 return 0;
11302 }
c3332e24 11303 }
af6bdddf 11304 else if (*base_string == REGISTER_PREFIX)
c3332e24 11305 {
f76bf5e0
L
11306 end_op = strchr (base_string, ',');
11307 if (end_op)
11308 *end_op = '\0';
af6bdddf 11309 as_bad (_("bad register name `%s'"), base_string);
24eab124 11310 return 0;
c3332e24 11311 }
24eab124
AM
11312 }
11313
11314 /* If there's an expression beginning the operand, parse it,
11315 assuming displacement_string_start and
11316 displacement_string_end are meaningful. */
11317 if (displacement_string_start != displacement_string_end)
11318 {
11319 if (!i386_displacement (displacement_string_start,
11320 displacement_string_end))
11321 return 0;
11322 }
11323
11324 /* Special case for (%dx) while doing input/output op. */
11325 if (i.base_reg
75e5731b
JB
11326 && i.base_reg->reg_type.bitfield.instance == RegD
11327 && i.base_reg->reg_type.bitfield.word
24eab124
AM
11328 && i.index_reg == 0
11329 && i.log2_scale_factor == 0
11330 && i.seg[i.mem_operands] == 0
40fb9820 11331 && !operand_type_check (i.types[this_operand], disp))
24eab124 11332 {
2fb5be8d 11333 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
11334 return 1;
11335 }
11336
eecb386c
AM
11337 if (i386_index_check (operand_string) == 0)
11338 return 0;
c48dadc9 11339 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
11340 if (i.mem_operands == 0)
11341 i.memop1_string = xstrdup (operand_string);
24eab124
AM
11342 i.mem_operands++;
11343 }
11344 else
ce8a8b2f
AM
11345 {
11346 /* It's not a memory operand; argh! */
24eab124
AM
11347 as_bad (_("invalid char %s beginning operand %d `%s'"),
11348 output_invalid (*op_string),
11349 this_operand + 1,
11350 op_string);
11351 return 0;
11352 }
47926f60 11353 return 1; /* Normal return. */
252b5132
RH
11354}
11355\f
fa94de6b
RM
11356/* Calculate the maximum variable size (i.e., excluding fr_fix)
11357 that an rs_machine_dependent frag may reach. */
11358
11359unsigned int
11360i386_frag_max_var (fragS *frag)
11361{
11362 /* The only relaxable frags are for jumps.
11363 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
11364 gas_assert (frag->fr_type == rs_machine_dependent);
11365 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
11366}
11367
b084df0b
L
11368#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11369static int
8dcea932 11370elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
11371{
11372 /* STT_GNU_IFUNC symbol must go through PLT. */
11373 if ((symbol_get_bfdsym (fr_symbol)->flags
11374 & BSF_GNU_INDIRECT_FUNCTION) != 0)
11375 return 0;
11376
11377 if (!S_IS_EXTERNAL (fr_symbol))
11378 /* Symbol may be weak or local. */
11379 return !S_IS_WEAK (fr_symbol);
11380
8dcea932
L
11381 /* Global symbols with non-default visibility can't be preempted. */
11382 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
11383 return 1;
11384
11385 if (fr_var != NO_RELOC)
11386 switch ((enum bfd_reloc_code_real) fr_var)
11387 {
11388 case BFD_RELOC_386_PLT32:
11389 case BFD_RELOC_X86_64_PLT32:
33eaf5de 11390 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
11391 return 0;
11392 default:
11393 abort ();
11394 }
11395
b084df0b
L
11396 /* Global symbols with default visibility in a shared library may be
11397 preempted by another definition. */
8dcea932 11398 return !shared;
b084df0b
L
11399}
11400#endif
11401
79d72f45
HL
11402/* Table 3-2. Macro-Fusible Instructions in Haswell Microarchitecture
11403 Note also work for Skylake and Cascadelake.
11404---------------------------------------------------------------------
11405| JCC | ADD/SUB/CMP | INC/DEC | TEST/AND |
11406| ------ | ----------- | ------- | -------- |
11407| Jo | N | N | Y |
11408| Jno | N | N | Y |
11409| Jc/Jb | Y | N | Y |
11410| Jae/Jnb | Y | N | Y |
11411| Je/Jz | Y | Y | Y |
11412| Jne/Jnz | Y | Y | Y |
11413| Jna/Jbe | Y | N | Y |
11414| Ja/Jnbe | Y | N | Y |
11415| Js | N | N | Y |
11416| Jns | N | N | Y |
11417| Jp/Jpe | N | N | Y |
11418| Jnp/Jpo | N | N | Y |
11419| Jl/Jnge | Y | Y | Y |
11420| Jge/Jnl | Y | Y | Y |
11421| Jle/Jng | Y | Y | Y |
11422| Jg/Jnle | Y | Y | Y |
11423--------------------------------------------------------------------- */
11424static int
11425i386_macro_fusible_p (enum mf_cmp_kind mf_cmp, enum mf_jcc_kind mf_jcc)
11426{
11427 if (mf_cmp == mf_cmp_alu_cmp)
11428 return ((mf_jcc >= mf_jcc_jc && mf_jcc <= mf_jcc_jna)
11429 || mf_jcc == mf_jcc_jl || mf_jcc == mf_jcc_jle);
11430 if (mf_cmp == mf_cmp_incdec)
11431 return (mf_jcc == mf_jcc_je || mf_jcc == mf_jcc_jl
11432 || mf_jcc == mf_jcc_jle);
11433 if (mf_cmp == mf_cmp_test_and)
11434 return 1;
11435 return 0;
11436}
11437
e379e5f3
L
11438/* Return the next non-empty frag. */
11439
11440static fragS *
11441i386_next_non_empty_frag (fragS *fragP)
11442{
11443 /* There may be a frag with a ".fill 0" when there is no room in
11444 the current frag for frag_grow in output_insn. */
11445 for (fragP = fragP->fr_next;
11446 (fragP != NULL
11447 && fragP->fr_type == rs_fill
11448 && fragP->fr_fix == 0);
11449 fragP = fragP->fr_next)
11450 ;
11451 return fragP;
11452}
11453
11454/* Return the next jcc frag after BRANCH_PADDING. */
11455
11456static fragS *
79d72f45 11457i386_next_fusible_jcc_frag (fragS *maybe_cmp_fragP, fragS *pad_fragP)
e379e5f3 11458{
79d72f45
HL
11459 fragS *branch_fragP;
11460 if (!pad_fragP)
e379e5f3
L
11461 return NULL;
11462
79d72f45
HL
11463 if (pad_fragP->fr_type == rs_machine_dependent
11464 && (TYPE_FROM_RELAX_STATE (pad_fragP->fr_subtype)
e379e5f3
L
11465 == BRANCH_PADDING))
11466 {
79d72f45
HL
11467 branch_fragP = i386_next_non_empty_frag (pad_fragP);
11468 if (branch_fragP->fr_type != rs_machine_dependent)
e379e5f3 11469 return NULL;
79d72f45
HL
11470 if (TYPE_FROM_RELAX_STATE (branch_fragP->fr_subtype) == COND_JUMP
11471 && i386_macro_fusible_p (maybe_cmp_fragP->tc_frag_data.mf_type,
11472 pad_fragP->tc_frag_data.mf_type))
11473 return branch_fragP;
e379e5f3
L
11474 }
11475
11476 return NULL;
11477}
11478
11479/* Classify BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags. */
11480
11481static void
11482i386_classify_machine_dependent_frag (fragS *fragP)
11483{
11484 fragS *cmp_fragP;
11485 fragS *pad_fragP;
11486 fragS *branch_fragP;
11487 fragS *next_fragP;
11488 unsigned int max_prefix_length;
11489
11490 if (fragP->tc_frag_data.classified)
11491 return;
11492
11493 /* First scan for BRANCH_PADDING and FUSED_JCC_PADDING. Convert
11494 FUSED_JCC_PADDING and merge BRANCH_PADDING. */
11495 for (next_fragP = fragP;
11496 next_fragP != NULL;
11497 next_fragP = next_fragP->fr_next)
11498 {
11499 next_fragP->tc_frag_data.classified = 1;
11500 if (next_fragP->fr_type == rs_machine_dependent)
11501 switch (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype))
11502 {
11503 case BRANCH_PADDING:
11504 /* The BRANCH_PADDING frag must be followed by a branch
11505 frag. */
11506 branch_fragP = i386_next_non_empty_frag (next_fragP);
11507 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11508 break;
11509 case FUSED_JCC_PADDING:
11510 /* Check if this is a fused jcc:
11511 FUSED_JCC_PADDING
11512 CMP like instruction
11513 BRANCH_PADDING
11514 COND_JUMP
11515 */
11516 cmp_fragP = i386_next_non_empty_frag (next_fragP);
11517 pad_fragP = i386_next_non_empty_frag (cmp_fragP);
79d72f45 11518 branch_fragP = i386_next_fusible_jcc_frag (next_fragP, pad_fragP);
e379e5f3
L
11519 if (branch_fragP)
11520 {
11521 /* The BRANCH_PADDING frag is merged with the
11522 FUSED_JCC_PADDING frag. */
11523 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11524 /* CMP like instruction size. */
11525 next_fragP->tc_frag_data.cmp_size = cmp_fragP->fr_fix;
11526 frag_wane (pad_fragP);
11527 /* Skip to branch_fragP. */
11528 next_fragP = branch_fragP;
11529 }
11530 else if (next_fragP->tc_frag_data.max_prefix_length)
11531 {
11532 /* Turn FUSED_JCC_PADDING into BRANCH_PREFIX if it isn't
11533 a fused jcc. */
11534 next_fragP->fr_subtype
11535 = ENCODE_RELAX_STATE (BRANCH_PREFIX, 0);
11536 next_fragP->tc_frag_data.max_bytes
11537 = next_fragP->tc_frag_data.max_prefix_length;
11538 /* This will be updated in the BRANCH_PREFIX scan. */
11539 next_fragP->tc_frag_data.max_prefix_length = 0;
11540 }
11541 else
11542 frag_wane (next_fragP);
11543 break;
11544 }
11545 }
11546
11547 /* Stop if there is no BRANCH_PREFIX. */
11548 if (!align_branch_prefix_size)
11549 return;
11550
11551 /* Scan for BRANCH_PREFIX. */
11552 for (; fragP != NULL; fragP = fragP->fr_next)
11553 {
11554 if (fragP->fr_type != rs_machine_dependent
11555 || (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11556 != BRANCH_PREFIX))
11557 continue;
11558
11559 /* Count all BRANCH_PREFIX frags before BRANCH_PADDING and
11560 COND_JUMP_PREFIX. */
11561 max_prefix_length = 0;
11562 for (next_fragP = fragP;
11563 next_fragP != NULL;
11564 next_fragP = next_fragP->fr_next)
11565 {
11566 if (next_fragP->fr_type == rs_fill)
11567 /* Skip rs_fill frags. */
11568 continue;
11569 else if (next_fragP->fr_type != rs_machine_dependent)
11570 /* Stop for all other frags. */
11571 break;
11572
11573 /* rs_machine_dependent frags. */
11574 if (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11575 == BRANCH_PREFIX)
11576 {
11577 /* Count BRANCH_PREFIX frags. */
11578 if (max_prefix_length >= MAX_FUSED_JCC_PADDING_SIZE)
11579 {
11580 max_prefix_length = MAX_FUSED_JCC_PADDING_SIZE;
11581 frag_wane (next_fragP);
11582 }
11583 else
11584 max_prefix_length
11585 += next_fragP->tc_frag_data.max_bytes;
11586 }
11587 else if ((TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11588 == BRANCH_PADDING)
11589 || (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11590 == FUSED_JCC_PADDING))
11591 {
11592 /* Stop at BRANCH_PADDING and FUSED_JCC_PADDING. */
11593 fragP->tc_frag_data.u.padding_fragP = next_fragP;
11594 break;
11595 }
11596 else
11597 /* Stop for other rs_machine_dependent frags. */
11598 break;
11599 }
11600
11601 fragP->tc_frag_data.max_prefix_length = max_prefix_length;
11602
11603 /* Skip to the next frag. */
11604 fragP = next_fragP;
11605 }
11606}
11607
11608/* Compute padding size for
11609
11610 FUSED_JCC_PADDING
11611 CMP like instruction
11612 BRANCH_PADDING
11613 COND_JUMP/UNCOND_JUMP
11614
11615 or
11616
11617 BRANCH_PADDING
11618 COND_JUMP/UNCOND_JUMP
11619 */
11620
11621static int
11622i386_branch_padding_size (fragS *fragP, offsetT address)
11623{
11624 unsigned int offset, size, padding_size;
11625 fragS *branch_fragP = fragP->tc_frag_data.u.branch_fragP;
11626
11627 /* The start address of the BRANCH_PADDING or FUSED_JCC_PADDING frag. */
11628 if (!address)
11629 address = fragP->fr_address;
11630 address += fragP->fr_fix;
11631
11632 /* CMP like instrunction size. */
11633 size = fragP->tc_frag_data.cmp_size;
11634
11635 /* The base size of the branch frag. */
11636 size += branch_fragP->fr_fix;
11637
11638 /* Add opcode and displacement bytes for the rs_machine_dependent
11639 branch frag. */
11640 if (branch_fragP->fr_type == rs_machine_dependent)
11641 size += md_relax_table[branch_fragP->fr_subtype].rlx_length;
11642
11643 /* Check if branch is within boundary and doesn't end at the last
11644 byte. */
11645 offset = address & ((1U << align_branch_power) - 1);
11646 if ((offset + size) >= (1U << align_branch_power))
11647 /* Padding needed to avoid crossing boundary. */
11648 padding_size = (1U << align_branch_power) - offset;
11649 else
11650 /* No padding needed. */
11651 padding_size = 0;
11652
11653 /* The return value may be saved in tc_frag_data.length which is
11654 unsigned byte. */
11655 if (!fits_in_unsigned_byte (padding_size))
11656 abort ();
11657
11658 return padding_size;
11659}
11660
11661/* i386_generic_table_relax_frag()
11662
11663 Handle BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags to
11664 grow/shrink padding to align branch frags. Hand others to
11665 relax_frag(). */
11666
11667long
11668i386_generic_table_relax_frag (segT segment, fragS *fragP, long stretch)
11669{
11670 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11671 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11672 {
11673 long padding_size = i386_branch_padding_size (fragP, 0);
11674 long grow = padding_size - fragP->tc_frag_data.length;
11675
11676 /* When the BRANCH_PREFIX frag is used, the computed address
11677 must match the actual address and there should be no padding. */
11678 if (fragP->tc_frag_data.padding_address
11679 && (fragP->tc_frag_data.padding_address != fragP->fr_address
11680 || padding_size))
11681 abort ();
11682
11683 /* Update the padding size. */
11684 if (grow)
11685 fragP->tc_frag_data.length = padding_size;
11686
11687 return grow;
11688 }
11689 else if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11690 {
11691 fragS *padding_fragP, *next_fragP;
11692 long padding_size, left_size, last_size;
11693
11694 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
11695 if (!padding_fragP)
11696 /* Use the padding set by the leading BRANCH_PREFIX frag. */
11697 return (fragP->tc_frag_data.length
11698 - fragP->tc_frag_data.last_length);
11699
11700 /* Compute the relative address of the padding frag in the very
11701 first time where the BRANCH_PREFIX frag sizes are zero. */
11702 if (!fragP->tc_frag_data.padding_address)
11703 fragP->tc_frag_data.padding_address
11704 = padding_fragP->fr_address - (fragP->fr_address - stretch);
11705
11706 /* First update the last length from the previous interation. */
11707 left_size = fragP->tc_frag_data.prefix_length;
11708 for (next_fragP = fragP;
11709 next_fragP != padding_fragP;
11710 next_fragP = next_fragP->fr_next)
11711 if (next_fragP->fr_type == rs_machine_dependent
11712 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11713 == BRANCH_PREFIX))
11714 {
11715 if (left_size)
11716 {
11717 int max = next_fragP->tc_frag_data.max_bytes;
11718 if (max)
11719 {
11720 int size;
11721 if (max > left_size)
11722 size = left_size;
11723 else
11724 size = max;
11725 left_size -= size;
11726 next_fragP->tc_frag_data.last_length = size;
11727 }
11728 }
11729 else
11730 next_fragP->tc_frag_data.last_length = 0;
11731 }
11732
11733 /* Check the padding size for the padding frag. */
11734 padding_size = i386_branch_padding_size
11735 (padding_fragP, (fragP->fr_address
11736 + fragP->tc_frag_data.padding_address));
11737
11738 last_size = fragP->tc_frag_data.prefix_length;
11739 /* Check if there is change from the last interation. */
11740 if (padding_size == last_size)
11741 {
11742 /* Update the expected address of the padding frag. */
11743 padding_fragP->tc_frag_data.padding_address
11744 = (fragP->fr_address + padding_size
11745 + fragP->tc_frag_data.padding_address);
11746 return 0;
11747 }
11748
11749 if (padding_size > fragP->tc_frag_data.max_prefix_length)
11750 {
11751 /* No padding if there is no sufficient room. Clear the
11752 expected address of the padding frag. */
11753 padding_fragP->tc_frag_data.padding_address = 0;
11754 padding_size = 0;
11755 }
11756 else
11757 /* Store the expected address of the padding frag. */
11758 padding_fragP->tc_frag_data.padding_address
11759 = (fragP->fr_address + padding_size
11760 + fragP->tc_frag_data.padding_address);
11761
11762 fragP->tc_frag_data.prefix_length = padding_size;
11763
11764 /* Update the length for the current interation. */
11765 left_size = padding_size;
11766 for (next_fragP = fragP;
11767 next_fragP != padding_fragP;
11768 next_fragP = next_fragP->fr_next)
11769 if (next_fragP->fr_type == rs_machine_dependent
11770 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11771 == BRANCH_PREFIX))
11772 {
11773 if (left_size)
11774 {
11775 int max = next_fragP->tc_frag_data.max_bytes;
11776 if (max)
11777 {
11778 int size;
11779 if (max > left_size)
11780 size = left_size;
11781 else
11782 size = max;
11783 left_size -= size;
11784 next_fragP->tc_frag_data.length = size;
11785 }
11786 }
11787 else
11788 next_fragP->tc_frag_data.length = 0;
11789 }
11790
11791 return (fragP->tc_frag_data.length
11792 - fragP->tc_frag_data.last_length);
11793 }
11794 return relax_frag (segment, fragP, stretch);
11795}
11796
ee7fcc42
AM
11797/* md_estimate_size_before_relax()
11798
11799 Called just before relax() for rs_machine_dependent frags. The x86
11800 assembler uses these frags to handle variable size jump
11801 instructions.
11802
11803 Any symbol that is now undefined will not become defined.
11804 Return the correct fr_subtype in the frag.
11805 Return the initial "guess for variable size of frag" to caller.
11806 The guess is actually the growth beyond the fixed part. Whatever
11807 we do to grow the fixed or variable part contributes to our
11808 returned value. */
11809
252b5132 11810int
7016a5d5 11811md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 11812{
e379e5f3
L
11813 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11814 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX
11815 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11816 {
11817 i386_classify_machine_dependent_frag (fragP);
11818 return fragP->tc_frag_data.length;
11819 }
11820
252b5132 11821 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
11822 check for un-relaxable symbols. On an ELF system, we can't relax
11823 an externally visible symbol, because it may be overridden by a
11824 shared library. */
11825 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 11826#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 11827 || (IS_ELF
8dcea932
L
11828 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
11829 fragP->fr_var))
fbeb56a4
DK
11830#endif
11831#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 11832 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 11833 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
11834#endif
11835 )
252b5132 11836 {
b98ef147
AM
11837 /* Symbol is undefined in this segment, or we need to keep a
11838 reloc so that weak symbols can be overridden. */
11839 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 11840 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
11841 unsigned char *opcode;
11842 int old_fr_fix;
f6af82bd 11843
ee7fcc42 11844 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 11845 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 11846 else if (size == 2)
f6af82bd 11847 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
11848#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11849 else if (need_plt32_p (fragP->fr_symbol))
11850 reloc_type = BFD_RELOC_X86_64_PLT32;
11851#endif
f6af82bd
AM
11852 else
11853 reloc_type = BFD_RELOC_32_PCREL;
252b5132 11854
ee7fcc42
AM
11855 old_fr_fix = fragP->fr_fix;
11856 opcode = (unsigned char *) fragP->fr_opcode;
11857
fddf5b5b 11858 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 11859 {
fddf5b5b
AM
11860 case UNCOND_JUMP:
11861 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 11862 opcode[0] = 0xe9;
252b5132 11863 fragP->fr_fix += size;
062cd5e7
AS
11864 fix_new (fragP, old_fr_fix, size,
11865 fragP->fr_symbol,
11866 fragP->fr_offset, 1,
11867 reloc_type);
252b5132
RH
11868 break;
11869
fddf5b5b 11870 case COND_JUMP86:
412167cb
AM
11871 if (size == 2
11872 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
11873 {
11874 /* Negate the condition, and branch past an
11875 unconditional jump. */
11876 opcode[0] ^= 1;
11877 opcode[1] = 3;
11878 /* Insert an unconditional jump. */
11879 opcode[2] = 0xe9;
11880 /* We added two extra opcode bytes, and have a two byte
11881 offset. */
11882 fragP->fr_fix += 2 + 2;
062cd5e7
AS
11883 fix_new (fragP, old_fr_fix + 2, 2,
11884 fragP->fr_symbol,
11885 fragP->fr_offset, 1,
11886 reloc_type);
fddf5b5b
AM
11887 break;
11888 }
11889 /* Fall through. */
11890
11891 case COND_JUMP:
412167cb
AM
11892 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
11893 {
3e02c1cc
AM
11894 fixS *fixP;
11895
412167cb 11896 fragP->fr_fix += 1;
3e02c1cc
AM
11897 fixP = fix_new (fragP, old_fr_fix, 1,
11898 fragP->fr_symbol,
11899 fragP->fr_offset, 1,
11900 BFD_RELOC_8_PCREL);
11901 fixP->fx_signed = 1;
412167cb
AM
11902 break;
11903 }
93c2a809 11904
24eab124 11905 /* This changes the byte-displacement jump 0x7N
fddf5b5b 11906 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 11907 opcode[1] = opcode[0] + 0x10;
f6af82bd 11908 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
11909 /* We've added an opcode byte. */
11910 fragP->fr_fix += 1 + size;
062cd5e7
AS
11911 fix_new (fragP, old_fr_fix + 1, size,
11912 fragP->fr_symbol,
11913 fragP->fr_offset, 1,
11914 reloc_type);
252b5132 11915 break;
fddf5b5b
AM
11916
11917 default:
11918 BAD_CASE (fragP->fr_subtype);
11919 break;
252b5132
RH
11920 }
11921 frag_wane (fragP);
ee7fcc42 11922 return fragP->fr_fix - old_fr_fix;
252b5132 11923 }
93c2a809 11924
93c2a809
AM
11925 /* Guess size depending on current relax state. Initially the relax
11926 state will correspond to a short jump and we return 1, because
11927 the variable part of the frag (the branch offset) is one byte
11928 long. However, we can relax a section more than once and in that
11929 case we must either set fr_subtype back to the unrelaxed state,
11930 or return the value for the appropriate branch. */
11931 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
11932}
11933
47926f60
KH
11934/* Called after relax() is finished.
11935
11936 In: Address of frag.
11937 fr_type == rs_machine_dependent.
11938 fr_subtype is what the address relaxed to.
11939
11940 Out: Any fixSs and constants are set up.
11941 Caller will turn frag into a ".space 0". */
11942
252b5132 11943void
7016a5d5
TG
11944md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
11945 fragS *fragP)
252b5132 11946{
29b0f896 11947 unsigned char *opcode;
252b5132 11948 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
11949 offsetT target_address;
11950 offsetT opcode_address;
252b5132 11951 unsigned int extension = 0;
847f7ad4 11952 offsetT displacement_from_opcode_start;
252b5132 11953
e379e5f3
L
11954 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11955 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING
11956 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11957 {
11958 /* Generate nop padding. */
11959 unsigned int size = fragP->tc_frag_data.length;
11960 if (size)
11961 {
11962 if (size > fragP->tc_frag_data.max_bytes)
11963 abort ();
11964
11965 if (flag_debug)
11966 {
11967 const char *msg;
11968 const char *branch = "branch";
11969 const char *prefix = "";
11970 fragS *padding_fragP;
11971 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11972 == BRANCH_PREFIX)
11973 {
11974 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
11975 switch (fragP->tc_frag_data.default_prefix)
11976 {
11977 default:
11978 abort ();
11979 break;
11980 case CS_PREFIX_OPCODE:
11981 prefix = " cs";
11982 break;
11983 case DS_PREFIX_OPCODE:
11984 prefix = " ds";
11985 break;
11986 case ES_PREFIX_OPCODE:
11987 prefix = " es";
11988 break;
11989 case FS_PREFIX_OPCODE:
11990 prefix = " fs";
11991 break;
11992 case GS_PREFIX_OPCODE:
11993 prefix = " gs";
11994 break;
11995 case SS_PREFIX_OPCODE:
11996 prefix = " ss";
11997 break;
11998 }
11999 if (padding_fragP)
12000 msg = _("%s:%u: add %d%s at 0x%llx to align "
12001 "%s within %d-byte boundary\n");
12002 else
12003 msg = _("%s:%u: add additional %d%s at 0x%llx to "
12004 "align %s within %d-byte boundary\n");
12005 }
12006 else
12007 {
12008 padding_fragP = fragP;
12009 msg = _("%s:%u: add %d%s-byte nop at 0x%llx to align "
12010 "%s within %d-byte boundary\n");
12011 }
12012
12013 if (padding_fragP)
12014 switch (padding_fragP->tc_frag_data.branch_type)
12015 {
12016 case align_branch_jcc:
12017 branch = "jcc";
12018 break;
12019 case align_branch_fused:
12020 branch = "fused jcc";
12021 break;
12022 case align_branch_jmp:
12023 branch = "jmp";
12024 break;
12025 case align_branch_call:
12026 branch = "call";
12027 break;
12028 case align_branch_indirect:
12029 branch = "indiret branch";
12030 break;
12031 case align_branch_ret:
12032 branch = "ret";
12033 break;
12034 default:
12035 break;
12036 }
12037
12038 fprintf (stdout, msg,
12039 fragP->fr_file, fragP->fr_line, size, prefix,
12040 (long long) fragP->fr_address, branch,
12041 1 << align_branch_power);
12042 }
12043 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12044 memset (fragP->fr_opcode,
12045 fragP->tc_frag_data.default_prefix, size);
12046 else
12047 i386_generate_nops (fragP, (char *) fragP->fr_opcode,
12048 size, 0);
12049 fragP->fr_fix += size;
12050 }
12051 return;
12052 }
12053
252b5132
RH
12054 opcode = (unsigned char *) fragP->fr_opcode;
12055
47926f60 12056 /* Address we want to reach in file space. */
252b5132 12057 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 12058
47926f60 12059 /* Address opcode resides at in file space. */
252b5132
RH
12060 opcode_address = fragP->fr_address + fragP->fr_fix;
12061
47926f60 12062 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
12063 displacement_from_opcode_start = target_address - opcode_address;
12064
fddf5b5b 12065 if ((fragP->fr_subtype & BIG) == 0)
252b5132 12066 {
47926f60
KH
12067 /* Don't have to change opcode. */
12068 extension = 1; /* 1 opcode + 1 displacement */
252b5132 12069 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
12070 }
12071 else
12072 {
12073 if (no_cond_jump_promotion
12074 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
12075 as_warn_where (fragP->fr_file, fragP->fr_line,
12076 _("long jump required"));
252b5132 12077
fddf5b5b
AM
12078 switch (fragP->fr_subtype)
12079 {
12080 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
12081 extension = 4; /* 1 opcode + 4 displacement */
12082 opcode[0] = 0xe9;
12083 where_to_put_displacement = &opcode[1];
12084 break;
252b5132 12085
fddf5b5b
AM
12086 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
12087 extension = 2; /* 1 opcode + 2 displacement */
12088 opcode[0] = 0xe9;
12089 where_to_put_displacement = &opcode[1];
12090 break;
252b5132 12091
fddf5b5b
AM
12092 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
12093 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
12094 extension = 5; /* 2 opcode + 4 displacement */
12095 opcode[1] = opcode[0] + 0x10;
12096 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12097 where_to_put_displacement = &opcode[2];
12098 break;
252b5132 12099
fddf5b5b
AM
12100 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
12101 extension = 3; /* 2 opcode + 2 displacement */
12102 opcode[1] = opcode[0] + 0x10;
12103 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12104 where_to_put_displacement = &opcode[2];
12105 break;
252b5132 12106
fddf5b5b
AM
12107 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
12108 extension = 4;
12109 opcode[0] ^= 1;
12110 opcode[1] = 3;
12111 opcode[2] = 0xe9;
12112 where_to_put_displacement = &opcode[3];
12113 break;
12114
12115 default:
12116 BAD_CASE (fragP->fr_subtype);
12117 break;
12118 }
252b5132 12119 }
fddf5b5b 12120
7b81dfbb
AJ
12121 /* If size if less then four we are sure that the operand fits,
12122 but if it's 4, then it could be that the displacement is larger
12123 then -/+ 2GB. */
12124 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
12125 && object_64bit
12126 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
12127 + ((addressT) 1 << 31))
12128 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
12129 {
12130 as_bad_where (fragP->fr_file, fragP->fr_line,
12131 _("jump target out of range"));
12132 /* Make us emit 0. */
12133 displacement_from_opcode_start = extension;
12134 }
47926f60 12135 /* Now put displacement after opcode. */
252b5132
RH
12136 md_number_to_chars ((char *) where_to_put_displacement,
12137 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 12138 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
12139 fragP->fr_fix += extension;
12140}
12141\f
7016a5d5 12142/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
12143 by our caller that we have all the info we need to fix it up.
12144
7016a5d5
TG
12145 Parameter valP is the pointer to the value of the bits.
12146
252b5132
RH
12147 On the 386, immediates, displacements, and data pointers are all in
12148 the same (little-endian) format, so we don't need to care about which
12149 we are handling. */
12150
94f592af 12151void
7016a5d5 12152md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 12153{
94f592af 12154 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 12155 valueT value = *valP;
252b5132 12156
f86103b7 12157#if !defined (TE_Mach)
93382f6d
AM
12158 if (fixP->fx_pcrel)
12159 {
12160 switch (fixP->fx_r_type)
12161 {
5865bb77
ILT
12162 default:
12163 break;
12164
d6ab8113
JB
12165 case BFD_RELOC_64:
12166 fixP->fx_r_type = BFD_RELOC_64_PCREL;
12167 break;
93382f6d 12168 case BFD_RELOC_32:
ae8887b5 12169 case BFD_RELOC_X86_64_32S:
93382f6d
AM
12170 fixP->fx_r_type = BFD_RELOC_32_PCREL;
12171 break;
12172 case BFD_RELOC_16:
12173 fixP->fx_r_type = BFD_RELOC_16_PCREL;
12174 break;
12175 case BFD_RELOC_8:
12176 fixP->fx_r_type = BFD_RELOC_8_PCREL;
12177 break;
12178 }
12179 }
252b5132 12180
a161fe53 12181 if (fixP->fx_addsy != NULL
31312f95 12182 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 12183 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 12184 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 12185 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 12186 && !use_rela_relocations)
252b5132 12187 {
31312f95
AM
12188 /* This is a hack. There should be a better way to handle this.
12189 This covers for the fact that bfd_install_relocation will
12190 subtract the current location (for partial_inplace, PC relative
12191 relocations); see more below. */
252b5132 12192#ifndef OBJ_AOUT
718ddfc0 12193 if (IS_ELF
252b5132
RH
12194#ifdef TE_PE
12195 || OUTPUT_FLAVOR == bfd_target_coff_flavour
12196#endif
12197 )
12198 value += fixP->fx_where + fixP->fx_frag->fr_address;
12199#endif
12200#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12201 if (IS_ELF)
252b5132 12202 {
6539b54b 12203 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 12204
6539b54b 12205 if ((sym_seg == seg
2f66722d 12206 || (symbol_section_p (fixP->fx_addsy)
6539b54b 12207 && sym_seg != absolute_section))
af65af87 12208 && !generic_force_reloc (fixP))
2f66722d
AM
12209 {
12210 /* Yes, we add the values in twice. This is because
6539b54b
AM
12211 bfd_install_relocation subtracts them out again. I think
12212 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
12213 it. FIXME. */
12214 value += fixP->fx_where + fixP->fx_frag->fr_address;
12215 }
252b5132
RH
12216 }
12217#endif
12218#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
12219 /* For some reason, the PE format does not store a
12220 section address offset for a PC relative symbol. */
12221 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 12222 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
12223 value += md_pcrel_from (fixP);
12224#endif
12225 }
fbeb56a4 12226#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
12227 if (fixP->fx_addsy != NULL
12228 && S_IS_WEAK (fixP->fx_addsy)
12229 /* PR 16858: Do not modify weak function references. */
12230 && ! fixP->fx_pcrel)
fbeb56a4 12231 {
296a8689
NC
12232#if !defined (TE_PEP)
12233 /* For x86 PE weak function symbols are neither PC-relative
12234 nor do they set S_IS_FUNCTION. So the only reliable way
12235 to detect them is to check the flags of their containing
12236 section. */
12237 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
12238 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
12239 ;
12240 else
12241#endif
fbeb56a4
DK
12242 value -= S_GET_VALUE (fixP->fx_addsy);
12243 }
12244#endif
252b5132
RH
12245
12246 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 12247 and we must not disappoint it. */
252b5132 12248#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12249 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
12250 switch (fixP->fx_r_type)
12251 {
12252 case BFD_RELOC_386_PLT32:
3e73aa7c 12253 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
12254 /* Make the jump instruction point to the address of the operand.
12255 At runtime we merely add the offset to the actual PLT entry.
12256 NB: Subtract the offset size only for jump instructions. */
12257 if (fixP->fx_pcrel)
12258 value = -4;
47926f60 12259 break;
31312f95 12260
13ae64f3
JJ
12261 case BFD_RELOC_386_TLS_GD:
12262 case BFD_RELOC_386_TLS_LDM:
13ae64f3 12263 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
12264 case BFD_RELOC_386_TLS_IE:
12265 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 12266 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
12267 case BFD_RELOC_X86_64_TLSGD:
12268 case BFD_RELOC_X86_64_TLSLD:
12269 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 12270 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
12271 value = 0; /* Fully resolved at runtime. No addend. */
12272 /* Fallthrough */
12273 case BFD_RELOC_386_TLS_LE:
12274 case BFD_RELOC_386_TLS_LDO_32:
12275 case BFD_RELOC_386_TLS_LE_32:
12276 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 12277 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 12278 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 12279 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
12280 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12281 break;
12282
67a4f2b7
AO
12283 case BFD_RELOC_386_TLS_DESC_CALL:
12284 case BFD_RELOC_X86_64_TLSDESC_CALL:
12285 value = 0; /* Fully resolved at runtime. No addend. */
12286 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12287 fixP->fx_done = 0;
12288 return;
12289
47926f60
KH
12290 case BFD_RELOC_VTABLE_INHERIT:
12291 case BFD_RELOC_VTABLE_ENTRY:
12292 fixP->fx_done = 0;
94f592af 12293 return;
47926f60
KH
12294
12295 default:
12296 break;
12297 }
12298#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 12299 *valP = value;
f86103b7 12300#endif /* !defined (TE_Mach) */
3e73aa7c 12301
3e73aa7c 12302 /* Are we finished with this relocation now? */
c6682705 12303 if (fixP->fx_addsy == NULL)
3e73aa7c 12304 fixP->fx_done = 1;
fbeb56a4
DK
12305#if defined (OBJ_COFF) && defined (TE_PE)
12306 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
12307 {
12308 fixP->fx_done = 0;
12309 /* Remember value for tc_gen_reloc. */
12310 fixP->fx_addnumber = value;
12311 /* Clear out the frag for now. */
12312 value = 0;
12313 }
12314#endif
3e73aa7c
JH
12315 else if (use_rela_relocations)
12316 {
12317 fixP->fx_no_overflow = 1;
062cd5e7
AS
12318 /* Remember value for tc_gen_reloc. */
12319 fixP->fx_addnumber = value;
3e73aa7c
JH
12320 value = 0;
12321 }
f86103b7 12322
94f592af 12323 md_number_to_chars (p, value, fixP->fx_size);
252b5132 12324}
252b5132 12325\f
6d4af3c2 12326const char *
499ac353 12327md_atof (int type, char *litP, int *sizeP)
252b5132 12328{
499ac353
NC
12329 /* This outputs the LITTLENUMs in REVERSE order;
12330 in accord with the bigendian 386. */
12331 return ieee_md_atof (type, litP, sizeP, FALSE);
252b5132
RH
12332}
12333\f
2d545b82 12334static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 12335
252b5132 12336static char *
e3bb37b5 12337output_invalid (int c)
252b5132 12338{
3882b010 12339 if (ISPRINT (c))
f9f21a03
L
12340 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
12341 "'%c'", c);
252b5132 12342 else
f9f21a03 12343 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 12344 "(0x%x)", (unsigned char) c);
252b5132
RH
12345 return output_invalid_buf;
12346}
12347
8a6fb3f9
JB
12348/* Verify that @r can be used in the current context. */
12349
12350static bfd_boolean check_register (const reg_entry *r)
12351{
12352 if (allow_pseudo_reg)
12353 return TRUE;
12354
12355 if (operand_type_all_zero (&r->reg_type))
12356 return FALSE;
12357
12358 if ((r->reg_type.bitfield.dword
12359 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
12360 || r->reg_type.bitfield.class == RegCR
12361 || r->reg_type.bitfield.class == RegDR
12362 || r->reg_type.bitfield.class == RegTR)
12363 && !cpu_arch_flags.bitfield.cpui386)
12364 return FALSE;
12365
12366 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
12367 return FALSE;
12368
12369 if (!cpu_arch_flags.bitfield.cpuavx512f)
12370 {
12371 if (r->reg_type.bitfield.zmmword
12372 || r->reg_type.bitfield.class == RegMask)
12373 return FALSE;
12374
12375 if (!cpu_arch_flags.bitfield.cpuavx)
12376 {
12377 if (r->reg_type.bitfield.ymmword)
12378 return FALSE;
12379
12380 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
12381 return FALSE;
12382 }
12383 }
12384
12385 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
12386 return FALSE;
12387
12388 /* Don't allow fake index register unless allow_index_reg isn't 0. */
12389 if (!allow_index_reg && r->reg_num == RegIZ)
12390 return FALSE;
12391
12392 /* Upper 16 vector registers are only available with VREX in 64bit
12393 mode, and require EVEX encoding. */
12394 if (r->reg_flags & RegVRex)
12395 {
12396 if (!cpu_arch_flags.bitfield.cpuavx512f
12397 || flag_code != CODE_64BIT)
12398 return FALSE;
12399
12400 i.vec_encoding = vex_encoding_evex;
12401 }
12402
12403 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
12404 && (!cpu_arch_flags.bitfield.cpulm || r->reg_type.bitfield.class != RegCR)
12405 && flag_code != CODE_64BIT)
12406 return FALSE;
12407
12408 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
12409 && !intel_syntax)
12410 return FALSE;
12411
12412 return TRUE;
12413}
12414
af6bdddf 12415/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
12416
12417static const reg_entry *
4d1bb795 12418parse_real_register (char *reg_string, char **end_op)
252b5132 12419{
af6bdddf
AM
12420 char *s = reg_string;
12421 char *p;
252b5132
RH
12422 char reg_name_given[MAX_REG_NAME_SIZE + 1];
12423 const reg_entry *r;
12424
12425 /* Skip possible REGISTER_PREFIX and possible whitespace. */
12426 if (*s == REGISTER_PREFIX)
12427 ++s;
12428
12429 if (is_space_char (*s))
12430 ++s;
12431
12432 p = reg_name_given;
af6bdddf 12433 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
12434 {
12435 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
12436 return (const reg_entry *) NULL;
12437 s++;
252b5132
RH
12438 }
12439
6588847e
DN
12440 /* For naked regs, make sure that we are not dealing with an identifier.
12441 This prevents confusing an identifier like `eax_var' with register
12442 `eax'. */
12443 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
12444 return (const reg_entry *) NULL;
12445
af6bdddf 12446 *end_op = s;
252b5132
RH
12447
12448 r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
12449
5f47d35b 12450 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 12451 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 12452 {
0e0eea78
JB
12453 if (!cpu_arch_flags.bitfield.cpu8087
12454 && !cpu_arch_flags.bitfield.cpu287
af32b722
JB
12455 && !cpu_arch_flags.bitfield.cpu387
12456 && !allow_pseudo_reg)
0e0eea78
JB
12457 return (const reg_entry *) NULL;
12458
5f47d35b
AM
12459 if (is_space_char (*s))
12460 ++s;
12461 if (*s == '(')
12462 {
af6bdddf 12463 ++s;
5f47d35b
AM
12464 if (is_space_char (*s))
12465 ++s;
12466 if (*s >= '0' && *s <= '7')
12467 {
db557034 12468 int fpr = *s - '0';
af6bdddf 12469 ++s;
5f47d35b
AM
12470 if (is_space_char (*s))
12471 ++s;
12472 if (*s == ')')
12473 {
12474 *end_op = s + 1;
1e9cc1c2 12475 r = (const reg_entry *) hash_find (reg_hash, "st(0)");
db557034
AM
12476 know (r);
12477 return r + fpr;
5f47d35b 12478 }
5f47d35b 12479 }
47926f60 12480 /* We have "%st(" then garbage. */
5f47d35b
AM
12481 return (const reg_entry *) NULL;
12482 }
12483 }
12484
8a6fb3f9 12485 return r && check_register (r) ? r : NULL;
252b5132 12486}
4d1bb795
JB
12487
12488/* REG_STRING starts *before* REGISTER_PREFIX. */
12489
12490static const reg_entry *
12491parse_register (char *reg_string, char **end_op)
12492{
12493 const reg_entry *r;
12494
12495 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
12496 r = parse_real_register (reg_string, end_op);
12497 else
12498 r = NULL;
12499 if (!r)
12500 {
12501 char *save = input_line_pointer;
12502 char c;
12503 symbolS *symbolP;
12504
12505 input_line_pointer = reg_string;
d02603dc 12506 c = get_symbol_name (&reg_string);
4d1bb795
JB
12507 symbolP = symbol_find (reg_string);
12508 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
12509 {
12510 const expressionS *e = symbol_get_value_expression (symbolP);
12511
0398aac5 12512 know (e->X_op == O_register);
4eed87de 12513 know (e->X_add_number >= 0
c3fe08fa 12514 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 12515 r = i386_regtab + e->X_add_number;
8a6fb3f9
JB
12516 if (!check_register (r))
12517 {
12518 as_bad (_("register '%s%s' cannot be used here"),
12519 register_prefix, r->reg_name);
12520 r = &bad_reg;
12521 }
4d1bb795
JB
12522 *end_op = input_line_pointer;
12523 }
12524 *input_line_pointer = c;
12525 input_line_pointer = save;
12526 }
12527 return r;
12528}
12529
12530int
12531i386_parse_name (char *name, expressionS *e, char *nextcharP)
12532{
12533 const reg_entry *r;
12534 char *end = input_line_pointer;
12535
12536 *end = *nextcharP;
12537 r = parse_register (name, &input_line_pointer);
12538 if (r && end <= input_line_pointer)
12539 {
12540 *nextcharP = *input_line_pointer;
12541 *input_line_pointer = 0;
8a6fb3f9
JB
12542 if (r != &bad_reg)
12543 {
12544 e->X_op = O_register;
12545 e->X_add_number = r - i386_regtab;
12546 }
12547 else
12548 e->X_op = O_illegal;
4d1bb795
JB
12549 return 1;
12550 }
12551 input_line_pointer = end;
12552 *end = 0;
ee86248c 12553 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
12554}
12555
12556void
12557md_operand (expressionS *e)
12558{
ee86248c
JB
12559 char *end;
12560 const reg_entry *r;
4d1bb795 12561
ee86248c
JB
12562 switch (*input_line_pointer)
12563 {
12564 case REGISTER_PREFIX:
12565 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
12566 if (r)
12567 {
12568 e->X_op = O_register;
12569 e->X_add_number = r - i386_regtab;
12570 input_line_pointer = end;
12571 }
ee86248c
JB
12572 break;
12573
12574 case '[':
9c2799c2 12575 gas_assert (intel_syntax);
ee86248c
JB
12576 end = input_line_pointer++;
12577 expression (e);
12578 if (*input_line_pointer == ']')
12579 {
12580 ++input_line_pointer;
12581 e->X_op_symbol = make_expr_symbol (e);
12582 e->X_add_symbol = NULL;
12583 e->X_add_number = 0;
12584 e->X_op = O_index;
12585 }
12586 else
12587 {
12588 e->X_op = O_absent;
12589 input_line_pointer = end;
12590 }
12591 break;
4d1bb795
JB
12592 }
12593}
12594
252b5132 12595\f
4cc782b5 12596#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 12597const char *md_shortopts = "kVQ:sqnO::";
252b5132 12598#else
b6f8c7c4 12599const char *md_shortopts = "qnO::";
252b5132 12600#endif
6e0b89ee 12601
3e73aa7c 12602#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
12603#define OPTION_64 (OPTION_MD_BASE + 1)
12604#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
12605#define OPTION_MARCH (OPTION_MD_BASE + 3)
12606#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
12607#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
12608#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
12609#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
12610#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 12611#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 12612#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 12613#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
12614#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
12615#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
12616#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 12617#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
12618#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
12619#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 12620#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 12621#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 12622#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 12623#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
12624#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
12625#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 12626#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 12627#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 12628#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
e379e5f3
L
12629#define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27)
12630#define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
12631#define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
76cf450b 12632#define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
ae531041
L
12633#define OPTION_MLFENCE_AFTER_LOAD (OPTION_MD_BASE + 31)
12634#define OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH (OPTION_MD_BASE + 32)
12635#define OPTION_MLFENCE_BEFORE_RET (OPTION_MD_BASE + 33)
b3b91714 12636
99ad8390
NC
12637struct option md_longopts[] =
12638{
3e73aa7c 12639 {"32", no_argument, NULL, OPTION_32},
321098a5 12640#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12641 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 12642 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
12643#endif
12644#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12645 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 12646 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 12647 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 12648#endif
b3b91714 12649 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
12650 {"march", required_argument, NULL, OPTION_MARCH},
12651 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
12652 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
12653 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
12654 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
12655 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 12656 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 12657 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 12658 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 12659 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 12660 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 12661 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
12662 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
12663 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
12664# if defined (TE_PE) || defined (TE_PEP)
12665 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
12666#endif
d1982f93 12667 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 12668 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 12669 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 12670 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
e379e5f3
L
12671 {"malign-branch-boundary", required_argument, NULL, OPTION_MALIGN_BRANCH_BOUNDARY},
12672 {"malign-branch-prefix-size", required_argument, NULL, OPTION_MALIGN_BRANCH_PREFIX_SIZE},
12673 {"malign-branch", required_argument, NULL, OPTION_MALIGN_BRANCH},
76cf450b 12674 {"mbranches-within-32B-boundaries", no_argument, NULL, OPTION_MBRANCHES_WITH_32B_BOUNDARIES},
ae531041
L
12675 {"mlfence-after-load", required_argument, NULL, OPTION_MLFENCE_AFTER_LOAD},
12676 {"mlfence-before-indirect-branch", required_argument, NULL,
12677 OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH},
12678 {"mlfence-before-ret", required_argument, NULL, OPTION_MLFENCE_BEFORE_RET},
5db04b09
L
12679 {"mamd64", no_argument, NULL, OPTION_MAMD64},
12680 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
12681 {NULL, no_argument, NULL, 0}
12682};
12683size_t md_longopts_size = sizeof (md_longopts);
12684
12685int
17b9d67d 12686md_parse_option (int c, const char *arg)
252b5132 12687{
91d6fa6a 12688 unsigned int j;
e379e5f3 12689 char *arch, *next, *saved, *type;
9103f4f4 12690
252b5132
RH
12691 switch (c)
12692 {
12b55ccc
L
12693 case 'n':
12694 optimize_align_code = 0;
12695 break;
12696
a38cf1db
AM
12697 case 'q':
12698 quiet_warnings = 1;
252b5132
RH
12699 break;
12700
12701#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
12702 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
12703 should be emitted or not. FIXME: Not implemented. */
12704 case 'Q':
d4693039
JB
12705 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
12706 return 0;
252b5132
RH
12707 break;
12708
12709 /* -V: SVR4 argument to print version ID. */
12710 case 'V':
12711 print_version_id ();
12712 break;
12713
a38cf1db
AM
12714 /* -k: Ignore for FreeBSD compatibility. */
12715 case 'k':
252b5132 12716 break;
4cc782b5
ILT
12717
12718 case 's':
12719 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 12720 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 12721 break;
8dcea932
L
12722
12723 case OPTION_MSHARED:
12724 shared = 1;
12725 break;
b4a3a7b4
L
12726
12727 case OPTION_X86_USED_NOTE:
12728 if (strcasecmp (arg, "yes") == 0)
12729 x86_used_note = 1;
12730 else if (strcasecmp (arg, "no") == 0)
12731 x86_used_note = 0;
12732 else
12733 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
12734 break;
12735
12736
99ad8390 12737#endif
321098a5 12738#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12739 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
12740 case OPTION_64:
12741 {
12742 const char **list, **l;
12743
3e73aa7c
JH
12744 list = bfd_target_list ();
12745 for (l = list; *l != NULL; l++)
8620418b 12746 if (CONST_STRNEQ (*l, "elf64-x86-64")
99ad8390
NC
12747 || strcmp (*l, "coff-x86-64") == 0
12748 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
12749 || strcmp (*l, "pei-x86-64") == 0
12750 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
12751 {
12752 default_arch = "x86_64";
12753 break;
12754 }
3e73aa7c 12755 if (*l == NULL)
2b5d6a91 12756 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
12757 free (list);
12758 }
12759 break;
12760#endif
252b5132 12761
351f65ca 12762#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12763 case OPTION_X32:
351f65ca
L
12764 if (IS_ELF)
12765 {
12766 const char **list, **l;
12767
12768 list = bfd_target_list ();
12769 for (l = list; *l != NULL; l++)
12770 if (CONST_STRNEQ (*l, "elf32-x86-64"))
12771 {
12772 default_arch = "x86_64:32";
12773 break;
12774 }
12775 if (*l == NULL)
2b5d6a91 12776 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
12777 free (list);
12778 }
12779 else
12780 as_fatal (_("32bit x86_64 is only supported for ELF"));
12781 break;
12782#endif
12783
6e0b89ee
AM
12784 case OPTION_32:
12785 default_arch = "i386";
12786 break;
12787
b3b91714
AM
12788 case OPTION_DIVIDE:
12789#ifdef SVR4_COMMENT_CHARS
12790 {
12791 char *n, *t;
12792 const char *s;
12793
add39d23 12794 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
12795 t = n;
12796 for (s = i386_comment_chars; *s != '\0'; s++)
12797 if (*s != '/')
12798 *t++ = *s;
12799 *t = '\0';
12800 i386_comment_chars = n;
12801 }
12802#endif
12803 break;
12804
9103f4f4 12805 case OPTION_MARCH:
293f5f65
L
12806 saved = xstrdup (arg);
12807 arch = saved;
12808 /* Allow -march=+nosse. */
12809 if (*arch == '+')
12810 arch++;
6305a203 12811 do
9103f4f4 12812 {
6305a203 12813 if (*arch == '.')
2b5d6a91 12814 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
12815 next = strchr (arch, '+');
12816 if (next)
12817 *next++ = '\0';
91d6fa6a 12818 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 12819 {
91d6fa6a 12820 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 12821 {
6305a203 12822 /* Processor. */
1ded5609
JB
12823 if (! cpu_arch[j].flags.bitfield.cpui386)
12824 continue;
12825
91d6fa6a 12826 cpu_arch_name = cpu_arch[j].name;
6305a203 12827 cpu_sub_arch_name = NULL;
91d6fa6a
NC
12828 cpu_arch_flags = cpu_arch[j].flags;
12829 cpu_arch_isa = cpu_arch[j].type;
12830 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
12831 if (!cpu_arch_tune_set)
12832 {
12833 cpu_arch_tune = cpu_arch_isa;
12834 cpu_arch_tune_flags = cpu_arch_isa_flags;
12835 }
12836 break;
12837 }
91d6fa6a
NC
12838 else if (*cpu_arch [j].name == '.'
12839 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 12840 {
33eaf5de 12841 /* ISA extension. */
6305a203 12842 i386_cpu_flags flags;
309d3373 12843
293f5f65
L
12844 flags = cpu_flags_or (cpu_arch_flags,
12845 cpu_arch[j].flags);
81486035 12846
5b64d091 12847 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
12848 {
12849 if (cpu_sub_arch_name)
12850 {
12851 char *name = cpu_sub_arch_name;
12852 cpu_sub_arch_name = concat (name,
91d6fa6a 12853 cpu_arch[j].name,
1bf57e9f 12854 (const char *) NULL);
6305a203
L
12855 free (name);
12856 }
12857 else
91d6fa6a 12858 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 12859 cpu_arch_flags = flags;
a586129e 12860 cpu_arch_isa_flags = flags;
6305a203 12861 }
0089dace
L
12862 else
12863 cpu_arch_isa_flags
12864 = cpu_flags_or (cpu_arch_isa_flags,
12865 cpu_arch[j].flags);
6305a203 12866 break;
ccc9c027 12867 }
9103f4f4 12868 }
6305a203 12869
293f5f65
L
12870 if (j >= ARRAY_SIZE (cpu_arch))
12871 {
33eaf5de 12872 /* Disable an ISA extension. */
293f5f65
L
12873 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
12874 if (strcmp (arch, cpu_noarch [j].name) == 0)
12875 {
12876 i386_cpu_flags flags;
12877
12878 flags = cpu_flags_and_not (cpu_arch_flags,
12879 cpu_noarch[j].flags);
12880 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
12881 {
12882 if (cpu_sub_arch_name)
12883 {
12884 char *name = cpu_sub_arch_name;
12885 cpu_sub_arch_name = concat (arch,
12886 (const char *) NULL);
12887 free (name);
12888 }
12889 else
12890 cpu_sub_arch_name = xstrdup (arch);
12891 cpu_arch_flags = flags;
12892 cpu_arch_isa_flags = flags;
12893 }
12894 break;
12895 }
12896
12897 if (j >= ARRAY_SIZE (cpu_noarch))
12898 j = ARRAY_SIZE (cpu_arch);
12899 }
12900
91d6fa6a 12901 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 12902 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
12903
12904 arch = next;
9103f4f4 12905 }
293f5f65
L
12906 while (next != NULL);
12907 free (saved);
9103f4f4
L
12908 break;
12909
12910 case OPTION_MTUNE:
12911 if (*arg == '.')
2b5d6a91 12912 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 12913 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 12914 {
91d6fa6a 12915 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 12916 {
ccc9c027 12917 cpu_arch_tune_set = 1;
91d6fa6a
NC
12918 cpu_arch_tune = cpu_arch [j].type;
12919 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
12920 break;
12921 }
12922 }
91d6fa6a 12923 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 12924 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
12925 break;
12926
1efbbeb4
L
12927 case OPTION_MMNEMONIC:
12928 if (strcasecmp (arg, "att") == 0)
12929 intel_mnemonic = 0;
12930 else if (strcasecmp (arg, "intel") == 0)
12931 intel_mnemonic = 1;
12932 else
2b5d6a91 12933 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
12934 break;
12935
12936 case OPTION_MSYNTAX:
12937 if (strcasecmp (arg, "att") == 0)
12938 intel_syntax = 0;
12939 else if (strcasecmp (arg, "intel") == 0)
12940 intel_syntax = 1;
12941 else
2b5d6a91 12942 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
12943 break;
12944
12945 case OPTION_MINDEX_REG:
12946 allow_index_reg = 1;
12947 break;
12948
12949 case OPTION_MNAKED_REG:
12950 allow_naked_reg = 1;
12951 break;
12952
c0f3af97
L
12953 case OPTION_MSSE2AVX:
12954 sse2avx = 1;
12955 break;
12956
daf50ae7
L
12957 case OPTION_MSSE_CHECK:
12958 if (strcasecmp (arg, "error") == 0)
7bab8ab5 12959 sse_check = check_error;
daf50ae7 12960 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 12961 sse_check = check_warning;
daf50ae7 12962 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 12963 sse_check = check_none;
daf50ae7 12964 else
2b5d6a91 12965 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
12966 break;
12967
7bab8ab5
JB
12968 case OPTION_MOPERAND_CHECK:
12969 if (strcasecmp (arg, "error") == 0)
12970 operand_check = check_error;
12971 else if (strcasecmp (arg, "warning") == 0)
12972 operand_check = check_warning;
12973 else if (strcasecmp (arg, "none") == 0)
12974 operand_check = check_none;
12975 else
12976 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
12977 break;
12978
539f890d
L
12979 case OPTION_MAVXSCALAR:
12980 if (strcasecmp (arg, "128") == 0)
12981 avxscalar = vex128;
12982 else if (strcasecmp (arg, "256") == 0)
12983 avxscalar = vex256;
12984 else
2b5d6a91 12985 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
12986 break;
12987
03751133
L
12988 case OPTION_MVEXWIG:
12989 if (strcmp (arg, "0") == 0)
40c9c8de 12990 vexwig = vexw0;
03751133 12991 else if (strcmp (arg, "1") == 0)
40c9c8de 12992 vexwig = vexw1;
03751133
L
12993 else
12994 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
12995 break;
12996
7e8b059b
L
12997 case OPTION_MADD_BND_PREFIX:
12998 add_bnd_prefix = 1;
12999 break;
13000
43234a1e
L
13001 case OPTION_MEVEXLIG:
13002 if (strcmp (arg, "128") == 0)
13003 evexlig = evexl128;
13004 else if (strcmp (arg, "256") == 0)
13005 evexlig = evexl256;
13006 else if (strcmp (arg, "512") == 0)
13007 evexlig = evexl512;
13008 else
13009 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
13010 break;
13011
d3d3c6db
IT
13012 case OPTION_MEVEXRCIG:
13013 if (strcmp (arg, "rne") == 0)
13014 evexrcig = rne;
13015 else if (strcmp (arg, "rd") == 0)
13016 evexrcig = rd;
13017 else if (strcmp (arg, "ru") == 0)
13018 evexrcig = ru;
13019 else if (strcmp (arg, "rz") == 0)
13020 evexrcig = rz;
13021 else
13022 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
13023 break;
13024
43234a1e
L
13025 case OPTION_MEVEXWIG:
13026 if (strcmp (arg, "0") == 0)
13027 evexwig = evexw0;
13028 else if (strcmp (arg, "1") == 0)
13029 evexwig = evexw1;
13030 else
13031 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
13032 break;
13033
167ad85b
TG
13034# if defined (TE_PE) || defined (TE_PEP)
13035 case OPTION_MBIG_OBJ:
13036 use_big_obj = 1;
13037 break;
13038#endif
13039
d1982f93 13040 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
13041 if (strcasecmp (arg, "yes") == 0)
13042 omit_lock_prefix = 1;
13043 else if (strcasecmp (arg, "no") == 0)
13044 omit_lock_prefix = 0;
13045 else
13046 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
13047 break;
13048
e4e00185
AS
13049 case OPTION_MFENCE_AS_LOCK_ADD:
13050 if (strcasecmp (arg, "yes") == 0)
13051 avoid_fence = 1;
13052 else if (strcasecmp (arg, "no") == 0)
13053 avoid_fence = 0;
13054 else
13055 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
13056 break;
13057
ae531041
L
13058 case OPTION_MLFENCE_AFTER_LOAD:
13059 if (strcasecmp (arg, "yes") == 0)
13060 lfence_after_load = 1;
13061 else if (strcasecmp (arg, "no") == 0)
13062 lfence_after_load = 0;
13063 else
13064 as_fatal (_("invalid -mlfence-after-load= option: `%s'"), arg);
13065 break;
13066
13067 case OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH:
13068 if (strcasecmp (arg, "all") == 0)
a09f656b 13069 {
13070 lfence_before_indirect_branch = lfence_branch_all;
13071 if (lfence_before_ret == lfence_before_ret_none)
13072 lfence_before_ret = lfence_before_ret_shl;
13073 }
ae531041
L
13074 else if (strcasecmp (arg, "memory") == 0)
13075 lfence_before_indirect_branch = lfence_branch_memory;
13076 else if (strcasecmp (arg, "register") == 0)
13077 lfence_before_indirect_branch = lfence_branch_register;
13078 else if (strcasecmp (arg, "none") == 0)
13079 lfence_before_indirect_branch = lfence_branch_none;
13080 else
13081 as_fatal (_("invalid -mlfence-before-indirect-branch= option: `%s'"),
13082 arg);
13083 break;
13084
13085 case OPTION_MLFENCE_BEFORE_RET:
13086 if (strcasecmp (arg, "or") == 0)
13087 lfence_before_ret = lfence_before_ret_or;
13088 else if (strcasecmp (arg, "not") == 0)
13089 lfence_before_ret = lfence_before_ret_not;
a09f656b 13090 else if (strcasecmp (arg, "shl") == 0 || strcasecmp (arg, "yes") == 0)
13091 lfence_before_ret = lfence_before_ret_shl;
ae531041
L
13092 else if (strcasecmp (arg, "none") == 0)
13093 lfence_before_ret = lfence_before_ret_none;
13094 else
13095 as_fatal (_("invalid -mlfence-before-ret= option: `%s'"),
13096 arg);
13097 break;
13098
0cb4071e
L
13099 case OPTION_MRELAX_RELOCATIONS:
13100 if (strcasecmp (arg, "yes") == 0)
13101 generate_relax_relocations = 1;
13102 else if (strcasecmp (arg, "no") == 0)
13103 generate_relax_relocations = 0;
13104 else
13105 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
13106 break;
13107
e379e5f3
L
13108 case OPTION_MALIGN_BRANCH_BOUNDARY:
13109 {
13110 char *end;
13111 long int align = strtoul (arg, &end, 0);
13112 if (*end == '\0')
13113 {
13114 if (align == 0)
13115 {
13116 align_branch_power = 0;
13117 break;
13118 }
13119 else if (align >= 16)
13120 {
13121 int align_power;
13122 for (align_power = 0;
13123 (align & 1) == 0;
13124 align >>= 1, align_power++)
13125 continue;
13126 /* Limit alignment power to 31. */
13127 if (align == 1 && align_power < 32)
13128 {
13129 align_branch_power = align_power;
13130 break;
13131 }
13132 }
13133 }
13134 as_fatal (_("invalid -malign-branch-boundary= value: %s"), arg);
13135 }
13136 break;
13137
13138 case OPTION_MALIGN_BRANCH_PREFIX_SIZE:
13139 {
13140 char *end;
13141 int align = strtoul (arg, &end, 0);
13142 /* Some processors only support 5 prefixes. */
13143 if (*end == '\0' && align >= 0 && align < 6)
13144 {
13145 align_branch_prefix_size = align;
13146 break;
13147 }
13148 as_fatal (_("invalid -malign-branch-prefix-size= value: %s"),
13149 arg);
13150 }
13151 break;
13152
13153 case OPTION_MALIGN_BRANCH:
13154 align_branch = 0;
13155 saved = xstrdup (arg);
13156 type = saved;
13157 do
13158 {
13159 next = strchr (type, '+');
13160 if (next)
13161 *next++ = '\0';
13162 if (strcasecmp (type, "jcc") == 0)
13163 align_branch |= align_branch_jcc_bit;
13164 else if (strcasecmp (type, "fused") == 0)
13165 align_branch |= align_branch_fused_bit;
13166 else if (strcasecmp (type, "jmp") == 0)
13167 align_branch |= align_branch_jmp_bit;
13168 else if (strcasecmp (type, "call") == 0)
13169 align_branch |= align_branch_call_bit;
13170 else if (strcasecmp (type, "ret") == 0)
13171 align_branch |= align_branch_ret_bit;
13172 else if (strcasecmp (type, "indirect") == 0)
13173 align_branch |= align_branch_indirect_bit;
13174 else
13175 as_fatal (_("invalid -malign-branch= option: `%s'"), arg);
13176 type = next;
13177 }
13178 while (next != NULL);
13179 free (saved);
13180 break;
13181
76cf450b
L
13182 case OPTION_MBRANCHES_WITH_32B_BOUNDARIES:
13183 align_branch_power = 5;
13184 align_branch_prefix_size = 5;
13185 align_branch = (align_branch_jcc_bit
13186 | align_branch_fused_bit
13187 | align_branch_jmp_bit);
13188 break;
13189
5db04b09 13190 case OPTION_MAMD64:
4b5aaf5f 13191 isa64 = amd64;
5db04b09
L
13192 break;
13193
13194 case OPTION_MINTEL64:
4b5aaf5f 13195 isa64 = intel64;
5db04b09
L
13196 break;
13197
b6f8c7c4
L
13198 case 'O':
13199 if (arg == NULL)
13200 {
13201 optimize = 1;
13202 /* Turn off -Os. */
13203 optimize_for_space = 0;
13204 }
13205 else if (*arg == 's')
13206 {
13207 optimize_for_space = 1;
13208 /* Turn on all encoding optimizations. */
41fd2579 13209 optimize = INT_MAX;
b6f8c7c4
L
13210 }
13211 else
13212 {
13213 optimize = atoi (arg);
13214 /* Turn off -Os. */
13215 optimize_for_space = 0;
13216 }
13217 break;
13218
252b5132
RH
13219 default:
13220 return 0;
13221 }
13222 return 1;
13223}
13224
8a2c8fef
L
13225#define MESSAGE_TEMPLATE \
13226" "
13227
293f5f65
L
13228static char *
13229output_message (FILE *stream, char *p, char *message, char *start,
13230 int *left_p, const char *name, int len)
13231{
13232 int size = sizeof (MESSAGE_TEMPLATE);
13233 int left = *left_p;
13234
13235 /* Reserve 2 spaces for ", " or ",\0" */
13236 left -= len + 2;
13237
13238 /* Check if there is any room. */
13239 if (left >= 0)
13240 {
13241 if (p != start)
13242 {
13243 *p++ = ',';
13244 *p++ = ' ';
13245 }
13246 p = mempcpy (p, name, len);
13247 }
13248 else
13249 {
13250 /* Output the current message now and start a new one. */
13251 *p++ = ',';
13252 *p = '\0';
13253 fprintf (stream, "%s\n", message);
13254 p = start;
13255 left = size - (start - message) - len - 2;
13256
13257 gas_assert (left >= 0);
13258
13259 p = mempcpy (p, name, len);
13260 }
13261
13262 *left_p = left;
13263 return p;
13264}
13265
8a2c8fef 13266static void
1ded5609 13267show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
13268{
13269 static char message[] = MESSAGE_TEMPLATE;
13270 char *start = message + 27;
13271 char *p;
13272 int size = sizeof (MESSAGE_TEMPLATE);
13273 int left;
13274 const char *name;
13275 int len;
13276 unsigned int j;
13277
13278 p = start;
13279 left = size - (start - message);
13280 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
13281 {
13282 /* Should it be skipped? */
13283 if (cpu_arch [j].skip)
13284 continue;
13285
13286 name = cpu_arch [j].name;
13287 len = cpu_arch [j].len;
13288 if (*name == '.')
13289 {
13290 /* It is an extension. Skip if we aren't asked to show it. */
13291 if (ext)
13292 {
13293 name++;
13294 len--;
13295 }
13296 else
13297 continue;
13298 }
13299 else if (ext)
13300 {
13301 /* It is an processor. Skip if we show only extension. */
13302 continue;
13303 }
1ded5609
JB
13304 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
13305 {
13306 /* It is an impossible processor - skip. */
13307 continue;
13308 }
8a2c8fef 13309
293f5f65 13310 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
13311 }
13312
293f5f65
L
13313 /* Display disabled extensions. */
13314 if (ext)
13315 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13316 {
13317 name = cpu_noarch [j].name;
13318 len = cpu_noarch [j].len;
13319 p = output_message (stream, p, message, start, &left, name,
13320 len);
13321 }
13322
8a2c8fef
L
13323 *p = '\0';
13324 fprintf (stream, "%s\n", message);
13325}
13326
252b5132 13327void
8a2c8fef 13328md_show_usage (FILE *stream)
252b5132 13329{
4cc782b5
ILT
13330#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13331 fprintf (stream, _("\
d4693039 13332 -Qy, -Qn ignored\n\
a38cf1db 13333 -V print assembler version number\n\
b3b91714
AM
13334 -k ignored\n"));
13335#endif
13336 fprintf (stream, _("\
12b55ccc 13337 -n Do not optimize code alignment\n\
b3b91714
AM
13338 -q quieten some warnings\n"));
13339#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13340 fprintf (stream, _("\
a38cf1db 13341 -s ignored\n"));
b3b91714 13342#endif
d7f449c0
L
13343#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
13344 || defined (TE_PE) || defined (TE_PEP))
751d281c 13345 fprintf (stream, _("\
570561f7 13346 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 13347#endif
b3b91714
AM
13348#ifdef SVR4_COMMENT_CHARS
13349 fprintf (stream, _("\
13350 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
13351#else
13352 fprintf (stream, _("\
b3b91714 13353 --divide ignored\n"));
4cc782b5 13354#endif
9103f4f4 13355 fprintf (stream, _("\
6305a203 13356 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 13357 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 13358 show_arch (stream, 0, 1);
8a2c8fef
L
13359 fprintf (stream, _("\
13360 EXTENSION is combination of:\n"));
1ded5609 13361 show_arch (stream, 1, 0);
6305a203 13362 fprintf (stream, _("\
8a2c8fef 13363 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 13364 show_arch (stream, 0, 0);
ba104c83 13365 fprintf (stream, _("\
c0f3af97
L
13366 -msse2avx encode SSE instructions with VEX prefix\n"));
13367 fprintf (stream, _("\
7c5c05ef 13368 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
13369 check SSE instructions\n"));
13370 fprintf (stream, _("\
7c5c05ef 13371 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
13372 check operand combinations for validity\n"));
13373 fprintf (stream, _("\
7c5c05ef
L
13374 -mavxscalar=[128|256] (default: 128)\n\
13375 encode scalar AVX instructions with specific vector\n\
539f890d
L
13376 length\n"));
13377 fprintf (stream, _("\
03751133
L
13378 -mvexwig=[0|1] (default: 0)\n\
13379 encode VEX instructions with specific VEX.W value\n\
13380 for VEX.W bit ignored instructions\n"));
13381 fprintf (stream, _("\
7c5c05ef
L
13382 -mevexlig=[128|256|512] (default: 128)\n\
13383 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
13384 length\n"));
13385 fprintf (stream, _("\
7c5c05ef
L
13386 -mevexwig=[0|1] (default: 0)\n\
13387 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
13388 for EVEX.W bit ignored instructions\n"));
13389 fprintf (stream, _("\
7c5c05ef 13390 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
13391 encode EVEX instructions with specific EVEX.RC value\n\
13392 for SAE-only ignored instructions\n"));
13393 fprintf (stream, _("\
7c5c05ef
L
13394 -mmnemonic=[att|intel] "));
13395 if (SYSV386_COMPAT)
13396 fprintf (stream, _("(default: att)\n"));
13397 else
13398 fprintf (stream, _("(default: intel)\n"));
13399 fprintf (stream, _("\
13400 use AT&T/Intel mnemonic\n"));
ba104c83 13401 fprintf (stream, _("\
7c5c05ef
L
13402 -msyntax=[att|intel] (default: att)\n\
13403 use AT&T/Intel syntax\n"));
ba104c83
L
13404 fprintf (stream, _("\
13405 -mindex-reg support pseudo index registers\n"));
13406 fprintf (stream, _("\
13407 -mnaked-reg don't require `%%' prefix for registers\n"));
13408 fprintf (stream, _("\
7e8b059b 13409 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 13410#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
13411 fprintf (stream, _("\
13412 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
13413 fprintf (stream, _("\
13414 -mx86-used-note=[no|yes] "));
13415 if (DEFAULT_X86_USED_NOTE)
13416 fprintf (stream, _("(default: yes)\n"));
13417 else
13418 fprintf (stream, _("(default: no)\n"));
13419 fprintf (stream, _("\
13420 generate x86 used ISA and feature properties\n"));
13421#endif
13422#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
13423 fprintf (stream, _("\
13424 -mbig-obj generate big object files\n"));
13425#endif
d022bddd 13426 fprintf (stream, _("\
7c5c05ef 13427 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 13428 strip all lock prefixes\n"));
5db04b09 13429 fprintf (stream, _("\
7c5c05ef 13430 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
13431 encode lfence, mfence and sfence as\n\
13432 lock addl $0x0, (%%{re}sp)\n"));
13433 fprintf (stream, _("\
7c5c05ef
L
13434 -mrelax-relocations=[no|yes] "));
13435 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
13436 fprintf (stream, _("(default: yes)\n"));
13437 else
13438 fprintf (stream, _("(default: no)\n"));
13439 fprintf (stream, _("\
0cb4071e
L
13440 generate relax relocations\n"));
13441 fprintf (stream, _("\
e379e5f3
L
13442 -malign-branch-boundary=NUM (default: 0)\n\
13443 align branches within NUM byte boundary\n"));
13444 fprintf (stream, _("\
13445 -malign-branch=TYPE[+TYPE...] (default: jcc+fused+jmp)\n\
13446 TYPE is combination of jcc, fused, jmp, call, ret,\n\
13447 indirect\n\
13448 specify types of branches to align\n"));
13449 fprintf (stream, _("\
13450 -malign-branch-prefix-size=NUM (default: 5)\n\
13451 align branches with NUM prefixes per instruction\n"));
13452 fprintf (stream, _("\
76cf450b
L
13453 -mbranches-within-32B-boundaries\n\
13454 align branches within 32 byte boundary\n"));
13455 fprintf (stream, _("\
ae531041
L
13456 -mlfence-after-load=[no|yes] (default: no)\n\
13457 generate lfence after load\n"));
13458 fprintf (stream, _("\
13459 -mlfence-before-indirect-branch=[none|all|register|memory] (default: none)\n\
13460 generate lfence before indirect near branch\n"));
13461 fprintf (stream, _("\
a09f656b 13462 -mlfence-before-ret=[none|or|not|shl|yes] (default: none)\n\
ae531041
L
13463 generate lfence before ret\n"));
13464 fprintf (stream, _("\
7c5c05ef 13465 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
13466 fprintf (stream, _("\
13467 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
13468}
13469
3e73aa7c 13470#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 13471 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 13472 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
13473
13474/* Pick the target format to use. */
13475
47926f60 13476const char *
e3bb37b5 13477i386_target_format (void)
252b5132 13478{
351f65ca
L
13479 if (!strncmp (default_arch, "x86_64", 6))
13480 {
13481 update_code_flag (CODE_64BIT, 1);
13482 if (default_arch[6] == '\0')
7f56bc95 13483 x86_elf_abi = X86_64_ABI;
351f65ca 13484 else
7f56bc95 13485 x86_elf_abi = X86_64_X32_ABI;
351f65ca 13486 }
3e73aa7c 13487 else if (!strcmp (default_arch, "i386"))
78f12dd3 13488 update_code_flag (CODE_32BIT, 1);
5197d474
L
13489 else if (!strcmp (default_arch, "iamcu"))
13490 {
13491 update_code_flag (CODE_32BIT, 1);
13492 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
13493 {
13494 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
13495 cpu_arch_name = "iamcu";
13496 cpu_sub_arch_name = NULL;
13497 cpu_arch_flags = iamcu_flags;
13498 cpu_arch_isa = PROCESSOR_IAMCU;
13499 cpu_arch_isa_flags = iamcu_flags;
13500 if (!cpu_arch_tune_set)
13501 {
13502 cpu_arch_tune = cpu_arch_isa;
13503 cpu_arch_tune_flags = cpu_arch_isa_flags;
13504 }
13505 }
8d471ec1 13506 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
13507 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
13508 cpu_arch_name);
13509 }
3e73aa7c 13510 else
2b5d6a91 13511 as_fatal (_("unknown architecture"));
89507696
JB
13512
13513 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
13514 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13515 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
13516 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13517
252b5132
RH
13518 switch (OUTPUT_FLAVOR)
13519 {
9384f2ff 13520#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 13521 case bfd_target_aout_flavour:
47926f60 13522 return AOUT_TARGET_FORMAT;
4c63da97 13523#endif
9384f2ff
AM
13524#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
13525# if defined (TE_PE) || defined (TE_PEP)
13526 case bfd_target_coff_flavour:
167ad85b
TG
13527 if (flag_code == CODE_64BIT)
13528 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
13529 else
251dae91 13530 return use_big_obj ? "pe-bigobj-i386" : "pe-i386";
9384f2ff 13531# elif defined (TE_GO32)
0561d57c
JK
13532 case bfd_target_coff_flavour:
13533 return "coff-go32";
9384f2ff 13534# else
252b5132
RH
13535 case bfd_target_coff_flavour:
13536 return "coff-i386";
9384f2ff 13537# endif
4c63da97 13538#endif
3e73aa7c 13539#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 13540 case bfd_target_elf_flavour:
3e73aa7c 13541 {
351f65ca
L
13542 const char *format;
13543
13544 switch (x86_elf_abi)
4fa24527 13545 {
351f65ca
L
13546 default:
13547 format = ELF_TARGET_FORMAT;
e379e5f3
L
13548#ifndef TE_SOLARIS
13549 tls_get_addr = "___tls_get_addr";
13550#endif
351f65ca 13551 break;
7f56bc95 13552 case X86_64_ABI:
351f65ca 13553 use_rela_relocations = 1;
4fa24527 13554 object_64bit = 1;
e379e5f3
L
13555#ifndef TE_SOLARIS
13556 tls_get_addr = "__tls_get_addr";
13557#endif
351f65ca
L
13558 format = ELF_TARGET_FORMAT64;
13559 break;
7f56bc95 13560 case X86_64_X32_ABI:
4fa24527 13561 use_rela_relocations = 1;
351f65ca 13562 object_64bit = 1;
e379e5f3
L
13563#ifndef TE_SOLARIS
13564 tls_get_addr = "__tls_get_addr";
13565#endif
862be3fb 13566 disallow_64bit_reloc = 1;
351f65ca
L
13567 format = ELF_TARGET_FORMAT32;
13568 break;
4fa24527 13569 }
3632d14b 13570 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 13571 {
7f56bc95 13572 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
13573 as_fatal (_("Intel L1OM is 64bit only"));
13574 return ELF_TARGET_L1OM_FORMAT;
13575 }
b49f93f6 13576 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
13577 {
13578 if (x86_elf_abi != X86_64_ABI)
13579 as_fatal (_("Intel K1OM is 64bit only"));
13580 return ELF_TARGET_K1OM_FORMAT;
13581 }
81486035
L
13582 else if (cpu_arch_isa == PROCESSOR_IAMCU)
13583 {
13584 if (x86_elf_abi != I386_ABI)
13585 as_fatal (_("Intel MCU is 32bit only"));
13586 return ELF_TARGET_IAMCU_FORMAT;
13587 }
8a9036a4 13588 else
351f65ca 13589 return format;
3e73aa7c 13590 }
e57f8c65
TG
13591#endif
13592#if defined (OBJ_MACH_O)
13593 case bfd_target_mach_o_flavour:
d382c579
TG
13594 if (flag_code == CODE_64BIT)
13595 {
13596 use_rela_relocations = 1;
13597 object_64bit = 1;
13598 return "mach-o-x86-64";
13599 }
13600 else
13601 return "mach-o-i386";
4c63da97 13602#endif
252b5132
RH
13603 default:
13604 abort ();
13605 return NULL;
13606 }
13607}
13608
47926f60 13609#endif /* OBJ_MAYBE_ more than one */
252b5132 13610\f
252b5132 13611symbolS *
7016a5d5 13612md_undefined_symbol (char *name)
252b5132 13613{
18dc2407
ILT
13614 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
13615 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
13616 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
13617 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
13618 {
13619 if (!GOT_symbol)
13620 {
13621 if (symbol_find (name))
13622 as_bad (_("GOT already in symbol table"));
13623 GOT_symbol = symbol_new (name, undefined_section,
13624 (valueT) 0, &zero_address_frag);
13625 };
13626 return GOT_symbol;
13627 }
252b5132
RH
13628 return 0;
13629}
13630
13631/* Round up a section size to the appropriate boundary. */
47926f60 13632
252b5132 13633valueT
7016a5d5 13634md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 13635{
4c63da97
AM
13636#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
13637 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
13638 {
13639 /* For a.out, force the section size to be aligned. If we don't do
13640 this, BFD will align it for us, but it will not write out the
13641 final bytes of the section. This may be a bug in BFD, but it is
13642 easier to fix it here since that is how the other a.out targets
13643 work. */
13644 int align;
13645
fd361982 13646 align = bfd_section_alignment (segment);
8d3842cd 13647 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 13648 }
252b5132
RH
13649#endif
13650
13651 return size;
13652}
13653
13654/* On the i386, PC-relative offsets are relative to the start of the
13655 next instruction. That is, the address of the offset, plus its
13656 size, since the offset is always the last part of the insn. */
13657
13658long
e3bb37b5 13659md_pcrel_from (fixS *fixP)
252b5132
RH
13660{
13661 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
13662}
13663
13664#ifndef I386COFF
13665
13666static void
e3bb37b5 13667s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 13668{
29b0f896 13669 int temp;
252b5132 13670
8a75718c
JB
13671#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13672 if (IS_ELF)
13673 obj_elf_section_change_hook ();
13674#endif
252b5132
RH
13675 temp = get_absolute_expression ();
13676 subseg_set (bss_section, (subsegT) temp);
13677 demand_empty_rest_of_line ();
13678}
13679
13680#endif
13681
e379e5f3
L
13682/* Remember constant directive. */
13683
13684void
13685i386_cons_align (int ignore ATTRIBUTE_UNUSED)
13686{
13687 if (last_insn.kind != last_insn_directive
13688 && (bfd_section_flags (now_seg) & SEC_CODE))
13689 {
13690 last_insn.seg = now_seg;
13691 last_insn.kind = last_insn_directive;
13692 last_insn.name = "constant directive";
13693 last_insn.file = as_where (&last_insn.line);
ae531041
L
13694 if (lfence_before_ret != lfence_before_ret_none)
13695 {
13696 if (lfence_before_indirect_branch != lfence_branch_none)
13697 as_warn (_("constant directive skips -mlfence-before-ret "
13698 "and -mlfence-before-indirect-branch"));
13699 else
13700 as_warn (_("constant directive skips -mlfence-before-ret"));
13701 }
13702 else if (lfence_before_indirect_branch != lfence_branch_none)
13703 as_warn (_("constant directive skips -mlfence-before-indirect-branch"));
e379e5f3
L
13704 }
13705}
13706
252b5132 13707void
e3bb37b5 13708i386_validate_fix (fixS *fixp)
252b5132 13709{
02a86693 13710 if (fixp->fx_subsy)
252b5132 13711 {
02a86693 13712 if (fixp->fx_subsy == GOT_symbol)
23df1078 13713 {
02a86693
L
13714 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
13715 {
13716 if (!object_64bit)
13717 abort ();
13718#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13719 if (fixp->fx_tcbit2)
56ceb5b5
L
13720 fixp->fx_r_type = (fixp->fx_tcbit
13721 ? BFD_RELOC_X86_64_REX_GOTPCRELX
13722 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
13723 else
13724#endif
13725 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
13726 }
d6ab8113 13727 else
02a86693
L
13728 {
13729 if (!object_64bit)
13730 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
13731 else
13732 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
13733 }
13734 fixp->fx_subsy = 0;
23df1078 13735 }
252b5132 13736 }
02a86693
L
13737#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13738 else if (!object_64bit)
13739 {
13740 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
13741 && fixp->fx_tcbit2)
13742 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
13743 }
13744#endif
252b5132
RH
13745}
13746
252b5132 13747arelent *
7016a5d5 13748tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
13749{
13750 arelent *rel;
13751 bfd_reloc_code_real_type code;
13752
13753 switch (fixp->fx_r_type)
13754 {
8ce3d284 13755#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
13756 case BFD_RELOC_SIZE32:
13757 case BFD_RELOC_SIZE64:
13758 if (S_IS_DEFINED (fixp->fx_addsy)
13759 && !S_IS_EXTERNAL (fixp->fx_addsy))
13760 {
13761 /* Resolve size relocation against local symbol to size of
13762 the symbol plus addend. */
13763 valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
13764 if (fixp->fx_r_type == BFD_RELOC_SIZE32
13765 && !fits_in_unsigned_long (value))
13766 as_bad_where (fixp->fx_file, fixp->fx_line,
13767 _("symbol size computation overflow"));
13768 fixp->fx_addsy = NULL;
13769 fixp->fx_subsy = NULL;
13770 md_apply_fix (fixp, (valueT *) &value, NULL);
13771 return NULL;
13772 }
8ce3d284 13773#endif
1a0670f3 13774 /* Fall through. */
8fd4256d 13775
3e73aa7c
JH
13776 case BFD_RELOC_X86_64_PLT32:
13777 case BFD_RELOC_X86_64_GOT32:
13778 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
13779 case BFD_RELOC_X86_64_GOTPCRELX:
13780 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
13781 case BFD_RELOC_386_PLT32:
13782 case BFD_RELOC_386_GOT32:
02a86693 13783 case BFD_RELOC_386_GOT32X:
252b5132
RH
13784 case BFD_RELOC_386_GOTOFF:
13785 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
13786 case BFD_RELOC_386_TLS_GD:
13787 case BFD_RELOC_386_TLS_LDM:
13788 case BFD_RELOC_386_TLS_LDO_32:
13789 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
13790 case BFD_RELOC_386_TLS_IE:
13791 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
13792 case BFD_RELOC_386_TLS_LE_32:
13793 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
13794 case BFD_RELOC_386_TLS_GOTDESC:
13795 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
13796 case BFD_RELOC_X86_64_TLSGD:
13797 case BFD_RELOC_X86_64_TLSLD:
13798 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 13799 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
13800 case BFD_RELOC_X86_64_GOTTPOFF:
13801 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
13802 case BFD_RELOC_X86_64_TPOFF64:
13803 case BFD_RELOC_X86_64_GOTOFF64:
13804 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
13805 case BFD_RELOC_X86_64_GOT64:
13806 case BFD_RELOC_X86_64_GOTPCREL64:
13807 case BFD_RELOC_X86_64_GOTPC64:
13808 case BFD_RELOC_X86_64_GOTPLT64:
13809 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
13810 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
13811 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
13812 case BFD_RELOC_RVA:
13813 case BFD_RELOC_VTABLE_ENTRY:
13814 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
13815#ifdef TE_PE
13816 case BFD_RELOC_32_SECREL:
13817#endif
252b5132
RH
13818 code = fixp->fx_r_type;
13819 break;
dbbaec26
L
13820 case BFD_RELOC_X86_64_32S:
13821 if (!fixp->fx_pcrel)
13822 {
13823 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
13824 code = fixp->fx_r_type;
13825 break;
13826 }
1a0670f3 13827 /* Fall through. */
252b5132 13828 default:
93382f6d 13829 if (fixp->fx_pcrel)
252b5132 13830 {
93382f6d
AM
13831 switch (fixp->fx_size)
13832 {
13833 default:
b091f402
AM
13834 as_bad_where (fixp->fx_file, fixp->fx_line,
13835 _("can not do %d byte pc-relative relocation"),
13836 fixp->fx_size);
93382f6d
AM
13837 code = BFD_RELOC_32_PCREL;
13838 break;
13839 case 1: code = BFD_RELOC_8_PCREL; break;
13840 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 13841 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
13842#ifdef BFD64
13843 case 8: code = BFD_RELOC_64_PCREL; break;
13844#endif
93382f6d
AM
13845 }
13846 }
13847 else
13848 {
13849 switch (fixp->fx_size)
13850 {
13851 default:
b091f402
AM
13852 as_bad_where (fixp->fx_file, fixp->fx_line,
13853 _("can not do %d byte relocation"),
13854 fixp->fx_size);
93382f6d
AM
13855 code = BFD_RELOC_32;
13856 break;
13857 case 1: code = BFD_RELOC_8; break;
13858 case 2: code = BFD_RELOC_16; break;
13859 case 4: code = BFD_RELOC_32; break;
937149dd 13860#ifdef BFD64
3e73aa7c 13861 case 8: code = BFD_RELOC_64; break;
937149dd 13862#endif
93382f6d 13863 }
252b5132
RH
13864 }
13865 break;
13866 }
252b5132 13867
d182319b
JB
13868 if ((code == BFD_RELOC_32
13869 || code == BFD_RELOC_32_PCREL
13870 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
13871 && GOT_symbol
13872 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 13873 {
4fa24527 13874 if (!object_64bit)
d6ab8113
JB
13875 code = BFD_RELOC_386_GOTPC;
13876 else
13877 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 13878 }
7b81dfbb
AJ
13879 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
13880 && GOT_symbol
13881 && fixp->fx_addsy == GOT_symbol)
13882 {
13883 code = BFD_RELOC_X86_64_GOTPC64;
13884 }
252b5132 13885
add39d23
TS
13886 rel = XNEW (arelent);
13887 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 13888 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
13889
13890 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 13891
3e73aa7c
JH
13892 if (!use_rela_relocations)
13893 {
13894 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
13895 vtable entry to be used in the relocation's section offset. */
13896 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13897 rel->address = fixp->fx_offset;
fbeb56a4
DK
13898#if defined (OBJ_COFF) && defined (TE_PE)
13899 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
13900 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
13901 else
13902#endif
c6682705 13903 rel->addend = 0;
3e73aa7c
JH
13904 }
13905 /* Use the rela in 64bit mode. */
252b5132 13906 else
3e73aa7c 13907 {
862be3fb
L
13908 if (disallow_64bit_reloc)
13909 switch (code)
13910 {
862be3fb
L
13911 case BFD_RELOC_X86_64_DTPOFF64:
13912 case BFD_RELOC_X86_64_TPOFF64:
13913 case BFD_RELOC_64_PCREL:
13914 case BFD_RELOC_X86_64_GOTOFF64:
13915 case BFD_RELOC_X86_64_GOT64:
13916 case BFD_RELOC_X86_64_GOTPCREL64:
13917 case BFD_RELOC_X86_64_GOTPC64:
13918 case BFD_RELOC_X86_64_GOTPLT64:
13919 case BFD_RELOC_X86_64_PLTOFF64:
13920 as_bad_where (fixp->fx_file, fixp->fx_line,
13921 _("cannot represent relocation type %s in x32 mode"),
13922 bfd_get_reloc_code_name (code));
13923 break;
13924 default:
13925 break;
13926 }
13927
062cd5e7
AS
13928 if (!fixp->fx_pcrel)
13929 rel->addend = fixp->fx_offset;
13930 else
13931 switch (code)
13932 {
13933 case BFD_RELOC_X86_64_PLT32:
13934 case BFD_RELOC_X86_64_GOT32:
13935 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
13936 case BFD_RELOC_X86_64_GOTPCRELX:
13937 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
13938 case BFD_RELOC_X86_64_TLSGD:
13939 case BFD_RELOC_X86_64_TLSLD:
13940 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
13941 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
13942 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
13943 rel->addend = fixp->fx_offset - fixp->fx_size;
13944 break;
13945 default:
13946 rel->addend = (section->vma
13947 - fixp->fx_size
13948 + fixp->fx_addnumber
13949 + md_pcrel_from (fixp));
13950 break;
13951 }
3e73aa7c
JH
13952 }
13953
252b5132
RH
13954 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
13955 if (rel->howto == NULL)
13956 {
13957 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 13958 _("cannot represent relocation type %s"),
252b5132
RH
13959 bfd_get_reloc_code_name (code));
13960 /* Set howto to a garbage value so that we can keep going. */
13961 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 13962 gas_assert (rel->howto != NULL);
252b5132
RH
13963 }
13964
13965 return rel;
13966}
13967
ee86248c 13968#include "tc-i386-intel.c"
54cfded0 13969
a60de03c
JB
13970void
13971tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 13972{
a60de03c
JB
13973 int saved_naked_reg;
13974 char saved_register_dot;
54cfded0 13975
a60de03c
JB
13976 saved_naked_reg = allow_naked_reg;
13977 allow_naked_reg = 1;
13978 saved_register_dot = register_chars['.'];
13979 register_chars['.'] = '.';
13980 allow_pseudo_reg = 1;
13981 expression_and_evaluate (exp);
13982 allow_pseudo_reg = 0;
13983 register_chars['.'] = saved_register_dot;
13984 allow_naked_reg = saved_naked_reg;
13985
e96d56a1 13986 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 13987 {
a60de03c
JB
13988 if ((addressT) exp->X_add_number < i386_regtab_size)
13989 {
13990 exp->X_op = O_constant;
13991 exp->X_add_number = i386_regtab[exp->X_add_number]
13992 .dw2_regnum[flag_code >> 1];
13993 }
13994 else
13995 exp->X_op = O_illegal;
54cfded0 13996 }
54cfded0
AM
13997}
13998
13999void
14000tc_x86_frame_initial_instructions (void)
14001{
a60de03c
JB
14002 static unsigned int sp_regno[2];
14003
14004 if (!sp_regno[flag_code >> 1])
14005 {
14006 char *saved_input = input_line_pointer;
14007 char sp[][4] = {"esp", "rsp"};
14008 expressionS exp;
a4447b93 14009
a60de03c
JB
14010 input_line_pointer = sp[flag_code >> 1];
14011 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 14012 gas_assert (exp.X_op == O_constant);
a60de03c
JB
14013 sp_regno[flag_code >> 1] = exp.X_add_number;
14014 input_line_pointer = saved_input;
14015 }
a4447b93 14016
61ff971f
L
14017 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
14018 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 14019}
d2b2c203 14020
d7921315
L
14021int
14022x86_dwarf2_addr_size (void)
14023{
14024#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
14025 if (x86_elf_abi == X86_64_X32_ABI)
14026 return 4;
14027#endif
14028 return bfd_arch_bits_per_address (stdoutput) / 8;
14029}
14030
d2b2c203
DJ
14031int
14032i386_elf_section_type (const char *str, size_t len)
14033{
14034 if (flag_code == CODE_64BIT
14035 && len == sizeof ("unwind") - 1
14036 && strncmp (str, "unwind", 6) == 0)
14037 return SHT_X86_64_UNWIND;
14038
14039 return -1;
14040}
bb41ade5 14041
ad5fec3b
EB
14042#ifdef TE_SOLARIS
14043void
14044i386_solaris_fix_up_eh_frame (segT sec)
14045{
14046 if (flag_code == CODE_64BIT)
14047 elf_section_type (sec) = SHT_X86_64_UNWIND;
14048}
14049#endif
14050
bb41ade5
AM
14051#ifdef TE_PE
14052void
14053tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
14054{
91d6fa6a 14055 expressionS exp;
bb41ade5 14056
91d6fa6a
NC
14057 exp.X_op = O_secrel;
14058 exp.X_add_symbol = symbol;
14059 exp.X_add_number = 0;
14060 emit_expr (&exp, size);
bb41ade5
AM
14061}
14062#endif
3b22753a
L
14063
14064#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14065/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
14066
01e1a5bc 14067bfd_vma
6d4af3c2 14068x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
14069{
14070 if (flag_code == CODE_64BIT)
14071 {
14072 if (letter == 'l')
14073 return SHF_X86_64_LARGE;
14074
8f3bae45 14075 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 14076 }
3b22753a 14077 else
8f3bae45 14078 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
14079 return -1;
14080}
14081
01e1a5bc 14082bfd_vma
3b22753a
L
14083x86_64_section_word (char *str, size_t len)
14084{
8620418b 14085 if (len == 5 && flag_code == CODE_64BIT && CONST_STRNEQ (str, "large"))
3b22753a
L
14086 return SHF_X86_64_LARGE;
14087
14088 return -1;
14089}
14090
14091static void
14092handle_large_common (int small ATTRIBUTE_UNUSED)
14093{
14094 if (flag_code != CODE_64BIT)
14095 {
14096 s_comm_internal (0, elf_common_parse);
14097 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
14098 }
14099 else
14100 {
14101 static segT lbss_section;
14102 asection *saved_com_section_ptr = elf_com_section_ptr;
14103 asection *saved_bss_section = bss_section;
14104
14105 if (lbss_section == NULL)
14106 {
14107 flagword applicable;
14108 segT seg = now_seg;
14109 subsegT subseg = now_subseg;
14110
14111 /* The .lbss section is for local .largecomm symbols. */
14112 lbss_section = subseg_new (".lbss", 0);
14113 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 14114 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
14115 seg_info (lbss_section)->bss = 1;
14116
14117 subseg_set (seg, subseg);
14118 }
14119
14120 elf_com_section_ptr = &_bfd_elf_large_com_section;
14121 bss_section = lbss_section;
14122
14123 s_comm_internal (0, elf_common_parse);
14124
14125 elf_com_section_ptr = saved_com_section_ptr;
14126 bss_section = saved_bss_section;
14127 }
14128}
14129#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
This page took 2.663349 seconds and 4 git commands to generate.