x86: fold EsSeg into IsString
[deliverable/binutils-gdb.git] / gas / config / tc-i386.c
CommitLineData
b534c6d3 1/* tc-i386.c -- Assemble code for the Intel 80386
82704155 2 Copyright (C) 1989-2019 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
252b5132
RH
47#ifndef REGISTER_WARNINGS
48#define REGISTER_WARNINGS 1
49#endif
50
c3332e24 51#ifndef INFER_ADDR_PREFIX
eecb386c 52#define INFER_ADDR_PREFIX 1
c3332e24
AM
53#endif
54
29b0f896
AM
55#ifndef DEFAULT_ARCH
56#define DEFAULT_ARCH "i386"
246fcdee 57#endif
252b5132 58
edde18a5
AM
59#ifndef INLINE
60#if __GNUC__ >= 2
61#define INLINE __inline__
62#else
63#define INLINE
64#endif
65#endif
66
6305a203
L
67/* Prefixes will be emitted in the order defined below.
68 WAIT_PREFIX must be the first prefix since FWAIT is really is an
69 instruction, and so must come before any prefixes.
70 The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
42164a71 71 REP_PREFIX/HLE_PREFIX, LOCK_PREFIX. */
6305a203
L
72#define WAIT_PREFIX 0
73#define SEG_PREFIX 1
74#define ADDR_PREFIX 2
75#define DATA_PREFIX 3
c32fa91d 76#define REP_PREFIX 4
42164a71 77#define HLE_PREFIX REP_PREFIX
7e8b059b 78#define BND_PREFIX REP_PREFIX
c32fa91d 79#define LOCK_PREFIX 5
4e9ac44a
L
80#define REX_PREFIX 6 /* must come last. */
81#define MAX_PREFIXES 7 /* max prefixes per opcode */
6305a203
L
82
83/* we define the syntax here (modulo base,index,scale syntax) */
84#define REGISTER_PREFIX '%'
85#define IMMEDIATE_PREFIX '$'
86#define ABSOLUTE_PREFIX '*'
87
88/* these are the instruction mnemonic suffixes in AT&T syntax or
89 memory operand size in Intel syntax. */
90#define WORD_MNEM_SUFFIX 'w'
91#define BYTE_MNEM_SUFFIX 'b'
92#define SHORT_MNEM_SUFFIX 's'
93#define LONG_MNEM_SUFFIX 'l'
94#define QWORD_MNEM_SUFFIX 'q'
6305a203
L
95/* Intel Syntax. Use a non-ascii letter since since it never appears
96 in instructions. */
97#define LONG_DOUBLE_MNEM_SUFFIX '\1'
98
99#define END_OF_INSN '\0'
100
79dec6b7
JB
101/* This matches the C -> StaticRounding alias in the opcode table. */
102#define commutative staticrounding
103
6305a203
L
104/*
105 'templates' is for grouping together 'template' structures for opcodes
106 of the same name. This is only used for storing the insns in the grand
107 ole hash table of insns.
108 The templates themselves start at START and range up to (but not including)
109 END.
110 */
111typedef struct
112{
d3ce72d0
NC
113 const insn_template *start;
114 const insn_template *end;
6305a203
L
115}
116templates;
117
118/* 386 operand encoding bytes: see 386 book for details of this. */
119typedef struct
120{
121 unsigned int regmem; /* codes register or memory operand */
122 unsigned int reg; /* codes register operand (or extended opcode) */
123 unsigned int mode; /* how to interpret regmem & reg */
124}
125modrm_byte;
126
127/* x86-64 extension prefix. */
128typedef int rex_byte;
129
6305a203
L
130/* 386 opcode byte to code indirect addressing. */
131typedef struct
132{
133 unsigned base;
134 unsigned index;
135 unsigned scale;
136}
137sib_byte;
138
6305a203
L
139/* x86 arch names, types and features */
140typedef struct
141{
142 const char *name; /* arch name */
8a2c8fef 143 unsigned int len; /* arch string length */
6305a203
L
144 enum processor_type type; /* arch type */
145 i386_cpu_flags flags; /* cpu feature flags */
8a2c8fef 146 unsigned int skip; /* show_arch should skip this. */
6305a203
L
147}
148arch_entry;
149
293f5f65
L
150/* Used to turn off indicated flags. */
151typedef struct
152{
153 const char *name; /* arch name */
154 unsigned int len; /* arch string length */
155 i386_cpu_flags flags; /* cpu feature flags */
156}
157noarch_entry;
158
78f12dd3 159static void update_code_flag (int, int);
e3bb37b5
L
160static void set_code_flag (int);
161static void set_16bit_gcc_code_flag (int);
162static void set_intel_syntax (int);
1efbbeb4 163static void set_intel_mnemonic (int);
db51cc60 164static void set_allow_index_reg (int);
7bab8ab5 165static void set_check (int);
e3bb37b5 166static void set_cpu_arch (int);
6482c264 167#ifdef TE_PE
e3bb37b5 168static void pe_directive_secrel (int);
6482c264 169#endif
e3bb37b5
L
170static void signed_cons (int);
171static char *output_invalid (int c);
ee86248c
JB
172static int i386_finalize_immediate (segT, expressionS *, i386_operand_type,
173 const char *);
174static int i386_finalize_displacement (segT, expressionS *, i386_operand_type,
175 const char *);
a7619375 176static int i386_att_operand (char *);
e3bb37b5 177static int i386_intel_operand (char *, int);
ee86248c
JB
178static int i386_intel_simplify (expressionS *);
179static int i386_intel_parse_name (const char *, expressionS *);
e3bb37b5
L
180static const reg_entry *parse_register (char *, char **);
181static char *parse_insn (char *, char *);
182static char *parse_operands (char *, const char *);
183static void swap_operands (void);
4d456e3d 184static void swap_2_operands (int, int);
e3bb37b5
L
185static void optimize_imm (void);
186static void optimize_disp (void);
83b16ac6 187static const insn_template *match_template (char);
e3bb37b5
L
188static int check_string (void);
189static int process_suffix (void);
190static int check_byte_reg (void);
191static int check_long_reg (void);
192static int check_qword_reg (void);
193static int check_word_reg (void);
194static int finalize_imm (void);
195static int process_operands (void);
196static const seg_entry *build_modrm_byte (void);
197static void output_insn (void);
198static void output_imm (fragS *, offsetT);
199static void output_disp (fragS *, offsetT);
29b0f896 200#ifndef I386COFF
e3bb37b5 201static void s_bss (int);
252b5132 202#endif
17d4e2a2
L
203#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
204static void handle_large_common (int small ATTRIBUTE_UNUSED);
b4a3a7b4
L
205
206/* GNU_PROPERTY_X86_ISA_1_USED. */
207static unsigned int x86_isa_1_used;
208/* GNU_PROPERTY_X86_FEATURE_2_USED. */
209static unsigned int x86_feature_2_used;
210/* Generate x86 used ISA and feature properties. */
211static unsigned int x86_used_note = DEFAULT_X86_USED_NOTE;
17d4e2a2 212#endif
252b5132 213
a847613f 214static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 215
43234a1e
L
216/* This struct describes rounding control and SAE in the instruction. */
217struct RC_Operation
218{
219 enum rc_type
220 {
221 rne = 0,
222 rd,
223 ru,
224 rz,
225 saeonly
226 } type;
227 int operand;
228};
229
230static struct RC_Operation rc_op;
231
232/* The struct describes masking, applied to OPERAND in the instruction.
233 MASK is a pointer to the corresponding mask register. ZEROING tells
234 whether merging or zeroing mask is used. */
235struct Mask_Operation
236{
237 const reg_entry *mask;
238 unsigned int zeroing;
239 /* The operand where this operation is associated. */
240 int operand;
241};
242
243static struct Mask_Operation mask_op;
244
245/* The struct describes broadcasting, applied to OPERAND. FACTOR is
246 broadcast factor. */
247struct Broadcast_Operation
248{
8e6e0792 249 /* Type of broadcast: {1to2}, {1to4}, {1to8}, or {1to16}. */
43234a1e
L
250 int type;
251
252 /* Index of broadcasted operand. */
253 int operand;
4a1b91ea
L
254
255 /* Number of bytes to broadcast. */
256 int bytes;
43234a1e
L
257};
258
259static struct Broadcast_Operation broadcast_op;
260
c0f3af97
L
261/* VEX prefix. */
262typedef struct
263{
43234a1e
L
264 /* VEX prefix is either 2 byte or 3 byte. EVEX is 4 byte. */
265 unsigned char bytes[4];
c0f3af97
L
266 unsigned int length;
267 /* Destination or source register specifier. */
268 const reg_entry *register_specifier;
269} vex_prefix;
270
252b5132 271/* 'md_assemble ()' gathers together information and puts it into a
47926f60 272 i386_insn. */
252b5132 273
520dc8e8
AM
274union i386_op
275 {
276 expressionS *disps;
277 expressionS *imms;
278 const reg_entry *regs;
279 };
280
a65babc9
L
281enum i386_error
282 {
86e026a4 283 operand_size_mismatch,
a65babc9
L
284 operand_type_mismatch,
285 register_type_mismatch,
286 number_of_operands_mismatch,
287 invalid_instruction_suffix,
288 bad_imm4,
a65babc9
L
289 unsupported_with_intel_mnemonic,
290 unsupported_syntax,
6c30d220
L
291 unsupported,
292 invalid_vsib_address,
7bab8ab5 293 invalid_vector_register_set,
43234a1e
L
294 unsupported_vector_index_register,
295 unsupported_broadcast,
43234a1e
L
296 broadcast_needed,
297 unsupported_masking,
298 mask_not_on_destination,
299 no_default_mask,
300 unsupported_rc_sae,
301 rc_sae_operand_not_last_imm,
302 invalid_register_operand,
a65babc9
L
303 };
304
252b5132
RH
305struct _i386_insn
306 {
47926f60 307 /* TM holds the template for the insn were currently assembling. */
d3ce72d0 308 insn_template tm;
252b5132 309
7d5e4556
L
310 /* SUFFIX holds the instruction size suffix for byte, word, dword
311 or qword, if given. */
252b5132
RH
312 char suffix;
313
47926f60 314 /* OPERANDS gives the number of given operands. */
252b5132
RH
315 unsigned int operands;
316
317 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
318 of given register, displacement, memory operands and immediate
47926f60 319 operands. */
252b5132
RH
320 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
321
322 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 323 use OP[i] for the corresponding operand. */
40fb9820 324 i386_operand_type types[MAX_OPERANDS];
252b5132 325
520dc8e8
AM
326 /* Displacement expression, immediate expression, or register for each
327 operand. */
328 union i386_op op[MAX_OPERANDS];
252b5132 329
3e73aa7c
JH
330 /* Flags for operands. */
331 unsigned int flags[MAX_OPERANDS];
332#define Operand_PCrel 1
c48dadc9 333#define Operand_Mem 2
3e73aa7c 334
252b5132 335 /* Relocation type for operand */
f86103b7 336 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 337
252b5132
RH
338 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
339 the base index byte below. */
340 const reg_entry *base_reg;
341 const reg_entry *index_reg;
342 unsigned int log2_scale_factor;
343
344 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 345 explicit segment overrides are given. */
ce8a8b2f 346 const seg_entry *seg[2];
252b5132 347
8325cc63
JB
348 /* Copied first memory operand string, for re-checking. */
349 char *memop1_string;
350
252b5132
RH
351 /* PREFIX holds all the given prefix opcodes (usually null).
352 PREFIXES is the number of prefix opcodes. */
353 unsigned int prefixes;
354 unsigned char prefix[MAX_PREFIXES];
355
b4a3a7b4
L
356 /* Has MMX register operands. */
357 bfd_boolean has_regmmx;
358
359 /* Has XMM register operands. */
360 bfd_boolean has_regxmm;
361
362 /* Has YMM register operands. */
363 bfd_boolean has_regymm;
364
365 /* Has ZMM register operands. */
366 bfd_boolean has_regzmm;
367
252b5132 368 /* RM and SIB are the modrm byte and the sib byte where the
c1e679ec 369 addressing modes of this insn are encoded. */
252b5132 370 modrm_byte rm;
3e73aa7c 371 rex_byte rex;
43234a1e 372 rex_byte vrex;
252b5132 373 sib_byte sib;
c0f3af97 374 vex_prefix vex;
b6169b20 375
43234a1e
L
376 /* Masking attributes. */
377 struct Mask_Operation *mask;
378
379 /* Rounding control and SAE attributes. */
380 struct RC_Operation *rounding;
381
382 /* Broadcasting attributes. */
383 struct Broadcast_Operation *broadcast;
384
385 /* Compressed disp8*N attribute. */
386 unsigned int memshift;
387
86fa6981
L
388 /* Prefer load or store in encoding. */
389 enum
390 {
391 dir_encoding_default = 0,
392 dir_encoding_load,
64c49ab3
JB
393 dir_encoding_store,
394 dir_encoding_swap
86fa6981 395 } dir_encoding;
891edac4 396
a501d77e
L
397 /* Prefer 8bit or 32bit displacement in encoding. */
398 enum
399 {
400 disp_encoding_default = 0,
401 disp_encoding_8bit,
402 disp_encoding_32bit
403 } disp_encoding;
f8a5c266 404
6b6b6807
L
405 /* Prefer the REX byte in encoding. */
406 bfd_boolean rex_encoding;
407
b6f8c7c4
L
408 /* Disable instruction size optimization. */
409 bfd_boolean no_optimize;
410
86fa6981
L
411 /* How to encode vector instructions. */
412 enum
413 {
414 vex_encoding_default = 0,
415 vex_encoding_vex2,
416 vex_encoding_vex3,
417 vex_encoding_evex
418 } vec_encoding;
419
d5de92cf
L
420 /* REP prefix. */
421 const char *rep_prefix;
422
165de32a
L
423 /* HLE prefix. */
424 const char *hle_prefix;
42164a71 425
7e8b059b
L
426 /* Have BND prefix. */
427 const char *bnd_prefix;
428
04ef582a
L
429 /* Have NOTRACK prefix. */
430 const char *notrack_prefix;
431
891edac4 432 /* Error message. */
a65babc9 433 enum i386_error error;
252b5132
RH
434 };
435
436typedef struct _i386_insn i386_insn;
437
43234a1e
L
438/* Link RC type with corresponding string, that'll be looked for in
439 asm. */
440struct RC_name
441{
442 enum rc_type type;
443 const char *name;
444 unsigned int len;
445};
446
447static const struct RC_name RC_NamesTable[] =
448{
449 { rne, STRING_COMMA_LEN ("rn-sae") },
450 { rd, STRING_COMMA_LEN ("rd-sae") },
451 { ru, STRING_COMMA_LEN ("ru-sae") },
452 { rz, STRING_COMMA_LEN ("rz-sae") },
453 { saeonly, STRING_COMMA_LEN ("sae") },
454};
455
252b5132
RH
456/* List of chars besides those in app.c:symbol_chars that can start an
457 operand. Used to prevent the scrubber eating vital white-space. */
86fa6981 458const char extra_symbol_chars[] = "*%-([{}"
252b5132 459#ifdef LEX_AT
32137342
NC
460 "@"
461#endif
462#ifdef LEX_QM
463 "?"
252b5132 464#endif
32137342 465 ;
252b5132 466
29b0f896
AM
467#if (defined (TE_I386AIX) \
468 || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
3896cfd5 469 && !defined (TE_GNU) \
29b0f896 470 && !defined (TE_LINUX) \
8d63c93e 471 && !defined (TE_NACL) \
29b0f896 472 && !defined (TE_FreeBSD) \
5b806d27 473 && !defined (TE_DragonFly) \
29b0f896 474 && !defined (TE_NetBSD)))
252b5132 475/* This array holds the chars that always start a comment. If the
b3b91714
AM
476 pre-processor is disabled, these aren't very useful. The option
477 --divide will remove '/' from this list. */
478const char *i386_comment_chars = "#/";
479#define SVR4_COMMENT_CHARS 1
252b5132 480#define PREFIX_SEPARATOR '\\'
252b5132 481
b3b91714
AM
482#else
483const char *i386_comment_chars = "#";
484#define PREFIX_SEPARATOR '/'
485#endif
486
252b5132
RH
487/* This array holds the chars that only start a comment at the beginning of
488 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
489 .line and .file directives will appear in the pre-processed output.
490 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 491 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
492 #NO_APP at the beginning of its output.
493 Also note that comments started like this one will always work if
252b5132 494 '/' isn't otherwise defined. */
b3b91714 495const char line_comment_chars[] = "#/";
252b5132 496
63a0b638 497const char line_separator_chars[] = ";";
252b5132 498
ce8a8b2f
AM
499/* Chars that can be used to separate mant from exp in floating point
500 nums. */
252b5132
RH
501const char EXP_CHARS[] = "eE";
502
ce8a8b2f
AM
503/* Chars that mean this number is a floating point constant
504 As in 0f12.456
505 or 0d1.2345e12. */
252b5132
RH
506const char FLT_CHARS[] = "fFdDxX";
507
ce8a8b2f 508/* Tables for lexical analysis. */
252b5132
RH
509static char mnemonic_chars[256];
510static char register_chars[256];
511static char operand_chars[256];
512static char identifier_chars[256];
513static char digit_chars[256];
514
ce8a8b2f 515/* Lexical macros. */
252b5132
RH
516#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
517#define is_operand_char(x) (operand_chars[(unsigned char) x])
518#define is_register_char(x) (register_chars[(unsigned char) x])
519#define is_space_char(x) ((x) == ' ')
520#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
521#define is_digit_char(x) (digit_chars[(unsigned char) x])
522
0234cb7c 523/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
524static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
525
526/* md_assemble() always leaves the strings it's passed unaltered. To
527 effect this we maintain a stack of saved characters that we've smashed
528 with '\0's (indicating end of strings for various sub-fields of the
47926f60 529 assembler instruction). */
252b5132 530static char save_stack[32];
ce8a8b2f 531static char *save_stack_p;
252b5132
RH
532#define END_STRING_AND_SAVE(s) \
533 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
534#define RESTORE_END_STRING(s) \
535 do { *(s) = *--save_stack_p; } while (0)
536
47926f60 537/* The instruction we're assembling. */
252b5132
RH
538static i386_insn i;
539
540/* Possible templates for current insn. */
541static const templates *current_templates;
542
31b2323c
L
543/* Per instruction expressionS buffers: max displacements & immediates. */
544static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
545static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 546
47926f60 547/* Current operand we are working on. */
ee86248c 548static int this_operand = -1;
252b5132 549
3e73aa7c
JH
550/* We support four different modes. FLAG_CODE variable is used to distinguish
551 these. */
552
553enum flag_code {
554 CODE_32BIT,
555 CODE_16BIT,
556 CODE_64BIT };
557
558static enum flag_code flag_code;
4fa24527 559static unsigned int object_64bit;
862be3fb 560static unsigned int disallow_64bit_reloc;
3e73aa7c
JH
561static int use_rela_relocations = 0;
562
7af8ed2d
NC
563#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
564 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
565 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
566
351f65ca
L
567/* The ELF ABI to use. */
568enum x86_elf_abi
569{
570 I386_ABI,
7f56bc95
L
571 X86_64_ABI,
572 X86_64_X32_ABI
351f65ca
L
573};
574
575static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 576#endif
351f65ca 577
167ad85b
TG
578#if defined (TE_PE) || defined (TE_PEP)
579/* Use big object file format. */
580static int use_big_obj = 0;
581#endif
582
8dcea932
L
583#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
584/* 1 if generating code for a shared library. */
585static int shared = 0;
586#endif
587
47926f60
KH
588/* 1 for intel syntax,
589 0 if att syntax. */
590static int intel_syntax = 0;
252b5132 591
e89c5eaa
L
592/* 1 for Intel64 ISA,
593 0 if AMD64 ISA. */
594static int intel64;
595
1efbbeb4
L
596/* 1 for intel mnemonic,
597 0 if att mnemonic. */
598static int intel_mnemonic = !SYSV386_COMPAT;
599
a60de03c
JB
600/* 1 if pseudo registers are permitted. */
601static int allow_pseudo_reg = 0;
602
47926f60
KH
603/* 1 if register prefix % not required. */
604static int allow_naked_reg = 0;
252b5132 605
33eaf5de 606/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
607 instructions supporting it, even if this prefix wasn't specified
608 explicitly. */
609static int add_bnd_prefix = 0;
610
ba104c83 611/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
612static int allow_index_reg = 0;
613
d022bddd
IT
614/* 1 if the assembler should ignore LOCK prefix, even if it was
615 specified explicitly. */
616static int omit_lock_prefix = 0;
617
e4e00185
AS
618/* 1 if the assembler should encode lfence, mfence, and sfence as
619 "lock addl $0, (%{re}sp)". */
620static int avoid_fence = 0;
621
0cb4071e
L
622/* 1 if the assembler should generate relax relocations. */
623
624static int generate_relax_relocations
625 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
626
7bab8ab5 627static enum check_kind
daf50ae7 628 {
7bab8ab5
JB
629 check_none = 0,
630 check_warning,
631 check_error
daf50ae7 632 }
7bab8ab5 633sse_check, operand_check = check_warning;
daf50ae7 634
b6f8c7c4
L
635/* Optimization:
636 1. Clear the REX_W bit with register operand if possible.
637 2. Above plus use 128bit vector instruction to clear the full vector
638 register.
639 */
640static int optimize = 0;
641
642/* Optimization:
643 1. Clear the REX_W bit with register operand if possible.
644 2. Above plus use 128bit vector instruction to clear the full vector
645 register.
646 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
647 "testb $imm7,%r8".
648 */
649static int optimize_for_space = 0;
650
2ca3ace5
L
651/* Register prefix used for error message. */
652static const char *register_prefix = "%";
653
47926f60
KH
654/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
655 leave, push, and pop instructions so that gcc has the same stack
656 frame as in 32 bit mode. */
657static char stackop_size = '\0';
eecb386c 658
12b55ccc
L
659/* Non-zero to optimize code alignment. */
660int optimize_align_code = 1;
661
47926f60
KH
662/* Non-zero to quieten some warnings. */
663static int quiet_warnings = 0;
a38cf1db 664
47926f60
KH
665/* CPU name. */
666static const char *cpu_arch_name = NULL;
6305a203 667static char *cpu_sub_arch_name = NULL;
a38cf1db 668
47926f60 669/* CPU feature flags. */
40fb9820
L
670static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
671
ccc9c027
L
672/* If we have selected a cpu we are generating instructions for. */
673static int cpu_arch_tune_set = 0;
674
9103f4f4 675/* Cpu we are generating instructions for. */
fbf3f584 676enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4
L
677
678/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 679static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 680
ccc9c027 681/* CPU instruction set architecture used. */
fbf3f584 682enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 683
9103f4f4 684/* CPU feature flags of instruction set architecture used. */
fbf3f584 685i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 686
fddf5b5b
AM
687/* If set, conditional jumps are not automatically promoted to handle
688 larger than a byte offset. */
689static unsigned int no_cond_jump_promotion = 0;
690
c0f3af97
L
691/* Encode SSE instructions with VEX prefix. */
692static unsigned int sse2avx;
693
539f890d
L
694/* Encode scalar AVX instructions with specific vector length. */
695static enum
696 {
697 vex128 = 0,
698 vex256
699 } avxscalar;
700
03751133
L
701/* Encode VEX WIG instructions with specific vex.w. */
702static enum
703 {
704 vexw0 = 0,
705 vexw1
706 } vexwig;
707
43234a1e
L
708/* Encode scalar EVEX LIG instructions with specific vector length. */
709static enum
710 {
711 evexl128 = 0,
712 evexl256,
713 evexl512
714 } evexlig;
715
716/* Encode EVEX WIG instructions with specific evex.w. */
717static enum
718 {
719 evexw0 = 0,
720 evexw1
721 } evexwig;
722
d3d3c6db
IT
723/* Value to encode in EVEX RC bits, for SAE-only instructions. */
724static enum rc_type evexrcig = rne;
725
29b0f896 726/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 727static symbolS *GOT_symbol;
29b0f896 728
a4447b93
RH
729/* The dwarf2 return column, adjusted for 32 or 64 bit. */
730unsigned int x86_dwarf2_return_column;
731
732/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
733int x86_cie_data_alignment;
734
252b5132 735/* Interface to relax_segment.
fddf5b5b
AM
736 There are 3 major relax states for 386 jump insns because the
737 different types of jumps add different sizes to frags when we're
738 figuring out what sort of jump to choose to reach a given label. */
252b5132 739
47926f60 740/* Types. */
93c2a809
AM
741#define UNCOND_JUMP 0
742#define COND_JUMP 1
743#define COND_JUMP86 2
fddf5b5b 744
47926f60 745/* Sizes. */
252b5132
RH
746#define CODE16 1
747#define SMALL 0
29b0f896 748#define SMALL16 (SMALL | CODE16)
252b5132 749#define BIG 2
29b0f896 750#define BIG16 (BIG | CODE16)
252b5132
RH
751
752#ifndef INLINE
753#ifdef __GNUC__
754#define INLINE __inline__
755#else
756#define INLINE
757#endif
758#endif
759
fddf5b5b
AM
760#define ENCODE_RELAX_STATE(type, size) \
761 ((relax_substateT) (((type) << 2) | (size)))
762#define TYPE_FROM_RELAX_STATE(s) \
763 ((s) >> 2)
764#define DISP_SIZE_FROM_RELAX_STATE(s) \
765 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
766
767/* This table is used by relax_frag to promote short jumps to long
768 ones where necessary. SMALL (short) jumps may be promoted to BIG
769 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
770 don't allow a short jump in a 32 bit code segment to be promoted to
771 a 16 bit offset jump because it's slower (requires data size
772 prefix), and doesn't work, unless the destination is in the bottom
773 64k of the code segment (The top 16 bits of eip are zeroed). */
774
775const relax_typeS md_relax_table[] =
776{
24eab124
AM
777 /* The fields are:
778 1) most positive reach of this state,
779 2) most negative reach of this state,
93c2a809 780 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 781 4) which index into the table to try if we can't fit into this one. */
252b5132 782
fddf5b5b 783 /* UNCOND_JUMP states. */
93c2a809
AM
784 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
785 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
786 /* dword jmp adds 4 bytes to frag:
787 0 extra opcode bytes, 4 displacement bytes. */
252b5132 788 {0, 0, 4, 0},
93c2a809
AM
789 /* word jmp adds 2 byte2 to frag:
790 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
791 {0, 0, 2, 0},
792
93c2a809
AM
793 /* COND_JUMP states. */
794 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
795 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
796 /* dword conditionals adds 5 bytes to frag:
797 1 extra opcode byte, 4 displacement bytes. */
798 {0, 0, 5, 0},
fddf5b5b 799 /* word conditionals add 3 bytes to frag:
93c2a809
AM
800 1 extra opcode byte, 2 displacement bytes. */
801 {0, 0, 3, 0},
802
803 /* COND_JUMP86 states. */
804 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
805 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
806 /* dword conditionals adds 5 bytes to frag:
807 1 extra opcode byte, 4 displacement bytes. */
808 {0, 0, 5, 0},
809 /* word conditionals add 4 bytes to frag:
810 1 displacement byte and a 3 byte long branch insn. */
811 {0, 0, 4, 0}
252b5132
RH
812};
813
9103f4f4
L
814static const arch_entry cpu_arch[] =
815{
89507696
JB
816 /* Do not replace the first two entries - i386_target_format()
817 relies on them being there in this order. */
8a2c8fef 818 { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
293f5f65 819 CPU_GENERIC32_FLAGS, 0 },
8a2c8fef 820 { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
293f5f65 821 CPU_GENERIC64_FLAGS, 0 },
8a2c8fef 822 { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
293f5f65 823 CPU_NONE_FLAGS, 0 },
8a2c8fef 824 { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
293f5f65 825 CPU_I186_FLAGS, 0 },
8a2c8fef 826 { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
293f5f65 827 CPU_I286_FLAGS, 0 },
8a2c8fef 828 { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
293f5f65 829 CPU_I386_FLAGS, 0 },
8a2c8fef 830 { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
293f5f65 831 CPU_I486_FLAGS, 0 },
8a2c8fef 832 { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
293f5f65 833 CPU_I586_FLAGS, 0 },
8a2c8fef 834 { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
293f5f65 835 CPU_I686_FLAGS, 0 },
8a2c8fef 836 { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
293f5f65 837 CPU_I586_FLAGS, 0 },
8a2c8fef 838 { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
293f5f65 839 CPU_PENTIUMPRO_FLAGS, 0 },
8a2c8fef 840 { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
293f5f65 841 CPU_P2_FLAGS, 0 },
8a2c8fef 842 { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
293f5f65 843 CPU_P3_FLAGS, 0 },
8a2c8fef 844 { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
293f5f65 845 CPU_P4_FLAGS, 0 },
8a2c8fef 846 { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
293f5f65 847 CPU_CORE_FLAGS, 0 },
8a2c8fef 848 { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
293f5f65 849 CPU_NOCONA_FLAGS, 0 },
8a2c8fef 850 { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
293f5f65 851 CPU_CORE_FLAGS, 1 },
8a2c8fef 852 { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
293f5f65 853 CPU_CORE_FLAGS, 0 },
8a2c8fef 854 { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
293f5f65 855 CPU_CORE2_FLAGS, 1 },
8a2c8fef 856 { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
293f5f65 857 CPU_CORE2_FLAGS, 0 },
8a2c8fef 858 { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
293f5f65 859 CPU_COREI7_FLAGS, 0 },
8a2c8fef 860 { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
293f5f65 861 CPU_L1OM_FLAGS, 0 },
7a9068fe 862 { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
293f5f65 863 CPU_K1OM_FLAGS, 0 },
81486035 864 { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
293f5f65 865 CPU_IAMCU_FLAGS, 0 },
8a2c8fef 866 { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
293f5f65 867 CPU_K6_FLAGS, 0 },
8a2c8fef 868 { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
293f5f65 869 CPU_K6_2_FLAGS, 0 },
8a2c8fef 870 { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
293f5f65 871 CPU_ATHLON_FLAGS, 0 },
8a2c8fef 872 { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
293f5f65 873 CPU_K8_FLAGS, 1 },
8a2c8fef 874 { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
293f5f65 875 CPU_K8_FLAGS, 0 },
8a2c8fef 876 { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
293f5f65 877 CPU_K8_FLAGS, 0 },
8a2c8fef 878 { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
293f5f65 879 CPU_AMDFAM10_FLAGS, 0 },
8aedb9fe 880 { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
293f5f65 881 CPU_BDVER1_FLAGS, 0 },
8aedb9fe 882 { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
293f5f65 883 CPU_BDVER2_FLAGS, 0 },
5e5c50d3 884 { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
293f5f65 885 CPU_BDVER3_FLAGS, 0 },
c7b0bd56 886 { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
293f5f65 887 CPU_BDVER4_FLAGS, 0 },
029f3522 888 { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
293f5f65 889 CPU_ZNVER1_FLAGS, 0 },
a9660a6f
AP
890 { STRING_COMMA_LEN ("znver2"), PROCESSOR_ZNVER,
891 CPU_ZNVER2_FLAGS, 0 },
7b458c12 892 { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
293f5f65 893 CPU_BTVER1_FLAGS, 0 },
7b458c12 894 { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
293f5f65 895 CPU_BTVER2_FLAGS, 0 },
8a2c8fef 896 { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
293f5f65 897 CPU_8087_FLAGS, 0 },
8a2c8fef 898 { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
293f5f65 899 CPU_287_FLAGS, 0 },
8a2c8fef 900 { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
293f5f65 901 CPU_387_FLAGS, 0 },
1848e567
L
902 { STRING_COMMA_LEN (".687"), PROCESSOR_UNKNOWN,
903 CPU_687_FLAGS, 0 },
d871f3f4
L
904 { STRING_COMMA_LEN (".cmov"), PROCESSOR_UNKNOWN,
905 CPU_CMOV_FLAGS, 0 },
906 { STRING_COMMA_LEN (".fxsr"), PROCESSOR_UNKNOWN,
907 CPU_FXSR_FLAGS, 0 },
8a2c8fef 908 { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
293f5f65 909 CPU_MMX_FLAGS, 0 },
8a2c8fef 910 { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
293f5f65 911 CPU_SSE_FLAGS, 0 },
8a2c8fef 912 { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
293f5f65 913 CPU_SSE2_FLAGS, 0 },
8a2c8fef 914 { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
293f5f65 915 CPU_SSE3_FLAGS, 0 },
8a2c8fef 916 { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
293f5f65 917 CPU_SSSE3_FLAGS, 0 },
8a2c8fef 918 { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
293f5f65 919 CPU_SSE4_1_FLAGS, 0 },
8a2c8fef 920 { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
293f5f65 921 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 922 { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
293f5f65 923 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 924 { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
293f5f65 925 CPU_AVX_FLAGS, 0 },
6c30d220 926 { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
293f5f65 927 CPU_AVX2_FLAGS, 0 },
43234a1e 928 { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
293f5f65 929 CPU_AVX512F_FLAGS, 0 },
43234a1e 930 { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
293f5f65 931 CPU_AVX512CD_FLAGS, 0 },
43234a1e 932 { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
293f5f65 933 CPU_AVX512ER_FLAGS, 0 },
43234a1e 934 { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
293f5f65 935 CPU_AVX512PF_FLAGS, 0 },
1dfc6506 936 { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
293f5f65 937 CPU_AVX512DQ_FLAGS, 0 },
1dfc6506 938 { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
293f5f65 939 CPU_AVX512BW_FLAGS, 0 },
1dfc6506 940 { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
293f5f65 941 CPU_AVX512VL_FLAGS, 0 },
8a2c8fef 942 { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
293f5f65 943 CPU_VMX_FLAGS, 0 },
8729a6f6 944 { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
293f5f65 945 CPU_VMFUNC_FLAGS, 0 },
8a2c8fef 946 { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
293f5f65 947 CPU_SMX_FLAGS, 0 },
8a2c8fef 948 { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
293f5f65 949 CPU_XSAVE_FLAGS, 0 },
c7b8aa3a 950 { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
293f5f65 951 CPU_XSAVEOPT_FLAGS, 0 },
1dfc6506 952 { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
293f5f65 953 CPU_XSAVEC_FLAGS, 0 },
1dfc6506 954 { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
293f5f65 955 CPU_XSAVES_FLAGS, 0 },
8a2c8fef 956 { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
293f5f65 957 CPU_AES_FLAGS, 0 },
8a2c8fef 958 { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
293f5f65 959 CPU_PCLMUL_FLAGS, 0 },
8a2c8fef 960 { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
293f5f65 961 CPU_PCLMUL_FLAGS, 1 },
c7b8aa3a 962 { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
293f5f65 963 CPU_FSGSBASE_FLAGS, 0 },
c7b8aa3a 964 { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
293f5f65 965 CPU_RDRND_FLAGS, 0 },
c7b8aa3a 966 { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
293f5f65 967 CPU_F16C_FLAGS, 0 },
6c30d220 968 { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
293f5f65 969 CPU_BMI2_FLAGS, 0 },
8a2c8fef 970 { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
293f5f65 971 CPU_FMA_FLAGS, 0 },
8a2c8fef 972 { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
293f5f65 973 CPU_FMA4_FLAGS, 0 },
8a2c8fef 974 { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
293f5f65 975 CPU_XOP_FLAGS, 0 },
8a2c8fef 976 { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
293f5f65 977 CPU_LWP_FLAGS, 0 },
8a2c8fef 978 { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
293f5f65 979 CPU_MOVBE_FLAGS, 0 },
60aa667e 980 { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
293f5f65 981 CPU_CX16_FLAGS, 0 },
8a2c8fef 982 { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
293f5f65 983 CPU_EPT_FLAGS, 0 },
6c30d220 984 { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
293f5f65 985 CPU_LZCNT_FLAGS, 0 },
42164a71 986 { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
293f5f65 987 CPU_HLE_FLAGS, 0 },
42164a71 988 { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
293f5f65 989 CPU_RTM_FLAGS, 0 },
6c30d220 990 { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
293f5f65 991 CPU_INVPCID_FLAGS, 0 },
8a2c8fef 992 { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
293f5f65 993 CPU_CLFLUSH_FLAGS, 0 },
22109423 994 { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
293f5f65 995 CPU_NOP_FLAGS, 0 },
8a2c8fef 996 { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
293f5f65 997 CPU_SYSCALL_FLAGS, 0 },
8a2c8fef 998 { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
293f5f65 999 CPU_RDTSCP_FLAGS, 0 },
8a2c8fef 1000 { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
293f5f65 1001 CPU_3DNOW_FLAGS, 0 },
8a2c8fef 1002 { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
293f5f65 1003 CPU_3DNOWA_FLAGS, 0 },
8a2c8fef 1004 { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
293f5f65 1005 CPU_PADLOCK_FLAGS, 0 },
8a2c8fef 1006 { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
293f5f65 1007 CPU_SVME_FLAGS, 1 },
8a2c8fef 1008 { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
293f5f65 1009 CPU_SVME_FLAGS, 0 },
8a2c8fef 1010 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
293f5f65 1011 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1012 { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
293f5f65 1013 CPU_ABM_FLAGS, 0 },
87973e9f 1014 { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
293f5f65 1015 CPU_BMI_FLAGS, 0 },
2a2a0f38 1016 { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
293f5f65 1017 CPU_TBM_FLAGS, 0 },
e2e1fcde 1018 { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
293f5f65 1019 CPU_ADX_FLAGS, 0 },
e2e1fcde 1020 { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
293f5f65 1021 CPU_RDSEED_FLAGS, 0 },
e2e1fcde 1022 { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
293f5f65 1023 CPU_PRFCHW_FLAGS, 0 },
5c111e37 1024 { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
293f5f65 1025 CPU_SMAP_FLAGS, 0 },
7e8b059b 1026 { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
293f5f65 1027 CPU_MPX_FLAGS, 0 },
a0046408 1028 { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
293f5f65 1029 CPU_SHA_FLAGS, 0 },
963f3586 1030 { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
293f5f65 1031 CPU_CLFLUSHOPT_FLAGS, 0 },
dcf893b5 1032 { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
293f5f65 1033 CPU_PREFETCHWT1_FLAGS, 0 },
2cf200a4 1034 { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
293f5f65 1035 CPU_SE1_FLAGS, 0 },
c5e7287a 1036 { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
293f5f65 1037 CPU_CLWB_FLAGS, 0 },
2cc1b5aa 1038 { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
293f5f65 1039 CPU_AVX512IFMA_FLAGS, 0 },
14f195c9 1040 { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
293f5f65 1041 CPU_AVX512VBMI_FLAGS, 0 },
920d2ddc
IT
1042 { STRING_COMMA_LEN (".avx512_4fmaps"), PROCESSOR_UNKNOWN,
1043 CPU_AVX512_4FMAPS_FLAGS, 0 },
47acf0bd
IT
1044 { STRING_COMMA_LEN (".avx512_4vnniw"), PROCESSOR_UNKNOWN,
1045 CPU_AVX512_4VNNIW_FLAGS, 0 },
620214f7
IT
1046 { STRING_COMMA_LEN (".avx512_vpopcntdq"), PROCESSOR_UNKNOWN,
1047 CPU_AVX512_VPOPCNTDQ_FLAGS, 0 },
53467f57
IT
1048 { STRING_COMMA_LEN (".avx512_vbmi2"), PROCESSOR_UNKNOWN,
1049 CPU_AVX512_VBMI2_FLAGS, 0 },
8cfcb765
IT
1050 { STRING_COMMA_LEN (".avx512_vnni"), PROCESSOR_UNKNOWN,
1051 CPU_AVX512_VNNI_FLAGS, 0 },
ee6872be
IT
1052 { STRING_COMMA_LEN (".avx512_bitalg"), PROCESSOR_UNKNOWN,
1053 CPU_AVX512_BITALG_FLAGS, 0 },
029f3522 1054 { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
293f5f65 1055 CPU_CLZERO_FLAGS, 0 },
9916071f 1056 { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
293f5f65 1057 CPU_MWAITX_FLAGS, 0 },
8eab4136 1058 { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
293f5f65 1059 CPU_OSPKE_FLAGS, 0 },
8bc52696 1060 { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
293f5f65 1061 CPU_RDPID_FLAGS, 0 },
6b40c462
L
1062 { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
1063 CPU_PTWRITE_FLAGS, 0 },
d777820b
IT
1064 { STRING_COMMA_LEN (".ibt"), PROCESSOR_UNKNOWN,
1065 CPU_IBT_FLAGS, 0 },
1066 { STRING_COMMA_LEN (".shstk"), PROCESSOR_UNKNOWN,
1067 CPU_SHSTK_FLAGS, 0 },
48521003
IT
1068 { STRING_COMMA_LEN (".gfni"), PROCESSOR_UNKNOWN,
1069 CPU_GFNI_FLAGS, 0 },
8dcf1fad
IT
1070 { STRING_COMMA_LEN (".vaes"), PROCESSOR_UNKNOWN,
1071 CPU_VAES_FLAGS, 0 },
ff1982d5
IT
1072 { STRING_COMMA_LEN (".vpclmulqdq"), PROCESSOR_UNKNOWN,
1073 CPU_VPCLMULQDQ_FLAGS, 0 },
3233d7d0
IT
1074 { STRING_COMMA_LEN (".wbnoinvd"), PROCESSOR_UNKNOWN,
1075 CPU_WBNOINVD_FLAGS, 0 },
be3a8dca
IT
1076 { STRING_COMMA_LEN (".pconfig"), PROCESSOR_UNKNOWN,
1077 CPU_PCONFIG_FLAGS, 0 },
de89d0a3
IT
1078 { STRING_COMMA_LEN (".waitpkg"), PROCESSOR_UNKNOWN,
1079 CPU_WAITPKG_FLAGS, 0 },
c48935d7
IT
1080 { STRING_COMMA_LEN (".cldemote"), PROCESSOR_UNKNOWN,
1081 CPU_CLDEMOTE_FLAGS, 0 },
c0a30a9f
L
1082 { STRING_COMMA_LEN (".movdiri"), PROCESSOR_UNKNOWN,
1083 CPU_MOVDIRI_FLAGS, 0 },
1084 { STRING_COMMA_LEN (".movdir64b"), PROCESSOR_UNKNOWN,
1085 CPU_MOVDIR64B_FLAGS, 0 },
d6aab7a1
XG
1086 { STRING_COMMA_LEN (".avx512_bf16"), PROCESSOR_UNKNOWN,
1087 CPU_AVX512_BF16_FLAGS, 0 },
9186c494
L
1088 { STRING_COMMA_LEN (".avx512_vp2intersect"), PROCESSOR_UNKNOWN,
1089 CPU_AVX512_VP2INTERSECT_FLAGS, 0 },
dd455cf5
L
1090 { STRING_COMMA_LEN (".enqcmd"), PROCESSOR_UNKNOWN,
1091 CPU_ENQCMD_FLAGS, 0 },
142861df
JB
1092 { STRING_COMMA_LEN (".rdpru"), PROCESSOR_UNKNOWN,
1093 CPU_RDPRU_FLAGS, 0 },
1094 { STRING_COMMA_LEN (".mcommit"), PROCESSOR_UNKNOWN,
1095 CPU_MCOMMIT_FLAGS, 0 },
293f5f65
L
1096};
1097
1098static const noarch_entry cpu_noarch[] =
1099{
1100 { STRING_COMMA_LEN ("no87"), CPU_ANY_X87_FLAGS },
1848e567
L
1101 { STRING_COMMA_LEN ("no287"), CPU_ANY_287_FLAGS },
1102 { STRING_COMMA_LEN ("no387"), CPU_ANY_387_FLAGS },
1103 { STRING_COMMA_LEN ("no687"), CPU_ANY_687_FLAGS },
d871f3f4
L
1104 { STRING_COMMA_LEN ("nocmov"), CPU_ANY_CMOV_FLAGS },
1105 { STRING_COMMA_LEN ("nofxsr"), CPU_ANY_FXSR_FLAGS },
293f5f65
L
1106 { STRING_COMMA_LEN ("nommx"), CPU_ANY_MMX_FLAGS },
1107 { STRING_COMMA_LEN ("nosse"), CPU_ANY_SSE_FLAGS },
1848e567
L
1108 { STRING_COMMA_LEN ("nosse2"), CPU_ANY_SSE2_FLAGS },
1109 { STRING_COMMA_LEN ("nosse3"), CPU_ANY_SSE3_FLAGS },
1110 { STRING_COMMA_LEN ("nossse3"), CPU_ANY_SSSE3_FLAGS },
1111 { STRING_COMMA_LEN ("nosse4.1"), CPU_ANY_SSE4_1_FLAGS },
1112 { STRING_COMMA_LEN ("nosse4.2"), CPU_ANY_SSE4_2_FLAGS },
1113 { STRING_COMMA_LEN ("nosse4"), CPU_ANY_SSE4_1_FLAGS },
293f5f65 1114 { STRING_COMMA_LEN ("noavx"), CPU_ANY_AVX_FLAGS },
1848e567 1115 { STRING_COMMA_LEN ("noavx2"), CPU_ANY_AVX2_FLAGS },
144b71e2
L
1116 { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
1117 { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
1118 { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
1119 { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
1120 { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
1121 { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
1122 { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
1123 { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
1124 { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
920d2ddc 1125 { STRING_COMMA_LEN ("noavx512_4fmaps"), CPU_ANY_AVX512_4FMAPS_FLAGS },
47acf0bd 1126 { STRING_COMMA_LEN ("noavx512_4vnniw"), CPU_ANY_AVX512_4VNNIW_FLAGS },
620214f7 1127 { STRING_COMMA_LEN ("noavx512_vpopcntdq"), CPU_ANY_AVX512_VPOPCNTDQ_FLAGS },
53467f57 1128 { STRING_COMMA_LEN ("noavx512_vbmi2"), CPU_ANY_AVX512_VBMI2_FLAGS },
8cfcb765 1129 { STRING_COMMA_LEN ("noavx512_vnni"), CPU_ANY_AVX512_VNNI_FLAGS },
ee6872be 1130 { STRING_COMMA_LEN ("noavx512_bitalg"), CPU_ANY_AVX512_BITALG_FLAGS },
d777820b
IT
1131 { STRING_COMMA_LEN ("noibt"), CPU_ANY_IBT_FLAGS },
1132 { STRING_COMMA_LEN ("noshstk"), CPU_ANY_SHSTK_FLAGS },
c0a30a9f
L
1133 { STRING_COMMA_LEN ("nomovdiri"), CPU_ANY_MOVDIRI_FLAGS },
1134 { STRING_COMMA_LEN ("nomovdir64b"), CPU_ANY_MOVDIR64B_FLAGS },
d6aab7a1 1135 { STRING_COMMA_LEN ("noavx512_bf16"), CPU_ANY_AVX512_BF16_FLAGS },
9186c494 1136 { STRING_COMMA_LEN ("noavx512_vp2intersect"), CPU_ANY_SHSTK_FLAGS },
dd455cf5 1137 { STRING_COMMA_LEN ("noenqcmd"), CPU_ANY_ENQCMD_FLAGS },
e413e4e9
AM
1138};
1139
704209c0 1140#ifdef I386COFF
a6c24e68
NC
1141/* Like s_lcomm_internal in gas/read.c but the alignment string
1142 is allowed to be optional. */
1143
1144static symbolS *
1145pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1146{
1147 addressT align = 0;
1148
1149 SKIP_WHITESPACE ();
1150
7ab9ffdd 1151 if (needs_align
a6c24e68
NC
1152 && *input_line_pointer == ',')
1153 {
1154 align = parse_align (needs_align - 1);
7ab9ffdd 1155
a6c24e68
NC
1156 if (align == (addressT) -1)
1157 return NULL;
1158 }
1159 else
1160 {
1161 if (size >= 8)
1162 align = 3;
1163 else if (size >= 4)
1164 align = 2;
1165 else if (size >= 2)
1166 align = 1;
1167 else
1168 align = 0;
1169 }
1170
1171 bss_alloc (symbolP, size, align);
1172 return symbolP;
1173}
1174
704209c0 1175static void
a6c24e68
NC
1176pe_lcomm (int needs_align)
1177{
1178 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1179}
704209c0 1180#endif
a6c24e68 1181
29b0f896
AM
1182const pseudo_typeS md_pseudo_table[] =
1183{
1184#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1185 {"align", s_align_bytes, 0},
1186#else
1187 {"align", s_align_ptwo, 0},
1188#endif
1189 {"arch", set_cpu_arch, 0},
1190#ifndef I386COFF
1191 {"bss", s_bss, 0},
a6c24e68
NC
1192#else
1193 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1194#endif
1195 {"ffloat", float_cons, 'f'},
1196 {"dfloat", float_cons, 'd'},
1197 {"tfloat", float_cons, 'x'},
1198 {"value", cons, 2},
d182319b 1199 {"slong", signed_cons, 4},
29b0f896
AM
1200 {"noopt", s_ignore, 0},
1201 {"optim", s_ignore, 0},
1202 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1203 {"code16", set_code_flag, CODE_16BIT},
1204 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1205#ifdef BFD64
29b0f896 1206 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1207#endif
29b0f896
AM
1208 {"intel_syntax", set_intel_syntax, 1},
1209 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1210 {"intel_mnemonic", set_intel_mnemonic, 1},
1211 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1212 {"allow_index_reg", set_allow_index_reg, 1},
1213 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1214 {"sse_check", set_check, 0},
1215 {"operand_check", set_check, 1},
3b22753a
L
1216#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1217 {"largecomm", handle_large_common, 0},
07a53e5c 1218#else
68d20676 1219 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1220 {"loc", dwarf2_directive_loc, 0},
1221 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1222#endif
6482c264
NC
1223#ifdef TE_PE
1224 {"secrel32", pe_directive_secrel, 0},
1225#endif
29b0f896
AM
1226 {0, 0, 0}
1227};
1228
1229/* For interface with expression (). */
1230extern char *input_line_pointer;
1231
1232/* Hash table for instruction mnemonic lookup. */
1233static struct hash_control *op_hash;
1234
1235/* Hash table for register lookup. */
1236static struct hash_control *reg_hash;
1237\f
ce8a8b2f
AM
1238 /* Various efficient no-op patterns for aligning code labels.
1239 Note: Don't try to assemble the instructions in the comments.
1240 0L and 0w are not legal. */
62a02d25
L
1241static const unsigned char f32_1[] =
1242 {0x90}; /* nop */
1243static const unsigned char f32_2[] =
1244 {0x66,0x90}; /* xchg %ax,%ax */
1245static const unsigned char f32_3[] =
1246 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1247static const unsigned char f32_4[] =
1248 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
62a02d25
L
1249static const unsigned char f32_6[] =
1250 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1251static const unsigned char f32_7[] =
1252 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
62a02d25 1253static const unsigned char f16_3[] =
3ae729d5 1254 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
62a02d25 1255static const unsigned char f16_4[] =
3ae729d5
L
1256 {0x8d,0xb4,0x00,0x00}; /* lea 0W(%si),%si */
1257static const unsigned char jump_disp8[] =
1258 {0xeb}; /* jmp disp8 */
1259static const unsigned char jump32_disp32[] =
1260 {0xe9}; /* jmp disp32 */
1261static const unsigned char jump16_disp32[] =
1262 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1263/* 32-bit NOPs patterns. */
1264static const unsigned char *const f32_patt[] = {
3ae729d5 1265 f32_1, f32_2, f32_3, f32_4, NULL, f32_6, f32_7
62a02d25
L
1266};
1267/* 16-bit NOPs patterns. */
1268static const unsigned char *const f16_patt[] = {
3ae729d5 1269 f32_1, f32_2, f16_3, f16_4
62a02d25
L
1270};
1271/* nopl (%[re]ax) */
1272static const unsigned char alt_3[] =
1273 {0x0f,0x1f,0x00};
1274/* nopl 0(%[re]ax) */
1275static const unsigned char alt_4[] =
1276 {0x0f,0x1f,0x40,0x00};
1277/* nopl 0(%[re]ax,%[re]ax,1) */
1278static const unsigned char alt_5[] =
1279 {0x0f,0x1f,0x44,0x00,0x00};
1280/* nopw 0(%[re]ax,%[re]ax,1) */
1281static const unsigned char alt_6[] =
1282 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1283/* nopl 0L(%[re]ax) */
1284static const unsigned char alt_7[] =
1285 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1286/* nopl 0L(%[re]ax,%[re]ax,1) */
1287static const unsigned char alt_8[] =
1288 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1289/* nopw 0L(%[re]ax,%[re]ax,1) */
1290static const unsigned char alt_9[] =
1291 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1292/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1293static const unsigned char alt_10[] =
1294 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
3ae729d5
L
1295/* data16 nopw %cs:0L(%eax,%eax,1) */
1296static const unsigned char alt_11[] =
1297 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1298/* 32-bit and 64-bit NOPs patterns. */
1299static const unsigned char *const alt_patt[] = {
1300 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1301 alt_9, alt_10, alt_11
62a02d25
L
1302};
1303
1304/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1305 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1306
1307static void
1308i386_output_nops (char *where, const unsigned char *const *patt,
1309 int count, int max_single_nop_size)
1310
1311{
3ae729d5
L
1312 /* Place the longer NOP first. */
1313 int last;
1314 int offset;
3076e594
NC
1315 const unsigned char *nops;
1316
1317 if (max_single_nop_size < 1)
1318 {
1319 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1320 max_single_nop_size);
1321 return;
1322 }
1323
1324 nops = patt[max_single_nop_size - 1];
3ae729d5
L
1325
1326 /* Use the smaller one if the requsted one isn't available. */
1327 if (nops == NULL)
62a02d25 1328 {
3ae729d5
L
1329 max_single_nop_size--;
1330 nops = patt[max_single_nop_size - 1];
62a02d25
L
1331 }
1332
3ae729d5
L
1333 last = count % max_single_nop_size;
1334
1335 count -= last;
1336 for (offset = 0; offset < count; offset += max_single_nop_size)
1337 memcpy (where + offset, nops, max_single_nop_size);
1338
1339 if (last)
1340 {
1341 nops = patt[last - 1];
1342 if (nops == NULL)
1343 {
1344 /* Use the smaller one plus one-byte NOP if the needed one
1345 isn't available. */
1346 last--;
1347 nops = patt[last - 1];
1348 memcpy (where + offset, nops, last);
1349 where[offset + last] = *patt[0];
1350 }
1351 else
1352 memcpy (where + offset, nops, last);
1353 }
62a02d25
L
1354}
1355
3ae729d5
L
1356static INLINE int
1357fits_in_imm7 (offsetT num)
1358{
1359 return (num & 0x7f) == num;
1360}
1361
1362static INLINE int
1363fits_in_imm31 (offsetT num)
1364{
1365 return (num & 0x7fffffff) == num;
1366}
62a02d25
L
1367
1368/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1369 single NOP instruction LIMIT. */
1370
1371void
3ae729d5 1372i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1373{
3ae729d5 1374 const unsigned char *const *patt = NULL;
62a02d25 1375 int max_single_nop_size;
3ae729d5
L
1376 /* Maximum number of NOPs before switching to jump over NOPs. */
1377 int max_number_of_nops;
62a02d25 1378
3ae729d5 1379 switch (fragP->fr_type)
62a02d25 1380 {
3ae729d5
L
1381 case rs_fill_nop:
1382 case rs_align_code:
1383 break;
1384 default:
62a02d25
L
1385 return;
1386 }
1387
ccc9c027
L
1388 /* We need to decide which NOP sequence to use for 32bit and
1389 64bit. When -mtune= is used:
4eed87de 1390
76bc74dc
L
1391 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
1392 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1393 2. For the rest, alt_patt will be used.
1394
1395 When -mtune= isn't used, alt_patt will be used if
22109423 1396 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will
76bc74dc 1397 be used.
ccc9c027
L
1398
1399 When -march= or .arch is used, we can't use anything beyond
1400 cpu_arch_isa_flags. */
1401
1402 if (flag_code == CODE_16BIT)
1403 {
3ae729d5
L
1404 patt = f16_patt;
1405 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1406 /* Limit number of NOPs to 2 in 16-bit mode. */
1407 max_number_of_nops = 2;
252b5132 1408 }
33fef721 1409 else
ccc9c027 1410 {
fbf3f584 1411 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027
L
1412 {
1413 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
1414 switch (cpu_arch_tune)
1415 {
1416 case PROCESSOR_UNKNOWN:
1417 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423
L
1418 optimize with nops. */
1419 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1420 patt = alt_patt;
ccc9c027
L
1421 else
1422 patt = f32_patt;
1423 break;
ccc9c027
L
1424 case PROCESSOR_PENTIUM4:
1425 case PROCESSOR_NOCONA:
ef05d495 1426 case PROCESSOR_CORE:
76bc74dc 1427 case PROCESSOR_CORE2:
bd5295b2 1428 case PROCESSOR_COREI7:
3632d14b 1429 case PROCESSOR_L1OM:
7a9068fe 1430 case PROCESSOR_K1OM:
76bc74dc 1431 case PROCESSOR_GENERIC64:
ccc9c027
L
1432 case PROCESSOR_K6:
1433 case PROCESSOR_ATHLON:
1434 case PROCESSOR_K8:
4eed87de 1435 case PROCESSOR_AMDFAM10:
8aedb9fe 1436 case PROCESSOR_BD:
029f3522 1437 case PROCESSOR_ZNVER:
7b458c12 1438 case PROCESSOR_BT:
80b8656c 1439 patt = alt_patt;
ccc9c027 1440 break;
76bc74dc 1441 case PROCESSOR_I386:
ccc9c027
L
1442 case PROCESSOR_I486:
1443 case PROCESSOR_PENTIUM:
2dde1948 1444 case PROCESSOR_PENTIUMPRO:
81486035 1445 case PROCESSOR_IAMCU:
ccc9c027
L
1446 case PROCESSOR_GENERIC32:
1447 patt = f32_patt;
1448 break;
4eed87de 1449 }
ccc9c027
L
1450 }
1451 else
1452 {
fbf3f584 1453 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1454 {
1455 case PROCESSOR_UNKNOWN:
e6a14101 1456 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1457 PROCESSOR_UNKNOWN. */
1458 abort ();
1459 break;
1460
76bc74dc 1461 case PROCESSOR_I386:
ccc9c027
L
1462 case PROCESSOR_I486:
1463 case PROCESSOR_PENTIUM:
81486035 1464 case PROCESSOR_IAMCU:
ccc9c027
L
1465 case PROCESSOR_K6:
1466 case PROCESSOR_ATHLON:
1467 case PROCESSOR_K8:
4eed87de 1468 case PROCESSOR_AMDFAM10:
8aedb9fe 1469 case PROCESSOR_BD:
029f3522 1470 case PROCESSOR_ZNVER:
7b458c12 1471 case PROCESSOR_BT:
ccc9c027
L
1472 case PROCESSOR_GENERIC32:
1473 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423
L
1474 with nops. */
1475 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1476 patt = alt_patt;
ccc9c027
L
1477 else
1478 patt = f32_patt;
1479 break;
76bc74dc
L
1480 case PROCESSOR_PENTIUMPRO:
1481 case PROCESSOR_PENTIUM4:
1482 case PROCESSOR_NOCONA:
1483 case PROCESSOR_CORE:
ef05d495 1484 case PROCESSOR_CORE2:
bd5295b2 1485 case PROCESSOR_COREI7:
3632d14b 1486 case PROCESSOR_L1OM:
7a9068fe 1487 case PROCESSOR_K1OM:
22109423 1488 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1489 patt = alt_patt;
ccc9c027
L
1490 else
1491 patt = f32_patt;
1492 break;
1493 case PROCESSOR_GENERIC64:
80b8656c 1494 patt = alt_patt;
ccc9c027 1495 break;
4eed87de 1496 }
ccc9c027
L
1497 }
1498
76bc74dc
L
1499 if (patt == f32_patt)
1500 {
3ae729d5
L
1501 max_single_nop_size = sizeof (f32_patt) / sizeof (f32_patt[0]);
1502 /* Limit number of NOPs to 2 for older processors. */
1503 max_number_of_nops = 2;
76bc74dc
L
1504 }
1505 else
1506 {
3ae729d5
L
1507 max_single_nop_size = sizeof (alt_patt) / sizeof (alt_patt[0]);
1508 /* Limit number of NOPs to 7 for newer processors. */
1509 max_number_of_nops = 7;
1510 }
1511 }
1512
1513 if (limit == 0)
1514 limit = max_single_nop_size;
1515
1516 if (fragP->fr_type == rs_fill_nop)
1517 {
1518 /* Output NOPs for .nop directive. */
1519 if (limit > max_single_nop_size)
1520 {
1521 as_bad_where (fragP->fr_file, fragP->fr_line,
1522 _("invalid single nop size: %d "
1523 "(expect within [0, %d])"),
1524 limit, max_single_nop_size);
1525 return;
1526 }
1527 }
1528 else
1529 fragP->fr_var = count;
1530
1531 if ((count / max_single_nop_size) > max_number_of_nops)
1532 {
1533 /* Generate jump over NOPs. */
1534 offsetT disp = count - 2;
1535 if (fits_in_imm7 (disp))
1536 {
1537 /* Use "jmp disp8" if possible. */
1538 count = disp;
1539 where[0] = jump_disp8[0];
1540 where[1] = count;
1541 where += 2;
1542 }
1543 else
1544 {
1545 unsigned int size_of_jump;
1546
1547 if (flag_code == CODE_16BIT)
1548 {
1549 where[0] = jump16_disp32[0];
1550 where[1] = jump16_disp32[1];
1551 size_of_jump = 2;
1552 }
1553 else
1554 {
1555 where[0] = jump32_disp32[0];
1556 size_of_jump = 1;
1557 }
1558
1559 count -= size_of_jump + 4;
1560 if (!fits_in_imm31 (count))
1561 {
1562 as_bad_where (fragP->fr_file, fragP->fr_line,
1563 _("jump over nop padding out of range"));
1564 return;
1565 }
1566
1567 md_number_to_chars (where + size_of_jump, count, 4);
1568 where += size_of_jump + 4;
76bc74dc 1569 }
ccc9c027 1570 }
3ae729d5
L
1571
1572 /* Generate multiple NOPs. */
1573 i386_output_nops (where, patt, count, limit);
252b5132
RH
1574}
1575
c6fb90c8 1576static INLINE int
0dfbf9d7 1577operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1578{
0dfbf9d7 1579 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1580 {
1581 case 3:
0dfbf9d7 1582 if (x->array[2])
c6fb90c8 1583 return 0;
1a0670f3 1584 /* Fall through. */
c6fb90c8 1585 case 2:
0dfbf9d7 1586 if (x->array[1])
c6fb90c8 1587 return 0;
1a0670f3 1588 /* Fall through. */
c6fb90c8 1589 case 1:
0dfbf9d7 1590 return !x->array[0];
c6fb90c8
L
1591 default:
1592 abort ();
1593 }
40fb9820
L
1594}
1595
c6fb90c8 1596static INLINE void
0dfbf9d7 1597operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1598{
0dfbf9d7 1599 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1600 {
1601 case 3:
0dfbf9d7 1602 x->array[2] = v;
1a0670f3 1603 /* Fall through. */
c6fb90c8 1604 case 2:
0dfbf9d7 1605 x->array[1] = v;
1a0670f3 1606 /* Fall through. */
c6fb90c8 1607 case 1:
0dfbf9d7 1608 x->array[0] = v;
1a0670f3 1609 /* Fall through. */
c6fb90c8
L
1610 break;
1611 default:
1612 abort ();
1613 }
bab6aec1
JB
1614
1615 x->bitfield.class = ClassNone;
75e5731b 1616 x->bitfield.instance = InstanceNone;
c6fb90c8 1617}
40fb9820 1618
c6fb90c8 1619static INLINE int
0dfbf9d7
L
1620operand_type_equal (const union i386_operand_type *x,
1621 const union i386_operand_type *y)
c6fb90c8 1622{
0dfbf9d7 1623 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1624 {
1625 case 3:
0dfbf9d7 1626 if (x->array[2] != y->array[2])
c6fb90c8 1627 return 0;
1a0670f3 1628 /* Fall through. */
c6fb90c8 1629 case 2:
0dfbf9d7 1630 if (x->array[1] != y->array[1])
c6fb90c8 1631 return 0;
1a0670f3 1632 /* Fall through. */
c6fb90c8 1633 case 1:
0dfbf9d7 1634 return x->array[0] == y->array[0];
c6fb90c8
L
1635 break;
1636 default:
1637 abort ();
1638 }
1639}
40fb9820 1640
0dfbf9d7
L
1641static INLINE int
1642cpu_flags_all_zero (const union i386_cpu_flags *x)
1643{
1644 switch (ARRAY_SIZE(x->array))
1645 {
53467f57
IT
1646 case 4:
1647 if (x->array[3])
1648 return 0;
1649 /* Fall through. */
0dfbf9d7
L
1650 case 3:
1651 if (x->array[2])
1652 return 0;
1a0670f3 1653 /* Fall through. */
0dfbf9d7
L
1654 case 2:
1655 if (x->array[1])
1656 return 0;
1a0670f3 1657 /* Fall through. */
0dfbf9d7
L
1658 case 1:
1659 return !x->array[0];
1660 default:
1661 abort ();
1662 }
1663}
1664
0dfbf9d7
L
1665static INLINE int
1666cpu_flags_equal (const union i386_cpu_flags *x,
1667 const union i386_cpu_flags *y)
1668{
1669 switch (ARRAY_SIZE(x->array))
1670 {
53467f57
IT
1671 case 4:
1672 if (x->array[3] != y->array[3])
1673 return 0;
1674 /* Fall through. */
0dfbf9d7
L
1675 case 3:
1676 if (x->array[2] != y->array[2])
1677 return 0;
1a0670f3 1678 /* Fall through. */
0dfbf9d7
L
1679 case 2:
1680 if (x->array[1] != y->array[1])
1681 return 0;
1a0670f3 1682 /* Fall through. */
0dfbf9d7
L
1683 case 1:
1684 return x->array[0] == y->array[0];
1685 break;
1686 default:
1687 abort ();
1688 }
1689}
c6fb90c8
L
1690
1691static INLINE int
1692cpu_flags_check_cpu64 (i386_cpu_flags f)
1693{
1694 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
1695 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
1696}
1697
c6fb90c8
L
1698static INLINE i386_cpu_flags
1699cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1700{
c6fb90c8
L
1701 switch (ARRAY_SIZE (x.array))
1702 {
53467f57
IT
1703 case 4:
1704 x.array [3] &= y.array [3];
1705 /* Fall through. */
c6fb90c8
L
1706 case 3:
1707 x.array [2] &= y.array [2];
1a0670f3 1708 /* Fall through. */
c6fb90c8
L
1709 case 2:
1710 x.array [1] &= y.array [1];
1a0670f3 1711 /* Fall through. */
c6fb90c8
L
1712 case 1:
1713 x.array [0] &= y.array [0];
1714 break;
1715 default:
1716 abort ();
1717 }
1718 return x;
1719}
40fb9820 1720
c6fb90c8
L
1721static INLINE i386_cpu_flags
1722cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1723{
c6fb90c8 1724 switch (ARRAY_SIZE (x.array))
40fb9820 1725 {
53467f57
IT
1726 case 4:
1727 x.array [3] |= y.array [3];
1728 /* Fall through. */
c6fb90c8
L
1729 case 3:
1730 x.array [2] |= y.array [2];
1a0670f3 1731 /* Fall through. */
c6fb90c8
L
1732 case 2:
1733 x.array [1] |= y.array [1];
1a0670f3 1734 /* Fall through. */
c6fb90c8
L
1735 case 1:
1736 x.array [0] |= y.array [0];
40fb9820
L
1737 break;
1738 default:
1739 abort ();
1740 }
40fb9820
L
1741 return x;
1742}
1743
309d3373
JB
1744static INLINE i386_cpu_flags
1745cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1746{
1747 switch (ARRAY_SIZE (x.array))
1748 {
53467f57
IT
1749 case 4:
1750 x.array [3] &= ~y.array [3];
1751 /* Fall through. */
309d3373
JB
1752 case 3:
1753 x.array [2] &= ~y.array [2];
1a0670f3 1754 /* Fall through. */
309d3373
JB
1755 case 2:
1756 x.array [1] &= ~y.array [1];
1a0670f3 1757 /* Fall through. */
309d3373
JB
1758 case 1:
1759 x.array [0] &= ~y.array [0];
1760 break;
1761 default:
1762 abort ();
1763 }
1764 return x;
1765}
1766
c0f3af97
L
1767#define CPU_FLAGS_ARCH_MATCH 0x1
1768#define CPU_FLAGS_64BIT_MATCH 0x2
1769
c0f3af97 1770#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1771 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1772
1773/* Return CPU flags match bits. */
3629bb00 1774
40fb9820 1775static int
d3ce72d0 1776cpu_flags_match (const insn_template *t)
40fb9820 1777{
c0f3af97
L
1778 i386_cpu_flags x = t->cpu_flags;
1779 int match = cpu_flags_check_cpu64 (x) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820
L
1780
1781 x.bitfield.cpu64 = 0;
1782 x.bitfield.cpuno64 = 0;
1783
0dfbf9d7 1784 if (cpu_flags_all_zero (&x))
c0f3af97
L
1785 {
1786 /* This instruction is available on all archs. */
db12e14e 1787 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1788 }
3629bb00
L
1789 else
1790 {
c0f3af97 1791 /* This instruction is available only on some archs. */
3629bb00
L
1792 i386_cpu_flags cpu = cpu_arch_flags;
1793
ab592e75
JB
1794 /* AVX512VL is no standalone feature - match it and then strip it. */
1795 if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl)
1796 return match;
1797 x.bitfield.cpuavx512vl = 0;
1798
3629bb00 1799 cpu = cpu_flags_and (x, cpu);
c0f3af97
L
1800 if (!cpu_flags_all_zero (&cpu))
1801 {
a5ff0eb2
L
1802 if (x.bitfield.cpuavx)
1803 {
929f69fa 1804 /* We need to check a few extra flags with AVX. */
b9d49817
JB
1805 if (cpu.bitfield.cpuavx
1806 && (!t->opcode_modifier.sse2avx || sse2avx)
1807 && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
929f69fa 1808 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
b9d49817
JB
1809 && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
1810 match |= CPU_FLAGS_ARCH_MATCH;
a5ff0eb2 1811 }
929f69fa
JB
1812 else if (x.bitfield.cpuavx512f)
1813 {
1814 /* We need to check a few extra flags with AVX512F. */
1815 if (cpu.bitfield.cpuavx512f
1816 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
1817 && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes)
1818 && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq))
1819 match |= CPU_FLAGS_ARCH_MATCH;
1820 }
a5ff0eb2 1821 else
db12e14e 1822 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1823 }
3629bb00 1824 }
c0f3af97 1825 return match;
40fb9820
L
1826}
1827
c6fb90c8
L
1828static INLINE i386_operand_type
1829operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 1830{
bab6aec1
JB
1831 if (x.bitfield.class != y.bitfield.class)
1832 x.bitfield.class = ClassNone;
75e5731b
JB
1833 if (x.bitfield.instance != y.bitfield.instance)
1834 x.bitfield.instance = InstanceNone;
bab6aec1 1835
c6fb90c8
L
1836 switch (ARRAY_SIZE (x.array))
1837 {
1838 case 3:
1839 x.array [2] &= y.array [2];
1a0670f3 1840 /* Fall through. */
c6fb90c8
L
1841 case 2:
1842 x.array [1] &= y.array [1];
1a0670f3 1843 /* Fall through. */
c6fb90c8
L
1844 case 1:
1845 x.array [0] &= y.array [0];
1846 break;
1847 default:
1848 abort ();
1849 }
1850 return x;
40fb9820
L
1851}
1852
73053c1f
JB
1853static INLINE i386_operand_type
1854operand_type_and_not (i386_operand_type x, i386_operand_type y)
1855{
bab6aec1 1856 gas_assert (y.bitfield.class == ClassNone);
75e5731b 1857 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 1858
73053c1f
JB
1859 switch (ARRAY_SIZE (x.array))
1860 {
1861 case 3:
1862 x.array [2] &= ~y.array [2];
1863 /* Fall through. */
1864 case 2:
1865 x.array [1] &= ~y.array [1];
1866 /* Fall through. */
1867 case 1:
1868 x.array [0] &= ~y.array [0];
1869 break;
1870 default:
1871 abort ();
1872 }
1873 return x;
1874}
1875
c6fb90c8
L
1876static INLINE i386_operand_type
1877operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 1878{
bab6aec1
JB
1879 gas_assert (x.bitfield.class == ClassNone ||
1880 y.bitfield.class == ClassNone ||
1881 x.bitfield.class == y.bitfield.class);
75e5731b
JB
1882 gas_assert (x.bitfield.instance == InstanceNone ||
1883 y.bitfield.instance == InstanceNone ||
1884 x.bitfield.instance == y.bitfield.instance);
bab6aec1 1885
c6fb90c8 1886 switch (ARRAY_SIZE (x.array))
40fb9820 1887 {
c6fb90c8
L
1888 case 3:
1889 x.array [2] |= y.array [2];
1a0670f3 1890 /* Fall through. */
c6fb90c8
L
1891 case 2:
1892 x.array [1] |= y.array [1];
1a0670f3 1893 /* Fall through. */
c6fb90c8
L
1894 case 1:
1895 x.array [0] |= y.array [0];
40fb9820
L
1896 break;
1897 default:
1898 abort ();
1899 }
c6fb90c8
L
1900 return x;
1901}
40fb9820 1902
c6fb90c8
L
1903static INLINE i386_operand_type
1904operand_type_xor (i386_operand_type x, i386_operand_type y)
1905{
bab6aec1 1906 gas_assert (y.bitfield.class == ClassNone);
75e5731b 1907 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 1908
c6fb90c8
L
1909 switch (ARRAY_SIZE (x.array))
1910 {
1911 case 3:
1912 x.array [2] ^= y.array [2];
1a0670f3 1913 /* Fall through. */
c6fb90c8
L
1914 case 2:
1915 x.array [1] ^= y.array [1];
1a0670f3 1916 /* Fall through. */
c6fb90c8
L
1917 case 1:
1918 x.array [0] ^= y.array [0];
1919 break;
1920 default:
1921 abort ();
1922 }
40fb9820
L
1923 return x;
1924}
1925
40fb9820
L
1926static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
1927static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
1928static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
1929static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
bab6aec1
JB
1930static const i386_operand_type anydisp = OPERAND_TYPE_ANYDISP;
1931static const i386_operand_type anyimm = OPERAND_TYPE_ANYIMM;
40fb9820 1932static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
43234a1e 1933static const i386_operand_type regmask = OPERAND_TYPE_REGMASK;
40fb9820
L
1934static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
1935static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
1936static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
1937static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
1938static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
1939static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
1940static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
1941static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
1942static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
1943
1944enum operand_type
1945{
1946 reg,
40fb9820
L
1947 imm,
1948 disp,
1949 anymem
1950};
1951
c6fb90c8 1952static INLINE int
40fb9820
L
1953operand_type_check (i386_operand_type t, enum operand_type c)
1954{
1955 switch (c)
1956 {
1957 case reg:
bab6aec1 1958 return t.bitfield.class == Reg;
40fb9820 1959
40fb9820
L
1960 case imm:
1961 return (t.bitfield.imm8
1962 || t.bitfield.imm8s
1963 || t.bitfield.imm16
1964 || t.bitfield.imm32
1965 || t.bitfield.imm32s
1966 || t.bitfield.imm64);
1967
1968 case disp:
1969 return (t.bitfield.disp8
1970 || t.bitfield.disp16
1971 || t.bitfield.disp32
1972 || t.bitfield.disp32s
1973 || t.bitfield.disp64);
1974
1975 case anymem:
1976 return (t.bitfield.disp8
1977 || t.bitfield.disp16
1978 || t.bitfield.disp32
1979 || t.bitfield.disp32s
1980 || t.bitfield.disp64
1981 || t.bitfield.baseindex);
1982
1983 default:
1984 abort ();
1985 }
2cfe26b6
AM
1986
1987 return 0;
40fb9820
L
1988}
1989
7a54636a
L
1990/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
1991 between operand GIVEN and opeand WANTED for instruction template T. */
5c07affc
L
1992
1993static INLINE int
7a54636a
L
1994match_operand_size (const insn_template *t, unsigned int wanted,
1995 unsigned int given)
5c07affc 1996{
3ac21baa
JB
1997 return !((i.types[given].bitfield.byte
1998 && !t->operand_types[wanted].bitfield.byte)
1999 || (i.types[given].bitfield.word
2000 && !t->operand_types[wanted].bitfield.word)
2001 || (i.types[given].bitfield.dword
2002 && !t->operand_types[wanted].bitfield.dword)
2003 || (i.types[given].bitfield.qword
2004 && !t->operand_types[wanted].bitfield.qword)
2005 || (i.types[given].bitfield.tbyte
2006 && !t->operand_types[wanted].bitfield.tbyte));
5c07affc
L
2007}
2008
dd40ce22
L
2009/* Return 1 if there is no conflict in SIMD register between operand
2010 GIVEN and opeand WANTED for instruction template T. */
1b54b8d7
JB
2011
2012static INLINE int
dd40ce22
L
2013match_simd_size (const insn_template *t, unsigned int wanted,
2014 unsigned int given)
1b54b8d7 2015{
3ac21baa
JB
2016 return !((i.types[given].bitfield.xmmword
2017 && !t->operand_types[wanted].bitfield.xmmword)
2018 || (i.types[given].bitfield.ymmword
2019 && !t->operand_types[wanted].bitfield.ymmword)
2020 || (i.types[given].bitfield.zmmword
2021 && !t->operand_types[wanted].bitfield.zmmword));
1b54b8d7
JB
2022}
2023
7a54636a
L
2024/* Return 1 if there is no conflict in any size between operand GIVEN
2025 and opeand WANTED for instruction template T. */
5c07affc
L
2026
2027static INLINE int
dd40ce22
L
2028match_mem_size (const insn_template *t, unsigned int wanted,
2029 unsigned int given)
5c07affc 2030{
7a54636a 2031 return (match_operand_size (t, wanted, given)
3ac21baa 2032 && !((i.types[given].bitfield.unspecified
af508cb9 2033 && !i.broadcast
3ac21baa
JB
2034 && !t->operand_types[wanted].bitfield.unspecified)
2035 || (i.types[given].bitfield.fword
2036 && !t->operand_types[wanted].bitfield.fword)
1b54b8d7
JB
2037 /* For scalar opcode templates to allow register and memory
2038 operands at the same time, some special casing is needed
d6793fa1
JB
2039 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2040 down-conversion vpmov*. */
3528c362 2041 || ((t->operand_types[wanted].bitfield.class == RegSIMD
1b54b8d7 2042 && !t->opcode_modifier.broadcast
3ac21baa
JB
2043 && (t->operand_types[wanted].bitfield.byte
2044 || t->operand_types[wanted].bitfield.word
2045 || t->operand_types[wanted].bitfield.dword
2046 || t->operand_types[wanted].bitfield.qword))
2047 ? (i.types[given].bitfield.xmmword
2048 || i.types[given].bitfield.ymmword
2049 || i.types[given].bitfield.zmmword)
2050 : !match_simd_size(t, wanted, given))));
5c07affc
L
2051}
2052
3ac21baa
JB
2053/* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2054 operands for instruction template T, and it has MATCH_REVERSE set if there
2055 is no size conflict on any operands for the template with operands reversed
2056 (and the template allows for reversing in the first place). */
5c07affc 2057
3ac21baa
JB
2058#define MATCH_STRAIGHT 1
2059#define MATCH_REVERSE 2
2060
2061static INLINE unsigned int
d3ce72d0 2062operand_size_match (const insn_template *t)
5c07affc 2063{
3ac21baa 2064 unsigned int j, match = MATCH_STRAIGHT;
5c07affc
L
2065
2066 /* Don't check jump instructions. */
2067 if (t->opcode_modifier.jump
2068 || t->opcode_modifier.jumpbyte
2069 || t->opcode_modifier.jumpdword
2070 || t->opcode_modifier.jumpintersegment)
2071 return match;
2072
2073 /* Check memory and accumulator operand size. */
2074 for (j = 0; j < i.operands; j++)
2075 {
3528c362
JB
2076 if (i.types[j].bitfield.class != Reg
2077 && i.types[j].bitfield.class != RegSIMD
1b54b8d7 2078 && t->operand_types[j].bitfield.anysize)
5c07affc
L
2079 continue;
2080
bab6aec1 2081 if (t->operand_types[j].bitfield.class == Reg
7a54636a 2082 && !match_operand_size (t, j, j))
5c07affc
L
2083 {
2084 match = 0;
2085 break;
2086 }
2087
3528c362 2088 if (t->operand_types[j].bitfield.class == RegSIMD
3ac21baa 2089 && !match_simd_size (t, j, j))
1b54b8d7
JB
2090 {
2091 match = 0;
2092 break;
2093 }
2094
75e5731b 2095 if (t->operand_types[j].bitfield.instance == Accum
7a54636a 2096 && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
1b54b8d7
JB
2097 {
2098 match = 0;
2099 break;
2100 }
2101
c48dadc9 2102 if ((i.flags[j] & Operand_Mem) && !match_mem_size (t, j, j))
5c07affc
L
2103 {
2104 match = 0;
2105 break;
2106 }
2107 }
2108
3ac21baa 2109 if (!t->opcode_modifier.d)
891edac4
L
2110 {
2111mismatch:
3ac21baa
JB
2112 if (!match)
2113 i.error = operand_size_mismatch;
2114 return match;
891edac4 2115 }
5c07affc
L
2116
2117 /* Check reverse. */
f5eb1d70 2118 gas_assert (i.operands >= 2 && i.operands <= 3);
5c07affc 2119
f5eb1d70 2120 for (j = 0; j < i.operands; j++)
5c07affc 2121 {
f5eb1d70
JB
2122 unsigned int given = i.operands - j - 1;
2123
bab6aec1 2124 if (t->operand_types[j].bitfield.class == Reg
f5eb1d70 2125 && !match_operand_size (t, j, given))
891edac4 2126 goto mismatch;
5c07affc 2127
3528c362 2128 if (t->operand_types[j].bitfield.class == RegSIMD
f5eb1d70 2129 && !match_simd_size (t, j, given))
dbbc8b7e
JB
2130 goto mismatch;
2131
75e5731b 2132 if (t->operand_types[j].bitfield.instance == Accum
f5eb1d70
JB
2133 && (!match_operand_size (t, j, given)
2134 || !match_simd_size (t, j, given)))
dbbc8b7e
JB
2135 goto mismatch;
2136
f5eb1d70 2137 if ((i.flags[given] & Operand_Mem) && !match_mem_size (t, j, given))
891edac4 2138 goto mismatch;
5c07affc
L
2139 }
2140
3ac21baa 2141 return match | MATCH_REVERSE;
5c07affc
L
2142}
2143
c6fb90c8 2144static INLINE int
40fb9820
L
2145operand_type_match (i386_operand_type overlap,
2146 i386_operand_type given)
2147{
2148 i386_operand_type temp = overlap;
2149
2150 temp.bitfield.jumpabsolute = 0;
7d5e4556 2151 temp.bitfield.unspecified = 0;
5c07affc
L
2152 temp.bitfield.byte = 0;
2153 temp.bitfield.word = 0;
2154 temp.bitfield.dword = 0;
2155 temp.bitfield.fword = 0;
2156 temp.bitfield.qword = 0;
2157 temp.bitfield.tbyte = 0;
2158 temp.bitfield.xmmword = 0;
c0f3af97 2159 temp.bitfield.ymmword = 0;
43234a1e 2160 temp.bitfield.zmmword = 0;
0dfbf9d7 2161 if (operand_type_all_zero (&temp))
891edac4 2162 goto mismatch;
40fb9820 2163
891edac4
L
2164 if (given.bitfield.baseindex == overlap.bitfield.baseindex
2165 && given.bitfield.jumpabsolute == overlap.bitfield.jumpabsolute)
2166 return 1;
2167
2168mismatch:
a65babc9 2169 i.error = operand_type_mismatch;
891edac4 2170 return 0;
40fb9820
L
2171}
2172
7d5e4556 2173/* If given types g0 and g1 are registers they must be of the same type
10c17abd
JB
2174 unless the expected operand type register overlap is null.
2175 Memory operand size of certain SIMD instructions is also being checked
2176 here. */
40fb9820 2177
c6fb90c8 2178static INLINE int
dc821c5f 2179operand_type_register_match (i386_operand_type g0,
40fb9820 2180 i386_operand_type t0,
40fb9820
L
2181 i386_operand_type g1,
2182 i386_operand_type t1)
2183{
bab6aec1 2184 if (g0.bitfield.class != Reg
3528c362 2185 && g0.bitfield.class != RegSIMD
10c17abd
JB
2186 && (!operand_type_check (g0, anymem)
2187 || g0.bitfield.unspecified
3528c362 2188 || t0.bitfield.class != RegSIMD))
40fb9820
L
2189 return 1;
2190
bab6aec1 2191 if (g1.bitfield.class != Reg
3528c362 2192 && g1.bitfield.class != RegSIMD
10c17abd
JB
2193 && (!operand_type_check (g1, anymem)
2194 || g1.bitfield.unspecified
3528c362 2195 || t1.bitfield.class != RegSIMD))
40fb9820
L
2196 return 1;
2197
dc821c5f
JB
2198 if (g0.bitfield.byte == g1.bitfield.byte
2199 && g0.bitfield.word == g1.bitfield.word
2200 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2201 && g0.bitfield.qword == g1.bitfield.qword
2202 && g0.bitfield.xmmword == g1.bitfield.xmmword
2203 && g0.bitfield.ymmword == g1.bitfield.ymmword
2204 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2205 return 1;
2206
dc821c5f
JB
2207 if (!(t0.bitfield.byte & t1.bitfield.byte)
2208 && !(t0.bitfield.word & t1.bitfield.word)
2209 && !(t0.bitfield.dword & t1.bitfield.dword)
10c17abd
JB
2210 && !(t0.bitfield.qword & t1.bitfield.qword)
2211 && !(t0.bitfield.xmmword & t1.bitfield.xmmword)
2212 && !(t0.bitfield.ymmword & t1.bitfield.ymmword)
2213 && !(t0.bitfield.zmmword & t1.bitfield.zmmword))
891edac4
L
2214 return 1;
2215
a65babc9 2216 i.error = register_type_mismatch;
891edac4
L
2217
2218 return 0;
40fb9820
L
2219}
2220
4c692bc7
JB
2221static INLINE unsigned int
2222register_number (const reg_entry *r)
2223{
2224 unsigned int nr = r->reg_num;
2225
2226 if (r->reg_flags & RegRex)
2227 nr += 8;
2228
200cbe0f
L
2229 if (r->reg_flags & RegVRex)
2230 nr += 16;
2231
4c692bc7
JB
2232 return nr;
2233}
2234
252b5132 2235static INLINE unsigned int
40fb9820 2236mode_from_disp_size (i386_operand_type t)
252b5132 2237{
b5014f7a 2238 if (t.bitfield.disp8)
40fb9820
L
2239 return 1;
2240 else if (t.bitfield.disp16
2241 || t.bitfield.disp32
2242 || t.bitfield.disp32s)
2243 return 2;
2244 else
2245 return 0;
252b5132
RH
2246}
2247
2248static INLINE int
65879393 2249fits_in_signed_byte (addressT num)
252b5132 2250{
65879393 2251 return num + 0x80 <= 0xff;
47926f60 2252}
252b5132
RH
2253
2254static INLINE int
65879393 2255fits_in_unsigned_byte (addressT num)
252b5132 2256{
65879393 2257 return num <= 0xff;
47926f60 2258}
252b5132
RH
2259
2260static INLINE int
65879393 2261fits_in_unsigned_word (addressT num)
252b5132 2262{
65879393 2263 return num <= 0xffff;
47926f60 2264}
252b5132
RH
2265
2266static INLINE int
65879393 2267fits_in_signed_word (addressT num)
252b5132 2268{
65879393 2269 return num + 0x8000 <= 0xffff;
47926f60 2270}
2a962e6d 2271
3e73aa7c 2272static INLINE int
65879393 2273fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2274{
2275#ifndef BFD64
2276 return 1;
2277#else
65879393 2278 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2279#endif
2280} /* fits_in_signed_long() */
2a962e6d 2281
3e73aa7c 2282static INLINE int
65879393 2283fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2284{
2285#ifndef BFD64
2286 return 1;
2287#else
65879393 2288 return num <= 0xffffffff;
3e73aa7c
JH
2289#endif
2290} /* fits_in_unsigned_long() */
252b5132 2291
43234a1e 2292static INLINE int
b5014f7a 2293fits_in_disp8 (offsetT num)
43234a1e
L
2294{
2295 int shift = i.memshift;
2296 unsigned int mask;
2297
2298 if (shift == -1)
2299 abort ();
2300
2301 mask = (1 << shift) - 1;
2302
2303 /* Return 0 if NUM isn't properly aligned. */
2304 if ((num & mask))
2305 return 0;
2306
2307 /* Check if NUM will fit in 8bit after shift. */
2308 return fits_in_signed_byte (num >> shift);
2309}
2310
a683cc34
SP
2311static INLINE int
2312fits_in_imm4 (offsetT num)
2313{
2314 return (num & 0xf) == num;
2315}
2316
40fb9820 2317static i386_operand_type
e3bb37b5 2318smallest_imm_type (offsetT num)
252b5132 2319{
40fb9820 2320 i386_operand_type t;
7ab9ffdd 2321
0dfbf9d7 2322 operand_type_set (&t, 0);
40fb9820
L
2323 t.bitfield.imm64 = 1;
2324
2325 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2326 {
2327 /* This code is disabled on the 486 because all the Imm1 forms
2328 in the opcode table are slower on the i486. They're the
2329 versions with the implicitly specified single-position
2330 displacement, which has another syntax if you really want to
2331 use that form. */
40fb9820
L
2332 t.bitfield.imm1 = 1;
2333 t.bitfield.imm8 = 1;
2334 t.bitfield.imm8s = 1;
2335 t.bitfield.imm16 = 1;
2336 t.bitfield.imm32 = 1;
2337 t.bitfield.imm32s = 1;
2338 }
2339 else if (fits_in_signed_byte (num))
2340 {
2341 t.bitfield.imm8 = 1;
2342 t.bitfield.imm8s = 1;
2343 t.bitfield.imm16 = 1;
2344 t.bitfield.imm32 = 1;
2345 t.bitfield.imm32s = 1;
2346 }
2347 else if (fits_in_unsigned_byte (num))
2348 {
2349 t.bitfield.imm8 = 1;
2350 t.bitfield.imm16 = 1;
2351 t.bitfield.imm32 = 1;
2352 t.bitfield.imm32s = 1;
2353 }
2354 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2355 {
2356 t.bitfield.imm16 = 1;
2357 t.bitfield.imm32 = 1;
2358 t.bitfield.imm32s = 1;
2359 }
2360 else if (fits_in_signed_long (num))
2361 {
2362 t.bitfield.imm32 = 1;
2363 t.bitfield.imm32s = 1;
2364 }
2365 else if (fits_in_unsigned_long (num))
2366 t.bitfield.imm32 = 1;
2367
2368 return t;
47926f60 2369}
252b5132 2370
847f7ad4 2371static offsetT
e3bb37b5 2372offset_in_range (offsetT val, int size)
847f7ad4 2373{
508866be 2374 addressT mask;
ba2adb93 2375
847f7ad4
AM
2376 switch (size)
2377 {
508866be
L
2378 case 1: mask = ((addressT) 1 << 8) - 1; break;
2379 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 2380 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
2381#ifdef BFD64
2382 case 8: mask = ((addressT) 2 << 63) - 1; break;
2383#endif
47926f60 2384 default: abort ();
847f7ad4
AM
2385 }
2386
9de868bf
L
2387#ifdef BFD64
2388 /* If BFD64, sign extend val for 32bit address mode. */
2389 if (flag_code != CODE_64BIT
2390 || i.prefix[ADDR_PREFIX])
3e73aa7c
JH
2391 if ((val & ~(((addressT) 2 << 31) - 1)) == 0)
2392 val = (val ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
fa289fb8 2393#endif
ba2adb93 2394
47926f60 2395 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
2396 {
2397 char buf1[40], buf2[40];
2398
2399 sprint_value (buf1, val);
2400 sprint_value (buf2, val & mask);
2401 as_warn (_("%s shortened to %s"), buf1, buf2);
2402 }
2403 return val & mask;
2404}
2405
c32fa91d
L
2406enum PREFIX_GROUP
2407{
2408 PREFIX_EXIST = 0,
2409 PREFIX_LOCK,
2410 PREFIX_REP,
04ef582a 2411 PREFIX_DS,
c32fa91d
L
2412 PREFIX_OTHER
2413};
2414
2415/* Returns
2416 a. PREFIX_EXIST if attempting to add a prefix where one from the
2417 same class already exists.
2418 b. PREFIX_LOCK if lock prefix is added.
2419 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2420 d. PREFIX_DS if ds prefix is added.
2421 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2422 */
2423
2424static enum PREFIX_GROUP
e3bb37b5 2425add_prefix (unsigned int prefix)
252b5132 2426{
c32fa91d 2427 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2428 unsigned int q;
252b5132 2429
29b0f896
AM
2430 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2431 && flag_code == CODE_64BIT)
b1905489 2432 {
161a04f6 2433 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2434 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2435 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2436 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2437 ret = PREFIX_EXIST;
b1905489
JB
2438 q = REX_PREFIX;
2439 }
3e73aa7c 2440 else
b1905489
JB
2441 {
2442 switch (prefix)
2443 {
2444 default:
2445 abort ();
2446
b1905489 2447 case DS_PREFIX_OPCODE:
04ef582a
L
2448 ret = PREFIX_DS;
2449 /* Fall through. */
2450 case CS_PREFIX_OPCODE:
b1905489
JB
2451 case ES_PREFIX_OPCODE:
2452 case FS_PREFIX_OPCODE:
2453 case GS_PREFIX_OPCODE:
2454 case SS_PREFIX_OPCODE:
2455 q = SEG_PREFIX;
2456 break;
2457
2458 case REPNE_PREFIX_OPCODE:
2459 case REPE_PREFIX_OPCODE:
c32fa91d
L
2460 q = REP_PREFIX;
2461 ret = PREFIX_REP;
2462 break;
2463
b1905489 2464 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2465 q = LOCK_PREFIX;
2466 ret = PREFIX_LOCK;
b1905489
JB
2467 break;
2468
2469 case FWAIT_OPCODE:
2470 q = WAIT_PREFIX;
2471 break;
2472
2473 case ADDR_PREFIX_OPCODE:
2474 q = ADDR_PREFIX;
2475 break;
2476
2477 case DATA_PREFIX_OPCODE:
2478 q = DATA_PREFIX;
2479 break;
2480 }
2481 if (i.prefix[q] != 0)
c32fa91d 2482 ret = PREFIX_EXIST;
b1905489 2483 }
252b5132 2484
b1905489 2485 if (ret)
252b5132 2486 {
b1905489
JB
2487 if (!i.prefix[q])
2488 ++i.prefixes;
2489 i.prefix[q] |= prefix;
252b5132 2490 }
b1905489
JB
2491 else
2492 as_bad (_("same type of prefix used twice"));
252b5132 2493
252b5132
RH
2494 return ret;
2495}
2496
2497static void
78f12dd3 2498update_code_flag (int value, int check)
eecb386c 2499{
78f12dd3
L
2500 PRINTF_LIKE ((*as_error));
2501
1e9cc1c2 2502 flag_code = (enum flag_code) value;
40fb9820
L
2503 if (flag_code == CODE_64BIT)
2504 {
2505 cpu_arch_flags.bitfield.cpu64 = 1;
2506 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
2507 }
2508 else
2509 {
2510 cpu_arch_flags.bitfield.cpu64 = 0;
2511 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
2512 }
2513 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c 2514 {
78f12dd3
L
2515 if (check)
2516 as_error = as_fatal;
2517 else
2518 as_error = as_bad;
2519 (*as_error) (_("64bit mode not supported on `%s'."),
2520 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2521 }
40fb9820 2522 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c 2523 {
78f12dd3
L
2524 if (check)
2525 as_error = as_fatal;
2526 else
2527 as_error = as_bad;
2528 (*as_error) (_("32bit mode not supported on `%s'."),
2529 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2530 }
eecb386c
AM
2531 stackop_size = '\0';
2532}
2533
78f12dd3
L
2534static void
2535set_code_flag (int value)
2536{
2537 update_code_flag (value, 0);
2538}
2539
eecb386c 2540static void
e3bb37b5 2541set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2542{
1e9cc1c2 2543 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2544 if (flag_code != CODE_16BIT)
2545 abort ();
2546 cpu_arch_flags.bitfield.cpu64 = 0;
2547 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 2548 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2549}
2550
2551static void
e3bb37b5 2552set_intel_syntax (int syntax_flag)
252b5132
RH
2553{
2554 /* Find out if register prefixing is specified. */
2555 int ask_naked_reg = 0;
2556
2557 SKIP_WHITESPACE ();
29b0f896 2558 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2559 {
d02603dc
NC
2560 char *string;
2561 int e = get_symbol_name (&string);
252b5132 2562
47926f60 2563 if (strcmp (string, "prefix") == 0)
252b5132 2564 ask_naked_reg = 1;
47926f60 2565 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2566 ask_naked_reg = -1;
2567 else
d0b47220 2568 as_bad (_("bad argument to syntax directive."));
d02603dc 2569 (void) restore_line_pointer (e);
252b5132
RH
2570 }
2571 demand_empty_rest_of_line ();
c3332e24 2572
252b5132
RH
2573 intel_syntax = syntax_flag;
2574
2575 if (ask_naked_reg == 0)
f86103b7
AM
2576 allow_naked_reg = (intel_syntax
2577 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2578 else
2579 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2580
ee86248c 2581 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
7ab9ffdd 2582
e4a3b5a4 2583 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 2584 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 2585 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
2586}
2587
1efbbeb4
L
2588static void
2589set_intel_mnemonic (int mnemonic_flag)
2590{
e1d4d893 2591 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2592}
2593
db51cc60
L
2594static void
2595set_allow_index_reg (int flag)
2596{
2597 allow_index_reg = flag;
2598}
2599
cb19c032 2600static void
7bab8ab5 2601set_check (int what)
cb19c032 2602{
7bab8ab5
JB
2603 enum check_kind *kind;
2604 const char *str;
2605
2606 if (what)
2607 {
2608 kind = &operand_check;
2609 str = "operand";
2610 }
2611 else
2612 {
2613 kind = &sse_check;
2614 str = "sse";
2615 }
2616
cb19c032
L
2617 SKIP_WHITESPACE ();
2618
2619 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2620 {
d02603dc
NC
2621 char *string;
2622 int e = get_symbol_name (&string);
cb19c032
L
2623
2624 if (strcmp (string, "none") == 0)
7bab8ab5 2625 *kind = check_none;
cb19c032 2626 else if (strcmp (string, "warning") == 0)
7bab8ab5 2627 *kind = check_warning;
cb19c032 2628 else if (strcmp (string, "error") == 0)
7bab8ab5 2629 *kind = check_error;
cb19c032 2630 else
7bab8ab5 2631 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2632 (void) restore_line_pointer (e);
cb19c032
L
2633 }
2634 else
7bab8ab5 2635 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2636
2637 demand_empty_rest_of_line ();
2638}
2639
8a9036a4
L
2640static void
2641check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2642 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2643{
2644#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2645 static const char *arch;
2646
2647 /* Intel LIOM is only supported on ELF. */
2648 if (!IS_ELF)
2649 return;
2650
2651 if (!arch)
2652 {
2653 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2654 use default_arch. */
2655 arch = cpu_arch_name;
2656 if (!arch)
2657 arch = default_arch;
2658 }
2659
81486035
L
2660 /* If we are targeting Intel MCU, we must enable it. */
2661 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_IAMCU
2662 || new_flag.bitfield.cpuiamcu)
2663 return;
2664
3632d14b 2665 /* If we are targeting Intel L1OM, we must enable it. */
8a9036a4 2666 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_L1OM
1e9cc1c2 2667 || new_flag.bitfield.cpul1om)
8a9036a4 2668 return;
76ba9986 2669
7a9068fe
L
2670 /* If we are targeting Intel K1OM, we must enable it. */
2671 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_K1OM
2672 || new_flag.bitfield.cpuk1om)
2673 return;
2674
8a9036a4
L
2675 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2676#endif
2677}
2678
e413e4e9 2679static void
e3bb37b5 2680set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2681{
47926f60 2682 SKIP_WHITESPACE ();
e413e4e9 2683
29b0f896 2684 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9 2685 {
d02603dc
NC
2686 char *string;
2687 int e = get_symbol_name (&string);
91d6fa6a 2688 unsigned int j;
40fb9820 2689 i386_cpu_flags flags;
e413e4e9 2690
91d6fa6a 2691 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
e413e4e9 2692 {
91d6fa6a 2693 if (strcmp (string, cpu_arch[j].name) == 0)
e413e4e9 2694 {
91d6fa6a 2695 check_cpu_arch_compatible (string, cpu_arch[j].flags);
8a9036a4 2696
5c6af06e
JB
2697 if (*string != '.')
2698 {
91d6fa6a 2699 cpu_arch_name = cpu_arch[j].name;
5c6af06e 2700 cpu_sub_arch_name = NULL;
91d6fa6a 2701 cpu_arch_flags = cpu_arch[j].flags;
40fb9820
L
2702 if (flag_code == CODE_64BIT)
2703 {
2704 cpu_arch_flags.bitfield.cpu64 = 1;
2705 cpu_arch_flags.bitfield.cpuno64 = 0;
2706 }
2707 else
2708 {
2709 cpu_arch_flags.bitfield.cpu64 = 0;
2710 cpu_arch_flags.bitfield.cpuno64 = 1;
2711 }
91d6fa6a
NC
2712 cpu_arch_isa = cpu_arch[j].type;
2713 cpu_arch_isa_flags = cpu_arch[j].flags;
ccc9c027
L
2714 if (!cpu_arch_tune_set)
2715 {
2716 cpu_arch_tune = cpu_arch_isa;
2717 cpu_arch_tune_flags = cpu_arch_isa_flags;
2718 }
5c6af06e
JB
2719 break;
2720 }
40fb9820 2721
293f5f65
L
2722 flags = cpu_flags_or (cpu_arch_flags,
2723 cpu_arch[j].flags);
81486035 2724
5b64d091 2725 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
5c6af06e 2726 {
6305a203
L
2727 if (cpu_sub_arch_name)
2728 {
2729 char *name = cpu_sub_arch_name;
2730 cpu_sub_arch_name = concat (name,
91d6fa6a 2731 cpu_arch[j].name,
1bf57e9f 2732 (const char *) NULL);
6305a203
L
2733 free (name);
2734 }
2735 else
91d6fa6a 2736 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
40fb9820 2737 cpu_arch_flags = flags;
a586129e 2738 cpu_arch_isa_flags = flags;
5c6af06e 2739 }
0089dace
L
2740 else
2741 cpu_arch_isa_flags
2742 = cpu_flags_or (cpu_arch_isa_flags,
2743 cpu_arch[j].flags);
d02603dc 2744 (void) restore_line_pointer (e);
5c6af06e
JB
2745 demand_empty_rest_of_line ();
2746 return;
e413e4e9
AM
2747 }
2748 }
293f5f65
L
2749
2750 if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
2751 {
33eaf5de 2752 /* Disable an ISA extension. */
293f5f65
L
2753 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
2754 if (strcmp (string + 1, cpu_noarch [j].name) == 0)
2755 {
2756 flags = cpu_flags_and_not (cpu_arch_flags,
2757 cpu_noarch[j].flags);
2758 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2759 {
2760 if (cpu_sub_arch_name)
2761 {
2762 char *name = cpu_sub_arch_name;
2763 cpu_sub_arch_name = concat (name, string,
2764 (const char *) NULL);
2765 free (name);
2766 }
2767 else
2768 cpu_sub_arch_name = xstrdup (string);
2769 cpu_arch_flags = flags;
2770 cpu_arch_isa_flags = flags;
2771 }
2772 (void) restore_line_pointer (e);
2773 demand_empty_rest_of_line ();
2774 return;
2775 }
2776
2777 j = ARRAY_SIZE (cpu_arch);
2778 }
2779
91d6fa6a 2780 if (j >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
2781 as_bad (_("no such architecture: `%s'"), string);
2782
2783 *input_line_pointer = e;
2784 }
2785 else
2786 as_bad (_("missing cpu architecture"));
2787
fddf5b5b
AM
2788 no_cond_jump_promotion = 0;
2789 if (*input_line_pointer == ','
29b0f896 2790 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 2791 {
d02603dc
NC
2792 char *string;
2793 char e;
2794
2795 ++input_line_pointer;
2796 e = get_symbol_name (&string);
fddf5b5b
AM
2797
2798 if (strcmp (string, "nojumps") == 0)
2799 no_cond_jump_promotion = 1;
2800 else if (strcmp (string, "jumps") == 0)
2801 ;
2802 else
2803 as_bad (_("no such architecture modifier: `%s'"), string);
2804
d02603dc 2805 (void) restore_line_pointer (e);
fddf5b5b
AM
2806 }
2807
e413e4e9
AM
2808 demand_empty_rest_of_line ();
2809}
2810
8a9036a4
L
2811enum bfd_architecture
2812i386_arch (void)
2813{
3632d14b 2814 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4
L
2815 {
2816 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2817 || flag_code != CODE_64BIT)
2818 as_fatal (_("Intel L1OM is 64bit ELF only"));
2819 return bfd_arch_l1om;
2820 }
7a9068fe
L
2821 else if (cpu_arch_isa == PROCESSOR_K1OM)
2822 {
2823 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2824 || flag_code != CODE_64BIT)
2825 as_fatal (_("Intel K1OM is 64bit ELF only"));
2826 return bfd_arch_k1om;
2827 }
81486035
L
2828 else if (cpu_arch_isa == PROCESSOR_IAMCU)
2829 {
2830 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2831 || flag_code == CODE_64BIT)
2832 as_fatal (_("Intel MCU is 32bit ELF only"));
2833 return bfd_arch_iamcu;
2834 }
8a9036a4
L
2835 else
2836 return bfd_arch_i386;
2837}
2838
b9d79e03 2839unsigned long
7016a5d5 2840i386_mach (void)
b9d79e03 2841{
351f65ca 2842 if (!strncmp (default_arch, "x86_64", 6))
8a9036a4 2843 {
3632d14b 2844 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 2845 {
351f65ca
L
2846 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2847 || default_arch[6] != '\0')
8a9036a4
L
2848 as_fatal (_("Intel L1OM is 64bit ELF only"));
2849 return bfd_mach_l1om;
2850 }
7a9068fe
L
2851 else if (cpu_arch_isa == PROCESSOR_K1OM)
2852 {
2853 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2854 || default_arch[6] != '\0')
2855 as_fatal (_("Intel K1OM is 64bit ELF only"));
2856 return bfd_mach_k1om;
2857 }
351f65ca 2858 else if (default_arch[6] == '\0')
8a9036a4 2859 return bfd_mach_x86_64;
351f65ca
L
2860 else
2861 return bfd_mach_x64_32;
8a9036a4 2862 }
5197d474
L
2863 else if (!strcmp (default_arch, "i386")
2864 || !strcmp (default_arch, "iamcu"))
81486035
L
2865 {
2866 if (cpu_arch_isa == PROCESSOR_IAMCU)
2867 {
2868 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
2869 as_fatal (_("Intel MCU is 32bit ELF only"));
2870 return bfd_mach_i386_iamcu;
2871 }
2872 else
2873 return bfd_mach_i386_i386;
2874 }
b9d79e03 2875 else
2b5d6a91 2876 as_fatal (_("unknown architecture"));
b9d79e03 2877}
b9d79e03 2878\f
252b5132 2879void
7016a5d5 2880md_begin (void)
252b5132
RH
2881{
2882 const char *hash_err;
2883
86fa6981
L
2884 /* Support pseudo prefixes like {disp32}. */
2885 lex_type ['{'] = LEX_BEGIN_NAME;
2886
47926f60 2887 /* Initialize op_hash hash table. */
252b5132
RH
2888 op_hash = hash_new ();
2889
2890 {
d3ce72d0 2891 const insn_template *optab;
29b0f896 2892 templates *core_optab;
252b5132 2893
47926f60
KH
2894 /* Setup for loop. */
2895 optab = i386_optab;
add39d23 2896 core_optab = XNEW (templates);
252b5132
RH
2897 core_optab->start = optab;
2898
2899 while (1)
2900 {
2901 ++optab;
2902 if (optab->name == NULL
2903 || strcmp (optab->name, (optab - 1)->name) != 0)
2904 {
2905 /* different name --> ship out current template list;
47926f60 2906 add to hash table; & begin anew. */
252b5132
RH
2907 core_optab->end = optab;
2908 hash_err = hash_insert (op_hash,
2909 (optab - 1)->name,
5a49b8ac 2910 (void *) core_optab);
252b5132
RH
2911 if (hash_err)
2912 {
b37df7c4 2913 as_fatal (_("can't hash %s: %s"),
252b5132
RH
2914 (optab - 1)->name,
2915 hash_err);
2916 }
2917 if (optab->name == NULL)
2918 break;
add39d23 2919 core_optab = XNEW (templates);
252b5132
RH
2920 core_optab->start = optab;
2921 }
2922 }
2923 }
2924
47926f60 2925 /* Initialize reg_hash hash table. */
252b5132
RH
2926 reg_hash = hash_new ();
2927 {
29b0f896 2928 const reg_entry *regtab;
c3fe08fa 2929 unsigned int regtab_size = i386_regtab_size;
252b5132 2930
c3fe08fa 2931 for (regtab = i386_regtab; regtab_size--; regtab++)
252b5132 2932 {
5a49b8ac 2933 hash_err = hash_insert (reg_hash, regtab->reg_name, (void *) regtab);
252b5132 2934 if (hash_err)
b37df7c4 2935 as_fatal (_("can't hash %s: %s"),
3e73aa7c
JH
2936 regtab->reg_name,
2937 hash_err);
252b5132
RH
2938 }
2939 }
2940
47926f60 2941 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 2942 {
29b0f896
AM
2943 int c;
2944 char *p;
252b5132
RH
2945
2946 for (c = 0; c < 256; c++)
2947 {
3882b010 2948 if (ISDIGIT (c))
252b5132
RH
2949 {
2950 digit_chars[c] = c;
2951 mnemonic_chars[c] = c;
2952 register_chars[c] = c;
2953 operand_chars[c] = c;
2954 }
3882b010 2955 else if (ISLOWER (c))
252b5132
RH
2956 {
2957 mnemonic_chars[c] = c;
2958 register_chars[c] = c;
2959 operand_chars[c] = c;
2960 }
3882b010 2961 else if (ISUPPER (c))
252b5132 2962 {
3882b010 2963 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
2964 register_chars[c] = mnemonic_chars[c];
2965 operand_chars[c] = c;
2966 }
43234a1e 2967 else if (c == '{' || c == '}')
86fa6981
L
2968 {
2969 mnemonic_chars[c] = c;
2970 operand_chars[c] = c;
2971 }
252b5132 2972
3882b010 2973 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
2974 identifier_chars[c] = c;
2975 else if (c >= 128)
2976 {
2977 identifier_chars[c] = c;
2978 operand_chars[c] = c;
2979 }
2980 }
2981
2982#ifdef LEX_AT
2983 identifier_chars['@'] = '@';
32137342
NC
2984#endif
2985#ifdef LEX_QM
2986 identifier_chars['?'] = '?';
2987 operand_chars['?'] = '?';
252b5132 2988#endif
252b5132 2989 digit_chars['-'] = '-';
c0f3af97 2990 mnemonic_chars['_'] = '_';
791fe849 2991 mnemonic_chars['-'] = '-';
0003779b 2992 mnemonic_chars['.'] = '.';
252b5132
RH
2993 identifier_chars['_'] = '_';
2994 identifier_chars['.'] = '.';
2995
2996 for (p = operand_special_chars; *p != '\0'; p++)
2997 operand_chars[(unsigned char) *p] = *p;
2998 }
2999
a4447b93
RH
3000 if (flag_code == CODE_64BIT)
3001 {
ca19b261
KT
3002#if defined (OBJ_COFF) && defined (TE_PE)
3003 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
3004 ? 32 : 16);
3005#else
a4447b93 3006 x86_dwarf2_return_column = 16;
ca19b261 3007#endif
61ff971f 3008 x86_cie_data_alignment = -8;
a4447b93
RH
3009 }
3010 else
3011 {
3012 x86_dwarf2_return_column = 8;
3013 x86_cie_data_alignment = -4;
3014 }
252b5132
RH
3015}
3016
3017void
e3bb37b5 3018i386_print_statistics (FILE *file)
252b5132
RH
3019{
3020 hash_print_statistics (file, "i386 opcode", op_hash);
3021 hash_print_statistics (file, "i386 register", reg_hash);
3022}
3023\f
252b5132
RH
3024#ifdef DEBUG386
3025
ce8a8b2f 3026/* Debugging routines for md_assemble. */
d3ce72d0 3027static void pte (insn_template *);
40fb9820 3028static void pt (i386_operand_type);
e3bb37b5
L
3029static void pe (expressionS *);
3030static void ps (symbolS *);
252b5132
RH
3031
3032static void
2c703856 3033pi (const char *line, i386_insn *x)
252b5132 3034{
09137c09 3035 unsigned int j;
252b5132
RH
3036
3037 fprintf (stdout, "%s: template ", line);
3038 pte (&x->tm);
09f131f2
JH
3039 fprintf (stdout, " address: base %s index %s scale %x\n",
3040 x->base_reg ? x->base_reg->reg_name : "none",
3041 x->index_reg ? x->index_reg->reg_name : "none",
3042 x->log2_scale_factor);
3043 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 3044 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
3045 fprintf (stdout, " sib: base %x index %x scale %x\n",
3046 x->sib.base, x->sib.index, x->sib.scale);
3047 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
3048 (x->rex & REX_W) != 0,
3049 (x->rex & REX_R) != 0,
3050 (x->rex & REX_X) != 0,
3051 (x->rex & REX_B) != 0);
09137c09 3052 for (j = 0; j < x->operands; j++)
252b5132 3053 {
09137c09
SP
3054 fprintf (stdout, " #%d: ", j + 1);
3055 pt (x->types[j]);
252b5132 3056 fprintf (stdout, "\n");
bab6aec1 3057 if (x->types[j].bitfield.class == Reg
3528c362
JB
3058 || x->types[j].bitfield.class == RegMMX
3059 || x->types[j].bitfield.class == RegSIMD
00cee14f 3060 || x->types[j].bitfield.class == SReg
4a5c67ed
JB
3061 || x->types[j].bitfield.class == RegCR
3062 || x->types[j].bitfield.class == RegDR
3063 || x->types[j].bitfield.class == RegTR)
09137c09
SP
3064 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
3065 if (operand_type_check (x->types[j], imm))
3066 pe (x->op[j].imms);
3067 if (operand_type_check (x->types[j], disp))
3068 pe (x->op[j].disps);
252b5132
RH
3069 }
3070}
3071
3072static void
d3ce72d0 3073pte (insn_template *t)
252b5132 3074{
09137c09 3075 unsigned int j;
252b5132 3076 fprintf (stdout, " %d operands ", t->operands);
47926f60 3077 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
3078 if (t->extension_opcode != None)
3079 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 3080 if (t->opcode_modifier.d)
252b5132 3081 fprintf (stdout, "D");
40fb9820 3082 if (t->opcode_modifier.w)
252b5132
RH
3083 fprintf (stdout, "W");
3084 fprintf (stdout, "\n");
09137c09 3085 for (j = 0; j < t->operands; j++)
252b5132 3086 {
09137c09
SP
3087 fprintf (stdout, " #%d type ", j + 1);
3088 pt (t->operand_types[j]);
252b5132
RH
3089 fprintf (stdout, "\n");
3090 }
3091}
3092
3093static void
e3bb37b5 3094pe (expressionS *e)
252b5132 3095{
24eab124 3096 fprintf (stdout, " operation %d\n", e->X_op);
b77ad1d4
AM
3097 fprintf (stdout, " add_number %ld (%lx)\n",
3098 (long) e->X_add_number, (long) e->X_add_number);
252b5132
RH
3099 if (e->X_add_symbol)
3100 {
3101 fprintf (stdout, " add_symbol ");
3102 ps (e->X_add_symbol);
3103 fprintf (stdout, "\n");
3104 }
3105 if (e->X_op_symbol)
3106 {
3107 fprintf (stdout, " op_symbol ");
3108 ps (e->X_op_symbol);
3109 fprintf (stdout, "\n");
3110 }
3111}
3112
3113static void
e3bb37b5 3114ps (symbolS *s)
252b5132
RH
3115{
3116 fprintf (stdout, "%s type %s%s",
3117 S_GET_NAME (s),
3118 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3119 segment_name (S_GET_SEGMENT (s)));
3120}
3121
7b81dfbb 3122static struct type_name
252b5132 3123 {
40fb9820
L
3124 i386_operand_type mask;
3125 const char *name;
252b5132 3126 }
7b81dfbb 3127const type_names[] =
252b5132 3128{
40fb9820
L
3129 { OPERAND_TYPE_REG8, "r8" },
3130 { OPERAND_TYPE_REG16, "r16" },
3131 { OPERAND_TYPE_REG32, "r32" },
3132 { OPERAND_TYPE_REG64, "r64" },
2c703856
JB
3133 { OPERAND_TYPE_ACC8, "acc8" },
3134 { OPERAND_TYPE_ACC16, "acc16" },
3135 { OPERAND_TYPE_ACC32, "acc32" },
3136 { OPERAND_TYPE_ACC64, "acc64" },
40fb9820
L
3137 { OPERAND_TYPE_IMM8, "i8" },
3138 { OPERAND_TYPE_IMM8, "i8s" },
3139 { OPERAND_TYPE_IMM16, "i16" },
3140 { OPERAND_TYPE_IMM32, "i32" },
3141 { OPERAND_TYPE_IMM32S, "i32s" },
3142 { OPERAND_TYPE_IMM64, "i64" },
3143 { OPERAND_TYPE_IMM1, "i1" },
3144 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
3145 { OPERAND_TYPE_DISP8, "d8" },
3146 { OPERAND_TYPE_DISP16, "d16" },
3147 { OPERAND_TYPE_DISP32, "d32" },
3148 { OPERAND_TYPE_DISP32S, "d32s" },
3149 { OPERAND_TYPE_DISP64, "d64" },
3150 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
3151 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
3152 { OPERAND_TYPE_CONTROL, "control reg" },
3153 { OPERAND_TYPE_TEST, "test reg" },
3154 { OPERAND_TYPE_DEBUG, "debug reg" },
3155 { OPERAND_TYPE_FLOATREG, "FReg" },
3156 { OPERAND_TYPE_FLOATACC, "FAcc" },
21df382b 3157 { OPERAND_TYPE_SREG, "SReg" },
40fb9820
L
3158 { OPERAND_TYPE_JUMPABSOLUTE, "Jump Absolute" },
3159 { OPERAND_TYPE_REGMMX, "rMMX" },
3160 { OPERAND_TYPE_REGXMM, "rXMM" },
0349dc08 3161 { OPERAND_TYPE_REGYMM, "rYMM" },
43234a1e
L
3162 { OPERAND_TYPE_REGZMM, "rZMM" },
3163 { OPERAND_TYPE_REGMASK, "Mask reg" },
252b5132
RH
3164};
3165
3166static void
40fb9820 3167pt (i386_operand_type t)
252b5132 3168{
40fb9820 3169 unsigned int j;
c6fb90c8 3170 i386_operand_type a;
252b5132 3171
40fb9820 3172 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3173 {
3174 a = operand_type_and (t, type_names[j].mask);
2c703856 3175 if (operand_type_equal (&a, &type_names[j].mask))
c6fb90c8
L
3176 fprintf (stdout, "%s, ", type_names[j].name);
3177 }
252b5132
RH
3178 fflush (stdout);
3179}
3180
3181#endif /* DEBUG386 */
3182\f
252b5132 3183static bfd_reloc_code_real_type
3956db08 3184reloc (unsigned int size,
64e74474
AM
3185 int pcrel,
3186 int sign,
3187 bfd_reloc_code_real_type other)
252b5132 3188{
47926f60 3189 if (other != NO_RELOC)
3956db08 3190 {
91d6fa6a 3191 reloc_howto_type *rel;
3956db08
JB
3192
3193 if (size == 8)
3194 switch (other)
3195 {
64e74474
AM
3196 case BFD_RELOC_X86_64_GOT32:
3197 return BFD_RELOC_X86_64_GOT64;
3198 break;
553d1284
L
3199 case BFD_RELOC_X86_64_GOTPLT64:
3200 return BFD_RELOC_X86_64_GOTPLT64;
3201 break;
64e74474
AM
3202 case BFD_RELOC_X86_64_PLTOFF64:
3203 return BFD_RELOC_X86_64_PLTOFF64;
3204 break;
3205 case BFD_RELOC_X86_64_GOTPC32:
3206 other = BFD_RELOC_X86_64_GOTPC64;
3207 break;
3208 case BFD_RELOC_X86_64_GOTPCREL:
3209 other = BFD_RELOC_X86_64_GOTPCREL64;
3210 break;
3211 case BFD_RELOC_X86_64_TPOFF32:
3212 other = BFD_RELOC_X86_64_TPOFF64;
3213 break;
3214 case BFD_RELOC_X86_64_DTPOFF32:
3215 other = BFD_RELOC_X86_64_DTPOFF64;
3216 break;
3217 default:
3218 break;
3956db08 3219 }
e05278af 3220
8ce3d284 3221#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3222 if (other == BFD_RELOC_SIZE32)
3223 {
3224 if (size == 8)
1ab668bf 3225 other = BFD_RELOC_SIZE64;
8fd4256d 3226 if (pcrel)
1ab668bf
AM
3227 {
3228 as_bad (_("there are no pc-relative size relocations"));
3229 return NO_RELOC;
3230 }
8fd4256d 3231 }
8ce3d284 3232#endif
8fd4256d 3233
e05278af 3234 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3235 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3236 sign = -1;
3237
91d6fa6a
NC
3238 rel = bfd_reloc_type_lookup (stdoutput, other);
3239 if (!rel)
3956db08 3240 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3241 else if (size != bfd_get_reloc_size (rel))
3956db08 3242 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3243 bfd_get_reloc_size (rel),
3956db08 3244 size);
91d6fa6a 3245 else if (pcrel && !rel->pc_relative)
3956db08 3246 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3247 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3248 && !sign)
91d6fa6a 3249 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3250 && sign > 0))
3956db08
JB
3251 as_bad (_("relocated field and relocation type differ in signedness"));
3252 else
3253 return other;
3254 return NO_RELOC;
3255 }
252b5132
RH
3256
3257 if (pcrel)
3258 {
3e73aa7c 3259 if (!sign)
3956db08 3260 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3261 switch (size)
3262 {
3263 case 1: return BFD_RELOC_8_PCREL;
3264 case 2: return BFD_RELOC_16_PCREL;
d258b828 3265 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3266 case 8: return BFD_RELOC_64_PCREL;
252b5132 3267 }
3956db08 3268 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3269 }
3270 else
3271 {
3956db08 3272 if (sign > 0)
e5cb08ac 3273 switch (size)
3e73aa7c
JH
3274 {
3275 case 4: return BFD_RELOC_X86_64_32S;
3276 }
3277 else
3278 switch (size)
3279 {
3280 case 1: return BFD_RELOC_8;
3281 case 2: return BFD_RELOC_16;
3282 case 4: return BFD_RELOC_32;
3283 case 8: return BFD_RELOC_64;
3284 }
3956db08
JB
3285 as_bad (_("cannot do %s %u byte relocation"),
3286 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3287 }
3288
0cc9e1d3 3289 return NO_RELOC;
252b5132
RH
3290}
3291
47926f60
KH
3292/* Here we decide which fixups can be adjusted to make them relative to
3293 the beginning of the section instead of the symbol. Basically we need
3294 to make sure that the dynamic relocations are done correctly, so in
3295 some cases we force the original symbol to be used. */
3296
252b5132 3297int
e3bb37b5 3298tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3299{
6d249963 3300#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3301 if (!IS_ELF)
31312f95
AM
3302 return 1;
3303
a161fe53
AM
3304 /* Don't adjust pc-relative references to merge sections in 64-bit
3305 mode. */
3306 if (use_rela_relocations
3307 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3308 && fixP->fx_pcrel)
252b5132 3309 return 0;
31312f95 3310
8d01d9a9
AJ
3311 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3312 and changed later by validate_fix. */
3313 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3314 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3315 return 0;
3316
8fd4256d
L
3317 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3318 for size relocations. */
3319 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3320 || fixP->fx_r_type == BFD_RELOC_SIZE64
3321 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132
RH
3322 || fixP->fx_r_type == BFD_RELOC_386_PLT32
3323 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3324 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3325 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3326 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3327 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3328 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3329 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3330 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3331 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3332 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3333 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3334 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c
JH
3335 || fixP->fx_r_type == BFD_RELOC_X86_64_PLT32
3336 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3337 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3338 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3339 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3340 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3341 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3342 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3343 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3344 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3345 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3346 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3347 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3348 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3349 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3350 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3351 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3352 return 0;
31312f95 3353#endif
252b5132
RH
3354 return 1;
3355}
252b5132 3356
b4cac588 3357static int
e3bb37b5 3358intel_float_operand (const char *mnemonic)
252b5132 3359{
9306ca4a
JB
3360 /* Note that the value returned is meaningful only for opcodes with (memory)
3361 operands, hence the code here is free to improperly handle opcodes that
3362 have no operands (for better performance and smaller code). */
3363
3364 if (mnemonic[0] != 'f')
3365 return 0; /* non-math */
3366
3367 switch (mnemonic[1])
3368 {
3369 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3370 the fs segment override prefix not currently handled because no
3371 call path can make opcodes without operands get here */
3372 case 'i':
3373 return 2 /* integer op */;
3374 case 'l':
3375 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3376 return 3; /* fldcw/fldenv */
3377 break;
3378 case 'n':
3379 if (mnemonic[2] != 'o' /* fnop */)
3380 return 3; /* non-waiting control op */
3381 break;
3382 case 'r':
3383 if (mnemonic[2] == 's')
3384 return 3; /* frstor/frstpm */
3385 break;
3386 case 's':
3387 if (mnemonic[2] == 'a')
3388 return 3; /* fsave */
3389 if (mnemonic[2] == 't')
3390 {
3391 switch (mnemonic[3])
3392 {
3393 case 'c': /* fstcw */
3394 case 'd': /* fstdw */
3395 case 'e': /* fstenv */
3396 case 's': /* fsts[gw] */
3397 return 3;
3398 }
3399 }
3400 break;
3401 case 'x':
3402 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3403 return 0; /* fxsave/fxrstor are not really math ops */
3404 break;
3405 }
252b5132 3406
9306ca4a 3407 return 1;
252b5132
RH
3408}
3409
c0f3af97
L
3410/* Build the VEX prefix. */
3411
3412static void
d3ce72d0 3413build_vex_prefix (const insn_template *t)
c0f3af97
L
3414{
3415 unsigned int register_specifier;
3416 unsigned int implied_prefix;
3417 unsigned int vector_length;
03751133 3418 unsigned int w;
c0f3af97
L
3419
3420 /* Check register specifier. */
3421 if (i.vex.register_specifier)
43234a1e
L
3422 {
3423 register_specifier =
3424 ~register_number (i.vex.register_specifier) & 0xf;
3425 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3426 }
c0f3af97
L
3427 else
3428 register_specifier = 0xf;
3429
79f0fa25
L
3430 /* Use 2-byte VEX prefix by swapping destination and source operand
3431 if there are more than 1 register operand. */
3432 if (i.reg_operands > 1
3433 && i.vec_encoding != vex_encoding_vex3
86fa6981 3434 && i.dir_encoding == dir_encoding_default
fa99fab2 3435 && i.operands == i.reg_operands
dbbc8b7e 3436 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
7f399153 3437 && i.tm.opcode_modifier.vexopcode == VEX0F
dbbc8b7e 3438 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3439 && i.rex == REX_B)
3440 {
3441 unsigned int xchg = i.operands - 1;
3442 union i386_op temp_op;
3443 i386_operand_type temp_type;
3444
3445 temp_type = i.types[xchg];
3446 i.types[xchg] = i.types[0];
3447 i.types[0] = temp_type;
3448 temp_op = i.op[xchg];
3449 i.op[xchg] = i.op[0];
3450 i.op[0] = temp_op;
3451
9c2799c2 3452 gas_assert (i.rm.mode == 3);
fa99fab2
L
3453
3454 i.rex = REX_R;
3455 xchg = i.rm.regmem;
3456 i.rm.regmem = i.rm.reg;
3457 i.rm.reg = xchg;
3458
dbbc8b7e
JB
3459 if (i.tm.opcode_modifier.d)
3460 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
3461 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
3462 else /* Use the next insn. */
3463 i.tm = t[1];
fa99fab2
L
3464 }
3465
79dec6b7
JB
3466 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3467 are no memory operands and at least 3 register ones. */
3468 if (i.reg_operands >= 3
3469 && i.vec_encoding != vex_encoding_vex3
3470 && i.reg_operands == i.operands - i.imm_operands
3471 && i.tm.opcode_modifier.vex
3472 && i.tm.opcode_modifier.commutative
3473 && (i.tm.opcode_modifier.sse2avx || optimize > 1)
3474 && i.rex == REX_B
3475 && i.vex.register_specifier
3476 && !(i.vex.register_specifier->reg_flags & RegRex))
3477 {
3478 unsigned int xchg = i.operands - i.reg_operands;
3479 union i386_op temp_op;
3480 i386_operand_type temp_type;
3481
3482 gas_assert (i.tm.opcode_modifier.vexopcode == VEX0F);
3483 gas_assert (!i.tm.opcode_modifier.sae);
3484 gas_assert (operand_type_equal (&i.types[i.operands - 2],
3485 &i.types[i.operands - 3]));
3486 gas_assert (i.rm.mode == 3);
3487
3488 temp_type = i.types[xchg];
3489 i.types[xchg] = i.types[xchg + 1];
3490 i.types[xchg + 1] = temp_type;
3491 temp_op = i.op[xchg];
3492 i.op[xchg] = i.op[xchg + 1];
3493 i.op[xchg + 1] = temp_op;
3494
3495 i.rex = 0;
3496 xchg = i.rm.regmem | 8;
3497 i.rm.regmem = ~register_specifier & 0xf;
3498 gas_assert (!(i.rm.regmem & 8));
3499 i.vex.register_specifier += xchg - i.rm.regmem;
3500 register_specifier = ~xchg & 0xf;
3501 }
3502
539f890d
L
3503 if (i.tm.opcode_modifier.vex == VEXScalar)
3504 vector_length = avxscalar;
10c17abd
JB
3505 else if (i.tm.opcode_modifier.vex == VEX256)
3506 vector_length = 1;
539f890d 3507 else
10c17abd 3508 {
56522fc5 3509 unsigned int op;
10c17abd 3510
c7213af9
L
3511 /* Determine vector length from the last multi-length vector
3512 operand. */
10c17abd 3513 vector_length = 0;
56522fc5 3514 for (op = t->operands; op--;)
10c17abd
JB
3515 if (t->operand_types[op].bitfield.xmmword
3516 && t->operand_types[op].bitfield.ymmword
3517 && i.types[op].bitfield.ymmword)
3518 {
3519 vector_length = 1;
3520 break;
3521 }
3522 }
c0f3af97
L
3523
3524 switch ((i.tm.base_opcode >> 8) & 0xff)
3525 {
3526 case 0:
3527 implied_prefix = 0;
3528 break;
3529 case DATA_PREFIX_OPCODE:
3530 implied_prefix = 1;
3531 break;
3532 case REPE_PREFIX_OPCODE:
3533 implied_prefix = 2;
3534 break;
3535 case REPNE_PREFIX_OPCODE:
3536 implied_prefix = 3;
3537 break;
3538 default:
3539 abort ();
3540 }
3541
03751133
L
3542 /* Check the REX.W bit and VEXW. */
3543 if (i.tm.opcode_modifier.vexw == VEXWIG)
3544 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
3545 else if (i.tm.opcode_modifier.vexw)
3546 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3547 else
931d03b7 3548 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3549
c0f3af97 3550 /* Use 2-byte VEX prefix if possible. */
03751133
L
3551 if (w == 0
3552 && i.vec_encoding != vex_encoding_vex3
86fa6981 3553 && i.tm.opcode_modifier.vexopcode == VEX0F
c0f3af97
L
3554 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3555 {
3556 /* 2-byte VEX prefix. */
3557 unsigned int r;
3558
3559 i.vex.length = 2;
3560 i.vex.bytes[0] = 0xc5;
3561
3562 /* Check the REX.R bit. */
3563 r = (i.rex & REX_R) ? 0 : 1;
3564 i.vex.bytes[1] = (r << 7
3565 | register_specifier << 3
3566 | vector_length << 2
3567 | implied_prefix);
3568 }
3569 else
3570 {
3571 /* 3-byte VEX prefix. */
03751133 3572 unsigned int m;
c0f3af97 3573
f88c9eb0 3574 i.vex.length = 3;
f88c9eb0 3575
7f399153 3576 switch (i.tm.opcode_modifier.vexopcode)
5dd85c99 3577 {
7f399153
L
3578 case VEX0F:
3579 m = 0x1;
80de6e00 3580 i.vex.bytes[0] = 0xc4;
7f399153
L
3581 break;
3582 case VEX0F38:
3583 m = 0x2;
80de6e00 3584 i.vex.bytes[0] = 0xc4;
7f399153
L
3585 break;
3586 case VEX0F3A:
3587 m = 0x3;
80de6e00 3588 i.vex.bytes[0] = 0xc4;
7f399153
L
3589 break;
3590 case XOP08:
5dd85c99
SP
3591 m = 0x8;
3592 i.vex.bytes[0] = 0x8f;
7f399153
L
3593 break;
3594 case XOP09:
f88c9eb0
SP
3595 m = 0x9;
3596 i.vex.bytes[0] = 0x8f;
7f399153
L
3597 break;
3598 case XOP0A:
f88c9eb0
SP
3599 m = 0xa;
3600 i.vex.bytes[0] = 0x8f;
7f399153
L
3601 break;
3602 default:
3603 abort ();
f88c9eb0 3604 }
c0f3af97 3605
c0f3af97
L
3606 /* The high 3 bits of the second VEX byte are 1's compliment
3607 of RXB bits from REX. */
3608 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3609
c0f3af97
L
3610 i.vex.bytes[2] = (w << 7
3611 | register_specifier << 3
3612 | vector_length << 2
3613 | implied_prefix);
3614 }
3615}
3616
e771e7c9
JB
3617static INLINE bfd_boolean
3618is_evex_encoding (const insn_template *t)
3619{
7091c612 3620 return t->opcode_modifier.evex || t->opcode_modifier.disp8memshift
e771e7c9 3621 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
a80195f1 3622 || t->opcode_modifier.sae;
e771e7c9
JB
3623}
3624
7a8655d2
JB
3625static INLINE bfd_boolean
3626is_any_vex_encoding (const insn_template *t)
3627{
3628 return t->opcode_modifier.vex || t->opcode_modifier.vexopcode
3629 || is_evex_encoding (t);
3630}
3631
43234a1e
L
3632/* Build the EVEX prefix. */
3633
3634static void
3635build_evex_prefix (void)
3636{
3637 unsigned int register_specifier;
3638 unsigned int implied_prefix;
3639 unsigned int m, w;
3640 rex_byte vrex_used = 0;
3641
3642 /* Check register specifier. */
3643 if (i.vex.register_specifier)
3644 {
3645 gas_assert ((i.vrex & REX_X) == 0);
3646
3647 register_specifier = i.vex.register_specifier->reg_num;
3648 if ((i.vex.register_specifier->reg_flags & RegRex))
3649 register_specifier += 8;
3650 /* The upper 16 registers are encoded in the fourth byte of the
3651 EVEX prefix. */
3652 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3653 i.vex.bytes[3] = 0x8;
3654 register_specifier = ~register_specifier & 0xf;
3655 }
3656 else
3657 {
3658 register_specifier = 0xf;
3659
3660 /* Encode upper 16 vector index register in the fourth byte of
3661 the EVEX prefix. */
3662 if (!(i.vrex & REX_X))
3663 i.vex.bytes[3] = 0x8;
3664 else
3665 vrex_used |= REX_X;
3666 }
3667
3668 switch ((i.tm.base_opcode >> 8) & 0xff)
3669 {
3670 case 0:
3671 implied_prefix = 0;
3672 break;
3673 case DATA_PREFIX_OPCODE:
3674 implied_prefix = 1;
3675 break;
3676 case REPE_PREFIX_OPCODE:
3677 implied_prefix = 2;
3678 break;
3679 case REPNE_PREFIX_OPCODE:
3680 implied_prefix = 3;
3681 break;
3682 default:
3683 abort ();
3684 }
3685
3686 /* 4 byte EVEX prefix. */
3687 i.vex.length = 4;
3688 i.vex.bytes[0] = 0x62;
3689
3690 /* mmmm bits. */
3691 switch (i.tm.opcode_modifier.vexopcode)
3692 {
3693 case VEX0F:
3694 m = 1;
3695 break;
3696 case VEX0F38:
3697 m = 2;
3698 break;
3699 case VEX0F3A:
3700 m = 3;
3701 break;
3702 default:
3703 abort ();
3704 break;
3705 }
3706
3707 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3708 bits from REX. */
3709 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3710
3711 /* The fifth bit of the second EVEX byte is 1's compliment of the
3712 REX_R bit in VREX. */
3713 if (!(i.vrex & REX_R))
3714 i.vex.bytes[1] |= 0x10;
3715 else
3716 vrex_used |= REX_R;
3717
3718 if ((i.reg_operands + i.imm_operands) == i.operands)
3719 {
3720 /* When all operands are registers, the REX_X bit in REX is not
3721 used. We reuse it to encode the upper 16 registers, which is
3722 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3723 as 1's compliment. */
3724 if ((i.vrex & REX_B))
3725 {
3726 vrex_used |= REX_B;
3727 i.vex.bytes[1] &= ~0x40;
3728 }
3729 }
3730
3731 /* EVEX instructions shouldn't need the REX prefix. */
3732 i.vrex &= ~vrex_used;
3733 gas_assert (i.vrex == 0);
3734
6865c043
L
3735 /* Check the REX.W bit and VEXW. */
3736 if (i.tm.opcode_modifier.vexw == VEXWIG)
3737 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
3738 else if (i.tm.opcode_modifier.vexw)
3739 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3740 else
931d03b7 3741 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e
L
3742
3743 /* Encode the U bit. */
3744 implied_prefix |= 0x4;
3745
3746 /* The third byte of the EVEX prefix. */
3747 i.vex.bytes[2] = (w << 7 | register_specifier << 3 | implied_prefix);
3748
3749 /* The fourth byte of the EVEX prefix. */
3750 /* The zeroing-masking bit. */
3751 if (i.mask && i.mask->zeroing)
3752 i.vex.bytes[3] |= 0x80;
3753
3754 /* Don't always set the broadcast bit if there is no RC. */
3755 if (!i.rounding)
3756 {
3757 /* Encode the vector length. */
3758 unsigned int vec_length;
3759
e771e7c9
JB
3760 if (!i.tm.opcode_modifier.evex
3761 || i.tm.opcode_modifier.evex == EVEXDYN)
3762 {
56522fc5 3763 unsigned int op;
e771e7c9 3764
c7213af9
L
3765 /* Determine vector length from the last multi-length vector
3766 operand. */
e771e7c9 3767 vec_length = 0;
56522fc5 3768 for (op = i.operands; op--;)
e771e7c9
JB
3769 if (i.tm.operand_types[op].bitfield.xmmword
3770 + i.tm.operand_types[op].bitfield.ymmword
3771 + i.tm.operand_types[op].bitfield.zmmword > 1)
3772 {
3773 if (i.types[op].bitfield.zmmword)
c7213af9
L
3774 {
3775 i.tm.opcode_modifier.evex = EVEX512;
3776 break;
3777 }
e771e7c9 3778 else if (i.types[op].bitfield.ymmword)
c7213af9
L
3779 {
3780 i.tm.opcode_modifier.evex = EVEX256;
3781 break;
3782 }
e771e7c9 3783 else if (i.types[op].bitfield.xmmword)
c7213af9
L
3784 {
3785 i.tm.opcode_modifier.evex = EVEX128;
3786 break;
3787 }
625cbd7a
JB
3788 else if (i.broadcast && (int) op == i.broadcast->operand)
3789 {
4a1b91ea 3790 switch (i.broadcast->bytes)
625cbd7a
JB
3791 {
3792 case 64:
3793 i.tm.opcode_modifier.evex = EVEX512;
3794 break;
3795 case 32:
3796 i.tm.opcode_modifier.evex = EVEX256;
3797 break;
3798 case 16:
3799 i.tm.opcode_modifier.evex = EVEX128;
3800 break;
3801 default:
c7213af9 3802 abort ();
625cbd7a 3803 }
c7213af9 3804 break;
625cbd7a 3805 }
e771e7c9 3806 }
c7213af9 3807
56522fc5 3808 if (op >= MAX_OPERANDS)
c7213af9 3809 abort ();
e771e7c9
JB
3810 }
3811
43234a1e
L
3812 switch (i.tm.opcode_modifier.evex)
3813 {
3814 case EVEXLIG: /* LL' is ignored */
3815 vec_length = evexlig << 5;
3816 break;
3817 case EVEX128:
3818 vec_length = 0 << 5;
3819 break;
3820 case EVEX256:
3821 vec_length = 1 << 5;
3822 break;
3823 case EVEX512:
3824 vec_length = 2 << 5;
3825 break;
3826 default:
3827 abort ();
3828 break;
3829 }
3830 i.vex.bytes[3] |= vec_length;
3831 /* Encode the broadcast bit. */
3832 if (i.broadcast)
3833 i.vex.bytes[3] |= 0x10;
3834 }
3835 else
3836 {
3837 if (i.rounding->type != saeonly)
3838 i.vex.bytes[3] |= 0x10 | (i.rounding->type << 5);
3839 else
d3d3c6db 3840 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e
L
3841 }
3842
3843 if (i.mask && i.mask->mask)
3844 i.vex.bytes[3] |= i.mask->mask->reg_num;
3845}
3846
65da13b5
L
3847static void
3848process_immext (void)
3849{
3850 expressionS *exp;
3851
c0f3af97 3852 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
3853 which is coded in the same place as an 8-bit immediate field
3854 would be. Here we fake an 8-bit immediate operand from the
3855 opcode suffix stored in tm.extension_opcode.
3856
c1e679ec 3857 AVX instructions also use this encoding, for some of
c0f3af97 3858 3 argument instructions. */
65da13b5 3859
43234a1e 3860 gas_assert (i.imm_operands <= 1
7ab9ffdd 3861 && (i.operands <= 2
7a8655d2 3862 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 3863 && i.operands <= 4)));
65da13b5
L
3864
3865 exp = &im_expressions[i.imm_operands++];
3866 i.op[i.operands].imms = exp;
3867 i.types[i.operands] = imm8;
3868 i.operands++;
3869 exp->X_op = O_constant;
3870 exp->X_add_number = i.tm.extension_opcode;
3871 i.tm.extension_opcode = None;
3872}
3873
42164a71
L
3874
3875static int
3876check_hle (void)
3877{
3878 switch (i.tm.opcode_modifier.hleprefixok)
3879 {
3880 default:
3881 abort ();
82c2def5 3882 case HLEPrefixNone:
165de32a
L
3883 as_bad (_("invalid instruction `%s' after `%s'"),
3884 i.tm.name, i.hle_prefix);
42164a71 3885 return 0;
82c2def5 3886 case HLEPrefixLock:
42164a71
L
3887 if (i.prefix[LOCK_PREFIX])
3888 return 1;
165de32a 3889 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 3890 return 0;
82c2def5 3891 case HLEPrefixAny:
42164a71 3892 return 1;
82c2def5 3893 case HLEPrefixRelease:
42164a71
L
3894 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
3895 {
3896 as_bad (_("instruction `%s' after `xacquire' not allowed"),
3897 i.tm.name);
3898 return 0;
3899 }
8dc0818e 3900 if (i.mem_operands == 0 || !(i.flags[i.operands - 1] & Operand_Mem))
42164a71
L
3901 {
3902 as_bad (_("memory destination needed for instruction `%s'"
3903 " after `xrelease'"), i.tm.name);
3904 return 0;
3905 }
3906 return 1;
3907 }
3908}
3909
b6f8c7c4
L
3910/* Try the shortest encoding by shortening operand size. */
3911
3912static void
3913optimize_encoding (void)
3914{
a0a1771e 3915 unsigned int j;
b6f8c7c4
L
3916
3917 if (optimize_for_space
3918 && i.reg_operands == 1
3919 && i.imm_operands == 1
3920 && !i.types[1].bitfield.byte
3921 && i.op[0].imms->X_op == O_constant
3922 && fits_in_imm7 (i.op[0].imms->X_add_number)
3923 && ((i.tm.base_opcode == 0xa8
3924 && i.tm.extension_opcode == None)
3925 || (i.tm.base_opcode == 0xf6
3926 && i.tm.extension_opcode == 0x0)))
3927 {
3928 /* Optimize: -Os:
3929 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
3930 */
3931 unsigned int base_regnum = i.op[1].regs->reg_num;
3932 if (flag_code == CODE_64BIT || base_regnum < 4)
3933 {
3934 i.types[1].bitfield.byte = 1;
3935 /* Ignore the suffix. */
3936 i.suffix = 0;
3937 if (base_regnum >= 4
3938 && !(i.op[1].regs->reg_flags & RegRex))
3939 {
3940 /* Handle SP, BP, SI and DI registers. */
3941 if (i.types[1].bitfield.word)
3942 j = 16;
3943 else if (i.types[1].bitfield.dword)
3944 j = 32;
3945 else
3946 j = 48;
3947 i.op[1].regs -= j;
3948 }
3949 }
3950 }
3951 else if (flag_code == CODE_64BIT
d3d50934
L
3952 && ((i.types[1].bitfield.qword
3953 && i.reg_operands == 1
b6f8c7c4
L
3954 && i.imm_operands == 1
3955 && i.op[0].imms->X_op == O_constant
507916b8 3956 && ((i.tm.base_opcode == 0xb8
b6f8c7c4
L
3957 && i.tm.extension_opcode == None
3958 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
3959 || (fits_in_imm31 (i.op[0].imms->X_add_number)
3960 && (((i.tm.base_opcode == 0x24
3961 || i.tm.base_opcode == 0xa8)
3962 && i.tm.extension_opcode == None)
3963 || (i.tm.base_opcode == 0x80
3964 && i.tm.extension_opcode == 0x4)
3965 || ((i.tm.base_opcode == 0xf6
507916b8 3966 || (i.tm.base_opcode | 1) == 0xc7)
b8364fa7
JB
3967 && i.tm.extension_opcode == 0x0)))
3968 || (fits_in_imm7 (i.op[0].imms->X_add_number)
3969 && i.tm.base_opcode == 0x83
3970 && i.tm.extension_opcode == 0x4)))
d3d50934
L
3971 || (i.types[0].bitfield.qword
3972 && ((i.reg_operands == 2
3973 && i.op[0].regs == i.op[1].regs
3974 && ((i.tm.base_opcode == 0x30
3975 || i.tm.base_opcode == 0x28)
3976 && i.tm.extension_opcode == None))
3977 || (i.reg_operands == 1
3978 && i.operands == 1
3979 && i.tm.base_opcode == 0x30
3980 && i.tm.extension_opcode == None)))))
b6f8c7c4
L
3981 {
3982 /* Optimize: -O:
3983 andq $imm31, %r64 -> andl $imm31, %r32
b8364fa7 3984 andq $imm7, %r64 -> andl $imm7, %r32
b6f8c7c4
L
3985 testq $imm31, %r64 -> testl $imm31, %r32
3986 xorq %r64, %r64 -> xorl %r32, %r32
3987 subq %r64, %r64 -> subl %r32, %r32
3988 movq $imm31, %r64 -> movl $imm31, %r32
3989 movq $imm32, %r64 -> movl $imm32, %r32
3990 */
3991 i.tm.opcode_modifier.norex64 = 1;
507916b8 3992 if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
3993 {
3994 /* Handle
3995 movq $imm31, %r64 -> movl $imm31, %r32
3996 movq $imm32, %r64 -> movl $imm32, %r32
3997 */
3998 i.tm.operand_types[0].bitfield.imm32 = 1;
3999 i.tm.operand_types[0].bitfield.imm32s = 0;
4000 i.tm.operand_types[0].bitfield.imm64 = 0;
4001 i.types[0].bitfield.imm32 = 1;
4002 i.types[0].bitfield.imm32s = 0;
4003 i.types[0].bitfield.imm64 = 0;
4004 i.types[1].bitfield.dword = 1;
4005 i.types[1].bitfield.qword = 0;
507916b8 4006 if ((i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4007 {
4008 /* Handle
4009 movq $imm31, %r64 -> movl $imm31, %r32
4010 */
507916b8 4011 i.tm.base_opcode = 0xb8;
b6f8c7c4 4012 i.tm.extension_opcode = None;
507916b8 4013 i.tm.opcode_modifier.w = 0;
b6f8c7c4
L
4014 i.tm.opcode_modifier.shortform = 1;
4015 i.tm.opcode_modifier.modrm = 0;
4016 }
4017 }
4018 }
5641ec01
JB
4019 else if (optimize > 1
4020 && !optimize_for_space
4021 && i.reg_operands == 2
4022 && i.op[0].regs == i.op[1].regs
4023 && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8
4024 || (i.tm.base_opcode & ~(Opcode_D | 1)) == 0x20)
4025 && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword))
4026 {
4027 /* Optimize: -O2:
4028 andb %rN, %rN -> testb %rN, %rN
4029 andw %rN, %rN -> testw %rN, %rN
4030 andq %rN, %rN -> testq %rN, %rN
4031 orb %rN, %rN -> testb %rN, %rN
4032 orw %rN, %rN -> testw %rN, %rN
4033 orq %rN, %rN -> testq %rN, %rN
4034
4035 and outside of 64-bit mode
4036
4037 andl %rN, %rN -> testl %rN, %rN
4038 orl %rN, %rN -> testl %rN, %rN
4039 */
4040 i.tm.base_opcode = 0x84 | (i.tm.base_opcode & 1);
4041 }
99112332 4042 else if (i.reg_operands == 3
b6f8c7c4
L
4043 && i.op[0].regs == i.op[1].regs
4044 && !i.types[2].bitfield.xmmword
4045 && (i.tm.opcode_modifier.vex
7a69eac3 4046 || ((!i.mask || i.mask->zeroing)
b6f8c7c4 4047 && !i.rounding
e771e7c9 4048 && is_evex_encoding (&i.tm)
80c34c38 4049 && (i.vec_encoding != vex_encoding_evex
dd22218c 4050 || cpu_arch_isa_flags.bitfield.cpuavx512vl
80c34c38 4051 || i.tm.cpu_flags.bitfield.cpuavx512vl
7091c612 4052 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4053 && i.types[2].bitfield.ymmword))))
b6f8c7c4
L
4054 && ((i.tm.base_opcode == 0x55
4055 || i.tm.base_opcode == 0x6655
4056 || i.tm.base_opcode == 0x66df
4057 || i.tm.base_opcode == 0x57
4058 || i.tm.base_opcode == 0x6657
8305403a
L
4059 || i.tm.base_opcode == 0x66ef
4060 || i.tm.base_opcode == 0x66f8
4061 || i.tm.base_opcode == 0x66f9
4062 || i.tm.base_opcode == 0x66fa
1424ad86
JB
4063 || i.tm.base_opcode == 0x66fb
4064 || i.tm.base_opcode == 0x42
4065 || i.tm.base_opcode == 0x6642
4066 || i.tm.base_opcode == 0x47
4067 || i.tm.base_opcode == 0x6647)
b6f8c7c4
L
4068 && i.tm.extension_opcode == None))
4069 {
99112332 4070 /* Optimize: -O1:
8305403a
L
4071 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4072 vpsubq and vpsubw:
b6f8c7c4
L
4073 EVEX VOP %zmmM, %zmmM, %zmmN
4074 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4075 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4076 EVEX VOP %ymmM, %ymmM, %ymmN
4077 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4078 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4079 VEX VOP %ymmM, %ymmM, %ymmN
4080 -> VEX VOP %xmmM, %xmmM, %xmmN
4081 VOP, one of vpandn and vpxor:
4082 VEX VOP %ymmM, %ymmM, %ymmN
4083 -> VEX VOP %xmmM, %xmmM, %xmmN
4084 VOP, one of vpandnd and vpandnq:
4085 EVEX VOP %zmmM, %zmmM, %zmmN
4086 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4087 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4088 EVEX VOP %ymmM, %ymmM, %ymmN
4089 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4090 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4091 VOP, one of vpxord and vpxorq:
4092 EVEX VOP %zmmM, %zmmM, %zmmN
4093 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4094 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4095 EVEX VOP %ymmM, %ymmM, %ymmN
4096 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4097 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4098 VOP, one of kxord and kxorq:
4099 VEX VOP %kM, %kM, %kN
4100 -> VEX kxorw %kM, %kM, %kN
4101 VOP, one of kandnd and kandnq:
4102 VEX VOP %kM, %kM, %kN
4103 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4104 */
e771e7c9 4105 if (is_evex_encoding (&i.tm))
b6f8c7c4 4106 {
7b1d7ca1 4107 if (i.vec_encoding != vex_encoding_evex)
b6f8c7c4
L
4108 {
4109 i.tm.opcode_modifier.vex = VEX128;
4110 i.tm.opcode_modifier.vexw = VEXW0;
4111 i.tm.opcode_modifier.evex = 0;
4112 }
7b1d7ca1 4113 else if (optimize > 1)
dd22218c
L
4114 i.tm.opcode_modifier.evex = EVEX128;
4115 else
4116 return;
b6f8c7c4 4117 }
f74a6307 4118 else if (i.tm.operand_types[0].bitfield.class == RegMask)
1424ad86
JB
4119 {
4120 i.tm.base_opcode &= 0xff;
4121 i.tm.opcode_modifier.vexw = VEXW0;
4122 }
b6f8c7c4
L
4123 else
4124 i.tm.opcode_modifier.vex = VEX128;
4125
4126 if (i.tm.opcode_modifier.vex)
4127 for (j = 0; j < 3; j++)
4128 {
4129 i.types[j].bitfield.xmmword = 1;
4130 i.types[j].bitfield.ymmword = 0;
4131 }
4132 }
392a5972 4133 else if (i.vec_encoding != vex_encoding_evex
97ed31ae 4134 && !i.types[0].bitfield.zmmword
392a5972 4135 && !i.types[1].bitfield.zmmword
97ed31ae 4136 && !i.mask
a0a1771e 4137 && !i.broadcast
97ed31ae 4138 && is_evex_encoding (&i.tm)
392a5972
L
4139 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x666f
4140 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf36f
a0a1771e
JB
4141 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f
4142 || (i.tm.base_opcode & ~4) == 0x66db
4143 || (i.tm.base_opcode & ~4) == 0x66eb)
97ed31ae
L
4144 && i.tm.extension_opcode == None)
4145 {
4146 /* Optimize: -O1:
4147 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4148 vmovdqu32 and vmovdqu64:
4149 EVEX VOP %xmmM, %xmmN
4150 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4151 EVEX VOP %ymmM, %ymmN
4152 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4153 EVEX VOP %xmmM, mem
4154 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4155 EVEX VOP %ymmM, mem
4156 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4157 EVEX VOP mem, %xmmN
4158 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4159 EVEX VOP mem, %ymmN
4160 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
a0a1771e
JB
4161 VOP, one of vpand, vpandn, vpor, vpxor:
4162 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4163 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4164 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4165 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4166 EVEX VOP{d,q} mem, %xmmM, %xmmN
4167 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4168 EVEX VOP{d,q} mem, %ymmM, %ymmN
4169 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
97ed31ae 4170 */
a0a1771e 4171 for (j = 0; j < i.operands; j++)
392a5972
L
4172 if (operand_type_check (i.types[j], disp)
4173 && i.op[j].disps->X_op == O_constant)
4174 {
4175 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4176 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4177 bytes, we choose EVEX Disp8 over VEX Disp32. */
4178 int evex_disp8, vex_disp8;
4179 unsigned int memshift = i.memshift;
4180 offsetT n = i.op[j].disps->X_add_number;
4181
4182 evex_disp8 = fits_in_disp8 (n);
4183 i.memshift = 0;
4184 vex_disp8 = fits_in_disp8 (n);
4185 if (evex_disp8 != vex_disp8)
4186 {
4187 i.memshift = memshift;
4188 return;
4189 }
4190
4191 i.types[j].bitfield.disp8 = vex_disp8;
4192 break;
4193 }
4194 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f)
4195 i.tm.base_opcode ^= 0xf36f ^ 0xf26f;
97ed31ae
L
4196 i.tm.opcode_modifier.vex
4197 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4198 i.tm.opcode_modifier.vexw = VEXW0;
79dec6b7
JB
4199 /* VPAND, VPOR, and VPXOR are commutative. */
4200 if (i.reg_operands == 3 && i.tm.base_opcode != 0x66df)
4201 i.tm.opcode_modifier.commutative = 1;
97ed31ae
L
4202 i.tm.opcode_modifier.evex = 0;
4203 i.tm.opcode_modifier.masking = 0;
a0a1771e 4204 i.tm.opcode_modifier.broadcast = 0;
97ed31ae
L
4205 i.tm.opcode_modifier.disp8memshift = 0;
4206 i.memshift = 0;
a0a1771e
JB
4207 if (j < i.operands)
4208 i.types[j].bitfield.disp8
4209 = fits_in_disp8 (i.op[j].disps->X_add_number);
97ed31ae 4210 }
b6f8c7c4
L
4211}
4212
252b5132
RH
4213/* This is the guts of the machine-dependent assembler. LINE points to a
4214 machine dependent instruction. This function is supposed to emit
4215 the frags/bytes it assembles to. */
4216
4217void
65da13b5 4218md_assemble (char *line)
252b5132 4219{
40fb9820 4220 unsigned int j;
83b16ac6 4221 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 4222 const insn_template *t;
252b5132 4223
47926f60 4224 /* Initialize globals. */
252b5132
RH
4225 memset (&i, '\0', sizeof (i));
4226 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 4227 i.reloc[j] = NO_RELOC;
252b5132
RH
4228 memset (disp_expressions, '\0', sizeof (disp_expressions));
4229 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 4230 save_stack_p = save_stack;
252b5132
RH
4231
4232 /* First parse an instruction mnemonic & call i386_operand for the operands.
4233 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 4234 start of a (possibly prefixed) mnemonic. */
252b5132 4235
29b0f896
AM
4236 line = parse_insn (line, mnemonic);
4237 if (line == NULL)
4238 return;
83b16ac6 4239 mnem_suffix = i.suffix;
252b5132 4240
29b0f896 4241 line = parse_operands (line, mnemonic);
ee86248c 4242 this_operand = -1;
8325cc63
JB
4243 xfree (i.memop1_string);
4244 i.memop1_string = NULL;
29b0f896
AM
4245 if (line == NULL)
4246 return;
252b5132 4247
29b0f896
AM
4248 /* Now we've parsed the mnemonic into a set of templates, and have the
4249 operands at hand. */
4250
4251 /* All intel opcodes have reversed operands except for "bound" and
4252 "enter". We also don't reverse intersegment "jmp" and "call"
4253 instructions with 2 immediate operands so that the immediate segment
050dfa73 4254 precedes the offset, as it does when in AT&T mode. */
4d456e3d
L
4255 if (intel_syntax
4256 && i.operands > 1
29b0f896 4257 && (strcmp (mnemonic, "bound") != 0)
30123838 4258 && (strcmp (mnemonic, "invlpga") != 0)
40fb9820
L
4259 && !(operand_type_check (i.types[0], imm)
4260 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4261 swap_operands ();
4262
ec56d5c0
JB
4263 /* The order of the immediates should be reversed
4264 for 2 immediates extrq and insertq instructions */
4265 if (i.imm_operands == 2
4266 && (strcmp (mnemonic, "extrq") == 0
4267 || strcmp (mnemonic, "insertq") == 0))
4268 swap_2_operands (0, 1);
4269
29b0f896
AM
4270 if (i.imm_operands)
4271 optimize_imm ();
4272
b300c311
L
4273 /* Don't optimize displacement for movabs since it only takes 64bit
4274 displacement. */
4275 if (i.disp_operands
a501d77e 4276 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4277 && (flag_code != CODE_64BIT
4278 || strcmp (mnemonic, "movabs") != 0))
4279 optimize_disp ();
29b0f896
AM
4280
4281 /* Next, we find a template that matches the given insn,
4282 making sure the overlap of the given operands types is consistent
4283 with the template operand types. */
252b5132 4284
83b16ac6 4285 if (!(t = match_template (mnem_suffix)))
29b0f896 4286 return;
252b5132 4287
7bab8ab5 4288 if (sse_check != check_none
81f8a913 4289 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4290 && !i.tm.cpu_flags.bitfield.cpuavx
daf50ae7
L
4291 && (i.tm.cpu_flags.bitfield.cpusse
4292 || i.tm.cpu_flags.bitfield.cpusse2
4293 || i.tm.cpu_flags.bitfield.cpusse3
4294 || i.tm.cpu_flags.bitfield.cpussse3
4295 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e
JB
4296 || i.tm.cpu_flags.bitfield.cpusse4_2
4297 || i.tm.cpu_flags.bitfield.cpupclmul
4298 || i.tm.cpu_flags.bitfield.cpuaes
4299 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4300 {
7bab8ab5 4301 (sse_check == check_warning
daf50ae7
L
4302 ? as_warn
4303 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4304 }
4305
321fd21e
L
4306 /* Zap movzx and movsx suffix. The suffix has been set from
4307 "word ptr" or "byte ptr" on the source operand in Intel syntax
4308 or extracted from mnemonic in AT&T syntax. But we'll use
4309 the destination register to choose the suffix for encoding. */
4310 if ((i.tm.base_opcode & ~9) == 0x0fb6)
cd61ebfe 4311 {
321fd21e
L
4312 /* In Intel syntax, there must be a suffix. In AT&T syntax, if
4313 there is no suffix, the default will be byte extension. */
4314 if (i.reg_operands != 2
4315 && !i.suffix
7ab9ffdd 4316 && intel_syntax)
321fd21e
L
4317 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
4318
4319 i.suffix = 0;
cd61ebfe 4320 }
24eab124 4321
40fb9820 4322 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4323 if (!add_prefix (FWAIT_OPCODE))
4324 return;
252b5132 4325
d5de92cf
L
4326 /* Check if REP prefix is OK. */
4327 if (i.rep_prefix && !i.tm.opcode_modifier.repprefixok)
4328 {
4329 as_bad (_("invalid instruction `%s' after `%s'"),
4330 i.tm.name, i.rep_prefix);
4331 return;
4332 }
4333
c1ba0266
L
4334 /* Check for lock without a lockable instruction. Destination operand
4335 must be memory unless it is xchg (0x86). */
c32fa91d
L
4336 if (i.prefix[LOCK_PREFIX]
4337 && (!i.tm.opcode_modifier.islockable
c1ba0266
L
4338 || i.mem_operands == 0
4339 || (i.tm.base_opcode != 0x86
8dc0818e 4340 && !(i.flags[i.operands - 1] & Operand_Mem))))
c32fa91d
L
4341 {
4342 as_bad (_("expecting lockable instruction after `lock'"));
4343 return;
4344 }
4345
7a8655d2
JB
4346 /* Check for data size prefix on VEX/XOP/EVEX encoded insns. */
4347 if (i.prefix[DATA_PREFIX] && is_any_vex_encoding (&i.tm))
4348 {
4349 as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
4350 return;
4351 }
4352
42164a71 4353 /* Check if HLE prefix is OK. */
165de32a 4354 if (i.hle_prefix && !check_hle ())
42164a71
L
4355 return;
4356
7e8b059b
L
4357 /* Check BND prefix. */
4358 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
4359 as_bad (_("expecting valid branch instruction after `bnd'"));
4360
04ef582a 4361 /* Check NOTRACK prefix. */
9fef80d6
L
4362 if (i.notrack_prefix && !i.tm.opcode_modifier.notrackprefixok)
4363 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 4364
327e8c42
JB
4365 if (i.tm.cpu_flags.bitfield.cpumpx)
4366 {
4367 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4368 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
4369 else if (flag_code != CODE_16BIT
4370 ? i.prefix[ADDR_PREFIX]
4371 : i.mem_operands && !i.prefix[ADDR_PREFIX])
4372 as_bad (_("16-bit address isn't allowed in MPX instructions"));
4373 }
7e8b059b
L
4374
4375 /* Insert BND prefix. */
76d3a78a
JB
4376 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
4377 {
4378 if (!i.prefix[BND_PREFIX])
4379 add_prefix (BND_PREFIX_OPCODE);
4380 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
4381 {
4382 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
4383 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
4384 }
4385 }
7e8b059b 4386
29b0f896 4387 /* Check string instruction segment overrides. */
51c8edf6 4388 if (i.tm.opcode_modifier.isstring >= IS_STRING_ES_OP0)
29b0f896 4389 {
51c8edf6 4390 gas_assert (i.mem_operands);
29b0f896 4391 if (!check_string ())
5dd0794d 4392 return;
fc0763e6 4393 i.disp_operands = 0;
29b0f896 4394 }
5dd0794d 4395
b6f8c7c4
L
4396 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
4397 optimize_encoding ();
4398
29b0f896
AM
4399 if (!process_suffix ())
4400 return;
e413e4e9 4401
bc0844ae
L
4402 /* Update operand types. */
4403 for (j = 0; j < i.operands; j++)
4404 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
4405
29b0f896
AM
4406 /* Make still unresolved immediate matches conform to size of immediate
4407 given in i.suffix. */
4408 if (!finalize_imm ())
4409 return;
252b5132 4410
40fb9820 4411 if (i.types[0].bitfield.imm1)
29b0f896 4412 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 4413
9afe6eb8
L
4414 /* We only need to check those implicit registers for instructions
4415 with 3 operands or less. */
4416 if (i.operands <= 3)
4417 for (j = 0; j < i.operands; j++)
75e5731b
JB
4418 if (i.types[j].bitfield.instance != InstanceNone
4419 && !i.types[j].bitfield.xmmword)
9afe6eb8 4420 i.reg_operands--;
40fb9820 4421
c0f3af97
L
4422 /* ImmExt should be processed after SSE2AVX. */
4423 if (!i.tm.opcode_modifier.sse2avx
4424 && i.tm.opcode_modifier.immext)
65da13b5 4425 process_immext ();
252b5132 4426
29b0f896
AM
4427 /* For insns with operands there are more diddles to do to the opcode. */
4428 if (i.operands)
4429 {
4430 if (!process_operands ())
4431 return;
4432 }
40fb9820 4433 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
4434 {
4435 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
4436 as_warn (_("translating to `%sp'"), i.tm.name);
4437 }
252b5132 4438
7a8655d2 4439 if (is_any_vex_encoding (&i.tm))
9e5e5283 4440 {
c1dc7af5 4441 if (!cpu_arch_flags.bitfield.cpui286)
9e5e5283 4442 {
c1dc7af5 4443 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
9e5e5283
L
4444 i.tm.name);
4445 return;
4446 }
c0f3af97 4447
9e5e5283
L
4448 if (i.tm.opcode_modifier.vex)
4449 build_vex_prefix (t);
4450 else
4451 build_evex_prefix ();
4452 }
43234a1e 4453
5dd85c99
SP
4454 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
4455 instructions may define INT_OPCODE as well, so avoid this corner
4456 case for those instructions that use MODRM. */
4457 if (i.tm.base_opcode == INT_OPCODE
a6461c02
SP
4458 && !i.tm.opcode_modifier.modrm
4459 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
4460 {
4461 i.tm.base_opcode = INT3_OPCODE;
4462 i.imm_operands = 0;
4463 }
252b5132 4464
40fb9820
L
4465 if ((i.tm.opcode_modifier.jump
4466 || i.tm.opcode_modifier.jumpbyte
4467 || i.tm.opcode_modifier.jumpdword)
29b0f896
AM
4468 && i.op[0].disps->X_op == O_constant)
4469 {
4470 /* Convert "jmp constant" (and "call constant") to a jump (call) to
4471 the absolute address given by the constant. Since ix86 jumps and
4472 calls are pc relative, we need to generate a reloc. */
4473 i.op[0].disps->X_add_symbol = &abs_symbol;
4474 i.op[0].disps->X_op = O_symbol;
4475 }
252b5132 4476
40fb9820 4477 if (i.tm.opcode_modifier.rex64)
161a04f6 4478 i.rex |= REX_W;
252b5132 4479
29b0f896
AM
4480 /* For 8 bit registers we need an empty rex prefix. Also if the
4481 instruction already has a prefix, we need to convert old
4482 registers to new ones. */
773f551c 4483
bab6aec1 4484 if ((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte
29b0f896 4485 && (i.op[0].regs->reg_flags & RegRex64) != 0)
bab6aec1 4486 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte
29b0f896 4487 && (i.op[1].regs->reg_flags & RegRex64) != 0)
bab6aec1
JB
4488 || (((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte)
4489 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte))
29b0f896
AM
4490 && i.rex != 0))
4491 {
4492 int x;
726c5dcd 4493
29b0f896
AM
4494 i.rex |= REX_OPCODE;
4495 for (x = 0; x < 2; x++)
4496 {
4497 /* Look for 8 bit operand that uses old registers. */
bab6aec1 4498 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
29b0f896 4499 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 4500 {
29b0f896
AM
4501 /* In case it is "hi" register, give up. */
4502 if (i.op[x].regs->reg_num > 3)
a540244d 4503 as_bad (_("can't encode register '%s%s' in an "
4eed87de 4504 "instruction requiring REX prefix."),
a540244d 4505 register_prefix, i.op[x].regs->reg_name);
773f551c 4506
29b0f896
AM
4507 /* Otherwise it is equivalent to the extended register.
4508 Since the encoding doesn't change this is merely
4509 cosmetic cleanup for debug output. */
4510
4511 i.op[x].regs = i.op[x].regs + 8;
773f551c 4512 }
29b0f896
AM
4513 }
4514 }
773f551c 4515
6b6b6807
L
4516 if (i.rex == 0 && i.rex_encoding)
4517 {
4518 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
4519 that uses legacy register. If it is "hi" register, don't add
4520 the REX_OPCODE byte. */
4521 int x;
4522 for (x = 0; x < 2; x++)
bab6aec1 4523 if (i.types[x].bitfield.class == Reg
6b6b6807
L
4524 && i.types[x].bitfield.byte
4525 && (i.op[x].regs->reg_flags & RegRex64) == 0
4526 && i.op[x].regs->reg_num > 3)
4527 {
4528 i.rex_encoding = FALSE;
4529 break;
4530 }
4531
4532 if (i.rex_encoding)
4533 i.rex = REX_OPCODE;
4534 }
4535
7ab9ffdd 4536 if (i.rex != 0)
29b0f896
AM
4537 add_prefix (REX_OPCODE | i.rex);
4538
4539 /* We are ready to output the insn. */
4540 output_insn ();
4541}
4542
4543static char *
e3bb37b5 4544parse_insn (char *line, char *mnemonic)
29b0f896
AM
4545{
4546 char *l = line;
4547 char *token_start = l;
4548 char *mnem_p;
5c6af06e 4549 int supported;
d3ce72d0 4550 const insn_template *t;
b6169b20 4551 char *dot_p = NULL;
29b0f896 4552
29b0f896
AM
4553 while (1)
4554 {
4555 mnem_p = mnemonic;
4556 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
4557 {
b6169b20
L
4558 if (*mnem_p == '.')
4559 dot_p = mnem_p;
29b0f896
AM
4560 mnem_p++;
4561 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 4562 {
29b0f896
AM
4563 as_bad (_("no such instruction: `%s'"), token_start);
4564 return NULL;
4565 }
4566 l++;
4567 }
4568 if (!is_space_char (*l)
4569 && *l != END_OF_INSN
e44823cf
JB
4570 && (intel_syntax
4571 || (*l != PREFIX_SEPARATOR
4572 && *l != ',')))
29b0f896
AM
4573 {
4574 as_bad (_("invalid character %s in mnemonic"),
4575 output_invalid (*l));
4576 return NULL;
4577 }
4578 if (token_start == l)
4579 {
e44823cf 4580 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
4581 as_bad (_("expecting prefix; got nothing"));
4582 else
4583 as_bad (_("expecting mnemonic; got nothing"));
4584 return NULL;
4585 }
45288df1 4586
29b0f896 4587 /* Look up instruction (or prefix) via hash table. */
d3ce72d0 4588 current_templates = (const templates *) hash_find (op_hash, mnemonic);
47926f60 4589
29b0f896
AM
4590 if (*l != END_OF_INSN
4591 && (!is_space_char (*l) || l[1] != END_OF_INSN)
4592 && current_templates
40fb9820 4593 && current_templates->start->opcode_modifier.isprefix)
29b0f896 4594 {
c6fb90c8 4595 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
4596 {
4597 as_bad ((flag_code != CODE_64BIT
4598 ? _("`%s' is only supported in 64-bit mode")
4599 : _("`%s' is not supported in 64-bit mode")),
4600 current_templates->start->name);
4601 return NULL;
4602 }
29b0f896
AM
4603 /* If we are in 16-bit mode, do not allow addr16 or data16.
4604 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
4605 if ((current_templates->start->opcode_modifier.size == SIZE16
4606 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 4607 && flag_code != CODE_64BIT
673fe0f0 4608 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
4609 ^ (flag_code == CODE_16BIT)))
4610 {
4611 as_bad (_("redundant %s prefix"),
4612 current_templates->start->name);
4613 return NULL;
45288df1 4614 }
86fa6981 4615 if (current_templates->start->opcode_length == 0)
29b0f896 4616 {
86fa6981
L
4617 /* Handle pseudo prefixes. */
4618 switch (current_templates->start->base_opcode)
4619 {
4620 case 0x0:
4621 /* {disp8} */
4622 i.disp_encoding = disp_encoding_8bit;
4623 break;
4624 case 0x1:
4625 /* {disp32} */
4626 i.disp_encoding = disp_encoding_32bit;
4627 break;
4628 case 0x2:
4629 /* {load} */
4630 i.dir_encoding = dir_encoding_load;
4631 break;
4632 case 0x3:
4633 /* {store} */
4634 i.dir_encoding = dir_encoding_store;
4635 break;
4636 case 0x4:
4637 /* {vex2} */
4638 i.vec_encoding = vex_encoding_vex2;
4639 break;
4640 case 0x5:
4641 /* {vex3} */
4642 i.vec_encoding = vex_encoding_vex3;
4643 break;
4644 case 0x6:
4645 /* {evex} */
4646 i.vec_encoding = vex_encoding_evex;
4647 break;
6b6b6807
L
4648 case 0x7:
4649 /* {rex} */
4650 i.rex_encoding = TRUE;
4651 break;
b6f8c7c4
L
4652 case 0x8:
4653 /* {nooptimize} */
4654 i.no_optimize = TRUE;
4655 break;
86fa6981
L
4656 default:
4657 abort ();
4658 }
4659 }
4660 else
4661 {
4662 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 4663 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 4664 {
4e9ac44a
L
4665 case PREFIX_EXIST:
4666 return NULL;
4667 case PREFIX_DS:
d777820b 4668 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
4669 i.notrack_prefix = current_templates->start->name;
4670 break;
4671 case PREFIX_REP:
4672 if (current_templates->start->cpu_flags.bitfield.cpuhle)
4673 i.hle_prefix = current_templates->start->name;
4674 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
4675 i.bnd_prefix = current_templates->start->name;
4676 else
4677 i.rep_prefix = current_templates->start->name;
4678 break;
4679 default:
4680 break;
86fa6981 4681 }
29b0f896
AM
4682 }
4683 /* Skip past PREFIX_SEPARATOR and reset token_start. */
4684 token_start = ++l;
4685 }
4686 else
4687 break;
4688 }
45288df1 4689
30a55f88 4690 if (!current_templates)
b6169b20 4691 {
07d5e953
JB
4692 /* Deprecated functionality (new code should use pseudo-prefixes instead):
4693 Check if we should swap operand or force 32bit displacement in
f8a5c266 4694 encoding. */
30a55f88 4695 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 4696 i.dir_encoding = dir_encoding_swap;
8d63c93e 4697 else if (mnem_p - 3 == dot_p
a501d77e
L
4698 && dot_p[1] == 'd'
4699 && dot_p[2] == '8')
4700 i.disp_encoding = disp_encoding_8bit;
8d63c93e 4701 else if (mnem_p - 4 == dot_p
f8a5c266
L
4702 && dot_p[1] == 'd'
4703 && dot_p[2] == '3'
4704 && dot_p[3] == '2')
a501d77e 4705 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
4706 else
4707 goto check_suffix;
4708 mnem_p = dot_p;
4709 *dot_p = '\0';
d3ce72d0 4710 current_templates = (const templates *) hash_find (op_hash, mnemonic);
b6169b20
L
4711 }
4712
29b0f896
AM
4713 if (!current_templates)
4714 {
b6169b20 4715check_suffix:
1c529385 4716 if (mnem_p > mnemonic)
29b0f896 4717 {
1c529385
LH
4718 /* See if we can get a match by trimming off a suffix. */
4719 switch (mnem_p[-1])
29b0f896 4720 {
1c529385
LH
4721 case WORD_MNEM_SUFFIX:
4722 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
4723 i.suffix = SHORT_MNEM_SUFFIX;
4724 else
1c529385
LH
4725 /* Fall through. */
4726 case BYTE_MNEM_SUFFIX:
4727 case QWORD_MNEM_SUFFIX:
4728 i.suffix = mnem_p[-1];
29b0f896 4729 mnem_p[-1] = '\0';
d3ce72d0 4730 current_templates = (const templates *) hash_find (op_hash,
1c529385
LH
4731 mnemonic);
4732 break;
4733 case SHORT_MNEM_SUFFIX:
4734 case LONG_MNEM_SUFFIX:
4735 if (!intel_syntax)
4736 {
4737 i.suffix = mnem_p[-1];
4738 mnem_p[-1] = '\0';
4739 current_templates = (const templates *) hash_find (op_hash,
4740 mnemonic);
4741 }
4742 break;
4743
4744 /* Intel Syntax. */
4745 case 'd':
4746 if (intel_syntax)
4747 {
4748 if (intel_float_operand (mnemonic) == 1)
4749 i.suffix = SHORT_MNEM_SUFFIX;
4750 else
4751 i.suffix = LONG_MNEM_SUFFIX;
4752 mnem_p[-1] = '\0';
4753 current_templates = (const templates *) hash_find (op_hash,
4754 mnemonic);
4755 }
4756 break;
29b0f896 4757 }
29b0f896 4758 }
1c529385 4759
29b0f896
AM
4760 if (!current_templates)
4761 {
4762 as_bad (_("no such instruction: `%s'"), token_start);
4763 return NULL;
4764 }
4765 }
252b5132 4766
40fb9820
L
4767 if (current_templates->start->opcode_modifier.jump
4768 || current_templates->start->opcode_modifier.jumpbyte)
29b0f896
AM
4769 {
4770 /* Check for a branch hint. We allow ",pt" and ",pn" for
4771 predict taken and predict not taken respectively.
4772 I'm not sure that branch hints actually do anything on loop
4773 and jcxz insns (JumpByte) for current Pentium4 chips. They
4774 may work in the future and it doesn't hurt to accept them
4775 now. */
4776 if (l[0] == ',' && l[1] == 'p')
4777 {
4778 if (l[2] == 't')
4779 {
4780 if (!add_prefix (DS_PREFIX_OPCODE))
4781 return NULL;
4782 l += 3;
4783 }
4784 else if (l[2] == 'n')
4785 {
4786 if (!add_prefix (CS_PREFIX_OPCODE))
4787 return NULL;
4788 l += 3;
4789 }
4790 }
4791 }
4792 /* Any other comma loses. */
4793 if (*l == ',')
4794 {
4795 as_bad (_("invalid character %s in mnemonic"),
4796 output_invalid (*l));
4797 return NULL;
4798 }
252b5132 4799
29b0f896 4800 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
4801 supported = 0;
4802 for (t = current_templates->start; t < current_templates->end; ++t)
4803 {
c0f3af97
L
4804 supported |= cpu_flags_match (t);
4805 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
4806 {
4807 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
4808 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 4809
548d0ee6
JB
4810 return l;
4811 }
29b0f896 4812 }
3629bb00 4813
548d0ee6
JB
4814 if (!(supported & CPU_FLAGS_64BIT_MATCH))
4815 as_bad (flag_code == CODE_64BIT
4816 ? _("`%s' is not supported in 64-bit mode")
4817 : _("`%s' is only supported in 64-bit mode"),
4818 current_templates->start->name);
4819 else
4820 as_bad (_("`%s' is not supported on `%s%s'"),
4821 current_templates->start->name,
4822 cpu_arch_name ? cpu_arch_name : default_arch,
4823 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 4824
548d0ee6 4825 return NULL;
29b0f896 4826}
252b5132 4827
29b0f896 4828static char *
e3bb37b5 4829parse_operands (char *l, const char *mnemonic)
29b0f896
AM
4830{
4831 char *token_start;
3138f287 4832
29b0f896
AM
4833 /* 1 if operand is pending after ','. */
4834 unsigned int expecting_operand = 0;
252b5132 4835
29b0f896
AM
4836 /* Non-zero if operand parens not balanced. */
4837 unsigned int paren_not_balanced;
4838
4839 while (*l != END_OF_INSN)
4840 {
4841 /* Skip optional white space before operand. */
4842 if (is_space_char (*l))
4843 ++l;
d02603dc 4844 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
4845 {
4846 as_bad (_("invalid character %s before operand %d"),
4847 output_invalid (*l),
4848 i.operands + 1);
4849 return NULL;
4850 }
d02603dc 4851 token_start = l; /* After white space. */
29b0f896
AM
4852 paren_not_balanced = 0;
4853 while (paren_not_balanced || *l != ',')
4854 {
4855 if (*l == END_OF_INSN)
4856 {
4857 if (paren_not_balanced)
4858 {
4859 if (!intel_syntax)
4860 as_bad (_("unbalanced parenthesis in operand %d."),
4861 i.operands + 1);
4862 else
4863 as_bad (_("unbalanced brackets in operand %d."),
4864 i.operands + 1);
4865 return NULL;
4866 }
4867 else
4868 break; /* we are done */
4869 }
d02603dc 4870 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
4871 {
4872 as_bad (_("invalid character %s in operand %d"),
4873 output_invalid (*l),
4874 i.operands + 1);
4875 return NULL;
4876 }
4877 if (!intel_syntax)
4878 {
4879 if (*l == '(')
4880 ++paren_not_balanced;
4881 if (*l == ')')
4882 --paren_not_balanced;
4883 }
4884 else
4885 {
4886 if (*l == '[')
4887 ++paren_not_balanced;
4888 if (*l == ']')
4889 --paren_not_balanced;
4890 }
4891 l++;
4892 }
4893 if (l != token_start)
4894 { /* Yes, we've read in another operand. */
4895 unsigned int operand_ok;
4896 this_operand = i.operands++;
4897 if (i.operands > MAX_OPERANDS)
4898 {
4899 as_bad (_("spurious operands; (%d operands/instruction max)"),
4900 MAX_OPERANDS);
4901 return NULL;
4902 }
9d46ce34 4903 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
4904 /* Now parse operand adding info to 'i' as we go along. */
4905 END_STRING_AND_SAVE (l);
4906
1286ab78
L
4907 if (i.mem_operands > 1)
4908 {
4909 as_bad (_("too many memory references for `%s'"),
4910 mnemonic);
4911 return 0;
4912 }
4913
29b0f896
AM
4914 if (intel_syntax)
4915 operand_ok =
4916 i386_intel_operand (token_start,
4917 intel_float_operand (mnemonic));
4918 else
a7619375 4919 operand_ok = i386_att_operand (token_start);
29b0f896
AM
4920
4921 RESTORE_END_STRING (l);
4922 if (!operand_ok)
4923 return NULL;
4924 }
4925 else
4926 {
4927 if (expecting_operand)
4928 {
4929 expecting_operand_after_comma:
4930 as_bad (_("expecting operand after ','; got nothing"));
4931 return NULL;
4932 }
4933 if (*l == ',')
4934 {
4935 as_bad (_("expecting operand before ','; got nothing"));
4936 return NULL;
4937 }
4938 }
7f3f1ea2 4939
29b0f896
AM
4940 /* Now *l must be either ',' or END_OF_INSN. */
4941 if (*l == ',')
4942 {
4943 if (*++l == END_OF_INSN)
4944 {
4945 /* Just skip it, if it's \n complain. */
4946 goto expecting_operand_after_comma;
4947 }
4948 expecting_operand = 1;
4949 }
4950 }
4951 return l;
4952}
7f3f1ea2 4953
050dfa73 4954static void
4d456e3d 4955swap_2_operands (int xchg1, int xchg2)
050dfa73
MM
4956{
4957 union i386_op temp_op;
40fb9820 4958 i386_operand_type temp_type;
c48dadc9 4959 unsigned int temp_flags;
050dfa73 4960 enum bfd_reloc_code_real temp_reloc;
4eed87de 4961
050dfa73
MM
4962 temp_type = i.types[xchg2];
4963 i.types[xchg2] = i.types[xchg1];
4964 i.types[xchg1] = temp_type;
c48dadc9
JB
4965
4966 temp_flags = i.flags[xchg2];
4967 i.flags[xchg2] = i.flags[xchg1];
4968 i.flags[xchg1] = temp_flags;
4969
050dfa73
MM
4970 temp_op = i.op[xchg2];
4971 i.op[xchg2] = i.op[xchg1];
4972 i.op[xchg1] = temp_op;
c48dadc9 4973
050dfa73
MM
4974 temp_reloc = i.reloc[xchg2];
4975 i.reloc[xchg2] = i.reloc[xchg1];
4976 i.reloc[xchg1] = temp_reloc;
43234a1e
L
4977
4978 if (i.mask)
4979 {
4980 if (i.mask->operand == xchg1)
4981 i.mask->operand = xchg2;
4982 else if (i.mask->operand == xchg2)
4983 i.mask->operand = xchg1;
4984 }
4985 if (i.broadcast)
4986 {
4987 if (i.broadcast->operand == xchg1)
4988 i.broadcast->operand = xchg2;
4989 else if (i.broadcast->operand == xchg2)
4990 i.broadcast->operand = xchg1;
4991 }
4992 if (i.rounding)
4993 {
4994 if (i.rounding->operand == xchg1)
4995 i.rounding->operand = xchg2;
4996 else if (i.rounding->operand == xchg2)
4997 i.rounding->operand = xchg1;
4998 }
050dfa73
MM
4999}
5000
29b0f896 5001static void
e3bb37b5 5002swap_operands (void)
29b0f896 5003{
b7c61d9a 5004 switch (i.operands)
050dfa73 5005 {
c0f3af97 5006 case 5:
b7c61d9a 5007 case 4:
4d456e3d 5008 swap_2_operands (1, i.operands - 2);
1a0670f3 5009 /* Fall through. */
b7c61d9a
L
5010 case 3:
5011 case 2:
4d456e3d 5012 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
5013 break;
5014 default:
5015 abort ();
29b0f896 5016 }
29b0f896
AM
5017
5018 if (i.mem_operands == 2)
5019 {
5020 const seg_entry *temp_seg;
5021 temp_seg = i.seg[0];
5022 i.seg[0] = i.seg[1];
5023 i.seg[1] = temp_seg;
5024 }
5025}
252b5132 5026
29b0f896
AM
5027/* Try to ensure constant immediates are represented in the smallest
5028 opcode possible. */
5029static void
e3bb37b5 5030optimize_imm (void)
29b0f896
AM
5031{
5032 char guess_suffix = 0;
5033 int op;
252b5132 5034
29b0f896
AM
5035 if (i.suffix)
5036 guess_suffix = i.suffix;
5037 else if (i.reg_operands)
5038 {
5039 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
5040 We can't do this properly yet, i.e. excluding special register
5041 instances, but the following works for instructions with
5042 immediates. In any case, we can't set i.suffix yet. */
29b0f896 5043 for (op = i.operands; --op >= 0;)
bab6aec1
JB
5044 if (i.types[op].bitfield.class != Reg)
5045 continue;
5046 else if (i.types[op].bitfield.byte)
7ab9ffdd 5047 {
40fb9820
L
5048 guess_suffix = BYTE_MNEM_SUFFIX;
5049 break;
5050 }
bab6aec1 5051 else if (i.types[op].bitfield.word)
252b5132 5052 {
40fb9820
L
5053 guess_suffix = WORD_MNEM_SUFFIX;
5054 break;
5055 }
bab6aec1 5056 else if (i.types[op].bitfield.dword)
40fb9820
L
5057 {
5058 guess_suffix = LONG_MNEM_SUFFIX;
5059 break;
5060 }
bab6aec1 5061 else if (i.types[op].bitfield.qword)
40fb9820
L
5062 {
5063 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5064 break;
252b5132 5065 }
29b0f896
AM
5066 }
5067 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5068 guess_suffix = WORD_MNEM_SUFFIX;
5069
5070 for (op = i.operands; --op >= 0;)
40fb9820 5071 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5072 {
5073 switch (i.op[op].imms->X_op)
252b5132 5074 {
29b0f896
AM
5075 case O_constant:
5076 /* If a suffix is given, this operand may be shortened. */
5077 switch (guess_suffix)
252b5132 5078 {
29b0f896 5079 case LONG_MNEM_SUFFIX:
40fb9820
L
5080 i.types[op].bitfield.imm32 = 1;
5081 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5082 break;
5083 case WORD_MNEM_SUFFIX:
40fb9820
L
5084 i.types[op].bitfield.imm16 = 1;
5085 i.types[op].bitfield.imm32 = 1;
5086 i.types[op].bitfield.imm32s = 1;
5087 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5088 break;
5089 case BYTE_MNEM_SUFFIX:
40fb9820
L
5090 i.types[op].bitfield.imm8 = 1;
5091 i.types[op].bitfield.imm8s = 1;
5092 i.types[op].bitfield.imm16 = 1;
5093 i.types[op].bitfield.imm32 = 1;
5094 i.types[op].bitfield.imm32s = 1;
5095 i.types[op].bitfield.imm64 = 1;
29b0f896 5096 break;
252b5132 5097 }
252b5132 5098
29b0f896
AM
5099 /* If this operand is at most 16 bits, convert it
5100 to a signed 16 bit number before trying to see
5101 whether it will fit in an even smaller size.
5102 This allows a 16-bit operand such as $0xffe0 to
5103 be recognised as within Imm8S range. */
40fb9820 5104 if ((i.types[op].bitfield.imm16)
29b0f896 5105 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5106 {
29b0f896
AM
5107 i.op[op].imms->X_add_number =
5108 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
5109 }
a28def75
L
5110#ifdef BFD64
5111 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5112 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5113 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5114 == 0))
5115 {
5116 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5117 ^ ((offsetT) 1 << 31))
5118 - ((offsetT) 1 << 31));
5119 }
a28def75 5120#endif
40fb9820 5121 i.types[op]
c6fb90c8
L
5122 = operand_type_or (i.types[op],
5123 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5124
29b0f896
AM
5125 /* We must avoid matching of Imm32 templates when 64bit
5126 only immediate is available. */
5127 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5128 i.types[op].bitfield.imm32 = 0;
29b0f896 5129 break;
252b5132 5130
29b0f896
AM
5131 case O_absent:
5132 case O_register:
5133 abort ();
5134
5135 /* Symbols and expressions. */
5136 default:
9cd96992
JB
5137 /* Convert symbolic operand to proper sizes for matching, but don't
5138 prevent matching a set of insns that only supports sizes other
5139 than those matching the insn suffix. */
5140 {
40fb9820 5141 i386_operand_type mask, allowed;
d3ce72d0 5142 const insn_template *t;
9cd96992 5143
0dfbf9d7
L
5144 operand_type_set (&mask, 0);
5145 operand_type_set (&allowed, 0);
40fb9820 5146
4eed87de
AM
5147 for (t = current_templates->start;
5148 t < current_templates->end;
5149 ++t)
bab6aec1
JB
5150 {
5151 allowed = operand_type_or (allowed, t->operand_types[op]);
5152 allowed = operand_type_and (allowed, anyimm);
5153 }
9cd96992
JB
5154 switch (guess_suffix)
5155 {
5156 case QWORD_MNEM_SUFFIX:
40fb9820
L
5157 mask.bitfield.imm64 = 1;
5158 mask.bitfield.imm32s = 1;
9cd96992
JB
5159 break;
5160 case LONG_MNEM_SUFFIX:
40fb9820 5161 mask.bitfield.imm32 = 1;
9cd96992
JB
5162 break;
5163 case WORD_MNEM_SUFFIX:
40fb9820 5164 mask.bitfield.imm16 = 1;
9cd96992
JB
5165 break;
5166 case BYTE_MNEM_SUFFIX:
40fb9820 5167 mask.bitfield.imm8 = 1;
9cd96992
JB
5168 break;
5169 default:
9cd96992
JB
5170 break;
5171 }
c6fb90c8 5172 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5173 if (!operand_type_all_zero (&allowed))
c6fb90c8 5174 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5175 }
29b0f896 5176 break;
252b5132 5177 }
29b0f896
AM
5178 }
5179}
47926f60 5180
29b0f896
AM
5181/* Try to use the smallest displacement type too. */
5182static void
e3bb37b5 5183optimize_disp (void)
29b0f896
AM
5184{
5185 int op;
3e73aa7c 5186
29b0f896 5187 for (op = i.operands; --op >= 0;)
40fb9820 5188 if (operand_type_check (i.types[op], disp))
252b5132 5189 {
b300c311 5190 if (i.op[op].disps->X_op == O_constant)
252b5132 5191 {
91d6fa6a 5192 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5193
40fb9820 5194 if (i.types[op].bitfield.disp16
91d6fa6a 5195 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
5196 {
5197 /* If this operand is at most 16 bits, convert
5198 to a signed 16 bit number and don't use 64bit
5199 displacement. */
91d6fa6a 5200 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 5201 i.types[op].bitfield.disp64 = 0;
b300c311 5202 }
a28def75
L
5203#ifdef BFD64
5204 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
40fb9820 5205 if (i.types[op].bitfield.disp32
91d6fa6a 5206 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
b300c311
L
5207 {
5208 /* If this operand is at most 32 bits, convert
5209 to a signed 32 bit number and don't use 64bit
5210 displacement. */
91d6fa6a
NC
5211 op_disp &= (((offsetT) 2 << 31) - 1);
5212 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 5213 i.types[op].bitfield.disp64 = 0;
b300c311 5214 }
a28def75 5215#endif
91d6fa6a 5216 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5217 {
40fb9820
L
5218 i.types[op].bitfield.disp8 = 0;
5219 i.types[op].bitfield.disp16 = 0;
5220 i.types[op].bitfield.disp32 = 0;
5221 i.types[op].bitfield.disp32s = 0;
5222 i.types[op].bitfield.disp64 = 0;
b300c311
L
5223 i.op[op].disps = 0;
5224 i.disp_operands--;
5225 }
5226 else if (flag_code == CODE_64BIT)
5227 {
91d6fa6a 5228 if (fits_in_signed_long (op_disp))
28a9d8f5 5229 {
40fb9820
L
5230 i.types[op].bitfield.disp64 = 0;
5231 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5232 }
0e1147d9 5233 if (i.prefix[ADDR_PREFIX]
91d6fa6a 5234 && fits_in_unsigned_long (op_disp))
40fb9820 5235 i.types[op].bitfield.disp32 = 1;
b300c311 5236 }
40fb9820
L
5237 if ((i.types[op].bitfield.disp32
5238 || i.types[op].bitfield.disp32s
5239 || i.types[op].bitfield.disp16)
b5014f7a 5240 && fits_in_disp8 (op_disp))
40fb9820 5241 i.types[op].bitfield.disp8 = 1;
252b5132 5242 }
67a4f2b7
AO
5243 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5244 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5245 {
5246 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5247 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
5248 i.types[op].bitfield.disp8 = 0;
5249 i.types[op].bitfield.disp16 = 0;
5250 i.types[op].bitfield.disp32 = 0;
5251 i.types[op].bitfield.disp32s = 0;
5252 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
5253 }
5254 else
b300c311 5255 /* We only support 64bit displacement on constants. */
40fb9820 5256 i.types[op].bitfield.disp64 = 0;
252b5132 5257 }
29b0f896
AM
5258}
5259
4a1b91ea
L
5260/* Return 1 if there is a match in broadcast bytes between operand
5261 GIVEN and instruction template T. */
5262
5263static INLINE int
5264match_broadcast_size (const insn_template *t, unsigned int given)
5265{
5266 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5267 && i.types[given].bitfield.byte)
5268 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5269 && i.types[given].bitfield.word)
5270 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5271 && i.types[given].bitfield.dword)
5272 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5273 && i.types[given].bitfield.qword));
5274}
5275
6c30d220
L
5276/* Check if operands are valid for the instruction. */
5277
5278static int
5279check_VecOperands (const insn_template *t)
5280{
43234a1e 5281 unsigned int op;
e2195274
JB
5282 i386_cpu_flags cpu;
5283 static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
5284
5285 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5286 any one operand are implicity requiring AVX512VL support if the actual
5287 operand size is YMMword or XMMword. Since this function runs after
5288 template matching, there's no need to check for YMMword/XMMword in
5289 the template. */
5290 cpu = cpu_flags_and (t->cpu_flags, avx512);
5291 if (!cpu_flags_all_zero (&cpu)
5292 && !t->cpu_flags.bitfield.cpuavx512vl
5293 && !cpu_arch_flags.bitfield.cpuavx512vl)
5294 {
5295 for (op = 0; op < t->operands; ++op)
5296 {
5297 if (t->operand_types[op].bitfield.zmmword
5298 && (i.types[op].bitfield.ymmword
5299 || i.types[op].bitfield.xmmword))
5300 {
5301 i.error = unsupported;
5302 return 1;
5303 }
5304 }
5305 }
43234a1e 5306
6c30d220
L
5307 /* Without VSIB byte, we can't have a vector register for index. */
5308 if (!t->opcode_modifier.vecsib
5309 && i.index_reg
1b54b8d7
JB
5310 && (i.index_reg->reg_type.bitfield.xmmword
5311 || i.index_reg->reg_type.bitfield.ymmword
5312 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
5313 {
5314 i.error = unsupported_vector_index_register;
5315 return 1;
5316 }
5317
ad8ecc81
MZ
5318 /* Check if default mask is allowed. */
5319 if (t->opcode_modifier.nodefmask
5320 && (!i.mask || i.mask->mask->reg_num == 0))
5321 {
5322 i.error = no_default_mask;
5323 return 1;
5324 }
5325
7bab8ab5
JB
5326 /* For VSIB byte, we need a vector register for index, and all vector
5327 registers must be distinct. */
5328 if (t->opcode_modifier.vecsib)
5329 {
5330 if (!i.index_reg
6c30d220 5331 || !((t->opcode_modifier.vecsib == VecSIB128
1b54b8d7 5332 && i.index_reg->reg_type.bitfield.xmmword)
6c30d220 5333 || (t->opcode_modifier.vecsib == VecSIB256
1b54b8d7 5334 && i.index_reg->reg_type.bitfield.ymmword)
43234a1e 5335 || (t->opcode_modifier.vecsib == VecSIB512
1b54b8d7 5336 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
5337 {
5338 i.error = invalid_vsib_address;
5339 return 1;
5340 }
5341
43234a1e
L
5342 gas_assert (i.reg_operands == 2 || i.mask);
5343 if (i.reg_operands == 2 && !i.mask)
5344 {
3528c362 5345 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
5346 gas_assert (i.types[0].bitfield.xmmword
5347 || i.types[0].bitfield.ymmword);
3528c362 5348 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
5349 gas_assert (i.types[2].bitfield.xmmword
5350 || i.types[2].bitfield.ymmword);
43234a1e
L
5351 if (operand_check == check_none)
5352 return 0;
5353 if (register_number (i.op[0].regs)
5354 != register_number (i.index_reg)
5355 && register_number (i.op[2].regs)
5356 != register_number (i.index_reg)
5357 && register_number (i.op[0].regs)
5358 != register_number (i.op[2].regs))
5359 return 0;
5360 if (operand_check == check_error)
5361 {
5362 i.error = invalid_vector_register_set;
5363 return 1;
5364 }
5365 as_warn (_("mask, index, and destination registers should be distinct"));
5366 }
8444f82a
MZ
5367 else if (i.reg_operands == 1 && i.mask)
5368 {
3528c362 5369 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
5370 && (i.types[1].bitfield.xmmword
5371 || i.types[1].bitfield.ymmword
5372 || i.types[1].bitfield.zmmword)
8444f82a
MZ
5373 && (register_number (i.op[1].regs)
5374 == register_number (i.index_reg)))
5375 {
5376 if (operand_check == check_error)
5377 {
5378 i.error = invalid_vector_register_set;
5379 return 1;
5380 }
5381 if (operand_check != check_none)
5382 as_warn (_("index and destination registers should be distinct"));
5383 }
5384 }
43234a1e 5385 }
7bab8ab5 5386
43234a1e
L
5387 /* Check if broadcast is supported by the instruction and is applied
5388 to the memory operand. */
5389 if (i.broadcast)
5390 {
8e6e0792 5391 i386_operand_type type, overlap;
43234a1e
L
5392
5393 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 5394 and its broadcast bytes match the memory operand. */
32546502 5395 op = i.broadcast->operand;
8e6e0792 5396 if (!t->opcode_modifier.broadcast
c48dadc9 5397 || !(i.flags[op] & Operand_Mem)
c39e5b26 5398 || (!i.types[op].bitfield.unspecified
4a1b91ea 5399 && !match_broadcast_size (t, op)))
43234a1e
L
5400 {
5401 bad_broadcast:
5402 i.error = unsupported_broadcast;
5403 return 1;
5404 }
8e6e0792 5405
4a1b91ea
L
5406 i.broadcast->bytes = ((1 << (t->opcode_modifier.broadcast - 1))
5407 * i.broadcast->type);
8e6e0792 5408 operand_type_set (&type, 0);
4a1b91ea 5409 switch (i.broadcast->bytes)
8e6e0792 5410 {
4a1b91ea
L
5411 case 2:
5412 type.bitfield.word = 1;
5413 break;
5414 case 4:
5415 type.bitfield.dword = 1;
5416 break;
8e6e0792
JB
5417 case 8:
5418 type.bitfield.qword = 1;
5419 break;
5420 case 16:
5421 type.bitfield.xmmword = 1;
5422 break;
5423 case 32:
5424 type.bitfield.ymmword = 1;
5425 break;
5426 case 64:
5427 type.bitfield.zmmword = 1;
5428 break;
5429 default:
5430 goto bad_broadcast;
5431 }
5432
5433 overlap = operand_type_and (type, t->operand_types[op]);
5434 if (operand_type_all_zero (&overlap))
5435 goto bad_broadcast;
5436
5437 if (t->opcode_modifier.checkregsize)
5438 {
5439 unsigned int j;
5440
e2195274 5441 type.bitfield.baseindex = 1;
8e6e0792
JB
5442 for (j = 0; j < i.operands; ++j)
5443 {
5444 if (j != op
5445 && !operand_type_register_match(i.types[j],
5446 t->operand_types[j],
5447 type,
5448 t->operand_types[op]))
5449 goto bad_broadcast;
5450 }
5451 }
43234a1e
L
5452 }
5453 /* If broadcast is supported in this instruction, we need to check if
5454 operand of one-element size isn't specified without broadcast. */
5455 else if (t->opcode_modifier.broadcast && i.mem_operands)
5456 {
5457 /* Find memory operand. */
5458 for (op = 0; op < i.operands; op++)
8dc0818e 5459 if (i.flags[op] & Operand_Mem)
43234a1e
L
5460 break;
5461 gas_assert (op < i.operands);
5462 /* Check size of the memory operand. */
4a1b91ea 5463 if (match_broadcast_size (t, op))
43234a1e
L
5464 {
5465 i.error = broadcast_needed;
5466 return 1;
5467 }
5468 }
c39e5b26
JB
5469 else
5470 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
5471
5472 /* Check if requested masking is supported. */
ae2387fe 5473 if (i.mask)
43234a1e 5474 {
ae2387fe
JB
5475 switch (t->opcode_modifier.masking)
5476 {
5477 case BOTH_MASKING:
5478 break;
5479 case MERGING_MASKING:
5480 if (i.mask->zeroing)
5481 {
5482 case 0:
5483 i.error = unsupported_masking;
5484 return 1;
5485 }
5486 break;
5487 case DYNAMIC_MASKING:
5488 /* Memory destinations allow only merging masking. */
5489 if (i.mask->zeroing && i.mem_operands)
5490 {
5491 /* Find memory operand. */
5492 for (op = 0; op < i.operands; op++)
c48dadc9 5493 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
5494 break;
5495 gas_assert (op < i.operands);
5496 if (op == i.operands - 1)
5497 {
5498 i.error = unsupported_masking;
5499 return 1;
5500 }
5501 }
5502 break;
5503 default:
5504 abort ();
5505 }
43234a1e
L
5506 }
5507
5508 /* Check if masking is applied to dest operand. */
5509 if (i.mask && (i.mask->operand != (int) (i.operands - 1)))
5510 {
5511 i.error = mask_not_on_destination;
5512 return 1;
5513 }
5514
43234a1e
L
5515 /* Check RC/SAE. */
5516 if (i.rounding)
5517 {
a80195f1
JB
5518 if (!t->opcode_modifier.sae
5519 || (i.rounding->type != saeonly && !t->opcode_modifier.staticrounding))
43234a1e
L
5520 {
5521 i.error = unsupported_rc_sae;
5522 return 1;
5523 }
5524 /* If the instruction has several immediate operands and one of
5525 them is rounding, the rounding operand should be the last
5526 immediate operand. */
5527 if (i.imm_operands > 1
5528 && i.rounding->operand != (int) (i.imm_operands - 1))
7bab8ab5 5529 {
43234a1e 5530 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
5531 return 1;
5532 }
6c30d220
L
5533 }
5534
43234a1e 5535 /* Check vector Disp8 operand. */
b5014f7a
JB
5536 if (t->opcode_modifier.disp8memshift
5537 && i.disp_encoding != disp_encoding_32bit)
43234a1e
L
5538 {
5539 if (i.broadcast)
4a1b91ea 5540 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 5541 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 5542 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
5543 else
5544 {
5545 const i386_operand_type *type = NULL;
5546
5547 i.memshift = 0;
5548 for (op = 0; op < i.operands; op++)
8dc0818e 5549 if (i.flags[op] & Operand_Mem)
7091c612 5550 {
4174bfff
JB
5551 if (t->opcode_modifier.evex == EVEXLIG)
5552 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
5553 else if (t->operand_types[op].bitfield.xmmword
5554 + t->operand_types[op].bitfield.ymmword
5555 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
5556 type = &t->operand_types[op];
5557 else if (!i.types[op].bitfield.unspecified)
5558 type = &i.types[op];
5559 }
3528c362 5560 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 5561 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
5562 {
5563 if (i.types[op].bitfield.zmmword)
5564 i.memshift = 6;
5565 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
5566 i.memshift = 5;
5567 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
5568 i.memshift = 4;
5569 }
5570
5571 if (type)
5572 {
5573 if (type->bitfield.zmmword)
5574 i.memshift = 6;
5575 else if (type->bitfield.ymmword)
5576 i.memshift = 5;
5577 else if (type->bitfield.xmmword)
5578 i.memshift = 4;
5579 }
5580
5581 /* For the check in fits_in_disp8(). */
5582 if (i.memshift == 0)
5583 i.memshift = -1;
5584 }
43234a1e
L
5585
5586 for (op = 0; op < i.operands; op++)
5587 if (operand_type_check (i.types[op], disp)
5588 && i.op[op].disps->X_op == O_constant)
5589 {
b5014f7a 5590 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 5591 {
b5014f7a
JB
5592 i.types[op].bitfield.disp8 = 1;
5593 return 0;
43234a1e 5594 }
b5014f7a 5595 i.types[op].bitfield.disp8 = 0;
43234a1e
L
5596 }
5597 }
b5014f7a
JB
5598
5599 i.memshift = 0;
43234a1e 5600
6c30d220
L
5601 return 0;
5602}
5603
43f3e2ee 5604/* Check if operands are valid for the instruction. Update VEX
a683cc34
SP
5605 operand types. */
5606
5607static int
5608VEX_check_operands (const insn_template *t)
5609{
86fa6981 5610 if (i.vec_encoding == vex_encoding_evex)
43234a1e 5611 {
86fa6981 5612 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 5613 if (!is_evex_encoding (t))
86fa6981
L
5614 {
5615 i.error = unsupported;
5616 return 1;
5617 }
5618 return 0;
43234a1e
L
5619 }
5620
a683cc34 5621 if (!t->opcode_modifier.vex)
86fa6981
L
5622 {
5623 /* This instruction template doesn't have VEX prefix. */
5624 if (i.vec_encoding != vex_encoding_default)
5625 {
5626 i.error = unsupported;
5627 return 1;
5628 }
5629 return 0;
5630 }
a683cc34 5631
9d3bf266
JB
5632 /* Check the special Imm4 cases; must be the first operand. */
5633 if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)
a683cc34
SP
5634 {
5635 if (i.op[0].imms->X_op != O_constant
5636 || !fits_in_imm4 (i.op[0].imms->X_add_number))
891edac4 5637 {
a65babc9 5638 i.error = bad_imm4;
891edac4
L
5639 return 1;
5640 }
a683cc34 5641
9d3bf266
JB
5642 /* Turn off Imm<N> so that update_imm won't complain. */
5643 operand_type_set (&i.types[0], 0);
a683cc34
SP
5644 }
5645
5646 return 0;
5647}
5648
d3ce72d0 5649static const insn_template *
83b16ac6 5650match_template (char mnem_suffix)
29b0f896
AM
5651{
5652 /* Points to template once we've found it. */
d3ce72d0 5653 const insn_template *t;
40fb9820 5654 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 5655 i386_operand_type overlap4;
29b0f896 5656 unsigned int found_reverse_match;
dc2be329 5657 i386_opcode_modifier suffix_check;
40fb9820 5658 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 5659 int addr_prefix_disp;
a5c311ca 5660 unsigned int j;
3ac21baa 5661 unsigned int found_cpu_match, size_match;
45664ddb 5662 unsigned int check_register;
5614d22c 5663 enum i386_error specific_error = 0;
29b0f896 5664
c0f3af97
L
5665#if MAX_OPERANDS != 5
5666# error "MAX_OPERANDS must be 5."
f48ff2ae
L
5667#endif
5668
29b0f896 5669 found_reverse_match = 0;
539e75ad 5670 addr_prefix_disp = -1;
40fb9820 5671
dc2be329 5672 /* Prepare for mnemonic suffix check. */
40fb9820 5673 memset (&suffix_check, 0, sizeof (suffix_check));
dc2be329
L
5674 switch (mnem_suffix)
5675 {
5676 case BYTE_MNEM_SUFFIX:
5677 suffix_check.no_bsuf = 1;
5678 break;
5679 case WORD_MNEM_SUFFIX:
5680 suffix_check.no_wsuf = 1;
5681 break;
5682 case SHORT_MNEM_SUFFIX:
5683 suffix_check.no_ssuf = 1;
5684 break;
5685 case LONG_MNEM_SUFFIX:
5686 suffix_check.no_lsuf = 1;
5687 break;
5688 case QWORD_MNEM_SUFFIX:
5689 suffix_check.no_qsuf = 1;
5690 break;
5691 default:
5692 /* NB: In Intel syntax, normally we can check for memory operand
5693 size when there is no mnemonic suffix. But jmp and call have
5694 2 different encodings with Dword memory operand size, one with
5695 No_ldSuf and the other without. i.suffix is set to
5696 LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
5697 if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
5698 suffix_check.no_ldsuf = 1;
83b16ac6
JB
5699 }
5700
01559ecc
L
5701 /* Must have right number of operands. */
5702 i.error = number_of_operands_mismatch;
5703
45aa61fe 5704 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 5705 {
539e75ad 5706 addr_prefix_disp = -1;
dbbc8b7e 5707 found_reverse_match = 0;
539e75ad 5708
29b0f896
AM
5709 if (i.operands != t->operands)
5710 continue;
5711
50aecf8c 5712 /* Check processor support. */
a65babc9 5713 i.error = unsupported;
c0f3af97
L
5714 found_cpu_match = (cpu_flags_match (t)
5715 == CPU_FLAGS_PERFECT_MATCH);
50aecf8c
L
5716 if (!found_cpu_match)
5717 continue;
5718
e1d4d893 5719 /* Check AT&T mnemonic. */
a65babc9 5720 i.error = unsupported_with_intel_mnemonic;
e1d4d893 5721 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
5722 continue;
5723
e92bae62 5724 /* Check AT&T/Intel syntax and Intel64/AMD64 ISA. */
a65babc9 5725 i.error = unsupported_syntax;
5c07affc 5726 if ((intel_syntax && t->opcode_modifier.attsyntax)
e92bae62
L
5727 || (!intel_syntax && t->opcode_modifier.intelsyntax)
5728 || (intel64 && t->opcode_modifier.amd64)
5729 || (!intel64 && t->opcode_modifier.intel64))
1efbbeb4
L
5730 continue;
5731
dc2be329 5732 /* Check the suffix. */
a65babc9 5733 i.error = invalid_instruction_suffix;
dc2be329
L
5734 if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
5735 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
5736 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
5737 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
5738 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
5739 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
83b16ac6 5740 continue;
29b0f896 5741
3ac21baa
JB
5742 size_match = operand_size_match (t);
5743 if (!size_match)
7d5e4556 5744 continue;
539e75ad 5745
5c07affc
L
5746 for (j = 0; j < MAX_OPERANDS; j++)
5747 operand_types[j] = t->operand_types[j];
5748
45aa61fe
AM
5749 /* In general, don't allow 64-bit operands in 32-bit mode. */
5750 if (i.suffix == QWORD_MNEM_SUFFIX
5751 && flag_code != CODE_64BIT
5752 && (intel_syntax
40fb9820 5753 ? (!t->opcode_modifier.ignoresize
625cbd7a 5754 && !t->opcode_modifier.broadcast
45aa61fe
AM
5755 && !intel_float_operand (t->name))
5756 : intel_float_operand (t->name) != 2)
3528c362
JB
5757 && ((operand_types[0].bitfield.class != RegMMX
5758 && operand_types[0].bitfield.class != RegSIMD)
5759 || (operand_types[t->operands > 1].bitfield.class != RegMMX
5760 && operand_types[t->operands > 1].bitfield.class != RegSIMD))
45aa61fe
AM
5761 && (t->base_opcode != 0x0fc7
5762 || t->extension_opcode != 1 /* cmpxchg8b */))
5763 continue;
5764
192dc9c6
JB
5765 /* In general, don't allow 32-bit operands on pre-386. */
5766 else if (i.suffix == LONG_MNEM_SUFFIX
5767 && !cpu_arch_flags.bitfield.cpui386
5768 && (intel_syntax
5769 ? (!t->opcode_modifier.ignoresize
5770 && !intel_float_operand (t->name))
5771 : intel_float_operand (t->name) != 2)
3528c362
JB
5772 && ((operand_types[0].bitfield.class != RegMMX
5773 && operand_types[0].bitfield.class != RegSIMD)
5774 || (operand_types[t->operands > 1].bitfield.class != RegMMX
5775 && operand_types[t->operands > 1].bitfield.class
5776 != RegSIMD)))
192dc9c6
JB
5777 continue;
5778
29b0f896 5779 /* Do not verify operands when there are none. */
50aecf8c 5780 else
29b0f896 5781 {
c6fb90c8 5782 if (!t->operands)
2dbab7d5
L
5783 /* We've found a match; break out of loop. */
5784 break;
29b0f896 5785 }
252b5132 5786
539e75ad
L
5787 /* Address size prefix will turn Disp64/Disp32/Disp16 operand
5788 into Disp32/Disp16/Disp32 operand. */
5789 if (i.prefix[ADDR_PREFIX] != 0)
5790 {
40fb9820 5791 /* There should be only one Disp operand. */
539e75ad
L
5792 switch (flag_code)
5793 {
5794 case CODE_16BIT:
40fb9820
L
5795 for (j = 0; j < MAX_OPERANDS; j++)
5796 {
5797 if (operand_types[j].bitfield.disp16)
5798 {
5799 addr_prefix_disp = j;
5800 operand_types[j].bitfield.disp32 = 1;
5801 operand_types[j].bitfield.disp16 = 0;
5802 break;
5803 }
5804 }
539e75ad
L
5805 break;
5806 case CODE_32BIT:
40fb9820
L
5807 for (j = 0; j < MAX_OPERANDS; j++)
5808 {
5809 if (operand_types[j].bitfield.disp32)
5810 {
5811 addr_prefix_disp = j;
5812 operand_types[j].bitfield.disp32 = 0;
5813 operand_types[j].bitfield.disp16 = 1;
5814 break;
5815 }
5816 }
539e75ad
L
5817 break;
5818 case CODE_64BIT:
40fb9820
L
5819 for (j = 0; j < MAX_OPERANDS; j++)
5820 {
5821 if (operand_types[j].bitfield.disp64)
5822 {
5823 addr_prefix_disp = j;
5824 operand_types[j].bitfield.disp64 = 0;
5825 operand_types[j].bitfield.disp32 = 1;
5826 break;
5827 }
5828 }
539e75ad
L
5829 break;
5830 }
539e75ad
L
5831 }
5832
02a86693
L
5833 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
5834 if (i.reloc[0] == BFD_RELOC_386_GOT32 && t->base_opcode == 0xa0)
5835 continue;
5836
56ffb741 5837 /* We check register size if needed. */
e2195274
JB
5838 if (t->opcode_modifier.checkregsize)
5839 {
5840 check_register = (1 << t->operands) - 1;
5841 if (i.broadcast)
5842 check_register &= ~(1 << i.broadcast->operand);
5843 }
5844 else
5845 check_register = 0;
5846
c6fb90c8 5847 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
5848 switch (t->operands)
5849 {
5850 case 1:
40fb9820 5851 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
5852 continue;
5853 break;
5854 case 2:
33eaf5de 5855 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
5856 only in 32bit mode and we can use opcode 0x90. In 64bit
5857 mode, we can't use 0x90 for xchg %eax, %eax since it should
5858 zero-extend %eax to %rax. */
5859 if (flag_code == CODE_64BIT
5860 && t->base_opcode == 0x90
75e5731b
JB
5861 && i.types[0].bitfield.instance == Accum
5862 && i.types[0].bitfield.dword
5863 && i.types[1].bitfield.instance == Accum
5864 && i.types[1].bitfield.dword)
8b38ad71 5865 continue;
1212781b
JB
5866 /* xrelease mov %eax, <disp> is another special case. It must not
5867 match the accumulator-only encoding of mov. */
5868 if (flag_code != CODE_64BIT
5869 && i.hle_prefix
5870 && t->base_opcode == 0xa0
75e5731b 5871 && i.types[0].bitfield.instance == Accum
8dc0818e 5872 && (i.flags[1] & Operand_Mem))
1212781b 5873 continue;
f5eb1d70
JB
5874 /* Fall through. */
5875
5876 case 3:
3ac21baa
JB
5877 if (!(size_match & MATCH_STRAIGHT))
5878 goto check_reverse;
64c49ab3
JB
5879 /* Reverse direction of operands if swapping is possible in the first
5880 place (operands need to be symmetric) and
5881 - the load form is requested, and the template is a store form,
5882 - the store form is requested, and the template is a load form,
5883 - the non-default (swapped) form is requested. */
5884 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 5885 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
5886 && !operand_type_all_zero (&overlap1))
5887 switch (i.dir_encoding)
5888 {
5889 case dir_encoding_load:
5890 if (operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 5891 || t->opcode_modifier.regmem)
64c49ab3
JB
5892 goto check_reverse;
5893 break;
5894
5895 case dir_encoding_store:
5896 if (!operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 5897 && !t->opcode_modifier.regmem)
64c49ab3
JB
5898 goto check_reverse;
5899 break;
5900
5901 case dir_encoding_swap:
5902 goto check_reverse;
5903
5904 case dir_encoding_default:
5905 break;
5906 }
86fa6981 5907 /* If we want store form, we skip the current load. */
64c49ab3
JB
5908 if ((i.dir_encoding == dir_encoding_store
5909 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
5910 && i.mem_operands == 0
5911 && t->opcode_modifier.load)
fa99fab2 5912 continue;
1a0670f3 5913 /* Fall through. */
f48ff2ae 5914 case 4:
c0f3af97 5915 case 5:
c6fb90c8 5916 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
5917 if (!operand_type_match (overlap0, i.types[0])
5918 || !operand_type_match (overlap1, i.types[1])
e2195274 5919 || ((check_register & 3) == 3
dc821c5f 5920 && !operand_type_register_match (i.types[0],
40fb9820 5921 operand_types[0],
dc821c5f 5922 i.types[1],
40fb9820 5923 operand_types[1])))
29b0f896
AM
5924 {
5925 /* Check if other direction is valid ... */
38e314eb 5926 if (!t->opcode_modifier.d)
29b0f896
AM
5927 continue;
5928
b6169b20 5929check_reverse:
3ac21baa
JB
5930 if (!(size_match & MATCH_REVERSE))
5931 continue;
29b0f896 5932 /* Try reversing direction of operands. */
f5eb1d70
JB
5933 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
5934 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 5935 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 5936 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 5937 || (check_register
dc821c5f 5938 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
5939 operand_types[i.operands - 1],
5940 i.types[i.operands - 1],
45664ddb 5941 operand_types[0])))
29b0f896
AM
5942 {
5943 /* Does not match either direction. */
5944 continue;
5945 }
38e314eb 5946 /* found_reverse_match holds which of D or FloatR
29b0f896 5947 we've found. */
38e314eb
JB
5948 if (!t->opcode_modifier.d)
5949 found_reverse_match = 0;
5950 else if (operand_types[0].bitfield.tbyte)
8a2ed489 5951 found_reverse_match = Opcode_FloatD;
dbbc8b7e 5952 else if (operand_types[0].bitfield.xmmword
f5eb1d70 5953 || operand_types[i.operands - 1].bitfield.xmmword
3528c362
JB
5954 || operand_types[0].bitfield.class == RegMMX
5955 || operand_types[i.operands - 1].bitfield.class == RegMMX
dbbc8b7e
JB
5956 || is_any_vex_encoding(t))
5957 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
5958 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 5959 else
38e314eb 5960 found_reverse_match = Opcode_D;
40fb9820 5961 if (t->opcode_modifier.floatr)
8a2ed489 5962 found_reverse_match |= Opcode_FloatR;
29b0f896 5963 }
f48ff2ae 5964 else
29b0f896 5965 {
f48ff2ae 5966 /* Found a forward 2 operand match here. */
d1cbb4db
L
5967 switch (t->operands)
5968 {
c0f3af97
L
5969 case 5:
5970 overlap4 = operand_type_and (i.types[4],
5971 operand_types[4]);
1a0670f3 5972 /* Fall through. */
d1cbb4db 5973 case 4:
c6fb90c8
L
5974 overlap3 = operand_type_and (i.types[3],
5975 operand_types[3]);
1a0670f3 5976 /* Fall through. */
d1cbb4db 5977 case 3:
c6fb90c8
L
5978 overlap2 = operand_type_and (i.types[2],
5979 operand_types[2]);
d1cbb4db
L
5980 break;
5981 }
29b0f896 5982
f48ff2ae
L
5983 switch (t->operands)
5984 {
c0f3af97
L
5985 case 5:
5986 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 5987 || !operand_type_register_match (i.types[3],
c0f3af97 5988 operand_types[3],
c0f3af97
L
5989 i.types[4],
5990 operand_types[4]))
5991 continue;
1a0670f3 5992 /* Fall through. */
f48ff2ae 5993 case 4:
40fb9820 5994 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
5995 || ((check_register & 0xa) == 0xa
5996 && !operand_type_register_match (i.types[1],
f7768225
JB
5997 operand_types[1],
5998 i.types[3],
e2195274
JB
5999 operand_types[3]))
6000 || ((check_register & 0xc) == 0xc
6001 && !operand_type_register_match (i.types[2],
6002 operand_types[2],
6003 i.types[3],
6004 operand_types[3])))
f48ff2ae 6005 continue;
1a0670f3 6006 /* Fall through. */
f48ff2ae
L
6007 case 3:
6008 /* Here we make use of the fact that there are no
23e42951 6009 reverse match 3 operand instructions. */
40fb9820 6010 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
6011 || ((check_register & 5) == 5
6012 && !operand_type_register_match (i.types[0],
23e42951
JB
6013 operand_types[0],
6014 i.types[2],
e2195274
JB
6015 operand_types[2]))
6016 || ((check_register & 6) == 6
6017 && !operand_type_register_match (i.types[1],
6018 operand_types[1],
6019 i.types[2],
6020 operand_types[2])))
f48ff2ae
L
6021 continue;
6022 break;
6023 }
29b0f896 6024 }
f48ff2ae 6025 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
6026 slip through to break. */
6027 }
3629bb00 6028 if (!found_cpu_match)
dbbc8b7e 6029 continue;
c0f3af97 6030
5614d22c
JB
6031 /* Check if vector and VEX operands are valid. */
6032 if (check_VecOperands (t) || VEX_check_operands (t))
6033 {
6034 specific_error = i.error;
6035 continue;
6036 }
a683cc34 6037
29b0f896
AM
6038 /* We've found a match; break out of loop. */
6039 break;
6040 }
6041
6042 if (t == current_templates->end)
6043 {
6044 /* We found no match. */
a65babc9 6045 const char *err_msg;
5614d22c 6046 switch (specific_error ? specific_error : i.error)
a65babc9
L
6047 {
6048 default:
6049 abort ();
86e026a4 6050 case operand_size_mismatch:
a65babc9
L
6051 err_msg = _("operand size mismatch");
6052 break;
6053 case operand_type_mismatch:
6054 err_msg = _("operand type mismatch");
6055 break;
6056 case register_type_mismatch:
6057 err_msg = _("register type mismatch");
6058 break;
6059 case number_of_operands_mismatch:
6060 err_msg = _("number of operands mismatch");
6061 break;
6062 case invalid_instruction_suffix:
6063 err_msg = _("invalid instruction suffix");
6064 break;
6065 case bad_imm4:
4a2608e3 6066 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6067 break;
a65babc9
L
6068 case unsupported_with_intel_mnemonic:
6069 err_msg = _("unsupported with Intel mnemonic");
6070 break;
6071 case unsupported_syntax:
6072 err_msg = _("unsupported syntax");
6073 break;
6074 case unsupported:
35262a23 6075 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6076 current_templates->start->name);
6077 return NULL;
6c30d220
L
6078 case invalid_vsib_address:
6079 err_msg = _("invalid VSIB address");
6080 break;
7bab8ab5
JB
6081 case invalid_vector_register_set:
6082 err_msg = _("mask, index, and destination registers must be distinct");
6083 break;
6c30d220
L
6084 case unsupported_vector_index_register:
6085 err_msg = _("unsupported vector index register");
6086 break;
43234a1e
L
6087 case unsupported_broadcast:
6088 err_msg = _("unsupported broadcast");
6089 break;
43234a1e
L
6090 case broadcast_needed:
6091 err_msg = _("broadcast is needed for operand of such type");
6092 break;
6093 case unsupported_masking:
6094 err_msg = _("unsupported masking");
6095 break;
6096 case mask_not_on_destination:
6097 err_msg = _("mask not on destination operand");
6098 break;
6099 case no_default_mask:
6100 err_msg = _("default mask isn't allowed");
6101 break;
6102 case unsupported_rc_sae:
6103 err_msg = _("unsupported static rounding/sae");
6104 break;
6105 case rc_sae_operand_not_last_imm:
6106 if (intel_syntax)
6107 err_msg = _("RC/SAE operand must precede immediate operands");
6108 else
6109 err_msg = _("RC/SAE operand must follow immediate operands");
6110 break;
6111 case invalid_register_operand:
6112 err_msg = _("invalid register operand");
6113 break;
a65babc9
L
6114 }
6115 as_bad (_("%s for `%s'"), err_msg,
891edac4 6116 current_templates->start->name);
fa99fab2 6117 return NULL;
29b0f896 6118 }
252b5132 6119
29b0f896
AM
6120 if (!quiet_warnings)
6121 {
6122 if (!intel_syntax
40fb9820
L
6123 && (i.types[0].bitfield.jumpabsolute
6124 != operand_types[0].bitfield.jumpabsolute))
29b0f896
AM
6125 {
6126 as_warn (_("indirect %s without `*'"), t->name);
6127 }
6128
40fb9820
L
6129 if (t->opcode_modifier.isprefix
6130 && t->opcode_modifier.ignoresize)
29b0f896
AM
6131 {
6132 /* Warn them that a data or address size prefix doesn't
6133 affect assembly of the next line of code. */
6134 as_warn (_("stand-alone `%s' prefix"), t->name);
6135 }
6136 }
6137
6138 /* Copy the template we found. */
6139 i.tm = *t;
539e75ad
L
6140
6141 if (addr_prefix_disp != -1)
6142 i.tm.operand_types[addr_prefix_disp]
6143 = operand_types[addr_prefix_disp];
6144
29b0f896
AM
6145 if (found_reverse_match)
6146 {
dfd69174
JB
6147 /* If we found a reverse match we must alter the opcode direction
6148 bit and clear/flip the regmem modifier one. found_reverse_match
6149 holds bits to change (different for int & float insns). */
29b0f896
AM
6150
6151 i.tm.base_opcode ^= found_reverse_match;
6152
f5eb1d70
JB
6153 i.tm.operand_types[0] = operand_types[i.operands - 1];
6154 i.tm.operand_types[i.operands - 1] = operand_types[0];
dfd69174
JB
6155
6156 /* Certain SIMD insns have their load forms specified in the opcode
6157 table, and hence we need to _set_ RegMem instead of clearing it.
6158 We need to avoid setting the bit though on insns like KMOVW. */
6159 i.tm.opcode_modifier.regmem
6160 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
6161 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
6162 && !i.tm.opcode_modifier.regmem;
29b0f896
AM
6163 }
6164
fa99fab2 6165 return t;
29b0f896
AM
6166}
6167
6168static int
e3bb37b5 6169check_string (void)
29b0f896 6170{
51c8edf6
JB
6171 unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
6172 unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
8dc0818e 6173
51c8edf6 6174 if (i.seg[op] != NULL && i.seg[op] != &es)
29b0f896 6175 {
51c8edf6
JB
6176 as_bad (_("`%s' operand %u must use `%ses' segment"),
6177 i.tm.name,
6178 intel_syntax ? i.tm.operands - es_op : es_op + 1,
6179 register_prefix);
6180 return 0;
29b0f896 6181 }
51c8edf6
JB
6182
6183 /* There's only ever one segment override allowed per instruction.
6184 This instruction possibly has a legal segment override on the
6185 second operand, so copy the segment to where non-string
6186 instructions store it, allowing common code. */
6187 i.seg[op] = i.seg[1];
6188
29b0f896
AM
6189 return 1;
6190}
6191
6192static int
543613e9 6193process_suffix (void)
29b0f896
AM
6194{
6195 /* If matched instruction specifies an explicit instruction mnemonic
6196 suffix, use it. */
673fe0f0 6197 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6198 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6199 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6200 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6201 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6202 i.suffix = QWORD_MNEM_SUFFIX;
29b0f896
AM
6203 else if (i.reg_operands)
6204 {
6205 /* If there's no instruction mnemonic suffix we try to invent one
6206 based on register operands. */
6207 if (!i.suffix)
6208 {
6209 /* We take i.suffix from the last register operand specified,
6210 Destination register type is more significant than source
381d071f
L
6211 register type. crc32 in SSE4.2 prefers source register
6212 type. */
bab6aec1
JB
6213 if (i.tm.base_opcode == 0xf20f38f0
6214 && i.types[0].bitfield.class == Reg)
381d071f 6215 {
556059dd
JB
6216 if (i.types[0].bitfield.byte)
6217 i.suffix = BYTE_MNEM_SUFFIX;
6218 else if (i.types[0].bitfield.word)
40fb9820 6219 i.suffix = WORD_MNEM_SUFFIX;
556059dd 6220 else if (i.types[0].bitfield.dword)
40fb9820 6221 i.suffix = LONG_MNEM_SUFFIX;
556059dd 6222 else if (i.types[0].bitfield.qword)
40fb9820 6223 i.suffix = QWORD_MNEM_SUFFIX;
381d071f
L
6224 }
6225
6226 if (!i.suffix)
6227 {
6228 int op;
6229
556059dd 6230 if (i.tm.base_opcode == 0xf20f38f0)
20592a94
L
6231 {
6232 /* We have to know the operand size for crc32. */
6233 as_bad (_("ambiguous memory operand size for `%s`"),
6234 i.tm.name);
6235 return 0;
6236 }
6237
381d071f 6238 for (op = i.operands; --op >= 0;)
75e5731b
JB
6239 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
6240 || i.tm.operand_types[op].bitfield.instance == Accum)
381d071f 6241 {
bab6aec1 6242 if (i.types[op].bitfield.class != Reg)
8819ada6
JB
6243 continue;
6244 if (i.types[op].bitfield.byte)
6245 i.suffix = BYTE_MNEM_SUFFIX;
6246 else if (i.types[op].bitfield.word)
6247 i.suffix = WORD_MNEM_SUFFIX;
6248 else if (i.types[op].bitfield.dword)
6249 i.suffix = LONG_MNEM_SUFFIX;
6250 else if (i.types[op].bitfield.qword)
6251 i.suffix = QWORD_MNEM_SUFFIX;
6252 else
6253 continue;
6254 break;
381d071f
L
6255 }
6256 }
29b0f896
AM
6257 }
6258 else if (i.suffix == BYTE_MNEM_SUFFIX)
6259 {
2eb952a4
L
6260 if (intel_syntax
6261 && i.tm.opcode_modifier.ignoresize
6262 && i.tm.opcode_modifier.no_bsuf)
6263 i.suffix = 0;
6264 else if (!check_byte_reg ())
29b0f896
AM
6265 return 0;
6266 }
6267 else if (i.suffix == LONG_MNEM_SUFFIX)
6268 {
2eb952a4
L
6269 if (intel_syntax
6270 && i.tm.opcode_modifier.ignoresize
9f123b91
JB
6271 && i.tm.opcode_modifier.no_lsuf
6272 && !i.tm.opcode_modifier.todword
6273 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
6274 i.suffix = 0;
6275 else if (!check_long_reg ())
29b0f896
AM
6276 return 0;
6277 }
6278 else if (i.suffix == QWORD_MNEM_SUFFIX)
6279 {
955e1e6a
L
6280 if (intel_syntax
6281 && i.tm.opcode_modifier.ignoresize
9f123b91
JB
6282 && i.tm.opcode_modifier.no_qsuf
6283 && !i.tm.opcode_modifier.todword
6284 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
6285 i.suffix = 0;
6286 else if (!check_qword_reg ())
29b0f896
AM
6287 return 0;
6288 }
6289 else if (i.suffix == WORD_MNEM_SUFFIX)
6290 {
2eb952a4
L
6291 if (intel_syntax
6292 && i.tm.opcode_modifier.ignoresize
6293 && i.tm.opcode_modifier.no_wsuf)
6294 i.suffix = 0;
6295 else if (!check_word_reg ())
29b0f896
AM
6296 return 0;
6297 }
40fb9820 6298 else if (intel_syntax && i.tm.opcode_modifier.ignoresize)
29b0f896
AM
6299 /* Do nothing if the instruction is going to ignore the prefix. */
6300 ;
6301 else
6302 abort ();
6303 }
40fb9820 6304 else if (i.tm.opcode_modifier.defaultsize
9306ca4a
JB
6305 && !i.suffix
6306 /* exclude fldenv/frstor/fsave/fstenv */
40fb9820 6307 && i.tm.opcode_modifier.no_ssuf)
29b0f896 6308 {
06f74c5c
L
6309 if (stackop_size == LONG_MNEM_SUFFIX
6310 && i.tm.base_opcode == 0xcf)
6311 {
6312 /* stackop_size is set to LONG_MNEM_SUFFIX for the
6313 .code16gcc directive to support 16-bit mode with
6314 32-bit address. For IRET without a suffix, generate
6315 16-bit IRET (opcode 0xcf) to return from an interrupt
6316 handler. */
6317 i.suffix = WORD_MNEM_SUFFIX;
6318 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
6319 }
6320 else
6321 i.suffix = stackop_size;
29b0f896 6322 }
9306ca4a
JB
6323 else if (intel_syntax
6324 && !i.suffix
40fb9820
L
6325 && (i.tm.operand_types[0].bitfield.jumpabsolute
6326 || i.tm.opcode_modifier.jumpbyte
6327 || i.tm.opcode_modifier.jumpintersegment
64e74474
AM
6328 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
6329 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
6330 {
6331 switch (flag_code)
6332 {
6333 case CODE_64BIT:
40fb9820 6334 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a
JB
6335 {
6336 i.suffix = QWORD_MNEM_SUFFIX;
6337 break;
6338 }
1a0670f3 6339 /* Fall through. */
9306ca4a 6340 case CODE_32BIT:
40fb9820 6341 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
6342 i.suffix = LONG_MNEM_SUFFIX;
6343 break;
6344 case CODE_16BIT:
40fb9820 6345 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
6346 i.suffix = WORD_MNEM_SUFFIX;
6347 break;
6348 }
6349 }
252b5132 6350
9306ca4a 6351 if (!i.suffix)
29b0f896 6352 {
9306ca4a
JB
6353 if (!intel_syntax)
6354 {
40fb9820 6355 if (i.tm.opcode_modifier.w)
9306ca4a 6356 {
4eed87de
AM
6357 as_bad (_("no instruction mnemonic suffix given and "
6358 "no register operands; can't size instruction"));
9306ca4a
JB
6359 return 0;
6360 }
6361 }
6362 else
6363 {
40fb9820 6364 unsigned int suffixes;
7ab9ffdd 6365
40fb9820
L
6366 suffixes = !i.tm.opcode_modifier.no_bsuf;
6367 if (!i.tm.opcode_modifier.no_wsuf)
6368 suffixes |= 1 << 1;
6369 if (!i.tm.opcode_modifier.no_lsuf)
6370 suffixes |= 1 << 2;
fc4adea1 6371 if (!i.tm.opcode_modifier.no_ldsuf)
40fb9820
L
6372 suffixes |= 1 << 3;
6373 if (!i.tm.opcode_modifier.no_ssuf)
6374 suffixes |= 1 << 4;
c2b9da16 6375 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
40fb9820
L
6376 suffixes |= 1 << 5;
6377
6378 /* There are more than suffix matches. */
6379 if (i.tm.opcode_modifier.w
9306ca4a 6380 || ((suffixes & (suffixes - 1))
40fb9820
L
6381 && !i.tm.opcode_modifier.defaultsize
6382 && !i.tm.opcode_modifier.ignoresize))
9306ca4a
JB
6383 {
6384 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
6385 return 0;
6386 }
6387 }
29b0f896 6388 }
252b5132 6389
d2224064
JB
6390 /* Change the opcode based on the operand size given by i.suffix. */
6391 switch (i.suffix)
29b0f896 6392 {
d2224064
JB
6393 /* Size floating point instruction. */
6394 case LONG_MNEM_SUFFIX:
6395 if (i.tm.opcode_modifier.floatmf)
6396 {
6397 i.tm.base_opcode ^= 4;
6398 break;
6399 }
6400 /* fall through */
6401 case WORD_MNEM_SUFFIX:
6402 case QWORD_MNEM_SUFFIX:
29b0f896 6403 /* It's not a byte, select word/dword operation. */
40fb9820 6404 if (i.tm.opcode_modifier.w)
29b0f896 6405 {
40fb9820 6406 if (i.tm.opcode_modifier.shortform)
29b0f896
AM
6407 i.tm.base_opcode |= 8;
6408 else
6409 i.tm.base_opcode |= 1;
6410 }
d2224064
JB
6411 /* fall through */
6412 case SHORT_MNEM_SUFFIX:
29b0f896
AM
6413 /* Now select between word & dword operations via the operand
6414 size prefix, except for instructions that will ignore this
6415 prefix anyway. */
75c0a438 6416 if (i.reg_operands > 0
bab6aec1 6417 && i.types[0].bitfield.class == Reg
75c0a438 6418 && i.tm.opcode_modifier.addrprefixopreg
474da251 6419 && (i.tm.operand_types[0].bitfield.instance == Accum
75c0a438 6420 || i.operands == 1))
cb712a9e 6421 {
ca61edf2
L
6422 /* The address size override prefix changes the size of the
6423 first operand. */
40fb9820 6424 if ((flag_code == CODE_32BIT
75c0a438 6425 && i.op[0].regs->reg_type.bitfield.word)
40fb9820 6426 || (flag_code != CODE_32BIT
75c0a438 6427 && i.op[0].regs->reg_type.bitfield.dword))
cb712a9e
L
6428 if (!add_prefix (ADDR_PREFIX_OPCODE))
6429 return 0;
6430 }
6431 else if (i.suffix != QWORD_MNEM_SUFFIX
40fb9820
L
6432 && !i.tm.opcode_modifier.ignoresize
6433 && !i.tm.opcode_modifier.floatmf
a38d7118 6434 && !is_any_vex_encoding (&i.tm)
cb712a9e
L
6435 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
6436 || (flag_code == CODE_64BIT
40fb9820 6437 && i.tm.opcode_modifier.jumpbyte)))
24eab124
AM
6438 {
6439 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 6440
40fb9820 6441 if (i.tm.opcode_modifier.jumpbyte) /* jcxz, loop */
29b0f896 6442 prefix = ADDR_PREFIX_OPCODE;
252b5132 6443
29b0f896
AM
6444 if (!add_prefix (prefix))
6445 return 0;
24eab124 6446 }
252b5132 6447
29b0f896
AM
6448 /* Set mode64 for an operand. */
6449 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 6450 && flag_code == CODE_64BIT
d2224064 6451 && !i.tm.opcode_modifier.norex64
46e883c5 6452 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
6453 need rex64. */
6454 && ! (i.operands == 2
6455 && i.tm.base_opcode == 0x90
6456 && i.tm.extension_opcode == None
75e5731b
JB
6457 && i.types[0].bitfield.instance == Accum
6458 && i.types[0].bitfield.qword
6459 && i.types[1].bitfield.instance == Accum
6460 && i.types[1].bitfield.qword))
d2224064 6461 i.rex |= REX_W;
3e73aa7c 6462
d2224064 6463 break;
29b0f896 6464 }
7ecd2f8b 6465
c0a30a9f
L
6466 if (i.reg_operands != 0
6467 && i.operands > 1
6468 && i.tm.opcode_modifier.addrprefixopreg
474da251 6469 && i.tm.operand_types[0].bitfield.instance != Accum)
c0a30a9f
L
6470 {
6471 /* Check invalid register operand when the address size override
6472 prefix changes the size of register operands. */
6473 unsigned int op;
6474 enum { need_word, need_dword, need_qword } need;
6475
6476 if (flag_code == CODE_32BIT)
6477 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
6478 else
6479 {
6480 if (i.prefix[ADDR_PREFIX])
6481 need = need_dword;
6482 else
6483 need = flag_code == CODE_64BIT ? need_qword : need_word;
6484 }
6485
6486 for (op = 0; op < i.operands; op++)
bab6aec1 6487 if (i.types[op].bitfield.class == Reg
c0a30a9f
L
6488 && ((need == need_word
6489 && !i.op[op].regs->reg_type.bitfield.word)
6490 || (need == need_dword
6491 && !i.op[op].regs->reg_type.bitfield.dword)
6492 || (need == need_qword
6493 && !i.op[op].regs->reg_type.bitfield.qword)))
6494 {
6495 as_bad (_("invalid register operand size for `%s'"),
6496 i.tm.name);
6497 return 0;
6498 }
6499 }
6500
29b0f896
AM
6501 return 1;
6502}
3e73aa7c 6503
29b0f896 6504static int
543613e9 6505check_byte_reg (void)
29b0f896
AM
6506{
6507 int op;
543613e9 6508
29b0f896
AM
6509 for (op = i.operands; --op >= 0;)
6510 {
dc821c5f 6511 /* Skip non-register operands. */
bab6aec1 6512 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
6513 continue;
6514
29b0f896
AM
6515 /* If this is an eight bit register, it's OK. If it's the 16 or
6516 32 bit version of an eight bit register, we will just use the
6517 low portion, and that's OK too. */
dc821c5f 6518 if (i.types[op].bitfield.byte)
29b0f896
AM
6519 continue;
6520
5a819eb9 6521 /* I/O port address operands are OK too. */
75e5731b
JB
6522 if (i.tm.operand_types[op].bitfield.instance == RegD
6523 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
6524 continue;
6525
9344ff29
L
6526 /* crc32 doesn't generate this warning. */
6527 if (i.tm.base_opcode == 0xf20f38f0)
6528 continue;
6529
dc821c5f
JB
6530 if ((i.types[op].bitfield.word
6531 || i.types[op].bitfield.dword
6532 || i.types[op].bitfield.qword)
5a819eb9
JB
6533 && i.op[op].regs->reg_num < 4
6534 /* Prohibit these changes in 64bit mode, since the lowering
6535 would be more complicated. */
6536 && flag_code != CODE_64BIT)
29b0f896 6537 {
29b0f896 6538#if REGISTER_WARNINGS
5a819eb9 6539 if (!quiet_warnings)
a540244d
L
6540 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
6541 register_prefix,
dc821c5f 6542 (i.op[op].regs + (i.types[op].bitfield.word
29b0f896
AM
6543 ? REGNAM_AL - REGNAM_AX
6544 : REGNAM_AL - REGNAM_EAX))->reg_name,
a540244d 6545 register_prefix,
29b0f896
AM
6546 i.op[op].regs->reg_name,
6547 i.suffix);
6548#endif
6549 continue;
6550 }
6551 /* Any other register is bad. */
bab6aec1 6552 if (i.types[op].bitfield.class == Reg
3528c362
JB
6553 || i.types[op].bitfield.class == RegMMX
6554 || i.types[op].bitfield.class == RegSIMD
00cee14f 6555 || i.types[op].bitfield.class == SReg
4a5c67ed
JB
6556 || i.types[op].bitfield.class == RegCR
6557 || i.types[op].bitfield.class == RegDR
6558 || i.types[op].bitfield.class == RegTR)
29b0f896 6559 {
a540244d
L
6560 as_bad (_("`%s%s' not allowed with `%s%c'"),
6561 register_prefix,
29b0f896
AM
6562 i.op[op].regs->reg_name,
6563 i.tm.name,
6564 i.suffix);
6565 return 0;
6566 }
6567 }
6568 return 1;
6569}
6570
6571static int
e3bb37b5 6572check_long_reg (void)
29b0f896
AM
6573{
6574 int op;
6575
6576 for (op = i.operands; --op >= 0;)
dc821c5f 6577 /* Skip non-register operands. */
bab6aec1 6578 if (i.types[op].bitfield.class != Reg)
dc821c5f 6579 continue;
29b0f896
AM
6580 /* Reject eight bit registers, except where the template requires
6581 them. (eg. movzb) */
dc821c5f 6582 else if (i.types[op].bitfield.byte
bab6aec1 6583 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6584 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
6585 && (i.tm.operand_types[op].bitfield.word
6586 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6587 {
a540244d
L
6588 as_bad (_("`%s%s' not allowed with `%s%c'"),
6589 register_prefix,
29b0f896
AM
6590 i.op[op].regs->reg_name,
6591 i.tm.name,
6592 i.suffix);
6593 return 0;
6594 }
e4630f71 6595 /* Warn if the e prefix on a general reg is missing. */
29b0f896 6596 else if ((!quiet_warnings || flag_code == CODE_64BIT)
dc821c5f 6597 && i.types[op].bitfield.word
bab6aec1 6598 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6599 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 6600 && i.tm.operand_types[op].bitfield.dword)
29b0f896
AM
6601 {
6602 /* Prohibit these changes in the 64bit mode, since the
6603 lowering is more complicated. */
6604 if (flag_code == CODE_64BIT)
252b5132 6605 {
2b5d6a91 6606 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
2ca3ace5 6607 register_prefix, i.op[op].regs->reg_name,
29b0f896
AM
6608 i.suffix);
6609 return 0;
252b5132 6610 }
29b0f896 6611#if REGISTER_WARNINGS
cecf1424
JB
6612 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
6613 register_prefix,
6614 (i.op[op].regs + REGNAM_EAX - REGNAM_AX)->reg_name,
6615 register_prefix, i.op[op].regs->reg_name, i.suffix);
29b0f896 6616#endif
252b5132 6617 }
e4630f71 6618 /* Warn if the r prefix on a general reg is present. */
dc821c5f 6619 else if (i.types[op].bitfield.qword
bab6aec1 6620 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6621 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 6622 && i.tm.operand_types[op].bitfield.dword)
252b5132 6623 {
34828aad 6624 if (intel_syntax
ca61edf2 6625 && i.tm.opcode_modifier.toqword
3528c362 6626 && i.types[0].bitfield.class != RegSIMD)
34828aad 6627 {
ca61edf2 6628 /* Convert to QWORD. We want REX byte. */
34828aad
L
6629 i.suffix = QWORD_MNEM_SUFFIX;
6630 }
6631 else
6632 {
2b5d6a91 6633 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
6634 register_prefix, i.op[op].regs->reg_name,
6635 i.suffix);
6636 return 0;
6637 }
29b0f896
AM
6638 }
6639 return 1;
6640}
252b5132 6641
29b0f896 6642static int
e3bb37b5 6643check_qword_reg (void)
29b0f896
AM
6644{
6645 int op;
252b5132 6646
29b0f896 6647 for (op = i.operands; --op >= 0; )
dc821c5f 6648 /* Skip non-register operands. */
bab6aec1 6649 if (i.types[op].bitfield.class != Reg)
dc821c5f 6650 continue;
29b0f896
AM
6651 /* Reject eight bit registers, except where the template requires
6652 them. (eg. movzb) */
dc821c5f 6653 else if (i.types[op].bitfield.byte
bab6aec1 6654 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6655 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
6656 && (i.tm.operand_types[op].bitfield.word
6657 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6658 {
a540244d
L
6659 as_bad (_("`%s%s' not allowed with `%s%c'"),
6660 register_prefix,
29b0f896
AM
6661 i.op[op].regs->reg_name,
6662 i.tm.name,
6663 i.suffix);
6664 return 0;
6665 }
e4630f71 6666 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
6667 else if ((i.types[op].bitfield.word
6668 || i.types[op].bitfield.dword)
bab6aec1 6669 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6670 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 6671 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
6672 {
6673 /* Prohibit these changes in the 64bit mode, since the
6674 lowering is more complicated. */
34828aad 6675 if (intel_syntax
ca61edf2 6676 && i.tm.opcode_modifier.todword
3528c362 6677 && i.types[0].bitfield.class != RegSIMD)
34828aad 6678 {
ca61edf2 6679 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
6680 i.suffix = LONG_MNEM_SUFFIX;
6681 }
6682 else
6683 {
2b5d6a91 6684 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
6685 register_prefix, i.op[op].regs->reg_name,
6686 i.suffix);
6687 return 0;
6688 }
252b5132 6689 }
29b0f896
AM
6690 return 1;
6691}
252b5132 6692
29b0f896 6693static int
e3bb37b5 6694check_word_reg (void)
29b0f896
AM
6695{
6696 int op;
6697 for (op = i.operands; --op >= 0;)
dc821c5f 6698 /* Skip non-register operands. */
bab6aec1 6699 if (i.types[op].bitfield.class != Reg)
dc821c5f 6700 continue;
29b0f896
AM
6701 /* Reject eight bit registers, except where the template requires
6702 them. (eg. movzb) */
dc821c5f 6703 else if (i.types[op].bitfield.byte
bab6aec1 6704 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6705 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
6706 && (i.tm.operand_types[op].bitfield.word
6707 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6708 {
a540244d
L
6709 as_bad (_("`%s%s' not allowed with `%s%c'"),
6710 register_prefix,
29b0f896
AM
6711 i.op[op].regs->reg_name,
6712 i.tm.name,
6713 i.suffix);
6714 return 0;
6715 }
e4630f71 6716 /* Warn if the e or r prefix on a general reg is present. */
29b0f896 6717 else if ((!quiet_warnings || flag_code == CODE_64BIT)
dc821c5f
JB
6718 && (i.types[op].bitfield.dword
6719 || i.types[op].bitfield.qword)
bab6aec1 6720 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6721 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 6722 && i.tm.operand_types[op].bitfield.word)
252b5132 6723 {
29b0f896
AM
6724 /* Prohibit these changes in the 64bit mode, since the
6725 lowering is more complicated. */
6726 if (flag_code == CODE_64BIT)
252b5132 6727 {
2b5d6a91 6728 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
2ca3ace5 6729 register_prefix, i.op[op].regs->reg_name,
29b0f896
AM
6730 i.suffix);
6731 return 0;
252b5132 6732 }
29b0f896 6733#if REGISTER_WARNINGS
cecf1424
JB
6734 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
6735 register_prefix,
6736 (i.op[op].regs + REGNAM_AX - REGNAM_EAX)->reg_name,
6737 register_prefix, i.op[op].regs->reg_name, i.suffix);
29b0f896
AM
6738#endif
6739 }
6740 return 1;
6741}
252b5132 6742
29b0f896 6743static int
40fb9820 6744update_imm (unsigned int j)
29b0f896 6745{
bc0844ae 6746 i386_operand_type overlap = i.types[j];
40fb9820
L
6747 if ((overlap.bitfield.imm8
6748 || overlap.bitfield.imm8s
6749 || overlap.bitfield.imm16
6750 || overlap.bitfield.imm32
6751 || overlap.bitfield.imm32s
6752 || overlap.bitfield.imm64)
0dfbf9d7
L
6753 && !operand_type_equal (&overlap, &imm8)
6754 && !operand_type_equal (&overlap, &imm8s)
6755 && !operand_type_equal (&overlap, &imm16)
6756 && !operand_type_equal (&overlap, &imm32)
6757 && !operand_type_equal (&overlap, &imm32s)
6758 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
6759 {
6760 if (i.suffix)
6761 {
40fb9820
L
6762 i386_operand_type temp;
6763
0dfbf9d7 6764 operand_type_set (&temp, 0);
7ab9ffdd 6765 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
6766 {
6767 temp.bitfield.imm8 = overlap.bitfield.imm8;
6768 temp.bitfield.imm8s = overlap.bitfield.imm8s;
6769 }
6770 else if (i.suffix == WORD_MNEM_SUFFIX)
6771 temp.bitfield.imm16 = overlap.bitfield.imm16;
6772 else if (i.suffix == QWORD_MNEM_SUFFIX)
6773 {
6774 temp.bitfield.imm64 = overlap.bitfield.imm64;
6775 temp.bitfield.imm32s = overlap.bitfield.imm32s;
6776 }
6777 else
6778 temp.bitfield.imm32 = overlap.bitfield.imm32;
6779 overlap = temp;
29b0f896 6780 }
0dfbf9d7
L
6781 else if (operand_type_equal (&overlap, &imm16_32_32s)
6782 || operand_type_equal (&overlap, &imm16_32)
6783 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 6784 {
40fb9820 6785 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 6786 overlap = imm16;
40fb9820 6787 else
65da13b5 6788 overlap = imm32s;
29b0f896 6789 }
0dfbf9d7
L
6790 if (!operand_type_equal (&overlap, &imm8)
6791 && !operand_type_equal (&overlap, &imm8s)
6792 && !operand_type_equal (&overlap, &imm16)
6793 && !operand_type_equal (&overlap, &imm32)
6794 && !operand_type_equal (&overlap, &imm32s)
6795 && !operand_type_equal (&overlap, &imm64))
29b0f896 6796 {
4eed87de
AM
6797 as_bad (_("no instruction mnemonic suffix given; "
6798 "can't determine immediate size"));
29b0f896
AM
6799 return 0;
6800 }
6801 }
40fb9820 6802 i.types[j] = overlap;
29b0f896 6803
40fb9820
L
6804 return 1;
6805}
6806
6807static int
6808finalize_imm (void)
6809{
bc0844ae 6810 unsigned int j, n;
29b0f896 6811
bc0844ae
L
6812 /* Update the first 2 immediate operands. */
6813 n = i.operands > 2 ? 2 : i.operands;
6814 if (n)
6815 {
6816 for (j = 0; j < n; j++)
6817 if (update_imm (j) == 0)
6818 return 0;
40fb9820 6819
bc0844ae
L
6820 /* The 3rd operand can't be immediate operand. */
6821 gas_assert (operand_type_check (i.types[2], imm) == 0);
6822 }
29b0f896
AM
6823
6824 return 1;
6825}
6826
6827static int
e3bb37b5 6828process_operands (void)
29b0f896
AM
6829{
6830 /* Default segment register this instruction will use for memory
6831 accesses. 0 means unknown. This is only for optimizing out
6832 unnecessary segment overrides. */
6833 const seg_entry *default_seg = 0;
6834
2426c15f 6835 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 6836 {
91d6fa6a
NC
6837 unsigned int dupl = i.operands;
6838 unsigned int dest = dupl - 1;
9fcfb3d7
L
6839 unsigned int j;
6840
c0f3af97 6841 /* The destination must be an xmm register. */
9c2799c2 6842 gas_assert (i.reg_operands
91d6fa6a 6843 && MAX_OPERANDS > dupl
7ab9ffdd 6844 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 6845
75e5731b 6846 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 6847 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 6848 {
8cd7925b 6849 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
6850 {
6851 /* Keep xmm0 for instructions with VEX prefix and 3
6852 sources. */
75e5731b 6853 i.tm.operand_types[0].bitfield.instance = InstanceNone;
3528c362 6854 i.tm.operand_types[0].bitfield.class = RegSIMD;
c0f3af97
L
6855 goto duplicate;
6856 }
e2ec9d29 6857 else
c0f3af97
L
6858 {
6859 /* We remove the first xmm0 and keep the number of
6860 operands unchanged, which in fact duplicates the
6861 destination. */
6862 for (j = 1; j < i.operands; j++)
6863 {
6864 i.op[j - 1] = i.op[j];
6865 i.types[j - 1] = i.types[j];
6866 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
8dc0818e 6867 i.flags[j - 1] = i.flags[j];
c0f3af97
L
6868 }
6869 }
6870 }
6871 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 6872 {
91d6fa6a 6873 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
6874 && (i.tm.opcode_modifier.vexsources
6875 == VEX3SOURCES));
c0f3af97
L
6876
6877 /* Add the implicit xmm0 for instructions with VEX prefix
6878 and 3 sources. */
6879 for (j = i.operands; j > 0; j--)
6880 {
6881 i.op[j] = i.op[j - 1];
6882 i.types[j] = i.types[j - 1];
6883 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 6884 i.flags[j] = i.flags[j - 1];
c0f3af97
L
6885 }
6886 i.op[0].regs
6887 = (const reg_entry *) hash_find (reg_hash, "xmm0");
7ab9ffdd 6888 i.types[0] = regxmm;
c0f3af97
L
6889 i.tm.operand_types[0] = regxmm;
6890
6891 i.operands += 2;
6892 i.reg_operands += 2;
6893 i.tm.operands += 2;
6894
91d6fa6a 6895 dupl++;
c0f3af97 6896 dest++;
91d6fa6a
NC
6897 i.op[dupl] = i.op[dest];
6898 i.types[dupl] = i.types[dest];
6899 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 6900 i.flags[dupl] = i.flags[dest];
e2ec9d29 6901 }
c0f3af97
L
6902 else
6903 {
6904duplicate:
6905 i.operands++;
6906 i.reg_operands++;
6907 i.tm.operands++;
6908
91d6fa6a
NC
6909 i.op[dupl] = i.op[dest];
6910 i.types[dupl] = i.types[dest];
6911 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 6912 i.flags[dupl] = i.flags[dest];
c0f3af97
L
6913 }
6914
6915 if (i.tm.opcode_modifier.immext)
6916 process_immext ();
6917 }
75e5731b 6918 else if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 6919 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
6920 {
6921 unsigned int j;
6922
9fcfb3d7
L
6923 for (j = 1; j < i.operands; j++)
6924 {
6925 i.op[j - 1] = i.op[j];
6926 i.types[j - 1] = i.types[j];
6927
6928 /* We need to adjust fields in i.tm since they are used by
6929 build_modrm_byte. */
6930 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
6931
6932 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
6933 }
6934
e2ec9d29
L
6935 i.operands--;
6936 i.reg_operands--;
e2ec9d29
L
6937 i.tm.operands--;
6938 }
920d2ddc
IT
6939 else if (i.tm.opcode_modifier.implicitquadgroup)
6940 {
a477a8c4
JB
6941 unsigned int regnum, first_reg_in_group, last_reg_in_group;
6942
920d2ddc 6943 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 6944 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
6945 regnum = register_number (i.op[1].regs);
6946 first_reg_in_group = regnum & ~3;
6947 last_reg_in_group = first_reg_in_group + 3;
6948 if (regnum != first_reg_in_group)
6949 as_warn (_("source register `%s%s' implicitly denotes"
6950 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
6951 register_prefix, i.op[1].regs->reg_name,
6952 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
6953 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
6954 i.tm.name);
6955 }
e2ec9d29
L
6956 else if (i.tm.opcode_modifier.regkludge)
6957 {
6958 /* The imul $imm, %reg instruction is converted into
6959 imul $imm, %reg, %reg, and the clr %reg instruction
6960 is converted into xor %reg, %reg. */
6961
6962 unsigned int first_reg_op;
6963
6964 if (operand_type_check (i.types[0], reg))
6965 first_reg_op = 0;
6966 else
6967 first_reg_op = 1;
6968 /* Pretend we saw the extra register operand. */
9c2799c2 6969 gas_assert (i.reg_operands == 1
7ab9ffdd 6970 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
6971 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
6972 i.types[first_reg_op + 1] = i.types[first_reg_op];
6973 i.operands++;
6974 i.reg_operands++;
29b0f896
AM
6975 }
6976
85b80b0f 6977 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
6978 {
6979 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
6980 must be put into the modrm byte). Now, we make the modrm and
6981 index base bytes based on all the info we've collected. */
29b0f896
AM
6982
6983 default_seg = build_modrm_byte ();
6984 }
00cee14f 6985 else if (i.types[0].bitfield.class == SReg)
85b80b0f
JB
6986 {
6987 if (flag_code != CODE_64BIT
6988 ? i.tm.base_opcode == POP_SEG_SHORT
6989 && i.op[0].regs->reg_num == 1
6990 : (i.tm.base_opcode | 1) == POP_SEG386_SHORT
6991 && i.op[0].regs->reg_num < 4)
6992 {
6993 as_bad (_("you can't `%s %s%s'"),
6994 i.tm.name, register_prefix, i.op[0].regs->reg_name);
6995 return 0;
6996 }
6997 if ( i.op[0].regs->reg_num > 3 && i.tm.opcode_length == 1 )
6998 {
6999 i.tm.base_opcode ^= POP_SEG_SHORT ^ POP_SEG386_SHORT;
7000 i.tm.opcode_length = 2;
7001 }
7002 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
7003 }
8a2ed489 7004 else if ((i.tm.base_opcode & ~0x3) == MOV_AX_DISP32)
29b0f896
AM
7005 {
7006 default_seg = &ds;
7007 }
40fb9820 7008 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
7009 {
7010 /* For the string instructions that allow a segment override
7011 on one of their operands, the default segment is ds. */
7012 default_seg = &ds;
7013 }
85b80b0f
JB
7014 else if (i.tm.opcode_modifier.shortform)
7015 {
7016 /* The register or float register operand is in operand
7017 0 or 1. */
bab6aec1 7018 unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
85b80b0f
JB
7019
7020 /* Register goes in low 3 bits of opcode. */
7021 i.tm.base_opcode |= i.op[op].regs->reg_num;
7022 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7023 i.rex |= REX_B;
7024 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
7025 {
7026 /* Warn about some common errors, but press on regardless.
7027 The first case can be generated by gcc (<= 2.8.1). */
7028 if (i.operands == 2)
7029 {
7030 /* Reversed arguments on faddp, fsubp, etc. */
7031 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
7032 register_prefix, i.op[!intel_syntax].regs->reg_name,
7033 register_prefix, i.op[intel_syntax].regs->reg_name);
7034 }
7035 else
7036 {
7037 /* Extraneous `l' suffix on fp insn. */
7038 as_warn (_("translating to `%s %s%s'"), i.tm.name,
7039 register_prefix, i.op[0].regs->reg_name);
7040 }
7041 }
7042 }
29b0f896 7043
75178d9d
L
7044 if (i.tm.base_opcode == 0x8d /* lea */
7045 && i.seg[0]
7046 && !quiet_warnings)
30123838 7047 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
52271982
AM
7048
7049 /* If a segment was explicitly specified, and the specified segment
7050 is not the default, use an opcode prefix to select it. If we
7051 never figured out what the default segment is, then default_seg
7052 will be zero at this point, and the specified segment prefix will
7053 always be used. */
29b0f896
AM
7054 if ((i.seg[0]) && (i.seg[0] != default_seg))
7055 {
7056 if (!add_prefix (i.seg[0]->seg_prefix))
7057 return 0;
7058 }
7059 return 1;
7060}
7061
7062static const seg_entry *
e3bb37b5 7063build_modrm_byte (void)
29b0f896
AM
7064{
7065 const seg_entry *default_seg = 0;
c0f3af97 7066 unsigned int source, dest;
8cd7925b 7067 int vex_3_sources;
c0f3af97 7068
8cd7925b 7069 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
7070 if (vex_3_sources)
7071 {
91d6fa6a 7072 unsigned int nds, reg_slot;
4c2c6516 7073 expressionS *exp;
c0f3af97 7074
6b8d3588 7075 dest = i.operands - 1;
c0f3af97 7076 nds = dest - 1;
922d8de8 7077
a683cc34 7078 /* There are 2 kinds of instructions:
bed3d976 7079 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 7080 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 7081 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 7082 ZMM register.
bed3d976 7083 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 7084 plus 1 memory operand, with VexXDS. */
922d8de8 7085 gas_assert ((i.reg_operands == 4
bed3d976
JB
7086 || (i.reg_operands == 3 && i.mem_operands == 1))
7087 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323 7088 && i.tm.opcode_modifier.vexw
3528c362 7089 && i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 7090
48db9223
JB
7091 /* If VexW1 is set, the first non-immediate operand is the source and
7092 the second non-immediate one is encoded in the immediate operand. */
7093 if (i.tm.opcode_modifier.vexw == VEXW1)
7094 {
7095 source = i.imm_operands;
7096 reg_slot = i.imm_operands + 1;
7097 }
7098 else
7099 {
7100 source = i.imm_operands + 1;
7101 reg_slot = i.imm_operands;
7102 }
7103
a683cc34 7104 if (i.imm_operands == 0)
bed3d976
JB
7105 {
7106 /* When there is no immediate operand, generate an 8bit
7107 immediate operand to encode the first operand. */
7108 exp = &im_expressions[i.imm_operands++];
7109 i.op[i.operands].imms = exp;
7110 i.types[i.operands] = imm8;
7111 i.operands++;
7112
3528c362 7113 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
bed3d976
JB
7114 exp->X_op = O_constant;
7115 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
7116 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
7117 }
922d8de8 7118 else
bed3d976 7119 {
9d3bf266
JB
7120 gas_assert (i.imm_operands == 1);
7121 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
7122 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 7123
9d3bf266
JB
7124 /* Turn on Imm8 again so that output_imm will generate it. */
7125 i.types[0].bitfield.imm8 = 1;
bed3d976 7126
3528c362 7127 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
9d3bf266 7128 i.op[0].imms->X_add_number
bed3d976 7129 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 7130 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 7131 }
a683cc34 7132
3528c362 7133 gas_assert (i.tm.operand_types[nds].bitfield.class == RegSIMD);
dae39acc 7134 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
7135 }
7136 else
7137 source = dest = 0;
29b0f896
AM
7138
7139 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
7140 implicit registers do not count. If there are 3 register
7141 operands, it must be a instruction with VexNDS. For a
7142 instruction with VexNDD, the destination register is encoded
7143 in VEX prefix. If there are 4 register operands, it must be
7144 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
7145 if (i.mem_operands == 0
7146 && ((i.reg_operands == 2
2426c15f 7147 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 7148 || (i.reg_operands == 3
2426c15f 7149 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 7150 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 7151 {
cab737b9
L
7152 switch (i.operands)
7153 {
7154 case 2:
7155 source = 0;
7156 break;
7157 case 3:
c81128dc
L
7158 /* When there are 3 operands, one of them may be immediate,
7159 which may be the first or the last operand. Otherwise,
c0f3af97
L
7160 the first operand must be shift count register (cl) or it
7161 is an instruction with VexNDS. */
9c2799c2 7162 gas_assert (i.imm_operands == 1
7ab9ffdd 7163 || (i.imm_operands == 0
2426c15f 7164 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
75e5731b
JB
7165 || (i.types[0].bitfield.instance == RegC
7166 && i.types[0].bitfield.byte))));
40fb9820 7167 if (operand_type_check (i.types[0], imm)
75e5731b
JB
7168 || (i.types[0].bitfield.instance == RegC
7169 && i.types[0].bitfield.byte))
40fb9820
L
7170 source = 1;
7171 else
7172 source = 0;
cab737b9
L
7173 break;
7174 case 4:
368d64cc
L
7175 /* When there are 4 operands, the first two must be 8bit
7176 immediate operands. The source operand will be the 3rd
c0f3af97
L
7177 one.
7178
7179 For instructions with VexNDS, if the first operand
7180 an imm8, the source operand is the 2nd one. If the last
7181 operand is imm8, the source operand is the first one. */
9c2799c2 7182 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
7183 && i.types[0].bitfield.imm8
7184 && i.types[1].bitfield.imm8)
2426c15f 7185 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
7186 && i.imm_operands == 1
7187 && (i.types[0].bitfield.imm8
43234a1e
L
7188 || i.types[i.operands - 1].bitfield.imm8
7189 || i.rounding)));
9f2670f2
L
7190 if (i.imm_operands == 2)
7191 source = 2;
7192 else
c0f3af97
L
7193 {
7194 if (i.types[0].bitfield.imm8)
7195 source = 1;
7196 else
7197 source = 0;
7198 }
c0f3af97
L
7199 break;
7200 case 5:
e771e7c9 7201 if (is_evex_encoding (&i.tm))
43234a1e
L
7202 {
7203 /* For EVEX instructions, when there are 5 operands, the
7204 first one must be immediate operand. If the second one
7205 is immediate operand, the source operand is the 3th
7206 one. If the last one is immediate operand, the source
7207 operand is the 2nd one. */
7208 gas_assert (i.imm_operands == 2
7209 && i.tm.opcode_modifier.sae
7210 && operand_type_check (i.types[0], imm));
7211 if (operand_type_check (i.types[1], imm))
7212 source = 2;
7213 else if (operand_type_check (i.types[4], imm))
7214 source = 1;
7215 else
7216 abort ();
7217 }
cab737b9
L
7218 break;
7219 default:
7220 abort ();
7221 }
7222
c0f3af97
L
7223 if (!vex_3_sources)
7224 {
7225 dest = source + 1;
7226
43234a1e
L
7227 /* RC/SAE operand could be between DEST and SRC. That happens
7228 when one operand is GPR and the other one is XMM/YMM/ZMM
7229 register. */
7230 if (i.rounding && i.rounding->operand == (int) dest)
7231 dest++;
7232
2426c15f 7233 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 7234 {
43234a1e 7235 /* For instructions with VexNDS, the register-only source
c5d0745b 7236 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
dfd69174 7237 register. It is encoded in VEX prefix. */
f12dc422
L
7238
7239 i386_operand_type op;
7240 unsigned int vvvv;
7241
7242 /* Check register-only source operand when two source
7243 operands are swapped. */
7244 if (!i.tm.operand_types[source].bitfield.baseindex
7245 && i.tm.operand_types[dest].bitfield.baseindex)
7246 {
7247 vvvv = source;
7248 source = dest;
7249 }
7250 else
7251 vvvv = dest;
7252
7253 op = i.tm.operand_types[vvvv];
c0f3af97 7254 if ((dest + 1) >= i.operands
bab6aec1 7255 || ((op.bitfield.class != Reg
dc821c5f 7256 || (!op.bitfield.dword && !op.bitfield.qword))
3528c362 7257 && op.bitfield.class != RegSIMD
43234a1e 7258 && !operand_type_equal (&op, &regmask)))
c0f3af97 7259 abort ();
f12dc422 7260 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
7261 dest++;
7262 }
7263 }
29b0f896
AM
7264
7265 i.rm.mode = 3;
dfd69174
JB
7266 /* One of the register operands will be encoded in the i.rm.reg
7267 field, the other in the combined i.rm.mode and i.rm.regmem
29b0f896
AM
7268 fields. If no form of this instruction supports a memory
7269 destination operand, then we assume the source operand may
7270 sometimes be a memory operand and so we need to store the
7271 destination in the i.rm.reg field. */
dfd69174 7272 if (!i.tm.opcode_modifier.regmem
40fb9820 7273 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
7274 {
7275 i.rm.reg = i.op[dest].regs->reg_num;
7276 i.rm.regmem = i.op[source].regs->reg_num;
3528c362
JB
7277 if (i.op[dest].regs->reg_type.bitfield.class == RegMMX
7278 || i.op[source].regs->reg_type.bitfield.class == RegMMX)
b4a3a7b4 7279 i.has_regmmx = TRUE;
3528c362
JB
7280 else if (i.op[dest].regs->reg_type.bitfield.class == RegSIMD
7281 || i.op[source].regs->reg_type.bitfield.class == RegSIMD)
b4a3a7b4
L
7282 {
7283 if (i.types[dest].bitfield.zmmword
7284 || i.types[source].bitfield.zmmword)
7285 i.has_regzmm = TRUE;
7286 else if (i.types[dest].bitfield.ymmword
7287 || i.types[source].bitfield.ymmword)
7288 i.has_regymm = TRUE;
7289 else
7290 i.has_regxmm = TRUE;
7291 }
29b0f896 7292 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 7293 i.rex |= REX_R;
43234a1e
L
7294 if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
7295 i.vrex |= REX_R;
29b0f896 7296 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 7297 i.rex |= REX_B;
43234a1e
L
7298 if ((i.op[source].regs->reg_flags & RegVRex) != 0)
7299 i.vrex |= REX_B;
29b0f896
AM
7300 }
7301 else
7302 {
7303 i.rm.reg = i.op[source].regs->reg_num;
7304 i.rm.regmem = i.op[dest].regs->reg_num;
7305 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 7306 i.rex |= REX_B;
43234a1e
L
7307 if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
7308 i.vrex |= REX_B;
29b0f896 7309 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 7310 i.rex |= REX_R;
43234a1e
L
7311 if ((i.op[source].regs->reg_flags & RegVRex) != 0)
7312 i.vrex |= REX_R;
29b0f896 7313 }
e0c7f900 7314 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 7315 {
4a5c67ed 7316 if (i.types[!i.tm.opcode_modifier.regmem].bitfield.class != RegCR)
c4a530c5 7317 abort ();
e0c7f900 7318 i.rex &= ~REX_R;
c4a530c5
JB
7319 add_prefix (LOCK_PREFIX_OPCODE);
7320 }
29b0f896
AM
7321 }
7322 else
7323 { /* If it's not 2 reg operands... */
c0f3af97
L
7324 unsigned int mem;
7325
29b0f896
AM
7326 if (i.mem_operands)
7327 {
7328 unsigned int fake_zero_displacement = 0;
99018f42 7329 unsigned int op;
4eed87de 7330
7ab9ffdd 7331 for (op = 0; op < i.operands; op++)
8dc0818e 7332 if (i.flags[op] & Operand_Mem)
7ab9ffdd 7333 break;
7ab9ffdd 7334 gas_assert (op < i.operands);
29b0f896 7335
6c30d220
L
7336 if (i.tm.opcode_modifier.vecsib)
7337 {
e968fc9b 7338 if (i.index_reg->reg_num == RegIZ)
6c30d220
L
7339 abort ();
7340
7341 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7342 if (!i.base_reg)
7343 {
7344 i.sib.base = NO_BASE_REGISTER;
7345 i.sib.scale = i.log2_scale_factor;
7346 i.types[op].bitfield.disp8 = 0;
7347 i.types[op].bitfield.disp16 = 0;
7348 i.types[op].bitfield.disp64 = 0;
43083a50 7349 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
6c30d220
L
7350 {
7351 /* Must be 32 bit */
7352 i.types[op].bitfield.disp32 = 1;
7353 i.types[op].bitfield.disp32s = 0;
7354 }
7355 else
7356 {
7357 i.types[op].bitfield.disp32 = 0;
7358 i.types[op].bitfield.disp32s = 1;
7359 }
7360 }
7361 i.sib.index = i.index_reg->reg_num;
7362 if ((i.index_reg->reg_flags & RegRex) != 0)
7363 i.rex |= REX_X;
43234a1e
L
7364 if ((i.index_reg->reg_flags & RegVRex) != 0)
7365 i.vrex |= REX_X;
6c30d220
L
7366 }
7367
29b0f896
AM
7368 default_seg = &ds;
7369
7370 if (i.base_reg == 0)
7371 {
7372 i.rm.mode = 0;
7373 if (!i.disp_operands)
9bb129e8 7374 fake_zero_displacement = 1;
29b0f896
AM
7375 if (i.index_reg == 0)
7376 {
73053c1f
JB
7377 i386_operand_type newdisp;
7378
6c30d220 7379 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 7380 /* Operand is just <disp> */
20f0a1fc 7381 if (flag_code == CODE_64BIT)
29b0f896
AM
7382 {
7383 /* 64bit mode overwrites the 32bit absolute
7384 addressing by RIP relative addressing and
7385 absolute addressing is encoded by one of the
7386 redundant SIB forms. */
7387 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7388 i.sib.base = NO_BASE_REGISTER;
7389 i.sib.index = NO_INDEX_REGISTER;
73053c1f 7390 newdisp = (!i.prefix[ADDR_PREFIX] ? disp32s : disp32);
20f0a1fc 7391 }
fc225355
L
7392 else if ((flag_code == CODE_16BIT)
7393 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
7394 {
7395 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 7396 newdisp = disp16;
20f0a1fc
NC
7397 }
7398 else
7399 {
7400 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 7401 newdisp = disp32;
29b0f896 7402 }
73053c1f
JB
7403 i.types[op] = operand_type_and_not (i.types[op], anydisp);
7404 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 7405 }
6c30d220 7406 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 7407 {
6c30d220 7408 /* !i.base_reg && i.index_reg */
e968fc9b 7409 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
7410 i.sib.index = NO_INDEX_REGISTER;
7411 else
7412 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
7413 i.sib.base = NO_BASE_REGISTER;
7414 i.sib.scale = i.log2_scale_factor;
7415 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
7416 i.types[op].bitfield.disp8 = 0;
7417 i.types[op].bitfield.disp16 = 0;
7418 i.types[op].bitfield.disp64 = 0;
43083a50 7419 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
40fb9820
L
7420 {
7421 /* Must be 32 bit */
7422 i.types[op].bitfield.disp32 = 1;
7423 i.types[op].bitfield.disp32s = 0;
7424 }
29b0f896 7425 else
40fb9820
L
7426 {
7427 i.types[op].bitfield.disp32 = 0;
7428 i.types[op].bitfield.disp32s = 1;
7429 }
29b0f896 7430 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 7431 i.rex |= REX_X;
29b0f896
AM
7432 }
7433 }
7434 /* RIP addressing for 64bit mode. */
e968fc9b 7435 else if (i.base_reg->reg_num == RegIP)
29b0f896 7436 {
6c30d220 7437 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 7438 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
7439 i.types[op].bitfield.disp8 = 0;
7440 i.types[op].bitfield.disp16 = 0;
7441 i.types[op].bitfield.disp32 = 0;
7442 i.types[op].bitfield.disp32s = 1;
7443 i.types[op].bitfield.disp64 = 0;
71903a11 7444 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
7445 if (! i.disp_operands)
7446 fake_zero_displacement = 1;
29b0f896 7447 }
dc821c5f 7448 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 7449 {
6c30d220 7450 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
7451 switch (i.base_reg->reg_num)
7452 {
7453 case 3: /* (%bx) */
7454 if (i.index_reg == 0)
7455 i.rm.regmem = 7;
7456 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
7457 i.rm.regmem = i.index_reg->reg_num - 6;
7458 break;
7459 case 5: /* (%bp) */
7460 default_seg = &ss;
7461 if (i.index_reg == 0)
7462 {
7463 i.rm.regmem = 6;
40fb9820 7464 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
7465 {
7466 /* fake (%bp) into 0(%bp) */
b5014f7a 7467 i.types[op].bitfield.disp8 = 1;
252b5132 7468 fake_zero_displacement = 1;
29b0f896
AM
7469 }
7470 }
7471 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
7472 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
7473 break;
7474 default: /* (%si) -> 4 or (%di) -> 5 */
7475 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
7476 }
7477 i.rm.mode = mode_from_disp_size (i.types[op]);
7478 }
7479 else /* i.base_reg and 32/64 bit mode */
7480 {
7481 if (flag_code == CODE_64BIT
40fb9820
L
7482 && operand_type_check (i.types[op], disp))
7483 {
73053c1f
JB
7484 i.types[op].bitfield.disp16 = 0;
7485 i.types[op].bitfield.disp64 = 0;
40fb9820 7486 if (i.prefix[ADDR_PREFIX] == 0)
73053c1f
JB
7487 {
7488 i.types[op].bitfield.disp32 = 0;
7489 i.types[op].bitfield.disp32s = 1;
7490 }
40fb9820 7491 else
73053c1f
JB
7492 {
7493 i.types[op].bitfield.disp32 = 1;
7494 i.types[op].bitfield.disp32s = 0;
7495 }
40fb9820 7496 }
20f0a1fc 7497
6c30d220
L
7498 if (!i.tm.opcode_modifier.vecsib)
7499 i.rm.regmem = i.base_reg->reg_num;
29b0f896 7500 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 7501 i.rex |= REX_B;
29b0f896
AM
7502 i.sib.base = i.base_reg->reg_num;
7503 /* x86-64 ignores REX prefix bit here to avoid decoder
7504 complications. */
848930b2
JB
7505 if (!(i.base_reg->reg_flags & RegRex)
7506 && (i.base_reg->reg_num == EBP_REG_NUM
7507 || i.base_reg->reg_num == ESP_REG_NUM))
29b0f896 7508 default_seg = &ss;
848930b2 7509 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 7510 {
848930b2 7511 fake_zero_displacement = 1;
b5014f7a 7512 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
7513 }
7514 i.sib.scale = i.log2_scale_factor;
7515 if (i.index_reg == 0)
7516 {
6c30d220 7517 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
7518 /* <disp>(%esp) becomes two byte modrm with no index
7519 register. We've already stored the code for esp
7520 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
7521 Any base register besides %esp will not use the
7522 extra modrm byte. */
7523 i.sib.index = NO_INDEX_REGISTER;
29b0f896 7524 }
6c30d220 7525 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 7526 {
e968fc9b 7527 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
7528 i.sib.index = NO_INDEX_REGISTER;
7529 else
7530 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
7531 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7532 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 7533 i.rex |= REX_X;
29b0f896 7534 }
67a4f2b7
AO
7535
7536 if (i.disp_operands
7537 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
7538 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
7539 i.rm.mode = 0;
7540 else
a501d77e
L
7541 {
7542 if (!fake_zero_displacement
7543 && !i.disp_operands
7544 && i.disp_encoding)
7545 {
7546 fake_zero_displacement = 1;
7547 if (i.disp_encoding == disp_encoding_8bit)
7548 i.types[op].bitfield.disp8 = 1;
7549 else
7550 i.types[op].bitfield.disp32 = 1;
7551 }
7552 i.rm.mode = mode_from_disp_size (i.types[op]);
7553 }
29b0f896 7554 }
252b5132 7555
29b0f896
AM
7556 if (fake_zero_displacement)
7557 {
7558 /* Fakes a zero displacement assuming that i.types[op]
7559 holds the correct displacement size. */
7560 expressionS *exp;
7561
9c2799c2 7562 gas_assert (i.op[op].disps == 0);
29b0f896
AM
7563 exp = &disp_expressions[i.disp_operands++];
7564 i.op[op].disps = exp;
7565 exp->X_op = O_constant;
7566 exp->X_add_number = 0;
7567 exp->X_add_symbol = (symbolS *) 0;
7568 exp->X_op_symbol = (symbolS *) 0;
7569 }
c0f3af97
L
7570
7571 mem = op;
29b0f896 7572 }
c0f3af97
L
7573 else
7574 mem = ~0;
252b5132 7575
8c43a48b 7576 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
7577 {
7578 if (operand_type_check (i.types[0], imm))
7579 i.vex.register_specifier = NULL;
7580 else
7581 {
7582 /* VEX.vvvv encodes one of the sources when the first
7583 operand is not an immediate. */
1ef99a7b 7584 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
7585 i.vex.register_specifier = i.op[0].regs;
7586 else
7587 i.vex.register_specifier = i.op[1].regs;
7588 }
7589
7590 /* Destination is a XMM register encoded in the ModRM.reg
7591 and VEX.R bit. */
7592 i.rm.reg = i.op[2].regs->reg_num;
7593 if ((i.op[2].regs->reg_flags & RegRex) != 0)
7594 i.rex |= REX_R;
7595
7596 /* ModRM.rm and VEX.B encodes the other source. */
7597 if (!i.mem_operands)
7598 {
7599 i.rm.mode = 3;
7600
1ef99a7b 7601 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
7602 i.rm.regmem = i.op[1].regs->reg_num;
7603 else
7604 i.rm.regmem = i.op[0].regs->reg_num;
7605
7606 if ((i.op[1].regs->reg_flags & RegRex) != 0)
7607 i.rex |= REX_B;
7608 }
7609 }
2426c15f 7610 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
7611 {
7612 i.vex.register_specifier = i.op[2].regs;
7613 if (!i.mem_operands)
7614 {
7615 i.rm.mode = 3;
7616 i.rm.regmem = i.op[1].regs->reg_num;
7617 if ((i.op[1].regs->reg_flags & RegRex) != 0)
7618 i.rex |= REX_B;
7619 }
7620 }
29b0f896
AM
7621 /* Fill in i.rm.reg or i.rm.regmem field with register operand
7622 (if any) based on i.tm.extension_opcode. Again, we must be
7623 careful to make sure that segment/control/debug/test/MMX
7624 registers are coded into the i.rm.reg field. */
f88c9eb0 7625 else if (i.reg_operands)
29b0f896 7626 {
99018f42 7627 unsigned int op;
7ab9ffdd
L
7628 unsigned int vex_reg = ~0;
7629
7630 for (op = 0; op < i.operands; op++)
b4a3a7b4 7631 {
bab6aec1 7632 if (i.types[op].bitfield.class == Reg
f74a6307
JB
7633 || i.types[op].bitfield.class == RegBND
7634 || i.types[op].bitfield.class == RegMask
00cee14f 7635 || i.types[op].bitfield.class == SReg
4a5c67ed
JB
7636 || i.types[op].bitfield.class == RegCR
7637 || i.types[op].bitfield.class == RegDR
7638 || i.types[op].bitfield.class == RegTR)
b4a3a7b4 7639 break;
3528c362 7640 if (i.types[op].bitfield.class == RegSIMD)
b4a3a7b4
L
7641 {
7642 if (i.types[op].bitfield.zmmword)
7643 i.has_regzmm = TRUE;
7644 else if (i.types[op].bitfield.ymmword)
7645 i.has_regymm = TRUE;
7646 else
7647 i.has_regxmm = TRUE;
7648 break;
7649 }
3528c362 7650 if (i.types[op].bitfield.class == RegMMX)
b4a3a7b4
L
7651 {
7652 i.has_regmmx = TRUE;
7653 break;
7654 }
7655 }
c0209578 7656
7ab9ffdd
L
7657 if (vex_3_sources)
7658 op = dest;
2426c15f 7659 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
7660 {
7661 /* For instructions with VexNDS, the register-only
7662 source operand is encoded in VEX prefix. */
7663 gas_assert (mem != (unsigned int) ~0);
c0f3af97 7664
7ab9ffdd 7665 if (op > mem)
c0f3af97 7666 {
7ab9ffdd
L
7667 vex_reg = op++;
7668 gas_assert (op < i.operands);
c0f3af97
L
7669 }
7670 else
c0f3af97 7671 {
f12dc422
L
7672 /* Check register-only source operand when two source
7673 operands are swapped. */
7674 if (!i.tm.operand_types[op].bitfield.baseindex
7675 && i.tm.operand_types[op + 1].bitfield.baseindex)
7676 {
7677 vex_reg = op;
7678 op += 2;
7679 gas_assert (mem == (vex_reg + 1)
7680 && op < i.operands);
7681 }
7682 else
7683 {
7684 vex_reg = op + 1;
7685 gas_assert (vex_reg < i.operands);
7686 }
c0f3af97 7687 }
7ab9ffdd 7688 }
2426c15f 7689 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 7690 {
f12dc422 7691 /* For instructions with VexNDD, the register destination
7ab9ffdd 7692 is encoded in VEX prefix. */
f12dc422
L
7693 if (i.mem_operands == 0)
7694 {
7695 /* There is no memory operand. */
7696 gas_assert ((op + 2) == i.operands);
7697 vex_reg = op + 1;
7698 }
7699 else
8d63c93e 7700 {
ed438a93
JB
7701 /* There are only 2 non-immediate operands. */
7702 gas_assert (op < i.imm_operands + 2
7703 && i.operands == i.imm_operands + 2);
7704 vex_reg = i.imm_operands + 1;
f12dc422 7705 }
7ab9ffdd
L
7706 }
7707 else
7708 gas_assert (op < i.operands);
99018f42 7709
7ab9ffdd
L
7710 if (vex_reg != (unsigned int) ~0)
7711 {
f12dc422 7712 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 7713
bab6aec1 7714 if ((type->bitfield.class != Reg
dc821c5f 7715 || (!type->bitfield.dword && !type->bitfield.qword))
3528c362 7716 && type->bitfield.class != RegSIMD
43234a1e 7717 && !operand_type_equal (type, &regmask))
7ab9ffdd 7718 abort ();
f88c9eb0 7719
7ab9ffdd
L
7720 i.vex.register_specifier = i.op[vex_reg].regs;
7721 }
7722
1b9f0c97
L
7723 /* Don't set OP operand twice. */
7724 if (vex_reg != op)
7ab9ffdd 7725 {
1b9f0c97
L
7726 /* If there is an extension opcode to put here, the
7727 register number must be put into the regmem field. */
7728 if (i.tm.extension_opcode != None)
7729 {
7730 i.rm.regmem = i.op[op].regs->reg_num;
7731 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7732 i.rex |= REX_B;
43234a1e
L
7733 if ((i.op[op].regs->reg_flags & RegVRex) != 0)
7734 i.vrex |= REX_B;
1b9f0c97
L
7735 }
7736 else
7737 {
7738 i.rm.reg = i.op[op].regs->reg_num;
7739 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7740 i.rex |= REX_R;
43234a1e
L
7741 if ((i.op[op].regs->reg_flags & RegVRex) != 0)
7742 i.vrex |= REX_R;
1b9f0c97 7743 }
7ab9ffdd 7744 }
252b5132 7745
29b0f896
AM
7746 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
7747 must set it to 3 to indicate this is a register operand
7748 in the regmem field. */
7749 if (!i.mem_operands)
7750 i.rm.mode = 3;
7751 }
252b5132 7752
29b0f896 7753 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 7754 if (i.tm.extension_opcode != None)
29b0f896
AM
7755 i.rm.reg = i.tm.extension_opcode;
7756 }
7757 return default_seg;
7758}
252b5132 7759
29b0f896 7760static void
e3bb37b5 7761output_branch (void)
29b0f896
AM
7762{
7763 char *p;
f8a5c266 7764 int size;
29b0f896
AM
7765 int code16;
7766 int prefix;
7767 relax_substateT subtype;
7768 symbolS *sym;
7769 offsetT off;
7770
f8a5c266 7771 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 7772 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
7773
7774 prefix = 0;
7775 if (i.prefix[DATA_PREFIX] != 0)
252b5132 7776 {
29b0f896
AM
7777 prefix = 1;
7778 i.prefixes -= 1;
7779 code16 ^= CODE16;
252b5132 7780 }
29b0f896
AM
7781 /* Pentium4 branch hints. */
7782 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
7783 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 7784 {
29b0f896
AM
7785 prefix++;
7786 i.prefixes--;
7787 }
7788 if (i.prefix[REX_PREFIX] != 0)
7789 {
7790 prefix++;
7791 i.prefixes--;
2f66722d
AM
7792 }
7793
7e8b059b
L
7794 /* BND prefixed jump. */
7795 if (i.prefix[BND_PREFIX] != 0)
7796 {
7797 FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
7798 i.prefixes -= 1;
7799 }
7800
29b0f896
AM
7801 if (i.prefixes != 0 && !intel_syntax)
7802 as_warn (_("skipping prefixes on this instruction"));
7803
7804 /* It's always a symbol; End frag & setup for relax.
7805 Make sure there is enough room in this frag for the largest
7806 instruction we may generate in md_convert_frag. This is 2
7807 bytes for the opcode and room for the prefix and largest
7808 displacement. */
7809 frag_grow (prefix + 2 + 4);
7810 /* Prefix and 1 opcode byte go in fr_fix. */
7811 p = frag_more (prefix + 1);
7812 if (i.prefix[DATA_PREFIX] != 0)
7813 *p++ = DATA_PREFIX_OPCODE;
7814 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
7815 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
7816 *p++ = i.prefix[SEG_PREFIX];
7817 if (i.prefix[REX_PREFIX] != 0)
7818 *p++ = i.prefix[REX_PREFIX];
7819 *p = i.tm.base_opcode;
7820
7821 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 7822 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 7823 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 7824 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 7825 else
f8a5c266 7826 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 7827 subtype |= code16;
3e73aa7c 7828
29b0f896
AM
7829 sym = i.op[0].disps->X_add_symbol;
7830 off = i.op[0].disps->X_add_number;
3e73aa7c 7831
29b0f896
AM
7832 if (i.op[0].disps->X_op != O_constant
7833 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 7834 {
29b0f896
AM
7835 /* Handle complex expressions. */
7836 sym = make_expr_symbol (i.op[0].disps);
7837 off = 0;
7838 }
3e73aa7c 7839
29b0f896
AM
7840 /* 1 possible extra opcode + 4 byte displacement go in var part.
7841 Pass reloc in fr_var. */
d258b828 7842 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 7843}
3e73aa7c 7844
bd7ab16b
L
7845#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7846/* Return TRUE iff PLT32 relocation should be used for branching to
7847 symbol S. */
7848
7849static bfd_boolean
7850need_plt32_p (symbolS *s)
7851{
7852 /* PLT32 relocation is ELF only. */
7853 if (!IS_ELF)
7854 return FALSE;
7855
a5def729
RO
7856#ifdef TE_SOLARIS
7857 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
7858 krtld support it. */
7859 return FALSE;
7860#endif
7861
bd7ab16b
L
7862 /* Since there is no need to prepare for PLT branch on x86-64, we
7863 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
7864 be used as a marker for 32-bit PC-relative branches. */
7865 if (!object_64bit)
7866 return FALSE;
7867
7868 /* Weak or undefined symbol need PLT32 relocation. */
7869 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
7870 return TRUE;
7871
7872 /* Non-global symbol doesn't need PLT32 relocation. */
7873 if (! S_IS_EXTERNAL (s))
7874 return FALSE;
7875
7876 /* Other global symbols need PLT32 relocation. NB: Symbol with
7877 non-default visibilities are treated as normal global symbol
7878 so that PLT32 relocation can be used as a marker for 32-bit
7879 PC-relative branches. It is useful for linker relaxation. */
7880 return TRUE;
7881}
7882#endif
7883
29b0f896 7884static void
e3bb37b5 7885output_jump (void)
29b0f896
AM
7886{
7887 char *p;
7888 int size;
3e02c1cc 7889 fixS *fixP;
bd7ab16b 7890 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 7891
40fb9820 7892 if (i.tm.opcode_modifier.jumpbyte)
29b0f896
AM
7893 {
7894 /* This is a loop or jecxz type instruction. */
7895 size = 1;
7896 if (i.prefix[ADDR_PREFIX] != 0)
7897 {
7898 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
7899 i.prefixes -= 1;
7900 }
7901 /* Pentium4 branch hints. */
7902 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
7903 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
7904 {
7905 FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
7906 i.prefixes--;
3e73aa7c
JH
7907 }
7908 }
29b0f896
AM
7909 else
7910 {
7911 int code16;
3e73aa7c 7912
29b0f896
AM
7913 code16 = 0;
7914 if (flag_code == CODE_16BIT)
7915 code16 = CODE16;
3e73aa7c 7916
29b0f896
AM
7917 if (i.prefix[DATA_PREFIX] != 0)
7918 {
7919 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
7920 i.prefixes -= 1;
7921 code16 ^= CODE16;
7922 }
252b5132 7923
29b0f896
AM
7924 size = 4;
7925 if (code16)
7926 size = 2;
7927 }
9fcc94b6 7928
29b0f896
AM
7929 if (i.prefix[REX_PREFIX] != 0)
7930 {
7931 FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
7932 i.prefixes -= 1;
7933 }
252b5132 7934
7e8b059b
L
7935 /* BND prefixed jump. */
7936 if (i.prefix[BND_PREFIX] != 0)
7937 {
7938 FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
7939 i.prefixes -= 1;
7940 }
7941
29b0f896
AM
7942 if (i.prefixes != 0 && !intel_syntax)
7943 as_warn (_("skipping prefixes on this instruction"));
e0890092 7944
42164a71
L
7945 p = frag_more (i.tm.opcode_length + size);
7946 switch (i.tm.opcode_length)
7947 {
7948 case 2:
7949 *p++ = i.tm.base_opcode >> 8;
1a0670f3 7950 /* Fall through. */
42164a71
L
7951 case 1:
7952 *p++ = i.tm.base_opcode;
7953 break;
7954 default:
7955 abort ();
7956 }
e0890092 7957
bd7ab16b
L
7958#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7959 if (size == 4
7960 && jump_reloc == NO_RELOC
7961 && need_plt32_p (i.op[0].disps->X_add_symbol))
7962 jump_reloc = BFD_RELOC_X86_64_PLT32;
7963#endif
7964
7965 jump_reloc = reloc (size, 1, 1, jump_reloc);
7966
3e02c1cc 7967 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 7968 i.op[0].disps, 1, jump_reloc);
3e02c1cc
AM
7969
7970 /* All jumps handled here are signed, but don't use a signed limit
7971 check for 32 and 16 bit jumps as we want to allow wrap around at
7972 4G and 64k respectively. */
7973 if (size == 1)
7974 fixP->fx_signed = 1;
29b0f896 7975}
e0890092 7976
29b0f896 7977static void
e3bb37b5 7978output_interseg_jump (void)
29b0f896
AM
7979{
7980 char *p;
7981 int size;
7982 int prefix;
7983 int code16;
252b5132 7984
29b0f896
AM
7985 code16 = 0;
7986 if (flag_code == CODE_16BIT)
7987 code16 = CODE16;
a217f122 7988
29b0f896
AM
7989 prefix = 0;
7990 if (i.prefix[DATA_PREFIX] != 0)
7991 {
7992 prefix = 1;
7993 i.prefixes -= 1;
7994 code16 ^= CODE16;
7995 }
7996 if (i.prefix[REX_PREFIX] != 0)
7997 {
7998 prefix++;
7999 i.prefixes -= 1;
8000 }
252b5132 8001
29b0f896
AM
8002 size = 4;
8003 if (code16)
8004 size = 2;
252b5132 8005
29b0f896
AM
8006 if (i.prefixes != 0 && !intel_syntax)
8007 as_warn (_("skipping prefixes on this instruction"));
252b5132 8008
29b0f896
AM
8009 /* 1 opcode; 2 segment; offset */
8010 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 8011
29b0f896
AM
8012 if (i.prefix[DATA_PREFIX] != 0)
8013 *p++ = DATA_PREFIX_OPCODE;
252b5132 8014
29b0f896
AM
8015 if (i.prefix[REX_PREFIX] != 0)
8016 *p++ = i.prefix[REX_PREFIX];
252b5132 8017
29b0f896
AM
8018 *p++ = i.tm.base_opcode;
8019 if (i.op[1].imms->X_op == O_constant)
8020 {
8021 offsetT n = i.op[1].imms->X_add_number;
252b5132 8022
29b0f896
AM
8023 if (size == 2
8024 && !fits_in_unsigned_word (n)
8025 && !fits_in_signed_word (n))
8026 {
8027 as_bad (_("16-bit jump out of range"));
8028 return;
8029 }
8030 md_number_to_chars (p, n, size);
8031 }
8032 else
8033 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 8034 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
29b0f896
AM
8035 if (i.op[0].imms->X_op != O_constant)
8036 as_bad (_("can't handle non absolute segment in `%s'"),
8037 i.tm.name);
8038 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
8039}
a217f122 8040
b4a3a7b4
L
8041#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8042void
8043x86_cleanup (void)
8044{
8045 char *p;
8046 asection *seg = now_seg;
8047 subsegT subseg = now_subseg;
8048 asection *sec;
8049 unsigned int alignment, align_size_1;
8050 unsigned int isa_1_descsz, feature_2_descsz, descsz;
8051 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
8052 unsigned int padding;
8053
8054 if (!IS_ELF || !x86_used_note)
8055 return;
8056
b4a3a7b4
L
8057 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
8058
8059 /* The .note.gnu.property section layout:
8060
8061 Field Length Contents
8062 ---- ---- ----
8063 n_namsz 4 4
8064 n_descsz 4 The note descriptor size
8065 n_type 4 NT_GNU_PROPERTY_TYPE_0
8066 n_name 4 "GNU"
8067 n_desc n_descsz The program property array
8068 .... .... ....
8069 */
8070
8071 /* Create the .note.gnu.property section. */
8072 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 8073 bfd_set_section_flags (sec,
b4a3a7b4
L
8074 (SEC_ALLOC
8075 | SEC_LOAD
8076 | SEC_DATA
8077 | SEC_HAS_CONTENTS
8078 | SEC_READONLY));
8079
8080 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
8081 {
8082 align_size_1 = 7;
8083 alignment = 3;
8084 }
8085 else
8086 {
8087 align_size_1 = 3;
8088 alignment = 2;
8089 }
8090
fd361982 8091 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
8092 elf_section_type (sec) = SHT_NOTE;
8093
8094 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
8095 + 4-byte data */
8096 isa_1_descsz_raw = 4 + 4 + 4;
8097 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
8098 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
8099
8100 feature_2_descsz_raw = isa_1_descsz;
8101 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
8102 + 4-byte data */
8103 feature_2_descsz_raw += 4 + 4 + 4;
8104 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
8105 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
8106 & ~align_size_1);
8107
8108 descsz = feature_2_descsz;
8109 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
8110 p = frag_more (4 + 4 + 4 + 4 + descsz);
8111
8112 /* Write n_namsz. */
8113 md_number_to_chars (p, (valueT) 4, 4);
8114
8115 /* Write n_descsz. */
8116 md_number_to_chars (p + 4, (valueT) descsz, 4);
8117
8118 /* Write n_type. */
8119 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
8120
8121 /* Write n_name. */
8122 memcpy (p + 4 * 3, "GNU", 4);
8123
8124 /* Write 4-byte type. */
8125 md_number_to_chars (p + 4 * 4,
8126 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
8127
8128 /* Write 4-byte data size. */
8129 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
8130
8131 /* Write 4-byte data. */
8132 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
8133
8134 /* Zero out paddings. */
8135 padding = isa_1_descsz - isa_1_descsz_raw;
8136 if (padding)
8137 memset (p + 4 * 7, 0, padding);
8138
8139 /* Write 4-byte type. */
8140 md_number_to_chars (p + isa_1_descsz + 4 * 4,
8141 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
8142
8143 /* Write 4-byte data size. */
8144 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
8145
8146 /* Write 4-byte data. */
8147 md_number_to_chars (p + isa_1_descsz + 4 * 6,
8148 (valueT) x86_feature_2_used, 4);
8149
8150 /* Zero out paddings. */
8151 padding = feature_2_descsz - feature_2_descsz_raw;
8152 if (padding)
8153 memset (p + isa_1_descsz + 4 * 7, 0, padding);
8154
8155 /* We probably can't restore the current segment, for there likely
8156 isn't one yet... */
8157 if (seg && subseg)
8158 subseg_set (seg, subseg);
8159}
8160#endif
8161
9c33702b
JB
8162static unsigned int
8163encoding_length (const fragS *start_frag, offsetT start_off,
8164 const char *frag_now_ptr)
8165{
8166 unsigned int len = 0;
8167
8168 if (start_frag != frag_now)
8169 {
8170 const fragS *fr = start_frag;
8171
8172 do {
8173 len += fr->fr_fix;
8174 fr = fr->fr_next;
8175 } while (fr && fr != frag_now);
8176 }
8177
8178 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
8179}
8180
29b0f896 8181static void
e3bb37b5 8182output_insn (void)
29b0f896 8183{
2bbd9c25
JJ
8184 fragS *insn_start_frag;
8185 offsetT insn_start_off;
8186
b4a3a7b4
L
8187#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8188 if (IS_ELF && x86_used_note)
8189 {
8190 if (i.tm.cpu_flags.bitfield.cpucmov)
8191 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_CMOV;
8192 if (i.tm.cpu_flags.bitfield.cpusse)
8193 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE;
8194 if (i.tm.cpu_flags.bitfield.cpusse2)
8195 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE2;
8196 if (i.tm.cpu_flags.bitfield.cpusse3)
8197 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE3;
8198 if (i.tm.cpu_flags.bitfield.cpussse3)
8199 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSSE3;
8200 if (i.tm.cpu_flags.bitfield.cpusse4_1)
8201 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_1;
8202 if (i.tm.cpu_flags.bitfield.cpusse4_2)
8203 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_2;
8204 if (i.tm.cpu_flags.bitfield.cpuavx)
8205 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX;
8206 if (i.tm.cpu_flags.bitfield.cpuavx2)
8207 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX2;
8208 if (i.tm.cpu_flags.bitfield.cpufma)
8209 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_FMA;
8210 if (i.tm.cpu_flags.bitfield.cpuavx512f)
8211 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512F;
8212 if (i.tm.cpu_flags.bitfield.cpuavx512cd)
8213 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512CD;
8214 if (i.tm.cpu_flags.bitfield.cpuavx512er)
8215 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512ER;
8216 if (i.tm.cpu_flags.bitfield.cpuavx512pf)
8217 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512PF;
8218 if (i.tm.cpu_flags.bitfield.cpuavx512vl)
8219 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512VL;
8220 if (i.tm.cpu_flags.bitfield.cpuavx512dq)
8221 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512DQ;
8222 if (i.tm.cpu_flags.bitfield.cpuavx512bw)
8223 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512BW;
8224 if (i.tm.cpu_flags.bitfield.cpuavx512_4fmaps)
8225 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS;
8226 if (i.tm.cpu_flags.bitfield.cpuavx512_4vnniw)
8227 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW;
8228 if (i.tm.cpu_flags.bitfield.cpuavx512_bitalg)
8229 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BITALG;
8230 if (i.tm.cpu_flags.bitfield.cpuavx512ifma)
8231 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_IFMA;
8232 if (i.tm.cpu_flags.bitfield.cpuavx512vbmi)
8233 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI;
8234 if (i.tm.cpu_flags.bitfield.cpuavx512_vbmi2)
8235 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2;
8236 if (i.tm.cpu_flags.bitfield.cpuavx512_vnni)
8237 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VNNI;
462cac58
L
8238 if (i.tm.cpu_flags.bitfield.cpuavx512_bf16)
8239 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BF16;
b4a3a7b4
L
8240
8241 if (i.tm.cpu_flags.bitfield.cpu8087
8242 || i.tm.cpu_flags.bitfield.cpu287
8243 || i.tm.cpu_flags.bitfield.cpu387
8244 || i.tm.cpu_flags.bitfield.cpu687
8245 || i.tm.cpu_flags.bitfield.cpufisttp)
8246 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
8247 /* Don't set GNU_PROPERTY_X86_FEATURE_2_MMX for prefetchtXXX nor
8248 Xfence instructions. */
8249 if (i.tm.base_opcode != 0xf18
8250 && i.tm.base_opcode != 0xf0d
c3949f43 8251 && i.tm.base_opcode != 0xfaef8
b4a3a7b4
L
8252 && (i.has_regmmx
8253 || i.tm.cpu_flags.bitfield.cpummx
8254 || i.tm.cpu_flags.bitfield.cpua3dnow
8255 || i.tm.cpu_flags.bitfield.cpua3dnowa))
8256 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
8257 if (i.has_regxmm)
8258 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
8259 if (i.has_regymm)
8260 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
8261 if (i.has_regzmm)
8262 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
8263 if (i.tm.cpu_flags.bitfield.cpufxsr)
8264 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
8265 if (i.tm.cpu_flags.bitfield.cpuxsave)
8266 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
8267 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
8268 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
8269 if (i.tm.cpu_flags.bitfield.cpuxsavec)
8270 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
8271 }
8272#endif
8273
29b0f896
AM
8274 /* Tie dwarf2 debug info to the address at the start of the insn.
8275 We can't do this after the insn has been output as the current
8276 frag may have been closed off. eg. by frag_var. */
8277 dwarf2_emit_insn (0);
8278
2bbd9c25
JJ
8279 insn_start_frag = frag_now;
8280 insn_start_off = frag_now_fix ();
8281
29b0f896 8282 /* Output jumps. */
40fb9820 8283 if (i.tm.opcode_modifier.jump)
29b0f896 8284 output_branch ();
40fb9820
L
8285 else if (i.tm.opcode_modifier.jumpbyte
8286 || i.tm.opcode_modifier.jumpdword)
29b0f896 8287 output_jump ();
40fb9820 8288 else if (i.tm.opcode_modifier.jumpintersegment)
29b0f896
AM
8289 output_interseg_jump ();
8290 else
8291 {
8292 /* Output normal instructions here. */
8293 char *p;
8294 unsigned char *q;
47465058 8295 unsigned int j;
331d2d0d 8296 unsigned int prefix;
4dffcebc 8297
e4e00185 8298 if (avoid_fence
c3949f43
JB
8299 && (i.tm.base_opcode == 0xfaee8
8300 || i.tm.base_opcode == 0xfaef0
8301 || i.tm.base_opcode == 0xfaef8))
e4e00185
AS
8302 {
8303 /* Encode lfence, mfence, and sfence as
8304 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
8305 offsetT val = 0x240483f0ULL;
8306 p = frag_more (5);
8307 md_number_to_chars (p, val, 5);
8308 return;
8309 }
8310
d022bddd
IT
8311 /* Some processors fail on LOCK prefix. This options makes
8312 assembler ignore LOCK prefix and serves as a workaround. */
8313 if (omit_lock_prefix)
8314 {
8315 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE)
8316 return;
8317 i.prefix[LOCK_PREFIX] = 0;
8318 }
8319
43234a1e
L
8320 /* Since the VEX/EVEX prefix contains the implicit prefix, we
8321 don't need the explicit prefix. */
8322 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 8323 {
c0f3af97 8324 switch (i.tm.opcode_length)
bc4bd9ab 8325 {
c0f3af97
L
8326 case 3:
8327 if (i.tm.base_opcode & 0xff000000)
4dffcebc 8328 {
c0f3af97 8329 prefix = (i.tm.base_opcode >> 24) & 0xff;
c3949f43
JB
8330 if (!i.tm.cpu_flags.bitfield.cpupadlock
8331 || prefix != REPE_PREFIX_OPCODE
8332 || (i.prefix[REP_PREFIX] != REPE_PREFIX_OPCODE))
8333 add_prefix (prefix);
c0f3af97
L
8334 }
8335 break;
8336 case 2:
8337 if ((i.tm.base_opcode & 0xff0000) != 0)
8338 {
8339 prefix = (i.tm.base_opcode >> 16) & 0xff;
c3949f43 8340 add_prefix (prefix);
4dffcebc 8341 }
c0f3af97
L
8342 break;
8343 case 1:
8344 break;
390c91cf
L
8345 case 0:
8346 /* Check for pseudo prefixes. */
8347 as_bad_where (insn_start_frag->fr_file,
8348 insn_start_frag->fr_line,
8349 _("pseudo prefix without instruction"));
8350 return;
c0f3af97
L
8351 default:
8352 abort ();
bc4bd9ab 8353 }
c0f3af97 8354
6d19a37a 8355#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
8356 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
8357 R_X86_64_GOTTPOFF relocation so that linker can safely
8358 perform IE->LE optimization. */
8359 if (x86_elf_abi == X86_64_X32_ABI
8360 && i.operands == 2
8361 && i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
8362 && i.prefix[REX_PREFIX] == 0)
8363 add_prefix (REX_OPCODE);
6d19a37a 8364#endif
cf61b747 8365
c0f3af97
L
8366 /* The prefix bytes. */
8367 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
8368 if (*q)
8369 FRAG_APPEND_1_CHAR (*q);
0f10071e 8370 }
ae5c1c7b 8371 else
c0f3af97
L
8372 {
8373 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
8374 if (*q)
8375 switch (j)
8376 {
8377 case REX_PREFIX:
8378 /* REX byte is encoded in VEX prefix. */
8379 break;
8380 case SEG_PREFIX:
8381 case ADDR_PREFIX:
8382 FRAG_APPEND_1_CHAR (*q);
8383 break;
8384 default:
8385 /* There should be no other prefixes for instructions
8386 with VEX prefix. */
8387 abort ();
8388 }
8389
43234a1e
L
8390 /* For EVEX instructions i.vrex should become 0 after
8391 build_evex_prefix. For VEX instructions upper 16 registers
8392 aren't available, so VREX should be 0. */
8393 if (i.vrex)
8394 abort ();
c0f3af97
L
8395 /* Now the VEX prefix. */
8396 p = frag_more (i.vex.length);
8397 for (j = 0; j < i.vex.length; j++)
8398 p[j] = i.vex.bytes[j];
8399 }
252b5132 8400
29b0f896 8401 /* Now the opcode; be careful about word order here! */
4dffcebc 8402 if (i.tm.opcode_length == 1)
29b0f896
AM
8403 {
8404 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
8405 }
8406 else
8407 {
4dffcebc 8408 switch (i.tm.opcode_length)
331d2d0d 8409 {
43234a1e
L
8410 case 4:
8411 p = frag_more (4);
8412 *p++ = (i.tm.base_opcode >> 24) & 0xff;
8413 *p++ = (i.tm.base_opcode >> 16) & 0xff;
8414 break;
4dffcebc 8415 case 3:
331d2d0d
L
8416 p = frag_more (3);
8417 *p++ = (i.tm.base_opcode >> 16) & 0xff;
4dffcebc
L
8418 break;
8419 case 2:
8420 p = frag_more (2);
8421 break;
8422 default:
8423 abort ();
8424 break;
331d2d0d 8425 }
0f10071e 8426
29b0f896
AM
8427 /* Put out high byte first: can't use md_number_to_chars! */
8428 *p++ = (i.tm.base_opcode >> 8) & 0xff;
8429 *p = i.tm.base_opcode & 0xff;
8430 }
3e73aa7c 8431
29b0f896 8432 /* Now the modrm byte and sib byte (if present). */
40fb9820 8433 if (i.tm.opcode_modifier.modrm)
29b0f896 8434 {
4a3523fa
L
8435 FRAG_APPEND_1_CHAR ((i.rm.regmem << 0
8436 | i.rm.reg << 3
8437 | i.rm.mode << 6));
29b0f896
AM
8438 /* If i.rm.regmem == ESP (4)
8439 && i.rm.mode != (Register mode)
8440 && not 16 bit
8441 ==> need second modrm byte. */
8442 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
8443 && i.rm.mode != 3
dc821c5f 8444 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
4a3523fa
L
8445 FRAG_APPEND_1_CHAR ((i.sib.base << 0
8446 | i.sib.index << 3
8447 | i.sib.scale << 6));
29b0f896 8448 }
3e73aa7c 8449
29b0f896 8450 if (i.disp_operands)
2bbd9c25 8451 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 8452
29b0f896 8453 if (i.imm_operands)
2bbd9c25 8454 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
8455
8456 /*
8457 * frag_now_fix () returning plain abs_section_offset when we're in the
8458 * absolute section, and abs_section_offset not getting updated as data
8459 * gets added to the frag breaks the logic below.
8460 */
8461 if (now_seg != absolute_section)
8462 {
8463 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
8464 if (j > 15)
8465 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
8466 j);
8467 }
29b0f896 8468 }
252b5132 8469
29b0f896
AM
8470#ifdef DEBUG386
8471 if (flag_debug)
8472 {
7b81dfbb 8473 pi ("" /*line*/, &i);
29b0f896
AM
8474 }
8475#endif /* DEBUG386 */
8476}
252b5132 8477
e205caa7
L
8478/* Return the size of the displacement operand N. */
8479
8480static int
8481disp_size (unsigned int n)
8482{
8483 int size = 4;
43234a1e 8484
b5014f7a 8485 if (i.types[n].bitfield.disp64)
40fb9820
L
8486 size = 8;
8487 else if (i.types[n].bitfield.disp8)
8488 size = 1;
8489 else if (i.types[n].bitfield.disp16)
8490 size = 2;
e205caa7
L
8491 return size;
8492}
8493
8494/* Return the size of the immediate operand N. */
8495
8496static int
8497imm_size (unsigned int n)
8498{
8499 int size = 4;
40fb9820
L
8500 if (i.types[n].bitfield.imm64)
8501 size = 8;
8502 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
8503 size = 1;
8504 else if (i.types[n].bitfield.imm16)
8505 size = 2;
e205caa7
L
8506 return size;
8507}
8508
29b0f896 8509static void
64e74474 8510output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
8511{
8512 char *p;
8513 unsigned int n;
252b5132 8514
29b0f896
AM
8515 for (n = 0; n < i.operands; n++)
8516 {
b5014f7a 8517 if (operand_type_check (i.types[n], disp))
29b0f896
AM
8518 {
8519 if (i.op[n].disps->X_op == O_constant)
8520 {
e205caa7 8521 int size = disp_size (n);
43234a1e 8522 offsetT val = i.op[n].disps->X_add_number;
252b5132 8523
629cfaf1
JB
8524 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
8525 size);
29b0f896
AM
8526 p = frag_more (size);
8527 md_number_to_chars (p, val, size);
8528 }
8529 else
8530 {
f86103b7 8531 enum bfd_reloc_code_real reloc_type;
e205caa7 8532 int size = disp_size (n);
40fb9820 8533 int sign = i.types[n].bitfield.disp32s;
29b0f896 8534 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 8535 fixS *fixP;
29b0f896 8536
e205caa7 8537 /* We can't have 8 bit displacement here. */
9c2799c2 8538 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 8539
29b0f896
AM
8540 /* The PC relative address is computed relative
8541 to the instruction boundary, so in case immediate
8542 fields follows, we need to adjust the value. */
8543 if (pcrel && i.imm_operands)
8544 {
29b0f896 8545 unsigned int n1;
e205caa7 8546 int sz = 0;
252b5132 8547
29b0f896 8548 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 8549 if (operand_type_check (i.types[n1], imm))
252b5132 8550 {
e205caa7
L
8551 /* Only one immediate is allowed for PC
8552 relative address. */
9c2799c2 8553 gas_assert (sz == 0);
e205caa7
L
8554 sz = imm_size (n1);
8555 i.op[n].disps->X_add_number -= sz;
252b5132 8556 }
29b0f896 8557 /* We should find the immediate. */
9c2799c2 8558 gas_assert (sz != 0);
29b0f896 8559 }
520dc8e8 8560
29b0f896 8561 p = frag_more (size);
d258b828 8562 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 8563 if (GOT_symbol
2bbd9c25 8564 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 8565 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
8566 || reloc_type == BFD_RELOC_X86_64_32S
8567 || (reloc_type == BFD_RELOC_64
8568 && object_64bit))
d6ab8113
JB
8569 && (i.op[n].disps->X_op == O_symbol
8570 || (i.op[n].disps->X_op == O_add
8571 && ((symbol_get_value_expression
8572 (i.op[n].disps->X_op_symbol)->X_op)
8573 == O_subtract))))
8574 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 8575 {
4fa24527 8576 if (!object_64bit)
7b81dfbb
AJ
8577 {
8578 reloc_type = BFD_RELOC_386_GOTPC;
d583596c
JB
8579 i.op[n].imms->X_add_number +=
8580 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
8581 }
8582 else if (reloc_type == BFD_RELOC_64)
8583 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 8584 else
7b81dfbb
AJ
8585 /* Don't do the adjustment for x86-64, as there
8586 the pcrel addressing is relative to the _next_
8587 insn, and that is taken care of in other code. */
d6ab8113 8588 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 8589 }
02a86693
L
8590 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
8591 size, i.op[n].disps, pcrel,
8592 reloc_type);
8593 /* Check for "call/jmp *mem", "mov mem, %reg",
8594 "test %reg, mem" and "binop mem, %reg" where binop
8595 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
8596 instructions without data prefix. Always generate
8597 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
8598 if (i.prefix[DATA_PREFIX] == 0
8599 && (generate_relax_relocations
8600 || (!object_64bit
8601 && i.rm.mode == 0
8602 && i.rm.regmem == 5))
0cb4071e
L
8603 && (i.rm.mode == 2
8604 || (i.rm.mode == 0 && i.rm.regmem == 5))
02a86693
L
8605 && ((i.operands == 1
8606 && i.tm.base_opcode == 0xff
8607 && (i.rm.reg == 2 || i.rm.reg == 4))
8608 || (i.operands == 2
8609 && (i.tm.base_opcode == 0x8b
8610 || i.tm.base_opcode == 0x85
8611 || (i.tm.base_opcode & 0xc7) == 0x03))))
8612 {
8613 if (object_64bit)
8614 {
8615 fixP->fx_tcbit = i.rex != 0;
8616 if (i.base_reg
e968fc9b 8617 && (i.base_reg->reg_num == RegIP))
02a86693
L
8618 fixP->fx_tcbit2 = 1;
8619 }
8620 else
8621 fixP->fx_tcbit2 = 1;
8622 }
29b0f896
AM
8623 }
8624 }
8625 }
8626}
252b5132 8627
29b0f896 8628static void
64e74474 8629output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
8630{
8631 char *p;
8632 unsigned int n;
252b5132 8633
29b0f896
AM
8634 for (n = 0; n < i.operands; n++)
8635 {
43234a1e
L
8636 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
8637 if (i.rounding && (int) n == i.rounding->operand)
8638 continue;
8639
40fb9820 8640 if (operand_type_check (i.types[n], imm))
29b0f896
AM
8641 {
8642 if (i.op[n].imms->X_op == O_constant)
8643 {
e205caa7 8644 int size = imm_size (n);
29b0f896 8645 offsetT val;
b4cac588 8646
29b0f896
AM
8647 val = offset_in_range (i.op[n].imms->X_add_number,
8648 size);
8649 p = frag_more (size);
8650 md_number_to_chars (p, val, size);
8651 }
8652 else
8653 {
8654 /* Not absolute_section.
8655 Need a 32-bit fixup (don't support 8bit
8656 non-absolute imms). Try to support other
8657 sizes ... */
f86103b7 8658 enum bfd_reloc_code_real reloc_type;
e205caa7
L
8659 int size = imm_size (n);
8660 int sign;
29b0f896 8661
40fb9820 8662 if (i.types[n].bitfield.imm32s
a7d61044 8663 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 8664 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 8665 sign = 1;
e205caa7
L
8666 else
8667 sign = 0;
520dc8e8 8668
29b0f896 8669 p = frag_more (size);
d258b828 8670 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 8671
2bbd9c25
JJ
8672 /* This is tough to explain. We end up with this one if we
8673 * have operands that look like
8674 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
8675 * obtain the absolute address of the GOT, and it is strongly
8676 * preferable from a performance point of view to avoid using
8677 * a runtime relocation for this. The actual sequence of
8678 * instructions often look something like:
8679 *
8680 * call .L66
8681 * .L66:
8682 * popl %ebx
8683 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
8684 *
8685 * The call and pop essentially return the absolute address
8686 * of the label .L66 and store it in %ebx. The linker itself
8687 * will ultimately change the first operand of the addl so
8688 * that %ebx points to the GOT, but to keep things simple, the
8689 * .o file must have this operand set so that it generates not
8690 * the absolute address of .L66, but the absolute address of
8691 * itself. This allows the linker itself simply treat a GOTPC
8692 * relocation as asking for a pcrel offset to the GOT to be
8693 * added in, and the addend of the relocation is stored in the
8694 * operand field for the instruction itself.
8695 *
8696 * Our job here is to fix the operand so that it would add
8697 * the correct offset so that %ebx would point to itself. The
8698 * thing that is tricky is that .-.L66 will point to the
8699 * beginning of the instruction, so we need to further modify
8700 * the operand so that it will point to itself. There are
8701 * other cases where you have something like:
8702 *
8703 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
8704 *
8705 * and here no correction would be required. Internally in
8706 * the assembler we treat operands of this form as not being
8707 * pcrel since the '.' is explicitly mentioned, and I wonder
8708 * whether it would simplify matters to do it this way. Who
8709 * knows. In earlier versions of the PIC patches, the
8710 * pcrel_adjust field was used to store the correction, but
8711 * since the expression is not pcrel, I felt it would be
8712 * confusing to do it this way. */
8713
d6ab8113 8714 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
8715 || reloc_type == BFD_RELOC_X86_64_32S
8716 || reloc_type == BFD_RELOC_64)
29b0f896
AM
8717 && GOT_symbol
8718 && GOT_symbol == i.op[n].imms->X_add_symbol
8719 && (i.op[n].imms->X_op == O_symbol
8720 || (i.op[n].imms->X_op == O_add
8721 && ((symbol_get_value_expression
8722 (i.op[n].imms->X_op_symbol)->X_op)
8723 == O_subtract))))
8724 {
4fa24527 8725 if (!object_64bit)
d6ab8113 8726 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 8727 else if (size == 4)
d6ab8113 8728 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
8729 else if (size == 8)
8730 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d583596c
JB
8731 i.op[n].imms->X_add_number +=
8732 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 8733 }
29b0f896
AM
8734 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
8735 i.op[n].imms, 0, reloc_type);
8736 }
8737 }
8738 }
252b5132
RH
8739}
8740\f
d182319b
JB
8741/* x86_cons_fix_new is called via the expression parsing code when a
8742 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
8743static int cons_sign = -1;
8744
8745void
e3bb37b5 8746x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 8747 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 8748{
d258b828 8749 r = reloc (len, 0, cons_sign, r);
d182319b
JB
8750
8751#ifdef TE_PE
8752 if (exp->X_op == O_secrel)
8753 {
8754 exp->X_op = O_symbol;
8755 r = BFD_RELOC_32_SECREL;
8756 }
8757#endif
8758
8759 fix_new_exp (frag, off, len, exp, 0, r);
8760}
8761
357d1bd8
L
8762/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
8763 purpose of the `.dc.a' internal pseudo-op. */
8764
8765int
8766x86_address_bytes (void)
8767{
8768 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
8769 return 4;
8770 return stdoutput->arch_info->bits_per_address / 8;
8771}
8772
d382c579
TG
8773#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
8774 || defined (LEX_AT)
d258b828 8775# define lex_got(reloc, adjust, types) NULL
718ddfc0 8776#else
f3c180ae
AM
8777/* Parse operands of the form
8778 <symbol>@GOTOFF+<nnn>
8779 and similar .plt or .got references.
8780
8781 If we find one, set up the correct relocation in RELOC and copy the
8782 input string, minus the `@GOTOFF' into a malloc'd buffer for
8783 parsing by the calling routine. Return this buffer, and if ADJUST
8784 is non-null set it to the length of the string we removed from the
8785 input line. Otherwise return NULL. */
8786static char *
91d6fa6a 8787lex_got (enum bfd_reloc_code_real *rel,
64e74474 8788 int *adjust,
d258b828 8789 i386_operand_type *types)
f3c180ae 8790{
7b81dfbb
AJ
8791 /* Some of the relocations depend on the size of what field is to
8792 be relocated. But in our callers i386_immediate and i386_displacement
8793 we don't yet know the operand size (this will be set by insn
8794 matching). Hence we record the word32 relocation here,
8795 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
8796 static const struct {
8797 const char *str;
cff8d58a 8798 int len;
4fa24527 8799 const enum bfd_reloc_code_real rel[2];
40fb9820 8800 const i386_operand_type types64;
f3c180ae 8801 } gotrel[] = {
8ce3d284 8802#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
8803 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
8804 BFD_RELOC_SIZE32 },
8805 OPERAND_TYPE_IMM32_64 },
8ce3d284 8806#endif
cff8d58a
L
8807 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
8808 BFD_RELOC_X86_64_PLTOFF64 },
40fb9820 8809 OPERAND_TYPE_IMM64 },
cff8d58a
L
8810 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
8811 BFD_RELOC_X86_64_PLT32 },
40fb9820 8812 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8813 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
8814 BFD_RELOC_X86_64_GOTPLT64 },
40fb9820 8815 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
8816 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
8817 BFD_RELOC_X86_64_GOTOFF64 },
40fb9820 8818 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
8819 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
8820 BFD_RELOC_X86_64_GOTPCREL },
40fb9820 8821 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8822 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
8823 BFD_RELOC_X86_64_TLSGD },
40fb9820 8824 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8825 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
8826 _dummy_first_bfd_reloc_code_real },
40fb9820 8827 OPERAND_TYPE_NONE },
cff8d58a
L
8828 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
8829 BFD_RELOC_X86_64_TLSLD },
40fb9820 8830 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8831 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
8832 BFD_RELOC_X86_64_GOTTPOFF },
40fb9820 8833 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8834 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
8835 BFD_RELOC_X86_64_TPOFF32 },
40fb9820 8836 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
8837 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
8838 _dummy_first_bfd_reloc_code_real },
40fb9820 8839 OPERAND_TYPE_NONE },
cff8d58a
L
8840 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
8841 BFD_RELOC_X86_64_DTPOFF32 },
40fb9820 8842 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
8843 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
8844 _dummy_first_bfd_reloc_code_real },
40fb9820 8845 OPERAND_TYPE_NONE },
cff8d58a
L
8846 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
8847 _dummy_first_bfd_reloc_code_real },
40fb9820 8848 OPERAND_TYPE_NONE },
cff8d58a
L
8849 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
8850 BFD_RELOC_X86_64_GOT32 },
40fb9820 8851 OPERAND_TYPE_IMM32_32S_64_DISP32 },
cff8d58a
L
8852 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
8853 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
40fb9820 8854 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8855 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
8856 BFD_RELOC_X86_64_TLSDESC_CALL },
40fb9820 8857 OPERAND_TYPE_IMM32_32S_DISP32 },
f3c180ae
AM
8858 };
8859 char *cp;
8860 unsigned int j;
8861
d382c579 8862#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
8863 if (!IS_ELF)
8864 return NULL;
d382c579 8865#endif
718ddfc0 8866
f3c180ae 8867 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 8868 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
8869 return NULL;
8870
47465058 8871 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 8872 {
cff8d58a 8873 int len = gotrel[j].len;
28f81592 8874 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 8875 {
4fa24527 8876 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 8877 {
28f81592
AM
8878 int first, second;
8879 char *tmpbuf, *past_reloc;
f3c180ae 8880
91d6fa6a 8881 *rel = gotrel[j].rel[object_64bit];
f3c180ae 8882
3956db08
JB
8883 if (types)
8884 {
8885 if (flag_code != CODE_64BIT)
40fb9820
L
8886 {
8887 types->bitfield.imm32 = 1;
8888 types->bitfield.disp32 = 1;
8889 }
3956db08
JB
8890 else
8891 *types = gotrel[j].types64;
8892 }
8893
8fd4256d 8894 if (j != 0 && GOT_symbol == NULL)
f3c180ae
AM
8895 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
8896
28f81592 8897 /* The length of the first part of our input line. */
f3c180ae 8898 first = cp - input_line_pointer;
28f81592
AM
8899
8900 /* The second part goes from after the reloc token until
67c11a9b 8901 (and including) an end_of_line char or comma. */
28f81592 8902 past_reloc = cp + 1 + len;
67c11a9b
AM
8903 cp = past_reloc;
8904 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
8905 ++cp;
8906 second = cp + 1 - past_reloc;
28f81592
AM
8907
8908 /* Allocate and copy string. The trailing NUL shouldn't
8909 be necessary, but be safe. */
add39d23 8910 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 8911 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
8912 if (second != 0 && *past_reloc != ' ')
8913 /* Replace the relocation token with ' ', so that
8914 errors like foo@GOTOFF1 will be detected. */
8915 tmpbuf[first++] = ' ';
af89796a
L
8916 else
8917 /* Increment length by 1 if the relocation token is
8918 removed. */
8919 len++;
8920 if (adjust)
8921 *adjust = len;
0787a12d
AM
8922 memcpy (tmpbuf + first, past_reloc, second);
8923 tmpbuf[first + second] = '\0';
f3c180ae
AM
8924 return tmpbuf;
8925 }
8926
4fa24527
JB
8927 as_bad (_("@%s reloc is not supported with %d-bit output format"),
8928 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
8929 return NULL;
8930 }
8931 }
8932
8933 /* Might be a symbol version string. Don't as_bad here. */
8934 return NULL;
8935}
4e4f7c87 8936#endif
f3c180ae 8937
a988325c
NC
8938#ifdef TE_PE
8939#ifdef lex_got
8940#undef lex_got
8941#endif
8942/* Parse operands of the form
8943 <symbol>@SECREL32+<nnn>
8944
8945 If we find one, set up the correct relocation in RELOC and copy the
8946 input string, minus the `@SECREL32' into a malloc'd buffer for
8947 parsing by the calling routine. Return this buffer, and if ADJUST
8948 is non-null set it to the length of the string we removed from the
34bca508
L
8949 input line. Otherwise return NULL.
8950
a988325c
NC
8951 This function is copied from the ELF version above adjusted for PE targets. */
8952
8953static char *
8954lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
8955 int *adjust ATTRIBUTE_UNUSED,
d258b828 8956 i386_operand_type *types)
a988325c
NC
8957{
8958 static const struct
8959 {
8960 const char *str;
8961 int len;
8962 const enum bfd_reloc_code_real rel[2];
8963 const i386_operand_type types64;
8964 }
8965 gotrel[] =
8966 {
8967 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
8968 BFD_RELOC_32_SECREL },
8969 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
8970 };
8971
8972 char *cp;
8973 unsigned j;
8974
8975 for (cp = input_line_pointer; *cp != '@'; cp++)
8976 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
8977 return NULL;
8978
8979 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
8980 {
8981 int len = gotrel[j].len;
8982
8983 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
8984 {
8985 if (gotrel[j].rel[object_64bit] != 0)
8986 {
8987 int first, second;
8988 char *tmpbuf, *past_reloc;
8989
8990 *rel = gotrel[j].rel[object_64bit];
8991 if (adjust)
8992 *adjust = len;
8993
8994 if (types)
8995 {
8996 if (flag_code != CODE_64BIT)
8997 {
8998 types->bitfield.imm32 = 1;
8999 types->bitfield.disp32 = 1;
9000 }
9001 else
9002 *types = gotrel[j].types64;
9003 }
9004
9005 /* The length of the first part of our input line. */
9006 first = cp - input_line_pointer;
9007
9008 /* The second part goes from after the reloc token until
9009 (and including) an end_of_line char or comma. */
9010 past_reloc = cp + 1 + len;
9011 cp = past_reloc;
9012 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
9013 ++cp;
9014 second = cp + 1 - past_reloc;
9015
9016 /* Allocate and copy string. The trailing NUL shouldn't
9017 be necessary, but be safe. */
add39d23 9018 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
9019 memcpy (tmpbuf, input_line_pointer, first);
9020 if (second != 0 && *past_reloc != ' ')
9021 /* Replace the relocation token with ' ', so that
9022 errors like foo@SECLREL321 will be detected. */
9023 tmpbuf[first++] = ' ';
9024 memcpy (tmpbuf + first, past_reloc, second);
9025 tmpbuf[first + second] = '\0';
9026 return tmpbuf;
9027 }
9028
9029 as_bad (_("@%s reloc is not supported with %d-bit output format"),
9030 gotrel[j].str, 1 << (5 + object_64bit));
9031 return NULL;
9032 }
9033 }
9034
9035 /* Might be a symbol version string. Don't as_bad here. */
9036 return NULL;
9037}
9038
9039#endif /* TE_PE */
9040
62ebcb5c 9041bfd_reloc_code_real_type
e3bb37b5 9042x86_cons (expressionS *exp, int size)
f3c180ae 9043{
62ebcb5c
AM
9044 bfd_reloc_code_real_type got_reloc = NO_RELOC;
9045
ee86248c
JB
9046 intel_syntax = -intel_syntax;
9047
3c7b9c2c 9048 exp->X_md = 0;
4fa24527 9049 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
9050 {
9051 /* Handle @GOTOFF and the like in an expression. */
9052 char *save;
9053 char *gotfree_input_line;
4a57f2cf 9054 int adjust = 0;
f3c180ae
AM
9055
9056 save = input_line_pointer;
d258b828 9057 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
9058 if (gotfree_input_line)
9059 input_line_pointer = gotfree_input_line;
9060
9061 expression (exp);
9062
9063 if (gotfree_input_line)
9064 {
9065 /* expression () has merrily parsed up to the end of line,
9066 or a comma - in the wrong buffer. Transfer how far
9067 input_line_pointer has moved to the right buffer. */
9068 input_line_pointer = (save
9069 + (input_line_pointer - gotfree_input_line)
9070 + adjust);
9071 free (gotfree_input_line);
3992d3b7
AM
9072 if (exp->X_op == O_constant
9073 || exp->X_op == O_absent
9074 || exp->X_op == O_illegal
0398aac5 9075 || exp->X_op == O_register
3992d3b7
AM
9076 || exp->X_op == O_big)
9077 {
9078 char c = *input_line_pointer;
9079 *input_line_pointer = 0;
9080 as_bad (_("missing or invalid expression `%s'"), save);
9081 *input_line_pointer = c;
9082 }
b9519cfe
L
9083 else if ((got_reloc == BFD_RELOC_386_PLT32
9084 || got_reloc == BFD_RELOC_X86_64_PLT32)
9085 && exp->X_op != O_symbol)
9086 {
9087 char c = *input_line_pointer;
9088 *input_line_pointer = 0;
9089 as_bad (_("invalid PLT expression `%s'"), save);
9090 *input_line_pointer = c;
9091 }
f3c180ae
AM
9092 }
9093 }
9094 else
9095 expression (exp);
ee86248c
JB
9096
9097 intel_syntax = -intel_syntax;
9098
9099 if (intel_syntax)
9100 i386_intel_simplify (exp);
62ebcb5c
AM
9101
9102 return got_reloc;
f3c180ae 9103}
f3c180ae 9104
9f32dd5b
L
9105static void
9106signed_cons (int size)
6482c264 9107{
d182319b
JB
9108 if (flag_code == CODE_64BIT)
9109 cons_sign = 1;
9110 cons (size);
9111 cons_sign = -1;
6482c264
NC
9112}
9113
d182319b 9114#ifdef TE_PE
6482c264 9115static void
7016a5d5 9116pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
9117{
9118 expressionS exp;
9119
9120 do
9121 {
9122 expression (&exp);
9123 if (exp.X_op == O_symbol)
9124 exp.X_op = O_secrel;
9125
9126 emit_expr (&exp, 4);
9127 }
9128 while (*input_line_pointer++ == ',');
9129
9130 input_line_pointer--;
9131 demand_empty_rest_of_line ();
9132}
6482c264
NC
9133#endif
9134
43234a1e
L
9135/* Handle Vector operations. */
9136
9137static char *
9138check_VecOperations (char *op_string, char *op_end)
9139{
9140 const reg_entry *mask;
9141 const char *saved;
9142 char *end_op;
9143
9144 while (*op_string
9145 && (op_end == NULL || op_string < op_end))
9146 {
9147 saved = op_string;
9148 if (*op_string == '{')
9149 {
9150 op_string++;
9151
9152 /* Check broadcasts. */
9153 if (strncmp (op_string, "1to", 3) == 0)
9154 {
9155 int bcst_type;
9156
9157 if (i.broadcast)
9158 goto duplicated_vec_op;
9159
9160 op_string += 3;
9161 if (*op_string == '8')
8e6e0792 9162 bcst_type = 8;
b28d1bda 9163 else if (*op_string == '4')
8e6e0792 9164 bcst_type = 4;
b28d1bda 9165 else if (*op_string == '2')
8e6e0792 9166 bcst_type = 2;
43234a1e
L
9167 else if (*op_string == '1'
9168 && *(op_string+1) == '6')
9169 {
8e6e0792 9170 bcst_type = 16;
43234a1e
L
9171 op_string++;
9172 }
9173 else
9174 {
9175 as_bad (_("Unsupported broadcast: `%s'"), saved);
9176 return NULL;
9177 }
9178 op_string++;
9179
9180 broadcast_op.type = bcst_type;
9181 broadcast_op.operand = this_operand;
1f75763a 9182 broadcast_op.bytes = 0;
43234a1e
L
9183 i.broadcast = &broadcast_op;
9184 }
9185 /* Check masking operation. */
9186 else if ((mask = parse_register (op_string, &end_op)) != NULL)
9187 {
9188 /* k0 can't be used for write mask. */
f74a6307 9189 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 9190 {
6d2cd6b2
JB
9191 as_bad (_("`%s%s' can't be used for write mask"),
9192 register_prefix, mask->reg_name);
43234a1e
L
9193 return NULL;
9194 }
9195
9196 if (!i.mask)
9197 {
9198 mask_op.mask = mask;
9199 mask_op.zeroing = 0;
9200 mask_op.operand = this_operand;
9201 i.mask = &mask_op;
9202 }
9203 else
9204 {
9205 if (i.mask->mask)
9206 goto duplicated_vec_op;
9207
9208 i.mask->mask = mask;
9209
9210 /* Only "{z}" is allowed here. No need to check
9211 zeroing mask explicitly. */
9212 if (i.mask->operand != this_operand)
9213 {
9214 as_bad (_("invalid write mask `%s'"), saved);
9215 return NULL;
9216 }
9217 }
9218
9219 op_string = end_op;
9220 }
9221 /* Check zeroing-flag for masking operation. */
9222 else if (*op_string == 'z')
9223 {
9224 if (!i.mask)
9225 {
9226 mask_op.mask = NULL;
9227 mask_op.zeroing = 1;
9228 mask_op.operand = this_operand;
9229 i.mask = &mask_op;
9230 }
9231 else
9232 {
9233 if (i.mask->zeroing)
9234 {
9235 duplicated_vec_op:
9236 as_bad (_("duplicated `%s'"), saved);
9237 return NULL;
9238 }
9239
9240 i.mask->zeroing = 1;
9241
9242 /* Only "{%k}" is allowed here. No need to check mask
9243 register explicitly. */
9244 if (i.mask->operand != this_operand)
9245 {
9246 as_bad (_("invalid zeroing-masking `%s'"),
9247 saved);
9248 return NULL;
9249 }
9250 }
9251
9252 op_string++;
9253 }
9254 else
9255 goto unknown_vec_op;
9256
9257 if (*op_string != '}')
9258 {
9259 as_bad (_("missing `}' in `%s'"), saved);
9260 return NULL;
9261 }
9262 op_string++;
0ba3a731
L
9263
9264 /* Strip whitespace since the addition of pseudo prefixes
9265 changed how the scrubber treats '{'. */
9266 if (is_space_char (*op_string))
9267 ++op_string;
9268
43234a1e
L
9269 continue;
9270 }
9271 unknown_vec_op:
9272 /* We don't know this one. */
9273 as_bad (_("unknown vector operation: `%s'"), saved);
9274 return NULL;
9275 }
9276
6d2cd6b2
JB
9277 if (i.mask && i.mask->zeroing && !i.mask->mask)
9278 {
9279 as_bad (_("zeroing-masking only allowed with write mask"));
9280 return NULL;
9281 }
9282
43234a1e
L
9283 return op_string;
9284}
9285
252b5132 9286static int
70e41ade 9287i386_immediate (char *imm_start)
252b5132
RH
9288{
9289 char *save_input_line_pointer;
f3c180ae 9290 char *gotfree_input_line;
252b5132 9291 segT exp_seg = 0;
47926f60 9292 expressionS *exp;
40fb9820
L
9293 i386_operand_type types;
9294
0dfbf9d7 9295 operand_type_set (&types, ~0);
252b5132
RH
9296
9297 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
9298 {
31b2323c
L
9299 as_bad (_("at most %d immediate operands are allowed"),
9300 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
9301 return 0;
9302 }
9303
9304 exp = &im_expressions[i.imm_operands++];
520dc8e8 9305 i.op[this_operand].imms = exp;
252b5132
RH
9306
9307 if (is_space_char (*imm_start))
9308 ++imm_start;
9309
9310 save_input_line_pointer = input_line_pointer;
9311 input_line_pointer = imm_start;
9312
d258b828 9313 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
9314 if (gotfree_input_line)
9315 input_line_pointer = gotfree_input_line;
252b5132
RH
9316
9317 exp_seg = expression (exp);
9318
83183c0c 9319 SKIP_WHITESPACE ();
43234a1e
L
9320
9321 /* Handle vector operations. */
9322 if (*input_line_pointer == '{')
9323 {
9324 input_line_pointer = check_VecOperations (input_line_pointer,
9325 NULL);
9326 if (input_line_pointer == NULL)
9327 return 0;
9328 }
9329
252b5132 9330 if (*input_line_pointer)
f3c180ae 9331 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
9332
9333 input_line_pointer = save_input_line_pointer;
f3c180ae 9334 if (gotfree_input_line)
ee86248c
JB
9335 {
9336 free (gotfree_input_line);
9337
9338 if (exp->X_op == O_constant || exp->X_op == O_register)
9339 exp->X_op = O_illegal;
9340 }
9341
9342 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
9343}
252b5132 9344
ee86248c
JB
9345static int
9346i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
9347 i386_operand_type types, const char *imm_start)
9348{
9349 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 9350 {
313c53d1
L
9351 if (imm_start)
9352 as_bad (_("missing or invalid immediate expression `%s'"),
9353 imm_start);
3992d3b7 9354 return 0;
252b5132 9355 }
3e73aa7c 9356 else if (exp->X_op == O_constant)
252b5132 9357 {
47926f60 9358 /* Size it properly later. */
40fb9820 9359 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
9360 /* If not 64bit, sign extend val. */
9361 if (flag_code != CODE_64BIT
4eed87de
AM
9362 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
9363 exp->X_add_number
9364 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 9365 }
4c63da97 9366#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 9367 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 9368 && exp_seg != absolute_section
47926f60 9369 && exp_seg != text_section
24eab124
AM
9370 && exp_seg != data_section
9371 && exp_seg != bss_section
9372 && exp_seg != undefined_section
f86103b7 9373 && !bfd_is_com_section (exp_seg))
252b5132 9374 {
d0b47220 9375 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
9376 return 0;
9377 }
9378#endif
a841bdf5 9379 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 9380 {
313c53d1
L
9381 if (imm_start)
9382 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
9383 return 0;
9384 }
252b5132
RH
9385 else
9386 {
9387 /* This is an address. The size of the address will be
24eab124 9388 determined later, depending on destination register,
3e73aa7c 9389 suffix, or the default for the section. */
40fb9820
L
9390 i.types[this_operand].bitfield.imm8 = 1;
9391 i.types[this_operand].bitfield.imm16 = 1;
9392 i.types[this_operand].bitfield.imm32 = 1;
9393 i.types[this_operand].bitfield.imm32s = 1;
9394 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
9395 i.types[this_operand] = operand_type_and (i.types[this_operand],
9396 types);
252b5132
RH
9397 }
9398
9399 return 1;
9400}
9401
551c1ca1 9402static char *
e3bb37b5 9403i386_scale (char *scale)
252b5132 9404{
551c1ca1
AM
9405 offsetT val;
9406 char *save = input_line_pointer;
252b5132 9407
551c1ca1
AM
9408 input_line_pointer = scale;
9409 val = get_absolute_expression ();
9410
9411 switch (val)
252b5132 9412 {
551c1ca1 9413 case 1:
252b5132
RH
9414 i.log2_scale_factor = 0;
9415 break;
551c1ca1 9416 case 2:
252b5132
RH
9417 i.log2_scale_factor = 1;
9418 break;
551c1ca1 9419 case 4:
252b5132
RH
9420 i.log2_scale_factor = 2;
9421 break;
551c1ca1 9422 case 8:
252b5132
RH
9423 i.log2_scale_factor = 3;
9424 break;
9425 default:
a724f0f4
JB
9426 {
9427 char sep = *input_line_pointer;
9428
9429 *input_line_pointer = '\0';
9430 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
9431 scale);
9432 *input_line_pointer = sep;
9433 input_line_pointer = save;
9434 return NULL;
9435 }
252b5132 9436 }
29b0f896 9437 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
9438 {
9439 as_warn (_("scale factor of %d without an index register"),
24eab124 9440 1 << i.log2_scale_factor);
252b5132 9441 i.log2_scale_factor = 0;
252b5132 9442 }
551c1ca1
AM
9443 scale = input_line_pointer;
9444 input_line_pointer = save;
9445 return scale;
252b5132
RH
9446}
9447
252b5132 9448static int
e3bb37b5 9449i386_displacement (char *disp_start, char *disp_end)
252b5132 9450{
29b0f896 9451 expressionS *exp;
252b5132
RH
9452 segT exp_seg = 0;
9453 char *save_input_line_pointer;
f3c180ae 9454 char *gotfree_input_line;
40fb9820
L
9455 int override;
9456 i386_operand_type bigdisp, types = anydisp;
3992d3b7 9457 int ret;
252b5132 9458
31b2323c
L
9459 if (i.disp_operands == MAX_MEMORY_OPERANDS)
9460 {
9461 as_bad (_("at most %d displacement operands are allowed"),
9462 MAX_MEMORY_OPERANDS);
9463 return 0;
9464 }
9465
0dfbf9d7 9466 operand_type_set (&bigdisp, 0);
40fb9820
L
9467 if ((i.types[this_operand].bitfield.jumpabsolute)
9468 || (!current_templates->start->opcode_modifier.jump
9469 && !current_templates->start->opcode_modifier.jumpdword))
e05278af 9470 {
40fb9820 9471 bigdisp.bitfield.disp32 = 1;
e05278af 9472 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
9473 if (flag_code == CODE_64BIT)
9474 {
9475 if (!override)
9476 {
9477 bigdisp.bitfield.disp32s = 1;
9478 bigdisp.bitfield.disp64 = 1;
9479 }
9480 }
9481 else if ((flag_code == CODE_16BIT) ^ override)
9482 {
9483 bigdisp.bitfield.disp32 = 0;
9484 bigdisp.bitfield.disp16 = 1;
9485 }
e05278af
JB
9486 }
9487 else
9488 {
9489 /* For PC-relative branches, the width of the displacement
9490 is dependent upon data size, not address size. */
e05278af 9491 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
9492 if (flag_code == CODE_64BIT)
9493 {
9494 if (override || i.suffix == WORD_MNEM_SUFFIX)
9495 bigdisp.bitfield.disp16 = 1;
9496 else
9497 {
9498 bigdisp.bitfield.disp32 = 1;
9499 bigdisp.bitfield.disp32s = 1;
9500 }
9501 }
9502 else
e05278af
JB
9503 {
9504 if (!override)
9505 override = (i.suffix == (flag_code != CODE_16BIT
9506 ? WORD_MNEM_SUFFIX
9507 : LONG_MNEM_SUFFIX));
40fb9820
L
9508 bigdisp.bitfield.disp32 = 1;
9509 if ((flag_code == CODE_16BIT) ^ override)
9510 {
9511 bigdisp.bitfield.disp32 = 0;
9512 bigdisp.bitfield.disp16 = 1;
9513 }
e05278af 9514 }
e05278af 9515 }
c6fb90c8
L
9516 i.types[this_operand] = operand_type_or (i.types[this_operand],
9517 bigdisp);
252b5132
RH
9518
9519 exp = &disp_expressions[i.disp_operands];
520dc8e8 9520 i.op[this_operand].disps = exp;
252b5132
RH
9521 i.disp_operands++;
9522 save_input_line_pointer = input_line_pointer;
9523 input_line_pointer = disp_start;
9524 END_STRING_AND_SAVE (disp_end);
9525
9526#ifndef GCC_ASM_O_HACK
9527#define GCC_ASM_O_HACK 0
9528#endif
9529#if GCC_ASM_O_HACK
9530 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 9531 if (i.types[this_operand].bitfield.baseIndex
24eab124 9532 && displacement_string_end[-1] == '+')
252b5132
RH
9533 {
9534 /* This hack is to avoid a warning when using the "o"
24eab124
AM
9535 constraint within gcc asm statements.
9536 For instance:
9537
9538 #define _set_tssldt_desc(n,addr,limit,type) \
9539 __asm__ __volatile__ ( \
9540 "movw %w2,%0\n\t" \
9541 "movw %w1,2+%0\n\t" \
9542 "rorl $16,%1\n\t" \
9543 "movb %b1,4+%0\n\t" \
9544 "movb %4,5+%0\n\t" \
9545 "movb $0,6+%0\n\t" \
9546 "movb %h1,7+%0\n\t" \
9547 "rorl $16,%1" \
9548 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
9549
9550 This works great except that the output assembler ends
9551 up looking a bit weird if it turns out that there is
9552 no offset. You end up producing code that looks like:
9553
9554 #APP
9555 movw $235,(%eax)
9556 movw %dx,2+(%eax)
9557 rorl $16,%edx
9558 movb %dl,4+(%eax)
9559 movb $137,5+(%eax)
9560 movb $0,6+(%eax)
9561 movb %dh,7+(%eax)
9562 rorl $16,%edx
9563 #NO_APP
9564
47926f60 9565 So here we provide the missing zero. */
24eab124
AM
9566
9567 *displacement_string_end = '0';
252b5132
RH
9568 }
9569#endif
d258b828 9570 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
9571 if (gotfree_input_line)
9572 input_line_pointer = gotfree_input_line;
252b5132 9573
24eab124 9574 exp_seg = expression (exp);
252b5132 9575
636c26b0
AM
9576 SKIP_WHITESPACE ();
9577 if (*input_line_pointer)
9578 as_bad (_("junk `%s' after expression"), input_line_pointer);
9579#if GCC_ASM_O_HACK
9580 RESTORE_END_STRING (disp_end + 1);
9581#endif
636c26b0 9582 input_line_pointer = save_input_line_pointer;
636c26b0 9583 if (gotfree_input_line)
ee86248c
JB
9584 {
9585 free (gotfree_input_line);
9586
9587 if (exp->X_op == O_constant || exp->X_op == O_register)
9588 exp->X_op = O_illegal;
9589 }
9590
9591 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
9592
9593 RESTORE_END_STRING (disp_end);
9594
9595 return ret;
9596}
9597
9598static int
9599i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
9600 i386_operand_type types, const char *disp_start)
9601{
9602 i386_operand_type bigdisp;
9603 int ret = 1;
636c26b0 9604
24eab124
AM
9605 /* We do this to make sure that the section symbol is in
9606 the symbol table. We will ultimately change the relocation
47926f60 9607 to be relative to the beginning of the section. */
1ae12ab7 9608 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
9609 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
9610 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 9611 {
636c26b0 9612 if (exp->X_op != O_symbol)
3992d3b7 9613 goto inv_disp;
636c26b0 9614
e5cb08ac 9615 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
9616 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
9617 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 9618 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
9619 exp->X_op = O_subtract;
9620 exp->X_op_symbol = GOT_symbol;
1ae12ab7 9621 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 9622 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
9623 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
9624 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 9625 else
29b0f896 9626 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 9627 }
252b5132 9628
3992d3b7
AM
9629 else if (exp->X_op == O_absent
9630 || exp->X_op == O_illegal
ee86248c 9631 || exp->X_op == O_big)
2daf4fd8 9632 {
3992d3b7
AM
9633 inv_disp:
9634 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 9635 disp_start);
3992d3b7 9636 ret = 0;
2daf4fd8
AM
9637 }
9638
0e1147d9
L
9639 else if (flag_code == CODE_64BIT
9640 && !i.prefix[ADDR_PREFIX]
9641 && exp->X_op == O_constant)
9642 {
9643 /* Since displacement is signed extended to 64bit, don't allow
9644 disp32 and turn off disp32s if they are out of range. */
9645 i.types[this_operand].bitfield.disp32 = 0;
9646 if (!fits_in_signed_long (exp->X_add_number))
9647 {
9648 i.types[this_operand].bitfield.disp32s = 0;
9649 if (i.types[this_operand].bitfield.baseindex)
9650 {
9651 as_bad (_("0x%lx out range of signed 32bit displacement"),
9652 (long) exp->X_add_number);
9653 ret = 0;
9654 }
9655 }
9656 }
9657
4c63da97 9658#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
9659 else if (exp->X_op != O_constant
9660 && OUTPUT_FLAVOR == bfd_target_aout_flavour
9661 && exp_seg != absolute_section
9662 && exp_seg != text_section
9663 && exp_seg != data_section
9664 && exp_seg != bss_section
9665 && exp_seg != undefined_section
9666 && !bfd_is_com_section (exp_seg))
24eab124 9667 {
d0b47220 9668 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 9669 ret = 0;
24eab124 9670 }
252b5132 9671#endif
3956db08 9672
40fb9820
L
9673 /* Check if this is a displacement only operand. */
9674 bigdisp = i.types[this_operand];
9675 bigdisp.bitfield.disp8 = 0;
9676 bigdisp.bitfield.disp16 = 0;
9677 bigdisp.bitfield.disp32 = 0;
9678 bigdisp.bitfield.disp32s = 0;
9679 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 9680 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
9681 i.types[this_operand] = operand_type_and (i.types[this_operand],
9682 types);
3956db08 9683
3992d3b7 9684 return ret;
252b5132
RH
9685}
9686
2abc2bec
JB
9687/* Return the active addressing mode, taking address override and
9688 registers forming the address into consideration. Update the
9689 address override prefix if necessary. */
47926f60 9690
2abc2bec
JB
9691static enum flag_code
9692i386_addressing_mode (void)
252b5132 9693{
be05d201
L
9694 enum flag_code addr_mode;
9695
9696 if (i.prefix[ADDR_PREFIX])
9697 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
9698 else
9699 {
9700 addr_mode = flag_code;
9701
24eab124 9702#if INFER_ADDR_PREFIX
be05d201
L
9703 if (i.mem_operands == 0)
9704 {
9705 /* Infer address prefix from the first memory operand. */
9706 const reg_entry *addr_reg = i.base_reg;
9707
9708 if (addr_reg == NULL)
9709 addr_reg = i.index_reg;
eecb386c 9710
be05d201
L
9711 if (addr_reg)
9712 {
e968fc9b 9713 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
9714 addr_mode = CODE_32BIT;
9715 else if (flag_code != CODE_64BIT
dc821c5f 9716 && addr_reg->reg_type.bitfield.word)
be05d201
L
9717 addr_mode = CODE_16BIT;
9718
9719 if (addr_mode != flag_code)
9720 {
9721 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
9722 i.prefixes += 1;
9723 /* Change the size of any displacement too. At most one
9724 of Disp16 or Disp32 is set.
9725 FIXME. There doesn't seem to be any real need for
9726 separate Disp16 and Disp32 flags. The same goes for
9727 Imm16 and Imm32. Removing them would probably clean
9728 up the code quite a lot. */
9729 if (flag_code != CODE_64BIT
9730 && (i.types[this_operand].bitfield.disp16
9731 || i.types[this_operand].bitfield.disp32))
9732 i.types[this_operand]
9733 = operand_type_xor (i.types[this_operand], disp16_32);
9734 }
9735 }
9736 }
24eab124 9737#endif
be05d201
L
9738 }
9739
2abc2bec
JB
9740 return addr_mode;
9741}
9742
9743/* Make sure the memory operand we've been dealt is valid.
9744 Return 1 on success, 0 on a failure. */
9745
9746static int
9747i386_index_check (const char *operand_string)
9748{
9749 const char *kind = "base/index";
9750 enum flag_code addr_mode = i386_addressing_mode ();
9751
fc0763e6 9752 if (current_templates->start->opcode_modifier.isstring
c3949f43 9753 && !current_templates->start->cpu_flags.bitfield.cpupadlock
fc0763e6
JB
9754 && (current_templates->end[-1].opcode_modifier.isstring
9755 || i.mem_operands))
9756 {
9757 /* Memory operands of string insns are special in that they only allow
9758 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
9759 const reg_entry *expected_reg;
9760 static const char *di_si[][2] =
9761 {
9762 { "esi", "edi" },
9763 { "si", "di" },
9764 { "rsi", "rdi" }
9765 };
9766 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
9767
9768 kind = "string address";
9769
8325cc63 9770 if (current_templates->start->opcode_modifier.repprefixok)
fc0763e6 9771 {
51c8edf6
JB
9772 int es_op = current_templates->end[-1].opcode_modifier.isstring
9773 - IS_STRING_ES_OP0;
9774 int op = 0;
fc0763e6 9775
51c8edf6 9776 if (!current_templates->end[-1].operand_types[0].bitfield.baseindex
fc0763e6
JB
9777 || ((!i.mem_operands != !intel_syntax)
9778 && current_templates->end[-1].operand_types[1]
9779 .bitfield.baseindex))
51c8edf6
JB
9780 op = 1;
9781 expected_reg = hash_find (reg_hash, di_si[addr_mode][op == es_op]);
fc0763e6
JB
9782 }
9783 else
be05d201 9784 expected_reg = hash_find (reg_hash, bx[addr_mode]);
fc0763e6 9785
be05d201
L
9786 if (i.base_reg != expected_reg
9787 || i.index_reg
fc0763e6 9788 || operand_type_check (i.types[this_operand], disp))
fc0763e6 9789 {
be05d201
L
9790 /* The second memory operand must have the same size as
9791 the first one. */
9792 if (i.mem_operands
9793 && i.base_reg
9794 && !((addr_mode == CODE_64BIT
dc821c5f 9795 && i.base_reg->reg_type.bitfield.qword)
be05d201 9796 || (addr_mode == CODE_32BIT
dc821c5f
JB
9797 ? i.base_reg->reg_type.bitfield.dword
9798 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
9799 goto bad_address;
9800
fc0763e6
JB
9801 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
9802 operand_string,
9803 intel_syntax ? '[' : '(',
9804 register_prefix,
be05d201 9805 expected_reg->reg_name,
fc0763e6 9806 intel_syntax ? ']' : ')');
be05d201 9807 return 1;
fc0763e6 9808 }
be05d201
L
9809 else
9810 return 1;
9811
9812bad_address:
9813 as_bad (_("`%s' is not a valid %s expression"),
9814 operand_string, kind);
9815 return 0;
3e73aa7c
JH
9816 }
9817 else
9818 {
be05d201
L
9819 if (addr_mode != CODE_16BIT)
9820 {
9821 /* 32-bit/64-bit checks. */
9822 if ((i.base_reg
e968fc9b
JB
9823 && ((addr_mode == CODE_64BIT
9824 ? !i.base_reg->reg_type.bitfield.qword
9825 : !i.base_reg->reg_type.bitfield.dword)
9826 || (i.index_reg && i.base_reg->reg_num == RegIP)
9827 || i.base_reg->reg_num == RegIZ))
be05d201 9828 || (i.index_reg
1b54b8d7
JB
9829 && !i.index_reg->reg_type.bitfield.xmmword
9830 && !i.index_reg->reg_type.bitfield.ymmword
9831 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 9832 && ((addr_mode == CODE_64BIT
e968fc9b
JB
9833 ? !i.index_reg->reg_type.bitfield.qword
9834 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
9835 || !i.index_reg->reg_type.bitfield.baseindex)))
9836 goto bad_address;
8178be5b
JB
9837
9838 /* bndmk, bndldx, and bndstx have special restrictions. */
9839 if (current_templates->start->base_opcode == 0xf30f1b
9840 || (current_templates->start->base_opcode & ~1) == 0x0f1a)
9841 {
9842 /* They cannot use RIP-relative addressing. */
e968fc9b 9843 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
9844 {
9845 as_bad (_("`%s' cannot be used here"), operand_string);
9846 return 0;
9847 }
9848
9849 /* bndldx and bndstx ignore their scale factor. */
9850 if (current_templates->start->base_opcode != 0xf30f1b
9851 && i.log2_scale_factor)
9852 as_warn (_("register scaling is being ignored here"));
9853 }
be05d201
L
9854 }
9855 else
3e73aa7c 9856 {
be05d201 9857 /* 16-bit checks. */
3e73aa7c 9858 if ((i.base_reg
dc821c5f 9859 && (!i.base_reg->reg_type.bitfield.word
40fb9820 9860 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 9861 || (i.index_reg
dc821c5f 9862 && (!i.index_reg->reg_type.bitfield.word
40fb9820 9863 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
9864 || !(i.base_reg
9865 && i.base_reg->reg_num < 6
9866 && i.index_reg->reg_num >= 6
9867 && i.log2_scale_factor == 0))))
be05d201 9868 goto bad_address;
3e73aa7c
JH
9869 }
9870 }
be05d201 9871 return 1;
24eab124 9872}
252b5132 9873
43234a1e
L
9874/* Handle vector immediates. */
9875
9876static int
9877RC_SAE_immediate (const char *imm_start)
9878{
9879 unsigned int match_found, j;
9880 const char *pstr = imm_start;
9881 expressionS *exp;
9882
9883 if (*pstr != '{')
9884 return 0;
9885
9886 pstr++;
9887 match_found = 0;
9888 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
9889 {
9890 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
9891 {
9892 if (!i.rounding)
9893 {
9894 rc_op.type = RC_NamesTable[j].type;
9895 rc_op.operand = this_operand;
9896 i.rounding = &rc_op;
9897 }
9898 else
9899 {
9900 as_bad (_("duplicated `%s'"), imm_start);
9901 return 0;
9902 }
9903 pstr += RC_NamesTable[j].len;
9904 match_found = 1;
9905 break;
9906 }
9907 }
9908 if (!match_found)
9909 return 0;
9910
9911 if (*pstr++ != '}')
9912 {
9913 as_bad (_("Missing '}': '%s'"), imm_start);
9914 return 0;
9915 }
9916 /* RC/SAE immediate string should contain nothing more. */;
9917 if (*pstr != 0)
9918 {
9919 as_bad (_("Junk after '}': '%s'"), imm_start);
9920 return 0;
9921 }
9922
9923 exp = &im_expressions[i.imm_operands++];
9924 i.op[this_operand].imms = exp;
9925
9926 exp->X_op = O_constant;
9927 exp->X_add_number = 0;
9928 exp->X_add_symbol = (symbolS *) 0;
9929 exp->X_op_symbol = (symbolS *) 0;
9930
9931 i.types[this_operand].bitfield.imm8 = 1;
9932 return 1;
9933}
9934
8325cc63
JB
9935/* Only string instructions can have a second memory operand, so
9936 reduce current_templates to just those if it contains any. */
9937static int
9938maybe_adjust_templates (void)
9939{
9940 const insn_template *t;
9941
9942 gas_assert (i.mem_operands == 1);
9943
9944 for (t = current_templates->start; t < current_templates->end; ++t)
9945 if (t->opcode_modifier.isstring)
9946 break;
9947
9948 if (t < current_templates->end)
9949 {
9950 static templates aux_templates;
9951 bfd_boolean recheck;
9952
9953 aux_templates.start = t;
9954 for (; t < current_templates->end; ++t)
9955 if (!t->opcode_modifier.isstring)
9956 break;
9957 aux_templates.end = t;
9958
9959 /* Determine whether to re-check the first memory operand. */
9960 recheck = (aux_templates.start != current_templates->start
9961 || t != current_templates->end);
9962
9963 current_templates = &aux_templates;
9964
9965 if (recheck)
9966 {
9967 i.mem_operands = 0;
9968 if (i.memop1_string != NULL
9969 && i386_index_check (i.memop1_string) == 0)
9970 return 0;
9971 i.mem_operands = 1;
9972 }
9973 }
9974
9975 return 1;
9976}
9977
fc0763e6 9978/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 9979 on error. */
252b5132 9980
252b5132 9981static int
a7619375 9982i386_att_operand (char *operand_string)
252b5132 9983{
af6bdddf
AM
9984 const reg_entry *r;
9985 char *end_op;
24eab124 9986 char *op_string = operand_string;
252b5132 9987
24eab124 9988 if (is_space_char (*op_string))
252b5132
RH
9989 ++op_string;
9990
24eab124 9991 /* We check for an absolute prefix (differentiating,
47926f60 9992 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
9993 if (*op_string == ABSOLUTE_PREFIX)
9994 {
9995 ++op_string;
9996 if (is_space_char (*op_string))
9997 ++op_string;
40fb9820 9998 i.types[this_operand].bitfield.jumpabsolute = 1;
24eab124 9999 }
252b5132 10000
47926f60 10001 /* Check if operand is a register. */
4d1bb795 10002 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 10003 {
40fb9820
L
10004 i386_operand_type temp;
10005
24eab124
AM
10006 /* Check for a segment override by searching for ':' after a
10007 segment register. */
10008 op_string = end_op;
10009 if (is_space_char (*op_string))
10010 ++op_string;
00cee14f 10011 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124
AM
10012 {
10013 switch (r->reg_num)
10014 {
10015 case 0:
10016 i.seg[i.mem_operands] = &es;
10017 break;
10018 case 1:
10019 i.seg[i.mem_operands] = &cs;
10020 break;
10021 case 2:
10022 i.seg[i.mem_operands] = &ss;
10023 break;
10024 case 3:
10025 i.seg[i.mem_operands] = &ds;
10026 break;
10027 case 4:
10028 i.seg[i.mem_operands] = &fs;
10029 break;
10030 case 5:
10031 i.seg[i.mem_operands] = &gs;
10032 break;
10033 }
252b5132 10034
24eab124 10035 /* Skip the ':' and whitespace. */
252b5132
RH
10036 ++op_string;
10037 if (is_space_char (*op_string))
24eab124 10038 ++op_string;
252b5132 10039
24eab124
AM
10040 if (!is_digit_char (*op_string)
10041 && !is_identifier_char (*op_string)
10042 && *op_string != '('
10043 && *op_string != ABSOLUTE_PREFIX)
10044 {
10045 as_bad (_("bad memory operand `%s'"), op_string);
10046 return 0;
10047 }
47926f60 10048 /* Handle case of %es:*foo. */
24eab124
AM
10049 if (*op_string == ABSOLUTE_PREFIX)
10050 {
10051 ++op_string;
10052 if (is_space_char (*op_string))
10053 ++op_string;
40fb9820 10054 i.types[this_operand].bitfield.jumpabsolute = 1;
24eab124
AM
10055 }
10056 goto do_memory_reference;
10057 }
43234a1e
L
10058
10059 /* Handle vector operations. */
10060 if (*op_string == '{')
10061 {
10062 op_string = check_VecOperations (op_string, NULL);
10063 if (op_string == NULL)
10064 return 0;
10065 }
10066
24eab124
AM
10067 if (*op_string)
10068 {
d0b47220 10069 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
10070 return 0;
10071 }
40fb9820
L
10072 temp = r->reg_type;
10073 temp.bitfield.baseindex = 0;
c6fb90c8
L
10074 i.types[this_operand] = operand_type_or (i.types[this_operand],
10075 temp);
7d5e4556 10076 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 10077 i.op[this_operand].regs = r;
24eab124
AM
10078 i.reg_operands++;
10079 }
af6bdddf
AM
10080 else if (*op_string == REGISTER_PREFIX)
10081 {
10082 as_bad (_("bad register name `%s'"), op_string);
10083 return 0;
10084 }
24eab124 10085 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 10086 {
24eab124 10087 ++op_string;
40fb9820 10088 if (i.types[this_operand].bitfield.jumpabsolute)
24eab124 10089 {
d0b47220 10090 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
10091 return 0;
10092 }
10093 if (!i386_immediate (op_string))
10094 return 0;
10095 }
43234a1e
L
10096 else if (RC_SAE_immediate (operand_string))
10097 {
10098 /* If it is a RC or SAE immediate, do nothing. */
10099 ;
10100 }
24eab124
AM
10101 else if (is_digit_char (*op_string)
10102 || is_identifier_char (*op_string)
d02603dc 10103 || *op_string == '"'
e5cb08ac 10104 || *op_string == '(')
24eab124 10105 {
47926f60 10106 /* This is a memory reference of some sort. */
af6bdddf 10107 char *base_string;
252b5132 10108
47926f60 10109 /* Start and end of displacement string expression (if found). */
eecb386c
AM
10110 char *displacement_string_start;
10111 char *displacement_string_end;
43234a1e 10112 char *vop_start;
252b5132 10113
24eab124 10114 do_memory_reference:
8325cc63
JB
10115 if (i.mem_operands == 1 && !maybe_adjust_templates ())
10116 return 0;
24eab124 10117 if ((i.mem_operands == 1
40fb9820 10118 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
10119 || i.mem_operands == 2)
10120 {
10121 as_bad (_("too many memory references for `%s'"),
10122 current_templates->start->name);
10123 return 0;
10124 }
252b5132 10125
24eab124
AM
10126 /* Check for base index form. We detect the base index form by
10127 looking for an ')' at the end of the operand, searching
10128 for the '(' matching it, and finding a REGISTER_PREFIX or ','
10129 after the '('. */
af6bdddf 10130 base_string = op_string + strlen (op_string);
c3332e24 10131
43234a1e
L
10132 /* Handle vector operations. */
10133 vop_start = strchr (op_string, '{');
10134 if (vop_start && vop_start < base_string)
10135 {
10136 if (check_VecOperations (vop_start, base_string) == NULL)
10137 return 0;
10138 base_string = vop_start;
10139 }
10140
af6bdddf
AM
10141 --base_string;
10142 if (is_space_char (*base_string))
10143 --base_string;
252b5132 10144
47926f60 10145 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
10146 displacement_string_start = op_string;
10147 displacement_string_end = base_string + 1;
252b5132 10148
24eab124
AM
10149 if (*base_string == ')')
10150 {
af6bdddf 10151 char *temp_string;
24eab124
AM
10152 unsigned int parens_balanced = 1;
10153 /* We've already checked that the number of left & right ()'s are
47926f60 10154 equal, so this loop will not be infinite. */
24eab124
AM
10155 do
10156 {
10157 base_string--;
10158 if (*base_string == ')')
10159 parens_balanced++;
10160 if (*base_string == '(')
10161 parens_balanced--;
10162 }
10163 while (parens_balanced);
c3332e24 10164
af6bdddf 10165 temp_string = base_string;
c3332e24 10166
24eab124 10167 /* Skip past '(' and whitespace. */
252b5132
RH
10168 ++base_string;
10169 if (is_space_char (*base_string))
24eab124 10170 ++base_string;
252b5132 10171
af6bdddf 10172 if (*base_string == ','
4eed87de
AM
10173 || ((i.base_reg = parse_register (base_string, &end_op))
10174 != NULL))
252b5132 10175 {
af6bdddf 10176 displacement_string_end = temp_string;
252b5132 10177
40fb9820 10178 i.types[this_operand].bitfield.baseindex = 1;
252b5132 10179
af6bdddf 10180 if (i.base_reg)
24eab124 10181 {
24eab124
AM
10182 base_string = end_op;
10183 if (is_space_char (*base_string))
10184 ++base_string;
af6bdddf
AM
10185 }
10186
10187 /* There may be an index reg or scale factor here. */
10188 if (*base_string == ',')
10189 {
10190 ++base_string;
10191 if (is_space_char (*base_string))
10192 ++base_string;
10193
4eed87de
AM
10194 if ((i.index_reg = parse_register (base_string, &end_op))
10195 != NULL)
24eab124 10196 {
af6bdddf 10197 base_string = end_op;
24eab124
AM
10198 if (is_space_char (*base_string))
10199 ++base_string;
af6bdddf
AM
10200 if (*base_string == ',')
10201 {
10202 ++base_string;
10203 if (is_space_char (*base_string))
10204 ++base_string;
10205 }
e5cb08ac 10206 else if (*base_string != ')')
af6bdddf 10207 {
4eed87de
AM
10208 as_bad (_("expecting `,' or `)' "
10209 "after index register in `%s'"),
af6bdddf
AM
10210 operand_string);
10211 return 0;
10212 }
24eab124 10213 }
af6bdddf 10214 else if (*base_string == REGISTER_PREFIX)
24eab124 10215 {
f76bf5e0
L
10216 end_op = strchr (base_string, ',');
10217 if (end_op)
10218 *end_op = '\0';
af6bdddf 10219 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
10220 return 0;
10221 }
252b5132 10222
47926f60 10223 /* Check for scale factor. */
551c1ca1 10224 if (*base_string != ')')
af6bdddf 10225 {
551c1ca1
AM
10226 char *end_scale = i386_scale (base_string);
10227
10228 if (!end_scale)
af6bdddf 10229 return 0;
24eab124 10230
551c1ca1 10231 base_string = end_scale;
af6bdddf
AM
10232 if (is_space_char (*base_string))
10233 ++base_string;
10234 if (*base_string != ')')
10235 {
4eed87de
AM
10236 as_bad (_("expecting `)' "
10237 "after scale factor in `%s'"),
af6bdddf
AM
10238 operand_string);
10239 return 0;
10240 }
10241 }
10242 else if (!i.index_reg)
24eab124 10243 {
4eed87de
AM
10244 as_bad (_("expecting index register or scale factor "
10245 "after `,'; got '%c'"),
af6bdddf 10246 *base_string);
24eab124
AM
10247 return 0;
10248 }
10249 }
af6bdddf 10250 else if (*base_string != ')')
24eab124 10251 {
4eed87de
AM
10252 as_bad (_("expecting `,' or `)' "
10253 "after base register in `%s'"),
af6bdddf 10254 operand_string);
24eab124
AM
10255 return 0;
10256 }
c3332e24 10257 }
af6bdddf 10258 else if (*base_string == REGISTER_PREFIX)
c3332e24 10259 {
f76bf5e0
L
10260 end_op = strchr (base_string, ',');
10261 if (end_op)
10262 *end_op = '\0';
af6bdddf 10263 as_bad (_("bad register name `%s'"), base_string);
24eab124 10264 return 0;
c3332e24 10265 }
24eab124
AM
10266 }
10267
10268 /* If there's an expression beginning the operand, parse it,
10269 assuming displacement_string_start and
10270 displacement_string_end are meaningful. */
10271 if (displacement_string_start != displacement_string_end)
10272 {
10273 if (!i386_displacement (displacement_string_start,
10274 displacement_string_end))
10275 return 0;
10276 }
10277
10278 /* Special case for (%dx) while doing input/output op. */
10279 if (i.base_reg
75e5731b
JB
10280 && i.base_reg->reg_type.bitfield.instance == RegD
10281 && i.base_reg->reg_type.bitfield.word
24eab124
AM
10282 && i.index_reg == 0
10283 && i.log2_scale_factor == 0
10284 && i.seg[i.mem_operands] == 0
40fb9820 10285 && !operand_type_check (i.types[this_operand], disp))
24eab124 10286 {
2fb5be8d 10287 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
10288 return 1;
10289 }
10290
eecb386c
AM
10291 if (i386_index_check (operand_string) == 0)
10292 return 0;
c48dadc9 10293 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
10294 if (i.mem_operands == 0)
10295 i.memop1_string = xstrdup (operand_string);
24eab124
AM
10296 i.mem_operands++;
10297 }
10298 else
ce8a8b2f
AM
10299 {
10300 /* It's not a memory operand; argh! */
24eab124
AM
10301 as_bad (_("invalid char %s beginning operand %d `%s'"),
10302 output_invalid (*op_string),
10303 this_operand + 1,
10304 op_string);
10305 return 0;
10306 }
47926f60 10307 return 1; /* Normal return. */
252b5132
RH
10308}
10309\f
fa94de6b
RM
10310/* Calculate the maximum variable size (i.e., excluding fr_fix)
10311 that an rs_machine_dependent frag may reach. */
10312
10313unsigned int
10314i386_frag_max_var (fragS *frag)
10315{
10316 /* The only relaxable frags are for jumps.
10317 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
10318 gas_assert (frag->fr_type == rs_machine_dependent);
10319 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
10320}
10321
b084df0b
L
10322#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
10323static int
8dcea932 10324elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
10325{
10326 /* STT_GNU_IFUNC symbol must go through PLT. */
10327 if ((symbol_get_bfdsym (fr_symbol)->flags
10328 & BSF_GNU_INDIRECT_FUNCTION) != 0)
10329 return 0;
10330
10331 if (!S_IS_EXTERNAL (fr_symbol))
10332 /* Symbol may be weak or local. */
10333 return !S_IS_WEAK (fr_symbol);
10334
8dcea932
L
10335 /* Global symbols with non-default visibility can't be preempted. */
10336 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
10337 return 1;
10338
10339 if (fr_var != NO_RELOC)
10340 switch ((enum bfd_reloc_code_real) fr_var)
10341 {
10342 case BFD_RELOC_386_PLT32:
10343 case BFD_RELOC_X86_64_PLT32:
33eaf5de 10344 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
10345 return 0;
10346 default:
10347 abort ();
10348 }
10349
b084df0b
L
10350 /* Global symbols with default visibility in a shared library may be
10351 preempted by another definition. */
8dcea932 10352 return !shared;
b084df0b
L
10353}
10354#endif
10355
ee7fcc42
AM
10356/* md_estimate_size_before_relax()
10357
10358 Called just before relax() for rs_machine_dependent frags. The x86
10359 assembler uses these frags to handle variable size jump
10360 instructions.
10361
10362 Any symbol that is now undefined will not become defined.
10363 Return the correct fr_subtype in the frag.
10364 Return the initial "guess for variable size of frag" to caller.
10365 The guess is actually the growth beyond the fixed part. Whatever
10366 we do to grow the fixed or variable part contributes to our
10367 returned value. */
10368
252b5132 10369int
7016a5d5 10370md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 10371{
252b5132 10372 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
10373 check for un-relaxable symbols. On an ELF system, we can't relax
10374 an externally visible symbol, because it may be overridden by a
10375 shared library. */
10376 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 10377#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 10378 || (IS_ELF
8dcea932
L
10379 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
10380 fragP->fr_var))
fbeb56a4
DK
10381#endif
10382#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 10383 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 10384 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
10385#endif
10386 )
252b5132 10387 {
b98ef147
AM
10388 /* Symbol is undefined in this segment, or we need to keep a
10389 reloc so that weak symbols can be overridden. */
10390 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 10391 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
10392 unsigned char *opcode;
10393 int old_fr_fix;
f6af82bd 10394
ee7fcc42 10395 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 10396 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 10397 else if (size == 2)
f6af82bd 10398 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
10399#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
10400 else if (need_plt32_p (fragP->fr_symbol))
10401 reloc_type = BFD_RELOC_X86_64_PLT32;
10402#endif
f6af82bd
AM
10403 else
10404 reloc_type = BFD_RELOC_32_PCREL;
252b5132 10405
ee7fcc42
AM
10406 old_fr_fix = fragP->fr_fix;
10407 opcode = (unsigned char *) fragP->fr_opcode;
10408
fddf5b5b 10409 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 10410 {
fddf5b5b
AM
10411 case UNCOND_JUMP:
10412 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 10413 opcode[0] = 0xe9;
252b5132 10414 fragP->fr_fix += size;
062cd5e7
AS
10415 fix_new (fragP, old_fr_fix, size,
10416 fragP->fr_symbol,
10417 fragP->fr_offset, 1,
10418 reloc_type);
252b5132
RH
10419 break;
10420
fddf5b5b 10421 case COND_JUMP86:
412167cb
AM
10422 if (size == 2
10423 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
10424 {
10425 /* Negate the condition, and branch past an
10426 unconditional jump. */
10427 opcode[0] ^= 1;
10428 opcode[1] = 3;
10429 /* Insert an unconditional jump. */
10430 opcode[2] = 0xe9;
10431 /* We added two extra opcode bytes, and have a two byte
10432 offset. */
10433 fragP->fr_fix += 2 + 2;
062cd5e7
AS
10434 fix_new (fragP, old_fr_fix + 2, 2,
10435 fragP->fr_symbol,
10436 fragP->fr_offset, 1,
10437 reloc_type);
fddf5b5b
AM
10438 break;
10439 }
10440 /* Fall through. */
10441
10442 case COND_JUMP:
412167cb
AM
10443 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
10444 {
3e02c1cc
AM
10445 fixS *fixP;
10446
412167cb 10447 fragP->fr_fix += 1;
3e02c1cc
AM
10448 fixP = fix_new (fragP, old_fr_fix, 1,
10449 fragP->fr_symbol,
10450 fragP->fr_offset, 1,
10451 BFD_RELOC_8_PCREL);
10452 fixP->fx_signed = 1;
412167cb
AM
10453 break;
10454 }
93c2a809 10455
24eab124 10456 /* This changes the byte-displacement jump 0x7N
fddf5b5b 10457 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 10458 opcode[1] = opcode[0] + 0x10;
f6af82bd 10459 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
10460 /* We've added an opcode byte. */
10461 fragP->fr_fix += 1 + size;
062cd5e7
AS
10462 fix_new (fragP, old_fr_fix + 1, size,
10463 fragP->fr_symbol,
10464 fragP->fr_offset, 1,
10465 reloc_type);
252b5132 10466 break;
fddf5b5b
AM
10467
10468 default:
10469 BAD_CASE (fragP->fr_subtype);
10470 break;
252b5132
RH
10471 }
10472 frag_wane (fragP);
ee7fcc42 10473 return fragP->fr_fix - old_fr_fix;
252b5132 10474 }
93c2a809 10475
93c2a809
AM
10476 /* Guess size depending on current relax state. Initially the relax
10477 state will correspond to a short jump and we return 1, because
10478 the variable part of the frag (the branch offset) is one byte
10479 long. However, we can relax a section more than once and in that
10480 case we must either set fr_subtype back to the unrelaxed state,
10481 or return the value for the appropriate branch. */
10482 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
10483}
10484
47926f60
KH
10485/* Called after relax() is finished.
10486
10487 In: Address of frag.
10488 fr_type == rs_machine_dependent.
10489 fr_subtype is what the address relaxed to.
10490
10491 Out: Any fixSs and constants are set up.
10492 Caller will turn frag into a ".space 0". */
10493
252b5132 10494void
7016a5d5
TG
10495md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
10496 fragS *fragP)
252b5132 10497{
29b0f896 10498 unsigned char *opcode;
252b5132 10499 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
10500 offsetT target_address;
10501 offsetT opcode_address;
252b5132 10502 unsigned int extension = 0;
847f7ad4 10503 offsetT displacement_from_opcode_start;
252b5132
RH
10504
10505 opcode = (unsigned char *) fragP->fr_opcode;
10506
47926f60 10507 /* Address we want to reach in file space. */
252b5132 10508 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 10509
47926f60 10510 /* Address opcode resides at in file space. */
252b5132
RH
10511 opcode_address = fragP->fr_address + fragP->fr_fix;
10512
47926f60 10513 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
10514 displacement_from_opcode_start = target_address - opcode_address;
10515
fddf5b5b 10516 if ((fragP->fr_subtype & BIG) == 0)
252b5132 10517 {
47926f60
KH
10518 /* Don't have to change opcode. */
10519 extension = 1; /* 1 opcode + 1 displacement */
252b5132 10520 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
10521 }
10522 else
10523 {
10524 if (no_cond_jump_promotion
10525 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
10526 as_warn_where (fragP->fr_file, fragP->fr_line,
10527 _("long jump required"));
252b5132 10528
fddf5b5b
AM
10529 switch (fragP->fr_subtype)
10530 {
10531 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
10532 extension = 4; /* 1 opcode + 4 displacement */
10533 opcode[0] = 0xe9;
10534 where_to_put_displacement = &opcode[1];
10535 break;
252b5132 10536
fddf5b5b
AM
10537 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
10538 extension = 2; /* 1 opcode + 2 displacement */
10539 opcode[0] = 0xe9;
10540 where_to_put_displacement = &opcode[1];
10541 break;
252b5132 10542
fddf5b5b
AM
10543 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
10544 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
10545 extension = 5; /* 2 opcode + 4 displacement */
10546 opcode[1] = opcode[0] + 0x10;
10547 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
10548 where_to_put_displacement = &opcode[2];
10549 break;
252b5132 10550
fddf5b5b
AM
10551 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
10552 extension = 3; /* 2 opcode + 2 displacement */
10553 opcode[1] = opcode[0] + 0x10;
10554 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
10555 where_to_put_displacement = &opcode[2];
10556 break;
252b5132 10557
fddf5b5b
AM
10558 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
10559 extension = 4;
10560 opcode[0] ^= 1;
10561 opcode[1] = 3;
10562 opcode[2] = 0xe9;
10563 where_to_put_displacement = &opcode[3];
10564 break;
10565
10566 default:
10567 BAD_CASE (fragP->fr_subtype);
10568 break;
10569 }
252b5132 10570 }
fddf5b5b 10571
7b81dfbb
AJ
10572 /* If size if less then four we are sure that the operand fits,
10573 but if it's 4, then it could be that the displacement is larger
10574 then -/+ 2GB. */
10575 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
10576 && object_64bit
10577 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
10578 + ((addressT) 1 << 31))
10579 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
10580 {
10581 as_bad_where (fragP->fr_file, fragP->fr_line,
10582 _("jump target out of range"));
10583 /* Make us emit 0. */
10584 displacement_from_opcode_start = extension;
10585 }
47926f60 10586 /* Now put displacement after opcode. */
252b5132
RH
10587 md_number_to_chars ((char *) where_to_put_displacement,
10588 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 10589 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
10590 fragP->fr_fix += extension;
10591}
10592\f
7016a5d5 10593/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
10594 by our caller that we have all the info we need to fix it up.
10595
7016a5d5
TG
10596 Parameter valP is the pointer to the value of the bits.
10597
252b5132
RH
10598 On the 386, immediates, displacements, and data pointers are all in
10599 the same (little-endian) format, so we don't need to care about which
10600 we are handling. */
10601
94f592af 10602void
7016a5d5 10603md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 10604{
94f592af 10605 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 10606 valueT value = *valP;
252b5132 10607
f86103b7 10608#if !defined (TE_Mach)
93382f6d
AM
10609 if (fixP->fx_pcrel)
10610 {
10611 switch (fixP->fx_r_type)
10612 {
5865bb77
ILT
10613 default:
10614 break;
10615
d6ab8113
JB
10616 case BFD_RELOC_64:
10617 fixP->fx_r_type = BFD_RELOC_64_PCREL;
10618 break;
93382f6d 10619 case BFD_RELOC_32:
ae8887b5 10620 case BFD_RELOC_X86_64_32S:
93382f6d
AM
10621 fixP->fx_r_type = BFD_RELOC_32_PCREL;
10622 break;
10623 case BFD_RELOC_16:
10624 fixP->fx_r_type = BFD_RELOC_16_PCREL;
10625 break;
10626 case BFD_RELOC_8:
10627 fixP->fx_r_type = BFD_RELOC_8_PCREL;
10628 break;
10629 }
10630 }
252b5132 10631
a161fe53 10632 if (fixP->fx_addsy != NULL
31312f95 10633 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 10634 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 10635 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 10636 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 10637 && !use_rela_relocations)
252b5132 10638 {
31312f95
AM
10639 /* This is a hack. There should be a better way to handle this.
10640 This covers for the fact that bfd_install_relocation will
10641 subtract the current location (for partial_inplace, PC relative
10642 relocations); see more below. */
252b5132 10643#ifndef OBJ_AOUT
718ddfc0 10644 if (IS_ELF
252b5132
RH
10645#ifdef TE_PE
10646 || OUTPUT_FLAVOR == bfd_target_coff_flavour
10647#endif
10648 )
10649 value += fixP->fx_where + fixP->fx_frag->fr_address;
10650#endif
10651#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 10652 if (IS_ELF)
252b5132 10653 {
6539b54b 10654 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 10655
6539b54b 10656 if ((sym_seg == seg
2f66722d 10657 || (symbol_section_p (fixP->fx_addsy)
6539b54b 10658 && sym_seg != absolute_section))
af65af87 10659 && !generic_force_reloc (fixP))
2f66722d
AM
10660 {
10661 /* Yes, we add the values in twice. This is because
6539b54b
AM
10662 bfd_install_relocation subtracts them out again. I think
10663 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
10664 it. FIXME. */
10665 value += fixP->fx_where + fixP->fx_frag->fr_address;
10666 }
252b5132
RH
10667 }
10668#endif
10669#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
10670 /* For some reason, the PE format does not store a
10671 section address offset for a PC relative symbol. */
10672 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 10673 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
10674 value += md_pcrel_from (fixP);
10675#endif
10676 }
fbeb56a4 10677#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
10678 if (fixP->fx_addsy != NULL
10679 && S_IS_WEAK (fixP->fx_addsy)
10680 /* PR 16858: Do not modify weak function references. */
10681 && ! fixP->fx_pcrel)
fbeb56a4 10682 {
296a8689
NC
10683#if !defined (TE_PEP)
10684 /* For x86 PE weak function symbols are neither PC-relative
10685 nor do they set S_IS_FUNCTION. So the only reliable way
10686 to detect them is to check the flags of their containing
10687 section. */
10688 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
10689 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
10690 ;
10691 else
10692#endif
fbeb56a4
DK
10693 value -= S_GET_VALUE (fixP->fx_addsy);
10694 }
10695#endif
252b5132
RH
10696
10697 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 10698 and we must not disappoint it. */
252b5132 10699#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 10700 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
10701 switch (fixP->fx_r_type)
10702 {
10703 case BFD_RELOC_386_PLT32:
3e73aa7c 10704 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
10705 /* Make the jump instruction point to the address of the operand.
10706 At runtime we merely add the offset to the actual PLT entry.
10707 NB: Subtract the offset size only for jump instructions. */
10708 if (fixP->fx_pcrel)
10709 value = -4;
47926f60 10710 break;
31312f95 10711
13ae64f3
JJ
10712 case BFD_RELOC_386_TLS_GD:
10713 case BFD_RELOC_386_TLS_LDM:
13ae64f3 10714 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
10715 case BFD_RELOC_386_TLS_IE:
10716 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 10717 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
10718 case BFD_RELOC_X86_64_TLSGD:
10719 case BFD_RELOC_X86_64_TLSLD:
10720 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 10721 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
10722 value = 0; /* Fully resolved at runtime. No addend. */
10723 /* Fallthrough */
10724 case BFD_RELOC_386_TLS_LE:
10725 case BFD_RELOC_386_TLS_LDO_32:
10726 case BFD_RELOC_386_TLS_LE_32:
10727 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 10728 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 10729 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 10730 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
10731 S_SET_THREAD_LOCAL (fixP->fx_addsy);
10732 break;
10733
67a4f2b7
AO
10734 case BFD_RELOC_386_TLS_DESC_CALL:
10735 case BFD_RELOC_X86_64_TLSDESC_CALL:
10736 value = 0; /* Fully resolved at runtime. No addend. */
10737 S_SET_THREAD_LOCAL (fixP->fx_addsy);
10738 fixP->fx_done = 0;
10739 return;
10740
47926f60
KH
10741 case BFD_RELOC_VTABLE_INHERIT:
10742 case BFD_RELOC_VTABLE_ENTRY:
10743 fixP->fx_done = 0;
94f592af 10744 return;
47926f60
KH
10745
10746 default:
10747 break;
10748 }
10749#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 10750 *valP = value;
f86103b7 10751#endif /* !defined (TE_Mach) */
3e73aa7c 10752
3e73aa7c 10753 /* Are we finished with this relocation now? */
c6682705 10754 if (fixP->fx_addsy == NULL)
3e73aa7c 10755 fixP->fx_done = 1;
fbeb56a4
DK
10756#if defined (OBJ_COFF) && defined (TE_PE)
10757 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
10758 {
10759 fixP->fx_done = 0;
10760 /* Remember value for tc_gen_reloc. */
10761 fixP->fx_addnumber = value;
10762 /* Clear out the frag for now. */
10763 value = 0;
10764 }
10765#endif
3e73aa7c
JH
10766 else if (use_rela_relocations)
10767 {
10768 fixP->fx_no_overflow = 1;
062cd5e7
AS
10769 /* Remember value for tc_gen_reloc. */
10770 fixP->fx_addnumber = value;
3e73aa7c
JH
10771 value = 0;
10772 }
f86103b7 10773
94f592af 10774 md_number_to_chars (p, value, fixP->fx_size);
252b5132 10775}
252b5132 10776\f
6d4af3c2 10777const char *
499ac353 10778md_atof (int type, char *litP, int *sizeP)
252b5132 10779{
499ac353
NC
10780 /* This outputs the LITTLENUMs in REVERSE order;
10781 in accord with the bigendian 386. */
10782 return ieee_md_atof (type, litP, sizeP, FALSE);
252b5132
RH
10783}
10784\f
2d545b82 10785static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 10786
252b5132 10787static char *
e3bb37b5 10788output_invalid (int c)
252b5132 10789{
3882b010 10790 if (ISPRINT (c))
f9f21a03
L
10791 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
10792 "'%c'", c);
252b5132 10793 else
f9f21a03 10794 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 10795 "(0x%x)", (unsigned char) c);
252b5132
RH
10796 return output_invalid_buf;
10797}
10798
af6bdddf 10799/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
10800
10801static const reg_entry *
4d1bb795 10802parse_real_register (char *reg_string, char **end_op)
252b5132 10803{
af6bdddf
AM
10804 char *s = reg_string;
10805 char *p;
252b5132
RH
10806 char reg_name_given[MAX_REG_NAME_SIZE + 1];
10807 const reg_entry *r;
10808
10809 /* Skip possible REGISTER_PREFIX and possible whitespace. */
10810 if (*s == REGISTER_PREFIX)
10811 ++s;
10812
10813 if (is_space_char (*s))
10814 ++s;
10815
10816 p = reg_name_given;
af6bdddf 10817 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
10818 {
10819 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
10820 return (const reg_entry *) NULL;
10821 s++;
252b5132
RH
10822 }
10823
6588847e
DN
10824 /* For naked regs, make sure that we are not dealing with an identifier.
10825 This prevents confusing an identifier like `eax_var' with register
10826 `eax'. */
10827 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
10828 return (const reg_entry *) NULL;
10829
af6bdddf 10830 *end_op = s;
252b5132
RH
10831
10832 r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
10833
5f47d35b 10834 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 10835 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 10836 {
0e0eea78
JB
10837 if (!cpu_arch_flags.bitfield.cpu8087
10838 && !cpu_arch_flags.bitfield.cpu287
10839 && !cpu_arch_flags.bitfield.cpu387)
10840 return (const reg_entry *) NULL;
10841
5f47d35b
AM
10842 if (is_space_char (*s))
10843 ++s;
10844 if (*s == '(')
10845 {
af6bdddf 10846 ++s;
5f47d35b
AM
10847 if (is_space_char (*s))
10848 ++s;
10849 if (*s >= '0' && *s <= '7')
10850 {
db557034 10851 int fpr = *s - '0';
af6bdddf 10852 ++s;
5f47d35b
AM
10853 if (is_space_char (*s))
10854 ++s;
10855 if (*s == ')')
10856 {
10857 *end_op = s + 1;
1e9cc1c2 10858 r = (const reg_entry *) hash_find (reg_hash, "st(0)");
db557034
AM
10859 know (r);
10860 return r + fpr;
5f47d35b 10861 }
5f47d35b 10862 }
47926f60 10863 /* We have "%st(" then garbage. */
5f47d35b
AM
10864 return (const reg_entry *) NULL;
10865 }
10866 }
10867
a60de03c
JB
10868 if (r == NULL || allow_pseudo_reg)
10869 return r;
10870
0dfbf9d7 10871 if (operand_type_all_zero (&r->reg_type))
a60de03c
JB
10872 return (const reg_entry *) NULL;
10873
dc821c5f 10874 if ((r->reg_type.bitfield.dword
00cee14f 10875 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
4a5c67ed
JB
10876 || r->reg_type.bitfield.class == RegCR
10877 || r->reg_type.bitfield.class == RegDR
10878 || r->reg_type.bitfield.class == RegTR)
192dc9c6
JB
10879 && !cpu_arch_flags.bitfield.cpui386)
10880 return (const reg_entry *) NULL;
10881
3528c362 10882 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
192dc9c6
JB
10883 return (const reg_entry *) NULL;
10884
6e041cf4
JB
10885 if (!cpu_arch_flags.bitfield.cpuavx512f)
10886 {
f74a6307
JB
10887 if (r->reg_type.bitfield.zmmword
10888 || r->reg_type.bitfield.class == RegMask)
6e041cf4 10889 return (const reg_entry *) NULL;
40f12533 10890
6e041cf4
JB
10891 if (!cpu_arch_flags.bitfield.cpuavx)
10892 {
10893 if (r->reg_type.bitfield.ymmword)
10894 return (const reg_entry *) NULL;
1848e567 10895
6e041cf4
JB
10896 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
10897 return (const reg_entry *) NULL;
10898 }
10899 }
43234a1e 10900
f74a6307 10901 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
1adf7f56
JB
10902 return (const reg_entry *) NULL;
10903
db51cc60 10904 /* Don't allow fake index register unless allow_index_reg isn't 0. */
e968fc9b 10905 if (!allow_index_reg && r->reg_num == RegIZ)
db51cc60
L
10906 return (const reg_entry *) NULL;
10907
1d3f8286
JB
10908 /* Upper 16 vector registers are only available with VREX in 64bit
10909 mode, and require EVEX encoding. */
10910 if (r->reg_flags & RegVRex)
43234a1e 10911 {
e951d5ca 10912 if (!cpu_arch_flags.bitfield.cpuavx512f
43234a1e
L
10913 || flag_code != CODE_64BIT)
10914 return (const reg_entry *) NULL;
1d3f8286
JB
10915
10916 i.vec_encoding = vex_encoding_evex;
43234a1e
L
10917 }
10918
4787f4a5 10919 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
4a5c67ed 10920 && (!cpu_arch_flags.bitfield.cpulm || r->reg_type.bitfield.class != RegCR)
1ae00879 10921 && flag_code != CODE_64BIT)
20f0a1fc 10922 return (const reg_entry *) NULL;
1ae00879 10923
00cee14f
JB
10924 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
10925 && !intel_syntax)
b7240065
JB
10926 return (const reg_entry *) NULL;
10927
252b5132
RH
10928 return r;
10929}
4d1bb795
JB
10930
10931/* REG_STRING starts *before* REGISTER_PREFIX. */
10932
10933static const reg_entry *
10934parse_register (char *reg_string, char **end_op)
10935{
10936 const reg_entry *r;
10937
10938 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
10939 r = parse_real_register (reg_string, end_op);
10940 else
10941 r = NULL;
10942 if (!r)
10943 {
10944 char *save = input_line_pointer;
10945 char c;
10946 symbolS *symbolP;
10947
10948 input_line_pointer = reg_string;
d02603dc 10949 c = get_symbol_name (&reg_string);
4d1bb795
JB
10950 symbolP = symbol_find (reg_string);
10951 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
10952 {
10953 const expressionS *e = symbol_get_value_expression (symbolP);
10954
0398aac5 10955 know (e->X_op == O_register);
4eed87de 10956 know (e->X_add_number >= 0
c3fe08fa 10957 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 10958 r = i386_regtab + e->X_add_number;
d3bb6b49 10959 if ((r->reg_flags & RegVRex))
86fa6981 10960 i.vec_encoding = vex_encoding_evex;
4d1bb795
JB
10961 *end_op = input_line_pointer;
10962 }
10963 *input_line_pointer = c;
10964 input_line_pointer = save;
10965 }
10966 return r;
10967}
10968
10969int
10970i386_parse_name (char *name, expressionS *e, char *nextcharP)
10971{
10972 const reg_entry *r;
10973 char *end = input_line_pointer;
10974
10975 *end = *nextcharP;
10976 r = parse_register (name, &input_line_pointer);
10977 if (r && end <= input_line_pointer)
10978 {
10979 *nextcharP = *input_line_pointer;
10980 *input_line_pointer = 0;
10981 e->X_op = O_register;
10982 e->X_add_number = r - i386_regtab;
10983 return 1;
10984 }
10985 input_line_pointer = end;
10986 *end = 0;
ee86248c 10987 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
10988}
10989
10990void
10991md_operand (expressionS *e)
10992{
ee86248c
JB
10993 char *end;
10994 const reg_entry *r;
4d1bb795 10995
ee86248c
JB
10996 switch (*input_line_pointer)
10997 {
10998 case REGISTER_PREFIX:
10999 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
11000 if (r)
11001 {
11002 e->X_op = O_register;
11003 e->X_add_number = r - i386_regtab;
11004 input_line_pointer = end;
11005 }
ee86248c
JB
11006 break;
11007
11008 case '[':
9c2799c2 11009 gas_assert (intel_syntax);
ee86248c
JB
11010 end = input_line_pointer++;
11011 expression (e);
11012 if (*input_line_pointer == ']')
11013 {
11014 ++input_line_pointer;
11015 e->X_op_symbol = make_expr_symbol (e);
11016 e->X_add_symbol = NULL;
11017 e->X_add_number = 0;
11018 e->X_op = O_index;
11019 }
11020 else
11021 {
11022 e->X_op = O_absent;
11023 input_line_pointer = end;
11024 }
11025 break;
4d1bb795
JB
11026 }
11027}
11028
252b5132 11029\f
4cc782b5 11030#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 11031const char *md_shortopts = "kVQ:sqnO::";
252b5132 11032#else
b6f8c7c4 11033const char *md_shortopts = "qnO::";
252b5132 11034#endif
6e0b89ee 11035
3e73aa7c 11036#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
11037#define OPTION_64 (OPTION_MD_BASE + 1)
11038#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
11039#define OPTION_MARCH (OPTION_MD_BASE + 3)
11040#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
11041#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
11042#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
11043#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
11044#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 11045#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 11046#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 11047#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
11048#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
11049#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
11050#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 11051#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
11052#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
11053#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 11054#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 11055#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 11056#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 11057#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
11058#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
11059#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 11060#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 11061#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 11062#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
b3b91714 11063
99ad8390
NC
11064struct option md_longopts[] =
11065{
3e73aa7c 11066 {"32", no_argument, NULL, OPTION_32},
321098a5 11067#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 11068 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 11069 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
11070#endif
11071#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 11072 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 11073 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 11074 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 11075#endif
b3b91714 11076 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
11077 {"march", required_argument, NULL, OPTION_MARCH},
11078 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
11079 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
11080 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
11081 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
11082 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 11083 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 11084 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 11085 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 11086 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 11087 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 11088 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
11089 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
11090 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
11091# if defined (TE_PE) || defined (TE_PEP)
11092 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
11093#endif
d1982f93 11094 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 11095 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 11096 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 11097 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
5db04b09
L
11098 {"mamd64", no_argument, NULL, OPTION_MAMD64},
11099 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
11100 {NULL, no_argument, NULL, 0}
11101};
11102size_t md_longopts_size = sizeof (md_longopts);
11103
11104int
17b9d67d 11105md_parse_option (int c, const char *arg)
252b5132 11106{
91d6fa6a 11107 unsigned int j;
293f5f65 11108 char *arch, *next, *saved;
9103f4f4 11109
252b5132
RH
11110 switch (c)
11111 {
12b55ccc
L
11112 case 'n':
11113 optimize_align_code = 0;
11114 break;
11115
a38cf1db
AM
11116 case 'q':
11117 quiet_warnings = 1;
252b5132
RH
11118 break;
11119
11120#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
11121 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
11122 should be emitted or not. FIXME: Not implemented. */
11123 case 'Q':
d4693039
JB
11124 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
11125 return 0;
252b5132
RH
11126 break;
11127
11128 /* -V: SVR4 argument to print version ID. */
11129 case 'V':
11130 print_version_id ();
11131 break;
11132
a38cf1db
AM
11133 /* -k: Ignore for FreeBSD compatibility. */
11134 case 'k':
252b5132 11135 break;
4cc782b5
ILT
11136
11137 case 's':
11138 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 11139 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 11140 break;
8dcea932
L
11141
11142 case OPTION_MSHARED:
11143 shared = 1;
11144 break;
b4a3a7b4
L
11145
11146 case OPTION_X86_USED_NOTE:
11147 if (strcasecmp (arg, "yes") == 0)
11148 x86_used_note = 1;
11149 else if (strcasecmp (arg, "no") == 0)
11150 x86_used_note = 0;
11151 else
11152 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
11153 break;
11154
11155
99ad8390 11156#endif
321098a5 11157#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 11158 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
11159 case OPTION_64:
11160 {
11161 const char **list, **l;
11162
3e73aa7c
JH
11163 list = bfd_target_list ();
11164 for (l = list; *l != NULL; l++)
8620418b 11165 if (CONST_STRNEQ (*l, "elf64-x86-64")
99ad8390
NC
11166 || strcmp (*l, "coff-x86-64") == 0
11167 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
11168 || strcmp (*l, "pei-x86-64") == 0
11169 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
11170 {
11171 default_arch = "x86_64";
11172 break;
11173 }
3e73aa7c 11174 if (*l == NULL)
2b5d6a91 11175 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
11176 free (list);
11177 }
11178 break;
11179#endif
252b5132 11180
351f65ca 11181#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 11182 case OPTION_X32:
351f65ca
L
11183 if (IS_ELF)
11184 {
11185 const char **list, **l;
11186
11187 list = bfd_target_list ();
11188 for (l = list; *l != NULL; l++)
11189 if (CONST_STRNEQ (*l, "elf32-x86-64"))
11190 {
11191 default_arch = "x86_64:32";
11192 break;
11193 }
11194 if (*l == NULL)
2b5d6a91 11195 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
11196 free (list);
11197 }
11198 else
11199 as_fatal (_("32bit x86_64 is only supported for ELF"));
11200 break;
11201#endif
11202
6e0b89ee
AM
11203 case OPTION_32:
11204 default_arch = "i386";
11205 break;
11206
b3b91714
AM
11207 case OPTION_DIVIDE:
11208#ifdef SVR4_COMMENT_CHARS
11209 {
11210 char *n, *t;
11211 const char *s;
11212
add39d23 11213 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
11214 t = n;
11215 for (s = i386_comment_chars; *s != '\0'; s++)
11216 if (*s != '/')
11217 *t++ = *s;
11218 *t = '\0';
11219 i386_comment_chars = n;
11220 }
11221#endif
11222 break;
11223
9103f4f4 11224 case OPTION_MARCH:
293f5f65
L
11225 saved = xstrdup (arg);
11226 arch = saved;
11227 /* Allow -march=+nosse. */
11228 if (*arch == '+')
11229 arch++;
6305a203 11230 do
9103f4f4 11231 {
6305a203 11232 if (*arch == '.')
2b5d6a91 11233 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
11234 next = strchr (arch, '+');
11235 if (next)
11236 *next++ = '\0';
91d6fa6a 11237 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 11238 {
91d6fa6a 11239 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 11240 {
6305a203 11241 /* Processor. */
1ded5609
JB
11242 if (! cpu_arch[j].flags.bitfield.cpui386)
11243 continue;
11244
91d6fa6a 11245 cpu_arch_name = cpu_arch[j].name;
6305a203 11246 cpu_sub_arch_name = NULL;
91d6fa6a
NC
11247 cpu_arch_flags = cpu_arch[j].flags;
11248 cpu_arch_isa = cpu_arch[j].type;
11249 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
11250 if (!cpu_arch_tune_set)
11251 {
11252 cpu_arch_tune = cpu_arch_isa;
11253 cpu_arch_tune_flags = cpu_arch_isa_flags;
11254 }
11255 break;
11256 }
91d6fa6a
NC
11257 else if (*cpu_arch [j].name == '.'
11258 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 11259 {
33eaf5de 11260 /* ISA extension. */
6305a203 11261 i386_cpu_flags flags;
309d3373 11262
293f5f65
L
11263 flags = cpu_flags_or (cpu_arch_flags,
11264 cpu_arch[j].flags);
81486035 11265
5b64d091 11266 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
11267 {
11268 if (cpu_sub_arch_name)
11269 {
11270 char *name = cpu_sub_arch_name;
11271 cpu_sub_arch_name = concat (name,
91d6fa6a 11272 cpu_arch[j].name,
1bf57e9f 11273 (const char *) NULL);
6305a203
L
11274 free (name);
11275 }
11276 else
91d6fa6a 11277 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 11278 cpu_arch_flags = flags;
a586129e 11279 cpu_arch_isa_flags = flags;
6305a203 11280 }
0089dace
L
11281 else
11282 cpu_arch_isa_flags
11283 = cpu_flags_or (cpu_arch_isa_flags,
11284 cpu_arch[j].flags);
6305a203 11285 break;
ccc9c027 11286 }
9103f4f4 11287 }
6305a203 11288
293f5f65
L
11289 if (j >= ARRAY_SIZE (cpu_arch))
11290 {
33eaf5de 11291 /* Disable an ISA extension. */
293f5f65
L
11292 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
11293 if (strcmp (arch, cpu_noarch [j].name) == 0)
11294 {
11295 i386_cpu_flags flags;
11296
11297 flags = cpu_flags_and_not (cpu_arch_flags,
11298 cpu_noarch[j].flags);
11299 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
11300 {
11301 if (cpu_sub_arch_name)
11302 {
11303 char *name = cpu_sub_arch_name;
11304 cpu_sub_arch_name = concat (arch,
11305 (const char *) NULL);
11306 free (name);
11307 }
11308 else
11309 cpu_sub_arch_name = xstrdup (arch);
11310 cpu_arch_flags = flags;
11311 cpu_arch_isa_flags = flags;
11312 }
11313 break;
11314 }
11315
11316 if (j >= ARRAY_SIZE (cpu_noarch))
11317 j = ARRAY_SIZE (cpu_arch);
11318 }
11319
91d6fa6a 11320 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 11321 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
11322
11323 arch = next;
9103f4f4 11324 }
293f5f65
L
11325 while (next != NULL);
11326 free (saved);
9103f4f4
L
11327 break;
11328
11329 case OPTION_MTUNE:
11330 if (*arg == '.')
2b5d6a91 11331 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 11332 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 11333 {
91d6fa6a 11334 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 11335 {
ccc9c027 11336 cpu_arch_tune_set = 1;
91d6fa6a
NC
11337 cpu_arch_tune = cpu_arch [j].type;
11338 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
11339 break;
11340 }
11341 }
91d6fa6a 11342 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 11343 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
11344 break;
11345
1efbbeb4
L
11346 case OPTION_MMNEMONIC:
11347 if (strcasecmp (arg, "att") == 0)
11348 intel_mnemonic = 0;
11349 else if (strcasecmp (arg, "intel") == 0)
11350 intel_mnemonic = 1;
11351 else
2b5d6a91 11352 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
11353 break;
11354
11355 case OPTION_MSYNTAX:
11356 if (strcasecmp (arg, "att") == 0)
11357 intel_syntax = 0;
11358 else if (strcasecmp (arg, "intel") == 0)
11359 intel_syntax = 1;
11360 else
2b5d6a91 11361 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
11362 break;
11363
11364 case OPTION_MINDEX_REG:
11365 allow_index_reg = 1;
11366 break;
11367
11368 case OPTION_MNAKED_REG:
11369 allow_naked_reg = 1;
11370 break;
11371
c0f3af97
L
11372 case OPTION_MSSE2AVX:
11373 sse2avx = 1;
11374 break;
11375
daf50ae7
L
11376 case OPTION_MSSE_CHECK:
11377 if (strcasecmp (arg, "error") == 0)
7bab8ab5 11378 sse_check = check_error;
daf50ae7 11379 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 11380 sse_check = check_warning;
daf50ae7 11381 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 11382 sse_check = check_none;
daf50ae7 11383 else
2b5d6a91 11384 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
11385 break;
11386
7bab8ab5
JB
11387 case OPTION_MOPERAND_CHECK:
11388 if (strcasecmp (arg, "error") == 0)
11389 operand_check = check_error;
11390 else if (strcasecmp (arg, "warning") == 0)
11391 operand_check = check_warning;
11392 else if (strcasecmp (arg, "none") == 0)
11393 operand_check = check_none;
11394 else
11395 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
11396 break;
11397
539f890d
L
11398 case OPTION_MAVXSCALAR:
11399 if (strcasecmp (arg, "128") == 0)
11400 avxscalar = vex128;
11401 else if (strcasecmp (arg, "256") == 0)
11402 avxscalar = vex256;
11403 else
2b5d6a91 11404 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
11405 break;
11406
03751133
L
11407 case OPTION_MVEXWIG:
11408 if (strcmp (arg, "0") == 0)
40c9c8de 11409 vexwig = vexw0;
03751133 11410 else if (strcmp (arg, "1") == 0)
40c9c8de 11411 vexwig = vexw1;
03751133
L
11412 else
11413 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
11414 break;
11415
7e8b059b
L
11416 case OPTION_MADD_BND_PREFIX:
11417 add_bnd_prefix = 1;
11418 break;
11419
43234a1e
L
11420 case OPTION_MEVEXLIG:
11421 if (strcmp (arg, "128") == 0)
11422 evexlig = evexl128;
11423 else if (strcmp (arg, "256") == 0)
11424 evexlig = evexl256;
11425 else if (strcmp (arg, "512") == 0)
11426 evexlig = evexl512;
11427 else
11428 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
11429 break;
11430
d3d3c6db
IT
11431 case OPTION_MEVEXRCIG:
11432 if (strcmp (arg, "rne") == 0)
11433 evexrcig = rne;
11434 else if (strcmp (arg, "rd") == 0)
11435 evexrcig = rd;
11436 else if (strcmp (arg, "ru") == 0)
11437 evexrcig = ru;
11438 else if (strcmp (arg, "rz") == 0)
11439 evexrcig = rz;
11440 else
11441 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
11442 break;
11443
43234a1e
L
11444 case OPTION_MEVEXWIG:
11445 if (strcmp (arg, "0") == 0)
11446 evexwig = evexw0;
11447 else if (strcmp (arg, "1") == 0)
11448 evexwig = evexw1;
11449 else
11450 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
11451 break;
11452
167ad85b
TG
11453# if defined (TE_PE) || defined (TE_PEP)
11454 case OPTION_MBIG_OBJ:
11455 use_big_obj = 1;
11456 break;
11457#endif
11458
d1982f93 11459 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
11460 if (strcasecmp (arg, "yes") == 0)
11461 omit_lock_prefix = 1;
11462 else if (strcasecmp (arg, "no") == 0)
11463 omit_lock_prefix = 0;
11464 else
11465 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
11466 break;
11467
e4e00185
AS
11468 case OPTION_MFENCE_AS_LOCK_ADD:
11469 if (strcasecmp (arg, "yes") == 0)
11470 avoid_fence = 1;
11471 else if (strcasecmp (arg, "no") == 0)
11472 avoid_fence = 0;
11473 else
11474 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
11475 break;
11476
0cb4071e
L
11477 case OPTION_MRELAX_RELOCATIONS:
11478 if (strcasecmp (arg, "yes") == 0)
11479 generate_relax_relocations = 1;
11480 else if (strcasecmp (arg, "no") == 0)
11481 generate_relax_relocations = 0;
11482 else
11483 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
11484 break;
11485
5db04b09 11486 case OPTION_MAMD64:
e89c5eaa 11487 intel64 = 0;
5db04b09
L
11488 break;
11489
11490 case OPTION_MINTEL64:
e89c5eaa 11491 intel64 = 1;
5db04b09
L
11492 break;
11493
b6f8c7c4
L
11494 case 'O':
11495 if (arg == NULL)
11496 {
11497 optimize = 1;
11498 /* Turn off -Os. */
11499 optimize_for_space = 0;
11500 }
11501 else if (*arg == 's')
11502 {
11503 optimize_for_space = 1;
11504 /* Turn on all encoding optimizations. */
41fd2579 11505 optimize = INT_MAX;
b6f8c7c4
L
11506 }
11507 else
11508 {
11509 optimize = atoi (arg);
11510 /* Turn off -Os. */
11511 optimize_for_space = 0;
11512 }
11513 break;
11514
252b5132
RH
11515 default:
11516 return 0;
11517 }
11518 return 1;
11519}
11520
8a2c8fef
L
11521#define MESSAGE_TEMPLATE \
11522" "
11523
293f5f65
L
11524static char *
11525output_message (FILE *stream, char *p, char *message, char *start,
11526 int *left_p, const char *name, int len)
11527{
11528 int size = sizeof (MESSAGE_TEMPLATE);
11529 int left = *left_p;
11530
11531 /* Reserve 2 spaces for ", " or ",\0" */
11532 left -= len + 2;
11533
11534 /* Check if there is any room. */
11535 if (left >= 0)
11536 {
11537 if (p != start)
11538 {
11539 *p++ = ',';
11540 *p++ = ' ';
11541 }
11542 p = mempcpy (p, name, len);
11543 }
11544 else
11545 {
11546 /* Output the current message now and start a new one. */
11547 *p++ = ',';
11548 *p = '\0';
11549 fprintf (stream, "%s\n", message);
11550 p = start;
11551 left = size - (start - message) - len - 2;
11552
11553 gas_assert (left >= 0);
11554
11555 p = mempcpy (p, name, len);
11556 }
11557
11558 *left_p = left;
11559 return p;
11560}
11561
8a2c8fef 11562static void
1ded5609 11563show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
11564{
11565 static char message[] = MESSAGE_TEMPLATE;
11566 char *start = message + 27;
11567 char *p;
11568 int size = sizeof (MESSAGE_TEMPLATE);
11569 int left;
11570 const char *name;
11571 int len;
11572 unsigned int j;
11573
11574 p = start;
11575 left = size - (start - message);
11576 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
11577 {
11578 /* Should it be skipped? */
11579 if (cpu_arch [j].skip)
11580 continue;
11581
11582 name = cpu_arch [j].name;
11583 len = cpu_arch [j].len;
11584 if (*name == '.')
11585 {
11586 /* It is an extension. Skip if we aren't asked to show it. */
11587 if (ext)
11588 {
11589 name++;
11590 len--;
11591 }
11592 else
11593 continue;
11594 }
11595 else if (ext)
11596 {
11597 /* It is an processor. Skip if we show only extension. */
11598 continue;
11599 }
1ded5609
JB
11600 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
11601 {
11602 /* It is an impossible processor - skip. */
11603 continue;
11604 }
8a2c8fef 11605
293f5f65 11606 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
11607 }
11608
293f5f65
L
11609 /* Display disabled extensions. */
11610 if (ext)
11611 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
11612 {
11613 name = cpu_noarch [j].name;
11614 len = cpu_noarch [j].len;
11615 p = output_message (stream, p, message, start, &left, name,
11616 len);
11617 }
11618
8a2c8fef
L
11619 *p = '\0';
11620 fprintf (stream, "%s\n", message);
11621}
11622
252b5132 11623void
8a2c8fef 11624md_show_usage (FILE *stream)
252b5132 11625{
4cc782b5
ILT
11626#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11627 fprintf (stream, _("\
d4693039 11628 -Qy, -Qn ignored\n\
a38cf1db 11629 -V print assembler version number\n\
b3b91714
AM
11630 -k ignored\n"));
11631#endif
11632 fprintf (stream, _("\
12b55ccc 11633 -n Do not optimize code alignment\n\
b3b91714
AM
11634 -q quieten some warnings\n"));
11635#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11636 fprintf (stream, _("\
a38cf1db 11637 -s ignored\n"));
b3b91714 11638#endif
d7f449c0
L
11639#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
11640 || defined (TE_PE) || defined (TE_PEP))
751d281c 11641 fprintf (stream, _("\
570561f7 11642 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 11643#endif
b3b91714
AM
11644#ifdef SVR4_COMMENT_CHARS
11645 fprintf (stream, _("\
11646 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
11647#else
11648 fprintf (stream, _("\
b3b91714 11649 --divide ignored\n"));
4cc782b5 11650#endif
9103f4f4 11651 fprintf (stream, _("\
6305a203 11652 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 11653 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 11654 show_arch (stream, 0, 1);
8a2c8fef
L
11655 fprintf (stream, _("\
11656 EXTENSION is combination of:\n"));
1ded5609 11657 show_arch (stream, 1, 0);
6305a203 11658 fprintf (stream, _("\
8a2c8fef 11659 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 11660 show_arch (stream, 0, 0);
ba104c83 11661 fprintf (stream, _("\
c0f3af97
L
11662 -msse2avx encode SSE instructions with VEX prefix\n"));
11663 fprintf (stream, _("\
7c5c05ef 11664 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
11665 check SSE instructions\n"));
11666 fprintf (stream, _("\
7c5c05ef 11667 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
11668 check operand combinations for validity\n"));
11669 fprintf (stream, _("\
7c5c05ef
L
11670 -mavxscalar=[128|256] (default: 128)\n\
11671 encode scalar AVX instructions with specific vector\n\
539f890d
L
11672 length\n"));
11673 fprintf (stream, _("\
03751133
L
11674 -mvexwig=[0|1] (default: 0)\n\
11675 encode VEX instructions with specific VEX.W value\n\
11676 for VEX.W bit ignored instructions\n"));
11677 fprintf (stream, _("\
7c5c05ef
L
11678 -mevexlig=[128|256|512] (default: 128)\n\
11679 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
11680 length\n"));
11681 fprintf (stream, _("\
7c5c05ef
L
11682 -mevexwig=[0|1] (default: 0)\n\
11683 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
11684 for EVEX.W bit ignored instructions\n"));
11685 fprintf (stream, _("\
7c5c05ef 11686 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
11687 encode EVEX instructions with specific EVEX.RC value\n\
11688 for SAE-only ignored instructions\n"));
11689 fprintf (stream, _("\
7c5c05ef
L
11690 -mmnemonic=[att|intel] "));
11691 if (SYSV386_COMPAT)
11692 fprintf (stream, _("(default: att)\n"));
11693 else
11694 fprintf (stream, _("(default: intel)\n"));
11695 fprintf (stream, _("\
11696 use AT&T/Intel mnemonic\n"));
ba104c83 11697 fprintf (stream, _("\
7c5c05ef
L
11698 -msyntax=[att|intel] (default: att)\n\
11699 use AT&T/Intel syntax\n"));
ba104c83
L
11700 fprintf (stream, _("\
11701 -mindex-reg support pseudo index registers\n"));
11702 fprintf (stream, _("\
11703 -mnaked-reg don't require `%%' prefix for registers\n"));
11704 fprintf (stream, _("\
7e8b059b 11705 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 11706#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
11707 fprintf (stream, _("\
11708 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
11709 fprintf (stream, _("\
11710 -mx86-used-note=[no|yes] "));
11711 if (DEFAULT_X86_USED_NOTE)
11712 fprintf (stream, _("(default: yes)\n"));
11713 else
11714 fprintf (stream, _("(default: no)\n"));
11715 fprintf (stream, _("\
11716 generate x86 used ISA and feature properties\n"));
11717#endif
11718#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
11719 fprintf (stream, _("\
11720 -mbig-obj generate big object files\n"));
11721#endif
d022bddd 11722 fprintf (stream, _("\
7c5c05ef 11723 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 11724 strip all lock prefixes\n"));
5db04b09 11725 fprintf (stream, _("\
7c5c05ef 11726 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
11727 encode lfence, mfence and sfence as\n\
11728 lock addl $0x0, (%%{re}sp)\n"));
11729 fprintf (stream, _("\
7c5c05ef
L
11730 -mrelax-relocations=[no|yes] "));
11731 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
11732 fprintf (stream, _("(default: yes)\n"));
11733 else
11734 fprintf (stream, _("(default: no)\n"));
11735 fprintf (stream, _("\
0cb4071e
L
11736 generate relax relocations\n"));
11737 fprintf (stream, _("\
7c5c05ef 11738 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
11739 fprintf (stream, _("\
11740 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
11741}
11742
3e73aa7c 11743#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 11744 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 11745 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
11746
11747/* Pick the target format to use. */
11748
47926f60 11749const char *
e3bb37b5 11750i386_target_format (void)
252b5132 11751{
351f65ca
L
11752 if (!strncmp (default_arch, "x86_64", 6))
11753 {
11754 update_code_flag (CODE_64BIT, 1);
11755 if (default_arch[6] == '\0')
7f56bc95 11756 x86_elf_abi = X86_64_ABI;
351f65ca 11757 else
7f56bc95 11758 x86_elf_abi = X86_64_X32_ABI;
351f65ca 11759 }
3e73aa7c 11760 else if (!strcmp (default_arch, "i386"))
78f12dd3 11761 update_code_flag (CODE_32BIT, 1);
5197d474
L
11762 else if (!strcmp (default_arch, "iamcu"))
11763 {
11764 update_code_flag (CODE_32BIT, 1);
11765 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
11766 {
11767 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
11768 cpu_arch_name = "iamcu";
11769 cpu_sub_arch_name = NULL;
11770 cpu_arch_flags = iamcu_flags;
11771 cpu_arch_isa = PROCESSOR_IAMCU;
11772 cpu_arch_isa_flags = iamcu_flags;
11773 if (!cpu_arch_tune_set)
11774 {
11775 cpu_arch_tune = cpu_arch_isa;
11776 cpu_arch_tune_flags = cpu_arch_isa_flags;
11777 }
11778 }
8d471ec1 11779 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
11780 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
11781 cpu_arch_name);
11782 }
3e73aa7c 11783 else
2b5d6a91 11784 as_fatal (_("unknown architecture"));
89507696
JB
11785
11786 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
11787 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
11788 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
11789 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
11790
252b5132
RH
11791 switch (OUTPUT_FLAVOR)
11792 {
9384f2ff 11793#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 11794 case bfd_target_aout_flavour:
47926f60 11795 return AOUT_TARGET_FORMAT;
4c63da97 11796#endif
9384f2ff
AM
11797#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
11798# if defined (TE_PE) || defined (TE_PEP)
11799 case bfd_target_coff_flavour:
167ad85b
TG
11800 if (flag_code == CODE_64BIT)
11801 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
11802 else
11803 return "pe-i386";
9384f2ff 11804# elif defined (TE_GO32)
0561d57c
JK
11805 case bfd_target_coff_flavour:
11806 return "coff-go32";
9384f2ff 11807# else
252b5132
RH
11808 case bfd_target_coff_flavour:
11809 return "coff-i386";
9384f2ff 11810# endif
4c63da97 11811#endif
3e73aa7c 11812#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 11813 case bfd_target_elf_flavour:
3e73aa7c 11814 {
351f65ca
L
11815 const char *format;
11816
11817 switch (x86_elf_abi)
4fa24527 11818 {
351f65ca
L
11819 default:
11820 format = ELF_TARGET_FORMAT;
11821 break;
7f56bc95 11822 case X86_64_ABI:
351f65ca 11823 use_rela_relocations = 1;
4fa24527 11824 object_64bit = 1;
351f65ca
L
11825 format = ELF_TARGET_FORMAT64;
11826 break;
7f56bc95 11827 case X86_64_X32_ABI:
4fa24527 11828 use_rela_relocations = 1;
351f65ca 11829 object_64bit = 1;
862be3fb 11830 disallow_64bit_reloc = 1;
351f65ca
L
11831 format = ELF_TARGET_FORMAT32;
11832 break;
4fa24527 11833 }
3632d14b 11834 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 11835 {
7f56bc95 11836 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
11837 as_fatal (_("Intel L1OM is 64bit only"));
11838 return ELF_TARGET_L1OM_FORMAT;
11839 }
b49f93f6 11840 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
11841 {
11842 if (x86_elf_abi != X86_64_ABI)
11843 as_fatal (_("Intel K1OM is 64bit only"));
11844 return ELF_TARGET_K1OM_FORMAT;
11845 }
81486035
L
11846 else if (cpu_arch_isa == PROCESSOR_IAMCU)
11847 {
11848 if (x86_elf_abi != I386_ABI)
11849 as_fatal (_("Intel MCU is 32bit only"));
11850 return ELF_TARGET_IAMCU_FORMAT;
11851 }
8a9036a4 11852 else
351f65ca 11853 return format;
3e73aa7c 11854 }
e57f8c65
TG
11855#endif
11856#if defined (OBJ_MACH_O)
11857 case bfd_target_mach_o_flavour:
d382c579
TG
11858 if (flag_code == CODE_64BIT)
11859 {
11860 use_rela_relocations = 1;
11861 object_64bit = 1;
11862 return "mach-o-x86-64";
11863 }
11864 else
11865 return "mach-o-i386";
4c63da97 11866#endif
252b5132
RH
11867 default:
11868 abort ();
11869 return NULL;
11870 }
11871}
11872
47926f60 11873#endif /* OBJ_MAYBE_ more than one */
252b5132 11874\f
252b5132 11875symbolS *
7016a5d5 11876md_undefined_symbol (char *name)
252b5132 11877{
18dc2407
ILT
11878 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
11879 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
11880 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
11881 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
11882 {
11883 if (!GOT_symbol)
11884 {
11885 if (symbol_find (name))
11886 as_bad (_("GOT already in symbol table"));
11887 GOT_symbol = symbol_new (name, undefined_section,
11888 (valueT) 0, &zero_address_frag);
11889 };
11890 return GOT_symbol;
11891 }
252b5132
RH
11892 return 0;
11893}
11894
11895/* Round up a section size to the appropriate boundary. */
47926f60 11896
252b5132 11897valueT
7016a5d5 11898md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 11899{
4c63da97
AM
11900#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
11901 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
11902 {
11903 /* For a.out, force the section size to be aligned. If we don't do
11904 this, BFD will align it for us, but it will not write out the
11905 final bytes of the section. This may be a bug in BFD, but it is
11906 easier to fix it here since that is how the other a.out targets
11907 work. */
11908 int align;
11909
fd361982 11910 align = bfd_section_alignment (segment);
8d3842cd 11911 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 11912 }
252b5132
RH
11913#endif
11914
11915 return size;
11916}
11917
11918/* On the i386, PC-relative offsets are relative to the start of the
11919 next instruction. That is, the address of the offset, plus its
11920 size, since the offset is always the last part of the insn. */
11921
11922long
e3bb37b5 11923md_pcrel_from (fixS *fixP)
252b5132
RH
11924{
11925 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
11926}
11927
11928#ifndef I386COFF
11929
11930static void
e3bb37b5 11931s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 11932{
29b0f896 11933 int temp;
252b5132 11934
8a75718c
JB
11935#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11936 if (IS_ELF)
11937 obj_elf_section_change_hook ();
11938#endif
252b5132
RH
11939 temp = get_absolute_expression ();
11940 subseg_set (bss_section, (subsegT) temp);
11941 demand_empty_rest_of_line ();
11942}
11943
11944#endif
11945
252b5132 11946void
e3bb37b5 11947i386_validate_fix (fixS *fixp)
252b5132 11948{
02a86693 11949 if (fixp->fx_subsy)
252b5132 11950 {
02a86693 11951 if (fixp->fx_subsy == GOT_symbol)
23df1078 11952 {
02a86693
L
11953 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
11954 {
11955 if (!object_64bit)
11956 abort ();
11957#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11958 if (fixp->fx_tcbit2)
56ceb5b5
L
11959 fixp->fx_r_type = (fixp->fx_tcbit
11960 ? BFD_RELOC_X86_64_REX_GOTPCRELX
11961 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
11962 else
11963#endif
11964 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
11965 }
d6ab8113 11966 else
02a86693
L
11967 {
11968 if (!object_64bit)
11969 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
11970 else
11971 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
11972 }
11973 fixp->fx_subsy = 0;
23df1078 11974 }
252b5132 11975 }
02a86693
L
11976#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11977 else if (!object_64bit)
11978 {
11979 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
11980 && fixp->fx_tcbit2)
11981 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
11982 }
11983#endif
252b5132
RH
11984}
11985
252b5132 11986arelent *
7016a5d5 11987tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
11988{
11989 arelent *rel;
11990 bfd_reloc_code_real_type code;
11991
11992 switch (fixp->fx_r_type)
11993 {
8ce3d284 11994#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
11995 case BFD_RELOC_SIZE32:
11996 case BFD_RELOC_SIZE64:
11997 if (S_IS_DEFINED (fixp->fx_addsy)
11998 && !S_IS_EXTERNAL (fixp->fx_addsy))
11999 {
12000 /* Resolve size relocation against local symbol to size of
12001 the symbol plus addend. */
12002 valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
12003 if (fixp->fx_r_type == BFD_RELOC_SIZE32
12004 && !fits_in_unsigned_long (value))
12005 as_bad_where (fixp->fx_file, fixp->fx_line,
12006 _("symbol size computation overflow"));
12007 fixp->fx_addsy = NULL;
12008 fixp->fx_subsy = NULL;
12009 md_apply_fix (fixp, (valueT *) &value, NULL);
12010 return NULL;
12011 }
8ce3d284 12012#endif
1a0670f3 12013 /* Fall through. */
8fd4256d 12014
3e73aa7c
JH
12015 case BFD_RELOC_X86_64_PLT32:
12016 case BFD_RELOC_X86_64_GOT32:
12017 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
12018 case BFD_RELOC_X86_64_GOTPCRELX:
12019 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
12020 case BFD_RELOC_386_PLT32:
12021 case BFD_RELOC_386_GOT32:
02a86693 12022 case BFD_RELOC_386_GOT32X:
252b5132
RH
12023 case BFD_RELOC_386_GOTOFF:
12024 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
12025 case BFD_RELOC_386_TLS_GD:
12026 case BFD_RELOC_386_TLS_LDM:
12027 case BFD_RELOC_386_TLS_LDO_32:
12028 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
12029 case BFD_RELOC_386_TLS_IE:
12030 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
12031 case BFD_RELOC_386_TLS_LE_32:
12032 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
12033 case BFD_RELOC_386_TLS_GOTDESC:
12034 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
12035 case BFD_RELOC_X86_64_TLSGD:
12036 case BFD_RELOC_X86_64_TLSLD:
12037 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 12038 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
12039 case BFD_RELOC_X86_64_GOTTPOFF:
12040 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
12041 case BFD_RELOC_X86_64_TPOFF64:
12042 case BFD_RELOC_X86_64_GOTOFF64:
12043 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
12044 case BFD_RELOC_X86_64_GOT64:
12045 case BFD_RELOC_X86_64_GOTPCREL64:
12046 case BFD_RELOC_X86_64_GOTPC64:
12047 case BFD_RELOC_X86_64_GOTPLT64:
12048 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
12049 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
12050 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
12051 case BFD_RELOC_RVA:
12052 case BFD_RELOC_VTABLE_ENTRY:
12053 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
12054#ifdef TE_PE
12055 case BFD_RELOC_32_SECREL:
12056#endif
252b5132
RH
12057 code = fixp->fx_r_type;
12058 break;
dbbaec26
L
12059 case BFD_RELOC_X86_64_32S:
12060 if (!fixp->fx_pcrel)
12061 {
12062 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
12063 code = fixp->fx_r_type;
12064 break;
12065 }
1a0670f3 12066 /* Fall through. */
252b5132 12067 default:
93382f6d 12068 if (fixp->fx_pcrel)
252b5132 12069 {
93382f6d
AM
12070 switch (fixp->fx_size)
12071 {
12072 default:
b091f402
AM
12073 as_bad_where (fixp->fx_file, fixp->fx_line,
12074 _("can not do %d byte pc-relative relocation"),
12075 fixp->fx_size);
93382f6d
AM
12076 code = BFD_RELOC_32_PCREL;
12077 break;
12078 case 1: code = BFD_RELOC_8_PCREL; break;
12079 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 12080 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
12081#ifdef BFD64
12082 case 8: code = BFD_RELOC_64_PCREL; break;
12083#endif
93382f6d
AM
12084 }
12085 }
12086 else
12087 {
12088 switch (fixp->fx_size)
12089 {
12090 default:
b091f402
AM
12091 as_bad_where (fixp->fx_file, fixp->fx_line,
12092 _("can not do %d byte relocation"),
12093 fixp->fx_size);
93382f6d
AM
12094 code = BFD_RELOC_32;
12095 break;
12096 case 1: code = BFD_RELOC_8; break;
12097 case 2: code = BFD_RELOC_16; break;
12098 case 4: code = BFD_RELOC_32; break;
937149dd 12099#ifdef BFD64
3e73aa7c 12100 case 8: code = BFD_RELOC_64; break;
937149dd 12101#endif
93382f6d 12102 }
252b5132
RH
12103 }
12104 break;
12105 }
252b5132 12106
d182319b
JB
12107 if ((code == BFD_RELOC_32
12108 || code == BFD_RELOC_32_PCREL
12109 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
12110 && GOT_symbol
12111 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 12112 {
4fa24527 12113 if (!object_64bit)
d6ab8113
JB
12114 code = BFD_RELOC_386_GOTPC;
12115 else
12116 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 12117 }
7b81dfbb
AJ
12118 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
12119 && GOT_symbol
12120 && fixp->fx_addsy == GOT_symbol)
12121 {
12122 code = BFD_RELOC_X86_64_GOTPC64;
12123 }
252b5132 12124
add39d23
TS
12125 rel = XNEW (arelent);
12126 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 12127 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
12128
12129 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 12130
3e73aa7c
JH
12131 if (!use_rela_relocations)
12132 {
12133 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
12134 vtable entry to be used in the relocation's section offset. */
12135 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
12136 rel->address = fixp->fx_offset;
fbeb56a4
DK
12137#if defined (OBJ_COFF) && defined (TE_PE)
12138 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
12139 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
12140 else
12141#endif
c6682705 12142 rel->addend = 0;
3e73aa7c
JH
12143 }
12144 /* Use the rela in 64bit mode. */
252b5132 12145 else
3e73aa7c 12146 {
862be3fb
L
12147 if (disallow_64bit_reloc)
12148 switch (code)
12149 {
862be3fb
L
12150 case BFD_RELOC_X86_64_DTPOFF64:
12151 case BFD_RELOC_X86_64_TPOFF64:
12152 case BFD_RELOC_64_PCREL:
12153 case BFD_RELOC_X86_64_GOTOFF64:
12154 case BFD_RELOC_X86_64_GOT64:
12155 case BFD_RELOC_X86_64_GOTPCREL64:
12156 case BFD_RELOC_X86_64_GOTPC64:
12157 case BFD_RELOC_X86_64_GOTPLT64:
12158 case BFD_RELOC_X86_64_PLTOFF64:
12159 as_bad_where (fixp->fx_file, fixp->fx_line,
12160 _("cannot represent relocation type %s in x32 mode"),
12161 bfd_get_reloc_code_name (code));
12162 break;
12163 default:
12164 break;
12165 }
12166
062cd5e7
AS
12167 if (!fixp->fx_pcrel)
12168 rel->addend = fixp->fx_offset;
12169 else
12170 switch (code)
12171 {
12172 case BFD_RELOC_X86_64_PLT32:
12173 case BFD_RELOC_X86_64_GOT32:
12174 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
12175 case BFD_RELOC_X86_64_GOTPCRELX:
12176 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
12177 case BFD_RELOC_X86_64_TLSGD:
12178 case BFD_RELOC_X86_64_TLSLD:
12179 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
12180 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
12181 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
12182 rel->addend = fixp->fx_offset - fixp->fx_size;
12183 break;
12184 default:
12185 rel->addend = (section->vma
12186 - fixp->fx_size
12187 + fixp->fx_addnumber
12188 + md_pcrel_from (fixp));
12189 break;
12190 }
3e73aa7c
JH
12191 }
12192
252b5132
RH
12193 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
12194 if (rel->howto == NULL)
12195 {
12196 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 12197 _("cannot represent relocation type %s"),
252b5132
RH
12198 bfd_get_reloc_code_name (code));
12199 /* Set howto to a garbage value so that we can keep going. */
12200 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 12201 gas_assert (rel->howto != NULL);
252b5132
RH
12202 }
12203
12204 return rel;
12205}
12206
ee86248c 12207#include "tc-i386-intel.c"
54cfded0 12208
a60de03c
JB
12209void
12210tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 12211{
a60de03c
JB
12212 int saved_naked_reg;
12213 char saved_register_dot;
54cfded0 12214
a60de03c
JB
12215 saved_naked_reg = allow_naked_reg;
12216 allow_naked_reg = 1;
12217 saved_register_dot = register_chars['.'];
12218 register_chars['.'] = '.';
12219 allow_pseudo_reg = 1;
12220 expression_and_evaluate (exp);
12221 allow_pseudo_reg = 0;
12222 register_chars['.'] = saved_register_dot;
12223 allow_naked_reg = saved_naked_reg;
12224
e96d56a1 12225 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 12226 {
a60de03c
JB
12227 if ((addressT) exp->X_add_number < i386_regtab_size)
12228 {
12229 exp->X_op = O_constant;
12230 exp->X_add_number = i386_regtab[exp->X_add_number]
12231 .dw2_regnum[flag_code >> 1];
12232 }
12233 else
12234 exp->X_op = O_illegal;
54cfded0 12235 }
54cfded0
AM
12236}
12237
12238void
12239tc_x86_frame_initial_instructions (void)
12240{
a60de03c
JB
12241 static unsigned int sp_regno[2];
12242
12243 if (!sp_regno[flag_code >> 1])
12244 {
12245 char *saved_input = input_line_pointer;
12246 char sp[][4] = {"esp", "rsp"};
12247 expressionS exp;
a4447b93 12248
a60de03c
JB
12249 input_line_pointer = sp[flag_code >> 1];
12250 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 12251 gas_assert (exp.X_op == O_constant);
a60de03c
JB
12252 sp_regno[flag_code >> 1] = exp.X_add_number;
12253 input_line_pointer = saved_input;
12254 }
a4447b93 12255
61ff971f
L
12256 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
12257 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 12258}
d2b2c203 12259
d7921315
L
12260int
12261x86_dwarf2_addr_size (void)
12262{
12263#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
12264 if (x86_elf_abi == X86_64_X32_ABI)
12265 return 4;
12266#endif
12267 return bfd_arch_bits_per_address (stdoutput) / 8;
12268}
12269
d2b2c203
DJ
12270int
12271i386_elf_section_type (const char *str, size_t len)
12272{
12273 if (flag_code == CODE_64BIT
12274 && len == sizeof ("unwind") - 1
12275 && strncmp (str, "unwind", 6) == 0)
12276 return SHT_X86_64_UNWIND;
12277
12278 return -1;
12279}
bb41ade5 12280
ad5fec3b
EB
12281#ifdef TE_SOLARIS
12282void
12283i386_solaris_fix_up_eh_frame (segT sec)
12284{
12285 if (flag_code == CODE_64BIT)
12286 elf_section_type (sec) = SHT_X86_64_UNWIND;
12287}
12288#endif
12289
bb41ade5
AM
12290#ifdef TE_PE
12291void
12292tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
12293{
91d6fa6a 12294 expressionS exp;
bb41ade5 12295
91d6fa6a
NC
12296 exp.X_op = O_secrel;
12297 exp.X_add_symbol = symbol;
12298 exp.X_add_number = 0;
12299 emit_expr (&exp, size);
bb41ade5
AM
12300}
12301#endif
3b22753a
L
12302
12303#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12304/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
12305
01e1a5bc 12306bfd_vma
6d4af3c2 12307x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
12308{
12309 if (flag_code == CODE_64BIT)
12310 {
12311 if (letter == 'l')
12312 return SHF_X86_64_LARGE;
12313
8f3bae45 12314 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 12315 }
3b22753a 12316 else
8f3bae45 12317 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
12318 return -1;
12319}
12320
01e1a5bc 12321bfd_vma
3b22753a
L
12322x86_64_section_word (char *str, size_t len)
12323{
8620418b 12324 if (len == 5 && flag_code == CODE_64BIT && CONST_STRNEQ (str, "large"))
3b22753a
L
12325 return SHF_X86_64_LARGE;
12326
12327 return -1;
12328}
12329
12330static void
12331handle_large_common (int small ATTRIBUTE_UNUSED)
12332{
12333 if (flag_code != CODE_64BIT)
12334 {
12335 s_comm_internal (0, elf_common_parse);
12336 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
12337 }
12338 else
12339 {
12340 static segT lbss_section;
12341 asection *saved_com_section_ptr = elf_com_section_ptr;
12342 asection *saved_bss_section = bss_section;
12343
12344 if (lbss_section == NULL)
12345 {
12346 flagword applicable;
12347 segT seg = now_seg;
12348 subsegT subseg = now_subseg;
12349
12350 /* The .lbss section is for local .largecomm symbols. */
12351 lbss_section = subseg_new (".lbss", 0);
12352 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 12353 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
12354 seg_info (lbss_section)->bss = 1;
12355
12356 subseg_set (seg, subseg);
12357 }
12358
12359 elf_com_section_ptr = &_bfd_elf_large_com_section;
12360 bss_section = lbss_section;
12361
12362 s_comm_internal (0, elf_common_parse);
12363
12364 elf_com_section_ptr = saved_com_section_ptr;
12365 bss_section = saved_bss_section;
12366 }
12367}
12368#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
This page took 2.510236 seconds and 4 git commands to generate.