x86: introduce operand type "instance"
[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" },
40fb9820 3164 { OPERAND_TYPE_ESSEG, "es" },
252b5132
RH
3165};
3166
3167static void
40fb9820 3168pt (i386_operand_type t)
252b5132 3169{
40fb9820 3170 unsigned int j;
c6fb90c8 3171 i386_operand_type a;
252b5132 3172
40fb9820 3173 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3174 {
3175 a = operand_type_and (t, type_names[j].mask);
2c703856 3176 if (operand_type_equal (&a, &type_names[j].mask))
c6fb90c8
L
3177 fprintf (stdout, "%s, ", type_names[j].name);
3178 }
252b5132
RH
3179 fflush (stdout);
3180}
3181
3182#endif /* DEBUG386 */
3183\f
252b5132 3184static bfd_reloc_code_real_type
3956db08 3185reloc (unsigned int size,
64e74474
AM
3186 int pcrel,
3187 int sign,
3188 bfd_reloc_code_real_type other)
252b5132 3189{
47926f60 3190 if (other != NO_RELOC)
3956db08 3191 {
91d6fa6a 3192 reloc_howto_type *rel;
3956db08
JB
3193
3194 if (size == 8)
3195 switch (other)
3196 {
64e74474
AM
3197 case BFD_RELOC_X86_64_GOT32:
3198 return BFD_RELOC_X86_64_GOT64;
3199 break;
553d1284
L
3200 case BFD_RELOC_X86_64_GOTPLT64:
3201 return BFD_RELOC_X86_64_GOTPLT64;
3202 break;
64e74474
AM
3203 case BFD_RELOC_X86_64_PLTOFF64:
3204 return BFD_RELOC_X86_64_PLTOFF64;
3205 break;
3206 case BFD_RELOC_X86_64_GOTPC32:
3207 other = BFD_RELOC_X86_64_GOTPC64;
3208 break;
3209 case BFD_RELOC_X86_64_GOTPCREL:
3210 other = BFD_RELOC_X86_64_GOTPCREL64;
3211 break;
3212 case BFD_RELOC_X86_64_TPOFF32:
3213 other = BFD_RELOC_X86_64_TPOFF64;
3214 break;
3215 case BFD_RELOC_X86_64_DTPOFF32:
3216 other = BFD_RELOC_X86_64_DTPOFF64;
3217 break;
3218 default:
3219 break;
3956db08 3220 }
e05278af 3221
8ce3d284 3222#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3223 if (other == BFD_RELOC_SIZE32)
3224 {
3225 if (size == 8)
1ab668bf 3226 other = BFD_RELOC_SIZE64;
8fd4256d 3227 if (pcrel)
1ab668bf
AM
3228 {
3229 as_bad (_("there are no pc-relative size relocations"));
3230 return NO_RELOC;
3231 }
8fd4256d 3232 }
8ce3d284 3233#endif
8fd4256d 3234
e05278af 3235 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3236 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3237 sign = -1;
3238
91d6fa6a
NC
3239 rel = bfd_reloc_type_lookup (stdoutput, other);
3240 if (!rel)
3956db08 3241 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3242 else if (size != bfd_get_reloc_size (rel))
3956db08 3243 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3244 bfd_get_reloc_size (rel),
3956db08 3245 size);
91d6fa6a 3246 else if (pcrel && !rel->pc_relative)
3956db08 3247 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3248 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3249 && !sign)
91d6fa6a 3250 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3251 && sign > 0))
3956db08
JB
3252 as_bad (_("relocated field and relocation type differ in signedness"));
3253 else
3254 return other;
3255 return NO_RELOC;
3256 }
252b5132
RH
3257
3258 if (pcrel)
3259 {
3e73aa7c 3260 if (!sign)
3956db08 3261 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3262 switch (size)
3263 {
3264 case 1: return BFD_RELOC_8_PCREL;
3265 case 2: return BFD_RELOC_16_PCREL;
d258b828 3266 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3267 case 8: return BFD_RELOC_64_PCREL;
252b5132 3268 }
3956db08 3269 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3270 }
3271 else
3272 {
3956db08 3273 if (sign > 0)
e5cb08ac 3274 switch (size)
3e73aa7c
JH
3275 {
3276 case 4: return BFD_RELOC_X86_64_32S;
3277 }
3278 else
3279 switch (size)
3280 {
3281 case 1: return BFD_RELOC_8;
3282 case 2: return BFD_RELOC_16;
3283 case 4: return BFD_RELOC_32;
3284 case 8: return BFD_RELOC_64;
3285 }
3956db08
JB
3286 as_bad (_("cannot do %s %u byte relocation"),
3287 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3288 }
3289
0cc9e1d3 3290 return NO_RELOC;
252b5132
RH
3291}
3292
47926f60
KH
3293/* Here we decide which fixups can be adjusted to make them relative to
3294 the beginning of the section instead of the symbol. Basically we need
3295 to make sure that the dynamic relocations are done correctly, so in
3296 some cases we force the original symbol to be used. */
3297
252b5132 3298int
e3bb37b5 3299tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3300{
6d249963 3301#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3302 if (!IS_ELF)
31312f95
AM
3303 return 1;
3304
a161fe53
AM
3305 /* Don't adjust pc-relative references to merge sections in 64-bit
3306 mode. */
3307 if (use_rela_relocations
3308 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3309 && fixP->fx_pcrel)
252b5132 3310 return 0;
31312f95 3311
8d01d9a9
AJ
3312 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3313 and changed later by validate_fix. */
3314 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3315 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3316 return 0;
3317
8fd4256d
L
3318 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3319 for size relocations. */
3320 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3321 || fixP->fx_r_type == BFD_RELOC_SIZE64
3322 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132
RH
3323 || fixP->fx_r_type == BFD_RELOC_386_PLT32
3324 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3325 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3326 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3327 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3328 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3329 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3330 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3331 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3332 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3333 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3334 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3335 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c
JH
3336 || fixP->fx_r_type == BFD_RELOC_X86_64_PLT32
3337 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3338 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3339 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3340 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3341 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3342 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3343 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3344 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3345 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3346 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3347 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3348 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3349 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3350 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3351 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3352 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3353 return 0;
31312f95 3354#endif
252b5132
RH
3355 return 1;
3356}
252b5132 3357
b4cac588 3358static int
e3bb37b5 3359intel_float_operand (const char *mnemonic)
252b5132 3360{
9306ca4a
JB
3361 /* Note that the value returned is meaningful only for opcodes with (memory)
3362 operands, hence the code here is free to improperly handle opcodes that
3363 have no operands (for better performance and smaller code). */
3364
3365 if (mnemonic[0] != 'f')
3366 return 0; /* non-math */
3367
3368 switch (mnemonic[1])
3369 {
3370 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3371 the fs segment override prefix not currently handled because no
3372 call path can make opcodes without operands get here */
3373 case 'i':
3374 return 2 /* integer op */;
3375 case 'l':
3376 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3377 return 3; /* fldcw/fldenv */
3378 break;
3379 case 'n':
3380 if (mnemonic[2] != 'o' /* fnop */)
3381 return 3; /* non-waiting control op */
3382 break;
3383 case 'r':
3384 if (mnemonic[2] == 's')
3385 return 3; /* frstor/frstpm */
3386 break;
3387 case 's':
3388 if (mnemonic[2] == 'a')
3389 return 3; /* fsave */
3390 if (mnemonic[2] == 't')
3391 {
3392 switch (mnemonic[3])
3393 {
3394 case 'c': /* fstcw */
3395 case 'd': /* fstdw */
3396 case 'e': /* fstenv */
3397 case 's': /* fsts[gw] */
3398 return 3;
3399 }
3400 }
3401 break;
3402 case 'x':
3403 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3404 return 0; /* fxsave/fxrstor are not really math ops */
3405 break;
3406 }
252b5132 3407
9306ca4a 3408 return 1;
252b5132
RH
3409}
3410
c0f3af97
L
3411/* Build the VEX prefix. */
3412
3413static void
d3ce72d0 3414build_vex_prefix (const insn_template *t)
c0f3af97
L
3415{
3416 unsigned int register_specifier;
3417 unsigned int implied_prefix;
3418 unsigned int vector_length;
03751133 3419 unsigned int w;
c0f3af97
L
3420
3421 /* Check register specifier. */
3422 if (i.vex.register_specifier)
43234a1e
L
3423 {
3424 register_specifier =
3425 ~register_number (i.vex.register_specifier) & 0xf;
3426 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3427 }
c0f3af97
L
3428 else
3429 register_specifier = 0xf;
3430
79f0fa25
L
3431 /* Use 2-byte VEX prefix by swapping destination and source operand
3432 if there are more than 1 register operand. */
3433 if (i.reg_operands > 1
3434 && i.vec_encoding != vex_encoding_vex3
86fa6981 3435 && i.dir_encoding == dir_encoding_default
fa99fab2 3436 && i.operands == i.reg_operands
dbbc8b7e 3437 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
7f399153 3438 && i.tm.opcode_modifier.vexopcode == VEX0F
dbbc8b7e 3439 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3440 && i.rex == REX_B)
3441 {
3442 unsigned int xchg = i.operands - 1;
3443 union i386_op temp_op;
3444 i386_operand_type temp_type;
3445
3446 temp_type = i.types[xchg];
3447 i.types[xchg] = i.types[0];
3448 i.types[0] = temp_type;
3449 temp_op = i.op[xchg];
3450 i.op[xchg] = i.op[0];
3451 i.op[0] = temp_op;
3452
9c2799c2 3453 gas_assert (i.rm.mode == 3);
fa99fab2
L
3454
3455 i.rex = REX_R;
3456 xchg = i.rm.regmem;
3457 i.rm.regmem = i.rm.reg;
3458 i.rm.reg = xchg;
3459
dbbc8b7e
JB
3460 if (i.tm.opcode_modifier.d)
3461 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
3462 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
3463 else /* Use the next insn. */
3464 i.tm = t[1];
fa99fab2
L
3465 }
3466
79dec6b7
JB
3467 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3468 are no memory operands and at least 3 register ones. */
3469 if (i.reg_operands >= 3
3470 && i.vec_encoding != vex_encoding_vex3
3471 && i.reg_operands == i.operands - i.imm_operands
3472 && i.tm.opcode_modifier.vex
3473 && i.tm.opcode_modifier.commutative
3474 && (i.tm.opcode_modifier.sse2avx || optimize > 1)
3475 && i.rex == REX_B
3476 && i.vex.register_specifier
3477 && !(i.vex.register_specifier->reg_flags & RegRex))
3478 {
3479 unsigned int xchg = i.operands - i.reg_operands;
3480 union i386_op temp_op;
3481 i386_operand_type temp_type;
3482
3483 gas_assert (i.tm.opcode_modifier.vexopcode == VEX0F);
3484 gas_assert (!i.tm.opcode_modifier.sae);
3485 gas_assert (operand_type_equal (&i.types[i.operands - 2],
3486 &i.types[i.operands - 3]));
3487 gas_assert (i.rm.mode == 3);
3488
3489 temp_type = i.types[xchg];
3490 i.types[xchg] = i.types[xchg + 1];
3491 i.types[xchg + 1] = temp_type;
3492 temp_op = i.op[xchg];
3493 i.op[xchg] = i.op[xchg + 1];
3494 i.op[xchg + 1] = temp_op;
3495
3496 i.rex = 0;
3497 xchg = i.rm.regmem | 8;
3498 i.rm.regmem = ~register_specifier & 0xf;
3499 gas_assert (!(i.rm.regmem & 8));
3500 i.vex.register_specifier += xchg - i.rm.regmem;
3501 register_specifier = ~xchg & 0xf;
3502 }
3503
539f890d
L
3504 if (i.tm.opcode_modifier.vex == VEXScalar)
3505 vector_length = avxscalar;
10c17abd
JB
3506 else if (i.tm.opcode_modifier.vex == VEX256)
3507 vector_length = 1;
539f890d 3508 else
10c17abd 3509 {
56522fc5 3510 unsigned int op;
10c17abd 3511
c7213af9
L
3512 /* Determine vector length from the last multi-length vector
3513 operand. */
10c17abd 3514 vector_length = 0;
56522fc5 3515 for (op = t->operands; op--;)
10c17abd
JB
3516 if (t->operand_types[op].bitfield.xmmword
3517 && t->operand_types[op].bitfield.ymmword
3518 && i.types[op].bitfield.ymmword)
3519 {
3520 vector_length = 1;
3521 break;
3522 }
3523 }
c0f3af97
L
3524
3525 switch ((i.tm.base_opcode >> 8) & 0xff)
3526 {
3527 case 0:
3528 implied_prefix = 0;
3529 break;
3530 case DATA_PREFIX_OPCODE:
3531 implied_prefix = 1;
3532 break;
3533 case REPE_PREFIX_OPCODE:
3534 implied_prefix = 2;
3535 break;
3536 case REPNE_PREFIX_OPCODE:
3537 implied_prefix = 3;
3538 break;
3539 default:
3540 abort ();
3541 }
3542
03751133
L
3543 /* Check the REX.W bit and VEXW. */
3544 if (i.tm.opcode_modifier.vexw == VEXWIG)
3545 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
3546 else if (i.tm.opcode_modifier.vexw)
3547 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3548 else
931d03b7 3549 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3550
c0f3af97 3551 /* Use 2-byte VEX prefix if possible. */
03751133
L
3552 if (w == 0
3553 && i.vec_encoding != vex_encoding_vex3
86fa6981 3554 && i.tm.opcode_modifier.vexopcode == VEX0F
c0f3af97
L
3555 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3556 {
3557 /* 2-byte VEX prefix. */
3558 unsigned int r;
3559
3560 i.vex.length = 2;
3561 i.vex.bytes[0] = 0xc5;
3562
3563 /* Check the REX.R bit. */
3564 r = (i.rex & REX_R) ? 0 : 1;
3565 i.vex.bytes[1] = (r << 7
3566 | register_specifier << 3
3567 | vector_length << 2
3568 | implied_prefix);
3569 }
3570 else
3571 {
3572 /* 3-byte VEX prefix. */
03751133 3573 unsigned int m;
c0f3af97 3574
f88c9eb0 3575 i.vex.length = 3;
f88c9eb0 3576
7f399153 3577 switch (i.tm.opcode_modifier.vexopcode)
5dd85c99 3578 {
7f399153
L
3579 case VEX0F:
3580 m = 0x1;
80de6e00 3581 i.vex.bytes[0] = 0xc4;
7f399153
L
3582 break;
3583 case VEX0F38:
3584 m = 0x2;
80de6e00 3585 i.vex.bytes[0] = 0xc4;
7f399153
L
3586 break;
3587 case VEX0F3A:
3588 m = 0x3;
80de6e00 3589 i.vex.bytes[0] = 0xc4;
7f399153
L
3590 break;
3591 case XOP08:
5dd85c99
SP
3592 m = 0x8;
3593 i.vex.bytes[0] = 0x8f;
7f399153
L
3594 break;
3595 case XOP09:
f88c9eb0
SP
3596 m = 0x9;
3597 i.vex.bytes[0] = 0x8f;
7f399153
L
3598 break;
3599 case XOP0A:
f88c9eb0
SP
3600 m = 0xa;
3601 i.vex.bytes[0] = 0x8f;
7f399153
L
3602 break;
3603 default:
3604 abort ();
f88c9eb0 3605 }
c0f3af97 3606
c0f3af97
L
3607 /* The high 3 bits of the second VEX byte are 1's compliment
3608 of RXB bits from REX. */
3609 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3610
c0f3af97
L
3611 i.vex.bytes[2] = (w << 7
3612 | register_specifier << 3
3613 | vector_length << 2
3614 | implied_prefix);
3615 }
3616}
3617
e771e7c9
JB
3618static INLINE bfd_boolean
3619is_evex_encoding (const insn_template *t)
3620{
7091c612 3621 return t->opcode_modifier.evex || t->opcode_modifier.disp8memshift
e771e7c9 3622 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
a80195f1 3623 || t->opcode_modifier.sae;
e771e7c9
JB
3624}
3625
7a8655d2
JB
3626static INLINE bfd_boolean
3627is_any_vex_encoding (const insn_template *t)
3628{
3629 return t->opcode_modifier.vex || t->opcode_modifier.vexopcode
3630 || is_evex_encoding (t);
3631}
3632
43234a1e
L
3633/* Build the EVEX prefix. */
3634
3635static void
3636build_evex_prefix (void)
3637{
3638 unsigned int register_specifier;
3639 unsigned int implied_prefix;
3640 unsigned int m, w;
3641 rex_byte vrex_used = 0;
3642
3643 /* Check register specifier. */
3644 if (i.vex.register_specifier)
3645 {
3646 gas_assert ((i.vrex & REX_X) == 0);
3647
3648 register_specifier = i.vex.register_specifier->reg_num;
3649 if ((i.vex.register_specifier->reg_flags & RegRex))
3650 register_specifier += 8;
3651 /* The upper 16 registers are encoded in the fourth byte of the
3652 EVEX prefix. */
3653 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3654 i.vex.bytes[3] = 0x8;
3655 register_specifier = ~register_specifier & 0xf;
3656 }
3657 else
3658 {
3659 register_specifier = 0xf;
3660
3661 /* Encode upper 16 vector index register in the fourth byte of
3662 the EVEX prefix. */
3663 if (!(i.vrex & REX_X))
3664 i.vex.bytes[3] = 0x8;
3665 else
3666 vrex_used |= REX_X;
3667 }
3668
3669 switch ((i.tm.base_opcode >> 8) & 0xff)
3670 {
3671 case 0:
3672 implied_prefix = 0;
3673 break;
3674 case DATA_PREFIX_OPCODE:
3675 implied_prefix = 1;
3676 break;
3677 case REPE_PREFIX_OPCODE:
3678 implied_prefix = 2;
3679 break;
3680 case REPNE_PREFIX_OPCODE:
3681 implied_prefix = 3;
3682 break;
3683 default:
3684 abort ();
3685 }
3686
3687 /* 4 byte EVEX prefix. */
3688 i.vex.length = 4;
3689 i.vex.bytes[0] = 0x62;
3690
3691 /* mmmm bits. */
3692 switch (i.tm.opcode_modifier.vexopcode)
3693 {
3694 case VEX0F:
3695 m = 1;
3696 break;
3697 case VEX0F38:
3698 m = 2;
3699 break;
3700 case VEX0F3A:
3701 m = 3;
3702 break;
3703 default:
3704 abort ();
3705 break;
3706 }
3707
3708 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3709 bits from REX. */
3710 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3711
3712 /* The fifth bit of the second EVEX byte is 1's compliment of the
3713 REX_R bit in VREX. */
3714 if (!(i.vrex & REX_R))
3715 i.vex.bytes[1] |= 0x10;
3716 else
3717 vrex_used |= REX_R;
3718
3719 if ((i.reg_operands + i.imm_operands) == i.operands)
3720 {
3721 /* When all operands are registers, the REX_X bit in REX is not
3722 used. We reuse it to encode the upper 16 registers, which is
3723 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3724 as 1's compliment. */
3725 if ((i.vrex & REX_B))
3726 {
3727 vrex_used |= REX_B;
3728 i.vex.bytes[1] &= ~0x40;
3729 }
3730 }
3731
3732 /* EVEX instructions shouldn't need the REX prefix. */
3733 i.vrex &= ~vrex_used;
3734 gas_assert (i.vrex == 0);
3735
6865c043
L
3736 /* Check the REX.W bit and VEXW. */
3737 if (i.tm.opcode_modifier.vexw == VEXWIG)
3738 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
3739 else if (i.tm.opcode_modifier.vexw)
3740 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3741 else
931d03b7 3742 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e
L
3743
3744 /* Encode the U bit. */
3745 implied_prefix |= 0x4;
3746
3747 /* The third byte of the EVEX prefix. */
3748 i.vex.bytes[2] = (w << 7 | register_specifier << 3 | implied_prefix);
3749
3750 /* The fourth byte of the EVEX prefix. */
3751 /* The zeroing-masking bit. */
3752 if (i.mask && i.mask->zeroing)
3753 i.vex.bytes[3] |= 0x80;
3754
3755 /* Don't always set the broadcast bit if there is no RC. */
3756 if (!i.rounding)
3757 {
3758 /* Encode the vector length. */
3759 unsigned int vec_length;
3760
e771e7c9
JB
3761 if (!i.tm.opcode_modifier.evex
3762 || i.tm.opcode_modifier.evex == EVEXDYN)
3763 {
56522fc5 3764 unsigned int op;
e771e7c9 3765
c7213af9
L
3766 /* Determine vector length from the last multi-length vector
3767 operand. */
e771e7c9 3768 vec_length = 0;
56522fc5 3769 for (op = i.operands; op--;)
e771e7c9
JB
3770 if (i.tm.operand_types[op].bitfield.xmmword
3771 + i.tm.operand_types[op].bitfield.ymmword
3772 + i.tm.operand_types[op].bitfield.zmmword > 1)
3773 {
3774 if (i.types[op].bitfield.zmmword)
c7213af9
L
3775 {
3776 i.tm.opcode_modifier.evex = EVEX512;
3777 break;
3778 }
e771e7c9 3779 else if (i.types[op].bitfield.ymmword)
c7213af9
L
3780 {
3781 i.tm.opcode_modifier.evex = EVEX256;
3782 break;
3783 }
e771e7c9 3784 else if (i.types[op].bitfield.xmmword)
c7213af9
L
3785 {
3786 i.tm.opcode_modifier.evex = EVEX128;
3787 break;
3788 }
625cbd7a
JB
3789 else if (i.broadcast && (int) op == i.broadcast->operand)
3790 {
4a1b91ea 3791 switch (i.broadcast->bytes)
625cbd7a
JB
3792 {
3793 case 64:
3794 i.tm.opcode_modifier.evex = EVEX512;
3795 break;
3796 case 32:
3797 i.tm.opcode_modifier.evex = EVEX256;
3798 break;
3799 case 16:
3800 i.tm.opcode_modifier.evex = EVEX128;
3801 break;
3802 default:
c7213af9 3803 abort ();
625cbd7a 3804 }
c7213af9 3805 break;
625cbd7a 3806 }
e771e7c9 3807 }
c7213af9 3808
56522fc5 3809 if (op >= MAX_OPERANDS)
c7213af9 3810 abort ();
e771e7c9
JB
3811 }
3812
43234a1e
L
3813 switch (i.tm.opcode_modifier.evex)
3814 {
3815 case EVEXLIG: /* LL' is ignored */
3816 vec_length = evexlig << 5;
3817 break;
3818 case EVEX128:
3819 vec_length = 0 << 5;
3820 break;
3821 case EVEX256:
3822 vec_length = 1 << 5;
3823 break;
3824 case EVEX512:
3825 vec_length = 2 << 5;
3826 break;
3827 default:
3828 abort ();
3829 break;
3830 }
3831 i.vex.bytes[3] |= vec_length;
3832 /* Encode the broadcast bit. */
3833 if (i.broadcast)
3834 i.vex.bytes[3] |= 0x10;
3835 }
3836 else
3837 {
3838 if (i.rounding->type != saeonly)
3839 i.vex.bytes[3] |= 0x10 | (i.rounding->type << 5);
3840 else
d3d3c6db 3841 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e
L
3842 }
3843
3844 if (i.mask && i.mask->mask)
3845 i.vex.bytes[3] |= i.mask->mask->reg_num;
3846}
3847
65da13b5
L
3848static void
3849process_immext (void)
3850{
3851 expressionS *exp;
3852
4c692bc7
JB
3853 if ((i.tm.cpu_flags.bitfield.cpusse3 || i.tm.cpu_flags.bitfield.cpusvme)
3854 && i.operands > 0)
65da13b5 3855 {
4c692bc7
JB
3856 /* MONITOR/MWAIT as well as SVME instructions have fixed operands
3857 with an opcode suffix which is coded in the same place as an
3858 8-bit immediate field would be.
3859 Here we check those operands and remove them afterwards. */
65da13b5
L
3860 unsigned int x;
3861
3862 for (x = 0; x < i.operands; x++)
4c692bc7 3863 if (register_number (i.op[x].regs) != x)
65da13b5 3864 as_bad (_("can't use register '%s%s' as operand %d in '%s'."),
1fed0ba1
L
3865 register_prefix, i.op[x].regs->reg_name, x + 1,
3866 i.tm.name);
3867
3868 i.operands = 0;
65da13b5
L
3869 }
3870
9916071f
AP
3871 if (i.tm.cpu_flags.bitfield.cpumwaitx && i.operands > 0)
3872 {
3873 /* MONITORX/MWAITX instructions have fixed operands with an opcode
3874 suffix which is coded in the same place as an 8-bit immediate
3875 field would be.
3876 Here we check those operands and remove them afterwards. */
3877 unsigned int x;
3878
3879 if (i.operands != 3)
3880 abort();
3881
3882 for (x = 0; x < 2; x++)
3883 if (register_number (i.op[x].regs) != x)
3884 goto bad_register_operand;
3885
3886 /* Check for third operand for mwaitx/monitorx insn. */
3887 if (register_number (i.op[x].regs)
3888 != (x + (i.tm.extension_opcode == 0xfb)))
3889 {
3890bad_register_operand:
3891 as_bad (_("can't use register '%s%s' as operand %d in '%s'."),
3892 register_prefix, i.op[x].regs->reg_name, x+1,
3893 i.tm.name);
3894 }
3895
3896 i.operands = 0;
3897 }
3898
c0f3af97 3899 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
3900 which is coded in the same place as an 8-bit immediate field
3901 would be. Here we fake an 8-bit immediate operand from the
3902 opcode suffix stored in tm.extension_opcode.
3903
c1e679ec 3904 AVX instructions also use this encoding, for some of
c0f3af97 3905 3 argument instructions. */
65da13b5 3906
43234a1e 3907 gas_assert (i.imm_operands <= 1
7ab9ffdd 3908 && (i.operands <= 2
7a8655d2 3909 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 3910 && i.operands <= 4)));
65da13b5
L
3911
3912 exp = &im_expressions[i.imm_operands++];
3913 i.op[i.operands].imms = exp;
3914 i.types[i.operands] = imm8;
3915 i.operands++;
3916 exp->X_op = O_constant;
3917 exp->X_add_number = i.tm.extension_opcode;
3918 i.tm.extension_opcode = None;
3919}
3920
42164a71
L
3921
3922static int
3923check_hle (void)
3924{
3925 switch (i.tm.opcode_modifier.hleprefixok)
3926 {
3927 default:
3928 abort ();
82c2def5 3929 case HLEPrefixNone:
165de32a
L
3930 as_bad (_("invalid instruction `%s' after `%s'"),
3931 i.tm.name, i.hle_prefix);
42164a71 3932 return 0;
82c2def5 3933 case HLEPrefixLock:
42164a71
L
3934 if (i.prefix[LOCK_PREFIX])
3935 return 1;
165de32a 3936 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 3937 return 0;
82c2def5 3938 case HLEPrefixAny:
42164a71 3939 return 1;
82c2def5 3940 case HLEPrefixRelease:
42164a71
L
3941 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
3942 {
3943 as_bad (_("instruction `%s' after `xacquire' not allowed"),
3944 i.tm.name);
3945 return 0;
3946 }
8dc0818e 3947 if (i.mem_operands == 0 || !(i.flags[i.operands - 1] & Operand_Mem))
42164a71
L
3948 {
3949 as_bad (_("memory destination needed for instruction `%s'"
3950 " after `xrelease'"), i.tm.name);
3951 return 0;
3952 }
3953 return 1;
3954 }
3955}
3956
b6f8c7c4
L
3957/* Try the shortest encoding by shortening operand size. */
3958
3959static void
3960optimize_encoding (void)
3961{
a0a1771e 3962 unsigned int j;
b6f8c7c4
L
3963
3964 if (optimize_for_space
3965 && i.reg_operands == 1
3966 && i.imm_operands == 1
3967 && !i.types[1].bitfield.byte
3968 && i.op[0].imms->X_op == O_constant
3969 && fits_in_imm7 (i.op[0].imms->X_add_number)
3970 && ((i.tm.base_opcode == 0xa8
3971 && i.tm.extension_opcode == None)
3972 || (i.tm.base_opcode == 0xf6
3973 && i.tm.extension_opcode == 0x0)))
3974 {
3975 /* Optimize: -Os:
3976 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
3977 */
3978 unsigned int base_regnum = i.op[1].regs->reg_num;
3979 if (flag_code == CODE_64BIT || base_regnum < 4)
3980 {
3981 i.types[1].bitfield.byte = 1;
3982 /* Ignore the suffix. */
3983 i.suffix = 0;
3984 if (base_regnum >= 4
3985 && !(i.op[1].regs->reg_flags & RegRex))
3986 {
3987 /* Handle SP, BP, SI and DI registers. */
3988 if (i.types[1].bitfield.word)
3989 j = 16;
3990 else if (i.types[1].bitfield.dword)
3991 j = 32;
3992 else
3993 j = 48;
3994 i.op[1].regs -= j;
3995 }
3996 }
3997 }
3998 else if (flag_code == CODE_64BIT
d3d50934
L
3999 && ((i.types[1].bitfield.qword
4000 && i.reg_operands == 1
b6f8c7c4
L
4001 && i.imm_operands == 1
4002 && i.op[0].imms->X_op == O_constant
507916b8 4003 && ((i.tm.base_opcode == 0xb8
b6f8c7c4
L
4004 && i.tm.extension_opcode == None
4005 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
4006 || (fits_in_imm31 (i.op[0].imms->X_add_number)
4007 && (((i.tm.base_opcode == 0x24
4008 || i.tm.base_opcode == 0xa8)
4009 && i.tm.extension_opcode == None)
4010 || (i.tm.base_opcode == 0x80
4011 && i.tm.extension_opcode == 0x4)
4012 || ((i.tm.base_opcode == 0xf6
507916b8 4013 || (i.tm.base_opcode | 1) == 0xc7)
b8364fa7
JB
4014 && i.tm.extension_opcode == 0x0)))
4015 || (fits_in_imm7 (i.op[0].imms->X_add_number)
4016 && i.tm.base_opcode == 0x83
4017 && i.tm.extension_opcode == 0x4)))
d3d50934
L
4018 || (i.types[0].bitfield.qword
4019 && ((i.reg_operands == 2
4020 && i.op[0].regs == i.op[1].regs
4021 && ((i.tm.base_opcode == 0x30
4022 || i.tm.base_opcode == 0x28)
4023 && i.tm.extension_opcode == None))
4024 || (i.reg_operands == 1
4025 && i.operands == 1
4026 && i.tm.base_opcode == 0x30
4027 && i.tm.extension_opcode == None)))))
b6f8c7c4
L
4028 {
4029 /* Optimize: -O:
4030 andq $imm31, %r64 -> andl $imm31, %r32
b8364fa7 4031 andq $imm7, %r64 -> andl $imm7, %r32
b6f8c7c4
L
4032 testq $imm31, %r64 -> testl $imm31, %r32
4033 xorq %r64, %r64 -> xorl %r32, %r32
4034 subq %r64, %r64 -> subl %r32, %r32
4035 movq $imm31, %r64 -> movl $imm31, %r32
4036 movq $imm32, %r64 -> movl $imm32, %r32
4037 */
4038 i.tm.opcode_modifier.norex64 = 1;
507916b8 4039 if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4040 {
4041 /* Handle
4042 movq $imm31, %r64 -> movl $imm31, %r32
4043 movq $imm32, %r64 -> movl $imm32, %r32
4044 */
4045 i.tm.operand_types[0].bitfield.imm32 = 1;
4046 i.tm.operand_types[0].bitfield.imm32s = 0;
4047 i.tm.operand_types[0].bitfield.imm64 = 0;
4048 i.types[0].bitfield.imm32 = 1;
4049 i.types[0].bitfield.imm32s = 0;
4050 i.types[0].bitfield.imm64 = 0;
4051 i.types[1].bitfield.dword = 1;
4052 i.types[1].bitfield.qword = 0;
507916b8 4053 if ((i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4054 {
4055 /* Handle
4056 movq $imm31, %r64 -> movl $imm31, %r32
4057 */
507916b8 4058 i.tm.base_opcode = 0xb8;
b6f8c7c4 4059 i.tm.extension_opcode = None;
507916b8 4060 i.tm.opcode_modifier.w = 0;
b6f8c7c4
L
4061 i.tm.opcode_modifier.shortform = 1;
4062 i.tm.opcode_modifier.modrm = 0;
4063 }
4064 }
4065 }
5641ec01
JB
4066 else if (optimize > 1
4067 && !optimize_for_space
4068 && i.reg_operands == 2
4069 && i.op[0].regs == i.op[1].regs
4070 && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8
4071 || (i.tm.base_opcode & ~(Opcode_D | 1)) == 0x20)
4072 && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword))
4073 {
4074 /* Optimize: -O2:
4075 andb %rN, %rN -> testb %rN, %rN
4076 andw %rN, %rN -> testw %rN, %rN
4077 andq %rN, %rN -> testq %rN, %rN
4078 orb %rN, %rN -> testb %rN, %rN
4079 orw %rN, %rN -> testw %rN, %rN
4080 orq %rN, %rN -> testq %rN, %rN
4081
4082 and outside of 64-bit mode
4083
4084 andl %rN, %rN -> testl %rN, %rN
4085 orl %rN, %rN -> testl %rN, %rN
4086 */
4087 i.tm.base_opcode = 0x84 | (i.tm.base_opcode & 1);
4088 }
99112332 4089 else if (i.reg_operands == 3
b6f8c7c4
L
4090 && i.op[0].regs == i.op[1].regs
4091 && !i.types[2].bitfield.xmmword
4092 && (i.tm.opcode_modifier.vex
7a69eac3 4093 || ((!i.mask || i.mask->zeroing)
b6f8c7c4 4094 && !i.rounding
e771e7c9 4095 && is_evex_encoding (&i.tm)
80c34c38 4096 && (i.vec_encoding != vex_encoding_evex
dd22218c 4097 || cpu_arch_isa_flags.bitfield.cpuavx512vl
80c34c38 4098 || i.tm.cpu_flags.bitfield.cpuavx512vl
7091c612 4099 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4100 && i.types[2].bitfield.ymmword))))
b6f8c7c4
L
4101 && ((i.tm.base_opcode == 0x55
4102 || i.tm.base_opcode == 0x6655
4103 || i.tm.base_opcode == 0x66df
4104 || i.tm.base_opcode == 0x57
4105 || i.tm.base_opcode == 0x6657
8305403a
L
4106 || i.tm.base_opcode == 0x66ef
4107 || i.tm.base_opcode == 0x66f8
4108 || i.tm.base_opcode == 0x66f9
4109 || i.tm.base_opcode == 0x66fa
1424ad86
JB
4110 || i.tm.base_opcode == 0x66fb
4111 || i.tm.base_opcode == 0x42
4112 || i.tm.base_opcode == 0x6642
4113 || i.tm.base_opcode == 0x47
4114 || i.tm.base_opcode == 0x6647)
b6f8c7c4
L
4115 && i.tm.extension_opcode == None))
4116 {
99112332 4117 /* Optimize: -O1:
8305403a
L
4118 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4119 vpsubq and vpsubw:
b6f8c7c4
L
4120 EVEX VOP %zmmM, %zmmM, %zmmN
4121 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4122 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4123 EVEX VOP %ymmM, %ymmM, %ymmN
4124 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4125 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4126 VEX VOP %ymmM, %ymmM, %ymmN
4127 -> VEX VOP %xmmM, %xmmM, %xmmN
4128 VOP, one of vpandn and vpxor:
4129 VEX VOP %ymmM, %ymmM, %ymmN
4130 -> VEX VOP %xmmM, %xmmM, %xmmN
4131 VOP, one of vpandnd and vpandnq:
4132 EVEX VOP %zmmM, %zmmM, %zmmN
4133 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4134 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4135 EVEX VOP %ymmM, %ymmM, %ymmN
4136 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4137 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4138 VOP, one of vpxord and vpxorq:
4139 EVEX VOP %zmmM, %zmmM, %zmmN
4140 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4141 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4142 EVEX VOP %ymmM, %ymmM, %ymmN
4143 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4144 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4145 VOP, one of kxord and kxorq:
4146 VEX VOP %kM, %kM, %kN
4147 -> VEX kxorw %kM, %kM, %kN
4148 VOP, one of kandnd and kandnq:
4149 VEX VOP %kM, %kM, %kN
4150 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4151 */
e771e7c9 4152 if (is_evex_encoding (&i.tm))
b6f8c7c4 4153 {
7b1d7ca1 4154 if (i.vec_encoding != vex_encoding_evex)
b6f8c7c4
L
4155 {
4156 i.tm.opcode_modifier.vex = VEX128;
4157 i.tm.opcode_modifier.vexw = VEXW0;
4158 i.tm.opcode_modifier.evex = 0;
4159 }
7b1d7ca1 4160 else if (optimize > 1)
dd22218c
L
4161 i.tm.opcode_modifier.evex = EVEX128;
4162 else
4163 return;
b6f8c7c4 4164 }
f74a6307 4165 else if (i.tm.operand_types[0].bitfield.class == RegMask)
1424ad86
JB
4166 {
4167 i.tm.base_opcode &= 0xff;
4168 i.tm.opcode_modifier.vexw = VEXW0;
4169 }
b6f8c7c4
L
4170 else
4171 i.tm.opcode_modifier.vex = VEX128;
4172
4173 if (i.tm.opcode_modifier.vex)
4174 for (j = 0; j < 3; j++)
4175 {
4176 i.types[j].bitfield.xmmword = 1;
4177 i.types[j].bitfield.ymmword = 0;
4178 }
4179 }
392a5972 4180 else if (i.vec_encoding != vex_encoding_evex
97ed31ae 4181 && !i.types[0].bitfield.zmmword
392a5972 4182 && !i.types[1].bitfield.zmmword
97ed31ae 4183 && !i.mask
a0a1771e 4184 && !i.broadcast
97ed31ae 4185 && is_evex_encoding (&i.tm)
392a5972
L
4186 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x666f
4187 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf36f
a0a1771e
JB
4188 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f
4189 || (i.tm.base_opcode & ~4) == 0x66db
4190 || (i.tm.base_opcode & ~4) == 0x66eb)
97ed31ae
L
4191 && i.tm.extension_opcode == None)
4192 {
4193 /* Optimize: -O1:
4194 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4195 vmovdqu32 and vmovdqu64:
4196 EVEX VOP %xmmM, %xmmN
4197 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4198 EVEX VOP %ymmM, %ymmN
4199 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4200 EVEX VOP %xmmM, mem
4201 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4202 EVEX VOP %ymmM, mem
4203 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4204 EVEX VOP mem, %xmmN
4205 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4206 EVEX VOP mem, %ymmN
4207 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
a0a1771e
JB
4208 VOP, one of vpand, vpandn, vpor, vpxor:
4209 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4210 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4211 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4212 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4213 EVEX VOP{d,q} mem, %xmmM, %xmmN
4214 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4215 EVEX VOP{d,q} mem, %ymmM, %ymmN
4216 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
97ed31ae 4217 */
a0a1771e 4218 for (j = 0; j < i.operands; j++)
392a5972
L
4219 if (operand_type_check (i.types[j], disp)
4220 && i.op[j].disps->X_op == O_constant)
4221 {
4222 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4223 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4224 bytes, we choose EVEX Disp8 over VEX Disp32. */
4225 int evex_disp8, vex_disp8;
4226 unsigned int memshift = i.memshift;
4227 offsetT n = i.op[j].disps->X_add_number;
4228
4229 evex_disp8 = fits_in_disp8 (n);
4230 i.memshift = 0;
4231 vex_disp8 = fits_in_disp8 (n);
4232 if (evex_disp8 != vex_disp8)
4233 {
4234 i.memshift = memshift;
4235 return;
4236 }
4237
4238 i.types[j].bitfield.disp8 = vex_disp8;
4239 break;
4240 }
4241 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f)
4242 i.tm.base_opcode ^= 0xf36f ^ 0xf26f;
97ed31ae
L
4243 i.tm.opcode_modifier.vex
4244 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4245 i.tm.opcode_modifier.vexw = VEXW0;
79dec6b7
JB
4246 /* VPAND, VPOR, and VPXOR are commutative. */
4247 if (i.reg_operands == 3 && i.tm.base_opcode != 0x66df)
4248 i.tm.opcode_modifier.commutative = 1;
97ed31ae
L
4249 i.tm.opcode_modifier.evex = 0;
4250 i.tm.opcode_modifier.masking = 0;
a0a1771e 4251 i.tm.opcode_modifier.broadcast = 0;
97ed31ae
L
4252 i.tm.opcode_modifier.disp8memshift = 0;
4253 i.memshift = 0;
a0a1771e
JB
4254 if (j < i.operands)
4255 i.types[j].bitfield.disp8
4256 = fits_in_disp8 (i.op[j].disps->X_add_number);
97ed31ae 4257 }
b6f8c7c4
L
4258}
4259
252b5132
RH
4260/* This is the guts of the machine-dependent assembler. LINE points to a
4261 machine dependent instruction. This function is supposed to emit
4262 the frags/bytes it assembles to. */
4263
4264void
65da13b5 4265md_assemble (char *line)
252b5132 4266{
40fb9820 4267 unsigned int j;
83b16ac6 4268 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 4269 const insn_template *t;
252b5132 4270
47926f60 4271 /* Initialize globals. */
252b5132
RH
4272 memset (&i, '\0', sizeof (i));
4273 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 4274 i.reloc[j] = NO_RELOC;
252b5132
RH
4275 memset (disp_expressions, '\0', sizeof (disp_expressions));
4276 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 4277 save_stack_p = save_stack;
252b5132
RH
4278
4279 /* First parse an instruction mnemonic & call i386_operand for the operands.
4280 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 4281 start of a (possibly prefixed) mnemonic. */
252b5132 4282
29b0f896
AM
4283 line = parse_insn (line, mnemonic);
4284 if (line == NULL)
4285 return;
83b16ac6 4286 mnem_suffix = i.suffix;
252b5132 4287
29b0f896 4288 line = parse_operands (line, mnemonic);
ee86248c 4289 this_operand = -1;
8325cc63
JB
4290 xfree (i.memop1_string);
4291 i.memop1_string = NULL;
29b0f896
AM
4292 if (line == NULL)
4293 return;
252b5132 4294
29b0f896
AM
4295 /* Now we've parsed the mnemonic into a set of templates, and have the
4296 operands at hand. */
4297
4298 /* All intel opcodes have reversed operands except for "bound" and
4299 "enter". We also don't reverse intersegment "jmp" and "call"
4300 instructions with 2 immediate operands so that the immediate segment
050dfa73 4301 precedes the offset, as it does when in AT&T mode. */
4d456e3d
L
4302 if (intel_syntax
4303 && i.operands > 1
29b0f896 4304 && (strcmp (mnemonic, "bound") != 0)
30123838 4305 && (strcmp (mnemonic, "invlpga") != 0)
40fb9820
L
4306 && !(operand_type_check (i.types[0], imm)
4307 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4308 swap_operands ();
4309
ec56d5c0
JB
4310 /* The order of the immediates should be reversed
4311 for 2 immediates extrq and insertq instructions */
4312 if (i.imm_operands == 2
4313 && (strcmp (mnemonic, "extrq") == 0
4314 || strcmp (mnemonic, "insertq") == 0))
4315 swap_2_operands (0, 1);
4316
29b0f896
AM
4317 if (i.imm_operands)
4318 optimize_imm ();
4319
b300c311
L
4320 /* Don't optimize displacement for movabs since it only takes 64bit
4321 displacement. */
4322 if (i.disp_operands
a501d77e 4323 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4324 && (flag_code != CODE_64BIT
4325 || strcmp (mnemonic, "movabs") != 0))
4326 optimize_disp ();
29b0f896
AM
4327
4328 /* Next, we find a template that matches the given insn,
4329 making sure the overlap of the given operands types is consistent
4330 with the template operand types. */
252b5132 4331
83b16ac6 4332 if (!(t = match_template (mnem_suffix)))
29b0f896 4333 return;
252b5132 4334
7bab8ab5 4335 if (sse_check != check_none
81f8a913 4336 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4337 && !i.tm.cpu_flags.bitfield.cpuavx
daf50ae7
L
4338 && (i.tm.cpu_flags.bitfield.cpusse
4339 || i.tm.cpu_flags.bitfield.cpusse2
4340 || i.tm.cpu_flags.bitfield.cpusse3
4341 || i.tm.cpu_flags.bitfield.cpussse3
4342 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e
JB
4343 || i.tm.cpu_flags.bitfield.cpusse4_2
4344 || i.tm.cpu_flags.bitfield.cpupclmul
4345 || i.tm.cpu_flags.bitfield.cpuaes
4346 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4347 {
7bab8ab5 4348 (sse_check == check_warning
daf50ae7
L
4349 ? as_warn
4350 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4351 }
4352
321fd21e
L
4353 /* Zap movzx and movsx suffix. The suffix has been set from
4354 "word ptr" or "byte ptr" on the source operand in Intel syntax
4355 or extracted from mnemonic in AT&T syntax. But we'll use
4356 the destination register to choose the suffix for encoding. */
4357 if ((i.tm.base_opcode & ~9) == 0x0fb6)
cd61ebfe 4358 {
321fd21e
L
4359 /* In Intel syntax, there must be a suffix. In AT&T syntax, if
4360 there is no suffix, the default will be byte extension. */
4361 if (i.reg_operands != 2
4362 && !i.suffix
7ab9ffdd 4363 && intel_syntax)
321fd21e
L
4364 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
4365
4366 i.suffix = 0;
cd61ebfe 4367 }
24eab124 4368
40fb9820 4369 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4370 if (!add_prefix (FWAIT_OPCODE))
4371 return;
252b5132 4372
d5de92cf
L
4373 /* Check if REP prefix is OK. */
4374 if (i.rep_prefix && !i.tm.opcode_modifier.repprefixok)
4375 {
4376 as_bad (_("invalid instruction `%s' after `%s'"),
4377 i.tm.name, i.rep_prefix);
4378 return;
4379 }
4380
c1ba0266
L
4381 /* Check for lock without a lockable instruction. Destination operand
4382 must be memory unless it is xchg (0x86). */
c32fa91d
L
4383 if (i.prefix[LOCK_PREFIX]
4384 && (!i.tm.opcode_modifier.islockable
c1ba0266
L
4385 || i.mem_operands == 0
4386 || (i.tm.base_opcode != 0x86
8dc0818e 4387 && !(i.flags[i.operands - 1] & Operand_Mem))))
c32fa91d
L
4388 {
4389 as_bad (_("expecting lockable instruction after `lock'"));
4390 return;
4391 }
4392
7a8655d2
JB
4393 /* Check for data size prefix on VEX/XOP/EVEX encoded insns. */
4394 if (i.prefix[DATA_PREFIX] && is_any_vex_encoding (&i.tm))
4395 {
4396 as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
4397 return;
4398 }
4399
42164a71 4400 /* Check if HLE prefix is OK. */
165de32a 4401 if (i.hle_prefix && !check_hle ())
42164a71
L
4402 return;
4403
7e8b059b
L
4404 /* Check BND prefix. */
4405 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
4406 as_bad (_("expecting valid branch instruction after `bnd'"));
4407
04ef582a 4408 /* Check NOTRACK prefix. */
9fef80d6
L
4409 if (i.notrack_prefix && !i.tm.opcode_modifier.notrackprefixok)
4410 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 4411
327e8c42
JB
4412 if (i.tm.cpu_flags.bitfield.cpumpx)
4413 {
4414 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4415 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
4416 else if (flag_code != CODE_16BIT
4417 ? i.prefix[ADDR_PREFIX]
4418 : i.mem_operands && !i.prefix[ADDR_PREFIX])
4419 as_bad (_("16-bit address isn't allowed in MPX instructions"));
4420 }
7e8b059b
L
4421
4422 /* Insert BND prefix. */
76d3a78a
JB
4423 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
4424 {
4425 if (!i.prefix[BND_PREFIX])
4426 add_prefix (BND_PREFIX_OPCODE);
4427 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
4428 {
4429 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
4430 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
4431 }
4432 }
7e8b059b 4433
29b0f896 4434 /* Check string instruction segment overrides. */
40fb9820 4435 if (i.tm.opcode_modifier.isstring && i.mem_operands != 0)
29b0f896
AM
4436 {
4437 if (!check_string ())
5dd0794d 4438 return;
fc0763e6 4439 i.disp_operands = 0;
29b0f896 4440 }
5dd0794d 4441
b6f8c7c4
L
4442 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
4443 optimize_encoding ();
4444
29b0f896
AM
4445 if (!process_suffix ())
4446 return;
e413e4e9 4447
bc0844ae
L
4448 /* Update operand types. */
4449 for (j = 0; j < i.operands; j++)
4450 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
4451
29b0f896
AM
4452 /* Make still unresolved immediate matches conform to size of immediate
4453 given in i.suffix. */
4454 if (!finalize_imm ())
4455 return;
252b5132 4456
40fb9820 4457 if (i.types[0].bitfield.imm1)
29b0f896 4458 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 4459
9afe6eb8
L
4460 /* We only need to check those implicit registers for instructions
4461 with 3 operands or less. */
4462 if (i.operands <= 3)
4463 for (j = 0; j < i.operands; j++)
75e5731b
JB
4464 if (i.types[j].bitfield.instance != InstanceNone
4465 && !i.types[j].bitfield.xmmword)
9afe6eb8 4466 i.reg_operands--;
40fb9820 4467
c0f3af97
L
4468 /* ImmExt should be processed after SSE2AVX. */
4469 if (!i.tm.opcode_modifier.sse2avx
4470 && i.tm.opcode_modifier.immext)
65da13b5 4471 process_immext ();
252b5132 4472
29b0f896
AM
4473 /* For insns with operands there are more diddles to do to the opcode. */
4474 if (i.operands)
4475 {
4476 if (!process_operands ())
4477 return;
4478 }
40fb9820 4479 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
4480 {
4481 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
4482 as_warn (_("translating to `%sp'"), i.tm.name);
4483 }
252b5132 4484
7a8655d2 4485 if (is_any_vex_encoding (&i.tm))
9e5e5283 4486 {
c1dc7af5 4487 if (!cpu_arch_flags.bitfield.cpui286)
9e5e5283 4488 {
c1dc7af5 4489 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
9e5e5283
L
4490 i.tm.name);
4491 return;
4492 }
c0f3af97 4493
9e5e5283
L
4494 if (i.tm.opcode_modifier.vex)
4495 build_vex_prefix (t);
4496 else
4497 build_evex_prefix ();
4498 }
43234a1e 4499
5dd85c99
SP
4500 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
4501 instructions may define INT_OPCODE as well, so avoid this corner
4502 case for those instructions that use MODRM. */
4503 if (i.tm.base_opcode == INT_OPCODE
a6461c02
SP
4504 && !i.tm.opcode_modifier.modrm
4505 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
4506 {
4507 i.tm.base_opcode = INT3_OPCODE;
4508 i.imm_operands = 0;
4509 }
252b5132 4510
40fb9820
L
4511 if ((i.tm.opcode_modifier.jump
4512 || i.tm.opcode_modifier.jumpbyte
4513 || i.tm.opcode_modifier.jumpdword)
29b0f896
AM
4514 && i.op[0].disps->X_op == O_constant)
4515 {
4516 /* Convert "jmp constant" (and "call constant") to a jump (call) to
4517 the absolute address given by the constant. Since ix86 jumps and
4518 calls are pc relative, we need to generate a reloc. */
4519 i.op[0].disps->X_add_symbol = &abs_symbol;
4520 i.op[0].disps->X_op = O_symbol;
4521 }
252b5132 4522
40fb9820 4523 if (i.tm.opcode_modifier.rex64)
161a04f6 4524 i.rex |= REX_W;
252b5132 4525
29b0f896
AM
4526 /* For 8 bit registers we need an empty rex prefix. Also if the
4527 instruction already has a prefix, we need to convert old
4528 registers to new ones. */
773f551c 4529
bab6aec1 4530 if ((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte
29b0f896 4531 && (i.op[0].regs->reg_flags & RegRex64) != 0)
bab6aec1 4532 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte
29b0f896 4533 && (i.op[1].regs->reg_flags & RegRex64) != 0)
bab6aec1
JB
4534 || (((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte)
4535 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte))
29b0f896
AM
4536 && i.rex != 0))
4537 {
4538 int x;
726c5dcd 4539
29b0f896
AM
4540 i.rex |= REX_OPCODE;
4541 for (x = 0; x < 2; x++)
4542 {
4543 /* Look for 8 bit operand that uses old registers. */
bab6aec1 4544 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
29b0f896 4545 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 4546 {
29b0f896
AM
4547 /* In case it is "hi" register, give up. */
4548 if (i.op[x].regs->reg_num > 3)
a540244d 4549 as_bad (_("can't encode register '%s%s' in an "
4eed87de 4550 "instruction requiring REX prefix."),
a540244d 4551 register_prefix, i.op[x].regs->reg_name);
773f551c 4552
29b0f896
AM
4553 /* Otherwise it is equivalent to the extended register.
4554 Since the encoding doesn't change this is merely
4555 cosmetic cleanup for debug output. */
4556
4557 i.op[x].regs = i.op[x].regs + 8;
773f551c 4558 }
29b0f896
AM
4559 }
4560 }
773f551c 4561
6b6b6807
L
4562 if (i.rex == 0 && i.rex_encoding)
4563 {
4564 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
4565 that uses legacy register. If it is "hi" register, don't add
4566 the REX_OPCODE byte. */
4567 int x;
4568 for (x = 0; x < 2; x++)
bab6aec1 4569 if (i.types[x].bitfield.class == Reg
6b6b6807
L
4570 && i.types[x].bitfield.byte
4571 && (i.op[x].regs->reg_flags & RegRex64) == 0
4572 && i.op[x].regs->reg_num > 3)
4573 {
4574 i.rex_encoding = FALSE;
4575 break;
4576 }
4577
4578 if (i.rex_encoding)
4579 i.rex = REX_OPCODE;
4580 }
4581
7ab9ffdd 4582 if (i.rex != 0)
29b0f896
AM
4583 add_prefix (REX_OPCODE | i.rex);
4584
4585 /* We are ready to output the insn. */
4586 output_insn ();
4587}
4588
4589static char *
e3bb37b5 4590parse_insn (char *line, char *mnemonic)
29b0f896
AM
4591{
4592 char *l = line;
4593 char *token_start = l;
4594 char *mnem_p;
5c6af06e 4595 int supported;
d3ce72d0 4596 const insn_template *t;
b6169b20 4597 char *dot_p = NULL;
29b0f896 4598
29b0f896
AM
4599 while (1)
4600 {
4601 mnem_p = mnemonic;
4602 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
4603 {
b6169b20
L
4604 if (*mnem_p == '.')
4605 dot_p = mnem_p;
29b0f896
AM
4606 mnem_p++;
4607 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 4608 {
29b0f896
AM
4609 as_bad (_("no such instruction: `%s'"), token_start);
4610 return NULL;
4611 }
4612 l++;
4613 }
4614 if (!is_space_char (*l)
4615 && *l != END_OF_INSN
e44823cf
JB
4616 && (intel_syntax
4617 || (*l != PREFIX_SEPARATOR
4618 && *l != ',')))
29b0f896
AM
4619 {
4620 as_bad (_("invalid character %s in mnemonic"),
4621 output_invalid (*l));
4622 return NULL;
4623 }
4624 if (token_start == l)
4625 {
e44823cf 4626 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
4627 as_bad (_("expecting prefix; got nothing"));
4628 else
4629 as_bad (_("expecting mnemonic; got nothing"));
4630 return NULL;
4631 }
45288df1 4632
29b0f896 4633 /* Look up instruction (or prefix) via hash table. */
d3ce72d0 4634 current_templates = (const templates *) hash_find (op_hash, mnemonic);
47926f60 4635
29b0f896
AM
4636 if (*l != END_OF_INSN
4637 && (!is_space_char (*l) || l[1] != END_OF_INSN)
4638 && current_templates
40fb9820 4639 && current_templates->start->opcode_modifier.isprefix)
29b0f896 4640 {
c6fb90c8 4641 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
4642 {
4643 as_bad ((flag_code != CODE_64BIT
4644 ? _("`%s' is only supported in 64-bit mode")
4645 : _("`%s' is not supported in 64-bit mode")),
4646 current_templates->start->name);
4647 return NULL;
4648 }
29b0f896
AM
4649 /* If we are in 16-bit mode, do not allow addr16 or data16.
4650 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
4651 if ((current_templates->start->opcode_modifier.size == SIZE16
4652 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 4653 && flag_code != CODE_64BIT
673fe0f0 4654 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
4655 ^ (flag_code == CODE_16BIT)))
4656 {
4657 as_bad (_("redundant %s prefix"),
4658 current_templates->start->name);
4659 return NULL;
45288df1 4660 }
86fa6981 4661 if (current_templates->start->opcode_length == 0)
29b0f896 4662 {
86fa6981
L
4663 /* Handle pseudo prefixes. */
4664 switch (current_templates->start->base_opcode)
4665 {
4666 case 0x0:
4667 /* {disp8} */
4668 i.disp_encoding = disp_encoding_8bit;
4669 break;
4670 case 0x1:
4671 /* {disp32} */
4672 i.disp_encoding = disp_encoding_32bit;
4673 break;
4674 case 0x2:
4675 /* {load} */
4676 i.dir_encoding = dir_encoding_load;
4677 break;
4678 case 0x3:
4679 /* {store} */
4680 i.dir_encoding = dir_encoding_store;
4681 break;
4682 case 0x4:
4683 /* {vex2} */
4684 i.vec_encoding = vex_encoding_vex2;
4685 break;
4686 case 0x5:
4687 /* {vex3} */
4688 i.vec_encoding = vex_encoding_vex3;
4689 break;
4690 case 0x6:
4691 /* {evex} */
4692 i.vec_encoding = vex_encoding_evex;
4693 break;
6b6b6807
L
4694 case 0x7:
4695 /* {rex} */
4696 i.rex_encoding = TRUE;
4697 break;
b6f8c7c4
L
4698 case 0x8:
4699 /* {nooptimize} */
4700 i.no_optimize = TRUE;
4701 break;
86fa6981
L
4702 default:
4703 abort ();
4704 }
4705 }
4706 else
4707 {
4708 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 4709 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 4710 {
4e9ac44a
L
4711 case PREFIX_EXIST:
4712 return NULL;
4713 case PREFIX_DS:
d777820b 4714 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
4715 i.notrack_prefix = current_templates->start->name;
4716 break;
4717 case PREFIX_REP:
4718 if (current_templates->start->cpu_flags.bitfield.cpuhle)
4719 i.hle_prefix = current_templates->start->name;
4720 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
4721 i.bnd_prefix = current_templates->start->name;
4722 else
4723 i.rep_prefix = current_templates->start->name;
4724 break;
4725 default:
4726 break;
86fa6981 4727 }
29b0f896
AM
4728 }
4729 /* Skip past PREFIX_SEPARATOR and reset token_start. */
4730 token_start = ++l;
4731 }
4732 else
4733 break;
4734 }
45288df1 4735
30a55f88 4736 if (!current_templates)
b6169b20 4737 {
07d5e953
JB
4738 /* Deprecated functionality (new code should use pseudo-prefixes instead):
4739 Check if we should swap operand or force 32bit displacement in
f8a5c266 4740 encoding. */
30a55f88 4741 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 4742 i.dir_encoding = dir_encoding_swap;
8d63c93e 4743 else if (mnem_p - 3 == dot_p
a501d77e
L
4744 && dot_p[1] == 'd'
4745 && dot_p[2] == '8')
4746 i.disp_encoding = disp_encoding_8bit;
8d63c93e 4747 else if (mnem_p - 4 == dot_p
f8a5c266
L
4748 && dot_p[1] == 'd'
4749 && dot_p[2] == '3'
4750 && dot_p[3] == '2')
a501d77e 4751 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
4752 else
4753 goto check_suffix;
4754 mnem_p = dot_p;
4755 *dot_p = '\0';
d3ce72d0 4756 current_templates = (const templates *) hash_find (op_hash, mnemonic);
b6169b20
L
4757 }
4758
29b0f896
AM
4759 if (!current_templates)
4760 {
b6169b20 4761check_suffix:
1c529385 4762 if (mnem_p > mnemonic)
29b0f896 4763 {
1c529385
LH
4764 /* See if we can get a match by trimming off a suffix. */
4765 switch (mnem_p[-1])
29b0f896 4766 {
1c529385
LH
4767 case WORD_MNEM_SUFFIX:
4768 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
4769 i.suffix = SHORT_MNEM_SUFFIX;
4770 else
1c529385
LH
4771 /* Fall through. */
4772 case BYTE_MNEM_SUFFIX:
4773 case QWORD_MNEM_SUFFIX:
4774 i.suffix = mnem_p[-1];
29b0f896 4775 mnem_p[-1] = '\0';
d3ce72d0 4776 current_templates = (const templates *) hash_find (op_hash,
1c529385
LH
4777 mnemonic);
4778 break;
4779 case SHORT_MNEM_SUFFIX:
4780 case LONG_MNEM_SUFFIX:
4781 if (!intel_syntax)
4782 {
4783 i.suffix = mnem_p[-1];
4784 mnem_p[-1] = '\0';
4785 current_templates = (const templates *) hash_find (op_hash,
4786 mnemonic);
4787 }
4788 break;
4789
4790 /* Intel Syntax. */
4791 case 'd':
4792 if (intel_syntax)
4793 {
4794 if (intel_float_operand (mnemonic) == 1)
4795 i.suffix = SHORT_MNEM_SUFFIX;
4796 else
4797 i.suffix = LONG_MNEM_SUFFIX;
4798 mnem_p[-1] = '\0';
4799 current_templates = (const templates *) hash_find (op_hash,
4800 mnemonic);
4801 }
4802 break;
29b0f896 4803 }
29b0f896 4804 }
1c529385 4805
29b0f896
AM
4806 if (!current_templates)
4807 {
4808 as_bad (_("no such instruction: `%s'"), token_start);
4809 return NULL;
4810 }
4811 }
252b5132 4812
40fb9820
L
4813 if (current_templates->start->opcode_modifier.jump
4814 || current_templates->start->opcode_modifier.jumpbyte)
29b0f896
AM
4815 {
4816 /* Check for a branch hint. We allow ",pt" and ",pn" for
4817 predict taken and predict not taken respectively.
4818 I'm not sure that branch hints actually do anything on loop
4819 and jcxz insns (JumpByte) for current Pentium4 chips. They
4820 may work in the future and it doesn't hurt to accept them
4821 now. */
4822 if (l[0] == ',' && l[1] == 'p')
4823 {
4824 if (l[2] == 't')
4825 {
4826 if (!add_prefix (DS_PREFIX_OPCODE))
4827 return NULL;
4828 l += 3;
4829 }
4830 else if (l[2] == 'n')
4831 {
4832 if (!add_prefix (CS_PREFIX_OPCODE))
4833 return NULL;
4834 l += 3;
4835 }
4836 }
4837 }
4838 /* Any other comma loses. */
4839 if (*l == ',')
4840 {
4841 as_bad (_("invalid character %s in mnemonic"),
4842 output_invalid (*l));
4843 return NULL;
4844 }
252b5132 4845
29b0f896 4846 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
4847 supported = 0;
4848 for (t = current_templates->start; t < current_templates->end; ++t)
4849 {
c0f3af97
L
4850 supported |= cpu_flags_match (t);
4851 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
4852 {
4853 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
4854 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 4855
548d0ee6
JB
4856 return l;
4857 }
29b0f896 4858 }
3629bb00 4859
548d0ee6
JB
4860 if (!(supported & CPU_FLAGS_64BIT_MATCH))
4861 as_bad (flag_code == CODE_64BIT
4862 ? _("`%s' is not supported in 64-bit mode")
4863 : _("`%s' is only supported in 64-bit mode"),
4864 current_templates->start->name);
4865 else
4866 as_bad (_("`%s' is not supported on `%s%s'"),
4867 current_templates->start->name,
4868 cpu_arch_name ? cpu_arch_name : default_arch,
4869 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 4870
548d0ee6 4871 return NULL;
29b0f896 4872}
252b5132 4873
29b0f896 4874static char *
e3bb37b5 4875parse_operands (char *l, const char *mnemonic)
29b0f896
AM
4876{
4877 char *token_start;
3138f287 4878
29b0f896
AM
4879 /* 1 if operand is pending after ','. */
4880 unsigned int expecting_operand = 0;
252b5132 4881
29b0f896
AM
4882 /* Non-zero if operand parens not balanced. */
4883 unsigned int paren_not_balanced;
4884
4885 while (*l != END_OF_INSN)
4886 {
4887 /* Skip optional white space before operand. */
4888 if (is_space_char (*l))
4889 ++l;
d02603dc 4890 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
4891 {
4892 as_bad (_("invalid character %s before operand %d"),
4893 output_invalid (*l),
4894 i.operands + 1);
4895 return NULL;
4896 }
d02603dc 4897 token_start = l; /* After white space. */
29b0f896
AM
4898 paren_not_balanced = 0;
4899 while (paren_not_balanced || *l != ',')
4900 {
4901 if (*l == END_OF_INSN)
4902 {
4903 if (paren_not_balanced)
4904 {
4905 if (!intel_syntax)
4906 as_bad (_("unbalanced parenthesis in operand %d."),
4907 i.operands + 1);
4908 else
4909 as_bad (_("unbalanced brackets in operand %d."),
4910 i.operands + 1);
4911 return NULL;
4912 }
4913 else
4914 break; /* we are done */
4915 }
d02603dc 4916 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
4917 {
4918 as_bad (_("invalid character %s in operand %d"),
4919 output_invalid (*l),
4920 i.operands + 1);
4921 return NULL;
4922 }
4923 if (!intel_syntax)
4924 {
4925 if (*l == '(')
4926 ++paren_not_balanced;
4927 if (*l == ')')
4928 --paren_not_balanced;
4929 }
4930 else
4931 {
4932 if (*l == '[')
4933 ++paren_not_balanced;
4934 if (*l == ']')
4935 --paren_not_balanced;
4936 }
4937 l++;
4938 }
4939 if (l != token_start)
4940 { /* Yes, we've read in another operand. */
4941 unsigned int operand_ok;
4942 this_operand = i.operands++;
4943 if (i.operands > MAX_OPERANDS)
4944 {
4945 as_bad (_("spurious operands; (%d operands/instruction max)"),
4946 MAX_OPERANDS);
4947 return NULL;
4948 }
9d46ce34 4949 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
4950 /* Now parse operand adding info to 'i' as we go along. */
4951 END_STRING_AND_SAVE (l);
4952
1286ab78
L
4953 if (i.mem_operands > 1)
4954 {
4955 as_bad (_("too many memory references for `%s'"),
4956 mnemonic);
4957 return 0;
4958 }
4959
29b0f896
AM
4960 if (intel_syntax)
4961 operand_ok =
4962 i386_intel_operand (token_start,
4963 intel_float_operand (mnemonic));
4964 else
a7619375 4965 operand_ok = i386_att_operand (token_start);
29b0f896
AM
4966
4967 RESTORE_END_STRING (l);
4968 if (!operand_ok)
4969 return NULL;
4970 }
4971 else
4972 {
4973 if (expecting_operand)
4974 {
4975 expecting_operand_after_comma:
4976 as_bad (_("expecting operand after ','; got nothing"));
4977 return NULL;
4978 }
4979 if (*l == ',')
4980 {
4981 as_bad (_("expecting operand before ','; got nothing"));
4982 return NULL;
4983 }
4984 }
7f3f1ea2 4985
29b0f896
AM
4986 /* Now *l must be either ',' or END_OF_INSN. */
4987 if (*l == ',')
4988 {
4989 if (*++l == END_OF_INSN)
4990 {
4991 /* Just skip it, if it's \n complain. */
4992 goto expecting_operand_after_comma;
4993 }
4994 expecting_operand = 1;
4995 }
4996 }
4997 return l;
4998}
7f3f1ea2 4999
050dfa73 5000static void
4d456e3d 5001swap_2_operands (int xchg1, int xchg2)
050dfa73
MM
5002{
5003 union i386_op temp_op;
40fb9820 5004 i386_operand_type temp_type;
c48dadc9 5005 unsigned int temp_flags;
050dfa73 5006 enum bfd_reloc_code_real temp_reloc;
4eed87de 5007
050dfa73
MM
5008 temp_type = i.types[xchg2];
5009 i.types[xchg2] = i.types[xchg1];
5010 i.types[xchg1] = temp_type;
c48dadc9
JB
5011
5012 temp_flags = i.flags[xchg2];
5013 i.flags[xchg2] = i.flags[xchg1];
5014 i.flags[xchg1] = temp_flags;
5015
050dfa73
MM
5016 temp_op = i.op[xchg2];
5017 i.op[xchg2] = i.op[xchg1];
5018 i.op[xchg1] = temp_op;
c48dadc9 5019
050dfa73
MM
5020 temp_reloc = i.reloc[xchg2];
5021 i.reloc[xchg2] = i.reloc[xchg1];
5022 i.reloc[xchg1] = temp_reloc;
43234a1e
L
5023
5024 if (i.mask)
5025 {
5026 if (i.mask->operand == xchg1)
5027 i.mask->operand = xchg2;
5028 else if (i.mask->operand == xchg2)
5029 i.mask->operand = xchg1;
5030 }
5031 if (i.broadcast)
5032 {
5033 if (i.broadcast->operand == xchg1)
5034 i.broadcast->operand = xchg2;
5035 else if (i.broadcast->operand == xchg2)
5036 i.broadcast->operand = xchg1;
5037 }
5038 if (i.rounding)
5039 {
5040 if (i.rounding->operand == xchg1)
5041 i.rounding->operand = xchg2;
5042 else if (i.rounding->operand == xchg2)
5043 i.rounding->operand = xchg1;
5044 }
050dfa73
MM
5045}
5046
29b0f896 5047static void
e3bb37b5 5048swap_operands (void)
29b0f896 5049{
b7c61d9a 5050 switch (i.operands)
050dfa73 5051 {
c0f3af97 5052 case 5:
b7c61d9a 5053 case 4:
4d456e3d 5054 swap_2_operands (1, i.operands - 2);
1a0670f3 5055 /* Fall through. */
b7c61d9a
L
5056 case 3:
5057 case 2:
4d456e3d 5058 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
5059 break;
5060 default:
5061 abort ();
29b0f896 5062 }
29b0f896
AM
5063
5064 if (i.mem_operands == 2)
5065 {
5066 const seg_entry *temp_seg;
5067 temp_seg = i.seg[0];
5068 i.seg[0] = i.seg[1];
5069 i.seg[1] = temp_seg;
5070 }
5071}
252b5132 5072
29b0f896
AM
5073/* Try to ensure constant immediates are represented in the smallest
5074 opcode possible. */
5075static void
e3bb37b5 5076optimize_imm (void)
29b0f896
AM
5077{
5078 char guess_suffix = 0;
5079 int op;
252b5132 5080
29b0f896
AM
5081 if (i.suffix)
5082 guess_suffix = i.suffix;
5083 else if (i.reg_operands)
5084 {
5085 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
5086 We can't do this properly yet, i.e. excluding special register
5087 instances, but the following works for instructions with
5088 immediates. In any case, we can't set i.suffix yet. */
29b0f896 5089 for (op = i.operands; --op >= 0;)
bab6aec1
JB
5090 if (i.types[op].bitfield.class != Reg)
5091 continue;
5092 else if (i.types[op].bitfield.byte)
7ab9ffdd 5093 {
40fb9820
L
5094 guess_suffix = BYTE_MNEM_SUFFIX;
5095 break;
5096 }
bab6aec1 5097 else if (i.types[op].bitfield.word)
252b5132 5098 {
40fb9820
L
5099 guess_suffix = WORD_MNEM_SUFFIX;
5100 break;
5101 }
bab6aec1 5102 else if (i.types[op].bitfield.dword)
40fb9820
L
5103 {
5104 guess_suffix = LONG_MNEM_SUFFIX;
5105 break;
5106 }
bab6aec1 5107 else if (i.types[op].bitfield.qword)
40fb9820
L
5108 {
5109 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5110 break;
252b5132 5111 }
29b0f896
AM
5112 }
5113 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5114 guess_suffix = WORD_MNEM_SUFFIX;
5115
5116 for (op = i.operands; --op >= 0;)
40fb9820 5117 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5118 {
5119 switch (i.op[op].imms->X_op)
252b5132 5120 {
29b0f896
AM
5121 case O_constant:
5122 /* If a suffix is given, this operand may be shortened. */
5123 switch (guess_suffix)
252b5132 5124 {
29b0f896 5125 case LONG_MNEM_SUFFIX:
40fb9820
L
5126 i.types[op].bitfield.imm32 = 1;
5127 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5128 break;
5129 case WORD_MNEM_SUFFIX:
40fb9820
L
5130 i.types[op].bitfield.imm16 = 1;
5131 i.types[op].bitfield.imm32 = 1;
5132 i.types[op].bitfield.imm32s = 1;
5133 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5134 break;
5135 case BYTE_MNEM_SUFFIX:
40fb9820
L
5136 i.types[op].bitfield.imm8 = 1;
5137 i.types[op].bitfield.imm8s = 1;
5138 i.types[op].bitfield.imm16 = 1;
5139 i.types[op].bitfield.imm32 = 1;
5140 i.types[op].bitfield.imm32s = 1;
5141 i.types[op].bitfield.imm64 = 1;
29b0f896 5142 break;
252b5132 5143 }
252b5132 5144
29b0f896
AM
5145 /* If this operand is at most 16 bits, convert it
5146 to a signed 16 bit number before trying to see
5147 whether it will fit in an even smaller size.
5148 This allows a 16-bit operand such as $0xffe0 to
5149 be recognised as within Imm8S range. */
40fb9820 5150 if ((i.types[op].bitfield.imm16)
29b0f896 5151 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5152 {
29b0f896
AM
5153 i.op[op].imms->X_add_number =
5154 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
5155 }
a28def75
L
5156#ifdef BFD64
5157 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5158 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5159 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5160 == 0))
5161 {
5162 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5163 ^ ((offsetT) 1 << 31))
5164 - ((offsetT) 1 << 31));
5165 }
a28def75 5166#endif
40fb9820 5167 i.types[op]
c6fb90c8
L
5168 = operand_type_or (i.types[op],
5169 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5170
29b0f896
AM
5171 /* We must avoid matching of Imm32 templates when 64bit
5172 only immediate is available. */
5173 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5174 i.types[op].bitfield.imm32 = 0;
29b0f896 5175 break;
252b5132 5176
29b0f896
AM
5177 case O_absent:
5178 case O_register:
5179 abort ();
5180
5181 /* Symbols and expressions. */
5182 default:
9cd96992
JB
5183 /* Convert symbolic operand to proper sizes for matching, but don't
5184 prevent matching a set of insns that only supports sizes other
5185 than those matching the insn suffix. */
5186 {
40fb9820 5187 i386_operand_type mask, allowed;
d3ce72d0 5188 const insn_template *t;
9cd96992 5189
0dfbf9d7
L
5190 operand_type_set (&mask, 0);
5191 operand_type_set (&allowed, 0);
40fb9820 5192
4eed87de
AM
5193 for (t = current_templates->start;
5194 t < current_templates->end;
5195 ++t)
bab6aec1
JB
5196 {
5197 allowed = operand_type_or (allowed, t->operand_types[op]);
5198 allowed = operand_type_and (allowed, anyimm);
5199 }
9cd96992
JB
5200 switch (guess_suffix)
5201 {
5202 case QWORD_MNEM_SUFFIX:
40fb9820
L
5203 mask.bitfield.imm64 = 1;
5204 mask.bitfield.imm32s = 1;
9cd96992
JB
5205 break;
5206 case LONG_MNEM_SUFFIX:
40fb9820 5207 mask.bitfield.imm32 = 1;
9cd96992
JB
5208 break;
5209 case WORD_MNEM_SUFFIX:
40fb9820 5210 mask.bitfield.imm16 = 1;
9cd96992
JB
5211 break;
5212 case BYTE_MNEM_SUFFIX:
40fb9820 5213 mask.bitfield.imm8 = 1;
9cd96992
JB
5214 break;
5215 default:
9cd96992
JB
5216 break;
5217 }
c6fb90c8 5218 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5219 if (!operand_type_all_zero (&allowed))
c6fb90c8 5220 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5221 }
29b0f896 5222 break;
252b5132 5223 }
29b0f896
AM
5224 }
5225}
47926f60 5226
29b0f896
AM
5227/* Try to use the smallest displacement type too. */
5228static void
e3bb37b5 5229optimize_disp (void)
29b0f896
AM
5230{
5231 int op;
3e73aa7c 5232
29b0f896 5233 for (op = i.operands; --op >= 0;)
40fb9820 5234 if (operand_type_check (i.types[op], disp))
252b5132 5235 {
b300c311 5236 if (i.op[op].disps->X_op == O_constant)
252b5132 5237 {
91d6fa6a 5238 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5239
40fb9820 5240 if (i.types[op].bitfield.disp16
91d6fa6a 5241 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
5242 {
5243 /* If this operand is at most 16 bits, convert
5244 to a signed 16 bit number and don't use 64bit
5245 displacement. */
91d6fa6a 5246 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 5247 i.types[op].bitfield.disp64 = 0;
b300c311 5248 }
a28def75
L
5249#ifdef BFD64
5250 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
40fb9820 5251 if (i.types[op].bitfield.disp32
91d6fa6a 5252 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
b300c311
L
5253 {
5254 /* If this operand is at most 32 bits, convert
5255 to a signed 32 bit number and don't use 64bit
5256 displacement. */
91d6fa6a
NC
5257 op_disp &= (((offsetT) 2 << 31) - 1);
5258 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 5259 i.types[op].bitfield.disp64 = 0;
b300c311 5260 }
a28def75 5261#endif
91d6fa6a 5262 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5263 {
40fb9820
L
5264 i.types[op].bitfield.disp8 = 0;
5265 i.types[op].bitfield.disp16 = 0;
5266 i.types[op].bitfield.disp32 = 0;
5267 i.types[op].bitfield.disp32s = 0;
5268 i.types[op].bitfield.disp64 = 0;
b300c311
L
5269 i.op[op].disps = 0;
5270 i.disp_operands--;
5271 }
5272 else if (flag_code == CODE_64BIT)
5273 {
91d6fa6a 5274 if (fits_in_signed_long (op_disp))
28a9d8f5 5275 {
40fb9820
L
5276 i.types[op].bitfield.disp64 = 0;
5277 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5278 }
0e1147d9 5279 if (i.prefix[ADDR_PREFIX]
91d6fa6a 5280 && fits_in_unsigned_long (op_disp))
40fb9820 5281 i.types[op].bitfield.disp32 = 1;
b300c311 5282 }
40fb9820
L
5283 if ((i.types[op].bitfield.disp32
5284 || i.types[op].bitfield.disp32s
5285 || i.types[op].bitfield.disp16)
b5014f7a 5286 && fits_in_disp8 (op_disp))
40fb9820 5287 i.types[op].bitfield.disp8 = 1;
252b5132 5288 }
67a4f2b7
AO
5289 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5290 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5291 {
5292 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5293 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
5294 i.types[op].bitfield.disp8 = 0;
5295 i.types[op].bitfield.disp16 = 0;
5296 i.types[op].bitfield.disp32 = 0;
5297 i.types[op].bitfield.disp32s = 0;
5298 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
5299 }
5300 else
b300c311 5301 /* We only support 64bit displacement on constants. */
40fb9820 5302 i.types[op].bitfield.disp64 = 0;
252b5132 5303 }
29b0f896
AM
5304}
5305
4a1b91ea
L
5306/* Return 1 if there is a match in broadcast bytes between operand
5307 GIVEN and instruction template T. */
5308
5309static INLINE int
5310match_broadcast_size (const insn_template *t, unsigned int given)
5311{
5312 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5313 && i.types[given].bitfield.byte)
5314 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5315 && i.types[given].bitfield.word)
5316 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5317 && i.types[given].bitfield.dword)
5318 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5319 && i.types[given].bitfield.qword));
5320}
5321
6c30d220
L
5322/* Check if operands are valid for the instruction. */
5323
5324static int
5325check_VecOperands (const insn_template *t)
5326{
43234a1e 5327 unsigned int op;
e2195274
JB
5328 i386_cpu_flags cpu;
5329 static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
5330
5331 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5332 any one operand are implicity requiring AVX512VL support if the actual
5333 operand size is YMMword or XMMword. Since this function runs after
5334 template matching, there's no need to check for YMMword/XMMword in
5335 the template. */
5336 cpu = cpu_flags_and (t->cpu_flags, avx512);
5337 if (!cpu_flags_all_zero (&cpu)
5338 && !t->cpu_flags.bitfield.cpuavx512vl
5339 && !cpu_arch_flags.bitfield.cpuavx512vl)
5340 {
5341 for (op = 0; op < t->operands; ++op)
5342 {
5343 if (t->operand_types[op].bitfield.zmmword
5344 && (i.types[op].bitfield.ymmword
5345 || i.types[op].bitfield.xmmword))
5346 {
5347 i.error = unsupported;
5348 return 1;
5349 }
5350 }
5351 }
43234a1e 5352
6c30d220
L
5353 /* Without VSIB byte, we can't have a vector register for index. */
5354 if (!t->opcode_modifier.vecsib
5355 && i.index_reg
1b54b8d7
JB
5356 && (i.index_reg->reg_type.bitfield.xmmword
5357 || i.index_reg->reg_type.bitfield.ymmword
5358 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
5359 {
5360 i.error = unsupported_vector_index_register;
5361 return 1;
5362 }
5363
ad8ecc81
MZ
5364 /* Check if default mask is allowed. */
5365 if (t->opcode_modifier.nodefmask
5366 && (!i.mask || i.mask->mask->reg_num == 0))
5367 {
5368 i.error = no_default_mask;
5369 return 1;
5370 }
5371
7bab8ab5
JB
5372 /* For VSIB byte, we need a vector register for index, and all vector
5373 registers must be distinct. */
5374 if (t->opcode_modifier.vecsib)
5375 {
5376 if (!i.index_reg
6c30d220 5377 || !((t->opcode_modifier.vecsib == VecSIB128
1b54b8d7 5378 && i.index_reg->reg_type.bitfield.xmmword)
6c30d220 5379 || (t->opcode_modifier.vecsib == VecSIB256
1b54b8d7 5380 && i.index_reg->reg_type.bitfield.ymmword)
43234a1e 5381 || (t->opcode_modifier.vecsib == VecSIB512
1b54b8d7 5382 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
5383 {
5384 i.error = invalid_vsib_address;
5385 return 1;
5386 }
5387
43234a1e
L
5388 gas_assert (i.reg_operands == 2 || i.mask);
5389 if (i.reg_operands == 2 && !i.mask)
5390 {
3528c362 5391 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
5392 gas_assert (i.types[0].bitfield.xmmword
5393 || i.types[0].bitfield.ymmword);
3528c362 5394 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
5395 gas_assert (i.types[2].bitfield.xmmword
5396 || i.types[2].bitfield.ymmword);
43234a1e
L
5397 if (operand_check == check_none)
5398 return 0;
5399 if (register_number (i.op[0].regs)
5400 != register_number (i.index_reg)
5401 && register_number (i.op[2].regs)
5402 != register_number (i.index_reg)
5403 && register_number (i.op[0].regs)
5404 != register_number (i.op[2].regs))
5405 return 0;
5406 if (operand_check == check_error)
5407 {
5408 i.error = invalid_vector_register_set;
5409 return 1;
5410 }
5411 as_warn (_("mask, index, and destination registers should be distinct"));
5412 }
8444f82a
MZ
5413 else if (i.reg_operands == 1 && i.mask)
5414 {
3528c362 5415 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
5416 && (i.types[1].bitfield.xmmword
5417 || i.types[1].bitfield.ymmword
5418 || i.types[1].bitfield.zmmword)
8444f82a
MZ
5419 && (register_number (i.op[1].regs)
5420 == register_number (i.index_reg)))
5421 {
5422 if (operand_check == check_error)
5423 {
5424 i.error = invalid_vector_register_set;
5425 return 1;
5426 }
5427 if (operand_check != check_none)
5428 as_warn (_("index and destination registers should be distinct"));
5429 }
5430 }
43234a1e 5431 }
7bab8ab5 5432
43234a1e
L
5433 /* Check if broadcast is supported by the instruction and is applied
5434 to the memory operand. */
5435 if (i.broadcast)
5436 {
8e6e0792 5437 i386_operand_type type, overlap;
43234a1e
L
5438
5439 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 5440 and its broadcast bytes match the memory operand. */
32546502 5441 op = i.broadcast->operand;
8e6e0792 5442 if (!t->opcode_modifier.broadcast
c48dadc9 5443 || !(i.flags[op] & Operand_Mem)
c39e5b26 5444 || (!i.types[op].bitfield.unspecified
4a1b91ea 5445 && !match_broadcast_size (t, op)))
43234a1e
L
5446 {
5447 bad_broadcast:
5448 i.error = unsupported_broadcast;
5449 return 1;
5450 }
8e6e0792 5451
4a1b91ea
L
5452 i.broadcast->bytes = ((1 << (t->opcode_modifier.broadcast - 1))
5453 * i.broadcast->type);
8e6e0792 5454 operand_type_set (&type, 0);
4a1b91ea 5455 switch (i.broadcast->bytes)
8e6e0792 5456 {
4a1b91ea
L
5457 case 2:
5458 type.bitfield.word = 1;
5459 break;
5460 case 4:
5461 type.bitfield.dword = 1;
5462 break;
8e6e0792
JB
5463 case 8:
5464 type.bitfield.qword = 1;
5465 break;
5466 case 16:
5467 type.bitfield.xmmword = 1;
5468 break;
5469 case 32:
5470 type.bitfield.ymmword = 1;
5471 break;
5472 case 64:
5473 type.bitfield.zmmword = 1;
5474 break;
5475 default:
5476 goto bad_broadcast;
5477 }
5478
5479 overlap = operand_type_and (type, t->operand_types[op]);
5480 if (operand_type_all_zero (&overlap))
5481 goto bad_broadcast;
5482
5483 if (t->opcode_modifier.checkregsize)
5484 {
5485 unsigned int j;
5486
e2195274 5487 type.bitfield.baseindex = 1;
8e6e0792
JB
5488 for (j = 0; j < i.operands; ++j)
5489 {
5490 if (j != op
5491 && !operand_type_register_match(i.types[j],
5492 t->operand_types[j],
5493 type,
5494 t->operand_types[op]))
5495 goto bad_broadcast;
5496 }
5497 }
43234a1e
L
5498 }
5499 /* If broadcast is supported in this instruction, we need to check if
5500 operand of one-element size isn't specified without broadcast. */
5501 else if (t->opcode_modifier.broadcast && i.mem_operands)
5502 {
5503 /* Find memory operand. */
5504 for (op = 0; op < i.operands; op++)
8dc0818e 5505 if (i.flags[op] & Operand_Mem)
43234a1e
L
5506 break;
5507 gas_assert (op < i.operands);
5508 /* Check size of the memory operand. */
4a1b91ea 5509 if (match_broadcast_size (t, op))
43234a1e
L
5510 {
5511 i.error = broadcast_needed;
5512 return 1;
5513 }
5514 }
c39e5b26
JB
5515 else
5516 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
5517
5518 /* Check if requested masking is supported. */
ae2387fe 5519 if (i.mask)
43234a1e 5520 {
ae2387fe
JB
5521 switch (t->opcode_modifier.masking)
5522 {
5523 case BOTH_MASKING:
5524 break;
5525 case MERGING_MASKING:
5526 if (i.mask->zeroing)
5527 {
5528 case 0:
5529 i.error = unsupported_masking;
5530 return 1;
5531 }
5532 break;
5533 case DYNAMIC_MASKING:
5534 /* Memory destinations allow only merging masking. */
5535 if (i.mask->zeroing && i.mem_operands)
5536 {
5537 /* Find memory operand. */
5538 for (op = 0; op < i.operands; op++)
c48dadc9 5539 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
5540 break;
5541 gas_assert (op < i.operands);
5542 if (op == i.operands - 1)
5543 {
5544 i.error = unsupported_masking;
5545 return 1;
5546 }
5547 }
5548 break;
5549 default:
5550 abort ();
5551 }
43234a1e
L
5552 }
5553
5554 /* Check if masking is applied to dest operand. */
5555 if (i.mask && (i.mask->operand != (int) (i.operands - 1)))
5556 {
5557 i.error = mask_not_on_destination;
5558 return 1;
5559 }
5560
43234a1e
L
5561 /* Check RC/SAE. */
5562 if (i.rounding)
5563 {
a80195f1
JB
5564 if (!t->opcode_modifier.sae
5565 || (i.rounding->type != saeonly && !t->opcode_modifier.staticrounding))
43234a1e
L
5566 {
5567 i.error = unsupported_rc_sae;
5568 return 1;
5569 }
5570 /* If the instruction has several immediate operands and one of
5571 them is rounding, the rounding operand should be the last
5572 immediate operand. */
5573 if (i.imm_operands > 1
5574 && i.rounding->operand != (int) (i.imm_operands - 1))
7bab8ab5 5575 {
43234a1e 5576 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
5577 return 1;
5578 }
6c30d220
L
5579 }
5580
43234a1e 5581 /* Check vector Disp8 operand. */
b5014f7a
JB
5582 if (t->opcode_modifier.disp8memshift
5583 && i.disp_encoding != disp_encoding_32bit)
43234a1e
L
5584 {
5585 if (i.broadcast)
4a1b91ea 5586 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 5587 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 5588 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
5589 else
5590 {
5591 const i386_operand_type *type = NULL;
5592
5593 i.memshift = 0;
5594 for (op = 0; op < i.operands; op++)
8dc0818e 5595 if (i.flags[op] & Operand_Mem)
7091c612 5596 {
4174bfff
JB
5597 if (t->opcode_modifier.evex == EVEXLIG)
5598 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
5599 else if (t->operand_types[op].bitfield.xmmword
5600 + t->operand_types[op].bitfield.ymmword
5601 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
5602 type = &t->operand_types[op];
5603 else if (!i.types[op].bitfield.unspecified)
5604 type = &i.types[op];
5605 }
3528c362 5606 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 5607 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
5608 {
5609 if (i.types[op].bitfield.zmmword)
5610 i.memshift = 6;
5611 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
5612 i.memshift = 5;
5613 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
5614 i.memshift = 4;
5615 }
5616
5617 if (type)
5618 {
5619 if (type->bitfield.zmmword)
5620 i.memshift = 6;
5621 else if (type->bitfield.ymmword)
5622 i.memshift = 5;
5623 else if (type->bitfield.xmmword)
5624 i.memshift = 4;
5625 }
5626
5627 /* For the check in fits_in_disp8(). */
5628 if (i.memshift == 0)
5629 i.memshift = -1;
5630 }
43234a1e
L
5631
5632 for (op = 0; op < i.operands; op++)
5633 if (operand_type_check (i.types[op], disp)
5634 && i.op[op].disps->X_op == O_constant)
5635 {
b5014f7a 5636 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 5637 {
b5014f7a
JB
5638 i.types[op].bitfield.disp8 = 1;
5639 return 0;
43234a1e 5640 }
b5014f7a 5641 i.types[op].bitfield.disp8 = 0;
43234a1e
L
5642 }
5643 }
b5014f7a
JB
5644
5645 i.memshift = 0;
43234a1e 5646
6c30d220
L
5647 return 0;
5648}
5649
43f3e2ee 5650/* Check if operands are valid for the instruction. Update VEX
a683cc34
SP
5651 operand types. */
5652
5653static int
5654VEX_check_operands (const insn_template *t)
5655{
86fa6981 5656 if (i.vec_encoding == vex_encoding_evex)
43234a1e 5657 {
86fa6981 5658 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 5659 if (!is_evex_encoding (t))
86fa6981
L
5660 {
5661 i.error = unsupported;
5662 return 1;
5663 }
5664 return 0;
43234a1e
L
5665 }
5666
a683cc34 5667 if (!t->opcode_modifier.vex)
86fa6981
L
5668 {
5669 /* This instruction template doesn't have VEX prefix. */
5670 if (i.vec_encoding != vex_encoding_default)
5671 {
5672 i.error = unsupported;
5673 return 1;
5674 }
5675 return 0;
5676 }
a683cc34 5677
9d3bf266
JB
5678 /* Check the special Imm4 cases; must be the first operand. */
5679 if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)
a683cc34
SP
5680 {
5681 if (i.op[0].imms->X_op != O_constant
5682 || !fits_in_imm4 (i.op[0].imms->X_add_number))
891edac4 5683 {
a65babc9 5684 i.error = bad_imm4;
891edac4
L
5685 return 1;
5686 }
a683cc34 5687
9d3bf266
JB
5688 /* Turn off Imm<N> so that update_imm won't complain. */
5689 operand_type_set (&i.types[0], 0);
a683cc34
SP
5690 }
5691
5692 return 0;
5693}
5694
d3ce72d0 5695static const insn_template *
83b16ac6 5696match_template (char mnem_suffix)
29b0f896
AM
5697{
5698 /* Points to template once we've found it. */
d3ce72d0 5699 const insn_template *t;
40fb9820 5700 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 5701 i386_operand_type overlap4;
29b0f896 5702 unsigned int found_reverse_match;
dc2be329 5703 i386_opcode_modifier suffix_check;
40fb9820 5704 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 5705 int addr_prefix_disp;
a5c311ca 5706 unsigned int j;
3ac21baa 5707 unsigned int found_cpu_match, size_match;
45664ddb 5708 unsigned int check_register;
5614d22c 5709 enum i386_error specific_error = 0;
29b0f896 5710
c0f3af97
L
5711#if MAX_OPERANDS != 5
5712# error "MAX_OPERANDS must be 5."
f48ff2ae
L
5713#endif
5714
29b0f896 5715 found_reverse_match = 0;
539e75ad 5716 addr_prefix_disp = -1;
40fb9820 5717
dc2be329 5718 /* Prepare for mnemonic suffix check. */
40fb9820 5719 memset (&suffix_check, 0, sizeof (suffix_check));
dc2be329
L
5720 switch (mnem_suffix)
5721 {
5722 case BYTE_MNEM_SUFFIX:
5723 suffix_check.no_bsuf = 1;
5724 break;
5725 case WORD_MNEM_SUFFIX:
5726 suffix_check.no_wsuf = 1;
5727 break;
5728 case SHORT_MNEM_SUFFIX:
5729 suffix_check.no_ssuf = 1;
5730 break;
5731 case LONG_MNEM_SUFFIX:
5732 suffix_check.no_lsuf = 1;
5733 break;
5734 case QWORD_MNEM_SUFFIX:
5735 suffix_check.no_qsuf = 1;
5736 break;
5737 default:
5738 /* NB: In Intel syntax, normally we can check for memory operand
5739 size when there is no mnemonic suffix. But jmp and call have
5740 2 different encodings with Dword memory operand size, one with
5741 No_ldSuf and the other without. i.suffix is set to
5742 LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
5743 if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
5744 suffix_check.no_ldsuf = 1;
83b16ac6
JB
5745 }
5746
01559ecc
L
5747 /* Must have right number of operands. */
5748 i.error = number_of_operands_mismatch;
5749
45aa61fe 5750 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 5751 {
539e75ad 5752 addr_prefix_disp = -1;
dbbc8b7e 5753 found_reverse_match = 0;
539e75ad 5754
29b0f896
AM
5755 if (i.operands != t->operands)
5756 continue;
5757
50aecf8c 5758 /* Check processor support. */
a65babc9 5759 i.error = unsupported;
c0f3af97
L
5760 found_cpu_match = (cpu_flags_match (t)
5761 == CPU_FLAGS_PERFECT_MATCH);
50aecf8c
L
5762 if (!found_cpu_match)
5763 continue;
5764
e1d4d893 5765 /* Check AT&T mnemonic. */
a65babc9 5766 i.error = unsupported_with_intel_mnemonic;
e1d4d893 5767 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
5768 continue;
5769
e92bae62 5770 /* Check AT&T/Intel syntax and Intel64/AMD64 ISA. */
a65babc9 5771 i.error = unsupported_syntax;
5c07affc 5772 if ((intel_syntax && t->opcode_modifier.attsyntax)
e92bae62
L
5773 || (!intel_syntax && t->opcode_modifier.intelsyntax)
5774 || (intel64 && t->opcode_modifier.amd64)
5775 || (!intel64 && t->opcode_modifier.intel64))
1efbbeb4
L
5776 continue;
5777
dc2be329 5778 /* Check the suffix. */
a65babc9 5779 i.error = invalid_instruction_suffix;
dc2be329
L
5780 if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
5781 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
5782 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
5783 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
5784 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
5785 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
83b16ac6 5786 continue;
29b0f896 5787
3ac21baa
JB
5788 size_match = operand_size_match (t);
5789 if (!size_match)
7d5e4556 5790 continue;
539e75ad 5791
5c07affc
L
5792 for (j = 0; j < MAX_OPERANDS; j++)
5793 operand_types[j] = t->operand_types[j];
5794
45aa61fe
AM
5795 /* In general, don't allow 64-bit operands in 32-bit mode. */
5796 if (i.suffix == QWORD_MNEM_SUFFIX
5797 && flag_code != CODE_64BIT
5798 && (intel_syntax
40fb9820 5799 ? (!t->opcode_modifier.ignoresize
625cbd7a 5800 && !t->opcode_modifier.broadcast
45aa61fe
AM
5801 && !intel_float_operand (t->name))
5802 : intel_float_operand (t->name) != 2)
3528c362
JB
5803 && ((operand_types[0].bitfield.class != RegMMX
5804 && operand_types[0].bitfield.class != RegSIMD)
5805 || (operand_types[t->operands > 1].bitfield.class != RegMMX
5806 && operand_types[t->operands > 1].bitfield.class != RegSIMD))
45aa61fe
AM
5807 && (t->base_opcode != 0x0fc7
5808 || t->extension_opcode != 1 /* cmpxchg8b */))
5809 continue;
5810
192dc9c6
JB
5811 /* In general, don't allow 32-bit operands on pre-386. */
5812 else if (i.suffix == LONG_MNEM_SUFFIX
5813 && !cpu_arch_flags.bitfield.cpui386
5814 && (intel_syntax
5815 ? (!t->opcode_modifier.ignoresize
5816 && !intel_float_operand (t->name))
5817 : intel_float_operand (t->name) != 2)
3528c362
JB
5818 && ((operand_types[0].bitfield.class != RegMMX
5819 && operand_types[0].bitfield.class != RegSIMD)
5820 || (operand_types[t->operands > 1].bitfield.class != RegMMX
5821 && operand_types[t->operands > 1].bitfield.class
5822 != RegSIMD)))
192dc9c6
JB
5823 continue;
5824
29b0f896 5825 /* Do not verify operands when there are none. */
50aecf8c 5826 else
29b0f896 5827 {
c6fb90c8 5828 if (!t->operands)
2dbab7d5
L
5829 /* We've found a match; break out of loop. */
5830 break;
29b0f896 5831 }
252b5132 5832
539e75ad
L
5833 /* Address size prefix will turn Disp64/Disp32/Disp16 operand
5834 into Disp32/Disp16/Disp32 operand. */
5835 if (i.prefix[ADDR_PREFIX] != 0)
5836 {
40fb9820 5837 /* There should be only one Disp operand. */
539e75ad
L
5838 switch (flag_code)
5839 {
5840 case CODE_16BIT:
40fb9820
L
5841 for (j = 0; j < MAX_OPERANDS; j++)
5842 {
5843 if (operand_types[j].bitfield.disp16)
5844 {
5845 addr_prefix_disp = j;
5846 operand_types[j].bitfield.disp32 = 1;
5847 operand_types[j].bitfield.disp16 = 0;
5848 break;
5849 }
5850 }
539e75ad
L
5851 break;
5852 case CODE_32BIT:
40fb9820
L
5853 for (j = 0; j < MAX_OPERANDS; j++)
5854 {
5855 if (operand_types[j].bitfield.disp32)
5856 {
5857 addr_prefix_disp = j;
5858 operand_types[j].bitfield.disp32 = 0;
5859 operand_types[j].bitfield.disp16 = 1;
5860 break;
5861 }
5862 }
539e75ad
L
5863 break;
5864 case CODE_64BIT:
40fb9820
L
5865 for (j = 0; j < MAX_OPERANDS; j++)
5866 {
5867 if (operand_types[j].bitfield.disp64)
5868 {
5869 addr_prefix_disp = j;
5870 operand_types[j].bitfield.disp64 = 0;
5871 operand_types[j].bitfield.disp32 = 1;
5872 break;
5873 }
5874 }
539e75ad
L
5875 break;
5876 }
539e75ad
L
5877 }
5878
02a86693
L
5879 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
5880 if (i.reloc[0] == BFD_RELOC_386_GOT32 && t->base_opcode == 0xa0)
5881 continue;
5882
56ffb741 5883 /* We check register size if needed. */
e2195274
JB
5884 if (t->opcode_modifier.checkregsize)
5885 {
5886 check_register = (1 << t->operands) - 1;
5887 if (i.broadcast)
5888 check_register &= ~(1 << i.broadcast->operand);
5889 }
5890 else
5891 check_register = 0;
5892
c6fb90c8 5893 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
5894 switch (t->operands)
5895 {
5896 case 1:
40fb9820 5897 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
5898 continue;
5899 break;
5900 case 2:
33eaf5de 5901 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
5902 only in 32bit mode and we can use opcode 0x90. In 64bit
5903 mode, we can't use 0x90 for xchg %eax, %eax since it should
5904 zero-extend %eax to %rax. */
5905 if (flag_code == CODE_64BIT
5906 && t->base_opcode == 0x90
75e5731b
JB
5907 && i.types[0].bitfield.instance == Accum
5908 && i.types[0].bitfield.dword
5909 && i.types[1].bitfield.instance == Accum
5910 && i.types[1].bitfield.dword)
8b38ad71 5911 continue;
1212781b
JB
5912 /* xrelease mov %eax, <disp> is another special case. It must not
5913 match the accumulator-only encoding of mov. */
5914 if (flag_code != CODE_64BIT
5915 && i.hle_prefix
5916 && t->base_opcode == 0xa0
75e5731b 5917 && i.types[0].bitfield.instance == Accum
8dc0818e 5918 && (i.flags[1] & Operand_Mem))
1212781b 5919 continue;
f5eb1d70
JB
5920 /* Fall through. */
5921
5922 case 3:
3ac21baa
JB
5923 if (!(size_match & MATCH_STRAIGHT))
5924 goto check_reverse;
64c49ab3
JB
5925 /* Reverse direction of operands if swapping is possible in the first
5926 place (operands need to be symmetric) and
5927 - the load form is requested, and the template is a store form,
5928 - the store form is requested, and the template is a load form,
5929 - the non-default (swapped) form is requested. */
5930 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 5931 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
5932 && !operand_type_all_zero (&overlap1))
5933 switch (i.dir_encoding)
5934 {
5935 case dir_encoding_load:
5936 if (operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 5937 || t->opcode_modifier.regmem)
64c49ab3
JB
5938 goto check_reverse;
5939 break;
5940
5941 case dir_encoding_store:
5942 if (!operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 5943 && !t->opcode_modifier.regmem)
64c49ab3
JB
5944 goto check_reverse;
5945 break;
5946
5947 case dir_encoding_swap:
5948 goto check_reverse;
5949
5950 case dir_encoding_default:
5951 break;
5952 }
86fa6981 5953 /* If we want store form, we skip the current load. */
64c49ab3
JB
5954 if ((i.dir_encoding == dir_encoding_store
5955 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
5956 && i.mem_operands == 0
5957 && t->opcode_modifier.load)
fa99fab2 5958 continue;
1a0670f3 5959 /* Fall through. */
f48ff2ae 5960 case 4:
c0f3af97 5961 case 5:
c6fb90c8 5962 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
5963 if (!operand_type_match (overlap0, i.types[0])
5964 || !operand_type_match (overlap1, i.types[1])
e2195274 5965 || ((check_register & 3) == 3
dc821c5f 5966 && !operand_type_register_match (i.types[0],
40fb9820 5967 operand_types[0],
dc821c5f 5968 i.types[1],
40fb9820 5969 operand_types[1])))
29b0f896
AM
5970 {
5971 /* Check if other direction is valid ... */
38e314eb 5972 if (!t->opcode_modifier.d)
29b0f896
AM
5973 continue;
5974
b6169b20 5975check_reverse:
3ac21baa
JB
5976 if (!(size_match & MATCH_REVERSE))
5977 continue;
29b0f896 5978 /* Try reversing direction of operands. */
f5eb1d70
JB
5979 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
5980 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 5981 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 5982 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 5983 || (check_register
dc821c5f 5984 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
5985 operand_types[i.operands - 1],
5986 i.types[i.operands - 1],
45664ddb 5987 operand_types[0])))
29b0f896
AM
5988 {
5989 /* Does not match either direction. */
5990 continue;
5991 }
38e314eb 5992 /* found_reverse_match holds which of D or FloatR
29b0f896 5993 we've found. */
38e314eb
JB
5994 if (!t->opcode_modifier.d)
5995 found_reverse_match = 0;
5996 else if (operand_types[0].bitfield.tbyte)
8a2ed489 5997 found_reverse_match = Opcode_FloatD;
dbbc8b7e 5998 else if (operand_types[0].bitfield.xmmword
f5eb1d70 5999 || operand_types[i.operands - 1].bitfield.xmmword
3528c362
JB
6000 || operand_types[0].bitfield.class == RegMMX
6001 || operand_types[i.operands - 1].bitfield.class == RegMMX
dbbc8b7e
JB
6002 || is_any_vex_encoding(t))
6003 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
6004 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 6005 else
38e314eb 6006 found_reverse_match = Opcode_D;
40fb9820 6007 if (t->opcode_modifier.floatr)
8a2ed489 6008 found_reverse_match |= Opcode_FloatR;
29b0f896 6009 }
f48ff2ae 6010 else
29b0f896 6011 {
f48ff2ae 6012 /* Found a forward 2 operand match here. */
d1cbb4db
L
6013 switch (t->operands)
6014 {
c0f3af97
L
6015 case 5:
6016 overlap4 = operand_type_and (i.types[4],
6017 operand_types[4]);
1a0670f3 6018 /* Fall through. */
d1cbb4db 6019 case 4:
c6fb90c8
L
6020 overlap3 = operand_type_and (i.types[3],
6021 operand_types[3]);
1a0670f3 6022 /* Fall through. */
d1cbb4db 6023 case 3:
c6fb90c8
L
6024 overlap2 = operand_type_and (i.types[2],
6025 operand_types[2]);
d1cbb4db
L
6026 break;
6027 }
29b0f896 6028
f48ff2ae
L
6029 switch (t->operands)
6030 {
c0f3af97
L
6031 case 5:
6032 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 6033 || !operand_type_register_match (i.types[3],
c0f3af97 6034 operand_types[3],
c0f3af97
L
6035 i.types[4],
6036 operand_types[4]))
6037 continue;
1a0670f3 6038 /* Fall through. */
f48ff2ae 6039 case 4:
40fb9820 6040 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
6041 || ((check_register & 0xa) == 0xa
6042 && !operand_type_register_match (i.types[1],
f7768225
JB
6043 operand_types[1],
6044 i.types[3],
e2195274
JB
6045 operand_types[3]))
6046 || ((check_register & 0xc) == 0xc
6047 && !operand_type_register_match (i.types[2],
6048 operand_types[2],
6049 i.types[3],
6050 operand_types[3])))
f48ff2ae 6051 continue;
1a0670f3 6052 /* Fall through. */
f48ff2ae
L
6053 case 3:
6054 /* Here we make use of the fact that there are no
23e42951 6055 reverse match 3 operand instructions. */
40fb9820 6056 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
6057 || ((check_register & 5) == 5
6058 && !operand_type_register_match (i.types[0],
23e42951
JB
6059 operand_types[0],
6060 i.types[2],
e2195274
JB
6061 operand_types[2]))
6062 || ((check_register & 6) == 6
6063 && !operand_type_register_match (i.types[1],
6064 operand_types[1],
6065 i.types[2],
6066 operand_types[2])))
f48ff2ae
L
6067 continue;
6068 break;
6069 }
29b0f896 6070 }
f48ff2ae 6071 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
6072 slip through to break. */
6073 }
3629bb00 6074 if (!found_cpu_match)
dbbc8b7e 6075 continue;
c0f3af97 6076
5614d22c
JB
6077 /* Check if vector and VEX operands are valid. */
6078 if (check_VecOperands (t) || VEX_check_operands (t))
6079 {
6080 specific_error = i.error;
6081 continue;
6082 }
a683cc34 6083
29b0f896
AM
6084 /* We've found a match; break out of loop. */
6085 break;
6086 }
6087
6088 if (t == current_templates->end)
6089 {
6090 /* We found no match. */
a65babc9 6091 const char *err_msg;
5614d22c 6092 switch (specific_error ? specific_error : i.error)
a65babc9
L
6093 {
6094 default:
6095 abort ();
86e026a4 6096 case operand_size_mismatch:
a65babc9
L
6097 err_msg = _("operand size mismatch");
6098 break;
6099 case operand_type_mismatch:
6100 err_msg = _("operand type mismatch");
6101 break;
6102 case register_type_mismatch:
6103 err_msg = _("register type mismatch");
6104 break;
6105 case number_of_operands_mismatch:
6106 err_msg = _("number of operands mismatch");
6107 break;
6108 case invalid_instruction_suffix:
6109 err_msg = _("invalid instruction suffix");
6110 break;
6111 case bad_imm4:
4a2608e3 6112 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6113 break;
a65babc9
L
6114 case unsupported_with_intel_mnemonic:
6115 err_msg = _("unsupported with Intel mnemonic");
6116 break;
6117 case unsupported_syntax:
6118 err_msg = _("unsupported syntax");
6119 break;
6120 case unsupported:
35262a23 6121 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6122 current_templates->start->name);
6123 return NULL;
6c30d220
L
6124 case invalid_vsib_address:
6125 err_msg = _("invalid VSIB address");
6126 break;
7bab8ab5
JB
6127 case invalid_vector_register_set:
6128 err_msg = _("mask, index, and destination registers must be distinct");
6129 break;
6c30d220
L
6130 case unsupported_vector_index_register:
6131 err_msg = _("unsupported vector index register");
6132 break;
43234a1e
L
6133 case unsupported_broadcast:
6134 err_msg = _("unsupported broadcast");
6135 break;
43234a1e
L
6136 case broadcast_needed:
6137 err_msg = _("broadcast is needed for operand of such type");
6138 break;
6139 case unsupported_masking:
6140 err_msg = _("unsupported masking");
6141 break;
6142 case mask_not_on_destination:
6143 err_msg = _("mask not on destination operand");
6144 break;
6145 case no_default_mask:
6146 err_msg = _("default mask isn't allowed");
6147 break;
6148 case unsupported_rc_sae:
6149 err_msg = _("unsupported static rounding/sae");
6150 break;
6151 case rc_sae_operand_not_last_imm:
6152 if (intel_syntax)
6153 err_msg = _("RC/SAE operand must precede immediate operands");
6154 else
6155 err_msg = _("RC/SAE operand must follow immediate operands");
6156 break;
6157 case invalid_register_operand:
6158 err_msg = _("invalid register operand");
6159 break;
a65babc9
L
6160 }
6161 as_bad (_("%s for `%s'"), err_msg,
891edac4 6162 current_templates->start->name);
fa99fab2 6163 return NULL;
29b0f896 6164 }
252b5132 6165
29b0f896
AM
6166 if (!quiet_warnings)
6167 {
6168 if (!intel_syntax
40fb9820
L
6169 && (i.types[0].bitfield.jumpabsolute
6170 != operand_types[0].bitfield.jumpabsolute))
29b0f896
AM
6171 {
6172 as_warn (_("indirect %s without `*'"), t->name);
6173 }
6174
40fb9820
L
6175 if (t->opcode_modifier.isprefix
6176 && t->opcode_modifier.ignoresize)
29b0f896
AM
6177 {
6178 /* Warn them that a data or address size prefix doesn't
6179 affect assembly of the next line of code. */
6180 as_warn (_("stand-alone `%s' prefix"), t->name);
6181 }
6182 }
6183
6184 /* Copy the template we found. */
6185 i.tm = *t;
539e75ad
L
6186
6187 if (addr_prefix_disp != -1)
6188 i.tm.operand_types[addr_prefix_disp]
6189 = operand_types[addr_prefix_disp];
6190
29b0f896
AM
6191 if (found_reverse_match)
6192 {
dfd69174
JB
6193 /* If we found a reverse match we must alter the opcode direction
6194 bit and clear/flip the regmem modifier one. found_reverse_match
6195 holds bits to change (different for int & float insns). */
29b0f896
AM
6196
6197 i.tm.base_opcode ^= found_reverse_match;
6198
f5eb1d70
JB
6199 i.tm.operand_types[0] = operand_types[i.operands - 1];
6200 i.tm.operand_types[i.operands - 1] = operand_types[0];
dfd69174
JB
6201
6202 /* Certain SIMD insns have their load forms specified in the opcode
6203 table, and hence we need to _set_ RegMem instead of clearing it.
6204 We need to avoid setting the bit though on insns like KMOVW. */
6205 i.tm.opcode_modifier.regmem
6206 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
6207 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
6208 && !i.tm.opcode_modifier.regmem;
29b0f896
AM
6209 }
6210
fa99fab2 6211 return t;
29b0f896
AM
6212}
6213
6214static int
e3bb37b5 6215check_string (void)
29b0f896 6216{
8dc0818e
JB
6217 unsigned int mem_op = i.flags[0] & Operand_Mem ? 0 : 1;
6218
40fb9820 6219 if (i.tm.operand_types[mem_op].bitfield.esseg)
29b0f896
AM
6220 {
6221 if (i.seg[0] != NULL && i.seg[0] != &es)
6222 {
a87af027 6223 as_bad (_("`%s' operand %d must use `%ses' segment"),
29b0f896 6224 i.tm.name,
d241b910 6225 intel_syntax ? i.tm.operands - mem_op : mem_op + 1,
a87af027 6226 register_prefix);
29b0f896
AM
6227 return 0;
6228 }
6229 /* There's only ever one segment override allowed per instruction.
6230 This instruction possibly has a legal segment override on the
6231 second operand, so copy the segment to where non-string
6232 instructions store it, allowing common code. */
6233 i.seg[0] = i.seg[1];
6234 }
40fb9820 6235 else if (i.tm.operand_types[mem_op + 1].bitfield.esseg)
29b0f896
AM
6236 {
6237 if (i.seg[1] != NULL && i.seg[1] != &es)
6238 {
a87af027 6239 as_bad (_("`%s' operand %d must use `%ses' segment"),
29b0f896 6240 i.tm.name,
d241b910 6241 intel_syntax ? i.tm.operands - mem_op - 1 : mem_op + 2,
a87af027 6242 register_prefix);
29b0f896
AM
6243 return 0;
6244 }
6245 }
6246 return 1;
6247}
6248
6249static int
543613e9 6250process_suffix (void)
29b0f896
AM
6251{
6252 /* If matched instruction specifies an explicit instruction mnemonic
6253 suffix, use it. */
673fe0f0 6254 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6255 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6256 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6257 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6258 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6259 i.suffix = QWORD_MNEM_SUFFIX;
29b0f896
AM
6260 else if (i.reg_operands)
6261 {
6262 /* If there's no instruction mnemonic suffix we try to invent one
6263 based on register operands. */
6264 if (!i.suffix)
6265 {
6266 /* We take i.suffix from the last register operand specified,
6267 Destination register type is more significant than source
381d071f
L
6268 register type. crc32 in SSE4.2 prefers source register
6269 type. */
bab6aec1
JB
6270 if (i.tm.base_opcode == 0xf20f38f0
6271 && i.types[0].bitfield.class == Reg)
381d071f 6272 {
556059dd
JB
6273 if (i.types[0].bitfield.byte)
6274 i.suffix = BYTE_MNEM_SUFFIX;
6275 else if (i.types[0].bitfield.word)
40fb9820 6276 i.suffix = WORD_MNEM_SUFFIX;
556059dd 6277 else if (i.types[0].bitfield.dword)
40fb9820 6278 i.suffix = LONG_MNEM_SUFFIX;
556059dd 6279 else if (i.types[0].bitfield.qword)
40fb9820 6280 i.suffix = QWORD_MNEM_SUFFIX;
381d071f
L
6281 }
6282
6283 if (!i.suffix)
6284 {
6285 int op;
6286
556059dd 6287 if (i.tm.base_opcode == 0xf20f38f0)
20592a94
L
6288 {
6289 /* We have to know the operand size for crc32. */
6290 as_bad (_("ambiguous memory operand size for `%s`"),
6291 i.tm.name);
6292 return 0;
6293 }
6294
381d071f 6295 for (op = i.operands; --op >= 0;)
75e5731b
JB
6296 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
6297 || i.tm.operand_types[op].bitfield.instance == Accum)
381d071f 6298 {
bab6aec1 6299 if (i.types[op].bitfield.class != Reg)
8819ada6
JB
6300 continue;
6301 if (i.types[op].bitfield.byte)
6302 i.suffix = BYTE_MNEM_SUFFIX;
6303 else if (i.types[op].bitfield.word)
6304 i.suffix = WORD_MNEM_SUFFIX;
6305 else if (i.types[op].bitfield.dword)
6306 i.suffix = LONG_MNEM_SUFFIX;
6307 else if (i.types[op].bitfield.qword)
6308 i.suffix = QWORD_MNEM_SUFFIX;
6309 else
6310 continue;
6311 break;
381d071f
L
6312 }
6313 }
29b0f896
AM
6314 }
6315 else if (i.suffix == BYTE_MNEM_SUFFIX)
6316 {
2eb952a4
L
6317 if (intel_syntax
6318 && i.tm.opcode_modifier.ignoresize
6319 && i.tm.opcode_modifier.no_bsuf)
6320 i.suffix = 0;
6321 else if (!check_byte_reg ())
29b0f896
AM
6322 return 0;
6323 }
6324 else if (i.suffix == LONG_MNEM_SUFFIX)
6325 {
2eb952a4
L
6326 if (intel_syntax
6327 && i.tm.opcode_modifier.ignoresize
9f123b91
JB
6328 && i.tm.opcode_modifier.no_lsuf
6329 && !i.tm.opcode_modifier.todword
6330 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
6331 i.suffix = 0;
6332 else if (!check_long_reg ())
29b0f896
AM
6333 return 0;
6334 }
6335 else if (i.suffix == QWORD_MNEM_SUFFIX)
6336 {
955e1e6a
L
6337 if (intel_syntax
6338 && i.tm.opcode_modifier.ignoresize
9f123b91
JB
6339 && i.tm.opcode_modifier.no_qsuf
6340 && !i.tm.opcode_modifier.todword
6341 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
6342 i.suffix = 0;
6343 else if (!check_qword_reg ())
29b0f896
AM
6344 return 0;
6345 }
6346 else if (i.suffix == WORD_MNEM_SUFFIX)
6347 {
2eb952a4
L
6348 if (intel_syntax
6349 && i.tm.opcode_modifier.ignoresize
6350 && i.tm.opcode_modifier.no_wsuf)
6351 i.suffix = 0;
6352 else if (!check_word_reg ())
29b0f896
AM
6353 return 0;
6354 }
40fb9820 6355 else if (intel_syntax && i.tm.opcode_modifier.ignoresize)
29b0f896
AM
6356 /* Do nothing if the instruction is going to ignore the prefix. */
6357 ;
6358 else
6359 abort ();
6360 }
40fb9820 6361 else if (i.tm.opcode_modifier.defaultsize
9306ca4a
JB
6362 && !i.suffix
6363 /* exclude fldenv/frstor/fsave/fstenv */
40fb9820 6364 && i.tm.opcode_modifier.no_ssuf)
29b0f896 6365 {
06f74c5c
L
6366 if (stackop_size == LONG_MNEM_SUFFIX
6367 && i.tm.base_opcode == 0xcf)
6368 {
6369 /* stackop_size is set to LONG_MNEM_SUFFIX for the
6370 .code16gcc directive to support 16-bit mode with
6371 32-bit address. For IRET without a suffix, generate
6372 16-bit IRET (opcode 0xcf) to return from an interrupt
6373 handler. */
6374 i.suffix = WORD_MNEM_SUFFIX;
6375 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
6376 }
6377 else
6378 i.suffix = stackop_size;
29b0f896 6379 }
9306ca4a
JB
6380 else if (intel_syntax
6381 && !i.suffix
40fb9820
L
6382 && (i.tm.operand_types[0].bitfield.jumpabsolute
6383 || i.tm.opcode_modifier.jumpbyte
6384 || i.tm.opcode_modifier.jumpintersegment
64e74474
AM
6385 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
6386 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
6387 {
6388 switch (flag_code)
6389 {
6390 case CODE_64BIT:
40fb9820 6391 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a
JB
6392 {
6393 i.suffix = QWORD_MNEM_SUFFIX;
6394 break;
6395 }
1a0670f3 6396 /* Fall through. */
9306ca4a 6397 case CODE_32BIT:
40fb9820 6398 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
6399 i.suffix = LONG_MNEM_SUFFIX;
6400 break;
6401 case CODE_16BIT:
40fb9820 6402 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
6403 i.suffix = WORD_MNEM_SUFFIX;
6404 break;
6405 }
6406 }
252b5132 6407
9306ca4a 6408 if (!i.suffix)
29b0f896 6409 {
9306ca4a
JB
6410 if (!intel_syntax)
6411 {
40fb9820 6412 if (i.tm.opcode_modifier.w)
9306ca4a 6413 {
4eed87de
AM
6414 as_bad (_("no instruction mnemonic suffix given and "
6415 "no register operands; can't size instruction"));
9306ca4a
JB
6416 return 0;
6417 }
6418 }
6419 else
6420 {
40fb9820 6421 unsigned int suffixes;
7ab9ffdd 6422
40fb9820
L
6423 suffixes = !i.tm.opcode_modifier.no_bsuf;
6424 if (!i.tm.opcode_modifier.no_wsuf)
6425 suffixes |= 1 << 1;
6426 if (!i.tm.opcode_modifier.no_lsuf)
6427 suffixes |= 1 << 2;
fc4adea1 6428 if (!i.tm.opcode_modifier.no_ldsuf)
40fb9820
L
6429 suffixes |= 1 << 3;
6430 if (!i.tm.opcode_modifier.no_ssuf)
6431 suffixes |= 1 << 4;
c2b9da16 6432 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
40fb9820
L
6433 suffixes |= 1 << 5;
6434
6435 /* There are more than suffix matches. */
6436 if (i.tm.opcode_modifier.w
9306ca4a 6437 || ((suffixes & (suffixes - 1))
40fb9820
L
6438 && !i.tm.opcode_modifier.defaultsize
6439 && !i.tm.opcode_modifier.ignoresize))
9306ca4a
JB
6440 {
6441 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
6442 return 0;
6443 }
6444 }
29b0f896 6445 }
252b5132 6446
d2224064
JB
6447 /* Change the opcode based on the operand size given by i.suffix. */
6448 switch (i.suffix)
29b0f896 6449 {
d2224064
JB
6450 /* Size floating point instruction. */
6451 case LONG_MNEM_SUFFIX:
6452 if (i.tm.opcode_modifier.floatmf)
6453 {
6454 i.tm.base_opcode ^= 4;
6455 break;
6456 }
6457 /* fall through */
6458 case WORD_MNEM_SUFFIX:
6459 case QWORD_MNEM_SUFFIX:
29b0f896 6460 /* It's not a byte, select word/dword operation. */
40fb9820 6461 if (i.tm.opcode_modifier.w)
29b0f896 6462 {
40fb9820 6463 if (i.tm.opcode_modifier.shortform)
29b0f896
AM
6464 i.tm.base_opcode |= 8;
6465 else
6466 i.tm.base_opcode |= 1;
6467 }
d2224064
JB
6468 /* fall through */
6469 case SHORT_MNEM_SUFFIX:
29b0f896
AM
6470 /* Now select between word & dword operations via the operand
6471 size prefix, except for instructions that will ignore this
6472 prefix anyway. */
75c0a438 6473 if (i.reg_operands > 0
bab6aec1 6474 && i.types[0].bitfield.class == Reg
75c0a438
L
6475 && i.tm.opcode_modifier.addrprefixopreg
6476 && (i.tm.opcode_modifier.immext
6477 || i.operands == 1))
cb712a9e 6478 {
ca61edf2
L
6479 /* The address size override prefix changes the size of the
6480 first operand. */
40fb9820 6481 if ((flag_code == CODE_32BIT
75c0a438 6482 && i.op[0].regs->reg_type.bitfield.word)
40fb9820 6483 || (flag_code != CODE_32BIT
75c0a438 6484 && i.op[0].regs->reg_type.bitfield.dword))
cb712a9e
L
6485 if (!add_prefix (ADDR_PREFIX_OPCODE))
6486 return 0;
6487 }
6488 else if (i.suffix != QWORD_MNEM_SUFFIX
40fb9820
L
6489 && !i.tm.opcode_modifier.ignoresize
6490 && !i.tm.opcode_modifier.floatmf
a38d7118 6491 && !is_any_vex_encoding (&i.tm)
cb712a9e
L
6492 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
6493 || (flag_code == CODE_64BIT
40fb9820 6494 && i.tm.opcode_modifier.jumpbyte)))
24eab124
AM
6495 {
6496 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 6497
40fb9820 6498 if (i.tm.opcode_modifier.jumpbyte) /* jcxz, loop */
29b0f896 6499 prefix = ADDR_PREFIX_OPCODE;
252b5132 6500
29b0f896
AM
6501 if (!add_prefix (prefix))
6502 return 0;
24eab124 6503 }
252b5132 6504
29b0f896
AM
6505 /* Set mode64 for an operand. */
6506 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 6507 && flag_code == CODE_64BIT
d2224064 6508 && !i.tm.opcode_modifier.norex64
46e883c5 6509 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
6510 need rex64. */
6511 && ! (i.operands == 2
6512 && i.tm.base_opcode == 0x90
6513 && i.tm.extension_opcode == None
75e5731b
JB
6514 && i.types[0].bitfield.instance == Accum
6515 && i.types[0].bitfield.qword
6516 && i.types[1].bitfield.instance == Accum
6517 && i.types[1].bitfield.qword))
d2224064 6518 i.rex |= REX_W;
3e73aa7c 6519
d2224064 6520 break;
29b0f896 6521 }
7ecd2f8b 6522
c0a30a9f
L
6523 if (i.reg_operands != 0
6524 && i.operands > 1
6525 && i.tm.opcode_modifier.addrprefixopreg
6526 && !i.tm.opcode_modifier.immext)
6527 {
6528 /* Check invalid register operand when the address size override
6529 prefix changes the size of register operands. */
6530 unsigned int op;
6531 enum { need_word, need_dword, need_qword } need;
6532
6533 if (flag_code == CODE_32BIT)
6534 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
6535 else
6536 {
6537 if (i.prefix[ADDR_PREFIX])
6538 need = need_dword;
6539 else
6540 need = flag_code == CODE_64BIT ? need_qword : need_word;
6541 }
6542
6543 for (op = 0; op < i.operands; op++)
bab6aec1 6544 if (i.types[op].bitfield.class == Reg
c0a30a9f
L
6545 && ((need == need_word
6546 && !i.op[op].regs->reg_type.bitfield.word)
6547 || (need == need_dword
6548 && !i.op[op].regs->reg_type.bitfield.dword)
6549 || (need == need_qword
6550 && !i.op[op].regs->reg_type.bitfield.qword)))
6551 {
6552 as_bad (_("invalid register operand size for `%s'"),
6553 i.tm.name);
6554 return 0;
6555 }
6556 }
6557
29b0f896
AM
6558 return 1;
6559}
3e73aa7c 6560
29b0f896 6561static int
543613e9 6562check_byte_reg (void)
29b0f896
AM
6563{
6564 int op;
543613e9 6565
29b0f896
AM
6566 for (op = i.operands; --op >= 0;)
6567 {
dc821c5f 6568 /* Skip non-register operands. */
bab6aec1 6569 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
6570 continue;
6571
29b0f896
AM
6572 /* If this is an eight bit register, it's OK. If it's the 16 or
6573 32 bit version of an eight bit register, we will just use the
6574 low portion, and that's OK too. */
dc821c5f 6575 if (i.types[op].bitfield.byte)
29b0f896
AM
6576 continue;
6577
5a819eb9 6578 /* I/O port address operands are OK too. */
75e5731b
JB
6579 if (i.tm.operand_types[op].bitfield.instance == RegD
6580 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
6581 continue;
6582
9344ff29
L
6583 /* crc32 doesn't generate this warning. */
6584 if (i.tm.base_opcode == 0xf20f38f0)
6585 continue;
6586
dc821c5f
JB
6587 if ((i.types[op].bitfield.word
6588 || i.types[op].bitfield.dword
6589 || i.types[op].bitfield.qword)
5a819eb9
JB
6590 && i.op[op].regs->reg_num < 4
6591 /* Prohibit these changes in 64bit mode, since the lowering
6592 would be more complicated. */
6593 && flag_code != CODE_64BIT)
29b0f896 6594 {
29b0f896 6595#if REGISTER_WARNINGS
5a819eb9 6596 if (!quiet_warnings)
a540244d
L
6597 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
6598 register_prefix,
dc821c5f 6599 (i.op[op].regs + (i.types[op].bitfield.word
29b0f896
AM
6600 ? REGNAM_AL - REGNAM_AX
6601 : REGNAM_AL - REGNAM_EAX))->reg_name,
a540244d 6602 register_prefix,
29b0f896
AM
6603 i.op[op].regs->reg_name,
6604 i.suffix);
6605#endif
6606 continue;
6607 }
6608 /* Any other register is bad. */
bab6aec1 6609 if (i.types[op].bitfield.class == Reg
3528c362
JB
6610 || i.types[op].bitfield.class == RegMMX
6611 || i.types[op].bitfield.class == RegSIMD
00cee14f 6612 || i.types[op].bitfield.class == SReg
4a5c67ed
JB
6613 || i.types[op].bitfield.class == RegCR
6614 || i.types[op].bitfield.class == RegDR
6615 || i.types[op].bitfield.class == RegTR)
29b0f896 6616 {
a540244d
L
6617 as_bad (_("`%s%s' not allowed with `%s%c'"),
6618 register_prefix,
29b0f896
AM
6619 i.op[op].regs->reg_name,
6620 i.tm.name,
6621 i.suffix);
6622 return 0;
6623 }
6624 }
6625 return 1;
6626}
6627
6628static int
e3bb37b5 6629check_long_reg (void)
29b0f896
AM
6630{
6631 int op;
6632
6633 for (op = i.operands; --op >= 0;)
dc821c5f 6634 /* Skip non-register operands. */
bab6aec1 6635 if (i.types[op].bitfield.class != Reg)
dc821c5f 6636 continue;
29b0f896
AM
6637 /* Reject eight bit registers, except where the template requires
6638 them. (eg. movzb) */
dc821c5f 6639 else if (i.types[op].bitfield.byte
bab6aec1 6640 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6641 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
6642 && (i.tm.operand_types[op].bitfield.word
6643 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6644 {
a540244d
L
6645 as_bad (_("`%s%s' not allowed with `%s%c'"),
6646 register_prefix,
29b0f896
AM
6647 i.op[op].regs->reg_name,
6648 i.tm.name,
6649 i.suffix);
6650 return 0;
6651 }
e4630f71 6652 /* Warn if the e prefix on a general reg is missing. */
29b0f896 6653 else if ((!quiet_warnings || flag_code == CODE_64BIT)
dc821c5f 6654 && i.types[op].bitfield.word
bab6aec1 6655 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6656 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 6657 && i.tm.operand_types[op].bitfield.dword)
29b0f896
AM
6658 {
6659 /* Prohibit these changes in the 64bit mode, since the
6660 lowering is more complicated. */
6661 if (flag_code == CODE_64BIT)
252b5132 6662 {
2b5d6a91 6663 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
2ca3ace5 6664 register_prefix, i.op[op].regs->reg_name,
29b0f896
AM
6665 i.suffix);
6666 return 0;
252b5132 6667 }
29b0f896 6668#if REGISTER_WARNINGS
cecf1424
JB
6669 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
6670 register_prefix,
6671 (i.op[op].regs + REGNAM_EAX - REGNAM_AX)->reg_name,
6672 register_prefix, i.op[op].regs->reg_name, i.suffix);
29b0f896 6673#endif
252b5132 6674 }
e4630f71 6675 /* Warn if the r prefix on a general reg is present. */
dc821c5f 6676 else if (i.types[op].bitfield.qword
bab6aec1 6677 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6678 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 6679 && i.tm.operand_types[op].bitfield.dword)
252b5132 6680 {
34828aad 6681 if (intel_syntax
ca61edf2 6682 && i.tm.opcode_modifier.toqword
3528c362 6683 && i.types[0].bitfield.class != RegSIMD)
34828aad 6684 {
ca61edf2 6685 /* Convert to QWORD. We want REX byte. */
34828aad
L
6686 i.suffix = QWORD_MNEM_SUFFIX;
6687 }
6688 else
6689 {
2b5d6a91 6690 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
6691 register_prefix, i.op[op].regs->reg_name,
6692 i.suffix);
6693 return 0;
6694 }
29b0f896
AM
6695 }
6696 return 1;
6697}
252b5132 6698
29b0f896 6699static int
e3bb37b5 6700check_qword_reg (void)
29b0f896
AM
6701{
6702 int op;
252b5132 6703
29b0f896 6704 for (op = i.operands; --op >= 0; )
dc821c5f 6705 /* Skip non-register operands. */
bab6aec1 6706 if (i.types[op].bitfield.class != Reg)
dc821c5f 6707 continue;
29b0f896
AM
6708 /* Reject eight bit registers, except where the template requires
6709 them. (eg. movzb) */
dc821c5f 6710 else if (i.types[op].bitfield.byte
bab6aec1 6711 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6712 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
6713 && (i.tm.operand_types[op].bitfield.word
6714 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6715 {
a540244d
L
6716 as_bad (_("`%s%s' not allowed with `%s%c'"),
6717 register_prefix,
29b0f896
AM
6718 i.op[op].regs->reg_name,
6719 i.tm.name,
6720 i.suffix);
6721 return 0;
6722 }
e4630f71 6723 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
6724 else if ((i.types[op].bitfield.word
6725 || i.types[op].bitfield.dword)
bab6aec1 6726 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6727 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 6728 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
6729 {
6730 /* Prohibit these changes in the 64bit mode, since the
6731 lowering is more complicated. */
34828aad 6732 if (intel_syntax
ca61edf2 6733 && i.tm.opcode_modifier.todword
3528c362 6734 && i.types[0].bitfield.class != RegSIMD)
34828aad 6735 {
ca61edf2 6736 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
6737 i.suffix = LONG_MNEM_SUFFIX;
6738 }
6739 else
6740 {
2b5d6a91 6741 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
6742 register_prefix, i.op[op].regs->reg_name,
6743 i.suffix);
6744 return 0;
6745 }
252b5132 6746 }
29b0f896
AM
6747 return 1;
6748}
252b5132 6749
29b0f896 6750static int
e3bb37b5 6751check_word_reg (void)
29b0f896
AM
6752{
6753 int op;
6754 for (op = i.operands; --op >= 0;)
dc821c5f 6755 /* Skip non-register operands. */
bab6aec1 6756 if (i.types[op].bitfield.class != Reg)
dc821c5f 6757 continue;
29b0f896
AM
6758 /* Reject eight bit registers, except where the template requires
6759 them. (eg. movzb) */
dc821c5f 6760 else if (i.types[op].bitfield.byte
bab6aec1 6761 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6762 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
6763 && (i.tm.operand_types[op].bitfield.word
6764 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6765 {
a540244d
L
6766 as_bad (_("`%s%s' not allowed with `%s%c'"),
6767 register_prefix,
29b0f896
AM
6768 i.op[op].regs->reg_name,
6769 i.tm.name,
6770 i.suffix);
6771 return 0;
6772 }
e4630f71 6773 /* Warn if the e or r prefix on a general reg is present. */
29b0f896 6774 else if ((!quiet_warnings || flag_code == CODE_64BIT)
dc821c5f
JB
6775 && (i.types[op].bitfield.dword
6776 || i.types[op].bitfield.qword)
bab6aec1 6777 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6778 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 6779 && i.tm.operand_types[op].bitfield.word)
252b5132 6780 {
29b0f896
AM
6781 /* Prohibit these changes in the 64bit mode, since the
6782 lowering is more complicated. */
6783 if (flag_code == CODE_64BIT)
252b5132 6784 {
2b5d6a91 6785 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
2ca3ace5 6786 register_prefix, i.op[op].regs->reg_name,
29b0f896
AM
6787 i.suffix);
6788 return 0;
252b5132 6789 }
29b0f896 6790#if REGISTER_WARNINGS
cecf1424
JB
6791 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
6792 register_prefix,
6793 (i.op[op].regs + REGNAM_AX - REGNAM_EAX)->reg_name,
6794 register_prefix, i.op[op].regs->reg_name, i.suffix);
29b0f896
AM
6795#endif
6796 }
6797 return 1;
6798}
252b5132 6799
29b0f896 6800static int
40fb9820 6801update_imm (unsigned int j)
29b0f896 6802{
bc0844ae 6803 i386_operand_type overlap = i.types[j];
40fb9820
L
6804 if ((overlap.bitfield.imm8
6805 || overlap.bitfield.imm8s
6806 || overlap.bitfield.imm16
6807 || overlap.bitfield.imm32
6808 || overlap.bitfield.imm32s
6809 || overlap.bitfield.imm64)
0dfbf9d7
L
6810 && !operand_type_equal (&overlap, &imm8)
6811 && !operand_type_equal (&overlap, &imm8s)
6812 && !operand_type_equal (&overlap, &imm16)
6813 && !operand_type_equal (&overlap, &imm32)
6814 && !operand_type_equal (&overlap, &imm32s)
6815 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
6816 {
6817 if (i.suffix)
6818 {
40fb9820
L
6819 i386_operand_type temp;
6820
0dfbf9d7 6821 operand_type_set (&temp, 0);
7ab9ffdd 6822 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
6823 {
6824 temp.bitfield.imm8 = overlap.bitfield.imm8;
6825 temp.bitfield.imm8s = overlap.bitfield.imm8s;
6826 }
6827 else if (i.suffix == WORD_MNEM_SUFFIX)
6828 temp.bitfield.imm16 = overlap.bitfield.imm16;
6829 else if (i.suffix == QWORD_MNEM_SUFFIX)
6830 {
6831 temp.bitfield.imm64 = overlap.bitfield.imm64;
6832 temp.bitfield.imm32s = overlap.bitfield.imm32s;
6833 }
6834 else
6835 temp.bitfield.imm32 = overlap.bitfield.imm32;
6836 overlap = temp;
29b0f896 6837 }
0dfbf9d7
L
6838 else if (operand_type_equal (&overlap, &imm16_32_32s)
6839 || operand_type_equal (&overlap, &imm16_32)
6840 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 6841 {
40fb9820 6842 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 6843 overlap = imm16;
40fb9820 6844 else
65da13b5 6845 overlap = imm32s;
29b0f896 6846 }
0dfbf9d7
L
6847 if (!operand_type_equal (&overlap, &imm8)
6848 && !operand_type_equal (&overlap, &imm8s)
6849 && !operand_type_equal (&overlap, &imm16)
6850 && !operand_type_equal (&overlap, &imm32)
6851 && !operand_type_equal (&overlap, &imm32s)
6852 && !operand_type_equal (&overlap, &imm64))
29b0f896 6853 {
4eed87de
AM
6854 as_bad (_("no instruction mnemonic suffix given; "
6855 "can't determine immediate size"));
29b0f896
AM
6856 return 0;
6857 }
6858 }
40fb9820 6859 i.types[j] = overlap;
29b0f896 6860
40fb9820
L
6861 return 1;
6862}
6863
6864static int
6865finalize_imm (void)
6866{
bc0844ae 6867 unsigned int j, n;
29b0f896 6868
bc0844ae
L
6869 /* Update the first 2 immediate operands. */
6870 n = i.operands > 2 ? 2 : i.operands;
6871 if (n)
6872 {
6873 for (j = 0; j < n; j++)
6874 if (update_imm (j) == 0)
6875 return 0;
40fb9820 6876
bc0844ae
L
6877 /* The 3rd operand can't be immediate operand. */
6878 gas_assert (operand_type_check (i.types[2], imm) == 0);
6879 }
29b0f896
AM
6880
6881 return 1;
6882}
6883
6884static int
e3bb37b5 6885process_operands (void)
29b0f896
AM
6886{
6887 /* Default segment register this instruction will use for memory
6888 accesses. 0 means unknown. This is only for optimizing out
6889 unnecessary segment overrides. */
6890 const seg_entry *default_seg = 0;
6891
2426c15f 6892 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 6893 {
91d6fa6a
NC
6894 unsigned int dupl = i.operands;
6895 unsigned int dest = dupl - 1;
9fcfb3d7
L
6896 unsigned int j;
6897
c0f3af97 6898 /* The destination must be an xmm register. */
9c2799c2 6899 gas_assert (i.reg_operands
91d6fa6a 6900 && MAX_OPERANDS > dupl
7ab9ffdd 6901 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 6902
75e5731b 6903 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 6904 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 6905 {
8cd7925b 6906 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
6907 {
6908 /* Keep xmm0 for instructions with VEX prefix and 3
6909 sources. */
75e5731b 6910 i.tm.operand_types[0].bitfield.instance = InstanceNone;
3528c362 6911 i.tm.operand_types[0].bitfield.class = RegSIMD;
c0f3af97
L
6912 goto duplicate;
6913 }
e2ec9d29 6914 else
c0f3af97
L
6915 {
6916 /* We remove the first xmm0 and keep the number of
6917 operands unchanged, which in fact duplicates the
6918 destination. */
6919 for (j = 1; j < i.operands; j++)
6920 {
6921 i.op[j - 1] = i.op[j];
6922 i.types[j - 1] = i.types[j];
6923 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
8dc0818e 6924 i.flags[j - 1] = i.flags[j];
c0f3af97
L
6925 }
6926 }
6927 }
6928 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 6929 {
91d6fa6a 6930 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
6931 && (i.tm.opcode_modifier.vexsources
6932 == VEX3SOURCES));
c0f3af97
L
6933
6934 /* Add the implicit xmm0 for instructions with VEX prefix
6935 and 3 sources. */
6936 for (j = i.operands; j > 0; j--)
6937 {
6938 i.op[j] = i.op[j - 1];
6939 i.types[j] = i.types[j - 1];
6940 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 6941 i.flags[j] = i.flags[j - 1];
c0f3af97
L
6942 }
6943 i.op[0].regs
6944 = (const reg_entry *) hash_find (reg_hash, "xmm0");
7ab9ffdd 6945 i.types[0] = regxmm;
c0f3af97
L
6946 i.tm.operand_types[0] = regxmm;
6947
6948 i.operands += 2;
6949 i.reg_operands += 2;
6950 i.tm.operands += 2;
6951
91d6fa6a 6952 dupl++;
c0f3af97 6953 dest++;
91d6fa6a
NC
6954 i.op[dupl] = i.op[dest];
6955 i.types[dupl] = i.types[dest];
6956 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 6957 i.flags[dupl] = i.flags[dest];
e2ec9d29 6958 }
c0f3af97
L
6959 else
6960 {
6961duplicate:
6962 i.operands++;
6963 i.reg_operands++;
6964 i.tm.operands++;
6965
91d6fa6a
NC
6966 i.op[dupl] = i.op[dest];
6967 i.types[dupl] = i.types[dest];
6968 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 6969 i.flags[dupl] = i.flags[dest];
c0f3af97
L
6970 }
6971
6972 if (i.tm.opcode_modifier.immext)
6973 process_immext ();
6974 }
75e5731b 6975 else if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 6976 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
6977 {
6978 unsigned int j;
6979
9fcfb3d7
L
6980 for (j = 1; j < i.operands; j++)
6981 {
6982 i.op[j - 1] = i.op[j];
6983 i.types[j - 1] = i.types[j];
6984
6985 /* We need to adjust fields in i.tm since they are used by
6986 build_modrm_byte. */
6987 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
6988
6989 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
6990 }
6991
e2ec9d29
L
6992 i.operands--;
6993 i.reg_operands--;
e2ec9d29
L
6994 i.tm.operands--;
6995 }
920d2ddc
IT
6996 else if (i.tm.opcode_modifier.implicitquadgroup)
6997 {
a477a8c4
JB
6998 unsigned int regnum, first_reg_in_group, last_reg_in_group;
6999
920d2ddc 7000 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 7001 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
7002 regnum = register_number (i.op[1].regs);
7003 first_reg_in_group = regnum & ~3;
7004 last_reg_in_group = first_reg_in_group + 3;
7005 if (regnum != first_reg_in_group)
7006 as_warn (_("source register `%s%s' implicitly denotes"
7007 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
7008 register_prefix, i.op[1].regs->reg_name,
7009 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
7010 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
7011 i.tm.name);
7012 }
e2ec9d29
L
7013 else if (i.tm.opcode_modifier.regkludge)
7014 {
7015 /* The imul $imm, %reg instruction is converted into
7016 imul $imm, %reg, %reg, and the clr %reg instruction
7017 is converted into xor %reg, %reg. */
7018
7019 unsigned int first_reg_op;
7020
7021 if (operand_type_check (i.types[0], reg))
7022 first_reg_op = 0;
7023 else
7024 first_reg_op = 1;
7025 /* Pretend we saw the extra register operand. */
9c2799c2 7026 gas_assert (i.reg_operands == 1
7ab9ffdd 7027 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
7028 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
7029 i.types[first_reg_op + 1] = i.types[first_reg_op];
7030 i.operands++;
7031 i.reg_operands++;
29b0f896
AM
7032 }
7033
85b80b0f 7034 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
7035 {
7036 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
7037 must be put into the modrm byte). Now, we make the modrm and
7038 index base bytes based on all the info we've collected. */
29b0f896
AM
7039
7040 default_seg = build_modrm_byte ();
7041 }
00cee14f 7042 else if (i.types[0].bitfield.class == SReg)
85b80b0f
JB
7043 {
7044 if (flag_code != CODE_64BIT
7045 ? i.tm.base_opcode == POP_SEG_SHORT
7046 && i.op[0].regs->reg_num == 1
7047 : (i.tm.base_opcode | 1) == POP_SEG386_SHORT
7048 && i.op[0].regs->reg_num < 4)
7049 {
7050 as_bad (_("you can't `%s %s%s'"),
7051 i.tm.name, register_prefix, i.op[0].regs->reg_name);
7052 return 0;
7053 }
7054 if ( i.op[0].regs->reg_num > 3 && i.tm.opcode_length == 1 )
7055 {
7056 i.tm.base_opcode ^= POP_SEG_SHORT ^ POP_SEG386_SHORT;
7057 i.tm.opcode_length = 2;
7058 }
7059 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
7060 }
8a2ed489 7061 else if ((i.tm.base_opcode & ~0x3) == MOV_AX_DISP32)
29b0f896
AM
7062 {
7063 default_seg = &ds;
7064 }
40fb9820 7065 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
7066 {
7067 /* For the string instructions that allow a segment override
7068 on one of their operands, the default segment is ds. */
7069 default_seg = &ds;
7070 }
85b80b0f
JB
7071 else if (i.tm.opcode_modifier.shortform)
7072 {
7073 /* The register or float register operand is in operand
7074 0 or 1. */
bab6aec1 7075 unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
85b80b0f
JB
7076
7077 /* Register goes in low 3 bits of opcode. */
7078 i.tm.base_opcode |= i.op[op].regs->reg_num;
7079 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7080 i.rex |= REX_B;
7081 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
7082 {
7083 /* Warn about some common errors, but press on regardless.
7084 The first case can be generated by gcc (<= 2.8.1). */
7085 if (i.operands == 2)
7086 {
7087 /* Reversed arguments on faddp, fsubp, etc. */
7088 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
7089 register_prefix, i.op[!intel_syntax].regs->reg_name,
7090 register_prefix, i.op[intel_syntax].regs->reg_name);
7091 }
7092 else
7093 {
7094 /* Extraneous `l' suffix on fp insn. */
7095 as_warn (_("translating to `%s %s%s'"), i.tm.name,
7096 register_prefix, i.op[0].regs->reg_name);
7097 }
7098 }
7099 }
29b0f896 7100
75178d9d
L
7101 if (i.tm.base_opcode == 0x8d /* lea */
7102 && i.seg[0]
7103 && !quiet_warnings)
30123838 7104 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
52271982
AM
7105
7106 /* If a segment was explicitly specified, and the specified segment
7107 is not the default, use an opcode prefix to select it. If we
7108 never figured out what the default segment is, then default_seg
7109 will be zero at this point, and the specified segment prefix will
7110 always be used. */
29b0f896
AM
7111 if ((i.seg[0]) && (i.seg[0] != default_seg))
7112 {
7113 if (!add_prefix (i.seg[0]->seg_prefix))
7114 return 0;
7115 }
7116 return 1;
7117}
7118
7119static const seg_entry *
e3bb37b5 7120build_modrm_byte (void)
29b0f896
AM
7121{
7122 const seg_entry *default_seg = 0;
c0f3af97 7123 unsigned int source, dest;
8cd7925b 7124 int vex_3_sources;
c0f3af97 7125
8cd7925b 7126 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
7127 if (vex_3_sources)
7128 {
91d6fa6a 7129 unsigned int nds, reg_slot;
4c2c6516 7130 expressionS *exp;
c0f3af97 7131
6b8d3588 7132 dest = i.operands - 1;
c0f3af97 7133 nds = dest - 1;
922d8de8 7134
a683cc34 7135 /* There are 2 kinds of instructions:
bed3d976 7136 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 7137 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 7138 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 7139 ZMM register.
bed3d976 7140 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 7141 plus 1 memory operand, with VexXDS. */
922d8de8 7142 gas_assert ((i.reg_operands == 4
bed3d976
JB
7143 || (i.reg_operands == 3 && i.mem_operands == 1))
7144 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323 7145 && i.tm.opcode_modifier.vexw
3528c362 7146 && i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 7147
48db9223
JB
7148 /* If VexW1 is set, the first non-immediate operand is the source and
7149 the second non-immediate one is encoded in the immediate operand. */
7150 if (i.tm.opcode_modifier.vexw == VEXW1)
7151 {
7152 source = i.imm_operands;
7153 reg_slot = i.imm_operands + 1;
7154 }
7155 else
7156 {
7157 source = i.imm_operands + 1;
7158 reg_slot = i.imm_operands;
7159 }
7160
a683cc34 7161 if (i.imm_operands == 0)
bed3d976
JB
7162 {
7163 /* When there is no immediate operand, generate an 8bit
7164 immediate operand to encode the first operand. */
7165 exp = &im_expressions[i.imm_operands++];
7166 i.op[i.operands].imms = exp;
7167 i.types[i.operands] = imm8;
7168 i.operands++;
7169
3528c362 7170 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
bed3d976
JB
7171 exp->X_op = O_constant;
7172 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
7173 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
7174 }
922d8de8 7175 else
bed3d976 7176 {
9d3bf266
JB
7177 gas_assert (i.imm_operands == 1);
7178 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
7179 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 7180
9d3bf266
JB
7181 /* Turn on Imm8 again so that output_imm will generate it. */
7182 i.types[0].bitfield.imm8 = 1;
bed3d976 7183
3528c362 7184 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
9d3bf266 7185 i.op[0].imms->X_add_number
bed3d976 7186 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 7187 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 7188 }
a683cc34 7189
3528c362 7190 gas_assert (i.tm.operand_types[nds].bitfield.class == RegSIMD);
dae39acc 7191 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
7192 }
7193 else
7194 source = dest = 0;
29b0f896
AM
7195
7196 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
7197 implicit registers do not count. If there are 3 register
7198 operands, it must be a instruction with VexNDS. For a
7199 instruction with VexNDD, the destination register is encoded
7200 in VEX prefix. If there are 4 register operands, it must be
7201 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
7202 if (i.mem_operands == 0
7203 && ((i.reg_operands == 2
2426c15f 7204 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 7205 || (i.reg_operands == 3
2426c15f 7206 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 7207 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 7208 {
cab737b9
L
7209 switch (i.operands)
7210 {
7211 case 2:
7212 source = 0;
7213 break;
7214 case 3:
c81128dc
L
7215 /* When there are 3 operands, one of them may be immediate,
7216 which may be the first or the last operand. Otherwise,
c0f3af97
L
7217 the first operand must be shift count register (cl) or it
7218 is an instruction with VexNDS. */
9c2799c2 7219 gas_assert (i.imm_operands == 1
7ab9ffdd 7220 || (i.imm_operands == 0
2426c15f 7221 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
75e5731b
JB
7222 || (i.types[0].bitfield.instance == RegC
7223 && i.types[0].bitfield.byte))));
40fb9820 7224 if (operand_type_check (i.types[0], imm)
75e5731b
JB
7225 || (i.types[0].bitfield.instance == RegC
7226 && i.types[0].bitfield.byte))
40fb9820
L
7227 source = 1;
7228 else
7229 source = 0;
cab737b9
L
7230 break;
7231 case 4:
368d64cc
L
7232 /* When there are 4 operands, the first two must be 8bit
7233 immediate operands. The source operand will be the 3rd
c0f3af97
L
7234 one.
7235
7236 For instructions with VexNDS, if the first operand
7237 an imm8, the source operand is the 2nd one. If the last
7238 operand is imm8, the source operand is the first one. */
9c2799c2 7239 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
7240 && i.types[0].bitfield.imm8
7241 && i.types[1].bitfield.imm8)
2426c15f 7242 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
7243 && i.imm_operands == 1
7244 && (i.types[0].bitfield.imm8
43234a1e
L
7245 || i.types[i.operands - 1].bitfield.imm8
7246 || i.rounding)));
9f2670f2
L
7247 if (i.imm_operands == 2)
7248 source = 2;
7249 else
c0f3af97
L
7250 {
7251 if (i.types[0].bitfield.imm8)
7252 source = 1;
7253 else
7254 source = 0;
7255 }
c0f3af97
L
7256 break;
7257 case 5:
e771e7c9 7258 if (is_evex_encoding (&i.tm))
43234a1e
L
7259 {
7260 /* For EVEX instructions, when there are 5 operands, the
7261 first one must be immediate operand. If the second one
7262 is immediate operand, the source operand is the 3th
7263 one. If the last one is immediate operand, the source
7264 operand is the 2nd one. */
7265 gas_assert (i.imm_operands == 2
7266 && i.tm.opcode_modifier.sae
7267 && operand_type_check (i.types[0], imm));
7268 if (operand_type_check (i.types[1], imm))
7269 source = 2;
7270 else if (operand_type_check (i.types[4], imm))
7271 source = 1;
7272 else
7273 abort ();
7274 }
cab737b9
L
7275 break;
7276 default:
7277 abort ();
7278 }
7279
c0f3af97
L
7280 if (!vex_3_sources)
7281 {
7282 dest = source + 1;
7283
43234a1e
L
7284 /* RC/SAE operand could be between DEST and SRC. That happens
7285 when one operand is GPR and the other one is XMM/YMM/ZMM
7286 register. */
7287 if (i.rounding && i.rounding->operand == (int) dest)
7288 dest++;
7289
2426c15f 7290 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 7291 {
43234a1e 7292 /* For instructions with VexNDS, the register-only source
c5d0745b 7293 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
dfd69174 7294 register. It is encoded in VEX prefix. */
f12dc422
L
7295
7296 i386_operand_type op;
7297 unsigned int vvvv;
7298
7299 /* Check register-only source operand when two source
7300 operands are swapped. */
7301 if (!i.tm.operand_types[source].bitfield.baseindex
7302 && i.tm.operand_types[dest].bitfield.baseindex)
7303 {
7304 vvvv = source;
7305 source = dest;
7306 }
7307 else
7308 vvvv = dest;
7309
7310 op = i.tm.operand_types[vvvv];
c0f3af97 7311 if ((dest + 1) >= i.operands
bab6aec1 7312 || ((op.bitfield.class != Reg
dc821c5f 7313 || (!op.bitfield.dword && !op.bitfield.qword))
3528c362 7314 && op.bitfield.class != RegSIMD
43234a1e 7315 && !operand_type_equal (&op, &regmask)))
c0f3af97 7316 abort ();
f12dc422 7317 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
7318 dest++;
7319 }
7320 }
29b0f896
AM
7321
7322 i.rm.mode = 3;
dfd69174
JB
7323 /* One of the register operands will be encoded in the i.rm.reg
7324 field, the other in the combined i.rm.mode and i.rm.regmem
29b0f896
AM
7325 fields. If no form of this instruction supports a memory
7326 destination operand, then we assume the source operand may
7327 sometimes be a memory operand and so we need to store the
7328 destination in the i.rm.reg field. */
dfd69174 7329 if (!i.tm.opcode_modifier.regmem
40fb9820 7330 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
7331 {
7332 i.rm.reg = i.op[dest].regs->reg_num;
7333 i.rm.regmem = i.op[source].regs->reg_num;
3528c362
JB
7334 if (i.op[dest].regs->reg_type.bitfield.class == RegMMX
7335 || i.op[source].regs->reg_type.bitfield.class == RegMMX)
b4a3a7b4 7336 i.has_regmmx = TRUE;
3528c362
JB
7337 else if (i.op[dest].regs->reg_type.bitfield.class == RegSIMD
7338 || i.op[source].regs->reg_type.bitfield.class == RegSIMD)
b4a3a7b4
L
7339 {
7340 if (i.types[dest].bitfield.zmmword
7341 || i.types[source].bitfield.zmmword)
7342 i.has_regzmm = TRUE;
7343 else if (i.types[dest].bitfield.ymmword
7344 || i.types[source].bitfield.ymmword)
7345 i.has_regymm = TRUE;
7346 else
7347 i.has_regxmm = TRUE;
7348 }
29b0f896 7349 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 7350 i.rex |= REX_R;
43234a1e
L
7351 if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
7352 i.vrex |= REX_R;
29b0f896 7353 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 7354 i.rex |= REX_B;
43234a1e
L
7355 if ((i.op[source].regs->reg_flags & RegVRex) != 0)
7356 i.vrex |= REX_B;
29b0f896
AM
7357 }
7358 else
7359 {
7360 i.rm.reg = i.op[source].regs->reg_num;
7361 i.rm.regmem = i.op[dest].regs->reg_num;
7362 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 7363 i.rex |= REX_B;
43234a1e
L
7364 if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
7365 i.vrex |= REX_B;
29b0f896 7366 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 7367 i.rex |= REX_R;
43234a1e
L
7368 if ((i.op[source].regs->reg_flags & RegVRex) != 0)
7369 i.vrex |= REX_R;
29b0f896 7370 }
e0c7f900 7371 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 7372 {
4a5c67ed 7373 if (i.types[!i.tm.opcode_modifier.regmem].bitfield.class != RegCR)
c4a530c5 7374 abort ();
e0c7f900 7375 i.rex &= ~REX_R;
c4a530c5
JB
7376 add_prefix (LOCK_PREFIX_OPCODE);
7377 }
29b0f896
AM
7378 }
7379 else
7380 { /* If it's not 2 reg operands... */
c0f3af97
L
7381 unsigned int mem;
7382
29b0f896
AM
7383 if (i.mem_operands)
7384 {
7385 unsigned int fake_zero_displacement = 0;
99018f42 7386 unsigned int op;
4eed87de 7387
7ab9ffdd 7388 for (op = 0; op < i.operands; op++)
8dc0818e 7389 if (i.flags[op] & Operand_Mem)
7ab9ffdd 7390 break;
7ab9ffdd 7391 gas_assert (op < i.operands);
29b0f896 7392
6c30d220
L
7393 if (i.tm.opcode_modifier.vecsib)
7394 {
e968fc9b 7395 if (i.index_reg->reg_num == RegIZ)
6c30d220
L
7396 abort ();
7397
7398 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7399 if (!i.base_reg)
7400 {
7401 i.sib.base = NO_BASE_REGISTER;
7402 i.sib.scale = i.log2_scale_factor;
7403 i.types[op].bitfield.disp8 = 0;
7404 i.types[op].bitfield.disp16 = 0;
7405 i.types[op].bitfield.disp64 = 0;
43083a50 7406 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
6c30d220
L
7407 {
7408 /* Must be 32 bit */
7409 i.types[op].bitfield.disp32 = 1;
7410 i.types[op].bitfield.disp32s = 0;
7411 }
7412 else
7413 {
7414 i.types[op].bitfield.disp32 = 0;
7415 i.types[op].bitfield.disp32s = 1;
7416 }
7417 }
7418 i.sib.index = i.index_reg->reg_num;
7419 if ((i.index_reg->reg_flags & RegRex) != 0)
7420 i.rex |= REX_X;
43234a1e
L
7421 if ((i.index_reg->reg_flags & RegVRex) != 0)
7422 i.vrex |= REX_X;
6c30d220
L
7423 }
7424
29b0f896
AM
7425 default_seg = &ds;
7426
7427 if (i.base_reg == 0)
7428 {
7429 i.rm.mode = 0;
7430 if (!i.disp_operands)
9bb129e8 7431 fake_zero_displacement = 1;
29b0f896
AM
7432 if (i.index_reg == 0)
7433 {
73053c1f
JB
7434 i386_operand_type newdisp;
7435
6c30d220 7436 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 7437 /* Operand is just <disp> */
20f0a1fc 7438 if (flag_code == CODE_64BIT)
29b0f896
AM
7439 {
7440 /* 64bit mode overwrites the 32bit absolute
7441 addressing by RIP relative addressing and
7442 absolute addressing is encoded by one of the
7443 redundant SIB forms. */
7444 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7445 i.sib.base = NO_BASE_REGISTER;
7446 i.sib.index = NO_INDEX_REGISTER;
73053c1f 7447 newdisp = (!i.prefix[ADDR_PREFIX] ? disp32s : disp32);
20f0a1fc 7448 }
fc225355
L
7449 else if ((flag_code == CODE_16BIT)
7450 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
7451 {
7452 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 7453 newdisp = disp16;
20f0a1fc
NC
7454 }
7455 else
7456 {
7457 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 7458 newdisp = disp32;
29b0f896 7459 }
73053c1f
JB
7460 i.types[op] = operand_type_and_not (i.types[op], anydisp);
7461 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 7462 }
6c30d220 7463 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 7464 {
6c30d220 7465 /* !i.base_reg && i.index_reg */
e968fc9b 7466 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
7467 i.sib.index = NO_INDEX_REGISTER;
7468 else
7469 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
7470 i.sib.base = NO_BASE_REGISTER;
7471 i.sib.scale = i.log2_scale_factor;
7472 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
7473 i.types[op].bitfield.disp8 = 0;
7474 i.types[op].bitfield.disp16 = 0;
7475 i.types[op].bitfield.disp64 = 0;
43083a50 7476 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
40fb9820
L
7477 {
7478 /* Must be 32 bit */
7479 i.types[op].bitfield.disp32 = 1;
7480 i.types[op].bitfield.disp32s = 0;
7481 }
29b0f896 7482 else
40fb9820
L
7483 {
7484 i.types[op].bitfield.disp32 = 0;
7485 i.types[op].bitfield.disp32s = 1;
7486 }
29b0f896 7487 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 7488 i.rex |= REX_X;
29b0f896
AM
7489 }
7490 }
7491 /* RIP addressing for 64bit mode. */
e968fc9b 7492 else if (i.base_reg->reg_num == RegIP)
29b0f896 7493 {
6c30d220 7494 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 7495 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
7496 i.types[op].bitfield.disp8 = 0;
7497 i.types[op].bitfield.disp16 = 0;
7498 i.types[op].bitfield.disp32 = 0;
7499 i.types[op].bitfield.disp32s = 1;
7500 i.types[op].bitfield.disp64 = 0;
71903a11 7501 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
7502 if (! i.disp_operands)
7503 fake_zero_displacement = 1;
29b0f896 7504 }
dc821c5f 7505 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 7506 {
6c30d220 7507 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
7508 switch (i.base_reg->reg_num)
7509 {
7510 case 3: /* (%bx) */
7511 if (i.index_reg == 0)
7512 i.rm.regmem = 7;
7513 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
7514 i.rm.regmem = i.index_reg->reg_num - 6;
7515 break;
7516 case 5: /* (%bp) */
7517 default_seg = &ss;
7518 if (i.index_reg == 0)
7519 {
7520 i.rm.regmem = 6;
40fb9820 7521 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
7522 {
7523 /* fake (%bp) into 0(%bp) */
b5014f7a 7524 i.types[op].bitfield.disp8 = 1;
252b5132 7525 fake_zero_displacement = 1;
29b0f896
AM
7526 }
7527 }
7528 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
7529 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
7530 break;
7531 default: /* (%si) -> 4 or (%di) -> 5 */
7532 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
7533 }
7534 i.rm.mode = mode_from_disp_size (i.types[op]);
7535 }
7536 else /* i.base_reg and 32/64 bit mode */
7537 {
7538 if (flag_code == CODE_64BIT
40fb9820
L
7539 && operand_type_check (i.types[op], disp))
7540 {
73053c1f
JB
7541 i.types[op].bitfield.disp16 = 0;
7542 i.types[op].bitfield.disp64 = 0;
40fb9820 7543 if (i.prefix[ADDR_PREFIX] == 0)
73053c1f
JB
7544 {
7545 i.types[op].bitfield.disp32 = 0;
7546 i.types[op].bitfield.disp32s = 1;
7547 }
40fb9820 7548 else
73053c1f
JB
7549 {
7550 i.types[op].bitfield.disp32 = 1;
7551 i.types[op].bitfield.disp32s = 0;
7552 }
40fb9820 7553 }
20f0a1fc 7554
6c30d220
L
7555 if (!i.tm.opcode_modifier.vecsib)
7556 i.rm.regmem = i.base_reg->reg_num;
29b0f896 7557 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 7558 i.rex |= REX_B;
29b0f896
AM
7559 i.sib.base = i.base_reg->reg_num;
7560 /* x86-64 ignores REX prefix bit here to avoid decoder
7561 complications. */
848930b2
JB
7562 if (!(i.base_reg->reg_flags & RegRex)
7563 && (i.base_reg->reg_num == EBP_REG_NUM
7564 || i.base_reg->reg_num == ESP_REG_NUM))
29b0f896 7565 default_seg = &ss;
848930b2 7566 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 7567 {
848930b2 7568 fake_zero_displacement = 1;
b5014f7a 7569 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
7570 }
7571 i.sib.scale = i.log2_scale_factor;
7572 if (i.index_reg == 0)
7573 {
6c30d220 7574 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
7575 /* <disp>(%esp) becomes two byte modrm with no index
7576 register. We've already stored the code for esp
7577 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
7578 Any base register besides %esp will not use the
7579 extra modrm byte. */
7580 i.sib.index = NO_INDEX_REGISTER;
29b0f896 7581 }
6c30d220 7582 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 7583 {
e968fc9b 7584 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
7585 i.sib.index = NO_INDEX_REGISTER;
7586 else
7587 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
7588 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7589 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 7590 i.rex |= REX_X;
29b0f896 7591 }
67a4f2b7
AO
7592
7593 if (i.disp_operands
7594 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
7595 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
7596 i.rm.mode = 0;
7597 else
a501d77e
L
7598 {
7599 if (!fake_zero_displacement
7600 && !i.disp_operands
7601 && i.disp_encoding)
7602 {
7603 fake_zero_displacement = 1;
7604 if (i.disp_encoding == disp_encoding_8bit)
7605 i.types[op].bitfield.disp8 = 1;
7606 else
7607 i.types[op].bitfield.disp32 = 1;
7608 }
7609 i.rm.mode = mode_from_disp_size (i.types[op]);
7610 }
29b0f896 7611 }
252b5132 7612
29b0f896
AM
7613 if (fake_zero_displacement)
7614 {
7615 /* Fakes a zero displacement assuming that i.types[op]
7616 holds the correct displacement size. */
7617 expressionS *exp;
7618
9c2799c2 7619 gas_assert (i.op[op].disps == 0);
29b0f896
AM
7620 exp = &disp_expressions[i.disp_operands++];
7621 i.op[op].disps = exp;
7622 exp->X_op = O_constant;
7623 exp->X_add_number = 0;
7624 exp->X_add_symbol = (symbolS *) 0;
7625 exp->X_op_symbol = (symbolS *) 0;
7626 }
c0f3af97
L
7627
7628 mem = op;
29b0f896 7629 }
c0f3af97
L
7630 else
7631 mem = ~0;
252b5132 7632
8c43a48b 7633 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
7634 {
7635 if (operand_type_check (i.types[0], imm))
7636 i.vex.register_specifier = NULL;
7637 else
7638 {
7639 /* VEX.vvvv encodes one of the sources when the first
7640 operand is not an immediate. */
1ef99a7b 7641 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
7642 i.vex.register_specifier = i.op[0].regs;
7643 else
7644 i.vex.register_specifier = i.op[1].regs;
7645 }
7646
7647 /* Destination is a XMM register encoded in the ModRM.reg
7648 and VEX.R bit. */
7649 i.rm.reg = i.op[2].regs->reg_num;
7650 if ((i.op[2].regs->reg_flags & RegRex) != 0)
7651 i.rex |= REX_R;
7652
7653 /* ModRM.rm and VEX.B encodes the other source. */
7654 if (!i.mem_operands)
7655 {
7656 i.rm.mode = 3;
7657
1ef99a7b 7658 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
7659 i.rm.regmem = i.op[1].regs->reg_num;
7660 else
7661 i.rm.regmem = i.op[0].regs->reg_num;
7662
7663 if ((i.op[1].regs->reg_flags & RegRex) != 0)
7664 i.rex |= REX_B;
7665 }
7666 }
2426c15f 7667 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
7668 {
7669 i.vex.register_specifier = i.op[2].regs;
7670 if (!i.mem_operands)
7671 {
7672 i.rm.mode = 3;
7673 i.rm.regmem = i.op[1].regs->reg_num;
7674 if ((i.op[1].regs->reg_flags & RegRex) != 0)
7675 i.rex |= REX_B;
7676 }
7677 }
29b0f896
AM
7678 /* Fill in i.rm.reg or i.rm.regmem field with register operand
7679 (if any) based on i.tm.extension_opcode. Again, we must be
7680 careful to make sure that segment/control/debug/test/MMX
7681 registers are coded into the i.rm.reg field. */
f88c9eb0 7682 else if (i.reg_operands)
29b0f896 7683 {
99018f42 7684 unsigned int op;
7ab9ffdd
L
7685 unsigned int vex_reg = ~0;
7686
7687 for (op = 0; op < i.operands; op++)
b4a3a7b4 7688 {
bab6aec1 7689 if (i.types[op].bitfield.class == Reg
f74a6307
JB
7690 || i.types[op].bitfield.class == RegBND
7691 || i.types[op].bitfield.class == RegMask
00cee14f 7692 || i.types[op].bitfield.class == SReg
4a5c67ed
JB
7693 || i.types[op].bitfield.class == RegCR
7694 || i.types[op].bitfield.class == RegDR
7695 || i.types[op].bitfield.class == RegTR)
b4a3a7b4 7696 break;
3528c362 7697 if (i.types[op].bitfield.class == RegSIMD)
b4a3a7b4
L
7698 {
7699 if (i.types[op].bitfield.zmmword)
7700 i.has_regzmm = TRUE;
7701 else if (i.types[op].bitfield.ymmword)
7702 i.has_regymm = TRUE;
7703 else
7704 i.has_regxmm = TRUE;
7705 break;
7706 }
3528c362 7707 if (i.types[op].bitfield.class == RegMMX)
b4a3a7b4
L
7708 {
7709 i.has_regmmx = TRUE;
7710 break;
7711 }
7712 }
c0209578 7713
7ab9ffdd
L
7714 if (vex_3_sources)
7715 op = dest;
2426c15f 7716 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
7717 {
7718 /* For instructions with VexNDS, the register-only
7719 source operand is encoded in VEX prefix. */
7720 gas_assert (mem != (unsigned int) ~0);
c0f3af97 7721
7ab9ffdd 7722 if (op > mem)
c0f3af97 7723 {
7ab9ffdd
L
7724 vex_reg = op++;
7725 gas_assert (op < i.operands);
c0f3af97
L
7726 }
7727 else
c0f3af97 7728 {
f12dc422
L
7729 /* Check register-only source operand when two source
7730 operands are swapped. */
7731 if (!i.tm.operand_types[op].bitfield.baseindex
7732 && i.tm.operand_types[op + 1].bitfield.baseindex)
7733 {
7734 vex_reg = op;
7735 op += 2;
7736 gas_assert (mem == (vex_reg + 1)
7737 && op < i.operands);
7738 }
7739 else
7740 {
7741 vex_reg = op + 1;
7742 gas_assert (vex_reg < i.operands);
7743 }
c0f3af97 7744 }
7ab9ffdd 7745 }
2426c15f 7746 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 7747 {
f12dc422 7748 /* For instructions with VexNDD, the register destination
7ab9ffdd 7749 is encoded in VEX prefix. */
f12dc422
L
7750 if (i.mem_operands == 0)
7751 {
7752 /* There is no memory operand. */
7753 gas_assert ((op + 2) == i.operands);
7754 vex_reg = op + 1;
7755 }
7756 else
8d63c93e 7757 {
ed438a93
JB
7758 /* There are only 2 non-immediate operands. */
7759 gas_assert (op < i.imm_operands + 2
7760 && i.operands == i.imm_operands + 2);
7761 vex_reg = i.imm_operands + 1;
f12dc422 7762 }
7ab9ffdd
L
7763 }
7764 else
7765 gas_assert (op < i.operands);
99018f42 7766
7ab9ffdd
L
7767 if (vex_reg != (unsigned int) ~0)
7768 {
f12dc422 7769 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 7770
bab6aec1 7771 if ((type->bitfield.class != Reg
dc821c5f 7772 || (!type->bitfield.dword && !type->bitfield.qword))
3528c362 7773 && type->bitfield.class != RegSIMD
43234a1e 7774 && !operand_type_equal (type, &regmask))
7ab9ffdd 7775 abort ();
f88c9eb0 7776
7ab9ffdd
L
7777 i.vex.register_specifier = i.op[vex_reg].regs;
7778 }
7779
1b9f0c97
L
7780 /* Don't set OP operand twice. */
7781 if (vex_reg != op)
7ab9ffdd 7782 {
1b9f0c97
L
7783 /* If there is an extension opcode to put here, the
7784 register number must be put into the regmem field. */
7785 if (i.tm.extension_opcode != None)
7786 {
7787 i.rm.regmem = i.op[op].regs->reg_num;
7788 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7789 i.rex |= REX_B;
43234a1e
L
7790 if ((i.op[op].regs->reg_flags & RegVRex) != 0)
7791 i.vrex |= REX_B;
1b9f0c97
L
7792 }
7793 else
7794 {
7795 i.rm.reg = i.op[op].regs->reg_num;
7796 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7797 i.rex |= REX_R;
43234a1e
L
7798 if ((i.op[op].regs->reg_flags & RegVRex) != 0)
7799 i.vrex |= REX_R;
1b9f0c97 7800 }
7ab9ffdd 7801 }
252b5132 7802
29b0f896
AM
7803 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
7804 must set it to 3 to indicate this is a register operand
7805 in the regmem field. */
7806 if (!i.mem_operands)
7807 i.rm.mode = 3;
7808 }
252b5132 7809
29b0f896 7810 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 7811 if (i.tm.extension_opcode != None)
29b0f896
AM
7812 i.rm.reg = i.tm.extension_opcode;
7813 }
7814 return default_seg;
7815}
252b5132 7816
29b0f896 7817static void
e3bb37b5 7818output_branch (void)
29b0f896
AM
7819{
7820 char *p;
f8a5c266 7821 int size;
29b0f896
AM
7822 int code16;
7823 int prefix;
7824 relax_substateT subtype;
7825 symbolS *sym;
7826 offsetT off;
7827
f8a5c266 7828 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 7829 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
7830
7831 prefix = 0;
7832 if (i.prefix[DATA_PREFIX] != 0)
252b5132 7833 {
29b0f896
AM
7834 prefix = 1;
7835 i.prefixes -= 1;
7836 code16 ^= CODE16;
252b5132 7837 }
29b0f896
AM
7838 /* Pentium4 branch hints. */
7839 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
7840 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 7841 {
29b0f896
AM
7842 prefix++;
7843 i.prefixes--;
7844 }
7845 if (i.prefix[REX_PREFIX] != 0)
7846 {
7847 prefix++;
7848 i.prefixes--;
2f66722d
AM
7849 }
7850
7e8b059b
L
7851 /* BND prefixed jump. */
7852 if (i.prefix[BND_PREFIX] != 0)
7853 {
7854 FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
7855 i.prefixes -= 1;
7856 }
7857
29b0f896
AM
7858 if (i.prefixes != 0 && !intel_syntax)
7859 as_warn (_("skipping prefixes on this instruction"));
7860
7861 /* It's always a symbol; End frag & setup for relax.
7862 Make sure there is enough room in this frag for the largest
7863 instruction we may generate in md_convert_frag. This is 2
7864 bytes for the opcode and room for the prefix and largest
7865 displacement. */
7866 frag_grow (prefix + 2 + 4);
7867 /* Prefix and 1 opcode byte go in fr_fix. */
7868 p = frag_more (prefix + 1);
7869 if (i.prefix[DATA_PREFIX] != 0)
7870 *p++ = DATA_PREFIX_OPCODE;
7871 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
7872 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
7873 *p++ = i.prefix[SEG_PREFIX];
7874 if (i.prefix[REX_PREFIX] != 0)
7875 *p++ = i.prefix[REX_PREFIX];
7876 *p = i.tm.base_opcode;
7877
7878 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 7879 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 7880 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 7881 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 7882 else
f8a5c266 7883 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 7884 subtype |= code16;
3e73aa7c 7885
29b0f896
AM
7886 sym = i.op[0].disps->X_add_symbol;
7887 off = i.op[0].disps->X_add_number;
3e73aa7c 7888
29b0f896
AM
7889 if (i.op[0].disps->X_op != O_constant
7890 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 7891 {
29b0f896
AM
7892 /* Handle complex expressions. */
7893 sym = make_expr_symbol (i.op[0].disps);
7894 off = 0;
7895 }
3e73aa7c 7896
29b0f896
AM
7897 /* 1 possible extra opcode + 4 byte displacement go in var part.
7898 Pass reloc in fr_var. */
d258b828 7899 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 7900}
3e73aa7c 7901
bd7ab16b
L
7902#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7903/* Return TRUE iff PLT32 relocation should be used for branching to
7904 symbol S. */
7905
7906static bfd_boolean
7907need_plt32_p (symbolS *s)
7908{
7909 /* PLT32 relocation is ELF only. */
7910 if (!IS_ELF)
7911 return FALSE;
7912
a5def729
RO
7913#ifdef TE_SOLARIS
7914 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
7915 krtld support it. */
7916 return FALSE;
7917#endif
7918
bd7ab16b
L
7919 /* Since there is no need to prepare for PLT branch on x86-64, we
7920 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
7921 be used as a marker for 32-bit PC-relative branches. */
7922 if (!object_64bit)
7923 return FALSE;
7924
7925 /* Weak or undefined symbol need PLT32 relocation. */
7926 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
7927 return TRUE;
7928
7929 /* Non-global symbol doesn't need PLT32 relocation. */
7930 if (! S_IS_EXTERNAL (s))
7931 return FALSE;
7932
7933 /* Other global symbols need PLT32 relocation. NB: Symbol with
7934 non-default visibilities are treated as normal global symbol
7935 so that PLT32 relocation can be used as a marker for 32-bit
7936 PC-relative branches. It is useful for linker relaxation. */
7937 return TRUE;
7938}
7939#endif
7940
29b0f896 7941static void
e3bb37b5 7942output_jump (void)
29b0f896
AM
7943{
7944 char *p;
7945 int size;
3e02c1cc 7946 fixS *fixP;
bd7ab16b 7947 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 7948
40fb9820 7949 if (i.tm.opcode_modifier.jumpbyte)
29b0f896
AM
7950 {
7951 /* This is a loop or jecxz type instruction. */
7952 size = 1;
7953 if (i.prefix[ADDR_PREFIX] != 0)
7954 {
7955 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
7956 i.prefixes -= 1;
7957 }
7958 /* Pentium4 branch hints. */
7959 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
7960 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
7961 {
7962 FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
7963 i.prefixes--;
3e73aa7c
JH
7964 }
7965 }
29b0f896
AM
7966 else
7967 {
7968 int code16;
3e73aa7c 7969
29b0f896
AM
7970 code16 = 0;
7971 if (flag_code == CODE_16BIT)
7972 code16 = CODE16;
3e73aa7c 7973
29b0f896
AM
7974 if (i.prefix[DATA_PREFIX] != 0)
7975 {
7976 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
7977 i.prefixes -= 1;
7978 code16 ^= CODE16;
7979 }
252b5132 7980
29b0f896
AM
7981 size = 4;
7982 if (code16)
7983 size = 2;
7984 }
9fcc94b6 7985
29b0f896
AM
7986 if (i.prefix[REX_PREFIX] != 0)
7987 {
7988 FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
7989 i.prefixes -= 1;
7990 }
252b5132 7991
7e8b059b
L
7992 /* BND prefixed jump. */
7993 if (i.prefix[BND_PREFIX] != 0)
7994 {
7995 FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
7996 i.prefixes -= 1;
7997 }
7998
29b0f896
AM
7999 if (i.prefixes != 0 && !intel_syntax)
8000 as_warn (_("skipping prefixes on this instruction"));
e0890092 8001
42164a71
L
8002 p = frag_more (i.tm.opcode_length + size);
8003 switch (i.tm.opcode_length)
8004 {
8005 case 2:
8006 *p++ = i.tm.base_opcode >> 8;
1a0670f3 8007 /* Fall through. */
42164a71
L
8008 case 1:
8009 *p++ = i.tm.base_opcode;
8010 break;
8011 default:
8012 abort ();
8013 }
e0890092 8014
bd7ab16b
L
8015#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8016 if (size == 4
8017 && jump_reloc == NO_RELOC
8018 && need_plt32_p (i.op[0].disps->X_add_symbol))
8019 jump_reloc = BFD_RELOC_X86_64_PLT32;
8020#endif
8021
8022 jump_reloc = reloc (size, 1, 1, jump_reloc);
8023
3e02c1cc 8024 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 8025 i.op[0].disps, 1, jump_reloc);
3e02c1cc
AM
8026
8027 /* All jumps handled here are signed, but don't use a signed limit
8028 check for 32 and 16 bit jumps as we want to allow wrap around at
8029 4G and 64k respectively. */
8030 if (size == 1)
8031 fixP->fx_signed = 1;
29b0f896 8032}
e0890092 8033
29b0f896 8034static void
e3bb37b5 8035output_interseg_jump (void)
29b0f896
AM
8036{
8037 char *p;
8038 int size;
8039 int prefix;
8040 int code16;
252b5132 8041
29b0f896
AM
8042 code16 = 0;
8043 if (flag_code == CODE_16BIT)
8044 code16 = CODE16;
a217f122 8045
29b0f896
AM
8046 prefix = 0;
8047 if (i.prefix[DATA_PREFIX] != 0)
8048 {
8049 prefix = 1;
8050 i.prefixes -= 1;
8051 code16 ^= CODE16;
8052 }
8053 if (i.prefix[REX_PREFIX] != 0)
8054 {
8055 prefix++;
8056 i.prefixes -= 1;
8057 }
252b5132 8058
29b0f896
AM
8059 size = 4;
8060 if (code16)
8061 size = 2;
252b5132 8062
29b0f896
AM
8063 if (i.prefixes != 0 && !intel_syntax)
8064 as_warn (_("skipping prefixes on this instruction"));
252b5132 8065
29b0f896
AM
8066 /* 1 opcode; 2 segment; offset */
8067 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 8068
29b0f896
AM
8069 if (i.prefix[DATA_PREFIX] != 0)
8070 *p++ = DATA_PREFIX_OPCODE;
252b5132 8071
29b0f896
AM
8072 if (i.prefix[REX_PREFIX] != 0)
8073 *p++ = i.prefix[REX_PREFIX];
252b5132 8074
29b0f896
AM
8075 *p++ = i.tm.base_opcode;
8076 if (i.op[1].imms->X_op == O_constant)
8077 {
8078 offsetT n = i.op[1].imms->X_add_number;
252b5132 8079
29b0f896
AM
8080 if (size == 2
8081 && !fits_in_unsigned_word (n)
8082 && !fits_in_signed_word (n))
8083 {
8084 as_bad (_("16-bit jump out of range"));
8085 return;
8086 }
8087 md_number_to_chars (p, n, size);
8088 }
8089 else
8090 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 8091 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
29b0f896
AM
8092 if (i.op[0].imms->X_op != O_constant)
8093 as_bad (_("can't handle non absolute segment in `%s'"),
8094 i.tm.name);
8095 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
8096}
a217f122 8097
b4a3a7b4
L
8098#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8099void
8100x86_cleanup (void)
8101{
8102 char *p;
8103 asection *seg = now_seg;
8104 subsegT subseg = now_subseg;
8105 asection *sec;
8106 unsigned int alignment, align_size_1;
8107 unsigned int isa_1_descsz, feature_2_descsz, descsz;
8108 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
8109 unsigned int padding;
8110
8111 if (!IS_ELF || !x86_used_note)
8112 return;
8113
b4a3a7b4
L
8114 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
8115
8116 /* The .note.gnu.property section layout:
8117
8118 Field Length Contents
8119 ---- ---- ----
8120 n_namsz 4 4
8121 n_descsz 4 The note descriptor size
8122 n_type 4 NT_GNU_PROPERTY_TYPE_0
8123 n_name 4 "GNU"
8124 n_desc n_descsz The program property array
8125 .... .... ....
8126 */
8127
8128 /* Create the .note.gnu.property section. */
8129 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 8130 bfd_set_section_flags (sec,
b4a3a7b4
L
8131 (SEC_ALLOC
8132 | SEC_LOAD
8133 | SEC_DATA
8134 | SEC_HAS_CONTENTS
8135 | SEC_READONLY));
8136
8137 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
8138 {
8139 align_size_1 = 7;
8140 alignment = 3;
8141 }
8142 else
8143 {
8144 align_size_1 = 3;
8145 alignment = 2;
8146 }
8147
fd361982 8148 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
8149 elf_section_type (sec) = SHT_NOTE;
8150
8151 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
8152 + 4-byte data */
8153 isa_1_descsz_raw = 4 + 4 + 4;
8154 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
8155 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
8156
8157 feature_2_descsz_raw = isa_1_descsz;
8158 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
8159 + 4-byte data */
8160 feature_2_descsz_raw += 4 + 4 + 4;
8161 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
8162 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
8163 & ~align_size_1);
8164
8165 descsz = feature_2_descsz;
8166 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
8167 p = frag_more (4 + 4 + 4 + 4 + descsz);
8168
8169 /* Write n_namsz. */
8170 md_number_to_chars (p, (valueT) 4, 4);
8171
8172 /* Write n_descsz. */
8173 md_number_to_chars (p + 4, (valueT) descsz, 4);
8174
8175 /* Write n_type. */
8176 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
8177
8178 /* Write n_name. */
8179 memcpy (p + 4 * 3, "GNU", 4);
8180
8181 /* Write 4-byte type. */
8182 md_number_to_chars (p + 4 * 4,
8183 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
8184
8185 /* Write 4-byte data size. */
8186 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
8187
8188 /* Write 4-byte data. */
8189 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
8190
8191 /* Zero out paddings. */
8192 padding = isa_1_descsz - isa_1_descsz_raw;
8193 if (padding)
8194 memset (p + 4 * 7, 0, padding);
8195
8196 /* Write 4-byte type. */
8197 md_number_to_chars (p + isa_1_descsz + 4 * 4,
8198 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
8199
8200 /* Write 4-byte data size. */
8201 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
8202
8203 /* Write 4-byte data. */
8204 md_number_to_chars (p + isa_1_descsz + 4 * 6,
8205 (valueT) x86_feature_2_used, 4);
8206
8207 /* Zero out paddings. */
8208 padding = feature_2_descsz - feature_2_descsz_raw;
8209 if (padding)
8210 memset (p + isa_1_descsz + 4 * 7, 0, padding);
8211
8212 /* We probably can't restore the current segment, for there likely
8213 isn't one yet... */
8214 if (seg && subseg)
8215 subseg_set (seg, subseg);
8216}
8217#endif
8218
9c33702b
JB
8219static unsigned int
8220encoding_length (const fragS *start_frag, offsetT start_off,
8221 const char *frag_now_ptr)
8222{
8223 unsigned int len = 0;
8224
8225 if (start_frag != frag_now)
8226 {
8227 const fragS *fr = start_frag;
8228
8229 do {
8230 len += fr->fr_fix;
8231 fr = fr->fr_next;
8232 } while (fr && fr != frag_now);
8233 }
8234
8235 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
8236}
8237
29b0f896 8238static void
e3bb37b5 8239output_insn (void)
29b0f896 8240{
2bbd9c25
JJ
8241 fragS *insn_start_frag;
8242 offsetT insn_start_off;
8243
b4a3a7b4
L
8244#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8245 if (IS_ELF && x86_used_note)
8246 {
8247 if (i.tm.cpu_flags.bitfield.cpucmov)
8248 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_CMOV;
8249 if (i.tm.cpu_flags.bitfield.cpusse)
8250 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE;
8251 if (i.tm.cpu_flags.bitfield.cpusse2)
8252 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE2;
8253 if (i.tm.cpu_flags.bitfield.cpusse3)
8254 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE3;
8255 if (i.tm.cpu_flags.bitfield.cpussse3)
8256 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSSE3;
8257 if (i.tm.cpu_flags.bitfield.cpusse4_1)
8258 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_1;
8259 if (i.tm.cpu_flags.bitfield.cpusse4_2)
8260 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_2;
8261 if (i.tm.cpu_flags.bitfield.cpuavx)
8262 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX;
8263 if (i.tm.cpu_flags.bitfield.cpuavx2)
8264 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX2;
8265 if (i.tm.cpu_flags.bitfield.cpufma)
8266 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_FMA;
8267 if (i.tm.cpu_flags.bitfield.cpuavx512f)
8268 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512F;
8269 if (i.tm.cpu_flags.bitfield.cpuavx512cd)
8270 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512CD;
8271 if (i.tm.cpu_flags.bitfield.cpuavx512er)
8272 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512ER;
8273 if (i.tm.cpu_flags.bitfield.cpuavx512pf)
8274 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512PF;
8275 if (i.tm.cpu_flags.bitfield.cpuavx512vl)
8276 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512VL;
8277 if (i.tm.cpu_flags.bitfield.cpuavx512dq)
8278 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512DQ;
8279 if (i.tm.cpu_flags.bitfield.cpuavx512bw)
8280 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512BW;
8281 if (i.tm.cpu_flags.bitfield.cpuavx512_4fmaps)
8282 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS;
8283 if (i.tm.cpu_flags.bitfield.cpuavx512_4vnniw)
8284 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW;
8285 if (i.tm.cpu_flags.bitfield.cpuavx512_bitalg)
8286 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BITALG;
8287 if (i.tm.cpu_flags.bitfield.cpuavx512ifma)
8288 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_IFMA;
8289 if (i.tm.cpu_flags.bitfield.cpuavx512vbmi)
8290 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI;
8291 if (i.tm.cpu_flags.bitfield.cpuavx512_vbmi2)
8292 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2;
8293 if (i.tm.cpu_flags.bitfield.cpuavx512_vnni)
8294 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VNNI;
462cac58
L
8295 if (i.tm.cpu_flags.bitfield.cpuavx512_bf16)
8296 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BF16;
b4a3a7b4
L
8297
8298 if (i.tm.cpu_flags.bitfield.cpu8087
8299 || i.tm.cpu_flags.bitfield.cpu287
8300 || i.tm.cpu_flags.bitfield.cpu387
8301 || i.tm.cpu_flags.bitfield.cpu687
8302 || i.tm.cpu_flags.bitfield.cpufisttp)
8303 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
8304 /* Don't set GNU_PROPERTY_X86_FEATURE_2_MMX for prefetchtXXX nor
8305 Xfence instructions. */
8306 if (i.tm.base_opcode != 0xf18
8307 && i.tm.base_opcode != 0xf0d
c3949f43 8308 && i.tm.base_opcode != 0xfaef8
b4a3a7b4
L
8309 && (i.has_regmmx
8310 || i.tm.cpu_flags.bitfield.cpummx
8311 || i.tm.cpu_flags.bitfield.cpua3dnow
8312 || i.tm.cpu_flags.bitfield.cpua3dnowa))
8313 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
8314 if (i.has_regxmm)
8315 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
8316 if (i.has_regymm)
8317 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
8318 if (i.has_regzmm)
8319 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
8320 if (i.tm.cpu_flags.bitfield.cpufxsr)
8321 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
8322 if (i.tm.cpu_flags.bitfield.cpuxsave)
8323 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
8324 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
8325 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
8326 if (i.tm.cpu_flags.bitfield.cpuxsavec)
8327 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
8328 }
8329#endif
8330
29b0f896
AM
8331 /* Tie dwarf2 debug info to the address at the start of the insn.
8332 We can't do this after the insn has been output as the current
8333 frag may have been closed off. eg. by frag_var. */
8334 dwarf2_emit_insn (0);
8335
2bbd9c25
JJ
8336 insn_start_frag = frag_now;
8337 insn_start_off = frag_now_fix ();
8338
29b0f896 8339 /* Output jumps. */
40fb9820 8340 if (i.tm.opcode_modifier.jump)
29b0f896 8341 output_branch ();
40fb9820
L
8342 else if (i.tm.opcode_modifier.jumpbyte
8343 || i.tm.opcode_modifier.jumpdword)
29b0f896 8344 output_jump ();
40fb9820 8345 else if (i.tm.opcode_modifier.jumpintersegment)
29b0f896
AM
8346 output_interseg_jump ();
8347 else
8348 {
8349 /* Output normal instructions here. */
8350 char *p;
8351 unsigned char *q;
47465058 8352 unsigned int j;
331d2d0d 8353 unsigned int prefix;
4dffcebc 8354
e4e00185 8355 if (avoid_fence
c3949f43
JB
8356 && (i.tm.base_opcode == 0xfaee8
8357 || i.tm.base_opcode == 0xfaef0
8358 || i.tm.base_opcode == 0xfaef8))
e4e00185
AS
8359 {
8360 /* Encode lfence, mfence, and sfence as
8361 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
8362 offsetT val = 0x240483f0ULL;
8363 p = frag_more (5);
8364 md_number_to_chars (p, val, 5);
8365 return;
8366 }
8367
d022bddd
IT
8368 /* Some processors fail on LOCK prefix. This options makes
8369 assembler ignore LOCK prefix and serves as a workaround. */
8370 if (omit_lock_prefix)
8371 {
8372 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE)
8373 return;
8374 i.prefix[LOCK_PREFIX] = 0;
8375 }
8376
43234a1e
L
8377 /* Since the VEX/EVEX prefix contains the implicit prefix, we
8378 don't need the explicit prefix. */
8379 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 8380 {
c0f3af97 8381 switch (i.tm.opcode_length)
bc4bd9ab 8382 {
c0f3af97
L
8383 case 3:
8384 if (i.tm.base_opcode & 0xff000000)
4dffcebc 8385 {
c0f3af97 8386 prefix = (i.tm.base_opcode >> 24) & 0xff;
c3949f43
JB
8387 if (!i.tm.cpu_flags.bitfield.cpupadlock
8388 || prefix != REPE_PREFIX_OPCODE
8389 || (i.prefix[REP_PREFIX] != REPE_PREFIX_OPCODE))
8390 add_prefix (prefix);
c0f3af97
L
8391 }
8392 break;
8393 case 2:
8394 if ((i.tm.base_opcode & 0xff0000) != 0)
8395 {
8396 prefix = (i.tm.base_opcode >> 16) & 0xff;
c3949f43 8397 add_prefix (prefix);
4dffcebc 8398 }
c0f3af97
L
8399 break;
8400 case 1:
8401 break;
390c91cf
L
8402 case 0:
8403 /* Check for pseudo prefixes. */
8404 as_bad_where (insn_start_frag->fr_file,
8405 insn_start_frag->fr_line,
8406 _("pseudo prefix without instruction"));
8407 return;
c0f3af97
L
8408 default:
8409 abort ();
bc4bd9ab 8410 }
c0f3af97 8411
6d19a37a 8412#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
8413 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
8414 R_X86_64_GOTTPOFF relocation so that linker can safely
8415 perform IE->LE optimization. */
8416 if (x86_elf_abi == X86_64_X32_ABI
8417 && i.operands == 2
8418 && i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
8419 && i.prefix[REX_PREFIX] == 0)
8420 add_prefix (REX_OPCODE);
6d19a37a 8421#endif
cf61b747 8422
c0f3af97
L
8423 /* The prefix bytes. */
8424 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
8425 if (*q)
8426 FRAG_APPEND_1_CHAR (*q);
0f10071e 8427 }
ae5c1c7b 8428 else
c0f3af97
L
8429 {
8430 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
8431 if (*q)
8432 switch (j)
8433 {
8434 case REX_PREFIX:
8435 /* REX byte is encoded in VEX prefix. */
8436 break;
8437 case SEG_PREFIX:
8438 case ADDR_PREFIX:
8439 FRAG_APPEND_1_CHAR (*q);
8440 break;
8441 default:
8442 /* There should be no other prefixes for instructions
8443 with VEX prefix. */
8444 abort ();
8445 }
8446
43234a1e
L
8447 /* For EVEX instructions i.vrex should become 0 after
8448 build_evex_prefix. For VEX instructions upper 16 registers
8449 aren't available, so VREX should be 0. */
8450 if (i.vrex)
8451 abort ();
c0f3af97
L
8452 /* Now the VEX prefix. */
8453 p = frag_more (i.vex.length);
8454 for (j = 0; j < i.vex.length; j++)
8455 p[j] = i.vex.bytes[j];
8456 }
252b5132 8457
29b0f896 8458 /* Now the opcode; be careful about word order here! */
4dffcebc 8459 if (i.tm.opcode_length == 1)
29b0f896
AM
8460 {
8461 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
8462 }
8463 else
8464 {
4dffcebc 8465 switch (i.tm.opcode_length)
331d2d0d 8466 {
43234a1e
L
8467 case 4:
8468 p = frag_more (4);
8469 *p++ = (i.tm.base_opcode >> 24) & 0xff;
8470 *p++ = (i.tm.base_opcode >> 16) & 0xff;
8471 break;
4dffcebc 8472 case 3:
331d2d0d
L
8473 p = frag_more (3);
8474 *p++ = (i.tm.base_opcode >> 16) & 0xff;
4dffcebc
L
8475 break;
8476 case 2:
8477 p = frag_more (2);
8478 break;
8479 default:
8480 abort ();
8481 break;
331d2d0d 8482 }
0f10071e 8483
29b0f896
AM
8484 /* Put out high byte first: can't use md_number_to_chars! */
8485 *p++ = (i.tm.base_opcode >> 8) & 0xff;
8486 *p = i.tm.base_opcode & 0xff;
8487 }
3e73aa7c 8488
29b0f896 8489 /* Now the modrm byte and sib byte (if present). */
40fb9820 8490 if (i.tm.opcode_modifier.modrm)
29b0f896 8491 {
4a3523fa
L
8492 FRAG_APPEND_1_CHAR ((i.rm.regmem << 0
8493 | i.rm.reg << 3
8494 | i.rm.mode << 6));
29b0f896
AM
8495 /* If i.rm.regmem == ESP (4)
8496 && i.rm.mode != (Register mode)
8497 && not 16 bit
8498 ==> need second modrm byte. */
8499 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
8500 && i.rm.mode != 3
dc821c5f 8501 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
4a3523fa
L
8502 FRAG_APPEND_1_CHAR ((i.sib.base << 0
8503 | i.sib.index << 3
8504 | i.sib.scale << 6));
29b0f896 8505 }
3e73aa7c 8506
29b0f896 8507 if (i.disp_operands)
2bbd9c25 8508 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 8509
29b0f896 8510 if (i.imm_operands)
2bbd9c25 8511 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
8512
8513 /*
8514 * frag_now_fix () returning plain abs_section_offset when we're in the
8515 * absolute section, and abs_section_offset not getting updated as data
8516 * gets added to the frag breaks the logic below.
8517 */
8518 if (now_seg != absolute_section)
8519 {
8520 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
8521 if (j > 15)
8522 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
8523 j);
8524 }
29b0f896 8525 }
252b5132 8526
29b0f896
AM
8527#ifdef DEBUG386
8528 if (flag_debug)
8529 {
7b81dfbb 8530 pi ("" /*line*/, &i);
29b0f896
AM
8531 }
8532#endif /* DEBUG386 */
8533}
252b5132 8534
e205caa7
L
8535/* Return the size of the displacement operand N. */
8536
8537static int
8538disp_size (unsigned int n)
8539{
8540 int size = 4;
43234a1e 8541
b5014f7a 8542 if (i.types[n].bitfield.disp64)
40fb9820
L
8543 size = 8;
8544 else if (i.types[n].bitfield.disp8)
8545 size = 1;
8546 else if (i.types[n].bitfield.disp16)
8547 size = 2;
e205caa7
L
8548 return size;
8549}
8550
8551/* Return the size of the immediate operand N. */
8552
8553static int
8554imm_size (unsigned int n)
8555{
8556 int size = 4;
40fb9820
L
8557 if (i.types[n].bitfield.imm64)
8558 size = 8;
8559 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
8560 size = 1;
8561 else if (i.types[n].bitfield.imm16)
8562 size = 2;
e205caa7
L
8563 return size;
8564}
8565
29b0f896 8566static void
64e74474 8567output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
8568{
8569 char *p;
8570 unsigned int n;
252b5132 8571
29b0f896
AM
8572 for (n = 0; n < i.operands; n++)
8573 {
b5014f7a 8574 if (operand_type_check (i.types[n], disp))
29b0f896
AM
8575 {
8576 if (i.op[n].disps->X_op == O_constant)
8577 {
e205caa7 8578 int size = disp_size (n);
43234a1e 8579 offsetT val = i.op[n].disps->X_add_number;
252b5132 8580
629cfaf1
JB
8581 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
8582 size);
29b0f896
AM
8583 p = frag_more (size);
8584 md_number_to_chars (p, val, size);
8585 }
8586 else
8587 {
f86103b7 8588 enum bfd_reloc_code_real reloc_type;
e205caa7 8589 int size = disp_size (n);
40fb9820 8590 int sign = i.types[n].bitfield.disp32s;
29b0f896 8591 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 8592 fixS *fixP;
29b0f896 8593
e205caa7 8594 /* We can't have 8 bit displacement here. */
9c2799c2 8595 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 8596
29b0f896
AM
8597 /* The PC relative address is computed relative
8598 to the instruction boundary, so in case immediate
8599 fields follows, we need to adjust the value. */
8600 if (pcrel && i.imm_operands)
8601 {
29b0f896 8602 unsigned int n1;
e205caa7 8603 int sz = 0;
252b5132 8604
29b0f896 8605 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 8606 if (operand_type_check (i.types[n1], imm))
252b5132 8607 {
e205caa7
L
8608 /* Only one immediate is allowed for PC
8609 relative address. */
9c2799c2 8610 gas_assert (sz == 0);
e205caa7
L
8611 sz = imm_size (n1);
8612 i.op[n].disps->X_add_number -= sz;
252b5132 8613 }
29b0f896 8614 /* We should find the immediate. */
9c2799c2 8615 gas_assert (sz != 0);
29b0f896 8616 }
520dc8e8 8617
29b0f896 8618 p = frag_more (size);
d258b828 8619 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 8620 if (GOT_symbol
2bbd9c25 8621 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 8622 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
8623 || reloc_type == BFD_RELOC_X86_64_32S
8624 || (reloc_type == BFD_RELOC_64
8625 && object_64bit))
d6ab8113
JB
8626 && (i.op[n].disps->X_op == O_symbol
8627 || (i.op[n].disps->X_op == O_add
8628 && ((symbol_get_value_expression
8629 (i.op[n].disps->X_op_symbol)->X_op)
8630 == O_subtract))))
8631 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 8632 {
4fa24527 8633 if (!object_64bit)
7b81dfbb
AJ
8634 {
8635 reloc_type = BFD_RELOC_386_GOTPC;
d583596c
JB
8636 i.op[n].imms->X_add_number +=
8637 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
8638 }
8639 else if (reloc_type == BFD_RELOC_64)
8640 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 8641 else
7b81dfbb
AJ
8642 /* Don't do the adjustment for x86-64, as there
8643 the pcrel addressing is relative to the _next_
8644 insn, and that is taken care of in other code. */
d6ab8113 8645 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 8646 }
02a86693
L
8647 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
8648 size, i.op[n].disps, pcrel,
8649 reloc_type);
8650 /* Check for "call/jmp *mem", "mov mem, %reg",
8651 "test %reg, mem" and "binop mem, %reg" where binop
8652 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
8653 instructions without data prefix. Always generate
8654 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
8655 if (i.prefix[DATA_PREFIX] == 0
8656 && (generate_relax_relocations
8657 || (!object_64bit
8658 && i.rm.mode == 0
8659 && i.rm.regmem == 5))
0cb4071e
L
8660 && (i.rm.mode == 2
8661 || (i.rm.mode == 0 && i.rm.regmem == 5))
02a86693
L
8662 && ((i.operands == 1
8663 && i.tm.base_opcode == 0xff
8664 && (i.rm.reg == 2 || i.rm.reg == 4))
8665 || (i.operands == 2
8666 && (i.tm.base_opcode == 0x8b
8667 || i.tm.base_opcode == 0x85
8668 || (i.tm.base_opcode & 0xc7) == 0x03))))
8669 {
8670 if (object_64bit)
8671 {
8672 fixP->fx_tcbit = i.rex != 0;
8673 if (i.base_reg
e968fc9b 8674 && (i.base_reg->reg_num == RegIP))
02a86693
L
8675 fixP->fx_tcbit2 = 1;
8676 }
8677 else
8678 fixP->fx_tcbit2 = 1;
8679 }
29b0f896
AM
8680 }
8681 }
8682 }
8683}
252b5132 8684
29b0f896 8685static void
64e74474 8686output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
8687{
8688 char *p;
8689 unsigned int n;
252b5132 8690
29b0f896
AM
8691 for (n = 0; n < i.operands; n++)
8692 {
43234a1e
L
8693 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
8694 if (i.rounding && (int) n == i.rounding->operand)
8695 continue;
8696
40fb9820 8697 if (operand_type_check (i.types[n], imm))
29b0f896
AM
8698 {
8699 if (i.op[n].imms->X_op == O_constant)
8700 {
e205caa7 8701 int size = imm_size (n);
29b0f896 8702 offsetT val;
b4cac588 8703
29b0f896
AM
8704 val = offset_in_range (i.op[n].imms->X_add_number,
8705 size);
8706 p = frag_more (size);
8707 md_number_to_chars (p, val, size);
8708 }
8709 else
8710 {
8711 /* Not absolute_section.
8712 Need a 32-bit fixup (don't support 8bit
8713 non-absolute imms). Try to support other
8714 sizes ... */
f86103b7 8715 enum bfd_reloc_code_real reloc_type;
e205caa7
L
8716 int size = imm_size (n);
8717 int sign;
29b0f896 8718
40fb9820 8719 if (i.types[n].bitfield.imm32s
a7d61044 8720 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 8721 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 8722 sign = 1;
e205caa7
L
8723 else
8724 sign = 0;
520dc8e8 8725
29b0f896 8726 p = frag_more (size);
d258b828 8727 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 8728
2bbd9c25
JJ
8729 /* This is tough to explain. We end up with this one if we
8730 * have operands that look like
8731 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
8732 * obtain the absolute address of the GOT, and it is strongly
8733 * preferable from a performance point of view to avoid using
8734 * a runtime relocation for this. The actual sequence of
8735 * instructions often look something like:
8736 *
8737 * call .L66
8738 * .L66:
8739 * popl %ebx
8740 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
8741 *
8742 * The call and pop essentially return the absolute address
8743 * of the label .L66 and store it in %ebx. The linker itself
8744 * will ultimately change the first operand of the addl so
8745 * that %ebx points to the GOT, but to keep things simple, the
8746 * .o file must have this operand set so that it generates not
8747 * the absolute address of .L66, but the absolute address of
8748 * itself. This allows the linker itself simply treat a GOTPC
8749 * relocation as asking for a pcrel offset to the GOT to be
8750 * added in, and the addend of the relocation is stored in the
8751 * operand field for the instruction itself.
8752 *
8753 * Our job here is to fix the operand so that it would add
8754 * the correct offset so that %ebx would point to itself. The
8755 * thing that is tricky is that .-.L66 will point to the
8756 * beginning of the instruction, so we need to further modify
8757 * the operand so that it will point to itself. There are
8758 * other cases where you have something like:
8759 *
8760 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
8761 *
8762 * and here no correction would be required. Internally in
8763 * the assembler we treat operands of this form as not being
8764 * pcrel since the '.' is explicitly mentioned, and I wonder
8765 * whether it would simplify matters to do it this way. Who
8766 * knows. In earlier versions of the PIC patches, the
8767 * pcrel_adjust field was used to store the correction, but
8768 * since the expression is not pcrel, I felt it would be
8769 * confusing to do it this way. */
8770
d6ab8113 8771 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
8772 || reloc_type == BFD_RELOC_X86_64_32S
8773 || reloc_type == BFD_RELOC_64)
29b0f896
AM
8774 && GOT_symbol
8775 && GOT_symbol == i.op[n].imms->X_add_symbol
8776 && (i.op[n].imms->X_op == O_symbol
8777 || (i.op[n].imms->X_op == O_add
8778 && ((symbol_get_value_expression
8779 (i.op[n].imms->X_op_symbol)->X_op)
8780 == O_subtract))))
8781 {
4fa24527 8782 if (!object_64bit)
d6ab8113 8783 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 8784 else if (size == 4)
d6ab8113 8785 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
8786 else if (size == 8)
8787 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d583596c
JB
8788 i.op[n].imms->X_add_number +=
8789 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 8790 }
29b0f896
AM
8791 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
8792 i.op[n].imms, 0, reloc_type);
8793 }
8794 }
8795 }
252b5132
RH
8796}
8797\f
d182319b
JB
8798/* x86_cons_fix_new is called via the expression parsing code when a
8799 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
8800static int cons_sign = -1;
8801
8802void
e3bb37b5 8803x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 8804 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 8805{
d258b828 8806 r = reloc (len, 0, cons_sign, r);
d182319b
JB
8807
8808#ifdef TE_PE
8809 if (exp->X_op == O_secrel)
8810 {
8811 exp->X_op = O_symbol;
8812 r = BFD_RELOC_32_SECREL;
8813 }
8814#endif
8815
8816 fix_new_exp (frag, off, len, exp, 0, r);
8817}
8818
357d1bd8
L
8819/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
8820 purpose of the `.dc.a' internal pseudo-op. */
8821
8822int
8823x86_address_bytes (void)
8824{
8825 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
8826 return 4;
8827 return stdoutput->arch_info->bits_per_address / 8;
8828}
8829
d382c579
TG
8830#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
8831 || defined (LEX_AT)
d258b828 8832# define lex_got(reloc, adjust, types) NULL
718ddfc0 8833#else
f3c180ae
AM
8834/* Parse operands of the form
8835 <symbol>@GOTOFF+<nnn>
8836 and similar .plt or .got references.
8837
8838 If we find one, set up the correct relocation in RELOC and copy the
8839 input string, minus the `@GOTOFF' into a malloc'd buffer for
8840 parsing by the calling routine. Return this buffer, and if ADJUST
8841 is non-null set it to the length of the string we removed from the
8842 input line. Otherwise return NULL. */
8843static char *
91d6fa6a 8844lex_got (enum bfd_reloc_code_real *rel,
64e74474 8845 int *adjust,
d258b828 8846 i386_operand_type *types)
f3c180ae 8847{
7b81dfbb
AJ
8848 /* Some of the relocations depend on the size of what field is to
8849 be relocated. But in our callers i386_immediate and i386_displacement
8850 we don't yet know the operand size (this will be set by insn
8851 matching). Hence we record the word32 relocation here,
8852 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
8853 static const struct {
8854 const char *str;
cff8d58a 8855 int len;
4fa24527 8856 const enum bfd_reloc_code_real rel[2];
40fb9820 8857 const i386_operand_type types64;
f3c180ae 8858 } gotrel[] = {
8ce3d284 8859#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
8860 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
8861 BFD_RELOC_SIZE32 },
8862 OPERAND_TYPE_IMM32_64 },
8ce3d284 8863#endif
cff8d58a
L
8864 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
8865 BFD_RELOC_X86_64_PLTOFF64 },
40fb9820 8866 OPERAND_TYPE_IMM64 },
cff8d58a
L
8867 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
8868 BFD_RELOC_X86_64_PLT32 },
40fb9820 8869 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8870 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
8871 BFD_RELOC_X86_64_GOTPLT64 },
40fb9820 8872 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
8873 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
8874 BFD_RELOC_X86_64_GOTOFF64 },
40fb9820 8875 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
8876 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
8877 BFD_RELOC_X86_64_GOTPCREL },
40fb9820 8878 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8879 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
8880 BFD_RELOC_X86_64_TLSGD },
40fb9820 8881 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8882 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
8883 _dummy_first_bfd_reloc_code_real },
40fb9820 8884 OPERAND_TYPE_NONE },
cff8d58a
L
8885 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
8886 BFD_RELOC_X86_64_TLSLD },
40fb9820 8887 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8888 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
8889 BFD_RELOC_X86_64_GOTTPOFF },
40fb9820 8890 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8891 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
8892 BFD_RELOC_X86_64_TPOFF32 },
40fb9820 8893 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
8894 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
8895 _dummy_first_bfd_reloc_code_real },
40fb9820 8896 OPERAND_TYPE_NONE },
cff8d58a
L
8897 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
8898 BFD_RELOC_X86_64_DTPOFF32 },
40fb9820 8899 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
8900 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
8901 _dummy_first_bfd_reloc_code_real },
40fb9820 8902 OPERAND_TYPE_NONE },
cff8d58a
L
8903 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
8904 _dummy_first_bfd_reloc_code_real },
40fb9820 8905 OPERAND_TYPE_NONE },
cff8d58a
L
8906 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
8907 BFD_RELOC_X86_64_GOT32 },
40fb9820 8908 OPERAND_TYPE_IMM32_32S_64_DISP32 },
cff8d58a
L
8909 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
8910 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
40fb9820 8911 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8912 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
8913 BFD_RELOC_X86_64_TLSDESC_CALL },
40fb9820 8914 OPERAND_TYPE_IMM32_32S_DISP32 },
f3c180ae
AM
8915 };
8916 char *cp;
8917 unsigned int j;
8918
d382c579 8919#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
8920 if (!IS_ELF)
8921 return NULL;
d382c579 8922#endif
718ddfc0 8923
f3c180ae 8924 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 8925 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
8926 return NULL;
8927
47465058 8928 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 8929 {
cff8d58a 8930 int len = gotrel[j].len;
28f81592 8931 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 8932 {
4fa24527 8933 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 8934 {
28f81592
AM
8935 int first, second;
8936 char *tmpbuf, *past_reloc;
f3c180ae 8937
91d6fa6a 8938 *rel = gotrel[j].rel[object_64bit];
f3c180ae 8939
3956db08
JB
8940 if (types)
8941 {
8942 if (flag_code != CODE_64BIT)
40fb9820
L
8943 {
8944 types->bitfield.imm32 = 1;
8945 types->bitfield.disp32 = 1;
8946 }
3956db08
JB
8947 else
8948 *types = gotrel[j].types64;
8949 }
8950
8fd4256d 8951 if (j != 0 && GOT_symbol == NULL)
f3c180ae
AM
8952 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
8953
28f81592 8954 /* The length of the first part of our input line. */
f3c180ae 8955 first = cp - input_line_pointer;
28f81592
AM
8956
8957 /* The second part goes from after the reloc token until
67c11a9b 8958 (and including) an end_of_line char or comma. */
28f81592 8959 past_reloc = cp + 1 + len;
67c11a9b
AM
8960 cp = past_reloc;
8961 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
8962 ++cp;
8963 second = cp + 1 - past_reloc;
28f81592
AM
8964
8965 /* Allocate and copy string. The trailing NUL shouldn't
8966 be necessary, but be safe. */
add39d23 8967 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 8968 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
8969 if (second != 0 && *past_reloc != ' ')
8970 /* Replace the relocation token with ' ', so that
8971 errors like foo@GOTOFF1 will be detected. */
8972 tmpbuf[first++] = ' ';
af89796a
L
8973 else
8974 /* Increment length by 1 if the relocation token is
8975 removed. */
8976 len++;
8977 if (adjust)
8978 *adjust = len;
0787a12d
AM
8979 memcpy (tmpbuf + first, past_reloc, second);
8980 tmpbuf[first + second] = '\0';
f3c180ae
AM
8981 return tmpbuf;
8982 }
8983
4fa24527
JB
8984 as_bad (_("@%s reloc is not supported with %d-bit output format"),
8985 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
8986 return NULL;
8987 }
8988 }
8989
8990 /* Might be a symbol version string. Don't as_bad here. */
8991 return NULL;
8992}
4e4f7c87 8993#endif
f3c180ae 8994
a988325c
NC
8995#ifdef TE_PE
8996#ifdef lex_got
8997#undef lex_got
8998#endif
8999/* Parse operands of the form
9000 <symbol>@SECREL32+<nnn>
9001
9002 If we find one, set up the correct relocation in RELOC and copy the
9003 input string, minus the `@SECREL32' into a malloc'd buffer for
9004 parsing by the calling routine. Return this buffer, and if ADJUST
9005 is non-null set it to the length of the string we removed from the
34bca508
L
9006 input line. Otherwise return NULL.
9007
a988325c
NC
9008 This function is copied from the ELF version above adjusted for PE targets. */
9009
9010static char *
9011lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
9012 int *adjust ATTRIBUTE_UNUSED,
d258b828 9013 i386_operand_type *types)
a988325c
NC
9014{
9015 static const struct
9016 {
9017 const char *str;
9018 int len;
9019 const enum bfd_reloc_code_real rel[2];
9020 const i386_operand_type types64;
9021 }
9022 gotrel[] =
9023 {
9024 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
9025 BFD_RELOC_32_SECREL },
9026 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
9027 };
9028
9029 char *cp;
9030 unsigned j;
9031
9032 for (cp = input_line_pointer; *cp != '@'; cp++)
9033 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
9034 return NULL;
9035
9036 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
9037 {
9038 int len = gotrel[j].len;
9039
9040 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
9041 {
9042 if (gotrel[j].rel[object_64bit] != 0)
9043 {
9044 int first, second;
9045 char *tmpbuf, *past_reloc;
9046
9047 *rel = gotrel[j].rel[object_64bit];
9048 if (adjust)
9049 *adjust = len;
9050
9051 if (types)
9052 {
9053 if (flag_code != CODE_64BIT)
9054 {
9055 types->bitfield.imm32 = 1;
9056 types->bitfield.disp32 = 1;
9057 }
9058 else
9059 *types = gotrel[j].types64;
9060 }
9061
9062 /* The length of the first part of our input line. */
9063 first = cp - input_line_pointer;
9064
9065 /* The second part goes from after the reloc token until
9066 (and including) an end_of_line char or comma. */
9067 past_reloc = cp + 1 + len;
9068 cp = past_reloc;
9069 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
9070 ++cp;
9071 second = cp + 1 - past_reloc;
9072
9073 /* Allocate and copy string. The trailing NUL shouldn't
9074 be necessary, but be safe. */
add39d23 9075 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
9076 memcpy (tmpbuf, input_line_pointer, first);
9077 if (second != 0 && *past_reloc != ' ')
9078 /* Replace the relocation token with ' ', so that
9079 errors like foo@SECLREL321 will be detected. */
9080 tmpbuf[first++] = ' ';
9081 memcpy (tmpbuf + first, past_reloc, second);
9082 tmpbuf[first + second] = '\0';
9083 return tmpbuf;
9084 }
9085
9086 as_bad (_("@%s reloc is not supported with %d-bit output format"),
9087 gotrel[j].str, 1 << (5 + object_64bit));
9088 return NULL;
9089 }
9090 }
9091
9092 /* Might be a symbol version string. Don't as_bad here. */
9093 return NULL;
9094}
9095
9096#endif /* TE_PE */
9097
62ebcb5c 9098bfd_reloc_code_real_type
e3bb37b5 9099x86_cons (expressionS *exp, int size)
f3c180ae 9100{
62ebcb5c
AM
9101 bfd_reloc_code_real_type got_reloc = NO_RELOC;
9102
ee86248c
JB
9103 intel_syntax = -intel_syntax;
9104
3c7b9c2c 9105 exp->X_md = 0;
4fa24527 9106 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
9107 {
9108 /* Handle @GOTOFF and the like in an expression. */
9109 char *save;
9110 char *gotfree_input_line;
4a57f2cf 9111 int adjust = 0;
f3c180ae
AM
9112
9113 save = input_line_pointer;
d258b828 9114 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
9115 if (gotfree_input_line)
9116 input_line_pointer = gotfree_input_line;
9117
9118 expression (exp);
9119
9120 if (gotfree_input_line)
9121 {
9122 /* expression () has merrily parsed up to the end of line,
9123 or a comma - in the wrong buffer. Transfer how far
9124 input_line_pointer has moved to the right buffer. */
9125 input_line_pointer = (save
9126 + (input_line_pointer - gotfree_input_line)
9127 + adjust);
9128 free (gotfree_input_line);
3992d3b7
AM
9129 if (exp->X_op == O_constant
9130 || exp->X_op == O_absent
9131 || exp->X_op == O_illegal
0398aac5 9132 || exp->X_op == O_register
3992d3b7
AM
9133 || exp->X_op == O_big)
9134 {
9135 char c = *input_line_pointer;
9136 *input_line_pointer = 0;
9137 as_bad (_("missing or invalid expression `%s'"), save);
9138 *input_line_pointer = c;
9139 }
b9519cfe
L
9140 else if ((got_reloc == BFD_RELOC_386_PLT32
9141 || got_reloc == BFD_RELOC_X86_64_PLT32)
9142 && exp->X_op != O_symbol)
9143 {
9144 char c = *input_line_pointer;
9145 *input_line_pointer = 0;
9146 as_bad (_("invalid PLT expression `%s'"), save);
9147 *input_line_pointer = c;
9148 }
f3c180ae
AM
9149 }
9150 }
9151 else
9152 expression (exp);
ee86248c
JB
9153
9154 intel_syntax = -intel_syntax;
9155
9156 if (intel_syntax)
9157 i386_intel_simplify (exp);
62ebcb5c
AM
9158
9159 return got_reloc;
f3c180ae 9160}
f3c180ae 9161
9f32dd5b
L
9162static void
9163signed_cons (int size)
6482c264 9164{
d182319b
JB
9165 if (flag_code == CODE_64BIT)
9166 cons_sign = 1;
9167 cons (size);
9168 cons_sign = -1;
6482c264
NC
9169}
9170
d182319b 9171#ifdef TE_PE
6482c264 9172static void
7016a5d5 9173pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
9174{
9175 expressionS exp;
9176
9177 do
9178 {
9179 expression (&exp);
9180 if (exp.X_op == O_symbol)
9181 exp.X_op = O_secrel;
9182
9183 emit_expr (&exp, 4);
9184 }
9185 while (*input_line_pointer++ == ',');
9186
9187 input_line_pointer--;
9188 demand_empty_rest_of_line ();
9189}
6482c264
NC
9190#endif
9191
43234a1e
L
9192/* Handle Vector operations. */
9193
9194static char *
9195check_VecOperations (char *op_string, char *op_end)
9196{
9197 const reg_entry *mask;
9198 const char *saved;
9199 char *end_op;
9200
9201 while (*op_string
9202 && (op_end == NULL || op_string < op_end))
9203 {
9204 saved = op_string;
9205 if (*op_string == '{')
9206 {
9207 op_string++;
9208
9209 /* Check broadcasts. */
9210 if (strncmp (op_string, "1to", 3) == 0)
9211 {
9212 int bcst_type;
9213
9214 if (i.broadcast)
9215 goto duplicated_vec_op;
9216
9217 op_string += 3;
9218 if (*op_string == '8')
8e6e0792 9219 bcst_type = 8;
b28d1bda 9220 else if (*op_string == '4')
8e6e0792 9221 bcst_type = 4;
b28d1bda 9222 else if (*op_string == '2')
8e6e0792 9223 bcst_type = 2;
43234a1e
L
9224 else if (*op_string == '1'
9225 && *(op_string+1) == '6')
9226 {
8e6e0792 9227 bcst_type = 16;
43234a1e
L
9228 op_string++;
9229 }
9230 else
9231 {
9232 as_bad (_("Unsupported broadcast: `%s'"), saved);
9233 return NULL;
9234 }
9235 op_string++;
9236
9237 broadcast_op.type = bcst_type;
9238 broadcast_op.operand = this_operand;
1f75763a 9239 broadcast_op.bytes = 0;
43234a1e
L
9240 i.broadcast = &broadcast_op;
9241 }
9242 /* Check masking operation. */
9243 else if ((mask = parse_register (op_string, &end_op)) != NULL)
9244 {
9245 /* k0 can't be used for write mask. */
f74a6307 9246 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 9247 {
6d2cd6b2
JB
9248 as_bad (_("`%s%s' can't be used for write mask"),
9249 register_prefix, mask->reg_name);
43234a1e
L
9250 return NULL;
9251 }
9252
9253 if (!i.mask)
9254 {
9255 mask_op.mask = mask;
9256 mask_op.zeroing = 0;
9257 mask_op.operand = this_operand;
9258 i.mask = &mask_op;
9259 }
9260 else
9261 {
9262 if (i.mask->mask)
9263 goto duplicated_vec_op;
9264
9265 i.mask->mask = mask;
9266
9267 /* Only "{z}" is allowed here. No need to check
9268 zeroing mask explicitly. */
9269 if (i.mask->operand != this_operand)
9270 {
9271 as_bad (_("invalid write mask `%s'"), saved);
9272 return NULL;
9273 }
9274 }
9275
9276 op_string = end_op;
9277 }
9278 /* Check zeroing-flag for masking operation. */
9279 else if (*op_string == 'z')
9280 {
9281 if (!i.mask)
9282 {
9283 mask_op.mask = NULL;
9284 mask_op.zeroing = 1;
9285 mask_op.operand = this_operand;
9286 i.mask = &mask_op;
9287 }
9288 else
9289 {
9290 if (i.mask->zeroing)
9291 {
9292 duplicated_vec_op:
9293 as_bad (_("duplicated `%s'"), saved);
9294 return NULL;
9295 }
9296
9297 i.mask->zeroing = 1;
9298
9299 /* Only "{%k}" is allowed here. No need to check mask
9300 register explicitly. */
9301 if (i.mask->operand != this_operand)
9302 {
9303 as_bad (_("invalid zeroing-masking `%s'"),
9304 saved);
9305 return NULL;
9306 }
9307 }
9308
9309 op_string++;
9310 }
9311 else
9312 goto unknown_vec_op;
9313
9314 if (*op_string != '}')
9315 {
9316 as_bad (_("missing `}' in `%s'"), saved);
9317 return NULL;
9318 }
9319 op_string++;
0ba3a731
L
9320
9321 /* Strip whitespace since the addition of pseudo prefixes
9322 changed how the scrubber treats '{'. */
9323 if (is_space_char (*op_string))
9324 ++op_string;
9325
43234a1e
L
9326 continue;
9327 }
9328 unknown_vec_op:
9329 /* We don't know this one. */
9330 as_bad (_("unknown vector operation: `%s'"), saved);
9331 return NULL;
9332 }
9333
6d2cd6b2
JB
9334 if (i.mask && i.mask->zeroing && !i.mask->mask)
9335 {
9336 as_bad (_("zeroing-masking only allowed with write mask"));
9337 return NULL;
9338 }
9339
43234a1e
L
9340 return op_string;
9341}
9342
252b5132 9343static int
70e41ade 9344i386_immediate (char *imm_start)
252b5132
RH
9345{
9346 char *save_input_line_pointer;
f3c180ae 9347 char *gotfree_input_line;
252b5132 9348 segT exp_seg = 0;
47926f60 9349 expressionS *exp;
40fb9820
L
9350 i386_operand_type types;
9351
0dfbf9d7 9352 operand_type_set (&types, ~0);
252b5132
RH
9353
9354 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
9355 {
31b2323c
L
9356 as_bad (_("at most %d immediate operands are allowed"),
9357 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
9358 return 0;
9359 }
9360
9361 exp = &im_expressions[i.imm_operands++];
520dc8e8 9362 i.op[this_operand].imms = exp;
252b5132
RH
9363
9364 if (is_space_char (*imm_start))
9365 ++imm_start;
9366
9367 save_input_line_pointer = input_line_pointer;
9368 input_line_pointer = imm_start;
9369
d258b828 9370 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
9371 if (gotfree_input_line)
9372 input_line_pointer = gotfree_input_line;
252b5132
RH
9373
9374 exp_seg = expression (exp);
9375
83183c0c 9376 SKIP_WHITESPACE ();
43234a1e
L
9377
9378 /* Handle vector operations. */
9379 if (*input_line_pointer == '{')
9380 {
9381 input_line_pointer = check_VecOperations (input_line_pointer,
9382 NULL);
9383 if (input_line_pointer == NULL)
9384 return 0;
9385 }
9386
252b5132 9387 if (*input_line_pointer)
f3c180ae 9388 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
9389
9390 input_line_pointer = save_input_line_pointer;
f3c180ae 9391 if (gotfree_input_line)
ee86248c
JB
9392 {
9393 free (gotfree_input_line);
9394
9395 if (exp->X_op == O_constant || exp->X_op == O_register)
9396 exp->X_op = O_illegal;
9397 }
9398
9399 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
9400}
252b5132 9401
ee86248c
JB
9402static int
9403i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
9404 i386_operand_type types, const char *imm_start)
9405{
9406 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 9407 {
313c53d1
L
9408 if (imm_start)
9409 as_bad (_("missing or invalid immediate expression `%s'"),
9410 imm_start);
3992d3b7 9411 return 0;
252b5132 9412 }
3e73aa7c 9413 else if (exp->X_op == O_constant)
252b5132 9414 {
47926f60 9415 /* Size it properly later. */
40fb9820 9416 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
9417 /* If not 64bit, sign extend val. */
9418 if (flag_code != CODE_64BIT
4eed87de
AM
9419 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
9420 exp->X_add_number
9421 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 9422 }
4c63da97 9423#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 9424 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 9425 && exp_seg != absolute_section
47926f60 9426 && exp_seg != text_section
24eab124
AM
9427 && exp_seg != data_section
9428 && exp_seg != bss_section
9429 && exp_seg != undefined_section
f86103b7 9430 && !bfd_is_com_section (exp_seg))
252b5132 9431 {
d0b47220 9432 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
9433 return 0;
9434 }
9435#endif
a841bdf5 9436 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 9437 {
313c53d1
L
9438 if (imm_start)
9439 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
9440 return 0;
9441 }
252b5132
RH
9442 else
9443 {
9444 /* This is an address. The size of the address will be
24eab124 9445 determined later, depending on destination register,
3e73aa7c 9446 suffix, or the default for the section. */
40fb9820
L
9447 i.types[this_operand].bitfield.imm8 = 1;
9448 i.types[this_operand].bitfield.imm16 = 1;
9449 i.types[this_operand].bitfield.imm32 = 1;
9450 i.types[this_operand].bitfield.imm32s = 1;
9451 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
9452 i.types[this_operand] = operand_type_and (i.types[this_operand],
9453 types);
252b5132
RH
9454 }
9455
9456 return 1;
9457}
9458
551c1ca1 9459static char *
e3bb37b5 9460i386_scale (char *scale)
252b5132 9461{
551c1ca1
AM
9462 offsetT val;
9463 char *save = input_line_pointer;
252b5132 9464
551c1ca1
AM
9465 input_line_pointer = scale;
9466 val = get_absolute_expression ();
9467
9468 switch (val)
252b5132 9469 {
551c1ca1 9470 case 1:
252b5132
RH
9471 i.log2_scale_factor = 0;
9472 break;
551c1ca1 9473 case 2:
252b5132
RH
9474 i.log2_scale_factor = 1;
9475 break;
551c1ca1 9476 case 4:
252b5132
RH
9477 i.log2_scale_factor = 2;
9478 break;
551c1ca1 9479 case 8:
252b5132
RH
9480 i.log2_scale_factor = 3;
9481 break;
9482 default:
a724f0f4
JB
9483 {
9484 char sep = *input_line_pointer;
9485
9486 *input_line_pointer = '\0';
9487 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
9488 scale);
9489 *input_line_pointer = sep;
9490 input_line_pointer = save;
9491 return NULL;
9492 }
252b5132 9493 }
29b0f896 9494 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
9495 {
9496 as_warn (_("scale factor of %d without an index register"),
24eab124 9497 1 << i.log2_scale_factor);
252b5132 9498 i.log2_scale_factor = 0;
252b5132 9499 }
551c1ca1
AM
9500 scale = input_line_pointer;
9501 input_line_pointer = save;
9502 return scale;
252b5132
RH
9503}
9504
252b5132 9505static int
e3bb37b5 9506i386_displacement (char *disp_start, char *disp_end)
252b5132 9507{
29b0f896 9508 expressionS *exp;
252b5132
RH
9509 segT exp_seg = 0;
9510 char *save_input_line_pointer;
f3c180ae 9511 char *gotfree_input_line;
40fb9820
L
9512 int override;
9513 i386_operand_type bigdisp, types = anydisp;
3992d3b7 9514 int ret;
252b5132 9515
31b2323c
L
9516 if (i.disp_operands == MAX_MEMORY_OPERANDS)
9517 {
9518 as_bad (_("at most %d displacement operands are allowed"),
9519 MAX_MEMORY_OPERANDS);
9520 return 0;
9521 }
9522
0dfbf9d7 9523 operand_type_set (&bigdisp, 0);
40fb9820
L
9524 if ((i.types[this_operand].bitfield.jumpabsolute)
9525 || (!current_templates->start->opcode_modifier.jump
9526 && !current_templates->start->opcode_modifier.jumpdword))
e05278af 9527 {
40fb9820 9528 bigdisp.bitfield.disp32 = 1;
e05278af 9529 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
9530 if (flag_code == CODE_64BIT)
9531 {
9532 if (!override)
9533 {
9534 bigdisp.bitfield.disp32s = 1;
9535 bigdisp.bitfield.disp64 = 1;
9536 }
9537 }
9538 else if ((flag_code == CODE_16BIT) ^ override)
9539 {
9540 bigdisp.bitfield.disp32 = 0;
9541 bigdisp.bitfield.disp16 = 1;
9542 }
e05278af
JB
9543 }
9544 else
9545 {
9546 /* For PC-relative branches, the width of the displacement
9547 is dependent upon data size, not address size. */
e05278af 9548 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
9549 if (flag_code == CODE_64BIT)
9550 {
9551 if (override || i.suffix == WORD_MNEM_SUFFIX)
9552 bigdisp.bitfield.disp16 = 1;
9553 else
9554 {
9555 bigdisp.bitfield.disp32 = 1;
9556 bigdisp.bitfield.disp32s = 1;
9557 }
9558 }
9559 else
e05278af
JB
9560 {
9561 if (!override)
9562 override = (i.suffix == (flag_code != CODE_16BIT
9563 ? WORD_MNEM_SUFFIX
9564 : LONG_MNEM_SUFFIX));
40fb9820
L
9565 bigdisp.bitfield.disp32 = 1;
9566 if ((flag_code == CODE_16BIT) ^ override)
9567 {
9568 bigdisp.bitfield.disp32 = 0;
9569 bigdisp.bitfield.disp16 = 1;
9570 }
e05278af 9571 }
e05278af 9572 }
c6fb90c8
L
9573 i.types[this_operand] = operand_type_or (i.types[this_operand],
9574 bigdisp);
252b5132
RH
9575
9576 exp = &disp_expressions[i.disp_operands];
520dc8e8 9577 i.op[this_operand].disps = exp;
252b5132
RH
9578 i.disp_operands++;
9579 save_input_line_pointer = input_line_pointer;
9580 input_line_pointer = disp_start;
9581 END_STRING_AND_SAVE (disp_end);
9582
9583#ifndef GCC_ASM_O_HACK
9584#define GCC_ASM_O_HACK 0
9585#endif
9586#if GCC_ASM_O_HACK
9587 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 9588 if (i.types[this_operand].bitfield.baseIndex
24eab124 9589 && displacement_string_end[-1] == '+')
252b5132
RH
9590 {
9591 /* This hack is to avoid a warning when using the "o"
24eab124
AM
9592 constraint within gcc asm statements.
9593 For instance:
9594
9595 #define _set_tssldt_desc(n,addr,limit,type) \
9596 __asm__ __volatile__ ( \
9597 "movw %w2,%0\n\t" \
9598 "movw %w1,2+%0\n\t" \
9599 "rorl $16,%1\n\t" \
9600 "movb %b1,4+%0\n\t" \
9601 "movb %4,5+%0\n\t" \
9602 "movb $0,6+%0\n\t" \
9603 "movb %h1,7+%0\n\t" \
9604 "rorl $16,%1" \
9605 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
9606
9607 This works great except that the output assembler ends
9608 up looking a bit weird if it turns out that there is
9609 no offset. You end up producing code that looks like:
9610
9611 #APP
9612 movw $235,(%eax)
9613 movw %dx,2+(%eax)
9614 rorl $16,%edx
9615 movb %dl,4+(%eax)
9616 movb $137,5+(%eax)
9617 movb $0,6+(%eax)
9618 movb %dh,7+(%eax)
9619 rorl $16,%edx
9620 #NO_APP
9621
47926f60 9622 So here we provide the missing zero. */
24eab124
AM
9623
9624 *displacement_string_end = '0';
252b5132
RH
9625 }
9626#endif
d258b828 9627 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
9628 if (gotfree_input_line)
9629 input_line_pointer = gotfree_input_line;
252b5132 9630
24eab124 9631 exp_seg = expression (exp);
252b5132 9632
636c26b0
AM
9633 SKIP_WHITESPACE ();
9634 if (*input_line_pointer)
9635 as_bad (_("junk `%s' after expression"), input_line_pointer);
9636#if GCC_ASM_O_HACK
9637 RESTORE_END_STRING (disp_end + 1);
9638#endif
636c26b0 9639 input_line_pointer = save_input_line_pointer;
636c26b0 9640 if (gotfree_input_line)
ee86248c
JB
9641 {
9642 free (gotfree_input_line);
9643
9644 if (exp->X_op == O_constant || exp->X_op == O_register)
9645 exp->X_op = O_illegal;
9646 }
9647
9648 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
9649
9650 RESTORE_END_STRING (disp_end);
9651
9652 return ret;
9653}
9654
9655static int
9656i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
9657 i386_operand_type types, const char *disp_start)
9658{
9659 i386_operand_type bigdisp;
9660 int ret = 1;
636c26b0 9661
24eab124
AM
9662 /* We do this to make sure that the section symbol is in
9663 the symbol table. We will ultimately change the relocation
47926f60 9664 to be relative to the beginning of the section. */
1ae12ab7 9665 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
9666 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
9667 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 9668 {
636c26b0 9669 if (exp->X_op != O_symbol)
3992d3b7 9670 goto inv_disp;
636c26b0 9671
e5cb08ac 9672 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
9673 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
9674 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 9675 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
9676 exp->X_op = O_subtract;
9677 exp->X_op_symbol = GOT_symbol;
1ae12ab7 9678 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 9679 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
9680 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
9681 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 9682 else
29b0f896 9683 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 9684 }
252b5132 9685
3992d3b7
AM
9686 else if (exp->X_op == O_absent
9687 || exp->X_op == O_illegal
ee86248c 9688 || exp->X_op == O_big)
2daf4fd8 9689 {
3992d3b7
AM
9690 inv_disp:
9691 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 9692 disp_start);
3992d3b7 9693 ret = 0;
2daf4fd8
AM
9694 }
9695
0e1147d9
L
9696 else if (flag_code == CODE_64BIT
9697 && !i.prefix[ADDR_PREFIX]
9698 && exp->X_op == O_constant)
9699 {
9700 /* Since displacement is signed extended to 64bit, don't allow
9701 disp32 and turn off disp32s if they are out of range. */
9702 i.types[this_operand].bitfield.disp32 = 0;
9703 if (!fits_in_signed_long (exp->X_add_number))
9704 {
9705 i.types[this_operand].bitfield.disp32s = 0;
9706 if (i.types[this_operand].bitfield.baseindex)
9707 {
9708 as_bad (_("0x%lx out range of signed 32bit displacement"),
9709 (long) exp->X_add_number);
9710 ret = 0;
9711 }
9712 }
9713 }
9714
4c63da97 9715#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
9716 else if (exp->X_op != O_constant
9717 && OUTPUT_FLAVOR == bfd_target_aout_flavour
9718 && exp_seg != absolute_section
9719 && exp_seg != text_section
9720 && exp_seg != data_section
9721 && exp_seg != bss_section
9722 && exp_seg != undefined_section
9723 && !bfd_is_com_section (exp_seg))
24eab124 9724 {
d0b47220 9725 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 9726 ret = 0;
24eab124 9727 }
252b5132 9728#endif
3956db08 9729
40fb9820
L
9730 /* Check if this is a displacement only operand. */
9731 bigdisp = i.types[this_operand];
9732 bigdisp.bitfield.disp8 = 0;
9733 bigdisp.bitfield.disp16 = 0;
9734 bigdisp.bitfield.disp32 = 0;
9735 bigdisp.bitfield.disp32s = 0;
9736 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 9737 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
9738 i.types[this_operand] = operand_type_and (i.types[this_operand],
9739 types);
3956db08 9740
3992d3b7 9741 return ret;
252b5132
RH
9742}
9743
2abc2bec
JB
9744/* Return the active addressing mode, taking address override and
9745 registers forming the address into consideration. Update the
9746 address override prefix if necessary. */
47926f60 9747
2abc2bec
JB
9748static enum flag_code
9749i386_addressing_mode (void)
252b5132 9750{
be05d201
L
9751 enum flag_code addr_mode;
9752
9753 if (i.prefix[ADDR_PREFIX])
9754 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
9755 else
9756 {
9757 addr_mode = flag_code;
9758
24eab124 9759#if INFER_ADDR_PREFIX
be05d201
L
9760 if (i.mem_operands == 0)
9761 {
9762 /* Infer address prefix from the first memory operand. */
9763 const reg_entry *addr_reg = i.base_reg;
9764
9765 if (addr_reg == NULL)
9766 addr_reg = i.index_reg;
eecb386c 9767
be05d201
L
9768 if (addr_reg)
9769 {
e968fc9b 9770 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
9771 addr_mode = CODE_32BIT;
9772 else if (flag_code != CODE_64BIT
dc821c5f 9773 && addr_reg->reg_type.bitfield.word)
be05d201
L
9774 addr_mode = CODE_16BIT;
9775
9776 if (addr_mode != flag_code)
9777 {
9778 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
9779 i.prefixes += 1;
9780 /* Change the size of any displacement too. At most one
9781 of Disp16 or Disp32 is set.
9782 FIXME. There doesn't seem to be any real need for
9783 separate Disp16 and Disp32 flags. The same goes for
9784 Imm16 and Imm32. Removing them would probably clean
9785 up the code quite a lot. */
9786 if (flag_code != CODE_64BIT
9787 && (i.types[this_operand].bitfield.disp16
9788 || i.types[this_operand].bitfield.disp32))
9789 i.types[this_operand]
9790 = operand_type_xor (i.types[this_operand], disp16_32);
9791 }
9792 }
9793 }
24eab124 9794#endif
be05d201
L
9795 }
9796
2abc2bec
JB
9797 return addr_mode;
9798}
9799
9800/* Make sure the memory operand we've been dealt is valid.
9801 Return 1 on success, 0 on a failure. */
9802
9803static int
9804i386_index_check (const char *operand_string)
9805{
9806 const char *kind = "base/index";
9807 enum flag_code addr_mode = i386_addressing_mode ();
9808
fc0763e6 9809 if (current_templates->start->opcode_modifier.isstring
c3949f43 9810 && !current_templates->start->cpu_flags.bitfield.cpupadlock
fc0763e6
JB
9811 && (current_templates->end[-1].opcode_modifier.isstring
9812 || i.mem_operands))
9813 {
9814 /* Memory operands of string insns are special in that they only allow
9815 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
9816 const reg_entry *expected_reg;
9817 static const char *di_si[][2] =
9818 {
9819 { "esi", "edi" },
9820 { "si", "di" },
9821 { "rsi", "rdi" }
9822 };
9823 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
9824
9825 kind = "string address";
9826
8325cc63 9827 if (current_templates->start->opcode_modifier.repprefixok)
fc0763e6
JB
9828 {
9829 i386_operand_type type = current_templates->end[-1].operand_types[0];
9830
9831 if (!type.bitfield.baseindex
9832 || ((!i.mem_operands != !intel_syntax)
9833 && current_templates->end[-1].operand_types[1]
9834 .bitfield.baseindex))
9835 type = current_templates->end[-1].operand_types[1];
be05d201
L
9836 expected_reg = hash_find (reg_hash,
9837 di_si[addr_mode][type.bitfield.esseg]);
9838
fc0763e6
JB
9839 }
9840 else
be05d201 9841 expected_reg = hash_find (reg_hash, bx[addr_mode]);
fc0763e6 9842
be05d201
L
9843 if (i.base_reg != expected_reg
9844 || i.index_reg
fc0763e6 9845 || operand_type_check (i.types[this_operand], disp))
fc0763e6 9846 {
be05d201
L
9847 /* The second memory operand must have the same size as
9848 the first one. */
9849 if (i.mem_operands
9850 && i.base_reg
9851 && !((addr_mode == CODE_64BIT
dc821c5f 9852 && i.base_reg->reg_type.bitfield.qword)
be05d201 9853 || (addr_mode == CODE_32BIT
dc821c5f
JB
9854 ? i.base_reg->reg_type.bitfield.dword
9855 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
9856 goto bad_address;
9857
fc0763e6
JB
9858 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
9859 operand_string,
9860 intel_syntax ? '[' : '(',
9861 register_prefix,
be05d201 9862 expected_reg->reg_name,
fc0763e6 9863 intel_syntax ? ']' : ')');
be05d201 9864 return 1;
fc0763e6 9865 }
be05d201
L
9866 else
9867 return 1;
9868
9869bad_address:
9870 as_bad (_("`%s' is not a valid %s expression"),
9871 operand_string, kind);
9872 return 0;
3e73aa7c
JH
9873 }
9874 else
9875 {
be05d201
L
9876 if (addr_mode != CODE_16BIT)
9877 {
9878 /* 32-bit/64-bit checks. */
9879 if ((i.base_reg
e968fc9b
JB
9880 && ((addr_mode == CODE_64BIT
9881 ? !i.base_reg->reg_type.bitfield.qword
9882 : !i.base_reg->reg_type.bitfield.dword)
9883 || (i.index_reg && i.base_reg->reg_num == RegIP)
9884 || i.base_reg->reg_num == RegIZ))
be05d201 9885 || (i.index_reg
1b54b8d7
JB
9886 && !i.index_reg->reg_type.bitfield.xmmword
9887 && !i.index_reg->reg_type.bitfield.ymmword
9888 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 9889 && ((addr_mode == CODE_64BIT
e968fc9b
JB
9890 ? !i.index_reg->reg_type.bitfield.qword
9891 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
9892 || !i.index_reg->reg_type.bitfield.baseindex)))
9893 goto bad_address;
8178be5b
JB
9894
9895 /* bndmk, bndldx, and bndstx have special restrictions. */
9896 if (current_templates->start->base_opcode == 0xf30f1b
9897 || (current_templates->start->base_opcode & ~1) == 0x0f1a)
9898 {
9899 /* They cannot use RIP-relative addressing. */
e968fc9b 9900 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
9901 {
9902 as_bad (_("`%s' cannot be used here"), operand_string);
9903 return 0;
9904 }
9905
9906 /* bndldx and bndstx ignore their scale factor. */
9907 if (current_templates->start->base_opcode != 0xf30f1b
9908 && i.log2_scale_factor)
9909 as_warn (_("register scaling is being ignored here"));
9910 }
be05d201
L
9911 }
9912 else
3e73aa7c 9913 {
be05d201 9914 /* 16-bit checks. */
3e73aa7c 9915 if ((i.base_reg
dc821c5f 9916 && (!i.base_reg->reg_type.bitfield.word
40fb9820 9917 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 9918 || (i.index_reg
dc821c5f 9919 && (!i.index_reg->reg_type.bitfield.word
40fb9820 9920 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
9921 || !(i.base_reg
9922 && i.base_reg->reg_num < 6
9923 && i.index_reg->reg_num >= 6
9924 && i.log2_scale_factor == 0))))
be05d201 9925 goto bad_address;
3e73aa7c
JH
9926 }
9927 }
be05d201 9928 return 1;
24eab124 9929}
252b5132 9930
43234a1e
L
9931/* Handle vector immediates. */
9932
9933static int
9934RC_SAE_immediate (const char *imm_start)
9935{
9936 unsigned int match_found, j;
9937 const char *pstr = imm_start;
9938 expressionS *exp;
9939
9940 if (*pstr != '{')
9941 return 0;
9942
9943 pstr++;
9944 match_found = 0;
9945 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
9946 {
9947 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
9948 {
9949 if (!i.rounding)
9950 {
9951 rc_op.type = RC_NamesTable[j].type;
9952 rc_op.operand = this_operand;
9953 i.rounding = &rc_op;
9954 }
9955 else
9956 {
9957 as_bad (_("duplicated `%s'"), imm_start);
9958 return 0;
9959 }
9960 pstr += RC_NamesTable[j].len;
9961 match_found = 1;
9962 break;
9963 }
9964 }
9965 if (!match_found)
9966 return 0;
9967
9968 if (*pstr++ != '}')
9969 {
9970 as_bad (_("Missing '}': '%s'"), imm_start);
9971 return 0;
9972 }
9973 /* RC/SAE immediate string should contain nothing more. */;
9974 if (*pstr != 0)
9975 {
9976 as_bad (_("Junk after '}': '%s'"), imm_start);
9977 return 0;
9978 }
9979
9980 exp = &im_expressions[i.imm_operands++];
9981 i.op[this_operand].imms = exp;
9982
9983 exp->X_op = O_constant;
9984 exp->X_add_number = 0;
9985 exp->X_add_symbol = (symbolS *) 0;
9986 exp->X_op_symbol = (symbolS *) 0;
9987
9988 i.types[this_operand].bitfield.imm8 = 1;
9989 return 1;
9990}
9991
8325cc63
JB
9992/* Only string instructions can have a second memory operand, so
9993 reduce current_templates to just those if it contains any. */
9994static int
9995maybe_adjust_templates (void)
9996{
9997 const insn_template *t;
9998
9999 gas_assert (i.mem_operands == 1);
10000
10001 for (t = current_templates->start; t < current_templates->end; ++t)
10002 if (t->opcode_modifier.isstring)
10003 break;
10004
10005 if (t < current_templates->end)
10006 {
10007 static templates aux_templates;
10008 bfd_boolean recheck;
10009
10010 aux_templates.start = t;
10011 for (; t < current_templates->end; ++t)
10012 if (!t->opcode_modifier.isstring)
10013 break;
10014 aux_templates.end = t;
10015
10016 /* Determine whether to re-check the first memory operand. */
10017 recheck = (aux_templates.start != current_templates->start
10018 || t != current_templates->end);
10019
10020 current_templates = &aux_templates;
10021
10022 if (recheck)
10023 {
10024 i.mem_operands = 0;
10025 if (i.memop1_string != NULL
10026 && i386_index_check (i.memop1_string) == 0)
10027 return 0;
10028 i.mem_operands = 1;
10029 }
10030 }
10031
10032 return 1;
10033}
10034
fc0763e6 10035/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 10036 on error. */
252b5132 10037
252b5132 10038static int
a7619375 10039i386_att_operand (char *operand_string)
252b5132 10040{
af6bdddf
AM
10041 const reg_entry *r;
10042 char *end_op;
24eab124 10043 char *op_string = operand_string;
252b5132 10044
24eab124 10045 if (is_space_char (*op_string))
252b5132
RH
10046 ++op_string;
10047
24eab124 10048 /* We check for an absolute prefix (differentiating,
47926f60 10049 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
10050 if (*op_string == ABSOLUTE_PREFIX)
10051 {
10052 ++op_string;
10053 if (is_space_char (*op_string))
10054 ++op_string;
40fb9820 10055 i.types[this_operand].bitfield.jumpabsolute = 1;
24eab124 10056 }
252b5132 10057
47926f60 10058 /* Check if operand is a register. */
4d1bb795 10059 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 10060 {
40fb9820
L
10061 i386_operand_type temp;
10062
24eab124
AM
10063 /* Check for a segment override by searching for ':' after a
10064 segment register. */
10065 op_string = end_op;
10066 if (is_space_char (*op_string))
10067 ++op_string;
00cee14f 10068 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124
AM
10069 {
10070 switch (r->reg_num)
10071 {
10072 case 0:
10073 i.seg[i.mem_operands] = &es;
10074 break;
10075 case 1:
10076 i.seg[i.mem_operands] = &cs;
10077 break;
10078 case 2:
10079 i.seg[i.mem_operands] = &ss;
10080 break;
10081 case 3:
10082 i.seg[i.mem_operands] = &ds;
10083 break;
10084 case 4:
10085 i.seg[i.mem_operands] = &fs;
10086 break;
10087 case 5:
10088 i.seg[i.mem_operands] = &gs;
10089 break;
10090 }
252b5132 10091
24eab124 10092 /* Skip the ':' and whitespace. */
252b5132
RH
10093 ++op_string;
10094 if (is_space_char (*op_string))
24eab124 10095 ++op_string;
252b5132 10096
24eab124
AM
10097 if (!is_digit_char (*op_string)
10098 && !is_identifier_char (*op_string)
10099 && *op_string != '('
10100 && *op_string != ABSOLUTE_PREFIX)
10101 {
10102 as_bad (_("bad memory operand `%s'"), op_string);
10103 return 0;
10104 }
47926f60 10105 /* Handle case of %es:*foo. */
24eab124
AM
10106 if (*op_string == ABSOLUTE_PREFIX)
10107 {
10108 ++op_string;
10109 if (is_space_char (*op_string))
10110 ++op_string;
40fb9820 10111 i.types[this_operand].bitfield.jumpabsolute = 1;
24eab124
AM
10112 }
10113 goto do_memory_reference;
10114 }
43234a1e
L
10115
10116 /* Handle vector operations. */
10117 if (*op_string == '{')
10118 {
10119 op_string = check_VecOperations (op_string, NULL);
10120 if (op_string == NULL)
10121 return 0;
10122 }
10123
24eab124
AM
10124 if (*op_string)
10125 {
d0b47220 10126 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
10127 return 0;
10128 }
40fb9820
L
10129 temp = r->reg_type;
10130 temp.bitfield.baseindex = 0;
c6fb90c8
L
10131 i.types[this_operand] = operand_type_or (i.types[this_operand],
10132 temp);
7d5e4556 10133 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 10134 i.op[this_operand].regs = r;
24eab124
AM
10135 i.reg_operands++;
10136 }
af6bdddf
AM
10137 else if (*op_string == REGISTER_PREFIX)
10138 {
10139 as_bad (_("bad register name `%s'"), op_string);
10140 return 0;
10141 }
24eab124 10142 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 10143 {
24eab124 10144 ++op_string;
40fb9820 10145 if (i.types[this_operand].bitfield.jumpabsolute)
24eab124 10146 {
d0b47220 10147 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
10148 return 0;
10149 }
10150 if (!i386_immediate (op_string))
10151 return 0;
10152 }
43234a1e
L
10153 else if (RC_SAE_immediate (operand_string))
10154 {
10155 /* If it is a RC or SAE immediate, do nothing. */
10156 ;
10157 }
24eab124
AM
10158 else if (is_digit_char (*op_string)
10159 || is_identifier_char (*op_string)
d02603dc 10160 || *op_string == '"'
e5cb08ac 10161 || *op_string == '(')
24eab124 10162 {
47926f60 10163 /* This is a memory reference of some sort. */
af6bdddf 10164 char *base_string;
252b5132 10165
47926f60 10166 /* Start and end of displacement string expression (if found). */
eecb386c
AM
10167 char *displacement_string_start;
10168 char *displacement_string_end;
43234a1e 10169 char *vop_start;
252b5132 10170
24eab124 10171 do_memory_reference:
8325cc63
JB
10172 if (i.mem_operands == 1 && !maybe_adjust_templates ())
10173 return 0;
24eab124 10174 if ((i.mem_operands == 1
40fb9820 10175 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
10176 || i.mem_operands == 2)
10177 {
10178 as_bad (_("too many memory references for `%s'"),
10179 current_templates->start->name);
10180 return 0;
10181 }
252b5132 10182
24eab124
AM
10183 /* Check for base index form. We detect the base index form by
10184 looking for an ')' at the end of the operand, searching
10185 for the '(' matching it, and finding a REGISTER_PREFIX or ','
10186 after the '('. */
af6bdddf 10187 base_string = op_string + strlen (op_string);
c3332e24 10188
43234a1e
L
10189 /* Handle vector operations. */
10190 vop_start = strchr (op_string, '{');
10191 if (vop_start && vop_start < base_string)
10192 {
10193 if (check_VecOperations (vop_start, base_string) == NULL)
10194 return 0;
10195 base_string = vop_start;
10196 }
10197
af6bdddf
AM
10198 --base_string;
10199 if (is_space_char (*base_string))
10200 --base_string;
252b5132 10201
47926f60 10202 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
10203 displacement_string_start = op_string;
10204 displacement_string_end = base_string + 1;
252b5132 10205
24eab124
AM
10206 if (*base_string == ')')
10207 {
af6bdddf 10208 char *temp_string;
24eab124
AM
10209 unsigned int parens_balanced = 1;
10210 /* We've already checked that the number of left & right ()'s are
47926f60 10211 equal, so this loop will not be infinite. */
24eab124
AM
10212 do
10213 {
10214 base_string--;
10215 if (*base_string == ')')
10216 parens_balanced++;
10217 if (*base_string == '(')
10218 parens_balanced--;
10219 }
10220 while (parens_balanced);
c3332e24 10221
af6bdddf 10222 temp_string = base_string;
c3332e24 10223
24eab124 10224 /* Skip past '(' and whitespace. */
252b5132
RH
10225 ++base_string;
10226 if (is_space_char (*base_string))
24eab124 10227 ++base_string;
252b5132 10228
af6bdddf 10229 if (*base_string == ','
4eed87de
AM
10230 || ((i.base_reg = parse_register (base_string, &end_op))
10231 != NULL))
252b5132 10232 {
af6bdddf 10233 displacement_string_end = temp_string;
252b5132 10234
40fb9820 10235 i.types[this_operand].bitfield.baseindex = 1;
252b5132 10236
af6bdddf 10237 if (i.base_reg)
24eab124 10238 {
24eab124
AM
10239 base_string = end_op;
10240 if (is_space_char (*base_string))
10241 ++base_string;
af6bdddf
AM
10242 }
10243
10244 /* There may be an index reg or scale factor here. */
10245 if (*base_string == ',')
10246 {
10247 ++base_string;
10248 if (is_space_char (*base_string))
10249 ++base_string;
10250
4eed87de
AM
10251 if ((i.index_reg = parse_register (base_string, &end_op))
10252 != NULL)
24eab124 10253 {
af6bdddf 10254 base_string = end_op;
24eab124
AM
10255 if (is_space_char (*base_string))
10256 ++base_string;
af6bdddf
AM
10257 if (*base_string == ',')
10258 {
10259 ++base_string;
10260 if (is_space_char (*base_string))
10261 ++base_string;
10262 }
e5cb08ac 10263 else if (*base_string != ')')
af6bdddf 10264 {
4eed87de
AM
10265 as_bad (_("expecting `,' or `)' "
10266 "after index register in `%s'"),
af6bdddf
AM
10267 operand_string);
10268 return 0;
10269 }
24eab124 10270 }
af6bdddf 10271 else if (*base_string == REGISTER_PREFIX)
24eab124 10272 {
f76bf5e0
L
10273 end_op = strchr (base_string, ',');
10274 if (end_op)
10275 *end_op = '\0';
af6bdddf 10276 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
10277 return 0;
10278 }
252b5132 10279
47926f60 10280 /* Check for scale factor. */
551c1ca1 10281 if (*base_string != ')')
af6bdddf 10282 {
551c1ca1
AM
10283 char *end_scale = i386_scale (base_string);
10284
10285 if (!end_scale)
af6bdddf 10286 return 0;
24eab124 10287
551c1ca1 10288 base_string = end_scale;
af6bdddf
AM
10289 if (is_space_char (*base_string))
10290 ++base_string;
10291 if (*base_string != ')')
10292 {
4eed87de
AM
10293 as_bad (_("expecting `)' "
10294 "after scale factor in `%s'"),
af6bdddf
AM
10295 operand_string);
10296 return 0;
10297 }
10298 }
10299 else if (!i.index_reg)
24eab124 10300 {
4eed87de
AM
10301 as_bad (_("expecting index register or scale factor "
10302 "after `,'; got '%c'"),
af6bdddf 10303 *base_string);
24eab124
AM
10304 return 0;
10305 }
10306 }
af6bdddf 10307 else if (*base_string != ')')
24eab124 10308 {
4eed87de
AM
10309 as_bad (_("expecting `,' or `)' "
10310 "after base register in `%s'"),
af6bdddf 10311 operand_string);
24eab124
AM
10312 return 0;
10313 }
c3332e24 10314 }
af6bdddf 10315 else if (*base_string == REGISTER_PREFIX)
c3332e24 10316 {
f76bf5e0
L
10317 end_op = strchr (base_string, ',');
10318 if (end_op)
10319 *end_op = '\0';
af6bdddf 10320 as_bad (_("bad register name `%s'"), base_string);
24eab124 10321 return 0;
c3332e24 10322 }
24eab124
AM
10323 }
10324
10325 /* If there's an expression beginning the operand, parse it,
10326 assuming displacement_string_start and
10327 displacement_string_end are meaningful. */
10328 if (displacement_string_start != displacement_string_end)
10329 {
10330 if (!i386_displacement (displacement_string_start,
10331 displacement_string_end))
10332 return 0;
10333 }
10334
10335 /* Special case for (%dx) while doing input/output op. */
10336 if (i.base_reg
75e5731b
JB
10337 && i.base_reg->reg_type.bitfield.instance == RegD
10338 && i.base_reg->reg_type.bitfield.word
24eab124
AM
10339 && i.index_reg == 0
10340 && i.log2_scale_factor == 0
10341 && i.seg[i.mem_operands] == 0
40fb9820 10342 && !operand_type_check (i.types[this_operand], disp))
24eab124 10343 {
2fb5be8d 10344 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
10345 return 1;
10346 }
10347
eecb386c
AM
10348 if (i386_index_check (operand_string) == 0)
10349 return 0;
c48dadc9 10350 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
10351 if (i.mem_operands == 0)
10352 i.memop1_string = xstrdup (operand_string);
24eab124
AM
10353 i.mem_operands++;
10354 }
10355 else
ce8a8b2f
AM
10356 {
10357 /* It's not a memory operand; argh! */
24eab124
AM
10358 as_bad (_("invalid char %s beginning operand %d `%s'"),
10359 output_invalid (*op_string),
10360 this_operand + 1,
10361 op_string);
10362 return 0;
10363 }
47926f60 10364 return 1; /* Normal return. */
252b5132
RH
10365}
10366\f
fa94de6b
RM
10367/* Calculate the maximum variable size (i.e., excluding fr_fix)
10368 that an rs_machine_dependent frag may reach. */
10369
10370unsigned int
10371i386_frag_max_var (fragS *frag)
10372{
10373 /* The only relaxable frags are for jumps.
10374 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
10375 gas_assert (frag->fr_type == rs_machine_dependent);
10376 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
10377}
10378
b084df0b
L
10379#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
10380static int
8dcea932 10381elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
10382{
10383 /* STT_GNU_IFUNC symbol must go through PLT. */
10384 if ((symbol_get_bfdsym (fr_symbol)->flags
10385 & BSF_GNU_INDIRECT_FUNCTION) != 0)
10386 return 0;
10387
10388 if (!S_IS_EXTERNAL (fr_symbol))
10389 /* Symbol may be weak or local. */
10390 return !S_IS_WEAK (fr_symbol);
10391
8dcea932
L
10392 /* Global symbols with non-default visibility can't be preempted. */
10393 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
10394 return 1;
10395
10396 if (fr_var != NO_RELOC)
10397 switch ((enum bfd_reloc_code_real) fr_var)
10398 {
10399 case BFD_RELOC_386_PLT32:
10400 case BFD_RELOC_X86_64_PLT32:
33eaf5de 10401 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
10402 return 0;
10403 default:
10404 abort ();
10405 }
10406
b084df0b
L
10407 /* Global symbols with default visibility in a shared library may be
10408 preempted by another definition. */
8dcea932 10409 return !shared;
b084df0b
L
10410}
10411#endif
10412
ee7fcc42
AM
10413/* md_estimate_size_before_relax()
10414
10415 Called just before relax() for rs_machine_dependent frags. The x86
10416 assembler uses these frags to handle variable size jump
10417 instructions.
10418
10419 Any symbol that is now undefined will not become defined.
10420 Return the correct fr_subtype in the frag.
10421 Return the initial "guess for variable size of frag" to caller.
10422 The guess is actually the growth beyond the fixed part. Whatever
10423 we do to grow the fixed or variable part contributes to our
10424 returned value. */
10425
252b5132 10426int
7016a5d5 10427md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 10428{
252b5132 10429 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
10430 check for un-relaxable symbols. On an ELF system, we can't relax
10431 an externally visible symbol, because it may be overridden by a
10432 shared library. */
10433 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 10434#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 10435 || (IS_ELF
8dcea932
L
10436 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
10437 fragP->fr_var))
fbeb56a4
DK
10438#endif
10439#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 10440 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 10441 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
10442#endif
10443 )
252b5132 10444 {
b98ef147
AM
10445 /* Symbol is undefined in this segment, or we need to keep a
10446 reloc so that weak symbols can be overridden. */
10447 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 10448 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
10449 unsigned char *opcode;
10450 int old_fr_fix;
f6af82bd 10451
ee7fcc42 10452 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 10453 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 10454 else if (size == 2)
f6af82bd 10455 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
10456#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
10457 else if (need_plt32_p (fragP->fr_symbol))
10458 reloc_type = BFD_RELOC_X86_64_PLT32;
10459#endif
f6af82bd
AM
10460 else
10461 reloc_type = BFD_RELOC_32_PCREL;
252b5132 10462
ee7fcc42
AM
10463 old_fr_fix = fragP->fr_fix;
10464 opcode = (unsigned char *) fragP->fr_opcode;
10465
fddf5b5b 10466 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 10467 {
fddf5b5b
AM
10468 case UNCOND_JUMP:
10469 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 10470 opcode[0] = 0xe9;
252b5132 10471 fragP->fr_fix += size;
062cd5e7
AS
10472 fix_new (fragP, old_fr_fix, size,
10473 fragP->fr_symbol,
10474 fragP->fr_offset, 1,
10475 reloc_type);
252b5132
RH
10476 break;
10477
fddf5b5b 10478 case COND_JUMP86:
412167cb
AM
10479 if (size == 2
10480 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
10481 {
10482 /* Negate the condition, and branch past an
10483 unconditional jump. */
10484 opcode[0] ^= 1;
10485 opcode[1] = 3;
10486 /* Insert an unconditional jump. */
10487 opcode[2] = 0xe9;
10488 /* We added two extra opcode bytes, and have a two byte
10489 offset. */
10490 fragP->fr_fix += 2 + 2;
062cd5e7
AS
10491 fix_new (fragP, old_fr_fix + 2, 2,
10492 fragP->fr_symbol,
10493 fragP->fr_offset, 1,
10494 reloc_type);
fddf5b5b
AM
10495 break;
10496 }
10497 /* Fall through. */
10498
10499 case COND_JUMP:
412167cb
AM
10500 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
10501 {
3e02c1cc
AM
10502 fixS *fixP;
10503
412167cb 10504 fragP->fr_fix += 1;
3e02c1cc
AM
10505 fixP = fix_new (fragP, old_fr_fix, 1,
10506 fragP->fr_symbol,
10507 fragP->fr_offset, 1,
10508 BFD_RELOC_8_PCREL);
10509 fixP->fx_signed = 1;
412167cb
AM
10510 break;
10511 }
93c2a809 10512
24eab124 10513 /* This changes the byte-displacement jump 0x7N
fddf5b5b 10514 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 10515 opcode[1] = opcode[0] + 0x10;
f6af82bd 10516 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
10517 /* We've added an opcode byte. */
10518 fragP->fr_fix += 1 + size;
062cd5e7
AS
10519 fix_new (fragP, old_fr_fix + 1, size,
10520 fragP->fr_symbol,
10521 fragP->fr_offset, 1,
10522 reloc_type);
252b5132 10523 break;
fddf5b5b
AM
10524
10525 default:
10526 BAD_CASE (fragP->fr_subtype);
10527 break;
252b5132
RH
10528 }
10529 frag_wane (fragP);
ee7fcc42 10530 return fragP->fr_fix - old_fr_fix;
252b5132 10531 }
93c2a809 10532
93c2a809
AM
10533 /* Guess size depending on current relax state. Initially the relax
10534 state will correspond to a short jump and we return 1, because
10535 the variable part of the frag (the branch offset) is one byte
10536 long. However, we can relax a section more than once and in that
10537 case we must either set fr_subtype back to the unrelaxed state,
10538 or return the value for the appropriate branch. */
10539 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
10540}
10541
47926f60
KH
10542/* Called after relax() is finished.
10543
10544 In: Address of frag.
10545 fr_type == rs_machine_dependent.
10546 fr_subtype is what the address relaxed to.
10547
10548 Out: Any fixSs and constants are set up.
10549 Caller will turn frag into a ".space 0". */
10550
252b5132 10551void
7016a5d5
TG
10552md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
10553 fragS *fragP)
252b5132 10554{
29b0f896 10555 unsigned char *opcode;
252b5132 10556 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
10557 offsetT target_address;
10558 offsetT opcode_address;
252b5132 10559 unsigned int extension = 0;
847f7ad4 10560 offsetT displacement_from_opcode_start;
252b5132
RH
10561
10562 opcode = (unsigned char *) fragP->fr_opcode;
10563
47926f60 10564 /* Address we want to reach in file space. */
252b5132 10565 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 10566
47926f60 10567 /* Address opcode resides at in file space. */
252b5132
RH
10568 opcode_address = fragP->fr_address + fragP->fr_fix;
10569
47926f60 10570 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
10571 displacement_from_opcode_start = target_address - opcode_address;
10572
fddf5b5b 10573 if ((fragP->fr_subtype & BIG) == 0)
252b5132 10574 {
47926f60
KH
10575 /* Don't have to change opcode. */
10576 extension = 1; /* 1 opcode + 1 displacement */
252b5132 10577 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
10578 }
10579 else
10580 {
10581 if (no_cond_jump_promotion
10582 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
10583 as_warn_where (fragP->fr_file, fragP->fr_line,
10584 _("long jump required"));
252b5132 10585
fddf5b5b
AM
10586 switch (fragP->fr_subtype)
10587 {
10588 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
10589 extension = 4; /* 1 opcode + 4 displacement */
10590 opcode[0] = 0xe9;
10591 where_to_put_displacement = &opcode[1];
10592 break;
252b5132 10593
fddf5b5b
AM
10594 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
10595 extension = 2; /* 1 opcode + 2 displacement */
10596 opcode[0] = 0xe9;
10597 where_to_put_displacement = &opcode[1];
10598 break;
252b5132 10599
fddf5b5b
AM
10600 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
10601 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
10602 extension = 5; /* 2 opcode + 4 displacement */
10603 opcode[1] = opcode[0] + 0x10;
10604 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
10605 where_to_put_displacement = &opcode[2];
10606 break;
252b5132 10607
fddf5b5b
AM
10608 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
10609 extension = 3; /* 2 opcode + 2 displacement */
10610 opcode[1] = opcode[0] + 0x10;
10611 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
10612 where_to_put_displacement = &opcode[2];
10613 break;
252b5132 10614
fddf5b5b
AM
10615 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
10616 extension = 4;
10617 opcode[0] ^= 1;
10618 opcode[1] = 3;
10619 opcode[2] = 0xe9;
10620 where_to_put_displacement = &opcode[3];
10621 break;
10622
10623 default:
10624 BAD_CASE (fragP->fr_subtype);
10625 break;
10626 }
252b5132 10627 }
fddf5b5b 10628
7b81dfbb
AJ
10629 /* If size if less then four we are sure that the operand fits,
10630 but if it's 4, then it could be that the displacement is larger
10631 then -/+ 2GB. */
10632 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
10633 && object_64bit
10634 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
10635 + ((addressT) 1 << 31))
10636 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
10637 {
10638 as_bad_where (fragP->fr_file, fragP->fr_line,
10639 _("jump target out of range"));
10640 /* Make us emit 0. */
10641 displacement_from_opcode_start = extension;
10642 }
47926f60 10643 /* Now put displacement after opcode. */
252b5132
RH
10644 md_number_to_chars ((char *) where_to_put_displacement,
10645 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 10646 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
10647 fragP->fr_fix += extension;
10648}
10649\f
7016a5d5 10650/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
10651 by our caller that we have all the info we need to fix it up.
10652
7016a5d5
TG
10653 Parameter valP is the pointer to the value of the bits.
10654
252b5132
RH
10655 On the 386, immediates, displacements, and data pointers are all in
10656 the same (little-endian) format, so we don't need to care about which
10657 we are handling. */
10658
94f592af 10659void
7016a5d5 10660md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 10661{
94f592af 10662 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 10663 valueT value = *valP;
252b5132 10664
f86103b7 10665#if !defined (TE_Mach)
93382f6d
AM
10666 if (fixP->fx_pcrel)
10667 {
10668 switch (fixP->fx_r_type)
10669 {
5865bb77
ILT
10670 default:
10671 break;
10672
d6ab8113
JB
10673 case BFD_RELOC_64:
10674 fixP->fx_r_type = BFD_RELOC_64_PCREL;
10675 break;
93382f6d 10676 case BFD_RELOC_32:
ae8887b5 10677 case BFD_RELOC_X86_64_32S:
93382f6d
AM
10678 fixP->fx_r_type = BFD_RELOC_32_PCREL;
10679 break;
10680 case BFD_RELOC_16:
10681 fixP->fx_r_type = BFD_RELOC_16_PCREL;
10682 break;
10683 case BFD_RELOC_8:
10684 fixP->fx_r_type = BFD_RELOC_8_PCREL;
10685 break;
10686 }
10687 }
252b5132 10688
a161fe53 10689 if (fixP->fx_addsy != NULL
31312f95 10690 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 10691 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 10692 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 10693 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 10694 && !use_rela_relocations)
252b5132 10695 {
31312f95
AM
10696 /* This is a hack. There should be a better way to handle this.
10697 This covers for the fact that bfd_install_relocation will
10698 subtract the current location (for partial_inplace, PC relative
10699 relocations); see more below. */
252b5132 10700#ifndef OBJ_AOUT
718ddfc0 10701 if (IS_ELF
252b5132
RH
10702#ifdef TE_PE
10703 || OUTPUT_FLAVOR == bfd_target_coff_flavour
10704#endif
10705 )
10706 value += fixP->fx_where + fixP->fx_frag->fr_address;
10707#endif
10708#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 10709 if (IS_ELF)
252b5132 10710 {
6539b54b 10711 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 10712
6539b54b 10713 if ((sym_seg == seg
2f66722d 10714 || (symbol_section_p (fixP->fx_addsy)
6539b54b 10715 && sym_seg != absolute_section))
af65af87 10716 && !generic_force_reloc (fixP))
2f66722d
AM
10717 {
10718 /* Yes, we add the values in twice. This is because
6539b54b
AM
10719 bfd_install_relocation subtracts them out again. I think
10720 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
10721 it. FIXME. */
10722 value += fixP->fx_where + fixP->fx_frag->fr_address;
10723 }
252b5132
RH
10724 }
10725#endif
10726#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
10727 /* For some reason, the PE format does not store a
10728 section address offset for a PC relative symbol. */
10729 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 10730 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
10731 value += md_pcrel_from (fixP);
10732#endif
10733 }
fbeb56a4 10734#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
10735 if (fixP->fx_addsy != NULL
10736 && S_IS_WEAK (fixP->fx_addsy)
10737 /* PR 16858: Do not modify weak function references. */
10738 && ! fixP->fx_pcrel)
fbeb56a4 10739 {
296a8689
NC
10740#if !defined (TE_PEP)
10741 /* For x86 PE weak function symbols are neither PC-relative
10742 nor do they set S_IS_FUNCTION. So the only reliable way
10743 to detect them is to check the flags of their containing
10744 section. */
10745 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
10746 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
10747 ;
10748 else
10749#endif
fbeb56a4
DK
10750 value -= S_GET_VALUE (fixP->fx_addsy);
10751 }
10752#endif
252b5132
RH
10753
10754 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 10755 and we must not disappoint it. */
252b5132 10756#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 10757 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
10758 switch (fixP->fx_r_type)
10759 {
10760 case BFD_RELOC_386_PLT32:
3e73aa7c 10761 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
10762 /* Make the jump instruction point to the address of the operand.
10763 At runtime we merely add the offset to the actual PLT entry.
10764 NB: Subtract the offset size only for jump instructions. */
10765 if (fixP->fx_pcrel)
10766 value = -4;
47926f60 10767 break;
31312f95 10768
13ae64f3
JJ
10769 case BFD_RELOC_386_TLS_GD:
10770 case BFD_RELOC_386_TLS_LDM:
13ae64f3 10771 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
10772 case BFD_RELOC_386_TLS_IE:
10773 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 10774 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
10775 case BFD_RELOC_X86_64_TLSGD:
10776 case BFD_RELOC_X86_64_TLSLD:
10777 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 10778 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
10779 value = 0; /* Fully resolved at runtime. No addend. */
10780 /* Fallthrough */
10781 case BFD_RELOC_386_TLS_LE:
10782 case BFD_RELOC_386_TLS_LDO_32:
10783 case BFD_RELOC_386_TLS_LE_32:
10784 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 10785 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 10786 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 10787 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
10788 S_SET_THREAD_LOCAL (fixP->fx_addsy);
10789 break;
10790
67a4f2b7
AO
10791 case BFD_RELOC_386_TLS_DESC_CALL:
10792 case BFD_RELOC_X86_64_TLSDESC_CALL:
10793 value = 0; /* Fully resolved at runtime. No addend. */
10794 S_SET_THREAD_LOCAL (fixP->fx_addsy);
10795 fixP->fx_done = 0;
10796 return;
10797
47926f60
KH
10798 case BFD_RELOC_VTABLE_INHERIT:
10799 case BFD_RELOC_VTABLE_ENTRY:
10800 fixP->fx_done = 0;
94f592af 10801 return;
47926f60
KH
10802
10803 default:
10804 break;
10805 }
10806#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 10807 *valP = value;
f86103b7 10808#endif /* !defined (TE_Mach) */
3e73aa7c 10809
3e73aa7c 10810 /* Are we finished with this relocation now? */
c6682705 10811 if (fixP->fx_addsy == NULL)
3e73aa7c 10812 fixP->fx_done = 1;
fbeb56a4
DK
10813#if defined (OBJ_COFF) && defined (TE_PE)
10814 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
10815 {
10816 fixP->fx_done = 0;
10817 /* Remember value for tc_gen_reloc. */
10818 fixP->fx_addnumber = value;
10819 /* Clear out the frag for now. */
10820 value = 0;
10821 }
10822#endif
3e73aa7c
JH
10823 else if (use_rela_relocations)
10824 {
10825 fixP->fx_no_overflow = 1;
062cd5e7
AS
10826 /* Remember value for tc_gen_reloc. */
10827 fixP->fx_addnumber = value;
3e73aa7c
JH
10828 value = 0;
10829 }
f86103b7 10830
94f592af 10831 md_number_to_chars (p, value, fixP->fx_size);
252b5132 10832}
252b5132 10833\f
6d4af3c2 10834const char *
499ac353 10835md_atof (int type, char *litP, int *sizeP)
252b5132 10836{
499ac353
NC
10837 /* This outputs the LITTLENUMs in REVERSE order;
10838 in accord with the bigendian 386. */
10839 return ieee_md_atof (type, litP, sizeP, FALSE);
252b5132
RH
10840}
10841\f
2d545b82 10842static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 10843
252b5132 10844static char *
e3bb37b5 10845output_invalid (int c)
252b5132 10846{
3882b010 10847 if (ISPRINT (c))
f9f21a03
L
10848 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
10849 "'%c'", c);
252b5132 10850 else
f9f21a03 10851 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 10852 "(0x%x)", (unsigned char) c);
252b5132
RH
10853 return output_invalid_buf;
10854}
10855
af6bdddf 10856/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
10857
10858static const reg_entry *
4d1bb795 10859parse_real_register (char *reg_string, char **end_op)
252b5132 10860{
af6bdddf
AM
10861 char *s = reg_string;
10862 char *p;
252b5132
RH
10863 char reg_name_given[MAX_REG_NAME_SIZE + 1];
10864 const reg_entry *r;
10865
10866 /* Skip possible REGISTER_PREFIX and possible whitespace. */
10867 if (*s == REGISTER_PREFIX)
10868 ++s;
10869
10870 if (is_space_char (*s))
10871 ++s;
10872
10873 p = reg_name_given;
af6bdddf 10874 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
10875 {
10876 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
10877 return (const reg_entry *) NULL;
10878 s++;
252b5132
RH
10879 }
10880
6588847e
DN
10881 /* For naked regs, make sure that we are not dealing with an identifier.
10882 This prevents confusing an identifier like `eax_var' with register
10883 `eax'. */
10884 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
10885 return (const reg_entry *) NULL;
10886
af6bdddf 10887 *end_op = s;
252b5132
RH
10888
10889 r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
10890
5f47d35b 10891 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 10892 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 10893 {
0e0eea78
JB
10894 if (!cpu_arch_flags.bitfield.cpu8087
10895 && !cpu_arch_flags.bitfield.cpu287
10896 && !cpu_arch_flags.bitfield.cpu387)
10897 return (const reg_entry *) NULL;
10898
5f47d35b
AM
10899 if (is_space_char (*s))
10900 ++s;
10901 if (*s == '(')
10902 {
af6bdddf 10903 ++s;
5f47d35b
AM
10904 if (is_space_char (*s))
10905 ++s;
10906 if (*s >= '0' && *s <= '7')
10907 {
db557034 10908 int fpr = *s - '0';
af6bdddf 10909 ++s;
5f47d35b
AM
10910 if (is_space_char (*s))
10911 ++s;
10912 if (*s == ')')
10913 {
10914 *end_op = s + 1;
1e9cc1c2 10915 r = (const reg_entry *) hash_find (reg_hash, "st(0)");
db557034
AM
10916 know (r);
10917 return r + fpr;
5f47d35b 10918 }
5f47d35b 10919 }
47926f60 10920 /* We have "%st(" then garbage. */
5f47d35b
AM
10921 return (const reg_entry *) NULL;
10922 }
10923 }
10924
a60de03c
JB
10925 if (r == NULL || allow_pseudo_reg)
10926 return r;
10927
0dfbf9d7 10928 if (operand_type_all_zero (&r->reg_type))
a60de03c
JB
10929 return (const reg_entry *) NULL;
10930
dc821c5f 10931 if ((r->reg_type.bitfield.dword
00cee14f 10932 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
4a5c67ed
JB
10933 || r->reg_type.bitfield.class == RegCR
10934 || r->reg_type.bitfield.class == RegDR
10935 || r->reg_type.bitfield.class == RegTR)
192dc9c6
JB
10936 && !cpu_arch_flags.bitfield.cpui386)
10937 return (const reg_entry *) NULL;
10938
3528c362 10939 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
192dc9c6
JB
10940 return (const reg_entry *) NULL;
10941
6e041cf4
JB
10942 if (!cpu_arch_flags.bitfield.cpuavx512f)
10943 {
f74a6307
JB
10944 if (r->reg_type.bitfield.zmmword
10945 || r->reg_type.bitfield.class == RegMask)
6e041cf4 10946 return (const reg_entry *) NULL;
40f12533 10947
6e041cf4
JB
10948 if (!cpu_arch_flags.bitfield.cpuavx)
10949 {
10950 if (r->reg_type.bitfield.ymmword)
10951 return (const reg_entry *) NULL;
1848e567 10952
6e041cf4
JB
10953 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
10954 return (const reg_entry *) NULL;
10955 }
10956 }
43234a1e 10957
f74a6307 10958 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
1adf7f56
JB
10959 return (const reg_entry *) NULL;
10960
db51cc60 10961 /* Don't allow fake index register unless allow_index_reg isn't 0. */
e968fc9b 10962 if (!allow_index_reg && r->reg_num == RegIZ)
db51cc60
L
10963 return (const reg_entry *) NULL;
10964
1d3f8286
JB
10965 /* Upper 16 vector registers are only available with VREX in 64bit
10966 mode, and require EVEX encoding. */
10967 if (r->reg_flags & RegVRex)
43234a1e 10968 {
e951d5ca 10969 if (!cpu_arch_flags.bitfield.cpuavx512f
43234a1e
L
10970 || flag_code != CODE_64BIT)
10971 return (const reg_entry *) NULL;
1d3f8286
JB
10972
10973 i.vec_encoding = vex_encoding_evex;
43234a1e
L
10974 }
10975
4787f4a5 10976 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
4a5c67ed 10977 && (!cpu_arch_flags.bitfield.cpulm || r->reg_type.bitfield.class != RegCR)
1ae00879 10978 && flag_code != CODE_64BIT)
20f0a1fc 10979 return (const reg_entry *) NULL;
1ae00879 10980
00cee14f
JB
10981 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
10982 && !intel_syntax)
b7240065
JB
10983 return (const reg_entry *) NULL;
10984
252b5132
RH
10985 return r;
10986}
4d1bb795
JB
10987
10988/* REG_STRING starts *before* REGISTER_PREFIX. */
10989
10990static const reg_entry *
10991parse_register (char *reg_string, char **end_op)
10992{
10993 const reg_entry *r;
10994
10995 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
10996 r = parse_real_register (reg_string, end_op);
10997 else
10998 r = NULL;
10999 if (!r)
11000 {
11001 char *save = input_line_pointer;
11002 char c;
11003 symbolS *symbolP;
11004
11005 input_line_pointer = reg_string;
d02603dc 11006 c = get_symbol_name (&reg_string);
4d1bb795
JB
11007 symbolP = symbol_find (reg_string);
11008 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
11009 {
11010 const expressionS *e = symbol_get_value_expression (symbolP);
11011
0398aac5 11012 know (e->X_op == O_register);
4eed87de 11013 know (e->X_add_number >= 0
c3fe08fa 11014 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 11015 r = i386_regtab + e->X_add_number;
d3bb6b49 11016 if ((r->reg_flags & RegVRex))
86fa6981 11017 i.vec_encoding = vex_encoding_evex;
4d1bb795
JB
11018 *end_op = input_line_pointer;
11019 }
11020 *input_line_pointer = c;
11021 input_line_pointer = save;
11022 }
11023 return r;
11024}
11025
11026int
11027i386_parse_name (char *name, expressionS *e, char *nextcharP)
11028{
11029 const reg_entry *r;
11030 char *end = input_line_pointer;
11031
11032 *end = *nextcharP;
11033 r = parse_register (name, &input_line_pointer);
11034 if (r && end <= input_line_pointer)
11035 {
11036 *nextcharP = *input_line_pointer;
11037 *input_line_pointer = 0;
11038 e->X_op = O_register;
11039 e->X_add_number = r - i386_regtab;
11040 return 1;
11041 }
11042 input_line_pointer = end;
11043 *end = 0;
ee86248c 11044 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
11045}
11046
11047void
11048md_operand (expressionS *e)
11049{
ee86248c
JB
11050 char *end;
11051 const reg_entry *r;
4d1bb795 11052
ee86248c
JB
11053 switch (*input_line_pointer)
11054 {
11055 case REGISTER_PREFIX:
11056 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
11057 if (r)
11058 {
11059 e->X_op = O_register;
11060 e->X_add_number = r - i386_regtab;
11061 input_line_pointer = end;
11062 }
ee86248c
JB
11063 break;
11064
11065 case '[':
9c2799c2 11066 gas_assert (intel_syntax);
ee86248c
JB
11067 end = input_line_pointer++;
11068 expression (e);
11069 if (*input_line_pointer == ']')
11070 {
11071 ++input_line_pointer;
11072 e->X_op_symbol = make_expr_symbol (e);
11073 e->X_add_symbol = NULL;
11074 e->X_add_number = 0;
11075 e->X_op = O_index;
11076 }
11077 else
11078 {
11079 e->X_op = O_absent;
11080 input_line_pointer = end;
11081 }
11082 break;
4d1bb795
JB
11083 }
11084}
11085
252b5132 11086\f
4cc782b5 11087#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 11088const char *md_shortopts = "kVQ:sqnO::";
252b5132 11089#else
b6f8c7c4 11090const char *md_shortopts = "qnO::";
252b5132 11091#endif
6e0b89ee 11092
3e73aa7c 11093#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
11094#define OPTION_64 (OPTION_MD_BASE + 1)
11095#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
11096#define OPTION_MARCH (OPTION_MD_BASE + 3)
11097#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
11098#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
11099#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
11100#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
11101#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 11102#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 11103#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 11104#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
11105#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
11106#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
11107#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 11108#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
11109#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
11110#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 11111#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 11112#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 11113#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 11114#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
11115#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
11116#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 11117#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 11118#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 11119#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
b3b91714 11120
99ad8390
NC
11121struct option md_longopts[] =
11122{
3e73aa7c 11123 {"32", no_argument, NULL, OPTION_32},
321098a5 11124#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 11125 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 11126 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
11127#endif
11128#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 11129 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 11130 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 11131 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 11132#endif
b3b91714 11133 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
11134 {"march", required_argument, NULL, OPTION_MARCH},
11135 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
11136 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
11137 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
11138 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
11139 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 11140 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 11141 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 11142 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 11143 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 11144 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 11145 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
11146 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
11147 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
11148# if defined (TE_PE) || defined (TE_PEP)
11149 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
11150#endif
d1982f93 11151 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 11152 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 11153 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 11154 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
5db04b09
L
11155 {"mamd64", no_argument, NULL, OPTION_MAMD64},
11156 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
11157 {NULL, no_argument, NULL, 0}
11158};
11159size_t md_longopts_size = sizeof (md_longopts);
11160
11161int
17b9d67d 11162md_parse_option (int c, const char *arg)
252b5132 11163{
91d6fa6a 11164 unsigned int j;
293f5f65 11165 char *arch, *next, *saved;
9103f4f4 11166
252b5132
RH
11167 switch (c)
11168 {
12b55ccc
L
11169 case 'n':
11170 optimize_align_code = 0;
11171 break;
11172
a38cf1db
AM
11173 case 'q':
11174 quiet_warnings = 1;
252b5132
RH
11175 break;
11176
11177#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
11178 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
11179 should be emitted or not. FIXME: Not implemented. */
11180 case 'Q':
d4693039
JB
11181 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
11182 return 0;
252b5132
RH
11183 break;
11184
11185 /* -V: SVR4 argument to print version ID. */
11186 case 'V':
11187 print_version_id ();
11188 break;
11189
a38cf1db
AM
11190 /* -k: Ignore for FreeBSD compatibility. */
11191 case 'k':
252b5132 11192 break;
4cc782b5
ILT
11193
11194 case 's':
11195 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 11196 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 11197 break;
8dcea932
L
11198
11199 case OPTION_MSHARED:
11200 shared = 1;
11201 break;
b4a3a7b4
L
11202
11203 case OPTION_X86_USED_NOTE:
11204 if (strcasecmp (arg, "yes") == 0)
11205 x86_used_note = 1;
11206 else if (strcasecmp (arg, "no") == 0)
11207 x86_used_note = 0;
11208 else
11209 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
11210 break;
11211
11212
99ad8390 11213#endif
321098a5 11214#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 11215 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
11216 case OPTION_64:
11217 {
11218 const char **list, **l;
11219
3e73aa7c
JH
11220 list = bfd_target_list ();
11221 for (l = list; *l != NULL; l++)
8620418b 11222 if (CONST_STRNEQ (*l, "elf64-x86-64")
99ad8390
NC
11223 || strcmp (*l, "coff-x86-64") == 0
11224 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
11225 || strcmp (*l, "pei-x86-64") == 0
11226 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
11227 {
11228 default_arch = "x86_64";
11229 break;
11230 }
3e73aa7c 11231 if (*l == NULL)
2b5d6a91 11232 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
11233 free (list);
11234 }
11235 break;
11236#endif
252b5132 11237
351f65ca 11238#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 11239 case OPTION_X32:
351f65ca
L
11240 if (IS_ELF)
11241 {
11242 const char **list, **l;
11243
11244 list = bfd_target_list ();
11245 for (l = list; *l != NULL; l++)
11246 if (CONST_STRNEQ (*l, "elf32-x86-64"))
11247 {
11248 default_arch = "x86_64:32";
11249 break;
11250 }
11251 if (*l == NULL)
2b5d6a91 11252 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
11253 free (list);
11254 }
11255 else
11256 as_fatal (_("32bit x86_64 is only supported for ELF"));
11257 break;
11258#endif
11259
6e0b89ee
AM
11260 case OPTION_32:
11261 default_arch = "i386";
11262 break;
11263
b3b91714
AM
11264 case OPTION_DIVIDE:
11265#ifdef SVR4_COMMENT_CHARS
11266 {
11267 char *n, *t;
11268 const char *s;
11269
add39d23 11270 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
11271 t = n;
11272 for (s = i386_comment_chars; *s != '\0'; s++)
11273 if (*s != '/')
11274 *t++ = *s;
11275 *t = '\0';
11276 i386_comment_chars = n;
11277 }
11278#endif
11279 break;
11280
9103f4f4 11281 case OPTION_MARCH:
293f5f65
L
11282 saved = xstrdup (arg);
11283 arch = saved;
11284 /* Allow -march=+nosse. */
11285 if (*arch == '+')
11286 arch++;
6305a203 11287 do
9103f4f4 11288 {
6305a203 11289 if (*arch == '.')
2b5d6a91 11290 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
11291 next = strchr (arch, '+');
11292 if (next)
11293 *next++ = '\0';
91d6fa6a 11294 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 11295 {
91d6fa6a 11296 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 11297 {
6305a203 11298 /* Processor. */
1ded5609
JB
11299 if (! cpu_arch[j].flags.bitfield.cpui386)
11300 continue;
11301
91d6fa6a 11302 cpu_arch_name = cpu_arch[j].name;
6305a203 11303 cpu_sub_arch_name = NULL;
91d6fa6a
NC
11304 cpu_arch_flags = cpu_arch[j].flags;
11305 cpu_arch_isa = cpu_arch[j].type;
11306 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
11307 if (!cpu_arch_tune_set)
11308 {
11309 cpu_arch_tune = cpu_arch_isa;
11310 cpu_arch_tune_flags = cpu_arch_isa_flags;
11311 }
11312 break;
11313 }
91d6fa6a
NC
11314 else if (*cpu_arch [j].name == '.'
11315 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 11316 {
33eaf5de 11317 /* ISA extension. */
6305a203 11318 i386_cpu_flags flags;
309d3373 11319
293f5f65
L
11320 flags = cpu_flags_or (cpu_arch_flags,
11321 cpu_arch[j].flags);
81486035 11322
5b64d091 11323 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
11324 {
11325 if (cpu_sub_arch_name)
11326 {
11327 char *name = cpu_sub_arch_name;
11328 cpu_sub_arch_name = concat (name,
91d6fa6a 11329 cpu_arch[j].name,
1bf57e9f 11330 (const char *) NULL);
6305a203
L
11331 free (name);
11332 }
11333 else
91d6fa6a 11334 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 11335 cpu_arch_flags = flags;
a586129e 11336 cpu_arch_isa_flags = flags;
6305a203 11337 }
0089dace
L
11338 else
11339 cpu_arch_isa_flags
11340 = cpu_flags_or (cpu_arch_isa_flags,
11341 cpu_arch[j].flags);
6305a203 11342 break;
ccc9c027 11343 }
9103f4f4 11344 }
6305a203 11345
293f5f65
L
11346 if (j >= ARRAY_SIZE (cpu_arch))
11347 {
33eaf5de 11348 /* Disable an ISA extension. */
293f5f65
L
11349 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
11350 if (strcmp (arch, cpu_noarch [j].name) == 0)
11351 {
11352 i386_cpu_flags flags;
11353
11354 flags = cpu_flags_and_not (cpu_arch_flags,
11355 cpu_noarch[j].flags);
11356 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
11357 {
11358 if (cpu_sub_arch_name)
11359 {
11360 char *name = cpu_sub_arch_name;
11361 cpu_sub_arch_name = concat (arch,
11362 (const char *) NULL);
11363 free (name);
11364 }
11365 else
11366 cpu_sub_arch_name = xstrdup (arch);
11367 cpu_arch_flags = flags;
11368 cpu_arch_isa_flags = flags;
11369 }
11370 break;
11371 }
11372
11373 if (j >= ARRAY_SIZE (cpu_noarch))
11374 j = ARRAY_SIZE (cpu_arch);
11375 }
11376
91d6fa6a 11377 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 11378 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
11379
11380 arch = next;
9103f4f4 11381 }
293f5f65
L
11382 while (next != NULL);
11383 free (saved);
9103f4f4
L
11384 break;
11385
11386 case OPTION_MTUNE:
11387 if (*arg == '.')
2b5d6a91 11388 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 11389 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 11390 {
91d6fa6a 11391 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 11392 {
ccc9c027 11393 cpu_arch_tune_set = 1;
91d6fa6a
NC
11394 cpu_arch_tune = cpu_arch [j].type;
11395 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
11396 break;
11397 }
11398 }
91d6fa6a 11399 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 11400 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
11401 break;
11402
1efbbeb4
L
11403 case OPTION_MMNEMONIC:
11404 if (strcasecmp (arg, "att") == 0)
11405 intel_mnemonic = 0;
11406 else if (strcasecmp (arg, "intel") == 0)
11407 intel_mnemonic = 1;
11408 else
2b5d6a91 11409 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
11410 break;
11411
11412 case OPTION_MSYNTAX:
11413 if (strcasecmp (arg, "att") == 0)
11414 intel_syntax = 0;
11415 else if (strcasecmp (arg, "intel") == 0)
11416 intel_syntax = 1;
11417 else
2b5d6a91 11418 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
11419 break;
11420
11421 case OPTION_MINDEX_REG:
11422 allow_index_reg = 1;
11423 break;
11424
11425 case OPTION_MNAKED_REG:
11426 allow_naked_reg = 1;
11427 break;
11428
c0f3af97
L
11429 case OPTION_MSSE2AVX:
11430 sse2avx = 1;
11431 break;
11432
daf50ae7
L
11433 case OPTION_MSSE_CHECK:
11434 if (strcasecmp (arg, "error") == 0)
7bab8ab5 11435 sse_check = check_error;
daf50ae7 11436 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 11437 sse_check = check_warning;
daf50ae7 11438 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 11439 sse_check = check_none;
daf50ae7 11440 else
2b5d6a91 11441 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
11442 break;
11443
7bab8ab5
JB
11444 case OPTION_MOPERAND_CHECK:
11445 if (strcasecmp (arg, "error") == 0)
11446 operand_check = check_error;
11447 else if (strcasecmp (arg, "warning") == 0)
11448 operand_check = check_warning;
11449 else if (strcasecmp (arg, "none") == 0)
11450 operand_check = check_none;
11451 else
11452 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
11453 break;
11454
539f890d
L
11455 case OPTION_MAVXSCALAR:
11456 if (strcasecmp (arg, "128") == 0)
11457 avxscalar = vex128;
11458 else if (strcasecmp (arg, "256") == 0)
11459 avxscalar = vex256;
11460 else
2b5d6a91 11461 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
11462 break;
11463
03751133
L
11464 case OPTION_MVEXWIG:
11465 if (strcmp (arg, "0") == 0)
40c9c8de 11466 vexwig = vexw0;
03751133 11467 else if (strcmp (arg, "1") == 0)
40c9c8de 11468 vexwig = vexw1;
03751133
L
11469 else
11470 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
11471 break;
11472
7e8b059b
L
11473 case OPTION_MADD_BND_PREFIX:
11474 add_bnd_prefix = 1;
11475 break;
11476
43234a1e
L
11477 case OPTION_MEVEXLIG:
11478 if (strcmp (arg, "128") == 0)
11479 evexlig = evexl128;
11480 else if (strcmp (arg, "256") == 0)
11481 evexlig = evexl256;
11482 else if (strcmp (arg, "512") == 0)
11483 evexlig = evexl512;
11484 else
11485 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
11486 break;
11487
d3d3c6db
IT
11488 case OPTION_MEVEXRCIG:
11489 if (strcmp (arg, "rne") == 0)
11490 evexrcig = rne;
11491 else if (strcmp (arg, "rd") == 0)
11492 evexrcig = rd;
11493 else if (strcmp (arg, "ru") == 0)
11494 evexrcig = ru;
11495 else if (strcmp (arg, "rz") == 0)
11496 evexrcig = rz;
11497 else
11498 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
11499 break;
11500
43234a1e
L
11501 case OPTION_MEVEXWIG:
11502 if (strcmp (arg, "0") == 0)
11503 evexwig = evexw0;
11504 else if (strcmp (arg, "1") == 0)
11505 evexwig = evexw1;
11506 else
11507 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
11508 break;
11509
167ad85b
TG
11510# if defined (TE_PE) || defined (TE_PEP)
11511 case OPTION_MBIG_OBJ:
11512 use_big_obj = 1;
11513 break;
11514#endif
11515
d1982f93 11516 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
11517 if (strcasecmp (arg, "yes") == 0)
11518 omit_lock_prefix = 1;
11519 else if (strcasecmp (arg, "no") == 0)
11520 omit_lock_prefix = 0;
11521 else
11522 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
11523 break;
11524
e4e00185
AS
11525 case OPTION_MFENCE_AS_LOCK_ADD:
11526 if (strcasecmp (arg, "yes") == 0)
11527 avoid_fence = 1;
11528 else if (strcasecmp (arg, "no") == 0)
11529 avoid_fence = 0;
11530 else
11531 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
11532 break;
11533
0cb4071e
L
11534 case OPTION_MRELAX_RELOCATIONS:
11535 if (strcasecmp (arg, "yes") == 0)
11536 generate_relax_relocations = 1;
11537 else if (strcasecmp (arg, "no") == 0)
11538 generate_relax_relocations = 0;
11539 else
11540 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
11541 break;
11542
5db04b09 11543 case OPTION_MAMD64:
e89c5eaa 11544 intel64 = 0;
5db04b09
L
11545 break;
11546
11547 case OPTION_MINTEL64:
e89c5eaa 11548 intel64 = 1;
5db04b09
L
11549 break;
11550
b6f8c7c4
L
11551 case 'O':
11552 if (arg == NULL)
11553 {
11554 optimize = 1;
11555 /* Turn off -Os. */
11556 optimize_for_space = 0;
11557 }
11558 else if (*arg == 's')
11559 {
11560 optimize_for_space = 1;
11561 /* Turn on all encoding optimizations. */
41fd2579 11562 optimize = INT_MAX;
b6f8c7c4
L
11563 }
11564 else
11565 {
11566 optimize = atoi (arg);
11567 /* Turn off -Os. */
11568 optimize_for_space = 0;
11569 }
11570 break;
11571
252b5132
RH
11572 default:
11573 return 0;
11574 }
11575 return 1;
11576}
11577
8a2c8fef
L
11578#define MESSAGE_TEMPLATE \
11579" "
11580
293f5f65
L
11581static char *
11582output_message (FILE *stream, char *p, char *message, char *start,
11583 int *left_p, const char *name, int len)
11584{
11585 int size = sizeof (MESSAGE_TEMPLATE);
11586 int left = *left_p;
11587
11588 /* Reserve 2 spaces for ", " or ",\0" */
11589 left -= len + 2;
11590
11591 /* Check if there is any room. */
11592 if (left >= 0)
11593 {
11594 if (p != start)
11595 {
11596 *p++ = ',';
11597 *p++ = ' ';
11598 }
11599 p = mempcpy (p, name, len);
11600 }
11601 else
11602 {
11603 /* Output the current message now and start a new one. */
11604 *p++ = ',';
11605 *p = '\0';
11606 fprintf (stream, "%s\n", message);
11607 p = start;
11608 left = size - (start - message) - len - 2;
11609
11610 gas_assert (left >= 0);
11611
11612 p = mempcpy (p, name, len);
11613 }
11614
11615 *left_p = left;
11616 return p;
11617}
11618
8a2c8fef 11619static void
1ded5609 11620show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
11621{
11622 static char message[] = MESSAGE_TEMPLATE;
11623 char *start = message + 27;
11624 char *p;
11625 int size = sizeof (MESSAGE_TEMPLATE);
11626 int left;
11627 const char *name;
11628 int len;
11629 unsigned int j;
11630
11631 p = start;
11632 left = size - (start - message);
11633 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
11634 {
11635 /* Should it be skipped? */
11636 if (cpu_arch [j].skip)
11637 continue;
11638
11639 name = cpu_arch [j].name;
11640 len = cpu_arch [j].len;
11641 if (*name == '.')
11642 {
11643 /* It is an extension. Skip if we aren't asked to show it. */
11644 if (ext)
11645 {
11646 name++;
11647 len--;
11648 }
11649 else
11650 continue;
11651 }
11652 else if (ext)
11653 {
11654 /* It is an processor. Skip if we show only extension. */
11655 continue;
11656 }
1ded5609
JB
11657 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
11658 {
11659 /* It is an impossible processor - skip. */
11660 continue;
11661 }
8a2c8fef 11662
293f5f65 11663 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
11664 }
11665
293f5f65
L
11666 /* Display disabled extensions. */
11667 if (ext)
11668 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
11669 {
11670 name = cpu_noarch [j].name;
11671 len = cpu_noarch [j].len;
11672 p = output_message (stream, p, message, start, &left, name,
11673 len);
11674 }
11675
8a2c8fef
L
11676 *p = '\0';
11677 fprintf (stream, "%s\n", message);
11678}
11679
252b5132 11680void
8a2c8fef 11681md_show_usage (FILE *stream)
252b5132 11682{
4cc782b5
ILT
11683#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11684 fprintf (stream, _("\
d4693039 11685 -Qy, -Qn ignored\n\
a38cf1db 11686 -V print assembler version number\n\
b3b91714
AM
11687 -k ignored\n"));
11688#endif
11689 fprintf (stream, _("\
12b55ccc 11690 -n Do not optimize code alignment\n\
b3b91714
AM
11691 -q quieten some warnings\n"));
11692#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11693 fprintf (stream, _("\
a38cf1db 11694 -s ignored\n"));
b3b91714 11695#endif
d7f449c0
L
11696#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
11697 || defined (TE_PE) || defined (TE_PEP))
751d281c 11698 fprintf (stream, _("\
570561f7 11699 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 11700#endif
b3b91714
AM
11701#ifdef SVR4_COMMENT_CHARS
11702 fprintf (stream, _("\
11703 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
11704#else
11705 fprintf (stream, _("\
b3b91714 11706 --divide ignored\n"));
4cc782b5 11707#endif
9103f4f4 11708 fprintf (stream, _("\
6305a203 11709 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 11710 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 11711 show_arch (stream, 0, 1);
8a2c8fef
L
11712 fprintf (stream, _("\
11713 EXTENSION is combination of:\n"));
1ded5609 11714 show_arch (stream, 1, 0);
6305a203 11715 fprintf (stream, _("\
8a2c8fef 11716 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 11717 show_arch (stream, 0, 0);
ba104c83 11718 fprintf (stream, _("\
c0f3af97
L
11719 -msse2avx encode SSE instructions with VEX prefix\n"));
11720 fprintf (stream, _("\
7c5c05ef 11721 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
11722 check SSE instructions\n"));
11723 fprintf (stream, _("\
7c5c05ef 11724 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
11725 check operand combinations for validity\n"));
11726 fprintf (stream, _("\
7c5c05ef
L
11727 -mavxscalar=[128|256] (default: 128)\n\
11728 encode scalar AVX instructions with specific vector\n\
539f890d
L
11729 length\n"));
11730 fprintf (stream, _("\
03751133
L
11731 -mvexwig=[0|1] (default: 0)\n\
11732 encode VEX instructions with specific VEX.W value\n\
11733 for VEX.W bit ignored instructions\n"));
11734 fprintf (stream, _("\
7c5c05ef
L
11735 -mevexlig=[128|256|512] (default: 128)\n\
11736 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
11737 length\n"));
11738 fprintf (stream, _("\
7c5c05ef
L
11739 -mevexwig=[0|1] (default: 0)\n\
11740 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
11741 for EVEX.W bit ignored instructions\n"));
11742 fprintf (stream, _("\
7c5c05ef 11743 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
11744 encode EVEX instructions with specific EVEX.RC value\n\
11745 for SAE-only ignored instructions\n"));
11746 fprintf (stream, _("\
7c5c05ef
L
11747 -mmnemonic=[att|intel] "));
11748 if (SYSV386_COMPAT)
11749 fprintf (stream, _("(default: att)\n"));
11750 else
11751 fprintf (stream, _("(default: intel)\n"));
11752 fprintf (stream, _("\
11753 use AT&T/Intel mnemonic\n"));
ba104c83 11754 fprintf (stream, _("\
7c5c05ef
L
11755 -msyntax=[att|intel] (default: att)\n\
11756 use AT&T/Intel syntax\n"));
ba104c83
L
11757 fprintf (stream, _("\
11758 -mindex-reg support pseudo index registers\n"));
11759 fprintf (stream, _("\
11760 -mnaked-reg don't require `%%' prefix for registers\n"));
11761 fprintf (stream, _("\
7e8b059b 11762 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 11763#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
11764 fprintf (stream, _("\
11765 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
11766 fprintf (stream, _("\
11767 -mx86-used-note=[no|yes] "));
11768 if (DEFAULT_X86_USED_NOTE)
11769 fprintf (stream, _("(default: yes)\n"));
11770 else
11771 fprintf (stream, _("(default: no)\n"));
11772 fprintf (stream, _("\
11773 generate x86 used ISA and feature properties\n"));
11774#endif
11775#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
11776 fprintf (stream, _("\
11777 -mbig-obj generate big object files\n"));
11778#endif
d022bddd 11779 fprintf (stream, _("\
7c5c05ef 11780 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 11781 strip all lock prefixes\n"));
5db04b09 11782 fprintf (stream, _("\
7c5c05ef 11783 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
11784 encode lfence, mfence and sfence as\n\
11785 lock addl $0x0, (%%{re}sp)\n"));
11786 fprintf (stream, _("\
7c5c05ef
L
11787 -mrelax-relocations=[no|yes] "));
11788 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
11789 fprintf (stream, _("(default: yes)\n"));
11790 else
11791 fprintf (stream, _("(default: no)\n"));
11792 fprintf (stream, _("\
0cb4071e
L
11793 generate relax relocations\n"));
11794 fprintf (stream, _("\
7c5c05ef 11795 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
11796 fprintf (stream, _("\
11797 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
11798}
11799
3e73aa7c 11800#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 11801 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 11802 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
11803
11804/* Pick the target format to use. */
11805
47926f60 11806const char *
e3bb37b5 11807i386_target_format (void)
252b5132 11808{
351f65ca
L
11809 if (!strncmp (default_arch, "x86_64", 6))
11810 {
11811 update_code_flag (CODE_64BIT, 1);
11812 if (default_arch[6] == '\0')
7f56bc95 11813 x86_elf_abi = X86_64_ABI;
351f65ca 11814 else
7f56bc95 11815 x86_elf_abi = X86_64_X32_ABI;
351f65ca 11816 }
3e73aa7c 11817 else if (!strcmp (default_arch, "i386"))
78f12dd3 11818 update_code_flag (CODE_32BIT, 1);
5197d474
L
11819 else if (!strcmp (default_arch, "iamcu"))
11820 {
11821 update_code_flag (CODE_32BIT, 1);
11822 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
11823 {
11824 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
11825 cpu_arch_name = "iamcu";
11826 cpu_sub_arch_name = NULL;
11827 cpu_arch_flags = iamcu_flags;
11828 cpu_arch_isa = PROCESSOR_IAMCU;
11829 cpu_arch_isa_flags = iamcu_flags;
11830 if (!cpu_arch_tune_set)
11831 {
11832 cpu_arch_tune = cpu_arch_isa;
11833 cpu_arch_tune_flags = cpu_arch_isa_flags;
11834 }
11835 }
8d471ec1 11836 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
11837 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
11838 cpu_arch_name);
11839 }
3e73aa7c 11840 else
2b5d6a91 11841 as_fatal (_("unknown architecture"));
89507696
JB
11842
11843 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
11844 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
11845 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
11846 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
11847
252b5132
RH
11848 switch (OUTPUT_FLAVOR)
11849 {
9384f2ff 11850#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 11851 case bfd_target_aout_flavour:
47926f60 11852 return AOUT_TARGET_FORMAT;
4c63da97 11853#endif
9384f2ff
AM
11854#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
11855# if defined (TE_PE) || defined (TE_PEP)
11856 case bfd_target_coff_flavour:
167ad85b
TG
11857 if (flag_code == CODE_64BIT)
11858 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
11859 else
11860 return "pe-i386";
9384f2ff 11861# elif defined (TE_GO32)
0561d57c
JK
11862 case bfd_target_coff_flavour:
11863 return "coff-go32";
9384f2ff 11864# else
252b5132
RH
11865 case bfd_target_coff_flavour:
11866 return "coff-i386";
9384f2ff 11867# endif
4c63da97 11868#endif
3e73aa7c 11869#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 11870 case bfd_target_elf_flavour:
3e73aa7c 11871 {
351f65ca
L
11872 const char *format;
11873
11874 switch (x86_elf_abi)
4fa24527 11875 {
351f65ca
L
11876 default:
11877 format = ELF_TARGET_FORMAT;
11878 break;
7f56bc95 11879 case X86_64_ABI:
351f65ca 11880 use_rela_relocations = 1;
4fa24527 11881 object_64bit = 1;
351f65ca
L
11882 format = ELF_TARGET_FORMAT64;
11883 break;
7f56bc95 11884 case X86_64_X32_ABI:
4fa24527 11885 use_rela_relocations = 1;
351f65ca 11886 object_64bit = 1;
862be3fb 11887 disallow_64bit_reloc = 1;
351f65ca
L
11888 format = ELF_TARGET_FORMAT32;
11889 break;
4fa24527 11890 }
3632d14b 11891 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 11892 {
7f56bc95 11893 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
11894 as_fatal (_("Intel L1OM is 64bit only"));
11895 return ELF_TARGET_L1OM_FORMAT;
11896 }
b49f93f6 11897 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
11898 {
11899 if (x86_elf_abi != X86_64_ABI)
11900 as_fatal (_("Intel K1OM is 64bit only"));
11901 return ELF_TARGET_K1OM_FORMAT;
11902 }
81486035
L
11903 else if (cpu_arch_isa == PROCESSOR_IAMCU)
11904 {
11905 if (x86_elf_abi != I386_ABI)
11906 as_fatal (_("Intel MCU is 32bit only"));
11907 return ELF_TARGET_IAMCU_FORMAT;
11908 }
8a9036a4 11909 else
351f65ca 11910 return format;
3e73aa7c 11911 }
e57f8c65
TG
11912#endif
11913#if defined (OBJ_MACH_O)
11914 case bfd_target_mach_o_flavour:
d382c579
TG
11915 if (flag_code == CODE_64BIT)
11916 {
11917 use_rela_relocations = 1;
11918 object_64bit = 1;
11919 return "mach-o-x86-64";
11920 }
11921 else
11922 return "mach-o-i386";
4c63da97 11923#endif
252b5132
RH
11924 default:
11925 abort ();
11926 return NULL;
11927 }
11928}
11929
47926f60 11930#endif /* OBJ_MAYBE_ more than one */
252b5132 11931\f
252b5132 11932symbolS *
7016a5d5 11933md_undefined_symbol (char *name)
252b5132 11934{
18dc2407
ILT
11935 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
11936 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
11937 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
11938 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
11939 {
11940 if (!GOT_symbol)
11941 {
11942 if (symbol_find (name))
11943 as_bad (_("GOT already in symbol table"));
11944 GOT_symbol = symbol_new (name, undefined_section,
11945 (valueT) 0, &zero_address_frag);
11946 };
11947 return GOT_symbol;
11948 }
252b5132
RH
11949 return 0;
11950}
11951
11952/* Round up a section size to the appropriate boundary. */
47926f60 11953
252b5132 11954valueT
7016a5d5 11955md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 11956{
4c63da97
AM
11957#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
11958 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
11959 {
11960 /* For a.out, force the section size to be aligned. If we don't do
11961 this, BFD will align it for us, but it will not write out the
11962 final bytes of the section. This may be a bug in BFD, but it is
11963 easier to fix it here since that is how the other a.out targets
11964 work. */
11965 int align;
11966
fd361982 11967 align = bfd_section_alignment (segment);
8d3842cd 11968 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 11969 }
252b5132
RH
11970#endif
11971
11972 return size;
11973}
11974
11975/* On the i386, PC-relative offsets are relative to the start of the
11976 next instruction. That is, the address of the offset, plus its
11977 size, since the offset is always the last part of the insn. */
11978
11979long
e3bb37b5 11980md_pcrel_from (fixS *fixP)
252b5132
RH
11981{
11982 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
11983}
11984
11985#ifndef I386COFF
11986
11987static void
e3bb37b5 11988s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 11989{
29b0f896 11990 int temp;
252b5132 11991
8a75718c
JB
11992#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11993 if (IS_ELF)
11994 obj_elf_section_change_hook ();
11995#endif
252b5132
RH
11996 temp = get_absolute_expression ();
11997 subseg_set (bss_section, (subsegT) temp);
11998 demand_empty_rest_of_line ();
11999}
12000
12001#endif
12002
252b5132 12003void
e3bb37b5 12004i386_validate_fix (fixS *fixp)
252b5132 12005{
02a86693 12006 if (fixp->fx_subsy)
252b5132 12007 {
02a86693 12008 if (fixp->fx_subsy == GOT_symbol)
23df1078 12009 {
02a86693
L
12010 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
12011 {
12012 if (!object_64bit)
12013 abort ();
12014#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12015 if (fixp->fx_tcbit2)
56ceb5b5
L
12016 fixp->fx_r_type = (fixp->fx_tcbit
12017 ? BFD_RELOC_X86_64_REX_GOTPCRELX
12018 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
12019 else
12020#endif
12021 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
12022 }
d6ab8113 12023 else
02a86693
L
12024 {
12025 if (!object_64bit)
12026 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
12027 else
12028 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
12029 }
12030 fixp->fx_subsy = 0;
23df1078 12031 }
252b5132 12032 }
02a86693
L
12033#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12034 else if (!object_64bit)
12035 {
12036 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
12037 && fixp->fx_tcbit2)
12038 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
12039 }
12040#endif
252b5132
RH
12041}
12042
252b5132 12043arelent *
7016a5d5 12044tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
12045{
12046 arelent *rel;
12047 bfd_reloc_code_real_type code;
12048
12049 switch (fixp->fx_r_type)
12050 {
8ce3d284 12051#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
12052 case BFD_RELOC_SIZE32:
12053 case BFD_RELOC_SIZE64:
12054 if (S_IS_DEFINED (fixp->fx_addsy)
12055 && !S_IS_EXTERNAL (fixp->fx_addsy))
12056 {
12057 /* Resolve size relocation against local symbol to size of
12058 the symbol plus addend. */
12059 valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
12060 if (fixp->fx_r_type == BFD_RELOC_SIZE32
12061 && !fits_in_unsigned_long (value))
12062 as_bad_where (fixp->fx_file, fixp->fx_line,
12063 _("symbol size computation overflow"));
12064 fixp->fx_addsy = NULL;
12065 fixp->fx_subsy = NULL;
12066 md_apply_fix (fixp, (valueT *) &value, NULL);
12067 return NULL;
12068 }
8ce3d284 12069#endif
1a0670f3 12070 /* Fall through. */
8fd4256d 12071
3e73aa7c
JH
12072 case BFD_RELOC_X86_64_PLT32:
12073 case BFD_RELOC_X86_64_GOT32:
12074 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
12075 case BFD_RELOC_X86_64_GOTPCRELX:
12076 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
12077 case BFD_RELOC_386_PLT32:
12078 case BFD_RELOC_386_GOT32:
02a86693 12079 case BFD_RELOC_386_GOT32X:
252b5132
RH
12080 case BFD_RELOC_386_GOTOFF:
12081 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
12082 case BFD_RELOC_386_TLS_GD:
12083 case BFD_RELOC_386_TLS_LDM:
12084 case BFD_RELOC_386_TLS_LDO_32:
12085 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
12086 case BFD_RELOC_386_TLS_IE:
12087 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
12088 case BFD_RELOC_386_TLS_LE_32:
12089 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
12090 case BFD_RELOC_386_TLS_GOTDESC:
12091 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
12092 case BFD_RELOC_X86_64_TLSGD:
12093 case BFD_RELOC_X86_64_TLSLD:
12094 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 12095 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
12096 case BFD_RELOC_X86_64_GOTTPOFF:
12097 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
12098 case BFD_RELOC_X86_64_TPOFF64:
12099 case BFD_RELOC_X86_64_GOTOFF64:
12100 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
12101 case BFD_RELOC_X86_64_GOT64:
12102 case BFD_RELOC_X86_64_GOTPCREL64:
12103 case BFD_RELOC_X86_64_GOTPC64:
12104 case BFD_RELOC_X86_64_GOTPLT64:
12105 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
12106 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
12107 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
12108 case BFD_RELOC_RVA:
12109 case BFD_RELOC_VTABLE_ENTRY:
12110 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
12111#ifdef TE_PE
12112 case BFD_RELOC_32_SECREL:
12113#endif
252b5132
RH
12114 code = fixp->fx_r_type;
12115 break;
dbbaec26
L
12116 case BFD_RELOC_X86_64_32S:
12117 if (!fixp->fx_pcrel)
12118 {
12119 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
12120 code = fixp->fx_r_type;
12121 break;
12122 }
1a0670f3 12123 /* Fall through. */
252b5132 12124 default:
93382f6d 12125 if (fixp->fx_pcrel)
252b5132 12126 {
93382f6d
AM
12127 switch (fixp->fx_size)
12128 {
12129 default:
b091f402
AM
12130 as_bad_where (fixp->fx_file, fixp->fx_line,
12131 _("can not do %d byte pc-relative relocation"),
12132 fixp->fx_size);
93382f6d
AM
12133 code = BFD_RELOC_32_PCREL;
12134 break;
12135 case 1: code = BFD_RELOC_8_PCREL; break;
12136 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 12137 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
12138#ifdef BFD64
12139 case 8: code = BFD_RELOC_64_PCREL; break;
12140#endif
93382f6d
AM
12141 }
12142 }
12143 else
12144 {
12145 switch (fixp->fx_size)
12146 {
12147 default:
b091f402
AM
12148 as_bad_where (fixp->fx_file, fixp->fx_line,
12149 _("can not do %d byte relocation"),
12150 fixp->fx_size);
93382f6d
AM
12151 code = BFD_RELOC_32;
12152 break;
12153 case 1: code = BFD_RELOC_8; break;
12154 case 2: code = BFD_RELOC_16; break;
12155 case 4: code = BFD_RELOC_32; break;
937149dd 12156#ifdef BFD64
3e73aa7c 12157 case 8: code = BFD_RELOC_64; break;
937149dd 12158#endif
93382f6d 12159 }
252b5132
RH
12160 }
12161 break;
12162 }
252b5132 12163
d182319b
JB
12164 if ((code == BFD_RELOC_32
12165 || code == BFD_RELOC_32_PCREL
12166 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
12167 && GOT_symbol
12168 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 12169 {
4fa24527 12170 if (!object_64bit)
d6ab8113
JB
12171 code = BFD_RELOC_386_GOTPC;
12172 else
12173 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 12174 }
7b81dfbb
AJ
12175 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
12176 && GOT_symbol
12177 && fixp->fx_addsy == GOT_symbol)
12178 {
12179 code = BFD_RELOC_X86_64_GOTPC64;
12180 }
252b5132 12181
add39d23
TS
12182 rel = XNEW (arelent);
12183 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 12184 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
12185
12186 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 12187
3e73aa7c
JH
12188 if (!use_rela_relocations)
12189 {
12190 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
12191 vtable entry to be used in the relocation's section offset. */
12192 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
12193 rel->address = fixp->fx_offset;
fbeb56a4
DK
12194#if defined (OBJ_COFF) && defined (TE_PE)
12195 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
12196 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
12197 else
12198#endif
c6682705 12199 rel->addend = 0;
3e73aa7c
JH
12200 }
12201 /* Use the rela in 64bit mode. */
252b5132 12202 else
3e73aa7c 12203 {
862be3fb
L
12204 if (disallow_64bit_reloc)
12205 switch (code)
12206 {
862be3fb
L
12207 case BFD_RELOC_X86_64_DTPOFF64:
12208 case BFD_RELOC_X86_64_TPOFF64:
12209 case BFD_RELOC_64_PCREL:
12210 case BFD_RELOC_X86_64_GOTOFF64:
12211 case BFD_RELOC_X86_64_GOT64:
12212 case BFD_RELOC_X86_64_GOTPCREL64:
12213 case BFD_RELOC_X86_64_GOTPC64:
12214 case BFD_RELOC_X86_64_GOTPLT64:
12215 case BFD_RELOC_X86_64_PLTOFF64:
12216 as_bad_where (fixp->fx_file, fixp->fx_line,
12217 _("cannot represent relocation type %s in x32 mode"),
12218 bfd_get_reloc_code_name (code));
12219 break;
12220 default:
12221 break;
12222 }
12223
062cd5e7
AS
12224 if (!fixp->fx_pcrel)
12225 rel->addend = fixp->fx_offset;
12226 else
12227 switch (code)
12228 {
12229 case BFD_RELOC_X86_64_PLT32:
12230 case BFD_RELOC_X86_64_GOT32:
12231 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
12232 case BFD_RELOC_X86_64_GOTPCRELX:
12233 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
12234 case BFD_RELOC_X86_64_TLSGD:
12235 case BFD_RELOC_X86_64_TLSLD:
12236 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
12237 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
12238 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
12239 rel->addend = fixp->fx_offset - fixp->fx_size;
12240 break;
12241 default:
12242 rel->addend = (section->vma
12243 - fixp->fx_size
12244 + fixp->fx_addnumber
12245 + md_pcrel_from (fixp));
12246 break;
12247 }
3e73aa7c
JH
12248 }
12249
252b5132
RH
12250 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
12251 if (rel->howto == NULL)
12252 {
12253 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 12254 _("cannot represent relocation type %s"),
252b5132
RH
12255 bfd_get_reloc_code_name (code));
12256 /* Set howto to a garbage value so that we can keep going. */
12257 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 12258 gas_assert (rel->howto != NULL);
252b5132
RH
12259 }
12260
12261 return rel;
12262}
12263
ee86248c 12264#include "tc-i386-intel.c"
54cfded0 12265
a60de03c
JB
12266void
12267tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 12268{
a60de03c
JB
12269 int saved_naked_reg;
12270 char saved_register_dot;
54cfded0 12271
a60de03c
JB
12272 saved_naked_reg = allow_naked_reg;
12273 allow_naked_reg = 1;
12274 saved_register_dot = register_chars['.'];
12275 register_chars['.'] = '.';
12276 allow_pseudo_reg = 1;
12277 expression_and_evaluate (exp);
12278 allow_pseudo_reg = 0;
12279 register_chars['.'] = saved_register_dot;
12280 allow_naked_reg = saved_naked_reg;
12281
e96d56a1 12282 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 12283 {
a60de03c
JB
12284 if ((addressT) exp->X_add_number < i386_regtab_size)
12285 {
12286 exp->X_op = O_constant;
12287 exp->X_add_number = i386_regtab[exp->X_add_number]
12288 .dw2_regnum[flag_code >> 1];
12289 }
12290 else
12291 exp->X_op = O_illegal;
54cfded0 12292 }
54cfded0
AM
12293}
12294
12295void
12296tc_x86_frame_initial_instructions (void)
12297{
a60de03c
JB
12298 static unsigned int sp_regno[2];
12299
12300 if (!sp_regno[flag_code >> 1])
12301 {
12302 char *saved_input = input_line_pointer;
12303 char sp[][4] = {"esp", "rsp"};
12304 expressionS exp;
a4447b93 12305
a60de03c
JB
12306 input_line_pointer = sp[flag_code >> 1];
12307 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 12308 gas_assert (exp.X_op == O_constant);
a60de03c
JB
12309 sp_regno[flag_code >> 1] = exp.X_add_number;
12310 input_line_pointer = saved_input;
12311 }
a4447b93 12312
61ff971f
L
12313 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
12314 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 12315}
d2b2c203 12316
d7921315
L
12317int
12318x86_dwarf2_addr_size (void)
12319{
12320#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
12321 if (x86_elf_abi == X86_64_X32_ABI)
12322 return 4;
12323#endif
12324 return bfd_arch_bits_per_address (stdoutput) / 8;
12325}
12326
d2b2c203
DJ
12327int
12328i386_elf_section_type (const char *str, size_t len)
12329{
12330 if (flag_code == CODE_64BIT
12331 && len == sizeof ("unwind") - 1
12332 && strncmp (str, "unwind", 6) == 0)
12333 return SHT_X86_64_UNWIND;
12334
12335 return -1;
12336}
bb41ade5 12337
ad5fec3b
EB
12338#ifdef TE_SOLARIS
12339void
12340i386_solaris_fix_up_eh_frame (segT sec)
12341{
12342 if (flag_code == CODE_64BIT)
12343 elf_section_type (sec) = SHT_X86_64_UNWIND;
12344}
12345#endif
12346
bb41ade5
AM
12347#ifdef TE_PE
12348void
12349tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
12350{
91d6fa6a 12351 expressionS exp;
bb41ade5 12352
91d6fa6a
NC
12353 exp.X_op = O_secrel;
12354 exp.X_add_symbol = symbol;
12355 exp.X_add_number = 0;
12356 emit_expr (&exp, size);
bb41ade5
AM
12357}
12358#endif
3b22753a
L
12359
12360#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12361/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
12362
01e1a5bc 12363bfd_vma
6d4af3c2 12364x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
12365{
12366 if (flag_code == CODE_64BIT)
12367 {
12368 if (letter == 'l')
12369 return SHF_X86_64_LARGE;
12370
8f3bae45 12371 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 12372 }
3b22753a 12373 else
8f3bae45 12374 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
12375 return -1;
12376}
12377
01e1a5bc 12378bfd_vma
3b22753a
L
12379x86_64_section_word (char *str, size_t len)
12380{
8620418b 12381 if (len == 5 && flag_code == CODE_64BIT && CONST_STRNEQ (str, "large"))
3b22753a
L
12382 return SHF_X86_64_LARGE;
12383
12384 return -1;
12385}
12386
12387static void
12388handle_large_common (int small ATTRIBUTE_UNUSED)
12389{
12390 if (flag_code != CODE_64BIT)
12391 {
12392 s_comm_internal (0, elf_common_parse);
12393 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
12394 }
12395 else
12396 {
12397 static segT lbss_section;
12398 asection *saved_com_section_ptr = elf_com_section_ptr;
12399 asection *saved_bss_section = bss_section;
12400
12401 if (lbss_section == NULL)
12402 {
12403 flagword applicable;
12404 segT seg = now_seg;
12405 subsegT subseg = now_subseg;
12406
12407 /* The .lbss section is for local .largecomm symbols. */
12408 lbss_section = subseg_new (".lbss", 0);
12409 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 12410 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
12411 seg_info (lbss_section)->bss = 1;
12412
12413 subseg_set (seg, subseg);
12414 }
12415
12416 elf_com_section_ptr = &_bfd_elf_large_com_section;
12417 bss_section = lbss_section;
12418
12419 s_comm_internal (0, elf_common_parse);
12420
12421 elf_com_section_ptr = saved_com_section_ptr;
12422 bss_section = saved_bss_section;
12423 }
12424}
12425#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
This page took 3.164353 seconds and 4 git commands to generate.