gdb: handle non-const property types in ada_modulus (PR ada/26318)
[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 292 unsupported,
260cd341 293 invalid_sib_address,
6c30d220 294 invalid_vsib_address,
7bab8ab5 295 invalid_vector_register_set,
260cd341 296 invalid_tmm_register_set,
43234a1e
L
297 unsupported_vector_index_register,
298 unsupported_broadcast,
43234a1e
L
299 broadcast_needed,
300 unsupported_masking,
301 mask_not_on_destination,
302 no_default_mask,
303 unsupported_rc_sae,
304 rc_sae_operand_not_last_imm,
305 invalid_register_operand,
a65babc9
L
306 };
307
252b5132
RH
308struct _i386_insn
309 {
47926f60 310 /* TM holds the template for the insn were currently assembling. */
d3ce72d0 311 insn_template tm;
252b5132 312
7d5e4556
L
313 /* SUFFIX holds the instruction size suffix for byte, word, dword
314 or qword, if given. */
252b5132
RH
315 char suffix;
316
47926f60 317 /* OPERANDS gives the number of given operands. */
252b5132
RH
318 unsigned int operands;
319
320 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
321 of given register, displacement, memory operands and immediate
47926f60 322 operands. */
252b5132
RH
323 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
324
325 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 326 use OP[i] for the corresponding operand. */
40fb9820 327 i386_operand_type types[MAX_OPERANDS];
252b5132 328
520dc8e8
AM
329 /* Displacement expression, immediate expression, or register for each
330 operand. */
331 union i386_op op[MAX_OPERANDS];
252b5132 332
3e73aa7c
JH
333 /* Flags for operands. */
334 unsigned int flags[MAX_OPERANDS];
335#define Operand_PCrel 1
c48dadc9 336#define Operand_Mem 2
3e73aa7c 337
252b5132 338 /* Relocation type for operand */
f86103b7 339 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 340
252b5132
RH
341 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
342 the base index byte below. */
343 const reg_entry *base_reg;
344 const reg_entry *index_reg;
345 unsigned int log2_scale_factor;
346
347 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 348 explicit segment overrides are given. */
ce8a8b2f 349 const seg_entry *seg[2];
252b5132 350
8325cc63
JB
351 /* Copied first memory operand string, for re-checking. */
352 char *memop1_string;
353
252b5132
RH
354 /* PREFIX holds all the given prefix opcodes (usually null).
355 PREFIXES is the number of prefix opcodes. */
356 unsigned int prefixes;
357 unsigned char prefix[MAX_PREFIXES];
358
50128d0c
JB
359 /* Register is in low 3 bits of opcode. */
360 bfd_boolean short_form;
361
6f2f06be
JB
362 /* The operand to a branch insn indicates an absolute branch. */
363 bfd_boolean jumpabsolute;
364
921eafea
L
365 /* Extended states. */
366 enum
367 {
368 /* Use MMX state. */
369 xstate_mmx = 1 << 0,
370 /* Use XMM state. */
371 xstate_xmm = 1 << 1,
372 /* Use YMM state. */
373 xstate_ymm = 1 << 2 | xstate_xmm,
374 /* Use ZMM state. */
375 xstate_zmm = 1 << 3 | xstate_ymm,
376 /* Use TMM state. */
377 xstate_tmm = 1 << 4
378 } xstate;
260cd341 379
e379e5f3
L
380 /* Has GOTPC or TLS relocation. */
381 bfd_boolean has_gotpc_tls_reloc;
382
252b5132 383 /* RM and SIB are the modrm byte and the sib byte where the
c1e679ec 384 addressing modes of this insn are encoded. */
252b5132 385 modrm_byte rm;
3e73aa7c 386 rex_byte rex;
43234a1e 387 rex_byte vrex;
252b5132 388 sib_byte sib;
c0f3af97 389 vex_prefix vex;
b6169b20 390
43234a1e
L
391 /* Masking attributes. */
392 struct Mask_Operation *mask;
393
394 /* Rounding control and SAE attributes. */
395 struct RC_Operation *rounding;
396
397 /* Broadcasting attributes. */
398 struct Broadcast_Operation *broadcast;
399
400 /* Compressed disp8*N attribute. */
401 unsigned int memshift;
402
86fa6981
L
403 /* Prefer load or store in encoding. */
404 enum
405 {
406 dir_encoding_default = 0,
407 dir_encoding_load,
64c49ab3
JB
408 dir_encoding_store,
409 dir_encoding_swap
86fa6981 410 } dir_encoding;
891edac4 411
a501d77e
L
412 /* Prefer 8bit or 32bit displacement in encoding. */
413 enum
414 {
415 disp_encoding_default = 0,
416 disp_encoding_8bit,
417 disp_encoding_32bit
418 } disp_encoding;
f8a5c266 419
6b6b6807
L
420 /* Prefer the REX byte in encoding. */
421 bfd_boolean rex_encoding;
422
b6f8c7c4
L
423 /* Disable instruction size optimization. */
424 bfd_boolean no_optimize;
425
86fa6981
L
426 /* How to encode vector instructions. */
427 enum
428 {
429 vex_encoding_default = 0,
42e04b36 430 vex_encoding_vex,
86fa6981 431 vex_encoding_vex3,
da4977e0
JB
432 vex_encoding_evex,
433 vex_encoding_error
86fa6981
L
434 } vec_encoding;
435
d5de92cf
L
436 /* REP prefix. */
437 const char *rep_prefix;
438
165de32a
L
439 /* HLE prefix. */
440 const char *hle_prefix;
42164a71 441
7e8b059b
L
442 /* Have BND prefix. */
443 const char *bnd_prefix;
444
04ef582a
L
445 /* Have NOTRACK prefix. */
446 const char *notrack_prefix;
447
891edac4 448 /* Error message. */
a65babc9 449 enum i386_error error;
252b5132
RH
450 };
451
452typedef struct _i386_insn i386_insn;
453
43234a1e
L
454/* Link RC type with corresponding string, that'll be looked for in
455 asm. */
456struct RC_name
457{
458 enum rc_type type;
459 const char *name;
460 unsigned int len;
461};
462
463static const struct RC_name RC_NamesTable[] =
464{
465 { rne, STRING_COMMA_LEN ("rn-sae") },
466 { rd, STRING_COMMA_LEN ("rd-sae") },
467 { ru, STRING_COMMA_LEN ("ru-sae") },
468 { rz, STRING_COMMA_LEN ("rz-sae") },
469 { saeonly, STRING_COMMA_LEN ("sae") },
470};
471
252b5132
RH
472/* List of chars besides those in app.c:symbol_chars that can start an
473 operand. Used to prevent the scrubber eating vital white-space. */
86fa6981 474const char extra_symbol_chars[] = "*%-([{}"
252b5132 475#ifdef LEX_AT
32137342
NC
476 "@"
477#endif
478#ifdef LEX_QM
479 "?"
252b5132 480#endif
32137342 481 ;
252b5132 482
b3983e5f
JB
483#if ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
484 && !defined (TE_GNU) \
485 && !defined (TE_LINUX) \
486 && !defined (TE_FreeBSD) \
487 && !defined (TE_DragonFly) \
488 && !defined (TE_NetBSD))
252b5132 489/* This array holds the chars that always start a comment. If the
b3b91714
AM
490 pre-processor is disabled, these aren't very useful. The option
491 --divide will remove '/' from this list. */
492const char *i386_comment_chars = "#/";
493#define SVR4_COMMENT_CHARS 1
252b5132 494#define PREFIX_SEPARATOR '\\'
252b5132 495
b3b91714
AM
496#else
497const char *i386_comment_chars = "#";
498#define PREFIX_SEPARATOR '/'
499#endif
500
252b5132
RH
501/* This array holds the chars that only start a comment at the beginning of
502 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
503 .line and .file directives will appear in the pre-processed output.
504 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 505 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
506 #NO_APP at the beginning of its output.
507 Also note that comments started like this one will always work if
252b5132 508 '/' isn't otherwise defined. */
b3b91714 509const char line_comment_chars[] = "#/";
252b5132 510
63a0b638 511const char line_separator_chars[] = ";";
252b5132 512
ce8a8b2f
AM
513/* Chars that can be used to separate mant from exp in floating point
514 nums. */
252b5132
RH
515const char EXP_CHARS[] = "eE";
516
ce8a8b2f
AM
517/* Chars that mean this number is a floating point constant
518 As in 0f12.456
519 or 0d1.2345e12. */
252b5132
RH
520const char FLT_CHARS[] = "fFdDxX";
521
ce8a8b2f 522/* Tables for lexical analysis. */
252b5132
RH
523static char mnemonic_chars[256];
524static char register_chars[256];
525static char operand_chars[256];
526static char identifier_chars[256];
527static char digit_chars[256];
528
ce8a8b2f 529/* Lexical macros. */
252b5132
RH
530#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
531#define is_operand_char(x) (operand_chars[(unsigned char) x])
532#define is_register_char(x) (register_chars[(unsigned char) x])
533#define is_space_char(x) ((x) == ' ')
534#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
535#define is_digit_char(x) (digit_chars[(unsigned char) x])
536
0234cb7c 537/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
538static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
539
540/* md_assemble() always leaves the strings it's passed unaltered. To
541 effect this we maintain a stack of saved characters that we've smashed
542 with '\0's (indicating end of strings for various sub-fields of the
47926f60 543 assembler instruction). */
252b5132 544static char save_stack[32];
ce8a8b2f 545static char *save_stack_p;
252b5132
RH
546#define END_STRING_AND_SAVE(s) \
547 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
548#define RESTORE_END_STRING(s) \
549 do { *(s) = *--save_stack_p; } while (0)
550
47926f60 551/* The instruction we're assembling. */
252b5132
RH
552static i386_insn i;
553
554/* Possible templates for current insn. */
555static const templates *current_templates;
556
31b2323c
L
557/* Per instruction expressionS buffers: max displacements & immediates. */
558static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
559static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 560
47926f60 561/* Current operand we are working on. */
ee86248c 562static int this_operand = -1;
252b5132 563
3e73aa7c
JH
564/* We support four different modes. FLAG_CODE variable is used to distinguish
565 these. */
566
567enum flag_code {
568 CODE_32BIT,
569 CODE_16BIT,
570 CODE_64BIT };
571
572static enum flag_code flag_code;
4fa24527 573static unsigned int object_64bit;
862be3fb 574static unsigned int disallow_64bit_reloc;
3e73aa7c 575static int use_rela_relocations = 0;
e379e5f3
L
576/* __tls_get_addr/___tls_get_addr symbol for TLS. */
577static const char *tls_get_addr;
3e73aa7c 578
7af8ed2d
NC
579#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
580 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
581 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
582
351f65ca
L
583/* The ELF ABI to use. */
584enum x86_elf_abi
585{
586 I386_ABI,
7f56bc95
L
587 X86_64_ABI,
588 X86_64_X32_ABI
351f65ca
L
589};
590
591static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 592#endif
351f65ca 593
167ad85b
TG
594#if defined (TE_PE) || defined (TE_PEP)
595/* Use big object file format. */
596static int use_big_obj = 0;
597#endif
598
8dcea932
L
599#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
600/* 1 if generating code for a shared library. */
601static int shared = 0;
602#endif
603
47926f60
KH
604/* 1 for intel syntax,
605 0 if att syntax. */
606static int intel_syntax = 0;
252b5132 607
4b5aaf5f
L
608static enum x86_64_isa
609{
610 amd64 = 1, /* AMD64 ISA. */
611 intel64 /* Intel64 ISA. */
612} isa64;
e89c5eaa 613
1efbbeb4
L
614/* 1 for intel mnemonic,
615 0 if att mnemonic. */
616static int intel_mnemonic = !SYSV386_COMPAT;
617
a60de03c
JB
618/* 1 if pseudo registers are permitted. */
619static int allow_pseudo_reg = 0;
620
47926f60
KH
621/* 1 if register prefix % not required. */
622static int allow_naked_reg = 0;
252b5132 623
33eaf5de 624/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
625 instructions supporting it, even if this prefix wasn't specified
626 explicitly. */
627static int add_bnd_prefix = 0;
628
ba104c83 629/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
630static int allow_index_reg = 0;
631
d022bddd
IT
632/* 1 if the assembler should ignore LOCK prefix, even if it was
633 specified explicitly. */
634static int omit_lock_prefix = 0;
635
e4e00185
AS
636/* 1 if the assembler should encode lfence, mfence, and sfence as
637 "lock addl $0, (%{re}sp)". */
638static int avoid_fence = 0;
639
ae531041
L
640/* 1 if lfence should be inserted after every load. */
641static int lfence_after_load = 0;
642
643/* Non-zero if lfence should be inserted before indirect branch. */
644static enum lfence_before_indirect_branch_kind
645 {
646 lfence_branch_none = 0,
647 lfence_branch_register,
648 lfence_branch_memory,
649 lfence_branch_all
650 }
651lfence_before_indirect_branch;
652
653/* Non-zero if lfence should be inserted before ret. */
654static enum lfence_before_ret_kind
655 {
656 lfence_before_ret_none = 0,
657 lfence_before_ret_not,
a09f656b 658 lfence_before_ret_or,
659 lfence_before_ret_shl
ae531041
L
660 }
661lfence_before_ret;
662
663/* Types of previous instruction is .byte or prefix. */
e379e5f3
L
664static struct
665 {
666 segT seg;
667 const char *file;
668 const char *name;
669 unsigned int line;
670 enum last_insn_kind
671 {
672 last_insn_other = 0,
673 last_insn_directive,
674 last_insn_prefix
675 } kind;
676 } last_insn;
677
0cb4071e
L
678/* 1 if the assembler should generate relax relocations. */
679
680static int generate_relax_relocations
681 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
682
7bab8ab5 683static enum check_kind
daf50ae7 684 {
7bab8ab5
JB
685 check_none = 0,
686 check_warning,
687 check_error
daf50ae7 688 }
7bab8ab5 689sse_check, operand_check = check_warning;
daf50ae7 690
e379e5f3
L
691/* Non-zero if branches should be aligned within power of 2 boundary. */
692static int align_branch_power = 0;
693
694/* Types of branches to align. */
695enum align_branch_kind
696 {
697 align_branch_none = 0,
698 align_branch_jcc = 1,
699 align_branch_fused = 2,
700 align_branch_jmp = 3,
701 align_branch_call = 4,
702 align_branch_indirect = 5,
703 align_branch_ret = 6
704 };
705
706/* Type bits of branches to align. */
707enum align_branch_bit
708 {
709 align_branch_jcc_bit = 1 << align_branch_jcc,
710 align_branch_fused_bit = 1 << align_branch_fused,
711 align_branch_jmp_bit = 1 << align_branch_jmp,
712 align_branch_call_bit = 1 << align_branch_call,
713 align_branch_indirect_bit = 1 << align_branch_indirect,
714 align_branch_ret_bit = 1 << align_branch_ret
715 };
716
717static unsigned int align_branch = (align_branch_jcc_bit
718 | align_branch_fused_bit
719 | align_branch_jmp_bit);
720
79d72f45
HL
721/* Types of condition jump used by macro-fusion. */
722enum mf_jcc_kind
723 {
724 mf_jcc_jo = 0, /* base opcode 0x70 */
725 mf_jcc_jc, /* base opcode 0x72 */
726 mf_jcc_je, /* base opcode 0x74 */
727 mf_jcc_jna, /* base opcode 0x76 */
728 mf_jcc_js, /* base opcode 0x78 */
729 mf_jcc_jp, /* base opcode 0x7a */
730 mf_jcc_jl, /* base opcode 0x7c */
731 mf_jcc_jle, /* base opcode 0x7e */
732 };
733
734/* Types of compare flag-modifying insntructions used by macro-fusion. */
735enum mf_cmp_kind
736 {
737 mf_cmp_test_and, /* test/cmp */
738 mf_cmp_alu_cmp, /* add/sub/cmp */
739 mf_cmp_incdec /* inc/dec */
740 };
741
e379e5f3
L
742/* The maximum padding size for fused jcc. CMP like instruction can
743 be 9 bytes and jcc can be 6 bytes. Leave room just in case for
744 prefixes. */
745#define MAX_FUSED_JCC_PADDING_SIZE 20
746
747/* The maximum number of prefixes added for an instruction. */
748static unsigned int align_branch_prefix_size = 5;
749
b6f8c7c4
L
750/* Optimization:
751 1. Clear the REX_W bit with register operand if possible.
752 2. Above plus use 128bit vector instruction to clear the full vector
753 register.
754 */
755static int optimize = 0;
756
757/* Optimization:
758 1. Clear the REX_W bit with register operand if possible.
759 2. Above plus use 128bit vector instruction to clear the full vector
760 register.
761 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
762 "testb $imm7,%r8".
763 */
764static int optimize_for_space = 0;
765
2ca3ace5
L
766/* Register prefix used for error message. */
767static const char *register_prefix = "%";
768
47926f60
KH
769/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
770 leave, push, and pop instructions so that gcc has the same stack
771 frame as in 32 bit mode. */
772static char stackop_size = '\0';
eecb386c 773
12b55ccc
L
774/* Non-zero to optimize code alignment. */
775int optimize_align_code = 1;
776
47926f60
KH
777/* Non-zero to quieten some warnings. */
778static int quiet_warnings = 0;
a38cf1db 779
47926f60
KH
780/* CPU name. */
781static const char *cpu_arch_name = NULL;
6305a203 782static char *cpu_sub_arch_name = NULL;
a38cf1db 783
47926f60 784/* CPU feature flags. */
40fb9820
L
785static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
786
ccc9c027
L
787/* If we have selected a cpu we are generating instructions for. */
788static int cpu_arch_tune_set = 0;
789
9103f4f4 790/* Cpu we are generating instructions for. */
fbf3f584 791enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4
L
792
793/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 794static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 795
ccc9c027 796/* CPU instruction set architecture used. */
fbf3f584 797enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 798
9103f4f4 799/* CPU feature flags of instruction set architecture used. */
fbf3f584 800i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 801
fddf5b5b
AM
802/* If set, conditional jumps are not automatically promoted to handle
803 larger than a byte offset. */
804static unsigned int no_cond_jump_promotion = 0;
805
c0f3af97
L
806/* Encode SSE instructions with VEX prefix. */
807static unsigned int sse2avx;
808
539f890d
L
809/* Encode scalar AVX instructions with specific vector length. */
810static enum
811 {
812 vex128 = 0,
813 vex256
814 } avxscalar;
815
03751133
L
816/* Encode VEX WIG instructions with specific vex.w. */
817static enum
818 {
819 vexw0 = 0,
820 vexw1
821 } vexwig;
822
43234a1e
L
823/* Encode scalar EVEX LIG instructions with specific vector length. */
824static enum
825 {
826 evexl128 = 0,
827 evexl256,
828 evexl512
829 } evexlig;
830
831/* Encode EVEX WIG instructions with specific evex.w. */
832static enum
833 {
834 evexw0 = 0,
835 evexw1
836 } evexwig;
837
d3d3c6db
IT
838/* Value to encode in EVEX RC bits, for SAE-only instructions. */
839static enum rc_type evexrcig = rne;
840
29b0f896 841/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 842static symbolS *GOT_symbol;
29b0f896 843
a4447b93
RH
844/* The dwarf2 return column, adjusted for 32 or 64 bit. */
845unsigned int x86_dwarf2_return_column;
846
847/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
848int x86_cie_data_alignment;
849
252b5132 850/* Interface to relax_segment.
fddf5b5b
AM
851 There are 3 major relax states for 386 jump insns because the
852 different types of jumps add different sizes to frags when we're
e379e5f3
L
853 figuring out what sort of jump to choose to reach a given label.
854
855 BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING are used to align
856 branches which are handled by md_estimate_size_before_relax() and
857 i386_generic_table_relax_frag(). */
252b5132 858
47926f60 859/* Types. */
93c2a809
AM
860#define UNCOND_JUMP 0
861#define COND_JUMP 1
862#define COND_JUMP86 2
e379e5f3
L
863#define BRANCH_PADDING 3
864#define BRANCH_PREFIX 4
865#define FUSED_JCC_PADDING 5
fddf5b5b 866
47926f60 867/* Sizes. */
252b5132
RH
868#define CODE16 1
869#define SMALL 0
29b0f896 870#define SMALL16 (SMALL | CODE16)
252b5132 871#define BIG 2
29b0f896 872#define BIG16 (BIG | CODE16)
252b5132
RH
873
874#ifndef INLINE
875#ifdef __GNUC__
876#define INLINE __inline__
877#else
878#define INLINE
879#endif
880#endif
881
fddf5b5b
AM
882#define ENCODE_RELAX_STATE(type, size) \
883 ((relax_substateT) (((type) << 2) | (size)))
884#define TYPE_FROM_RELAX_STATE(s) \
885 ((s) >> 2)
886#define DISP_SIZE_FROM_RELAX_STATE(s) \
887 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
888
889/* This table is used by relax_frag to promote short jumps to long
890 ones where necessary. SMALL (short) jumps may be promoted to BIG
891 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
892 don't allow a short jump in a 32 bit code segment to be promoted to
893 a 16 bit offset jump because it's slower (requires data size
894 prefix), and doesn't work, unless the destination is in the bottom
895 64k of the code segment (The top 16 bits of eip are zeroed). */
896
897const relax_typeS md_relax_table[] =
898{
24eab124
AM
899 /* The fields are:
900 1) most positive reach of this state,
901 2) most negative reach of this state,
93c2a809 902 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 903 4) which index into the table to try if we can't fit into this one. */
252b5132 904
fddf5b5b 905 /* UNCOND_JUMP states. */
93c2a809
AM
906 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
907 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
908 /* dword jmp adds 4 bytes to frag:
909 0 extra opcode bytes, 4 displacement bytes. */
252b5132 910 {0, 0, 4, 0},
93c2a809
AM
911 /* word jmp adds 2 byte2 to frag:
912 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
913 {0, 0, 2, 0},
914
93c2a809
AM
915 /* COND_JUMP states. */
916 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
917 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
918 /* dword conditionals adds 5 bytes to frag:
919 1 extra opcode byte, 4 displacement bytes. */
920 {0, 0, 5, 0},
fddf5b5b 921 /* word conditionals add 3 bytes to frag:
93c2a809
AM
922 1 extra opcode byte, 2 displacement bytes. */
923 {0, 0, 3, 0},
924
925 /* COND_JUMP86 states. */
926 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
927 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
928 /* dword conditionals adds 5 bytes to frag:
929 1 extra opcode byte, 4 displacement bytes. */
930 {0, 0, 5, 0},
931 /* word conditionals add 4 bytes to frag:
932 1 displacement byte and a 3 byte long branch insn. */
933 {0, 0, 4, 0}
252b5132
RH
934};
935
9103f4f4
L
936static const arch_entry cpu_arch[] =
937{
89507696
JB
938 /* Do not replace the first two entries - i386_target_format()
939 relies on them being there in this order. */
8a2c8fef 940 { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
293f5f65 941 CPU_GENERIC32_FLAGS, 0 },
8a2c8fef 942 { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
293f5f65 943 CPU_GENERIC64_FLAGS, 0 },
8a2c8fef 944 { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
293f5f65 945 CPU_NONE_FLAGS, 0 },
8a2c8fef 946 { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
293f5f65 947 CPU_I186_FLAGS, 0 },
8a2c8fef 948 { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
293f5f65 949 CPU_I286_FLAGS, 0 },
8a2c8fef 950 { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
293f5f65 951 CPU_I386_FLAGS, 0 },
8a2c8fef 952 { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
293f5f65 953 CPU_I486_FLAGS, 0 },
8a2c8fef 954 { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
293f5f65 955 CPU_I586_FLAGS, 0 },
8a2c8fef 956 { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
293f5f65 957 CPU_I686_FLAGS, 0 },
8a2c8fef 958 { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
293f5f65 959 CPU_I586_FLAGS, 0 },
8a2c8fef 960 { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
293f5f65 961 CPU_PENTIUMPRO_FLAGS, 0 },
8a2c8fef 962 { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
293f5f65 963 CPU_P2_FLAGS, 0 },
8a2c8fef 964 { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
293f5f65 965 CPU_P3_FLAGS, 0 },
8a2c8fef 966 { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
293f5f65 967 CPU_P4_FLAGS, 0 },
8a2c8fef 968 { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
293f5f65 969 CPU_CORE_FLAGS, 0 },
8a2c8fef 970 { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
293f5f65 971 CPU_NOCONA_FLAGS, 0 },
8a2c8fef 972 { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
293f5f65 973 CPU_CORE_FLAGS, 1 },
8a2c8fef 974 { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
293f5f65 975 CPU_CORE_FLAGS, 0 },
8a2c8fef 976 { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
293f5f65 977 CPU_CORE2_FLAGS, 1 },
8a2c8fef 978 { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
293f5f65 979 CPU_CORE2_FLAGS, 0 },
8a2c8fef 980 { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
293f5f65 981 CPU_COREI7_FLAGS, 0 },
8a2c8fef 982 { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
293f5f65 983 CPU_L1OM_FLAGS, 0 },
7a9068fe 984 { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
293f5f65 985 CPU_K1OM_FLAGS, 0 },
81486035 986 { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
293f5f65 987 CPU_IAMCU_FLAGS, 0 },
8a2c8fef 988 { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
293f5f65 989 CPU_K6_FLAGS, 0 },
8a2c8fef 990 { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
293f5f65 991 CPU_K6_2_FLAGS, 0 },
8a2c8fef 992 { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
293f5f65 993 CPU_ATHLON_FLAGS, 0 },
8a2c8fef 994 { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
293f5f65 995 CPU_K8_FLAGS, 1 },
8a2c8fef 996 { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
293f5f65 997 CPU_K8_FLAGS, 0 },
8a2c8fef 998 { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
293f5f65 999 CPU_K8_FLAGS, 0 },
8a2c8fef 1000 { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
293f5f65 1001 CPU_AMDFAM10_FLAGS, 0 },
8aedb9fe 1002 { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
293f5f65 1003 CPU_BDVER1_FLAGS, 0 },
8aedb9fe 1004 { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
293f5f65 1005 CPU_BDVER2_FLAGS, 0 },
5e5c50d3 1006 { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
293f5f65 1007 CPU_BDVER3_FLAGS, 0 },
c7b0bd56 1008 { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
293f5f65 1009 CPU_BDVER4_FLAGS, 0 },
029f3522 1010 { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
293f5f65 1011 CPU_ZNVER1_FLAGS, 0 },
a9660a6f
AP
1012 { STRING_COMMA_LEN ("znver2"), PROCESSOR_ZNVER,
1013 CPU_ZNVER2_FLAGS, 0 },
7b458c12 1014 { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
293f5f65 1015 CPU_BTVER1_FLAGS, 0 },
7b458c12 1016 { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
293f5f65 1017 CPU_BTVER2_FLAGS, 0 },
8a2c8fef 1018 { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
293f5f65 1019 CPU_8087_FLAGS, 0 },
8a2c8fef 1020 { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
293f5f65 1021 CPU_287_FLAGS, 0 },
8a2c8fef 1022 { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
293f5f65 1023 CPU_387_FLAGS, 0 },
1848e567
L
1024 { STRING_COMMA_LEN (".687"), PROCESSOR_UNKNOWN,
1025 CPU_687_FLAGS, 0 },
d871f3f4
L
1026 { STRING_COMMA_LEN (".cmov"), PROCESSOR_UNKNOWN,
1027 CPU_CMOV_FLAGS, 0 },
1028 { STRING_COMMA_LEN (".fxsr"), PROCESSOR_UNKNOWN,
1029 CPU_FXSR_FLAGS, 0 },
8a2c8fef 1030 { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
293f5f65 1031 CPU_MMX_FLAGS, 0 },
8a2c8fef 1032 { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
293f5f65 1033 CPU_SSE_FLAGS, 0 },
8a2c8fef 1034 { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
293f5f65 1035 CPU_SSE2_FLAGS, 0 },
8a2c8fef 1036 { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
293f5f65 1037 CPU_SSE3_FLAGS, 0 },
af5c13b0
L
1038 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
1039 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1040 { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
293f5f65 1041 CPU_SSSE3_FLAGS, 0 },
8a2c8fef 1042 { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
293f5f65 1043 CPU_SSE4_1_FLAGS, 0 },
8a2c8fef 1044 { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
293f5f65 1045 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1046 { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
293f5f65 1047 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 1048 { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
293f5f65 1049 CPU_AVX_FLAGS, 0 },
6c30d220 1050 { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
293f5f65 1051 CPU_AVX2_FLAGS, 0 },
43234a1e 1052 { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
293f5f65 1053 CPU_AVX512F_FLAGS, 0 },
43234a1e 1054 { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
293f5f65 1055 CPU_AVX512CD_FLAGS, 0 },
43234a1e 1056 { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
293f5f65 1057 CPU_AVX512ER_FLAGS, 0 },
43234a1e 1058 { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
293f5f65 1059 CPU_AVX512PF_FLAGS, 0 },
1dfc6506 1060 { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
293f5f65 1061 CPU_AVX512DQ_FLAGS, 0 },
1dfc6506 1062 { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
293f5f65 1063 CPU_AVX512BW_FLAGS, 0 },
1dfc6506 1064 { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
293f5f65 1065 CPU_AVX512VL_FLAGS, 0 },
8a2c8fef 1066 { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
293f5f65 1067 CPU_VMX_FLAGS, 0 },
8729a6f6 1068 { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
293f5f65 1069 CPU_VMFUNC_FLAGS, 0 },
8a2c8fef 1070 { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
293f5f65 1071 CPU_SMX_FLAGS, 0 },
8a2c8fef 1072 { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
293f5f65 1073 CPU_XSAVE_FLAGS, 0 },
c7b8aa3a 1074 { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
293f5f65 1075 CPU_XSAVEOPT_FLAGS, 0 },
1dfc6506 1076 { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
293f5f65 1077 CPU_XSAVEC_FLAGS, 0 },
1dfc6506 1078 { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
293f5f65 1079 CPU_XSAVES_FLAGS, 0 },
8a2c8fef 1080 { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
293f5f65 1081 CPU_AES_FLAGS, 0 },
8a2c8fef 1082 { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
293f5f65 1083 CPU_PCLMUL_FLAGS, 0 },
8a2c8fef 1084 { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
293f5f65 1085 CPU_PCLMUL_FLAGS, 1 },
c7b8aa3a 1086 { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
293f5f65 1087 CPU_FSGSBASE_FLAGS, 0 },
c7b8aa3a 1088 { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
293f5f65 1089 CPU_RDRND_FLAGS, 0 },
c7b8aa3a 1090 { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
293f5f65 1091 CPU_F16C_FLAGS, 0 },
6c30d220 1092 { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
293f5f65 1093 CPU_BMI2_FLAGS, 0 },
8a2c8fef 1094 { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
293f5f65 1095 CPU_FMA_FLAGS, 0 },
8a2c8fef 1096 { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
293f5f65 1097 CPU_FMA4_FLAGS, 0 },
8a2c8fef 1098 { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
293f5f65 1099 CPU_XOP_FLAGS, 0 },
8a2c8fef 1100 { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
293f5f65 1101 CPU_LWP_FLAGS, 0 },
8a2c8fef 1102 { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
293f5f65 1103 CPU_MOVBE_FLAGS, 0 },
60aa667e 1104 { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
293f5f65 1105 CPU_CX16_FLAGS, 0 },
8a2c8fef 1106 { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
293f5f65 1107 CPU_EPT_FLAGS, 0 },
6c30d220 1108 { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
293f5f65 1109 CPU_LZCNT_FLAGS, 0 },
272a84b1
L
1110 { STRING_COMMA_LEN (".popcnt"), PROCESSOR_UNKNOWN,
1111 CPU_POPCNT_FLAGS, 0 },
42164a71 1112 { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
293f5f65 1113 CPU_HLE_FLAGS, 0 },
42164a71 1114 { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
293f5f65 1115 CPU_RTM_FLAGS, 0 },
6c30d220 1116 { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
293f5f65 1117 CPU_INVPCID_FLAGS, 0 },
8a2c8fef 1118 { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
293f5f65 1119 CPU_CLFLUSH_FLAGS, 0 },
22109423 1120 { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
293f5f65 1121 CPU_NOP_FLAGS, 0 },
8a2c8fef 1122 { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
293f5f65 1123 CPU_SYSCALL_FLAGS, 0 },
8a2c8fef 1124 { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
293f5f65 1125 CPU_RDTSCP_FLAGS, 0 },
8a2c8fef 1126 { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
293f5f65 1127 CPU_3DNOW_FLAGS, 0 },
8a2c8fef 1128 { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
293f5f65 1129 CPU_3DNOWA_FLAGS, 0 },
8a2c8fef 1130 { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
293f5f65 1131 CPU_PADLOCK_FLAGS, 0 },
8a2c8fef 1132 { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
293f5f65 1133 CPU_SVME_FLAGS, 1 },
8a2c8fef 1134 { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
293f5f65 1135 CPU_SVME_FLAGS, 0 },
8a2c8fef 1136 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
293f5f65 1137 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1138 { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
293f5f65 1139 CPU_ABM_FLAGS, 0 },
87973e9f 1140 { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
293f5f65 1141 CPU_BMI_FLAGS, 0 },
2a2a0f38 1142 { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
293f5f65 1143 CPU_TBM_FLAGS, 0 },
e2e1fcde 1144 { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
293f5f65 1145 CPU_ADX_FLAGS, 0 },
e2e1fcde 1146 { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
293f5f65 1147 CPU_RDSEED_FLAGS, 0 },
e2e1fcde 1148 { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
293f5f65 1149 CPU_PRFCHW_FLAGS, 0 },
5c111e37 1150 { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
293f5f65 1151 CPU_SMAP_FLAGS, 0 },
7e8b059b 1152 { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
293f5f65 1153 CPU_MPX_FLAGS, 0 },
a0046408 1154 { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
293f5f65 1155 CPU_SHA_FLAGS, 0 },
963f3586 1156 { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
293f5f65 1157 CPU_CLFLUSHOPT_FLAGS, 0 },
dcf893b5 1158 { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
293f5f65 1159 CPU_PREFETCHWT1_FLAGS, 0 },
2cf200a4 1160 { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
293f5f65 1161 CPU_SE1_FLAGS, 0 },
c5e7287a 1162 { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
293f5f65 1163 CPU_CLWB_FLAGS, 0 },
2cc1b5aa 1164 { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
293f5f65 1165 CPU_AVX512IFMA_FLAGS, 0 },
14f195c9 1166 { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
293f5f65 1167 CPU_AVX512VBMI_FLAGS, 0 },
920d2ddc
IT
1168 { STRING_COMMA_LEN (".avx512_4fmaps"), PROCESSOR_UNKNOWN,
1169 CPU_AVX512_4FMAPS_FLAGS, 0 },
47acf0bd
IT
1170 { STRING_COMMA_LEN (".avx512_4vnniw"), PROCESSOR_UNKNOWN,
1171 CPU_AVX512_4VNNIW_FLAGS, 0 },
620214f7
IT
1172 { STRING_COMMA_LEN (".avx512_vpopcntdq"), PROCESSOR_UNKNOWN,
1173 CPU_AVX512_VPOPCNTDQ_FLAGS, 0 },
53467f57
IT
1174 { STRING_COMMA_LEN (".avx512_vbmi2"), PROCESSOR_UNKNOWN,
1175 CPU_AVX512_VBMI2_FLAGS, 0 },
8cfcb765
IT
1176 { STRING_COMMA_LEN (".avx512_vnni"), PROCESSOR_UNKNOWN,
1177 CPU_AVX512_VNNI_FLAGS, 0 },
ee6872be
IT
1178 { STRING_COMMA_LEN (".avx512_bitalg"), PROCESSOR_UNKNOWN,
1179 CPU_AVX512_BITALG_FLAGS, 0 },
029f3522 1180 { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
293f5f65 1181 CPU_CLZERO_FLAGS, 0 },
9916071f 1182 { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
293f5f65 1183 CPU_MWAITX_FLAGS, 0 },
8eab4136 1184 { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
293f5f65 1185 CPU_OSPKE_FLAGS, 0 },
8bc52696 1186 { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
293f5f65 1187 CPU_RDPID_FLAGS, 0 },
6b40c462
L
1188 { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
1189 CPU_PTWRITE_FLAGS, 0 },
d777820b
IT
1190 { STRING_COMMA_LEN (".ibt"), PROCESSOR_UNKNOWN,
1191 CPU_IBT_FLAGS, 0 },
1192 { STRING_COMMA_LEN (".shstk"), PROCESSOR_UNKNOWN,
1193 CPU_SHSTK_FLAGS, 0 },
48521003
IT
1194 { STRING_COMMA_LEN (".gfni"), PROCESSOR_UNKNOWN,
1195 CPU_GFNI_FLAGS, 0 },
8dcf1fad
IT
1196 { STRING_COMMA_LEN (".vaes"), PROCESSOR_UNKNOWN,
1197 CPU_VAES_FLAGS, 0 },
ff1982d5
IT
1198 { STRING_COMMA_LEN (".vpclmulqdq"), PROCESSOR_UNKNOWN,
1199 CPU_VPCLMULQDQ_FLAGS, 0 },
3233d7d0
IT
1200 { STRING_COMMA_LEN (".wbnoinvd"), PROCESSOR_UNKNOWN,
1201 CPU_WBNOINVD_FLAGS, 0 },
be3a8dca
IT
1202 { STRING_COMMA_LEN (".pconfig"), PROCESSOR_UNKNOWN,
1203 CPU_PCONFIG_FLAGS, 0 },
de89d0a3
IT
1204 { STRING_COMMA_LEN (".waitpkg"), PROCESSOR_UNKNOWN,
1205 CPU_WAITPKG_FLAGS, 0 },
c48935d7
IT
1206 { STRING_COMMA_LEN (".cldemote"), PROCESSOR_UNKNOWN,
1207 CPU_CLDEMOTE_FLAGS, 0 },
260cd341
LC
1208 { STRING_COMMA_LEN (".amx_int8"), PROCESSOR_UNKNOWN,
1209 CPU_AMX_INT8_FLAGS, 0 },
1210 { STRING_COMMA_LEN (".amx_bf16"), PROCESSOR_UNKNOWN,
1211 CPU_AMX_BF16_FLAGS, 0 },
1212 { STRING_COMMA_LEN (".amx_tile"), PROCESSOR_UNKNOWN,
1213 CPU_AMX_TILE_FLAGS, 0 },
c0a30a9f
L
1214 { STRING_COMMA_LEN (".movdiri"), PROCESSOR_UNKNOWN,
1215 CPU_MOVDIRI_FLAGS, 0 },
1216 { STRING_COMMA_LEN (".movdir64b"), PROCESSOR_UNKNOWN,
1217 CPU_MOVDIR64B_FLAGS, 0 },
d6aab7a1
XG
1218 { STRING_COMMA_LEN (".avx512_bf16"), PROCESSOR_UNKNOWN,
1219 CPU_AVX512_BF16_FLAGS, 0 },
9186c494
L
1220 { STRING_COMMA_LEN (".avx512_vp2intersect"), PROCESSOR_UNKNOWN,
1221 CPU_AVX512_VP2INTERSECT_FLAGS, 0 },
dd455cf5
L
1222 { STRING_COMMA_LEN (".enqcmd"), PROCESSOR_UNKNOWN,
1223 CPU_ENQCMD_FLAGS, 0 },
4b27d27c
L
1224 { STRING_COMMA_LEN (".serialize"), PROCESSOR_UNKNOWN,
1225 CPU_SERIALIZE_FLAGS, 0 },
142861df
JB
1226 { STRING_COMMA_LEN (".rdpru"), PROCESSOR_UNKNOWN,
1227 CPU_RDPRU_FLAGS, 0 },
1228 { STRING_COMMA_LEN (".mcommit"), PROCESSOR_UNKNOWN,
1229 CPU_MCOMMIT_FLAGS, 0 },
a847e322
JB
1230 { STRING_COMMA_LEN (".sev_es"), PROCESSOR_UNKNOWN,
1231 CPU_SEV_ES_FLAGS, 0 },
bb651e8b
CL
1232 { STRING_COMMA_LEN (".tsxldtrk"), PROCESSOR_UNKNOWN,
1233 CPU_TSXLDTRK_FLAGS, 0 },
293f5f65
L
1234};
1235
1236static const noarch_entry cpu_noarch[] =
1237{
1238 { STRING_COMMA_LEN ("no87"), CPU_ANY_X87_FLAGS },
1848e567
L
1239 { STRING_COMMA_LEN ("no287"), CPU_ANY_287_FLAGS },
1240 { STRING_COMMA_LEN ("no387"), CPU_ANY_387_FLAGS },
1241 { STRING_COMMA_LEN ("no687"), CPU_ANY_687_FLAGS },
d871f3f4
L
1242 { STRING_COMMA_LEN ("nocmov"), CPU_ANY_CMOV_FLAGS },
1243 { STRING_COMMA_LEN ("nofxsr"), CPU_ANY_FXSR_FLAGS },
293f5f65
L
1244 { STRING_COMMA_LEN ("nommx"), CPU_ANY_MMX_FLAGS },
1245 { STRING_COMMA_LEN ("nosse"), CPU_ANY_SSE_FLAGS },
1848e567
L
1246 { STRING_COMMA_LEN ("nosse2"), CPU_ANY_SSE2_FLAGS },
1247 { STRING_COMMA_LEN ("nosse3"), CPU_ANY_SSE3_FLAGS },
af5c13b0 1248 { STRING_COMMA_LEN ("nosse4a"), CPU_ANY_SSE4A_FLAGS },
1848e567
L
1249 { STRING_COMMA_LEN ("nossse3"), CPU_ANY_SSSE3_FLAGS },
1250 { STRING_COMMA_LEN ("nosse4.1"), CPU_ANY_SSE4_1_FLAGS },
1251 { STRING_COMMA_LEN ("nosse4.2"), CPU_ANY_SSE4_2_FLAGS },
af5c13b0 1252 { STRING_COMMA_LEN ("nosse4"), CPU_ANY_SSE4_1_FLAGS },
293f5f65 1253 { STRING_COMMA_LEN ("noavx"), CPU_ANY_AVX_FLAGS },
1848e567 1254 { STRING_COMMA_LEN ("noavx2"), CPU_ANY_AVX2_FLAGS },
144b71e2
L
1255 { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
1256 { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
1257 { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
1258 { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
1259 { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
1260 { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
1261 { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
1262 { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
1263 { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
920d2ddc 1264 { STRING_COMMA_LEN ("noavx512_4fmaps"), CPU_ANY_AVX512_4FMAPS_FLAGS },
47acf0bd 1265 { STRING_COMMA_LEN ("noavx512_4vnniw"), CPU_ANY_AVX512_4VNNIW_FLAGS },
620214f7 1266 { STRING_COMMA_LEN ("noavx512_vpopcntdq"), CPU_ANY_AVX512_VPOPCNTDQ_FLAGS },
53467f57 1267 { STRING_COMMA_LEN ("noavx512_vbmi2"), CPU_ANY_AVX512_VBMI2_FLAGS },
8cfcb765 1268 { STRING_COMMA_LEN ("noavx512_vnni"), CPU_ANY_AVX512_VNNI_FLAGS },
ee6872be 1269 { STRING_COMMA_LEN ("noavx512_bitalg"), CPU_ANY_AVX512_BITALG_FLAGS },
d777820b
IT
1270 { STRING_COMMA_LEN ("noibt"), CPU_ANY_IBT_FLAGS },
1271 { STRING_COMMA_LEN ("noshstk"), CPU_ANY_SHSTK_FLAGS },
260cd341
LC
1272 { STRING_COMMA_LEN ("noamx_int8"), CPU_ANY_AMX_INT8_FLAGS },
1273 { STRING_COMMA_LEN ("noamx_bf16"), CPU_ANY_AMX_BF16_FLAGS },
1274 { STRING_COMMA_LEN ("noamx_tile"), CPU_ANY_AMX_TILE_FLAGS },
c0a30a9f
L
1275 { STRING_COMMA_LEN ("nomovdiri"), CPU_ANY_MOVDIRI_FLAGS },
1276 { STRING_COMMA_LEN ("nomovdir64b"), CPU_ANY_MOVDIR64B_FLAGS },
d6aab7a1 1277 { STRING_COMMA_LEN ("noavx512_bf16"), CPU_ANY_AVX512_BF16_FLAGS },
708a2fff
CL
1278 { STRING_COMMA_LEN ("noavx512_vp2intersect"),
1279 CPU_ANY_AVX512_VP2INTERSECT_FLAGS },
dd455cf5 1280 { STRING_COMMA_LEN ("noenqcmd"), CPU_ANY_ENQCMD_FLAGS },
4b27d27c 1281 { STRING_COMMA_LEN ("noserialize"), CPU_ANY_SERIALIZE_FLAGS },
bb651e8b 1282 { STRING_COMMA_LEN ("notsxldtrk"), CPU_ANY_TSXLDTRK_FLAGS },
e413e4e9
AM
1283};
1284
704209c0 1285#ifdef I386COFF
a6c24e68
NC
1286/* Like s_lcomm_internal in gas/read.c but the alignment string
1287 is allowed to be optional. */
1288
1289static symbolS *
1290pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1291{
1292 addressT align = 0;
1293
1294 SKIP_WHITESPACE ();
1295
7ab9ffdd 1296 if (needs_align
a6c24e68
NC
1297 && *input_line_pointer == ',')
1298 {
1299 align = parse_align (needs_align - 1);
7ab9ffdd 1300
a6c24e68
NC
1301 if (align == (addressT) -1)
1302 return NULL;
1303 }
1304 else
1305 {
1306 if (size >= 8)
1307 align = 3;
1308 else if (size >= 4)
1309 align = 2;
1310 else if (size >= 2)
1311 align = 1;
1312 else
1313 align = 0;
1314 }
1315
1316 bss_alloc (symbolP, size, align);
1317 return symbolP;
1318}
1319
704209c0 1320static void
a6c24e68
NC
1321pe_lcomm (int needs_align)
1322{
1323 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1324}
704209c0 1325#endif
a6c24e68 1326
29b0f896
AM
1327const pseudo_typeS md_pseudo_table[] =
1328{
1329#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1330 {"align", s_align_bytes, 0},
1331#else
1332 {"align", s_align_ptwo, 0},
1333#endif
1334 {"arch", set_cpu_arch, 0},
1335#ifndef I386COFF
1336 {"bss", s_bss, 0},
a6c24e68
NC
1337#else
1338 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1339#endif
1340 {"ffloat", float_cons, 'f'},
1341 {"dfloat", float_cons, 'd'},
1342 {"tfloat", float_cons, 'x'},
1343 {"value", cons, 2},
d182319b 1344 {"slong", signed_cons, 4},
29b0f896
AM
1345 {"noopt", s_ignore, 0},
1346 {"optim", s_ignore, 0},
1347 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1348 {"code16", set_code_flag, CODE_16BIT},
1349 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1350#ifdef BFD64
29b0f896 1351 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1352#endif
29b0f896
AM
1353 {"intel_syntax", set_intel_syntax, 1},
1354 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1355 {"intel_mnemonic", set_intel_mnemonic, 1},
1356 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1357 {"allow_index_reg", set_allow_index_reg, 1},
1358 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1359 {"sse_check", set_check, 0},
1360 {"operand_check", set_check, 1},
3b22753a
L
1361#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1362 {"largecomm", handle_large_common, 0},
07a53e5c 1363#else
68d20676 1364 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1365 {"loc", dwarf2_directive_loc, 0},
1366 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1367#endif
6482c264
NC
1368#ifdef TE_PE
1369 {"secrel32", pe_directive_secrel, 0},
1370#endif
29b0f896
AM
1371 {0, 0, 0}
1372};
1373
1374/* For interface with expression (). */
1375extern char *input_line_pointer;
1376
1377/* Hash table for instruction mnemonic lookup. */
1378static struct hash_control *op_hash;
1379
1380/* Hash table for register lookup. */
1381static struct hash_control *reg_hash;
1382\f
ce8a8b2f
AM
1383 /* Various efficient no-op patterns for aligning code labels.
1384 Note: Don't try to assemble the instructions in the comments.
1385 0L and 0w are not legal. */
62a02d25
L
1386static const unsigned char f32_1[] =
1387 {0x90}; /* nop */
1388static const unsigned char f32_2[] =
1389 {0x66,0x90}; /* xchg %ax,%ax */
1390static const unsigned char f32_3[] =
1391 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1392static const unsigned char f32_4[] =
1393 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
62a02d25
L
1394static const unsigned char f32_6[] =
1395 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1396static const unsigned char f32_7[] =
1397 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
62a02d25 1398static const unsigned char f16_3[] =
3ae729d5 1399 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
62a02d25 1400static const unsigned char f16_4[] =
3ae729d5
L
1401 {0x8d,0xb4,0x00,0x00}; /* lea 0W(%si),%si */
1402static const unsigned char jump_disp8[] =
1403 {0xeb}; /* jmp disp8 */
1404static const unsigned char jump32_disp32[] =
1405 {0xe9}; /* jmp disp32 */
1406static const unsigned char jump16_disp32[] =
1407 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1408/* 32-bit NOPs patterns. */
1409static const unsigned char *const f32_patt[] = {
3ae729d5 1410 f32_1, f32_2, f32_3, f32_4, NULL, f32_6, f32_7
62a02d25
L
1411};
1412/* 16-bit NOPs patterns. */
1413static const unsigned char *const f16_patt[] = {
3ae729d5 1414 f32_1, f32_2, f16_3, f16_4
62a02d25
L
1415};
1416/* nopl (%[re]ax) */
1417static const unsigned char alt_3[] =
1418 {0x0f,0x1f,0x00};
1419/* nopl 0(%[re]ax) */
1420static const unsigned char alt_4[] =
1421 {0x0f,0x1f,0x40,0x00};
1422/* nopl 0(%[re]ax,%[re]ax,1) */
1423static const unsigned char alt_5[] =
1424 {0x0f,0x1f,0x44,0x00,0x00};
1425/* nopw 0(%[re]ax,%[re]ax,1) */
1426static const unsigned char alt_6[] =
1427 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1428/* nopl 0L(%[re]ax) */
1429static const unsigned char alt_7[] =
1430 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1431/* nopl 0L(%[re]ax,%[re]ax,1) */
1432static const unsigned char alt_8[] =
1433 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1434/* nopw 0L(%[re]ax,%[re]ax,1) */
1435static const unsigned char alt_9[] =
1436 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1437/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1438static const unsigned char alt_10[] =
1439 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
3ae729d5
L
1440/* data16 nopw %cs:0L(%eax,%eax,1) */
1441static const unsigned char alt_11[] =
1442 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1443/* 32-bit and 64-bit NOPs patterns. */
1444static const unsigned char *const alt_patt[] = {
1445 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1446 alt_9, alt_10, alt_11
62a02d25
L
1447};
1448
1449/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1450 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1451
1452static void
1453i386_output_nops (char *where, const unsigned char *const *patt,
1454 int count, int max_single_nop_size)
1455
1456{
3ae729d5
L
1457 /* Place the longer NOP first. */
1458 int last;
1459 int offset;
3076e594
NC
1460 const unsigned char *nops;
1461
1462 if (max_single_nop_size < 1)
1463 {
1464 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1465 max_single_nop_size);
1466 return;
1467 }
1468
1469 nops = patt[max_single_nop_size - 1];
3ae729d5
L
1470
1471 /* Use the smaller one if the requsted one isn't available. */
1472 if (nops == NULL)
62a02d25 1473 {
3ae729d5
L
1474 max_single_nop_size--;
1475 nops = patt[max_single_nop_size - 1];
62a02d25
L
1476 }
1477
3ae729d5
L
1478 last = count % max_single_nop_size;
1479
1480 count -= last;
1481 for (offset = 0; offset < count; offset += max_single_nop_size)
1482 memcpy (where + offset, nops, max_single_nop_size);
1483
1484 if (last)
1485 {
1486 nops = patt[last - 1];
1487 if (nops == NULL)
1488 {
1489 /* Use the smaller one plus one-byte NOP if the needed one
1490 isn't available. */
1491 last--;
1492 nops = patt[last - 1];
1493 memcpy (where + offset, nops, last);
1494 where[offset + last] = *patt[0];
1495 }
1496 else
1497 memcpy (where + offset, nops, last);
1498 }
62a02d25
L
1499}
1500
3ae729d5
L
1501static INLINE int
1502fits_in_imm7 (offsetT num)
1503{
1504 return (num & 0x7f) == num;
1505}
1506
1507static INLINE int
1508fits_in_imm31 (offsetT num)
1509{
1510 return (num & 0x7fffffff) == num;
1511}
62a02d25
L
1512
1513/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1514 single NOP instruction LIMIT. */
1515
1516void
3ae729d5 1517i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1518{
3ae729d5 1519 const unsigned char *const *patt = NULL;
62a02d25 1520 int max_single_nop_size;
3ae729d5
L
1521 /* Maximum number of NOPs before switching to jump over NOPs. */
1522 int max_number_of_nops;
62a02d25 1523
3ae729d5 1524 switch (fragP->fr_type)
62a02d25 1525 {
3ae729d5
L
1526 case rs_fill_nop:
1527 case rs_align_code:
1528 break;
e379e5f3
L
1529 case rs_machine_dependent:
1530 /* Allow NOP padding for jumps and calls. */
1531 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
1532 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
1533 break;
1534 /* Fall through. */
3ae729d5 1535 default:
62a02d25
L
1536 return;
1537 }
1538
ccc9c027
L
1539 /* We need to decide which NOP sequence to use for 32bit and
1540 64bit. When -mtune= is used:
4eed87de 1541
76bc74dc
L
1542 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
1543 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1544 2. For the rest, alt_patt will be used.
1545
1546 When -mtune= isn't used, alt_patt will be used if
22109423 1547 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will
76bc74dc 1548 be used.
ccc9c027
L
1549
1550 When -march= or .arch is used, we can't use anything beyond
1551 cpu_arch_isa_flags. */
1552
1553 if (flag_code == CODE_16BIT)
1554 {
3ae729d5
L
1555 patt = f16_patt;
1556 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1557 /* Limit number of NOPs to 2 in 16-bit mode. */
1558 max_number_of_nops = 2;
252b5132 1559 }
33fef721 1560 else
ccc9c027 1561 {
fbf3f584 1562 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027
L
1563 {
1564 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
1565 switch (cpu_arch_tune)
1566 {
1567 case PROCESSOR_UNKNOWN:
1568 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423
L
1569 optimize with nops. */
1570 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1571 patt = alt_patt;
ccc9c027
L
1572 else
1573 patt = f32_patt;
1574 break;
ccc9c027
L
1575 case PROCESSOR_PENTIUM4:
1576 case PROCESSOR_NOCONA:
ef05d495 1577 case PROCESSOR_CORE:
76bc74dc 1578 case PROCESSOR_CORE2:
bd5295b2 1579 case PROCESSOR_COREI7:
3632d14b 1580 case PROCESSOR_L1OM:
7a9068fe 1581 case PROCESSOR_K1OM:
76bc74dc 1582 case PROCESSOR_GENERIC64:
ccc9c027
L
1583 case PROCESSOR_K6:
1584 case PROCESSOR_ATHLON:
1585 case PROCESSOR_K8:
4eed87de 1586 case PROCESSOR_AMDFAM10:
8aedb9fe 1587 case PROCESSOR_BD:
029f3522 1588 case PROCESSOR_ZNVER:
7b458c12 1589 case PROCESSOR_BT:
80b8656c 1590 patt = alt_patt;
ccc9c027 1591 break;
76bc74dc 1592 case PROCESSOR_I386:
ccc9c027
L
1593 case PROCESSOR_I486:
1594 case PROCESSOR_PENTIUM:
2dde1948 1595 case PROCESSOR_PENTIUMPRO:
81486035 1596 case PROCESSOR_IAMCU:
ccc9c027
L
1597 case PROCESSOR_GENERIC32:
1598 patt = f32_patt;
1599 break;
4eed87de 1600 }
ccc9c027
L
1601 }
1602 else
1603 {
fbf3f584 1604 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1605 {
1606 case PROCESSOR_UNKNOWN:
e6a14101 1607 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1608 PROCESSOR_UNKNOWN. */
1609 abort ();
1610 break;
1611
76bc74dc 1612 case PROCESSOR_I386:
ccc9c027
L
1613 case PROCESSOR_I486:
1614 case PROCESSOR_PENTIUM:
81486035 1615 case PROCESSOR_IAMCU:
ccc9c027
L
1616 case PROCESSOR_K6:
1617 case PROCESSOR_ATHLON:
1618 case PROCESSOR_K8:
4eed87de 1619 case PROCESSOR_AMDFAM10:
8aedb9fe 1620 case PROCESSOR_BD:
029f3522 1621 case PROCESSOR_ZNVER:
7b458c12 1622 case PROCESSOR_BT:
ccc9c027
L
1623 case PROCESSOR_GENERIC32:
1624 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423
L
1625 with nops. */
1626 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1627 patt = alt_patt;
ccc9c027
L
1628 else
1629 patt = f32_patt;
1630 break;
76bc74dc
L
1631 case PROCESSOR_PENTIUMPRO:
1632 case PROCESSOR_PENTIUM4:
1633 case PROCESSOR_NOCONA:
1634 case PROCESSOR_CORE:
ef05d495 1635 case PROCESSOR_CORE2:
bd5295b2 1636 case PROCESSOR_COREI7:
3632d14b 1637 case PROCESSOR_L1OM:
7a9068fe 1638 case PROCESSOR_K1OM:
22109423 1639 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1640 patt = alt_patt;
ccc9c027
L
1641 else
1642 patt = f32_patt;
1643 break;
1644 case PROCESSOR_GENERIC64:
80b8656c 1645 patt = alt_patt;
ccc9c027 1646 break;
4eed87de 1647 }
ccc9c027
L
1648 }
1649
76bc74dc
L
1650 if (patt == f32_patt)
1651 {
3ae729d5
L
1652 max_single_nop_size = sizeof (f32_patt) / sizeof (f32_patt[0]);
1653 /* Limit number of NOPs to 2 for older processors. */
1654 max_number_of_nops = 2;
76bc74dc
L
1655 }
1656 else
1657 {
3ae729d5
L
1658 max_single_nop_size = sizeof (alt_patt) / sizeof (alt_patt[0]);
1659 /* Limit number of NOPs to 7 for newer processors. */
1660 max_number_of_nops = 7;
1661 }
1662 }
1663
1664 if (limit == 0)
1665 limit = max_single_nop_size;
1666
1667 if (fragP->fr_type == rs_fill_nop)
1668 {
1669 /* Output NOPs for .nop directive. */
1670 if (limit > max_single_nop_size)
1671 {
1672 as_bad_where (fragP->fr_file, fragP->fr_line,
1673 _("invalid single nop size: %d "
1674 "(expect within [0, %d])"),
1675 limit, max_single_nop_size);
1676 return;
1677 }
1678 }
e379e5f3 1679 else if (fragP->fr_type != rs_machine_dependent)
3ae729d5
L
1680 fragP->fr_var = count;
1681
1682 if ((count / max_single_nop_size) > max_number_of_nops)
1683 {
1684 /* Generate jump over NOPs. */
1685 offsetT disp = count - 2;
1686 if (fits_in_imm7 (disp))
1687 {
1688 /* Use "jmp disp8" if possible. */
1689 count = disp;
1690 where[0] = jump_disp8[0];
1691 where[1] = count;
1692 where += 2;
1693 }
1694 else
1695 {
1696 unsigned int size_of_jump;
1697
1698 if (flag_code == CODE_16BIT)
1699 {
1700 where[0] = jump16_disp32[0];
1701 where[1] = jump16_disp32[1];
1702 size_of_jump = 2;
1703 }
1704 else
1705 {
1706 where[0] = jump32_disp32[0];
1707 size_of_jump = 1;
1708 }
1709
1710 count -= size_of_jump + 4;
1711 if (!fits_in_imm31 (count))
1712 {
1713 as_bad_where (fragP->fr_file, fragP->fr_line,
1714 _("jump over nop padding out of range"));
1715 return;
1716 }
1717
1718 md_number_to_chars (where + size_of_jump, count, 4);
1719 where += size_of_jump + 4;
76bc74dc 1720 }
ccc9c027 1721 }
3ae729d5
L
1722
1723 /* Generate multiple NOPs. */
1724 i386_output_nops (where, patt, count, limit);
252b5132
RH
1725}
1726
c6fb90c8 1727static INLINE int
0dfbf9d7 1728operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1729{
0dfbf9d7 1730 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1731 {
1732 case 3:
0dfbf9d7 1733 if (x->array[2])
c6fb90c8 1734 return 0;
1a0670f3 1735 /* Fall through. */
c6fb90c8 1736 case 2:
0dfbf9d7 1737 if (x->array[1])
c6fb90c8 1738 return 0;
1a0670f3 1739 /* Fall through. */
c6fb90c8 1740 case 1:
0dfbf9d7 1741 return !x->array[0];
c6fb90c8
L
1742 default:
1743 abort ();
1744 }
40fb9820
L
1745}
1746
c6fb90c8 1747static INLINE void
0dfbf9d7 1748operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1749{
0dfbf9d7 1750 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1751 {
1752 case 3:
0dfbf9d7 1753 x->array[2] = v;
1a0670f3 1754 /* Fall through. */
c6fb90c8 1755 case 2:
0dfbf9d7 1756 x->array[1] = v;
1a0670f3 1757 /* Fall through. */
c6fb90c8 1758 case 1:
0dfbf9d7 1759 x->array[0] = v;
1a0670f3 1760 /* Fall through. */
c6fb90c8
L
1761 break;
1762 default:
1763 abort ();
1764 }
bab6aec1
JB
1765
1766 x->bitfield.class = ClassNone;
75e5731b 1767 x->bitfield.instance = InstanceNone;
c6fb90c8 1768}
40fb9820 1769
c6fb90c8 1770static INLINE int
0dfbf9d7
L
1771operand_type_equal (const union i386_operand_type *x,
1772 const union i386_operand_type *y)
c6fb90c8 1773{
0dfbf9d7 1774 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1775 {
1776 case 3:
0dfbf9d7 1777 if (x->array[2] != y->array[2])
c6fb90c8 1778 return 0;
1a0670f3 1779 /* Fall through. */
c6fb90c8 1780 case 2:
0dfbf9d7 1781 if (x->array[1] != y->array[1])
c6fb90c8 1782 return 0;
1a0670f3 1783 /* Fall through. */
c6fb90c8 1784 case 1:
0dfbf9d7 1785 return x->array[0] == y->array[0];
c6fb90c8
L
1786 break;
1787 default:
1788 abort ();
1789 }
1790}
40fb9820 1791
0dfbf9d7
L
1792static INLINE int
1793cpu_flags_all_zero (const union i386_cpu_flags *x)
1794{
1795 switch (ARRAY_SIZE(x->array))
1796 {
53467f57
IT
1797 case 4:
1798 if (x->array[3])
1799 return 0;
1800 /* Fall through. */
0dfbf9d7
L
1801 case 3:
1802 if (x->array[2])
1803 return 0;
1a0670f3 1804 /* Fall through. */
0dfbf9d7
L
1805 case 2:
1806 if (x->array[1])
1807 return 0;
1a0670f3 1808 /* Fall through. */
0dfbf9d7
L
1809 case 1:
1810 return !x->array[0];
1811 default:
1812 abort ();
1813 }
1814}
1815
0dfbf9d7
L
1816static INLINE int
1817cpu_flags_equal (const union i386_cpu_flags *x,
1818 const union i386_cpu_flags *y)
1819{
1820 switch (ARRAY_SIZE(x->array))
1821 {
53467f57
IT
1822 case 4:
1823 if (x->array[3] != y->array[3])
1824 return 0;
1825 /* Fall through. */
0dfbf9d7
L
1826 case 3:
1827 if (x->array[2] != y->array[2])
1828 return 0;
1a0670f3 1829 /* Fall through. */
0dfbf9d7
L
1830 case 2:
1831 if (x->array[1] != y->array[1])
1832 return 0;
1a0670f3 1833 /* Fall through. */
0dfbf9d7
L
1834 case 1:
1835 return x->array[0] == y->array[0];
1836 break;
1837 default:
1838 abort ();
1839 }
1840}
c6fb90c8
L
1841
1842static INLINE int
1843cpu_flags_check_cpu64 (i386_cpu_flags f)
1844{
1845 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
1846 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
1847}
1848
c6fb90c8
L
1849static INLINE i386_cpu_flags
1850cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1851{
c6fb90c8
L
1852 switch (ARRAY_SIZE (x.array))
1853 {
53467f57
IT
1854 case 4:
1855 x.array [3] &= y.array [3];
1856 /* Fall through. */
c6fb90c8
L
1857 case 3:
1858 x.array [2] &= y.array [2];
1a0670f3 1859 /* Fall through. */
c6fb90c8
L
1860 case 2:
1861 x.array [1] &= y.array [1];
1a0670f3 1862 /* Fall through. */
c6fb90c8
L
1863 case 1:
1864 x.array [0] &= y.array [0];
1865 break;
1866 default:
1867 abort ();
1868 }
1869 return x;
1870}
40fb9820 1871
c6fb90c8
L
1872static INLINE i386_cpu_flags
1873cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1874{
c6fb90c8 1875 switch (ARRAY_SIZE (x.array))
40fb9820 1876 {
53467f57
IT
1877 case 4:
1878 x.array [3] |= y.array [3];
1879 /* Fall through. */
c6fb90c8
L
1880 case 3:
1881 x.array [2] |= y.array [2];
1a0670f3 1882 /* Fall through. */
c6fb90c8
L
1883 case 2:
1884 x.array [1] |= y.array [1];
1a0670f3 1885 /* Fall through. */
c6fb90c8
L
1886 case 1:
1887 x.array [0] |= y.array [0];
40fb9820
L
1888 break;
1889 default:
1890 abort ();
1891 }
40fb9820
L
1892 return x;
1893}
1894
309d3373
JB
1895static INLINE i386_cpu_flags
1896cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1897{
1898 switch (ARRAY_SIZE (x.array))
1899 {
53467f57
IT
1900 case 4:
1901 x.array [3] &= ~y.array [3];
1902 /* Fall through. */
309d3373
JB
1903 case 3:
1904 x.array [2] &= ~y.array [2];
1a0670f3 1905 /* Fall through. */
309d3373
JB
1906 case 2:
1907 x.array [1] &= ~y.array [1];
1a0670f3 1908 /* Fall through. */
309d3373
JB
1909 case 1:
1910 x.array [0] &= ~y.array [0];
1911 break;
1912 default:
1913 abort ();
1914 }
1915 return x;
1916}
1917
6c0946d0
JB
1918static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
1919
c0f3af97
L
1920#define CPU_FLAGS_ARCH_MATCH 0x1
1921#define CPU_FLAGS_64BIT_MATCH 0x2
1922
c0f3af97 1923#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1924 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1925
1926/* Return CPU flags match bits. */
3629bb00 1927
40fb9820 1928static int
d3ce72d0 1929cpu_flags_match (const insn_template *t)
40fb9820 1930{
c0f3af97
L
1931 i386_cpu_flags x = t->cpu_flags;
1932 int match = cpu_flags_check_cpu64 (x) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820
L
1933
1934 x.bitfield.cpu64 = 0;
1935 x.bitfield.cpuno64 = 0;
1936
0dfbf9d7 1937 if (cpu_flags_all_zero (&x))
c0f3af97
L
1938 {
1939 /* This instruction is available on all archs. */
db12e14e 1940 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1941 }
3629bb00
L
1942 else
1943 {
c0f3af97 1944 /* This instruction is available only on some archs. */
3629bb00
L
1945 i386_cpu_flags cpu = cpu_arch_flags;
1946
ab592e75
JB
1947 /* AVX512VL is no standalone feature - match it and then strip it. */
1948 if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl)
1949 return match;
1950 x.bitfield.cpuavx512vl = 0;
1951
3629bb00 1952 cpu = cpu_flags_and (x, cpu);
c0f3af97
L
1953 if (!cpu_flags_all_zero (&cpu))
1954 {
a5ff0eb2
L
1955 if (x.bitfield.cpuavx)
1956 {
929f69fa 1957 /* We need to check a few extra flags with AVX. */
b9d49817 1958 if (cpu.bitfield.cpuavx
40d231b4
JB
1959 && (!t->opcode_modifier.sse2avx
1960 || (sse2avx && !i.prefix[DATA_PREFIX]))
b9d49817 1961 && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
929f69fa 1962 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
b9d49817
JB
1963 && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
1964 match |= CPU_FLAGS_ARCH_MATCH;
a5ff0eb2 1965 }
929f69fa
JB
1966 else if (x.bitfield.cpuavx512f)
1967 {
1968 /* We need to check a few extra flags with AVX512F. */
1969 if (cpu.bitfield.cpuavx512f
1970 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
1971 && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes)
1972 && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq))
1973 match |= CPU_FLAGS_ARCH_MATCH;
1974 }
a5ff0eb2 1975 else
db12e14e 1976 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1977 }
3629bb00 1978 }
c0f3af97 1979 return match;
40fb9820
L
1980}
1981
c6fb90c8
L
1982static INLINE i386_operand_type
1983operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 1984{
bab6aec1
JB
1985 if (x.bitfield.class != y.bitfield.class)
1986 x.bitfield.class = ClassNone;
75e5731b
JB
1987 if (x.bitfield.instance != y.bitfield.instance)
1988 x.bitfield.instance = InstanceNone;
bab6aec1 1989
c6fb90c8
L
1990 switch (ARRAY_SIZE (x.array))
1991 {
1992 case 3:
1993 x.array [2] &= y.array [2];
1a0670f3 1994 /* Fall through. */
c6fb90c8
L
1995 case 2:
1996 x.array [1] &= y.array [1];
1a0670f3 1997 /* Fall through. */
c6fb90c8
L
1998 case 1:
1999 x.array [0] &= y.array [0];
2000 break;
2001 default:
2002 abort ();
2003 }
2004 return x;
40fb9820
L
2005}
2006
73053c1f
JB
2007static INLINE i386_operand_type
2008operand_type_and_not (i386_operand_type x, i386_operand_type y)
2009{
bab6aec1 2010 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2011 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2012
73053c1f
JB
2013 switch (ARRAY_SIZE (x.array))
2014 {
2015 case 3:
2016 x.array [2] &= ~y.array [2];
2017 /* Fall through. */
2018 case 2:
2019 x.array [1] &= ~y.array [1];
2020 /* Fall through. */
2021 case 1:
2022 x.array [0] &= ~y.array [0];
2023 break;
2024 default:
2025 abort ();
2026 }
2027 return x;
2028}
2029
c6fb90c8
L
2030static INLINE i386_operand_type
2031operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 2032{
bab6aec1
JB
2033 gas_assert (x.bitfield.class == ClassNone ||
2034 y.bitfield.class == ClassNone ||
2035 x.bitfield.class == y.bitfield.class);
75e5731b
JB
2036 gas_assert (x.bitfield.instance == InstanceNone ||
2037 y.bitfield.instance == InstanceNone ||
2038 x.bitfield.instance == y.bitfield.instance);
bab6aec1 2039
c6fb90c8 2040 switch (ARRAY_SIZE (x.array))
40fb9820 2041 {
c6fb90c8
L
2042 case 3:
2043 x.array [2] |= y.array [2];
1a0670f3 2044 /* Fall through. */
c6fb90c8
L
2045 case 2:
2046 x.array [1] |= y.array [1];
1a0670f3 2047 /* Fall through. */
c6fb90c8
L
2048 case 1:
2049 x.array [0] |= y.array [0];
40fb9820
L
2050 break;
2051 default:
2052 abort ();
2053 }
c6fb90c8
L
2054 return x;
2055}
40fb9820 2056
c6fb90c8
L
2057static INLINE i386_operand_type
2058operand_type_xor (i386_operand_type x, i386_operand_type y)
2059{
bab6aec1 2060 gas_assert (y.bitfield.class == ClassNone);
75e5731b 2061 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 2062
c6fb90c8
L
2063 switch (ARRAY_SIZE (x.array))
2064 {
2065 case 3:
2066 x.array [2] ^= y.array [2];
1a0670f3 2067 /* Fall through. */
c6fb90c8
L
2068 case 2:
2069 x.array [1] ^= y.array [1];
1a0670f3 2070 /* Fall through. */
c6fb90c8
L
2071 case 1:
2072 x.array [0] ^= y.array [0];
2073 break;
2074 default:
2075 abort ();
2076 }
40fb9820
L
2077 return x;
2078}
2079
40fb9820
L
2080static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
2081static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
2082static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
2083static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
bab6aec1
JB
2084static const i386_operand_type anydisp = OPERAND_TYPE_ANYDISP;
2085static const i386_operand_type anyimm = OPERAND_TYPE_ANYIMM;
40fb9820 2086static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
43234a1e 2087static const i386_operand_type regmask = OPERAND_TYPE_REGMASK;
40fb9820
L
2088static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
2089static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
2090static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
2091static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
2092static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
2093static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
2094static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
2095static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
2096static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
2097
2098enum operand_type
2099{
2100 reg,
40fb9820
L
2101 imm,
2102 disp,
2103 anymem
2104};
2105
c6fb90c8 2106static INLINE int
40fb9820
L
2107operand_type_check (i386_operand_type t, enum operand_type c)
2108{
2109 switch (c)
2110 {
2111 case reg:
bab6aec1 2112 return t.bitfield.class == Reg;
40fb9820 2113
40fb9820
L
2114 case imm:
2115 return (t.bitfield.imm8
2116 || t.bitfield.imm8s
2117 || t.bitfield.imm16
2118 || t.bitfield.imm32
2119 || t.bitfield.imm32s
2120 || t.bitfield.imm64);
2121
2122 case disp:
2123 return (t.bitfield.disp8
2124 || t.bitfield.disp16
2125 || t.bitfield.disp32
2126 || t.bitfield.disp32s
2127 || t.bitfield.disp64);
2128
2129 case anymem:
2130 return (t.bitfield.disp8
2131 || t.bitfield.disp16
2132 || t.bitfield.disp32
2133 || t.bitfield.disp32s
2134 || t.bitfield.disp64
2135 || t.bitfield.baseindex);
2136
2137 default:
2138 abort ();
2139 }
2cfe26b6
AM
2140
2141 return 0;
40fb9820
L
2142}
2143
7a54636a
L
2144/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
2145 between operand GIVEN and opeand WANTED for instruction template T. */
5c07affc
L
2146
2147static INLINE int
7a54636a
L
2148match_operand_size (const insn_template *t, unsigned int wanted,
2149 unsigned int given)
5c07affc 2150{
3ac21baa
JB
2151 return !((i.types[given].bitfield.byte
2152 && !t->operand_types[wanted].bitfield.byte)
2153 || (i.types[given].bitfield.word
2154 && !t->operand_types[wanted].bitfield.word)
2155 || (i.types[given].bitfield.dword
2156 && !t->operand_types[wanted].bitfield.dword)
2157 || (i.types[given].bitfield.qword
2158 && !t->operand_types[wanted].bitfield.qword)
2159 || (i.types[given].bitfield.tbyte
2160 && !t->operand_types[wanted].bitfield.tbyte));
5c07affc
L
2161}
2162
dd40ce22
L
2163/* Return 1 if there is no conflict in SIMD register between operand
2164 GIVEN and opeand WANTED for instruction template T. */
1b54b8d7
JB
2165
2166static INLINE int
dd40ce22
L
2167match_simd_size (const insn_template *t, unsigned int wanted,
2168 unsigned int given)
1b54b8d7 2169{
3ac21baa
JB
2170 return !((i.types[given].bitfield.xmmword
2171 && !t->operand_types[wanted].bitfield.xmmword)
2172 || (i.types[given].bitfield.ymmword
2173 && !t->operand_types[wanted].bitfield.ymmword)
2174 || (i.types[given].bitfield.zmmword
260cd341
LC
2175 && !t->operand_types[wanted].bitfield.zmmword)
2176 || (i.types[given].bitfield.tmmword
2177 && !t->operand_types[wanted].bitfield.tmmword));
1b54b8d7
JB
2178}
2179
7a54636a
L
2180/* Return 1 if there is no conflict in any size between operand GIVEN
2181 and opeand WANTED for instruction template T. */
5c07affc
L
2182
2183static INLINE int
dd40ce22
L
2184match_mem_size (const insn_template *t, unsigned int wanted,
2185 unsigned int given)
5c07affc 2186{
7a54636a 2187 return (match_operand_size (t, wanted, given)
3ac21baa 2188 && !((i.types[given].bitfield.unspecified
af508cb9 2189 && !i.broadcast
3ac21baa
JB
2190 && !t->operand_types[wanted].bitfield.unspecified)
2191 || (i.types[given].bitfield.fword
2192 && !t->operand_types[wanted].bitfield.fword)
1b54b8d7
JB
2193 /* For scalar opcode templates to allow register and memory
2194 operands at the same time, some special casing is needed
d6793fa1
JB
2195 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2196 down-conversion vpmov*. */
3528c362 2197 || ((t->operand_types[wanted].bitfield.class == RegSIMD
bc49bfd8
JB
2198 && t->operand_types[wanted].bitfield.byte
2199 + t->operand_types[wanted].bitfield.word
2200 + t->operand_types[wanted].bitfield.dword
2201 + t->operand_types[wanted].bitfield.qword
2202 > !!t->opcode_modifier.broadcast)
3ac21baa
JB
2203 ? (i.types[given].bitfield.xmmword
2204 || i.types[given].bitfield.ymmword
2205 || i.types[given].bitfield.zmmword)
2206 : !match_simd_size(t, wanted, given))));
5c07affc
L
2207}
2208
3ac21baa
JB
2209/* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2210 operands for instruction template T, and it has MATCH_REVERSE set if there
2211 is no size conflict on any operands for the template with operands reversed
2212 (and the template allows for reversing in the first place). */
5c07affc 2213
3ac21baa
JB
2214#define MATCH_STRAIGHT 1
2215#define MATCH_REVERSE 2
2216
2217static INLINE unsigned int
d3ce72d0 2218operand_size_match (const insn_template *t)
5c07affc 2219{
3ac21baa 2220 unsigned int j, match = MATCH_STRAIGHT;
5c07affc 2221
0cfa3eb3 2222 /* Don't check non-absolute jump instructions. */
5c07affc 2223 if (t->opcode_modifier.jump
0cfa3eb3 2224 && t->opcode_modifier.jump != JUMP_ABSOLUTE)
5c07affc
L
2225 return match;
2226
2227 /* Check memory and accumulator operand size. */
2228 for (j = 0; j < i.operands; j++)
2229 {
3528c362
JB
2230 if (i.types[j].bitfield.class != Reg
2231 && i.types[j].bitfield.class != RegSIMD
601e8564 2232 && t->opcode_modifier.anysize)
5c07affc
L
2233 continue;
2234
bab6aec1 2235 if (t->operand_types[j].bitfield.class == Reg
7a54636a 2236 && !match_operand_size (t, j, j))
5c07affc
L
2237 {
2238 match = 0;
2239 break;
2240 }
2241
3528c362 2242 if (t->operand_types[j].bitfield.class == RegSIMD
3ac21baa 2243 && !match_simd_size (t, j, j))
1b54b8d7
JB
2244 {
2245 match = 0;
2246 break;
2247 }
2248
75e5731b 2249 if (t->operand_types[j].bitfield.instance == Accum
7a54636a 2250 && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
1b54b8d7
JB
2251 {
2252 match = 0;
2253 break;
2254 }
2255
c48dadc9 2256 if ((i.flags[j] & Operand_Mem) && !match_mem_size (t, j, j))
5c07affc
L
2257 {
2258 match = 0;
2259 break;
2260 }
2261 }
2262
3ac21baa 2263 if (!t->opcode_modifier.d)
891edac4 2264 {
dc1e8a47 2265 mismatch:
3ac21baa
JB
2266 if (!match)
2267 i.error = operand_size_mismatch;
2268 return match;
891edac4 2269 }
5c07affc
L
2270
2271 /* Check reverse. */
f5eb1d70 2272 gas_assert (i.operands >= 2 && i.operands <= 3);
5c07affc 2273
f5eb1d70 2274 for (j = 0; j < i.operands; j++)
5c07affc 2275 {
f5eb1d70
JB
2276 unsigned int given = i.operands - j - 1;
2277
bab6aec1 2278 if (t->operand_types[j].bitfield.class == Reg
f5eb1d70 2279 && !match_operand_size (t, j, given))
891edac4 2280 goto mismatch;
5c07affc 2281
3528c362 2282 if (t->operand_types[j].bitfield.class == RegSIMD
f5eb1d70 2283 && !match_simd_size (t, j, given))
dbbc8b7e
JB
2284 goto mismatch;
2285
75e5731b 2286 if (t->operand_types[j].bitfield.instance == Accum
f5eb1d70
JB
2287 && (!match_operand_size (t, j, given)
2288 || !match_simd_size (t, j, given)))
dbbc8b7e
JB
2289 goto mismatch;
2290
f5eb1d70 2291 if ((i.flags[given] & Operand_Mem) && !match_mem_size (t, j, given))
891edac4 2292 goto mismatch;
5c07affc
L
2293 }
2294
3ac21baa 2295 return match | MATCH_REVERSE;
5c07affc
L
2296}
2297
c6fb90c8 2298static INLINE int
40fb9820
L
2299operand_type_match (i386_operand_type overlap,
2300 i386_operand_type given)
2301{
2302 i386_operand_type temp = overlap;
2303
7d5e4556 2304 temp.bitfield.unspecified = 0;
5c07affc
L
2305 temp.bitfield.byte = 0;
2306 temp.bitfield.word = 0;
2307 temp.bitfield.dword = 0;
2308 temp.bitfield.fword = 0;
2309 temp.bitfield.qword = 0;
2310 temp.bitfield.tbyte = 0;
2311 temp.bitfield.xmmword = 0;
c0f3af97 2312 temp.bitfield.ymmword = 0;
43234a1e 2313 temp.bitfield.zmmword = 0;
260cd341 2314 temp.bitfield.tmmword = 0;
0dfbf9d7 2315 if (operand_type_all_zero (&temp))
891edac4 2316 goto mismatch;
40fb9820 2317
6f2f06be 2318 if (given.bitfield.baseindex == overlap.bitfield.baseindex)
891edac4
L
2319 return 1;
2320
dc1e8a47 2321 mismatch:
a65babc9 2322 i.error = operand_type_mismatch;
891edac4 2323 return 0;
40fb9820
L
2324}
2325
7d5e4556 2326/* If given types g0 and g1 are registers they must be of the same type
10c17abd 2327 unless the expected operand type register overlap is null.
5de4d9ef 2328 Some Intel syntax memory operand size checking also happens here. */
40fb9820 2329
c6fb90c8 2330static INLINE int
dc821c5f 2331operand_type_register_match (i386_operand_type g0,
40fb9820 2332 i386_operand_type t0,
40fb9820
L
2333 i386_operand_type g1,
2334 i386_operand_type t1)
2335{
bab6aec1 2336 if (g0.bitfield.class != Reg
3528c362 2337 && g0.bitfield.class != RegSIMD
10c17abd
JB
2338 && (!operand_type_check (g0, anymem)
2339 || g0.bitfield.unspecified
5de4d9ef
JB
2340 || (t0.bitfield.class != Reg
2341 && t0.bitfield.class != RegSIMD)))
40fb9820
L
2342 return 1;
2343
bab6aec1 2344 if (g1.bitfield.class != Reg
3528c362 2345 && g1.bitfield.class != RegSIMD
10c17abd
JB
2346 && (!operand_type_check (g1, anymem)
2347 || g1.bitfield.unspecified
5de4d9ef
JB
2348 || (t1.bitfield.class != Reg
2349 && t1.bitfield.class != RegSIMD)))
40fb9820
L
2350 return 1;
2351
dc821c5f
JB
2352 if (g0.bitfield.byte == g1.bitfield.byte
2353 && g0.bitfield.word == g1.bitfield.word
2354 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2355 && g0.bitfield.qword == g1.bitfield.qword
2356 && g0.bitfield.xmmword == g1.bitfield.xmmword
2357 && g0.bitfield.ymmword == g1.bitfield.ymmword
2358 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2359 return 1;
2360
dc821c5f
JB
2361 if (!(t0.bitfield.byte & t1.bitfield.byte)
2362 && !(t0.bitfield.word & t1.bitfield.word)
2363 && !(t0.bitfield.dword & t1.bitfield.dword)
10c17abd
JB
2364 && !(t0.bitfield.qword & t1.bitfield.qword)
2365 && !(t0.bitfield.xmmword & t1.bitfield.xmmword)
2366 && !(t0.bitfield.ymmword & t1.bitfield.ymmword)
2367 && !(t0.bitfield.zmmword & t1.bitfield.zmmword))
891edac4
L
2368 return 1;
2369
a65babc9 2370 i.error = register_type_mismatch;
891edac4
L
2371
2372 return 0;
40fb9820
L
2373}
2374
4c692bc7
JB
2375static INLINE unsigned int
2376register_number (const reg_entry *r)
2377{
2378 unsigned int nr = r->reg_num;
2379
2380 if (r->reg_flags & RegRex)
2381 nr += 8;
2382
200cbe0f
L
2383 if (r->reg_flags & RegVRex)
2384 nr += 16;
2385
4c692bc7
JB
2386 return nr;
2387}
2388
252b5132 2389static INLINE unsigned int
40fb9820 2390mode_from_disp_size (i386_operand_type t)
252b5132 2391{
b5014f7a 2392 if (t.bitfield.disp8)
40fb9820
L
2393 return 1;
2394 else if (t.bitfield.disp16
2395 || t.bitfield.disp32
2396 || t.bitfield.disp32s)
2397 return 2;
2398 else
2399 return 0;
252b5132
RH
2400}
2401
2402static INLINE int
65879393 2403fits_in_signed_byte (addressT num)
252b5132 2404{
65879393 2405 return num + 0x80 <= 0xff;
47926f60 2406}
252b5132
RH
2407
2408static INLINE int
65879393 2409fits_in_unsigned_byte (addressT num)
252b5132 2410{
65879393 2411 return num <= 0xff;
47926f60 2412}
252b5132
RH
2413
2414static INLINE int
65879393 2415fits_in_unsigned_word (addressT num)
252b5132 2416{
65879393 2417 return num <= 0xffff;
47926f60 2418}
252b5132
RH
2419
2420static INLINE int
65879393 2421fits_in_signed_word (addressT num)
252b5132 2422{
65879393 2423 return num + 0x8000 <= 0xffff;
47926f60 2424}
2a962e6d 2425
3e73aa7c 2426static INLINE int
65879393 2427fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2428{
2429#ifndef BFD64
2430 return 1;
2431#else
65879393 2432 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2433#endif
2434} /* fits_in_signed_long() */
2a962e6d 2435
3e73aa7c 2436static INLINE int
65879393 2437fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2438{
2439#ifndef BFD64
2440 return 1;
2441#else
65879393 2442 return num <= 0xffffffff;
3e73aa7c
JH
2443#endif
2444} /* fits_in_unsigned_long() */
252b5132 2445
43234a1e 2446static INLINE int
b5014f7a 2447fits_in_disp8 (offsetT num)
43234a1e
L
2448{
2449 int shift = i.memshift;
2450 unsigned int mask;
2451
2452 if (shift == -1)
2453 abort ();
2454
2455 mask = (1 << shift) - 1;
2456
2457 /* Return 0 if NUM isn't properly aligned. */
2458 if ((num & mask))
2459 return 0;
2460
2461 /* Check if NUM will fit in 8bit after shift. */
2462 return fits_in_signed_byte (num >> shift);
2463}
2464
a683cc34
SP
2465static INLINE int
2466fits_in_imm4 (offsetT num)
2467{
2468 return (num & 0xf) == num;
2469}
2470
40fb9820 2471static i386_operand_type
e3bb37b5 2472smallest_imm_type (offsetT num)
252b5132 2473{
40fb9820 2474 i386_operand_type t;
7ab9ffdd 2475
0dfbf9d7 2476 operand_type_set (&t, 0);
40fb9820
L
2477 t.bitfield.imm64 = 1;
2478
2479 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2480 {
2481 /* This code is disabled on the 486 because all the Imm1 forms
2482 in the opcode table are slower on the i486. They're the
2483 versions with the implicitly specified single-position
2484 displacement, which has another syntax if you really want to
2485 use that form. */
40fb9820
L
2486 t.bitfield.imm1 = 1;
2487 t.bitfield.imm8 = 1;
2488 t.bitfield.imm8s = 1;
2489 t.bitfield.imm16 = 1;
2490 t.bitfield.imm32 = 1;
2491 t.bitfield.imm32s = 1;
2492 }
2493 else if (fits_in_signed_byte (num))
2494 {
2495 t.bitfield.imm8 = 1;
2496 t.bitfield.imm8s = 1;
2497 t.bitfield.imm16 = 1;
2498 t.bitfield.imm32 = 1;
2499 t.bitfield.imm32s = 1;
2500 }
2501 else if (fits_in_unsigned_byte (num))
2502 {
2503 t.bitfield.imm8 = 1;
2504 t.bitfield.imm16 = 1;
2505 t.bitfield.imm32 = 1;
2506 t.bitfield.imm32s = 1;
2507 }
2508 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2509 {
2510 t.bitfield.imm16 = 1;
2511 t.bitfield.imm32 = 1;
2512 t.bitfield.imm32s = 1;
2513 }
2514 else if (fits_in_signed_long (num))
2515 {
2516 t.bitfield.imm32 = 1;
2517 t.bitfield.imm32s = 1;
2518 }
2519 else if (fits_in_unsigned_long (num))
2520 t.bitfield.imm32 = 1;
2521
2522 return t;
47926f60 2523}
252b5132 2524
847f7ad4 2525static offsetT
e3bb37b5 2526offset_in_range (offsetT val, int size)
847f7ad4 2527{
508866be 2528 addressT mask;
ba2adb93 2529
847f7ad4
AM
2530 switch (size)
2531 {
508866be
L
2532 case 1: mask = ((addressT) 1 << 8) - 1; break;
2533 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 2534 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
2535#ifdef BFD64
2536 case 8: mask = ((addressT) 2 << 63) - 1; break;
2537#endif
47926f60 2538 default: abort ();
847f7ad4
AM
2539 }
2540
47926f60 2541 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
2542 {
2543 char buf1[40], buf2[40];
2544
2545 sprint_value (buf1, val);
2546 sprint_value (buf2, val & mask);
2547 as_warn (_("%s shortened to %s"), buf1, buf2);
2548 }
2549 return val & mask;
2550}
2551
c32fa91d
L
2552enum PREFIX_GROUP
2553{
2554 PREFIX_EXIST = 0,
2555 PREFIX_LOCK,
2556 PREFIX_REP,
04ef582a 2557 PREFIX_DS,
c32fa91d
L
2558 PREFIX_OTHER
2559};
2560
2561/* Returns
2562 a. PREFIX_EXIST if attempting to add a prefix where one from the
2563 same class already exists.
2564 b. PREFIX_LOCK if lock prefix is added.
2565 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2566 d. PREFIX_DS if ds prefix is added.
2567 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2568 */
2569
2570static enum PREFIX_GROUP
e3bb37b5 2571add_prefix (unsigned int prefix)
252b5132 2572{
c32fa91d 2573 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2574 unsigned int q;
252b5132 2575
29b0f896
AM
2576 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2577 && flag_code == CODE_64BIT)
b1905489 2578 {
161a04f6 2579 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2580 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2581 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2582 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2583 ret = PREFIX_EXIST;
b1905489
JB
2584 q = REX_PREFIX;
2585 }
3e73aa7c 2586 else
b1905489
JB
2587 {
2588 switch (prefix)
2589 {
2590 default:
2591 abort ();
2592
b1905489 2593 case DS_PREFIX_OPCODE:
04ef582a
L
2594 ret = PREFIX_DS;
2595 /* Fall through. */
2596 case CS_PREFIX_OPCODE:
b1905489
JB
2597 case ES_PREFIX_OPCODE:
2598 case FS_PREFIX_OPCODE:
2599 case GS_PREFIX_OPCODE:
2600 case SS_PREFIX_OPCODE:
2601 q = SEG_PREFIX;
2602 break;
2603
2604 case REPNE_PREFIX_OPCODE:
2605 case REPE_PREFIX_OPCODE:
c32fa91d
L
2606 q = REP_PREFIX;
2607 ret = PREFIX_REP;
2608 break;
2609
b1905489 2610 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2611 q = LOCK_PREFIX;
2612 ret = PREFIX_LOCK;
b1905489
JB
2613 break;
2614
2615 case FWAIT_OPCODE:
2616 q = WAIT_PREFIX;
2617 break;
2618
2619 case ADDR_PREFIX_OPCODE:
2620 q = ADDR_PREFIX;
2621 break;
2622
2623 case DATA_PREFIX_OPCODE:
2624 q = DATA_PREFIX;
2625 break;
2626 }
2627 if (i.prefix[q] != 0)
c32fa91d 2628 ret = PREFIX_EXIST;
b1905489 2629 }
252b5132 2630
b1905489 2631 if (ret)
252b5132 2632 {
b1905489
JB
2633 if (!i.prefix[q])
2634 ++i.prefixes;
2635 i.prefix[q] |= prefix;
252b5132 2636 }
b1905489
JB
2637 else
2638 as_bad (_("same type of prefix used twice"));
252b5132 2639
252b5132
RH
2640 return ret;
2641}
2642
2643static void
78f12dd3 2644update_code_flag (int value, int check)
eecb386c 2645{
78f12dd3
L
2646 PRINTF_LIKE ((*as_error));
2647
1e9cc1c2 2648 flag_code = (enum flag_code) value;
40fb9820
L
2649 if (flag_code == CODE_64BIT)
2650 {
2651 cpu_arch_flags.bitfield.cpu64 = 1;
2652 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
2653 }
2654 else
2655 {
2656 cpu_arch_flags.bitfield.cpu64 = 0;
2657 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
2658 }
2659 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c 2660 {
78f12dd3
L
2661 if (check)
2662 as_error = as_fatal;
2663 else
2664 as_error = as_bad;
2665 (*as_error) (_("64bit mode not supported on `%s'."),
2666 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2667 }
40fb9820 2668 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c 2669 {
78f12dd3
L
2670 if (check)
2671 as_error = as_fatal;
2672 else
2673 as_error = as_bad;
2674 (*as_error) (_("32bit mode not supported on `%s'."),
2675 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2676 }
eecb386c
AM
2677 stackop_size = '\0';
2678}
2679
78f12dd3
L
2680static void
2681set_code_flag (int value)
2682{
2683 update_code_flag (value, 0);
2684}
2685
eecb386c 2686static void
e3bb37b5 2687set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2688{
1e9cc1c2 2689 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2690 if (flag_code != CODE_16BIT)
2691 abort ();
2692 cpu_arch_flags.bitfield.cpu64 = 0;
2693 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 2694 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2695}
2696
2697static void
e3bb37b5 2698set_intel_syntax (int syntax_flag)
252b5132
RH
2699{
2700 /* Find out if register prefixing is specified. */
2701 int ask_naked_reg = 0;
2702
2703 SKIP_WHITESPACE ();
29b0f896 2704 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2705 {
d02603dc
NC
2706 char *string;
2707 int e = get_symbol_name (&string);
252b5132 2708
47926f60 2709 if (strcmp (string, "prefix") == 0)
252b5132 2710 ask_naked_reg = 1;
47926f60 2711 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2712 ask_naked_reg = -1;
2713 else
d0b47220 2714 as_bad (_("bad argument to syntax directive."));
d02603dc 2715 (void) restore_line_pointer (e);
252b5132
RH
2716 }
2717 demand_empty_rest_of_line ();
c3332e24 2718
252b5132
RH
2719 intel_syntax = syntax_flag;
2720
2721 if (ask_naked_reg == 0)
f86103b7
AM
2722 allow_naked_reg = (intel_syntax
2723 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2724 else
2725 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2726
ee86248c 2727 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
7ab9ffdd 2728
e4a3b5a4 2729 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 2730 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 2731 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
2732}
2733
1efbbeb4
L
2734static void
2735set_intel_mnemonic (int mnemonic_flag)
2736{
e1d4d893 2737 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2738}
2739
db51cc60
L
2740static void
2741set_allow_index_reg (int flag)
2742{
2743 allow_index_reg = flag;
2744}
2745
cb19c032 2746static void
7bab8ab5 2747set_check (int what)
cb19c032 2748{
7bab8ab5
JB
2749 enum check_kind *kind;
2750 const char *str;
2751
2752 if (what)
2753 {
2754 kind = &operand_check;
2755 str = "operand";
2756 }
2757 else
2758 {
2759 kind = &sse_check;
2760 str = "sse";
2761 }
2762
cb19c032
L
2763 SKIP_WHITESPACE ();
2764
2765 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2766 {
d02603dc
NC
2767 char *string;
2768 int e = get_symbol_name (&string);
cb19c032
L
2769
2770 if (strcmp (string, "none") == 0)
7bab8ab5 2771 *kind = check_none;
cb19c032 2772 else if (strcmp (string, "warning") == 0)
7bab8ab5 2773 *kind = check_warning;
cb19c032 2774 else if (strcmp (string, "error") == 0)
7bab8ab5 2775 *kind = check_error;
cb19c032 2776 else
7bab8ab5 2777 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2778 (void) restore_line_pointer (e);
cb19c032
L
2779 }
2780 else
7bab8ab5 2781 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2782
2783 demand_empty_rest_of_line ();
2784}
2785
8a9036a4
L
2786static void
2787check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2788 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2789{
2790#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2791 static const char *arch;
2792
2793 /* Intel LIOM is only supported on ELF. */
2794 if (!IS_ELF)
2795 return;
2796
2797 if (!arch)
2798 {
2799 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2800 use default_arch. */
2801 arch = cpu_arch_name;
2802 if (!arch)
2803 arch = default_arch;
2804 }
2805
81486035
L
2806 /* If we are targeting Intel MCU, we must enable it. */
2807 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_IAMCU
2808 || new_flag.bitfield.cpuiamcu)
2809 return;
2810
3632d14b 2811 /* If we are targeting Intel L1OM, we must enable it. */
8a9036a4 2812 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_L1OM
1e9cc1c2 2813 || new_flag.bitfield.cpul1om)
8a9036a4 2814 return;
76ba9986 2815
7a9068fe
L
2816 /* If we are targeting Intel K1OM, we must enable it. */
2817 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_K1OM
2818 || new_flag.bitfield.cpuk1om)
2819 return;
2820
8a9036a4
L
2821 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2822#endif
2823}
2824
e413e4e9 2825static void
e3bb37b5 2826set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2827{
47926f60 2828 SKIP_WHITESPACE ();
e413e4e9 2829
29b0f896 2830 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9 2831 {
d02603dc
NC
2832 char *string;
2833 int e = get_symbol_name (&string);
91d6fa6a 2834 unsigned int j;
40fb9820 2835 i386_cpu_flags flags;
e413e4e9 2836
91d6fa6a 2837 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
e413e4e9 2838 {
91d6fa6a 2839 if (strcmp (string, cpu_arch[j].name) == 0)
e413e4e9 2840 {
91d6fa6a 2841 check_cpu_arch_compatible (string, cpu_arch[j].flags);
8a9036a4 2842
5c6af06e
JB
2843 if (*string != '.')
2844 {
91d6fa6a 2845 cpu_arch_name = cpu_arch[j].name;
5c6af06e 2846 cpu_sub_arch_name = NULL;
91d6fa6a 2847 cpu_arch_flags = cpu_arch[j].flags;
40fb9820
L
2848 if (flag_code == CODE_64BIT)
2849 {
2850 cpu_arch_flags.bitfield.cpu64 = 1;
2851 cpu_arch_flags.bitfield.cpuno64 = 0;
2852 }
2853 else
2854 {
2855 cpu_arch_flags.bitfield.cpu64 = 0;
2856 cpu_arch_flags.bitfield.cpuno64 = 1;
2857 }
91d6fa6a
NC
2858 cpu_arch_isa = cpu_arch[j].type;
2859 cpu_arch_isa_flags = cpu_arch[j].flags;
ccc9c027
L
2860 if (!cpu_arch_tune_set)
2861 {
2862 cpu_arch_tune = cpu_arch_isa;
2863 cpu_arch_tune_flags = cpu_arch_isa_flags;
2864 }
5c6af06e
JB
2865 break;
2866 }
40fb9820 2867
293f5f65
L
2868 flags = cpu_flags_or (cpu_arch_flags,
2869 cpu_arch[j].flags);
81486035 2870
5b64d091 2871 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
5c6af06e 2872 {
6305a203
L
2873 if (cpu_sub_arch_name)
2874 {
2875 char *name = cpu_sub_arch_name;
2876 cpu_sub_arch_name = concat (name,
91d6fa6a 2877 cpu_arch[j].name,
1bf57e9f 2878 (const char *) NULL);
6305a203
L
2879 free (name);
2880 }
2881 else
91d6fa6a 2882 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
40fb9820 2883 cpu_arch_flags = flags;
a586129e 2884 cpu_arch_isa_flags = flags;
5c6af06e 2885 }
0089dace
L
2886 else
2887 cpu_arch_isa_flags
2888 = cpu_flags_or (cpu_arch_isa_flags,
2889 cpu_arch[j].flags);
d02603dc 2890 (void) restore_line_pointer (e);
5c6af06e
JB
2891 demand_empty_rest_of_line ();
2892 return;
e413e4e9
AM
2893 }
2894 }
293f5f65
L
2895
2896 if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
2897 {
33eaf5de 2898 /* Disable an ISA extension. */
293f5f65
L
2899 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
2900 if (strcmp (string + 1, cpu_noarch [j].name) == 0)
2901 {
2902 flags = cpu_flags_and_not (cpu_arch_flags,
2903 cpu_noarch[j].flags);
2904 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2905 {
2906 if (cpu_sub_arch_name)
2907 {
2908 char *name = cpu_sub_arch_name;
2909 cpu_sub_arch_name = concat (name, string,
2910 (const char *) NULL);
2911 free (name);
2912 }
2913 else
2914 cpu_sub_arch_name = xstrdup (string);
2915 cpu_arch_flags = flags;
2916 cpu_arch_isa_flags = flags;
2917 }
2918 (void) restore_line_pointer (e);
2919 demand_empty_rest_of_line ();
2920 return;
2921 }
2922
2923 j = ARRAY_SIZE (cpu_arch);
2924 }
2925
91d6fa6a 2926 if (j >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
2927 as_bad (_("no such architecture: `%s'"), string);
2928
2929 *input_line_pointer = e;
2930 }
2931 else
2932 as_bad (_("missing cpu architecture"));
2933
fddf5b5b
AM
2934 no_cond_jump_promotion = 0;
2935 if (*input_line_pointer == ','
29b0f896 2936 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 2937 {
d02603dc
NC
2938 char *string;
2939 char e;
2940
2941 ++input_line_pointer;
2942 e = get_symbol_name (&string);
fddf5b5b
AM
2943
2944 if (strcmp (string, "nojumps") == 0)
2945 no_cond_jump_promotion = 1;
2946 else if (strcmp (string, "jumps") == 0)
2947 ;
2948 else
2949 as_bad (_("no such architecture modifier: `%s'"), string);
2950
d02603dc 2951 (void) restore_line_pointer (e);
fddf5b5b
AM
2952 }
2953
e413e4e9
AM
2954 demand_empty_rest_of_line ();
2955}
2956
8a9036a4
L
2957enum bfd_architecture
2958i386_arch (void)
2959{
3632d14b 2960 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4
L
2961 {
2962 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2963 || flag_code != CODE_64BIT)
2964 as_fatal (_("Intel L1OM is 64bit ELF only"));
2965 return bfd_arch_l1om;
2966 }
7a9068fe
L
2967 else if (cpu_arch_isa == PROCESSOR_K1OM)
2968 {
2969 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2970 || flag_code != CODE_64BIT)
2971 as_fatal (_("Intel K1OM is 64bit ELF only"));
2972 return bfd_arch_k1om;
2973 }
81486035
L
2974 else if (cpu_arch_isa == PROCESSOR_IAMCU)
2975 {
2976 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2977 || flag_code == CODE_64BIT)
2978 as_fatal (_("Intel MCU is 32bit ELF only"));
2979 return bfd_arch_iamcu;
2980 }
8a9036a4
L
2981 else
2982 return bfd_arch_i386;
2983}
2984
b9d79e03 2985unsigned long
7016a5d5 2986i386_mach (void)
b9d79e03 2987{
351f65ca 2988 if (!strncmp (default_arch, "x86_64", 6))
8a9036a4 2989 {
3632d14b 2990 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 2991 {
351f65ca
L
2992 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2993 || default_arch[6] != '\0')
8a9036a4
L
2994 as_fatal (_("Intel L1OM is 64bit ELF only"));
2995 return bfd_mach_l1om;
2996 }
7a9068fe
L
2997 else if (cpu_arch_isa == PROCESSOR_K1OM)
2998 {
2999 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3000 || default_arch[6] != '\0')
3001 as_fatal (_("Intel K1OM is 64bit ELF only"));
3002 return bfd_mach_k1om;
3003 }
351f65ca 3004 else if (default_arch[6] == '\0')
8a9036a4 3005 return bfd_mach_x86_64;
351f65ca
L
3006 else
3007 return bfd_mach_x64_32;
8a9036a4 3008 }
5197d474
L
3009 else if (!strcmp (default_arch, "i386")
3010 || !strcmp (default_arch, "iamcu"))
81486035
L
3011 {
3012 if (cpu_arch_isa == PROCESSOR_IAMCU)
3013 {
3014 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
3015 as_fatal (_("Intel MCU is 32bit ELF only"));
3016 return bfd_mach_i386_iamcu;
3017 }
3018 else
3019 return bfd_mach_i386_i386;
3020 }
b9d79e03 3021 else
2b5d6a91 3022 as_fatal (_("unknown architecture"));
b9d79e03 3023}
b9d79e03 3024\f
252b5132 3025void
7016a5d5 3026md_begin (void)
252b5132
RH
3027{
3028 const char *hash_err;
3029
86fa6981
L
3030 /* Support pseudo prefixes like {disp32}. */
3031 lex_type ['{'] = LEX_BEGIN_NAME;
3032
47926f60 3033 /* Initialize op_hash hash table. */
252b5132
RH
3034 op_hash = hash_new ();
3035
3036 {
d3ce72d0 3037 const insn_template *optab;
29b0f896 3038 templates *core_optab;
252b5132 3039
47926f60
KH
3040 /* Setup for loop. */
3041 optab = i386_optab;
add39d23 3042 core_optab = XNEW (templates);
252b5132
RH
3043 core_optab->start = optab;
3044
3045 while (1)
3046 {
3047 ++optab;
3048 if (optab->name == NULL
3049 || strcmp (optab->name, (optab - 1)->name) != 0)
3050 {
3051 /* different name --> ship out current template list;
47926f60 3052 add to hash table; & begin anew. */
252b5132
RH
3053 core_optab->end = optab;
3054 hash_err = hash_insert (op_hash,
3055 (optab - 1)->name,
5a49b8ac 3056 (void *) core_optab);
252b5132
RH
3057 if (hash_err)
3058 {
b37df7c4 3059 as_fatal (_("can't hash %s: %s"),
252b5132
RH
3060 (optab - 1)->name,
3061 hash_err);
3062 }
3063 if (optab->name == NULL)
3064 break;
add39d23 3065 core_optab = XNEW (templates);
252b5132
RH
3066 core_optab->start = optab;
3067 }
3068 }
3069 }
3070
47926f60 3071 /* Initialize reg_hash hash table. */
252b5132
RH
3072 reg_hash = hash_new ();
3073 {
29b0f896 3074 const reg_entry *regtab;
c3fe08fa 3075 unsigned int regtab_size = i386_regtab_size;
252b5132 3076
c3fe08fa 3077 for (regtab = i386_regtab; regtab_size--; regtab++)
252b5132 3078 {
5a49b8ac 3079 hash_err = hash_insert (reg_hash, regtab->reg_name, (void *) regtab);
252b5132 3080 if (hash_err)
b37df7c4 3081 as_fatal (_("can't hash %s: %s"),
3e73aa7c
JH
3082 regtab->reg_name,
3083 hash_err);
252b5132
RH
3084 }
3085 }
3086
47926f60 3087 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 3088 {
29b0f896
AM
3089 int c;
3090 char *p;
252b5132
RH
3091
3092 for (c = 0; c < 256; c++)
3093 {
3882b010 3094 if (ISDIGIT (c))
252b5132
RH
3095 {
3096 digit_chars[c] = c;
3097 mnemonic_chars[c] = c;
3098 register_chars[c] = c;
3099 operand_chars[c] = c;
3100 }
3882b010 3101 else if (ISLOWER (c))
252b5132
RH
3102 {
3103 mnemonic_chars[c] = c;
3104 register_chars[c] = c;
3105 operand_chars[c] = c;
3106 }
3882b010 3107 else if (ISUPPER (c))
252b5132 3108 {
3882b010 3109 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
3110 register_chars[c] = mnemonic_chars[c];
3111 operand_chars[c] = c;
3112 }
43234a1e 3113 else if (c == '{' || c == '}')
86fa6981
L
3114 {
3115 mnemonic_chars[c] = c;
3116 operand_chars[c] = c;
3117 }
b3983e5f
JB
3118#ifdef SVR4_COMMENT_CHARS
3119 else if (c == '\\' && strchr (i386_comment_chars, '/'))
3120 operand_chars[c] = c;
3121#endif
252b5132 3122
3882b010 3123 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
3124 identifier_chars[c] = c;
3125 else if (c >= 128)
3126 {
3127 identifier_chars[c] = c;
3128 operand_chars[c] = c;
3129 }
3130 }
3131
3132#ifdef LEX_AT
3133 identifier_chars['@'] = '@';
32137342
NC
3134#endif
3135#ifdef LEX_QM
3136 identifier_chars['?'] = '?';
3137 operand_chars['?'] = '?';
252b5132 3138#endif
252b5132 3139 digit_chars['-'] = '-';
c0f3af97 3140 mnemonic_chars['_'] = '_';
791fe849 3141 mnemonic_chars['-'] = '-';
0003779b 3142 mnemonic_chars['.'] = '.';
252b5132
RH
3143 identifier_chars['_'] = '_';
3144 identifier_chars['.'] = '.';
3145
3146 for (p = operand_special_chars; *p != '\0'; p++)
3147 operand_chars[(unsigned char) *p] = *p;
3148 }
3149
a4447b93
RH
3150 if (flag_code == CODE_64BIT)
3151 {
ca19b261
KT
3152#if defined (OBJ_COFF) && defined (TE_PE)
3153 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
3154 ? 32 : 16);
3155#else
a4447b93 3156 x86_dwarf2_return_column = 16;
ca19b261 3157#endif
61ff971f 3158 x86_cie_data_alignment = -8;
a4447b93
RH
3159 }
3160 else
3161 {
3162 x86_dwarf2_return_column = 8;
3163 x86_cie_data_alignment = -4;
3164 }
e379e5f3
L
3165
3166 /* NB: FUSED_JCC_PADDING frag must have sufficient room so that it
3167 can be turned into BRANCH_PREFIX frag. */
3168 if (align_branch_prefix_size > MAX_FUSED_JCC_PADDING_SIZE)
3169 abort ();
252b5132
RH
3170}
3171
3172void
e3bb37b5 3173i386_print_statistics (FILE *file)
252b5132
RH
3174{
3175 hash_print_statistics (file, "i386 opcode", op_hash);
3176 hash_print_statistics (file, "i386 register", reg_hash);
3177}
3178\f
252b5132
RH
3179#ifdef DEBUG386
3180
ce8a8b2f 3181/* Debugging routines for md_assemble. */
d3ce72d0 3182static void pte (insn_template *);
40fb9820 3183static void pt (i386_operand_type);
e3bb37b5
L
3184static void pe (expressionS *);
3185static void ps (symbolS *);
252b5132
RH
3186
3187static void
2c703856 3188pi (const char *line, i386_insn *x)
252b5132 3189{
09137c09 3190 unsigned int j;
252b5132
RH
3191
3192 fprintf (stdout, "%s: template ", line);
3193 pte (&x->tm);
09f131f2
JH
3194 fprintf (stdout, " address: base %s index %s scale %x\n",
3195 x->base_reg ? x->base_reg->reg_name : "none",
3196 x->index_reg ? x->index_reg->reg_name : "none",
3197 x->log2_scale_factor);
3198 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 3199 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
3200 fprintf (stdout, " sib: base %x index %x scale %x\n",
3201 x->sib.base, x->sib.index, x->sib.scale);
3202 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
3203 (x->rex & REX_W) != 0,
3204 (x->rex & REX_R) != 0,
3205 (x->rex & REX_X) != 0,
3206 (x->rex & REX_B) != 0);
09137c09 3207 for (j = 0; j < x->operands; j++)
252b5132 3208 {
09137c09
SP
3209 fprintf (stdout, " #%d: ", j + 1);
3210 pt (x->types[j]);
252b5132 3211 fprintf (stdout, "\n");
bab6aec1 3212 if (x->types[j].bitfield.class == Reg
3528c362
JB
3213 || x->types[j].bitfield.class == RegMMX
3214 || x->types[j].bitfield.class == RegSIMD
dd6b8a0b 3215 || x->types[j].bitfield.class == RegMask
00cee14f 3216 || x->types[j].bitfield.class == SReg
4a5c67ed
JB
3217 || x->types[j].bitfield.class == RegCR
3218 || x->types[j].bitfield.class == RegDR
dd6b8a0b
JB
3219 || x->types[j].bitfield.class == RegTR
3220 || x->types[j].bitfield.class == RegBND)
09137c09
SP
3221 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
3222 if (operand_type_check (x->types[j], imm))
3223 pe (x->op[j].imms);
3224 if (operand_type_check (x->types[j], disp))
3225 pe (x->op[j].disps);
252b5132
RH
3226 }
3227}
3228
3229static void
d3ce72d0 3230pte (insn_template *t)
252b5132 3231{
09137c09 3232 unsigned int j;
252b5132 3233 fprintf (stdout, " %d operands ", t->operands);
47926f60 3234 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
3235 if (t->extension_opcode != None)
3236 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 3237 if (t->opcode_modifier.d)
252b5132 3238 fprintf (stdout, "D");
40fb9820 3239 if (t->opcode_modifier.w)
252b5132
RH
3240 fprintf (stdout, "W");
3241 fprintf (stdout, "\n");
09137c09 3242 for (j = 0; j < t->operands; j++)
252b5132 3243 {
09137c09
SP
3244 fprintf (stdout, " #%d type ", j + 1);
3245 pt (t->operand_types[j]);
252b5132
RH
3246 fprintf (stdout, "\n");
3247 }
3248}
3249
3250static void
e3bb37b5 3251pe (expressionS *e)
252b5132 3252{
24eab124 3253 fprintf (stdout, " operation %d\n", e->X_op);
b77ad1d4
AM
3254 fprintf (stdout, " add_number %ld (%lx)\n",
3255 (long) e->X_add_number, (long) e->X_add_number);
252b5132
RH
3256 if (e->X_add_symbol)
3257 {
3258 fprintf (stdout, " add_symbol ");
3259 ps (e->X_add_symbol);
3260 fprintf (stdout, "\n");
3261 }
3262 if (e->X_op_symbol)
3263 {
3264 fprintf (stdout, " op_symbol ");
3265 ps (e->X_op_symbol);
3266 fprintf (stdout, "\n");
3267 }
3268}
3269
3270static void
e3bb37b5 3271ps (symbolS *s)
252b5132
RH
3272{
3273 fprintf (stdout, "%s type %s%s",
3274 S_GET_NAME (s),
3275 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3276 segment_name (S_GET_SEGMENT (s)));
3277}
3278
7b81dfbb 3279static struct type_name
252b5132 3280 {
40fb9820
L
3281 i386_operand_type mask;
3282 const char *name;
252b5132 3283 }
7b81dfbb 3284const type_names[] =
252b5132 3285{
40fb9820
L
3286 { OPERAND_TYPE_REG8, "r8" },
3287 { OPERAND_TYPE_REG16, "r16" },
3288 { OPERAND_TYPE_REG32, "r32" },
3289 { OPERAND_TYPE_REG64, "r64" },
2c703856
JB
3290 { OPERAND_TYPE_ACC8, "acc8" },
3291 { OPERAND_TYPE_ACC16, "acc16" },
3292 { OPERAND_TYPE_ACC32, "acc32" },
3293 { OPERAND_TYPE_ACC64, "acc64" },
40fb9820
L
3294 { OPERAND_TYPE_IMM8, "i8" },
3295 { OPERAND_TYPE_IMM8, "i8s" },
3296 { OPERAND_TYPE_IMM16, "i16" },
3297 { OPERAND_TYPE_IMM32, "i32" },
3298 { OPERAND_TYPE_IMM32S, "i32s" },
3299 { OPERAND_TYPE_IMM64, "i64" },
3300 { OPERAND_TYPE_IMM1, "i1" },
3301 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
3302 { OPERAND_TYPE_DISP8, "d8" },
3303 { OPERAND_TYPE_DISP16, "d16" },
3304 { OPERAND_TYPE_DISP32, "d32" },
3305 { OPERAND_TYPE_DISP32S, "d32s" },
3306 { OPERAND_TYPE_DISP64, "d64" },
3307 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
3308 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
3309 { OPERAND_TYPE_CONTROL, "control reg" },
3310 { OPERAND_TYPE_TEST, "test reg" },
3311 { OPERAND_TYPE_DEBUG, "debug reg" },
3312 { OPERAND_TYPE_FLOATREG, "FReg" },
3313 { OPERAND_TYPE_FLOATACC, "FAcc" },
21df382b 3314 { OPERAND_TYPE_SREG, "SReg" },
40fb9820
L
3315 { OPERAND_TYPE_REGMMX, "rMMX" },
3316 { OPERAND_TYPE_REGXMM, "rXMM" },
0349dc08 3317 { OPERAND_TYPE_REGYMM, "rYMM" },
43234a1e 3318 { OPERAND_TYPE_REGZMM, "rZMM" },
260cd341 3319 { OPERAND_TYPE_REGTMM, "rTMM" },
43234a1e 3320 { OPERAND_TYPE_REGMASK, "Mask reg" },
252b5132
RH
3321};
3322
3323static void
40fb9820 3324pt (i386_operand_type t)
252b5132 3325{
40fb9820 3326 unsigned int j;
c6fb90c8 3327 i386_operand_type a;
252b5132 3328
40fb9820 3329 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3330 {
3331 a = operand_type_and (t, type_names[j].mask);
2c703856 3332 if (operand_type_equal (&a, &type_names[j].mask))
c6fb90c8
L
3333 fprintf (stdout, "%s, ", type_names[j].name);
3334 }
252b5132
RH
3335 fflush (stdout);
3336}
3337
3338#endif /* DEBUG386 */
3339\f
252b5132 3340static bfd_reloc_code_real_type
3956db08 3341reloc (unsigned int size,
64e74474
AM
3342 int pcrel,
3343 int sign,
3344 bfd_reloc_code_real_type other)
252b5132 3345{
47926f60 3346 if (other != NO_RELOC)
3956db08 3347 {
91d6fa6a 3348 reloc_howto_type *rel;
3956db08
JB
3349
3350 if (size == 8)
3351 switch (other)
3352 {
64e74474
AM
3353 case BFD_RELOC_X86_64_GOT32:
3354 return BFD_RELOC_X86_64_GOT64;
3355 break;
553d1284
L
3356 case BFD_RELOC_X86_64_GOTPLT64:
3357 return BFD_RELOC_X86_64_GOTPLT64;
3358 break;
64e74474
AM
3359 case BFD_RELOC_X86_64_PLTOFF64:
3360 return BFD_RELOC_X86_64_PLTOFF64;
3361 break;
3362 case BFD_RELOC_X86_64_GOTPC32:
3363 other = BFD_RELOC_X86_64_GOTPC64;
3364 break;
3365 case BFD_RELOC_X86_64_GOTPCREL:
3366 other = BFD_RELOC_X86_64_GOTPCREL64;
3367 break;
3368 case BFD_RELOC_X86_64_TPOFF32:
3369 other = BFD_RELOC_X86_64_TPOFF64;
3370 break;
3371 case BFD_RELOC_X86_64_DTPOFF32:
3372 other = BFD_RELOC_X86_64_DTPOFF64;
3373 break;
3374 default:
3375 break;
3956db08 3376 }
e05278af 3377
8ce3d284 3378#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3379 if (other == BFD_RELOC_SIZE32)
3380 {
3381 if (size == 8)
1ab668bf 3382 other = BFD_RELOC_SIZE64;
8fd4256d 3383 if (pcrel)
1ab668bf
AM
3384 {
3385 as_bad (_("there are no pc-relative size relocations"));
3386 return NO_RELOC;
3387 }
8fd4256d 3388 }
8ce3d284 3389#endif
8fd4256d 3390
e05278af 3391 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3392 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3393 sign = -1;
3394
91d6fa6a
NC
3395 rel = bfd_reloc_type_lookup (stdoutput, other);
3396 if (!rel)
3956db08 3397 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3398 else if (size != bfd_get_reloc_size (rel))
3956db08 3399 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3400 bfd_get_reloc_size (rel),
3956db08 3401 size);
91d6fa6a 3402 else if (pcrel && !rel->pc_relative)
3956db08 3403 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3404 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3405 && !sign)
91d6fa6a 3406 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3407 && sign > 0))
3956db08
JB
3408 as_bad (_("relocated field and relocation type differ in signedness"));
3409 else
3410 return other;
3411 return NO_RELOC;
3412 }
252b5132
RH
3413
3414 if (pcrel)
3415 {
3e73aa7c 3416 if (!sign)
3956db08 3417 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3418 switch (size)
3419 {
3420 case 1: return BFD_RELOC_8_PCREL;
3421 case 2: return BFD_RELOC_16_PCREL;
d258b828 3422 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3423 case 8: return BFD_RELOC_64_PCREL;
252b5132 3424 }
3956db08 3425 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3426 }
3427 else
3428 {
3956db08 3429 if (sign > 0)
e5cb08ac 3430 switch (size)
3e73aa7c
JH
3431 {
3432 case 4: return BFD_RELOC_X86_64_32S;
3433 }
3434 else
3435 switch (size)
3436 {
3437 case 1: return BFD_RELOC_8;
3438 case 2: return BFD_RELOC_16;
3439 case 4: return BFD_RELOC_32;
3440 case 8: return BFD_RELOC_64;
3441 }
3956db08
JB
3442 as_bad (_("cannot do %s %u byte relocation"),
3443 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3444 }
3445
0cc9e1d3 3446 return NO_RELOC;
252b5132
RH
3447}
3448
47926f60
KH
3449/* Here we decide which fixups can be adjusted to make them relative to
3450 the beginning of the section instead of the symbol. Basically we need
3451 to make sure that the dynamic relocations are done correctly, so in
3452 some cases we force the original symbol to be used. */
3453
252b5132 3454int
e3bb37b5 3455tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3456{
6d249963 3457#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3458 if (!IS_ELF)
31312f95
AM
3459 return 1;
3460
a161fe53
AM
3461 /* Don't adjust pc-relative references to merge sections in 64-bit
3462 mode. */
3463 if (use_rela_relocations
3464 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3465 && fixP->fx_pcrel)
252b5132 3466 return 0;
31312f95 3467
8d01d9a9
AJ
3468 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3469 and changed later by validate_fix. */
3470 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3471 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3472 return 0;
3473
8fd4256d
L
3474 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3475 for size relocations. */
3476 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3477 || fixP->fx_r_type == BFD_RELOC_SIZE64
3478 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132 3479 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3480 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3481 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3482 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3483 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3484 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3485 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3486 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3487 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3488 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3489 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3490 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c 3491 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3492 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3493 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3494 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3495 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3496 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3497 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3498 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3499 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3500 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3501 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3502 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3503 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3504 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3505 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3506 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3507 return 0;
31312f95 3508#endif
252b5132
RH
3509 return 1;
3510}
252b5132 3511
b4cac588 3512static int
e3bb37b5 3513intel_float_operand (const char *mnemonic)
252b5132 3514{
9306ca4a
JB
3515 /* Note that the value returned is meaningful only for opcodes with (memory)
3516 operands, hence the code here is free to improperly handle opcodes that
3517 have no operands (for better performance and smaller code). */
3518
3519 if (mnemonic[0] != 'f')
3520 return 0; /* non-math */
3521
3522 switch (mnemonic[1])
3523 {
3524 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3525 the fs segment override prefix not currently handled because no
3526 call path can make opcodes without operands get here */
3527 case 'i':
3528 return 2 /* integer op */;
3529 case 'l':
3530 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3531 return 3; /* fldcw/fldenv */
3532 break;
3533 case 'n':
3534 if (mnemonic[2] != 'o' /* fnop */)
3535 return 3; /* non-waiting control op */
3536 break;
3537 case 'r':
3538 if (mnemonic[2] == 's')
3539 return 3; /* frstor/frstpm */
3540 break;
3541 case 's':
3542 if (mnemonic[2] == 'a')
3543 return 3; /* fsave */
3544 if (mnemonic[2] == 't')
3545 {
3546 switch (mnemonic[3])
3547 {
3548 case 'c': /* fstcw */
3549 case 'd': /* fstdw */
3550 case 'e': /* fstenv */
3551 case 's': /* fsts[gw] */
3552 return 3;
3553 }
3554 }
3555 break;
3556 case 'x':
3557 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3558 return 0; /* fxsave/fxrstor are not really math ops */
3559 break;
3560 }
252b5132 3561
9306ca4a 3562 return 1;
252b5132
RH
3563}
3564
c0f3af97
L
3565/* Build the VEX prefix. */
3566
3567static void
d3ce72d0 3568build_vex_prefix (const insn_template *t)
c0f3af97
L
3569{
3570 unsigned int register_specifier;
3571 unsigned int implied_prefix;
3572 unsigned int vector_length;
03751133 3573 unsigned int w;
c0f3af97
L
3574
3575 /* Check register specifier. */
3576 if (i.vex.register_specifier)
43234a1e
L
3577 {
3578 register_specifier =
3579 ~register_number (i.vex.register_specifier) & 0xf;
3580 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3581 }
c0f3af97
L
3582 else
3583 register_specifier = 0xf;
3584
79f0fa25
L
3585 /* Use 2-byte VEX prefix by swapping destination and source operand
3586 if there are more than 1 register operand. */
3587 if (i.reg_operands > 1
3588 && i.vec_encoding != vex_encoding_vex3
86fa6981 3589 && i.dir_encoding == dir_encoding_default
fa99fab2 3590 && i.operands == i.reg_operands
dbbc8b7e 3591 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
7f399153 3592 && i.tm.opcode_modifier.vexopcode == VEX0F
dbbc8b7e 3593 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3594 && i.rex == REX_B)
3595 {
3596 unsigned int xchg = i.operands - 1;
3597 union i386_op temp_op;
3598 i386_operand_type temp_type;
3599
3600 temp_type = i.types[xchg];
3601 i.types[xchg] = i.types[0];
3602 i.types[0] = temp_type;
3603 temp_op = i.op[xchg];
3604 i.op[xchg] = i.op[0];
3605 i.op[0] = temp_op;
3606
9c2799c2 3607 gas_assert (i.rm.mode == 3);
fa99fab2
L
3608
3609 i.rex = REX_R;
3610 xchg = i.rm.regmem;
3611 i.rm.regmem = i.rm.reg;
3612 i.rm.reg = xchg;
3613
dbbc8b7e
JB
3614 if (i.tm.opcode_modifier.d)
3615 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
3616 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
3617 else /* Use the next insn. */
3618 i.tm = t[1];
fa99fab2
L
3619 }
3620
79dec6b7
JB
3621 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3622 are no memory operands and at least 3 register ones. */
3623 if (i.reg_operands >= 3
3624 && i.vec_encoding != vex_encoding_vex3
3625 && i.reg_operands == i.operands - i.imm_operands
3626 && i.tm.opcode_modifier.vex
3627 && i.tm.opcode_modifier.commutative
3628 && (i.tm.opcode_modifier.sse2avx || optimize > 1)
3629 && i.rex == REX_B
3630 && i.vex.register_specifier
3631 && !(i.vex.register_specifier->reg_flags & RegRex))
3632 {
3633 unsigned int xchg = i.operands - i.reg_operands;
3634 union i386_op temp_op;
3635 i386_operand_type temp_type;
3636
3637 gas_assert (i.tm.opcode_modifier.vexopcode == VEX0F);
3638 gas_assert (!i.tm.opcode_modifier.sae);
3639 gas_assert (operand_type_equal (&i.types[i.operands - 2],
3640 &i.types[i.operands - 3]));
3641 gas_assert (i.rm.mode == 3);
3642
3643 temp_type = i.types[xchg];
3644 i.types[xchg] = i.types[xchg + 1];
3645 i.types[xchg + 1] = temp_type;
3646 temp_op = i.op[xchg];
3647 i.op[xchg] = i.op[xchg + 1];
3648 i.op[xchg + 1] = temp_op;
3649
3650 i.rex = 0;
3651 xchg = i.rm.regmem | 8;
3652 i.rm.regmem = ~register_specifier & 0xf;
3653 gas_assert (!(i.rm.regmem & 8));
3654 i.vex.register_specifier += xchg - i.rm.regmem;
3655 register_specifier = ~xchg & 0xf;
3656 }
3657
539f890d
L
3658 if (i.tm.opcode_modifier.vex == VEXScalar)
3659 vector_length = avxscalar;
10c17abd
JB
3660 else if (i.tm.opcode_modifier.vex == VEX256)
3661 vector_length = 1;
539f890d 3662 else
10c17abd 3663 {
56522fc5 3664 unsigned int op;
10c17abd 3665
c7213af9
L
3666 /* Determine vector length from the last multi-length vector
3667 operand. */
10c17abd 3668 vector_length = 0;
56522fc5 3669 for (op = t->operands; op--;)
10c17abd
JB
3670 if (t->operand_types[op].bitfield.xmmword
3671 && t->operand_types[op].bitfield.ymmword
3672 && i.types[op].bitfield.ymmword)
3673 {
3674 vector_length = 1;
3675 break;
3676 }
3677 }
c0f3af97 3678
8c190ce0 3679 switch ((i.tm.base_opcode >> (i.tm.opcode_length << 3)) & 0xff)
c0f3af97
L
3680 {
3681 case 0:
3682 implied_prefix = 0;
3683 break;
3684 case DATA_PREFIX_OPCODE:
3685 implied_prefix = 1;
3686 break;
3687 case REPE_PREFIX_OPCODE:
3688 implied_prefix = 2;
3689 break;
3690 case REPNE_PREFIX_OPCODE:
3691 implied_prefix = 3;
3692 break;
3693 default:
3694 abort ();
3695 }
3696
03751133
L
3697 /* Check the REX.W bit and VEXW. */
3698 if (i.tm.opcode_modifier.vexw == VEXWIG)
3699 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
3700 else if (i.tm.opcode_modifier.vexw)
3701 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3702 else
931d03b7 3703 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3704
c0f3af97 3705 /* Use 2-byte VEX prefix if possible. */
03751133
L
3706 if (w == 0
3707 && i.vec_encoding != vex_encoding_vex3
86fa6981 3708 && i.tm.opcode_modifier.vexopcode == VEX0F
c0f3af97
L
3709 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3710 {
3711 /* 2-byte VEX prefix. */
3712 unsigned int r;
3713
3714 i.vex.length = 2;
3715 i.vex.bytes[0] = 0xc5;
3716
3717 /* Check the REX.R bit. */
3718 r = (i.rex & REX_R) ? 0 : 1;
3719 i.vex.bytes[1] = (r << 7
3720 | register_specifier << 3
3721 | vector_length << 2
3722 | implied_prefix);
3723 }
3724 else
3725 {
3726 /* 3-byte VEX prefix. */
03751133 3727 unsigned int m;
c0f3af97 3728
f88c9eb0 3729 i.vex.length = 3;
f88c9eb0 3730
7f399153 3731 switch (i.tm.opcode_modifier.vexopcode)
5dd85c99 3732 {
7f399153
L
3733 case VEX0F:
3734 m = 0x1;
80de6e00 3735 i.vex.bytes[0] = 0xc4;
7f399153
L
3736 break;
3737 case VEX0F38:
3738 m = 0x2;
80de6e00 3739 i.vex.bytes[0] = 0xc4;
7f399153
L
3740 break;
3741 case VEX0F3A:
3742 m = 0x3;
80de6e00 3743 i.vex.bytes[0] = 0xc4;
7f399153
L
3744 break;
3745 case XOP08:
5dd85c99
SP
3746 m = 0x8;
3747 i.vex.bytes[0] = 0x8f;
7f399153
L
3748 break;
3749 case XOP09:
f88c9eb0
SP
3750 m = 0x9;
3751 i.vex.bytes[0] = 0x8f;
7f399153
L
3752 break;
3753 case XOP0A:
f88c9eb0
SP
3754 m = 0xa;
3755 i.vex.bytes[0] = 0x8f;
7f399153
L
3756 break;
3757 default:
3758 abort ();
f88c9eb0 3759 }
c0f3af97 3760
c0f3af97
L
3761 /* The high 3 bits of the second VEX byte are 1's compliment
3762 of RXB bits from REX. */
3763 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3764
c0f3af97
L
3765 i.vex.bytes[2] = (w << 7
3766 | register_specifier << 3
3767 | vector_length << 2
3768 | implied_prefix);
3769 }
3770}
3771
e771e7c9
JB
3772static INLINE bfd_boolean
3773is_evex_encoding (const insn_template *t)
3774{
7091c612 3775 return t->opcode_modifier.evex || t->opcode_modifier.disp8memshift
e771e7c9 3776 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
a80195f1 3777 || t->opcode_modifier.sae;
e771e7c9
JB
3778}
3779
7a8655d2
JB
3780static INLINE bfd_boolean
3781is_any_vex_encoding (const insn_template *t)
3782{
3783 return t->opcode_modifier.vex || t->opcode_modifier.vexopcode
3784 || is_evex_encoding (t);
3785}
3786
43234a1e
L
3787/* Build the EVEX prefix. */
3788
3789static void
3790build_evex_prefix (void)
3791{
3792 unsigned int register_specifier;
3793 unsigned int implied_prefix;
3794 unsigned int m, w;
3795 rex_byte vrex_used = 0;
3796
3797 /* Check register specifier. */
3798 if (i.vex.register_specifier)
3799 {
3800 gas_assert ((i.vrex & REX_X) == 0);
3801
3802 register_specifier = i.vex.register_specifier->reg_num;
3803 if ((i.vex.register_specifier->reg_flags & RegRex))
3804 register_specifier += 8;
3805 /* The upper 16 registers are encoded in the fourth byte of the
3806 EVEX prefix. */
3807 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3808 i.vex.bytes[3] = 0x8;
3809 register_specifier = ~register_specifier & 0xf;
3810 }
3811 else
3812 {
3813 register_specifier = 0xf;
3814
3815 /* Encode upper 16 vector index register in the fourth byte of
3816 the EVEX prefix. */
3817 if (!(i.vrex & REX_X))
3818 i.vex.bytes[3] = 0x8;
3819 else
3820 vrex_used |= REX_X;
3821 }
3822
3823 switch ((i.tm.base_opcode >> 8) & 0xff)
3824 {
3825 case 0:
3826 implied_prefix = 0;
3827 break;
3828 case DATA_PREFIX_OPCODE:
3829 implied_prefix = 1;
3830 break;
3831 case REPE_PREFIX_OPCODE:
3832 implied_prefix = 2;
3833 break;
3834 case REPNE_PREFIX_OPCODE:
3835 implied_prefix = 3;
3836 break;
3837 default:
3838 abort ();
3839 }
3840
3841 /* 4 byte EVEX prefix. */
3842 i.vex.length = 4;
3843 i.vex.bytes[0] = 0x62;
3844
3845 /* mmmm bits. */
3846 switch (i.tm.opcode_modifier.vexopcode)
3847 {
3848 case VEX0F:
3849 m = 1;
3850 break;
3851 case VEX0F38:
3852 m = 2;
3853 break;
3854 case VEX0F3A:
3855 m = 3;
3856 break;
3857 default:
3858 abort ();
3859 break;
3860 }
3861
3862 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3863 bits from REX. */
3864 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3865
3866 /* The fifth bit of the second EVEX byte is 1's compliment of the
3867 REX_R bit in VREX. */
3868 if (!(i.vrex & REX_R))
3869 i.vex.bytes[1] |= 0x10;
3870 else
3871 vrex_used |= REX_R;
3872
3873 if ((i.reg_operands + i.imm_operands) == i.operands)
3874 {
3875 /* When all operands are registers, the REX_X bit in REX is not
3876 used. We reuse it to encode the upper 16 registers, which is
3877 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3878 as 1's compliment. */
3879 if ((i.vrex & REX_B))
3880 {
3881 vrex_used |= REX_B;
3882 i.vex.bytes[1] &= ~0x40;
3883 }
3884 }
3885
3886 /* EVEX instructions shouldn't need the REX prefix. */
3887 i.vrex &= ~vrex_used;
3888 gas_assert (i.vrex == 0);
3889
6865c043
L
3890 /* Check the REX.W bit and VEXW. */
3891 if (i.tm.opcode_modifier.vexw == VEXWIG)
3892 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
3893 else if (i.tm.opcode_modifier.vexw)
3894 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3895 else
931d03b7 3896 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e
L
3897
3898 /* Encode the U bit. */
3899 implied_prefix |= 0x4;
3900
3901 /* The third byte of the EVEX prefix. */
3902 i.vex.bytes[2] = (w << 7 | register_specifier << 3 | implied_prefix);
3903
3904 /* The fourth byte of the EVEX prefix. */
3905 /* The zeroing-masking bit. */
3906 if (i.mask && i.mask->zeroing)
3907 i.vex.bytes[3] |= 0x80;
3908
3909 /* Don't always set the broadcast bit if there is no RC. */
3910 if (!i.rounding)
3911 {
3912 /* Encode the vector length. */
3913 unsigned int vec_length;
3914
e771e7c9
JB
3915 if (!i.tm.opcode_modifier.evex
3916 || i.tm.opcode_modifier.evex == EVEXDYN)
3917 {
56522fc5 3918 unsigned int op;
e771e7c9 3919
c7213af9
L
3920 /* Determine vector length from the last multi-length vector
3921 operand. */
56522fc5 3922 for (op = i.operands; op--;)
e771e7c9
JB
3923 if (i.tm.operand_types[op].bitfield.xmmword
3924 + i.tm.operand_types[op].bitfield.ymmword
3925 + i.tm.operand_types[op].bitfield.zmmword > 1)
3926 {
3927 if (i.types[op].bitfield.zmmword)
c7213af9
L
3928 {
3929 i.tm.opcode_modifier.evex = EVEX512;
3930 break;
3931 }
e771e7c9 3932 else if (i.types[op].bitfield.ymmword)
c7213af9
L
3933 {
3934 i.tm.opcode_modifier.evex = EVEX256;
3935 break;
3936 }
e771e7c9 3937 else if (i.types[op].bitfield.xmmword)
c7213af9
L
3938 {
3939 i.tm.opcode_modifier.evex = EVEX128;
3940 break;
3941 }
625cbd7a
JB
3942 else if (i.broadcast && (int) op == i.broadcast->operand)
3943 {
4a1b91ea 3944 switch (i.broadcast->bytes)
625cbd7a
JB
3945 {
3946 case 64:
3947 i.tm.opcode_modifier.evex = EVEX512;
3948 break;
3949 case 32:
3950 i.tm.opcode_modifier.evex = EVEX256;
3951 break;
3952 case 16:
3953 i.tm.opcode_modifier.evex = EVEX128;
3954 break;
3955 default:
c7213af9 3956 abort ();
625cbd7a 3957 }
c7213af9 3958 break;
625cbd7a 3959 }
e771e7c9 3960 }
c7213af9 3961
56522fc5 3962 if (op >= MAX_OPERANDS)
c7213af9 3963 abort ();
e771e7c9
JB
3964 }
3965
43234a1e
L
3966 switch (i.tm.opcode_modifier.evex)
3967 {
3968 case EVEXLIG: /* LL' is ignored */
3969 vec_length = evexlig << 5;
3970 break;
3971 case EVEX128:
3972 vec_length = 0 << 5;
3973 break;
3974 case EVEX256:
3975 vec_length = 1 << 5;
3976 break;
3977 case EVEX512:
3978 vec_length = 2 << 5;
3979 break;
3980 default:
3981 abort ();
3982 break;
3983 }
3984 i.vex.bytes[3] |= vec_length;
3985 /* Encode the broadcast bit. */
3986 if (i.broadcast)
3987 i.vex.bytes[3] |= 0x10;
3988 }
3989 else
3990 {
3991 if (i.rounding->type != saeonly)
3992 i.vex.bytes[3] |= 0x10 | (i.rounding->type << 5);
3993 else
d3d3c6db 3994 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e
L
3995 }
3996
3997 if (i.mask && i.mask->mask)
3998 i.vex.bytes[3] |= i.mask->mask->reg_num;
3999}
4000
65da13b5
L
4001static void
4002process_immext (void)
4003{
4004 expressionS *exp;
4005
c0f3af97 4006 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
4007 which is coded in the same place as an 8-bit immediate field
4008 would be. Here we fake an 8-bit immediate operand from the
4009 opcode suffix stored in tm.extension_opcode.
4010
c1e679ec 4011 AVX instructions also use this encoding, for some of
c0f3af97 4012 3 argument instructions. */
65da13b5 4013
43234a1e 4014 gas_assert (i.imm_operands <= 1
7ab9ffdd 4015 && (i.operands <= 2
7a8655d2 4016 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 4017 && i.operands <= 4)));
65da13b5
L
4018
4019 exp = &im_expressions[i.imm_operands++];
4020 i.op[i.operands].imms = exp;
4021 i.types[i.operands] = imm8;
4022 i.operands++;
4023 exp->X_op = O_constant;
4024 exp->X_add_number = i.tm.extension_opcode;
4025 i.tm.extension_opcode = None;
4026}
4027
42164a71
L
4028
4029static int
4030check_hle (void)
4031{
4032 switch (i.tm.opcode_modifier.hleprefixok)
4033 {
4034 default:
4035 abort ();
82c2def5 4036 case HLEPrefixNone:
165de32a
L
4037 as_bad (_("invalid instruction `%s' after `%s'"),
4038 i.tm.name, i.hle_prefix);
42164a71 4039 return 0;
82c2def5 4040 case HLEPrefixLock:
42164a71
L
4041 if (i.prefix[LOCK_PREFIX])
4042 return 1;
165de32a 4043 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 4044 return 0;
82c2def5 4045 case HLEPrefixAny:
42164a71 4046 return 1;
82c2def5 4047 case HLEPrefixRelease:
42164a71
L
4048 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
4049 {
4050 as_bad (_("instruction `%s' after `xacquire' not allowed"),
4051 i.tm.name);
4052 return 0;
4053 }
8dc0818e 4054 if (i.mem_operands == 0 || !(i.flags[i.operands - 1] & Operand_Mem))
42164a71
L
4055 {
4056 as_bad (_("memory destination needed for instruction `%s'"
4057 " after `xrelease'"), i.tm.name);
4058 return 0;
4059 }
4060 return 1;
4061 }
4062}
4063
b6f8c7c4
L
4064/* Try the shortest encoding by shortening operand size. */
4065
4066static void
4067optimize_encoding (void)
4068{
a0a1771e 4069 unsigned int j;
b6f8c7c4
L
4070
4071 if (optimize_for_space
72aea328 4072 && !is_any_vex_encoding (&i.tm)
b6f8c7c4
L
4073 && i.reg_operands == 1
4074 && i.imm_operands == 1
4075 && !i.types[1].bitfield.byte
4076 && i.op[0].imms->X_op == O_constant
4077 && fits_in_imm7 (i.op[0].imms->X_add_number)
72aea328 4078 && (i.tm.base_opcode == 0xa8
b6f8c7c4
L
4079 || (i.tm.base_opcode == 0xf6
4080 && i.tm.extension_opcode == 0x0)))
4081 {
4082 /* Optimize: -Os:
4083 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
4084 */
4085 unsigned int base_regnum = i.op[1].regs->reg_num;
4086 if (flag_code == CODE_64BIT || base_regnum < 4)
4087 {
4088 i.types[1].bitfield.byte = 1;
4089 /* Ignore the suffix. */
4090 i.suffix = 0;
7697afb6
JB
4091 /* Convert to byte registers. */
4092 if (i.types[1].bitfield.word)
4093 j = 16;
4094 else if (i.types[1].bitfield.dword)
4095 j = 32;
4096 else
4097 j = 48;
4098 if (!(i.op[1].regs->reg_flags & RegRex) && base_regnum < 4)
4099 j += 8;
4100 i.op[1].regs -= j;
b6f8c7c4
L
4101 }
4102 }
4103 else if (flag_code == CODE_64BIT
72aea328 4104 && !is_any_vex_encoding (&i.tm)
d3d50934
L
4105 && ((i.types[1].bitfield.qword
4106 && i.reg_operands == 1
b6f8c7c4
L
4107 && i.imm_operands == 1
4108 && i.op[0].imms->X_op == O_constant
507916b8 4109 && ((i.tm.base_opcode == 0xb8
b6f8c7c4
L
4110 && i.tm.extension_opcode == None
4111 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
4112 || (fits_in_imm31 (i.op[0].imms->X_add_number)
72aea328
JB
4113 && ((i.tm.base_opcode == 0x24
4114 || i.tm.base_opcode == 0xa8)
b6f8c7c4
L
4115 || (i.tm.base_opcode == 0x80
4116 && i.tm.extension_opcode == 0x4)
4117 || ((i.tm.base_opcode == 0xf6
507916b8 4118 || (i.tm.base_opcode | 1) == 0xc7)
b8364fa7
JB
4119 && i.tm.extension_opcode == 0x0)))
4120 || (fits_in_imm7 (i.op[0].imms->X_add_number)
4121 && i.tm.base_opcode == 0x83
4122 && i.tm.extension_opcode == 0x4)))
d3d50934
L
4123 || (i.types[0].bitfield.qword
4124 && ((i.reg_operands == 2
4125 && i.op[0].regs == i.op[1].regs
72aea328
JB
4126 && (i.tm.base_opcode == 0x30
4127 || i.tm.base_opcode == 0x28))
d3d50934
L
4128 || (i.reg_operands == 1
4129 && i.operands == 1
72aea328 4130 && i.tm.base_opcode == 0x30)))))
b6f8c7c4
L
4131 {
4132 /* Optimize: -O:
4133 andq $imm31, %r64 -> andl $imm31, %r32
b8364fa7 4134 andq $imm7, %r64 -> andl $imm7, %r32
b6f8c7c4
L
4135 testq $imm31, %r64 -> testl $imm31, %r32
4136 xorq %r64, %r64 -> xorl %r32, %r32
4137 subq %r64, %r64 -> subl %r32, %r32
4138 movq $imm31, %r64 -> movl $imm31, %r32
4139 movq $imm32, %r64 -> movl $imm32, %r32
4140 */
4141 i.tm.opcode_modifier.norex64 = 1;
507916b8 4142 if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4143 {
4144 /* Handle
4145 movq $imm31, %r64 -> movl $imm31, %r32
4146 movq $imm32, %r64 -> movl $imm32, %r32
4147 */
4148 i.tm.operand_types[0].bitfield.imm32 = 1;
4149 i.tm.operand_types[0].bitfield.imm32s = 0;
4150 i.tm.operand_types[0].bitfield.imm64 = 0;
4151 i.types[0].bitfield.imm32 = 1;
4152 i.types[0].bitfield.imm32s = 0;
4153 i.types[0].bitfield.imm64 = 0;
4154 i.types[1].bitfield.dword = 1;
4155 i.types[1].bitfield.qword = 0;
507916b8 4156 if ((i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4157 {
4158 /* Handle
4159 movq $imm31, %r64 -> movl $imm31, %r32
4160 */
507916b8 4161 i.tm.base_opcode = 0xb8;
b6f8c7c4 4162 i.tm.extension_opcode = None;
507916b8 4163 i.tm.opcode_modifier.w = 0;
b6f8c7c4
L
4164 i.tm.opcode_modifier.modrm = 0;
4165 }
4166 }
4167 }
5641ec01
JB
4168 else if (optimize > 1
4169 && !optimize_for_space
72aea328 4170 && !is_any_vex_encoding (&i.tm)
5641ec01
JB
4171 && i.reg_operands == 2
4172 && i.op[0].regs == i.op[1].regs
4173 && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8
4174 || (i.tm.base_opcode & ~(Opcode_D | 1)) == 0x20)
4175 && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword))
4176 {
4177 /* Optimize: -O2:
4178 andb %rN, %rN -> testb %rN, %rN
4179 andw %rN, %rN -> testw %rN, %rN
4180 andq %rN, %rN -> testq %rN, %rN
4181 orb %rN, %rN -> testb %rN, %rN
4182 orw %rN, %rN -> testw %rN, %rN
4183 orq %rN, %rN -> testq %rN, %rN
4184
4185 and outside of 64-bit mode
4186
4187 andl %rN, %rN -> testl %rN, %rN
4188 orl %rN, %rN -> testl %rN, %rN
4189 */
4190 i.tm.base_opcode = 0x84 | (i.tm.base_opcode & 1);
4191 }
99112332 4192 else if (i.reg_operands == 3
b6f8c7c4
L
4193 && i.op[0].regs == i.op[1].regs
4194 && !i.types[2].bitfield.xmmword
4195 && (i.tm.opcode_modifier.vex
7a69eac3 4196 || ((!i.mask || i.mask->zeroing)
b6f8c7c4 4197 && !i.rounding
e771e7c9 4198 && is_evex_encoding (&i.tm)
80c34c38 4199 && (i.vec_encoding != vex_encoding_evex
dd22218c 4200 || cpu_arch_isa_flags.bitfield.cpuavx512vl
80c34c38 4201 || i.tm.cpu_flags.bitfield.cpuavx512vl
7091c612 4202 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4203 && i.types[2].bitfield.ymmword))))
b6f8c7c4
L
4204 && ((i.tm.base_opcode == 0x55
4205 || i.tm.base_opcode == 0x6655
4206 || i.tm.base_opcode == 0x66df
4207 || i.tm.base_opcode == 0x57
4208 || i.tm.base_opcode == 0x6657
8305403a
L
4209 || i.tm.base_opcode == 0x66ef
4210 || i.tm.base_opcode == 0x66f8
4211 || i.tm.base_opcode == 0x66f9
4212 || i.tm.base_opcode == 0x66fa
1424ad86
JB
4213 || i.tm.base_opcode == 0x66fb
4214 || i.tm.base_opcode == 0x42
4215 || i.tm.base_opcode == 0x6642
4216 || i.tm.base_opcode == 0x47
4217 || i.tm.base_opcode == 0x6647)
b6f8c7c4
L
4218 && i.tm.extension_opcode == None))
4219 {
99112332 4220 /* Optimize: -O1:
8305403a
L
4221 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4222 vpsubq and vpsubw:
b6f8c7c4
L
4223 EVEX VOP %zmmM, %zmmM, %zmmN
4224 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4225 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4226 EVEX VOP %ymmM, %ymmM, %ymmN
4227 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4228 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4229 VEX VOP %ymmM, %ymmM, %ymmN
4230 -> VEX VOP %xmmM, %xmmM, %xmmN
4231 VOP, one of vpandn and vpxor:
4232 VEX VOP %ymmM, %ymmM, %ymmN
4233 -> VEX VOP %xmmM, %xmmM, %xmmN
4234 VOP, one of vpandnd and vpandnq:
4235 EVEX VOP %zmmM, %zmmM, %zmmN
4236 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4237 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4238 EVEX VOP %ymmM, %ymmM, %ymmN
4239 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4240 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4241 VOP, one of vpxord and vpxorq:
4242 EVEX VOP %zmmM, %zmmM, %zmmN
4243 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4244 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4245 EVEX VOP %ymmM, %ymmM, %ymmN
4246 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4247 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4248 VOP, one of kxord and kxorq:
4249 VEX VOP %kM, %kM, %kN
4250 -> VEX kxorw %kM, %kM, %kN
4251 VOP, one of kandnd and kandnq:
4252 VEX VOP %kM, %kM, %kN
4253 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4254 */
e771e7c9 4255 if (is_evex_encoding (&i.tm))
b6f8c7c4 4256 {
7b1d7ca1 4257 if (i.vec_encoding != vex_encoding_evex)
b6f8c7c4
L
4258 {
4259 i.tm.opcode_modifier.vex = VEX128;
4260 i.tm.opcode_modifier.vexw = VEXW0;
4261 i.tm.opcode_modifier.evex = 0;
4262 }
7b1d7ca1 4263 else if (optimize > 1)
dd22218c
L
4264 i.tm.opcode_modifier.evex = EVEX128;
4265 else
4266 return;
b6f8c7c4 4267 }
f74a6307 4268 else if (i.tm.operand_types[0].bitfield.class == RegMask)
1424ad86
JB
4269 {
4270 i.tm.base_opcode &= 0xff;
4271 i.tm.opcode_modifier.vexw = VEXW0;
4272 }
b6f8c7c4
L
4273 else
4274 i.tm.opcode_modifier.vex = VEX128;
4275
4276 if (i.tm.opcode_modifier.vex)
4277 for (j = 0; j < 3; j++)
4278 {
4279 i.types[j].bitfield.xmmword = 1;
4280 i.types[j].bitfield.ymmword = 0;
4281 }
4282 }
392a5972 4283 else if (i.vec_encoding != vex_encoding_evex
97ed31ae 4284 && !i.types[0].bitfield.zmmword
392a5972 4285 && !i.types[1].bitfield.zmmword
97ed31ae 4286 && !i.mask
a0a1771e 4287 && !i.broadcast
97ed31ae 4288 && is_evex_encoding (&i.tm)
392a5972
L
4289 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x666f
4290 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf36f
a0a1771e
JB
4291 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f
4292 || (i.tm.base_opcode & ~4) == 0x66db
4293 || (i.tm.base_opcode & ~4) == 0x66eb)
97ed31ae
L
4294 && i.tm.extension_opcode == None)
4295 {
4296 /* Optimize: -O1:
4297 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4298 vmovdqu32 and vmovdqu64:
4299 EVEX VOP %xmmM, %xmmN
4300 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4301 EVEX VOP %ymmM, %ymmN
4302 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4303 EVEX VOP %xmmM, mem
4304 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4305 EVEX VOP %ymmM, mem
4306 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4307 EVEX VOP mem, %xmmN
4308 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4309 EVEX VOP mem, %ymmN
4310 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
a0a1771e
JB
4311 VOP, one of vpand, vpandn, vpor, vpxor:
4312 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4313 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4314 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4315 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4316 EVEX VOP{d,q} mem, %xmmM, %xmmN
4317 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4318 EVEX VOP{d,q} mem, %ymmM, %ymmN
4319 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
97ed31ae 4320 */
a0a1771e 4321 for (j = 0; j < i.operands; j++)
392a5972
L
4322 if (operand_type_check (i.types[j], disp)
4323 && i.op[j].disps->X_op == O_constant)
4324 {
4325 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4326 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4327 bytes, we choose EVEX Disp8 over VEX Disp32. */
4328 int evex_disp8, vex_disp8;
4329 unsigned int memshift = i.memshift;
4330 offsetT n = i.op[j].disps->X_add_number;
4331
4332 evex_disp8 = fits_in_disp8 (n);
4333 i.memshift = 0;
4334 vex_disp8 = fits_in_disp8 (n);
4335 if (evex_disp8 != vex_disp8)
4336 {
4337 i.memshift = memshift;
4338 return;
4339 }
4340
4341 i.types[j].bitfield.disp8 = vex_disp8;
4342 break;
4343 }
4344 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f)
4345 i.tm.base_opcode ^= 0xf36f ^ 0xf26f;
97ed31ae
L
4346 i.tm.opcode_modifier.vex
4347 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4348 i.tm.opcode_modifier.vexw = VEXW0;
79dec6b7
JB
4349 /* VPAND, VPOR, and VPXOR are commutative. */
4350 if (i.reg_operands == 3 && i.tm.base_opcode != 0x66df)
4351 i.tm.opcode_modifier.commutative = 1;
97ed31ae
L
4352 i.tm.opcode_modifier.evex = 0;
4353 i.tm.opcode_modifier.masking = 0;
a0a1771e 4354 i.tm.opcode_modifier.broadcast = 0;
97ed31ae
L
4355 i.tm.opcode_modifier.disp8memshift = 0;
4356 i.memshift = 0;
a0a1771e
JB
4357 if (j < i.operands)
4358 i.types[j].bitfield.disp8
4359 = fits_in_disp8 (i.op[j].disps->X_add_number);
97ed31ae 4360 }
b6f8c7c4
L
4361}
4362
ae531041
L
4363/* Return non-zero for load instruction. */
4364
4365static int
4366load_insn_p (void)
4367{
4368 unsigned int dest;
4369 int any_vex_p = is_any_vex_encoding (&i.tm);
4370 unsigned int base_opcode = i.tm.base_opcode | 1;
4371
4372 if (!any_vex_p)
4373 {
a09f656b 4374 /* Anysize insns: lea, invlpg, clflush, prefetchnta, prefetcht0,
4375 prefetcht1, prefetcht2, prefetchtw, bndmk, bndcl, bndcu, bndcn,
4376 bndstx, bndldx, prefetchwt1, clflushopt, clwb, cldemote. */
4377 if (i.tm.opcode_modifier.anysize)
ae531041
L
4378 return 0;
4379
a09f656b 4380 /* pop, popf, popa. */
4381 if (strcmp (i.tm.name, "pop") == 0
4382 || i.tm.base_opcode == 0x9d
4383 || i.tm.base_opcode == 0x61)
ae531041
L
4384 return 1;
4385
4386 /* movs, cmps, lods, scas. */
4387 if ((i.tm.base_opcode | 0xb) == 0xaf)
4388 return 1;
4389
a09f656b 4390 /* outs, xlatb. */
4391 if (base_opcode == 0x6f
4392 || i.tm.base_opcode == 0xd7)
ae531041 4393 return 1;
a09f656b 4394 /* NB: For AMD-specific insns with implicit memory operands,
4395 they're intentionally not covered. */
ae531041
L
4396 }
4397
4398 /* No memory operand. */
4399 if (!i.mem_operands)
4400 return 0;
4401
4402 if (any_vex_p)
4403 {
4404 /* vldmxcsr. */
4405 if (i.tm.base_opcode == 0xae
4406 && i.tm.opcode_modifier.vex
4407 && i.tm.opcode_modifier.vexopcode == VEX0F
4408 && i.tm.extension_opcode == 2)
4409 return 1;
4410 }
4411 else
4412 {
4413 /* test, not, neg, mul, imul, div, idiv. */
4414 if ((i.tm.base_opcode == 0xf6 || i.tm.base_opcode == 0xf7)
4415 && i.tm.extension_opcode != 1)
4416 return 1;
4417
4418 /* inc, dec. */
4419 if (base_opcode == 0xff && i.tm.extension_opcode <= 1)
4420 return 1;
4421
4422 /* add, or, adc, sbb, and, sub, xor, cmp. */
4423 if (i.tm.base_opcode >= 0x80 && i.tm.base_opcode <= 0x83)
4424 return 1;
4425
4426 /* bt, bts, btr, btc. */
4427 if (i.tm.base_opcode == 0xfba
4428 && (i.tm.extension_opcode >= 4 && i.tm.extension_opcode <= 7))
4429 return 1;
4430
4431 /* rol, ror, rcl, rcr, shl/sal, shr, sar. */
4432 if ((base_opcode == 0xc1
4433 || (i.tm.base_opcode >= 0xd0 && i.tm.base_opcode <= 0xd3))
4434 && i.tm.extension_opcode != 6)
4435 return 1;
4436
4437 /* cmpxchg8b, cmpxchg16b, xrstors. */
4438 if (i.tm.base_opcode == 0xfc7
4439 && (i.tm.extension_opcode == 1 || i.tm.extension_opcode == 3))
4440 return 1;
4441
4442 /* fxrstor, ldmxcsr, xrstor. */
4443 if (i.tm.base_opcode == 0xfae
4444 && (i.tm.extension_opcode == 1
4445 || i.tm.extension_opcode == 2
4446 || i.tm.extension_opcode == 5))
4447 return 1;
4448
4449 /* lgdt, lidt, lmsw. */
4450 if (i.tm.base_opcode == 0xf01
4451 && (i.tm.extension_opcode == 2
4452 || i.tm.extension_opcode == 3
4453 || i.tm.extension_opcode == 6))
4454 return 1;
4455
4456 /* vmptrld */
4457 if (i.tm.base_opcode == 0xfc7
4458 && i.tm.extension_opcode == 6)
4459 return 1;
4460
4461 /* Check for x87 instructions. */
4462 if (i.tm.base_opcode >= 0xd8 && i.tm.base_opcode <= 0xdf)
4463 {
4464 /* Skip fst, fstp, fstenv, fstcw. */
4465 if (i.tm.base_opcode == 0xd9
4466 && (i.tm.extension_opcode == 2
4467 || i.tm.extension_opcode == 3
4468 || i.tm.extension_opcode == 6
4469 || i.tm.extension_opcode == 7))
4470 return 0;
4471
4472 /* Skip fisttp, fist, fistp, fstp. */
4473 if (i.tm.base_opcode == 0xdb
4474 && (i.tm.extension_opcode == 1
4475 || i.tm.extension_opcode == 2
4476 || i.tm.extension_opcode == 3
4477 || i.tm.extension_opcode == 7))
4478 return 0;
4479
4480 /* Skip fisttp, fst, fstp, fsave, fstsw. */
4481 if (i.tm.base_opcode == 0xdd
4482 && (i.tm.extension_opcode == 1
4483 || i.tm.extension_opcode == 2
4484 || i.tm.extension_opcode == 3
4485 || i.tm.extension_opcode == 6
4486 || i.tm.extension_opcode == 7))
4487 return 0;
4488
4489 /* Skip fisttp, fist, fistp, fbstp, fistp. */
4490 if (i.tm.base_opcode == 0xdf
4491 && (i.tm.extension_opcode == 1
4492 || i.tm.extension_opcode == 2
4493 || i.tm.extension_opcode == 3
4494 || i.tm.extension_opcode == 6
4495 || i.tm.extension_opcode == 7))
4496 return 0;
4497
4498 return 1;
4499 }
4500 }
4501
4502 dest = i.operands - 1;
4503
4504 /* Check fake imm8 operand and 3 source operands. */
4505 if ((i.tm.opcode_modifier.immext
4506 || i.tm.opcode_modifier.vexsources == VEX3SOURCES)
4507 && i.types[dest].bitfield.imm8)
4508 dest--;
4509
4510 /* add, or, adc, sbb, and, sub, xor, cmp, test, xchg, xadd */
4511 if (!any_vex_p
4512 && (base_opcode == 0x1
4513 || base_opcode == 0x9
4514 || base_opcode == 0x11
4515 || base_opcode == 0x19
4516 || base_opcode == 0x21
4517 || base_opcode == 0x29
4518 || base_opcode == 0x31
4519 || base_opcode == 0x39
4520 || (i.tm.base_opcode >= 0x84 && i.tm.base_opcode <= 0x87)
4521 || base_opcode == 0xfc1))
4522 return 1;
4523
4524 /* Check for load instruction. */
4525 return (i.types[dest].bitfield.class != ClassNone
4526 || i.types[dest].bitfield.instance == Accum);
4527}
4528
4529/* Output lfence, 0xfaee8, after instruction. */
4530
4531static void
4532insert_lfence_after (void)
4533{
4534 if (lfence_after_load && load_insn_p ())
4535 {
a09f656b 4536 /* There are also two REP string instructions that require
4537 special treatment. Specifically, the compare string (CMPS)
4538 and scan string (SCAS) instructions set EFLAGS in a manner
4539 that depends on the data being compared/scanned. When used
4540 with a REP prefix, the number of iterations may therefore
4541 vary depending on this data. If the data is a program secret
4542 chosen by the adversary using an LVI method,
4543 then this data-dependent behavior may leak some aspect
4544 of the secret. */
4545 if (((i.tm.base_opcode | 0x1) == 0xa7
4546 || (i.tm.base_opcode | 0x1) == 0xaf)
4547 && i.prefix[REP_PREFIX])
4548 {
4549 as_warn (_("`%s` changes flags which would affect control flow behavior"),
4550 i.tm.name);
4551 }
ae531041
L
4552 char *p = frag_more (3);
4553 *p++ = 0xf;
4554 *p++ = 0xae;
4555 *p = 0xe8;
4556 }
4557}
4558
4559/* Output lfence, 0xfaee8, before instruction. */
4560
4561static void
4562insert_lfence_before (void)
4563{
4564 char *p;
4565
4566 if (is_any_vex_encoding (&i.tm))
4567 return;
4568
4569 if (i.tm.base_opcode == 0xff
4570 && (i.tm.extension_opcode == 2 || i.tm.extension_opcode == 4))
4571 {
4572 /* Insert lfence before indirect branch if needed. */
4573
4574 if (lfence_before_indirect_branch == lfence_branch_none)
4575 return;
4576
4577 if (i.operands != 1)
4578 abort ();
4579
4580 if (i.reg_operands == 1)
4581 {
4582 /* Indirect branch via register. Don't insert lfence with
4583 -mlfence-after-load=yes. */
4584 if (lfence_after_load
4585 || lfence_before_indirect_branch == lfence_branch_memory)
4586 return;
4587 }
4588 else if (i.mem_operands == 1
4589 && lfence_before_indirect_branch != lfence_branch_register)
4590 {
4591 as_warn (_("indirect `%s` with memory operand should be avoided"),
4592 i.tm.name);
4593 return;
4594 }
4595 else
4596 return;
4597
4598 if (last_insn.kind != last_insn_other
4599 && last_insn.seg == now_seg)
4600 {
4601 as_warn_where (last_insn.file, last_insn.line,
4602 _("`%s` skips -mlfence-before-indirect-branch on `%s`"),
4603 last_insn.name, i.tm.name);
4604 return;
4605 }
4606
4607 p = frag_more (3);
4608 *p++ = 0xf;
4609 *p++ = 0xae;
4610 *p = 0xe8;
4611 return;
4612 }
4613
503648e4 4614 /* Output or/not/shl and lfence before near ret. */
ae531041
L
4615 if (lfence_before_ret != lfence_before_ret_none
4616 && (i.tm.base_opcode == 0xc2
503648e4 4617 || i.tm.base_opcode == 0xc3))
ae531041
L
4618 {
4619 if (last_insn.kind != last_insn_other
4620 && last_insn.seg == now_seg)
4621 {
4622 as_warn_where (last_insn.file, last_insn.line,
4623 _("`%s` skips -mlfence-before-ret on `%s`"),
4624 last_insn.name, i.tm.name);
4625 return;
4626 }
a09f656b 4627
a09f656b 4628 /* Near ret ingore operand size override under CPU64. */
503648e4 4629 char prefix = flag_code == CODE_64BIT
4630 ? 0x48
4631 : i.prefix[DATA_PREFIX] ? 0x66 : 0x0;
a09f656b 4632
4633 if (lfence_before_ret == lfence_before_ret_not)
4634 {
4635 /* not: 0xf71424, may add prefix
4636 for operand size override or 64-bit code. */
4637 p = frag_more ((prefix ? 2 : 0) + 6 + 3);
4638 if (prefix)
4639 *p++ = prefix;
ae531041
L
4640 *p++ = 0xf7;
4641 *p++ = 0x14;
4642 *p++ = 0x24;
a09f656b 4643 if (prefix)
4644 *p++ = prefix;
ae531041
L
4645 *p++ = 0xf7;
4646 *p++ = 0x14;
4647 *p++ = 0x24;
4648 }
a09f656b 4649 else
4650 {
4651 p = frag_more ((prefix ? 1 : 0) + 4 + 3);
4652 if (prefix)
4653 *p++ = prefix;
4654 if (lfence_before_ret == lfence_before_ret_or)
4655 {
4656 /* or: 0x830c2400, may add prefix
4657 for operand size override or 64-bit code. */
4658 *p++ = 0x83;
4659 *p++ = 0x0c;
4660 }
4661 else
4662 {
4663 /* shl: 0xc1242400, may add prefix
4664 for operand size override or 64-bit code. */
4665 *p++ = 0xc1;
4666 *p++ = 0x24;
4667 }
4668
4669 *p++ = 0x24;
4670 *p++ = 0x0;
4671 }
4672
ae531041
L
4673 *p++ = 0xf;
4674 *p++ = 0xae;
4675 *p = 0xe8;
4676 }
4677}
4678
252b5132
RH
4679/* This is the guts of the machine-dependent assembler. LINE points to a
4680 machine dependent instruction. This function is supposed to emit
4681 the frags/bytes it assembles to. */
4682
4683void
65da13b5 4684md_assemble (char *line)
252b5132 4685{
40fb9820 4686 unsigned int j;
83b16ac6 4687 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 4688 const insn_template *t;
252b5132 4689
47926f60 4690 /* Initialize globals. */
252b5132
RH
4691 memset (&i, '\0', sizeof (i));
4692 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 4693 i.reloc[j] = NO_RELOC;
252b5132
RH
4694 memset (disp_expressions, '\0', sizeof (disp_expressions));
4695 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 4696 save_stack_p = save_stack;
252b5132
RH
4697
4698 /* First parse an instruction mnemonic & call i386_operand for the operands.
4699 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 4700 start of a (possibly prefixed) mnemonic. */
252b5132 4701
29b0f896
AM
4702 line = parse_insn (line, mnemonic);
4703 if (line == NULL)
4704 return;
83b16ac6 4705 mnem_suffix = i.suffix;
252b5132 4706
29b0f896 4707 line = parse_operands (line, mnemonic);
ee86248c 4708 this_operand = -1;
8325cc63
JB
4709 xfree (i.memop1_string);
4710 i.memop1_string = NULL;
29b0f896
AM
4711 if (line == NULL)
4712 return;
252b5132 4713
29b0f896
AM
4714 /* Now we've parsed the mnemonic into a set of templates, and have the
4715 operands at hand. */
4716
b630c145
JB
4717 /* All Intel opcodes have reversed operands except for "bound", "enter",
4718 "monitor*", "mwait*", "tpause", and "umwait". We also don't reverse
4719 intersegment "jmp" and "call" instructions with 2 immediate operands so
4720 that the immediate segment precedes the offset, as it does when in AT&T
4721 mode. */
4d456e3d
L
4722 if (intel_syntax
4723 && i.operands > 1
29b0f896 4724 && (strcmp (mnemonic, "bound") != 0)
30123838 4725 && (strcmp (mnemonic, "invlpga") != 0)
eedb0f2c
JB
4726 && (strncmp (mnemonic, "monitor", 7) != 0)
4727 && (strncmp (mnemonic, "mwait", 5) != 0)
b630c145
JB
4728 && (strcmp (mnemonic, "tpause") != 0)
4729 && (strcmp (mnemonic, "umwait") != 0)
40fb9820
L
4730 && !(operand_type_check (i.types[0], imm)
4731 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4732 swap_operands ();
4733
ec56d5c0
JB
4734 /* The order of the immediates should be reversed
4735 for 2 immediates extrq and insertq instructions */
4736 if (i.imm_operands == 2
4737 && (strcmp (mnemonic, "extrq") == 0
4738 || strcmp (mnemonic, "insertq") == 0))
4739 swap_2_operands (0, 1);
4740
29b0f896
AM
4741 if (i.imm_operands)
4742 optimize_imm ();
4743
b300c311
L
4744 /* Don't optimize displacement for movabs since it only takes 64bit
4745 displacement. */
4746 if (i.disp_operands
a501d77e 4747 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4748 && (flag_code != CODE_64BIT
4749 || strcmp (mnemonic, "movabs") != 0))
4750 optimize_disp ();
29b0f896
AM
4751
4752 /* Next, we find a template that matches the given insn,
4753 making sure the overlap of the given operands types is consistent
4754 with the template operand types. */
252b5132 4755
83b16ac6 4756 if (!(t = match_template (mnem_suffix)))
29b0f896 4757 return;
252b5132 4758
7bab8ab5 4759 if (sse_check != check_none
81f8a913 4760 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4761 && !i.tm.cpu_flags.bitfield.cpuavx
569d50f1 4762 && !i.tm.cpu_flags.bitfield.cpuavx512f
daf50ae7
L
4763 && (i.tm.cpu_flags.bitfield.cpusse
4764 || i.tm.cpu_flags.bitfield.cpusse2
4765 || i.tm.cpu_flags.bitfield.cpusse3
4766 || i.tm.cpu_flags.bitfield.cpussse3
4767 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e
JB
4768 || i.tm.cpu_flags.bitfield.cpusse4_2
4769 || i.tm.cpu_flags.bitfield.cpupclmul
4770 || i.tm.cpu_flags.bitfield.cpuaes
569d50f1 4771 || i.tm.cpu_flags.bitfield.cpusha
6e3e5c9e 4772 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4773 {
7bab8ab5 4774 (sse_check == check_warning
daf50ae7
L
4775 ? as_warn
4776 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4777 }
4778
40fb9820 4779 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4780 if (!add_prefix (FWAIT_OPCODE))
4781 return;
252b5132 4782
d5de92cf
L
4783 /* Check if REP prefix is OK. */
4784 if (i.rep_prefix && !i.tm.opcode_modifier.repprefixok)
4785 {
4786 as_bad (_("invalid instruction `%s' after `%s'"),
4787 i.tm.name, i.rep_prefix);
4788 return;
4789 }
4790
c1ba0266
L
4791 /* Check for lock without a lockable instruction. Destination operand
4792 must be memory unless it is xchg (0x86). */
c32fa91d
L
4793 if (i.prefix[LOCK_PREFIX]
4794 && (!i.tm.opcode_modifier.islockable
c1ba0266
L
4795 || i.mem_operands == 0
4796 || (i.tm.base_opcode != 0x86
8dc0818e 4797 && !(i.flags[i.operands - 1] & Operand_Mem))))
c32fa91d
L
4798 {
4799 as_bad (_("expecting lockable instruction after `lock'"));
4800 return;
4801 }
4802
40d231b4
JB
4803 /* Check for data size prefix on VEX/XOP/EVEX encoded and SIMD insns. */
4804 if (i.prefix[DATA_PREFIX]
4805 && (is_any_vex_encoding (&i.tm)
4806 || i.tm.operand_types[i.imm_operands].bitfield.class >= RegMMX
4807 || i.tm.operand_types[i.imm_operands + 1].bitfield.class >= RegMMX))
7a8655d2
JB
4808 {
4809 as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
4810 return;
4811 }
4812
42164a71 4813 /* Check if HLE prefix is OK. */
165de32a 4814 if (i.hle_prefix && !check_hle ())
42164a71
L
4815 return;
4816
7e8b059b
L
4817 /* Check BND prefix. */
4818 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
4819 as_bad (_("expecting valid branch instruction after `bnd'"));
4820
04ef582a 4821 /* Check NOTRACK prefix. */
9fef80d6
L
4822 if (i.notrack_prefix && !i.tm.opcode_modifier.notrackprefixok)
4823 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 4824
327e8c42
JB
4825 if (i.tm.cpu_flags.bitfield.cpumpx)
4826 {
4827 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4828 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
4829 else if (flag_code != CODE_16BIT
4830 ? i.prefix[ADDR_PREFIX]
4831 : i.mem_operands && !i.prefix[ADDR_PREFIX])
4832 as_bad (_("16-bit address isn't allowed in MPX instructions"));
4833 }
7e8b059b
L
4834
4835 /* Insert BND prefix. */
76d3a78a
JB
4836 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
4837 {
4838 if (!i.prefix[BND_PREFIX])
4839 add_prefix (BND_PREFIX_OPCODE);
4840 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
4841 {
4842 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
4843 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
4844 }
4845 }
7e8b059b 4846
29b0f896 4847 /* Check string instruction segment overrides. */
51c8edf6 4848 if (i.tm.opcode_modifier.isstring >= IS_STRING_ES_OP0)
29b0f896 4849 {
51c8edf6 4850 gas_assert (i.mem_operands);
29b0f896 4851 if (!check_string ())
5dd0794d 4852 return;
fc0763e6 4853 i.disp_operands = 0;
29b0f896 4854 }
5dd0794d 4855
b6f8c7c4
L
4856 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
4857 optimize_encoding ();
4858
29b0f896
AM
4859 if (!process_suffix ())
4860 return;
e413e4e9 4861
921eafea 4862 /* Update operand types and check extended states. */
bc0844ae 4863 for (j = 0; j < i.operands; j++)
921eafea
L
4864 {
4865 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
4866 switch (i.tm.operand_types[j].bitfield.class)
4867 {
4868 default:
4869 break;
4870 case RegMMX:
4871 i.xstate |= xstate_mmx;
4872 break;
4873 case RegMask:
4874 i.xstate |= xstate_zmm;
4875 break;
4876 case RegSIMD:
4877 if (i.tm.operand_types[j].bitfield.tmmword)
4878 i.xstate |= xstate_tmm;
4879 else if (i.tm.operand_types[j].bitfield.zmmword)
4880 i.xstate |= xstate_zmm;
4881 else if (i.tm.operand_types[j].bitfield.ymmword)
4882 i.xstate |= xstate_ymm;
4883 else if (i.tm.operand_types[j].bitfield.xmmword)
4884 i.xstate |= xstate_xmm;
4885 break;
4886 }
4887 }
bc0844ae 4888
29b0f896
AM
4889 /* Make still unresolved immediate matches conform to size of immediate
4890 given in i.suffix. */
4891 if (!finalize_imm ())
4892 return;
252b5132 4893
40fb9820 4894 if (i.types[0].bitfield.imm1)
29b0f896 4895 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 4896
9afe6eb8
L
4897 /* We only need to check those implicit registers for instructions
4898 with 3 operands or less. */
4899 if (i.operands <= 3)
4900 for (j = 0; j < i.operands; j++)
75e5731b
JB
4901 if (i.types[j].bitfield.instance != InstanceNone
4902 && !i.types[j].bitfield.xmmword)
9afe6eb8 4903 i.reg_operands--;
40fb9820 4904
29b0f896
AM
4905 /* For insns with operands there are more diddles to do to the opcode. */
4906 if (i.operands)
4907 {
4908 if (!process_operands ())
4909 return;
4910 }
8c190ce0 4911 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
4912 {
4913 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
4914 as_warn (_("translating to `%sp'"), i.tm.name);
4915 }
252b5132 4916
7a8655d2 4917 if (is_any_vex_encoding (&i.tm))
9e5e5283 4918 {
c1dc7af5 4919 if (!cpu_arch_flags.bitfield.cpui286)
9e5e5283 4920 {
c1dc7af5 4921 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
9e5e5283
L
4922 i.tm.name);
4923 return;
4924 }
c0f3af97 4925
0b9404fd
JB
4926 /* Check for explicit REX prefix. */
4927 if (i.prefix[REX_PREFIX] || i.rex_encoding)
4928 {
4929 as_bad (_("REX prefix invalid with `%s'"), i.tm.name);
4930 return;
4931 }
4932
9e5e5283
L
4933 if (i.tm.opcode_modifier.vex)
4934 build_vex_prefix (t);
4935 else
4936 build_evex_prefix ();
0b9404fd
JB
4937
4938 /* The individual REX.RXBW bits got consumed. */
4939 i.rex &= REX_OPCODE;
9e5e5283 4940 }
43234a1e 4941
5dd85c99
SP
4942 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
4943 instructions may define INT_OPCODE as well, so avoid this corner
4944 case for those instructions that use MODRM. */
4945 if (i.tm.base_opcode == INT_OPCODE
a6461c02
SP
4946 && !i.tm.opcode_modifier.modrm
4947 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
4948 {
4949 i.tm.base_opcode = INT3_OPCODE;
4950 i.imm_operands = 0;
4951 }
252b5132 4952
0cfa3eb3
JB
4953 if ((i.tm.opcode_modifier.jump == JUMP
4954 || i.tm.opcode_modifier.jump == JUMP_BYTE
4955 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896
AM
4956 && i.op[0].disps->X_op == O_constant)
4957 {
4958 /* Convert "jmp constant" (and "call constant") to a jump (call) to
4959 the absolute address given by the constant. Since ix86 jumps and
4960 calls are pc relative, we need to generate a reloc. */
4961 i.op[0].disps->X_add_symbol = &abs_symbol;
4962 i.op[0].disps->X_op = O_symbol;
4963 }
252b5132 4964
29b0f896
AM
4965 /* For 8 bit registers we need an empty rex prefix. Also if the
4966 instruction already has a prefix, we need to convert old
4967 registers to new ones. */
773f551c 4968
bab6aec1 4969 if ((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte
29b0f896 4970 && (i.op[0].regs->reg_flags & RegRex64) != 0)
bab6aec1 4971 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte
29b0f896 4972 && (i.op[1].regs->reg_flags & RegRex64) != 0)
bab6aec1
JB
4973 || (((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte)
4974 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte))
29b0f896
AM
4975 && i.rex != 0))
4976 {
4977 int x;
726c5dcd 4978
29b0f896
AM
4979 i.rex |= REX_OPCODE;
4980 for (x = 0; x < 2; x++)
4981 {
4982 /* Look for 8 bit operand that uses old registers. */
bab6aec1 4983 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
29b0f896 4984 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 4985 {
3f93af61 4986 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
29b0f896
AM
4987 /* In case it is "hi" register, give up. */
4988 if (i.op[x].regs->reg_num > 3)
a540244d 4989 as_bad (_("can't encode register '%s%s' in an "
4eed87de 4990 "instruction requiring REX prefix."),
a540244d 4991 register_prefix, i.op[x].regs->reg_name);
773f551c 4992
29b0f896
AM
4993 /* Otherwise it is equivalent to the extended register.
4994 Since the encoding doesn't change this is merely
4995 cosmetic cleanup for debug output. */
4996
4997 i.op[x].regs = i.op[x].regs + 8;
773f551c 4998 }
29b0f896
AM
4999 }
5000 }
773f551c 5001
6b6b6807
L
5002 if (i.rex == 0 && i.rex_encoding)
5003 {
5004 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
3f93af61 5005 that uses legacy register. If it is "hi" register, don't add
6b6b6807
L
5006 the REX_OPCODE byte. */
5007 int x;
5008 for (x = 0; x < 2; x++)
bab6aec1 5009 if (i.types[x].bitfield.class == Reg
6b6b6807
L
5010 && i.types[x].bitfield.byte
5011 && (i.op[x].regs->reg_flags & RegRex64) == 0
5012 && i.op[x].regs->reg_num > 3)
5013 {
3f93af61 5014 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
6b6b6807
L
5015 i.rex_encoding = FALSE;
5016 break;
5017 }
5018
5019 if (i.rex_encoding)
5020 i.rex = REX_OPCODE;
5021 }
5022
7ab9ffdd 5023 if (i.rex != 0)
29b0f896
AM
5024 add_prefix (REX_OPCODE | i.rex);
5025
ae531041
L
5026 insert_lfence_before ();
5027
29b0f896
AM
5028 /* We are ready to output the insn. */
5029 output_insn ();
e379e5f3 5030
ae531041
L
5031 insert_lfence_after ();
5032
e379e5f3
L
5033 last_insn.seg = now_seg;
5034
5035 if (i.tm.opcode_modifier.isprefix)
5036 {
5037 last_insn.kind = last_insn_prefix;
5038 last_insn.name = i.tm.name;
5039 last_insn.file = as_where (&last_insn.line);
5040 }
5041 else
5042 last_insn.kind = last_insn_other;
29b0f896
AM
5043}
5044
5045static char *
e3bb37b5 5046parse_insn (char *line, char *mnemonic)
29b0f896
AM
5047{
5048 char *l = line;
5049 char *token_start = l;
5050 char *mnem_p;
5c6af06e 5051 int supported;
d3ce72d0 5052 const insn_template *t;
b6169b20 5053 char *dot_p = NULL;
29b0f896 5054
29b0f896
AM
5055 while (1)
5056 {
5057 mnem_p = mnemonic;
5058 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
5059 {
b6169b20
L
5060 if (*mnem_p == '.')
5061 dot_p = mnem_p;
29b0f896
AM
5062 mnem_p++;
5063 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 5064 {
29b0f896
AM
5065 as_bad (_("no such instruction: `%s'"), token_start);
5066 return NULL;
5067 }
5068 l++;
5069 }
5070 if (!is_space_char (*l)
5071 && *l != END_OF_INSN
e44823cf
JB
5072 && (intel_syntax
5073 || (*l != PREFIX_SEPARATOR
5074 && *l != ',')))
29b0f896
AM
5075 {
5076 as_bad (_("invalid character %s in mnemonic"),
5077 output_invalid (*l));
5078 return NULL;
5079 }
5080 if (token_start == l)
5081 {
e44823cf 5082 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
5083 as_bad (_("expecting prefix; got nothing"));
5084 else
5085 as_bad (_("expecting mnemonic; got nothing"));
5086 return NULL;
5087 }
45288df1 5088
29b0f896 5089 /* Look up instruction (or prefix) via hash table. */
d3ce72d0 5090 current_templates = (const templates *) hash_find (op_hash, mnemonic);
47926f60 5091
29b0f896
AM
5092 if (*l != END_OF_INSN
5093 && (!is_space_char (*l) || l[1] != END_OF_INSN)
5094 && current_templates
40fb9820 5095 && current_templates->start->opcode_modifier.isprefix)
29b0f896 5096 {
c6fb90c8 5097 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
5098 {
5099 as_bad ((flag_code != CODE_64BIT
5100 ? _("`%s' is only supported in 64-bit mode")
5101 : _("`%s' is not supported in 64-bit mode")),
5102 current_templates->start->name);
5103 return NULL;
5104 }
29b0f896
AM
5105 /* If we are in 16-bit mode, do not allow addr16 or data16.
5106 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
5107 if ((current_templates->start->opcode_modifier.size == SIZE16
5108 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 5109 && flag_code != CODE_64BIT
673fe0f0 5110 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
5111 ^ (flag_code == CODE_16BIT)))
5112 {
5113 as_bad (_("redundant %s prefix"),
5114 current_templates->start->name);
5115 return NULL;
45288df1 5116 }
86fa6981 5117 if (current_templates->start->opcode_length == 0)
29b0f896 5118 {
86fa6981
L
5119 /* Handle pseudo prefixes. */
5120 switch (current_templates->start->base_opcode)
5121 {
5122 case 0x0:
5123 /* {disp8} */
5124 i.disp_encoding = disp_encoding_8bit;
5125 break;
5126 case 0x1:
5127 /* {disp32} */
5128 i.disp_encoding = disp_encoding_32bit;
5129 break;
5130 case 0x2:
5131 /* {load} */
5132 i.dir_encoding = dir_encoding_load;
5133 break;
5134 case 0x3:
5135 /* {store} */
5136 i.dir_encoding = dir_encoding_store;
5137 break;
5138 case 0x4:
42e04b36
L
5139 /* {vex} */
5140 i.vec_encoding = vex_encoding_vex;
86fa6981
L
5141 break;
5142 case 0x5:
5143 /* {vex3} */
5144 i.vec_encoding = vex_encoding_vex3;
5145 break;
5146 case 0x6:
5147 /* {evex} */
5148 i.vec_encoding = vex_encoding_evex;
5149 break;
6b6b6807
L
5150 case 0x7:
5151 /* {rex} */
5152 i.rex_encoding = TRUE;
5153 break;
b6f8c7c4
L
5154 case 0x8:
5155 /* {nooptimize} */
5156 i.no_optimize = TRUE;
5157 break;
86fa6981
L
5158 default:
5159 abort ();
5160 }
5161 }
5162 else
5163 {
5164 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 5165 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 5166 {
4e9ac44a
L
5167 case PREFIX_EXIST:
5168 return NULL;
5169 case PREFIX_DS:
d777820b 5170 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
5171 i.notrack_prefix = current_templates->start->name;
5172 break;
5173 case PREFIX_REP:
5174 if (current_templates->start->cpu_flags.bitfield.cpuhle)
5175 i.hle_prefix = current_templates->start->name;
5176 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
5177 i.bnd_prefix = current_templates->start->name;
5178 else
5179 i.rep_prefix = current_templates->start->name;
5180 break;
5181 default:
5182 break;
86fa6981 5183 }
29b0f896
AM
5184 }
5185 /* Skip past PREFIX_SEPARATOR and reset token_start. */
5186 token_start = ++l;
5187 }
5188 else
5189 break;
5190 }
45288df1 5191
30a55f88 5192 if (!current_templates)
b6169b20 5193 {
07d5e953
JB
5194 /* Deprecated functionality (new code should use pseudo-prefixes instead):
5195 Check if we should swap operand or force 32bit displacement in
f8a5c266 5196 encoding. */
30a55f88 5197 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 5198 i.dir_encoding = dir_encoding_swap;
8d63c93e 5199 else if (mnem_p - 3 == dot_p
a501d77e
L
5200 && dot_p[1] == 'd'
5201 && dot_p[2] == '8')
5202 i.disp_encoding = disp_encoding_8bit;
8d63c93e 5203 else if (mnem_p - 4 == dot_p
f8a5c266
L
5204 && dot_p[1] == 'd'
5205 && dot_p[2] == '3'
5206 && dot_p[3] == '2')
a501d77e 5207 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
5208 else
5209 goto check_suffix;
5210 mnem_p = dot_p;
5211 *dot_p = '\0';
d3ce72d0 5212 current_templates = (const templates *) hash_find (op_hash, mnemonic);
b6169b20
L
5213 }
5214
29b0f896
AM
5215 if (!current_templates)
5216 {
dc1e8a47 5217 check_suffix:
1c529385 5218 if (mnem_p > mnemonic)
29b0f896 5219 {
1c529385
LH
5220 /* See if we can get a match by trimming off a suffix. */
5221 switch (mnem_p[-1])
29b0f896 5222 {
1c529385
LH
5223 case WORD_MNEM_SUFFIX:
5224 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
5225 i.suffix = SHORT_MNEM_SUFFIX;
5226 else
1c529385
LH
5227 /* Fall through. */
5228 case BYTE_MNEM_SUFFIX:
5229 case QWORD_MNEM_SUFFIX:
5230 i.suffix = mnem_p[-1];
29b0f896 5231 mnem_p[-1] = '\0';
d3ce72d0 5232 current_templates = (const templates *) hash_find (op_hash,
1c529385
LH
5233 mnemonic);
5234 break;
5235 case SHORT_MNEM_SUFFIX:
5236 case LONG_MNEM_SUFFIX:
5237 if (!intel_syntax)
5238 {
5239 i.suffix = mnem_p[-1];
5240 mnem_p[-1] = '\0';
5241 current_templates = (const templates *) hash_find (op_hash,
5242 mnemonic);
5243 }
5244 break;
5245
5246 /* Intel Syntax. */
5247 case 'd':
5248 if (intel_syntax)
5249 {
5250 if (intel_float_operand (mnemonic) == 1)
5251 i.suffix = SHORT_MNEM_SUFFIX;
5252 else
5253 i.suffix = LONG_MNEM_SUFFIX;
5254 mnem_p[-1] = '\0';
5255 current_templates = (const templates *) hash_find (op_hash,
5256 mnemonic);
5257 }
5258 break;
29b0f896 5259 }
29b0f896 5260 }
1c529385 5261
29b0f896
AM
5262 if (!current_templates)
5263 {
5264 as_bad (_("no such instruction: `%s'"), token_start);
5265 return NULL;
5266 }
5267 }
252b5132 5268
0cfa3eb3
JB
5269 if (current_templates->start->opcode_modifier.jump == JUMP
5270 || current_templates->start->opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
5271 {
5272 /* Check for a branch hint. We allow ",pt" and ",pn" for
5273 predict taken and predict not taken respectively.
5274 I'm not sure that branch hints actually do anything on loop
5275 and jcxz insns (JumpByte) for current Pentium4 chips. They
5276 may work in the future and it doesn't hurt to accept them
5277 now. */
5278 if (l[0] == ',' && l[1] == 'p')
5279 {
5280 if (l[2] == 't')
5281 {
5282 if (!add_prefix (DS_PREFIX_OPCODE))
5283 return NULL;
5284 l += 3;
5285 }
5286 else if (l[2] == 'n')
5287 {
5288 if (!add_prefix (CS_PREFIX_OPCODE))
5289 return NULL;
5290 l += 3;
5291 }
5292 }
5293 }
5294 /* Any other comma loses. */
5295 if (*l == ',')
5296 {
5297 as_bad (_("invalid character %s in mnemonic"),
5298 output_invalid (*l));
5299 return NULL;
5300 }
252b5132 5301
29b0f896 5302 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
5303 supported = 0;
5304 for (t = current_templates->start; t < current_templates->end; ++t)
5305 {
c0f3af97
L
5306 supported |= cpu_flags_match (t);
5307 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
5308 {
5309 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
5310 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 5311
548d0ee6
JB
5312 return l;
5313 }
29b0f896 5314 }
3629bb00 5315
548d0ee6
JB
5316 if (!(supported & CPU_FLAGS_64BIT_MATCH))
5317 as_bad (flag_code == CODE_64BIT
5318 ? _("`%s' is not supported in 64-bit mode")
5319 : _("`%s' is only supported in 64-bit mode"),
5320 current_templates->start->name);
5321 else
5322 as_bad (_("`%s' is not supported on `%s%s'"),
5323 current_templates->start->name,
5324 cpu_arch_name ? cpu_arch_name : default_arch,
5325 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 5326
548d0ee6 5327 return NULL;
29b0f896 5328}
252b5132 5329
29b0f896 5330static char *
e3bb37b5 5331parse_operands (char *l, const char *mnemonic)
29b0f896
AM
5332{
5333 char *token_start;
3138f287 5334
29b0f896
AM
5335 /* 1 if operand is pending after ','. */
5336 unsigned int expecting_operand = 0;
252b5132 5337
29b0f896
AM
5338 /* Non-zero if operand parens not balanced. */
5339 unsigned int paren_not_balanced;
5340
5341 while (*l != END_OF_INSN)
5342 {
5343 /* Skip optional white space before operand. */
5344 if (is_space_char (*l))
5345 ++l;
d02603dc 5346 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
5347 {
5348 as_bad (_("invalid character %s before operand %d"),
5349 output_invalid (*l),
5350 i.operands + 1);
5351 return NULL;
5352 }
d02603dc 5353 token_start = l; /* After white space. */
29b0f896
AM
5354 paren_not_balanced = 0;
5355 while (paren_not_balanced || *l != ',')
5356 {
5357 if (*l == END_OF_INSN)
5358 {
5359 if (paren_not_balanced)
5360 {
5361 if (!intel_syntax)
5362 as_bad (_("unbalanced parenthesis in operand %d."),
5363 i.operands + 1);
5364 else
5365 as_bad (_("unbalanced brackets in operand %d."),
5366 i.operands + 1);
5367 return NULL;
5368 }
5369 else
5370 break; /* we are done */
5371 }
d02603dc 5372 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
5373 {
5374 as_bad (_("invalid character %s in operand %d"),
5375 output_invalid (*l),
5376 i.operands + 1);
5377 return NULL;
5378 }
5379 if (!intel_syntax)
5380 {
5381 if (*l == '(')
5382 ++paren_not_balanced;
5383 if (*l == ')')
5384 --paren_not_balanced;
5385 }
5386 else
5387 {
5388 if (*l == '[')
5389 ++paren_not_balanced;
5390 if (*l == ']')
5391 --paren_not_balanced;
5392 }
5393 l++;
5394 }
5395 if (l != token_start)
5396 { /* Yes, we've read in another operand. */
5397 unsigned int operand_ok;
5398 this_operand = i.operands++;
5399 if (i.operands > MAX_OPERANDS)
5400 {
5401 as_bad (_("spurious operands; (%d operands/instruction max)"),
5402 MAX_OPERANDS);
5403 return NULL;
5404 }
9d46ce34 5405 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
5406 /* Now parse operand adding info to 'i' as we go along. */
5407 END_STRING_AND_SAVE (l);
5408
1286ab78
L
5409 if (i.mem_operands > 1)
5410 {
5411 as_bad (_("too many memory references for `%s'"),
5412 mnemonic);
5413 return 0;
5414 }
5415
29b0f896
AM
5416 if (intel_syntax)
5417 operand_ok =
5418 i386_intel_operand (token_start,
5419 intel_float_operand (mnemonic));
5420 else
a7619375 5421 operand_ok = i386_att_operand (token_start);
29b0f896
AM
5422
5423 RESTORE_END_STRING (l);
5424 if (!operand_ok)
5425 return NULL;
5426 }
5427 else
5428 {
5429 if (expecting_operand)
5430 {
5431 expecting_operand_after_comma:
5432 as_bad (_("expecting operand after ','; got nothing"));
5433 return NULL;
5434 }
5435 if (*l == ',')
5436 {
5437 as_bad (_("expecting operand before ','; got nothing"));
5438 return NULL;
5439 }
5440 }
7f3f1ea2 5441
29b0f896
AM
5442 /* Now *l must be either ',' or END_OF_INSN. */
5443 if (*l == ',')
5444 {
5445 if (*++l == END_OF_INSN)
5446 {
5447 /* Just skip it, if it's \n complain. */
5448 goto expecting_operand_after_comma;
5449 }
5450 expecting_operand = 1;
5451 }
5452 }
5453 return l;
5454}
7f3f1ea2 5455
050dfa73 5456static void
4d456e3d 5457swap_2_operands (int xchg1, int xchg2)
050dfa73
MM
5458{
5459 union i386_op temp_op;
40fb9820 5460 i386_operand_type temp_type;
c48dadc9 5461 unsigned int temp_flags;
050dfa73 5462 enum bfd_reloc_code_real temp_reloc;
4eed87de 5463
050dfa73
MM
5464 temp_type = i.types[xchg2];
5465 i.types[xchg2] = i.types[xchg1];
5466 i.types[xchg1] = temp_type;
c48dadc9
JB
5467
5468 temp_flags = i.flags[xchg2];
5469 i.flags[xchg2] = i.flags[xchg1];
5470 i.flags[xchg1] = temp_flags;
5471
050dfa73
MM
5472 temp_op = i.op[xchg2];
5473 i.op[xchg2] = i.op[xchg1];
5474 i.op[xchg1] = temp_op;
c48dadc9 5475
050dfa73
MM
5476 temp_reloc = i.reloc[xchg2];
5477 i.reloc[xchg2] = i.reloc[xchg1];
5478 i.reloc[xchg1] = temp_reloc;
43234a1e
L
5479
5480 if (i.mask)
5481 {
5482 if (i.mask->operand == xchg1)
5483 i.mask->operand = xchg2;
5484 else if (i.mask->operand == xchg2)
5485 i.mask->operand = xchg1;
5486 }
5487 if (i.broadcast)
5488 {
5489 if (i.broadcast->operand == xchg1)
5490 i.broadcast->operand = xchg2;
5491 else if (i.broadcast->operand == xchg2)
5492 i.broadcast->operand = xchg1;
5493 }
5494 if (i.rounding)
5495 {
5496 if (i.rounding->operand == xchg1)
5497 i.rounding->operand = xchg2;
5498 else if (i.rounding->operand == xchg2)
5499 i.rounding->operand = xchg1;
5500 }
050dfa73
MM
5501}
5502
29b0f896 5503static void
e3bb37b5 5504swap_operands (void)
29b0f896 5505{
b7c61d9a 5506 switch (i.operands)
050dfa73 5507 {
c0f3af97 5508 case 5:
b7c61d9a 5509 case 4:
4d456e3d 5510 swap_2_operands (1, i.operands - 2);
1a0670f3 5511 /* Fall through. */
b7c61d9a
L
5512 case 3:
5513 case 2:
4d456e3d 5514 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
5515 break;
5516 default:
5517 abort ();
29b0f896 5518 }
29b0f896
AM
5519
5520 if (i.mem_operands == 2)
5521 {
5522 const seg_entry *temp_seg;
5523 temp_seg = i.seg[0];
5524 i.seg[0] = i.seg[1];
5525 i.seg[1] = temp_seg;
5526 }
5527}
252b5132 5528
29b0f896
AM
5529/* Try to ensure constant immediates are represented in the smallest
5530 opcode possible. */
5531static void
e3bb37b5 5532optimize_imm (void)
29b0f896
AM
5533{
5534 char guess_suffix = 0;
5535 int op;
252b5132 5536
29b0f896
AM
5537 if (i.suffix)
5538 guess_suffix = i.suffix;
5539 else if (i.reg_operands)
5540 {
5541 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
5542 We can't do this properly yet, i.e. excluding special register
5543 instances, but the following works for instructions with
5544 immediates. In any case, we can't set i.suffix yet. */
29b0f896 5545 for (op = i.operands; --op >= 0;)
bab6aec1
JB
5546 if (i.types[op].bitfield.class != Reg)
5547 continue;
5548 else if (i.types[op].bitfield.byte)
7ab9ffdd 5549 {
40fb9820
L
5550 guess_suffix = BYTE_MNEM_SUFFIX;
5551 break;
5552 }
bab6aec1 5553 else if (i.types[op].bitfield.word)
252b5132 5554 {
40fb9820
L
5555 guess_suffix = WORD_MNEM_SUFFIX;
5556 break;
5557 }
bab6aec1 5558 else if (i.types[op].bitfield.dword)
40fb9820
L
5559 {
5560 guess_suffix = LONG_MNEM_SUFFIX;
5561 break;
5562 }
bab6aec1 5563 else if (i.types[op].bitfield.qword)
40fb9820
L
5564 {
5565 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5566 break;
252b5132 5567 }
29b0f896
AM
5568 }
5569 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5570 guess_suffix = WORD_MNEM_SUFFIX;
5571
5572 for (op = i.operands; --op >= 0;)
40fb9820 5573 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5574 {
5575 switch (i.op[op].imms->X_op)
252b5132 5576 {
29b0f896
AM
5577 case O_constant:
5578 /* If a suffix is given, this operand may be shortened. */
5579 switch (guess_suffix)
252b5132 5580 {
29b0f896 5581 case LONG_MNEM_SUFFIX:
40fb9820
L
5582 i.types[op].bitfield.imm32 = 1;
5583 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5584 break;
5585 case WORD_MNEM_SUFFIX:
40fb9820
L
5586 i.types[op].bitfield.imm16 = 1;
5587 i.types[op].bitfield.imm32 = 1;
5588 i.types[op].bitfield.imm32s = 1;
5589 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5590 break;
5591 case BYTE_MNEM_SUFFIX:
40fb9820
L
5592 i.types[op].bitfield.imm8 = 1;
5593 i.types[op].bitfield.imm8s = 1;
5594 i.types[op].bitfield.imm16 = 1;
5595 i.types[op].bitfield.imm32 = 1;
5596 i.types[op].bitfield.imm32s = 1;
5597 i.types[op].bitfield.imm64 = 1;
29b0f896 5598 break;
252b5132 5599 }
252b5132 5600
29b0f896
AM
5601 /* If this operand is at most 16 bits, convert it
5602 to a signed 16 bit number before trying to see
5603 whether it will fit in an even smaller size.
5604 This allows a 16-bit operand such as $0xffe0 to
5605 be recognised as within Imm8S range. */
40fb9820 5606 if ((i.types[op].bitfield.imm16)
29b0f896 5607 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5608 {
29b0f896
AM
5609 i.op[op].imms->X_add_number =
5610 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
5611 }
a28def75
L
5612#ifdef BFD64
5613 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5614 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5615 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5616 == 0))
5617 {
5618 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5619 ^ ((offsetT) 1 << 31))
5620 - ((offsetT) 1 << 31));
5621 }
a28def75 5622#endif
40fb9820 5623 i.types[op]
c6fb90c8
L
5624 = operand_type_or (i.types[op],
5625 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5626
29b0f896
AM
5627 /* We must avoid matching of Imm32 templates when 64bit
5628 only immediate is available. */
5629 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5630 i.types[op].bitfield.imm32 = 0;
29b0f896 5631 break;
252b5132 5632
29b0f896
AM
5633 case O_absent:
5634 case O_register:
5635 abort ();
5636
5637 /* Symbols and expressions. */
5638 default:
9cd96992
JB
5639 /* Convert symbolic operand to proper sizes for matching, but don't
5640 prevent matching a set of insns that only supports sizes other
5641 than those matching the insn suffix. */
5642 {
40fb9820 5643 i386_operand_type mask, allowed;
d3ce72d0 5644 const insn_template *t;
9cd96992 5645
0dfbf9d7
L
5646 operand_type_set (&mask, 0);
5647 operand_type_set (&allowed, 0);
40fb9820 5648
4eed87de
AM
5649 for (t = current_templates->start;
5650 t < current_templates->end;
5651 ++t)
bab6aec1
JB
5652 {
5653 allowed = operand_type_or (allowed, t->operand_types[op]);
5654 allowed = operand_type_and (allowed, anyimm);
5655 }
9cd96992
JB
5656 switch (guess_suffix)
5657 {
5658 case QWORD_MNEM_SUFFIX:
40fb9820
L
5659 mask.bitfield.imm64 = 1;
5660 mask.bitfield.imm32s = 1;
9cd96992
JB
5661 break;
5662 case LONG_MNEM_SUFFIX:
40fb9820 5663 mask.bitfield.imm32 = 1;
9cd96992
JB
5664 break;
5665 case WORD_MNEM_SUFFIX:
40fb9820 5666 mask.bitfield.imm16 = 1;
9cd96992
JB
5667 break;
5668 case BYTE_MNEM_SUFFIX:
40fb9820 5669 mask.bitfield.imm8 = 1;
9cd96992
JB
5670 break;
5671 default:
9cd96992
JB
5672 break;
5673 }
c6fb90c8 5674 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5675 if (!operand_type_all_zero (&allowed))
c6fb90c8 5676 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5677 }
29b0f896 5678 break;
252b5132 5679 }
29b0f896
AM
5680 }
5681}
47926f60 5682
29b0f896
AM
5683/* Try to use the smallest displacement type too. */
5684static void
e3bb37b5 5685optimize_disp (void)
29b0f896
AM
5686{
5687 int op;
3e73aa7c 5688
29b0f896 5689 for (op = i.operands; --op >= 0;)
40fb9820 5690 if (operand_type_check (i.types[op], disp))
252b5132 5691 {
b300c311 5692 if (i.op[op].disps->X_op == O_constant)
252b5132 5693 {
91d6fa6a 5694 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5695
40fb9820 5696 if (i.types[op].bitfield.disp16
91d6fa6a 5697 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
5698 {
5699 /* If this operand is at most 16 bits, convert
5700 to a signed 16 bit number and don't use 64bit
5701 displacement. */
91d6fa6a 5702 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 5703 i.types[op].bitfield.disp64 = 0;
b300c311 5704 }
a28def75
L
5705#ifdef BFD64
5706 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
40fb9820 5707 if (i.types[op].bitfield.disp32
91d6fa6a 5708 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
b300c311
L
5709 {
5710 /* If this operand is at most 32 bits, convert
5711 to a signed 32 bit number and don't use 64bit
5712 displacement. */
91d6fa6a
NC
5713 op_disp &= (((offsetT) 2 << 31) - 1);
5714 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 5715 i.types[op].bitfield.disp64 = 0;
b300c311 5716 }
a28def75 5717#endif
91d6fa6a 5718 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5719 {
40fb9820
L
5720 i.types[op].bitfield.disp8 = 0;
5721 i.types[op].bitfield.disp16 = 0;
5722 i.types[op].bitfield.disp32 = 0;
5723 i.types[op].bitfield.disp32s = 0;
5724 i.types[op].bitfield.disp64 = 0;
b300c311
L
5725 i.op[op].disps = 0;
5726 i.disp_operands--;
5727 }
5728 else if (flag_code == CODE_64BIT)
5729 {
91d6fa6a 5730 if (fits_in_signed_long (op_disp))
28a9d8f5 5731 {
40fb9820
L
5732 i.types[op].bitfield.disp64 = 0;
5733 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5734 }
0e1147d9 5735 if (i.prefix[ADDR_PREFIX]
91d6fa6a 5736 && fits_in_unsigned_long (op_disp))
40fb9820 5737 i.types[op].bitfield.disp32 = 1;
b300c311 5738 }
40fb9820
L
5739 if ((i.types[op].bitfield.disp32
5740 || i.types[op].bitfield.disp32s
5741 || i.types[op].bitfield.disp16)
b5014f7a 5742 && fits_in_disp8 (op_disp))
40fb9820 5743 i.types[op].bitfield.disp8 = 1;
252b5132 5744 }
67a4f2b7
AO
5745 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5746 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5747 {
5748 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5749 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
5750 i.types[op].bitfield.disp8 = 0;
5751 i.types[op].bitfield.disp16 = 0;
5752 i.types[op].bitfield.disp32 = 0;
5753 i.types[op].bitfield.disp32s = 0;
5754 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
5755 }
5756 else
b300c311 5757 /* We only support 64bit displacement on constants. */
40fb9820 5758 i.types[op].bitfield.disp64 = 0;
252b5132 5759 }
29b0f896
AM
5760}
5761
4a1b91ea
L
5762/* Return 1 if there is a match in broadcast bytes between operand
5763 GIVEN and instruction template T. */
5764
5765static INLINE int
5766match_broadcast_size (const insn_template *t, unsigned int given)
5767{
5768 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5769 && i.types[given].bitfield.byte)
5770 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5771 && i.types[given].bitfield.word)
5772 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5773 && i.types[given].bitfield.dword)
5774 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5775 && i.types[given].bitfield.qword));
5776}
5777
6c30d220
L
5778/* Check if operands are valid for the instruction. */
5779
5780static int
5781check_VecOperands (const insn_template *t)
5782{
43234a1e 5783 unsigned int op;
e2195274 5784 i386_cpu_flags cpu;
e2195274
JB
5785
5786 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5787 any one operand are implicity requiring AVX512VL support if the actual
5788 operand size is YMMword or XMMword. Since this function runs after
5789 template matching, there's no need to check for YMMword/XMMword in
5790 the template. */
5791 cpu = cpu_flags_and (t->cpu_flags, avx512);
5792 if (!cpu_flags_all_zero (&cpu)
5793 && !t->cpu_flags.bitfield.cpuavx512vl
5794 && !cpu_arch_flags.bitfield.cpuavx512vl)
5795 {
5796 for (op = 0; op < t->operands; ++op)
5797 {
5798 if (t->operand_types[op].bitfield.zmmword
5799 && (i.types[op].bitfield.ymmword
5800 || i.types[op].bitfield.xmmword))
5801 {
5802 i.error = unsupported;
5803 return 1;
5804 }
5805 }
5806 }
43234a1e 5807
6c30d220 5808 /* Without VSIB byte, we can't have a vector register for index. */
63112cd6 5809 if (!t->opcode_modifier.sib
6c30d220 5810 && i.index_reg
1b54b8d7
JB
5811 && (i.index_reg->reg_type.bitfield.xmmword
5812 || i.index_reg->reg_type.bitfield.ymmword
5813 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
5814 {
5815 i.error = unsupported_vector_index_register;
5816 return 1;
5817 }
5818
ad8ecc81
MZ
5819 /* Check if default mask is allowed. */
5820 if (t->opcode_modifier.nodefmask
5821 && (!i.mask || i.mask->mask->reg_num == 0))
5822 {
5823 i.error = no_default_mask;
5824 return 1;
5825 }
5826
7bab8ab5
JB
5827 /* For VSIB byte, we need a vector register for index, and all vector
5828 registers must be distinct. */
260cd341 5829 if (t->opcode_modifier.sib && t->opcode_modifier.sib != SIBMEM)
7bab8ab5
JB
5830 {
5831 if (!i.index_reg
63112cd6 5832 || !((t->opcode_modifier.sib == VECSIB128
1b54b8d7 5833 && i.index_reg->reg_type.bitfield.xmmword)
63112cd6 5834 || (t->opcode_modifier.sib == VECSIB256
1b54b8d7 5835 && i.index_reg->reg_type.bitfield.ymmword)
63112cd6 5836 || (t->opcode_modifier.sib == VECSIB512
1b54b8d7 5837 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
5838 {
5839 i.error = invalid_vsib_address;
5840 return 1;
5841 }
5842
43234a1e
L
5843 gas_assert (i.reg_operands == 2 || i.mask);
5844 if (i.reg_operands == 2 && !i.mask)
5845 {
3528c362 5846 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
5847 gas_assert (i.types[0].bitfield.xmmword
5848 || i.types[0].bitfield.ymmword);
3528c362 5849 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
5850 gas_assert (i.types[2].bitfield.xmmword
5851 || i.types[2].bitfield.ymmword);
43234a1e
L
5852 if (operand_check == check_none)
5853 return 0;
5854 if (register_number (i.op[0].regs)
5855 != register_number (i.index_reg)
5856 && register_number (i.op[2].regs)
5857 != register_number (i.index_reg)
5858 && register_number (i.op[0].regs)
5859 != register_number (i.op[2].regs))
5860 return 0;
5861 if (operand_check == check_error)
5862 {
5863 i.error = invalid_vector_register_set;
5864 return 1;
5865 }
5866 as_warn (_("mask, index, and destination registers should be distinct"));
5867 }
8444f82a
MZ
5868 else if (i.reg_operands == 1 && i.mask)
5869 {
3528c362 5870 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
5871 && (i.types[1].bitfield.xmmword
5872 || i.types[1].bitfield.ymmword
5873 || i.types[1].bitfield.zmmword)
8444f82a
MZ
5874 && (register_number (i.op[1].regs)
5875 == register_number (i.index_reg)))
5876 {
5877 if (operand_check == check_error)
5878 {
5879 i.error = invalid_vector_register_set;
5880 return 1;
5881 }
5882 if (operand_check != check_none)
5883 as_warn (_("index and destination registers should be distinct"));
5884 }
5885 }
43234a1e 5886 }
7bab8ab5 5887
260cd341
LC
5888 /* For AMX instructions with three tmmword operands, all tmmword operand must be
5889 distinct */
5890 if (t->operand_types[0].bitfield.tmmword
5891 && i.reg_operands == 3)
5892 {
5893 if (register_number (i.op[0].regs)
5894 == register_number (i.op[1].regs)
5895 || register_number (i.op[0].regs)
5896 == register_number (i.op[2].regs)
5897 || register_number (i.op[1].regs)
5898 == register_number (i.op[2].regs))
5899 {
5900 i.error = invalid_tmm_register_set;
5901 return 1;
5902 }
5903 }
5904
43234a1e
L
5905 /* Check if broadcast is supported by the instruction and is applied
5906 to the memory operand. */
5907 if (i.broadcast)
5908 {
8e6e0792 5909 i386_operand_type type, overlap;
43234a1e
L
5910
5911 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 5912 and its broadcast bytes match the memory operand. */
32546502 5913 op = i.broadcast->operand;
8e6e0792 5914 if (!t->opcode_modifier.broadcast
c48dadc9 5915 || !(i.flags[op] & Operand_Mem)
c39e5b26 5916 || (!i.types[op].bitfield.unspecified
4a1b91ea 5917 && !match_broadcast_size (t, op)))
43234a1e
L
5918 {
5919 bad_broadcast:
5920 i.error = unsupported_broadcast;
5921 return 1;
5922 }
8e6e0792 5923
4a1b91ea
L
5924 i.broadcast->bytes = ((1 << (t->opcode_modifier.broadcast - 1))
5925 * i.broadcast->type);
8e6e0792 5926 operand_type_set (&type, 0);
4a1b91ea 5927 switch (i.broadcast->bytes)
8e6e0792 5928 {
4a1b91ea
L
5929 case 2:
5930 type.bitfield.word = 1;
5931 break;
5932 case 4:
5933 type.bitfield.dword = 1;
5934 break;
8e6e0792
JB
5935 case 8:
5936 type.bitfield.qword = 1;
5937 break;
5938 case 16:
5939 type.bitfield.xmmword = 1;
5940 break;
5941 case 32:
5942 type.bitfield.ymmword = 1;
5943 break;
5944 case 64:
5945 type.bitfield.zmmword = 1;
5946 break;
5947 default:
5948 goto bad_broadcast;
5949 }
5950
5951 overlap = operand_type_and (type, t->operand_types[op]);
bc49bfd8
JB
5952 if (t->operand_types[op].bitfield.class == RegSIMD
5953 && t->operand_types[op].bitfield.byte
5954 + t->operand_types[op].bitfield.word
5955 + t->operand_types[op].bitfield.dword
5956 + t->operand_types[op].bitfield.qword > 1)
5957 {
5958 overlap.bitfield.xmmword = 0;
5959 overlap.bitfield.ymmword = 0;
5960 overlap.bitfield.zmmword = 0;
5961 }
8e6e0792
JB
5962 if (operand_type_all_zero (&overlap))
5963 goto bad_broadcast;
5964
5965 if (t->opcode_modifier.checkregsize)
5966 {
5967 unsigned int j;
5968
e2195274 5969 type.bitfield.baseindex = 1;
8e6e0792
JB
5970 for (j = 0; j < i.operands; ++j)
5971 {
5972 if (j != op
5973 && !operand_type_register_match(i.types[j],
5974 t->operand_types[j],
5975 type,
5976 t->operand_types[op]))
5977 goto bad_broadcast;
5978 }
5979 }
43234a1e
L
5980 }
5981 /* If broadcast is supported in this instruction, we need to check if
5982 operand of one-element size isn't specified without broadcast. */
5983 else if (t->opcode_modifier.broadcast && i.mem_operands)
5984 {
5985 /* Find memory operand. */
5986 for (op = 0; op < i.operands; op++)
8dc0818e 5987 if (i.flags[op] & Operand_Mem)
43234a1e
L
5988 break;
5989 gas_assert (op < i.operands);
5990 /* Check size of the memory operand. */
4a1b91ea 5991 if (match_broadcast_size (t, op))
43234a1e
L
5992 {
5993 i.error = broadcast_needed;
5994 return 1;
5995 }
5996 }
c39e5b26
JB
5997 else
5998 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
5999
6000 /* Check if requested masking is supported. */
ae2387fe 6001 if (i.mask)
43234a1e 6002 {
ae2387fe
JB
6003 switch (t->opcode_modifier.masking)
6004 {
6005 case BOTH_MASKING:
6006 break;
6007 case MERGING_MASKING:
6008 if (i.mask->zeroing)
6009 {
6010 case 0:
6011 i.error = unsupported_masking;
6012 return 1;
6013 }
6014 break;
6015 case DYNAMIC_MASKING:
6016 /* Memory destinations allow only merging masking. */
6017 if (i.mask->zeroing && i.mem_operands)
6018 {
6019 /* Find memory operand. */
6020 for (op = 0; op < i.operands; op++)
c48dadc9 6021 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
6022 break;
6023 gas_assert (op < i.operands);
6024 if (op == i.operands - 1)
6025 {
6026 i.error = unsupported_masking;
6027 return 1;
6028 }
6029 }
6030 break;
6031 default:
6032 abort ();
6033 }
43234a1e
L
6034 }
6035
6036 /* Check if masking is applied to dest operand. */
6037 if (i.mask && (i.mask->operand != (int) (i.operands - 1)))
6038 {
6039 i.error = mask_not_on_destination;
6040 return 1;
6041 }
6042
43234a1e
L
6043 /* Check RC/SAE. */
6044 if (i.rounding)
6045 {
a80195f1
JB
6046 if (!t->opcode_modifier.sae
6047 || (i.rounding->type != saeonly && !t->opcode_modifier.staticrounding))
43234a1e
L
6048 {
6049 i.error = unsupported_rc_sae;
6050 return 1;
6051 }
6052 /* If the instruction has several immediate operands and one of
6053 them is rounding, the rounding operand should be the last
6054 immediate operand. */
6055 if (i.imm_operands > 1
6056 && i.rounding->operand != (int) (i.imm_operands - 1))
7bab8ab5 6057 {
43234a1e 6058 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
6059 return 1;
6060 }
6c30d220
L
6061 }
6062
da4977e0
JB
6063 /* Check the special Imm4 cases; must be the first operand. */
6064 if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)
6065 {
6066 if (i.op[0].imms->X_op != O_constant
6067 || !fits_in_imm4 (i.op[0].imms->X_add_number))
6068 {
6069 i.error = bad_imm4;
6070 return 1;
6071 }
6072
6073 /* Turn off Imm<N> so that update_imm won't complain. */
6074 operand_type_set (&i.types[0], 0);
6075 }
6076
43234a1e 6077 /* Check vector Disp8 operand. */
b5014f7a
JB
6078 if (t->opcode_modifier.disp8memshift
6079 && i.disp_encoding != disp_encoding_32bit)
43234a1e
L
6080 {
6081 if (i.broadcast)
4a1b91ea 6082 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 6083 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 6084 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
6085 else
6086 {
6087 const i386_operand_type *type = NULL;
6088
6089 i.memshift = 0;
6090 for (op = 0; op < i.operands; op++)
8dc0818e 6091 if (i.flags[op] & Operand_Mem)
7091c612 6092 {
4174bfff
JB
6093 if (t->opcode_modifier.evex == EVEXLIG)
6094 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
6095 else if (t->operand_types[op].bitfield.xmmword
6096 + t->operand_types[op].bitfield.ymmword
6097 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
6098 type = &t->operand_types[op];
6099 else if (!i.types[op].bitfield.unspecified)
6100 type = &i.types[op];
6101 }
3528c362 6102 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 6103 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
6104 {
6105 if (i.types[op].bitfield.zmmword)
6106 i.memshift = 6;
6107 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
6108 i.memshift = 5;
6109 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
6110 i.memshift = 4;
6111 }
6112
6113 if (type)
6114 {
6115 if (type->bitfield.zmmword)
6116 i.memshift = 6;
6117 else if (type->bitfield.ymmword)
6118 i.memshift = 5;
6119 else if (type->bitfield.xmmword)
6120 i.memshift = 4;
6121 }
6122
6123 /* For the check in fits_in_disp8(). */
6124 if (i.memshift == 0)
6125 i.memshift = -1;
6126 }
43234a1e
L
6127
6128 for (op = 0; op < i.operands; op++)
6129 if (operand_type_check (i.types[op], disp)
6130 && i.op[op].disps->X_op == O_constant)
6131 {
b5014f7a 6132 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 6133 {
b5014f7a
JB
6134 i.types[op].bitfield.disp8 = 1;
6135 return 0;
43234a1e 6136 }
b5014f7a 6137 i.types[op].bitfield.disp8 = 0;
43234a1e
L
6138 }
6139 }
b5014f7a
JB
6140
6141 i.memshift = 0;
43234a1e 6142
6c30d220
L
6143 return 0;
6144}
6145
da4977e0 6146/* Check if encoding requirements are met by the instruction. */
a683cc34
SP
6147
6148static int
da4977e0 6149VEX_check_encoding (const insn_template *t)
a683cc34 6150{
da4977e0
JB
6151 if (i.vec_encoding == vex_encoding_error)
6152 {
6153 i.error = unsupported;
6154 return 1;
6155 }
6156
86fa6981 6157 if (i.vec_encoding == vex_encoding_evex)
43234a1e 6158 {
86fa6981 6159 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 6160 if (!is_evex_encoding (t))
86fa6981
L
6161 {
6162 i.error = unsupported;
6163 return 1;
6164 }
6165 return 0;
43234a1e
L
6166 }
6167
a683cc34 6168 if (!t->opcode_modifier.vex)
86fa6981
L
6169 {
6170 /* This instruction template doesn't have VEX prefix. */
6171 if (i.vec_encoding != vex_encoding_default)
6172 {
6173 i.error = unsupported;
6174 return 1;
6175 }
6176 return 0;
6177 }
a683cc34 6178
a683cc34
SP
6179 return 0;
6180}
6181
d3ce72d0 6182static const insn_template *
83b16ac6 6183match_template (char mnem_suffix)
29b0f896
AM
6184{
6185 /* Points to template once we've found it. */
d3ce72d0 6186 const insn_template *t;
40fb9820 6187 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 6188 i386_operand_type overlap4;
29b0f896 6189 unsigned int found_reverse_match;
dc2be329 6190 i386_opcode_modifier suffix_check;
40fb9820 6191 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 6192 int addr_prefix_disp;
45a4bb20 6193 unsigned int j, size_match, check_register;
5614d22c 6194 enum i386_error specific_error = 0;
29b0f896 6195
c0f3af97
L
6196#if MAX_OPERANDS != 5
6197# error "MAX_OPERANDS must be 5."
f48ff2ae
L
6198#endif
6199
29b0f896 6200 found_reverse_match = 0;
539e75ad 6201 addr_prefix_disp = -1;
40fb9820 6202
dc2be329 6203 /* Prepare for mnemonic suffix check. */
40fb9820 6204 memset (&suffix_check, 0, sizeof (suffix_check));
dc2be329
L
6205 switch (mnem_suffix)
6206 {
6207 case BYTE_MNEM_SUFFIX:
6208 suffix_check.no_bsuf = 1;
6209 break;
6210 case WORD_MNEM_SUFFIX:
6211 suffix_check.no_wsuf = 1;
6212 break;
6213 case SHORT_MNEM_SUFFIX:
6214 suffix_check.no_ssuf = 1;
6215 break;
6216 case LONG_MNEM_SUFFIX:
6217 suffix_check.no_lsuf = 1;
6218 break;
6219 case QWORD_MNEM_SUFFIX:
6220 suffix_check.no_qsuf = 1;
6221 break;
6222 default:
6223 /* NB: In Intel syntax, normally we can check for memory operand
6224 size when there is no mnemonic suffix. But jmp and call have
6225 2 different encodings with Dword memory operand size, one with
6226 No_ldSuf and the other without. i.suffix is set to
6227 LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
6228 if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
6229 suffix_check.no_ldsuf = 1;
83b16ac6
JB
6230 }
6231
01559ecc
L
6232 /* Must have right number of operands. */
6233 i.error = number_of_operands_mismatch;
6234
45aa61fe 6235 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 6236 {
539e75ad 6237 addr_prefix_disp = -1;
dbbc8b7e 6238 found_reverse_match = 0;
539e75ad 6239
29b0f896
AM
6240 if (i.operands != t->operands)
6241 continue;
6242
50aecf8c 6243 /* Check processor support. */
a65babc9 6244 i.error = unsupported;
45a4bb20 6245 if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH)
50aecf8c
L
6246 continue;
6247
e1d4d893 6248 /* Check AT&T mnemonic. */
a65babc9 6249 i.error = unsupported_with_intel_mnemonic;
e1d4d893 6250 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
6251 continue;
6252
4b5aaf5f 6253 /* Check AT&T/Intel syntax. */
a65babc9 6254 i.error = unsupported_syntax;
5c07affc 6255 if ((intel_syntax && t->opcode_modifier.attsyntax)
4b5aaf5f 6256 || (!intel_syntax && t->opcode_modifier.intelsyntax))
1efbbeb4
L
6257 continue;
6258
4b5aaf5f
L
6259 /* Check Intel64/AMD64 ISA. */
6260 switch (isa64)
6261 {
6262 default:
6263 /* Default: Don't accept Intel64. */
6264 if (t->opcode_modifier.isa64 == INTEL64)
6265 continue;
6266 break;
6267 case amd64:
6268 /* -mamd64: Don't accept Intel64 and Intel64 only. */
6269 if (t->opcode_modifier.isa64 >= INTEL64)
6270 continue;
6271 break;
6272 case intel64:
6273 /* -mintel64: Don't accept AMD64. */
5990e377 6274 if (t->opcode_modifier.isa64 == AMD64 && flag_code == CODE_64BIT)
4b5aaf5f
L
6275 continue;
6276 break;
6277 }
6278
dc2be329 6279 /* Check the suffix. */
a65babc9 6280 i.error = invalid_instruction_suffix;
dc2be329
L
6281 if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
6282 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
6283 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
6284 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
6285 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
6286 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
83b16ac6 6287 continue;
29b0f896 6288
3ac21baa
JB
6289 size_match = operand_size_match (t);
6290 if (!size_match)
7d5e4556 6291 continue;
539e75ad 6292
6f2f06be
JB
6293 /* This is intentionally not
6294
0cfa3eb3 6295 if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
6f2f06be
JB
6296
6297 as the case of a missing * on the operand is accepted (perhaps with
6298 a warning, issued further down). */
0cfa3eb3 6299 if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
6f2f06be
JB
6300 {
6301 i.error = operand_type_mismatch;
6302 continue;
6303 }
6304
5c07affc
L
6305 for (j = 0; j < MAX_OPERANDS; j++)
6306 operand_types[j] = t->operand_types[j];
6307
e365e234
JB
6308 /* In general, don't allow
6309 - 64-bit operands outside of 64-bit mode,
6310 - 32-bit operands on pre-386. */
4873e243 6311 j = i.imm_operands + (t->operands > i.imm_operands + 1);
e365e234
JB
6312 if (((i.suffix == QWORD_MNEM_SUFFIX
6313 && flag_code != CODE_64BIT
6314 && (t->base_opcode != 0x0fc7
6315 || t->extension_opcode != 1 /* cmpxchg8b */))
6316 || (i.suffix == LONG_MNEM_SUFFIX
6317 && !cpu_arch_flags.bitfield.cpui386))
45aa61fe 6318 && (intel_syntax
3cd7f3e3 6319 ? (t->opcode_modifier.mnemonicsize != IGNORESIZE
45aa61fe
AM
6320 && !intel_float_operand (t->name))
6321 : intel_float_operand (t->name) != 2)
4873e243
JB
6322 && (t->operands == i.imm_operands
6323 || (operand_types[i.imm_operands].bitfield.class != RegMMX
6324 && operand_types[i.imm_operands].bitfield.class != RegSIMD
6325 && operand_types[i.imm_operands].bitfield.class != RegMask)
6326 || (operand_types[j].bitfield.class != RegMMX
6327 && operand_types[j].bitfield.class != RegSIMD
6328 && operand_types[j].bitfield.class != RegMask))
63112cd6 6329 && !t->opcode_modifier.sib)
192dc9c6
JB
6330 continue;
6331
29b0f896 6332 /* Do not verify operands when there are none. */
e365e234 6333 if (!t->operands)
da4977e0
JB
6334 {
6335 if (VEX_check_encoding (t))
6336 {
6337 specific_error = i.error;
6338 continue;
6339 }
6340
6341 /* We've found a match; break out of loop. */
6342 break;
6343 }
252b5132 6344
48bcea9f
JB
6345 if (!t->opcode_modifier.jump
6346 || t->opcode_modifier.jump == JUMP_ABSOLUTE)
6347 {
6348 /* There should be only one Disp operand. */
6349 for (j = 0; j < MAX_OPERANDS; j++)
6350 if (operand_type_check (operand_types[j], disp))
539e75ad 6351 break;
48bcea9f
JB
6352 if (j < MAX_OPERANDS)
6353 {
6354 bfd_boolean override = (i.prefix[ADDR_PREFIX] != 0);
6355
6356 addr_prefix_disp = j;
6357
6358 /* Address size prefix will turn Disp64/Disp32S/Disp32/Disp16
6359 operand into Disp32/Disp32/Disp16/Disp32 operand. */
6360 switch (flag_code)
40fb9820 6361 {
48bcea9f
JB
6362 case CODE_16BIT:
6363 override = !override;
6364 /* Fall through. */
6365 case CODE_32BIT:
6366 if (operand_types[j].bitfield.disp32
6367 && operand_types[j].bitfield.disp16)
40fb9820 6368 {
48bcea9f
JB
6369 operand_types[j].bitfield.disp16 = override;
6370 operand_types[j].bitfield.disp32 = !override;
40fb9820 6371 }
48bcea9f
JB
6372 operand_types[j].bitfield.disp32s = 0;
6373 operand_types[j].bitfield.disp64 = 0;
6374 break;
6375
6376 case CODE_64BIT:
6377 if (operand_types[j].bitfield.disp32s
6378 || operand_types[j].bitfield.disp64)
40fb9820 6379 {
48bcea9f
JB
6380 operand_types[j].bitfield.disp64 &= !override;
6381 operand_types[j].bitfield.disp32s &= !override;
6382 operand_types[j].bitfield.disp32 = override;
40fb9820 6383 }
48bcea9f
JB
6384 operand_types[j].bitfield.disp16 = 0;
6385 break;
40fb9820 6386 }
539e75ad 6387 }
48bcea9f 6388 }
539e75ad 6389
02a86693
L
6390 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
6391 if (i.reloc[0] == BFD_RELOC_386_GOT32 && t->base_opcode == 0xa0)
6392 continue;
6393
56ffb741 6394 /* We check register size if needed. */
e2195274
JB
6395 if (t->opcode_modifier.checkregsize)
6396 {
6397 check_register = (1 << t->operands) - 1;
6398 if (i.broadcast)
6399 check_register &= ~(1 << i.broadcast->operand);
6400 }
6401 else
6402 check_register = 0;
6403
c6fb90c8 6404 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
6405 switch (t->operands)
6406 {
6407 case 1:
40fb9820 6408 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
6409 continue;
6410 break;
6411 case 2:
33eaf5de 6412 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
6413 only in 32bit mode and we can use opcode 0x90. In 64bit
6414 mode, we can't use 0x90 for xchg %eax, %eax since it should
6415 zero-extend %eax to %rax. */
6416 if (flag_code == CODE_64BIT
6417 && t->base_opcode == 0x90
75e5731b
JB
6418 && i.types[0].bitfield.instance == Accum
6419 && i.types[0].bitfield.dword
6420 && i.types[1].bitfield.instance == Accum
6421 && i.types[1].bitfield.dword)
8b38ad71 6422 continue;
1212781b
JB
6423 /* xrelease mov %eax, <disp> is another special case. It must not
6424 match the accumulator-only encoding of mov. */
6425 if (flag_code != CODE_64BIT
6426 && i.hle_prefix
6427 && t->base_opcode == 0xa0
75e5731b 6428 && i.types[0].bitfield.instance == Accum
8dc0818e 6429 && (i.flags[1] & Operand_Mem))
1212781b 6430 continue;
f5eb1d70
JB
6431 /* Fall through. */
6432
6433 case 3:
3ac21baa
JB
6434 if (!(size_match & MATCH_STRAIGHT))
6435 goto check_reverse;
64c49ab3
JB
6436 /* Reverse direction of operands if swapping is possible in the first
6437 place (operands need to be symmetric) and
6438 - the load form is requested, and the template is a store form,
6439 - the store form is requested, and the template is a load form,
6440 - the non-default (swapped) form is requested. */
6441 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 6442 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
6443 && !operand_type_all_zero (&overlap1))
6444 switch (i.dir_encoding)
6445 {
6446 case dir_encoding_load:
6447 if (operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6448 || t->opcode_modifier.regmem)
64c49ab3
JB
6449 goto check_reverse;
6450 break;
6451
6452 case dir_encoding_store:
6453 if (!operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6454 && !t->opcode_modifier.regmem)
64c49ab3
JB
6455 goto check_reverse;
6456 break;
6457
6458 case dir_encoding_swap:
6459 goto check_reverse;
6460
6461 case dir_encoding_default:
6462 break;
6463 }
86fa6981 6464 /* If we want store form, we skip the current load. */
64c49ab3
JB
6465 if ((i.dir_encoding == dir_encoding_store
6466 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
6467 && i.mem_operands == 0
6468 && t->opcode_modifier.load)
fa99fab2 6469 continue;
1a0670f3 6470 /* Fall through. */
f48ff2ae 6471 case 4:
c0f3af97 6472 case 5:
c6fb90c8 6473 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
6474 if (!operand_type_match (overlap0, i.types[0])
6475 || !operand_type_match (overlap1, i.types[1])
e2195274 6476 || ((check_register & 3) == 3
dc821c5f 6477 && !operand_type_register_match (i.types[0],
40fb9820 6478 operand_types[0],
dc821c5f 6479 i.types[1],
40fb9820 6480 operand_types[1])))
29b0f896
AM
6481 {
6482 /* Check if other direction is valid ... */
38e314eb 6483 if (!t->opcode_modifier.d)
29b0f896
AM
6484 continue;
6485
dc1e8a47 6486 check_reverse:
3ac21baa
JB
6487 if (!(size_match & MATCH_REVERSE))
6488 continue;
29b0f896 6489 /* Try reversing direction of operands. */
f5eb1d70
JB
6490 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
6491 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 6492 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 6493 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 6494 || (check_register
dc821c5f 6495 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
6496 operand_types[i.operands - 1],
6497 i.types[i.operands - 1],
45664ddb 6498 operand_types[0])))
29b0f896
AM
6499 {
6500 /* Does not match either direction. */
6501 continue;
6502 }
38e314eb 6503 /* found_reverse_match holds which of D or FloatR
29b0f896 6504 we've found. */
38e314eb
JB
6505 if (!t->opcode_modifier.d)
6506 found_reverse_match = 0;
6507 else if (operand_types[0].bitfield.tbyte)
8a2ed489 6508 found_reverse_match = Opcode_FloatD;
dbbc8b7e 6509 else if (operand_types[0].bitfield.xmmword
f5eb1d70 6510 || operand_types[i.operands - 1].bitfield.xmmword
3528c362
JB
6511 || operand_types[0].bitfield.class == RegMMX
6512 || operand_types[i.operands - 1].bitfield.class == RegMMX
dbbc8b7e
JB
6513 || is_any_vex_encoding(t))
6514 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
6515 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 6516 else
38e314eb 6517 found_reverse_match = Opcode_D;
40fb9820 6518 if (t->opcode_modifier.floatr)
8a2ed489 6519 found_reverse_match |= Opcode_FloatR;
29b0f896 6520 }
f48ff2ae 6521 else
29b0f896 6522 {
f48ff2ae 6523 /* Found a forward 2 operand match here. */
d1cbb4db
L
6524 switch (t->operands)
6525 {
c0f3af97
L
6526 case 5:
6527 overlap4 = operand_type_and (i.types[4],
6528 operand_types[4]);
1a0670f3 6529 /* Fall through. */
d1cbb4db 6530 case 4:
c6fb90c8
L
6531 overlap3 = operand_type_and (i.types[3],
6532 operand_types[3]);
1a0670f3 6533 /* Fall through. */
d1cbb4db 6534 case 3:
c6fb90c8
L
6535 overlap2 = operand_type_and (i.types[2],
6536 operand_types[2]);
d1cbb4db
L
6537 break;
6538 }
29b0f896 6539
f48ff2ae
L
6540 switch (t->operands)
6541 {
c0f3af97
L
6542 case 5:
6543 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 6544 || !operand_type_register_match (i.types[3],
c0f3af97 6545 operand_types[3],
c0f3af97
L
6546 i.types[4],
6547 operand_types[4]))
6548 continue;
1a0670f3 6549 /* Fall through. */
f48ff2ae 6550 case 4:
40fb9820 6551 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
6552 || ((check_register & 0xa) == 0xa
6553 && !operand_type_register_match (i.types[1],
f7768225
JB
6554 operand_types[1],
6555 i.types[3],
e2195274
JB
6556 operand_types[3]))
6557 || ((check_register & 0xc) == 0xc
6558 && !operand_type_register_match (i.types[2],
6559 operand_types[2],
6560 i.types[3],
6561 operand_types[3])))
f48ff2ae 6562 continue;
1a0670f3 6563 /* Fall through. */
f48ff2ae
L
6564 case 3:
6565 /* Here we make use of the fact that there are no
23e42951 6566 reverse match 3 operand instructions. */
40fb9820 6567 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
6568 || ((check_register & 5) == 5
6569 && !operand_type_register_match (i.types[0],
23e42951
JB
6570 operand_types[0],
6571 i.types[2],
e2195274
JB
6572 operand_types[2]))
6573 || ((check_register & 6) == 6
6574 && !operand_type_register_match (i.types[1],
6575 operand_types[1],
6576 i.types[2],
6577 operand_types[2])))
f48ff2ae
L
6578 continue;
6579 break;
6580 }
29b0f896 6581 }
f48ff2ae 6582 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
6583 slip through to break. */
6584 }
c0f3af97 6585
da4977e0
JB
6586 /* Check if vector operands are valid. */
6587 if (check_VecOperands (t))
6588 {
6589 specific_error = i.error;
6590 continue;
6591 }
6592
6593 /* Check if VEX/EVEX encoding requirements can be satisfied. */
6594 if (VEX_check_encoding (t))
5614d22c
JB
6595 {
6596 specific_error = i.error;
6597 continue;
6598 }
a683cc34 6599
29b0f896
AM
6600 /* We've found a match; break out of loop. */
6601 break;
6602 }
6603
6604 if (t == current_templates->end)
6605 {
6606 /* We found no match. */
a65babc9 6607 const char *err_msg;
5614d22c 6608 switch (specific_error ? specific_error : i.error)
a65babc9
L
6609 {
6610 default:
6611 abort ();
86e026a4 6612 case operand_size_mismatch:
a65babc9
L
6613 err_msg = _("operand size mismatch");
6614 break;
6615 case operand_type_mismatch:
6616 err_msg = _("operand type mismatch");
6617 break;
6618 case register_type_mismatch:
6619 err_msg = _("register type mismatch");
6620 break;
6621 case number_of_operands_mismatch:
6622 err_msg = _("number of operands mismatch");
6623 break;
6624 case invalid_instruction_suffix:
6625 err_msg = _("invalid instruction suffix");
6626 break;
6627 case bad_imm4:
4a2608e3 6628 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6629 break;
a65babc9
L
6630 case unsupported_with_intel_mnemonic:
6631 err_msg = _("unsupported with Intel mnemonic");
6632 break;
6633 case unsupported_syntax:
6634 err_msg = _("unsupported syntax");
6635 break;
6636 case unsupported:
35262a23 6637 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6638 current_templates->start->name);
6639 return NULL;
260cd341
LC
6640 case invalid_sib_address:
6641 err_msg = _("invalid SIB address");
6642 break;
6c30d220
L
6643 case invalid_vsib_address:
6644 err_msg = _("invalid VSIB address");
6645 break;
7bab8ab5
JB
6646 case invalid_vector_register_set:
6647 err_msg = _("mask, index, and destination registers must be distinct");
6648 break;
260cd341
LC
6649 case invalid_tmm_register_set:
6650 err_msg = _("all tmm registers must be distinct");
6651 break;
6c30d220
L
6652 case unsupported_vector_index_register:
6653 err_msg = _("unsupported vector index register");
6654 break;
43234a1e
L
6655 case unsupported_broadcast:
6656 err_msg = _("unsupported broadcast");
6657 break;
43234a1e
L
6658 case broadcast_needed:
6659 err_msg = _("broadcast is needed for operand of such type");
6660 break;
6661 case unsupported_masking:
6662 err_msg = _("unsupported masking");
6663 break;
6664 case mask_not_on_destination:
6665 err_msg = _("mask not on destination operand");
6666 break;
6667 case no_default_mask:
6668 err_msg = _("default mask isn't allowed");
6669 break;
6670 case unsupported_rc_sae:
6671 err_msg = _("unsupported static rounding/sae");
6672 break;
6673 case rc_sae_operand_not_last_imm:
6674 if (intel_syntax)
6675 err_msg = _("RC/SAE operand must precede immediate operands");
6676 else
6677 err_msg = _("RC/SAE operand must follow immediate operands");
6678 break;
6679 case invalid_register_operand:
6680 err_msg = _("invalid register operand");
6681 break;
a65babc9
L
6682 }
6683 as_bad (_("%s for `%s'"), err_msg,
891edac4 6684 current_templates->start->name);
fa99fab2 6685 return NULL;
29b0f896 6686 }
252b5132 6687
29b0f896
AM
6688 if (!quiet_warnings)
6689 {
6690 if (!intel_syntax
0cfa3eb3 6691 && (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE)))
6f2f06be 6692 as_warn (_("indirect %s without `*'"), t->name);
29b0f896 6693
40fb9820 6694 if (t->opcode_modifier.isprefix
3cd7f3e3 6695 && t->opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6696 {
6697 /* Warn them that a data or address size prefix doesn't
6698 affect assembly of the next line of code. */
6699 as_warn (_("stand-alone `%s' prefix"), t->name);
6700 }
6701 }
6702
6703 /* Copy the template we found. */
6704 i.tm = *t;
539e75ad
L
6705
6706 if (addr_prefix_disp != -1)
6707 i.tm.operand_types[addr_prefix_disp]
6708 = operand_types[addr_prefix_disp];
6709
29b0f896
AM
6710 if (found_reverse_match)
6711 {
dfd69174
JB
6712 /* If we found a reverse match we must alter the opcode direction
6713 bit and clear/flip the regmem modifier one. found_reverse_match
6714 holds bits to change (different for int & float insns). */
29b0f896
AM
6715
6716 i.tm.base_opcode ^= found_reverse_match;
6717
f5eb1d70
JB
6718 i.tm.operand_types[0] = operand_types[i.operands - 1];
6719 i.tm.operand_types[i.operands - 1] = operand_types[0];
dfd69174
JB
6720
6721 /* Certain SIMD insns have their load forms specified in the opcode
6722 table, and hence we need to _set_ RegMem instead of clearing it.
6723 We need to avoid setting the bit though on insns like KMOVW. */
6724 i.tm.opcode_modifier.regmem
6725 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
6726 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
6727 && !i.tm.opcode_modifier.regmem;
29b0f896
AM
6728 }
6729
fa99fab2 6730 return t;
29b0f896
AM
6731}
6732
6733static int
e3bb37b5 6734check_string (void)
29b0f896 6735{
51c8edf6
JB
6736 unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
6737 unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
8dc0818e 6738
51c8edf6 6739 if (i.seg[op] != NULL && i.seg[op] != &es)
29b0f896 6740 {
51c8edf6
JB
6741 as_bad (_("`%s' operand %u must use `%ses' segment"),
6742 i.tm.name,
6743 intel_syntax ? i.tm.operands - es_op : es_op + 1,
6744 register_prefix);
6745 return 0;
29b0f896 6746 }
51c8edf6
JB
6747
6748 /* There's only ever one segment override allowed per instruction.
6749 This instruction possibly has a legal segment override on the
6750 second operand, so copy the segment to where non-string
6751 instructions store it, allowing common code. */
6752 i.seg[op] = i.seg[1];
6753
29b0f896
AM
6754 return 1;
6755}
6756
6757static int
543613e9 6758process_suffix (void)
29b0f896
AM
6759{
6760 /* If matched instruction specifies an explicit instruction mnemonic
6761 suffix, use it. */
673fe0f0 6762 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6763 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6764 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6765 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6766 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6767 i.suffix = QWORD_MNEM_SUFFIX;
13e600d0 6768 else if (i.reg_operands
c8f8eebc
JB
6769 && (i.operands > 1 || i.types[0].bitfield.class == Reg)
6770 && !i.tm.opcode_modifier.addrprefixopreg)
29b0f896 6771 {
65fca059
JB
6772 unsigned int numop = i.operands;
6773
6774 /* movsx/movzx want only their source operand considered here, for the
6775 ambiguity checking below. The suffix will be replaced afterwards
6776 to represent the destination (register). */
6777 if (((i.tm.base_opcode | 8) == 0xfbe && i.tm.opcode_modifier.w)
6778 || (i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64))
6779 --i.operands;
6780
643bb870
JB
6781 /* crc32 needs REX.W set regardless of suffix / source operand size. */
6782 if (i.tm.base_opcode == 0xf20f38f0
6783 && i.tm.operand_types[1].bitfield.qword)
6784 i.rex |= REX_W;
6785
29b0f896 6786 /* If there's no instruction mnemonic suffix we try to invent one
13e600d0 6787 based on GPR operands. */
29b0f896
AM
6788 if (!i.suffix)
6789 {
6790 /* We take i.suffix from the last register operand specified,
6791 Destination register type is more significant than source
381d071f
L
6792 register type. crc32 in SSE4.2 prefers source register
6793 type. */
1a035124 6794 unsigned int op = i.tm.base_opcode != 0xf20f38f0 ? i.operands : 1;
20592a94 6795
1a035124
JB
6796 while (op--)
6797 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
6798 || i.tm.operand_types[op].bitfield.instance == Accum)
6799 {
6800 if (i.types[op].bitfield.class != Reg)
6801 continue;
6802 if (i.types[op].bitfield.byte)
6803 i.suffix = BYTE_MNEM_SUFFIX;
6804 else if (i.types[op].bitfield.word)
6805 i.suffix = WORD_MNEM_SUFFIX;
6806 else if (i.types[op].bitfield.dword)
6807 i.suffix = LONG_MNEM_SUFFIX;
6808 else if (i.types[op].bitfield.qword)
6809 i.suffix = QWORD_MNEM_SUFFIX;
6810 else
6811 continue;
6812 break;
6813 }
65fca059
JB
6814
6815 /* As an exception, movsx/movzx silently default to a byte source
6816 in AT&T mode. */
6817 if ((i.tm.base_opcode | 8) == 0xfbe && i.tm.opcode_modifier.w
6818 && !i.suffix && !intel_syntax)
6819 i.suffix = BYTE_MNEM_SUFFIX;
29b0f896
AM
6820 }
6821 else if (i.suffix == BYTE_MNEM_SUFFIX)
6822 {
2eb952a4 6823 if (intel_syntax
3cd7f3e3 6824 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6825 && i.tm.opcode_modifier.no_bsuf)
6826 i.suffix = 0;
6827 else if (!check_byte_reg ())
29b0f896
AM
6828 return 0;
6829 }
6830 else if (i.suffix == LONG_MNEM_SUFFIX)
6831 {
2eb952a4 6832 if (intel_syntax
3cd7f3e3 6833 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6834 && i.tm.opcode_modifier.no_lsuf
6835 && !i.tm.opcode_modifier.todword
6836 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
6837 i.suffix = 0;
6838 else if (!check_long_reg ())
29b0f896
AM
6839 return 0;
6840 }
6841 else if (i.suffix == QWORD_MNEM_SUFFIX)
6842 {
955e1e6a 6843 if (intel_syntax
3cd7f3e3 6844 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
9f123b91
JB
6845 && i.tm.opcode_modifier.no_qsuf
6846 && !i.tm.opcode_modifier.todword
6847 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
6848 i.suffix = 0;
6849 else if (!check_qword_reg ())
29b0f896
AM
6850 return 0;
6851 }
6852 else if (i.suffix == WORD_MNEM_SUFFIX)
6853 {
2eb952a4 6854 if (intel_syntax
3cd7f3e3 6855 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE
2eb952a4
L
6856 && i.tm.opcode_modifier.no_wsuf)
6857 i.suffix = 0;
6858 else if (!check_word_reg ())
29b0f896
AM
6859 return 0;
6860 }
3cd7f3e3
L
6861 else if (intel_syntax
6862 && i.tm.opcode_modifier.mnemonicsize == IGNORESIZE)
29b0f896
AM
6863 /* Do nothing if the instruction is going to ignore the prefix. */
6864 ;
6865 else
6866 abort ();
65fca059
JB
6867
6868 /* Undo the movsx/movzx change done above. */
6869 i.operands = numop;
29b0f896 6870 }
3cd7f3e3
L
6871 else if (i.tm.opcode_modifier.mnemonicsize == DEFAULTSIZE
6872 && !i.suffix)
29b0f896 6873 {
13e600d0
JB
6874 i.suffix = stackop_size;
6875 if (stackop_size == LONG_MNEM_SUFFIX)
06f74c5c
L
6876 {
6877 /* stackop_size is set to LONG_MNEM_SUFFIX for the
6878 .code16gcc directive to support 16-bit mode with
6879 32-bit address. For IRET without a suffix, generate
6880 16-bit IRET (opcode 0xcf) to return from an interrupt
6881 handler. */
13e600d0
JB
6882 if (i.tm.base_opcode == 0xcf)
6883 {
6884 i.suffix = WORD_MNEM_SUFFIX;
6885 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
6886 }
6887 /* Warn about changed behavior for segment register push/pop. */
6888 else if ((i.tm.base_opcode | 1) == 0x07)
6889 as_warn (_("generating 32-bit `%s', unlike earlier gas versions"),
6890 i.tm.name);
06f74c5c 6891 }
29b0f896 6892 }
c006a730 6893 else if (!i.suffix
0cfa3eb3
JB
6894 && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
6895 || i.tm.opcode_modifier.jump == JUMP_BYTE
6896 || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
64e74474
AM
6897 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
6898 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
6899 {
6900 switch (flag_code)
6901 {
6902 case CODE_64BIT:
40fb9820 6903 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a 6904 {
828c2a25
JB
6905 if (i.tm.opcode_modifier.jump == JUMP_BYTE
6906 || i.tm.opcode_modifier.no_lsuf)
6907 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a
JB
6908 break;
6909 }
1a0670f3 6910 /* Fall through. */
9306ca4a 6911 case CODE_32BIT:
40fb9820 6912 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
6913 i.suffix = LONG_MNEM_SUFFIX;
6914 break;
6915 case CODE_16BIT:
40fb9820 6916 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
6917 i.suffix = WORD_MNEM_SUFFIX;
6918 break;
6919 }
6920 }
252b5132 6921
c006a730 6922 if (!i.suffix
3cd7f3e3 6923 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8
JB
6924 /* Also cover lret/retf/iret in 64-bit mode. */
6925 || (flag_code == CODE_64BIT
6926 && !i.tm.opcode_modifier.no_lsuf
6927 && !i.tm.opcode_modifier.no_qsuf))
3cd7f3e3 6928 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
8bbb3ad8
JB
6929 /* Explicit sizing prefixes are assumed to disambiguate insns. */
6930 && !i.prefix[DATA_PREFIX] && !(i.prefix[REX_PREFIX] & REX_W)
62b3f548
JB
6931 /* Accept FLDENV et al without suffix. */
6932 && (i.tm.opcode_modifier.no_ssuf || i.tm.opcode_modifier.floatmf))
29b0f896 6933 {
6c0946d0 6934 unsigned int suffixes, evex = 0;
c006a730
JB
6935
6936 suffixes = !i.tm.opcode_modifier.no_bsuf;
6937 if (!i.tm.opcode_modifier.no_wsuf)
6938 suffixes |= 1 << 1;
6939 if (!i.tm.opcode_modifier.no_lsuf)
6940 suffixes |= 1 << 2;
6941 if (!i.tm.opcode_modifier.no_ldsuf)
6942 suffixes |= 1 << 3;
6943 if (!i.tm.opcode_modifier.no_ssuf)
6944 suffixes |= 1 << 4;
6945 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
6946 suffixes |= 1 << 5;
6947
6c0946d0
JB
6948 /* For [XYZ]MMWORD operands inspect operand sizes. While generally
6949 also suitable for AT&T syntax mode, it was requested that this be
6950 restricted to just Intel syntax. */
b9915cbc 6951 if (intel_syntax && is_any_vex_encoding (&i.tm) && !i.broadcast)
6c0946d0 6952 {
b9915cbc 6953 unsigned int op;
6c0946d0 6954
b9915cbc 6955 for (op = 0; op < i.tm.operands; ++op)
6c0946d0 6956 {
b9915cbc
JB
6957 if (is_evex_encoding (&i.tm)
6958 && !cpu_arch_flags.bitfield.cpuavx512vl)
6c0946d0 6959 {
b9915cbc
JB
6960 if (i.tm.operand_types[op].bitfield.ymmword)
6961 i.tm.operand_types[op].bitfield.xmmword = 0;
6962 if (i.tm.operand_types[op].bitfield.zmmword)
6963 i.tm.operand_types[op].bitfield.ymmword = 0;
6964 if (!i.tm.opcode_modifier.evex
6965 || i.tm.opcode_modifier.evex == EVEXDYN)
6966 i.tm.opcode_modifier.evex = EVEX512;
6967 }
6c0946d0 6968
b9915cbc
JB
6969 if (i.tm.operand_types[op].bitfield.xmmword
6970 + i.tm.operand_types[op].bitfield.ymmword
6971 + i.tm.operand_types[op].bitfield.zmmword < 2)
6972 continue;
6c0946d0 6973
b9915cbc
JB
6974 /* Any properly sized operand disambiguates the insn. */
6975 if (i.types[op].bitfield.xmmword
6976 || i.types[op].bitfield.ymmword
6977 || i.types[op].bitfield.zmmword)
6978 {
6979 suffixes &= ~(7 << 6);
6980 evex = 0;
6981 break;
6982 }
6c0946d0 6983
b9915cbc
JB
6984 if ((i.flags[op] & Operand_Mem)
6985 && i.tm.operand_types[op].bitfield.unspecified)
6986 {
6987 if (i.tm.operand_types[op].bitfield.xmmword)
6988 suffixes |= 1 << 6;
6989 if (i.tm.operand_types[op].bitfield.ymmword)
6990 suffixes |= 1 << 7;
6991 if (i.tm.operand_types[op].bitfield.zmmword)
6992 suffixes |= 1 << 8;
6993 if (is_evex_encoding (&i.tm))
6994 evex = EVEX512;
6c0946d0
JB
6995 }
6996 }
6997 }
6998
6999 /* Are multiple suffixes / operand sizes allowed? */
c006a730 7000 if (suffixes & (suffixes - 1))
9306ca4a 7001 {
873494c8 7002 if (intel_syntax
3cd7f3e3 7003 && (i.tm.opcode_modifier.mnemonicsize != DEFAULTSIZE
873494c8 7004 || operand_check == check_error))
9306ca4a 7005 {
c006a730 7006 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
9306ca4a
JB
7007 return 0;
7008 }
c006a730 7009 if (operand_check == check_error)
9306ca4a 7010 {
c006a730
JB
7011 as_bad (_("no instruction mnemonic suffix given and "
7012 "no register operands; can't size `%s'"), i.tm.name);
9306ca4a
JB
7013 return 0;
7014 }
c006a730 7015 if (operand_check == check_warning)
873494c8
JB
7016 as_warn (_("%s; using default for `%s'"),
7017 intel_syntax
7018 ? _("ambiguous operand size")
7019 : _("no instruction mnemonic suffix given and "
7020 "no register operands"),
7021 i.tm.name);
c006a730
JB
7022
7023 if (i.tm.opcode_modifier.floatmf)
7024 i.suffix = SHORT_MNEM_SUFFIX;
65fca059
JB
7025 else if ((i.tm.base_opcode | 8) == 0xfbe
7026 || (i.tm.base_opcode == 0x63
7027 && i.tm.cpu_flags.bitfield.cpu64))
7028 /* handled below */;
6c0946d0
JB
7029 else if (evex)
7030 i.tm.opcode_modifier.evex = evex;
c006a730
JB
7031 else if (flag_code == CODE_16BIT)
7032 i.suffix = WORD_MNEM_SUFFIX;
1a035124 7033 else if (!i.tm.opcode_modifier.no_lsuf)
c006a730 7034 i.suffix = LONG_MNEM_SUFFIX;
1a035124
JB
7035 else
7036 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a 7037 }
29b0f896 7038 }
252b5132 7039
65fca059
JB
7040 if ((i.tm.base_opcode | 8) == 0xfbe
7041 || (i.tm.base_opcode == 0x63 && i.tm.cpu_flags.bitfield.cpu64))
7042 {
7043 /* In Intel syntax, movsx/movzx must have a "suffix" (checked above).
7044 In AT&T syntax, if there is no suffix (warned about above), the default
7045 will be byte extension. */
7046 if (i.tm.opcode_modifier.w && i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
7047 i.tm.base_opcode |= 1;
7048
7049 /* For further processing, the suffix should represent the destination
7050 (register). This is already the case when one was used with
7051 mov[sz][bw]*, but we need to replace it for mov[sz]x, or if there was
7052 no suffix to begin with. */
7053 if (i.tm.opcode_modifier.w || i.tm.base_opcode == 0x63 || !i.suffix)
7054 {
7055 if (i.types[1].bitfield.word)
7056 i.suffix = WORD_MNEM_SUFFIX;
7057 else if (i.types[1].bitfield.qword)
7058 i.suffix = QWORD_MNEM_SUFFIX;
7059 else
7060 i.suffix = LONG_MNEM_SUFFIX;
7061
7062 i.tm.opcode_modifier.w = 0;
7063 }
7064 }
7065
50128d0c
JB
7066 if (!i.tm.opcode_modifier.modrm && i.reg_operands && i.tm.operands < 3)
7067 i.short_form = (i.tm.operand_types[0].bitfield.class == Reg)
7068 != (i.tm.operand_types[1].bitfield.class == Reg);
7069
d2224064
JB
7070 /* Change the opcode based on the operand size given by i.suffix. */
7071 switch (i.suffix)
29b0f896 7072 {
d2224064
JB
7073 /* Size floating point instruction. */
7074 case LONG_MNEM_SUFFIX:
7075 if (i.tm.opcode_modifier.floatmf)
7076 {
7077 i.tm.base_opcode ^= 4;
7078 break;
7079 }
7080 /* fall through */
7081 case WORD_MNEM_SUFFIX:
7082 case QWORD_MNEM_SUFFIX:
29b0f896 7083 /* It's not a byte, select word/dword operation. */
40fb9820 7084 if (i.tm.opcode_modifier.w)
29b0f896 7085 {
50128d0c 7086 if (i.short_form)
29b0f896
AM
7087 i.tm.base_opcode |= 8;
7088 else
7089 i.tm.base_opcode |= 1;
7090 }
d2224064
JB
7091 /* fall through */
7092 case SHORT_MNEM_SUFFIX:
29b0f896
AM
7093 /* Now select between word & dword operations via the operand
7094 size prefix, except for instructions that will ignore this
7095 prefix anyway. */
c8f8eebc 7096 if (i.suffix != QWORD_MNEM_SUFFIX
3cd7f3e3 7097 && i.tm.opcode_modifier.mnemonicsize != IGNORESIZE
c8f8eebc
JB
7098 && !i.tm.opcode_modifier.floatmf
7099 && !is_any_vex_encoding (&i.tm)
7100 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
7101 || (flag_code == CODE_64BIT
7102 && i.tm.opcode_modifier.jump == JUMP_BYTE)))
24eab124
AM
7103 {
7104 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 7105
0cfa3eb3 7106 if (i.tm.opcode_modifier.jump == JUMP_BYTE) /* jcxz, loop */
29b0f896 7107 prefix = ADDR_PREFIX_OPCODE;
252b5132 7108
29b0f896
AM
7109 if (!add_prefix (prefix))
7110 return 0;
24eab124 7111 }
252b5132 7112
29b0f896
AM
7113 /* Set mode64 for an operand. */
7114 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 7115 && flag_code == CODE_64BIT
d2224064 7116 && !i.tm.opcode_modifier.norex64
4ed21b58 7117 && !i.tm.opcode_modifier.vexw
46e883c5 7118 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
7119 need rex64. */
7120 && ! (i.operands == 2
7121 && i.tm.base_opcode == 0x90
7122 && i.tm.extension_opcode == None
75e5731b
JB
7123 && i.types[0].bitfield.instance == Accum
7124 && i.types[0].bitfield.qword
7125 && i.types[1].bitfield.instance == Accum
7126 && i.types[1].bitfield.qword))
d2224064 7127 i.rex |= REX_W;
3e73aa7c 7128
d2224064 7129 break;
8bbb3ad8
JB
7130
7131 case 0:
7132 /* Select word/dword/qword operation with explict data sizing prefix
7133 when there are no suitable register operands. */
7134 if (i.tm.opcode_modifier.w
7135 && (i.prefix[DATA_PREFIX] || (i.prefix[REX_PREFIX] & REX_W))
7136 && (!i.reg_operands
7137 || (i.reg_operands == 1
7138 /* ShiftCount */
7139 && (i.tm.operand_types[0].bitfield.instance == RegC
7140 /* InOutPortReg */
7141 || i.tm.operand_types[0].bitfield.instance == RegD
7142 || i.tm.operand_types[1].bitfield.instance == RegD
7143 /* CRC32 */
7144 || i.tm.base_opcode == 0xf20f38f0))))
7145 i.tm.base_opcode |= 1;
7146 break;
29b0f896 7147 }
7ecd2f8b 7148
c8f8eebc 7149 if (i.tm.opcode_modifier.addrprefixopreg)
c0a30a9f 7150 {
c8f8eebc
JB
7151 gas_assert (!i.suffix);
7152 gas_assert (i.reg_operands);
c0a30a9f 7153
c8f8eebc
JB
7154 if (i.tm.operand_types[0].bitfield.instance == Accum
7155 || i.operands == 1)
7156 {
7157 /* The address size override prefix changes the size of the
7158 first operand. */
7159 if (flag_code == CODE_64BIT
7160 && i.op[0].regs->reg_type.bitfield.word)
7161 {
7162 as_bad (_("16-bit addressing unavailable for `%s'"),
7163 i.tm.name);
7164 return 0;
7165 }
7166
7167 if ((flag_code == CODE_32BIT
7168 ? i.op[0].regs->reg_type.bitfield.word
7169 : i.op[0].regs->reg_type.bitfield.dword)
7170 && !add_prefix (ADDR_PREFIX_OPCODE))
7171 return 0;
7172 }
c0a30a9f
L
7173 else
7174 {
c8f8eebc
JB
7175 /* Check invalid register operand when the address size override
7176 prefix changes the size of register operands. */
7177 unsigned int op;
7178 enum { need_word, need_dword, need_qword } need;
7179
7180 if (flag_code == CODE_32BIT)
7181 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
7182 else if (i.prefix[ADDR_PREFIX])
c0a30a9f
L
7183 need = need_dword;
7184 else
7185 need = flag_code == CODE_64BIT ? need_qword : need_word;
c0a30a9f 7186
c8f8eebc
JB
7187 for (op = 0; op < i.operands; op++)
7188 {
7189 if (i.types[op].bitfield.class != Reg)
7190 continue;
7191
7192 switch (need)
7193 {
7194 case need_word:
7195 if (i.op[op].regs->reg_type.bitfield.word)
7196 continue;
7197 break;
7198 case need_dword:
7199 if (i.op[op].regs->reg_type.bitfield.dword)
7200 continue;
7201 break;
7202 case need_qword:
7203 if (i.op[op].regs->reg_type.bitfield.qword)
7204 continue;
7205 break;
7206 }
7207
7208 as_bad (_("invalid register operand size for `%s'"),
7209 i.tm.name);
7210 return 0;
7211 }
7212 }
c0a30a9f
L
7213 }
7214
29b0f896
AM
7215 return 1;
7216}
3e73aa7c 7217
29b0f896 7218static int
543613e9 7219check_byte_reg (void)
29b0f896
AM
7220{
7221 int op;
543613e9 7222
29b0f896
AM
7223 for (op = i.operands; --op >= 0;)
7224 {
dc821c5f 7225 /* Skip non-register operands. */
bab6aec1 7226 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
7227 continue;
7228
29b0f896
AM
7229 /* If this is an eight bit register, it's OK. If it's the 16 or
7230 32 bit version of an eight bit register, we will just use the
7231 low portion, and that's OK too. */
dc821c5f 7232 if (i.types[op].bitfield.byte)
29b0f896
AM
7233 continue;
7234
5a819eb9 7235 /* I/O port address operands are OK too. */
75e5731b
JB
7236 if (i.tm.operand_types[op].bitfield.instance == RegD
7237 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
7238 continue;
7239
9706160a
JB
7240 /* crc32 only wants its source operand checked here. */
7241 if (i.tm.base_opcode == 0xf20f38f0 && op)
9344ff29
L
7242 continue;
7243
29b0f896 7244 /* Any other register is bad. */
73c76375
JB
7245 as_bad (_("`%s%s' not allowed with `%s%c'"),
7246 register_prefix, i.op[op].regs->reg_name,
7247 i.tm.name, i.suffix);
7248 return 0;
29b0f896
AM
7249 }
7250 return 1;
7251}
7252
7253static int
e3bb37b5 7254check_long_reg (void)
29b0f896
AM
7255{
7256 int op;
7257
7258 for (op = i.operands; --op >= 0;)
dc821c5f 7259 /* Skip non-register operands. */
bab6aec1 7260 if (i.types[op].bitfield.class != Reg)
dc821c5f 7261 continue;
29b0f896
AM
7262 /* Reject eight bit registers, except where the template requires
7263 them. (eg. movzb) */
dc821c5f 7264 else if (i.types[op].bitfield.byte
bab6aec1 7265 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7266 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7267 && (i.tm.operand_types[op].bitfield.word
7268 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7269 {
a540244d
L
7270 as_bad (_("`%s%s' not allowed with `%s%c'"),
7271 register_prefix,
29b0f896
AM
7272 i.op[op].regs->reg_name,
7273 i.tm.name,
7274 i.suffix);
7275 return 0;
7276 }
be4c5e58
L
7277 /* Error if the e prefix on a general reg is missing. */
7278 else if (i.types[op].bitfield.word
bab6aec1 7279 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7280 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7281 && i.tm.operand_types[op].bitfield.dword)
29b0f896 7282 {
be4c5e58
L
7283 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7284 register_prefix, i.op[op].regs->reg_name,
7285 i.suffix);
7286 return 0;
252b5132 7287 }
e4630f71 7288 /* Warn if the r prefix on a general reg is present. */
dc821c5f 7289 else if (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.dword)
252b5132 7293 {
34828aad 7294 if (intel_syntax
65fca059 7295 && i.tm.opcode_modifier.toqword
3528c362 7296 && i.types[0].bitfield.class != RegSIMD)
34828aad 7297 {
ca61edf2 7298 /* Convert to QWORD. We want REX byte. */
34828aad
L
7299 i.suffix = QWORD_MNEM_SUFFIX;
7300 }
7301 else
7302 {
2b5d6a91 7303 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7304 register_prefix, i.op[op].regs->reg_name,
7305 i.suffix);
7306 return 0;
7307 }
29b0f896
AM
7308 }
7309 return 1;
7310}
252b5132 7311
29b0f896 7312static int
e3bb37b5 7313check_qword_reg (void)
29b0f896
AM
7314{
7315 int op;
252b5132 7316
29b0f896 7317 for (op = i.operands; --op >= 0; )
dc821c5f 7318 /* Skip non-register operands. */
bab6aec1 7319 if (i.types[op].bitfield.class != Reg)
dc821c5f 7320 continue;
29b0f896
AM
7321 /* Reject eight bit registers, except where the template requires
7322 them. (eg. movzb) */
dc821c5f 7323 else if (i.types[op].bitfield.byte
bab6aec1 7324 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7325 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7326 && (i.tm.operand_types[op].bitfield.word
7327 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7328 {
a540244d
L
7329 as_bad (_("`%s%s' not allowed with `%s%c'"),
7330 register_prefix,
29b0f896
AM
7331 i.op[op].regs->reg_name,
7332 i.tm.name,
7333 i.suffix);
7334 return 0;
7335 }
e4630f71 7336 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
7337 else if ((i.types[op].bitfield.word
7338 || i.types[op].bitfield.dword)
bab6aec1 7339 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7340 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7341 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
7342 {
7343 /* Prohibit these changes in the 64bit mode, since the
7344 lowering is more complicated. */
34828aad 7345 if (intel_syntax
ca61edf2 7346 && i.tm.opcode_modifier.todword
3528c362 7347 && i.types[0].bitfield.class != RegSIMD)
34828aad 7348 {
ca61edf2 7349 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
7350 i.suffix = LONG_MNEM_SUFFIX;
7351 }
7352 else
7353 {
2b5d6a91 7354 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
7355 register_prefix, i.op[op].regs->reg_name,
7356 i.suffix);
7357 return 0;
7358 }
252b5132 7359 }
29b0f896
AM
7360 return 1;
7361}
252b5132 7362
29b0f896 7363static int
e3bb37b5 7364check_word_reg (void)
29b0f896
AM
7365{
7366 int op;
7367 for (op = i.operands; --op >= 0;)
dc821c5f 7368 /* Skip non-register operands. */
bab6aec1 7369 if (i.types[op].bitfield.class != Reg)
dc821c5f 7370 continue;
29b0f896
AM
7371 /* Reject eight bit registers, except where the template requires
7372 them. (eg. movzb) */
dc821c5f 7373 else if (i.types[op].bitfield.byte
bab6aec1 7374 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7375 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
7376 && (i.tm.operand_types[op].bitfield.word
7377 || i.tm.operand_types[op].bitfield.dword))
29b0f896 7378 {
a540244d
L
7379 as_bad (_("`%s%s' not allowed with `%s%c'"),
7380 register_prefix,
29b0f896
AM
7381 i.op[op].regs->reg_name,
7382 i.tm.name,
7383 i.suffix);
7384 return 0;
7385 }
9706160a
JB
7386 /* Error if the e or r prefix on a general reg is present. */
7387 else if ((i.types[op].bitfield.dword
dc821c5f 7388 || i.types[op].bitfield.qword)
bab6aec1 7389 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 7390 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 7391 && i.tm.operand_types[op].bitfield.word)
252b5132 7392 {
9706160a
JB
7393 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
7394 register_prefix, i.op[op].regs->reg_name,
7395 i.suffix);
7396 return 0;
29b0f896
AM
7397 }
7398 return 1;
7399}
252b5132 7400
29b0f896 7401static int
40fb9820 7402update_imm (unsigned int j)
29b0f896 7403{
bc0844ae 7404 i386_operand_type overlap = i.types[j];
40fb9820
L
7405 if ((overlap.bitfield.imm8
7406 || overlap.bitfield.imm8s
7407 || overlap.bitfield.imm16
7408 || overlap.bitfield.imm32
7409 || overlap.bitfield.imm32s
7410 || overlap.bitfield.imm64)
0dfbf9d7
L
7411 && !operand_type_equal (&overlap, &imm8)
7412 && !operand_type_equal (&overlap, &imm8s)
7413 && !operand_type_equal (&overlap, &imm16)
7414 && !operand_type_equal (&overlap, &imm32)
7415 && !operand_type_equal (&overlap, &imm32s)
7416 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
7417 {
7418 if (i.suffix)
7419 {
40fb9820
L
7420 i386_operand_type temp;
7421
0dfbf9d7 7422 operand_type_set (&temp, 0);
7ab9ffdd 7423 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
7424 {
7425 temp.bitfield.imm8 = overlap.bitfield.imm8;
7426 temp.bitfield.imm8s = overlap.bitfield.imm8s;
7427 }
7428 else if (i.suffix == WORD_MNEM_SUFFIX)
7429 temp.bitfield.imm16 = overlap.bitfield.imm16;
7430 else if (i.suffix == QWORD_MNEM_SUFFIX)
7431 {
7432 temp.bitfield.imm64 = overlap.bitfield.imm64;
7433 temp.bitfield.imm32s = overlap.bitfield.imm32s;
7434 }
7435 else
7436 temp.bitfield.imm32 = overlap.bitfield.imm32;
7437 overlap = temp;
29b0f896 7438 }
0dfbf9d7
L
7439 else if (operand_type_equal (&overlap, &imm16_32_32s)
7440 || operand_type_equal (&overlap, &imm16_32)
7441 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 7442 {
40fb9820 7443 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 7444 overlap = imm16;
40fb9820 7445 else
65da13b5 7446 overlap = imm32s;
29b0f896 7447 }
8bbb3ad8
JB
7448 else if (i.prefix[REX_PREFIX] & REX_W)
7449 overlap = operand_type_and (overlap, imm32s);
7450 else if (i.prefix[DATA_PREFIX])
7451 overlap = operand_type_and (overlap,
7452 flag_code != CODE_16BIT ? imm16 : imm32);
0dfbf9d7
L
7453 if (!operand_type_equal (&overlap, &imm8)
7454 && !operand_type_equal (&overlap, &imm8s)
7455 && !operand_type_equal (&overlap, &imm16)
7456 && !operand_type_equal (&overlap, &imm32)
7457 && !operand_type_equal (&overlap, &imm32s)
7458 && !operand_type_equal (&overlap, &imm64))
29b0f896 7459 {
4eed87de
AM
7460 as_bad (_("no instruction mnemonic suffix given; "
7461 "can't determine immediate size"));
29b0f896
AM
7462 return 0;
7463 }
7464 }
40fb9820 7465 i.types[j] = overlap;
29b0f896 7466
40fb9820
L
7467 return 1;
7468}
7469
7470static int
7471finalize_imm (void)
7472{
bc0844ae 7473 unsigned int j, n;
29b0f896 7474
bc0844ae
L
7475 /* Update the first 2 immediate operands. */
7476 n = i.operands > 2 ? 2 : i.operands;
7477 if (n)
7478 {
7479 for (j = 0; j < n; j++)
7480 if (update_imm (j) == 0)
7481 return 0;
40fb9820 7482
bc0844ae
L
7483 /* The 3rd operand can't be immediate operand. */
7484 gas_assert (operand_type_check (i.types[2], imm) == 0);
7485 }
29b0f896
AM
7486
7487 return 1;
7488}
7489
7490static int
e3bb37b5 7491process_operands (void)
29b0f896
AM
7492{
7493 /* Default segment register this instruction will use for memory
7494 accesses. 0 means unknown. This is only for optimizing out
7495 unnecessary segment overrides. */
7496 const seg_entry *default_seg = 0;
7497
a5aeccd9
JB
7498 if (i.tm.opcode_modifier.sse2avx)
7499 {
7500 /* Legacy encoded insns allow explicit REX prefixes, so these prefixes
7501 need converting. */
7502 i.rex |= i.prefix[REX_PREFIX] & (REX_W | REX_R | REX_X | REX_B);
7503 i.prefix[REX_PREFIX] = 0;
7504 i.rex_encoding = 0;
7505 }
c423d21a
JB
7506 /* ImmExt should be processed after SSE2AVX. */
7507 else if (i.tm.opcode_modifier.immext)
7508 process_immext ();
a5aeccd9 7509
2426c15f 7510 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 7511 {
91d6fa6a
NC
7512 unsigned int dupl = i.operands;
7513 unsigned int dest = dupl - 1;
9fcfb3d7
L
7514 unsigned int j;
7515
c0f3af97 7516 /* The destination must be an xmm register. */
9c2799c2 7517 gas_assert (i.reg_operands
91d6fa6a 7518 && MAX_OPERANDS > dupl
7ab9ffdd 7519 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 7520
75e5731b 7521 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7522 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 7523 {
8cd7925b 7524 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
7525 {
7526 /* Keep xmm0 for instructions with VEX prefix and 3
7527 sources. */
75e5731b 7528 i.tm.operand_types[0].bitfield.instance = InstanceNone;
3528c362 7529 i.tm.operand_types[0].bitfield.class = RegSIMD;
c0f3af97
L
7530 goto duplicate;
7531 }
e2ec9d29 7532 else
c0f3af97
L
7533 {
7534 /* We remove the first xmm0 and keep the number of
7535 operands unchanged, which in fact duplicates the
7536 destination. */
7537 for (j = 1; j < i.operands; j++)
7538 {
7539 i.op[j - 1] = i.op[j];
7540 i.types[j - 1] = i.types[j];
7541 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
8dc0818e 7542 i.flags[j - 1] = i.flags[j];
c0f3af97
L
7543 }
7544 }
7545 }
7546 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 7547 {
91d6fa6a 7548 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
7549 && (i.tm.opcode_modifier.vexsources
7550 == VEX3SOURCES));
c0f3af97
L
7551
7552 /* Add the implicit xmm0 for instructions with VEX prefix
7553 and 3 sources. */
7554 for (j = i.operands; j > 0; j--)
7555 {
7556 i.op[j] = i.op[j - 1];
7557 i.types[j] = i.types[j - 1];
7558 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 7559 i.flags[j] = i.flags[j - 1];
c0f3af97
L
7560 }
7561 i.op[0].regs
7562 = (const reg_entry *) hash_find (reg_hash, "xmm0");
7ab9ffdd 7563 i.types[0] = regxmm;
c0f3af97
L
7564 i.tm.operand_types[0] = regxmm;
7565
7566 i.operands += 2;
7567 i.reg_operands += 2;
7568 i.tm.operands += 2;
7569
91d6fa6a 7570 dupl++;
c0f3af97 7571 dest++;
91d6fa6a
NC
7572 i.op[dupl] = i.op[dest];
7573 i.types[dupl] = i.types[dest];
7574 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7575 i.flags[dupl] = i.flags[dest];
e2ec9d29 7576 }
c0f3af97
L
7577 else
7578 {
dc1e8a47 7579 duplicate:
c0f3af97
L
7580 i.operands++;
7581 i.reg_operands++;
7582 i.tm.operands++;
7583
91d6fa6a
NC
7584 i.op[dupl] = i.op[dest];
7585 i.types[dupl] = i.types[dest];
7586 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7587 i.flags[dupl] = i.flags[dest];
c0f3af97
L
7588 }
7589
7590 if (i.tm.opcode_modifier.immext)
7591 process_immext ();
7592 }
75e5731b 7593 else if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7594 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
7595 {
7596 unsigned int j;
7597
9fcfb3d7
L
7598 for (j = 1; j < i.operands; j++)
7599 {
7600 i.op[j - 1] = i.op[j];
7601 i.types[j - 1] = i.types[j];
7602
7603 /* We need to adjust fields in i.tm since they are used by
7604 build_modrm_byte. */
7605 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
7606
7607 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
7608 }
7609
e2ec9d29
L
7610 i.operands--;
7611 i.reg_operands--;
e2ec9d29
L
7612 i.tm.operands--;
7613 }
920d2ddc
IT
7614 else if (i.tm.opcode_modifier.implicitquadgroup)
7615 {
a477a8c4
JB
7616 unsigned int regnum, first_reg_in_group, last_reg_in_group;
7617
920d2ddc 7618 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 7619 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
7620 regnum = register_number (i.op[1].regs);
7621 first_reg_in_group = regnum & ~3;
7622 last_reg_in_group = first_reg_in_group + 3;
7623 if (regnum != first_reg_in_group)
7624 as_warn (_("source register `%s%s' implicitly denotes"
7625 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
7626 register_prefix, i.op[1].regs->reg_name,
7627 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
7628 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
7629 i.tm.name);
7630 }
e2ec9d29
L
7631 else if (i.tm.opcode_modifier.regkludge)
7632 {
7633 /* The imul $imm, %reg instruction is converted into
7634 imul $imm, %reg, %reg, and the clr %reg instruction
7635 is converted into xor %reg, %reg. */
7636
7637 unsigned int first_reg_op;
7638
7639 if (operand_type_check (i.types[0], reg))
7640 first_reg_op = 0;
7641 else
7642 first_reg_op = 1;
7643 /* Pretend we saw the extra register operand. */
9c2799c2 7644 gas_assert (i.reg_operands == 1
7ab9ffdd 7645 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
7646 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
7647 i.types[first_reg_op + 1] = i.types[first_reg_op];
7648 i.operands++;
7649 i.reg_operands++;
29b0f896
AM
7650 }
7651
85b80b0f 7652 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
7653 {
7654 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
7655 must be put into the modrm byte). Now, we make the modrm and
7656 index base bytes based on all the info we've collected. */
29b0f896
AM
7657
7658 default_seg = build_modrm_byte ();
7659 }
00cee14f 7660 else if (i.types[0].bitfield.class == SReg)
85b80b0f
JB
7661 {
7662 if (flag_code != CODE_64BIT
7663 ? i.tm.base_opcode == POP_SEG_SHORT
7664 && i.op[0].regs->reg_num == 1
7665 : (i.tm.base_opcode | 1) == POP_SEG386_SHORT
7666 && i.op[0].regs->reg_num < 4)
7667 {
7668 as_bad (_("you can't `%s %s%s'"),
7669 i.tm.name, register_prefix, i.op[0].regs->reg_name);
7670 return 0;
7671 }
7672 if ( i.op[0].regs->reg_num > 3 && i.tm.opcode_length == 1 )
7673 {
7674 i.tm.base_opcode ^= POP_SEG_SHORT ^ POP_SEG386_SHORT;
7675 i.tm.opcode_length = 2;
7676 }
7677 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
7678 }
8a2ed489 7679 else if ((i.tm.base_opcode & ~0x3) == MOV_AX_DISP32)
29b0f896
AM
7680 {
7681 default_seg = &ds;
7682 }
40fb9820 7683 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
7684 {
7685 /* For the string instructions that allow a segment override
7686 on one of their operands, the default segment is ds. */
7687 default_seg = &ds;
7688 }
50128d0c 7689 else if (i.short_form)
85b80b0f
JB
7690 {
7691 /* The register or float register operand is in operand
7692 0 or 1. */
bab6aec1 7693 unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
85b80b0f
JB
7694
7695 /* Register goes in low 3 bits of opcode. */
7696 i.tm.base_opcode |= i.op[op].regs->reg_num;
7697 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7698 i.rex |= REX_B;
7699 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
7700 {
7701 /* Warn about some common errors, but press on regardless.
7702 The first case can be generated by gcc (<= 2.8.1). */
7703 if (i.operands == 2)
7704 {
7705 /* Reversed arguments on faddp, fsubp, etc. */
7706 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
7707 register_prefix, i.op[!intel_syntax].regs->reg_name,
7708 register_prefix, i.op[intel_syntax].regs->reg_name);
7709 }
7710 else
7711 {
7712 /* Extraneous `l' suffix on fp insn. */
7713 as_warn (_("translating to `%s %s%s'"), i.tm.name,
7714 register_prefix, i.op[0].regs->reg_name);
7715 }
7716 }
7717 }
29b0f896 7718
514a8bb0 7719 if ((i.seg[0] || i.prefix[SEG_PREFIX])
514a8bb0
JB
7720 && i.tm.base_opcode == 0x8d /* lea */
7721 && !is_any_vex_encoding(&i.tm))
92334ad2
JB
7722 {
7723 if (!quiet_warnings)
7724 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
7725 if (optimize)
7726 {
7727 i.seg[0] = NULL;
7728 i.prefix[SEG_PREFIX] = 0;
7729 }
7730 }
52271982
AM
7731
7732 /* If a segment was explicitly specified, and the specified segment
b6773884
JB
7733 is neither the default nor the one already recorded from a prefix,
7734 use an opcode prefix to select it. If we never figured out what
7735 the default segment is, then default_seg will be zero at this
7736 point, and the specified segment prefix will always be used. */
7737 if (i.seg[0]
7738 && i.seg[0] != default_seg
7739 && i.seg[0]->seg_prefix != i.prefix[SEG_PREFIX])
29b0f896
AM
7740 {
7741 if (!add_prefix (i.seg[0]->seg_prefix))
7742 return 0;
7743 }
7744 return 1;
7745}
7746
a5aeccd9
JB
7747static INLINE void set_rex_vrex (const reg_entry *r, unsigned int rex_bit,
7748 bfd_boolean do_sse2avx)
7749{
7750 if (r->reg_flags & RegRex)
7751 {
7752 if (i.rex & rex_bit)
7753 as_bad (_("same type of prefix used twice"));
7754 i.rex |= rex_bit;
7755 }
7756 else if (do_sse2avx && (i.rex & rex_bit) && i.vex.register_specifier)
7757 {
7758 gas_assert (i.vex.register_specifier == r);
7759 i.vex.register_specifier += 8;
7760 }
7761
7762 if (r->reg_flags & RegVRex)
7763 i.vrex |= rex_bit;
7764}
7765
29b0f896 7766static const seg_entry *
e3bb37b5 7767build_modrm_byte (void)
29b0f896
AM
7768{
7769 const seg_entry *default_seg = 0;
c0f3af97 7770 unsigned int source, dest;
8cd7925b 7771 int vex_3_sources;
c0f3af97 7772
8cd7925b 7773 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
7774 if (vex_3_sources)
7775 {
91d6fa6a 7776 unsigned int nds, reg_slot;
4c2c6516 7777 expressionS *exp;
c0f3af97 7778
6b8d3588 7779 dest = i.operands - 1;
c0f3af97 7780 nds = dest - 1;
922d8de8 7781
a683cc34 7782 /* There are 2 kinds of instructions:
bed3d976 7783 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 7784 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 7785 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 7786 ZMM register.
bed3d976 7787 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 7788 plus 1 memory operand, with VexXDS. */
922d8de8 7789 gas_assert ((i.reg_operands == 4
bed3d976
JB
7790 || (i.reg_operands == 3 && i.mem_operands == 1))
7791 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323 7792 && i.tm.opcode_modifier.vexw
3528c362 7793 && i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 7794
48db9223
JB
7795 /* If VexW1 is set, the first non-immediate operand is the source and
7796 the second non-immediate one is encoded in the immediate operand. */
7797 if (i.tm.opcode_modifier.vexw == VEXW1)
7798 {
7799 source = i.imm_operands;
7800 reg_slot = i.imm_operands + 1;
7801 }
7802 else
7803 {
7804 source = i.imm_operands + 1;
7805 reg_slot = i.imm_operands;
7806 }
7807
a683cc34 7808 if (i.imm_operands == 0)
bed3d976
JB
7809 {
7810 /* When there is no immediate operand, generate an 8bit
7811 immediate operand to encode the first operand. */
7812 exp = &im_expressions[i.imm_operands++];
7813 i.op[i.operands].imms = exp;
7814 i.types[i.operands] = imm8;
7815 i.operands++;
7816
3528c362 7817 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
bed3d976
JB
7818 exp->X_op = O_constant;
7819 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
7820 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
7821 }
922d8de8 7822 else
bed3d976 7823 {
9d3bf266
JB
7824 gas_assert (i.imm_operands == 1);
7825 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
7826 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 7827
9d3bf266
JB
7828 /* Turn on Imm8 again so that output_imm will generate it. */
7829 i.types[0].bitfield.imm8 = 1;
bed3d976 7830
3528c362 7831 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
9d3bf266 7832 i.op[0].imms->X_add_number
bed3d976 7833 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 7834 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 7835 }
a683cc34 7836
3528c362 7837 gas_assert (i.tm.operand_types[nds].bitfield.class == RegSIMD);
dae39acc 7838 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
7839 }
7840 else
7841 source = dest = 0;
29b0f896
AM
7842
7843 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
7844 implicit registers do not count. If there are 3 register
7845 operands, it must be a instruction with VexNDS. For a
7846 instruction with VexNDD, the destination register is encoded
7847 in VEX prefix. If there are 4 register operands, it must be
7848 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
7849 if (i.mem_operands == 0
7850 && ((i.reg_operands == 2
2426c15f 7851 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 7852 || (i.reg_operands == 3
2426c15f 7853 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 7854 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 7855 {
cab737b9
L
7856 switch (i.operands)
7857 {
7858 case 2:
7859 source = 0;
7860 break;
7861 case 3:
c81128dc
L
7862 /* When there are 3 operands, one of them may be immediate,
7863 which may be the first or the last operand. Otherwise,
c0f3af97
L
7864 the first operand must be shift count register (cl) or it
7865 is an instruction with VexNDS. */
9c2799c2 7866 gas_assert (i.imm_operands == 1
7ab9ffdd 7867 || (i.imm_operands == 0
2426c15f 7868 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
75e5731b
JB
7869 || (i.types[0].bitfield.instance == RegC
7870 && i.types[0].bitfield.byte))));
40fb9820 7871 if (operand_type_check (i.types[0], imm)
75e5731b
JB
7872 || (i.types[0].bitfield.instance == RegC
7873 && i.types[0].bitfield.byte))
40fb9820
L
7874 source = 1;
7875 else
7876 source = 0;
cab737b9
L
7877 break;
7878 case 4:
368d64cc
L
7879 /* When there are 4 operands, the first two must be 8bit
7880 immediate operands. The source operand will be the 3rd
c0f3af97
L
7881 one.
7882
7883 For instructions with VexNDS, if the first operand
7884 an imm8, the source operand is the 2nd one. If the last
7885 operand is imm8, the source operand is the first one. */
9c2799c2 7886 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
7887 && i.types[0].bitfield.imm8
7888 && i.types[1].bitfield.imm8)
2426c15f 7889 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
7890 && i.imm_operands == 1
7891 && (i.types[0].bitfield.imm8
43234a1e
L
7892 || i.types[i.operands - 1].bitfield.imm8
7893 || i.rounding)));
9f2670f2
L
7894 if (i.imm_operands == 2)
7895 source = 2;
7896 else
c0f3af97
L
7897 {
7898 if (i.types[0].bitfield.imm8)
7899 source = 1;
7900 else
7901 source = 0;
7902 }
c0f3af97
L
7903 break;
7904 case 5:
e771e7c9 7905 if (is_evex_encoding (&i.tm))
43234a1e
L
7906 {
7907 /* For EVEX instructions, when there are 5 operands, the
7908 first one must be immediate operand. If the second one
7909 is immediate operand, the source operand is the 3th
7910 one. If the last one is immediate operand, the source
7911 operand is the 2nd one. */
7912 gas_assert (i.imm_operands == 2
7913 && i.tm.opcode_modifier.sae
7914 && operand_type_check (i.types[0], imm));
7915 if (operand_type_check (i.types[1], imm))
7916 source = 2;
7917 else if (operand_type_check (i.types[4], imm))
7918 source = 1;
7919 else
7920 abort ();
7921 }
cab737b9
L
7922 break;
7923 default:
7924 abort ();
7925 }
7926
c0f3af97
L
7927 if (!vex_3_sources)
7928 {
7929 dest = source + 1;
7930
43234a1e
L
7931 /* RC/SAE operand could be between DEST and SRC. That happens
7932 when one operand is GPR and the other one is XMM/YMM/ZMM
7933 register. */
7934 if (i.rounding && i.rounding->operand == (int) dest)
7935 dest++;
7936
2426c15f 7937 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 7938 {
43234a1e 7939 /* For instructions with VexNDS, the register-only source
c5d0745b 7940 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
dfd69174 7941 register. It is encoded in VEX prefix. */
f12dc422
L
7942
7943 i386_operand_type op;
7944 unsigned int vvvv;
7945
c2ecccb3
L
7946 /* Swap two source operands if needed. */
7947 if (i.tm.opcode_modifier.swapsources)
f12dc422
L
7948 {
7949 vvvv = source;
7950 source = dest;
7951 }
7952 else
7953 vvvv = dest;
7954
7955 op = i.tm.operand_types[vvvv];
c0f3af97 7956 if ((dest + 1) >= i.operands
bab6aec1 7957 || ((op.bitfield.class != Reg
dc821c5f 7958 || (!op.bitfield.dword && !op.bitfield.qword))
3528c362 7959 && op.bitfield.class != RegSIMD
43234a1e 7960 && !operand_type_equal (&op, &regmask)))
c0f3af97 7961 abort ();
f12dc422 7962 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
7963 dest++;
7964 }
7965 }
29b0f896
AM
7966
7967 i.rm.mode = 3;
dfd69174
JB
7968 /* One of the register operands will be encoded in the i.rm.reg
7969 field, the other in the combined i.rm.mode and i.rm.regmem
29b0f896
AM
7970 fields. If no form of this instruction supports a memory
7971 destination operand, then we assume the source operand may
7972 sometimes be a memory operand and so we need to store the
7973 destination in the i.rm.reg field. */
dfd69174 7974 if (!i.tm.opcode_modifier.regmem
40fb9820 7975 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
7976 {
7977 i.rm.reg = i.op[dest].regs->reg_num;
7978 i.rm.regmem = i.op[source].regs->reg_num;
a5aeccd9
JB
7979 set_rex_vrex (i.op[dest].regs, REX_R, i.tm.opcode_modifier.sse2avx);
7980 set_rex_vrex (i.op[source].regs, REX_B, FALSE);
29b0f896
AM
7981 }
7982 else
7983 {
7984 i.rm.reg = i.op[source].regs->reg_num;
7985 i.rm.regmem = i.op[dest].regs->reg_num;
a5aeccd9
JB
7986 set_rex_vrex (i.op[dest].regs, REX_B, i.tm.opcode_modifier.sse2avx);
7987 set_rex_vrex (i.op[source].regs, REX_R, FALSE);
29b0f896 7988 }
e0c7f900 7989 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 7990 {
4a5c67ed 7991 if (i.types[!i.tm.opcode_modifier.regmem].bitfield.class != RegCR)
c4a530c5 7992 abort ();
e0c7f900 7993 i.rex &= ~REX_R;
c4a530c5
JB
7994 add_prefix (LOCK_PREFIX_OPCODE);
7995 }
29b0f896
AM
7996 }
7997 else
7998 { /* If it's not 2 reg operands... */
c0f3af97
L
7999 unsigned int mem;
8000
29b0f896
AM
8001 if (i.mem_operands)
8002 {
8003 unsigned int fake_zero_displacement = 0;
99018f42 8004 unsigned int op;
4eed87de 8005
7ab9ffdd 8006 for (op = 0; op < i.operands; op++)
8dc0818e 8007 if (i.flags[op] & Operand_Mem)
7ab9ffdd 8008 break;
7ab9ffdd 8009 gas_assert (op < i.operands);
29b0f896 8010
63112cd6 8011 if (i.tm.opcode_modifier.sib)
6c30d220 8012 {
260cd341
LC
8013 /* The index register of VSIB shouldn't be RegIZ. */
8014 if (i.tm.opcode_modifier.sib != SIBMEM
8015 && i.index_reg->reg_num == RegIZ)
6c30d220
L
8016 abort ();
8017
8018 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8019 if (!i.base_reg)
8020 {
8021 i.sib.base = NO_BASE_REGISTER;
8022 i.sib.scale = i.log2_scale_factor;
8023 i.types[op].bitfield.disp8 = 0;
8024 i.types[op].bitfield.disp16 = 0;
8025 i.types[op].bitfield.disp64 = 0;
43083a50 8026 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
6c30d220
L
8027 {
8028 /* Must be 32 bit */
8029 i.types[op].bitfield.disp32 = 1;
8030 i.types[op].bitfield.disp32s = 0;
8031 }
8032 else
8033 {
8034 i.types[op].bitfield.disp32 = 0;
8035 i.types[op].bitfield.disp32s = 1;
8036 }
8037 }
260cd341
LC
8038
8039 /* Since the mandatory SIB always has index register, so
8040 the code logic remains unchanged. The non-mandatory SIB
8041 without index register is allowed and will be handled
8042 later. */
8043 if (i.index_reg)
8044 {
8045 if (i.index_reg->reg_num == RegIZ)
8046 i.sib.index = NO_INDEX_REGISTER;
8047 else
8048 i.sib.index = i.index_reg->reg_num;
8049 set_rex_vrex (i.index_reg, REX_X, FALSE);
8050 }
6c30d220
L
8051 }
8052
29b0f896
AM
8053 default_seg = &ds;
8054
8055 if (i.base_reg == 0)
8056 {
8057 i.rm.mode = 0;
8058 if (!i.disp_operands)
9bb129e8 8059 fake_zero_displacement = 1;
29b0f896
AM
8060 if (i.index_reg == 0)
8061 {
73053c1f
JB
8062 i386_operand_type newdisp;
8063
260cd341
LC
8064 /* Both check for VSIB and mandatory non-vector SIB. */
8065 gas_assert (!i.tm.opcode_modifier.sib
8066 || i.tm.opcode_modifier.sib == SIBMEM);
29b0f896 8067 /* Operand is just <disp> */
20f0a1fc 8068 if (flag_code == CODE_64BIT)
29b0f896
AM
8069 {
8070 /* 64bit mode overwrites the 32bit absolute
8071 addressing by RIP relative addressing and
8072 absolute addressing is encoded by one of the
8073 redundant SIB forms. */
8074 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8075 i.sib.base = NO_BASE_REGISTER;
8076 i.sib.index = NO_INDEX_REGISTER;
73053c1f 8077 newdisp = (!i.prefix[ADDR_PREFIX] ? disp32s : disp32);
20f0a1fc 8078 }
fc225355
L
8079 else if ((flag_code == CODE_16BIT)
8080 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
8081 {
8082 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 8083 newdisp = disp16;
20f0a1fc
NC
8084 }
8085 else
8086 {
8087 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 8088 newdisp = disp32;
29b0f896 8089 }
73053c1f
JB
8090 i.types[op] = operand_type_and_not (i.types[op], anydisp);
8091 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 8092 }
63112cd6 8093 else if (!i.tm.opcode_modifier.sib)
29b0f896 8094 {
6c30d220 8095 /* !i.base_reg && i.index_reg */
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.sib.base = NO_BASE_REGISTER;
8101 i.sib.scale = i.log2_scale_factor;
8102 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
8103 i.types[op].bitfield.disp8 = 0;
8104 i.types[op].bitfield.disp16 = 0;
8105 i.types[op].bitfield.disp64 = 0;
43083a50 8106 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
40fb9820
L
8107 {
8108 /* Must be 32 bit */
8109 i.types[op].bitfield.disp32 = 1;
8110 i.types[op].bitfield.disp32s = 0;
8111 }
29b0f896 8112 else
40fb9820
L
8113 {
8114 i.types[op].bitfield.disp32 = 0;
8115 i.types[op].bitfield.disp32s = 1;
8116 }
29b0f896 8117 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8118 i.rex |= REX_X;
29b0f896
AM
8119 }
8120 }
8121 /* RIP addressing for 64bit mode. */
e968fc9b 8122 else if (i.base_reg->reg_num == RegIP)
29b0f896 8123 {
63112cd6 8124 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896 8125 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
8126 i.types[op].bitfield.disp8 = 0;
8127 i.types[op].bitfield.disp16 = 0;
8128 i.types[op].bitfield.disp32 = 0;
8129 i.types[op].bitfield.disp32s = 1;
8130 i.types[op].bitfield.disp64 = 0;
71903a11 8131 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
8132 if (! i.disp_operands)
8133 fake_zero_displacement = 1;
29b0f896 8134 }
dc821c5f 8135 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 8136 {
63112cd6 8137 gas_assert (!i.tm.opcode_modifier.sib);
29b0f896
AM
8138 switch (i.base_reg->reg_num)
8139 {
8140 case 3: /* (%bx) */
8141 if (i.index_reg == 0)
8142 i.rm.regmem = 7;
8143 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
8144 i.rm.regmem = i.index_reg->reg_num - 6;
8145 break;
8146 case 5: /* (%bp) */
8147 default_seg = &ss;
8148 if (i.index_reg == 0)
8149 {
8150 i.rm.regmem = 6;
40fb9820 8151 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
8152 {
8153 /* fake (%bp) into 0(%bp) */
1a02d6b0
L
8154 if (i.disp_encoding == disp_encoding_32bit)
8155 /* NB: Use disp16 since there is no disp32
8156 in 16-bit mode. */
8157 i.types[op].bitfield.disp16 = 1;
8158 else
8159 i.types[op].bitfield.disp8 = 1;
252b5132 8160 fake_zero_displacement = 1;
29b0f896
AM
8161 }
8162 }
8163 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
8164 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
8165 break;
8166 default: /* (%si) -> 4 or (%di) -> 5 */
8167 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
8168 }
8169 i.rm.mode = mode_from_disp_size (i.types[op]);
8170 }
8171 else /* i.base_reg and 32/64 bit mode */
8172 {
8173 if (flag_code == CODE_64BIT
40fb9820
L
8174 && operand_type_check (i.types[op], disp))
8175 {
73053c1f
JB
8176 i.types[op].bitfield.disp16 = 0;
8177 i.types[op].bitfield.disp64 = 0;
40fb9820 8178 if (i.prefix[ADDR_PREFIX] == 0)
73053c1f
JB
8179 {
8180 i.types[op].bitfield.disp32 = 0;
8181 i.types[op].bitfield.disp32s = 1;
8182 }
40fb9820 8183 else
73053c1f
JB
8184 {
8185 i.types[op].bitfield.disp32 = 1;
8186 i.types[op].bitfield.disp32s = 0;
8187 }
40fb9820 8188 }
20f0a1fc 8189
63112cd6 8190 if (!i.tm.opcode_modifier.sib)
6c30d220 8191 i.rm.regmem = i.base_reg->reg_num;
29b0f896 8192 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 8193 i.rex |= REX_B;
29b0f896
AM
8194 i.sib.base = i.base_reg->reg_num;
8195 /* x86-64 ignores REX prefix bit here to avoid decoder
8196 complications. */
848930b2
JB
8197 if (!(i.base_reg->reg_flags & RegRex)
8198 && (i.base_reg->reg_num == EBP_REG_NUM
8199 || i.base_reg->reg_num == ESP_REG_NUM))
29b0f896 8200 default_seg = &ss;
848930b2 8201 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 8202 {
848930b2 8203 fake_zero_displacement = 1;
1a02d6b0
L
8204 if (i.disp_encoding == disp_encoding_32bit)
8205 i.types[op].bitfield.disp32 = 1;
8206 else
8207 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
8208 }
8209 i.sib.scale = i.log2_scale_factor;
8210 if (i.index_reg == 0)
8211 {
260cd341
LC
8212 /* Only check for VSIB. */
8213 gas_assert (i.tm.opcode_modifier.sib != VECSIB128
8214 && i.tm.opcode_modifier.sib != VECSIB256
8215 && i.tm.opcode_modifier.sib != VECSIB512);
8216
29b0f896
AM
8217 /* <disp>(%esp) becomes two byte modrm with no index
8218 register. We've already stored the code for esp
8219 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
8220 Any base register besides %esp will not use the
8221 extra modrm byte. */
8222 i.sib.index = NO_INDEX_REGISTER;
29b0f896 8223 }
63112cd6 8224 else if (!i.tm.opcode_modifier.sib)
29b0f896 8225 {
e968fc9b 8226 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
8227 i.sib.index = NO_INDEX_REGISTER;
8228 else
8229 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
8230 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
8231 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 8232 i.rex |= REX_X;
29b0f896 8233 }
67a4f2b7
AO
8234
8235 if (i.disp_operands
8236 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
8237 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
8238 i.rm.mode = 0;
8239 else
a501d77e
L
8240 {
8241 if (!fake_zero_displacement
8242 && !i.disp_operands
8243 && i.disp_encoding)
8244 {
8245 fake_zero_displacement = 1;
8246 if (i.disp_encoding == disp_encoding_8bit)
8247 i.types[op].bitfield.disp8 = 1;
8248 else
8249 i.types[op].bitfield.disp32 = 1;
8250 }
8251 i.rm.mode = mode_from_disp_size (i.types[op]);
8252 }
29b0f896 8253 }
252b5132 8254
29b0f896
AM
8255 if (fake_zero_displacement)
8256 {
8257 /* Fakes a zero displacement assuming that i.types[op]
8258 holds the correct displacement size. */
8259 expressionS *exp;
8260
9c2799c2 8261 gas_assert (i.op[op].disps == 0);
29b0f896
AM
8262 exp = &disp_expressions[i.disp_operands++];
8263 i.op[op].disps = exp;
8264 exp->X_op = O_constant;
8265 exp->X_add_number = 0;
8266 exp->X_add_symbol = (symbolS *) 0;
8267 exp->X_op_symbol = (symbolS *) 0;
8268 }
c0f3af97
L
8269
8270 mem = op;
29b0f896 8271 }
c0f3af97
L
8272 else
8273 mem = ~0;
252b5132 8274
8c43a48b 8275 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
8276 {
8277 if (operand_type_check (i.types[0], imm))
8278 i.vex.register_specifier = NULL;
8279 else
8280 {
8281 /* VEX.vvvv encodes one of the sources when the first
8282 operand is not an immediate. */
1ef99a7b 8283 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8284 i.vex.register_specifier = i.op[0].regs;
8285 else
8286 i.vex.register_specifier = i.op[1].regs;
8287 }
8288
8289 /* Destination is a XMM register encoded in the ModRM.reg
8290 and VEX.R bit. */
8291 i.rm.reg = i.op[2].regs->reg_num;
8292 if ((i.op[2].regs->reg_flags & RegRex) != 0)
8293 i.rex |= REX_R;
8294
8295 /* ModRM.rm and VEX.B encodes the other source. */
8296 if (!i.mem_operands)
8297 {
8298 i.rm.mode = 3;
8299
1ef99a7b 8300 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
8301 i.rm.regmem = i.op[1].regs->reg_num;
8302 else
8303 i.rm.regmem = i.op[0].regs->reg_num;
8304
8305 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8306 i.rex |= REX_B;
8307 }
8308 }
2426c15f 8309 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
8310 {
8311 i.vex.register_specifier = i.op[2].regs;
8312 if (!i.mem_operands)
8313 {
8314 i.rm.mode = 3;
8315 i.rm.regmem = i.op[1].regs->reg_num;
8316 if ((i.op[1].regs->reg_flags & RegRex) != 0)
8317 i.rex |= REX_B;
8318 }
8319 }
29b0f896
AM
8320 /* Fill in i.rm.reg or i.rm.regmem field with register operand
8321 (if any) based on i.tm.extension_opcode. Again, we must be
8322 careful to make sure that segment/control/debug/test/MMX
8323 registers are coded into the i.rm.reg field. */
f88c9eb0 8324 else if (i.reg_operands)
29b0f896 8325 {
99018f42 8326 unsigned int op;
7ab9ffdd
L
8327 unsigned int vex_reg = ~0;
8328
8329 for (op = 0; op < i.operands; op++)
921eafea
L
8330 if (i.types[op].bitfield.class == Reg
8331 || i.types[op].bitfield.class == RegBND
8332 || i.types[op].bitfield.class == RegMask
8333 || i.types[op].bitfield.class == SReg
8334 || i.types[op].bitfield.class == RegCR
8335 || i.types[op].bitfield.class == RegDR
8336 || i.types[op].bitfield.class == RegTR
8337 || i.types[op].bitfield.class == RegSIMD
8338 || i.types[op].bitfield.class == RegMMX)
8339 break;
c0209578 8340
7ab9ffdd
L
8341 if (vex_3_sources)
8342 op = dest;
2426c15f 8343 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
8344 {
8345 /* For instructions with VexNDS, the register-only
8346 source operand is encoded in VEX prefix. */
8347 gas_assert (mem != (unsigned int) ~0);
c0f3af97 8348
7ab9ffdd 8349 if (op > mem)
c0f3af97 8350 {
7ab9ffdd
L
8351 vex_reg = op++;
8352 gas_assert (op < i.operands);
c0f3af97
L
8353 }
8354 else
c0f3af97 8355 {
f12dc422
L
8356 /* Check register-only source operand when two source
8357 operands are swapped. */
8358 if (!i.tm.operand_types[op].bitfield.baseindex
8359 && i.tm.operand_types[op + 1].bitfield.baseindex)
8360 {
8361 vex_reg = op;
8362 op += 2;
8363 gas_assert (mem == (vex_reg + 1)
8364 && op < i.operands);
8365 }
8366 else
8367 {
8368 vex_reg = op + 1;
8369 gas_assert (vex_reg < i.operands);
8370 }
c0f3af97 8371 }
7ab9ffdd 8372 }
2426c15f 8373 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 8374 {
f12dc422 8375 /* For instructions with VexNDD, the register destination
7ab9ffdd 8376 is encoded in VEX prefix. */
f12dc422
L
8377 if (i.mem_operands == 0)
8378 {
8379 /* There is no memory operand. */
8380 gas_assert ((op + 2) == i.operands);
8381 vex_reg = op + 1;
8382 }
8383 else
8d63c93e 8384 {
ed438a93
JB
8385 /* There are only 2 non-immediate operands. */
8386 gas_assert (op < i.imm_operands + 2
8387 && i.operands == i.imm_operands + 2);
8388 vex_reg = i.imm_operands + 1;
f12dc422 8389 }
7ab9ffdd
L
8390 }
8391 else
8392 gas_assert (op < i.operands);
99018f42 8393
7ab9ffdd
L
8394 if (vex_reg != (unsigned int) ~0)
8395 {
f12dc422 8396 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 8397
bab6aec1 8398 if ((type->bitfield.class != Reg
dc821c5f 8399 || (!type->bitfield.dword && !type->bitfield.qword))
3528c362 8400 && type->bitfield.class != RegSIMD
43234a1e 8401 && !operand_type_equal (type, &regmask))
7ab9ffdd 8402 abort ();
f88c9eb0 8403
7ab9ffdd
L
8404 i.vex.register_specifier = i.op[vex_reg].regs;
8405 }
8406
1b9f0c97
L
8407 /* Don't set OP operand twice. */
8408 if (vex_reg != op)
7ab9ffdd 8409 {
1b9f0c97
L
8410 /* If there is an extension opcode to put here, the
8411 register number must be put into the regmem field. */
8412 if (i.tm.extension_opcode != None)
8413 {
8414 i.rm.regmem = i.op[op].regs->reg_num;
a5aeccd9
JB
8415 set_rex_vrex (i.op[op].regs, REX_B,
8416 i.tm.opcode_modifier.sse2avx);
1b9f0c97
L
8417 }
8418 else
8419 {
8420 i.rm.reg = i.op[op].regs->reg_num;
a5aeccd9
JB
8421 set_rex_vrex (i.op[op].regs, REX_R,
8422 i.tm.opcode_modifier.sse2avx);
1b9f0c97 8423 }
7ab9ffdd 8424 }
252b5132 8425
29b0f896
AM
8426 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
8427 must set it to 3 to indicate this is a register operand
8428 in the regmem field. */
8429 if (!i.mem_operands)
8430 i.rm.mode = 3;
8431 }
252b5132 8432
29b0f896 8433 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 8434 if (i.tm.extension_opcode != None)
29b0f896
AM
8435 i.rm.reg = i.tm.extension_opcode;
8436 }
8437 return default_seg;
8438}
252b5132 8439
48ef937e
JB
8440static INLINE void
8441frag_opcode_byte (unsigned char byte)
8442{
8443 if (now_seg != absolute_section)
8444 FRAG_APPEND_1_CHAR (byte);
8445 else
8446 ++abs_section_offset;
8447}
8448
376cd056
JB
8449static unsigned int
8450flip_code16 (unsigned int code16)
8451{
8452 gas_assert (i.tm.operands == 1);
8453
8454 return !(i.prefix[REX_PREFIX] & REX_W)
8455 && (code16 ? i.tm.operand_types[0].bitfield.disp32
8456 || i.tm.operand_types[0].bitfield.disp32s
8457 : i.tm.operand_types[0].bitfield.disp16)
8458 ? CODE16 : 0;
8459}
8460
29b0f896 8461static void
e3bb37b5 8462output_branch (void)
29b0f896
AM
8463{
8464 char *p;
f8a5c266 8465 int size;
29b0f896
AM
8466 int code16;
8467 int prefix;
8468 relax_substateT subtype;
8469 symbolS *sym;
8470 offsetT off;
8471
48ef937e
JB
8472 if (now_seg == absolute_section)
8473 {
8474 as_bad (_("relaxable branches not supported in absolute section"));
8475 return;
8476 }
8477
f8a5c266 8478 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 8479 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
8480
8481 prefix = 0;
8482 if (i.prefix[DATA_PREFIX] != 0)
252b5132 8483 {
29b0f896
AM
8484 prefix = 1;
8485 i.prefixes -= 1;
376cd056 8486 code16 ^= flip_code16(code16);
252b5132 8487 }
29b0f896
AM
8488 /* Pentium4 branch hints. */
8489 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8490 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 8491 {
29b0f896
AM
8492 prefix++;
8493 i.prefixes--;
8494 }
8495 if (i.prefix[REX_PREFIX] != 0)
8496 {
8497 prefix++;
8498 i.prefixes--;
2f66722d
AM
8499 }
8500
7e8b059b
L
8501 /* BND prefixed jump. */
8502 if (i.prefix[BND_PREFIX] != 0)
8503 {
6cb0a70e
JB
8504 prefix++;
8505 i.prefixes--;
7e8b059b
L
8506 }
8507
f2810fe0
JB
8508 if (i.prefixes != 0)
8509 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
29b0f896
AM
8510
8511 /* It's always a symbol; End frag & setup for relax.
8512 Make sure there is enough room in this frag for the largest
8513 instruction we may generate in md_convert_frag. This is 2
8514 bytes for the opcode and room for the prefix and largest
8515 displacement. */
8516 frag_grow (prefix + 2 + 4);
8517 /* Prefix and 1 opcode byte go in fr_fix. */
8518 p = frag_more (prefix + 1);
8519 if (i.prefix[DATA_PREFIX] != 0)
8520 *p++ = DATA_PREFIX_OPCODE;
8521 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
8522 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
8523 *p++ = i.prefix[SEG_PREFIX];
6cb0a70e
JB
8524 if (i.prefix[BND_PREFIX] != 0)
8525 *p++ = BND_PREFIX_OPCODE;
29b0f896
AM
8526 if (i.prefix[REX_PREFIX] != 0)
8527 *p++ = i.prefix[REX_PREFIX];
8528 *p = i.tm.base_opcode;
8529
8530 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 8531 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 8532 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 8533 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 8534 else
f8a5c266 8535 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 8536 subtype |= code16;
3e73aa7c 8537
29b0f896
AM
8538 sym = i.op[0].disps->X_add_symbol;
8539 off = i.op[0].disps->X_add_number;
3e73aa7c 8540
29b0f896
AM
8541 if (i.op[0].disps->X_op != O_constant
8542 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 8543 {
29b0f896
AM
8544 /* Handle complex expressions. */
8545 sym = make_expr_symbol (i.op[0].disps);
8546 off = 0;
8547 }
3e73aa7c 8548
29b0f896
AM
8549 /* 1 possible extra opcode + 4 byte displacement go in var part.
8550 Pass reloc in fr_var. */
d258b828 8551 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 8552}
3e73aa7c 8553
bd7ab16b
L
8554#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8555/* Return TRUE iff PLT32 relocation should be used for branching to
8556 symbol S. */
8557
8558static bfd_boolean
8559need_plt32_p (symbolS *s)
8560{
8561 /* PLT32 relocation is ELF only. */
8562 if (!IS_ELF)
8563 return FALSE;
8564
a5def729
RO
8565#ifdef TE_SOLARIS
8566 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
8567 krtld support it. */
8568 return FALSE;
8569#endif
8570
bd7ab16b
L
8571 /* Since there is no need to prepare for PLT branch on x86-64, we
8572 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
8573 be used as a marker for 32-bit PC-relative branches. */
8574 if (!object_64bit)
8575 return FALSE;
8576
8577 /* Weak or undefined symbol need PLT32 relocation. */
8578 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
8579 return TRUE;
8580
8581 /* Non-global symbol doesn't need PLT32 relocation. */
8582 if (! S_IS_EXTERNAL (s))
8583 return FALSE;
8584
8585 /* Other global symbols need PLT32 relocation. NB: Symbol with
8586 non-default visibilities are treated as normal global symbol
8587 so that PLT32 relocation can be used as a marker for 32-bit
8588 PC-relative branches. It is useful for linker relaxation. */
8589 return TRUE;
8590}
8591#endif
8592
29b0f896 8593static void
e3bb37b5 8594output_jump (void)
29b0f896
AM
8595{
8596 char *p;
8597 int size;
3e02c1cc 8598 fixS *fixP;
bd7ab16b 8599 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 8600
0cfa3eb3 8601 if (i.tm.opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
8602 {
8603 /* This is a loop or jecxz type instruction. */
8604 size = 1;
8605 if (i.prefix[ADDR_PREFIX] != 0)
8606 {
48ef937e 8607 frag_opcode_byte (ADDR_PREFIX_OPCODE);
29b0f896
AM
8608 i.prefixes -= 1;
8609 }
8610 /* Pentium4 branch hints. */
8611 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8612 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
8613 {
48ef937e 8614 frag_opcode_byte (i.prefix[SEG_PREFIX]);
29b0f896 8615 i.prefixes--;
3e73aa7c
JH
8616 }
8617 }
29b0f896
AM
8618 else
8619 {
8620 int code16;
3e73aa7c 8621
29b0f896
AM
8622 code16 = 0;
8623 if (flag_code == CODE_16BIT)
8624 code16 = CODE16;
3e73aa7c 8625
29b0f896
AM
8626 if (i.prefix[DATA_PREFIX] != 0)
8627 {
48ef937e 8628 frag_opcode_byte (DATA_PREFIX_OPCODE);
29b0f896 8629 i.prefixes -= 1;
376cd056 8630 code16 ^= flip_code16(code16);
29b0f896 8631 }
252b5132 8632
29b0f896
AM
8633 size = 4;
8634 if (code16)
8635 size = 2;
8636 }
9fcc94b6 8637
6cb0a70e
JB
8638 /* BND prefixed jump. */
8639 if (i.prefix[BND_PREFIX] != 0)
29b0f896 8640 {
48ef937e 8641 frag_opcode_byte (i.prefix[BND_PREFIX]);
29b0f896
AM
8642 i.prefixes -= 1;
8643 }
252b5132 8644
6cb0a70e 8645 if (i.prefix[REX_PREFIX] != 0)
7e8b059b 8646 {
48ef937e 8647 frag_opcode_byte (i.prefix[REX_PREFIX]);
7e8b059b
L
8648 i.prefixes -= 1;
8649 }
8650
f2810fe0
JB
8651 if (i.prefixes != 0)
8652 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
e0890092 8653
48ef937e
JB
8654 if (now_seg == absolute_section)
8655 {
8656 abs_section_offset += i.tm.opcode_length + size;
8657 return;
8658 }
8659
42164a71
L
8660 p = frag_more (i.tm.opcode_length + size);
8661 switch (i.tm.opcode_length)
8662 {
8663 case 2:
8664 *p++ = i.tm.base_opcode >> 8;
1a0670f3 8665 /* Fall through. */
42164a71
L
8666 case 1:
8667 *p++ = i.tm.base_opcode;
8668 break;
8669 default:
8670 abort ();
8671 }
e0890092 8672
bd7ab16b
L
8673#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8674 if (size == 4
8675 && jump_reloc == NO_RELOC
8676 && need_plt32_p (i.op[0].disps->X_add_symbol))
8677 jump_reloc = BFD_RELOC_X86_64_PLT32;
8678#endif
8679
8680 jump_reloc = reloc (size, 1, 1, jump_reloc);
8681
3e02c1cc 8682 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 8683 i.op[0].disps, 1, jump_reloc);
3e02c1cc
AM
8684
8685 /* All jumps handled here are signed, but don't use a signed limit
8686 check for 32 and 16 bit jumps as we want to allow wrap around at
8687 4G and 64k respectively. */
8688 if (size == 1)
8689 fixP->fx_signed = 1;
29b0f896 8690}
e0890092 8691
29b0f896 8692static void
e3bb37b5 8693output_interseg_jump (void)
29b0f896
AM
8694{
8695 char *p;
8696 int size;
8697 int prefix;
8698 int code16;
252b5132 8699
29b0f896
AM
8700 code16 = 0;
8701 if (flag_code == CODE_16BIT)
8702 code16 = CODE16;
a217f122 8703
29b0f896
AM
8704 prefix = 0;
8705 if (i.prefix[DATA_PREFIX] != 0)
8706 {
8707 prefix = 1;
8708 i.prefixes -= 1;
8709 code16 ^= CODE16;
8710 }
6cb0a70e
JB
8711
8712 gas_assert (!i.prefix[REX_PREFIX]);
252b5132 8713
29b0f896
AM
8714 size = 4;
8715 if (code16)
8716 size = 2;
252b5132 8717
f2810fe0
JB
8718 if (i.prefixes != 0)
8719 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
252b5132 8720
48ef937e
JB
8721 if (now_seg == absolute_section)
8722 {
8723 abs_section_offset += prefix + 1 + 2 + size;
8724 return;
8725 }
8726
29b0f896
AM
8727 /* 1 opcode; 2 segment; offset */
8728 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 8729
29b0f896
AM
8730 if (i.prefix[DATA_PREFIX] != 0)
8731 *p++ = DATA_PREFIX_OPCODE;
252b5132 8732
29b0f896
AM
8733 if (i.prefix[REX_PREFIX] != 0)
8734 *p++ = i.prefix[REX_PREFIX];
252b5132 8735
29b0f896
AM
8736 *p++ = i.tm.base_opcode;
8737 if (i.op[1].imms->X_op == O_constant)
8738 {
8739 offsetT n = i.op[1].imms->X_add_number;
252b5132 8740
29b0f896
AM
8741 if (size == 2
8742 && !fits_in_unsigned_word (n)
8743 && !fits_in_signed_word (n))
8744 {
8745 as_bad (_("16-bit jump out of range"));
8746 return;
8747 }
8748 md_number_to_chars (p, n, size);
8749 }
8750 else
8751 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 8752 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
29b0f896
AM
8753 if (i.op[0].imms->X_op != O_constant)
8754 as_bad (_("can't handle non absolute segment in `%s'"),
8755 i.tm.name);
8756 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
8757}
a217f122 8758
b4a3a7b4
L
8759#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8760void
8761x86_cleanup (void)
8762{
8763 char *p;
8764 asection *seg = now_seg;
8765 subsegT subseg = now_subseg;
8766 asection *sec;
8767 unsigned int alignment, align_size_1;
8768 unsigned int isa_1_descsz, feature_2_descsz, descsz;
8769 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
8770 unsigned int padding;
8771
8772 if (!IS_ELF || !x86_used_note)
8773 return;
8774
b4a3a7b4
L
8775 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
8776
8777 /* The .note.gnu.property section layout:
8778
8779 Field Length Contents
8780 ---- ---- ----
8781 n_namsz 4 4
8782 n_descsz 4 The note descriptor size
8783 n_type 4 NT_GNU_PROPERTY_TYPE_0
8784 n_name 4 "GNU"
8785 n_desc n_descsz The program property array
8786 .... .... ....
8787 */
8788
8789 /* Create the .note.gnu.property section. */
8790 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 8791 bfd_set_section_flags (sec,
b4a3a7b4
L
8792 (SEC_ALLOC
8793 | SEC_LOAD
8794 | SEC_DATA
8795 | SEC_HAS_CONTENTS
8796 | SEC_READONLY));
8797
8798 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
8799 {
8800 align_size_1 = 7;
8801 alignment = 3;
8802 }
8803 else
8804 {
8805 align_size_1 = 3;
8806 alignment = 2;
8807 }
8808
fd361982 8809 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
8810 elf_section_type (sec) = SHT_NOTE;
8811
8812 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
8813 + 4-byte data */
8814 isa_1_descsz_raw = 4 + 4 + 4;
8815 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
8816 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
8817
8818 feature_2_descsz_raw = isa_1_descsz;
8819 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
8820 + 4-byte data */
8821 feature_2_descsz_raw += 4 + 4 + 4;
8822 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
8823 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
8824 & ~align_size_1);
8825
8826 descsz = feature_2_descsz;
8827 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
8828 p = frag_more (4 + 4 + 4 + 4 + descsz);
8829
8830 /* Write n_namsz. */
8831 md_number_to_chars (p, (valueT) 4, 4);
8832
8833 /* Write n_descsz. */
8834 md_number_to_chars (p + 4, (valueT) descsz, 4);
8835
8836 /* Write n_type. */
8837 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
8838
8839 /* Write n_name. */
8840 memcpy (p + 4 * 3, "GNU", 4);
8841
8842 /* Write 4-byte type. */
8843 md_number_to_chars (p + 4 * 4,
8844 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
8845
8846 /* Write 4-byte data size. */
8847 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
8848
8849 /* Write 4-byte data. */
8850 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
8851
8852 /* Zero out paddings. */
8853 padding = isa_1_descsz - isa_1_descsz_raw;
8854 if (padding)
8855 memset (p + 4 * 7, 0, padding);
8856
8857 /* Write 4-byte type. */
8858 md_number_to_chars (p + isa_1_descsz + 4 * 4,
8859 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
8860
8861 /* Write 4-byte data size. */
8862 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
8863
8864 /* Write 4-byte data. */
8865 md_number_to_chars (p + isa_1_descsz + 4 * 6,
8866 (valueT) x86_feature_2_used, 4);
8867
8868 /* Zero out paddings. */
8869 padding = feature_2_descsz - feature_2_descsz_raw;
8870 if (padding)
8871 memset (p + isa_1_descsz + 4 * 7, 0, padding);
8872
8873 /* We probably can't restore the current segment, for there likely
8874 isn't one yet... */
8875 if (seg && subseg)
8876 subseg_set (seg, subseg);
8877}
8878#endif
8879
9c33702b
JB
8880static unsigned int
8881encoding_length (const fragS *start_frag, offsetT start_off,
8882 const char *frag_now_ptr)
8883{
8884 unsigned int len = 0;
8885
8886 if (start_frag != frag_now)
8887 {
8888 const fragS *fr = start_frag;
8889
8890 do {
8891 len += fr->fr_fix;
8892 fr = fr->fr_next;
8893 } while (fr && fr != frag_now);
8894 }
8895
8896 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
8897}
8898
e379e5f3 8899/* Return 1 for test, and, cmp, add, sub, inc and dec which may
79d72f45
HL
8900 be macro-fused with conditional jumps.
8901 NB: If TEST/AND/CMP/ADD/SUB/INC/DEC is of RIP relative address,
8902 or is one of the following format:
8903
8904 cmp m, imm
8905 add m, imm
8906 sub m, imm
8907 test m, imm
8908 and m, imm
8909 inc m
8910 dec m
8911
8912 it is unfusible. */
e379e5f3
L
8913
8914static int
79d72f45 8915maybe_fused_with_jcc_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8916{
8917 /* No RIP address. */
8918 if (i.base_reg && i.base_reg->reg_num == RegIP)
8919 return 0;
8920
8921 /* No VEX/EVEX encoding. */
8922 if (is_any_vex_encoding (&i.tm))
8923 return 0;
8924
79d72f45
HL
8925 /* add, sub without add/sub m, imm. */
8926 if (i.tm.base_opcode <= 5
e379e5f3
L
8927 || (i.tm.base_opcode >= 0x28 && i.tm.base_opcode <= 0x2d)
8928 || ((i.tm.base_opcode | 3) == 0x83
79d72f45 8929 && (i.tm.extension_opcode == 0x5
e379e5f3 8930 || i.tm.extension_opcode == 0x0)))
79d72f45
HL
8931 {
8932 *mf_cmp_p = mf_cmp_alu_cmp;
8933 return !(i.mem_operands && i.imm_operands);
8934 }
e379e5f3 8935
79d72f45
HL
8936 /* and without and m, imm. */
8937 if ((i.tm.base_opcode >= 0x20 && i.tm.base_opcode <= 0x25)
8938 || ((i.tm.base_opcode | 3) == 0x83
8939 && i.tm.extension_opcode == 0x4))
8940 {
8941 *mf_cmp_p = mf_cmp_test_and;
8942 return !(i.mem_operands && i.imm_operands);
8943 }
8944
8945 /* test without test m imm. */
e379e5f3
L
8946 if ((i.tm.base_opcode | 1) == 0x85
8947 || (i.tm.base_opcode | 1) == 0xa9
8948 || ((i.tm.base_opcode | 1) == 0xf7
79d72f45
HL
8949 && i.tm.extension_opcode == 0))
8950 {
8951 *mf_cmp_p = mf_cmp_test_and;
8952 return !(i.mem_operands && i.imm_operands);
8953 }
8954
8955 /* cmp without cmp m, imm. */
8956 if ((i.tm.base_opcode >= 0x38 && i.tm.base_opcode <= 0x3d)
e379e5f3
L
8957 || ((i.tm.base_opcode | 3) == 0x83
8958 && (i.tm.extension_opcode == 0x7)))
79d72f45
HL
8959 {
8960 *mf_cmp_p = mf_cmp_alu_cmp;
8961 return !(i.mem_operands && i.imm_operands);
8962 }
e379e5f3 8963
79d72f45 8964 /* inc, dec without inc/dec m. */
e379e5f3
L
8965 if ((i.tm.cpu_flags.bitfield.cpuno64
8966 && (i.tm.base_opcode | 0xf) == 0x4f)
8967 || ((i.tm.base_opcode | 1) == 0xff
8968 && i.tm.extension_opcode <= 0x1))
79d72f45
HL
8969 {
8970 *mf_cmp_p = mf_cmp_incdec;
8971 return !i.mem_operands;
8972 }
e379e5f3
L
8973
8974 return 0;
8975}
8976
8977/* Return 1 if a FUSED_JCC_PADDING frag should be generated. */
8978
8979static int
79d72f45 8980add_fused_jcc_padding_frag_p (enum mf_cmp_kind* mf_cmp_p)
e379e5f3
L
8981{
8982 /* NB: Don't work with COND_JUMP86 without i386. */
8983 if (!align_branch_power
8984 || now_seg == absolute_section
8985 || !cpu_arch_flags.bitfield.cpui386
8986 || !(align_branch & align_branch_fused_bit))
8987 return 0;
8988
79d72f45 8989 if (maybe_fused_with_jcc_p (mf_cmp_p))
e379e5f3
L
8990 {
8991 if (last_insn.kind == last_insn_other
8992 || last_insn.seg != now_seg)
8993 return 1;
8994 if (flag_debug)
8995 as_warn_where (last_insn.file, last_insn.line,
8996 _("`%s` skips -malign-branch-boundary on `%s`"),
8997 last_insn.name, i.tm.name);
8998 }
8999
9000 return 0;
9001}
9002
9003/* Return 1 if a BRANCH_PREFIX frag should be generated. */
9004
9005static int
9006add_branch_prefix_frag_p (void)
9007{
9008 /* NB: Don't work with COND_JUMP86 without i386. Don't add prefix
9009 to PadLock instructions since they include prefixes in opcode. */
9010 if (!align_branch_power
9011 || !align_branch_prefix_size
9012 || now_seg == absolute_section
9013 || i.tm.cpu_flags.bitfield.cpupadlock
9014 || !cpu_arch_flags.bitfield.cpui386)
9015 return 0;
9016
9017 /* Don't add prefix if it is a prefix or there is no operand in case
9018 that segment prefix is special. */
9019 if (!i.operands || i.tm.opcode_modifier.isprefix)
9020 return 0;
9021
9022 if (last_insn.kind == last_insn_other
9023 || last_insn.seg != now_seg)
9024 return 1;
9025
9026 if (flag_debug)
9027 as_warn_where (last_insn.file, last_insn.line,
9028 _("`%s` skips -malign-branch-boundary on `%s`"),
9029 last_insn.name, i.tm.name);
9030
9031 return 0;
9032}
9033
9034/* Return 1 if a BRANCH_PADDING frag should be generated. */
9035
9036static int
79d72f45
HL
9037add_branch_padding_frag_p (enum align_branch_kind *branch_p,
9038 enum mf_jcc_kind *mf_jcc_p)
e379e5f3
L
9039{
9040 int add_padding;
9041
9042 /* NB: Don't work with COND_JUMP86 without i386. */
9043 if (!align_branch_power
9044 || now_seg == absolute_section
9045 || !cpu_arch_flags.bitfield.cpui386)
9046 return 0;
9047
9048 add_padding = 0;
9049
9050 /* Check for jcc and direct jmp. */
9051 if (i.tm.opcode_modifier.jump == JUMP)
9052 {
9053 if (i.tm.base_opcode == JUMP_PC_RELATIVE)
9054 {
9055 *branch_p = align_branch_jmp;
9056 add_padding = align_branch & align_branch_jmp_bit;
9057 }
9058 else
9059 {
79d72f45
HL
9060 /* Because J<cc> and JN<cc> share same group in macro-fusible table,
9061 igore the lowest bit. */
9062 *mf_jcc_p = (i.tm.base_opcode & 0x0e) >> 1;
e379e5f3
L
9063 *branch_p = align_branch_jcc;
9064 if ((align_branch & align_branch_jcc_bit))
9065 add_padding = 1;
9066 }
9067 }
9068 else if (is_any_vex_encoding (&i.tm))
9069 return 0;
9070 else if ((i.tm.base_opcode | 1) == 0xc3)
9071 {
9072 /* Near ret. */
9073 *branch_p = align_branch_ret;
9074 if ((align_branch & align_branch_ret_bit))
9075 add_padding = 1;
9076 }
9077 else
9078 {
9079 /* Check for indirect jmp, direct and indirect calls. */
9080 if (i.tm.base_opcode == 0xe8)
9081 {
9082 /* Direct call. */
9083 *branch_p = align_branch_call;
9084 if ((align_branch & align_branch_call_bit))
9085 add_padding = 1;
9086 }
9087 else if (i.tm.base_opcode == 0xff
9088 && (i.tm.extension_opcode == 2
9089 || i.tm.extension_opcode == 4))
9090 {
9091 /* Indirect call and jmp. */
9092 *branch_p = align_branch_indirect;
9093 if ((align_branch & align_branch_indirect_bit))
9094 add_padding = 1;
9095 }
9096
9097 if (add_padding
9098 && i.disp_operands
9099 && tls_get_addr
9100 && (i.op[0].disps->X_op == O_symbol
9101 || (i.op[0].disps->X_op == O_subtract
9102 && i.op[0].disps->X_op_symbol == GOT_symbol)))
9103 {
9104 symbolS *s = i.op[0].disps->X_add_symbol;
9105 /* No padding to call to global or undefined tls_get_addr. */
9106 if ((S_IS_EXTERNAL (s) || !S_IS_DEFINED (s))
9107 && strcmp (S_GET_NAME (s), tls_get_addr) == 0)
9108 return 0;
9109 }
9110 }
9111
9112 if (add_padding
9113 && last_insn.kind != last_insn_other
9114 && last_insn.seg == now_seg)
9115 {
9116 if (flag_debug)
9117 as_warn_where (last_insn.file, last_insn.line,
9118 _("`%s` skips -malign-branch-boundary on `%s`"),
9119 last_insn.name, i.tm.name);
9120 return 0;
9121 }
9122
9123 return add_padding;
9124}
9125
29b0f896 9126static void
e3bb37b5 9127output_insn (void)
29b0f896 9128{
2bbd9c25
JJ
9129 fragS *insn_start_frag;
9130 offsetT insn_start_off;
e379e5f3
L
9131 fragS *fragP = NULL;
9132 enum align_branch_kind branch = align_branch_none;
79d72f45
HL
9133 /* The initializer is arbitrary just to avoid uninitialized error.
9134 it's actually either assigned in add_branch_padding_frag_p
9135 or never be used. */
9136 enum mf_jcc_kind mf_jcc = mf_jcc_jo;
2bbd9c25 9137
b4a3a7b4 9138#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
48ef937e 9139 if (IS_ELF && x86_used_note && now_seg != absolute_section)
b4a3a7b4
L
9140 {
9141 if (i.tm.cpu_flags.bitfield.cpucmov)
9142 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_CMOV;
9143 if (i.tm.cpu_flags.bitfield.cpusse)
9144 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE;
9145 if (i.tm.cpu_flags.bitfield.cpusse2)
9146 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE2;
9147 if (i.tm.cpu_flags.bitfield.cpusse3)
9148 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE3;
9149 if (i.tm.cpu_flags.bitfield.cpussse3)
9150 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSSE3;
9151 if (i.tm.cpu_flags.bitfield.cpusse4_1)
9152 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_1;
9153 if (i.tm.cpu_flags.bitfield.cpusse4_2)
9154 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_2;
9155 if (i.tm.cpu_flags.bitfield.cpuavx)
9156 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX;
9157 if (i.tm.cpu_flags.bitfield.cpuavx2)
9158 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX2;
9159 if (i.tm.cpu_flags.bitfield.cpufma)
9160 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_FMA;
9161 if (i.tm.cpu_flags.bitfield.cpuavx512f)
9162 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512F;
9163 if (i.tm.cpu_flags.bitfield.cpuavx512cd)
9164 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512CD;
9165 if (i.tm.cpu_flags.bitfield.cpuavx512er)
9166 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512ER;
9167 if (i.tm.cpu_flags.bitfield.cpuavx512pf)
9168 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512PF;
9169 if (i.tm.cpu_flags.bitfield.cpuavx512vl)
9170 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512VL;
9171 if (i.tm.cpu_flags.bitfield.cpuavx512dq)
9172 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512DQ;
9173 if (i.tm.cpu_flags.bitfield.cpuavx512bw)
9174 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512BW;
9175 if (i.tm.cpu_flags.bitfield.cpuavx512_4fmaps)
9176 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS;
9177 if (i.tm.cpu_flags.bitfield.cpuavx512_4vnniw)
9178 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW;
9179 if (i.tm.cpu_flags.bitfield.cpuavx512_bitalg)
9180 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BITALG;
9181 if (i.tm.cpu_flags.bitfield.cpuavx512ifma)
9182 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_IFMA;
9183 if (i.tm.cpu_flags.bitfield.cpuavx512vbmi)
9184 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI;
9185 if (i.tm.cpu_flags.bitfield.cpuavx512_vbmi2)
9186 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2;
9187 if (i.tm.cpu_flags.bitfield.cpuavx512_vnni)
9188 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VNNI;
462cac58
L
9189 if (i.tm.cpu_flags.bitfield.cpuavx512_bf16)
9190 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BF16;
b4a3a7b4
L
9191
9192 if (i.tm.cpu_flags.bitfield.cpu8087
9193 || i.tm.cpu_flags.bitfield.cpu287
9194 || i.tm.cpu_flags.bitfield.cpu387
9195 || i.tm.cpu_flags.bitfield.cpu687
9196 || i.tm.cpu_flags.bitfield.cpufisttp)
9197 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
921eafea 9198 if ((i.xstate & xstate_mmx)
319ff62c 9199 || i.tm.base_opcode == 0xf77 /* emms */
921eafea 9200 || i.tm.base_opcode == 0xf0e /* femms */)
b4a3a7b4 9201 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
921eafea 9202 if ((i.xstate & xstate_xmm))
b4a3a7b4 9203 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
921eafea 9204 if ((i.xstate & xstate_ymm) == xstate_ymm)
b4a3a7b4 9205 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
921eafea 9206 if ((i.xstate & xstate_zmm) == xstate_zmm)
b4a3a7b4
L
9207 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
9208 if (i.tm.cpu_flags.bitfield.cpufxsr)
9209 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
9210 if (i.tm.cpu_flags.bitfield.cpuxsave)
9211 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
9212 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
9213 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
9214 if (i.tm.cpu_flags.bitfield.cpuxsavec)
9215 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
a308b89d
L
9216
9217 if ((i.xstate & xstate_tmm) == xstate_tmm
9218 || i.tm.cpu_flags.bitfield.cpuamx_tile)
9219 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_TMM;
b4a3a7b4
L
9220 }
9221#endif
9222
29b0f896
AM
9223 /* Tie dwarf2 debug info to the address at the start of the insn.
9224 We can't do this after the insn has been output as the current
9225 frag may have been closed off. eg. by frag_var. */
9226 dwarf2_emit_insn (0);
9227
2bbd9c25
JJ
9228 insn_start_frag = frag_now;
9229 insn_start_off = frag_now_fix ();
9230
79d72f45 9231 if (add_branch_padding_frag_p (&branch, &mf_jcc))
e379e5f3
L
9232 {
9233 char *p;
9234 /* Branch can be 8 bytes. Leave some room for prefixes. */
9235 unsigned int max_branch_padding_size = 14;
9236
9237 /* Align section to boundary. */
9238 record_alignment (now_seg, align_branch_power);
9239
9240 /* Make room for padding. */
9241 frag_grow (max_branch_padding_size);
9242
9243 /* Start of the padding. */
9244 p = frag_more (0);
9245
9246 fragP = frag_now;
9247
9248 frag_var (rs_machine_dependent, max_branch_padding_size, 0,
9249 ENCODE_RELAX_STATE (BRANCH_PADDING, 0),
9250 NULL, 0, p);
9251
79d72f45 9252 fragP->tc_frag_data.mf_type = mf_jcc;
e379e5f3
L
9253 fragP->tc_frag_data.branch_type = branch;
9254 fragP->tc_frag_data.max_bytes = max_branch_padding_size;
9255 }
9256
29b0f896 9257 /* Output jumps. */
0cfa3eb3 9258 if (i.tm.opcode_modifier.jump == JUMP)
29b0f896 9259 output_branch ();
0cfa3eb3
JB
9260 else if (i.tm.opcode_modifier.jump == JUMP_BYTE
9261 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896 9262 output_jump ();
0cfa3eb3 9263 else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT)
29b0f896
AM
9264 output_interseg_jump ();
9265 else
9266 {
9267 /* Output normal instructions here. */
9268 char *p;
9269 unsigned char *q;
47465058 9270 unsigned int j;
331d2d0d 9271 unsigned int prefix;
79d72f45 9272 enum mf_cmp_kind mf_cmp;
4dffcebc 9273
e4e00185 9274 if (avoid_fence
c3949f43
JB
9275 && (i.tm.base_opcode == 0xfaee8
9276 || i.tm.base_opcode == 0xfaef0
9277 || i.tm.base_opcode == 0xfaef8))
48ef937e
JB
9278 {
9279 /* Encode lfence, mfence, and sfence as
9280 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
9281 if (now_seg != absolute_section)
9282 {
9283 offsetT val = 0x240483f0ULL;
9284
9285 p = frag_more (5);
9286 md_number_to_chars (p, val, 5);
9287 }
9288 else
9289 abs_section_offset += 5;
9290 return;
9291 }
e4e00185 9292
d022bddd
IT
9293 /* Some processors fail on LOCK prefix. This options makes
9294 assembler ignore LOCK prefix and serves as a workaround. */
9295 if (omit_lock_prefix)
9296 {
9297 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE)
9298 return;
9299 i.prefix[LOCK_PREFIX] = 0;
9300 }
9301
e379e5f3
L
9302 if (branch)
9303 /* Skip if this is a branch. */
9304 ;
79d72f45 9305 else if (add_fused_jcc_padding_frag_p (&mf_cmp))
e379e5f3
L
9306 {
9307 /* Make room for padding. */
9308 frag_grow (MAX_FUSED_JCC_PADDING_SIZE);
9309 p = frag_more (0);
9310
9311 fragP = frag_now;
9312
9313 frag_var (rs_machine_dependent, MAX_FUSED_JCC_PADDING_SIZE, 0,
9314 ENCODE_RELAX_STATE (FUSED_JCC_PADDING, 0),
9315 NULL, 0, p);
9316
79d72f45 9317 fragP->tc_frag_data.mf_type = mf_cmp;
e379e5f3
L
9318 fragP->tc_frag_data.branch_type = align_branch_fused;
9319 fragP->tc_frag_data.max_bytes = MAX_FUSED_JCC_PADDING_SIZE;
9320 }
9321 else if (add_branch_prefix_frag_p ())
9322 {
9323 unsigned int max_prefix_size = align_branch_prefix_size;
9324
9325 /* Make room for padding. */
9326 frag_grow (max_prefix_size);
9327 p = frag_more (0);
9328
9329 fragP = frag_now;
9330
9331 frag_var (rs_machine_dependent, max_prefix_size, 0,
9332 ENCODE_RELAX_STATE (BRANCH_PREFIX, 0),
9333 NULL, 0, p);
9334
9335 fragP->tc_frag_data.max_bytes = max_prefix_size;
9336 }
9337
43234a1e
L
9338 /* Since the VEX/EVEX prefix contains the implicit prefix, we
9339 don't need the explicit prefix. */
9340 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 9341 {
c0f3af97 9342 switch (i.tm.opcode_length)
bc4bd9ab 9343 {
c0f3af97
L
9344 case 3:
9345 if (i.tm.base_opcode & 0xff000000)
4dffcebc 9346 {
c0f3af97 9347 prefix = (i.tm.base_opcode >> 24) & 0xff;
c3949f43
JB
9348 if (!i.tm.cpu_flags.bitfield.cpupadlock
9349 || prefix != REPE_PREFIX_OPCODE
9350 || (i.prefix[REP_PREFIX] != REPE_PREFIX_OPCODE))
9351 add_prefix (prefix);
c0f3af97
L
9352 }
9353 break;
9354 case 2:
9355 if ((i.tm.base_opcode & 0xff0000) != 0)
9356 {
9357 prefix = (i.tm.base_opcode >> 16) & 0xff;
c3949f43 9358 add_prefix (prefix);
4dffcebc 9359 }
c0f3af97
L
9360 break;
9361 case 1:
9362 break;
390c91cf
L
9363 case 0:
9364 /* Check for pseudo prefixes. */
9365 as_bad_where (insn_start_frag->fr_file,
9366 insn_start_frag->fr_line,
9367 _("pseudo prefix without instruction"));
9368 return;
c0f3af97
L
9369 default:
9370 abort ();
bc4bd9ab 9371 }
c0f3af97 9372
6d19a37a 9373#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
9374 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
9375 R_X86_64_GOTTPOFF relocation so that linker can safely
14470f07
L
9376 perform IE->LE optimization. A dummy REX_OPCODE prefix
9377 is also needed for lea with R_X86_64_GOTPC32_TLSDESC
9378 relocation for GDesc -> IE/LE optimization. */
cf61b747
L
9379 if (x86_elf_abi == X86_64_X32_ABI
9380 && i.operands == 2
14470f07
L
9381 && (i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
9382 || i.reloc[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
cf61b747
L
9383 && i.prefix[REX_PREFIX] == 0)
9384 add_prefix (REX_OPCODE);
6d19a37a 9385#endif
cf61b747 9386
c0f3af97
L
9387 /* The prefix bytes. */
9388 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
9389 if (*q)
48ef937e 9390 frag_opcode_byte (*q);
0f10071e 9391 }
ae5c1c7b 9392 else
c0f3af97
L
9393 {
9394 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
9395 if (*q)
9396 switch (j)
9397 {
c0f3af97
L
9398 case SEG_PREFIX:
9399 case ADDR_PREFIX:
48ef937e 9400 frag_opcode_byte (*q);
c0f3af97
L
9401 break;
9402 default:
9403 /* There should be no other prefixes for instructions
9404 with VEX prefix. */
9405 abort ();
9406 }
9407
43234a1e
L
9408 /* For EVEX instructions i.vrex should become 0 after
9409 build_evex_prefix. For VEX instructions upper 16 registers
9410 aren't available, so VREX should be 0. */
9411 if (i.vrex)
9412 abort ();
c0f3af97 9413 /* Now the VEX prefix. */
48ef937e
JB
9414 if (now_seg != absolute_section)
9415 {
9416 p = frag_more (i.vex.length);
9417 for (j = 0; j < i.vex.length; j++)
9418 p[j] = i.vex.bytes[j];
9419 }
9420 else
9421 abs_section_offset += i.vex.length;
c0f3af97 9422 }
252b5132 9423
29b0f896 9424 /* Now the opcode; be careful about word order here! */
48ef937e
JB
9425 if (now_seg == absolute_section)
9426 abs_section_offset += i.tm.opcode_length;
9427 else if (i.tm.opcode_length == 1)
29b0f896
AM
9428 {
9429 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
9430 }
9431 else
9432 {
4dffcebc 9433 switch (i.tm.opcode_length)
331d2d0d 9434 {
43234a1e
L
9435 case 4:
9436 p = frag_more (4);
9437 *p++ = (i.tm.base_opcode >> 24) & 0xff;
9438 *p++ = (i.tm.base_opcode >> 16) & 0xff;
9439 break;
4dffcebc 9440 case 3:
331d2d0d
L
9441 p = frag_more (3);
9442 *p++ = (i.tm.base_opcode >> 16) & 0xff;
4dffcebc
L
9443 break;
9444 case 2:
9445 p = frag_more (2);
9446 break;
9447 default:
9448 abort ();
9449 break;
331d2d0d 9450 }
0f10071e 9451
29b0f896
AM
9452 /* Put out high byte first: can't use md_number_to_chars! */
9453 *p++ = (i.tm.base_opcode >> 8) & 0xff;
9454 *p = i.tm.base_opcode & 0xff;
9455 }
3e73aa7c 9456
29b0f896 9457 /* Now the modrm byte and sib byte (if present). */
40fb9820 9458 if (i.tm.opcode_modifier.modrm)
29b0f896 9459 {
48ef937e
JB
9460 frag_opcode_byte ((i.rm.regmem << 0)
9461 | (i.rm.reg << 3)
9462 | (i.rm.mode << 6));
29b0f896
AM
9463 /* If i.rm.regmem == ESP (4)
9464 && i.rm.mode != (Register mode)
9465 && not 16 bit
9466 ==> need second modrm byte. */
9467 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
9468 && i.rm.mode != 3
dc821c5f 9469 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
48ef937e
JB
9470 frag_opcode_byte ((i.sib.base << 0)
9471 | (i.sib.index << 3)
9472 | (i.sib.scale << 6));
29b0f896 9473 }
3e73aa7c 9474
29b0f896 9475 if (i.disp_operands)
2bbd9c25 9476 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 9477
29b0f896 9478 if (i.imm_operands)
2bbd9c25 9479 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
9480
9481 /*
9482 * frag_now_fix () returning plain abs_section_offset when we're in the
9483 * absolute section, and abs_section_offset not getting updated as data
9484 * gets added to the frag breaks the logic below.
9485 */
9486 if (now_seg != absolute_section)
9487 {
9488 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
9489 if (j > 15)
9490 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
9491 j);
e379e5f3
L
9492 else if (fragP)
9493 {
9494 /* NB: Don't add prefix with GOTPC relocation since
9495 output_disp() above depends on the fixed encoding
9496 length. Can't add prefix with TLS relocation since
9497 it breaks TLS linker optimization. */
9498 unsigned int max = i.has_gotpc_tls_reloc ? 0 : 15 - j;
9499 /* Prefix count on the current instruction. */
9500 unsigned int count = i.vex.length;
9501 unsigned int k;
9502 for (k = 0; k < ARRAY_SIZE (i.prefix); k++)
9503 /* REX byte is encoded in VEX/EVEX prefix. */
9504 if (i.prefix[k] && (k != REX_PREFIX || !i.vex.length))
9505 count++;
9506
9507 /* Count prefixes for extended opcode maps. */
9508 if (!i.vex.length)
9509 switch (i.tm.opcode_length)
9510 {
9511 case 3:
9512 if (((i.tm.base_opcode >> 16) & 0xff) == 0xf)
9513 {
9514 count++;
9515 switch ((i.tm.base_opcode >> 8) & 0xff)
9516 {
9517 case 0x38:
9518 case 0x3a:
9519 count++;
9520 break;
9521 default:
9522 break;
9523 }
9524 }
9525 break;
9526 case 2:
9527 if (((i.tm.base_opcode >> 8) & 0xff) == 0xf)
9528 count++;
9529 break;
9530 case 1:
9531 break;
9532 default:
9533 abort ();
9534 }
9535
9536 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
9537 == BRANCH_PREFIX)
9538 {
9539 /* Set the maximum prefix size in BRANCH_PREFIX
9540 frag. */
9541 if (fragP->tc_frag_data.max_bytes > max)
9542 fragP->tc_frag_data.max_bytes = max;
9543 if (fragP->tc_frag_data.max_bytes > count)
9544 fragP->tc_frag_data.max_bytes -= count;
9545 else
9546 fragP->tc_frag_data.max_bytes = 0;
9547 }
9548 else
9549 {
9550 /* Remember the maximum prefix size in FUSED_JCC_PADDING
9551 frag. */
9552 unsigned int max_prefix_size;
9553 if (align_branch_prefix_size > max)
9554 max_prefix_size = max;
9555 else
9556 max_prefix_size = align_branch_prefix_size;
9557 if (max_prefix_size > count)
9558 fragP->tc_frag_data.max_prefix_length
9559 = max_prefix_size - count;
9560 }
9561
9562 /* Use existing segment prefix if possible. Use CS
9563 segment prefix in 64-bit mode. In 32-bit mode, use SS
9564 segment prefix with ESP/EBP base register and use DS
9565 segment prefix without ESP/EBP base register. */
9566 if (i.prefix[SEG_PREFIX])
9567 fragP->tc_frag_data.default_prefix = i.prefix[SEG_PREFIX];
9568 else if (flag_code == CODE_64BIT)
9569 fragP->tc_frag_data.default_prefix = CS_PREFIX_OPCODE;
9570 else if (i.base_reg
9571 && (i.base_reg->reg_num == 4
9572 || i.base_reg->reg_num == 5))
9573 fragP->tc_frag_data.default_prefix = SS_PREFIX_OPCODE;
9574 else
9575 fragP->tc_frag_data.default_prefix = DS_PREFIX_OPCODE;
9576 }
9c33702b 9577 }
29b0f896 9578 }
252b5132 9579
e379e5f3
L
9580 /* NB: Don't work with COND_JUMP86 without i386. */
9581 if (align_branch_power
9582 && now_seg != absolute_section
9583 && cpu_arch_flags.bitfield.cpui386)
9584 {
9585 /* Terminate each frag so that we can add prefix and check for
9586 fused jcc. */
9587 frag_wane (frag_now);
9588 frag_new (0);
9589 }
9590
29b0f896
AM
9591#ifdef DEBUG386
9592 if (flag_debug)
9593 {
7b81dfbb 9594 pi ("" /*line*/, &i);
29b0f896
AM
9595 }
9596#endif /* DEBUG386 */
9597}
252b5132 9598
e205caa7
L
9599/* Return the size of the displacement operand N. */
9600
9601static int
9602disp_size (unsigned int n)
9603{
9604 int size = 4;
43234a1e 9605
b5014f7a 9606 if (i.types[n].bitfield.disp64)
40fb9820
L
9607 size = 8;
9608 else if (i.types[n].bitfield.disp8)
9609 size = 1;
9610 else if (i.types[n].bitfield.disp16)
9611 size = 2;
e205caa7
L
9612 return size;
9613}
9614
9615/* Return the size of the immediate operand N. */
9616
9617static int
9618imm_size (unsigned int n)
9619{
9620 int size = 4;
40fb9820
L
9621 if (i.types[n].bitfield.imm64)
9622 size = 8;
9623 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
9624 size = 1;
9625 else if (i.types[n].bitfield.imm16)
9626 size = 2;
e205caa7
L
9627 return size;
9628}
9629
29b0f896 9630static void
64e74474 9631output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9632{
9633 char *p;
9634 unsigned int n;
252b5132 9635
29b0f896
AM
9636 for (n = 0; n < i.operands; n++)
9637 {
b5014f7a 9638 if (operand_type_check (i.types[n], disp))
29b0f896 9639 {
48ef937e
JB
9640 int size = disp_size (n);
9641
9642 if (now_seg == absolute_section)
9643 abs_section_offset += size;
9644 else if (i.op[n].disps->X_op == O_constant)
29b0f896 9645 {
43234a1e 9646 offsetT val = i.op[n].disps->X_add_number;
252b5132 9647
629cfaf1
JB
9648 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
9649 size);
29b0f896
AM
9650 p = frag_more (size);
9651 md_number_to_chars (p, val, size);
9652 }
9653 else
9654 {
f86103b7 9655 enum bfd_reloc_code_real reloc_type;
40fb9820 9656 int sign = i.types[n].bitfield.disp32s;
29b0f896 9657 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 9658 fixS *fixP;
29b0f896 9659
e205caa7 9660 /* We can't have 8 bit displacement here. */
9c2799c2 9661 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 9662
29b0f896
AM
9663 /* The PC relative address is computed relative
9664 to the instruction boundary, so in case immediate
9665 fields follows, we need to adjust the value. */
9666 if (pcrel && i.imm_operands)
9667 {
29b0f896 9668 unsigned int n1;
e205caa7 9669 int sz = 0;
252b5132 9670
29b0f896 9671 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 9672 if (operand_type_check (i.types[n1], imm))
252b5132 9673 {
e205caa7
L
9674 /* Only one immediate is allowed for PC
9675 relative address. */
9c2799c2 9676 gas_assert (sz == 0);
e205caa7
L
9677 sz = imm_size (n1);
9678 i.op[n].disps->X_add_number -= sz;
252b5132 9679 }
29b0f896 9680 /* We should find the immediate. */
9c2799c2 9681 gas_assert (sz != 0);
29b0f896 9682 }
520dc8e8 9683
29b0f896 9684 p = frag_more (size);
d258b828 9685 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 9686 if (GOT_symbol
2bbd9c25 9687 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 9688 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9689 || reloc_type == BFD_RELOC_X86_64_32S
9690 || (reloc_type == BFD_RELOC_64
9691 && object_64bit))
d6ab8113
JB
9692 && (i.op[n].disps->X_op == O_symbol
9693 || (i.op[n].disps->X_op == O_add
9694 && ((symbol_get_value_expression
9695 (i.op[n].disps->X_op_symbol)->X_op)
9696 == O_subtract))))
9697 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 9698 {
4fa24527 9699 if (!object_64bit)
7b81dfbb
AJ
9700 {
9701 reloc_type = BFD_RELOC_386_GOTPC;
e379e5f3 9702 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9703 i.op[n].imms->X_add_number +=
9704 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
9705 }
9706 else if (reloc_type == BFD_RELOC_64)
9707 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 9708 else
7b81dfbb
AJ
9709 /* Don't do the adjustment for x86-64, as there
9710 the pcrel addressing is relative to the _next_
9711 insn, and that is taken care of in other code. */
d6ab8113 9712 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 9713 }
e379e5f3
L
9714 else if (align_branch_power)
9715 {
9716 switch (reloc_type)
9717 {
9718 case BFD_RELOC_386_TLS_GD:
9719 case BFD_RELOC_386_TLS_LDM:
9720 case BFD_RELOC_386_TLS_IE:
9721 case BFD_RELOC_386_TLS_IE_32:
9722 case BFD_RELOC_386_TLS_GOTIE:
9723 case BFD_RELOC_386_TLS_GOTDESC:
9724 case BFD_RELOC_386_TLS_DESC_CALL:
9725 case BFD_RELOC_X86_64_TLSGD:
9726 case BFD_RELOC_X86_64_TLSLD:
9727 case BFD_RELOC_X86_64_GOTTPOFF:
9728 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
9729 case BFD_RELOC_X86_64_TLSDESC_CALL:
9730 i.has_gotpc_tls_reloc = TRUE;
9731 default:
9732 break;
9733 }
9734 }
02a86693
L
9735 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
9736 size, i.op[n].disps, pcrel,
9737 reloc_type);
9738 /* Check for "call/jmp *mem", "mov mem, %reg",
9739 "test %reg, mem" and "binop mem, %reg" where binop
9740 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
9741 instructions without data prefix. Always generate
9742 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
9743 if (i.prefix[DATA_PREFIX] == 0
9744 && (generate_relax_relocations
9745 || (!object_64bit
9746 && i.rm.mode == 0
9747 && i.rm.regmem == 5))
0cb4071e
L
9748 && (i.rm.mode == 2
9749 || (i.rm.mode == 0 && i.rm.regmem == 5))
2ae4c703 9750 && !is_any_vex_encoding(&i.tm)
02a86693
L
9751 && ((i.operands == 1
9752 && i.tm.base_opcode == 0xff
9753 && (i.rm.reg == 2 || i.rm.reg == 4))
9754 || (i.operands == 2
9755 && (i.tm.base_opcode == 0x8b
9756 || i.tm.base_opcode == 0x85
2ae4c703 9757 || (i.tm.base_opcode & ~0x38) == 0x03))))
02a86693
L
9758 {
9759 if (object_64bit)
9760 {
9761 fixP->fx_tcbit = i.rex != 0;
9762 if (i.base_reg
e968fc9b 9763 && (i.base_reg->reg_num == RegIP))
02a86693
L
9764 fixP->fx_tcbit2 = 1;
9765 }
9766 else
9767 fixP->fx_tcbit2 = 1;
9768 }
29b0f896
AM
9769 }
9770 }
9771 }
9772}
252b5132 9773
29b0f896 9774static void
64e74474 9775output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9776{
9777 char *p;
9778 unsigned int n;
252b5132 9779
29b0f896
AM
9780 for (n = 0; n < i.operands; n++)
9781 {
43234a1e
L
9782 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
9783 if (i.rounding && (int) n == i.rounding->operand)
9784 continue;
9785
40fb9820 9786 if (operand_type_check (i.types[n], imm))
29b0f896 9787 {
48ef937e
JB
9788 int size = imm_size (n);
9789
9790 if (now_seg == absolute_section)
9791 abs_section_offset += size;
9792 else if (i.op[n].imms->X_op == O_constant)
29b0f896 9793 {
29b0f896 9794 offsetT val;
b4cac588 9795
29b0f896
AM
9796 val = offset_in_range (i.op[n].imms->X_add_number,
9797 size);
9798 p = frag_more (size);
9799 md_number_to_chars (p, val, size);
9800 }
9801 else
9802 {
9803 /* Not absolute_section.
9804 Need a 32-bit fixup (don't support 8bit
9805 non-absolute imms). Try to support other
9806 sizes ... */
f86103b7 9807 enum bfd_reloc_code_real reloc_type;
e205caa7 9808 int sign;
29b0f896 9809
40fb9820 9810 if (i.types[n].bitfield.imm32s
a7d61044 9811 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 9812 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 9813 sign = 1;
e205caa7
L
9814 else
9815 sign = 0;
520dc8e8 9816
29b0f896 9817 p = frag_more (size);
d258b828 9818 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 9819
2bbd9c25
JJ
9820 /* This is tough to explain. We end up with this one if we
9821 * have operands that look like
9822 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
9823 * obtain the absolute address of the GOT, and it is strongly
9824 * preferable from a performance point of view to avoid using
9825 * a runtime relocation for this. The actual sequence of
9826 * instructions often look something like:
9827 *
9828 * call .L66
9829 * .L66:
9830 * popl %ebx
9831 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
9832 *
9833 * The call and pop essentially return the absolute address
9834 * of the label .L66 and store it in %ebx. The linker itself
9835 * will ultimately change the first operand of the addl so
9836 * that %ebx points to the GOT, but to keep things simple, the
9837 * .o file must have this operand set so that it generates not
9838 * the absolute address of .L66, but the absolute address of
9839 * itself. This allows the linker itself simply treat a GOTPC
9840 * relocation as asking for a pcrel offset to the GOT to be
9841 * added in, and the addend of the relocation is stored in the
9842 * operand field for the instruction itself.
9843 *
9844 * Our job here is to fix the operand so that it would add
9845 * the correct offset so that %ebx would point to itself. The
9846 * thing that is tricky is that .-.L66 will point to the
9847 * beginning of the instruction, so we need to further modify
9848 * the operand so that it will point to itself. There are
9849 * other cases where you have something like:
9850 *
9851 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
9852 *
9853 * and here no correction would be required. Internally in
9854 * the assembler we treat operands of this form as not being
9855 * pcrel since the '.' is explicitly mentioned, and I wonder
9856 * whether it would simplify matters to do it this way. Who
9857 * knows. In earlier versions of the PIC patches, the
9858 * pcrel_adjust field was used to store the correction, but
9859 * since the expression is not pcrel, I felt it would be
9860 * confusing to do it this way. */
9861
d6ab8113 9862 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9863 || reloc_type == BFD_RELOC_X86_64_32S
9864 || reloc_type == BFD_RELOC_64)
29b0f896
AM
9865 && GOT_symbol
9866 && GOT_symbol == i.op[n].imms->X_add_symbol
9867 && (i.op[n].imms->X_op == O_symbol
9868 || (i.op[n].imms->X_op == O_add
9869 && ((symbol_get_value_expression
9870 (i.op[n].imms->X_op_symbol)->X_op)
9871 == O_subtract))))
9872 {
4fa24527 9873 if (!object_64bit)
d6ab8113 9874 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 9875 else if (size == 4)
d6ab8113 9876 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
9877 else if (size == 8)
9878 reloc_type = BFD_RELOC_X86_64_GOTPC64;
e379e5f3 9879 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9880 i.op[n].imms->X_add_number +=
9881 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 9882 }
29b0f896
AM
9883 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
9884 i.op[n].imms, 0, reloc_type);
9885 }
9886 }
9887 }
252b5132
RH
9888}
9889\f
d182319b
JB
9890/* x86_cons_fix_new is called via the expression parsing code when a
9891 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
9892static int cons_sign = -1;
9893
9894void
e3bb37b5 9895x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 9896 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 9897{
d258b828 9898 r = reloc (len, 0, cons_sign, r);
d182319b
JB
9899
9900#ifdef TE_PE
9901 if (exp->X_op == O_secrel)
9902 {
9903 exp->X_op = O_symbol;
9904 r = BFD_RELOC_32_SECREL;
9905 }
9906#endif
9907
9908 fix_new_exp (frag, off, len, exp, 0, r);
9909}
9910
357d1bd8
L
9911/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
9912 purpose of the `.dc.a' internal pseudo-op. */
9913
9914int
9915x86_address_bytes (void)
9916{
9917 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
9918 return 4;
9919 return stdoutput->arch_info->bits_per_address / 8;
9920}
9921
d382c579
TG
9922#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
9923 || defined (LEX_AT)
d258b828 9924# define lex_got(reloc, adjust, types) NULL
718ddfc0 9925#else
f3c180ae
AM
9926/* Parse operands of the form
9927 <symbol>@GOTOFF+<nnn>
9928 and similar .plt or .got references.
9929
9930 If we find one, set up the correct relocation in RELOC and copy the
9931 input string, minus the `@GOTOFF' into a malloc'd buffer for
9932 parsing by the calling routine. Return this buffer, and if ADJUST
9933 is non-null set it to the length of the string we removed from the
9934 input line. Otherwise return NULL. */
9935static char *
91d6fa6a 9936lex_got (enum bfd_reloc_code_real *rel,
64e74474 9937 int *adjust,
d258b828 9938 i386_operand_type *types)
f3c180ae 9939{
7b81dfbb
AJ
9940 /* Some of the relocations depend on the size of what field is to
9941 be relocated. But in our callers i386_immediate and i386_displacement
9942 we don't yet know the operand size (this will be set by insn
9943 matching). Hence we record the word32 relocation here,
9944 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
9945 static const struct {
9946 const char *str;
cff8d58a 9947 int len;
4fa24527 9948 const enum bfd_reloc_code_real rel[2];
40fb9820 9949 const i386_operand_type types64;
f3c180ae 9950 } gotrel[] = {
8ce3d284 9951#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
9952 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
9953 BFD_RELOC_SIZE32 },
9954 OPERAND_TYPE_IMM32_64 },
8ce3d284 9955#endif
cff8d58a
L
9956 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
9957 BFD_RELOC_X86_64_PLTOFF64 },
40fb9820 9958 OPERAND_TYPE_IMM64 },
cff8d58a
L
9959 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
9960 BFD_RELOC_X86_64_PLT32 },
40fb9820 9961 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9962 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
9963 BFD_RELOC_X86_64_GOTPLT64 },
40fb9820 9964 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
9965 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
9966 BFD_RELOC_X86_64_GOTOFF64 },
40fb9820 9967 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
9968 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
9969 BFD_RELOC_X86_64_GOTPCREL },
40fb9820 9970 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9971 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
9972 BFD_RELOC_X86_64_TLSGD },
40fb9820 9973 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9974 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
9975 _dummy_first_bfd_reloc_code_real },
40fb9820 9976 OPERAND_TYPE_NONE },
cff8d58a
L
9977 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
9978 BFD_RELOC_X86_64_TLSLD },
40fb9820 9979 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9980 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
9981 BFD_RELOC_X86_64_GOTTPOFF },
40fb9820 9982 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9983 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
9984 BFD_RELOC_X86_64_TPOFF32 },
40fb9820 9985 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
9986 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
9987 _dummy_first_bfd_reloc_code_real },
40fb9820 9988 OPERAND_TYPE_NONE },
cff8d58a
L
9989 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
9990 BFD_RELOC_X86_64_DTPOFF32 },
40fb9820 9991 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
9992 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
9993 _dummy_first_bfd_reloc_code_real },
40fb9820 9994 OPERAND_TYPE_NONE },
cff8d58a
L
9995 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
9996 _dummy_first_bfd_reloc_code_real },
40fb9820 9997 OPERAND_TYPE_NONE },
cff8d58a
L
9998 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
9999 BFD_RELOC_X86_64_GOT32 },
40fb9820 10000 OPERAND_TYPE_IMM32_32S_64_DISP32 },
cff8d58a
L
10001 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
10002 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
40fb9820 10003 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
10004 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
10005 BFD_RELOC_X86_64_TLSDESC_CALL },
40fb9820 10006 OPERAND_TYPE_IMM32_32S_DISP32 },
f3c180ae
AM
10007 };
10008 char *cp;
10009 unsigned int j;
10010
d382c579 10011#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
10012 if (!IS_ELF)
10013 return NULL;
d382c579 10014#endif
718ddfc0 10015
f3c180ae 10016 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 10017 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
10018 return NULL;
10019
47465058 10020 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 10021 {
cff8d58a 10022 int len = gotrel[j].len;
28f81592 10023 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 10024 {
4fa24527 10025 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 10026 {
28f81592
AM
10027 int first, second;
10028 char *tmpbuf, *past_reloc;
f3c180ae 10029
91d6fa6a 10030 *rel = gotrel[j].rel[object_64bit];
f3c180ae 10031
3956db08
JB
10032 if (types)
10033 {
10034 if (flag_code != CODE_64BIT)
40fb9820
L
10035 {
10036 types->bitfield.imm32 = 1;
10037 types->bitfield.disp32 = 1;
10038 }
3956db08
JB
10039 else
10040 *types = gotrel[j].types64;
10041 }
10042
8fd4256d 10043 if (j != 0 && GOT_symbol == NULL)
f3c180ae
AM
10044 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
10045
28f81592 10046 /* The length of the first part of our input line. */
f3c180ae 10047 first = cp - input_line_pointer;
28f81592
AM
10048
10049 /* The second part goes from after the reloc token until
67c11a9b 10050 (and including) an end_of_line char or comma. */
28f81592 10051 past_reloc = cp + 1 + len;
67c11a9b
AM
10052 cp = past_reloc;
10053 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10054 ++cp;
10055 second = cp + 1 - past_reloc;
28f81592
AM
10056
10057 /* Allocate and copy string. The trailing NUL shouldn't
10058 be necessary, but be safe. */
add39d23 10059 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 10060 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
10061 if (second != 0 && *past_reloc != ' ')
10062 /* Replace the relocation token with ' ', so that
10063 errors like foo@GOTOFF1 will be detected. */
10064 tmpbuf[first++] = ' ';
af89796a
L
10065 else
10066 /* Increment length by 1 if the relocation token is
10067 removed. */
10068 len++;
10069 if (adjust)
10070 *adjust = len;
0787a12d
AM
10071 memcpy (tmpbuf + first, past_reloc, second);
10072 tmpbuf[first + second] = '\0';
f3c180ae
AM
10073 return tmpbuf;
10074 }
10075
4fa24527
JB
10076 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10077 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
10078 return NULL;
10079 }
10080 }
10081
10082 /* Might be a symbol version string. Don't as_bad here. */
10083 return NULL;
10084}
4e4f7c87 10085#endif
f3c180ae 10086
a988325c
NC
10087#ifdef TE_PE
10088#ifdef lex_got
10089#undef lex_got
10090#endif
10091/* Parse operands of the form
10092 <symbol>@SECREL32+<nnn>
10093
10094 If we find one, set up the correct relocation in RELOC and copy the
10095 input string, minus the `@SECREL32' into a malloc'd buffer for
10096 parsing by the calling routine. Return this buffer, and if ADJUST
10097 is non-null set it to the length of the string we removed from the
34bca508
L
10098 input line. Otherwise return NULL.
10099
a988325c
NC
10100 This function is copied from the ELF version above adjusted for PE targets. */
10101
10102static char *
10103lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
10104 int *adjust ATTRIBUTE_UNUSED,
d258b828 10105 i386_operand_type *types)
a988325c
NC
10106{
10107 static const struct
10108 {
10109 const char *str;
10110 int len;
10111 const enum bfd_reloc_code_real rel[2];
10112 const i386_operand_type types64;
10113 }
10114 gotrel[] =
10115 {
10116 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
10117 BFD_RELOC_32_SECREL },
10118 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
10119 };
10120
10121 char *cp;
10122 unsigned j;
10123
10124 for (cp = input_line_pointer; *cp != '@'; cp++)
10125 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
10126 return NULL;
10127
10128 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
10129 {
10130 int len = gotrel[j].len;
10131
10132 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
10133 {
10134 if (gotrel[j].rel[object_64bit] != 0)
10135 {
10136 int first, second;
10137 char *tmpbuf, *past_reloc;
10138
10139 *rel = gotrel[j].rel[object_64bit];
10140 if (adjust)
10141 *adjust = len;
10142
10143 if (types)
10144 {
10145 if (flag_code != CODE_64BIT)
10146 {
10147 types->bitfield.imm32 = 1;
10148 types->bitfield.disp32 = 1;
10149 }
10150 else
10151 *types = gotrel[j].types64;
10152 }
10153
10154 /* The length of the first part of our input line. */
10155 first = cp - input_line_pointer;
10156
10157 /* The second part goes from after the reloc token until
10158 (and including) an end_of_line char or comma. */
10159 past_reloc = cp + 1 + len;
10160 cp = past_reloc;
10161 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
10162 ++cp;
10163 second = cp + 1 - past_reloc;
10164
10165 /* Allocate and copy string. The trailing NUL shouldn't
10166 be necessary, but be safe. */
add39d23 10167 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
10168 memcpy (tmpbuf, input_line_pointer, first);
10169 if (second != 0 && *past_reloc != ' ')
10170 /* Replace the relocation token with ' ', so that
10171 errors like foo@SECLREL321 will be detected. */
10172 tmpbuf[first++] = ' ';
10173 memcpy (tmpbuf + first, past_reloc, second);
10174 tmpbuf[first + second] = '\0';
10175 return tmpbuf;
10176 }
10177
10178 as_bad (_("@%s reloc is not supported with %d-bit output format"),
10179 gotrel[j].str, 1 << (5 + object_64bit));
10180 return NULL;
10181 }
10182 }
10183
10184 /* Might be a symbol version string. Don't as_bad here. */
10185 return NULL;
10186}
10187
10188#endif /* TE_PE */
10189
62ebcb5c 10190bfd_reloc_code_real_type
e3bb37b5 10191x86_cons (expressionS *exp, int size)
f3c180ae 10192{
62ebcb5c
AM
10193 bfd_reloc_code_real_type got_reloc = NO_RELOC;
10194
ee86248c
JB
10195 intel_syntax = -intel_syntax;
10196
3c7b9c2c 10197 exp->X_md = 0;
4fa24527 10198 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
10199 {
10200 /* Handle @GOTOFF and the like in an expression. */
10201 char *save;
10202 char *gotfree_input_line;
4a57f2cf 10203 int adjust = 0;
f3c180ae
AM
10204
10205 save = input_line_pointer;
d258b828 10206 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
10207 if (gotfree_input_line)
10208 input_line_pointer = gotfree_input_line;
10209
10210 expression (exp);
10211
10212 if (gotfree_input_line)
10213 {
10214 /* expression () has merrily parsed up to the end of line,
10215 or a comma - in the wrong buffer. Transfer how far
10216 input_line_pointer has moved to the right buffer. */
10217 input_line_pointer = (save
10218 + (input_line_pointer - gotfree_input_line)
10219 + adjust);
10220 free (gotfree_input_line);
3992d3b7
AM
10221 if (exp->X_op == O_constant
10222 || exp->X_op == O_absent
10223 || exp->X_op == O_illegal
0398aac5 10224 || exp->X_op == O_register
3992d3b7
AM
10225 || exp->X_op == O_big)
10226 {
10227 char c = *input_line_pointer;
10228 *input_line_pointer = 0;
10229 as_bad (_("missing or invalid expression `%s'"), save);
10230 *input_line_pointer = c;
10231 }
b9519cfe
L
10232 else if ((got_reloc == BFD_RELOC_386_PLT32
10233 || got_reloc == BFD_RELOC_X86_64_PLT32)
10234 && exp->X_op != O_symbol)
10235 {
10236 char c = *input_line_pointer;
10237 *input_line_pointer = 0;
10238 as_bad (_("invalid PLT expression `%s'"), save);
10239 *input_line_pointer = c;
10240 }
f3c180ae
AM
10241 }
10242 }
10243 else
10244 expression (exp);
ee86248c
JB
10245
10246 intel_syntax = -intel_syntax;
10247
10248 if (intel_syntax)
10249 i386_intel_simplify (exp);
62ebcb5c
AM
10250
10251 return got_reloc;
f3c180ae 10252}
f3c180ae 10253
9f32dd5b
L
10254static void
10255signed_cons (int size)
6482c264 10256{
d182319b
JB
10257 if (flag_code == CODE_64BIT)
10258 cons_sign = 1;
10259 cons (size);
10260 cons_sign = -1;
6482c264
NC
10261}
10262
d182319b 10263#ifdef TE_PE
6482c264 10264static void
7016a5d5 10265pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
10266{
10267 expressionS exp;
10268
10269 do
10270 {
10271 expression (&exp);
10272 if (exp.X_op == O_symbol)
10273 exp.X_op = O_secrel;
10274
10275 emit_expr (&exp, 4);
10276 }
10277 while (*input_line_pointer++ == ',');
10278
10279 input_line_pointer--;
10280 demand_empty_rest_of_line ();
10281}
6482c264
NC
10282#endif
10283
43234a1e
L
10284/* Handle Vector operations. */
10285
10286static char *
10287check_VecOperations (char *op_string, char *op_end)
10288{
10289 const reg_entry *mask;
10290 const char *saved;
10291 char *end_op;
10292
10293 while (*op_string
10294 && (op_end == NULL || op_string < op_end))
10295 {
10296 saved = op_string;
10297 if (*op_string == '{')
10298 {
10299 op_string++;
10300
10301 /* Check broadcasts. */
10302 if (strncmp (op_string, "1to", 3) == 0)
10303 {
10304 int bcst_type;
10305
10306 if (i.broadcast)
10307 goto duplicated_vec_op;
10308
10309 op_string += 3;
10310 if (*op_string == '8')
8e6e0792 10311 bcst_type = 8;
b28d1bda 10312 else if (*op_string == '4')
8e6e0792 10313 bcst_type = 4;
b28d1bda 10314 else if (*op_string == '2')
8e6e0792 10315 bcst_type = 2;
43234a1e
L
10316 else if (*op_string == '1'
10317 && *(op_string+1) == '6')
10318 {
8e6e0792 10319 bcst_type = 16;
43234a1e
L
10320 op_string++;
10321 }
10322 else
10323 {
10324 as_bad (_("Unsupported broadcast: `%s'"), saved);
10325 return NULL;
10326 }
10327 op_string++;
10328
10329 broadcast_op.type = bcst_type;
10330 broadcast_op.operand = this_operand;
1f75763a 10331 broadcast_op.bytes = 0;
43234a1e
L
10332 i.broadcast = &broadcast_op;
10333 }
10334 /* Check masking operation. */
10335 else if ((mask = parse_register (op_string, &end_op)) != NULL)
10336 {
8a6fb3f9
JB
10337 if (mask == &bad_reg)
10338 return NULL;
10339
43234a1e 10340 /* k0 can't be used for write mask. */
f74a6307 10341 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 10342 {
6d2cd6b2
JB
10343 as_bad (_("`%s%s' can't be used for write mask"),
10344 register_prefix, mask->reg_name);
43234a1e
L
10345 return NULL;
10346 }
10347
10348 if (!i.mask)
10349 {
10350 mask_op.mask = mask;
10351 mask_op.zeroing = 0;
10352 mask_op.operand = this_operand;
10353 i.mask = &mask_op;
10354 }
10355 else
10356 {
10357 if (i.mask->mask)
10358 goto duplicated_vec_op;
10359
10360 i.mask->mask = mask;
10361
10362 /* Only "{z}" is allowed here. No need to check
10363 zeroing mask explicitly. */
10364 if (i.mask->operand != this_operand)
10365 {
10366 as_bad (_("invalid write mask `%s'"), saved);
10367 return NULL;
10368 }
10369 }
10370
10371 op_string = end_op;
10372 }
10373 /* Check zeroing-flag for masking operation. */
10374 else if (*op_string == 'z')
10375 {
10376 if (!i.mask)
10377 {
10378 mask_op.mask = NULL;
10379 mask_op.zeroing = 1;
10380 mask_op.operand = this_operand;
10381 i.mask = &mask_op;
10382 }
10383 else
10384 {
10385 if (i.mask->zeroing)
10386 {
10387 duplicated_vec_op:
10388 as_bad (_("duplicated `%s'"), saved);
10389 return NULL;
10390 }
10391
10392 i.mask->zeroing = 1;
10393
10394 /* Only "{%k}" is allowed here. No need to check mask
10395 register explicitly. */
10396 if (i.mask->operand != this_operand)
10397 {
10398 as_bad (_("invalid zeroing-masking `%s'"),
10399 saved);
10400 return NULL;
10401 }
10402 }
10403
10404 op_string++;
10405 }
10406 else
10407 goto unknown_vec_op;
10408
10409 if (*op_string != '}')
10410 {
10411 as_bad (_("missing `}' in `%s'"), saved);
10412 return NULL;
10413 }
10414 op_string++;
0ba3a731
L
10415
10416 /* Strip whitespace since the addition of pseudo prefixes
10417 changed how the scrubber treats '{'. */
10418 if (is_space_char (*op_string))
10419 ++op_string;
10420
43234a1e
L
10421 continue;
10422 }
10423 unknown_vec_op:
10424 /* We don't know this one. */
10425 as_bad (_("unknown vector operation: `%s'"), saved);
10426 return NULL;
10427 }
10428
6d2cd6b2
JB
10429 if (i.mask && i.mask->zeroing && !i.mask->mask)
10430 {
10431 as_bad (_("zeroing-masking only allowed with write mask"));
10432 return NULL;
10433 }
10434
43234a1e
L
10435 return op_string;
10436}
10437
252b5132 10438static int
70e41ade 10439i386_immediate (char *imm_start)
252b5132
RH
10440{
10441 char *save_input_line_pointer;
f3c180ae 10442 char *gotfree_input_line;
252b5132 10443 segT exp_seg = 0;
47926f60 10444 expressionS *exp;
40fb9820
L
10445 i386_operand_type types;
10446
0dfbf9d7 10447 operand_type_set (&types, ~0);
252b5132
RH
10448
10449 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
10450 {
31b2323c
L
10451 as_bad (_("at most %d immediate operands are allowed"),
10452 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
10453 return 0;
10454 }
10455
10456 exp = &im_expressions[i.imm_operands++];
520dc8e8 10457 i.op[this_operand].imms = exp;
252b5132
RH
10458
10459 if (is_space_char (*imm_start))
10460 ++imm_start;
10461
10462 save_input_line_pointer = input_line_pointer;
10463 input_line_pointer = imm_start;
10464
d258b828 10465 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10466 if (gotfree_input_line)
10467 input_line_pointer = gotfree_input_line;
252b5132
RH
10468
10469 exp_seg = expression (exp);
10470
83183c0c 10471 SKIP_WHITESPACE ();
43234a1e
L
10472
10473 /* Handle vector operations. */
10474 if (*input_line_pointer == '{')
10475 {
10476 input_line_pointer = check_VecOperations (input_line_pointer,
10477 NULL);
10478 if (input_line_pointer == NULL)
10479 return 0;
10480 }
10481
252b5132 10482 if (*input_line_pointer)
f3c180ae 10483 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
10484
10485 input_line_pointer = save_input_line_pointer;
f3c180ae 10486 if (gotfree_input_line)
ee86248c
JB
10487 {
10488 free (gotfree_input_line);
10489
10490 if (exp->X_op == O_constant || exp->X_op == O_register)
10491 exp->X_op = O_illegal;
10492 }
10493
10494 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
10495}
252b5132 10496
ee86248c
JB
10497static int
10498i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10499 i386_operand_type types, const char *imm_start)
10500{
10501 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 10502 {
313c53d1
L
10503 if (imm_start)
10504 as_bad (_("missing or invalid immediate expression `%s'"),
10505 imm_start);
3992d3b7 10506 return 0;
252b5132 10507 }
3e73aa7c 10508 else if (exp->X_op == O_constant)
252b5132 10509 {
47926f60 10510 /* Size it properly later. */
40fb9820 10511 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
10512 /* If not 64bit, sign extend val. */
10513 if (flag_code != CODE_64BIT
4eed87de
AM
10514 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
10515 exp->X_add_number
10516 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 10517 }
4c63da97 10518#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 10519 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 10520 && exp_seg != absolute_section
47926f60 10521 && exp_seg != text_section
24eab124
AM
10522 && exp_seg != data_section
10523 && exp_seg != bss_section
10524 && exp_seg != undefined_section
f86103b7 10525 && !bfd_is_com_section (exp_seg))
252b5132 10526 {
d0b47220 10527 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
10528 return 0;
10529 }
10530#endif
a841bdf5 10531 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 10532 {
313c53d1
L
10533 if (imm_start)
10534 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
10535 return 0;
10536 }
252b5132
RH
10537 else
10538 {
10539 /* This is an address. The size of the address will be
24eab124 10540 determined later, depending on destination register,
3e73aa7c 10541 suffix, or the default for the section. */
40fb9820
L
10542 i.types[this_operand].bitfield.imm8 = 1;
10543 i.types[this_operand].bitfield.imm16 = 1;
10544 i.types[this_operand].bitfield.imm32 = 1;
10545 i.types[this_operand].bitfield.imm32s = 1;
10546 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
10547 i.types[this_operand] = operand_type_and (i.types[this_operand],
10548 types);
252b5132
RH
10549 }
10550
10551 return 1;
10552}
10553
551c1ca1 10554static char *
e3bb37b5 10555i386_scale (char *scale)
252b5132 10556{
551c1ca1
AM
10557 offsetT val;
10558 char *save = input_line_pointer;
252b5132 10559
551c1ca1
AM
10560 input_line_pointer = scale;
10561 val = get_absolute_expression ();
10562
10563 switch (val)
252b5132 10564 {
551c1ca1 10565 case 1:
252b5132
RH
10566 i.log2_scale_factor = 0;
10567 break;
551c1ca1 10568 case 2:
252b5132
RH
10569 i.log2_scale_factor = 1;
10570 break;
551c1ca1 10571 case 4:
252b5132
RH
10572 i.log2_scale_factor = 2;
10573 break;
551c1ca1 10574 case 8:
252b5132
RH
10575 i.log2_scale_factor = 3;
10576 break;
10577 default:
a724f0f4
JB
10578 {
10579 char sep = *input_line_pointer;
10580
10581 *input_line_pointer = '\0';
10582 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
10583 scale);
10584 *input_line_pointer = sep;
10585 input_line_pointer = save;
10586 return NULL;
10587 }
252b5132 10588 }
29b0f896 10589 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
10590 {
10591 as_warn (_("scale factor of %d without an index register"),
24eab124 10592 1 << i.log2_scale_factor);
252b5132 10593 i.log2_scale_factor = 0;
252b5132 10594 }
551c1ca1
AM
10595 scale = input_line_pointer;
10596 input_line_pointer = save;
10597 return scale;
252b5132
RH
10598}
10599
252b5132 10600static int
e3bb37b5 10601i386_displacement (char *disp_start, char *disp_end)
252b5132 10602{
29b0f896 10603 expressionS *exp;
252b5132
RH
10604 segT exp_seg = 0;
10605 char *save_input_line_pointer;
f3c180ae 10606 char *gotfree_input_line;
40fb9820
L
10607 int override;
10608 i386_operand_type bigdisp, types = anydisp;
3992d3b7 10609 int ret;
252b5132 10610
31b2323c
L
10611 if (i.disp_operands == MAX_MEMORY_OPERANDS)
10612 {
10613 as_bad (_("at most %d displacement operands are allowed"),
10614 MAX_MEMORY_OPERANDS);
10615 return 0;
10616 }
10617
0dfbf9d7 10618 operand_type_set (&bigdisp, 0);
6f2f06be 10619 if (i.jumpabsolute
48bcea9f 10620 || i.types[this_operand].bitfield.baseindex
0cfa3eb3
JB
10621 || (current_templates->start->opcode_modifier.jump != JUMP
10622 && current_templates->start->opcode_modifier.jump != JUMP_DWORD))
e05278af 10623 {
48bcea9f 10624 i386_addressing_mode ();
e05278af 10625 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
10626 if (flag_code == CODE_64BIT)
10627 {
10628 if (!override)
10629 {
10630 bigdisp.bitfield.disp32s = 1;
10631 bigdisp.bitfield.disp64 = 1;
10632 }
48bcea9f
JB
10633 else
10634 bigdisp.bitfield.disp32 = 1;
40fb9820
L
10635 }
10636 else if ((flag_code == CODE_16BIT) ^ override)
40fb9820 10637 bigdisp.bitfield.disp16 = 1;
48bcea9f
JB
10638 else
10639 bigdisp.bitfield.disp32 = 1;
e05278af
JB
10640 }
10641 else
10642 {
376cd056
JB
10643 /* For PC-relative branches, the width of the displacement may be
10644 dependent upon data size, but is never dependent upon address size.
10645 Also make sure to not unintentionally match against a non-PC-relative
10646 branch template. */
10647 static templates aux_templates;
10648 const insn_template *t = current_templates->start;
10649 bfd_boolean has_intel64 = FALSE;
10650
10651 aux_templates.start = t;
10652 while (++t < current_templates->end)
10653 {
10654 if (t->opcode_modifier.jump
10655 != current_templates->start->opcode_modifier.jump)
10656 break;
4b5aaf5f 10657 if ((t->opcode_modifier.isa64 >= INTEL64))
376cd056
JB
10658 has_intel64 = TRUE;
10659 }
10660 if (t < current_templates->end)
10661 {
10662 aux_templates.end = t;
10663 current_templates = &aux_templates;
10664 }
10665
e05278af 10666 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
10667 if (flag_code == CODE_64BIT)
10668 {
376cd056
JB
10669 if ((override || i.suffix == WORD_MNEM_SUFFIX)
10670 && (!intel64 || !has_intel64))
40fb9820
L
10671 bigdisp.bitfield.disp16 = 1;
10672 else
48bcea9f 10673 bigdisp.bitfield.disp32s = 1;
40fb9820
L
10674 }
10675 else
e05278af
JB
10676 {
10677 if (!override)
10678 override = (i.suffix == (flag_code != CODE_16BIT
10679 ? WORD_MNEM_SUFFIX
10680 : LONG_MNEM_SUFFIX));
40fb9820
L
10681 bigdisp.bitfield.disp32 = 1;
10682 if ((flag_code == CODE_16BIT) ^ override)
10683 {
10684 bigdisp.bitfield.disp32 = 0;
10685 bigdisp.bitfield.disp16 = 1;
10686 }
e05278af 10687 }
e05278af 10688 }
c6fb90c8
L
10689 i.types[this_operand] = operand_type_or (i.types[this_operand],
10690 bigdisp);
252b5132
RH
10691
10692 exp = &disp_expressions[i.disp_operands];
520dc8e8 10693 i.op[this_operand].disps = exp;
252b5132
RH
10694 i.disp_operands++;
10695 save_input_line_pointer = input_line_pointer;
10696 input_line_pointer = disp_start;
10697 END_STRING_AND_SAVE (disp_end);
10698
10699#ifndef GCC_ASM_O_HACK
10700#define GCC_ASM_O_HACK 0
10701#endif
10702#if GCC_ASM_O_HACK
10703 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 10704 if (i.types[this_operand].bitfield.baseIndex
24eab124 10705 && displacement_string_end[-1] == '+')
252b5132
RH
10706 {
10707 /* This hack is to avoid a warning when using the "o"
24eab124
AM
10708 constraint within gcc asm statements.
10709 For instance:
10710
10711 #define _set_tssldt_desc(n,addr,limit,type) \
10712 __asm__ __volatile__ ( \
10713 "movw %w2,%0\n\t" \
10714 "movw %w1,2+%0\n\t" \
10715 "rorl $16,%1\n\t" \
10716 "movb %b1,4+%0\n\t" \
10717 "movb %4,5+%0\n\t" \
10718 "movb $0,6+%0\n\t" \
10719 "movb %h1,7+%0\n\t" \
10720 "rorl $16,%1" \
10721 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
10722
10723 This works great except that the output assembler ends
10724 up looking a bit weird if it turns out that there is
10725 no offset. You end up producing code that looks like:
10726
10727 #APP
10728 movw $235,(%eax)
10729 movw %dx,2+(%eax)
10730 rorl $16,%edx
10731 movb %dl,4+(%eax)
10732 movb $137,5+(%eax)
10733 movb $0,6+(%eax)
10734 movb %dh,7+(%eax)
10735 rorl $16,%edx
10736 #NO_APP
10737
47926f60 10738 So here we provide the missing zero. */
24eab124
AM
10739
10740 *displacement_string_end = '0';
252b5132
RH
10741 }
10742#endif
d258b828 10743 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10744 if (gotfree_input_line)
10745 input_line_pointer = gotfree_input_line;
252b5132 10746
24eab124 10747 exp_seg = expression (exp);
252b5132 10748
636c26b0
AM
10749 SKIP_WHITESPACE ();
10750 if (*input_line_pointer)
10751 as_bad (_("junk `%s' after expression"), input_line_pointer);
10752#if GCC_ASM_O_HACK
10753 RESTORE_END_STRING (disp_end + 1);
10754#endif
636c26b0 10755 input_line_pointer = save_input_line_pointer;
636c26b0 10756 if (gotfree_input_line)
ee86248c
JB
10757 {
10758 free (gotfree_input_line);
10759
10760 if (exp->X_op == O_constant || exp->X_op == O_register)
10761 exp->X_op = O_illegal;
10762 }
10763
10764 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
10765
10766 RESTORE_END_STRING (disp_end);
10767
10768 return ret;
10769}
10770
10771static int
10772i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10773 i386_operand_type types, const char *disp_start)
10774{
10775 i386_operand_type bigdisp;
10776 int ret = 1;
636c26b0 10777
24eab124
AM
10778 /* We do this to make sure that the section symbol is in
10779 the symbol table. We will ultimately change the relocation
47926f60 10780 to be relative to the beginning of the section. */
1ae12ab7 10781 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
10782 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
10783 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 10784 {
636c26b0 10785 if (exp->X_op != O_symbol)
3992d3b7 10786 goto inv_disp;
636c26b0 10787
e5cb08ac 10788 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
10789 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
10790 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 10791 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
10792 exp->X_op = O_subtract;
10793 exp->X_op_symbol = GOT_symbol;
1ae12ab7 10794 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 10795 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
10796 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
10797 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 10798 else
29b0f896 10799 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 10800 }
252b5132 10801
3992d3b7
AM
10802 else if (exp->X_op == O_absent
10803 || exp->X_op == O_illegal
ee86248c 10804 || exp->X_op == O_big)
2daf4fd8 10805 {
3992d3b7
AM
10806 inv_disp:
10807 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 10808 disp_start);
3992d3b7 10809 ret = 0;
2daf4fd8
AM
10810 }
10811
0e1147d9
L
10812 else if (flag_code == CODE_64BIT
10813 && !i.prefix[ADDR_PREFIX]
10814 && exp->X_op == O_constant)
10815 {
10816 /* Since displacement is signed extended to 64bit, don't allow
10817 disp32 and turn off disp32s if they are out of range. */
10818 i.types[this_operand].bitfield.disp32 = 0;
10819 if (!fits_in_signed_long (exp->X_add_number))
10820 {
10821 i.types[this_operand].bitfield.disp32s = 0;
10822 if (i.types[this_operand].bitfield.baseindex)
10823 {
10824 as_bad (_("0x%lx out range of signed 32bit displacement"),
10825 (long) exp->X_add_number);
10826 ret = 0;
10827 }
10828 }
10829 }
10830
4c63da97 10831#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
10832 else if (exp->X_op != O_constant
10833 && OUTPUT_FLAVOR == bfd_target_aout_flavour
10834 && exp_seg != absolute_section
10835 && exp_seg != text_section
10836 && exp_seg != data_section
10837 && exp_seg != bss_section
10838 && exp_seg != undefined_section
10839 && !bfd_is_com_section (exp_seg))
24eab124 10840 {
d0b47220 10841 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 10842 ret = 0;
24eab124 10843 }
252b5132 10844#endif
3956db08 10845
48bcea9f
JB
10846 if (current_templates->start->opcode_modifier.jump == JUMP_BYTE
10847 /* Constants get taken care of by optimize_disp(). */
10848 && exp->X_op != O_constant)
10849 i.types[this_operand].bitfield.disp8 = 1;
10850
40fb9820
L
10851 /* Check if this is a displacement only operand. */
10852 bigdisp = i.types[this_operand];
10853 bigdisp.bitfield.disp8 = 0;
10854 bigdisp.bitfield.disp16 = 0;
10855 bigdisp.bitfield.disp32 = 0;
10856 bigdisp.bitfield.disp32s = 0;
10857 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 10858 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
10859 i.types[this_operand] = operand_type_and (i.types[this_operand],
10860 types);
3956db08 10861
3992d3b7 10862 return ret;
252b5132
RH
10863}
10864
2abc2bec
JB
10865/* Return the active addressing mode, taking address override and
10866 registers forming the address into consideration. Update the
10867 address override prefix if necessary. */
47926f60 10868
2abc2bec
JB
10869static enum flag_code
10870i386_addressing_mode (void)
252b5132 10871{
be05d201
L
10872 enum flag_code addr_mode;
10873
10874 if (i.prefix[ADDR_PREFIX])
10875 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
a23b33b3
JB
10876 else if (flag_code == CODE_16BIT
10877 && current_templates->start->cpu_flags.bitfield.cpumpx
10878 /* Avoid replacing the "16-bit addressing not allowed" diagnostic
10879 from md_assemble() by "is not a valid base/index expression"
10880 when there is a base and/or index. */
10881 && !i.types[this_operand].bitfield.baseindex)
10882 {
10883 /* MPX insn memory operands with neither base nor index must be forced
10884 to use 32-bit addressing in 16-bit mode. */
10885 addr_mode = CODE_32BIT;
10886 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10887 ++i.prefixes;
10888 gas_assert (!i.types[this_operand].bitfield.disp16);
10889 gas_assert (!i.types[this_operand].bitfield.disp32);
10890 }
be05d201
L
10891 else
10892 {
10893 addr_mode = flag_code;
10894
24eab124 10895#if INFER_ADDR_PREFIX
be05d201
L
10896 if (i.mem_operands == 0)
10897 {
10898 /* Infer address prefix from the first memory operand. */
10899 const reg_entry *addr_reg = i.base_reg;
10900
10901 if (addr_reg == NULL)
10902 addr_reg = i.index_reg;
eecb386c 10903
be05d201
L
10904 if (addr_reg)
10905 {
e968fc9b 10906 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
10907 addr_mode = CODE_32BIT;
10908 else if (flag_code != CODE_64BIT
dc821c5f 10909 && addr_reg->reg_type.bitfield.word)
be05d201
L
10910 addr_mode = CODE_16BIT;
10911
10912 if (addr_mode != flag_code)
10913 {
10914 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10915 i.prefixes += 1;
10916 /* Change the size of any displacement too. At most one
10917 of Disp16 or Disp32 is set.
10918 FIXME. There doesn't seem to be any real need for
10919 separate Disp16 and Disp32 flags. The same goes for
10920 Imm16 and Imm32. Removing them would probably clean
10921 up the code quite a lot. */
10922 if (flag_code != CODE_64BIT
10923 && (i.types[this_operand].bitfield.disp16
10924 || i.types[this_operand].bitfield.disp32))
10925 i.types[this_operand]
10926 = operand_type_xor (i.types[this_operand], disp16_32);
10927 }
10928 }
10929 }
24eab124 10930#endif
be05d201
L
10931 }
10932
2abc2bec
JB
10933 return addr_mode;
10934}
10935
10936/* Make sure the memory operand we've been dealt is valid.
10937 Return 1 on success, 0 on a failure. */
10938
10939static int
10940i386_index_check (const char *operand_string)
10941{
10942 const char *kind = "base/index";
10943 enum flag_code addr_mode = i386_addressing_mode ();
10944
fc0763e6 10945 if (current_templates->start->opcode_modifier.isstring
c3949f43 10946 && !current_templates->start->cpu_flags.bitfield.cpupadlock
fc0763e6
JB
10947 && (current_templates->end[-1].opcode_modifier.isstring
10948 || i.mem_operands))
10949 {
10950 /* Memory operands of string insns are special in that they only allow
10951 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
10952 const reg_entry *expected_reg;
10953 static const char *di_si[][2] =
10954 {
10955 { "esi", "edi" },
10956 { "si", "di" },
10957 { "rsi", "rdi" }
10958 };
10959 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
10960
10961 kind = "string address";
10962
8325cc63 10963 if (current_templates->start->opcode_modifier.repprefixok)
fc0763e6 10964 {
51c8edf6
JB
10965 int es_op = current_templates->end[-1].opcode_modifier.isstring
10966 - IS_STRING_ES_OP0;
10967 int op = 0;
fc0763e6 10968
51c8edf6 10969 if (!current_templates->end[-1].operand_types[0].bitfield.baseindex
fc0763e6
JB
10970 || ((!i.mem_operands != !intel_syntax)
10971 && current_templates->end[-1].operand_types[1]
10972 .bitfield.baseindex))
51c8edf6
JB
10973 op = 1;
10974 expected_reg = hash_find (reg_hash, di_si[addr_mode][op == es_op]);
fc0763e6
JB
10975 }
10976 else
be05d201 10977 expected_reg = hash_find (reg_hash, bx[addr_mode]);
fc0763e6 10978
be05d201
L
10979 if (i.base_reg != expected_reg
10980 || i.index_reg
fc0763e6 10981 || operand_type_check (i.types[this_operand], disp))
fc0763e6 10982 {
be05d201
L
10983 /* The second memory operand must have the same size as
10984 the first one. */
10985 if (i.mem_operands
10986 && i.base_reg
10987 && !((addr_mode == CODE_64BIT
dc821c5f 10988 && i.base_reg->reg_type.bitfield.qword)
be05d201 10989 || (addr_mode == CODE_32BIT
dc821c5f
JB
10990 ? i.base_reg->reg_type.bitfield.dword
10991 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
10992 goto bad_address;
10993
fc0763e6
JB
10994 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
10995 operand_string,
10996 intel_syntax ? '[' : '(',
10997 register_prefix,
be05d201 10998 expected_reg->reg_name,
fc0763e6 10999 intel_syntax ? ']' : ')');
be05d201 11000 return 1;
fc0763e6 11001 }
be05d201
L
11002 else
11003 return 1;
11004
dc1e8a47 11005 bad_address:
be05d201
L
11006 as_bad (_("`%s' is not a valid %s expression"),
11007 operand_string, kind);
11008 return 0;
3e73aa7c
JH
11009 }
11010 else
11011 {
be05d201
L
11012 if (addr_mode != CODE_16BIT)
11013 {
11014 /* 32-bit/64-bit checks. */
11015 if ((i.base_reg
e968fc9b
JB
11016 && ((addr_mode == CODE_64BIT
11017 ? !i.base_reg->reg_type.bitfield.qword
11018 : !i.base_reg->reg_type.bitfield.dword)
11019 || (i.index_reg && i.base_reg->reg_num == RegIP)
11020 || i.base_reg->reg_num == RegIZ))
be05d201 11021 || (i.index_reg
1b54b8d7
JB
11022 && !i.index_reg->reg_type.bitfield.xmmword
11023 && !i.index_reg->reg_type.bitfield.ymmword
11024 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 11025 && ((addr_mode == CODE_64BIT
e968fc9b
JB
11026 ? !i.index_reg->reg_type.bitfield.qword
11027 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
11028 || !i.index_reg->reg_type.bitfield.baseindex)))
11029 goto bad_address;
8178be5b 11030
260cd341 11031 /* bndmk, bndldx, bndstx and mandatory non-vector SIB have special restrictions. */
8178be5b 11032 if (current_templates->start->base_opcode == 0xf30f1b
260cd341
LC
11033 || (current_templates->start->base_opcode & ~1) == 0x0f1a
11034 || current_templates->start->opcode_modifier.sib == SIBMEM)
8178be5b
JB
11035 {
11036 /* They cannot use RIP-relative addressing. */
e968fc9b 11037 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
11038 {
11039 as_bad (_("`%s' cannot be used here"), operand_string);
11040 return 0;
11041 }
11042
11043 /* bndldx and bndstx ignore their scale factor. */
260cd341 11044 if ((current_templates->start->base_opcode & ~1) == 0x0f1a
8178be5b
JB
11045 && i.log2_scale_factor)
11046 as_warn (_("register scaling is being ignored here"));
11047 }
be05d201
L
11048 }
11049 else
3e73aa7c 11050 {
be05d201 11051 /* 16-bit checks. */
3e73aa7c 11052 if ((i.base_reg
dc821c5f 11053 && (!i.base_reg->reg_type.bitfield.word
40fb9820 11054 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 11055 || (i.index_reg
dc821c5f 11056 && (!i.index_reg->reg_type.bitfield.word
40fb9820 11057 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
11058 || !(i.base_reg
11059 && i.base_reg->reg_num < 6
11060 && i.index_reg->reg_num >= 6
11061 && i.log2_scale_factor == 0))))
be05d201 11062 goto bad_address;
3e73aa7c
JH
11063 }
11064 }
be05d201 11065 return 1;
24eab124 11066}
252b5132 11067
43234a1e
L
11068/* Handle vector immediates. */
11069
11070static int
11071RC_SAE_immediate (const char *imm_start)
11072{
11073 unsigned int match_found, j;
11074 const char *pstr = imm_start;
11075 expressionS *exp;
11076
11077 if (*pstr != '{')
11078 return 0;
11079
11080 pstr++;
11081 match_found = 0;
11082 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
11083 {
11084 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
11085 {
11086 if (!i.rounding)
11087 {
11088 rc_op.type = RC_NamesTable[j].type;
11089 rc_op.operand = this_operand;
11090 i.rounding = &rc_op;
11091 }
11092 else
11093 {
11094 as_bad (_("duplicated `%s'"), imm_start);
11095 return 0;
11096 }
11097 pstr += RC_NamesTable[j].len;
11098 match_found = 1;
11099 break;
11100 }
11101 }
11102 if (!match_found)
11103 return 0;
11104
11105 if (*pstr++ != '}')
11106 {
11107 as_bad (_("Missing '}': '%s'"), imm_start);
11108 return 0;
11109 }
11110 /* RC/SAE immediate string should contain nothing more. */;
11111 if (*pstr != 0)
11112 {
11113 as_bad (_("Junk after '}': '%s'"), imm_start);
11114 return 0;
11115 }
11116
11117 exp = &im_expressions[i.imm_operands++];
11118 i.op[this_operand].imms = exp;
11119
11120 exp->X_op = O_constant;
11121 exp->X_add_number = 0;
11122 exp->X_add_symbol = (symbolS *) 0;
11123 exp->X_op_symbol = (symbolS *) 0;
11124
11125 i.types[this_operand].bitfield.imm8 = 1;
11126 return 1;
11127}
11128
8325cc63
JB
11129/* Only string instructions can have a second memory operand, so
11130 reduce current_templates to just those if it contains any. */
11131static int
11132maybe_adjust_templates (void)
11133{
11134 const insn_template *t;
11135
11136 gas_assert (i.mem_operands == 1);
11137
11138 for (t = current_templates->start; t < current_templates->end; ++t)
11139 if (t->opcode_modifier.isstring)
11140 break;
11141
11142 if (t < current_templates->end)
11143 {
11144 static templates aux_templates;
11145 bfd_boolean recheck;
11146
11147 aux_templates.start = t;
11148 for (; t < current_templates->end; ++t)
11149 if (!t->opcode_modifier.isstring)
11150 break;
11151 aux_templates.end = t;
11152
11153 /* Determine whether to re-check the first memory operand. */
11154 recheck = (aux_templates.start != current_templates->start
11155 || t != current_templates->end);
11156
11157 current_templates = &aux_templates;
11158
11159 if (recheck)
11160 {
11161 i.mem_operands = 0;
11162 if (i.memop1_string != NULL
11163 && i386_index_check (i.memop1_string) == 0)
11164 return 0;
11165 i.mem_operands = 1;
11166 }
11167 }
11168
11169 return 1;
11170}
11171
fc0763e6 11172/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 11173 on error. */
252b5132 11174
252b5132 11175static int
a7619375 11176i386_att_operand (char *operand_string)
252b5132 11177{
af6bdddf
AM
11178 const reg_entry *r;
11179 char *end_op;
24eab124 11180 char *op_string = operand_string;
252b5132 11181
24eab124 11182 if (is_space_char (*op_string))
252b5132
RH
11183 ++op_string;
11184
24eab124 11185 /* We check for an absolute prefix (differentiating,
47926f60 11186 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
11187 if (*op_string == ABSOLUTE_PREFIX)
11188 {
11189 ++op_string;
11190 if (is_space_char (*op_string))
11191 ++op_string;
6f2f06be 11192 i.jumpabsolute = TRUE;
24eab124 11193 }
252b5132 11194
47926f60 11195 /* Check if operand is a register. */
4d1bb795 11196 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 11197 {
40fb9820
L
11198 i386_operand_type temp;
11199
8a6fb3f9
JB
11200 if (r == &bad_reg)
11201 return 0;
11202
24eab124
AM
11203 /* Check for a segment override by searching for ':' after a
11204 segment register. */
11205 op_string = end_op;
11206 if (is_space_char (*op_string))
11207 ++op_string;
00cee14f 11208 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124
AM
11209 {
11210 switch (r->reg_num)
11211 {
11212 case 0:
11213 i.seg[i.mem_operands] = &es;
11214 break;
11215 case 1:
11216 i.seg[i.mem_operands] = &cs;
11217 break;
11218 case 2:
11219 i.seg[i.mem_operands] = &ss;
11220 break;
11221 case 3:
11222 i.seg[i.mem_operands] = &ds;
11223 break;
11224 case 4:
11225 i.seg[i.mem_operands] = &fs;
11226 break;
11227 case 5:
11228 i.seg[i.mem_operands] = &gs;
11229 break;
11230 }
252b5132 11231
24eab124 11232 /* Skip the ':' and whitespace. */
252b5132
RH
11233 ++op_string;
11234 if (is_space_char (*op_string))
24eab124 11235 ++op_string;
252b5132 11236
24eab124
AM
11237 if (!is_digit_char (*op_string)
11238 && !is_identifier_char (*op_string)
11239 && *op_string != '('
11240 && *op_string != ABSOLUTE_PREFIX)
11241 {
11242 as_bad (_("bad memory operand `%s'"), op_string);
11243 return 0;
11244 }
47926f60 11245 /* Handle case of %es:*foo. */
24eab124
AM
11246 if (*op_string == ABSOLUTE_PREFIX)
11247 {
11248 ++op_string;
11249 if (is_space_char (*op_string))
11250 ++op_string;
6f2f06be 11251 i.jumpabsolute = TRUE;
24eab124
AM
11252 }
11253 goto do_memory_reference;
11254 }
43234a1e
L
11255
11256 /* Handle vector operations. */
11257 if (*op_string == '{')
11258 {
11259 op_string = check_VecOperations (op_string, NULL);
11260 if (op_string == NULL)
11261 return 0;
11262 }
11263
24eab124
AM
11264 if (*op_string)
11265 {
d0b47220 11266 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
11267 return 0;
11268 }
40fb9820
L
11269 temp = r->reg_type;
11270 temp.bitfield.baseindex = 0;
c6fb90c8
L
11271 i.types[this_operand] = operand_type_or (i.types[this_operand],
11272 temp);
7d5e4556 11273 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 11274 i.op[this_operand].regs = r;
24eab124
AM
11275 i.reg_operands++;
11276 }
af6bdddf
AM
11277 else if (*op_string == REGISTER_PREFIX)
11278 {
11279 as_bad (_("bad register name `%s'"), op_string);
11280 return 0;
11281 }
24eab124 11282 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 11283 {
24eab124 11284 ++op_string;
6f2f06be 11285 if (i.jumpabsolute)
24eab124 11286 {
d0b47220 11287 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
11288 return 0;
11289 }
11290 if (!i386_immediate (op_string))
11291 return 0;
11292 }
43234a1e
L
11293 else if (RC_SAE_immediate (operand_string))
11294 {
11295 /* If it is a RC or SAE immediate, do nothing. */
11296 ;
11297 }
24eab124
AM
11298 else if (is_digit_char (*op_string)
11299 || is_identifier_char (*op_string)
d02603dc 11300 || *op_string == '"'
e5cb08ac 11301 || *op_string == '(')
24eab124 11302 {
47926f60 11303 /* This is a memory reference of some sort. */
af6bdddf 11304 char *base_string;
252b5132 11305
47926f60 11306 /* Start and end of displacement string expression (if found). */
eecb386c
AM
11307 char *displacement_string_start;
11308 char *displacement_string_end;
43234a1e 11309 char *vop_start;
252b5132 11310
24eab124 11311 do_memory_reference:
8325cc63
JB
11312 if (i.mem_operands == 1 && !maybe_adjust_templates ())
11313 return 0;
24eab124 11314 if ((i.mem_operands == 1
40fb9820 11315 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
11316 || i.mem_operands == 2)
11317 {
11318 as_bad (_("too many memory references for `%s'"),
11319 current_templates->start->name);
11320 return 0;
11321 }
252b5132 11322
24eab124
AM
11323 /* Check for base index form. We detect the base index form by
11324 looking for an ')' at the end of the operand, searching
11325 for the '(' matching it, and finding a REGISTER_PREFIX or ','
11326 after the '('. */
af6bdddf 11327 base_string = op_string + strlen (op_string);
c3332e24 11328
43234a1e
L
11329 /* Handle vector operations. */
11330 vop_start = strchr (op_string, '{');
11331 if (vop_start && vop_start < base_string)
11332 {
11333 if (check_VecOperations (vop_start, base_string) == NULL)
11334 return 0;
11335 base_string = vop_start;
11336 }
11337
af6bdddf
AM
11338 --base_string;
11339 if (is_space_char (*base_string))
11340 --base_string;
252b5132 11341
47926f60 11342 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
11343 displacement_string_start = op_string;
11344 displacement_string_end = base_string + 1;
252b5132 11345
24eab124
AM
11346 if (*base_string == ')')
11347 {
af6bdddf 11348 char *temp_string;
24eab124
AM
11349 unsigned int parens_balanced = 1;
11350 /* We've already checked that the number of left & right ()'s are
47926f60 11351 equal, so this loop will not be infinite. */
24eab124
AM
11352 do
11353 {
11354 base_string--;
11355 if (*base_string == ')')
11356 parens_balanced++;
11357 if (*base_string == '(')
11358 parens_balanced--;
11359 }
11360 while (parens_balanced);
c3332e24 11361
af6bdddf 11362 temp_string = base_string;
c3332e24 11363
24eab124 11364 /* Skip past '(' and whitespace. */
252b5132
RH
11365 ++base_string;
11366 if (is_space_char (*base_string))
24eab124 11367 ++base_string;
252b5132 11368
af6bdddf 11369 if (*base_string == ','
4eed87de
AM
11370 || ((i.base_reg = parse_register (base_string, &end_op))
11371 != NULL))
252b5132 11372 {
af6bdddf 11373 displacement_string_end = temp_string;
252b5132 11374
40fb9820 11375 i.types[this_operand].bitfield.baseindex = 1;
252b5132 11376
af6bdddf 11377 if (i.base_reg)
24eab124 11378 {
8a6fb3f9
JB
11379 if (i.base_reg == &bad_reg)
11380 return 0;
24eab124
AM
11381 base_string = end_op;
11382 if (is_space_char (*base_string))
11383 ++base_string;
af6bdddf
AM
11384 }
11385
11386 /* There may be an index reg or scale factor here. */
11387 if (*base_string == ',')
11388 {
11389 ++base_string;
11390 if (is_space_char (*base_string))
11391 ++base_string;
11392
4eed87de
AM
11393 if ((i.index_reg = parse_register (base_string, &end_op))
11394 != NULL)
24eab124 11395 {
8a6fb3f9
JB
11396 if (i.index_reg == &bad_reg)
11397 return 0;
af6bdddf 11398 base_string = end_op;
24eab124
AM
11399 if (is_space_char (*base_string))
11400 ++base_string;
af6bdddf
AM
11401 if (*base_string == ',')
11402 {
11403 ++base_string;
11404 if (is_space_char (*base_string))
11405 ++base_string;
11406 }
e5cb08ac 11407 else if (*base_string != ')')
af6bdddf 11408 {
4eed87de
AM
11409 as_bad (_("expecting `,' or `)' "
11410 "after index register in `%s'"),
af6bdddf
AM
11411 operand_string);
11412 return 0;
11413 }
24eab124 11414 }
af6bdddf 11415 else if (*base_string == REGISTER_PREFIX)
24eab124 11416 {
f76bf5e0
L
11417 end_op = strchr (base_string, ',');
11418 if (end_op)
11419 *end_op = '\0';
af6bdddf 11420 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
11421 return 0;
11422 }
252b5132 11423
47926f60 11424 /* Check for scale factor. */
551c1ca1 11425 if (*base_string != ')')
af6bdddf 11426 {
551c1ca1
AM
11427 char *end_scale = i386_scale (base_string);
11428
11429 if (!end_scale)
af6bdddf 11430 return 0;
24eab124 11431
551c1ca1 11432 base_string = end_scale;
af6bdddf
AM
11433 if (is_space_char (*base_string))
11434 ++base_string;
11435 if (*base_string != ')')
11436 {
4eed87de
AM
11437 as_bad (_("expecting `)' "
11438 "after scale factor in `%s'"),
af6bdddf
AM
11439 operand_string);
11440 return 0;
11441 }
11442 }
11443 else if (!i.index_reg)
24eab124 11444 {
4eed87de
AM
11445 as_bad (_("expecting index register or scale factor "
11446 "after `,'; got '%c'"),
af6bdddf 11447 *base_string);
24eab124
AM
11448 return 0;
11449 }
11450 }
af6bdddf 11451 else if (*base_string != ')')
24eab124 11452 {
4eed87de
AM
11453 as_bad (_("expecting `,' or `)' "
11454 "after base register in `%s'"),
af6bdddf 11455 operand_string);
24eab124
AM
11456 return 0;
11457 }
c3332e24 11458 }
af6bdddf 11459 else if (*base_string == REGISTER_PREFIX)
c3332e24 11460 {
f76bf5e0
L
11461 end_op = strchr (base_string, ',');
11462 if (end_op)
11463 *end_op = '\0';
af6bdddf 11464 as_bad (_("bad register name `%s'"), base_string);
24eab124 11465 return 0;
c3332e24 11466 }
24eab124
AM
11467 }
11468
11469 /* If there's an expression beginning the operand, parse it,
11470 assuming displacement_string_start and
11471 displacement_string_end are meaningful. */
11472 if (displacement_string_start != displacement_string_end)
11473 {
11474 if (!i386_displacement (displacement_string_start,
11475 displacement_string_end))
11476 return 0;
11477 }
11478
11479 /* Special case for (%dx) while doing input/output op. */
11480 if (i.base_reg
75e5731b
JB
11481 && i.base_reg->reg_type.bitfield.instance == RegD
11482 && i.base_reg->reg_type.bitfield.word
24eab124
AM
11483 && i.index_reg == 0
11484 && i.log2_scale_factor == 0
11485 && i.seg[i.mem_operands] == 0
40fb9820 11486 && !operand_type_check (i.types[this_operand], disp))
24eab124 11487 {
2fb5be8d 11488 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
11489 return 1;
11490 }
11491
eecb386c
AM
11492 if (i386_index_check (operand_string) == 0)
11493 return 0;
c48dadc9 11494 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
11495 if (i.mem_operands == 0)
11496 i.memop1_string = xstrdup (operand_string);
24eab124
AM
11497 i.mem_operands++;
11498 }
11499 else
ce8a8b2f
AM
11500 {
11501 /* It's not a memory operand; argh! */
24eab124
AM
11502 as_bad (_("invalid char %s beginning operand %d `%s'"),
11503 output_invalid (*op_string),
11504 this_operand + 1,
11505 op_string);
11506 return 0;
11507 }
47926f60 11508 return 1; /* Normal return. */
252b5132
RH
11509}
11510\f
fa94de6b
RM
11511/* Calculate the maximum variable size (i.e., excluding fr_fix)
11512 that an rs_machine_dependent frag may reach. */
11513
11514unsigned int
11515i386_frag_max_var (fragS *frag)
11516{
11517 /* The only relaxable frags are for jumps.
11518 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
11519 gas_assert (frag->fr_type == rs_machine_dependent);
11520 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
11521}
11522
b084df0b
L
11523#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11524static int
8dcea932 11525elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
11526{
11527 /* STT_GNU_IFUNC symbol must go through PLT. */
11528 if ((symbol_get_bfdsym (fr_symbol)->flags
11529 & BSF_GNU_INDIRECT_FUNCTION) != 0)
11530 return 0;
11531
11532 if (!S_IS_EXTERNAL (fr_symbol))
11533 /* Symbol may be weak or local. */
11534 return !S_IS_WEAK (fr_symbol);
11535
8dcea932
L
11536 /* Global symbols with non-default visibility can't be preempted. */
11537 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
11538 return 1;
11539
11540 if (fr_var != NO_RELOC)
11541 switch ((enum bfd_reloc_code_real) fr_var)
11542 {
11543 case BFD_RELOC_386_PLT32:
11544 case BFD_RELOC_X86_64_PLT32:
33eaf5de 11545 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
11546 return 0;
11547 default:
11548 abort ();
11549 }
11550
b084df0b
L
11551 /* Global symbols with default visibility in a shared library may be
11552 preempted by another definition. */
8dcea932 11553 return !shared;
b084df0b
L
11554}
11555#endif
11556
79d72f45
HL
11557/* Table 3-2. Macro-Fusible Instructions in Haswell Microarchitecture
11558 Note also work for Skylake and Cascadelake.
11559---------------------------------------------------------------------
11560| JCC | ADD/SUB/CMP | INC/DEC | TEST/AND |
11561| ------ | ----------- | ------- | -------- |
11562| Jo | N | N | Y |
11563| Jno | N | N | Y |
11564| Jc/Jb | Y | N | Y |
11565| Jae/Jnb | Y | N | Y |
11566| Je/Jz | Y | Y | Y |
11567| Jne/Jnz | Y | Y | Y |
11568| Jna/Jbe | Y | N | Y |
11569| Ja/Jnbe | Y | N | Y |
11570| Js | N | N | Y |
11571| Jns | N | N | Y |
11572| Jp/Jpe | N | N | Y |
11573| Jnp/Jpo | N | N | Y |
11574| Jl/Jnge | Y | Y | Y |
11575| Jge/Jnl | Y | Y | Y |
11576| Jle/Jng | Y | Y | Y |
11577| Jg/Jnle | Y | Y | Y |
11578--------------------------------------------------------------------- */
11579static int
11580i386_macro_fusible_p (enum mf_cmp_kind mf_cmp, enum mf_jcc_kind mf_jcc)
11581{
11582 if (mf_cmp == mf_cmp_alu_cmp)
11583 return ((mf_jcc >= mf_jcc_jc && mf_jcc <= mf_jcc_jna)
11584 || mf_jcc == mf_jcc_jl || mf_jcc == mf_jcc_jle);
11585 if (mf_cmp == mf_cmp_incdec)
11586 return (mf_jcc == mf_jcc_je || mf_jcc == mf_jcc_jl
11587 || mf_jcc == mf_jcc_jle);
11588 if (mf_cmp == mf_cmp_test_and)
11589 return 1;
11590 return 0;
11591}
11592
e379e5f3
L
11593/* Return the next non-empty frag. */
11594
11595static fragS *
11596i386_next_non_empty_frag (fragS *fragP)
11597{
11598 /* There may be a frag with a ".fill 0" when there is no room in
11599 the current frag for frag_grow in output_insn. */
11600 for (fragP = fragP->fr_next;
11601 (fragP != NULL
11602 && fragP->fr_type == rs_fill
11603 && fragP->fr_fix == 0);
11604 fragP = fragP->fr_next)
11605 ;
11606 return fragP;
11607}
11608
11609/* Return the next jcc frag after BRANCH_PADDING. */
11610
11611static fragS *
79d72f45 11612i386_next_fusible_jcc_frag (fragS *maybe_cmp_fragP, fragS *pad_fragP)
e379e5f3 11613{
79d72f45
HL
11614 fragS *branch_fragP;
11615 if (!pad_fragP)
e379e5f3
L
11616 return NULL;
11617
79d72f45
HL
11618 if (pad_fragP->fr_type == rs_machine_dependent
11619 && (TYPE_FROM_RELAX_STATE (pad_fragP->fr_subtype)
e379e5f3
L
11620 == BRANCH_PADDING))
11621 {
79d72f45
HL
11622 branch_fragP = i386_next_non_empty_frag (pad_fragP);
11623 if (branch_fragP->fr_type != rs_machine_dependent)
e379e5f3 11624 return NULL;
79d72f45
HL
11625 if (TYPE_FROM_RELAX_STATE (branch_fragP->fr_subtype) == COND_JUMP
11626 && i386_macro_fusible_p (maybe_cmp_fragP->tc_frag_data.mf_type,
11627 pad_fragP->tc_frag_data.mf_type))
11628 return branch_fragP;
e379e5f3
L
11629 }
11630
11631 return NULL;
11632}
11633
11634/* Classify BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags. */
11635
11636static void
11637i386_classify_machine_dependent_frag (fragS *fragP)
11638{
11639 fragS *cmp_fragP;
11640 fragS *pad_fragP;
11641 fragS *branch_fragP;
11642 fragS *next_fragP;
11643 unsigned int max_prefix_length;
11644
11645 if (fragP->tc_frag_data.classified)
11646 return;
11647
11648 /* First scan for BRANCH_PADDING and FUSED_JCC_PADDING. Convert
11649 FUSED_JCC_PADDING and merge BRANCH_PADDING. */
11650 for (next_fragP = fragP;
11651 next_fragP != NULL;
11652 next_fragP = next_fragP->fr_next)
11653 {
11654 next_fragP->tc_frag_data.classified = 1;
11655 if (next_fragP->fr_type == rs_machine_dependent)
11656 switch (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype))
11657 {
11658 case BRANCH_PADDING:
11659 /* The BRANCH_PADDING frag must be followed by a branch
11660 frag. */
11661 branch_fragP = i386_next_non_empty_frag (next_fragP);
11662 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11663 break;
11664 case FUSED_JCC_PADDING:
11665 /* Check if this is a fused jcc:
11666 FUSED_JCC_PADDING
11667 CMP like instruction
11668 BRANCH_PADDING
11669 COND_JUMP
11670 */
11671 cmp_fragP = i386_next_non_empty_frag (next_fragP);
11672 pad_fragP = i386_next_non_empty_frag (cmp_fragP);
79d72f45 11673 branch_fragP = i386_next_fusible_jcc_frag (next_fragP, pad_fragP);
e379e5f3
L
11674 if (branch_fragP)
11675 {
11676 /* The BRANCH_PADDING frag is merged with the
11677 FUSED_JCC_PADDING frag. */
11678 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
11679 /* CMP like instruction size. */
11680 next_fragP->tc_frag_data.cmp_size = cmp_fragP->fr_fix;
11681 frag_wane (pad_fragP);
11682 /* Skip to branch_fragP. */
11683 next_fragP = branch_fragP;
11684 }
11685 else if (next_fragP->tc_frag_data.max_prefix_length)
11686 {
11687 /* Turn FUSED_JCC_PADDING into BRANCH_PREFIX if it isn't
11688 a fused jcc. */
11689 next_fragP->fr_subtype
11690 = ENCODE_RELAX_STATE (BRANCH_PREFIX, 0);
11691 next_fragP->tc_frag_data.max_bytes
11692 = next_fragP->tc_frag_data.max_prefix_length;
11693 /* This will be updated in the BRANCH_PREFIX scan. */
11694 next_fragP->tc_frag_data.max_prefix_length = 0;
11695 }
11696 else
11697 frag_wane (next_fragP);
11698 break;
11699 }
11700 }
11701
11702 /* Stop if there is no BRANCH_PREFIX. */
11703 if (!align_branch_prefix_size)
11704 return;
11705
11706 /* Scan for BRANCH_PREFIX. */
11707 for (; fragP != NULL; fragP = fragP->fr_next)
11708 {
11709 if (fragP->fr_type != rs_machine_dependent
11710 || (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11711 != BRANCH_PREFIX))
11712 continue;
11713
11714 /* Count all BRANCH_PREFIX frags before BRANCH_PADDING and
11715 COND_JUMP_PREFIX. */
11716 max_prefix_length = 0;
11717 for (next_fragP = fragP;
11718 next_fragP != NULL;
11719 next_fragP = next_fragP->fr_next)
11720 {
11721 if (next_fragP->fr_type == rs_fill)
11722 /* Skip rs_fill frags. */
11723 continue;
11724 else if (next_fragP->fr_type != rs_machine_dependent)
11725 /* Stop for all other frags. */
11726 break;
11727
11728 /* rs_machine_dependent frags. */
11729 if (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11730 == BRANCH_PREFIX)
11731 {
11732 /* Count BRANCH_PREFIX frags. */
11733 if (max_prefix_length >= MAX_FUSED_JCC_PADDING_SIZE)
11734 {
11735 max_prefix_length = MAX_FUSED_JCC_PADDING_SIZE;
11736 frag_wane (next_fragP);
11737 }
11738 else
11739 max_prefix_length
11740 += next_fragP->tc_frag_data.max_bytes;
11741 }
11742 else if ((TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11743 == BRANCH_PADDING)
11744 || (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11745 == FUSED_JCC_PADDING))
11746 {
11747 /* Stop at BRANCH_PADDING and FUSED_JCC_PADDING. */
11748 fragP->tc_frag_data.u.padding_fragP = next_fragP;
11749 break;
11750 }
11751 else
11752 /* Stop for other rs_machine_dependent frags. */
11753 break;
11754 }
11755
11756 fragP->tc_frag_data.max_prefix_length = max_prefix_length;
11757
11758 /* Skip to the next frag. */
11759 fragP = next_fragP;
11760 }
11761}
11762
11763/* Compute padding size for
11764
11765 FUSED_JCC_PADDING
11766 CMP like instruction
11767 BRANCH_PADDING
11768 COND_JUMP/UNCOND_JUMP
11769
11770 or
11771
11772 BRANCH_PADDING
11773 COND_JUMP/UNCOND_JUMP
11774 */
11775
11776static int
11777i386_branch_padding_size (fragS *fragP, offsetT address)
11778{
11779 unsigned int offset, size, padding_size;
11780 fragS *branch_fragP = fragP->tc_frag_data.u.branch_fragP;
11781
11782 /* The start address of the BRANCH_PADDING or FUSED_JCC_PADDING frag. */
11783 if (!address)
11784 address = fragP->fr_address;
11785 address += fragP->fr_fix;
11786
11787 /* CMP like instrunction size. */
11788 size = fragP->tc_frag_data.cmp_size;
11789
11790 /* The base size of the branch frag. */
11791 size += branch_fragP->fr_fix;
11792
11793 /* Add opcode and displacement bytes for the rs_machine_dependent
11794 branch frag. */
11795 if (branch_fragP->fr_type == rs_machine_dependent)
11796 size += md_relax_table[branch_fragP->fr_subtype].rlx_length;
11797
11798 /* Check if branch is within boundary and doesn't end at the last
11799 byte. */
11800 offset = address & ((1U << align_branch_power) - 1);
11801 if ((offset + size) >= (1U << align_branch_power))
11802 /* Padding needed to avoid crossing boundary. */
11803 padding_size = (1U << align_branch_power) - offset;
11804 else
11805 /* No padding needed. */
11806 padding_size = 0;
11807
11808 /* The return value may be saved in tc_frag_data.length which is
11809 unsigned byte. */
11810 if (!fits_in_unsigned_byte (padding_size))
11811 abort ();
11812
11813 return padding_size;
11814}
11815
11816/* i386_generic_table_relax_frag()
11817
11818 Handle BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags to
11819 grow/shrink padding to align branch frags. Hand others to
11820 relax_frag(). */
11821
11822long
11823i386_generic_table_relax_frag (segT segment, fragS *fragP, long stretch)
11824{
11825 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11826 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11827 {
11828 long padding_size = i386_branch_padding_size (fragP, 0);
11829 long grow = padding_size - fragP->tc_frag_data.length;
11830
11831 /* When the BRANCH_PREFIX frag is used, the computed address
11832 must match the actual address and there should be no padding. */
11833 if (fragP->tc_frag_data.padding_address
11834 && (fragP->tc_frag_data.padding_address != fragP->fr_address
11835 || padding_size))
11836 abort ();
11837
11838 /* Update the padding size. */
11839 if (grow)
11840 fragP->tc_frag_data.length = padding_size;
11841
11842 return grow;
11843 }
11844 else if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11845 {
11846 fragS *padding_fragP, *next_fragP;
11847 long padding_size, left_size, last_size;
11848
11849 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
11850 if (!padding_fragP)
11851 /* Use the padding set by the leading BRANCH_PREFIX frag. */
11852 return (fragP->tc_frag_data.length
11853 - fragP->tc_frag_data.last_length);
11854
11855 /* Compute the relative address of the padding frag in the very
11856 first time where the BRANCH_PREFIX frag sizes are zero. */
11857 if (!fragP->tc_frag_data.padding_address)
11858 fragP->tc_frag_data.padding_address
11859 = padding_fragP->fr_address - (fragP->fr_address - stretch);
11860
11861 /* First update the last length from the previous interation. */
11862 left_size = fragP->tc_frag_data.prefix_length;
11863 for (next_fragP = fragP;
11864 next_fragP != padding_fragP;
11865 next_fragP = next_fragP->fr_next)
11866 if (next_fragP->fr_type == rs_machine_dependent
11867 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11868 == BRANCH_PREFIX))
11869 {
11870 if (left_size)
11871 {
11872 int max = next_fragP->tc_frag_data.max_bytes;
11873 if (max)
11874 {
11875 int size;
11876 if (max > left_size)
11877 size = left_size;
11878 else
11879 size = max;
11880 left_size -= size;
11881 next_fragP->tc_frag_data.last_length = size;
11882 }
11883 }
11884 else
11885 next_fragP->tc_frag_data.last_length = 0;
11886 }
11887
11888 /* Check the padding size for the padding frag. */
11889 padding_size = i386_branch_padding_size
11890 (padding_fragP, (fragP->fr_address
11891 + fragP->tc_frag_data.padding_address));
11892
11893 last_size = fragP->tc_frag_data.prefix_length;
11894 /* Check if there is change from the last interation. */
11895 if (padding_size == last_size)
11896 {
11897 /* Update the expected address of the padding frag. */
11898 padding_fragP->tc_frag_data.padding_address
11899 = (fragP->fr_address + padding_size
11900 + fragP->tc_frag_data.padding_address);
11901 return 0;
11902 }
11903
11904 if (padding_size > fragP->tc_frag_data.max_prefix_length)
11905 {
11906 /* No padding if there is no sufficient room. Clear the
11907 expected address of the padding frag. */
11908 padding_fragP->tc_frag_data.padding_address = 0;
11909 padding_size = 0;
11910 }
11911 else
11912 /* Store the expected address of the padding frag. */
11913 padding_fragP->tc_frag_data.padding_address
11914 = (fragP->fr_address + padding_size
11915 + fragP->tc_frag_data.padding_address);
11916
11917 fragP->tc_frag_data.prefix_length = padding_size;
11918
11919 /* Update the length for the current interation. */
11920 left_size = padding_size;
11921 for (next_fragP = fragP;
11922 next_fragP != padding_fragP;
11923 next_fragP = next_fragP->fr_next)
11924 if (next_fragP->fr_type == rs_machine_dependent
11925 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11926 == BRANCH_PREFIX))
11927 {
11928 if (left_size)
11929 {
11930 int max = next_fragP->tc_frag_data.max_bytes;
11931 if (max)
11932 {
11933 int size;
11934 if (max > left_size)
11935 size = left_size;
11936 else
11937 size = max;
11938 left_size -= size;
11939 next_fragP->tc_frag_data.length = size;
11940 }
11941 }
11942 else
11943 next_fragP->tc_frag_data.length = 0;
11944 }
11945
11946 return (fragP->tc_frag_data.length
11947 - fragP->tc_frag_data.last_length);
11948 }
11949 return relax_frag (segment, fragP, stretch);
11950}
11951
ee7fcc42
AM
11952/* md_estimate_size_before_relax()
11953
11954 Called just before relax() for rs_machine_dependent frags. The x86
11955 assembler uses these frags to handle variable size jump
11956 instructions.
11957
11958 Any symbol that is now undefined will not become defined.
11959 Return the correct fr_subtype in the frag.
11960 Return the initial "guess for variable size of frag" to caller.
11961 The guess is actually the growth beyond the fixed part. Whatever
11962 we do to grow the fixed or variable part contributes to our
11963 returned value. */
11964
252b5132 11965int
7016a5d5 11966md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 11967{
e379e5f3
L
11968 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11969 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX
11970 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11971 {
11972 i386_classify_machine_dependent_frag (fragP);
11973 return fragP->tc_frag_data.length;
11974 }
11975
252b5132 11976 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
11977 check for un-relaxable symbols. On an ELF system, we can't relax
11978 an externally visible symbol, because it may be overridden by a
11979 shared library. */
11980 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 11981#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 11982 || (IS_ELF
8dcea932
L
11983 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
11984 fragP->fr_var))
fbeb56a4
DK
11985#endif
11986#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 11987 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 11988 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
11989#endif
11990 )
252b5132 11991 {
b98ef147
AM
11992 /* Symbol is undefined in this segment, or we need to keep a
11993 reloc so that weak symbols can be overridden. */
11994 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 11995 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
11996 unsigned char *opcode;
11997 int old_fr_fix;
f6af82bd 11998
ee7fcc42 11999 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 12000 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 12001 else if (size == 2)
f6af82bd 12002 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
12003#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12004 else if (need_plt32_p (fragP->fr_symbol))
12005 reloc_type = BFD_RELOC_X86_64_PLT32;
12006#endif
f6af82bd
AM
12007 else
12008 reloc_type = BFD_RELOC_32_PCREL;
252b5132 12009
ee7fcc42
AM
12010 old_fr_fix = fragP->fr_fix;
12011 opcode = (unsigned char *) fragP->fr_opcode;
12012
fddf5b5b 12013 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 12014 {
fddf5b5b
AM
12015 case UNCOND_JUMP:
12016 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 12017 opcode[0] = 0xe9;
252b5132 12018 fragP->fr_fix += size;
062cd5e7
AS
12019 fix_new (fragP, old_fr_fix, size,
12020 fragP->fr_symbol,
12021 fragP->fr_offset, 1,
12022 reloc_type);
252b5132
RH
12023 break;
12024
fddf5b5b 12025 case COND_JUMP86:
412167cb
AM
12026 if (size == 2
12027 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
12028 {
12029 /* Negate the condition, and branch past an
12030 unconditional jump. */
12031 opcode[0] ^= 1;
12032 opcode[1] = 3;
12033 /* Insert an unconditional jump. */
12034 opcode[2] = 0xe9;
12035 /* We added two extra opcode bytes, and have a two byte
12036 offset. */
12037 fragP->fr_fix += 2 + 2;
062cd5e7
AS
12038 fix_new (fragP, old_fr_fix + 2, 2,
12039 fragP->fr_symbol,
12040 fragP->fr_offset, 1,
12041 reloc_type);
fddf5b5b
AM
12042 break;
12043 }
12044 /* Fall through. */
12045
12046 case COND_JUMP:
412167cb
AM
12047 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
12048 {
3e02c1cc
AM
12049 fixS *fixP;
12050
412167cb 12051 fragP->fr_fix += 1;
3e02c1cc
AM
12052 fixP = fix_new (fragP, old_fr_fix, 1,
12053 fragP->fr_symbol,
12054 fragP->fr_offset, 1,
12055 BFD_RELOC_8_PCREL);
12056 fixP->fx_signed = 1;
412167cb
AM
12057 break;
12058 }
93c2a809 12059
24eab124 12060 /* This changes the byte-displacement jump 0x7N
fddf5b5b 12061 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 12062 opcode[1] = opcode[0] + 0x10;
f6af82bd 12063 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
12064 /* We've added an opcode byte. */
12065 fragP->fr_fix += 1 + size;
062cd5e7
AS
12066 fix_new (fragP, old_fr_fix + 1, size,
12067 fragP->fr_symbol,
12068 fragP->fr_offset, 1,
12069 reloc_type);
252b5132 12070 break;
fddf5b5b
AM
12071
12072 default:
12073 BAD_CASE (fragP->fr_subtype);
12074 break;
252b5132
RH
12075 }
12076 frag_wane (fragP);
ee7fcc42 12077 return fragP->fr_fix - old_fr_fix;
252b5132 12078 }
93c2a809 12079
93c2a809
AM
12080 /* Guess size depending on current relax state. Initially the relax
12081 state will correspond to a short jump and we return 1, because
12082 the variable part of the frag (the branch offset) is one byte
12083 long. However, we can relax a section more than once and in that
12084 case we must either set fr_subtype back to the unrelaxed state,
12085 or return the value for the appropriate branch. */
12086 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
12087}
12088
47926f60
KH
12089/* Called after relax() is finished.
12090
12091 In: Address of frag.
12092 fr_type == rs_machine_dependent.
12093 fr_subtype is what the address relaxed to.
12094
12095 Out: Any fixSs and constants are set up.
12096 Caller will turn frag into a ".space 0". */
12097
252b5132 12098void
7016a5d5
TG
12099md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
12100 fragS *fragP)
252b5132 12101{
29b0f896 12102 unsigned char *opcode;
252b5132 12103 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
12104 offsetT target_address;
12105 offsetT opcode_address;
252b5132 12106 unsigned int extension = 0;
847f7ad4 12107 offsetT displacement_from_opcode_start;
252b5132 12108
e379e5f3
L
12109 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
12110 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING
12111 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12112 {
12113 /* Generate nop padding. */
12114 unsigned int size = fragP->tc_frag_data.length;
12115 if (size)
12116 {
12117 if (size > fragP->tc_frag_data.max_bytes)
12118 abort ();
12119
12120 if (flag_debug)
12121 {
12122 const char *msg;
12123 const char *branch = "branch";
12124 const char *prefix = "";
12125 fragS *padding_fragP;
12126 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
12127 == BRANCH_PREFIX)
12128 {
12129 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
12130 switch (fragP->tc_frag_data.default_prefix)
12131 {
12132 default:
12133 abort ();
12134 break;
12135 case CS_PREFIX_OPCODE:
12136 prefix = " cs";
12137 break;
12138 case DS_PREFIX_OPCODE:
12139 prefix = " ds";
12140 break;
12141 case ES_PREFIX_OPCODE:
12142 prefix = " es";
12143 break;
12144 case FS_PREFIX_OPCODE:
12145 prefix = " fs";
12146 break;
12147 case GS_PREFIX_OPCODE:
12148 prefix = " gs";
12149 break;
12150 case SS_PREFIX_OPCODE:
12151 prefix = " ss";
12152 break;
12153 }
12154 if (padding_fragP)
12155 msg = _("%s:%u: add %d%s at 0x%llx to align "
12156 "%s within %d-byte boundary\n");
12157 else
12158 msg = _("%s:%u: add additional %d%s at 0x%llx to "
12159 "align %s within %d-byte boundary\n");
12160 }
12161 else
12162 {
12163 padding_fragP = fragP;
12164 msg = _("%s:%u: add %d%s-byte nop at 0x%llx to align "
12165 "%s within %d-byte boundary\n");
12166 }
12167
12168 if (padding_fragP)
12169 switch (padding_fragP->tc_frag_data.branch_type)
12170 {
12171 case align_branch_jcc:
12172 branch = "jcc";
12173 break;
12174 case align_branch_fused:
12175 branch = "fused jcc";
12176 break;
12177 case align_branch_jmp:
12178 branch = "jmp";
12179 break;
12180 case align_branch_call:
12181 branch = "call";
12182 break;
12183 case align_branch_indirect:
12184 branch = "indiret branch";
12185 break;
12186 case align_branch_ret:
12187 branch = "ret";
12188 break;
12189 default:
12190 break;
12191 }
12192
12193 fprintf (stdout, msg,
12194 fragP->fr_file, fragP->fr_line, size, prefix,
12195 (long long) fragP->fr_address, branch,
12196 1 << align_branch_power);
12197 }
12198 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
12199 memset (fragP->fr_opcode,
12200 fragP->tc_frag_data.default_prefix, size);
12201 else
12202 i386_generate_nops (fragP, (char *) fragP->fr_opcode,
12203 size, 0);
12204 fragP->fr_fix += size;
12205 }
12206 return;
12207 }
12208
252b5132
RH
12209 opcode = (unsigned char *) fragP->fr_opcode;
12210
47926f60 12211 /* Address we want to reach in file space. */
252b5132 12212 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 12213
47926f60 12214 /* Address opcode resides at in file space. */
252b5132
RH
12215 opcode_address = fragP->fr_address + fragP->fr_fix;
12216
47926f60 12217 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
12218 displacement_from_opcode_start = target_address - opcode_address;
12219
fddf5b5b 12220 if ((fragP->fr_subtype & BIG) == 0)
252b5132 12221 {
47926f60
KH
12222 /* Don't have to change opcode. */
12223 extension = 1; /* 1 opcode + 1 displacement */
252b5132 12224 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
12225 }
12226 else
12227 {
12228 if (no_cond_jump_promotion
12229 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
12230 as_warn_where (fragP->fr_file, fragP->fr_line,
12231 _("long jump required"));
252b5132 12232
fddf5b5b
AM
12233 switch (fragP->fr_subtype)
12234 {
12235 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
12236 extension = 4; /* 1 opcode + 4 displacement */
12237 opcode[0] = 0xe9;
12238 where_to_put_displacement = &opcode[1];
12239 break;
252b5132 12240
fddf5b5b
AM
12241 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
12242 extension = 2; /* 1 opcode + 2 displacement */
12243 opcode[0] = 0xe9;
12244 where_to_put_displacement = &opcode[1];
12245 break;
252b5132 12246
fddf5b5b
AM
12247 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
12248 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
12249 extension = 5; /* 2 opcode + 4 displacement */
12250 opcode[1] = opcode[0] + 0x10;
12251 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12252 where_to_put_displacement = &opcode[2];
12253 break;
252b5132 12254
fddf5b5b
AM
12255 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
12256 extension = 3; /* 2 opcode + 2 displacement */
12257 opcode[1] = opcode[0] + 0x10;
12258 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
12259 where_to_put_displacement = &opcode[2];
12260 break;
252b5132 12261
fddf5b5b
AM
12262 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
12263 extension = 4;
12264 opcode[0] ^= 1;
12265 opcode[1] = 3;
12266 opcode[2] = 0xe9;
12267 where_to_put_displacement = &opcode[3];
12268 break;
12269
12270 default:
12271 BAD_CASE (fragP->fr_subtype);
12272 break;
12273 }
252b5132 12274 }
fddf5b5b 12275
7b81dfbb
AJ
12276 /* If size if less then four we are sure that the operand fits,
12277 but if it's 4, then it could be that the displacement is larger
12278 then -/+ 2GB. */
12279 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
12280 && object_64bit
12281 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
12282 + ((addressT) 1 << 31))
12283 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
12284 {
12285 as_bad_where (fragP->fr_file, fragP->fr_line,
12286 _("jump target out of range"));
12287 /* Make us emit 0. */
12288 displacement_from_opcode_start = extension;
12289 }
47926f60 12290 /* Now put displacement after opcode. */
252b5132
RH
12291 md_number_to_chars ((char *) where_to_put_displacement,
12292 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 12293 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
12294 fragP->fr_fix += extension;
12295}
12296\f
7016a5d5 12297/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
12298 by our caller that we have all the info we need to fix it up.
12299
7016a5d5
TG
12300 Parameter valP is the pointer to the value of the bits.
12301
252b5132
RH
12302 On the 386, immediates, displacements, and data pointers are all in
12303 the same (little-endian) format, so we don't need to care about which
12304 we are handling. */
12305
94f592af 12306void
7016a5d5 12307md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 12308{
94f592af 12309 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 12310 valueT value = *valP;
252b5132 12311
f86103b7 12312#if !defined (TE_Mach)
93382f6d
AM
12313 if (fixP->fx_pcrel)
12314 {
12315 switch (fixP->fx_r_type)
12316 {
5865bb77
ILT
12317 default:
12318 break;
12319
d6ab8113
JB
12320 case BFD_RELOC_64:
12321 fixP->fx_r_type = BFD_RELOC_64_PCREL;
12322 break;
93382f6d 12323 case BFD_RELOC_32:
ae8887b5 12324 case BFD_RELOC_X86_64_32S:
93382f6d
AM
12325 fixP->fx_r_type = BFD_RELOC_32_PCREL;
12326 break;
12327 case BFD_RELOC_16:
12328 fixP->fx_r_type = BFD_RELOC_16_PCREL;
12329 break;
12330 case BFD_RELOC_8:
12331 fixP->fx_r_type = BFD_RELOC_8_PCREL;
12332 break;
12333 }
12334 }
252b5132 12335
a161fe53 12336 if (fixP->fx_addsy != NULL
31312f95 12337 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 12338 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 12339 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 12340 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 12341 && !use_rela_relocations)
252b5132 12342 {
31312f95
AM
12343 /* This is a hack. There should be a better way to handle this.
12344 This covers for the fact that bfd_install_relocation will
12345 subtract the current location (for partial_inplace, PC relative
12346 relocations); see more below. */
252b5132 12347#ifndef OBJ_AOUT
718ddfc0 12348 if (IS_ELF
252b5132
RH
12349#ifdef TE_PE
12350 || OUTPUT_FLAVOR == bfd_target_coff_flavour
12351#endif
12352 )
12353 value += fixP->fx_where + fixP->fx_frag->fr_address;
12354#endif
12355#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12356 if (IS_ELF)
252b5132 12357 {
6539b54b 12358 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 12359
6539b54b 12360 if ((sym_seg == seg
2f66722d 12361 || (symbol_section_p (fixP->fx_addsy)
6539b54b 12362 && sym_seg != absolute_section))
af65af87 12363 && !generic_force_reloc (fixP))
2f66722d
AM
12364 {
12365 /* Yes, we add the values in twice. This is because
6539b54b
AM
12366 bfd_install_relocation subtracts them out again. I think
12367 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
12368 it. FIXME. */
12369 value += fixP->fx_where + fixP->fx_frag->fr_address;
12370 }
252b5132
RH
12371 }
12372#endif
12373#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
12374 /* For some reason, the PE format does not store a
12375 section address offset for a PC relative symbol. */
12376 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 12377 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
12378 value += md_pcrel_from (fixP);
12379#endif
12380 }
fbeb56a4 12381#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
12382 if (fixP->fx_addsy != NULL
12383 && S_IS_WEAK (fixP->fx_addsy)
12384 /* PR 16858: Do not modify weak function references. */
12385 && ! fixP->fx_pcrel)
fbeb56a4 12386 {
296a8689
NC
12387#if !defined (TE_PEP)
12388 /* For x86 PE weak function symbols are neither PC-relative
12389 nor do they set S_IS_FUNCTION. So the only reliable way
12390 to detect them is to check the flags of their containing
12391 section. */
12392 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
12393 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
12394 ;
12395 else
12396#endif
fbeb56a4
DK
12397 value -= S_GET_VALUE (fixP->fx_addsy);
12398 }
12399#endif
252b5132
RH
12400
12401 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 12402 and we must not disappoint it. */
252b5132 12403#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 12404 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
12405 switch (fixP->fx_r_type)
12406 {
12407 case BFD_RELOC_386_PLT32:
3e73aa7c 12408 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
12409 /* Make the jump instruction point to the address of the operand.
12410 At runtime we merely add the offset to the actual PLT entry.
12411 NB: Subtract the offset size only for jump instructions. */
12412 if (fixP->fx_pcrel)
12413 value = -4;
47926f60 12414 break;
31312f95 12415
13ae64f3
JJ
12416 case BFD_RELOC_386_TLS_GD:
12417 case BFD_RELOC_386_TLS_LDM:
13ae64f3 12418 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
12419 case BFD_RELOC_386_TLS_IE:
12420 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 12421 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
12422 case BFD_RELOC_X86_64_TLSGD:
12423 case BFD_RELOC_X86_64_TLSLD:
12424 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 12425 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
12426 value = 0; /* Fully resolved at runtime. No addend. */
12427 /* Fallthrough */
12428 case BFD_RELOC_386_TLS_LE:
12429 case BFD_RELOC_386_TLS_LDO_32:
12430 case BFD_RELOC_386_TLS_LE_32:
12431 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 12432 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 12433 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 12434 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
12435 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12436 break;
12437
67a4f2b7
AO
12438 case BFD_RELOC_386_TLS_DESC_CALL:
12439 case BFD_RELOC_X86_64_TLSDESC_CALL:
12440 value = 0; /* Fully resolved at runtime. No addend. */
12441 S_SET_THREAD_LOCAL (fixP->fx_addsy);
12442 fixP->fx_done = 0;
12443 return;
12444
47926f60
KH
12445 case BFD_RELOC_VTABLE_INHERIT:
12446 case BFD_RELOC_VTABLE_ENTRY:
12447 fixP->fx_done = 0;
94f592af 12448 return;
47926f60
KH
12449
12450 default:
12451 break;
12452 }
12453#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 12454 *valP = value;
f86103b7 12455#endif /* !defined (TE_Mach) */
3e73aa7c 12456
3e73aa7c 12457 /* Are we finished with this relocation now? */
c6682705 12458 if (fixP->fx_addsy == NULL)
3e73aa7c 12459 fixP->fx_done = 1;
fbeb56a4
DK
12460#if defined (OBJ_COFF) && defined (TE_PE)
12461 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
12462 {
12463 fixP->fx_done = 0;
12464 /* Remember value for tc_gen_reloc. */
12465 fixP->fx_addnumber = value;
12466 /* Clear out the frag for now. */
12467 value = 0;
12468 }
12469#endif
3e73aa7c
JH
12470 else if (use_rela_relocations)
12471 {
12472 fixP->fx_no_overflow = 1;
062cd5e7
AS
12473 /* Remember value for tc_gen_reloc. */
12474 fixP->fx_addnumber = value;
3e73aa7c
JH
12475 value = 0;
12476 }
f86103b7 12477
94f592af 12478 md_number_to_chars (p, value, fixP->fx_size);
252b5132 12479}
252b5132 12480\f
6d4af3c2 12481const char *
499ac353 12482md_atof (int type, char *litP, int *sizeP)
252b5132 12483{
499ac353
NC
12484 /* This outputs the LITTLENUMs in REVERSE order;
12485 in accord with the bigendian 386. */
12486 return ieee_md_atof (type, litP, sizeP, FALSE);
252b5132
RH
12487}
12488\f
2d545b82 12489static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 12490
252b5132 12491static char *
e3bb37b5 12492output_invalid (int c)
252b5132 12493{
3882b010 12494 if (ISPRINT (c))
f9f21a03
L
12495 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
12496 "'%c'", c);
252b5132 12497 else
f9f21a03 12498 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 12499 "(0x%x)", (unsigned char) c);
252b5132
RH
12500 return output_invalid_buf;
12501}
12502
8a6fb3f9
JB
12503/* Verify that @r can be used in the current context. */
12504
12505static bfd_boolean check_register (const reg_entry *r)
12506{
12507 if (allow_pseudo_reg)
12508 return TRUE;
12509
12510 if (operand_type_all_zero (&r->reg_type))
12511 return FALSE;
12512
12513 if ((r->reg_type.bitfield.dword
12514 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
12515 || r->reg_type.bitfield.class == RegCR
22e00a3f 12516 || r->reg_type.bitfield.class == RegDR)
8a6fb3f9
JB
12517 && !cpu_arch_flags.bitfield.cpui386)
12518 return FALSE;
12519
22e00a3f
JB
12520 if (r->reg_type.bitfield.class == RegTR
12521 && (flag_code == CODE_64BIT
12522 || !cpu_arch_flags.bitfield.cpui386
12523 || cpu_arch_isa_flags.bitfield.cpui586
12524 || cpu_arch_isa_flags.bitfield.cpui686))
12525 return FALSE;
12526
8a6fb3f9
JB
12527 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
12528 return FALSE;
12529
12530 if (!cpu_arch_flags.bitfield.cpuavx512f)
12531 {
12532 if (r->reg_type.bitfield.zmmword
12533 || r->reg_type.bitfield.class == RegMask)
12534 return FALSE;
12535
12536 if (!cpu_arch_flags.bitfield.cpuavx)
12537 {
12538 if (r->reg_type.bitfield.ymmword)
12539 return FALSE;
12540
12541 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
12542 return FALSE;
12543 }
12544 }
12545
260cd341
LC
12546 if (r->reg_type.bitfield.tmmword
12547 && (!cpu_arch_flags.bitfield.cpuamx_tile
12548 || flag_code != CODE_64BIT))
12549 return FALSE;
12550
8a6fb3f9
JB
12551 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
12552 return FALSE;
12553
12554 /* Don't allow fake index register unless allow_index_reg isn't 0. */
12555 if (!allow_index_reg && r->reg_num == RegIZ)
12556 return FALSE;
12557
12558 /* Upper 16 vector registers are only available with VREX in 64bit
12559 mode, and require EVEX encoding. */
12560 if (r->reg_flags & RegVRex)
12561 {
12562 if (!cpu_arch_flags.bitfield.cpuavx512f
12563 || flag_code != CODE_64BIT)
12564 return FALSE;
12565
da4977e0
JB
12566 if (i.vec_encoding == vex_encoding_default)
12567 i.vec_encoding = vex_encoding_evex;
12568 else if (i.vec_encoding != vex_encoding_evex)
12569 i.vec_encoding = vex_encoding_error;
8a6fb3f9
JB
12570 }
12571
12572 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
12573 && (!cpu_arch_flags.bitfield.cpulm || r->reg_type.bitfield.class != RegCR)
12574 && flag_code != CODE_64BIT)
12575 return FALSE;
12576
12577 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
12578 && !intel_syntax)
12579 return FALSE;
12580
12581 return TRUE;
12582}
12583
af6bdddf 12584/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
12585
12586static const reg_entry *
4d1bb795 12587parse_real_register (char *reg_string, char **end_op)
252b5132 12588{
af6bdddf
AM
12589 char *s = reg_string;
12590 char *p;
252b5132
RH
12591 char reg_name_given[MAX_REG_NAME_SIZE + 1];
12592 const reg_entry *r;
12593
12594 /* Skip possible REGISTER_PREFIX and possible whitespace. */
12595 if (*s == REGISTER_PREFIX)
12596 ++s;
12597
12598 if (is_space_char (*s))
12599 ++s;
12600
12601 p = reg_name_given;
af6bdddf 12602 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
12603 {
12604 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
12605 return (const reg_entry *) NULL;
12606 s++;
252b5132
RH
12607 }
12608
6588847e
DN
12609 /* For naked regs, make sure that we are not dealing with an identifier.
12610 This prevents confusing an identifier like `eax_var' with register
12611 `eax'. */
12612 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
12613 return (const reg_entry *) NULL;
12614
af6bdddf 12615 *end_op = s;
252b5132
RH
12616
12617 r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
12618
5f47d35b 12619 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 12620 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 12621 {
0e0eea78
JB
12622 if (!cpu_arch_flags.bitfield.cpu8087
12623 && !cpu_arch_flags.bitfield.cpu287
af32b722
JB
12624 && !cpu_arch_flags.bitfield.cpu387
12625 && !allow_pseudo_reg)
0e0eea78
JB
12626 return (const reg_entry *) NULL;
12627
5f47d35b
AM
12628 if (is_space_char (*s))
12629 ++s;
12630 if (*s == '(')
12631 {
af6bdddf 12632 ++s;
5f47d35b
AM
12633 if (is_space_char (*s))
12634 ++s;
12635 if (*s >= '0' && *s <= '7')
12636 {
db557034 12637 int fpr = *s - '0';
af6bdddf 12638 ++s;
5f47d35b
AM
12639 if (is_space_char (*s))
12640 ++s;
12641 if (*s == ')')
12642 {
12643 *end_op = s + 1;
1e9cc1c2 12644 r = (const reg_entry *) hash_find (reg_hash, "st(0)");
db557034
AM
12645 know (r);
12646 return r + fpr;
5f47d35b 12647 }
5f47d35b 12648 }
47926f60 12649 /* We have "%st(" then garbage. */
5f47d35b
AM
12650 return (const reg_entry *) NULL;
12651 }
12652 }
12653
8a6fb3f9 12654 return r && check_register (r) ? r : NULL;
252b5132 12655}
4d1bb795
JB
12656
12657/* REG_STRING starts *before* REGISTER_PREFIX. */
12658
12659static const reg_entry *
12660parse_register (char *reg_string, char **end_op)
12661{
12662 const reg_entry *r;
12663
12664 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
12665 r = parse_real_register (reg_string, end_op);
12666 else
12667 r = NULL;
12668 if (!r)
12669 {
12670 char *save = input_line_pointer;
12671 char c;
12672 symbolS *symbolP;
12673
12674 input_line_pointer = reg_string;
d02603dc 12675 c = get_symbol_name (&reg_string);
4d1bb795
JB
12676 symbolP = symbol_find (reg_string);
12677 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
12678 {
12679 const expressionS *e = symbol_get_value_expression (symbolP);
12680
0398aac5 12681 know (e->X_op == O_register);
4eed87de 12682 know (e->X_add_number >= 0
c3fe08fa 12683 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 12684 r = i386_regtab + e->X_add_number;
8a6fb3f9
JB
12685 if (!check_register (r))
12686 {
12687 as_bad (_("register '%s%s' cannot be used here"),
12688 register_prefix, r->reg_name);
12689 r = &bad_reg;
12690 }
4d1bb795
JB
12691 *end_op = input_line_pointer;
12692 }
12693 *input_line_pointer = c;
12694 input_line_pointer = save;
12695 }
12696 return r;
12697}
12698
12699int
12700i386_parse_name (char *name, expressionS *e, char *nextcharP)
12701{
12702 const reg_entry *r;
12703 char *end = input_line_pointer;
12704
12705 *end = *nextcharP;
12706 r = parse_register (name, &input_line_pointer);
12707 if (r && end <= input_line_pointer)
12708 {
12709 *nextcharP = *input_line_pointer;
12710 *input_line_pointer = 0;
8a6fb3f9
JB
12711 if (r != &bad_reg)
12712 {
12713 e->X_op = O_register;
12714 e->X_add_number = r - i386_regtab;
12715 }
12716 else
12717 e->X_op = O_illegal;
4d1bb795
JB
12718 return 1;
12719 }
12720 input_line_pointer = end;
12721 *end = 0;
ee86248c 12722 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
12723}
12724
12725void
12726md_operand (expressionS *e)
12727{
ee86248c
JB
12728 char *end;
12729 const reg_entry *r;
4d1bb795 12730
ee86248c
JB
12731 switch (*input_line_pointer)
12732 {
12733 case REGISTER_PREFIX:
12734 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
12735 if (r)
12736 {
12737 e->X_op = O_register;
12738 e->X_add_number = r - i386_regtab;
12739 input_line_pointer = end;
12740 }
ee86248c
JB
12741 break;
12742
12743 case '[':
9c2799c2 12744 gas_assert (intel_syntax);
ee86248c
JB
12745 end = input_line_pointer++;
12746 expression (e);
12747 if (*input_line_pointer == ']')
12748 {
12749 ++input_line_pointer;
12750 e->X_op_symbol = make_expr_symbol (e);
12751 e->X_add_symbol = NULL;
12752 e->X_add_number = 0;
12753 e->X_op = O_index;
12754 }
12755 else
12756 {
12757 e->X_op = O_absent;
12758 input_line_pointer = end;
12759 }
12760 break;
4d1bb795
JB
12761 }
12762}
12763
252b5132 12764\f
4cc782b5 12765#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 12766const char *md_shortopts = "kVQ:sqnO::";
252b5132 12767#else
b6f8c7c4 12768const char *md_shortopts = "qnO::";
252b5132 12769#endif
6e0b89ee 12770
3e73aa7c 12771#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
12772#define OPTION_64 (OPTION_MD_BASE + 1)
12773#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
12774#define OPTION_MARCH (OPTION_MD_BASE + 3)
12775#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
12776#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
12777#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
12778#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
12779#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 12780#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 12781#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 12782#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
12783#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
12784#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
12785#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 12786#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
12787#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
12788#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 12789#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 12790#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 12791#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 12792#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
12793#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
12794#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 12795#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 12796#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 12797#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
e379e5f3
L
12798#define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27)
12799#define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
12800#define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
76cf450b 12801#define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
ae531041
L
12802#define OPTION_MLFENCE_AFTER_LOAD (OPTION_MD_BASE + 31)
12803#define OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH (OPTION_MD_BASE + 32)
12804#define OPTION_MLFENCE_BEFORE_RET (OPTION_MD_BASE + 33)
b3b91714 12805
99ad8390
NC
12806struct option md_longopts[] =
12807{
3e73aa7c 12808 {"32", no_argument, NULL, OPTION_32},
321098a5 12809#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12810 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 12811 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
12812#endif
12813#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12814 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 12815 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 12816 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 12817#endif
b3b91714 12818 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
12819 {"march", required_argument, NULL, OPTION_MARCH},
12820 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
12821 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
12822 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
12823 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
12824 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 12825 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 12826 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 12827 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 12828 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 12829 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 12830 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
12831 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
12832 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
12833# if defined (TE_PE) || defined (TE_PEP)
12834 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
12835#endif
d1982f93 12836 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 12837 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 12838 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 12839 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
e379e5f3
L
12840 {"malign-branch-boundary", required_argument, NULL, OPTION_MALIGN_BRANCH_BOUNDARY},
12841 {"malign-branch-prefix-size", required_argument, NULL, OPTION_MALIGN_BRANCH_PREFIX_SIZE},
12842 {"malign-branch", required_argument, NULL, OPTION_MALIGN_BRANCH},
76cf450b 12843 {"mbranches-within-32B-boundaries", no_argument, NULL, OPTION_MBRANCHES_WITH_32B_BOUNDARIES},
ae531041
L
12844 {"mlfence-after-load", required_argument, NULL, OPTION_MLFENCE_AFTER_LOAD},
12845 {"mlfence-before-indirect-branch", required_argument, NULL,
12846 OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH},
12847 {"mlfence-before-ret", required_argument, NULL, OPTION_MLFENCE_BEFORE_RET},
5db04b09
L
12848 {"mamd64", no_argument, NULL, OPTION_MAMD64},
12849 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
12850 {NULL, no_argument, NULL, 0}
12851};
12852size_t md_longopts_size = sizeof (md_longopts);
12853
12854int
17b9d67d 12855md_parse_option (int c, const char *arg)
252b5132 12856{
91d6fa6a 12857 unsigned int j;
e379e5f3 12858 char *arch, *next, *saved, *type;
9103f4f4 12859
252b5132
RH
12860 switch (c)
12861 {
12b55ccc
L
12862 case 'n':
12863 optimize_align_code = 0;
12864 break;
12865
a38cf1db
AM
12866 case 'q':
12867 quiet_warnings = 1;
252b5132
RH
12868 break;
12869
12870#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
12871 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
12872 should be emitted or not. FIXME: Not implemented. */
12873 case 'Q':
d4693039
JB
12874 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
12875 return 0;
252b5132
RH
12876 break;
12877
12878 /* -V: SVR4 argument to print version ID. */
12879 case 'V':
12880 print_version_id ();
12881 break;
12882
a38cf1db
AM
12883 /* -k: Ignore for FreeBSD compatibility. */
12884 case 'k':
252b5132 12885 break;
4cc782b5
ILT
12886
12887 case 's':
12888 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 12889 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 12890 break;
8dcea932
L
12891
12892 case OPTION_MSHARED:
12893 shared = 1;
12894 break;
b4a3a7b4
L
12895
12896 case OPTION_X86_USED_NOTE:
12897 if (strcasecmp (arg, "yes") == 0)
12898 x86_used_note = 1;
12899 else if (strcasecmp (arg, "no") == 0)
12900 x86_used_note = 0;
12901 else
12902 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
12903 break;
12904
12905
99ad8390 12906#endif
321098a5 12907#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12908 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
12909 case OPTION_64:
12910 {
12911 const char **list, **l;
12912
3e73aa7c
JH
12913 list = bfd_target_list ();
12914 for (l = list; *l != NULL; l++)
8620418b 12915 if (CONST_STRNEQ (*l, "elf64-x86-64")
99ad8390
NC
12916 || strcmp (*l, "coff-x86-64") == 0
12917 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
12918 || strcmp (*l, "pei-x86-64") == 0
12919 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
12920 {
12921 default_arch = "x86_64";
12922 break;
12923 }
3e73aa7c 12924 if (*l == NULL)
2b5d6a91 12925 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
12926 free (list);
12927 }
12928 break;
12929#endif
252b5132 12930
351f65ca 12931#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12932 case OPTION_X32:
351f65ca
L
12933 if (IS_ELF)
12934 {
12935 const char **list, **l;
12936
12937 list = bfd_target_list ();
12938 for (l = list; *l != NULL; l++)
12939 if (CONST_STRNEQ (*l, "elf32-x86-64"))
12940 {
12941 default_arch = "x86_64:32";
12942 break;
12943 }
12944 if (*l == NULL)
2b5d6a91 12945 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
12946 free (list);
12947 }
12948 else
12949 as_fatal (_("32bit x86_64 is only supported for ELF"));
12950 break;
12951#endif
12952
6e0b89ee
AM
12953 case OPTION_32:
12954 default_arch = "i386";
12955 break;
12956
b3b91714
AM
12957 case OPTION_DIVIDE:
12958#ifdef SVR4_COMMENT_CHARS
12959 {
12960 char *n, *t;
12961 const char *s;
12962
add39d23 12963 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
12964 t = n;
12965 for (s = i386_comment_chars; *s != '\0'; s++)
12966 if (*s != '/')
12967 *t++ = *s;
12968 *t = '\0';
12969 i386_comment_chars = n;
12970 }
12971#endif
12972 break;
12973
9103f4f4 12974 case OPTION_MARCH:
293f5f65
L
12975 saved = xstrdup (arg);
12976 arch = saved;
12977 /* Allow -march=+nosse. */
12978 if (*arch == '+')
12979 arch++;
6305a203 12980 do
9103f4f4 12981 {
6305a203 12982 if (*arch == '.')
2b5d6a91 12983 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
12984 next = strchr (arch, '+');
12985 if (next)
12986 *next++ = '\0';
91d6fa6a 12987 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 12988 {
91d6fa6a 12989 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 12990 {
6305a203 12991 /* Processor. */
1ded5609
JB
12992 if (! cpu_arch[j].flags.bitfield.cpui386)
12993 continue;
12994
91d6fa6a 12995 cpu_arch_name = cpu_arch[j].name;
6305a203 12996 cpu_sub_arch_name = NULL;
91d6fa6a
NC
12997 cpu_arch_flags = cpu_arch[j].flags;
12998 cpu_arch_isa = cpu_arch[j].type;
12999 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
13000 if (!cpu_arch_tune_set)
13001 {
13002 cpu_arch_tune = cpu_arch_isa;
13003 cpu_arch_tune_flags = cpu_arch_isa_flags;
13004 }
13005 break;
13006 }
91d6fa6a
NC
13007 else if (*cpu_arch [j].name == '.'
13008 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 13009 {
33eaf5de 13010 /* ISA extension. */
6305a203 13011 i386_cpu_flags flags;
309d3373 13012
293f5f65
L
13013 flags = cpu_flags_or (cpu_arch_flags,
13014 cpu_arch[j].flags);
81486035 13015
5b64d091 13016 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
13017 {
13018 if (cpu_sub_arch_name)
13019 {
13020 char *name = cpu_sub_arch_name;
13021 cpu_sub_arch_name = concat (name,
91d6fa6a 13022 cpu_arch[j].name,
1bf57e9f 13023 (const char *) NULL);
6305a203
L
13024 free (name);
13025 }
13026 else
91d6fa6a 13027 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 13028 cpu_arch_flags = flags;
a586129e 13029 cpu_arch_isa_flags = flags;
6305a203 13030 }
0089dace
L
13031 else
13032 cpu_arch_isa_flags
13033 = cpu_flags_or (cpu_arch_isa_flags,
13034 cpu_arch[j].flags);
6305a203 13035 break;
ccc9c027 13036 }
9103f4f4 13037 }
6305a203 13038
293f5f65
L
13039 if (j >= ARRAY_SIZE (cpu_arch))
13040 {
33eaf5de 13041 /* Disable an ISA extension. */
293f5f65
L
13042 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13043 if (strcmp (arch, cpu_noarch [j].name) == 0)
13044 {
13045 i386_cpu_flags flags;
13046
13047 flags = cpu_flags_and_not (cpu_arch_flags,
13048 cpu_noarch[j].flags);
13049 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
13050 {
13051 if (cpu_sub_arch_name)
13052 {
13053 char *name = cpu_sub_arch_name;
13054 cpu_sub_arch_name = concat (arch,
13055 (const char *) NULL);
13056 free (name);
13057 }
13058 else
13059 cpu_sub_arch_name = xstrdup (arch);
13060 cpu_arch_flags = flags;
13061 cpu_arch_isa_flags = flags;
13062 }
13063 break;
13064 }
13065
13066 if (j >= ARRAY_SIZE (cpu_noarch))
13067 j = ARRAY_SIZE (cpu_arch);
13068 }
13069
91d6fa6a 13070 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 13071 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
13072
13073 arch = next;
9103f4f4 13074 }
293f5f65
L
13075 while (next != NULL);
13076 free (saved);
9103f4f4
L
13077 break;
13078
13079 case OPTION_MTUNE:
13080 if (*arg == '.')
2b5d6a91 13081 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 13082 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 13083 {
91d6fa6a 13084 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 13085 {
ccc9c027 13086 cpu_arch_tune_set = 1;
91d6fa6a
NC
13087 cpu_arch_tune = cpu_arch [j].type;
13088 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
13089 break;
13090 }
13091 }
91d6fa6a 13092 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 13093 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
13094 break;
13095
1efbbeb4
L
13096 case OPTION_MMNEMONIC:
13097 if (strcasecmp (arg, "att") == 0)
13098 intel_mnemonic = 0;
13099 else if (strcasecmp (arg, "intel") == 0)
13100 intel_mnemonic = 1;
13101 else
2b5d6a91 13102 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
13103 break;
13104
13105 case OPTION_MSYNTAX:
13106 if (strcasecmp (arg, "att") == 0)
13107 intel_syntax = 0;
13108 else if (strcasecmp (arg, "intel") == 0)
13109 intel_syntax = 1;
13110 else
2b5d6a91 13111 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
13112 break;
13113
13114 case OPTION_MINDEX_REG:
13115 allow_index_reg = 1;
13116 break;
13117
13118 case OPTION_MNAKED_REG:
13119 allow_naked_reg = 1;
13120 break;
13121
c0f3af97
L
13122 case OPTION_MSSE2AVX:
13123 sse2avx = 1;
13124 break;
13125
daf50ae7
L
13126 case OPTION_MSSE_CHECK:
13127 if (strcasecmp (arg, "error") == 0)
7bab8ab5 13128 sse_check = check_error;
daf50ae7 13129 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 13130 sse_check = check_warning;
daf50ae7 13131 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 13132 sse_check = check_none;
daf50ae7 13133 else
2b5d6a91 13134 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
13135 break;
13136
7bab8ab5
JB
13137 case OPTION_MOPERAND_CHECK:
13138 if (strcasecmp (arg, "error") == 0)
13139 operand_check = check_error;
13140 else if (strcasecmp (arg, "warning") == 0)
13141 operand_check = check_warning;
13142 else if (strcasecmp (arg, "none") == 0)
13143 operand_check = check_none;
13144 else
13145 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
13146 break;
13147
539f890d
L
13148 case OPTION_MAVXSCALAR:
13149 if (strcasecmp (arg, "128") == 0)
13150 avxscalar = vex128;
13151 else if (strcasecmp (arg, "256") == 0)
13152 avxscalar = vex256;
13153 else
2b5d6a91 13154 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
13155 break;
13156
03751133
L
13157 case OPTION_MVEXWIG:
13158 if (strcmp (arg, "0") == 0)
40c9c8de 13159 vexwig = vexw0;
03751133 13160 else if (strcmp (arg, "1") == 0)
40c9c8de 13161 vexwig = vexw1;
03751133
L
13162 else
13163 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
13164 break;
13165
7e8b059b
L
13166 case OPTION_MADD_BND_PREFIX:
13167 add_bnd_prefix = 1;
13168 break;
13169
43234a1e
L
13170 case OPTION_MEVEXLIG:
13171 if (strcmp (arg, "128") == 0)
13172 evexlig = evexl128;
13173 else if (strcmp (arg, "256") == 0)
13174 evexlig = evexl256;
13175 else if (strcmp (arg, "512") == 0)
13176 evexlig = evexl512;
13177 else
13178 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
13179 break;
13180
d3d3c6db
IT
13181 case OPTION_MEVEXRCIG:
13182 if (strcmp (arg, "rne") == 0)
13183 evexrcig = rne;
13184 else if (strcmp (arg, "rd") == 0)
13185 evexrcig = rd;
13186 else if (strcmp (arg, "ru") == 0)
13187 evexrcig = ru;
13188 else if (strcmp (arg, "rz") == 0)
13189 evexrcig = rz;
13190 else
13191 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
13192 break;
13193
43234a1e
L
13194 case OPTION_MEVEXWIG:
13195 if (strcmp (arg, "0") == 0)
13196 evexwig = evexw0;
13197 else if (strcmp (arg, "1") == 0)
13198 evexwig = evexw1;
13199 else
13200 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
13201 break;
13202
167ad85b
TG
13203# if defined (TE_PE) || defined (TE_PEP)
13204 case OPTION_MBIG_OBJ:
13205 use_big_obj = 1;
13206 break;
13207#endif
13208
d1982f93 13209 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
13210 if (strcasecmp (arg, "yes") == 0)
13211 omit_lock_prefix = 1;
13212 else if (strcasecmp (arg, "no") == 0)
13213 omit_lock_prefix = 0;
13214 else
13215 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
13216 break;
13217
e4e00185
AS
13218 case OPTION_MFENCE_AS_LOCK_ADD:
13219 if (strcasecmp (arg, "yes") == 0)
13220 avoid_fence = 1;
13221 else if (strcasecmp (arg, "no") == 0)
13222 avoid_fence = 0;
13223 else
13224 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
13225 break;
13226
ae531041
L
13227 case OPTION_MLFENCE_AFTER_LOAD:
13228 if (strcasecmp (arg, "yes") == 0)
13229 lfence_after_load = 1;
13230 else if (strcasecmp (arg, "no") == 0)
13231 lfence_after_load = 0;
13232 else
13233 as_fatal (_("invalid -mlfence-after-load= option: `%s'"), arg);
13234 break;
13235
13236 case OPTION_MLFENCE_BEFORE_INDIRECT_BRANCH:
13237 if (strcasecmp (arg, "all") == 0)
a09f656b 13238 {
13239 lfence_before_indirect_branch = lfence_branch_all;
13240 if (lfence_before_ret == lfence_before_ret_none)
13241 lfence_before_ret = lfence_before_ret_shl;
13242 }
ae531041
L
13243 else if (strcasecmp (arg, "memory") == 0)
13244 lfence_before_indirect_branch = lfence_branch_memory;
13245 else if (strcasecmp (arg, "register") == 0)
13246 lfence_before_indirect_branch = lfence_branch_register;
13247 else if (strcasecmp (arg, "none") == 0)
13248 lfence_before_indirect_branch = lfence_branch_none;
13249 else
13250 as_fatal (_("invalid -mlfence-before-indirect-branch= option: `%s'"),
13251 arg);
13252 break;
13253
13254 case OPTION_MLFENCE_BEFORE_RET:
13255 if (strcasecmp (arg, "or") == 0)
13256 lfence_before_ret = lfence_before_ret_or;
13257 else if (strcasecmp (arg, "not") == 0)
13258 lfence_before_ret = lfence_before_ret_not;
a09f656b 13259 else if (strcasecmp (arg, "shl") == 0 || strcasecmp (arg, "yes") == 0)
13260 lfence_before_ret = lfence_before_ret_shl;
ae531041
L
13261 else if (strcasecmp (arg, "none") == 0)
13262 lfence_before_ret = lfence_before_ret_none;
13263 else
13264 as_fatal (_("invalid -mlfence-before-ret= option: `%s'"),
13265 arg);
13266 break;
13267
0cb4071e
L
13268 case OPTION_MRELAX_RELOCATIONS:
13269 if (strcasecmp (arg, "yes") == 0)
13270 generate_relax_relocations = 1;
13271 else if (strcasecmp (arg, "no") == 0)
13272 generate_relax_relocations = 0;
13273 else
13274 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
13275 break;
13276
e379e5f3
L
13277 case OPTION_MALIGN_BRANCH_BOUNDARY:
13278 {
13279 char *end;
13280 long int align = strtoul (arg, &end, 0);
13281 if (*end == '\0')
13282 {
13283 if (align == 0)
13284 {
13285 align_branch_power = 0;
13286 break;
13287 }
13288 else if (align >= 16)
13289 {
13290 int align_power;
13291 for (align_power = 0;
13292 (align & 1) == 0;
13293 align >>= 1, align_power++)
13294 continue;
13295 /* Limit alignment power to 31. */
13296 if (align == 1 && align_power < 32)
13297 {
13298 align_branch_power = align_power;
13299 break;
13300 }
13301 }
13302 }
13303 as_fatal (_("invalid -malign-branch-boundary= value: %s"), arg);
13304 }
13305 break;
13306
13307 case OPTION_MALIGN_BRANCH_PREFIX_SIZE:
13308 {
13309 char *end;
13310 int align = strtoul (arg, &end, 0);
13311 /* Some processors only support 5 prefixes. */
13312 if (*end == '\0' && align >= 0 && align < 6)
13313 {
13314 align_branch_prefix_size = align;
13315 break;
13316 }
13317 as_fatal (_("invalid -malign-branch-prefix-size= value: %s"),
13318 arg);
13319 }
13320 break;
13321
13322 case OPTION_MALIGN_BRANCH:
13323 align_branch = 0;
13324 saved = xstrdup (arg);
13325 type = saved;
13326 do
13327 {
13328 next = strchr (type, '+');
13329 if (next)
13330 *next++ = '\0';
13331 if (strcasecmp (type, "jcc") == 0)
13332 align_branch |= align_branch_jcc_bit;
13333 else if (strcasecmp (type, "fused") == 0)
13334 align_branch |= align_branch_fused_bit;
13335 else if (strcasecmp (type, "jmp") == 0)
13336 align_branch |= align_branch_jmp_bit;
13337 else if (strcasecmp (type, "call") == 0)
13338 align_branch |= align_branch_call_bit;
13339 else if (strcasecmp (type, "ret") == 0)
13340 align_branch |= align_branch_ret_bit;
13341 else if (strcasecmp (type, "indirect") == 0)
13342 align_branch |= align_branch_indirect_bit;
13343 else
13344 as_fatal (_("invalid -malign-branch= option: `%s'"), arg);
13345 type = next;
13346 }
13347 while (next != NULL);
13348 free (saved);
13349 break;
13350
76cf450b
L
13351 case OPTION_MBRANCHES_WITH_32B_BOUNDARIES:
13352 align_branch_power = 5;
13353 align_branch_prefix_size = 5;
13354 align_branch = (align_branch_jcc_bit
13355 | align_branch_fused_bit
13356 | align_branch_jmp_bit);
13357 break;
13358
5db04b09 13359 case OPTION_MAMD64:
4b5aaf5f 13360 isa64 = amd64;
5db04b09
L
13361 break;
13362
13363 case OPTION_MINTEL64:
4b5aaf5f 13364 isa64 = intel64;
5db04b09
L
13365 break;
13366
b6f8c7c4
L
13367 case 'O':
13368 if (arg == NULL)
13369 {
13370 optimize = 1;
13371 /* Turn off -Os. */
13372 optimize_for_space = 0;
13373 }
13374 else if (*arg == 's')
13375 {
13376 optimize_for_space = 1;
13377 /* Turn on all encoding optimizations. */
41fd2579 13378 optimize = INT_MAX;
b6f8c7c4
L
13379 }
13380 else
13381 {
13382 optimize = atoi (arg);
13383 /* Turn off -Os. */
13384 optimize_for_space = 0;
13385 }
13386 break;
13387
252b5132
RH
13388 default:
13389 return 0;
13390 }
13391 return 1;
13392}
13393
8a2c8fef
L
13394#define MESSAGE_TEMPLATE \
13395" "
13396
293f5f65
L
13397static char *
13398output_message (FILE *stream, char *p, char *message, char *start,
13399 int *left_p, const char *name, int len)
13400{
13401 int size = sizeof (MESSAGE_TEMPLATE);
13402 int left = *left_p;
13403
13404 /* Reserve 2 spaces for ", " or ",\0" */
13405 left -= len + 2;
13406
13407 /* Check if there is any room. */
13408 if (left >= 0)
13409 {
13410 if (p != start)
13411 {
13412 *p++ = ',';
13413 *p++ = ' ';
13414 }
13415 p = mempcpy (p, name, len);
13416 }
13417 else
13418 {
13419 /* Output the current message now and start a new one. */
13420 *p++ = ',';
13421 *p = '\0';
13422 fprintf (stream, "%s\n", message);
13423 p = start;
13424 left = size - (start - message) - len - 2;
13425
13426 gas_assert (left >= 0);
13427
13428 p = mempcpy (p, name, len);
13429 }
13430
13431 *left_p = left;
13432 return p;
13433}
13434
8a2c8fef 13435static void
1ded5609 13436show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
13437{
13438 static char message[] = MESSAGE_TEMPLATE;
13439 char *start = message + 27;
13440 char *p;
13441 int size = sizeof (MESSAGE_TEMPLATE);
13442 int left;
13443 const char *name;
13444 int len;
13445 unsigned int j;
13446
13447 p = start;
13448 left = size - (start - message);
13449 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
13450 {
13451 /* Should it be skipped? */
13452 if (cpu_arch [j].skip)
13453 continue;
13454
13455 name = cpu_arch [j].name;
13456 len = cpu_arch [j].len;
13457 if (*name == '.')
13458 {
13459 /* It is an extension. Skip if we aren't asked to show it. */
13460 if (ext)
13461 {
13462 name++;
13463 len--;
13464 }
13465 else
13466 continue;
13467 }
13468 else if (ext)
13469 {
13470 /* It is an processor. Skip if we show only extension. */
13471 continue;
13472 }
1ded5609
JB
13473 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
13474 {
13475 /* It is an impossible processor - skip. */
13476 continue;
13477 }
8a2c8fef 13478
293f5f65 13479 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
13480 }
13481
293f5f65
L
13482 /* Display disabled extensions. */
13483 if (ext)
13484 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
13485 {
13486 name = cpu_noarch [j].name;
13487 len = cpu_noarch [j].len;
13488 p = output_message (stream, p, message, start, &left, name,
13489 len);
13490 }
13491
8a2c8fef
L
13492 *p = '\0';
13493 fprintf (stream, "%s\n", message);
13494}
13495
252b5132 13496void
8a2c8fef 13497md_show_usage (FILE *stream)
252b5132 13498{
4cc782b5
ILT
13499#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13500 fprintf (stream, _("\
d4693039 13501 -Qy, -Qn ignored\n\
a38cf1db 13502 -V print assembler version number\n\
b3b91714
AM
13503 -k ignored\n"));
13504#endif
13505 fprintf (stream, _("\
12b55ccc 13506 -n Do not optimize code alignment\n\
b3b91714
AM
13507 -q quieten some warnings\n"));
13508#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13509 fprintf (stream, _("\
a38cf1db 13510 -s ignored\n"));
b3b91714 13511#endif
d7f449c0
L
13512#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
13513 || defined (TE_PE) || defined (TE_PEP))
751d281c 13514 fprintf (stream, _("\
570561f7 13515 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 13516#endif
b3b91714
AM
13517#ifdef SVR4_COMMENT_CHARS
13518 fprintf (stream, _("\
13519 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
13520#else
13521 fprintf (stream, _("\
b3b91714 13522 --divide ignored\n"));
4cc782b5 13523#endif
9103f4f4 13524 fprintf (stream, _("\
6305a203 13525 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 13526 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 13527 show_arch (stream, 0, 1);
8a2c8fef
L
13528 fprintf (stream, _("\
13529 EXTENSION is combination of:\n"));
1ded5609 13530 show_arch (stream, 1, 0);
6305a203 13531 fprintf (stream, _("\
8a2c8fef 13532 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 13533 show_arch (stream, 0, 0);
ba104c83 13534 fprintf (stream, _("\
c0f3af97
L
13535 -msse2avx encode SSE instructions with VEX prefix\n"));
13536 fprintf (stream, _("\
7c5c05ef 13537 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
13538 check SSE instructions\n"));
13539 fprintf (stream, _("\
7c5c05ef 13540 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
13541 check operand combinations for validity\n"));
13542 fprintf (stream, _("\
7c5c05ef
L
13543 -mavxscalar=[128|256] (default: 128)\n\
13544 encode scalar AVX instructions with specific vector\n\
539f890d
L
13545 length\n"));
13546 fprintf (stream, _("\
03751133
L
13547 -mvexwig=[0|1] (default: 0)\n\
13548 encode VEX instructions with specific VEX.W value\n\
13549 for VEX.W bit ignored instructions\n"));
13550 fprintf (stream, _("\
7c5c05ef
L
13551 -mevexlig=[128|256|512] (default: 128)\n\
13552 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
13553 length\n"));
13554 fprintf (stream, _("\
7c5c05ef
L
13555 -mevexwig=[0|1] (default: 0)\n\
13556 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
13557 for EVEX.W bit ignored instructions\n"));
13558 fprintf (stream, _("\
7c5c05ef 13559 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
13560 encode EVEX instructions with specific EVEX.RC value\n\
13561 for SAE-only ignored instructions\n"));
13562 fprintf (stream, _("\
7c5c05ef
L
13563 -mmnemonic=[att|intel] "));
13564 if (SYSV386_COMPAT)
13565 fprintf (stream, _("(default: att)\n"));
13566 else
13567 fprintf (stream, _("(default: intel)\n"));
13568 fprintf (stream, _("\
13569 use AT&T/Intel mnemonic\n"));
ba104c83 13570 fprintf (stream, _("\
7c5c05ef
L
13571 -msyntax=[att|intel] (default: att)\n\
13572 use AT&T/Intel syntax\n"));
ba104c83
L
13573 fprintf (stream, _("\
13574 -mindex-reg support pseudo index registers\n"));
13575 fprintf (stream, _("\
13576 -mnaked-reg don't require `%%' prefix for registers\n"));
13577 fprintf (stream, _("\
7e8b059b 13578 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 13579#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
13580 fprintf (stream, _("\
13581 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
13582 fprintf (stream, _("\
13583 -mx86-used-note=[no|yes] "));
13584 if (DEFAULT_X86_USED_NOTE)
13585 fprintf (stream, _("(default: yes)\n"));
13586 else
13587 fprintf (stream, _("(default: no)\n"));
13588 fprintf (stream, _("\
13589 generate x86 used ISA and feature properties\n"));
13590#endif
13591#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
13592 fprintf (stream, _("\
13593 -mbig-obj generate big object files\n"));
13594#endif
d022bddd 13595 fprintf (stream, _("\
7c5c05ef 13596 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 13597 strip all lock prefixes\n"));
5db04b09 13598 fprintf (stream, _("\
7c5c05ef 13599 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
13600 encode lfence, mfence and sfence as\n\
13601 lock addl $0x0, (%%{re}sp)\n"));
13602 fprintf (stream, _("\
7c5c05ef
L
13603 -mrelax-relocations=[no|yes] "));
13604 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
13605 fprintf (stream, _("(default: yes)\n"));
13606 else
13607 fprintf (stream, _("(default: no)\n"));
13608 fprintf (stream, _("\
0cb4071e
L
13609 generate relax relocations\n"));
13610 fprintf (stream, _("\
e379e5f3
L
13611 -malign-branch-boundary=NUM (default: 0)\n\
13612 align branches within NUM byte boundary\n"));
13613 fprintf (stream, _("\
13614 -malign-branch=TYPE[+TYPE...] (default: jcc+fused+jmp)\n\
13615 TYPE is combination of jcc, fused, jmp, call, ret,\n\
13616 indirect\n\
13617 specify types of branches to align\n"));
13618 fprintf (stream, _("\
13619 -malign-branch-prefix-size=NUM (default: 5)\n\
13620 align branches with NUM prefixes per instruction\n"));
13621 fprintf (stream, _("\
76cf450b
L
13622 -mbranches-within-32B-boundaries\n\
13623 align branches within 32 byte boundary\n"));
13624 fprintf (stream, _("\
ae531041
L
13625 -mlfence-after-load=[no|yes] (default: no)\n\
13626 generate lfence after load\n"));
13627 fprintf (stream, _("\
13628 -mlfence-before-indirect-branch=[none|all|register|memory] (default: none)\n\
13629 generate lfence before indirect near branch\n"));
13630 fprintf (stream, _("\
a09f656b 13631 -mlfence-before-ret=[none|or|not|shl|yes] (default: none)\n\
ae531041
L
13632 generate lfence before ret\n"));
13633 fprintf (stream, _("\
7c5c05ef 13634 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
13635 fprintf (stream, _("\
13636 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
13637}
13638
3e73aa7c 13639#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 13640 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 13641 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
13642
13643/* Pick the target format to use. */
13644
47926f60 13645const char *
e3bb37b5 13646i386_target_format (void)
252b5132 13647{
351f65ca
L
13648 if (!strncmp (default_arch, "x86_64", 6))
13649 {
13650 update_code_flag (CODE_64BIT, 1);
13651 if (default_arch[6] == '\0')
7f56bc95 13652 x86_elf_abi = X86_64_ABI;
351f65ca 13653 else
7f56bc95 13654 x86_elf_abi = X86_64_X32_ABI;
351f65ca 13655 }
3e73aa7c 13656 else if (!strcmp (default_arch, "i386"))
78f12dd3 13657 update_code_flag (CODE_32BIT, 1);
5197d474
L
13658 else if (!strcmp (default_arch, "iamcu"))
13659 {
13660 update_code_flag (CODE_32BIT, 1);
13661 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
13662 {
13663 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
13664 cpu_arch_name = "iamcu";
13665 cpu_sub_arch_name = NULL;
13666 cpu_arch_flags = iamcu_flags;
13667 cpu_arch_isa = PROCESSOR_IAMCU;
13668 cpu_arch_isa_flags = iamcu_flags;
13669 if (!cpu_arch_tune_set)
13670 {
13671 cpu_arch_tune = cpu_arch_isa;
13672 cpu_arch_tune_flags = cpu_arch_isa_flags;
13673 }
13674 }
8d471ec1 13675 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
13676 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
13677 cpu_arch_name);
13678 }
3e73aa7c 13679 else
2b5d6a91 13680 as_fatal (_("unknown architecture"));
89507696
JB
13681
13682 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
13683 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13684 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
13685 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
13686
252b5132
RH
13687 switch (OUTPUT_FLAVOR)
13688 {
9384f2ff 13689#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 13690 case bfd_target_aout_flavour:
47926f60 13691 return AOUT_TARGET_FORMAT;
4c63da97 13692#endif
9384f2ff
AM
13693#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
13694# if defined (TE_PE) || defined (TE_PEP)
13695 case bfd_target_coff_flavour:
167ad85b
TG
13696 if (flag_code == CODE_64BIT)
13697 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
13698 else
251dae91 13699 return use_big_obj ? "pe-bigobj-i386" : "pe-i386";
9384f2ff 13700# elif defined (TE_GO32)
0561d57c
JK
13701 case bfd_target_coff_flavour:
13702 return "coff-go32";
9384f2ff 13703# else
252b5132
RH
13704 case bfd_target_coff_flavour:
13705 return "coff-i386";
9384f2ff 13706# endif
4c63da97 13707#endif
3e73aa7c 13708#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 13709 case bfd_target_elf_flavour:
3e73aa7c 13710 {
351f65ca
L
13711 const char *format;
13712
13713 switch (x86_elf_abi)
4fa24527 13714 {
351f65ca
L
13715 default:
13716 format = ELF_TARGET_FORMAT;
e379e5f3
L
13717#ifndef TE_SOLARIS
13718 tls_get_addr = "___tls_get_addr";
13719#endif
351f65ca 13720 break;
7f56bc95 13721 case X86_64_ABI:
351f65ca 13722 use_rela_relocations = 1;
4fa24527 13723 object_64bit = 1;
e379e5f3
L
13724#ifndef TE_SOLARIS
13725 tls_get_addr = "__tls_get_addr";
13726#endif
351f65ca
L
13727 format = ELF_TARGET_FORMAT64;
13728 break;
7f56bc95 13729 case X86_64_X32_ABI:
4fa24527 13730 use_rela_relocations = 1;
351f65ca 13731 object_64bit = 1;
e379e5f3
L
13732#ifndef TE_SOLARIS
13733 tls_get_addr = "__tls_get_addr";
13734#endif
862be3fb 13735 disallow_64bit_reloc = 1;
351f65ca
L
13736 format = ELF_TARGET_FORMAT32;
13737 break;
4fa24527 13738 }
3632d14b 13739 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 13740 {
7f56bc95 13741 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
13742 as_fatal (_("Intel L1OM is 64bit only"));
13743 return ELF_TARGET_L1OM_FORMAT;
13744 }
b49f93f6 13745 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
13746 {
13747 if (x86_elf_abi != X86_64_ABI)
13748 as_fatal (_("Intel K1OM is 64bit only"));
13749 return ELF_TARGET_K1OM_FORMAT;
13750 }
81486035
L
13751 else if (cpu_arch_isa == PROCESSOR_IAMCU)
13752 {
13753 if (x86_elf_abi != I386_ABI)
13754 as_fatal (_("Intel MCU is 32bit only"));
13755 return ELF_TARGET_IAMCU_FORMAT;
13756 }
8a9036a4 13757 else
351f65ca 13758 return format;
3e73aa7c 13759 }
e57f8c65
TG
13760#endif
13761#if defined (OBJ_MACH_O)
13762 case bfd_target_mach_o_flavour:
d382c579
TG
13763 if (flag_code == CODE_64BIT)
13764 {
13765 use_rela_relocations = 1;
13766 object_64bit = 1;
13767 return "mach-o-x86-64";
13768 }
13769 else
13770 return "mach-o-i386";
4c63da97 13771#endif
252b5132
RH
13772 default:
13773 abort ();
13774 return NULL;
13775 }
13776}
13777
47926f60 13778#endif /* OBJ_MAYBE_ more than one */
252b5132 13779\f
252b5132 13780symbolS *
7016a5d5 13781md_undefined_symbol (char *name)
252b5132 13782{
18dc2407
ILT
13783 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
13784 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
13785 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
13786 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
13787 {
13788 if (!GOT_symbol)
13789 {
13790 if (symbol_find (name))
13791 as_bad (_("GOT already in symbol table"));
13792 GOT_symbol = symbol_new (name, undefined_section,
13793 (valueT) 0, &zero_address_frag);
13794 };
13795 return GOT_symbol;
13796 }
252b5132
RH
13797 return 0;
13798}
13799
13800/* Round up a section size to the appropriate boundary. */
47926f60 13801
252b5132 13802valueT
7016a5d5 13803md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 13804{
4c63da97
AM
13805#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
13806 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
13807 {
13808 /* For a.out, force the section size to be aligned. If we don't do
13809 this, BFD will align it for us, but it will not write out the
13810 final bytes of the section. This may be a bug in BFD, but it is
13811 easier to fix it here since that is how the other a.out targets
13812 work. */
13813 int align;
13814
fd361982 13815 align = bfd_section_alignment (segment);
8d3842cd 13816 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 13817 }
252b5132
RH
13818#endif
13819
13820 return size;
13821}
13822
13823/* On the i386, PC-relative offsets are relative to the start of the
13824 next instruction. That is, the address of the offset, plus its
13825 size, since the offset is always the last part of the insn. */
13826
13827long
e3bb37b5 13828md_pcrel_from (fixS *fixP)
252b5132
RH
13829{
13830 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
13831}
13832
13833#ifndef I386COFF
13834
13835static void
e3bb37b5 13836s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 13837{
29b0f896 13838 int temp;
252b5132 13839
8a75718c
JB
13840#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13841 if (IS_ELF)
13842 obj_elf_section_change_hook ();
13843#endif
252b5132
RH
13844 temp = get_absolute_expression ();
13845 subseg_set (bss_section, (subsegT) temp);
13846 demand_empty_rest_of_line ();
13847}
13848
13849#endif
13850
e379e5f3
L
13851/* Remember constant directive. */
13852
13853void
13854i386_cons_align (int ignore ATTRIBUTE_UNUSED)
13855{
13856 if (last_insn.kind != last_insn_directive
13857 && (bfd_section_flags (now_seg) & SEC_CODE))
13858 {
13859 last_insn.seg = now_seg;
13860 last_insn.kind = last_insn_directive;
13861 last_insn.name = "constant directive";
13862 last_insn.file = as_where (&last_insn.line);
ae531041
L
13863 if (lfence_before_ret != lfence_before_ret_none)
13864 {
13865 if (lfence_before_indirect_branch != lfence_branch_none)
13866 as_warn (_("constant directive skips -mlfence-before-ret "
13867 "and -mlfence-before-indirect-branch"));
13868 else
13869 as_warn (_("constant directive skips -mlfence-before-ret"));
13870 }
13871 else if (lfence_before_indirect_branch != lfence_branch_none)
13872 as_warn (_("constant directive skips -mlfence-before-indirect-branch"));
e379e5f3
L
13873 }
13874}
13875
252b5132 13876void
e3bb37b5 13877i386_validate_fix (fixS *fixp)
252b5132 13878{
02a86693 13879 if (fixp->fx_subsy)
252b5132 13880 {
02a86693 13881 if (fixp->fx_subsy == GOT_symbol)
23df1078 13882 {
02a86693
L
13883 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
13884 {
13885 if (!object_64bit)
13886 abort ();
13887#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13888 if (fixp->fx_tcbit2)
56ceb5b5
L
13889 fixp->fx_r_type = (fixp->fx_tcbit
13890 ? BFD_RELOC_X86_64_REX_GOTPCRELX
13891 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
13892 else
13893#endif
13894 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
13895 }
d6ab8113 13896 else
02a86693
L
13897 {
13898 if (!object_64bit)
13899 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
13900 else
13901 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
13902 }
13903 fixp->fx_subsy = 0;
23df1078 13904 }
252b5132 13905 }
02a86693 13906#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2585b7a5 13907 else
02a86693 13908 {
2585b7a5
L
13909 /* NB: Commit 292676c1 resolved PLT32 reloc aganst local symbol
13910 to section. Since PLT32 relocation must be against symbols,
13911 turn such PLT32 relocation into PC32 relocation. */
13912 if (fixp->fx_addsy
13913 && (fixp->fx_r_type == BFD_RELOC_386_PLT32
13914 || fixp->fx_r_type == BFD_RELOC_X86_64_PLT32)
13915 && symbol_section_p (fixp->fx_addsy))
13916 fixp->fx_r_type = BFD_RELOC_32_PCREL;
13917 if (!object_64bit)
13918 {
13919 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
13920 && fixp->fx_tcbit2)
13921 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
13922 }
02a86693
L
13923 }
13924#endif
252b5132
RH
13925}
13926
252b5132 13927arelent *
7016a5d5 13928tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
13929{
13930 arelent *rel;
13931 bfd_reloc_code_real_type code;
13932
13933 switch (fixp->fx_r_type)
13934 {
8ce3d284 13935#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
13936 case BFD_RELOC_SIZE32:
13937 case BFD_RELOC_SIZE64:
13938 if (S_IS_DEFINED (fixp->fx_addsy)
13939 && !S_IS_EXTERNAL (fixp->fx_addsy))
13940 {
13941 /* Resolve size relocation against local symbol to size of
13942 the symbol plus addend. */
13943 valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
13944 if (fixp->fx_r_type == BFD_RELOC_SIZE32
13945 && !fits_in_unsigned_long (value))
13946 as_bad_where (fixp->fx_file, fixp->fx_line,
13947 _("symbol size computation overflow"));
13948 fixp->fx_addsy = NULL;
13949 fixp->fx_subsy = NULL;
13950 md_apply_fix (fixp, (valueT *) &value, NULL);
13951 return NULL;
13952 }
8ce3d284 13953#endif
1a0670f3 13954 /* Fall through. */
8fd4256d 13955
3e73aa7c
JH
13956 case BFD_RELOC_X86_64_PLT32:
13957 case BFD_RELOC_X86_64_GOT32:
13958 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
13959 case BFD_RELOC_X86_64_GOTPCRELX:
13960 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
13961 case BFD_RELOC_386_PLT32:
13962 case BFD_RELOC_386_GOT32:
02a86693 13963 case BFD_RELOC_386_GOT32X:
252b5132
RH
13964 case BFD_RELOC_386_GOTOFF:
13965 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
13966 case BFD_RELOC_386_TLS_GD:
13967 case BFD_RELOC_386_TLS_LDM:
13968 case BFD_RELOC_386_TLS_LDO_32:
13969 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
13970 case BFD_RELOC_386_TLS_IE:
13971 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
13972 case BFD_RELOC_386_TLS_LE_32:
13973 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
13974 case BFD_RELOC_386_TLS_GOTDESC:
13975 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
13976 case BFD_RELOC_X86_64_TLSGD:
13977 case BFD_RELOC_X86_64_TLSLD:
13978 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 13979 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
13980 case BFD_RELOC_X86_64_GOTTPOFF:
13981 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
13982 case BFD_RELOC_X86_64_TPOFF64:
13983 case BFD_RELOC_X86_64_GOTOFF64:
13984 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
13985 case BFD_RELOC_X86_64_GOT64:
13986 case BFD_RELOC_X86_64_GOTPCREL64:
13987 case BFD_RELOC_X86_64_GOTPC64:
13988 case BFD_RELOC_X86_64_GOTPLT64:
13989 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
13990 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
13991 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
13992 case BFD_RELOC_RVA:
13993 case BFD_RELOC_VTABLE_ENTRY:
13994 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
13995#ifdef TE_PE
13996 case BFD_RELOC_32_SECREL:
13997#endif
252b5132
RH
13998 code = fixp->fx_r_type;
13999 break;
dbbaec26
L
14000 case BFD_RELOC_X86_64_32S:
14001 if (!fixp->fx_pcrel)
14002 {
14003 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
14004 code = fixp->fx_r_type;
14005 break;
14006 }
1a0670f3 14007 /* Fall through. */
252b5132 14008 default:
93382f6d 14009 if (fixp->fx_pcrel)
252b5132 14010 {
93382f6d
AM
14011 switch (fixp->fx_size)
14012 {
14013 default:
b091f402
AM
14014 as_bad_where (fixp->fx_file, fixp->fx_line,
14015 _("can not do %d byte pc-relative relocation"),
14016 fixp->fx_size);
93382f6d
AM
14017 code = BFD_RELOC_32_PCREL;
14018 break;
14019 case 1: code = BFD_RELOC_8_PCREL; break;
14020 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 14021 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
14022#ifdef BFD64
14023 case 8: code = BFD_RELOC_64_PCREL; break;
14024#endif
93382f6d
AM
14025 }
14026 }
14027 else
14028 {
14029 switch (fixp->fx_size)
14030 {
14031 default:
b091f402
AM
14032 as_bad_where (fixp->fx_file, fixp->fx_line,
14033 _("can not do %d byte relocation"),
14034 fixp->fx_size);
93382f6d
AM
14035 code = BFD_RELOC_32;
14036 break;
14037 case 1: code = BFD_RELOC_8; break;
14038 case 2: code = BFD_RELOC_16; break;
14039 case 4: code = BFD_RELOC_32; break;
937149dd 14040#ifdef BFD64
3e73aa7c 14041 case 8: code = BFD_RELOC_64; break;
937149dd 14042#endif
93382f6d 14043 }
252b5132
RH
14044 }
14045 break;
14046 }
252b5132 14047
d182319b
JB
14048 if ((code == BFD_RELOC_32
14049 || code == BFD_RELOC_32_PCREL
14050 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
14051 && GOT_symbol
14052 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 14053 {
4fa24527 14054 if (!object_64bit)
d6ab8113
JB
14055 code = BFD_RELOC_386_GOTPC;
14056 else
14057 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 14058 }
7b81dfbb
AJ
14059 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
14060 && GOT_symbol
14061 && fixp->fx_addsy == GOT_symbol)
14062 {
14063 code = BFD_RELOC_X86_64_GOTPC64;
14064 }
252b5132 14065
add39d23
TS
14066 rel = XNEW (arelent);
14067 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 14068 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
14069
14070 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 14071
3e73aa7c
JH
14072 if (!use_rela_relocations)
14073 {
14074 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
14075 vtable entry to be used in the relocation's section offset. */
14076 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14077 rel->address = fixp->fx_offset;
fbeb56a4
DK
14078#if defined (OBJ_COFF) && defined (TE_PE)
14079 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
14080 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
14081 else
14082#endif
c6682705 14083 rel->addend = 0;
3e73aa7c
JH
14084 }
14085 /* Use the rela in 64bit mode. */
252b5132 14086 else
3e73aa7c 14087 {
862be3fb
L
14088 if (disallow_64bit_reloc)
14089 switch (code)
14090 {
862be3fb
L
14091 case BFD_RELOC_X86_64_DTPOFF64:
14092 case BFD_RELOC_X86_64_TPOFF64:
14093 case BFD_RELOC_64_PCREL:
14094 case BFD_RELOC_X86_64_GOTOFF64:
14095 case BFD_RELOC_X86_64_GOT64:
14096 case BFD_RELOC_X86_64_GOTPCREL64:
14097 case BFD_RELOC_X86_64_GOTPC64:
14098 case BFD_RELOC_X86_64_GOTPLT64:
14099 case BFD_RELOC_X86_64_PLTOFF64:
14100 as_bad_where (fixp->fx_file, fixp->fx_line,
14101 _("cannot represent relocation type %s in x32 mode"),
14102 bfd_get_reloc_code_name (code));
14103 break;
14104 default:
14105 break;
14106 }
14107
062cd5e7
AS
14108 if (!fixp->fx_pcrel)
14109 rel->addend = fixp->fx_offset;
14110 else
14111 switch (code)
14112 {
14113 case BFD_RELOC_X86_64_PLT32:
14114 case BFD_RELOC_X86_64_GOT32:
14115 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
14116 case BFD_RELOC_X86_64_GOTPCRELX:
14117 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
14118 case BFD_RELOC_X86_64_TLSGD:
14119 case BFD_RELOC_X86_64_TLSLD:
14120 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
14121 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
14122 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
14123 rel->addend = fixp->fx_offset - fixp->fx_size;
14124 break;
14125 default:
14126 rel->addend = (section->vma
14127 - fixp->fx_size
14128 + fixp->fx_addnumber
14129 + md_pcrel_from (fixp));
14130 break;
14131 }
3e73aa7c
JH
14132 }
14133
252b5132
RH
14134 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
14135 if (rel->howto == NULL)
14136 {
14137 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 14138 _("cannot represent relocation type %s"),
252b5132
RH
14139 bfd_get_reloc_code_name (code));
14140 /* Set howto to a garbage value so that we can keep going. */
14141 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 14142 gas_assert (rel->howto != NULL);
252b5132
RH
14143 }
14144
14145 return rel;
14146}
14147
ee86248c 14148#include "tc-i386-intel.c"
54cfded0 14149
a60de03c
JB
14150void
14151tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 14152{
a60de03c
JB
14153 int saved_naked_reg;
14154 char saved_register_dot;
54cfded0 14155
a60de03c
JB
14156 saved_naked_reg = allow_naked_reg;
14157 allow_naked_reg = 1;
14158 saved_register_dot = register_chars['.'];
14159 register_chars['.'] = '.';
14160 allow_pseudo_reg = 1;
14161 expression_and_evaluate (exp);
14162 allow_pseudo_reg = 0;
14163 register_chars['.'] = saved_register_dot;
14164 allow_naked_reg = saved_naked_reg;
14165
e96d56a1 14166 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 14167 {
a60de03c
JB
14168 if ((addressT) exp->X_add_number < i386_regtab_size)
14169 {
14170 exp->X_op = O_constant;
14171 exp->X_add_number = i386_regtab[exp->X_add_number]
14172 .dw2_regnum[flag_code >> 1];
14173 }
14174 else
14175 exp->X_op = O_illegal;
54cfded0 14176 }
54cfded0
AM
14177}
14178
14179void
14180tc_x86_frame_initial_instructions (void)
14181{
a60de03c
JB
14182 static unsigned int sp_regno[2];
14183
14184 if (!sp_regno[flag_code >> 1])
14185 {
14186 char *saved_input = input_line_pointer;
14187 char sp[][4] = {"esp", "rsp"};
14188 expressionS exp;
a4447b93 14189
a60de03c
JB
14190 input_line_pointer = sp[flag_code >> 1];
14191 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 14192 gas_assert (exp.X_op == O_constant);
a60de03c
JB
14193 sp_regno[flag_code >> 1] = exp.X_add_number;
14194 input_line_pointer = saved_input;
14195 }
a4447b93 14196
61ff971f
L
14197 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
14198 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 14199}
d2b2c203 14200
d7921315
L
14201int
14202x86_dwarf2_addr_size (void)
14203{
14204#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
14205 if (x86_elf_abi == X86_64_X32_ABI)
14206 return 4;
14207#endif
14208 return bfd_arch_bits_per_address (stdoutput) / 8;
14209}
14210
d2b2c203
DJ
14211int
14212i386_elf_section_type (const char *str, size_t len)
14213{
14214 if (flag_code == CODE_64BIT
14215 && len == sizeof ("unwind") - 1
14216 && strncmp (str, "unwind", 6) == 0)
14217 return SHT_X86_64_UNWIND;
14218
14219 return -1;
14220}
bb41ade5 14221
ad5fec3b
EB
14222#ifdef TE_SOLARIS
14223void
14224i386_solaris_fix_up_eh_frame (segT sec)
14225{
14226 if (flag_code == CODE_64BIT)
14227 elf_section_type (sec) = SHT_X86_64_UNWIND;
14228}
14229#endif
14230
bb41ade5
AM
14231#ifdef TE_PE
14232void
14233tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
14234{
91d6fa6a 14235 expressionS exp;
bb41ade5 14236
91d6fa6a
NC
14237 exp.X_op = O_secrel;
14238 exp.X_add_symbol = symbol;
14239 exp.X_add_number = 0;
14240 emit_expr (&exp, size);
bb41ade5
AM
14241}
14242#endif
3b22753a
L
14243
14244#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14245/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
14246
01e1a5bc 14247bfd_vma
6d4af3c2 14248x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
14249{
14250 if (flag_code == CODE_64BIT)
14251 {
14252 if (letter == 'l')
14253 return SHF_X86_64_LARGE;
14254
8f3bae45 14255 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 14256 }
3b22753a 14257 else
8f3bae45 14258 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
14259 return -1;
14260}
14261
01e1a5bc 14262bfd_vma
3b22753a
L
14263x86_64_section_word (char *str, size_t len)
14264{
8620418b 14265 if (len == 5 && flag_code == CODE_64BIT && CONST_STRNEQ (str, "large"))
3b22753a
L
14266 return SHF_X86_64_LARGE;
14267
14268 return -1;
14269}
14270
14271static void
14272handle_large_common (int small ATTRIBUTE_UNUSED)
14273{
14274 if (flag_code != CODE_64BIT)
14275 {
14276 s_comm_internal (0, elf_common_parse);
14277 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
14278 }
14279 else
14280 {
14281 static segT lbss_section;
14282 asection *saved_com_section_ptr = elf_com_section_ptr;
14283 asection *saved_bss_section = bss_section;
14284
14285 if (lbss_section == NULL)
14286 {
14287 flagword applicable;
14288 segT seg = now_seg;
14289 subsegT subseg = now_subseg;
14290
14291 /* The .lbss section is for local .largecomm symbols. */
14292 lbss_section = subseg_new (".lbss", 0);
14293 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 14294 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
14295 seg_info (lbss_section)->bss = 1;
14296
14297 subseg_set (seg, subseg);
14298 }
14299
14300 elf_com_section_ptr = &_bfd_elf_large_com_section;
14301 bss_section = lbss_section;
14302
14303 s_comm_internal (0, elf_common_parse);
14304
14305 elf_com_section_ptr = saved_com_section_ptr;
14306 bss_section = saved_bss_section;
14307 }
14308}
14309#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
This page took 3.476308 seconds and 4 git commands to generate.