gas: Correct ChangeLog for commit 5d79adc4b22b0abd
[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
101/*
102 'templates' is for grouping together 'template' structures for opcodes
103 of the same name. This is only used for storing the insns in the grand
104 ole hash table of insns.
105 The templates themselves start at START and range up to (but not including)
106 END.
107 */
108typedef struct
109{
d3ce72d0
NC
110 const insn_template *start;
111 const insn_template *end;
6305a203
L
112}
113templates;
114
115/* 386 operand encoding bytes: see 386 book for details of this. */
116typedef struct
117{
118 unsigned int regmem; /* codes register or memory operand */
119 unsigned int reg; /* codes register operand (or extended opcode) */
120 unsigned int mode; /* how to interpret regmem & reg */
121}
122modrm_byte;
123
124/* x86-64 extension prefix. */
125typedef int rex_byte;
126
6305a203
L
127/* 386 opcode byte to code indirect addressing. */
128typedef struct
129{
130 unsigned base;
131 unsigned index;
132 unsigned scale;
133}
134sib_byte;
135
6305a203
L
136/* x86 arch names, types and features */
137typedef struct
138{
139 const char *name; /* arch name */
8a2c8fef 140 unsigned int len; /* arch string length */
6305a203
L
141 enum processor_type type; /* arch type */
142 i386_cpu_flags flags; /* cpu feature flags */
8a2c8fef 143 unsigned int skip; /* show_arch should skip this. */
6305a203
L
144}
145arch_entry;
146
293f5f65
L
147/* Used to turn off indicated flags. */
148typedef struct
149{
150 const char *name; /* arch name */
151 unsigned int len; /* arch string length */
152 i386_cpu_flags flags; /* cpu feature flags */
153}
154noarch_entry;
155
78f12dd3 156static void update_code_flag (int, int);
e3bb37b5
L
157static void set_code_flag (int);
158static void set_16bit_gcc_code_flag (int);
159static void set_intel_syntax (int);
1efbbeb4 160static void set_intel_mnemonic (int);
db51cc60 161static void set_allow_index_reg (int);
7bab8ab5 162static void set_check (int);
e3bb37b5 163static void set_cpu_arch (int);
6482c264 164#ifdef TE_PE
e3bb37b5 165static void pe_directive_secrel (int);
6482c264 166#endif
e3bb37b5
L
167static void signed_cons (int);
168static char *output_invalid (int c);
ee86248c
JB
169static int i386_finalize_immediate (segT, expressionS *, i386_operand_type,
170 const char *);
171static int i386_finalize_displacement (segT, expressionS *, i386_operand_type,
172 const char *);
a7619375 173static int i386_att_operand (char *);
e3bb37b5 174static int i386_intel_operand (char *, int);
ee86248c
JB
175static int i386_intel_simplify (expressionS *);
176static int i386_intel_parse_name (const char *, expressionS *);
e3bb37b5
L
177static const reg_entry *parse_register (char *, char **);
178static char *parse_insn (char *, char *);
179static char *parse_operands (char *, const char *);
180static void swap_operands (void);
4d456e3d 181static void swap_2_operands (int, int);
e3bb37b5
L
182static void optimize_imm (void);
183static void optimize_disp (void);
83b16ac6 184static const insn_template *match_template (char);
e3bb37b5
L
185static int check_string (void);
186static int process_suffix (void);
187static int check_byte_reg (void);
188static int check_long_reg (void);
189static int check_qword_reg (void);
190static int check_word_reg (void);
191static int finalize_imm (void);
192static int process_operands (void);
193static const seg_entry *build_modrm_byte (void);
194static void output_insn (void);
195static void output_imm (fragS *, offsetT);
196static void output_disp (fragS *, offsetT);
29b0f896 197#ifndef I386COFF
e3bb37b5 198static void s_bss (int);
252b5132 199#endif
17d4e2a2
L
200#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
201static void handle_large_common (int small ATTRIBUTE_UNUSED);
b4a3a7b4
L
202
203/* GNU_PROPERTY_X86_ISA_1_USED. */
204static unsigned int x86_isa_1_used;
205/* GNU_PROPERTY_X86_FEATURE_2_USED. */
206static unsigned int x86_feature_2_used;
207/* Generate x86 used ISA and feature properties. */
208static unsigned int x86_used_note = DEFAULT_X86_USED_NOTE;
17d4e2a2 209#endif
252b5132 210
a847613f 211static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 212
43234a1e
L
213/* This struct describes rounding control and SAE in the instruction. */
214struct RC_Operation
215{
216 enum rc_type
217 {
218 rne = 0,
219 rd,
220 ru,
221 rz,
222 saeonly
223 } type;
224 int operand;
225};
226
227static struct RC_Operation rc_op;
228
229/* The struct describes masking, applied to OPERAND in the instruction.
230 MASK is a pointer to the corresponding mask register. ZEROING tells
231 whether merging or zeroing mask is used. */
232struct Mask_Operation
233{
234 const reg_entry *mask;
235 unsigned int zeroing;
236 /* The operand where this operation is associated. */
237 int operand;
238};
239
240static struct Mask_Operation mask_op;
241
242/* The struct describes broadcasting, applied to OPERAND. FACTOR is
243 broadcast factor. */
244struct Broadcast_Operation
245{
8e6e0792 246 /* Type of broadcast: {1to2}, {1to4}, {1to8}, or {1to16}. */
43234a1e
L
247 int type;
248
249 /* Index of broadcasted operand. */
250 int operand;
4a1b91ea
L
251
252 /* Number of bytes to broadcast. */
253 int bytes;
43234a1e
L
254};
255
256static struct Broadcast_Operation broadcast_op;
257
c0f3af97
L
258/* VEX prefix. */
259typedef struct
260{
43234a1e
L
261 /* VEX prefix is either 2 byte or 3 byte. EVEX is 4 byte. */
262 unsigned char bytes[4];
c0f3af97
L
263 unsigned int length;
264 /* Destination or source register specifier. */
265 const reg_entry *register_specifier;
266} vex_prefix;
267
252b5132 268/* 'md_assemble ()' gathers together information and puts it into a
47926f60 269 i386_insn. */
252b5132 270
520dc8e8
AM
271union i386_op
272 {
273 expressionS *disps;
274 expressionS *imms;
275 const reg_entry *regs;
276 };
277
a65babc9
L
278enum i386_error
279 {
86e026a4 280 operand_size_mismatch,
a65babc9
L
281 operand_type_mismatch,
282 register_type_mismatch,
283 number_of_operands_mismatch,
284 invalid_instruction_suffix,
285 bad_imm4,
a65babc9
L
286 unsupported_with_intel_mnemonic,
287 unsupported_syntax,
6c30d220
L
288 unsupported,
289 invalid_vsib_address,
7bab8ab5 290 invalid_vector_register_set,
43234a1e
L
291 unsupported_vector_index_register,
292 unsupported_broadcast,
43234a1e
L
293 broadcast_needed,
294 unsupported_masking,
295 mask_not_on_destination,
296 no_default_mask,
297 unsupported_rc_sae,
298 rc_sae_operand_not_last_imm,
299 invalid_register_operand,
a65babc9
L
300 };
301
252b5132
RH
302struct _i386_insn
303 {
47926f60 304 /* TM holds the template for the insn were currently assembling. */
d3ce72d0 305 insn_template tm;
252b5132 306
7d5e4556
L
307 /* SUFFIX holds the instruction size suffix for byte, word, dword
308 or qword, if given. */
252b5132
RH
309 char suffix;
310
47926f60 311 /* OPERANDS gives the number of given operands. */
252b5132
RH
312 unsigned int operands;
313
314 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
315 of given register, displacement, memory operands and immediate
47926f60 316 operands. */
252b5132
RH
317 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
318
319 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 320 use OP[i] for the corresponding operand. */
40fb9820 321 i386_operand_type types[MAX_OPERANDS];
252b5132 322
520dc8e8
AM
323 /* Displacement expression, immediate expression, or register for each
324 operand. */
325 union i386_op op[MAX_OPERANDS];
252b5132 326
3e73aa7c
JH
327 /* Flags for operands. */
328 unsigned int flags[MAX_OPERANDS];
329#define Operand_PCrel 1
c48dadc9 330#define Operand_Mem 2
3e73aa7c 331
252b5132 332 /* Relocation type for operand */
f86103b7 333 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 334
252b5132
RH
335 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
336 the base index byte below. */
337 const reg_entry *base_reg;
338 const reg_entry *index_reg;
339 unsigned int log2_scale_factor;
340
341 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 342 explicit segment overrides are given. */
ce8a8b2f 343 const seg_entry *seg[2];
252b5132 344
8325cc63
JB
345 /* Copied first memory operand string, for re-checking. */
346 char *memop1_string;
347
252b5132
RH
348 /* PREFIX holds all the given prefix opcodes (usually null).
349 PREFIXES is the number of prefix opcodes. */
350 unsigned int prefixes;
351 unsigned char prefix[MAX_PREFIXES];
352
b4a3a7b4
L
353 /* Has MMX register operands. */
354 bfd_boolean has_regmmx;
355
356 /* Has XMM register operands. */
357 bfd_boolean has_regxmm;
358
359 /* Has YMM register operands. */
360 bfd_boolean has_regymm;
361
362 /* Has ZMM register operands. */
363 bfd_boolean has_regzmm;
364
252b5132 365 /* RM and SIB are the modrm byte and the sib byte where the
c1e679ec 366 addressing modes of this insn are encoded. */
252b5132 367 modrm_byte rm;
3e73aa7c 368 rex_byte rex;
43234a1e 369 rex_byte vrex;
252b5132 370 sib_byte sib;
c0f3af97 371 vex_prefix vex;
b6169b20 372
43234a1e
L
373 /* Masking attributes. */
374 struct Mask_Operation *mask;
375
376 /* Rounding control and SAE attributes. */
377 struct RC_Operation *rounding;
378
379 /* Broadcasting attributes. */
380 struct Broadcast_Operation *broadcast;
381
382 /* Compressed disp8*N attribute. */
383 unsigned int memshift;
384
86fa6981
L
385 /* Prefer load or store in encoding. */
386 enum
387 {
388 dir_encoding_default = 0,
389 dir_encoding_load,
64c49ab3
JB
390 dir_encoding_store,
391 dir_encoding_swap
86fa6981 392 } dir_encoding;
891edac4 393
a501d77e
L
394 /* Prefer 8bit or 32bit displacement in encoding. */
395 enum
396 {
397 disp_encoding_default = 0,
398 disp_encoding_8bit,
399 disp_encoding_32bit
400 } disp_encoding;
f8a5c266 401
6b6b6807
L
402 /* Prefer the REX byte in encoding. */
403 bfd_boolean rex_encoding;
404
b6f8c7c4
L
405 /* Disable instruction size optimization. */
406 bfd_boolean no_optimize;
407
86fa6981
L
408 /* How to encode vector instructions. */
409 enum
410 {
411 vex_encoding_default = 0,
412 vex_encoding_vex2,
413 vex_encoding_vex3,
414 vex_encoding_evex
415 } vec_encoding;
416
d5de92cf
L
417 /* REP prefix. */
418 const char *rep_prefix;
419
165de32a
L
420 /* HLE prefix. */
421 const char *hle_prefix;
42164a71 422
7e8b059b
L
423 /* Have BND prefix. */
424 const char *bnd_prefix;
425
04ef582a
L
426 /* Have NOTRACK prefix. */
427 const char *notrack_prefix;
428
891edac4 429 /* Error message. */
a65babc9 430 enum i386_error error;
252b5132
RH
431 };
432
433typedef struct _i386_insn i386_insn;
434
43234a1e
L
435/* Link RC type with corresponding string, that'll be looked for in
436 asm. */
437struct RC_name
438{
439 enum rc_type type;
440 const char *name;
441 unsigned int len;
442};
443
444static const struct RC_name RC_NamesTable[] =
445{
446 { rne, STRING_COMMA_LEN ("rn-sae") },
447 { rd, STRING_COMMA_LEN ("rd-sae") },
448 { ru, STRING_COMMA_LEN ("ru-sae") },
449 { rz, STRING_COMMA_LEN ("rz-sae") },
450 { saeonly, STRING_COMMA_LEN ("sae") },
451};
452
252b5132
RH
453/* List of chars besides those in app.c:symbol_chars that can start an
454 operand. Used to prevent the scrubber eating vital white-space. */
86fa6981 455const char extra_symbol_chars[] = "*%-([{}"
252b5132 456#ifdef LEX_AT
32137342
NC
457 "@"
458#endif
459#ifdef LEX_QM
460 "?"
252b5132 461#endif
32137342 462 ;
252b5132 463
29b0f896
AM
464#if (defined (TE_I386AIX) \
465 || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
3896cfd5 466 && !defined (TE_GNU) \
29b0f896 467 && !defined (TE_LINUX) \
8d63c93e 468 && !defined (TE_NACL) \
29b0f896 469 && !defined (TE_FreeBSD) \
5b806d27 470 && !defined (TE_DragonFly) \
29b0f896 471 && !defined (TE_NetBSD)))
252b5132 472/* This array holds the chars that always start a comment. If the
b3b91714
AM
473 pre-processor is disabled, these aren't very useful. The option
474 --divide will remove '/' from this list. */
475const char *i386_comment_chars = "#/";
476#define SVR4_COMMENT_CHARS 1
252b5132 477#define PREFIX_SEPARATOR '\\'
252b5132 478
b3b91714
AM
479#else
480const char *i386_comment_chars = "#";
481#define PREFIX_SEPARATOR '/'
482#endif
483
252b5132
RH
484/* This array holds the chars that only start a comment at the beginning of
485 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
486 .line and .file directives will appear in the pre-processed output.
487 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 488 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
489 #NO_APP at the beginning of its output.
490 Also note that comments started like this one will always work if
252b5132 491 '/' isn't otherwise defined. */
b3b91714 492const char line_comment_chars[] = "#/";
252b5132 493
63a0b638 494const char line_separator_chars[] = ";";
252b5132 495
ce8a8b2f
AM
496/* Chars that can be used to separate mant from exp in floating point
497 nums. */
252b5132
RH
498const char EXP_CHARS[] = "eE";
499
ce8a8b2f
AM
500/* Chars that mean this number is a floating point constant
501 As in 0f12.456
502 or 0d1.2345e12. */
252b5132
RH
503const char FLT_CHARS[] = "fFdDxX";
504
ce8a8b2f 505/* Tables for lexical analysis. */
252b5132
RH
506static char mnemonic_chars[256];
507static char register_chars[256];
508static char operand_chars[256];
509static char identifier_chars[256];
510static char digit_chars[256];
511
ce8a8b2f 512/* Lexical macros. */
252b5132
RH
513#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
514#define is_operand_char(x) (operand_chars[(unsigned char) x])
515#define is_register_char(x) (register_chars[(unsigned char) x])
516#define is_space_char(x) ((x) == ' ')
517#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
518#define is_digit_char(x) (digit_chars[(unsigned char) x])
519
0234cb7c 520/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
521static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
522
523/* md_assemble() always leaves the strings it's passed unaltered. To
524 effect this we maintain a stack of saved characters that we've smashed
525 with '\0's (indicating end of strings for various sub-fields of the
47926f60 526 assembler instruction). */
252b5132 527static char save_stack[32];
ce8a8b2f 528static char *save_stack_p;
252b5132
RH
529#define END_STRING_AND_SAVE(s) \
530 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
531#define RESTORE_END_STRING(s) \
532 do { *(s) = *--save_stack_p; } while (0)
533
47926f60 534/* The instruction we're assembling. */
252b5132
RH
535static i386_insn i;
536
537/* Possible templates for current insn. */
538static const templates *current_templates;
539
31b2323c
L
540/* Per instruction expressionS buffers: max displacements & immediates. */
541static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
542static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 543
47926f60 544/* Current operand we are working on. */
ee86248c 545static int this_operand = -1;
252b5132 546
3e73aa7c
JH
547/* We support four different modes. FLAG_CODE variable is used to distinguish
548 these. */
549
550enum flag_code {
551 CODE_32BIT,
552 CODE_16BIT,
553 CODE_64BIT };
554
555static enum flag_code flag_code;
4fa24527 556static unsigned int object_64bit;
862be3fb 557static unsigned int disallow_64bit_reloc;
3e73aa7c
JH
558static int use_rela_relocations = 0;
559
7af8ed2d
NC
560#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
561 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
562 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
563
351f65ca
L
564/* The ELF ABI to use. */
565enum x86_elf_abi
566{
567 I386_ABI,
7f56bc95
L
568 X86_64_ABI,
569 X86_64_X32_ABI
351f65ca
L
570};
571
572static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 573#endif
351f65ca 574
167ad85b
TG
575#if defined (TE_PE) || defined (TE_PEP)
576/* Use big object file format. */
577static int use_big_obj = 0;
578#endif
579
8dcea932
L
580#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
581/* 1 if generating code for a shared library. */
582static int shared = 0;
583#endif
584
47926f60
KH
585/* 1 for intel syntax,
586 0 if att syntax. */
587static int intel_syntax = 0;
252b5132 588
e89c5eaa
L
589/* 1 for Intel64 ISA,
590 0 if AMD64 ISA. */
591static int intel64;
592
1efbbeb4
L
593/* 1 for intel mnemonic,
594 0 if att mnemonic. */
595static int intel_mnemonic = !SYSV386_COMPAT;
596
a60de03c
JB
597/* 1 if pseudo registers are permitted. */
598static int allow_pseudo_reg = 0;
599
47926f60
KH
600/* 1 if register prefix % not required. */
601static int allow_naked_reg = 0;
252b5132 602
33eaf5de 603/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
604 instructions supporting it, even if this prefix wasn't specified
605 explicitly. */
606static int add_bnd_prefix = 0;
607
ba104c83 608/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
609static int allow_index_reg = 0;
610
d022bddd
IT
611/* 1 if the assembler should ignore LOCK prefix, even if it was
612 specified explicitly. */
613static int omit_lock_prefix = 0;
614
e4e00185
AS
615/* 1 if the assembler should encode lfence, mfence, and sfence as
616 "lock addl $0, (%{re}sp)". */
617static int avoid_fence = 0;
618
0cb4071e
L
619/* 1 if the assembler should generate relax relocations. */
620
621static int generate_relax_relocations
622 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
623
7bab8ab5 624static enum check_kind
daf50ae7 625 {
7bab8ab5
JB
626 check_none = 0,
627 check_warning,
628 check_error
daf50ae7 629 }
7bab8ab5 630sse_check, operand_check = check_warning;
daf50ae7 631
b6f8c7c4
L
632/* Optimization:
633 1. Clear the REX_W bit with register operand if possible.
634 2. Above plus use 128bit vector instruction to clear the full vector
635 register.
636 */
637static int optimize = 0;
638
639/* Optimization:
640 1. Clear the REX_W bit with register operand if possible.
641 2. Above plus use 128bit vector instruction to clear the full vector
642 register.
643 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
644 "testb $imm7,%r8".
645 */
646static int optimize_for_space = 0;
647
2ca3ace5
L
648/* Register prefix used for error message. */
649static const char *register_prefix = "%";
650
47926f60
KH
651/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
652 leave, push, and pop instructions so that gcc has the same stack
653 frame as in 32 bit mode. */
654static char stackop_size = '\0';
eecb386c 655
12b55ccc
L
656/* Non-zero to optimize code alignment. */
657int optimize_align_code = 1;
658
47926f60
KH
659/* Non-zero to quieten some warnings. */
660static int quiet_warnings = 0;
a38cf1db 661
47926f60
KH
662/* CPU name. */
663static const char *cpu_arch_name = NULL;
6305a203 664static char *cpu_sub_arch_name = NULL;
a38cf1db 665
47926f60 666/* CPU feature flags. */
40fb9820
L
667static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
668
ccc9c027
L
669/* If we have selected a cpu we are generating instructions for. */
670static int cpu_arch_tune_set = 0;
671
9103f4f4 672/* Cpu we are generating instructions for. */
fbf3f584 673enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4
L
674
675/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 676static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 677
ccc9c027 678/* CPU instruction set architecture used. */
fbf3f584 679enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 680
9103f4f4 681/* CPU feature flags of instruction set architecture used. */
fbf3f584 682i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 683
fddf5b5b
AM
684/* If set, conditional jumps are not automatically promoted to handle
685 larger than a byte offset. */
686static unsigned int no_cond_jump_promotion = 0;
687
c0f3af97
L
688/* Encode SSE instructions with VEX prefix. */
689static unsigned int sse2avx;
690
539f890d
L
691/* Encode scalar AVX instructions with specific vector length. */
692static enum
693 {
694 vex128 = 0,
695 vex256
696 } avxscalar;
697
03751133
L
698/* Encode VEX WIG instructions with specific vex.w. */
699static enum
700 {
701 vexw0 = 0,
702 vexw1
703 } vexwig;
704
43234a1e
L
705/* Encode scalar EVEX LIG instructions with specific vector length. */
706static enum
707 {
708 evexl128 = 0,
709 evexl256,
710 evexl512
711 } evexlig;
712
713/* Encode EVEX WIG instructions with specific evex.w. */
714static enum
715 {
716 evexw0 = 0,
717 evexw1
718 } evexwig;
719
d3d3c6db
IT
720/* Value to encode in EVEX RC bits, for SAE-only instructions. */
721static enum rc_type evexrcig = rne;
722
29b0f896 723/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 724static symbolS *GOT_symbol;
29b0f896 725
a4447b93
RH
726/* The dwarf2 return column, adjusted for 32 or 64 bit. */
727unsigned int x86_dwarf2_return_column;
728
729/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
730int x86_cie_data_alignment;
731
252b5132 732/* Interface to relax_segment.
fddf5b5b
AM
733 There are 3 major relax states for 386 jump insns because the
734 different types of jumps add different sizes to frags when we're
735 figuring out what sort of jump to choose to reach a given label. */
252b5132 736
47926f60 737/* Types. */
93c2a809
AM
738#define UNCOND_JUMP 0
739#define COND_JUMP 1
740#define COND_JUMP86 2
fddf5b5b 741
47926f60 742/* Sizes. */
252b5132
RH
743#define CODE16 1
744#define SMALL 0
29b0f896 745#define SMALL16 (SMALL | CODE16)
252b5132 746#define BIG 2
29b0f896 747#define BIG16 (BIG | CODE16)
252b5132
RH
748
749#ifndef INLINE
750#ifdef __GNUC__
751#define INLINE __inline__
752#else
753#define INLINE
754#endif
755#endif
756
fddf5b5b
AM
757#define ENCODE_RELAX_STATE(type, size) \
758 ((relax_substateT) (((type) << 2) | (size)))
759#define TYPE_FROM_RELAX_STATE(s) \
760 ((s) >> 2)
761#define DISP_SIZE_FROM_RELAX_STATE(s) \
762 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
763
764/* This table is used by relax_frag to promote short jumps to long
765 ones where necessary. SMALL (short) jumps may be promoted to BIG
766 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
767 don't allow a short jump in a 32 bit code segment to be promoted to
768 a 16 bit offset jump because it's slower (requires data size
769 prefix), and doesn't work, unless the destination is in the bottom
770 64k of the code segment (The top 16 bits of eip are zeroed). */
771
772const relax_typeS md_relax_table[] =
773{
24eab124
AM
774 /* The fields are:
775 1) most positive reach of this state,
776 2) most negative reach of this state,
93c2a809 777 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 778 4) which index into the table to try if we can't fit into this one. */
252b5132 779
fddf5b5b 780 /* UNCOND_JUMP states. */
93c2a809
AM
781 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
782 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
783 /* dword jmp adds 4 bytes to frag:
784 0 extra opcode bytes, 4 displacement bytes. */
252b5132 785 {0, 0, 4, 0},
93c2a809
AM
786 /* word jmp adds 2 byte2 to frag:
787 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
788 {0, 0, 2, 0},
789
93c2a809
AM
790 /* COND_JUMP states. */
791 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
792 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
793 /* dword conditionals adds 5 bytes to frag:
794 1 extra opcode byte, 4 displacement bytes. */
795 {0, 0, 5, 0},
fddf5b5b 796 /* word conditionals add 3 bytes to frag:
93c2a809
AM
797 1 extra opcode byte, 2 displacement bytes. */
798 {0, 0, 3, 0},
799
800 /* COND_JUMP86 states. */
801 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
802 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
803 /* dword conditionals adds 5 bytes to frag:
804 1 extra opcode byte, 4 displacement bytes. */
805 {0, 0, 5, 0},
806 /* word conditionals add 4 bytes to frag:
807 1 displacement byte and a 3 byte long branch insn. */
808 {0, 0, 4, 0}
252b5132
RH
809};
810
9103f4f4
L
811static const arch_entry cpu_arch[] =
812{
89507696
JB
813 /* Do not replace the first two entries - i386_target_format()
814 relies on them being there in this order. */
8a2c8fef 815 { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
293f5f65 816 CPU_GENERIC32_FLAGS, 0 },
8a2c8fef 817 { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
293f5f65 818 CPU_GENERIC64_FLAGS, 0 },
8a2c8fef 819 { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
293f5f65 820 CPU_NONE_FLAGS, 0 },
8a2c8fef 821 { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
293f5f65 822 CPU_I186_FLAGS, 0 },
8a2c8fef 823 { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
293f5f65 824 CPU_I286_FLAGS, 0 },
8a2c8fef 825 { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
293f5f65 826 CPU_I386_FLAGS, 0 },
8a2c8fef 827 { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
293f5f65 828 CPU_I486_FLAGS, 0 },
8a2c8fef 829 { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
293f5f65 830 CPU_I586_FLAGS, 0 },
8a2c8fef 831 { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
293f5f65 832 CPU_I686_FLAGS, 0 },
8a2c8fef 833 { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
293f5f65 834 CPU_I586_FLAGS, 0 },
8a2c8fef 835 { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
293f5f65 836 CPU_PENTIUMPRO_FLAGS, 0 },
8a2c8fef 837 { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
293f5f65 838 CPU_P2_FLAGS, 0 },
8a2c8fef 839 { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
293f5f65 840 CPU_P3_FLAGS, 0 },
8a2c8fef 841 { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
293f5f65 842 CPU_P4_FLAGS, 0 },
8a2c8fef 843 { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
293f5f65 844 CPU_CORE_FLAGS, 0 },
8a2c8fef 845 { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
293f5f65 846 CPU_NOCONA_FLAGS, 0 },
8a2c8fef 847 { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
293f5f65 848 CPU_CORE_FLAGS, 1 },
8a2c8fef 849 { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
293f5f65 850 CPU_CORE_FLAGS, 0 },
8a2c8fef 851 { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
293f5f65 852 CPU_CORE2_FLAGS, 1 },
8a2c8fef 853 { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
293f5f65 854 CPU_CORE2_FLAGS, 0 },
8a2c8fef 855 { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
293f5f65 856 CPU_COREI7_FLAGS, 0 },
8a2c8fef 857 { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
293f5f65 858 CPU_L1OM_FLAGS, 0 },
7a9068fe 859 { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
293f5f65 860 CPU_K1OM_FLAGS, 0 },
81486035 861 { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
293f5f65 862 CPU_IAMCU_FLAGS, 0 },
8a2c8fef 863 { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
293f5f65 864 CPU_K6_FLAGS, 0 },
8a2c8fef 865 { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
293f5f65 866 CPU_K6_2_FLAGS, 0 },
8a2c8fef 867 { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
293f5f65 868 CPU_ATHLON_FLAGS, 0 },
8a2c8fef 869 { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
293f5f65 870 CPU_K8_FLAGS, 1 },
8a2c8fef 871 { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
293f5f65 872 CPU_K8_FLAGS, 0 },
8a2c8fef 873 { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
293f5f65 874 CPU_K8_FLAGS, 0 },
8a2c8fef 875 { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
293f5f65 876 CPU_AMDFAM10_FLAGS, 0 },
8aedb9fe 877 { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
293f5f65 878 CPU_BDVER1_FLAGS, 0 },
8aedb9fe 879 { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
293f5f65 880 CPU_BDVER2_FLAGS, 0 },
5e5c50d3 881 { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
293f5f65 882 CPU_BDVER3_FLAGS, 0 },
c7b0bd56 883 { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
293f5f65 884 CPU_BDVER4_FLAGS, 0 },
029f3522 885 { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
293f5f65 886 CPU_ZNVER1_FLAGS, 0 },
a9660a6f
AP
887 { STRING_COMMA_LEN ("znver2"), PROCESSOR_ZNVER,
888 CPU_ZNVER2_FLAGS, 0 },
7b458c12 889 { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
293f5f65 890 CPU_BTVER1_FLAGS, 0 },
7b458c12 891 { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
293f5f65 892 CPU_BTVER2_FLAGS, 0 },
8a2c8fef 893 { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
293f5f65 894 CPU_8087_FLAGS, 0 },
8a2c8fef 895 { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
293f5f65 896 CPU_287_FLAGS, 0 },
8a2c8fef 897 { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
293f5f65 898 CPU_387_FLAGS, 0 },
1848e567
L
899 { STRING_COMMA_LEN (".687"), PROCESSOR_UNKNOWN,
900 CPU_687_FLAGS, 0 },
d871f3f4
L
901 { STRING_COMMA_LEN (".cmov"), PROCESSOR_UNKNOWN,
902 CPU_CMOV_FLAGS, 0 },
903 { STRING_COMMA_LEN (".fxsr"), PROCESSOR_UNKNOWN,
904 CPU_FXSR_FLAGS, 0 },
8a2c8fef 905 { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
293f5f65 906 CPU_MMX_FLAGS, 0 },
8a2c8fef 907 { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
293f5f65 908 CPU_SSE_FLAGS, 0 },
8a2c8fef 909 { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
293f5f65 910 CPU_SSE2_FLAGS, 0 },
8a2c8fef 911 { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
293f5f65 912 CPU_SSE3_FLAGS, 0 },
8a2c8fef 913 { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
293f5f65 914 CPU_SSSE3_FLAGS, 0 },
8a2c8fef 915 { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
293f5f65 916 CPU_SSE4_1_FLAGS, 0 },
8a2c8fef 917 { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
293f5f65 918 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 919 { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
293f5f65 920 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 921 { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
293f5f65 922 CPU_AVX_FLAGS, 0 },
6c30d220 923 { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
293f5f65 924 CPU_AVX2_FLAGS, 0 },
43234a1e 925 { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
293f5f65 926 CPU_AVX512F_FLAGS, 0 },
43234a1e 927 { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
293f5f65 928 CPU_AVX512CD_FLAGS, 0 },
43234a1e 929 { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
293f5f65 930 CPU_AVX512ER_FLAGS, 0 },
43234a1e 931 { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
293f5f65 932 CPU_AVX512PF_FLAGS, 0 },
1dfc6506 933 { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
293f5f65 934 CPU_AVX512DQ_FLAGS, 0 },
1dfc6506 935 { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
293f5f65 936 CPU_AVX512BW_FLAGS, 0 },
1dfc6506 937 { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
293f5f65 938 CPU_AVX512VL_FLAGS, 0 },
8a2c8fef 939 { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
293f5f65 940 CPU_VMX_FLAGS, 0 },
8729a6f6 941 { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
293f5f65 942 CPU_VMFUNC_FLAGS, 0 },
8a2c8fef 943 { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
293f5f65 944 CPU_SMX_FLAGS, 0 },
8a2c8fef 945 { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
293f5f65 946 CPU_XSAVE_FLAGS, 0 },
c7b8aa3a 947 { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
293f5f65 948 CPU_XSAVEOPT_FLAGS, 0 },
1dfc6506 949 { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
293f5f65 950 CPU_XSAVEC_FLAGS, 0 },
1dfc6506 951 { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
293f5f65 952 CPU_XSAVES_FLAGS, 0 },
8a2c8fef 953 { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
293f5f65 954 CPU_AES_FLAGS, 0 },
8a2c8fef 955 { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
293f5f65 956 CPU_PCLMUL_FLAGS, 0 },
8a2c8fef 957 { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
293f5f65 958 CPU_PCLMUL_FLAGS, 1 },
c7b8aa3a 959 { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
293f5f65 960 CPU_FSGSBASE_FLAGS, 0 },
c7b8aa3a 961 { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
293f5f65 962 CPU_RDRND_FLAGS, 0 },
c7b8aa3a 963 { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
293f5f65 964 CPU_F16C_FLAGS, 0 },
6c30d220 965 { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
293f5f65 966 CPU_BMI2_FLAGS, 0 },
8a2c8fef 967 { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
293f5f65 968 CPU_FMA_FLAGS, 0 },
8a2c8fef 969 { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
293f5f65 970 CPU_FMA4_FLAGS, 0 },
8a2c8fef 971 { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
293f5f65 972 CPU_XOP_FLAGS, 0 },
8a2c8fef 973 { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
293f5f65 974 CPU_LWP_FLAGS, 0 },
8a2c8fef 975 { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
293f5f65 976 CPU_MOVBE_FLAGS, 0 },
60aa667e 977 { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
293f5f65 978 CPU_CX16_FLAGS, 0 },
8a2c8fef 979 { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
293f5f65 980 CPU_EPT_FLAGS, 0 },
6c30d220 981 { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
293f5f65 982 CPU_LZCNT_FLAGS, 0 },
42164a71 983 { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
293f5f65 984 CPU_HLE_FLAGS, 0 },
42164a71 985 { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
293f5f65 986 CPU_RTM_FLAGS, 0 },
6c30d220 987 { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
293f5f65 988 CPU_INVPCID_FLAGS, 0 },
8a2c8fef 989 { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
293f5f65 990 CPU_CLFLUSH_FLAGS, 0 },
22109423 991 { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
293f5f65 992 CPU_NOP_FLAGS, 0 },
8a2c8fef 993 { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
293f5f65 994 CPU_SYSCALL_FLAGS, 0 },
8a2c8fef 995 { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
293f5f65 996 CPU_RDTSCP_FLAGS, 0 },
8a2c8fef 997 { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
293f5f65 998 CPU_3DNOW_FLAGS, 0 },
8a2c8fef 999 { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
293f5f65 1000 CPU_3DNOWA_FLAGS, 0 },
8a2c8fef 1001 { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
293f5f65 1002 CPU_PADLOCK_FLAGS, 0 },
8a2c8fef 1003 { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
293f5f65 1004 CPU_SVME_FLAGS, 1 },
8a2c8fef 1005 { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
293f5f65 1006 CPU_SVME_FLAGS, 0 },
8a2c8fef 1007 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
293f5f65 1008 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1009 { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
293f5f65 1010 CPU_ABM_FLAGS, 0 },
87973e9f 1011 { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
293f5f65 1012 CPU_BMI_FLAGS, 0 },
2a2a0f38 1013 { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
293f5f65 1014 CPU_TBM_FLAGS, 0 },
e2e1fcde 1015 { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
293f5f65 1016 CPU_ADX_FLAGS, 0 },
e2e1fcde 1017 { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
293f5f65 1018 CPU_RDSEED_FLAGS, 0 },
e2e1fcde 1019 { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
293f5f65 1020 CPU_PRFCHW_FLAGS, 0 },
5c111e37 1021 { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
293f5f65 1022 CPU_SMAP_FLAGS, 0 },
7e8b059b 1023 { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
293f5f65 1024 CPU_MPX_FLAGS, 0 },
a0046408 1025 { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
293f5f65 1026 CPU_SHA_FLAGS, 0 },
963f3586 1027 { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
293f5f65 1028 CPU_CLFLUSHOPT_FLAGS, 0 },
dcf893b5 1029 { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
293f5f65 1030 CPU_PREFETCHWT1_FLAGS, 0 },
2cf200a4 1031 { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
293f5f65 1032 CPU_SE1_FLAGS, 0 },
c5e7287a 1033 { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
293f5f65 1034 CPU_CLWB_FLAGS, 0 },
2cc1b5aa 1035 { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
293f5f65 1036 CPU_AVX512IFMA_FLAGS, 0 },
14f195c9 1037 { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
293f5f65 1038 CPU_AVX512VBMI_FLAGS, 0 },
920d2ddc
IT
1039 { STRING_COMMA_LEN (".avx512_4fmaps"), PROCESSOR_UNKNOWN,
1040 CPU_AVX512_4FMAPS_FLAGS, 0 },
47acf0bd
IT
1041 { STRING_COMMA_LEN (".avx512_4vnniw"), PROCESSOR_UNKNOWN,
1042 CPU_AVX512_4VNNIW_FLAGS, 0 },
620214f7
IT
1043 { STRING_COMMA_LEN (".avx512_vpopcntdq"), PROCESSOR_UNKNOWN,
1044 CPU_AVX512_VPOPCNTDQ_FLAGS, 0 },
53467f57
IT
1045 { STRING_COMMA_LEN (".avx512_vbmi2"), PROCESSOR_UNKNOWN,
1046 CPU_AVX512_VBMI2_FLAGS, 0 },
8cfcb765
IT
1047 { STRING_COMMA_LEN (".avx512_vnni"), PROCESSOR_UNKNOWN,
1048 CPU_AVX512_VNNI_FLAGS, 0 },
ee6872be
IT
1049 { STRING_COMMA_LEN (".avx512_bitalg"), PROCESSOR_UNKNOWN,
1050 CPU_AVX512_BITALG_FLAGS, 0 },
029f3522 1051 { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
293f5f65 1052 CPU_CLZERO_FLAGS, 0 },
9916071f 1053 { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
293f5f65 1054 CPU_MWAITX_FLAGS, 0 },
8eab4136 1055 { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
293f5f65 1056 CPU_OSPKE_FLAGS, 0 },
8bc52696 1057 { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
293f5f65 1058 CPU_RDPID_FLAGS, 0 },
6b40c462
L
1059 { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
1060 CPU_PTWRITE_FLAGS, 0 },
d777820b
IT
1061 { STRING_COMMA_LEN (".ibt"), PROCESSOR_UNKNOWN,
1062 CPU_IBT_FLAGS, 0 },
1063 { STRING_COMMA_LEN (".shstk"), PROCESSOR_UNKNOWN,
1064 CPU_SHSTK_FLAGS, 0 },
48521003
IT
1065 { STRING_COMMA_LEN (".gfni"), PROCESSOR_UNKNOWN,
1066 CPU_GFNI_FLAGS, 0 },
8dcf1fad
IT
1067 { STRING_COMMA_LEN (".vaes"), PROCESSOR_UNKNOWN,
1068 CPU_VAES_FLAGS, 0 },
ff1982d5
IT
1069 { STRING_COMMA_LEN (".vpclmulqdq"), PROCESSOR_UNKNOWN,
1070 CPU_VPCLMULQDQ_FLAGS, 0 },
3233d7d0
IT
1071 { STRING_COMMA_LEN (".wbnoinvd"), PROCESSOR_UNKNOWN,
1072 CPU_WBNOINVD_FLAGS, 0 },
be3a8dca
IT
1073 { STRING_COMMA_LEN (".pconfig"), PROCESSOR_UNKNOWN,
1074 CPU_PCONFIG_FLAGS, 0 },
de89d0a3
IT
1075 { STRING_COMMA_LEN (".waitpkg"), PROCESSOR_UNKNOWN,
1076 CPU_WAITPKG_FLAGS, 0 },
c48935d7
IT
1077 { STRING_COMMA_LEN (".cldemote"), PROCESSOR_UNKNOWN,
1078 CPU_CLDEMOTE_FLAGS, 0 },
c0a30a9f
L
1079 { STRING_COMMA_LEN (".movdiri"), PROCESSOR_UNKNOWN,
1080 CPU_MOVDIRI_FLAGS, 0 },
1081 { STRING_COMMA_LEN (".movdir64b"), PROCESSOR_UNKNOWN,
1082 CPU_MOVDIR64B_FLAGS, 0 },
d6aab7a1
XG
1083 { STRING_COMMA_LEN (".avx512_bf16"), PROCESSOR_UNKNOWN,
1084 CPU_AVX512_BF16_FLAGS, 0 },
9186c494
L
1085 { STRING_COMMA_LEN (".avx512_vp2intersect"), PROCESSOR_UNKNOWN,
1086 CPU_AVX512_VP2INTERSECT_FLAGS, 0 },
293f5f65
L
1087};
1088
1089static const noarch_entry cpu_noarch[] =
1090{
1091 { STRING_COMMA_LEN ("no87"), CPU_ANY_X87_FLAGS },
1848e567
L
1092 { STRING_COMMA_LEN ("no287"), CPU_ANY_287_FLAGS },
1093 { STRING_COMMA_LEN ("no387"), CPU_ANY_387_FLAGS },
1094 { STRING_COMMA_LEN ("no687"), CPU_ANY_687_FLAGS },
d871f3f4
L
1095 { STRING_COMMA_LEN ("nocmov"), CPU_ANY_CMOV_FLAGS },
1096 { STRING_COMMA_LEN ("nofxsr"), CPU_ANY_FXSR_FLAGS },
293f5f65
L
1097 { STRING_COMMA_LEN ("nommx"), CPU_ANY_MMX_FLAGS },
1098 { STRING_COMMA_LEN ("nosse"), CPU_ANY_SSE_FLAGS },
1848e567
L
1099 { STRING_COMMA_LEN ("nosse2"), CPU_ANY_SSE2_FLAGS },
1100 { STRING_COMMA_LEN ("nosse3"), CPU_ANY_SSE3_FLAGS },
1101 { STRING_COMMA_LEN ("nossse3"), CPU_ANY_SSSE3_FLAGS },
1102 { STRING_COMMA_LEN ("nosse4.1"), CPU_ANY_SSE4_1_FLAGS },
1103 { STRING_COMMA_LEN ("nosse4.2"), CPU_ANY_SSE4_2_FLAGS },
1104 { STRING_COMMA_LEN ("nosse4"), CPU_ANY_SSE4_1_FLAGS },
293f5f65 1105 { STRING_COMMA_LEN ("noavx"), CPU_ANY_AVX_FLAGS },
1848e567 1106 { STRING_COMMA_LEN ("noavx2"), CPU_ANY_AVX2_FLAGS },
144b71e2
L
1107 { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
1108 { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
1109 { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
1110 { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
1111 { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
1112 { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
1113 { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
1114 { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
1115 { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
920d2ddc 1116 { STRING_COMMA_LEN ("noavx512_4fmaps"), CPU_ANY_AVX512_4FMAPS_FLAGS },
47acf0bd 1117 { STRING_COMMA_LEN ("noavx512_4vnniw"), CPU_ANY_AVX512_4VNNIW_FLAGS },
620214f7 1118 { STRING_COMMA_LEN ("noavx512_vpopcntdq"), CPU_ANY_AVX512_VPOPCNTDQ_FLAGS },
53467f57 1119 { STRING_COMMA_LEN ("noavx512_vbmi2"), CPU_ANY_AVX512_VBMI2_FLAGS },
8cfcb765 1120 { STRING_COMMA_LEN ("noavx512_vnni"), CPU_ANY_AVX512_VNNI_FLAGS },
ee6872be 1121 { STRING_COMMA_LEN ("noavx512_bitalg"), CPU_ANY_AVX512_BITALG_FLAGS },
d777820b
IT
1122 { STRING_COMMA_LEN ("noibt"), CPU_ANY_IBT_FLAGS },
1123 { STRING_COMMA_LEN ("noshstk"), CPU_ANY_SHSTK_FLAGS },
c0a30a9f
L
1124 { STRING_COMMA_LEN ("nomovdiri"), CPU_ANY_MOVDIRI_FLAGS },
1125 { STRING_COMMA_LEN ("nomovdir64b"), CPU_ANY_MOVDIR64B_FLAGS },
d6aab7a1 1126 { STRING_COMMA_LEN ("noavx512_bf16"), CPU_ANY_AVX512_BF16_FLAGS },
9186c494 1127 { STRING_COMMA_LEN ("noavx512_vp2intersect"), CPU_ANY_SHSTK_FLAGS },
e413e4e9
AM
1128};
1129
704209c0 1130#ifdef I386COFF
a6c24e68
NC
1131/* Like s_lcomm_internal in gas/read.c but the alignment string
1132 is allowed to be optional. */
1133
1134static symbolS *
1135pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1136{
1137 addressT align = 0;
1138
1139 SKIP_WHITESPACE ();
1140
7ab9ffdd 1141 if (needs_align
a6c24e68
NC
1142 && *input_line_pointer == ',')
1143 {
1144 align = parse_align (needs_align - 1);
7ab9ffdd 1145
a6c24e68
NC
1146 if (align == (addressT) -1)
1147 return NULL;
1148 }
1149 else
1150 {
1151 if (size >= 8)
1152 align = 3;
1153 else if (size >= 4)
1154 align = 2;
1155 else if (size >= 2)
1156 align = 1;
1157 else
1158 align = 0;
1159 }
1160
1161 bss_alloc (symbolP, size, align);
1162 return symbolP;
1163}
1164
704209c0 1165static void
a6c24e68
NC
1166pe_lcomm (int needs_align)
1167{
1168 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1169}
704209c0 1170#endif
a6c24e68 1171
29b0f896
AM
1172const pseudo_typeS md_pseudo_table[] =
1173{
1174#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1175 {"align", s_align_bytes, 0},
1176#else
1177 {"align", s_align_ptwo, 0},
1178#endif
1179 {"arch", set_cpu_arch, 0},
1180#ifndef I386COFF
1181 {"bss", s_bss, 0},
a6c24e68
NC
1182#else
1183 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1184#endif
1185 {"ffloat", float_cons, 'f'},
1186 {"dfloat", float_cons, 'd'},
1187 {"tfloat", float_cons, 'x'},
1188 {"value", cons, 2},
d182319b 1189 {"slong", signed_cons, 4},
29b0f896
AM
1190 {"noopt", s_ignore, 0},
1191 {"optim", s_ignore, 0},
1192 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1193 {"code16", set_code_flag, CODE_16BIT},
1194 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1195#ifdef BFD64
29b0f896 1196 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1197#endif
29b0f896
AM
1198 {"intel_syntax", set_intel_syntax, 1},
1199 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1200 {"intel_mnemonic", set_intel_mnemonic, 1},
1201 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1202 {"allow_index_reg", set_allow_index_reg, 1},
1203 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1204 {"sse_check", set_check, 0},
1205 {"operand_check", set_check, 1},
3b22753a
L
1206#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1207 {"largecomm", handle_large_common, 0},
07a53e5c 1208#else
68d20676 1209 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1210 {"loc", dwarf2_directive_loc, 0},
1211 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1212#endif
6482c264
NC
1213#ifdef TE_PE
1214 {"secrel32", pe_directive_secrel, 0},
1215#endif
29b0f896
AM
1216 {0, 0, 0}
1217};
1218
1219/* For interface with expression (). */
1220extern char *input_line_pointer;
1221
1222/* Hash table for instruction mnemonic lookup. */
1223static struct hash_control *op_hash;
1224
1225/* Hash table for register lookup. */
1226static struct hash_control *reg_hash;
1227\f
ce8a8b2f
AM
1228 /* Various efficient no-op patterns for aligning code labels.
1229 Note: Don't try to assemble the instructions in the comments.
1230 0L and 0w are not legal. */
62a02d25
L
1231static const unsigned char f32_1[] =
1232 {0x90}; /* nop */
1233static const unsigned char f32_2[] =
1234 {0x66,0x90}; /* xchg %ax,%ax */
1235static const unsigned char f32_3[] =
1236 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1237static const unsigned char f32_4[] =
1238 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
62a02d25
L
1239static const unsigned char f32_6[] =
1240 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1241static const unsigned char f32_7[] =
1242 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
62a02d25 1243static const unsigned char f16_3[] =
3ae729d5 1244 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
62a02d25 1245static const unsigned char f16_4[] =
3ae729d5
L
1246 {0x8d,0xb4,0x00,0x00}; /* lea 0W(%si),%si */
1247static const unsigned char jump_disp8[] =
1248 {0xeb}; /* jmp disp8 */
1249static const unsigned char jump32_disp32[] =
1250 {0xe9}; /* jmp disp32 */
1251static const unsigned char jump16_disp32[] =
1252 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1253/* 32-bit NOPs patterns. */
1254static const unsigned char *const f32_patt[] = {
3ae729d5 1255 f32_1, f32_2, f32_3, f32_4, NULL, f32_6, f32_7
62a02d25
L
1256};
1257/* 16-bit NOPs patterns. */
1258static const unsigned char *const f16_patt[] = {
3ae729d5 1259 f32_1, f32_2, f16_3, f16_4
62a02d25
L
1260};
1261/* nopl (%[re]ax) */
1262static const unsigned char alt_3[] =
1263 {0x0f,0x1f,0x00};
1264/* nopl 0(%[re]ax) */
1265static const unsigned char alt_4[] =
1266 {0x0f,0x1f,0x40,0x00};
1267/* nopl 0(%[re]ax,%[re]ax,1) */
1268static const unsigned char alt_5[] =
1269 {0x0f,0x1f,0x44,0x00,0x00};
1270/* nopw 0(%[re]ax,%[re]ax,1) */
1271static const unsigned char alt_6[] =
1272 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1273/* nopl 0L(%[re]ax) */
1274static const unsigned char alt_7[] =
1275 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1276/* nopl 0L(%[re]ax,%[re]ax,1) */
1277static const unsigned char alt_8[] =
1278 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1279/* nopw 0L(%[re]ax,%[re]ax,1) */
1280static const unsigned char alt_9[] =
1281 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1282/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1283static const unsigned char alt_10[] =
1284 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
3ae729d5
L
1285/* data16 nopw %cs:0L(%eax,%eax,1) */
1286static const unsigned char alt_11[] =
1287 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1288/* 32-bit and 64-bit NOPs patterns. */
1289static const unsigned char *const alt_patt[] = {
1290 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1291 alt_9, alt_10, alt_11
62a02d25
L
1292};
1293
1294/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1295 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1296
1297static void
1298i386_output_nops (char *where, const unsigned char *const *patt,
1299 int count, int max_single_nop_size)
1300
1301{
3ae729d5
L
1302 /* Place the longer NOP first. */
1303 int last;
1304 int offset;
3076e594
NC
1305 const unsigned char *nops;
1306
1307 if (max_single_nop_size < 1)
1308 {
1309 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1310 max_single_nop_size);
1311 return;
1312 }
1313
1314 nops = patt[max_single_nop_size - 1];
3ae729d5
L
1315
1316 /* Use the smaller one if the requsted one isn't available. */
1317 if (nops == NULL)
62a02d25 1318 {
3ae729d5
L
1319 max_single_nop_size--;
1320 nops = patt[max_single_nop_size - 1];
62a02d25
L
1321 }
1322
3ae729d5
L
1323 last = count % max_single_nop_size;
1324
1325 count -= last;
1326 for (offset = 0; offset < count; offset += max_single_nop_size)
1327 memcpy (where + offset, nops, max_single_nop_size);
1328
1329 if (last)
1330 {
1331 nops = patt[last - 1];
1332 if (nops == NULL)
1333 {
1334 /* Use the smaller one plus one-byte NOP if the needed one
1335 isn't available. */
1336 last--;
1337 nops = patt[last - 1];
1338 memcpy (where + offset, nops, last);
1339 where[offset + last] = *patt[0];
1340 }
1341 else
1342 memcpy (where + offset, nops, last);
1343 }
62a02d25
L
1344}
1345
3ae729d5
L
1346static INLINE int
1347fits_in_imm7 (offsetT num)
1348{
1349 return (num & 0x7f) == num;
1350}
1351
1352static INLINE int
1353fits_in_imm31 (offsetT num)
1354{
1355 return (num & 0x7fffffff) == num;
1356}
62a02d25
L
1357
1358/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1359 single NOP instruction LIMIT. */
1360
1361void
3ae729d5 1362i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1363{
3ae729d5 1364 const unsigned char *const *patt = NULL;
62a02d25 1365 int max_single_nop_size;
3ae729d5
L
1366 /* Maximum number of NOPs before switching to jump over NOPs. */
1367 int max_number_of_nops;
62a02d25 1368
3ae729d5 1369 switch (fragP->fr_type)
62a02d25 1370 {
3ae729d5
L
1371 case rs_fill_nop:
1372 case rs_align_code:
1373 break;
1374 default:
62a02d25
L
1375 return;
1376 }
1377
ccc9c027
L
1378 /* We need to decide which NOP sequence to use for 32bit and
1379 64bit. When -mtune= is used:
4eed87de 1380
76bc74dc
L
1381 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
1382 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1383 2. For the rest, alt_patt will be used.
1384
1385 When -mtune= isn't used, alt_patt will be used if
22109423 1386 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will
76bc74dc 1387 be used.
ccc9c027
L
1388
1389 When -march= or .arch is used, we can't use anything beyond
1390 cpu_arch_isa_flags. */
1391
1392 if (flag_code == CODE_16BIT)
1393 {
3ae729d5
L
1394 patt = f16_patt;
1395 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1396 /* Limit number of NOPs to 2 in 16-bit mode. */
1397 max_number_of_nops = 2;
252b5132 1398 }
33fef721 1399 else
ccc9c027 1400 {
fbf3f584 1401 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027
L
1402 {
1403 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
1404 switch (cpu_arch_tune)
1405 {
1406 case PROCESSOR_UNKNOWN:
1407 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423
L
1408 optimize with nops. */
1409 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1410 patt = alt_patt;
ccc9c027
L
1411 else
1412 patt = f32_patt;
1413 break;
ccc9c027
L
1414 case PROCESSOR_PENTIUM4:
1415 case PROCESSOR_NOCONA:
ef05d495 1416 case PROCESSOR_CORE:
76bc74dc 1417 case PROCESSOR_CORE2:
bd5295b2 1418 case PROCESSOR_COREI7:
3632d14b 1419 case PROCESSOR_L1OM:
7a9068fe 1420 case PROCESSOR_K1OM:
76bc74dc 1421 case PROCESSOR_GENERIC64:
ccc9c027
L
1422 case PROCESSOR_K6:
1423 case PROCESSOR_ATHLON:
1424 case PROCESSOR_K8:
4eed87de 1425 case PROCESSOR_AMDFAM10:
8aedb9fe 1426 case PROCESSOR_BD:
029f3522 1427 case PROCESSOR_ZNVER:
7b458c12 1428 case PROCESSOR_BT:
80b8656c 1429 patt = alt_patt;
ccc9c027 1430 break;
76bc74dc 1431 case PROCESSOR_I386:
ccc9c027
L
1432 case PROCESSOR_I486:
1433 case PROCESSOR_PENTIUM:
2dde1948 1434 case PROCESSOR_PENTIUMPRO:
81486035 1435 case PROCESSOR_IAMCU:
ccc9c027
L
1436 case PROCESSOR_GENERIC32:
1437 patt = f32_patt;
1438 break;
4eed87de 1439 }
ccc9c027
L
1440 }
1441 else
1442 {
fbf3f584 1443 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1444 {
1445 case PROCESSOR_UNKNOWN:
e6a14101 1446 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1447 PROCESSOR_UNKNOWN. */
1448 abort ();
1449 break;
1450
76bc74dc 1451 case PROCESSOR_I386:
ccc9c027
L
1452 case PROCESSOR_I486:
1453 case PROCESSOR_PENTIUM:
81486035 1454 case PROCESSOR_IAMCU:
ccc9c027
L
1455 case PROCESSOR_K6:
1456 case PROCESSOR_ATHLON:
1457 case PROCESSOR_K8:
4eed87de 1458 case PROCESSOR_AMDFAM10:
8aedb9fe 1459 case PROCESSOR_BD:
029f3522 1460 case PROCESSOR_ZNVER:
7b458c12 1461 case PROCESSOR_BT:
ccc9c027
L
1462 case PROCESSOR_GENERIC32:
1463 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423
L
1464 with nops. */
1465 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1466 patt = alt_patt;
ccc9c027
L
1467 else
1468 patt = f32_patt;
1469 break;
76bc74dc
L
1470 case PROCESSOR_PENTIUMPRO:
1471 case PROCESSOR_PENTIUM4:
1472 case PROCESSOR_NOCONA:
1473 case PROCESSOR_CORE:
ef05d495 1474 case PROCESSOR_CORE2:
bd5295b2 1475 case PROCESSOR_COREI7:
3632d14b 1476 case PROCESSOR_L1OM:
7a9068fe 1477 case PROCESSOR_K1OM:
22109423 1478 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1479 patt = alt_patt;
ccc9c027
L
1480 else
1481 patt = f32_patt;
1482 break;
1483 case PROCESSOR_GENERIC64:
80b8656c 1484 patt = alt_patt;
ccc9c027 1485 break;
4eed87de 1486 }
ccc9c027
L
1487 }
1488
76bc74dc
L
1489 if (patt == f32_patt)
1490 {
3ae729d5
L
1491 max_single_nop_size = sizeof (f32_patt) / sizeof (f32_patt[0]);
1492 /* Limit number of NOPs to 2 for older processors. */
1493 max_number_of_nops = 2;
76bc74dc
L
1494 }
1495 else
1496 {
3ae729d5
L
1497 max_single_nop_size = sizeof (alt_patt) / sizeof (alt_patt[0]);
1498 /* Limit number of NOPs to 7 for newer processors. */
1499 max_number_of_nops = 7;
1500 }
1501 }
1502
1503 if (limit == 0)
1504 limit = max_single_nop_size;
1505
1506 if (fragP->fr_type == rs_fill_nop)
1507 {
1508 /* Output NOPs for .nop directive. */
1509 if (limit > max_single_nop_size)
1510 {
1511 as_bad_where (fragP->fr_file, fragP->fr_line,
1512 _("invalid single nop size: %d "
1513 "(expect within [0, %d])"),
1514 limit, max_single_nop_size);
1515 return;
1516 }
1517 }
1518 else
1519 fragP->fr_var = count;
1520
1521 if ((count / max_single_nop_size) > max_number_of_nops)
1522 {
1523 /* Generate jump over NOPs. */
1524 offsetT disp = count - 2;
1525 if (fits_in_imm7 (disp))
1526 {
1527 /* Use "jmp disp8" if possible. */
1528 count = disp;
1529 where[0] = jump_disp8[0];
1530 where[1] = count;
1531 where += 2;
1532 }
1533 else
1534 {
1535 unsigned int size_of_jump;
1536
1537 if (flag_code == CODE_16BIT)
1538 {
1539 where[0] = jump16_disp32[0];
1540 where[1] = jump16_disp32[1];
1541 size_of_jump = 2;
1542 }
1543 else
1544 {
1545 where[0] = jump32_disp32[0];
1546 size_of_jump = 1;
1547 }
1548
1549 count -= size_of_jump + 4;
1550 if (!fits_in_imm31 (count))
1551 {
1552 as_bad_where (fragP->fr_file, fragP->fr_line,
1553 _("jump over nop padding out of range"));
1554 return;
1555 }
1556
1557 md_number_to_chars (where + size_of_jump, count, 4);
1558 where += size_of_jump + 4;
76bc74dc 1559 }
ccc9c027 1560 }
3ae729d5
L
1561
1562 /* Generate multiple NOPs. */
1563 i386_output_nops (where, patt, count, limit);
252b5132
RH
1564}
1565
c6fb90c8 1566static INLINE int
0dfbf9d7 1567operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1568{
0dfbf9d7 1569 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1570 {
1571 case 3:
0dfbf9d7 1572 if (x->array[2])
c6fb90c8 1573 return 0;
1a0670f3 1574 /* Fall through. */
c6fb90c8 1575 case 2:
0dfbf9d7 1576 if (x->array[1])
c6fb90c8 1577 return 0;
1a0670f3 1578 /* Fall through. */
c6fb90c8 1579 case 1:
0dfbf9d7 1580 return !x->array[0];
c6fb90c8
L
1581 default:
1582 abort ();
1583 }
40fb9820
L
1584}
1585
c6fb90c8 1586static INLINE void
0dfbf9d7 1587operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1588{
0dfbf9d7 1589 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1590 {
1591 case 3:
0dfbf9d7 1592 x->array[2] = v;
1a0670f3 1593 /* Fall through. */
c6fb90c8 1594 case 2:
0dfbf9d7 1595 x->array[1] = v;
1a0670f3 1596 /* Fall through. */
c6fb90c8 1597 case 1:
0dfbf9d7 1598 x->array[0] = v;
1a0670f3 1599 /* Fall through. */
c6fb90c8
L
1600 break;
1601 default:
1602 abort ();
1603 }
1604}
40fb9820 1605
c6fb90c8 1606static INLINE int
0dfbf9d7
L
1607operand_type_equal (const union i386_operand_type *x,
1608 const union i386_operand_type *y)
c6fb90c8 1609{
0dfbf9d7 1610 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1611 {
1612 case 3:
0dfbf9d7 1613 if (x->array[2] != y->array[2])
c6fb90c8 1614 return 0;
1a0670f3 1615 /* Fall through. */
c6fb90c8 1616 case 2:
0dfbf9d7 1617 if (x->array[1] != y->array[1])
c6fb90c8 1618 return 0;
1a0670f3 1619 /* Fall through. */
c6fb90c8 1620 case 1:
0dfbf9d7 1621 return x->array[0] == y->array[0];
c6fb90c8
L
1622 break;
1623 default:
1624 abort ();
1625 }
1626}
40fb9820 1627
0dfbf9d7
L
1628static INLINE int
1629cpu_flags_all_zero (const union i386_cpu_flags *x)
1630{
1631 switch (ARRAY_SIZE(x->array))
1632 {
53467f57
IT
1633 case 4:
1634 if (x->array[3])
1635 return 0;
1636 /* Fall through. */
0dfbf9d7
L
1637 case 3:
1638 if (x->array[2])
1639 return 0;
1a0670f3 1640 /* Fall through. */
0dfbf9d7
L
1641 case 2:
1642 if (x->array[1])
1643 return 0;
1a0670f3 1644 /* Fall through. */
0dfbf9d7
L
1645 case 1:
1646 return !x->array[0];
1647 default:
1648 abort ();
1649 }
1650}
1651
0dfbf9d7
L
1652static INLINE int
1653cpu_flags_equal (const union i386_cpu_flags *x,
1654 const union i386_cpu_flags *y)
1655{
1656 switch (ARRAY_SIZE(x->array))
1657 {
53467f57
IT
1658 case 4:
1659 if (x->array[3] != y->array[3])
1660 return 0;
1661 /* Fall through. */
0dfbf9d7
L
1662 case 3:
1663 if (x->array[2] != y->array[2])
1664 return 0;
1a0670f3 1665 /* Fall through. */
0dfbf9d7
L
1666 case 2:
1667 if (x->array[1] != y->array[1])
1668 return 0;
1a0670f3 1669 /* Fall through. */
0dfbf9d7
L
1670 case 1:
1671 return x->array[0] == y->array[0];
1672 break;
1673 default:
1674 abort ();
1675 }
1676}
c6fb90c8
L
1677
1678static INLINE int
1679cpu_flags_check_cpu64 (i386_cpu_flags f)
1680{
1681 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
1682 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
1683}
1684
c6fb90c8
L
1685static INLINE i386_cpu_flags
1686cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1687{
c6fb90c8
L
1688 switch (ARRAY_SIZE (x.array))
1689 {
53467f57
IT
1690 case 4:
1691 x.array [3] &= y.array [3];
1692 /* Fall through. */
c6fb90c8
L
1693 case 3:
1694 x.array [2] &= y.array [2];
1a0670f3 1695 /* Fall through. */
c6fb90c8
L
1696 case 2:
1697 x.array [1] &= y.array [1];
1a0670f3 1698 /* Fall through. */
c6fb90c8
L
1699 case 1:
1700 x.array [0] &= y.array [0];
1701 break;
1702 default:
1703 abort ();
1704 }
1705 return x;
1706}
40fb9820 1707
c6fb90c8
L
1708static INLINE i386_cpu_flags
1709cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1710{
c6fb90c8 1711 switch (ARRAY_SIZE (x.array))
40fb9820 1712 {
53467f57
IT
1713 case 4:
1714 x.array [3] |= y.array [3];
1715 /* Fall through. */
c6fb90c8
L
1716 case 3:
1717 x.array [2] |= y.array [2];
1a0670f3 1718 /* Fall through. */
c6fb90c8
L
1719 case 2:
1720 x.array [1] |= y.array [1];
1a0670f3 1721 /* Fall through. */
c6fb90c8
L
1722 case 1:
1723 x.array [0] |= y.array [0];
40fb9820
L
1724 break;
1725 default:
1726 abort ();
1727 }
40fb9820
L
1728 return x;
1729}
1730
309d3373
JB
1731static INLINE i386_cpu_flags
1732cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1733{
1734 switch (ARRAY_SIZE (x.array))
1735 {
53467f57
IT
1736 case 4:
1737 x.array [3] &= ~y.array [3];
1738 /* Fall through. */
309d3373
JB
1739 case 3:
1740 x.array [2] &= ~y.array [2];
1a0670f3 1741 /* Fall through. */
309d3373
JB
1742 case 2:
1743 x.array [1] &= ~y.array [1];
1a0670f3 1744 /* Fall through. */
309d3373
JB
1745 case 1:
1746 x.array [0] &= ~y.array [0];
1747 break;
1748 default:
1749 abort ();
1750 }
1751 return x;
1752}
1753
c0f3af97
L
1754#define CPU_FLAGS_ARCH_MATCH 0x1
1755#define CPU_FLAGS_64BIT_MATCH 0x2
1756
c0f3af97 1757#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1758 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1759
1760/* Return CPU flags match bits. */
3629bb00 1761
40fb9820 1762static int
d3ce72d0 1763cpu_flags_match (const insn_template *t)
40fb9820 1764{
c0f3af97
L
1765 i386_cpu_flags x = t->cpu_flags;
1766 int match = cpu_flags_check_cpu64 (x) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820
L
1767
1768 x.bitfield.cpu64 = 0;
1769 x.bitfield.cpuno64 = 0;
1770
0dfbf9d7 1771 if (cpu_flags_all_zero (&x))
c0f3af97
L
1772 {
1773 /* This instruction is available on all archs. */
db12e14e 1774 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1775 }
3629bb00
L
1776 else
1777 {
c0f3af97 1778 /* This instruction is available only on some archs. */
3629bb00
L
1779 i386_cpu_flags cpu = cpu_arch_flags;
1780
ab592e75
JB
1781 /* AVX512VL is no standalone feature - match it and then strip it. */
1782 if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl)
1783 return match;
1784 x.bitfield.cpuavx512vl = 0;
1785
3629bb00 1786 cpu = cpu_flags_and (x, cpu);
c0f3af97
L
1787 if (!cpu_flags_all_zero (&cpu))
1788 {
a5ff0eb2
L
1789 if (x.bitfield.cpuavx)
1790 {
929f69fa 1791 /* We need to check a few extra flags with AVX. */
b9d49817
JB
1792 if (cpu.bitfield.cpuavx
1793 && (!t->opcode_modifier.sse2avx || sse2avx)
1794 && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
929f69fa 1795 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
b9d49817
JB
1796 && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
1797 match |= CPU_FLAGS_ARCH_MATCH;
a5ff0eb2 1798 }
929f69fa
JB
1799 else if (x.bitfield.cpuavx512f)
1800 {
1801 /* We need to check a few extra flags with AVX512F. */
1802 if (cpu.bitfield.cpuavx512f
1803 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
1804 && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes)
1805 && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq))
1806 match |= CPU_FLAGS_ARCH_MATCH;
1807 }
a5ff0eb2 1808 else
db12e14e 1809 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1810 }
3629bb00 1811 }
c0f3af97 1812 return match;
40fb9820
L
1813}
1814
c6fb90c8
L
1815static INLINE i386_operand_type
1816operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 1817{
c6fb90c8
L
1818 switch (ARRAY_SIZE (x.array))
1819 {
1820 case 3:
1821 x.array [2] &= y.array [2];
1a0670f3 1822 /* Fall through. */
c6fb90c8
L
1823 case 2:
1824 x.array [1] &= y.array [1];
1a0670f3 1825 /* Fall through. */
c6fb90c8
L
1826 case 1:
1827 x.array [0] &= y.array [0];
1828 break;
1829 default:
1830 abort ();
1831 }
1832 return x;
40fb9820
L
1833}
1834
73053c1f
JB
1835static INLINE i386_operand_type
1836operand_type_and_not (i386_operand_type x, i386_operand_type y)
1837{
1838 switch (ARRAY_SIZE (x.array))
1839 {
1840 case 3:
1841 x.array [2] &= ~y.array [2];
1842 /* Fall through. */
1843 case 2:
1844 x.array [1] &= ~y.array [1];
1845 /* Fall through. */
1846 case 1:
1847 x.array [0] &= ~y.array [0];
1848 break;
1849 default:
1850 abort ();
1851 }
1852 return x;
1853}
1854
c6fb90c8
L
1855static INLINE i386_operand_type
1856operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 1857{
c6fb90c8 1858 switch (ARRAY_SIZE (x.array))
40fb9820 1859 {
c6fb90c8
L
1860 case 3:
1861 x.array [2] |= y.array [2];
1a0670f3 1862 /* Fall through. */
c6fb90c8
L
1863 case 2:
1864 x.array [1] |= y.array [1];
1a0670f3 1865 /* Fall through. */
c6fb90c8
L
1866 case 1:
1867 x.array [0] |= y.array [0];
40fb9820
L
1868 break;
1869 default:
1870 abort ();
1871 }
c6fb90c8
L
1872 return x;
1873}
40fb9820 1874
c6fb90c8
L
1875static INLINE i386_operand_type
1876operand_type_xor (i386_operand_type x, i386_operand_type y)
1877{
1878 switch (ARRAY_SIZE (x.array))
1879 {
1880 case 3:
1881 x.array [2] ^= y.array [2];
1a0670f3 1882 /* Fall through. */
c6fb90c8
L
1883 case 2:
1884 x.array [1] ^= y.array [1];
1a0670f3 1885 /* Fall through. */
c6fb90c8
L
1886 case 1:
1887 x.array [0] ^= y.array [0];
1888 break;
1889 default:
1890 abort ();
1891 }
40fb9820
L
1892 return x;
1893}
1894
1895static const i386_operand_type acc32 = OPERAND_TYPE_ACC32;
1896static const i386_operand_type acc64 = OPERAND_TYPE_ACC64;
40fb9820
L
1897static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
1898static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
1899static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
1900static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
1901static const i386_operand_type anydisp
1902 = OPERAND_TYPE_ANYDISP;
40fb9820 1903static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
43234a1e 1904static const i386_operand_type regmask = OPERAND_TYPE_REGMASK;
40fb9820
L
1905static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
1906static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
1907static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
1908static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
1909static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
1910static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
1911static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
1912static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
1913static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
a683cc34 1914static const i386_operand_type vec_imm4 = OPERAND_TYPE_VEC_IMM4;
40fb9820
L
1915
1916enum operand_type
1917{
1918 reg,
40fb9820
L
1919 imm,
1920 disp,
1921 anymem
1922};
1923
c6fb90c8 1924static INLINE int
40fb9820
L
1925operand_type_check (i386_operand_type t, enum operand_type c)
1926{
1927 switch (c)
1928 {
1929 case reg:
dc821c5f 1930 return t.bitfield.reg;
40fb9820 1931
40fb9820
L
1932 case imm:
1933 return (t.bitfield.imm8
1934 || t.bitfield.imm8s
1935 || t.bitfield.imm16
1936 || t.bitfield.imm32
1937 || t.bitfield.imm32s
1938 || t.bitfield.imm64);
1939
1940 case disp:
1941 return (t.bitfield.disp8
1942 || t.bitfield.disp16
1943 || t.bitfield.disp32
1944 || t.bitfield.disp32s
1945 || t.bitfield.disp64);
1946
1947 case anymem:
1948 return (t.bitfield.disp8
1949 || t.bitfield.disp16
1950 || t.bitfield.disp32
1951 || t.bitfield.disp32s
1952 || t.bitfield.disp64
1953 || t.bitfield.baseindex);
1954
1955 default:
1956 abort ();
1957 }
2cfe26b6
AM
1958
1959 return 0;
40fb9820
L
1960}
1961
7a54636a
L
1962/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
1963 between operand GIVEN and opeand WANTED for instruction template T. */
5c07affc
L
1964
1965static INLINE int
7a54636a
L
1966match_operand_size (const insn_template *t, unsigned int wanted,
1967 unsigned int given)
5c07affc 1968{
3ac21baa
JB
1969 return !((i.types[given].bitfield.byte
1970 && !t->operand_types[wanted].bitfield.byte)
1971 || (i.types[given].bitfield.word
1972 && !t->operand_types[wanted].bitfield.word)
1973 || (i.types[given].bitfield.dword
1974 && !t->operand_types[wanted].bitfield.dword)
1975 || (i.types[given].bitfield.qword
1976 && !t->operand_types[wanted].bitfield.qword)
1977 || (i.types[given].bitfield.tbyte
1978 && !t->operand_types[wanted].bitfield.tbyte));
5c07affc
L
1979}
1980
dd40ce22
L
1981/* Return 1 if there is no conflict in SIMD register between operand
1982 GIVEN and opeand WANTED for instruction template T. */
1b54b8d7
JB
1983
1984static INLINE int
dd40ce22
L
1985match_simd_size (const insn_template *t, unsigned int wanted,
1986 unsigned int given)
1b54b8d7 1987{
3ac21baa
JB
1988 return !((i.types[given].bitfield.xmmword
1989 && !t->operand_types[wanted].bitfield.xmmword)
1990 || (i.types[given].bitfield.ymmword
1991 && !t->operand_types[wanted].bitfield.ymmword)
1992 || (i.types[given].bitfield.zmmword
1993 && !t->operand_types[wanted].bitfield.zmmword));
1b54b8d7
JB
1994}
1995
7a54636a
L
1996/* Return 1 if there is no conflict in any size between operand GIVEN
1997 and opeand WANTED for instruction template T. */
5c07affc
L
1998
1999static INLINE int
dd40ce22
L
2000match_mem_size (const insn_template *t, unsigned int wanted,
2001 unsigned int given)
5c07affc 2002{
7a54636a 2003 return (match_operand_size (t, wanted, given)
3ac21baa 2004 && !((i.types[given].bitfield.unspecified
af508cb9 2005 && !i.broadcast
3ac21baa
JB
2006 && !t->operand_types[wanted].bitfield.unspecified)
2007 || (i.types[given].bitfield.fword
2008 && !t->operand_types[wanted].bitfield.fword)
1b54b8d7
JB
2009 /* For scalar opcode templates to allow register and memory
2010 operands at the same time, some special casing is needed
d6793fa1
JB
2011 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2012 down-conversion vpmov*. */
3ac21baa 2013 || ((t->operand_types[wanted].bitfield.regsimd
1b54b8d7 2014 && !t->opcode_modifier.broadcast
3ac21baa
JB
2015 && (t->operand_types[wanted].bitfield.byte
2016 || t->operand_types[wanted].bitfield.word
2017 || t->operand_types[wanted].bitfield.dword
2018 || t->operand_types[wanted].bitfield.qword))
2019 ? (i.types[given].bitfield.xmmword
2020 || i.types[given].bitfield.ymmword
2021 || i.types[given].bitfield.zmmword)
2022 : !match_simd_size(t, wanted, given))));
5c07affc
L
2023}
2024
3ac21baa
JB
2025/* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2026 operands for instruction template T, and it has MATCH_REVERSE set if there
2027 is no size conflict on any operands for the template with operands reversed
2028 (and the template allows for reversing in the first place). */
5c07affc 2029
3ac21baa
JB
2030#define MATCH_STRAIGHT 1
2031#define MATCH_REVERSE 2
2032
2033static INLINE unsigned int
d3ce72d0 2034operand_size_match (const insn_template *t)
5c07affc 2035{
3ac21baa 2036 unsigned int j, match = MATCH_STRAIGHT;
5c07affc
L
2037
2038 /* Don't check jump instructions. */
2039 if (t->opcode_modifier.jump
2040 || t->opcode_modifier.jumpbyte
2041 || t->opcode_modifier.jumpdword
2042 || t->opcode_modifier.jumpintersegment)
2043 return match;
2044
2045 /* Check memory and accumulator operand size. */
2046 for (j = 0; j < i.operands; j++)
2047 {
1b54b8d7
JB
2048 if (!i.types[j].bitfield.reg && !i.types[j].bitfield.regsimd
2049 && t->operand_types[j].bitfield.anysize)
5c07affc
L
2050 continue;
2051
1b54b8d7 2052 if (t->operand_types[j].bitfield.reg
7a54636a 2053 && !match_operand_size (t, j, j))
5c07affc
L
2054 {
2055 match = 0;
2056 break;
2057 }
2058
1b54b8d7 2059 if (t->operand_types[j].bitfield.regsimd
3ac21baa 2060 && !match_simd_size (t, j, j))
1b54b8d7
JB
2061 {
2062 match = 0;
2063 break;
2064 }
2065
2066 if (t->operand_types[j].bitfield.acc
7a54636a 2067 && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
1b54b8d7
JB
2068 {
2069 match = 0;
2070 break;
2071 }
2072
c48dadc9 2073 if ((i.flags[j] & Operand_Mem) && !match_mem_size (t, j, j))
5c07affc
L
2074 {
2075 match = 0;
2076 break;
2077 }
2078 }
2079
3ac21baa 2080 if (!t->opcode_modifier.d)
891edac4
L
2081 {
2082mismatch:
3ac21baa
JB
2083 if (!match)
2084 i.error = operand_size_mismatch;
2085 return match;
891edac4 2086 }
5c07affc
L
2087
2088 /* Check reverse. */
f5eb1d70 2089 gas_assert (i.operands >= 2 && i.operands <= 3);
5c07affc 2090
f5eb1d70 2091 for (j = 0; j < i.operands; j++)
5c07affc 2092 {
f5eb1d70
JB
2093 unsigned int given = i.operands - j - 1;
2094
dbbc8b7e 2095 if (t->operand_types[j].bitfield.reg
f5eb1d70 2096 && !match_operand_size (t, j, given))
891edac4 2097 goto mismatch;
5c07affc 2098
dbbc8b7e 2099 if (t->operand_types[j].bitfield.regsimd
f5eb1d70 2100 && !match_simd_size (t, j, given))
dbbc8b7e
JB
2101 goto mismatch;
2102
2103 if (t->operand_types[j].bitfield.acc
f5eb1d70
JB
2104 && (!match_operand_size (t, j, given)
2105 || !match_simd_size (t, j, given)))
dbbc8b7e
JB
2106 goto mismatch;
2107
f5eb1d70 2108 if ((i.flags[given] & Operand_Mem) && !match_mem_size (t, j, given))
891edac4 2109 goto mismatch;
5c07affc
L
2110 }
2111
3ac21baa 2112 return match | MATCH_REVERSE;
5c07affc
L
2113}
2114
c6fb90c8 2115static INLINE int
40fb9820
L
2116operand_type_match (i386_operand_type overlap,
2117 i386_operand_type given)
2118{
2119 i386_operand_type temp = overlap;
2120
2121 temp.bitfield.jumpabsolute = 0;
7d5e4556 2122 temp.bitfield.unspecified = 0;
5c07affc
L
2123 temp.bitfield.byte = 0;
2124 temp.bitfield.word = 0;
2125 temp.bitfield.dword = 0;
2126 temp.bitfield.fword = 0;
2127 temp.bitfield.qword = 0;
2128 temp.bitfield.tbyte = 0;
2129 temp.bitfield.xmmword = 0;
c0f3af97 2130 temp.bitfield.ymmword = 0;
43234a1e 2131 temp.bitfield.zmmword = 0;
0dfbf9d7 2132 if (operand_type_all_zero (&temp))
891edac4 2133 goto mismatch;
40fb9820 2134
891edac4
L
2135 if (given.bitfield.baseindex == overlap.bitfield.baseindex
2136 && given.bitfield.jumpabsolute == overlap.bitfield.jumpabsolute)
2137 return 1;
2138
2139mismatch:
a65babc9 2140 i.error = operand_type_mismatch;
891edac4 2141 return 0;
40fb9820
L
2142}
2143
7d5e4556 2144/* If given types g0 and g1 are registers they must be of the same type
10c17abd
JB
2145 unless the expected operand type register overlap is null.
2146 Memory operand size of certain SIMD instructions is also being checked
2147 here. */
40fb9820 2148
c6fb90c8 2149static INLINE int
dc821c5f 2150operand_type_register_match (i386_operand_type g0,
40fb9820 2151 i386_operand_type t0,
40fb9820
L
2152 i386_operand_type g1,
2153 i386_operand_type t1)
2154{
10c17abd
JB
2155 if (!g0.bitfield.reg
2156 && !g0.bitfield.regsimd
2157 && (!operand_type_check (g0, anymem)
2158 || g0.bitfield.unspecified
2159 || !t0.bitfield.regsimd))
40fb9820
L
2160 return 1;
2161
10c17abd
JB
2162 if (!g1.bitfield.reg
2163 && !g1.bitfield.regsimd
2164 && (!operand_type_check (g1, anymem)
2165 || g1.bitfield.unspecified
2166 || !t1.bitfield.regsimd))
40fb9820
L
2167 return 1;
2168
dc821c5f
JB
2169 if (g0.bitfield.byte == g1.bitfield.byte
2170 && g0.bitfield.word == g1.bitfield.word
2171 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2172 && g0.bitfield.qword == g1.bitfield.qword
2173 && g0.bitfield.xmmword == g1.bitfield.xmmword
2174 && g0.bitfield.ymmword == g1.bitfield.ymmword
2175 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2176 return 1;
2177
dc821c5f
JB
2178 if (!(t0.bitfield.byte & t1.bitfield.byte)
2179 && !(t0.bitfield.word & t1.bitfield.word)
2180 && !(t0.bitfield.dword & t1.bitfield.dword)
10c17abd
JB
2181 && !(t0.bitfield.qword & t1.bitfield.qword)
2182 && !(t0.bitfield.xmmword & t1.bitfield.xmmword)
2183 && !(t0.bitfield.ymmword & t1.bitfield.ymmword)
2184 && !(t0.bitfield.zmmword & t1.bitfield.zmmword))
891edac4
L
2185 return 1;
2186
a65babc9 2187 i.error = register_type_mismatch;
891edac4
L
2188
2189 return 0;
40fb9820
L
2190}
2191
4c692bc7
JB
2192static INLINE unsigned int
2193register_number (const reg_entry *r)
2194{
2195 unsigned int nr = r->reg_num;
2196
2197 if (r->reg_flags & RegRex)
2198 nr += 8;
2199
200cbe0f
L
2200 if (r->reg_flags & RegVRex)
2201 nr += 16;
2202
4c692bc7
JB
2203 return nr;
2204}
2205
252b5132 2206static INLINE unsigned int
40fb9820 2207mode_from_disp_size (i386_operand_type t)
252b5132 2208{
b5014f7a 2209 if (t.bitfield.disp8)
40fb9820
L
2210 return 1;
2211 else if (t.bitfield.disp16
2212 || t.bitfield.disp32
2213 || t.bitfield.disp32s)
2214 return 2;
2215 else
2216 return 0;
252b5132
RH
2217}
2218
2219static INLINE int
65879393 2220fits_in_signed_byte (addressT num)
252b5132 2221{
65879393 2222 return num + 0x80 <= 0xff;
47926f60 2223}
252b5132
RH
2224
2225static INLINE int
65879393 2226fits_in_unsigned_byte (addressT num)
252b5132 2227{
65879393 2228 return num <= 0xff;
47926f60 2229}
252b5132
RH
2230
2231static INLINE int
65879393 2232fits_in_unsigned_word (addressT num)
252b5132 2233{
65879393 2234 return num <= 0xffff;
47926f60 2235}
252b5132
RH
2236
2237static INLINE int
65879393 2238fits_in_signed_word (addressT num)
252b5132 2239{
65879393 2240 return num + 0x8000 <= 0xffff;
47926f60 2241}
2a962e6d 2242
3e73aa7c 2243static INLINE int
65879393 2244fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2245{
2246#ifndef BFD64
2247 return 1;
2248#else
65879393 2249 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2250#endif
2251} /* fits_in_signed_long() */
2a962e6d 2252
3e73aa7c 2253static INLINE int
65879393 2254fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2255{
2256#ifndef BFD64
2257 return 1;
2258#else
65879393 2259 return num <= 0xffffffff;
3e73aa7c
JH
2260#endif
2261} /* fits_in_unsigned_long() */
252b5132 2262
43234a1e 2263static INLINE int
b5014f7a 2264fits_in_disp8 (offsetT num)
43234a1e
L
2265{
2266 int shift = i.memshift;
2267 unsigned int mask;
2268
2269 if (shift == -1)
2270 abort ();
2271
2272 mask = (1 << shift) - 1;
2273
2274 /* Return 0 if NUM isn't properly aligned. */
2275 if ((num & mask))
2276 return 0;
2277
2278 /* Check if NUM will fit in 8bit after shift. */
2279 return fits_in_signed_byte (num >> shift);
2280}
2281
a683cc34
SP
2282static INLINE int
2283fits_in_imm4 (offsetT num)
2284{
2285 return (num & 0xf) == num;
2286}
2287
40fb9820 2288static i386_operand_type
e3bb37b5 2289smallest_imm_type (offsetT num)
252b5132 2290{
40fb9820 2291 i386_operand_type t;
7ab9ffdd 2292
0dfbf9d7 2293 operand_type_set (&t, 0);
40fb9820
L
2294 t.bitfield.imm64 = 1;
2295
2296 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2297 {
2298 /* This code is disabled on the 486 because all the Imm1 forms
2299 in the opcode table are slower on the i486. They're the
2300 versions with the implicitly specified single-position
2301 displacement, which has another syntax if you really want to
2302 use that form. */
40fb9820
L
2303 t.bitfield.imm1 = 1;
2304 t.bitfield.imm8 = 1;
2305 t.bitfield.imm8s = 1;
2306 t.bitfield.imm16 = 1;
2307 t.bitfield.imm32 = 1;
2308 t.bitfield.imm32s = 1;
2309 }
2310 else if (fits_in_signed_byte (num))
2311 {
2312 t.bitfield.imm8 = 1;
2313 t.bitfield.imm8s = 1;
2314 t.bitfield.imm16 = 1;
2315 t.bitfield.imm32 = 1;
2316 t.bitfield.imm32s = 1;
2317 }
2318 else if (fits_in_unsigned_byte (num))
2319 {
2320 t.bitfield.imm8 = 1;
2321 t.bitfield.imm16 = 1;
2322 t.bitfield.imm32 = 1;
2323 t.bitfield.imm32s = 1;
2324 }
2325 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2326 {
2327 t.bitfield.imm16 = 1;
2328 t.bitfield.imm32 = 1;
2329 t.bitfield.imm32s = 1;
2330 }
2331 else if (fits_in_signed_long (num))
2332 {
2333 t.bitfield.imm32 = 1;
2334 t.bitfield.imm32s = 1;
2335 }
2336 else if (fits_in_unsigned_long (num))
2337 t.bitfield.imm32 = 1;
2338
2339 return t;
47926f60 2340}
252b5132 2341
847f7ad4 2342static offsetT
e3bb37b5 2343offset_in_range (offsetT val, int size)
847f7ad4 2344{
508866be 2345 addressT mask;
ba2adb93 2346
847f7ad4
AM
2347 switch (size)
2348 {
508866be
L
2349 case 1: mask = ((addressT) 1 << 8) - 1; break;
2350 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 2351 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
2352#ifdef BFD64
2353 case 8: mask = ((addressT) 2 << 63) - 1; break;
2354#endif
47926f60 2355 default: abort ();
847f7ad4
AM
2356 }
2357
9de868bf
L
2358#ifdef BFD64
2359 /* If BFD64, sign extend val for 32bit address mode. */
2360 if (flag_code != CODE_64BIT
2361 || i.prefix[ADDR_PREFIX])
3e73aa7c
JH
2362 if ((val & ~(((addressT) 2 << 31) - 1)) == 0)
2363 val = (val ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
fa289fb8 2364#endif
ba2adb93 2365
47926f60 2366 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
2367 {
2368 char buf1[40], buf2[40];
2369
2370 sprint_value (buf1, val);
2371 sprint_value (buf2, val & mask);
2372 as_warn (_("%s shortened to %s"), buf1, buf2);
2373 }
2374 return val & mask;
2375}
2376
c32fa91d
L
2377enum PREFIX_GROUP
2378{
2379 PREFIX_EXIST = 0,
2380 PREFIX_LOCK,
2381 PREFIX_REP,
04ef582a 2382 PREFIX_DS,
c32fa91d
L
2383 PREFIX_OTHER
2384};
2385
2386/* Returns
2387 a. PREFIX_EXIST if attempting to add a prefix where one from the
2388 same class already exists.
2389 b. PREFIX_LOCK if lock prefix is added.
2390 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2391 d. PREFIX_DS if ds prefix is added.
2392 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2393 */
2394
2395static enum PREFIX_GROUP
e3bb37b5 2396add_prefix (unsigned int prefix)
252b5132 2397{
c32fa91d 2398 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2399 unsigned int q;
252b5132 2400
29b0f896
AM
2401 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2402 && flag_code == CODE_64BIT)
b1905489 2403 {
161a04f6 2404 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2405 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2406 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2407 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2408 ret = PREFIX_EXIST;
b1905489
JB
2409 q = REX_PREFIX;
2410 }
3e73aa7c 2411 else
b1905489
JB
2412 {
2413 switch (prefix)
2414 {
2415 default:
2416 abort ();
2417
b1905489 2418 case DS_PREFIX_OPCODE:
04ef582a
L
2419 ret = PREFIX_DS;
2420 /* Fall through. */
2421 case CS_PREFIX_OPCODE:
b1905489
JB
2422 case ES_PREFIX_OPCODE:
2423 case FS_PREFIX_OPCODE:
2424 case GS_PREFIX_OPCODE:
2425 case SS_PREFIX_OPCODE:
2426 q = SEG_PREFIX;
2427 break;
2428
2429 case REPNE_PREFIX_OPCODE:
2430 case REPE_PREFIX_OPCODE:
c32fa91d
L
2431 q = REP_PREFIX;
2432 ret = PREFIX_REP;
2433 break;
2434
b1905489 2435 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2436 q = LOCK_PREFIX;
2437 ret = PREFIX_LOCK;
b1905489
JB
2438 break;
2439
2440 case FWAIT_OPCODE:
2441 q = WAIT_PREFIX;
2442 break;
2443
2444 case ADDR_PREFIX_OPCODE:
2445 q = ADDR_PREFIX;
2446 break;
2447
2448 case DATA_PREFIX_OPCODE:
2449 q = DATA_PREFIX;
2450 break;
2451 }
2452 if (i.prefix[q] != 0)
c32fa91d 2453 ret = PREFIX_EXIST;
b1905489 2454 }
252b5132 2455
b1905489 2456 if (ret)
252b5132 2457 {
b1905489
JB
2458 if (!i.prefix[q])
2459 ++i.prefixes;
2460 i.prefix[q] |= prefix;
252b5132 2461 }
b1905489
JB
2462 else
2463 as_bad (_("same type of prefix used twice"));
252b5132 2464
252b5132
RH
2465 return ret;
2466}
2467
2468static void
78f12dd3 2469update_code_flag (int value, int check)
eecb386c 2470{
78f12dd3
L
2471 PRINTF_LIKE ((*as_error));
2472
1e9cc1c2 2473 flag_code = (enum flag_code) value;
40fb9820
L
2474 if (flag_code == CODE_64BIT)
2475 {
2476 cpu_arch_flags.bitfield.cpu64 = 1;
2477 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
2478 }
2479 else
2480 {
2481 cpu_arch_flags.bitfield.cpu64 = 0;
2482 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
2483 }
2484 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c 2485 {
78f12dd3
L
2486 if (check)
2487 as_error = as_fatal;
2488 else
2489 as_error = as_bad;
2490 (*as_error) (_("64bit mode not supported on `%s'."),
2491 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2492 }
40fb9820 2493 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c 2494 {
78f12dd3
L
2495 if (check)
2496 as_error = as_fatal;
2497 else
2498 as_error = as_bad;
2499 (*as_error) (_("32bit mode not supported on `%s'."),
2500 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2501 }
eecb386c
AM
2502 stackop_size = '\0';
2503}
2504
78f12dd3
L
2505static void
2506set_code_flag (int value)
2507{
2508 update_code_flag (value, 0);
2509}
2510
eecb386c 2511static void
e3bb37b5 2512set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2513{
1e9cc1c2 2514 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2515 if (flag_code != CODE_16BIT)
2516 abort ();
2517 cpu_arch_flags.bitfield.cpu64 = 0;
2518 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 2519 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2520}
2521
2522static void
e3bb37b5 2523set_intel_syntax (int syntax_flag)
252b5132
RH
2524{
2525 /* Find out if register prefixing is specified. */
2526 int ask_naked_reg = 0;
2527
2528 SKIP_WHITESPACE ();
29b0f896 2529 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2530 {
d02603dc
NC
2531 char *string;
2532 int e = get_symbol_name (&string);
252b5132 2533
47926f60 2534 if (strcmp (string, "prefix") == 0)
252b5132 2535 ask_naked_reg = 1;
47926f60 2536 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2537 ask_naked_reg = -1;
2538 else
d0b47220 2539 as_bad (_("bad argument to syntax directive."));
d02603dc 2540 (void) restore_line_pointer (e);
252b5132
RH
2541 }
2542 demand_empty_rest_of_line ();
c3332e24 2543
252b5132
RH
2544 intel_syntax = syntax_flag;
2545
2546 if (ask_naked_reg == 0)
f86103b7
AM
2547 allow_naked_reg = (intel_syntax
2548 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2549 else
2550 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2551
ee86248c 2552 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
7ab9ffdd 2553
e4a3b5a4 2554 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 2555 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 2556 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
2557}
2558
1efbbeb4
L
2559static void
2560set_intel_mnemonic (int mnemonic_flag)
2561{
e1d4d893 2562 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2563}
2564
db51cc60
L
2565static void
2566set_allow_index_reg (int flag)
2567{
2568 allow_index_reg = flag;
2569}
2570
cb19c032 2571static void
7bab8ab5 2572set_check (int what)
cb19c032 2573{
7bab8ab5
JB
2574 enum check_kind *kind;
2575 const char *str;
2576
2577 if (what)
2578 {
2579 kind = &operand_check;
2580 str = "operand";
2581 }
2582 else
2583 {
2584 kind = &sse_check;
2585 str = "sse";
2586 }
2587
cb19c032
L
2588 SKIP_WHITESPACE ();
2589
2590 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2591 {
d02603dc
NC
2592 char *string;
2593 int e = get_symbol_name (&string);
cb19c032
L
2594
2595 if (strcmp (string, "none") == 0)
7bab8ab5 2596 *kind = check_none;
cb19c032 2597 else if (strcmp (string, "warning") == 0)
7bab8ab5 2598 *kind = check_warning;
cb19c032 2599 else if (strcmp (string, "error") == 0)
7bab8ab5 2600 *kind = check_error;
cb19c032 2601 else
7bab8ab5 2602 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2603 (void) restore_line_pointer (e);
cb19c032
L
2604 }
2605 else
7bab8ab5 2606 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2607
2608 demand_empty_rest_of_line ();
2609}
2610
8a9036a4
L
2611static void
2612check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2613 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2614{
2615#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2616 static const char *arch;
2617
2618 /* Intel LIOM is only supported on ELF. */
2619 if (!IS_ELF)
2620 return;
2621
2622 if (!arch)
2623 {
2624 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2625 use default_arch. */
2626 arch = cpu_arch_name;
2627 if (!arch)
2628 arch = default_arch;
2629 }
2630
81486035
L
2631 /* If we are targeting Intel MCU, we must enable it. */
2632 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_IAMCU
2633 || new_flag.bitfield.cpuiamcu)
2634 return;
2635
3632d14b 2636 /* If we are targeting Intel L1OM, we must enable it. */
8a9036a4 2637 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_L1OM
1e9cc1c2 2638 || new_flag.bitfield.cpul1om)
8a9036a4 2639 return;
76ba9986 2640
7a9068fe
L
2641 /* If we are targeting Intel K1OM, we must enable it. */
2642 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_K1OM
2643 || new_flag.bitfield.cpuk1om)
2644 return;
2645
8a9036a4
L
2646 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2647#endif
2648}
2649
e413e4e9 2650static void
e3bb37b5 2651set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2652{
47926f60 2653 SKIP_WHITESPACE ();
e413e4e9 2654
29b0f896 2655 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9 2656 {
d02603dc
NC
2657 char *string;
2658 int e = get_symbol_name (&string);
91d6fa6a 2659 unsigned int j;
40fb9820 2660 i386_cpu_flags flags;
e413e4e9 2661
91d6fa6a 2662 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
e413e4e9 2663 {
91d6fa6a 2664 if (strcmp (string, cpu_arch[j].name) == 0)
e413e4e9 2665 {
91d6fa6a 2666 check_cpu_arch_compatible (string, cpu_arch[j].flags);
8a9036a4 2667
5c6af06e
JB
2668 if (*string != '.')
2669 {
91d6fa6a 2670 cpu_arch_name = cpu_arch[j].name;
5c6af06e 2671 cpu_sub_arch_name = NULL;
91d6fa6a 2672 cpu_arch_flags = cpu_arch[j].flags;
40fb9820
L
2673 if (flag_code == CODE_64BIT)
2674 {
2675 cpu_arch_flags.bitfield.cpu64 = 1;
2676 cpu_arch_flags.bitfield.cpuno64 = 0;
2677 }
2678 else
2679 {
2680 cpu_arch_flags.bitfield.cpu64 = 0;
2681 cpu_arch_flags.bitfield.cpuno64 = 1;
2682 }
91d6fa6a
NC
2683 cpu_arch_isa = cpu_arch[j].type;
2684 cpu_arch_isa_flags = cpu_arch[j].flags;
ccc9c027
L
2685 if (!cpu_arch_tune_set)
2686 {
2687 cpu_arch_tune = cpu_arch_isa;
2688 cpu_arch_tune_flags = cpu_arch_isa_flags;
2689 }
5c6af06e
JB
2690 break;
2691 }
40fb9820 2692
293f5f65
L
2693 flags = cpu_flags_or (cpu_arch_flags,
2694 cpu_arch[j].flags);
81486035 2695
5b64d091 2696 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
5c6af06e 2697 {
6305a203
L
2698 if (cpu_sub_arch_name)
2699 {
2700 char *name = cpu_sub_arch_name;
2701 cpu_sub_arch_name = concat (name,
91d6fa6a 2702 cpu_arch[j].name,
1bf57e9f 2703 (const char *) NULL);
6305a203
L
2704 free (name);
2705 }
2706 else
91d6fa6a 2707 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
40fb9820 2708 cpu_arch_flags = flags;
a586129e 2709 cpu_arch_isa_flags = flags;
5c6af06e 2710 }
0089dace
L
2711 else
2712 cpu_arch_isa_flags
2713 = cpu_flags_or (cpu_arch_isa_flags,
2714 cpu_arch[j].flags);
d02603dc 2715 (void) restore_line_pointer (e);
5c6af06e
JB
2716 demand_empty_rest_of_line ();
2717 return;
e413e4e9
AM
2718 }
2719 }
293f5f65
L
2720
2721 if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
2722 {
33eaf5de 2723 /* Disable an ISA extension. */
293f5f65
L
2724 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
2725 if (strcmp (string + 1, cpu_noarch [j].name) == 0)
2726 {
2727 flags = cpu_flags_and_not (cpu_arch_flags,
2728 cpu_noarch[j].flags);
2729 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2730 {
2731 if (cpu_sub_arch_name)
2732 {
2733 char *name = cpu_sub_arch_name;
2734 cpu_sub_arch_name = concat (name, string,
2735 (const char *) NULL);
2736 free (name);
2737 }
2738 else
2739 cpu_sub_arch_name = xstrdup (string);
2740 cpu_arch_flags = flags;
2741 cpu_arch_isa_flags = flags;
2742 }
2743 (void) restore_line_pointer (e);
2744 demand_empty_rest_of_line ();
2745 return;
2746 }
2747
2748 j = ARRAY_SIZE (cpu_arch);
2749 }
2750
91d6fa6a 2751 if (j >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
2752 as_bad (_("no such architecture: `%s'"), string);
2753
2754 *input_line_pointer = e;
2755 }
2756 else
2757 as_bad (_("missing cpu architecture"));
2758
fddf5b5b
AM
2759 no_cond_jump_promotion = 0;
2760 if (*input_line_pointer == ','
29b0f896 2761 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 2762 {
d02603dc
NC
2763 char *string;
2764 char e;
2765
2766 ++input_line_pointer;
2767 e = get_symbol_name (&string);
fddf5b5b
AM
2768
2769 if (strcmp (string, "nojumps") == 0)
2770 no_cond_jump_promotion = 1;
2771 else if (strcmp (string, "jumps") == 0)
2772 ;
2773 else
2774 as_bad (_("no such architecture modifier: `%s'"), string);
2775
d02603dc 2776 (void) restore_line_pointer (e);
fddf5b5b
AM
2777 }
2778
e413e4e9
AM
2779 demand_empty_rest_of_line ();
2780}
2781
8a9036a4
L
2782enum bfd_architecture
2783i386_arch (void)
2784{
3632d14b 2785 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4
L
2786 {
2787 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2788 || flag_code != CODE_64BIT)
2789 as_fatal (_("Intel L1OM is 64bit ELF only"));
2790 return bfd_arch_l1om;
2791 }
7a9068fe
L
2792 else if (cpu_arch_isa == PROCESSOR_K1OM)
2793 {
2794 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2795 || flag_code != CODE_64BIT)
2796 as_fatal (_("Intel K1OM is 64bit ELF only"));
2797 return bfd_arch_k1om;
2798 }
81486035
L
2799 else if (cpu_arch_isa == PROCESSOR_IAMCU)
2800 {
2801 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2802 || flag_code == CODE_64BIT)
2803 as_fatal (_("Intel MCU is 32bit ELF only"));
2804 return bfd_arch_iamcu;
2805 }
8a9036a4
L
2806 else
2807 return bfd_arch_i386;
2808}
2809
b9d79e03 2810unsigned long
7016a5d5 2811i386_mach (void)
b9d79e03 2812{
351f65ca 2813 if (!strncmp (default_arch, "x86_64", 6))
8a9036a4 2814 {
3632d14b 2815 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 2816 {
351f65ca
L
2817 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2818 || default_arch[6] != '\0')
8a9036a4
L
2819 as_fatal (_("Intel L1OM is 64bit ELF only"));
2820 return bfd_mach_l1om;
2821 }
7a9068fe
L
2822 else if (cpu_arch_isa == PROCESSOR_K1OM)
2823 {
2824 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2825 || default_arch[6] != '\0')
2826 as_fatal (_("Intel K1OM is 64bit ELF only"));
2827 return bfd_mach_k1om;
2828 }
351f65ca 2829 else if (default_arch[6] == '\0')
8a9036a4 2830 return bfd_mach_x86_64;
351f65ca
L
2831 else
2832 return bfd_mach_x64_32;
8a9036a4 2833 }
5197d474
L
2834 else if (!strcmp (default_arch, "i386")
2835 || !strcmp (default_arch, "iamcu"))
81486035
L
2836 {
2837 if (cpu_arch_isa == PROCESSOR_IAMCU)
2838 {
2839 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
2840 as_fatal (_("Intel MCU is 32bit ELF only"));
2841 return bfd_mach_i386_iamcu;
2842 }
2843 else
2844 return bfd_mach_i386_i386;
2845 }
b9d79e03 2846 else
2b5d6a91 2847 as_fatal (_("unknown architecture"));
b9d79e03 2848}
b9d79e03 2849\f
252b5132 2850void
7016a5d5 2851md_begin (void)
252b5132
RH
2852{
2853 const char *hash_err;
2854
86fa6981
L
2855 /* Support pseudo prefixes like {disp32}. */
2856 lex_type ['{'] = LEX_BEGIN_NAME;
2857
47926f60 2858 /* Initialize op_hash hash table. */
252b5132
RH
2859 op_hash = hash_new ();
2860
2861 {
d3ce72d0 2862 const insn_template *optab;
29b0f896 2863 templates *core_optab;
252b5132 2864
47926f60
KH
2865 /* Setup for loop. */
2866 optab = i386_optab;
add39d23 2867 core_optab = XNEW (templates);
252b5132
RH
2868 core_optab->start = optab;
2869
2870 while (1)
2871 {
2872 ++optab;
2873 if (optab->name == NULL
2874 || strcmp (optab->name, (optab - 1)->name) != 0)
2875 {
2876 /* different name --> ship out current template list;
47926f60 2877 add to hash table; & begin anew. */
252b5132
RH
2878 core_optab->end = optab;
2879 hash_err = hash_insert (op_hash,
2880 (optab - 1)->name,
5a49b8ac 2881 (void *) core_optab);
252b5132
RH
2882 if (hash_err)
2883 {
b37df7c4 2884 as_fatal (_("can't hash %s: %s"),
252b5132
RH
2885 (optab - 1)->name,
2886 hash_err);
2887 }
2888 if (optab->name == NULL)
2889 break;
add39d23 2890 core_optab = XNEW (templates);
252b5132
RH
2891 core_optab->start = optab;
2892 }
2893 }
2894 }
2895
47926f60 2896 /* Initialize reg_hash hash table. */
252b5132
RH
2897 reg_hash = hash_new ();
2898 {
29b0f896 2899 const reg_entry *regtab;
c3fe08fa 2900 unsigned int regtab_size = i386_regtab_size;
252b5132 2901
c3fe08fa 2902 for (regtab = i386_regtab; regtab_size--; regtab++)
252b5132 2903 {
5a49b8ac 2904 hash_err = hash_insert (reg_hash, regtab->reg_name, (void *) regtab);
252b5132 2905 if (hash_err)
b37df7c4 2906 as_fatal (_("can't hash %s: %s"),
3e73aa7c
JH
2907 regtab->reg_name,
2908 hash_err);
252b5132
RH
2909 }
2910 }
2911
47926f60 2912 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 2913 {
29b0f896
AM
2914 int c;
2915 char *p;
252b5132
RH
2916
2917 for (c = 0; c < 256; c++)
2918 {
3882b010 2919 if (ISDIGIT (c))
252b5132
RH
2920 {
2921 digit_chars[c] = c;
2922 mnemonic_chars[c] = c;
2923 register_chars[c] = c;
2924 operand_chars[c] = c;
2925 }
3882b010 2926 else if (ISLOWER (c))
252b5132
RH
2927 {
2928 mnemonic_chars[c] = c;
2929 register_chars[c] = c;
2930 operand_chars[c] = c;
2931 }
3882b010 2932 else if (ISUPPER (c))
252b5132 2933 {
3882b010 2934 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
2935 register_chars[c] = mnemonic_chars[c];
2936 operand_chars[c] = c;
2937 }
43234a1e 2938 else if (c == '{' || c == '}')
86fa6981
L
2939 {
2940 mnemonic_chars[c] = c;
2941 operand_chars[c] = c;
2942 }
252b5132 2943
3882b010 2944 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
2945 identifier_chars[c] = c;
2946 else if (c >= 128)
2947 {
2948 identifier_chars[c] = c;
2949 operand_chars[c] = c;
2950 }
2951 }
2952
2953#ifdef LEX_AT
2954 identifier_chars['@'] = '@';
32137342
NC
2955#endif
2956#ifdef LEX_QM
2957 identifier_chars['?'] = '?';
2958 operand_chars['?'] = '?';
252b5132 2959#endif
252b5132 2960 digit_chars['-'] = '-';
c0f3af97 2961 mnemonic_chars['_'] = '_';
791fe849 2962 mnemonic_chars['-'] = '-';
0003779b 2963 mnemonic_chars['.'] = '.';
252b5132
RH
2964 identifier_chars['_'] = '_';
2965 identifier_chars['.'] = '.';
2966
2967 for (p = operand_special_chars; *p != '\0'; p++)
2968 operand_chars[(unsigned char) *p] = *p;
2969 }
2970
a4447b93
RH
2971 if (flag_code == CODE_64BIT)
2972 {
ca19b261
KT
2973#if defined (OBJ_COFF) && defined (TE_PE)
2974 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
2975 ? 32 : 16);
2976#else
a4447b93 2977 x86_dwarf2_return_column = 16;
ca19b261 2978#endif
61ff971f 2979 x86_cie_data_alignment = -8;
a4447b93
RH
2980 }
2981 else
2982 {
2983 x86_dwarf2_return_column = 8;
2984 x86_cie_data_alignment = -4;
2985 }
252b5132
RH
2986}
2987
2988void
e3bb37b5 2989i386_print_statistics (FILE *file)
252b5132
RH
2990{
2991 hash_print_statistics (file, "i386 opcode", op_hash);
2992 hash_print_statistics (file, "i386 register", reg_hash);
2993}
2994\f
252b5132
RH
2995#ifdef DEBUG386
2996
ce8a8b2f 2997/* Debugging routines for md_assemble. */
d3ce72d0 2998static void pte (insn_template *);
40fb9820 2999static void pt (i386_operand_type);
e3bb37b5
L
3000static void pe (expressionS *);
3001static void ps (symbolS *);
252b5132
RH
3002
3003static void
e3bb37b5 3004pi (char *line, i386_insn *x)
252b5132 3005{
09137c09 3006 unsigned int j;
252b5132
RH
3007
3008 fprintf (stdout, "%s: template ", line);
3009 pte (&x->tm);
09f131f2
JH
3010 fprintf (stdout, " address: base %s index %s scale %x\n",
3011 x->base_reg ? x->base_reg->reg_name : "none",
3012 x->index_reg ? x->index_reg->reg_name : "none",
3013 x->log2_scale_factor);
3014 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 3015 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
3016 fprintf (stdout, " sib: base %x index %x scale %x\n",
3017 x->sib.base, x->sib.index, x->sib.scale);
3018 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
3019 (x->rex & REX_W) != 0,
3020 (x->rex & REX_R) != 0,
3021 (x->rex & REX_X) != 0,
3022 (x->rex & REX_B) != 0);
09137c09 3023 for (j = 0; j < x->operands; j++)
252b5132 3024 {
09137c09
SP
3025 fprintf (stdout, " #%d: ", j + 1);
3026 pt (x->types[j]);
252b5132 3027 fprintf (stdout, "\n");
dc821c5f 3028 if (x->types[j].bitfield.reg
09137c09 3029 || x->types[j].bitfield.regmmx
1b54b8d7 3030 || x->types[j].bitfield.regsimd
09137c09
SP
3031 || x->types[j].bitfield.sreg2
3032 || x->types[j].bitfield.sreg3
3033 || x->types[j].bitfield.control
3034 || x->types[j].bitfield.debug
3035 || x->types[j].bitfield.test)
3036 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
3037 if (operand_type_check (x->types[j], imm))
3038 pe (x->op[j].imms);
3039 if (operand_type_check (x->types[j], disp))
3040 pe (x->op[j].disps);
252b5132
RH
3041 }
3042}
3043
3044static void
d3ce72d0 3045pte (insn_template *t)
252b5132 3046{
09137c09 3047 unsigned int j;
252b5132 3048 fprintf (stdout, " %d operands ", t->operands);
47926f60 3049 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
3050 if (t->extension_opcode != None)
3051 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 3052 if (t->opcode_modifier.d)
252b5132 3053 fprintf (stdout, "D");
40fb9820 3054 if (t->opcode_modifier.w)
252b5132
RH
3055 fprintf (stdout, "W");
3056 fprintf (stdout, "\n");
09137c09 3057 for (j = 0; j < t->operands; j++)
252b5132 3058 {
09137c09
SP
3059 fprintf (stdout, " #%d type ", j + 1);
3060 pt (t->operand_types[j]);
252b5132
RH
3061 fprintf (stdout, "\n");
3062 }
3063}
3064
3065static void
e3bb37b5 3066pe (expressionS *e)
252b5132 3067{
24eab124 3068 fprintf (stdout, " operation %d\n", e->X_op);
b77ad1d4
AM
3069 fprintf (stdout, " add_number %ld (%lx)\n",
3070 (long) e->X_add_number, (long) e->X_add_number);
252b5132
RH
3071 if (e->X_add_symbol)
3072 {
3073 fprintf (stdout, " add_symbol ");
3074 ps (e->X_add_symbol);
3075 fprintf (stdout, "\n");
3076 }
3077 if (e->X_op_symbol)
3078 {
3079 fprintf (stdout, " op_symbol ");
3080 ps (e->X_op_symbol);
3081 fprintf (stdout, "\n");
3082 }
3083}
3084
3085static void
e3bb37b5 3086ps (symbolS *s)
252b5132
RH
3087{
3088 fprintf (stdout, "%s type %s%s",
3089 S_GET_NAME (s),
3090 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3091 segment_name (S_GET_SEGMENT (s)));
3092}
3093
7b81dfbb 3094static struct type_name
252b5132 3095 {
40fb9820
L
3096 i386_operand_type mask;
3097 const char *name;
252b5132 3098 }
7b81dfbb 3099const type_names[] =
252b5132 3100{
40fb9820
L
3101 { OPERAND_TYPE_REG8, "r8" },
3102 { OPERAND_TYPE_REG16, "r16" },
3103 { OPERAND_TYPE_REG32, "r32" },
3104 { OPERAND_TYPE_REG64, "r64" },
3105 { OPERAND_TYPE_IMM8, "i8" },
3106 { OPERAND_TYPE_IMM8, "i8s" },
3107 { OPERAND_TYPE_IMM16, "i16" },
3108 { OPERAND_TYPE_IMM32, "i32" },
3109 { OPERAND_TYPE_IMM32S, "i32s" },
3110 { OPERAND_TYPE_IMM64, "i64" },
3111 { OPERAND_TYPE_IMM1, "i1" },
3112 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
3113 { OPERAND_TYPE_DISP8, "d8" },
3114 { OPERAND_TYPE_DISP16, "d16" },
3115 { OPERAND_TYPE_DISP32, "d32" },
3116 { OPERAND_TYPE_DISP32S, "d32s" },
3117 { OPERAND_TYPE_DISP64, "d64" },
3118 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
3119 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
3120 { OPERAND_TYPE_CONTROL, "control reg" },
3121 { OPERAND_TYPE_TEST, "test reg" },
3122 { OPERAND_TYPE_DEBUG, "debug reg" },
3123 { OPERAND_TYPE_FLOATREG, "FReg" },
3124 { OPERAND_TYPE_FLOATACC, "FAcc" },
3125 { OPERAND_TYPE_SREG2, "SReg2" },
3126 { OPERAND_TYPE_SREG3, "SReg3" },
3127 { OPERAND_TYPE_ACC, "Acc" },
3128 { OPERAND_TYPE_JUMPABSOLUTE, "Jump Absolute" },
3129 { OPERAND_TYPE_REGMMX, "rMMX" },
3130 { OPERAND_TYPE_REGXMM, "rXMM" },
0349dc08 3131 { OPERAND_TYPE_REGYMM, "rYMM" },
43234a1e
L
3132 { OPERAND_TYPE_REGZMM, "rZMM" },
3133 { OPERAND_TYPE_REGMASK, "Mask reg" },
40fb9820 3134 { OPERAND_TYPE_ESSEG, "es" },
252b5132
RH
3135};
3136
3137static void
40fb9820 3138pt (i386_operand_type t)
252b5132 3139{
40fb9820 3140 unsigned int j;
c6fb90c8 3141 i386_operand_type a;
252b5132 3142
40fb9820 3143 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3144 {
3145 a = operand_type_and (t, type_names[j].mask);
0349dc08 3146 if (!operand_type_all_zero (&a))
c6fb90c8
L
3147 fprintf (stdout, "%s, ", type_names[j].name);
3148 }
252b5132
RH
3149 fflush (stdout);
3150}
3151
3152#endif /* DEBUG386 */
3153\f
252b5132 3154static bfd_reloc_code_real_type
3956db08 3155reloc (unsigned int size,
64e74474
AM
3156 int pcrel,
3157 int sign,
3158 bfd_reloc_code_real_type other)
252b5132 3159{
47926f60 3160 if (other != NO_RELOC)
3956db08 3161 {
91d6fa6a 3162 reloc_howto_type *rel;
3956db08
JB
3163
3164 if (size == 8)
3165 switch (other)
3166 {
64e74474
AM
3167 case BFD_RELOC_X86_64_GOT32:
3168 return BFD_RELOC_X86_64_GOT64;
3169 break;
553d1284
L
3170 case BFD_RELOC_X86_64_GOTPLT64:
3171 return BFD_RELOC_X86_64_GOTPLT64;
3172 break;
64e74474
AM
3173 case BFD_RELOC_X86_64_PLTOFF64:
3174 return BFD_RELOC_X86_64_PLTOFF64;
3175 break;
3176 case BFD_RELOC_X86_64_GOTPC32:
3177 other = BFD_RELOC_X86_64_GOTPC64;
3178 break;
3179 case BFD_RELOC_X86_64_GOTPCREL:
3180 other = BFD_RELOC_X86_64_GOTPCREL64;
3181 break;
3182 case BFD_RELOC_X86_64_TPOFF32:
3183 other = BFD_RELOC_X86_64_TPOFF64;
3184 break;
3185 case BFD_RELOC_X86_64_DTPOFF32:
3186 other = BFD_RELOC_X86_64_DTPOFF64;
3187 break;
3188 default:
3189 break;
3956db08 3190 }
e05278af 3191
8ce3d284 3192#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3193 if (other == BFD_RELOC_SIZE32)
3194 {
3195 if (size == 8)
1ab668bf 3196 other = BFD_RELOC_SIZE64;
8fd4256d 3197 if (pcrel)
1ab668bf
AM
3198 {
3199 as_bad (_("there are no pc-relative size relocations"));
3200 return NO_RELOC;
3201 }
8fd4256d 3202 }
8ce3d284 3203#endif
8fd4256d 3204
e05278af 3205 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3206 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3207 sign = -1;
3208
91d6fa6a
NC
3209 rel = bfd_reloc_type_lookup (stdoutput, other);
3210 if (!rel)
3956db08 3211 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3212 else if (size != bfd_get_reloc_size (rel))
3956db08 3213 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3214 bfd_get_reloc_size (rel),
3956db08 3215 size);
91d6fa6a 3216 else if (pcrel && !rel->pc_relative)
3956db08 3217 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3218 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3219 && !sign)
91d6fa6a 3220 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3221 && sign > 0))
3956db08
JB
3222 as_bad (_("relocated field and relocation type differ in signedness"));
3223 else
3224 return other;
3225 return NO_RELOC;
3226 }
252b5132
RH
3227
3228 if (pcrel)
3229 {
3e73aa7c 3230 if (!sign)
3956db08 3231 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3232 switch (size)
3233 {
3234 case 1: return BFD_RELOC_8_PCREL;
3235 case 2: return BFD_RELOC_16_PCREL;
d258b828 3236 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3237 case 8: return BFD_RELOC_64_PCREL;
252b5132 3238 }
3956db08 3239 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3240 }
3241 else
3242 {
3956db08 3243 if (sign > 0)
e5cb08ac 3244 switch (size)
3e73aa7c
JH
3245 {
3246 case 4: return BFD_RELOC_X86_64_32S;
3247 }
3248 else
3249 switch (size)
3250 {
3251 case 1: return BFD_RELOC_8;
3252 case 2: return BFD_RELOC_16;
3253 case 4: return BFD_RELOC_32;
3254 case 8: return BFD_RELOC_64;
3255 }
3956db08
JB
3256 as_bad (_("cannot do %s %u byte relocation"),
3257 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3258 }
3259
0cc9e1d3 3260 return NO_RELOC;
252b5132
RH
3261}
3262
47926f60
KH
3263/* Here we decide which fixups can be adjusted to make them relative to
3264 the beginning of the section instead of the symbol. Basically we need
3265 to make sure that the dynamic relocations are done correctly, so in
3266 some cases we force the original symbol to be used. */
3267
252b5132 3268int
e3bb37b5 3269tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3270{
6d249963 3271#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3272 if (!IS_ELF)
31312f95
AM
3273 return 1;
3274
a161fe53
AM
3275 /* Don't adjust pc-relative references to merge sections in 64-bit
3276 mode. */
3277 if (use_rela_relocations
3278 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3279 && fixP->fx_pcrel)
252b5132 3280 return 0;
31312f95 3281
8d01d9a9
AJ
3282 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3283 and changed later by validate_fix. */
3284 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3285 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3286 return 0;
3287
8fd4256d
L
3288 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3289 for size relocations. */
3290 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3291 || fixP->fx_r_type == BFD_RELOC_SIZE64
3292 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132
RH
3293 || fixP->fx_r_type == BFD_RELOC_386_PLT32
3294 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3295 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3296 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3297 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3298 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3299 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3300 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3301 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3302 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3303 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3304 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3305 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c
JH
3306 || fixP->fx_r_type == BFD_RELOC_X86_64_PLT32
3307 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3308 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3309 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3310 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3311 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3312 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3313 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3314 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3315 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3316 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3317 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3318 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3319 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3320 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3321 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3322 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3323 return 0;
31312f95 3324#endif
252b5132
RH
3325 return 1;
3326}
252b5132 3327
b4cac588 3328static int
e3bb37b5 3329intel_float_operand (const char *mnemonic)
252b5132 3330{
9306ca4a
JB
3331 /* Note that the value returned is meaningful only for opcodes with (memory)
3332 operands, hence the code here is free to improperly handle opcodes that
3333 have no operands (for better performance and smaller code). */
3334
3335 if (mnemonic[0] != 'f')
3336 return 0; /* non-math */
3337
3338 switch (mnemonic[1])
3339 {
3340 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3341 the fs segment override prefix not currently handled because no
3342 call path can make opcodes without operands get here */
3343 case 'i':
3344 return 2 /* integer op */;
3345 case 'l':
3346 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3347 return 3; /* fldcw/fldenv */
3348 break;
3349 case 'n':
3350 if (mnemonic[2] != 'o' /* fnop */)
3351 return 3; /* non-waiting control op */
3352 break;
3353 case 'r':
3354 if (mnemonic[2] == 's')
3355 return 3; /* frstor/frstpm */
3356 break;
3357 case 's':
3358 if (mnemonic[2] == 'a')
3359 return 3; /* fsave */
3360 if (mnemonic[2] == 't')
3361 {
3362 switch (mnemonic[3])
3363 {
3364 case 'c': /* fstcw */
3365 case 'd': /* fstdw */
3366 case 'e': /* fstenv */
3367 case 's': /* fsts[gw] */
3368 return 3;
3369 }
3370 }
3371 break;
3372 case 'x':
3373 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3374 return 0; /* fxsave/fxrstor are not really math ops */
3375 break;
3376 }
252b5132 3377
9306ca4a 3378 return 1;
252b5132
RH
3379}
3380
c0f3af97
L
3381/* Build the VEX prefix. */
3382
3383static void
d3ce72d0 3384build_vex_prefix (const insn_template *t)
c0f3af97
L
3385{
3386 unsigned int register_specifier;
3387 unsigned int implied_prefix;
3388 unsigned int vector_length;
03751133 3389 unsigned int w;
c0f3af97
L
3390
3391 /* Check register specifier. */
3392 if (i.vex.register_specifier)
43234a1e
L
3393 {
3394 register_specifier =
3395 ~register_number (i.vex.register_specifier) & 0xf;
3396 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3397 }
c0f3af97
L
3398 else
3399 register_specifier = 0xf;
3400
79f0fa25
L
3401 /* Use 2-byte VEX prefix by swapping destination and source operand
3402 if there are more than 1 register operand. */
3403 if (i.reg_operands > 1
3404 && i.vec_encoding != vex_encoding_vex3
86fa6981 3405 && i.dir_encoding == dir_encoding_default
fa99fab2 3406 && i.operands == i.reg_operands
dbbc8b7e 3407 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
7f399153 3408 && i.tm.opcode_modifier.vexopcode == VEX0F
dbbc8b7e 3409 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3410 && i.rex == REX_B)
3411 {
3412 unsigned int xchg = i.operands - 1;
3413 union i386_op temp_op;
3414 i386_operand_type temp_type;
3415
3416 temp_type = i.types[xchg];
3417 i.types[xchg] = i.types[0];
3418 i.types[0] = temp_type;
3419 temp_op = i.op[xchg];
3420 i.op[xchg] = i.op[0];
3421 i.op[0] = temp_op;
3422
9c2799c2 3423 gas_assert (i.rm.mode == 3);
fa99fab2
L
3424
3425 i.rex = REX_R;
3426 xchg = i.rm.regmem;
3427 i.rm.regmem = i.rm.reg;
3428 i.rm.reg = xchg;
3429
dbbc8b7e
JB
3430 if (i.tm.opcode_modifier.d)
3431 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
3432 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
3433 else /* Use the next insn. */
3434 i.tm = t[1];
fa99fab2
L
3435 }
3436
539f890d
L
3437 if (i.tm.opcode_modifier.vex == VEXScalar)
3438 vector_length = avxscalar;
10c17abd
JB
3439 else if (i.tm.opcode_modifier.vex == VEX256)
3440 vector_length = 1;
539f890d 3441 else
10c17abd 3442 {
56522fc5 3443 unsigned int op;
10c17abd 3444
c7213af9
L
3445 /* Determine vector length from the last multi-length vector
3446 operand. */
10c17abd 3447 vector_length = 0;
56522fc5 3448 for (op = t->operands; op--;)
10c17abd
JB
3449 if (t->operand_types[op].bitfield.xmmword
3450 && t->operand_types[op].bitfield.ymmword
3451 && i.types[op].bitfield.ymmword)
3452 {
3453 vector_length = 1;
3454 break;
3455 }
3456 }
c0f3af97
L
3457
3458 switch ((i.tm.base_opcode >> 8) & 0xff)
3459 {
3460 case 0:
3461 implied_prefix = 0;
3462 break;
3463 case DATA_PREFIX_OPCODE:
3464 implied_prefix = 1;
3465 break;
3466 case REPE_PREFIX_OPCODE:
3467 implied_prefix = 2;
3468 break;
3469 case REPNE_PREFIX_OPCODE:
3470 implied_prefix = 3;
3471 break;
3472 default:
3473 abort ();
3474 }
3475
03751133
L
3476 /* Check the REX.W bit and VEXW. */
3477 if (i.tm.opcode_modifier.vexw == VEXWIG)
3478 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
3479 else if (i.tm.opcode_modifier.vexw)
3480 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3481 else
931d03b7 3482 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3483
c0f3af97 3484 /* Use 2-byte VEX prefix if possible. */
03751133
L
3485 if (w == 0
3486 && i.vec_encoding != vex_encoding_vex3
86fa6981 3487 && i.tm.opcode_modifier.vexopcode == VEX0F
c0f3af97
L
3488 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3489 {
3490 /* 2-byte VEX prefix. */
3491 unsigned int r;
3492
3493 i.vex.length = 2;
3494 i.vex.bytes[0] = 0xc5;
3495
3496 /* Check the REX.R bit. */
3497 r = (i.rex & REX_R) ? 0 : 1;
3498 i.vex.bytes[1] = (r << 7
3499 | register_specifier << 3
3500 | vector_length << 2
3501 | implied_prefix);
3502 }
3503 else
3504 {
3505 /* 3-byte VEX prefix. */
03751133 3506 unsigned int m;
c0f3af97 3507
f88c9eb0 3508 i.vex.length = 3;
f88c9eb0 3509
7f399153 3510 switch (i.tm.opcode_modifier.vexopcode)
5dd85c99 3511 {
7f399153
L
3512 case VEX0F:
3513 m = 0x1;
80de6e00 3514 i.vex.bytes[0] = 0xc4;
7f399153
L
3515 break;
3516 case VEX0F38:
3517 m = 0x2;
80de6e00 3518 i.vex.bytes[0] = 0xc4;
7f399153
L
3519 break;
3520 case VEX0F3A:
3521 m = 0x3;
80de6e00 3522 i.vex.bytes[0] = 0xc4;
7f399153
L
3523 break;
3524 case XOP08:
5dd85c99
SP
3525 m = 0x8;
3526 i.vex.bytes[0] = 0x8f;
7f399153
L
3527 break;
3528 case XOP09:
f88c9eb0
SP
3529 m = 0x9;
3530 i.vex.bytes[0] = 0x8f;
7f399153
L
3531 break;
3532 case XOP0A:
f88c9eb0
SP
3533 m = 0xa;
3534 i.vex.bytes[0] = 0x8f;
7f399153
L
3535 break;
3536 default:
3537 abort ();
f88c9eb0 3538 }
c0f3af97 3539
c0f3af97
L
3540 /* The high 3 bits of the second VEX byte are 1's compliment
3541 of RXB bits from REX. */
3542 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3543
c0f3af97
L
3544 i.vex.bytes[2] = (w << 7
3545 | register_specifier << 3
3546 | vector_length << 2
3547 | implied_prefix);
3548 }
3549}
3550
e771e7c9
JB
3551static INLINE bfd_boolean
3552is_evex_encoding (const insn_template *t)
3553{
7091c612 3554 return t->opcode_modifier.evex || t->opcode_modifier.disp8memshift
e771e7c9
JB
3555 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
3556 || t->opcode_modifier.staticrounding || t->opcode_modifier.sae;
3557}
3558
7a8655d2
JB
3559static INLINE bfd_boolean
3560is_any_vex_encoding (const insn_template *t)
3561{
3562 return t->opcode_modifier.vex || t->opcode_modifier.vexopcode
3563 || is_evex_encoding (t);
3564}
3565
43234a1e
L
3566/* Build the EVEX prefix. */
3567
3568static void
3569build_evex_prefix (void)
3570{
3571 unsigned int register_specifier;
3572 unsigned int implied_prefix;
3573 unsigned int m, w;
3574 rex_byte vrex_used = 0;
3575
3576 /* Check register specifier. */
3577 if (i.vex.register_specifier)
3578 {
3579 gas_assert ((i.vrex & REX_X) == 0);
3580
3581 register_specifier = i.vex.register_specifier->reg_num;
3582 if ((i.vex.register_specifier->reg_flags & RegRex))
3583 register_specifier += 8;
3584 /* The upper 16 registers are encoded in the fourth byte of the
3585 EVEX prefix. */
3586 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3587 i.vex.bytes[3] = 0x8;
3588 register_specifier = ~register_specifier & 0xf;
3589 }
3590 else
3591 {
3592 register_specifier = 0xf;
3593
3594 /* Encode upper 16 vector index register in the fourth byte of
3595 the EVEX prefix. */
3596 if (!(i.vrex & REX_X))
3597 i.vex.bytes[3] = 0x8;
3598 else
3599 vrex_used |= REX_X;
3600 }
3601
3602 switch ((i.tm.base_opcode >> 8) & 0xff)
3603 {
3604 case 0:
3605 implied_prefix = 0;
3606 break;
3607 case DATA_PREFIX_OPCODE:
3608 implied_prefix = 1;
3609 break;
3610 case REPE_PREFIX_OPCODE:
3611 implied_prefix = 2;
3612 break;
3613 case REPNE_PREFIX_OPCODE:
3614 implied_prefix = 3;
3615 break;
3616 default:
3617 abort ();
3618 }
3619
3620 /* 4 byte EVEX prefix. */
3621 i.vex.length = 4;
3622 i.vex.bytes[0] = 0x62;
3623
3624 /* mmmm bits. */
3625 switch (i.tm.opcode_modifier.vexopcode)
3626 {
3627 case VEX0F:
3628 m = 1;
3629 break;
3630 case VEX0F38:
3631 m = 2;
3632 break;
3633 case VEX0F3A:
3634 m = 3;
3635 break;
3636 default:
3637 abort ();
3638 break;
3639 }
3640
3641 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3642 bits from REX. */
3643 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3644
3645 /* The fifth bit of the second EVEX byte is 1's compliment of the
3646 REX_R bit in VREX. */
3647 if (!(i.vrex & REX_R))
3648 i.vex.bytes[1] |= 0x10;
3649 else
3650 vrex_used |= REX_R;
3651
3652 if ((i.reg_operands + i.imm_operands) == i.operands)
3653 {
3654 /* When all operands are registers, the REX_X bit in REX is not
3655 used. We reuse it to encode the upper 16 registers, which is
3656 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3657 as 1's compliment. */
3658 if ((i.vrex & REX_B))
3659 {
3660 vrex_used |= REX_B;
3661 i.vex.bytes[1] &= ~0x40;
3662 }
3663 }
3664
3665 /* EVEX instructions shouldn't need the REX prefix. */
3666 i.vrex &= ~vrex_used;
3667 gas_assert (i.vrex == 0);
3668
6865c043
L
3669 /* Check the REX.W bit and VEXW. */
3670 if (i.tm.opcode_modifier.vexw == VEXWIG)
3671 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
3672 else if (i.tm.opcode_modifier.vexw)
3673 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3674 else
931d03b7 3675 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e
L
3676
3677 /* Encode the U bit. */
3678 implied_prefix |= 0x4;
3679
3680 /* The third byte of the EVEX prefix. */
3681 i.vex.bytes[2] = (w << 7 | register_specifier << 3 | implied_prefix);
3682
3683 /* The fourth byte of the EVEX prefix. */
3684 /* The zeroing-masking bit. */
3685 if (i.mask && i.mask->zeroing)
3686 i.vex.bytes[3] |= 0x80;
3687
3688 /* Don't always set the broadcast bit if there is no RC. */
3689 if (!i.rounding)
3690 {
3691 /* Encode the vector length. */
3692 unsigned int vec_length;
3693
e771e7c9
JB
3694 if (!i.tm.opcode_modifier.evex
3695 || i.tm.opcode_modifier.evex == EVEXDYN)
3696 {
56522fc5 3697 unsigned int op;
e771e7c9 3698
c7213af9
L
3699 /* Determine vector length from the last multi-length vector
3700 operand. */
e771e7c9 3701 vec_length = 0;
56522fc5 3702 for (op = i.operands; op--;)
e771e7c9
JB
3703 if (i.tm.operand_types[op].bitfield.xmmword
3704 + i.tm.operand_types[op].bitfield.ymmword
3705 + i.tm.operand_types[op].bitfield.zmmword > 1)
3706 {
3707 if (i.types[op].bitfield.zmmword)
c7213af9
L
3708 {
3709 i.tm.opcode_modifier.evex = EVEX512;
3710 break;
3711 }
e771e7c9 3712 else if (i.types[op].bitfield.ymmword)
c7213af9
L
3713 {
3714 i.tm.opcode_modifier.evex = EVEX256;
3715 break;
3716 }
e771e7c9 3717 else if (i.types[op].bitfield.xmmword)
c7213af9
L
3718 {
3719 i.tm.opcode_modifier.evex = EVEX128;
3720 break;
3721 }
625cbd7a
JB
3722 else if (i.broadcast && (int) op == i.broadcast->operand)
3723 {
4a1b91ea 3724 switch (i.broadcast->bytes)
625cbd7a
JB
3725 {
3726 case 64:
3727 i.tm.opcode_modifier.evex = EVEX512;
3728 break;
3729 case 32:
3730 i.tm.opcode_modifier.evex = EVEX256;
3731 break;
3732 case 16:
3733 i.tm.opcode_modifier.evex = EVEX128;
3734 break;
3735 default:
c7213af9 3736 abort ();
625cbd7a 3737 }
c7213af9 3738 break;
625cbd7a 3739 }
e771e7c9 3740 }
c7213af9 3741
56522fc5 3742 if (op >= MAX_OPERANDS)
c7213af9 3743 abort ();
e771e7c9
JB
3744 }
3745
43234a1e
L
3746 switch (i.tm.opcode_modifier.evex)
3747 {
3748 case EVEXLIG: /* LL' is ignored */
3749 vec_length = evexlig << 5;
3750 break;
3751 case EVEX128:
3752 vec_length = 0 << 5;
3753 break;
3754 case EVEX256:
3755 vec_length = 1 << 5;
3756 break;
3757 case EVEX512:
3758 vec_length = 2 << 5;
3759 break;
3760 default:
3761 abort ();
3762 break;
3763 }
3764 i.vex.bytes[3] |= vec_length;
3765 /* Encode the broadcast bit. */
3766 if (i.broadcast)
3767 i.vex.bytes[3] |= 0x10;
3768 }
3769 else
3770 {
3771 if (i.rounding->type != saeonly)
3772 i.vex.bytes[3] |= 0x10 | (i.rounding->type << 5);
3773 else
d3d3c6db 3774 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e
L
3775 }
3776
3777 if (i.mask && i.mask->mask)
3778 i.vex.bytes[3] |= i.mask->mask->reg_num;
3779}
3780
65da13b5
L
3781static void
3782process_immext (void)
3783{
3784 expressionS *exp;
3785
4c692bc7
JB
3786 if ((i.tm.cpu_flags.bitfield.cpusse3 || i.tm.cpu_flags.bitfield.cpusvme)
3787 && i.operands > 0)
65da13b5 3788 {
4c692bc7
JB
3789 /* MONITOR/MWAIT as well as SVME instructions have fixed operands
3790 with an opcode suffix which is coded in the same place as an
3791 8-bit immediate field would be.
3792 Here we check those operands and remove them afterwards. */
65da13b5
L
3793 unsigned int x;
3794
3795 for (x = 0; x < i.operands; x++)
4c692bc7 3796 if (register_number (i.op[x].regs) != x)
65da13b5 3797 as_bad (_("can't use register '%s%s' as operand %d in '%s'."),
1fed0ba1
L
3798 register_prefix, i.op[x].regs->reg_name, x + 1,
3799 i.tm.name);
3800
3801 i.operands = 0;
65da13b5
L
3802 }
3803
9916071f
AP
3804 if (i.tm.cpu_flags.bitfield.cpumwaitx && i.operands > 0)
3805 {
3806 /* MONITORX/MWAITX instructions have fixed operands with an opcode
3807 suffix which is coded in the same place as an 8-bit immediate
3808 field would be.
3809 Here we check those operands and remove them afterwards. */
3810 unsigned int x;
3811
3812 if (i.operands != 3)
3813 abort();
3814
3815 for (x = 0; x < 2; x++)
3816 if (register_number (i.op[x].regs) != x)
3817 goto bad_register_operand;
3818
3819 /* Check for third operand for mwaitx/monitorx insn. */
3820 if (register_number (i.op[x].regs)
3821 != (x + (i.tm.extension_opcode == 0xfb)))
3822 {
3823bad_register_operand:
3824 as_bad (_("can't use register '%s%s' as operand %d in '%s'."),
3825 register_prefix, i.op[x].regs->reg_name, x+1,
3826 i.tm.name);
3827 }
3828
3829 i.operands = 0;
3830 }
3831
c0f3af97 3832 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
3833 which is coded in the same place as an 8-bit immediate field
3834 would be. Here we fake an 8-bit immediate operand from the
3835 opcode suffix stored in tm.extension_opcode.
3836
c1e679ec 3837 AVX instructions also use this encoding, for some of
c0f3af97 3838 3 argument instructions. */
65da13b5 3839
43234a1e 3840 gas_assert (i.imm_operands <= 1
7ab9ffdd 3841 && (i.operands <= 2
7a8655d2 3842 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 3843 && i.operands <= 4)));
65da13b5
L
3844
3845 exp = &im_expressions[i.imm_operands++];
3846 i.op[i.operands].imms = exp;
3847 i.types[i.operands] = imm8;
3848 i.operands++;
3849 exp->X_op = O_constant;
3850 exp->X_add_number = i.tm.extension_opcode;
3851 i.tm.extension_opcode = None;
3852}
3853
42164a71
L
3854
3855static int
3856check_hle (void)
3857{
3858 switch (i.tm.opcode_modifier.hleprefixok)
3859 {
3860 default:
3861 abort ();
82c2def5 3862 case HLEPrefixNone:
165de32a
L
3863 as_bad (_("invalid instruction `%s' after `%s'"),
3864 i.tm.name, i.hle_prefix);
42164a71 3865 return 0;
82c2def5 3866 case HLEPrefixLock:
42164a71
L
3867 if (i.prefix[LOCK_PREFIX])
3868 return 1;
165de32a 3869 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 3870 return 0;
82c2def5 3871 case HLEPrefixAny:
42164a71 3872 return 1;
82c2def5 3873 case HLEPrefixRelease:
42164a71
L
3874 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
3875 {
3876 as_bad (_("instruction `%s' after `xacquire' not allowed"),
3877 i.tm.name);
3878 return 0;
3879 }
3880 if (i.mem_operands == 0
3881 || !operand_type_check (i.types[i.operands - 1], anymem))
3882 {
3883 as_bad (_("memory destination needed for instruction `%s'"
3884 " after `xrelease'"), i.tm.name);
3885 return 0;
3886 }
3887 return 1;
3888 }
3889}
3890
b6f8c7c4
L
3891/* Try the shortest encoding by shortening operand size. */
3892
3893static void
3894optimize_encoding (void)
3895{
3896 int j;
3897
3898 if (optimize_for_space
3899 && i.reg_operands == 1
3900 && i.imm_operands == 1
3901 && !i.types[1].bitfield.byte
3902 && i.op[0].imms->X_op == O_constant
3903 && fits_in_imm7 (i.op[0].imms->X_add_number)
3904 && ((i.tm.base_opcode == 0xa8
3905 && i.tm.extension_opcode == None)
3906 || (i.tm.base_opcode == 0xf6
3907 && i.tm.extension_opcode == 0x0)))
3908 {
3909 /* Optimize: -Os:
3910 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
3911 */
3912 unsigned int base_regnum = i.op[1].regs->reg_num;
3913 if (flag_code == CODE_64BIT || base_regnum < 4)
3914 {
3915 i.types[1].bitfield.byte = 1;
3916 /* Ignore the suffix. */
3917 i.suffix = 0;
3918 if (base_regnum >= 4
3919 && !(i.op[1].regs->reg_flags & RegRex))
3920 {
3921 /* Handle SP, BP, SI and DI registers. */
3922 if (i.types[1].bitfield.word)
3923 j = 16;
3924 else if (i.types[1].bitfield.dword)
3925 j = 32;
3926 else
3927 j = 48;
3928 i.op[1].regs -= j;
3929 }
3930 }
3931 }
3932 else if (flag_code == CODE_64BIT
d3d50934
L
3933 && ((i.types[1].bitfield.qword
3934 && i.reg_operands == 1
b6f8c7c4
L
3935 && i.imm_operands == 1
3936 && i.op[0].imms->X_op == O_constant
3937 && ((i.tm.base_opcode == 0xb0
3938 && i.tm.extension_opcode == None
3939 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
3940 || (fits_in_imm31 (i.op[0].imms->X_add_number)
3941 && (((i.tm.base_opcode == 0x24
3942 || i.tm.base_opcode == 0xa8)
3943 && i.tm.extension_opcode == None)
3944 || (i.tm.base_opcode == 0x80
3945 && i.tm.extension_opcode == 0x4)
3946 || ((i.tm.base_opcode == 0xf6
3947 || i.tm.base_opcode == 0xc6)
3948 && i.tm.extension_opcode == 0x0)))))
d3d50934
L
3949 || (i.types[0].bitfield.qword
3950 && ((i.reg_operands == 2
3951 && i.op[0].regs == i.op[1].regs
3952 && ((i.tm.base_opcode == 0x30
3953 || i.tm.base_opcode == 0x28)
3954 && i.tm.extension_opcode == None))
3955 || (i.reg_operands == 1
3956 && i.operands == 1
3957 && i.tm.base_opcode == 0x30
3958 && i.tm.extension_opcode == None)))))
b6f8c7c4
L
3959 {
3960 /* Optimize: -O:
3961 andq $imm31, %r64 -> andl $imm31, %r32
3962 testq $imm31, %r64 -> testl $imm31, %r32
3963 xorq %r64, %r64 -> xorl %r32, %r32
3964 subq %r64, %r64 -> subl %r32, %r32
3965 movq $imm31, %r64 -> movl $imm31, %r32
3966 movq $imm32, %r64 -> movl $imm32, %r32
3967 */
3968 i.tm.opcode_modifier.norex64 = 1;
3969 if (i.tm.base_opcode == 0xb0 || i.tm.base_opcode == 0xc6)
3970 {
3971 /* Handle
3972 movq $imm31, %r64 -> movl $imm31, %r32
3973 movq $imm32, %r64 -> movl $imm32, %r32
3974 */
3975 i.tm.operand_types[0].bitfield.imm32 = 1;
3976 i.tm.operand_types[0].bitfield.imm32s = 0;
3977 i.tm.operand_types[0].bitfield.imm64 = 0;
3978 i.types[0].bitfield.imm32 = 1;
3979 i.types[0].bitfield.imm32s = 0;
3980 i.types[0].bitfield.imm64 = 0;
3981 i.types[1].bitfield.dword = 1;
3982 i.types[1].bitfield.qword = 0;
3983 if (i.tm.base_opcode == 0xc6)
3984 {
3985 /* Handle
3986 movq $imm31, %r64 -> movl $imm31, %r32
3987 */
3988 i.tm.base_opcode = 0xb0;
3989 i.tm.extension_opcode = None;
3990 i.tm.opcode_modifier.shortform = 1;
3991 i.tm.opcode_modifier.modrm = 0;
3992 }
3993 }
3994 }
99112332 3995 else if (i.reg_operands == 3
b6f8c7c4
L
3996 && i.op[0].regs == i.op[1].regs
3997 && !i.types[2].bitfield.xmmword
3998 && (i.tm.opcode_modifier.vex
7a69eac3 3999 || ((!i.mask || i.mask->zeroing)
b6f8c7c4 4000 && !i.rounding
e771e7c9 4001 && is_evex_encoding (&i.tm)
80c34c38 4002 && (i.vec_encoding != vex_encoding_evex
dd22218c 4003 || cpu_arch_isa_flags.bitfield.cpuavx512vl
80c34c38 4004 || i.tm.cpu_flags.bitfield.cpuavx512vl
7091c612 4005 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4006 && i.types[2].bitfield.ymmword))))
b6f8c7c4
L
4007 && ((i.tm.base_opcode == 0x55
4008 || i.tm.base_opcode == 0x6655
4009 || i.tm.base_opcode == 0x66df
4010 || i.tm.base_opcode == 0x57
4011 || i.tm.base_opcode == 0x6657
8305403a
L
4012 || i.tm.base_opcode == 0x66ef
4013 || i.tm.base_opcode == 0x66f8
4014 || i.tm.base_opcode == 0x66f9
4015 || i.tm.base_opcode == 0x66fa
1424ad86
JB
4016 || i.tm.base_opcode == 0x66fb
4017 || i.tm.base_opcode == 0x42
4018 || i.tm.base_opcode == 0x6642
4019 || i.tm.base_opcode == 0x47
4020 || i.tm.base_opcode == 0x6647)
b6f8c7c4
L
4021 && i.tm.extension_opcode == None))
4022 {
99112332 4023 /* Optimize: -O1:
8305403a
L
4024 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4025 vpsubq and vpsubw:
b6f8c7c4
L
4026 EVEX VOP %zmmM, %zmmM, %zmmN
4027 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4028 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4029 EVEX VOP %ymmM, %ymmM, %ymmN
4030 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4031 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4032 VEX VOP %ymmM, %ymmM, %ymmN
4033 -> VEX VOP %xmmM, %xmmM, %xmmN
4034 VOP, one of vpandn and vpxor:
4035 VEX VOP %ymmM, %ymmM, %ymmN
4036 -> VEX VOP %xmmM, %xmmM, %xmmN
4037 VOP, one of vpandnd and vpandnq:
4038 EVEX VOP %zmmM, %zmmM, %zmmN
4039 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4040 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4041 EVEX VOP %ymmM, %ymmM, %ymmN
4042 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4043 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4044 VOP, one of vpxord and vpxorq:
4045 EVEX VOP %zmmM, %zmmM, %zmmN
4046 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4047 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4048 EVEX VOP %ymmM, %ymmM, %ymmN
4049 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4050 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4051 VOP, one of kxord and kxorq:
4052 VEX VOP %kM, %kM, %kN
4053 -> VEX kxorw %kM, %kM, %kN
4054 VOP, one of kandnd and kandnq:
4055 VEX VOP %kM, %kM, %kN
4056 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4057 */
e771e7c9 4058 if (is_evex_encoding (&i.tm))
b6f8c7c4 4059 {
7b1d7ca1 4060 if (i.vec_encoding != vex_encoding_evex)
b6f8c7c4
L
4061 {
4062 i.tm.opcode_modifier.vex = VEX128;
4063 i.tm.opcode_modifier.vexw = VEXW0;
4064 i.tm.opcode_modifier.evex = 0;
4065 }
7b1d7ca1 4066 else if (optimize > 1)
dd22218c
L
4067 i.tm.opcode_modifier.evex = EVEX128;
4068 else
4069 return;
b6f8c7c4 4070 }
1424ad86
JB
4071 else if (i.tm.operand_types[0].bitfield.regmask)
4072 {
4073 i.tm.base_opcode &= 0xff;
4074 i.tm.opcode_modifier.vexw = VEXW0;
4075 }
b6f8c7c4
L
4076 else
4077 i.tm.opcode_modifier.vex = VEX128;
4078
4079 if (i.tm.opcode_modifier.vex)
4080 for (j = 0; j < 3; j++)
4081 {
4082 i.types[j].bitfield.xmmword = 1;
4083 i.types[j].bitfield.ymmword = 0;
4084 }
4085 }
392a5972 4086 else if (i.vec_encoding != vex_encoding_evex
97ed31ae 4087 && !i.types[0].bitfield.zmmword
392a5972 4088 && !i.types[1].bitfield.zmmword
97ed31ae
L
4089 && !i.mask
4090 && is_evex_encoding (&i.tm)
392a5972
L
4091 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x666f
4092 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf36f
4093 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f)
97ed31ae
L
4094 && i.tm.extension_opcode == None)
4095 {
4096 /* Optimize: -O1:
4097 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4098 vmovdqu32 and vmovdqu64:
4099 EVEX VOP %xmmM, %xmmN
4100 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4101 EVEX VOP %ymmM, %ymmN
4102 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4103 EVEX VOP %xmmM, mem
4104 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4105 EVEX VOP %ymmM, mem
4106 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4107 EVEX VOP mem, %xmmN
4108 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4109 EVEX VOP mem, %ymmN
4110 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
4111 */
392a5972
L
4112 for (j = 0; j < 2; j++)
4113 if (operand_type_check (i.types[j], disp)
4114 && i.op[j].disps->X_op == O_constant)
4115 {
4116 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4117 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4118 bytes, we choose EVEX Disp8 over VEX Disp32. */
4119 int evex_disp8, vex_disp8;
4120 unsigned int memshift = i.memshift;
4121 offsetT n = i.op[j].disps->X_add_number;
4122
4123 evex_disp8 = fits_in_disp8 (n);
4124 i.memshift = 0;
4125 vex_disp8 = fits_in_disp8 (n);
4126 if (evex_disp8 != vex_disp8)
4127 {
4128 i.memshift = memshift;
4129 return;
4130 }
4131
4132 i.types[j].bitfield.disp8 = vex_disp8;
4133 break;
4134 }
4135 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f)
4136 i.tm.base_opcode ^= 0xf36f ^ 0xf26f;
97ed31ae
L
4137 i.tm.opcode_modifier.vex
4138 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4139 i.tm.opcode_modifier.vexw = VEXW0;
4140 i.tm.opcode_modifier.evex = 0;
4141 i.tm.opcode_modifier.masking = 0;
4142 i.tm.opcode_modifier.disp8memshift = 0;
4143 i.memshift = 0;
4144 for (j = 0; j < 2; j++)
4145 if (operand_type_check (i.types[j], disp)
4146 && i.op[j].disps->X_op == O_constant)
4147 {
4148 i.types[j].bitfield.disp8
4149 = fits_in_disp8 (i.op[j].disps->X_add_number);
4150 break;
4151 }
4152 }
b6f8c7c4
L
4153}
4154
252b5132
RH
4155/* This is the guts of the machine-dependent assembler. LINE points to a
4156 machine dependent instruction. This function is supposed to emit
4157 the frags/bytes it assembles to. */
4158
4159void
65da13b5 4160md_assemble (char *line)
252b5132 4161{
40fb9820 4162 unsigned int j;
83b16ac6 4163 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 4164 const insn_template *t;
252b5132 4165
47926f60 4166 /* Initialize globals. */
252b5132
RH
4167 memset (&i, '\0', sizeof (i));
4168 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 4169 i.reloc[j] = NO_RELOC;
252b5132
RH
4170 memset (disp_expressions, '\0', sizeof (disp_expressions));
4171 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 4172 save_stack_p = save_stack;
252b5132
RH
4173
4174 /* First parse an instruction mnemonic & call i386_operand for the operands.
4175 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 4176 start of a (possibly prefixed) mnemonic. */
252b5132 4177
29b0f896
AM
4178 line = parse_insn (line, mnemonic);
4179 if (line == NULL)
4180 return;
83b16ac6 4181 mnem_suffix = i.suffix;
252b5132 4182
29b0f896 4183 line = parse_operands (line, mnemonic);
ee86248c 4184 this_operand = -1;
8325cc63
JB
4185 xfree (i.memop1_string);
4186 i.memop1_string = NULL;
29b0f896
AM
4187 if (line == NULL)
4188 return;
252b5132 4189
29b0f896
AM
4190 /* Now we've parsed the mnemonic into a set of templates, and have the
4191 operands at hand. */
4192
4193 /* All intel opcodes have reversed operands except for "bound" and
4194 "enter". We also don't reverse intersegment "jmp" and "call"
4195 instructions with 2 immediate operands so that the immediate segment
050dfa73 4196 precedes the offset, as it does when in AT&T mode. */
4d456e3d
L
4197 if (intel_syntax
4198 && i.operands > 1
29b0f896 4199 && (strcmp (mnemonic, "bound") != 0)
30123838 4200 && (strcmp (mnemonic, "invlpga") != 0)
40fb9820
L
4201 && !(operand_type_check (i.types[0], imm)
4202 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4203 swap_operands ();
4204
ec56d5c0
JB
4205 /* The order of the immediates should be reversed
4206 for 2 immediates extrq and insertq instructions */
4207 if (i.imm_operands == 2
4208 && (strcmp (mnemonic, "extrq") == 0
4209 || strcmp (mnemonic, "insertq") == 0))
4210 swap_2_operands (0, 1);
4211
29b0f896
AM
4212 if (i.imm_operands)
4213 optimize_imm ();
4214
b300c311
L
4215 /* Don't optimize displacement for movabs since it only takes 64bit
4216 displacement. */
4217 if (i.disp_operands
a501d77e 4218 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4219 && (flag_code != CODE_64BIT
4220 || strcmp (mnemonic, "movabs") != 0))
4221 optimize_disp ();
29b0f896
AM
4222
4223 /* Next, we find a template that matches the given insn,
4224 making sure the overlap of the given operands types is consistent
4225 with the template operand types. */
252b5132 4226
83b16ac6 4227 if (!(t = match_template (mnem_suffix)))
29b0f896 4228 return;
252b5132 4229
7bab8ab5 4230 if (sse_check != check_none
81f8a913 4231 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4232 && !i.tm.cpu_flags.bitfield.cpuavx
daf50ae7
L
4233 && (i.tm.cpu_flags.bitfield.cpusse
4234 || i.tm.cpu_flags.bitfield.cpusse2
4235 || i.tm.cpu_flags.bitfield.cpusse3
4236 || i.tm.cpu_flags.bitfield.cpussse3
4237 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e
JB
4238 || i.tm.cpu_flags.bitfield.cpusse4_2
4239 || i.tm.cpu_flags.bitfield.cpupclmul
4240 || i.tm.cpu_flags.bitfield.cpuaes
4241 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4242 {
7bab8ab5 4243 (sse_check == check_warning
daf50ae7
L
4244 ? as_warn
4245 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4246 }
4247
321fd21e
L
4248 /* Zap movzx and movsx suffix. The suffix has been set from
4249 "word ptr" or "byte ptr" on the source operand in Intel syntax
4250 or extracted from mnemonic in AT&T syntax. But we'll use
4251 the destination register to choose the suffix for encoding. */
4252 if ((i.tm.base_opcode & ~9) == 0x0fb6)
cd61ebfe 4253 {
321fd21e
L
4254 /* In Intel syntax, there must be a suffix. In AT&T syntax, if
4255 there is no suffix, the default will be byte extension. */
4256 if (i.reg_operands != 2
4257 && !i.suffix
7ab9ffdd 4258 && intel_syntax)
321fd21e
L
4259 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
4260
4261 i.suffix = 0;
cd61ebfe 4262 }
24eab124 4263
40fb9820 4264 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4265 if (!add_prefix (FWAIT_OPCODE))
4266 return;
252b5132 4267
d5de92cf
L
4268 /* Check if REP prefix is OK. */
4269 if (i.rep_prefix && !i.tm.opcode_modifier.repprefixok)
4270 {
4271 as_bad (_("invalid instruction `%s' after `%s'"),
4272 i.tm.name, i.rep_prefix);
4273 return;
4274 }
4275
c1ba0266
L
4276 /* Check for lock without a lockable instruction. Destination operand
4277 must be memory unless it is xchg (0x86). */
c32fa91d
L
4278 if (i.prefix[LOCK_PREFIX]
4279 && (!i.tm.opcode_modifier.islockable
c1ba0266
L
4280 || i.mem_operands == 0
4281 || (i.tm.base_opcode != 0x86
4282 && !operand_type_check (i.types[i.operands - 1], anymem))))
c32fa91d
L
4283 {
4284 as_bad (_("expecting lockable instruction after `lock'"));
4285 return;
4286 }
4287
7a8655d2
JB
4288 /* Check for data size prefix on VEX/XOP/EVEX encoded insns. */
4289 if (i.prefix[DATA_PREFIX] && is_any_vex_encoding (&i.tm))
4290 {
4291 as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
4292 return;
4293 }
4294
42164a71 4295 /* Check if HLE prefix is OK. */
165de32a 4296 if (i.hle_prefix && !check_hle ())
42164a71
L
4297 return;
4298
7e8b059b
L
4299 /* Check BND prefix. */
4300 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
4301 as_bad (_("expecting valid branch instruction after `bnd'"));
4302
04ef582a 4303 /* Check NOTRACK prefix. */
9fef80d6
L
4304 if (i.notrack_prefix && !i.tm.opcode_modifier.notrackprefixok)
4305 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 4306
327e8c42
JB
4307 if (i.tm.cpu_flags.bitfield.cpumpx)
4308 {
4309 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4310 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
4311 else if (flag_code != CODE_16BIT
4312 ? i.prefix[ADDR_PREFIX]
4313 : i.mem_operands && !i.prefix[ADDR_PREFIX])
4314 as_bad (_("16-bit address isn't allowed in MPX instructions"));
4315 }
7e8b059b
L
4316
4317 /* Insert BND prefix. */
76d3a78a
JB
4318 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
4319 {
4320 if (!i.prefix[BND_PREFIX])
4321 add_prefix (BND_PREFIX_OPCODE);
4322 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
4323 {
4324 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
4325 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
4326 }
4327 }
7e8b059b 4328
29b0f896 4329 /* Check string instruction segment overrides. */
40fb9820 4330 if (i.tm.opcode_modifier.isstring && i.mem_operands != 0)
29b0f896
AM
4331 {
4332 if (!check_string ())
5dd0794d 4333 return;
fc0763e6 4334 i.disp_operands = 0;
29b0f896 4335 }
5dd0794d 4336
b6f8c7c4
L
4337 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
4338 optimize_encoding ();
4339
29b0f896
AM
4340 if (!process_suffix ())
4341 return;
e413e4e9 4342
bc0844ae
L
4343 /* Update operand types. */
4344 for (j = 0; j < i.operands; j++)
4345 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
4346
29b0f896
AM
4347 /* Make still unresolved immediate matches conform to size of immediate
4348 given in i.suffix. */
4349 if (!finalize_imm ())
4350 return;
252b5132 4351
40fb9820 4352 if (i.types[0].bitfield.imm1)
29b0f896 4353 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 4354
9afe6eb8
L
4355 /* We only need to check those implicit registers for instructions
4356 with 3 operands or less. */
4357 if (i.operands <= 3)
4358 for (j = 0; j < i.operands; j++)
4359 if (i.types[j].bitfield.inoutportreg
4360 || i.types[j].bitfield.shiftcount
1b54b8d7 4361 || (i.types[j].bitfield.acc && !i.types[j].bitfield.xmmword))
9afe6eb8 4362 i.reg_operands--;
40fb9820 4363
c0f3af97
L
4364 /* ImmExt should be processed after SSE2AVX. */
4365 if (!i.tm.opcode_modifier.sse2avx
4366 && i.tm.opcode_modifier.immext)
65da13b5 4367 process_immext ();
252b5132 4368
29b0f896
AM
4369 /* For insns with operands there are more diddles to do to the opcode. */
4370 if (i.operands)
4371 {
4372 if (!process_operands ())
4373 return;
4374 }
40fb9820 4375 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
4376 {
4377 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
4378 as_warn (_("translating to `%sp'"), i.tm.name);
4379 }
252b5132 4380
7a8655d2 4381 if (is_any_vex_encoding (&i.tm))
9e5e5283
L
4382 {
4383 if (flag_code == CODE_16BIT)
4384 {
4385 as_bad (_("instruction `%s' isn't supported in 16-bit mode."),
4386 i.tm.name);
4387 return;
4388 }
c0f3af97 4389
9e5e5283
L
4390 if (i.tm.opcode_modifier.vex)
4391 build_vex_prefix (t);
4392 else
4393 build_evex_prefix ();
4394 }
43234a1e 4395
5dd85c99
SP
4396 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
4397 instructions may define INT_OPCODE as well, so avoid this corner
4398 case for those instructions that use MODRM. */
4399 if (i.tm.base_opcode == INT_OPCODE
a6461c02
SP
4400 && !i.tm.opcode_modifier.modrm
4401 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
4402 {
4403 i.tm.base_opcode = INT3_OPCODE;
4404 i.imm_operands = 0;
4405 }
252b5132 4406
40fb9820
L
4407 if ((i.tm.opcode_modifier.jump
4408 || i.tm.opcode_modifier.jumpbyte
4409 || i.tm.opcode_modifier.jumpdword)
29b0f896
AM
4410 && i.op[0].disps->X_op == O_constant)
4411 {
4412 /* Convert "jmp constant" (and "call constant") to a jump (call) to
4413 the absolute address given by the constant. Since ix86 jumps and
4414 calls are pc relative, we need to generate a reloc. */
4415 i.op[0].disps->X_add_symbol = &abs_symbol;
4416 i.op[0].disps->X_op = O_symbol;
4417 }
252b5132 4418
40fb9820 4419 if (i.tm.opcode_modifier.rex64)
161a04f6 4420 i.rex |= REX_W;
252b5132 4421
29b0f896
AM
4422 /* For 8 bit registers we need an empty rex prefix. Also if the
4423 instruction already has a prefix, we need to convert old
4424 registers to new ones. */
773f551c 4425
dc821c5f 4426 if ((i.types[0].bitfield.reg && i.types[0].bitfield.byte
29b0f896 4427 && (i.op[0].regs->reg_flags & RegRex64) != 0)
dc821c5f 4428 || (i.types[1].bitfield.reg && i.types[1].bitfield.byte
29b0f896 4429 && (i.op[1].regs->reg_flags & RegRex64) != 0)
dc821c5f
JB
4430 || (((i.types[0].bitfield.reg && i.types[0].bitfield.byte)
4431 || (i.types[1].bitfield.reg && i.types[1].bitfield.byte))
29b0f896
AM
4432 && i.rex != 0))
4433 {
4434 int x;
726c5dcd 4435
29b0f896
AM
4436 i.rex |= REX_OPCODE;
4437 for (x = 0; x < 2; x++)
4438 {
4439 /* Look for 8 bit operand that uses old registers. */
dc821c5f 4440 if (i.types[x].bitfield.reg && i.types[x].bitfield.byte
29b0f896 4441 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 4442 {
29b0f896
AM
4443 /* In case it is "hi" register, give up. */
4444 if (i.op[x].regs->reg_num > 3)
a540244d 4445 as_bad (_("can't encode register '%s%s' in an "
4eed87de 4446 "instruction requiring REX prefix."),
a540244d 4447 register_prefix, i.op[x].regs->reg_name);
773f551c 4448
29b0f896
AM
4449 /* Otherwise it is equivalent to the extended register.
4450 Since the encoding doesn't change this is merely
4451 cosmetic cleanup for debug output. */
4452
4453 i.op[x].regs = i.op[x].regs + 8;
773f551c 4454 }
29b0f896
AM
4455 }
4456 }
773f551c 4457
6b6b6807
L
4458 if (i.rex == 0 && i.rex_encoding)
4459 {
4460 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
4461 that uses legacy register. If it is "hi" register, don't add
4462 the REX_OPCODE byte. */
4463 int x;
4464 for (x = 0; x < 2; x++)
4465 if (i.types[x].bitfield.reg
4466 && i.types[x].bitfield.byte
4467 && (i.op[x].regs->reg_flags & RegRex64) == 0
4468 && i.op[x].regs->reg_num > 3)
4469 {
4470 i.rex_encoding = FALSE;
4471 break;
4472 }
4473
4474 if (i.rex_encoding)
4475 i.rex = REX_OPCODE;
4476 }
4477
7ab9ffdd 4478 if (i.rex != 0)
29b0f896
AM
4479 add_prefix (REX_OPCODE | i.rex);
4480
4481 /* We are ready to output the insn. */
4482 output_insn ();
4483}
4484
4485static char *
e3bb37b5 4486parse_insn (char *line, char *mnemonic)
29b0f896
AM
4487{
4488 char *l = line;
4489 char *token_start = l;
4490 char *mnem_p;
5c6af06e 4491 int supported;
d3ce72d0 4492 const insn_template *t;
b6169b20 4493 char *dot_p = NULL;
29b0f896 4494
29b0f896
AM
4495 while (1)
4496 {
4497 mnem_p = mnemonic;
4498 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
4499 {
b6169b20
L
4500 if (*mnem_p == '.')
4501 dot_p = mnem_p;
29b0f896
AM
4502 mnem_p++;
4503 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 4504 {
29b0f896
AM
4505 as_bad (_("no such instruction: `%s'"), token_start);
4506 return NULL;
4507 }
4508 l++;
4509 }
4510 if (!is_space_char (*l)
4511 && *l != END_OF_INSN
e44823cf
JB
4512 && (intel_syntax
4513 || (*l != PREFIX_SEPARATOR
4514 && *l != ',')))
29b0f896
AM
4515 {
4516 as_bad (_("invalid character %s in mnemonic"),
4517 output_invalid (*l));
4518 return NULL;
4519 }
4520 if (token_start == l)
4521 {
e44823cf 4522 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
4523 as_bad (_("expecting prefix; got nothing"));
4524 else
4525 as_bad (_("expecting mnemonic; got nothing"));
4526 return NULL;
4527 }
45288df1 4528
29b0f896 4529 /* Look up instruction (or prefix) via hash table. */
d3ce72d0 4530 current_templates = (const templates *) hash_find (op_hash, mnemonic);
47926f60 4531
29b0f896
AM
4532 if (*l != END_OF_INSN
4533 && (!is_space_char (*l) || l[1] != END_OF_INSN)
4534 && current_templates
40fb9820 4535 && current_templates->start->opcode_modifier.isprefix)
29b0f896 4536 {
c6fb90c8 4537 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
4538 {
4539 as_bad ((flag_code != CODE_64BIT
4540 ? _("`%s' is only supported in 64-bit mode")
4541 : _("`%s' is not supported in 64-bit mode")),
4542 current_templates->start->name);
4543 return NULL;
4544 }
29b0f896
AM
4545 /* If we are in 16-bit mode, do not allow addr16 or data16.
4546 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
4547 if ((current_templates->start->opcode_modifier.size == SIZE16
4548 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 4549 && flag_code != CODE_64BIT
673fe0f0 4550 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
4551 ^ (flag_code == CODE_16BIT)))
4552 {
4553 as_bad (_("redundant %s prefix"),
4554 current_templates->start->name);
4555 return NULL;
45288df1 4556 }
86fa6981 4557 if (current_templates->start->opcode_length == 0)
29b0f896 4558 {
86fa6981
L
4559 /* Handle pseudo prefixes. */
4560 switch (current_templates->start->base_opcode)
4561 {
4562 case 0x0:
4563 /* {disp8} */
4564 i.disp_encoding = disp_encoding_8bit;
4565 break;
4566 case 0x1:
4567 /* {disp32} */
4568 i.disp_encoding = disp_encoding_32bit;
4569 break;
4570 case 0x2:
4571 /* {load} */
4572 i.dir_encoding = dir_encoding_load;
4573 break;
4574 case 0x3:
4575 /* {store} */
4576 i.dir_encoding = dir_encoding_store;
4577 break;
4578 case 0x4:
4579 /* {vex2} */
4580 i.vec_encoding = vex_encoding_vex2;
4581 break;
4582 case 0x5:
4583 /* {vex3} */
4584 i.vec_encoding = vex_encoding_vex3;
4585 break;
4586 case 0x6:
4587 /* {evex} */
4588 i.vec_encoding = vex_encoding_evex;
4589 break;
6b6b6807
L
4590 case 0x7:
4591 /* {rex} */
4592 i.rex_encoding = TRUE;
4593 break;
b6f8c7c4
L
4594 case 0x8:
4595 /* {nooptimize} */
4596 i.no_optimize = TRUE;
4597 break;
86fa6981
L
4598 default:
4599 abort ();
4600 }
4601 }
4602 else
4603 {
4604 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 4605 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 4606 {
4e9ac44a
L
4607 case PREFIX_EXIST:
4608 return NULL;
4609 case PREFIX_DS:
d777820b 4610 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
4611 i.notrack_prefix = current_templates->start->name;
4612 break;
4613 case PREFIX_REP:
4614 if (current_templates->start->cpu_flags.bitfield.cpuhle)
4615 i.hle_prefix = current_templates->start->name;
4616 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
4617 i.bnd_prefix = current_templates->start->name;
4618 else
4619 i.rep_prefix = current_templates->start->name;
4620 break;
4621 default:
4622 break;
86fa6981 4623 }
29b0f896
AM
4624 }
4625 /* Skip past PREFIX_SEPARATOR and reset token_start. */
4626 token_start = ++l;
4627 }
4628 else
4629 break;
4630 }
45288df1 4631
30a55f88 4632 if (!current_templates)
b6169b20 4633 {
07d5e953
JB
4634 /* Deprecated functionality (new code should use pseudo-prefixes instead):
4635 Check if we should swap operand or force 32bit displacement in
f8a5c266 4636 encoding. */
30a55f88 4637 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 4638 i.dir_encoding = dir_encoding_swap;
8d63c93e 4639 else if (mnem_p - 3 == dot_p
a501d77e
L
4640 && dot_p[1] == 'd'
4641 && dot_p[2] == '8')
4642 i.disp_encoding = disp_encoding_8bit;
8d63c93e 4643 else if (mnem_p - 4 == dot_p
f8a5c266
L
4644 && dot_p[1] == 'd'
4645 && dot_p[2] == '3'
4646 && dot_p[3] == '2')
a501d77e 4647 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
4648 else
4649 goto check_suffix;
4650 mnem_p = dot_p;
4651 *dot_p = '\0';
d3ce72d0 4652 current_templates = (const templates *) hash_find (op_hash, mnemonic);
b6169b20
L
4653 }
4654
29b0f896
AM
4655 if (!current_templates)
4656 {
b6169b20 4657check_suffix:
1c529385 4658 if (mnem_p > mnemonic)
29b0f896 4659 {
1c529385
LH
4660 /* See if we can get a match by trimming off a suffix. */
4661 switch (mnem_p[-1])
29b0f896 4662 {
1c529385
LH
4663 case WORD_MNEM_SUFFIX:
4664 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
4665 i.suffix = SHORT_MNEM_SUFFIX;
4666 else
1c529385
LH
4667 /* Fall through. */
4668 case BYTE_MNEM_SUFFIX:
4669 case QWORD_MNEM_SUFFIX:
4670 i.suffix = mnem_p[-1];
29b0f896 4671 mnem_p[-1] = '\0';
d3ce72d0 4672 current_templates = (const templates *) hash_find (op_hash,
1c529385
LH
4673 mnemonic);
4674 break;
4675 case SHORT_MNEM_SUFFIX:
4676 case LONG_MNEM_SUFFIX:
4677 if (!intel_syntax)
4678 {
4679 i.suffix = mnem_p[-1];
4680 mnem_p[-1] = '\0';
4681 current_templates = (const templates *) hash_find (op_hash,
4682 mnemonic);
4683 }
4684 break;
4685
4686 /* Intel Syntax. */
4687 case 'd':
4688 if (intel_syntax)
4689 {
4690 if (intel_float_operand (mnemonic) == 1)
4691 i.suffix = SHORT_MNEM_SUFFIX;
4692 else
4693 i.suffix = LONG_MNEM_SUFFIX;
4694 mnem_p[-1] = '\0';
4695 current_templates = (const templates *) hash_find (op_hash,
4696 mnemonic);
4697 }
4698 break;
29b0f896 4699 }
29b0f896 4700 }
1c529385 4701
29b0f896
AM
4702 if (!current_templates)
4703 {
4704 as_bad (_("no such instruction: `%s'"), token_start);
4705 return NULL;
4706 }
4707 }
252b5132 4708
40fb9820
L
4709 if (current_templates->start->opcode_modifier.jump
4710 || current_templates->start->opcode_modifier.jumpbyte)
29b0f896
AM
4711 {
4712 /* Check for a branch hint. We allow ",pt" and ",pn" for
4713 predict taken and predict not taken respectively.
4714 I'm not sure that branch hints actually do anything on loop
4715 and jcxz insns (JumpByte) for current Pentium4 chips. They
4716 may work in the future and it doesn't hurt to accept them
4717 now. */
4718 if (l[0] == ',' && l[1] == 'p')
4719 {
4720 if (l[2] == 't')
4721 {
4722 if (!add_prefix (DS_PREFIX_OPCODE))
4723 return NULL;
4724 l += 3;
4725 }
4726 else if (l[2] == 'n')
4727 {
4728 if (!add_prefix (CS_PREFIX_OPCODE))
4729 return NULL;
4730 l += 3;
4731 }
4732 }
4733 }
4734 /* Any other comma loses. */
4735 if (*l == ',')
4736 {
4737 as_bad (_("invalid character %s in mnemonic"),
4738 output_invalid (*l));
4739 return NULL;
4740 }
252b5132 4741
29b0f896 4742 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
4743 supported = 0;
4744 for (t = current_templates->start; t < current_templates->end; ++t)
4745 {
c0f3af97
L
4746 supported |= cpu_flags_match (t);
4747 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
4748 {
4749 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
4750 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 4751
548d0ee6
JB
4752 return l;
4753 }
29b0f896 4754 }
3629bb00 4755
548d0ee6
JB
4756 if (!(supported & CPU_FLAGS_64BIT_MATCH))
4757 as_bad (flag_code == CODE_64BIT
4758 ? _("`%s' is not supported in 64-bit mode")
4759 : _("`%s' is only supported in 64-bit mode"),
4760 current_templates->start->name);
4761 else
4762 as_bad (_("`%s' is not supported on `%s%s'"),
4763 current_templates->start->name,
4764 cpu_arch_name ? cpu_arch_name : default_arch,
4765 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 4766
548d0ee6 4767 return NULL;
29b0f896 4768}
252b5132 4769
29b0f896 4770static char *
e3bb37b5 4771parse_operands (char *l, const char *mnemonic)
29b0f896
AM
4772{
4773 char *token_start;
3138f287 4774
29b0f896
AM
4775 /* 1 if operand is pending after ','. */
4776 unsigned int expecting_operand = 0;
252b5132 4777
29b0f896
AM
4778 /* Non-zero if operand parens not balanced. */
4779 unsigned int paren_not_balanced;
4780
4781 while (*l != END_OF_INSN)
4782 {
4783 /* Skip optional white space before operand. */
4784 if (is_space_char (*l))
4785 ++l;
d02603dc 4786 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
4787 {
4788 as_bad (_("invalid character %s before operand %d"),
4789 output_invalid (*l),
4790 i.operands + 1);
4791 return NULL;
4792 }
d02603dc 4793 token_start = l; /* After white space. */
29b0f896
AM
4794 paren_not_balanced = 0;
4795 while (paren_not_balanced || *l != ',')
4796 {
4797 if (*l == END_OF_INSN)
4798 {
4799 if (paren_not_balanced)
4800 {
4801 if (!intel_syntax)
4802 as_bad (_("unbalanced parenthesis in operand %d."),
4803 i.operands + 1);
4804 else
4805 as_bad (_("unbalanced brackets in operand %d."),
4806 i.operands + 1);
4807 return NULL;
4808 }
4809 else
4810 break; /* we are done */
4811 }
d02603dc 4812 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
4813 {
4814 as_bad (_("invalid character %s in operand %d"),
4815 output_invalid (*l),
4816 i.operands + 1);
4817 return NULL;
4818 }
4819 if (!intel_syntax)
4820 {
4821 if (*l == '(')
4822 ++paren_not_balanced;
4823 if (*l == ')')
4824 --paren_not_balanced;
4825 }
4826 else
4827 {
4828 if (*l == '[')
4829 ++paren_not_balanced;
4830 if (*l == ']')
4831 --paren_not_balanced;
4832 }
4833 l++;
4834 }
4835 if (l != token_start)
4836 { /* Yes, we've read in another operand. */
4837 unsigned int operand_ok;
4838 this_operand = i.operands++;
4839 if (i.operands > MAX_OPERANDS)
4840 {
4841 as_bad (_("spurious operands; (%d operands/instruction max)"),
4842 MAX_OPERANDS);
4843 return NULL;
4844 }
9d46ce34 4845 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
4846 /* Now parse operand adding info to 'i' as we go along. */
4847 END_STRING_AND_SAVE (l);
4848
1286ab78
L
4849 if (i.mem_operands > 1)
4850 {
4851 as_bad (_("too many memory references for `%s'"),
4852 mnemonic);
4853 return 0;
4854 }
4855
29b0f896
AM
4856 if (intel_syntax)
4857 operand_ok =
4858 i386_intel_operand (token_start,
4859 intel_float_operand (mnemonic));
4860 else
a7619375 4861 operand_ok = i386_att_operand (token_start);
29b0f896
AM
4862
4863 RESTORE_END_STRING (l);
4864 if (!operand_ok)
4865 return NULL;
4866 }
4867 else
4868 {
4869 if (expecting_operand)
4870 {
4871 expecting_operand_after_comma:
4872 as_bad (_("expecting operand after ','; got nothing"));
4873 return NULL;
4874 }
4875 if (*l == ',')
4876 {
4877 as_bad (_("expecting operand before ','; got nothing"));
4878 return NULL;
4879 }
4880 }
7f3f1ea2 4881
29b0f896
AM
4882 /* Now *l must be either ',' or END_OF_INSN. */
4883 if (*l == ',')
4884 {
4885 if (*++l == END_OF_INSN)
4886 {
4887 /* Just skip it, if it's \n complain. */
4888 goto expecting_operand_after_comma;
4889 }
4890 expecting_operand = 1;
4891 }
4892 }
4893 return l;
4894}
7f3f1ea2 4895
050dfa73 4896static void
4d456e3d 4897swap_2_operands (int xchg1, int xchg2)
050dfa73
MM
4898{
4899 union i386_op temp_op;
40fb9820 4900 i386_operand_type temp_type;
c48dadc9 4901 unsigned int temp_flags;
050dfa73 4902 enum bfd_reloc_code_real temp_reloc;
4eed87de 4903
050dfa73
MM
4904 temp_type = i.types[xchg2];
4905 i.types[xchg2] = i.types[xchg1];
4906 i.types[xchg1] = temp_type;
c48dadc9
JB
4907
4908 temp_flags = i.flags[xchg2];
4909 i.flags[xchg2] = i.flags[xchg1];
4910 i.flags[xchg1] = temp_flags;
4911
050dfa73
MM
4912 temp_op = i.op[xchg2];
4913 i.op[xchg2] = i.op[xchg1];
4914 i.op[xchg1] = temp_op;
c48dadc9 4915
050dfa73
MM
4916 temp_reloc = i.reloc[xchg2];
4917 i.reloc[xchg2] = i.reloc[xchg1];
4918 i.reloc[xchg1] = temp_reloc;
43234a1e
L
4919
4920 if (i.mask)
4921 {
4922 if (i.mask->operand == xchg1)
4923 i.mask->operand = xchg2;
4924 else if (i.mask->operand == xchg2)
4925 i.mask->operand = xchg1;
4926 }
4927 if (i.broadcast)
4928 {
4929 if (i.broadcast->operand == xchg1)
4930 i.broadcast->operand = xchg2;
4931 else if (i.broadcast->operand == xchg2)
4932 i.broadcast->operand = xchg1;
4933 }
4934 if (i.rounding)
4935 {
4936 if (i.rounding->operand == xchg1)
4937 i.rounding->operand = xchg2;
4938 else if (i.rounding->operand == xchg2)
4939 i.rounding->operand = xchg1;
4940 }
050dfa73
MM
4941}
4942
29b0f896 4943static void
e3bb37b5 4944swap_operands (void)
29b0f896 4945{
b7c61d9a 4946 switch (i.operands)
050dfa73 4947 {
c0f3af97 4948 case 5:
b7c61d9a 4949 case 4:
4d456e3d 4950 swap_2_operands (1, i.operands - 2);
1a0670f3 4951 /* Fall through. */
b7c61d9a
L
4952 case 3:
4953 case 2:
4d456e3d 4954 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
4955 break;
4956 default:
4957 abort ();
29b0f896 4958 }
29b0f896
AM
4959
4960 if (i.mem_operands == 2)
4961 {
4962 const seg_entry *temp_seg;
4963 temp_seg = i.seg[0];
4964 i.seg[0] = i.seg[1];
4965 i.seg[1] = temp_seg;
4966 }
4967}
252b5132 4968
29b0f896
AM
4969/* Try to ensure constant immediates are represented in the smallest
4970 opcode possible. */
4971static void
e3bb37b5 4972optimize_imm (void)
29b0f896
AM
4973{
4974 char guess_suffix = 0;
4975 int op;
252b5132 4976
29b0f896
AM
4977 if (i.suffix)
4978 guess_suffix = i.suffix;
4979 else if (i.reg_operands)
4980 {
4981 /* Figure out a suffix from the last register operand specified.
4982 We can't do this properly yet, ie. excluding InOutPortReg,
4983 but the following works for instructions with immediates.
4984 In any case, we can't set i.suffix yet. */
4985 for (op = i.operands; --op >= 0;)
dc821c5f 4986 if (i.types[op].bitfield.reg && i.types[op].bitfield.byte)
7ab9ffdd 4987 {
40fb9820
L
4988 guess_suffix = BYTE_MNEM_SUFFIX;
4989 break;
4990 }
dc821c5f 4991 else if (i.types[op].bitfield.reg && i.types[op].bitfield.word)
252b5132 4992 {
40fb9820
L
4993 guess_suffix = WORD_MNEM_SUFFIX;
4994 break;
4995 }
dc821c5f 4996 else if (i.types[op].bitfield.reg && i.types[op].bitfield.dword)
40fb9820
L
4997 {
4998 guess_suffix = LONG_MNEM_SUFFIX;
4999 break;
5000 }
dc821c5f 5001 else if (i.types[op].bitfield.reg && i.types[op].bitfield.qword)
40fb9820
L
5002 {
5003 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5004 break;
252b5132 5005 }
29b0f896
AM
5006 }
5007 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5008 guess_suffix = WORD_MNEM_SUFFIX;
5009
5010 for (op = i.operands; --op >= 0;)
40fb9820 5011 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5012 {
5013 switch (i.op[op].imms->X_op)
252b5132 5014 {
29b0f896
AM
5015 case O_constant:
5016 /* If a suffix is given, this operand may be shortened. */
5017 switch (guess_suffix)
252b5132 5018 {
29b0f896 5019 case LONG_MNEM_SUFFIX:
40fb9820
L
5020 i.types[op].bitfield.imm32 = 1;
5021 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5022 break;
5023 case WORD_MNEM_SUFFIX:
40fb9820
L
5024 i.types[op].bitfield.imm16 = 1;
5025 i.types[op].bitfield.imm32 = 1;
5026 i.types[op].bitfield.imm32s = 1;
5027 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5028 break;
5029 case BYTE_MNEM_SUFFIX:
40fb9820
L
5030 i.types[op].bitfield.imm8 = 1;
5031 i.types[op].bitfield.imm8s = 1;
5032 i.types[op].bitfield.imm16 = 1;
5033 i.types[op].bitfield.imm32 = 1;
5034 i.types[op].bitfield.imm32s = 1;
5035 i.types[op].bitfield.imm64 = 1;
29b0f896 5036 break;
252b5132 5037 }
252b5132 5038
29b0f896
AM
5039 /* If this operand is at most 16 bits, convert it
5040 to a signed 16 bit number before trying to see
5041 whether it will fit in an even smaller size.
5042 This allows a 16-bit operand such as $0xffe0 to
5043 be recognised as within Imm8S range. */
40fb9820 5044 if ((i.types[op].bitfield.imm16)
29b0f896 5045 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5046 {
29b0f896
AM
5047 i.op[op].imms->X_add_number =
5048 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
5049 }
a28def75
L
5050#ifdef BFD64
5051 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5052 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5053 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5054 == 0))
5055 {
5056 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5057 ^ ((offsetT) 1 << 31))
5058 - ((offsetT) 1 << 31));
5059 }
a28def75 5060#endif
40fb9820 5061 i.types[op]
c6fb90c8
L
5062 = operand_type_or (i.types[op],
5063 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5064
29b0f896
AM
5065 /* We must avoid matching of Imm32 templates when 64bit
5066 only immediate is available. */
5067 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5068 i.types[op].bitfield.imm32 = 0;
29b0f896 5069 break;
252b5132 5070
29b0f896
AM
5071 case O_absent:
5072 case O_register:
5073 abort ();
5074
5075 /* Symbols and expressions. */
5076 default:
9cd96992
JB
5077 /* Convert symbolic operand to proper sizes for matching, but don't
5078 prevent matching a set of insns that only supports sizes other
5079 than those matching the insn suffix. */
5080 {
40fb9820 5081 i386_operand_type mask, allowed;
d3ce72d0 5082 const insn_template *t;
9cd96992 5083
0dfbf9d7
L
5084 operand_type_set (&mask, 0);
5085 operand_type_set (&allowed, 0);
40fb9820 5086
4eed87de
AM
5087 for (t = current_templates->start;
5088 t < current_templates->end;
5089 ++t)
c6fb90c8
L
5090 allowed = operand_type_or (allowed,
5091 t->operand_types[op]);
9cd96992
JB
5092 switch (guess_suffix)
5093 {
5094 case QWORD_MNEM_SUFFIX:
40fb9820
L
5095 mask.bitfield.imm64 = 1;
5096 mask.bitfield.imm32s = 1;
9cd96992
JB
5097 break;
5098 case LONG_MNEM_SUFFIX:
40fb9820 5099 mask.bitfield.imm32 = 1;
9cd96992
JB
5100 break;
5101 case WORD_MNEM_SUFFIX:
40fb9820 5102 mask.bitfield.imm16 = 1;
9cd96992
JB
5103 break;
5104 case BYTE_MNEM_SUFFIX:
40fb9820 5105 mask.bitfield.imm8 = 1;
9cd96992
JB
5106 break;
5107 default:
9cd96992
JB
5108 break;
5109 }
c6fb90c8 5110 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5111 if (!operand_type_all_zero (&allowed))
c6fb90c8 5112 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5113 }
29b0f896 5114 break;
252b5132 5115 }
29b0f896
AM
5116 }
5117}
47926f60 5118
29b0f896
AM
5119/* Try to use the smallest displacement type too. */
5120static void
e3bb37b5 5121optimize_disp (void)
29b0f896
AM
5122{
5123 int op;
3e73aa7c 5124
29b0f896 5125 for (op = i.operands; --op >= 0;)
40fb9820 5126 if (operand_type_check (i.types[op], disp))
252b5132 5127 {
b300c311 5128 if (i.op[op].disps->X_op == O_constant)
252b5132 5129 {
91d6fa6a 5130 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5131
40fb9820 5132 if (i.types[op].bitfield.disp16
91d6fa6a 5133 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
5134 {
5135 /* If this operand is at most 16 bits, convert
5136 to a signed 16 bit number and don't use 64bit
5137 displacement. */
91d6fa6a 5138 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 5139 i.types[op].bitfield.disp64 = 0;
b300c311 5140 }
a28def75
L
5141#ifdef BFD64
5142 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
40fb9820 5143 if (i.types[op].bitfield.disp32
91d6fa6a 5144 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
b300c311
L
5145 {
5146 /* If this operand is at most 32 bits, convert
5147 to a signed 32 bit number and don't use 64bit
5148 displacement. */
91d6fa6a
NC
5149 op_disp &= (((offsetT) 2 << 31) - 1);
5150 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 5151 i.types[op].bitfield.disp64 = 0;
b300c311 5152 }
a28def75 5153#endif
91d6fa6a 5154 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5155 {
40fb9820
L
5156 i.types[op].bitfield.disp8 = 0;
5157 i.types[op].bitfield.disp16 = 0;
5158 i.types[op].bitfield.disp32 = 0;
5159 i.types[op].bitfield.disp32s = 0;
5160 i.types[op].bitfield.disp64 = 0;
b300c311
L
5161 i.op[op].disps = 0;
5162 i.disp_operands--;
5163 }
5164 else if (flag_code == CODE_64BIT)
5165 {
91d6fa6a 5166 if (fits_in_signed_long (op_disp))
28a9d8f5 5167 {
40fb9820
L
5168 i.types[op].bitfield.disp64 = 0;
5169 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5170 }
0e1147d9 5171 if (i.prefix[ADDR_PREFIX]
91d6fa6a 5172 && fits_in_unsigned_long (op_disp))
40fb9820 5173 i.types[op].bitfield.disp32 = 1;
b300c311 5174 }
40fb9820
L
5175 if ((i.types[op].bitfield.disp32
5176 || i.types[op].bitfield.disp32s
5177 || i.types[op].bitfield.disp16)
b5014f7a 5178 && fits_in_disp8 (op_disp))
40fb9820 5179 i.types[op].bitfield.disp8 = 1;
252b5132 5180 }
67a4f2b7
AO
5181 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5182 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5183 {
5184 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5185 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
5186 i.types[op].bitfield.disp8 = 0;
5187 i.types[op].bitfield.disp16 = 0;
5188 i.types[op].bitfield.disp32 = 0;
5189 i.types[op].bitfield.disp32s = 0;
5190 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
5191 }
5192 else
b300c311 5193 /* We only support 64bit displacement on constants. */
40fb9820 5194 i.types[op].bitfield.disp64 = 0;
252b5132 5195 }
29b0f896
AM
5196}
5197
4a1b91ea
L
5198/* Return 1 if there is a match in broadcast bytes between operand
5199 GIVEN and instruction template T. */
5200
5201static INLINE int
5202match_broadcast_size (const insn_template *t, unsigned int given)
5203{
5204 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5205 && i.types[given].bitfield.byte)
5206 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5207 && i.types[given].bitfield.word)
5208 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5209 && i.types[given].bitfield.dword)
5210 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5211 && i.types[given].bitfield.qword));
5212}
5213
6c30d220
L
5214/* Check if operands are valid for the instruction. */
5215
5216static int
5217check_VecOperands (const insn_template *t)
5218{
43234a1e 5219 unsigned int op;
e2195274
JB
5220 i386_cpu_flags cpu;
5221 static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
5222
5223 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5224 any one operand are implicity requiring AVX512VL support if the actual
5225 operand size is YMMword or XMMword. Since this function runs after
5226 template matching, there's no need to check for YMMword/XMMword in
5227 the template. */
5228 cpu = cpu_flags_and (t->cpu_flags, avx512);
5229 if (!cpu_flags_all_zero (&cpu)
5230 && !t->cpu_flags.bitfield.cpuavx512vl
5231 && !cpu_arch_flags.bitfield.cpuavx512vl)
5232 {
5233 for (op = 0; op < t->operands; ++op)
5234 {
5235 if (t->operand_types[op].bitfield.zmmword
5236 && (i.types[op].bitfield.ymmword
5237 || i.types[op].bitfield.xmmword))
5238 {
5239 i.error = unsupported;
5240 return 1;
5241 }
5242 }
5243 }
43234a1e 5244
6c30d220
L
5245 /* Without VSIB byte, we can't have a vector register for index. */
5246 if (!t->opcode_modifier.vecsib
5247 && i.index_reg
1b54b8d7
JB
5248 && (i.index_reg->reg_type.bitfield.xmmword
5249 || i.index_reg->reg_type.bitfield.ymmword
5250 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
5251 {
5252 i.error = unsupported_vector_index_register;
5253 return 1;
5254 }
5255
ad8ecc81
MZ
5256 /* Check if default mask is allowed. */
5257 if (t->opcode_modifier.nodefmask
5258 && (!i.mask || i.mask->mask->reg_num == 0))
5259 {
5260 i.error = no_default_mask;
5261 return 1;
5262 }
5263
7bab8ab5
JB
5264 /* For VSIB byte, we need a vector register for index, and all vector
5265 registers must be distinct. */
5266 if (t->opcode_modifier.vecsib)
5267 {
5268 if (!i.index_reg
6c30d220 5269 || !((t->opcode_modifier.vecsib == VecSIB128
1b54b8d7 5270 && i.index_reg->reg_type.bitfield.xmmword)
6c30d220 5271 || (t->opcode_modifier.vecsib == VecSIB256
1b54b8d7 5272 && i.index_reg->reg_type.bitfield.ymmword)
43234a1e 5273 || (t->opcode_modifier.vecsib == VecSIB512
1b54b8d7 5274 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
5275 {
5276 i.error = invalid_vsib_address;
5277 return 1;
5278 }
5279
43234a1e
L
5280 gas_assert (i.reg_operands == 2 || i.mask);
5281 if (i.reg_operands == 2 && !i.mask)
5282 {
1b54b8d7
JB
5283 gas_assert (i.types[0].bitfield.regsimd);
5284 gas_assert (i.types[0].bitfield.xmmword
5285 || i.types[0].bitfield.ymmword);
5286 gas_assert (i.types[2].bitfield.regsimd);
5287 gas_assert (i.types[2].bitfield.xmmword
5288 || i.types[2].bitfield.ymmword);
43234a1e
L
5289 if (operand_check == check_none)
5290 return 0;
5291 if (register_number (i.op[0].regs)
5292 != register_number (i.index_reg)
5293 && register_number (i.op[2].regs)
5294 != register_number (i.index_reg)
5295 && register_number (i.op[0].regs)
5296 != register_number (i.op[2].regs))
5297 return 0;
5298 if (operand_check == check_error)
5299 {
5300 i.error = invalid_vector_register_set;
5301 return 1;
5302 }
5303 as_warn (_("mask, index, and destination registers should be distinct"));
5304 }
8444f82a
MZ
5305 else if (i.reg_operands == 1 && i.mask)
5306 {
1b54b8d7
JB
5307 if (i.types[1].bitfield.regsimd
5308 && (i.types[1].bitfield.xmmword
5309 || i.types[1].bitfield.ymmword
5310 || i.types[1].bitfield.zmmword)
8444f82a
MZ
5311 && (register_number (i.op[1].regs)
5312 == register_number (i.index_reg)))
5313 {
5314 if (operand_check == check_error)
5315 {
5316 i.error = invalid_vector_register_set;
5317 return 1;
5318 }
5319 if (operand_check != check_none)
5320 as_warn (_("index and destination registers should be distinct"));
5321 }
5322 }
43234a1e 5323 }
7bab8ab5 5324
43234a1e
L
5325 /* Check if broadcast is supported by the instruction and is applied
5326 to the memory operand. */
5327 if (i.broadcast)
5328 {
8e6e0792 5329 i386_operand_type type, overlap;
43234a1e
L
5330
5331 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 5332 and its broadcast bytes match the memory operand. */
32546502 5333 op = i.broadcast->operand;
8e6e0792 5334 if (!t->opcode_modifier.broadcast
c48dadc9 5335 || !(i.flags[op] & Operand_Mem)
c39e5b26 5336 || (!i.types[op].bitfield.unspecified
4a1b91ea 5337 && !match_broadcast_size (t, op)))
43234a1e
L
5338 {
5339 bad_broadcast:
5340 i.error = unsupported_broadcast;
5341 return 1;
5342 }
8e6e0792 5343
4a1b91ea
L
5344 i.broadcast->bytes = ((1 << (t->opcode_modifier.broadcast - 1))
5345 * i.broadcast->type);
8e6e0792 5346 operand_type_set (&type, 0);
4a1b91ea 5347 switch (i.broadcast->bytes)
8e6e0792 5348 {
4a1b91ea
L
5349 case 2:
5350 type.bitfield.word = 1;
5351 break;
5352 case 4:
5353 type.bitfield.dword = 1;
5354 break;
8e6e0792
JB
5355 case 8:
5356 type.bitfield.qword = 1;
5357 break;
5358 case 16:
5359 type.bitfield.xmmword = 1;
5360 break;
5361 case 32:
5362 type.bitfield.ymmword = 1;
5363 break;
5364 case 64:
5365 type.bitfield.zmmword = 1;
5366 break;
5367 default:
5368 goto bad_broadcast;
5369 }
5370
5371 overlap = operand_type_and (type, t->operand_types[op]);
5372 if (operand_type_all_zero (&overlap))
5373 goto bad_broadcast;
5374
5375 if (t->opcode_modifier.checkregsize)
5376 {
5377 unsigned int j;
5378
e2195274 5379 type.bitfield.baseindex = 1;
8e6e0792
JB
5380 for (j = 0; j < i.operands; ++j)
5381 {
5382 if (j != op
5383 && !operand_type_register_match(i.types[j],
5384 t->operand_types[j],
5385 type,
5386 t->operand_types[op]))
5387 goto bad_broadcast;
5388 }
5389 }
43234a1e
L
5390 }
5391 /* If broadcast is supported in this instruction, we need to check if
5392 operand of one-element size isn't specified without broadcast. */
5393 else if (t->opcode_modifier.broadcast && i.mem_operands)
5394 {
5395 /* Find memory operand. */
5396 for (op = 0; op < i.operands; op++)
5397 if (operand_type_check (i.types[op], anymem))
5398 break;
5399 gas_assert (op < i.operands);
5400 /* Check size of the memory operand. */
4a1b91ea 5401 if (match_broadcast_size (t, op))
43234a1e
L
5402 {
5403 i.error = broadcast_needed;
5404 return 1;
5405 }
5406 }
c39e5b26
JB
5407 else
5408 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
5409
5410 /* Check if requested masking is supported. */
ae2387fe 5411 if (i.mask)
43234a1e 5412 {
ae2387fe
JB
5413 switch (t->opcode_modifier.masking)
5414 {
5415 case BOTH_MASKING:
5416 break;
5417 case MERGING_MASKING:
5418 if (i.mask->zeroing)
5419 {
5420 case 0:
5421 i.error = unsupported_masking;
5422 return 1;
5423 }
5424 break;
5425 case DYNAMIC_MASKING:
5426 /* Memory destinations allow only merging masking. */
5427 if (i.mask->zeroing && i.mem_operands)
5428 {
5429 /* Find memory operand. */
5430 for (op = 0; op < i.operands; op++)
c48dadc9 5431 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
5432 break;
5433 gas_assert (op < i.operands);
5434 if (op == i.operands - 1)
5435 {
5436 i.error = unsupported_masking;
5437 return 1;
5438 }
5439 }
5440 break;
5441 default:
5442 abort ();
5443 }
43234a1e
L
5444 }
5445
5446 /* Check if masking is applied to dest operand. */
5447 if (i.mask && (i.mask->operand != (int) (i.operands - 1)))
5448 {
5449 i.error = mask_not_on_destination;
5450 return 1;
5451 }
5452
43234a1e
L
5453 /* Check RC/SAE. */
5454 if (i.rounding)
5455 {
5456 if ((i.rounding->type != saeonly
5457 && !t->opcode_modifier.staticrounding)
5458 || (i.rounding->type == saeonly
5459 && (t->opcode_modifier.staticrounding
5460 || !t->opcode_modifier.sae)))
5461 {
5462 i.error = unsupported_rc_sae;
5463 return 1;
5464 }
5465 /* If the instruction has several immediate operands and one of
5466 them is rounding, the rounding operand should be the last
5467 immediate operand. */
5468 if (i.imm_operands > 1
5469 && i.rounding->operand != (int) (i.imm_operands - 1))
7bab8ab5 5470 {
43234a1e 5471 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
5472 return 1;
5473 }
6c30d220
L
5474 }
5475
43234a1e 5476 /* Check vector Disp8 operand. */
b5014f7a
JB
5477 if (t->opcode_modifier.disp8memshift
5478 && i.disp_encoding != disp_encoding_32bit)
43234a1e
L
5479 {
5480 if (i.broadcast)
4a1b91ea 5481 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 5482 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 5483 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
5484 else
5485 {
5486 const i386_operand_type *type = NULL;
5487
5488 i.memshift = 0;
5489 for (op = 0; op < i.operands; op++)
5490 if (operand_type_check (i.types[op], anymem))
5491 {
4174bfff
JB
5492 if (t->opcode_modifier.evex == EVEXLIG)
5493 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
5494 else if (t->operand_types[op].bitfield.xmmword
5495 + t->operand_types[op].bitfield.ymmword
5496 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
5497 type = &t->operand_types[op];
5498 else if (!i.types[op].bitfield.unspecified)
5499 type = &i.types[op];
5500 }
4174bfff
JB
5501 else if (i.types[op].bitfield.regsimd
5502 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
5503 {
5504 if (i.types[op].bitfield.zmmword)
5505 i.memshift = 6;
5506 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
5507 i.memshift = 5;
5508 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
5509 i.memshift = 4;
5510 }
5511
5512 if (type)
5513 {
5514 if (type->bitfield.zmmword)
5515 i.memshift = 6;
5516 else if (type->bitfield.ymmword)
5517 i.memshift = 5;
5518 else if (type->bitfield.xmmword)
5519 i.memshift = 4;
5520 }
5521
5522 /* For the check in fits_in_disp8(). */
5523 if (i.memshift == 0)
5524 i.memshift = -1;
5525 }
43234a1e
L
5526
5527 for (op = 0; op < i.operands; op++)
5528 if (operand_type_check (i.types[op], disp)
5529 && i.op[op].disps->X_op == O_constant)
5530 {
b5014f7a 5531 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 5532 {
b5014f7a
JB
5533 i.types[op].bitfield.disp8 = 1;
5534 return 0;
43234a1e 5535 }
b5014f7a 5536 i.types[op].bitfield.disp8 = 0;
43234a1e
L
5537 }
5538 }
b5014f7a
JB
5539
5540 i.memshift = 0;
43234a1e 5541
6c30d220
L
5542 return 0;
5543}
5544
43f3e2ee 5545/* Check if operands are valid for the instruction. Update VEX
a683cc34
SP
5546 operand types. */
5547
5548static int
5549VEX_check_operands (const insn_template *t)
5550{
86fa6981 5551 if (i.vec_encoding == vex_encoding_evex)
43234a1e 5552 {
86fa6981 5553 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 5554 if (!is_evex_encoding (t))
86fa6981
L
5555 {
5556 i.error = unsupported;
5557 return 1;
5558 }
5559 return 0;
43234a1e
L
5560 }
5561
a683cc34 5562 if (!t->opcode_modifier.vex)
86fa6981
L
5563 {
5564 /* This instruction template doesn't have VEX prefix. */
5565 if (i.vec_encoding != vex_encoding_default)
5566 {
5567 i.error = unsupported;
5568 return 1;
5569 }
5570 return 0;
5571 }
a683cc34
SP
5572
5573 /* Only check VEX_Imm4, which must be the first operand. */
5574 if (t->operand_types[0].bitfield.vec_imm4)
5575 {
5576 if (i.op[0].imms->X_op != O_constant
5577 || !fits_in_imm4 (i.op[0].imms->X_add_number))
891edac4 5578 {
a65babc9 5579 i.error = bad_imm4;
891edac4
L
5580 return 1;
5581 }
a683cc34
SP
5582
5583 /* Turn off Imm8 so that update_imm won't complain. */
5584 i.types[0] = vec_imm4;
5585 }
5586
5587 return 0;
5588}
5589
d3ce72d0 5590static const insn_template *
83b16ac6 5591match_template (char mnem_suffix)
29b0f896
AM
5592{
5593 /* Points to template once we've found it. */
d3ce72d0 5594 const insn_template *t;
40fb9820 5595 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 5596 i386_operand_type overlap4;
29b0f896 5597 unsigned int found_reverse_match;
83b16ac6 5598 i386_opcode_modifier suffix_check, mnemsuf_check;
40fb9820 5599 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 5600 int addr_prefix_disp;
a5c311ca 5601 unsigned int j;
3ac21baa 5602 unsigned int found_cpu_match, size_match;
45664ddb 5603 unsigned int check_register;
5614d22c 5604 enum i386_error specific_error = 0;
29b0f896 5605
c0f3af97
L
5606#if MAX_OPERANDS != 5
5607# error "MAX_OPERANDS must be 5."
f48ff2ae
L
5608#endif
5609
29b0f896 5610 found_reverse_match = 0;
539e75ad 5611 addr_prefix_disp = -1;
40fb9820
L
5612
5613 memset (&suffix_check, 0, sizeof (suffix_check));
e2195274
JB
5614 if (intel_syntax && i.broadcast)
5615 /* nothing */;
5616 else if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
5617 suffix_check.no_bsuf = 1;
5618 else if (i.suffix == WORD_MNEM_SUFFIX)
5619 suffix_check.no_wsuf = 1;
5620 else if (i.suffix == SHORT_MNEM_SUFFIX)
5621 suffix_check.no_ssuf = 1;
5622 else if (i.suffix == LONG_MNEM_SUFFIX)
5623 suffix_check.no_lsuf = 1;
5624 else if (i.suffix == QWORD_MNEM_SUFFIX)
5625 suffix_check.no_qsuf = 1;
5626 else if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
7ce189b3 5627 suffix_check.no_ldsuf = 1;
29b0f896 5628
83b16ac6
JB
5629 memset (&mnemsuf_check, 0, sizeof (mnemsuf_check));
5630 if (intel_syntax)
5631 {
5632 switch (mnem_suffix)
5633 {
5634 case BYTE_MNEM_SUFFIX: mnemsuf_check.no_bsuf = 1; break;
5635 case WORD_MNEM_SUFFIX: mnemsuf_check.no_wsuf = 1; break;
5636 case SHORT_MNEM_SUFFIX: mnemsuf_check.no_ssuf = 1; break;
5637 case LONG_MNEM_SUFFIX: mnemsuf_check.no_lsuf = 1; break;
5638 case QWORD_MNEM_SUFFIX: mnemsuf_check.no_qsuf = 1; break;
5639 }
5640 }
5641
01559ecc
L
5642 /* Must have right number of operands. */
5643 i.error = number_of_operands_mismatch;
5644
45aa61fe 5645 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 5646 {
539e75ad 5647 addr_prefix_disp = -1;
dbbc8b7e 5648 found_reverse_match = 0;
539e75ad 5649
29b0f896
AM
5650 if (i.operands != t->operands)
5651 continue;
5652
50aecf8c 5653 /* Check processor support. */
a65babc9 5654 i.error = unsupported;
c0f3af97
L
5655 found_cpu_match = (cpu_flags_match (t)
5656 == CPU_FLAGS_PERFECT_MATCH);
50aecf8c
L
5657 if (!found_cpu_match)
5658 continue;
5659
e1d4d893 5660 /* Check AT&T mnemonic. */
a65babc9 5661 i.error = unsupported_with_intel_mnemonic;
e1d4d893 5662 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
5663 continue;
5664
e92bae62 5665 /* Check AT&T/Intel syntax and Intel64/AMD64 ISA. */
a65babc9 5666 i.error = unsupported_syntax;
5c07affc 5667 if ((intel_syntax && t->opcode_modifier.attsyntax)
e92bae62
L
5668 || (!intel_syntax && t->opcode_modifier.intelsyntax)
5669 || (intel64 && t->opcode_modifier.amd64)
5670 || (!intel64 && t->opcode_modifier.intel64))
1efbbeb4
L
5671 continue;
5672
20592a94 5673 /* Check the suffix, except for some instructions in intel mode. */
a65babc9 5674 i.error = invalid_instruction_suffix;
567e4e96
L
5675 if ((!intel_syntax || !t->opcode_modifier.ignoresize)
5676 && ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
5677 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
5678 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
5679 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
5680 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
5681 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf)))
29b0f896 5682 continue;
83b16ac6
JB
5683 /* In Intel mode all mnemonic suffixes must be explicitly allowed. */
5684 if ((t->opcode_modifier.no_bsuf && mnemsuf_check.no_bsuf)
5685 || (t->opcode_modifier.no_wsuf && mnemsuf_check.no_wsuf)
5686 || (t->opcode_modifier.no_lsuf && mnemsuf_check.no_lsuf)
5687 || (t->opcode_modifier.no_ssuf && mnemsuf_check.no_ssuf)
5688 || (t->opcode_modifier.no_qsuf && mnemsuf_check.no_qsuf)
5689 || (t->opcode_modifier.no_ldsuf && mnemsuf_check.no_ldsuf))
5690 continue;
29b0f896 5691
3ac21baa
JB
5692 size_match = operand_size_match (t);
5693 if (!size_match)
7d5e4556 5694 continue;
539e75ad 5695
5c07affc
L
5696 for (j = 0; j < MAX_OPERANDS; j++)
5697 operand_types[j] = t->operand_types[j];
5698
45aa61fe
AM
5699 /* In general, don't allow 64-bit operands in 32-bit mode. */
5700 if (i.suffix == QWORD_MNEM_SUFFIX
5701 && flag_code != CODE_64BIT
5702 && (intel_syntax
40fb9820 5703 ? (!t->opcode_modifier.ignoresize
625cbd7a 5704 && !t->opcode_modifier.broadcast
45aa61fe
AM
5705 && !intel_float_operand (t->name))
5706 : intel_float_operand (t->name) != 2)
40fb9820 5707 && ((!operand_types[0].bitfield.regmmx
1b54b8d7 5708 && !operand_types[0].bitfield.regsimd)
40fb9820 5709 || (!operand_types[t->operands > 1].bitfield.regmmx
1b54b8d7 5710 && !operand_types[t->operands > 1].bitfield.regsimd))
45aa61fe
AM
5711 && (t->base_opcode != 0x0fc7
5712 || t->extension_opcode != 1 /* cmpxchg8b */))
5713 continue;
5714
192dc9c6
JB
5715 /* In general, don't allow 32-bit operands on pre-386. */
5716 else if (i.suffix == LONG_MNEM_SUFFIX
5717 && !cpu_arch_flags.bitfield.cpui386
5718 && (intel_syntax
5719 ? (!t->opcode_modifier.ignoresize
5720 && !intel_float_operand (t->name))
5721 : intel_float_operand (t->name) != 2)
5722 && ((!operand_types[0].bitfield.regmmx
1b54b8d7 5723 && !operand_types[0].bitfield.regsimd)
192dc9c6 5724 || (!operand_types[t->operands > 1].bitfield.regmmx
1b54b8d7 5725 && !operand_types[t->operands > 1].bitfield.regsimd)))
192dc9c6
JB
5726 continue;
5727
29b0f896 5728 /* Do not verify operands when there are none. */
50aecf8c 5729 else
29b0f896 5730 {
c6fb90c8 5731 if (!t->operands)
2dbab7d5
L
5732 /* We've found a match; break out of loop. */
5733 break;
29b0f896 5734 }
252b5132 5735
539e75ad
L
5736 /* Address size prefix will turn Disp64/Disp32/Disp16 operand
5737 into Disp32/Disp16/Disp32 operand. */
5738 if (i.prefix[ADDR_PREFIX] != 0)
5739 {
40fb9820 5740 /* There should be only one Disp operand. */
539e75ad
L
5741 switch (flag_code)
5742 {
5743 case CODE_16BIT:
40fb9820
L
5744 for (j = 0; j < MAX_OPERANDS; j++)
5745 {
5746 if (operand_types[j].bitfield.disp16)
5747 {
5748 addr_prefix_disp = j;
5749 operand_types[j].bitfield.disp32 = 1;
5750 operand_types[j].bitfield.disp16 = 0;
5751 break;
5752 }
5753 }
539e75ad
L
5754 break;
5755 case CODE_32BIT:
40fb9820
L
5756 for (j = 0; j < MAX_OPERANDS; j++)
5757 {
5758 if (operand_types[j].bitfield.disp32)
5759 {
5760 addr_prefix_disp = j;
5761 operand_types[j].bitfield.disp32 = 0;
5762 operand_types[j].bitfield.disp16 = 1;
5763 break;
5764 }
5765 }
539e75ad
L
5766 break;
5767 case CODE_64BIT:
40fb9820
L
5768 for (j = 0; j < MAX_OPERANDS; j++)
5769 {
5770 if (operand_types[j].bitfield.disp64)
5771 {
5772 addr_prefix_disp = j;
5773 operand_types[j].bitfield.disp64 = 0;
5774 operand_types[j].bitfield.disp32 = 1;
5775 break;
5776 }
5777 }
539e75ad
L
5778 break;
5779 }
539e75ad
L
5780 }
5781
02a86693
L
5782 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
5783 if (i.reloc[0] == BFD_RELOC_386_GOT32 && t->base_opcode == 0xa0)
5784 continue;
5785
56ffb741 5786 /* We check register size if needed. */
e2195274
JB
5787 if (t->opcode_modifier.checkregsize)
5788 {
5789 check_register = (1 << t->operands) - 1;
5790 if (i.broadcast)
5791 check_register &= ~(1 << i.broadcast->operand);
5792 }
5793 else
5794 check_register = 0;
5795
c6fb90c8 5796 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
5797 switch (t->operands)
5798 {
5799 case 1:
40fb9820 5800 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
5801 continue;
5802 break;
5803 case 2:
33eaf5de 5804 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
5805 only in 32bit mode and we can use opcode 0x90. In 64bit
5806 mode, we can't use 0x90 for xchg %eax, %eax since it should
5807 zero-extend %eax to %rax. */
5808 if (flag_code == CODE_64BIT
5809 && t->base_opcode == 0x90
0dfbf9d7
L
5810 && operand_type_equal (&i.types [0], &acc32)
5811 && operand_type_equal (&i.types [1], &acc32))
8b38ad71 5812 continue;
1212781b
JB
5813 /* xrelease mov %eax, <disp> is another special case. It must not
5814 match the accumulator-only encoding of mov. */
5815 if (flag_code != CODE_64BIT
5816 && i.hle_prefix
5817 && t->base_opcode == 0xa0
5818 && i.types[0].bitfield.acc
5819 && operand_type_check (i.types[1], anymem))
5820 continue;
f5eb1d70
JB
5821 /* Fall through. */
5822
5823 case 3:
3ac21baa
JB
5824 if (!(size_match & MATCH_STRAIGHT))
5825 goto check_reverse;
64c49ab3
JB
5826 /* Reverse direction of operands if swapping is possible in the first
5827 place (operands need to be symmetric) and
5828 - the load form is requested, and the template is a store form,
5829 - the store form is requested, and the template is a load form,
5830 - the non-default (swapped) form is requested. */
5831 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 5832 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
5833 && !operand_type_all_zero (&overlap1))
5834 switch (i.dir_encoding)
5835 {
5836 case dir_encoding_load:
5837 if (operand_type_check (operand_types[i.operands - 1], anymem)
5838 || operand_types[i.operands - 1].bitfield.regmem)
5839 goto check_reverse;
5840 break;
5841
5842 case dir_encoding_store:
5843 if (!operand_type_check (operand_types[i.operands - 1], anymem)
5844 && !operand_types[i.operands - 1].bitfield.regmem)
5845 goto check_reverse;
5846 break;
5847
5848 case dir_encoding_swap:
5849 goto check_reverse;
5850
5851 case dir_encoding_default:
5852 break;
5853 }
86fa6981 5854 /* If we want store form, we skip the current load. */
64c49ab3
JB
5855 if ((i.dir_encoding == dir_encoding_store
5856 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
5857 && i.mem_operands == 0
5858 && t->opcode_modifier.load)
fa99fab2 5859 continue;
1a0670f3 5860 /* Fall through. */
f48ff2ae 5861 case 4:
c0f3af97 5862 case 5:
c6fb90c8 5863 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
5864 if (!operand_type_match (overlap0, i.types[0])
5865 || !operand_type_match (overlap1, i.types[1])
e2195274 5866 || ((check_register & 3) == 3
dc821c5f 5867 && !operand_type_register_match (i.types[0],
40fb9820 5868 operand_types[0],
dc821c5f 5869 i.types[1],
40fb9820 5870 operand_types[1])))
29b0f896
AM
5871 {
5872 /* Check if other direction is valid ... */
38e314eb 5873 if (!t->opcode_modifier.d)
29b0f896
AM
5874 continue;
5875
b6169b20 5876check_reverse:
3ac21baa
JB
5877 if (!(size_match & MATCH_REVERSE))
5878 continue;
29b0f896 5879 /* Try reversing direction of operands. */
f5eb1d70
JB
5880 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
5881 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 5882 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 5883 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 5884 || (check_register
dc821c5f 5885 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
5886 operand_types[i.operands - 1],
5887 i.types[i.operands - 1],
45664ddb 5888 operand_types[0])))
29b0f896
AM
5889 {
5890 /* Does not match either direction. */
5891 continue;
5892 }
38e314eb 5893 /* found_reverse_match holds which of D or FloatR
29b0f896 5894 we've found. */
38e314eb
JB
5895 if (!t->opcode_modifier.d)
5896 found_reverse_match = 0;
5897 else if (operand_types[0].bitfield.tbyte)
8a2ed489 5898 found_reverse_match = Opcode_FloatD;
dbbc8b7e 5899 else if (operand_types[0].bitfield.xmmword
f5eb1d70 5900 || operand_types[i.operands - 1].bitfield.xmmword
dbbc8b7e 5901 || operand_types[0].bitfield.regmmx
f5eb1d70 5902 || operand_types[i.operands - 1].bitfield.regmmx
dbbc8b7e
JB
5903 || is_any_vex_encoding(t))
5904 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
5905 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 5906 else
38e314eb 5907 found_reverse_match = Opcode_D;
40fb9820 5908 if (t->opcode_modifier.floatr)
8a2ed489 5909 found_reverse_match |= Opcode_FloatR;
29b0f896 5910 }
f48ff2ae 5911 else
29b0f896 5912 {
f48ff2ae 5913 /* Found a forward 2 operand match here. */
d1cbb4db
L
5914 switch (t->operands)
5915 {
c0f3af97
L
5916 case 5:
5917 overlap4 = operand_type_and (i.types[4],
5918 operand_types[4]);
1a0670f3 5919 /* Fall through. */
d1cbb4db 5920 case 4:
c6fb90c8
L
5921 overlap3 = operand_type_and (i.types[3],
5922 operand_types[3]);
1a0670f3 5923 /* Fall through. */
d1cbb4db 5924 case 3:
c6fb90c8
L
5925 overlap2 = operand_type_and (i.types[2],
5926 operand_types[2]);
d1cbb4db
L
5927 break;
5928 }
29b0f896 5929
f48ff2ae
L
5930 switch (t->operands)
5931 {
c0f3af97
L
5932 case 5:
5933 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 5934 || !operand_type_register_match (i.types[3],
c0f3af97 5935 operand_types[3],
c0f3af97
L
5936 i.types[4],
5937 operand_types[4]))
5938 continue;
1a0670f3 5939 /* Fall through. */
f48ff2ae 5940 case 4:
40fb9820 5941 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
5942 || ((check_register & 0xa) == 0xa
5943 && !operand_type_register_match (i.types[1],
f7768225
JB
5944 operand_types[1],
5945 i.types[3],
e2195274
JB
5946 operand_types[3]))
5947 || ((check_register & 0xc) == 0xc
5948 && !operand_type_register_match (i.types[2],
5949 operand_types[2],
5950 i.types[3],
5951 operand_types[3])))
f48ff2ae 5952 continue;
1a0670f3 5953 /* Fall through. */
f48ff2ae
L
5954 case 3:
5955 /* Here we make use of the fact that there are no
23e42951 5956 reverse match 3 operand instructions. */
40fb9820 5957 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
5958 || ((check_register & 5) == 5
5959 && !operand_type_register_match (i.types[0],
23e42951
JB
5960 operand_types[0],
5961 i.types[2],
e2195274
JB
5962 operand_types[2]))
5963 || ((check_register & 6) == 6
5964 && !operand_type_register_match (i.types[1],
5965 operand_types[1],
5966 i.types[2],
5967 operand_types[2])))
f48ff2ae
L
5968 continue;
5969 break;
5970 }
29b0f896 5971 }
f48ff2ae 5972 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
5973 slip through to break. */
5974 }
3629bb00 5975 if (!found_cpu_match)
dbbc8b7e 5976 continue;
c0f3af97 5977
5614d22c
JB
5978 /* Check if vector and VEX operands are valid. */
5979 if (check_VecOperands (t) || VEX_check_operands (t))
5980 {
5981 specific_error = i.error;
5982 continue;
5983 }
a683cc34 5984
29b0f896
AM
5985 /* We've found a match; break out of loop. */
5986 break;
5987 }
5988
5989 if (t == current_templates->end)
5990 {
5991 /* We found no match. */
a65babc9 5992 const char *err_msg;
5614d22c 5993 switch (specific_error ? specific_error : i.error)
a65babc9
L
5994 {
5995 default:
5996 abort ();
86e026a4 5997 case operand_size_mismatch:
a65babc9
L
5998 err_msg = _("operand size mismatch");
5999 break;
6000 case operand_type_mismatch:
6001 err_msg = _("operand type mismatch");
6002 break;
6003 case register_type_mismatch:
6004 err_msg = _("register type mismatch");
6005 break;
6006 case number_of_operands_mismatch:
6007 err_msg = _("number of operands mismatch");
6008 break;
6009 case invalid_instruction_suffix:
6010 err_msg = _("invalid instruction suffix");
6011 break;
6012 case bad_imm4:
4a2608e3 6013 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6014 break;
a65babc9
L
6015 case unsupported_with_intel_mnemonic:
6016 err_msg = _("unsupported with Intel mnemonic");
6017 break;
6018 case unsupported_syntax:
6019 err_msg = _("unsupported syntax");
6020 break;
6021 case unsupported:
35262a23 6022 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6023 current_templates->start->name);
6024 return NULL;
6c30d220
L
6025 case invalid_vsib_address:
6026 err_msg = _("invalid VSIB address");
6027 break;
7bab8ab5
JB
6028 case invalid_vector_register_set:
6029 err_msg = _("mask, index, and destination registers must be distinct");
6030 break;
6c30d220
L
6031 case unsupported_vector_index_register:
6032 err_msg = _("unsupported vector index register");
6033 break;
43234a1e
L
6034 case unsupported_broadcast:
6035 err_msg = _("unsupported broadcast");
6036 break;
43234a1e
L
6037 case broadcast_needed:
6038 err_msg = _("broadcast is needed for operand of such type");
6039 break;
6040 case unsupported_masking:
6041 err_msg = _("unsupported masking");
6042 break;
6043 case mask_not_on_destination:
6044 err_msg = _("mask not on destination operand");
6045 break;
6046 case no_default_mask:
6047 err_msg = _("default mask isn't allowed");
6048 break;
6049 case unsupported_rc_sae:
6050 err_msg = _("unsupported static rounding/sae");
6051 break;
6052 case rc_sae_operand_not_last_imm:
6053 if (intel_syntax)
6054 err_msg = _("RC/SAE operand must precede immediate operands");
6055 else
6056 err_msg = _("RC/SAE operand must follow immediate operands");
6057 break;
6058 case invalid_register_operand:
6059 err_msg = _("invalid register operand");
6060 break;
a65babc9
L
6061 }
6062 as_bad (_("%s for `%s'"), err_msg,
891edac4 6063 current_templates->start->name);
fa99fab2 6064 return NULL;
29b0f896 6065 }
252b5132 6066
29b0f896
AM
6067 if (!quiet_warnings)
6068 {
6069 if (!intel_syntax
40fb9820
L
6070 && (i.types[0].bitfield.jumpabsolute
6071 != operand_types[0].bitfield.jumpabsolute))
29b0f896
AM
6072 {
6073 as_warn (_("indirect %s without `*'"), t->name);
6074 }
6075
40fb9820
L
6076 if (t->opcode_modifier.isprefix
6077 && t->opcode_modifier.ignoresize)
29b0f896
AM
6078 {
6079 /* Warn them that a data or address size prefix doesn't
6080 affect assembly of the next line of code. */
6081 as_warn (_("stand-alone `%s' prefix"), t->name);
6082 }
6083 }
6084
6085 /* Copy the template we found. */
6086 i.tm = *t;
539e75ad
L
6087
6088 if (addr_prefix_disp != -1)
6089 i.tm.operand_types[addr_prefix_disp]
6090 = operand_types[addr_prefix_disp];
6091
29b0f896
AM
6092 if (found_reverse_match)
6093 {
6094 /* If we found a reverse match we must alter the opcode
6095 direction bit. found_reverse_match holds bits to change
6096 (different for int & float insns). */
6097
6098 i.tm.base_opcode ^= found_reverse_match;
6099
f5eb1d70
JB
6100 i.tm.operand_types[0] = operand_types[i.operands - 1];
6101 i.tm.operand_types[i.operands - 1] = operand_types[0];
29b0f896
AM
6102 }
6103
fa99fab2 6104 return t;
29b0f896
AM
6105}
6106
6107static int
e3bb37b5 6108check_string (void)
29b0f896 6109{
40fb9820
L
6110 int mem_op = operand_type_check (i.types[0], anymem) ? 0 : 1;
6111 if (i.tm.operand_types[mem_op].bitfield.esseg)
29b0f896
AM
6112 {
6113 if (i.seg[0] != NULL && i.seg[0] != &es)
6114 {
a87af027 6115 as_bad (_("`%s' operand %d must use `%ses' segment"),
29b0f896 6116 i.tm.name,
a87af027
JB
6117 mem_op + 1,
6118 register_prefix);
29b0f896
AM
6119 return 0;
6120 }
6121 /* There's only ever one segment override allowed per instruction.
6122 This instruction possibly has a legal segment override on the
6123 second operand, so copy the segment to where non-string
6124 instructions store it, allowing common code. */
6125 i.seg[0] = i.seg[1];
6126 }
40fb9820 6127 else if (i.tm.operand_types[mem_op + 1].bitfield.esseg)
29b0f896
AM
6128 {
6129 if (i.seg[1] != NULL && i.seg[1] != &es)
6130 {
a87af027 6131 as_bad (_("`%s' operand %d must use `%ses' segment"),
29b0f896 6132 i.tm.name,
a87af027
JB
6133 mem_op + 2,
6134 register_prefix);
29b0f896
AM
6135 return 0;
6136 }
6137 }
6138 return 1;
6139}
6140
6141static int
543613e9 6142process_suffix (void)
29b0f896
AM
6143{
6144 /* If matched instruction specifies an explicit instruction mnemonic
6145 suffix, use it. */
673fe0f0 6146 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6147 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6148 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6149 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6150 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6151 i.suffix = QWORD_MNEM_SUFFIX;
29b0f896
AM
6152 else if (i.reg_operands)
6153 {
6154 /* If there's no instruction mnemonic suffix we try to invent one
6155 based on register operands. */
6156 if (!i.suffix)
6157 {
6158 /* We take i.suffix from the last register operand specified,
6159 Destination register type is more significant than source
381d071f
L
6160 register type. crc32 in SSE4.2 prefers source register
6161 type. */
556059dd 6162 if (i.tm.base_opcode == 0xf20f38f0 && i.types[0].bitfield.reg)
381d071f 6163 {
556059dd
JB
6164 if (i.types[0].bitfield.byte)
6165 i.suffix = BYTE_MNEM_SUFFIX;
6166 else if (i.types[0].bitfield.word)
40fb9820 6167 i.suffix = WORD_MNEM_SUFFIX;
556059dd 6168 else if (i.types[0].bitfield.dword)
40fb9820 6169 i.suffix = LONG_MNEM_SUFFIX;
556059dd 6170 else if (i.types[0].bitfield.qword)
40fb9820 6171 i.suffix = QWORD_MNEM_SUFFIX;
381d071f
L
6172 }
6173
6174 if (!i.suffix)
6175 {
6176 int op;
6177
556059dd 6178 if (i.tm.base_opcode == 0xf20f38f0)
20592a94
L
6179 {
6180 /* We have to know the operand size for crc32. */
6181 as_bad (_("ambiguous memory operand size for `%s`"),
6182 i.tm.name);
6183 return 0;
6184 }
6185
381d071f 6186 for (op = i.operands; --op >= 0;)
b76bc5d5
JB
6187 if (!i.tm.operand_types[op].bitfield.inoutportreg
6188 && !i.tm.operand_types[op].bitfield.shiftcount)
381d071f 6189 {
8819ada6
JB
6190 if (!i.types[op].bitfield.reg)
6191 continue;
6192 if (i.types[op].bitfield.byte)
6193 i.suffix = BYTE_MNEM_SUFFIX;
6194 else if (i.types[op].bitfield.word)
6195 i.suffix = WORD_MNEM_SUFFIX;
6196 else if (i.types[op].bitfield.dword)
6197 i.suffix = LONG_MNEM_SUFFIX;
6198 else if (i.types[op].bitfield.qword)
6199 i.suffix = QWORD_MNEM_SUFFIX;
6200 else
6201 continue;
6202 break;
381d071f
L
6203 }
6204 }
29b0f896
AM
6205 }
6206 else if (i.suffix == BYTE_MNEM_SUFFIX)
6207 {
2eb952a4
L
6208 if (intel_syntax
6209 && i.tm.opcode_modifier.ignoresize
6210 && i.tm.opcode_modifier.no_bsuf)
6211 i.suffix = 0;
6212 else if (!check_byte_reg ())
29b0f896
AM
6213 return 0;
6214 }
6215 else if (i.suffix == LONG_MNEM_SUFFIX)
6216 {
2eb952a4
L
6217 if (intel_syntax
6218 && i.tm.opcode_modifier.ignoresize
9f123b91
JB
6219 && i.tm.opcode_modifier.no_lsuf
6220 && !i.tm.opcode_modifier.todword
6221 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
6222 i.suffix = 0;
6223 else if (!check_long_reg ())
29b0f896
AM
6224 return 0;
6225 }
6226 else if (i.suffix == QWORD_MNEM_SUFFIX)
6227 {
955e1e6a
L
6228 if (intel_syntax
6229 && i.tm.opcode_modifier.ignoresize
9f123b91
JB
6230 && i.tm.opcode_modifier.no_qsuf
6231 && !i.tm.opcode_modifier.todword
6232 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
6233 i.suffix = 0;
6234 else if (!check_qword_reg ())
29b0f896
AM
6235 return 0;
6236 }
6237 else if (i.suffix == WORD_MNEM_SUFFIX)
6238 {
2eb952a4
L
6239 if (intel_syntax
6240 && i.tm.opcode_modifier.ignoresize
6241 && i.tm.opcode_modifier.no_wsuf)
6242 i.suffix = 0;
6243 else if (!check_word_reg ())
29b0f896
AM
6244 return 0;
6245 }
40fb9820 6246 else if (intel_syntax && i.tm.opcode_modifier.ignoresize)
29b0f896
AM
6247 /* Do nothing if the instruction is going to ignore the prefix. */
6248 ;
6249 else
6250 abort ();
6251 }
40fb9820 6252 else if (i.tm.opcode_modifier.defaultsize
9306ca4a
JB
6253 && !i.suffix
6254 /* exclude fldenv/frstor/fsave/fstenv */
40fb9820 6255 && i.tm.opcode_modifier.no_ssuf)
29b0f896 6256 {
06f74c5c
L
6257 if (stackop_size == LONG_MNEM_SUFFIX
6258 && i.tm.base_opcode == 0xcf)
6259 {
6260 /* stackop_size is set to LONG_MNEM_SUFFIX for the
6261 .code16gcc directive to support 16-bit mode with
6262 32-bit address. For IRET without a suffix, generate
6263 16-bit IRET (opcode 0xcf) to return from an interrupt
6264 handler. */
6265 i.suffix = WORD_MNEM_SUFFIX;
6266 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
6267 }
6268 else
6269 i.suffix = stackop_size;
29b0f896 6270 }
9306ca4a
JB
6271 else if (intel_syntax
6272 && !i.suffix
40fb9820
L
6273 && (i.tm.operand_types[0].bitfield.jumpabsolute
6274 || i.tm.opcode_modifier.jumpbyte
6275 || i.tm.opcode_modifier.jumpintersegment
64e74474
AM
6276 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
6277 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
6278 {
6279 switch (flag_code)
6280 {
6281 case CODE_64BIT:
40fb9820 6282 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a
JB
6283 {
6284 i.suffix = QWORD_MNEM_SUFFIX;
6285 break;
6286 }
1a0670f3 6287 /* Fall through. */
9306ca4a 6288 case CODE_32BIT:
40fb9820 6289 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
6290 i.suffix = LONG_MNEM_SUFFIX;
6291 break;
6292 case CODE_16BIT:
40fb9820 6293 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
6294 i.suffix = WORD_MNEM_SUFFIX;
6295 break;
6296 }
6297 }
252b5132 6298
9306ca4a 6299 if (!i.suffix)
29b0f896 6300 {
9306ca4a
JB
6301 if (!intel_syntax)
6302 {
40fb9820 6303 if (i.tm.opcode_modifier.w)
9306ca4a 6304 {
4eed87de
AM
6305 as_bad (_("no instruction mnemonic suffix given and "
6306 "no register operands; can't size instruction"));
9306ca4a
JB
6307 return 0;
6308 }
6309 }
6310 else
6311 {
40fb9820 6312 unsigned int suffixes;
7ab9ffdd 6313
40fb9820
L
6314 suffixes = !i.tm.opcode_modifier.no_bsuf;
6315 if (!i.tm.opcode_modifier.no_wsuf)
6316 suffixes |= 1 << 1;
6317 if (!i.tm.opcode_modifier.no_lsuf)
6318 suffixes |= 1 << 2;
fc4adea1 6319 if (!i.tm.opcode_modifier.no_ldsuf)
40fb9820
L
6320 suffixes |= 1 << 3;
6321 if (!i.tm.opcode_modifier.no_ssuf)
6322 suffixes |= 1 << 4;
c2b9da16 6323 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
40fb9820
L
6324 suffixes |= 1 << 5;
6325
6326 /* There are more than suffix matches. */
6327 if (i.tm.opcode_modifier.w
9306ca4a 6328 || ((suffixes & (suffixes - 1))
40fb9820
L
6329 && !i.tm.opcode_modifier.defaultsize
6330 && !i.tm.opcode_modifier.ignoresize))
9306ca4a
JB
6331 {
6332 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
6333 return 0;
6334 }
6335 }
29b0f896 6336 }
252b5132 6337
d2224064
JB
6338 /* Change the opcode based on the operand size given by i.suffix. */
6339 switch (i.suffix)
29b0f896 6340 {
d2224064
JB
6341 /* Size floating point instruction. */
6342 case LONG_MNEM_SUFFIX:
6343 if (i.tm.opcode_modifier.floatmf)
6344 {
6345 i.tm.base_opcode ^= 4;
6346 break;
6347 }
6348 /* fall through */
6349 case WORD_MNEM_SUFFIX:
6350 case QWORD_MNEM_SUFFIX:
29b0f896 6351 /* It's not a byte, select word/dword operation. */
40fb9820 6352 if (i.tm.opcode_modifier.w)
29b0f896 6353 {
40fb9820 6354 if (i.tm.opcode_modifier.shortform)
29b0f896
AM
6355 i.tm.base_opcode |= 8;
6356 else
6357 i.tm.base_opcode |= 1;
6358 }
d2224064
JB
6359 /* fall through */
6360 case SHORT_MNEM_SUFFIX:
29b0f896
AM
6361 /* Now select between word & dword operations via the operand
6362 size prefix, except for instructions that will ignore this
6363 prefix anyway. */
75c0a438
L
6364 if (i.reg_operands > 0
6365 && i.types[0].bitfield.reg
6366 && i.tm.opcode_modifier.addrprefixopreg
6367 && (i.tm.opcode_modifier.immext
6368 || i.operands == 1))
cb712a9e 6369 {
ca61edf2
L
6370 /* The address size override prefix changes the size of the
6371 first operand. */
40fb9820 6372 if ((flag_code == CODE_32BIT
75c0a438 6373 && i.op[0].regs->reg_type.bitfield.word)
40fb9820 6374 || (flag_code != CODE_32BIT
75c0a438 6375 && i.op[0].regs->reg_type.bitfield.dword))
cb712a9e
L
6376 if (!add_prefix (ADDR_PREFIX_OPCODE))
6377 return 0;
6378 }
6379 else if (i.suffix != QWORD_MNEM_SUFFIX
40fb9820
L
6380 && !i.tm.opcode_modifier.ignoresize
6381 && !i.tm.opcode_modifier.floatmf
7a8655d2
JB
6382 && !i.tm.opcode_modifier.vex
6383 && !i.tm.opcode_modifier.vexopcode
6384 && !is_evex_encoding (&i.tm)
cb712a9e
L
6385 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
6386 || (flag_code == CODE_64BIT
40fb9820 6387 && i.tm.opcode_modifier.jumpbyte)))
24eab124
AM
6388 {
6389 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 6390
40fb9820 6391 if (i.tm.opcode_modifier.jumpbyte) /* jcxz, loop */
29b0f896 6392 prefix = ADDR_PREFIX_OPCODE;
252b5132 6393
29b0f896
AM
6394 if (!add_prefix (prefix))
6395 return 0;
24eab124 6396 }
252b5132 6397
29b0f896
AM
6398 /* Set mode64 for an operand. */
6399 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 6400 && flag_code == CODE_64BIT
d2224064 6401 && !i.tm.opcode_modifier.norex64
46e883c5 6402 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
6403 need rex64. */
6404 && ! (i.operands == 2
6405 && i.tm.base_opcode == 0x90
6406 && i.tm.extension_opcode == None
6407 && operand_type_equal (&i.types [0], &acc64)
6408 && operand_type_equal (&i.types [1], &acc64)))
6409 i.rex |= REX_W;
3e73aa7c 6410
d2224064 6411 break;
29b0f896 6412 }
7ecd2f8b 6413
c0a30a9f
L
6414 if (i.reg_operands != 0
6415 && i.operands > 1
6416 && i.tm.opcode_modifier.addrprefixopreg
6417 && !i.tm.opcode_modifier.immext)
6418 {
6419 /* Check invalid register operand when the address size override
6420 prefix changes the size of register operands. */
6421 unsigned int op;
6422 enum { need_word, need_dword, need_qword } need;
6423
6424 if (flag_code == CODE_32BIT)
6425 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
6426 else
6427 {
6428 if (i.prefix[ADDR_PREFIX])
6429 need = need_dword;
6430 else
6431 need = flag_code == CODE_64BIT ? need_qword : need_word;
6432 }
6433
6434 for (op = 0; op < i.operands; op++)
6435 if (i.types[op].bitfield.reg
6436 && ((need == need_word
6437 && !i.op[op].regs->reg_type.bitfield.word)
6438 || (need == need_dword
6439 && !i.op[op].regs->reg_type.bitfield.dword)
6440 || (need == need_qword
6441 && !i.op[op].regs->reg_type.bitfield.qword)))
6442 {
6443 as_bad (_("invalid register operand size for `%s'"),
6444 i.tm.name);
6445 return 0;
6446 }
6447 }
6448
29b0f896
AM
6449 return 1;
6450}
3e73aa7c 6451
29b0f896 6452static int
543613e9 6453check_byte_reg (void)
29b0f896
AM
6454{
6455 int op;
543613e9 6456
29b0f896
AM
6457 for (op = i.operands; --op >= 0;)
6458 {
dc821c5f
JB
6459 /* Skip non-register operands. */
6460 if (!i.types[op].bitfield.reg)
6461 continue;
6462
29b0f896
AM
6463 /* If this is an eight bit register, it's OK. If it's the 16 or
6464 32 bit version of an eight bit register, we will just use the
6465 low portion, and that's OK too. */
dc821c5f 6466 if (i.types[op].bitfield.byte)
29b0f896
AM
6467 continue;
6468
5a819eb9
JB
6469 /* I/O port address operands are OK too. */
6470 if (i.tm.operand_types[op].bitfield.inoutportreg)
6471 continue;
6472
9344ff29
L
6473 /* crc32 doesn't generate this warning. */
6474 if (i.tm.base_opcode == 0xf20f38f0)
6475 continue;
6476
dc821c5f
JB
6477 if ((i.types[op].bitfield.word
6478 || i.types[op].bitfield.dword
6479 || i.types[op].bitfield.qword)
5a819eb9
JB
6480 && i.op[op].regs->reg_num < 4
6481 /* Prohibit these changes in 64bit mode, since the lowering
6482 would be more complicated. */
6483 && flag_code != CODE_64BIT)
29b0f896 6484 {
29b0f896 6485#if REGISTER_WARNINGS
5a819eb9 6486 if (!quiet_warnings)
a540244d
L
6487 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
6488 register_prefix,
dc821c5f 6489 (i.op[op].regs + (i.types[op].bitfield.word
29b0f896
AM
6490 ? REGNAM_AL - REGNAM_AX
6491 : REGNAM_AL - REGNAM_EAX))->reg_name,
a540244d 6492 register_prefix,
29b0f896
AM
6493 i.op[op].regs->reg_name,
6494 i.suffix);
6495#endif
6496 continue;
6497 }
6498 /* Any other register is bad. */
dc821c5f 6499 if (i.types[op].bitfield.reg
40fb9820 6500 || i.types[op].bitfield.regmmx
1b54b8d7 6501 || i.types[op].bitfield.regsimd
40fb9820
L
6502 || i.types[op].bitfield.sreg2
6503 || i.types[op].bitfield.sreg3
6504 || i.types[op].bitfield.control
6505 || i.types[op].bitfield.debug
ca0d63fe 6506 || i.types[op].bitfield.test)
29b0f896 6507 {
a540244d
L
6508 as_bad (_("`%s%s' not allowed with `%s%c'"),
6509 register_prefix,
29b0f896
AM
6510 i.op[op].regs->reg_name,
6511 i.tm.name,
6512 i.suffix);
6513 return 0;
6514 }
6515 }
6516 return 1;
6517}
6518
6519static int
e3bb37b5 6520check_long_reg (void)
29b0f896
AM
6521{
6522 int op;
6523
6524 for (op = i.operands; --op >= 0;)
dc821c5f
JB
6525 /* Skip non-register operands. */
6526 if (!i.types[op].bitfield.reg)
6527 continue;
29b0f896
AM
6528 /* Reject eight bit registers, except where the template requires
6529 them. (eg. movzb) */
dc821c5f
JB
6530 else if (i.types[op].bitfield.byte
6531 && (i.tm.operand_types[op].bitfield.reg
6532 || i.tm.operand_types[op].bitfield.acc)
6533 && (i.tm.operand_types[op].bitfield.word
6534 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6535 {
a540244d
L
6536 as_bad (_("`%s%s' not allowed with `%s%c'"),
6537 register_prefix,
29b0f896
AM
6538 i.op[op].regs->reg_name,
6539 i.tm.name,
6540 i.suffix);
6541 return 0;
6542 }
e4630f71 6543 /* Warn if the e prefix on a general reg is missing. */
29b0f896 6544 else if ((!quiet_warnings || flag_code == CODE_64BIT)
dc821c5f
JB
6545 && i.types[op].bitfield.word
6546 && (i.tm.operand_types[op].bitfield.reg
6547 || i.tm.operand_types[op].bitfield.acc)
6548 && i.tm.operand_types[op].bitfield.dword)
29b0f896
AM
6549 {
6550 /* Prohibit these changes in the 64bit mode, since the
6551 lowering is more complicated. */
6552 if (flag_code == CODE_64BIT)
252b5132 6553 {
2b5d6a91 6554 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
2ca3ace5 6555 register_prefix, i.op[op].regs->reg_name,
29b0f896
AM
6556 i.suffix);
6557 return 0;
252b5132 6558 }
29b0f896 6559#if REGISTER_WARNINGS
cecf1424
JB
6560 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
6561 register_prefix,
6562 (i.op[op].regs + REGNAM_EAX - REGNAM_AX)->reg_name,
6563 register_prefix, i.op[op].regs->reg_name, i.suffix);
29b0f896 6564#endif
252b5132 6565 }
e4630f71 6566 /* Warn if the r prefix on a general reg is present. */
dc821c5f
JB
6567 else if (i.types[op].bitfield.qword
6568 && (i.tm.operand_types[op].bitfield.reg
6569 || i.tm.operand_types[op].bitfield.acc)
6570 && i.tm.operand_types[op].bitfield.dword)
252b5132 6571 {
34828aad 6572 if (intel_syntax
ca61edf2 6573 && i.tm.opcode_modifier.toqword
1b54b8d7 6574 && !i.types[0].bitfield.regsimd)
34828aad 6575 {
ca61edf2 6576 /* Convert to QWORD. We want REX byte. */
34828aad
L
6577 i.suffix = QWORD_MNEM_SUFFIX;
6578 }
6579 else
6580 {
2b5d6a91 6581 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
6582 register_prefix, i.op[op].regs->reg_name,
6583 i.suffix);
6584 return 0;
6585 }
29b0f896
AM
6586 }
6587 return 1;
6588}
252b5132 6589
29b0f896 6590static int
e3bb37b5 6591check_qword_reg (void)
29b0f896
AM
6592{
6593 int op;
252b5132 6594
29b0f896 6595 for (op = i.operands; --op >= 0; )
dc821c5f
JB
6596 /* Skip non-register operands. */
6597 if (!i.types[op].bitfield.reg)
6598 continue;
29b0f896
AM
6599 /* Reject eight bit registers, except where the template requires
6600 them. (eg. movzb) */
dc821c5f
JB
6601 else if (i.types[op].bitfield.byte
6602 && (i.tm.operand_types[op].bitfield.reg
6603 || i.tm.operand_types[op].bitfield.acc)
6604 && (i.tm.operand_types[op].bitfield.word
6605 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6606 {
a540244d
L
6607 as_bad (_("`%s%s' not allowed with `%s%c'"),
6608 register_prefix,
29b0f896
AM
6609 i.op[op].regs->reg_name,
6610 i.tm.name,
6611 i.suffix);
6612 return 0;
6613 }
e4630f71 6614 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
6615 else if ((i.types[op].bitfield.word
6616 || i.types[op].bitfield.dword)
6617 && (i.tm.operand_types[op].bitfield.reg
6618 || i.tm.operand_types[op].bitfield.acc)
6619 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
6620 {
6621 /* Prohibit these changes in the 64bit mode, since the
6622 lowering is more complicated. */
34828aad 6623 if (intel_syntax
ca61edf2 6624 && i.tm.opcode_modifier.todword
1b54b8d7 6625 && !i.types[0].bitfield.regsimd)
34828aad 6626 {
ca61edf2 6627 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
6628 i.suffix = LONG_MNEM_SUFFIX;
6629 }
6630 else
6631 {
2b5d6a91 6632 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
6633 register_prefix, i.op[op].regs->reg_name,
6634 i.suffix);
6635 return 0;
6636 }
252b5132 6637 }
29b0f896
AM
6638 return 1;
6639}
252b5132 6640
29b0f896 6641static int
e3bb37b5 6642check_word_reg (void)
29b0f896
AM
6643{
6644 int op;
6645 for (op = i.operands; --op >= 0;)
dc821c5f
JB
6646 /* Skip non-register operands. */
6647 if (!i.types[op].bitfield.reg)
6648 continue;
29b0f896
AM
6649 /* Reject eight bit registers, except where the template requires
6650 them. (eg. movzb) */
dc821c5f
JB
6651 else if (i.types[op].bitfield.byte
6652 && (i.tm.operand_types[op].bitfield.reg
6653 || i.tm.operand_types[op].bitfield.acc)
6654 && (i.tm.operand_types[op].bitfield.word
6655 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6656 {
a540244d
L
6657 as_bad (_("`%s%s' not allowed with `%s%c'"),
6658 register_prefix,
29b0f896
AM
6659 i.op[op].regs->reg_name,
6660 i.tm.name,
6661 i.suffix);
6662 return 0;
6663 }
e4630f71 6664 /* Warn if the e or r prefix on a general reg is present. */
29b0f896 6665 else if ((!quiet_warnings || flag_code == CODE_64BIT)
dc821c5f
JB
6666 && (i.types[op].bitfield.dword
6667 || i.types[op].bitfield.qword)
6668 && (i.tm.operand_types[op].bitfield.reg
6669 || i.tm.operand_types[op].bitfield.acc)
6670 && i.tm.operand_types[op].bitfield.word)
252b5132 6671 {
29b0f896
AM
6672 /* Prohibit these changes in the 64bit mode, since the
6673 lowering is more complicated. */
6674 if (flag_code == CODE_64BIT)
252b5132 6675 {
2b5d6a91 6676 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
2ca3ace5 6677 register_prefix, i.op[op].regs->reg_name,
29b0f896
AM
6678 i.suffix);
6679 return 0;
252b5132 6680 }
29b0f896 6681#if REGISTER_WARNINGS
cecf1424
JB
6682 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
6683 register_prefix,
6684 (i.op[op].regs + REGNAM_AX - REGNAM_EAX)->reg_name,
6685 register_prefix, i.op[op].regs->reg_name, i.suffix);
29b0f896
AM
6686#endif
6687 }
6688 return 1;
6689}
252b5132 6690
29b0f896 6691static int
40fb9820 6692update_imm (unsigned int j)
29b0f896 6693{
bc0844ae 6694 i386_operand_type overlap = i.types[j];
40fb9820
L
6695 if ((overlap.bitfield.imm8
6696 || overlap.bitfield.imm8s
6697 || overlap.bitfield.imm16
6698 || overlap.bitfield.imm32
6699 || overlap.bitfield.imm32s
6700 || overlap.bitfield.imm64)
0dfbf9d7
L
6701 && !operand_type_equal (&overlap, &imm8)
6702 && !operand_type_equal (&overlap, &imm8s)
6703 && !operand_type_equal (&overlap, &imm16)
6704 && !operand_type_equal (&overlap, &imm32)
6705 && !operand_type_equal (&overlap, &imm32s)
6706 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
6707 {
6708 if (i.suffix)
6709 {
40fb9820
L
6710 i386_operand_type temp;
6711
0dfbf9d7 6712 operand_type_set (&temp, 0);
7ab9ffdd 6713 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
6714 {
6715 temp.bitfield.imm8 = overlap.bitfield.imm8;
6716 temp.bitfield.imm8s = overlap.bitfield.imm8s;
6717 }
6718 else if (i.suffix == WORD_MNEM_SUFFIX)
6719 temp.bitfield.imm16 = overlap.bitfield.imm16;
6720 else if (i.suffix == QWORD_MNEM_SUFFIX)
6721 {
6722 temp.bitfield.imm64 = overlap.bitfield.imm64;
6723 temp.bitfield.imm32s = overlap.bitfield.imm32s;
6724 }
6725 else
6726 temp.bitfield.imm32 = overlap.bitfield.imm32;
6727 overlap = temp;
29b0f896 6728 }
0dfbf9d7
L
6729 else if (operand_type_equal (&overlap, &imm16_32_32s)
6730 || operand_type_equal (&overlap, &imm16_32)
6731 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 6732 {
40fb9820 6733 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 6734 overlap = imm16;
40fb9820 6735 else
65da13b5 6736 overlap = imm32s;
29b0f896 6737 }
0dfbf9d7
L
6738 if (!operand_type_equal (&overlap, &imm8)
6739 && !operand_type_equal (&overlap, &imm8s)
6740 && !operand_type_equal (&overlap, &imm16)
6741 && !operand_type_equal (&overlap, &imm32)
6742 && !operand_type_equal (&overlap, &imm32s)
6743 && !operand_type_equal (&overlap, &imm64))
29b0f896 6744 {
4eed87de
AM
6745 as_bad (_("no instruction mnemonic suffix given; "
6746 "can't determine immediate size"));
29b0f896
AM
6747 return 0;
6748 }
6749 }
40fb9820 6750 i.types[j] = overlap;
29b0f896 6751
40fb9820
L
6752 return 1;
6753}
6754
6755static int
6756finalize_imm (void)
6757{
bc0844ae 6758 unsigned int j, n;
29b0f896 6759
bc0844ae
L
6760 /* Update the first 2 immediate operands. */
6761 n = i.operands > 2 ? 2 : i.operands;
6762 if (n)
6763 {
6764 for (j = 0; j < n; j++)
6765 if (update_imm (j) == 0)
6766 return 0;
40fb9820 6767
bc0844ae
L
6768 /* The 3rd operand can't be immediate operand. */
6769 gas_assert (operand_type_check (i.types[2], imm) == 0);
6770 }
29b0f896
AM
6771
6772 return 1;
6773}
6774
6775static int
e3bb37b5 6776process_operands (void)
29b0f896
AM
6777{
6778 /* Default segment register this instruction will use for memory
6779 accesses. 0 means unknown. This is only for optimizing out
6780 unnecessary segment overrides. */
6781 const seg_entry *default_seg = 0;
6782
2426c15f 6783 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 6784 {
91d6fa6a
NC
6785 unsigned int dupl = i.operands;
6786 unsigned int dest = dupl - 1;
9fcfb3d7
L
6787 unsigned int j;
6788
c0f3af97 6789 /* The destination must be an xmm register. */
9c2799c2 6790 gas_assert (i.reg_operands
91d6fa6a 6791 && MAX_OPERANDS > dupl
7ab9ffdd 6792 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 6793
1b54b8d7
JB
6794 if (i.tm.operand_types[0].bitfield.acc
6795 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 6796 {
8cd7925b 6797 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
6798 {
6799 /* Keep xmm0 for instructions with VEX prefix and 3
6800 sources. */
1b54b8d7
JB
6801 i.tm.operand_types[0].bitfield.acc = 0;
6802 i.tm.operand_types[0].bitfield.regsimd = 1;
c0f3af97
L
6803 goto duplicate;
6804 }
e2ec9d29 6805 else
c0f3af97
L
6806 {
6807 /* We remove the first xmm0 and keep the number of
6808 operands unchanged, which in fact duplicates the
6809 destination. */
6810 for (j = 1; j < i.operands; j++)
6811 {
6812 i.op[j - 1] = i.op[j];
6813 i.types[j - 1] = i.types[j];
6814 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
6815 }
6816 }
6817 }
6818 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 6819 {
91d6fa6a 6820 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
6821 && (i.tm.opcode_modifier.vexsources
6822 == VEX3SOURCES));
c0f3af97
L
6823
6824 /* Add the implicit xmm0 for instructions with VEX prefix
6825 and 3 sources. */
6826 for (j = i.operands; j > 0; j--)
6827 {
6828 i.op[j] = i.op[j - 1];
6829 i.types[j] = i.types[j - 1];
6830 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
6831 }
6832 i.op[0].regs
6833 = (const reg_entry *) hash_find (reg_hash, "xmm0");
7ab9ffdd 6834 i.types[0] = regxmm;
c0f3af97
L
6835 i.tm.operand_types[0] = regxmm;
6836
6837 i.operands += 2;
6838 i.reg_operands += 2;
6839 i.tm.operands += 2;
6840
91d6fa6a 6841 dupl++;
c0f3af97 6842 dest++;
91d6fa6a
NC
6843 i.op[dupl] = i.op[dest];
6844 i.types[dupl] = i.types[dest];
6845 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
e2ec9d29 6846 }
c0f3af97
L
6847 else
6848 {
6849duplicate:
6850 i.operands++;
6851 i.reg_operands++;
6852 i.tm.operands++;
6853
91d6fa6a
NC
6854 i.op[dupl] = i.op[dest];
6855 i.types[dupl] = i.types[dest];
6856 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
c0f3af97
L
6857 }
6858
6859 if (i.tm.opcode_modifier.immext)
6860 process_immext ();
6861 }
1b54b8d7
JB
6862 else if (i.tm.operand_types[0].bitfield.acc
6863 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
6864 {
6865 unsigned int j;
6866
9fcfb3d7
L
6867 for (j = 1; j < i.operands; j++)
6868 {
6869 i.op[j - 1] = i.op[j];
6870 i.types[j - 1] = i.types[j];
6871
6872 /* We need to adjust fields in i.tm since they are used by
6873 build_modrm_byte. */
6874 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
6875 }
6876
e2ec9d29
L
6877 i.operands--;
6878 i.reg_operands--;
e2ec9d29
L
6879 i.tm.operands--;
6880 }
920d2ddc
IT
6881 else if (i.tm.opcode_modifier.implicitquadgroup)
6882 {
a477a8c4
JB
6883 unsigned int regnum, first_reg_in_group, last_reg_in_group;
6884
920d2ddc 6885 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
10c17abd 6886 gas_assert (i.operands >= 2 && i.types[1].bitfield.regsimd);
a477a8c4
JB
6887 regnum = register_number (i.op[1].regs);
6888 first_reg_in_group = regnum & ~3;
6889 last_reg_in_group = first_reg_in_group + 3;
6890 if (regnum != first_reg_in_group)
6891 as_warn (_("source register `%s%s' implicitly denotes"
6892 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
6893 register_prefix, i.op[1].regs->reg_name,
6894 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
6895 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
6896 i.tm.name);
6897 }
e2ec9d29
L
6898 else if (i.tm.opcode_modifier.regkludge)
6899 {
6900 /* The imul $imm, %reg instruction is converted into
6901 imul $imm, %reg, %reg, and the clr %reg instruction
6902 is converted into xor %reg, %reg. */
6903
6904 unsigned int first_reg_op;
6905
6906 if (operand_type_check (i.types[0], reg))
6907 first_reg_op = 0;
6908 else
6909 first_reg_op = 1;
6910 /* Pretend we saw the extra register operand. */
9c2799c2 6911 gas_assert (i.reg_operands == 1
7ab9ffdd 6912 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
6913 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
6914 i.types[first_reg_op + 1] = i.types[first_reg_op];
6915 i.operands++;
6916 i.reg_operands++;
29b0f896
AM
6917 }
6918
40fb9820 6919 if (i.tm.opcode_modifier.shortform)
29b0f896 6920 {
40fb9820
L
6921 if (i.types[0].bitfield.sreg2
6922 || i.types[0].bitfield.sreg3)
29b0f896 6923 {
4eed87de
AM
6924 if (i.tm.base_opcode == POP_SEG_SHORT
6925 && i.op[0].regs->reg_num == 1)
29b0f896 6926 {
a87af027 6927 as_bad (_("you can't `pop %scs'"), register_prefix);
4eed87de 6928 return 0;
29b0f896 6929 }
4eed87de
AM
6930 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
6931 if ((i.op[0].regs->reg_flags & RegRex) != 0)
161a04f6 6932 i.rex |= REX_B;
4eed87de
AM
6933 }
6934 else
6935 {
7ab9ffdd 6936 /* The register or float register operand is in operand
85f10a01 6937 0 or 1. */
40fb9820 6938 unsigned int op;
7ab9ffdd 6939
ca0d63fe 6940 if ((i.types[0].bitfield.reg && i.types[0].bitfield.tbyte)
7ab9ffdd
L
6941 || operand_type_check (i.types[0], reg))
6942 op = 0;
6943 else
6944 op = 1;
4eed87de
AM
6945 /* Register goes in low 3 bits of opcode. */
6946 i.tm.base_opcode |= i.op[op].regs->reg_num;
6947 if ((i.op[op].regs->reg_flags & RegRex) != 0)
161a04f6 6948 i.rex |= REX_B;
40fb9820 6949 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896 6950 {
4eed87de
AM
6951 /* Warn about some common errors, but press on regardless.
6952 The first case can be generated by gcc (<= 2.8.1). */
6953 if (i.operands == 2)
6954 {
6955 /* Reversed arguments on faddp, fsubp, etc. */
a540244d 6956 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
d8a1b51e
JB
6957 register_prefix, i.op[!intel_syntax].regs->reg_name,
6958 register_prefix, i.op[intel_syntax].regs->reg_name);
4eed87de
AM
6959 }
6960 else
6961 {
6962 /* Extraneous `l' suffix on fp insn. */
a540244d
L
6963 as_warn (_("translating to `%s %s%s'"), i.tm.name,
6964 register_prefix, i.op[0].regs->reg_name);
4eed87de 6965 }
29b0f896
AM
6966 }
6967 }
6968 }
40fb9820 6969 else if (i.tm.opcode_modifier.modrm)
29b0f896
AM
6970 {
6971 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
6972 must be put into the modrm byte). Now, we make the modrm and
6973 index base bytes based on all the info we've collected. */
29b0f896
AM
6974
6975 default_seg = build_modrm_byte ();
6976 }
8a2ed489 6977 else if ((i.tm.base_opcode & ~0x3) == MOV_AX_DISP32)
29b0f896
AM
6978 {
6979 default_seg = &ds;
6980 }
40fb9820 6981 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
6982 {
6983 /* For the string instructions that allow a segment override
6984 on one of their operands, the default segment is ds. */
6985 default_seg = &ds;
6986 }
6987
75178d9d
L
6988 if (i.tm.base_opcode == 0x8d /* lea */
6989 && i.seg[0]
6990 && !quiet_warnings)
30123838 6991 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
52271982
AM
6992
6993 /* If a segment was explicitly specified, and the specified segment
6994 is not the default, use an opcode prefix to select it. If we
6995 never figured out what the default segment is, then default_seg
6996 will be zero at this point, and the specified segment prefix will
6997 always be used. */
29b0f896
AM
6998 if ((i.seg[0]) && (i.seg[0] != default_seg))
6999 {
7000 if (!add_prefix (i.seg[0]->seg_prefix))
7001 return 0;
7002 }
7003 return 1;
7004}
7005
7006static const seg_entry *
e3bb37b5 7007build_modrm_byte (void)
29b0f896
AM
7008{
7009 const seg_entry *default_seg = 0;
c0f3af97 7010 unsigned int source, dest;
8cd7925b 7011 int vex_3_sources;
c0f3af97 7012
8cd7925b 7013 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
7014 if (vex_3_sources)
7015 {
91d6fa6a 7016 unsigned int nds, reg_slot;
4c2c6516 7017 expressionS *exp;
c0f3af97 7018
6b8d3588 7019 dest = i.operands - 1;
c0f3af97 7020 nds = dest - 1;
922d8de8 7021
a683cc34 7022 /* There are 2 kinds of instructions:
bed3d976
JB
7023 1. 5 operands: 4 register operands or 3 register operands
7024 plus 1 memory operand plus one Vec_Imm4 operand, VexXDS, and
7025 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 7026 ZMM register.
bed3d976 7027 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 7028 plus 1 memory operand, with VexXDS. */
922d8de8 7029 gas_assert ((i.reg_operands == 4
bed3d976
JB
7030 || (i.reg_operands == 3 && i.mem_operands == 1))
7031 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323
JB
7032 && i.tm.opcode_modifier.vexw
7033 && i.tm.operand_types[dest].bitfield.regsimd);
a683cc34 7034
48db9223
JB
7035 /* If VexW1 is set, the first non-immediate operand is the source and
7036 the second non-immediate one is encoded in the immediate operand. */
7037 if (i.tm.opcode_modifier.vexw == VEXW1)
7038 {
7039 source = i.imm_operands;
7040 reg_slot = i.imm_operands + 1;
7041 }
7042 else
7043 {
7044 source = i.imm_operands + 1;
7045 reg_slot = i.imm_operands;
7046 }
7047
a683cc34 7048 if (i.imm_operands == 0)
bed3d976
JB
7049 {
7050 /* When there is no immediate operand, generate an 8bit
7051 immediate operand to encode the first operand. */
7052 exp = &im_expressions[i.imm_operands++];
7053 i.op[i.operands].imms = exp;
7054 i.types[i.operands] = imm8;
7055 i.operands++;
7056
7057 gas_assert (i.tm.operand_types[reg_slot].bitfield.regsimd);
7058 exp->X_op = O_constant;
7059 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
7060 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
7061 }
922d8de8 7062 else
bed3d976
JB
7063 {
7064 unsigned int imm_slot;
a683cc34 7065
2f1bada2
JB
7066 gas_assert (i.imm_operands == 1 && i.types[0].bitfield.vec_imm4);
7067
bed3d976
JB
7068 if (i.tm.opcode_modifier.immext)
7069 {
7070 /* When ImmExt is set, the immediate byte is the last
7071 operand. */
7072 imm_slot = i.operands - 1;
7073 source--;
7074 reg_slot--;
7075 }
7076 else
7077 {
7078 imm_slot = 0;
7079
7080 /* Turn on Imm8 so that output_imm will generate it. */
7081 i.types[imm_slot].bitfield.imm8 = 1;
7082 }
7083
7084 gas_assert (i.tm.operand_types[reg_slot].bitfield.regsimd);
7085 i.op[imm_slot].imms->X_add_number
7086 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 7087 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 7088 }
a683cc34 7089
10c17abd 7090 gas_assert (i.tm.operand_types[nds].bitfield.regsimd);
dae39acc 7091 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
7092 }
7093 else
7094 source = dest = 0;
29b0f896
AM
7095
7096 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
7097 implicit registers do not count. If there are 3 register
7098 operands, it must be a instruction with VexNDS. For a
7099 instruction with VexNDD, the destination register is encoded
7100 in VEX prefix. If there are 4 register operands, it must be
7101 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
7102 if (i.mem_operands == 0
7103 && ((i.reg_operands == 2
2426c15f 7104 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 7105 || (i.reg_operands == 3
2426c15f 7106 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 7107 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 7108 {
cab737b9
L
7109 switch (i.operands)
7110 {
7111 case 2:
7112 source = 0;
7113 break;
7114 case 3:
c81128dc
L
7115 /* When there are 3 operands, one of them may be immediate,
7116 which may be the first or the last operand. Otherwise,
c0f3af97
L
7117 the first operand must be shift count register (cl) or it
7118 is an instruction with VexNDS. */
9c2799c2 7119 gas_assert (i.imm_operands == 1
7ab9ffdd 7120 || (i.imm_operands == 0
2426c15f 7121 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd 7122 || i.types[0].bitfield.shiftcount)));
40fb9820
L
7123 if (operand_type_check (i.types[0], imm)
7124 || i.types[0].bitfield.shiftcount)
7125 source = 1;
7126 else
7127 source = 0;
cab737b9
L
7128 break;
7129 case 4:
368d64cc
L
7130 /* When there are 4 operands, the first two must be 8bit
7131 immediate operands. The source operand will be the 3rd
c0f3af97
L
7132 one.
7133
7134 For instructions with VexNDS, if the first operand
7135 an imm8, the source operand is the 2nd one. If the last
7136 operand is imm8, the source operand is the first one. */
9c2799c2 7137 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
7138 && i.types[0].bitfield.imm8
7139 && i.types[1].bitfield.imm8)
2426c15f 7140 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
7141 && i.imm_operands == 1
7142 && (i.types[0].bitfield.imm8
43234a1e
L
7143 || i.types[i.operands - 1].bitfield.imm8
7144 || i.rounding)));
9f2670f2
L
7145 if (i.imm_operands == 2)
7146 source = 2;
7147 else
c0f3af97
L
7148 {
7149 if (i.types[0].bitfield.imm8)
7150 source = 1;
7151 else
7152 source = 0;
7153 }
c0f3af97
L
7154 break;
7155 case 5:
e771e7c9 7156 if (is_evex_encoding (&i.tm))
43234a1e
L
7157 {
7158 /* For EVEX instructions, when there are 5 operands, the
7159 first one must be immediate operand. If the second one
7160 is immediate operand, the source operand is the 3th
7161 one. If the last one is immediate operand, the source
7162 operand is the 2nd one. */
7163 gas_assert (i.imm_operands == 2
7164 && i.tm.opcode_modifier.sae
7165 && operand_type_check (i.types[0], imm));
7166 if (operand_type_check (i.types[1], imm))
7167 source = 2;
7168 else if (operand_type_check (i.types[4], imm))
7169 source = 1;
7170 else
7171 abort ();
7172 }
cab737b9
L
7173 break;
7174 default:
7175 abort ();
7176 }
7177
c0f3af97
L
7178 if (!vex_3_sources)
7179 {
7180 dest = source + 1;
7181
43234a1e
L
7182 /* RC/SAE operand could be between DEST and SRC. That happens
7183 when one operand is GPR and the other one is XMM/YMM/ZMM
7184 register. */
7185 if (i.rounding && i.rounding->operand == (int) dest)
7186 dest++;
7187
2426c15f 7188 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 7189 {
43234a1e 7190 /* For instructions with VexNDS, the register-only source
c5d0745b 7191 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
43234a1e
L
7192 register. It is encoded in VEX prefix. We need to
7193 clear RegMem bit before calling operand_type_equal. */
f12dc422
L
7194
7195 i386_operand_type op;
7196 unsigned int vvvv;
7197
7198 /* Check register-only source operand when two source
7199 operands are swapped. */
7200 if (!i.tm.operand_types[source].bitfield.baseindex
7201 && i.tm.operand_types[dest].bitfield.baseindex)
7202 {
7203 vvvv = source;
7204 source = dest;
7205 }
7206 else
7207 vvvv = dest;
7208
7209 op = i.tm.operand_types[vvvv];
fa99fab2 7210 op.bitfield.regmem = 0;
c0f3af97 7211 if ((dest + 1) >= i.operands
dc821c5f
JB
7212 || ((!op.bitfield.reg
7213 || (!op.bitfield.dword && !op.bitfield.qword))
10c17abd 7214 && !op.bitfield.regsimd
43234a1e 7215 && !operand_type_equal (&op, &regmask)))
c0f3af97 7216 abort ();
f12dc422 7217 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
7218 dest++;
7219 }
7220 }
29b0f896
AM
7221
7222 i.rm.mode = 3;
7223 /* One of the register operands will be encoded in the i.tm.reg
7224 field, the other in the combined i.tm.mode and i.tm.regmem
7225 fields. If no form of this instruction supports a memory
7226 destination operand, then we assume the source operand may
7227 sometimes be a memory operand and so we need to store the
7228 destination in the i.rm.reg field. */
40fb9820
L
7229 if (!i.tm.operand_types[dest].bitfield.regmem
7230 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
7231 {
7232 i.rm.reg = i.op[dest].regs->reg_num;
7233 i.rm.regmem = i.op[source].regs->reg_num;
b4a3a7b4
L
7234 if (i.op[dest].regs->reg_type.bitfield.regmmx
7235 || i.op[source].regs->reg_type.bitfield.regmmx)
7236 i.has_regmmx = TRUE;
7237 else if (i.op[dest].regs->reg_type.bitfield.regsimd
7238 || i.op[source].regs->reg_type.bitfield.regsimd)
7239 {
7240 if (i.types[dest].bitfield.zmmword
7241 || i.types[source].bitfield.zmmword)
7242 i.has_regzmm = TRUE;
7243 else if (i.types[dest].bitfield.ymmword
7244 || i.types[source].bitfield.ymmword)
7245 i.has_regymm = TRUE;
7246 else
7247 i.has_regxmm = TRUE;
7248 }
29b0f896 7249 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 7250 i.rex |= REX_R;
43234a1e
L
7251 if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
7252 i.vrex |= REX_R;
29b0f896 7253 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 7254 i.rex |= REX_B;
43234a1e
L
7255 if ((i.op[source].regs->reg_flags & RegVRex) != 0)
7256 i.vrex |= REX_B;
29b0f896
AM
7257 }
7258 else
7259 {
7260 i.rm.reg = i.op[source].regs->reg_num;
7261 i.rm.regmem = i.op[dest].regs->reg_num;
7262 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 7263 i.rex |= REX_B;
43234a1e
L
7264 if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
7265 i.vrex |= REX_B;
29b0f896 7266 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 7267 i.rex |= REX_R;
43234a1e
L
7268 if ((i.op[source].regs->reg_flags & RegVRex) != 0)
7269 i.vrex |= REX_R;
29b0f896 7270 }
e0c7f900 7271 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 7272 {
e0c7f900 7273 if (!i.types[i.tm.operand_types[0].bitfield.regmem].bitfield.control)
c4a530c5 7274 abort ();
e0c7f900 7275 i.rex &= ~REX_R;
c4a530c5
JB
7276 add_prefix (LOCK_PREFIX_OPCODE);
7277 }
29b0f896
AM
7278 }
7279 else
7280 { /* If it's not 2 reg operands... */
c0f3af97
L
7281 unsigned int mem;
7282
29b0f896
AM
7283 if (i.mem_operands)
7284 {
7285 unsigned int fake_zero_displacement = 0;
99018f42 7286 unsigned int op;
4eed87de 7287
7ab9ffdd
L
7288 for (op = 0; op < i.operands; op++)
7289 if (operand_type_check (i.types[op], anymem))
7290 break;
7ab9ffdd 7291 gas_assert (op < i.operands);
29b0f896 7292
6c30d220
L
7293 if (i.tm.opcode_modifier.vecsib)
7294 {
e968fc9b 7295 if (i.index_reg->reg_num == RegIZ)
6c30d220
L
7296 abort ();
7297
7298 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7299 if (!i.base_reg)
7300 {
7301 i.sib.base = NO_BASE_REGISTER;
7302 i.sib.scale = i.log2_scale_factor;
7303 i.types[op].bitfield.disp8 = 0;
7304 i.types[op].bitfield.disp16 = 0;
7305 i.types[op].bitfield.disp64 = 0;
43083a50 7306 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
6c30d220
L
7307 {
7308 /* Must be 32 bit */
7309 i.types[op].bitfield.disp32 = 1;
7310 i.types[op].bitfield.disp32s = 0;
7311 }
7312 else
7313 {
7314 i.types[op].bitfield.disp32 = 0;
7315 i.types[op].bitfield.disp32s = 1;
7316 }
7317 }
7318 i.sib.index = i.index_reg->reg_num;
7319 if ((i.index_reg->reg_flags & RegRex) != 0)
7320 i.rex |= REX_X;
43234a1e
L
7321 if ((i.index_reg->reg_flags & RegVRex) != 0)
7322 i.vrex |= REX_X;
6c30d220
L
7323 }
7324
29b0f896
AM
7325 default_seg = &ds;
7326
7327 if (i.base_reg == 0)
7328 {
7329 i.rm.mode = 0;
7330 if (!i.disp_operands)
9bb129e8 7331 fake_zero_displacement = 1;
29b0f896
AM
7332 if (i.index_reg == 0)
7333 {
73053c1f
JB
7334 i386_operand_type newdisp;
7335
6c30d220 7336 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 7337 /* Operand is just <disp> */
20f0a1fc 7338 if (flag_code == CODE_64BIT)
29b0f896
AM
7339 {
7340 /* 64bit mode overwrites the 32bit absolute
7341 addressing by RIP relative addressing and
7342 absolute addressing is encoded by one of the
7343 redundant SIB forms. */
7344 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7345 i.sib.base = NO_BASE_REGISTER;
7346 i.sib.index = NO_INDEX_REGISTER;
73053c1f 7347 newdisp = (!i.prefix[ADDR_PREFIX] ? disp32s : disp32);
20f0a1fc 7348 }
fc225355
L
7349 else if ((flag_code == CODE_16BIT)
7350 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
7351 {
7352 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 7353 newdisp = disp16;
20f0a1fc
NC
7354 }
7355 else
7356 {
7357 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 7358 newdisp = disp32;
29b0f896 7359 }
73053c1f
JB
7360 i.types[op] = operand_type_and_not (i.types[op], anydisp);
7361 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 7362 }
6c30d220 7363 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 7364 {
6c30d220 7365 /* !i.base_reg && i.index_reg */
e968fc9b 7366 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
7367 i.sib.index = NO_INDEX_REGISTER;
7368 else
7369 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
7370 i.sib.base = NO_BASE_REGISTER;
7371 i.sib.scale = i.log2_scale_factor;
7372 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
7373 i.types[op].bitfield.disp8 = 0;
7374 i.types[op].bitfield.disp16 = 0;
7375 i.types[op].bitfield.disp64 = 0;
43083a50 7376 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
40fb9820
L
7377 {
7378 /* Must be 32 bit */
7379 i.types[op].bitfield.disp32 = 1;
7380 i.types[op].bitfield.disp32s = 0;
7381 }
29b0f896 7382 else
40fb9820
L
7383 {
7384 i.types[op].bitfield.disp32 = 0;
7385 i.types[op].bitfield.disp32s = 1;
7386 }
29b0f896 7387 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 7388 i.rex |= REX_X;
29b0f896
AM
7389 }
7390 }
7391 /* RIP addressing for 64bit mode. */
e968fc9b 7392 else if (i.base_reg->reg_num == RegIP)
29b0f896 7393 {
6c30d220 7394 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 7395 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
7396 i.types[op].bitfield.disp8 = 0;
7397 i.types[op].bitfield.disp16 = 0;
7398 i.types[op].bitfield.disp32 = 0;
7399 i.types[op].bitfield.disp32s = 1;
7400 i.types[op].bitfield.disp64 = 0;
71903a11 7401 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
7402 if (! i.disp_operands)
7403 fake_zero_displacement = 1;
29b0f896 7404 }
dc821c5f 7405 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 7406 {
6c30d220 7407 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
7408 switch (i.base_reg->reg_num)
7409 {
7410 case 3: /* (%bx) */
7411 if (i.index_reg == 0)
7412 i.rm.regmem = 7;
7413 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
7414 i.rm.regmem = i.index_reg->reg_num - 6;
7415 break;
7416 case 5: /* (%bp) */
7417 default_seg = &ss;
7418 if (i.index_reg == 0)
7419 {
7420 i.rm.regmem = 6;
40fb9820 7421 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
7422 {
7423 /* fake (%bp) into 0(%bp) */
b5014f7a 7424 i.types[op].bitfield.disp8 = 1;
252b5132 7425 fake_zero_displacement = 1;
29b0f896
AM
7426 }
7427 }
7428 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
7429 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
7430 break;
7431 default: /* (%si) -> 4 or (%di) -> 5 */
7432 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
7433 }
7434 i.rm.mode = mode_from_disp_size (i.types[op]);
7435 }
7436 else /* i.base_reg and 32/64 bit mode */
7437 {
7438 if (flag_code == CODE_64BIT
40fb9820
L
7439 && operand_type_check (i.types[op], disp))
7440 {
73053c1f
JB
7441 i.types[op].bitfield.disp16 = 0;
7442 i.types[op].bitfield.disp64 = 0;
40fb9820 7443 if (i.prefix[ADDR_PREFIX] == 0)
73053c1f
JB
7444 {
7445 i.types[op].bitfield.disp32 = 0;
7446 i.types[op].bitfield.disp32s = 1;
7447 }
40fb9820 7448 else
73053c1f
JB
7449 {
7450 i.types[op].bitfield.disp32 = 1;
7451 i.types[op].bitfield.disp32s = 0;
7452 }
40fb9820 7453 }
20f0a1fc 7454
6c30d220
L
7455 if (!i.tm.opcode_modifier.vecsib)
7456 i.rm.regmem = i.base_reg->reg_num;
29b0f896 7457 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 7458 i.rex |= REX_B;
29b0f896
AM
7459 i.sib.base = i.base_reg->reg_num;
7460 /* x86-64 ignores REX prefix bit here to avoid decoder
7461 complications. */
848930b2
JB
7462 if (!(i.base_reg->reg_flags & RegRex)
7463 && (i.base_reg->reg_num == EBP_REG_NUM
7464 || i.base_reg->reg_num == ESP_REG_NUM))
29b0f896 7465 default_seg = &ss;
848930b2 7466 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 7467 {
848930b2 7468 fake_zero_displacement = 1;
b5014f7a 7469 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
7470 }
7471 i.sib.scale = i.log2_scale_factor;
7472 if (i.index_reg == 0)
7473 {
6c30d220 7474 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
7475 /* <disp>(%esp) becomes two byte modrm with no index
7476 register. We've already stored the code for esp
7477 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
7478 Any base register besides %esp will not use the
7479 extra modrm byte. */
7480 i.sib.index = NO_INDEX_REGISTER;
29b0f896 7481 }
6c30d220 7482 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 7483 {
e968fc9b 7484 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
7485 i.sib.index = NO_INDEX_REGISTER;
7486 else
7487 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
7488 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7489 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 7490 i.rex |= REX_X;
29b0f896 7491 }
67a4f2b7
AO
7492
7493 if (i.disp_operands
7494 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
7495 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
7496 i.rm.mode = 0;
7497 else
a501d77e
L
7498 {
7499 if (!fake_zero_displacement
7500 && !i.disp_operands
7501 && i.disp_encoding)
7502 {
7503 fake_zero_displacement = 1;
7504 if (i.disp_encoding == disp_encoding_8bit)
7505 i.types[op].bitfield.disp8 = 1;
7506 else
7507 i.types[op].bitfield.disp32 = 1;
7508 }
7509 i.rm.mode = mode_from_disp_size (i.types[op]);
7510 }
29b0f896 7511 }
252b5132 7512
29b0f896
AM
7513 if (fake_zero_displacement)
7514 {
7515 /* Fakes a zero displacement assuming that i.types[op]
7516 holds the correct displacement size. */
7517 expressionS *exp;
7518
9c2799c2 7519 gas_assert (i.op[op].disps == 0);
29b0f896
AM
7520 exp = &disp_expressions[i.disp_operands++];
7521 i.op[op].disps = exp;
7522 exp->X_op = O_constant;
7523 exp->X_add_number = 0;
7524 exp->X_add_symbol = (symbolS *) 0;
7525 exp->X_op_symbol = (symbolS *) 0;
7526 }
c0f3af97
L
7527
7528 mem = op;
29b0f896 7529 }
c0f3af97
L
7530 else
7531 mem = ~0;
252b5132 7532
8c43a48b 7533 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
7534 {
7535 if (operand_type_check (i.types[0], imm))
7536 i.vex.register_specifier = NULL;
7537 else
7538 {
7539 /* VEX.vvvv encodes one of the sources when the first
7540 operand is not an immediate. */
1ef99a7b 7541 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
7542 i.vex.register_specifier = i.op[0].regs;
7543 else
7544 i.vex.register_specifier = i.op[1].regs;
7545 }
7546
7547 /* Destination is a XMM register encoded in the ModRM.reg
7548 and VEX.R bit. */
7549 i.rm.reg = i.op[2].regs->reg_num;
7550 if ((i.op[2].regs->reg_flags & RegRex) != 0)
7551 i.rex |= REX_R;
7552
7553 /* ModRM.rm and VEX.B encodes the other source. */
7554 if (!i.mem_operands)
7555 {
7556 i.rm.mode = 3;
7557
1ef99a7b 7558 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
7559 i.rm.regmem = i.op[1].regs->reg_num;
7560 else
7561 i.rm.regmem = i.op[0].regs->reg_num;
7562
7563 if ((i.op[1].regs->reg_flags & RegRex) != 0)
7564 i.rex |= REX_B;
7565 }
7566 }
2426c15f 7567 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
7568 {
7569 i.vex.register_specifier = i.op[2].regs;
7570 if (!i.mem_operands)
7571 {
7572 i.rm.mode = 3;
7573 i.rm.regmem = i.op[1].regs->reg_num;
7574 if ((i.op[1].regs->reg_flags & RegRex) != 0)
7575 i.rex |= REX_B;
7576 }
7577 }
29b0f896
AM
7578 /* Fill in i.rm.reg or i.rm.regmem field with register operand
7579 (if any) based on i.tm.extension_opcode. Again, we must be
7580 careful to make sure that segment/control/debug/test/MMX
7581 registers are coded into the i.rm.reg field. */
f88c9eb0 7582 else if (i.reg_operands)
29b0f896 7583 {
99018f42 7584 unsigned int op;
7ab9ffdd
L
7585 unsigned int vex_reg = ~0;
7586
7587 for (op = 0; op < i.operands; op++)
b4a3a7b4
L
7588 {
7589 if (i.types[op].bitfield.reg
7590 || i.types[op].bitfield.regbnd
7591 || i.types[op].bitfield.regmask
7592 || i.types[op].bitfield.sreg2
7593 || i.types[op].bitfield.sreg3
7594 || i.types[op].bitfield.control
7595 || i.types[op].bitfield.debug
7596 || i.types[op].bitfield.test)
7597 break;
7598 if (i.types[op].bitfield.regsimd)
7599 {
7600 if (i.types[op].bitfield.zmmword)
7601 i.has_regzmm = TRUE;
7602 else if (i.types[op].bitfield.ymmword)
7603 i.has_regymm = TRUE;
7604 else
7605 i.has_regxmm = TRUE;
7606 break;
7607 }
7608 if (i.types[op].bitfield.regmmx)
7609 {
7610 i.has_regmmx = TRUE;
7611 break;
7612 }
7613 }
c0209578 7614
7ab9ffdd
L
7615 if (vex_3_sources)
7616 op = dest;
2426c15f 7617 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
7618 {
7619 /* For instructions with VexNDS, the register-only
7620 source operand is encoded in VEX prefix. */
7621 gas_assert (mem != (unsigned int) ~0);
c0f3af97 7622
7ab9ffdd 7623 if (op > mem)
c0f3af97 7624 {
7ab9ffdd
L
7625 vex_reg = op++;
7626 gas_assert (op < i.operands);
c0f3af97
L
7627 }
7628 else
c0f3af97 7629 {
f12dc422
L
7630 /* Check register-only source operand when two source
7631 operands are swapped. */
7632 if (!i.tm.operand_types[op].bitfield.baseindex
7633 && i.tm.operand_types[op + 1].bitfield.baseindex)
7634 {
7635 vex_reg = op;
7636 op += 2;
7637 gas_assert (mem == (vex_reg + 1)
7638 && op < i.operands);
7639 }
7640 else
7641 {
7642 vex_reg = op + 1;
7643 gas_assert (vex_reg < i.operands);
7644 }
c0f3af97 7645 }
7ab9ffdd 7646 }
2426c15f 7647 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 7648 {
f12dc422 7649 /* For instructions with VexNDD, the register destination
7ab9ffdd 7650 is encoded in VEX prefix. */
f12dc422
L
7651 if (i.mem_operands == 0)
7652 {
7653 /* There is no memory operand. */
7654 gas_assert ((op + 2) == i.operands);
7655 vex_reg = op + 1;
7656 }
7657 else
8d63c93e 7658 {
ed438a93
JB
7659 /* There are only 2 non-immediate operands. */
7660 gas_assert (op < i.imm_operands + 2
7661 && i.operands == i.imm_operands + 2);
7662 vex_reg = i.imm_operands + 1;
f12dc422 7663 }
7ab9ffdd
L
7664 }
7665 else
7666 gas_assert (op < i.operands);
99018f42 7667
7ab9ffdd
L
7668 if (vex_reg != (unsigned int) ~0)
7669 {
f12dc422 7670 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 7671
dc821c5f
JB
7672 if ((!type->bitfield.reg
7673 || (!type->bitfield.dword && !type->bitfield.qword))
10c17abd 7674 && !type->bitfield.regsimd
43234a1e 7675 && !operand_type_equal (type, &regmask))
7ab9ffdd 7676 abort ();
f88c9eb0 7677
7ab9ffdd
L
7678 i.vex.register_specifier = i.op[vex_reg].regs;
7679 }
7680
1b9f0c97
L
7681 /* Don't set OP operand twice. */
7682 if (vex_reg != op)
7ab9ffdd 7683 {
1b9f0c97
L
7684 /* If there is an extension opcode to put here, the
7685 register number must be put into the regmem field. */
7686 if (i.tm.extension_opcode != None)
7687 {
7688 i.rm.regmem = i.op[op].regs->reg_num;
7689 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7690 i.rex |= REX_B;
43234a1e
L
7691 if ((i.op[op].regs->reg_flags & RegVRex) != 0)
7692 i.vrex |= REX_B;
1b9f0c97
L
7693 }
7694 else
7695 {
7696 i.rm.reg = i.op[op].regs->reg_num;
7697 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7698 i.rex |= REX_R;
43234a1e
L
7699 if ((i.op[op].regs->reg_flags & RegVRex) != 0)
7700 i.vrex |= REX_R;
1b9f0c97 7701 }
7ab9ffdd 7702 }
252b5132 7703
29b0f896
AM
7704 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
7705 must set it to 3 to indicate this is a register operand
7706 in the regmem field. */
7707 if (!i.mem_operands)
7708 i.rm.mode = 3;
7709 }
252b5132 7710
29b0f896 7711 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 7712 if (i.tm.extension_opcode != None)
29b0f896
AM
7713 i.rm.reg = i.tm.extension_opcode;
7714 }
7715 return default_seg;
7716}
252b5132 7717
29b0f896 7718static void
e3bb37b5 7719output_branch (void)
29b0f896
AM
7720{
7721 char *p;
f8a5c266 7722 int size;
29b0f896
AM
7723 int code16;
7724 int prefix;
7725 relax_substateT subtype;
7726 symbolS *sym;
7727 offsetT off;
7728
f8a5c266 7729 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 7730 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
7731
7732 prefix = 0;
7733 if (i.prefix[DATA_PREFIX] != 0)
252b5132 7734 {
29b0f896
AM
7735 prefix = 1;
7736 i.prefixes -= 1;
7737 code16 ^= CODE16;
252b5132 7738 }
29b0f896
AM
7739 /* Pentium4 branch hints. */
7740 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
7741 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 7742 {
29b0f896
AM
7743 prefix++;
7744 i.prefixes--;
7745 }
7746 if (i.prefix[REX_PREFIX] != 0)
7747 {
7748 prefix++;
7749 i.prefixes--;
2f66722d
AM
7750 }
7751
7e8b059b
L
7752 /* BND prefixed jump. */
7753 if (i.prefix[BND_PREFIX] != 0)
7754 {
7755 FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
7756 i.prefixes -= 1;
7757 }
7758
29b0f896
AM
7759 if (i.prefixes != 0 && !intel_syntax)
7760 as_warn (_("skipping prefixes on this instruction"));
7761
7762 /* It's always a symbol; End frag & setup for relax.
7763 Make sure there is enough room in this frag for the largest
7764 instruction we may generate in md_convert_frag. This is 2
7765 bytes for the opcode and room for the prefix and largest
7766 displacement. */
7767 frag_grow (prefix + 2 + 4);
7768 /* Prefix and 1 opcode byte go in fr_fix. */
7769 p = frag_more (prefix + 1);
7770 if (i.prefix[DATA_PREFIX] != 0)
7771 *p++ = DATA_PREFIX_OPCODE;
7772 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
7773 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
7774 *p++ = i.prefix[SEG_PREFIX];
7775 if (i.prefix[REX_PREFIX] != 0)
7776 *p++ = i.prefix[REX_PREFIX];
7777 *p = i.tm.base_opcode;
7778
7779 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 7780 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 7781 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 7782 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 7783 else
f8a5c266 7784 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 7785 subtype |= code16;
3e73aa7c 7786
29b0f896
AM
7787 sym = i.op[0].disps->X_add_symbol;
7788 off = i.op[0].disps->X_add_number;
3e73aa7c 7789
29b0f896
AM
7790 if (i.op[0].disps->X_op != O_constant
7791 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 7792 {
29b0f896
AM
7793 /* Handle complex expressions. */
7794 sym = make_expr_symbol (i.op[0].disps);
7795 off = 0;
7796 }
3e73aa7c 7797
29b0f896
AM
7798 /* 1 possible extra opcode + 4 byte displacement go in var part.
7799 Pass reloc in fr_var. */
d258b828 7800 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 7801}
3e73aa7c 7802
bd7ab16b
L
7803#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7804/* Return TRUE iff PLT32 relocation should be used for branching to
7805 symbol S. */
7806
7807static bfd_boolean
7808need_plt32_p (symbolS *s)
7809{
7810 /* PLT32 relocation is ELF only. */
7811 if (!IS_ELF)
7812 return FALSE;
7813
a5def729
RO
7814#ifdef TE_SOLARIS
7815 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
7816 krtld support it. */
7817 return FALSE;
7818#endif
7819
bd7ab16b
L
7820 /* Since there is no need to prepare for PLT branch on x86-64, we
7821 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
7822 be used as a marker for 32-bit PC-relative branches. */
7823 if (!object_64bit)
7824 return FALSE;
7825
7826 /* Weak or undefined symbol need PLT32 relocation. */
7827 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
7828 return TRUE;
7829
7830 /* Non-global symbol doesn't need PLT32 relocation. */
7831 if (! S_IS_EXTERNAL (s))
7832 return FALSE;
7833
7834 /* Other global symbols need PLT32 relocation. NB: Symbol with
7835 non-default visibilities are treated as normal global symbol
7836 so that PLT32 relocation can be used as a marker for 32-bit
7837 PC-relative branches. It is useful for linker relaxation. */
7838 return TRUE;
7839}
7840#endif
7841
29b0f896 7842static void
e3bb37b5 7843output_jump (void)
29b0f896
AM
7844{
7845 char *p;
7846 int size;
3e02c1cc 7847 fixS *fixP;
bd7ab16b 7848 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 7849
40fb9820 7850 if (i.tm.opcode_modifier.jumpbyte)
29b0f896
AM
7851 {
7852 /* This is a loop or jecxz type instruction. */
7853 size = 1;
7854 if (i.prefix[ADDR_PREFIX] != 0)
7855 {
7856 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
7857 i.prefixes -= 1;
7858 }
7859 /* Pentium4 branch hints. */
7860 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
7861 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
7862 {
7863 FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
7864 i.prefixes--;
3e73aa7c
JH
7865 }
7866 }
29b0f896
AM
7867 else
7868 {
7869 int code16;
3e73aa7c 7870
29b0f896
AM
7871 code16 = 0;
7872 if (flag_code == CODE_16BIT)
7873 code16 = CODE16;
3e73aa7c 7874
29b0f896
AM
7875 if (i.prefix[DATA_PREFIX] != 0)
7876 {
7877 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
7878 i.prefixes -= 1;
7879 code16 ^= CODE16;
7880 }
252b5132 7881
29b0f896
AM
7882 size = 4;
7883 if (code16)
7884 size = 2;
7885 }
9fcc94b6 7886
29b0f896
AM
7887 if (i.prefix[REX_PREFIX] != 0)
7888 {
7889 FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
7890 i.prefixes -= 1;
7891 }
252b5132 7892
7e8b059b
L
7893 /* BND prefixed jump. */
7894 if (i.prefix[BND_PREFIX] != 0)
7895 {
7896 FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
7897 i.prefixes -= 1;
7898 }
7899
29b0f896
AM
7900 if (i.prefixes != 0 && !intel_syntax)
7901 as_warn (_("skipping prefixes on this instruction"));
e0890092 7902
42164a71
L
7903 p = frag_more (i.tm.opcode_length + size);
7904 switch (i.tm.opcode_length)
7905 {
7906 case 2:
7907 *p++ = i.tm.base_opcode >> 8;
1a0670f3 7908 /* Fall through. */
42164a71
L
7909 case 1:
7910 *p++ = i.tm.base_opcode;
7911 break;
7912 default:
7913 abort ();
7914 }
e0890092 7915
bd7ab16b
L
7916#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7917 if (size == 4
7918 && jump_reloc == NO_RELOC
7919 && need_plt32_p (i.op[0].disps->X_add_symbol))
7920 jump_reloc = BFD_RELOC_X86_64_PLT32;
7921#endif
7922
7923 jump_reloc = reloc (size, 1, 1, jump_reloc);
7924
3e02c1cc 7925 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 7926 i.op[0].disps, 1, jump_reloc);
3e02c1cc
AM
7927
7928 /* All jumps handled here are signed, but don't use a signed limit
7929 check for 32 and 16 bit jumps as we want to allow wrap around at
7930 4G and 64k respectively. */
7931 if (size == 1)
7932 fixP->fx_signed = 1;
29b0f896 7933}
e0890092 7934
29b0f896 7935static void
e3bb37b5 7936output_interseg_jump (void)
29b0f896
AM
7937{
7938 char *p;
7939 int size;
7940 int prefix;
7941 int code16;
252b5132 7942
29b0f896
AM
7943 code16 = 0;
7944 if (flag_code == CODE_16BIT)
7945 code16 = CODE16;
a217f122 7946
29b0f896
AM
7947 prefix = 0;
7948 if (i.prefix[DATA_PREFIX] != 0)
7949 {
7950 prefix = 1;
7951 i.prefixes -= 1;
7952 code16 ^= CODE16;
7953 }
7954 if (i.prefix[REX_PREFIX] != 0)
7955 {
7956 prefix++;
7957 i.prefixes -= 1;
7958 }
252b5132 7959
29b0f896
AM
7960 size = 4;
7961 if (code16)
7962 size = 2;
252b5132 7963
29b0f896
AM
7964 if (i.prefixes != 0 && !intel_syntax)
7965 as_warn (_("skipping prefixes on this instruction"));
252b5132 7966
29b0f896
AM
7967 /* 1 opcode; 2 segment; offset */
7968 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 7969
29b0f896
AM
7970 if (i.prefix[DATA_PREFIX] != 0)
7971 *p++ = DATA_PREFIX_OPCODE;
252b5132 7972
29b0f896
AM
7973 if (i.prefix[REX_PREFIX] != 0)
7974 *p++ = i.prefix[REX_PREFIX];
252b5132 7975
29b0f896
AM
7976 *p++ = i.tm.base_opcode;
7977 if (i.op[1].imms->X_op == O_constant)
7978 {
7979 offsetT n = i.op[1].imms->X_add_number;
252b5132 7980
29b0f896
AM
7981 if (size == 2
7982 && !fits_in_unsigned_word (n)
7983 && !fits_in_signed_word (n))
7984 {
7985 as_bad (_("16-bit jump out of range"));
7986 return;
7987 }
7988 md_number_to_chars (p, n, size);
7989 }
7990 else
7991 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 7992 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
29b0f896
AM
7993 if (i.op[0].imms->X_op != O_constant)
7994 as_bad (_("can't handle non absolute segment in `%s'"),
7995 i.tm.name);
7996 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
7997}
a217f122 7998
b4a3a7b4
L
7999#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8000void
8001x86_cleanup (void)
8002{
8003 char *p;
8004 asection *seg = now_seg;
8005 subsegT subseg = now_subseg;
8006 asection *sec;
8007 unsigned int alignment, align_size_1;
8008 unsigned int isa_1_descsz, feature_2_descsz, descsz;
8009 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
8010 unsigned int padding;
8011
8012 if (!IS_ELF || !x86_used_note)
8013 return;
8014
b4a3a7b4
L
8015 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
8016
8017 /* The .note.gnu.property section layout:
8018
8019 Field Length Contents
8020 ---- ---- ----
8021 n_namsz 4 4
8022 n_descsz 4 The note descriptor size
8023 n_type 4 NT_GNU_PROPERTY_TYPE_0
8024 n_name 4 "GNU"
8025 n_desc n_descsz The program property array
8026 .... .... ....
8027 */
8028
8029 /* Create the .note.gnu.property section. */
8030 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
8031 bfd_set_section_flags (stdoutput, sec,
8032 (SEC_ALLOC
8033 | SEC_LOAD
8034 | SEC_DATA
8035 | SEC_HAS_CONTENTS
8036 | SEC_READONLY));
8037
8038 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
8039 {
8040 align_size_1 = 7;
8041 alignment = 3;
8042 }
8043 else
8044 {
8045 align_size_1 = 3;
8046 alignment = 2;
8047 }
8048
8049 bfd_set_section_alignment (stdoutput, sec, alignment);
8050 elf_section_type (sec) = SHT_NOTE;
8051
8052 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
8053 + 4-byte data */
8054 isa_1_descsz_raw = 4 + 4 + 4;
8055 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
8056 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
8057
8058 feature_2_descsz_raw = isa_1_descsz;
8059 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
8060 + 4-byte data */
8061 feature_2_descsz_raw += 4 + 4 + 4;
8062 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
8063 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
8064 & ~align_size_1);
8065
8066 descsz = feature_2_descsz;
8067 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
8068 p = frag_more (4 + 4 + 4 + 4 + descsz);
8069
8070 /* Write n_namsz. */
8071 md_number_to_chars (p, (valueT) 4, 4);
8072
8073 /* Write n_descsz. */
8074 md_number_to_chars (p + 4, (valueT) descsz, 4);
8075
8076 /* Write n_type. */
8077 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
8078
8079 /* Write n_name. */
8080 memcpy (p + 4 * 3, "GNU", 4);
8081
8082 /* Write 4-byte type. */
8083 md_number_to_chars (p + 4 * 4,
8084 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
8085
8086 /* Write 4-byte data size. */
8087 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
8088
8089 /* Write 4-byte data. */
8090 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
8091
8092 /* Zero out paddings. */
8093 padding = isa_1_descsz - isa_1_descsz_raw;
8094 if (padding)
8095 memset (p + 4 * 7, 0, padding);
8096
8097 /* Write 4-byte type. */
8098 md_number_to_chars (p + isa_1_descsz + 4 * 4,
8099 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
8100
8101 /* Write 4-byte data size. */
8102 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
8103
8104 /* Write 4-byte data. */
8105 md_number_to_chars (p + isa_1_descsz + 4 * 6,
8106 (valueT) x86_feature_2_used, 4);
8107
8108 /* Zero out paddings. */
8109 padding = feature_2_descsz - feature_2_descsz_raw;
8110 if (padding)
8111 memset (p + isa_1_descsz + 4 * 7, 0, padding);
8112
8113 /* We probably can't restore the current segment, for there likely
8114 isn't one yet... */
8115 if (seg && subseg)
8116 subseg_set (seg, subseg);
8117}
8118#endif
8119
29b0f896 8120static void
e3bb37b5 8121output_insn (void)
29b0f896 8122{
2bbd9c25
JJ
8123 fragS *insn_start_frag;
8124 offsetT insn_start_off;
8125
b4a3a7b4
L
8126#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8127 if (IS_ELF && x86_used_note)
8128 {
8129 if (i.tm.cpu_flags.bitfield.cpucmov)
8130 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_CMOV;
8131 if (i.tm.cpu_flags.bitfield.cpusse)
8132 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE;
8133 if (i.tm.cpu_flags.bitfield.cpusse2)
8134 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE2;
8135 if (i.tm.cpu_flags.bitfield.cpusse3)
8136 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE3;
8137 if (i.tm.cpu_flags.bitfield.cpussse3)
8138 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSSE3;
8139 if (i.tm.cpu_flags.bitfield.cpusse4_1)
8140 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_1;
8141 if (i.tm.cpu_flags.bitfield.cpusse4_2)
8142 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_2;
8143 if (i.tm.cpu_flags.bitfield.cpuavx)
8144 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX;
8145 if (i.tm.cpu_flags.bitfield.cpuavx2)
8146 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX2;
8147 if (i.tm.cpu_flags.bitfield.cpufma)
8148 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_FMA;
8149 if (i.tm.cpu_flags.bitfield.cpuavx512f)
8150 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512F;
8151 if (i.tm.cpu_flags.bitfield.cpuavx512cd)
8152 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512CD;
8153 if (i.tm.cpu_flags.bitfield.cpuavx512er)
8154 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512ER;
8155 if (i.tm.cpu_flags.bitfield.cpuavx512pf)
8156 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512PF;
8157 if (i.tm.cpu_flags.bitfield.cpuavx512vl)
8158 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512VL;
8159 if (i.tm.cpu_flags.bitfield.cpuavx512dq)
8160 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512DQ;
8161 if (i.tm.cpu_flags.bitfield.cpuavx512bw)
8162 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512BW;
8163 if (i.tm.cpu_flags.bitfield.cpuavx512_4fmaps)
8164 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS;
8165 if (i.tm.cpu_flags.bitfield.cpuavx512_4vnniw)
8166 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW;
8167 if (i.tm.cpu_flags.bitfield.cpuavx512_bitalg)
8168 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BITALG;
8169 if (i.tm.cpu_flags.bitfield.cpuavx512ifma)
8170 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_IFMA;
8171 if (i.tm.cpu_flags.bitfield.cpuavx512vbmi)
8172 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI;
8173 if (i.tm.cpu_flags.bitfield.cpuavx512_vbmi2)
8174 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2;
8175 if (i.tm.cpu_flags.bitfield.cpuavx512_vnni)
8176 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VNNI;
462cac58
L
8177 if (i.tm.cpu_flags.bitfield.cpuavx512_bf16)
8178 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BF16;
b4a3a7b4
L
8179
8180 if (i.tm.cpu_flags.bitfield.cpu8087
8181 || i.tm.cpu_flags.bitfield.cpu287
8182 || i.tm.cpu_flags.bitfield.cpu387
8183 || i.tm.cpu_flags.bitfield.cpu687
8184 || i.tm.cpu_flags.bitfield.cpufisttp)
8185 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
8186 /* Don't set GNU_PROPERTY_X86_FEATURE_2_MMX for prefetchtXXX nor
8187 Xfence instructions. */
8188 if (i.tm.base_opcode != 0xf18
8189 && i.tm.base_opcode != 0xf0d
8190 && i.tm.base_opcode != 0xfae
8191 && (i.has_regmmx
8192 || i.tm.cpu_flags.bitfield.cpummx
8193 || i.tm.cpu_flags.bitfield.cpua3dnow
8194 || i.tm.cpu_flags.bitfield.cpua3dnowa))
8195 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
8196 if (i.has_regxmm)
8197 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
8198 if (i.has_regymm)
8199 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
8200 if (i.has_regzmm)
8201 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
8202 if (i.tm.cpu_flags.bitfield.cpufxsr)
8203 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
8204 if (i.tm.cpu_flags.bitfield.cpuxsave)
8205 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
8206 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
8207 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
8208 if (i.tm.cpu_flags.bitfield.cpuxsavec)
8209 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
8210 }
8211#endif
8212
29b0f896
AM
8213 /* Tie dwarf2 debug info to the address at the start of the insn.
8214 We can't do this after the insn has been output as the current
8215 frag may have been closed off. eg. by frag_var. */
8216 dwarf2_emit_insn (0);
8217
2bbd9c25
JJ
8218 insn_start_frag = frag_now;
8219 insn_start_off = frag_now_fix ();
8220
29b0f896 8221 /* Output jumps. */
40fb9820 8222 if (i.tm.opcode_modifier.jump)
29b0f896 8223 output_branch ();
40fb9820
L
8224 else if (i.tm.opcode_modifier.jumpbyte
8225 || i.tm.opcode_modifier.jumpdword)
29b0f896 8226 output_jump ();
40fb9820 8227 else if (i.tm.opcode_modifier.jumpintersegment)
29b0f896
AM
8228 output_interseg_jump ();
8229 else
8230 {
8231 /* Output normal instructions here. */
8232 char *p;
8233 unsigned char *q;
47465058 8234 unsigned int j;
331d2d0d 8235 unsigned int prefix;
4dffcebc 8236
e4e00185
AS
8237 if (avoid_fence
8238 && i.tm.base_opcode == 0xfae
8239 && i.operands == 1
8240 && i.imm_operands == 1
8241 && (i.op[0].imms->X_add_number == 0xe8
8242 || i.op[0].imms->X_add_number == 0xf0
8243 || i.op[0].imms->X_add_number == 0xf8))
8244 {
8245 /* Encode lfence, mfence, and sfence as
8246 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
8247 offsetT val = 0x240483f0ULL;
8248 p = frag_more (5);
8249 md_number_to_chars (p, val, 5);
8250 return;
8251 }
8252
d022bddd
IT
8253 /* Some processors fail on LOCK prefix. This options makes
8254 assembler ignore LOCK prefix and serves as a workaround. */
8255 if (omit_lock_prefix)
8256 {
8257 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE)
8258 return;
8259 i.prefix[LOCK_PREFIX] = 0;
8260 }
8261
43234a1e
L
8262 /* Since the VEX/EVEX prefix contains the implicit prefix, we
8263 don't need the explicit prefix. */
8264 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 8265 {
c0f3af97 8266 switch (i.tm.opcode_length)
bc4bd9ab 8267 {
c0f3af97
L
8268 case 3:
8269 if (i.tm.base_opcode & 0xff000000)
4dffcebc 8270 {
c0f3af97 8271 prefix = (i.tm.base_opcode >> 24) & 0xff;
bd59a631 8272 add_prefix (prefix);
c0f3af97
L
8273 }
8274 break;
8275 case 2:
8276 if ((i.tm.base_opcode & 0xff0000) != 0)
8277 {
8278 prefix = (i.tm.base_opcode >> 16) & 0xff;
bd59a631
JB
8279 if (!i.tm.cpu_flags.bitfield.cpupadlock
8280 || prefix != REPE_PREFIX_OPCODE
8281 || (i.prefix[REP_PREFIX] != REPE_PREFIX_OPCODE))
4dffcebc
L
8282 add_prefix (prefix);
8283 }
c0f3af97
L
8284 break;
8285 case 1:
8286 break;
390c91cf
L
8287 case 0:
8288 /* Check for pseudo prefixes. */
8289 as_bad_where (insn_start_frag->fr_file,
8290 insn_start_frag->fr_line,
8291 _("pseudo prefix without instruction"));
8292 return;
c0f3af97
L
8293 default:
8294 abort ();
bc4bd9ab 8295 }
c0f3af97 8296
6d19a37a 8297#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
8298 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
8299 R_X86_64_GOTTPOFF relocation so that linker can safely
8300 perform IE->LE optimization. */
8301 if (x86_elf_abi == X86_64_X32_ABI
8302 && i.operands == 2
8303 && i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
8304 && i.prefix[REX_PREFIX] == 0)
8305 add_prefix (REX_OPCODE);
6d19a37a 8306#endif
cf61b747 8307
c0f3af97
L
8308 /* The prefix bytes. */
8309 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
8310 if (*q)
8311 FRAG_APPEND_1_CHAR (*q);
0f10071e 8312 }
ae5c1c7b 8313 else
c0f3af97
L
8314 {
8315 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
8316 if (*q)
8317 switch (j)
8318 {
8319 case REX_PREFIX:
8320 /* REX byte is encoded in VEX prefix. */
8321 break;
8322 case SEG_PREFIX:
8323 case ADDR_PREFIX:
8324 FRAG_APPEND_1_CHAR (*q);
8325 break;
8326 default:
8327 /* There should be no other prefixes for instructions
8328 with VEX prefix. */
8329 abort ();
8330 }
8331
43234a1e
L
8332 /* For EVEX instructions i.vrex should become 0 after
8333 build_evex_prefix. For VEX instructions upper 16 registers
8334 aren't available, so VREX should be 0. */
8335 if (i.vrex)
8336 abort ();
c0f3af97
L
8337 /* Now the VEX prefix. */
8338 p = frag_more (i.vex.length);
8339 for (j = 0; j < i.vex.length; j++)
8340 p[j] = i.vex.bytes[j];
8341 }
252b5132 8342
29b0f896 8343 /* Now the opcode; be careful about word order here! */
4dffcebc 8344 if (i.tm.opcode_length == 1)
29b0f896
AM
8345 {
8346 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
8347 }
8348 else
8349 {
4dffcebc 8350 switch (i.tm.opcode_length)
331d2d0d 8351 {
43234a1e
L
8352 case 4:
8353 p = frag_more (4);
8354 *p++ = (i.tm.base_opcode >> 24) & 0xff;
8355 *p++ = (i.tm.base_opcode >> 16) & 0xff;
8356 break;
4dffcebc 8357 case 3:
331d2d0d
L
8358 p = frag_more (3);
8359 *p++ = (i.tm.base_opcode >> 16) & 0xff;
4dffcebc
L
8360 break;
8361 case 2:
8362 p = frag_more (2);
8363 break;
8364 default:
8365 abort ();
8366 break;
331d2d0d 8367 }
0f10071e 8368
29b0f896
AM
8369 /* Put out high byte first: can't use md_number_to_chars! */
8370 *p++ = (i.tm.base_opcode >> 8) & 0xff;
8371 *p = i.tm.base_opcode & 0xff;
8372 }
3e73aa7c 8373
29b0f896 8374 /* Now the modrm byte and sib byte (if present). */
40fb9820 8375 if (i.tm.opcode_modifier.modrm)
29b0f896 8376 {
4a3523fa
L
8377 FRAG_APPEND_1_CHAR ((i.rm.regmem << 0
8378 | i.rm.reg << 3
8379 | i.rm.mode << 6));
29b0f896
AM
8380 /* If i.rm.regmem == ESP (4)
8381 && i.rm.mode != (Register mode)
8382 && not 16 bit
8383 ==> need second modrm byte. */
8384 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
8385 && i.rm.mode != 3
dc821c5f 8386 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
4a3523fa
L
8387 FRAG_APPEND_1_CHAR ((i.sib.base << 0
8388 | i.sib.index << 3
8389 | i.sib.scale << 6));
29b0f896 8390 }
3e73aa7c 8391
29b0f896 8392 if (i.disp_operands)
2bbd9c25 8393 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 8394
29b0f896 8395 if (i.imm_operands)
2bbd9c25 8396 output_imm (insn_start_frag, insn_start_off);
29b0f896 8397 }
252b5132 8398
29b0f896
AM
8399#ifdef DEBUG386
8400 if (flag_debug)
8401 {
7b81dfbb 8402 pi ("" /*line*/, &i);
29b0f896
AM
8403 }
8404#endif /* DEBUG386 */
8405}
252b5132 8406
e205caa7
L
8407/* Return the size of the displacement operand N. */
8408
8409static int
8410disp_size (unsigned int n)
8411{
8412 int size = 4;
43234a1e 8413
b5014f7a 8414 if (i.types[n].bitfield.disp64)
40fb9820
L
8415 size = 8;
8416 else if (i.types[n].bitfield.disp8)
8417 size = 1;
8418 else if (i.types[n].bitfield.disp16)
8419 size = 2;
e205caa7
L
8420 return size;
8421}
8422
8423/* Return the size of the immediate operand N. */
8424
8425static int
8426imm_size (unsigned int n)
8427{
8428 int size = 4;
40fb9820
L
8429 if (i.types[n].bitfield.imm64)
8430 size = 8;
8431 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
8432 size = 1;
8433 else if (i.types[n].bitfield.imm16)
8434 size = 2;
e205caa7
L
8435 return size;
8436}
8437
29b0f896 8438static void
64e74474 8439output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
8440{
8441 char *p;
8442 unsigned int n;
252b5132 8443
29b0f896
AM
8444 for (n = 0; n < i.operands; n++)
8445 {
b5014f7a 8446 if (operand_type_check (i.types[n], disp))
29b0f896
AM
8447 {
8448 if (i.op[n].disps->X_op == O_constant)
8449 {
e205caa7 8450 int size = disp_size (n);
43234a1e 8451 offsetT val = i.op[n].disps->X_add_number;
252b5132 8452
629cfaf1
JB
8453 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
8454 size);
29b0f896
AM
8455 p = frag_more (size);
8456 md_number_to_chars (p, val, size);
8457 }
8458 else
8459 {
f86103b7 8460 enum bfd_reloc_code_real reloc_type;
e205caa7 8461 int size = disp_size (n);
40fb9820 8462 int sign = i.types[n].bitfield.disp32s;
29b0f896 8463 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 8464 fixS *fixP;
29b0f896 8465
e205caa7 8466 /* We can't have 8 bit displacement here. */
9c2799c2 8467 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 8468
29b0f896
AM
8469 /* The PC relative address is computed relative
8470 to the instruction boundary, so in case immediate
8471 fields follows, we need to adjust the value. */
8472 if (pcrel && i.imm_operands)
8473 {
29b0f896 8474 unsigned int n1;
e205caa7 8475 int sz = 0;
252b5132 8476
29b0f896 8477 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 8478 if (operand_type_check (i.types[n1], imm))
252b5132 8479 {
e205caa7
L
8480 /* Only one immediate is allowed for PC
8481 relative address. */
9c2799c2 8482 gas_assert (sz == 0);
e205caa7
L
8483 sz = imm_size (n1);
8484 i.op[n].disps->X_add_number -= sz;
252b5132 8485 }
29b0f896 8486 /* We should find the immediate. */
9c2799c2 8487 gas_assert (sz != 0);
29b0f896 8488 }
520dc8e8 8489
29b0f896 8490 p = frag_more (size);
d258b828 8491 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 8492 if (GOT_symbol
2bbd9c25 8493 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 8494 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
8495 || reloc_type == BFD_RELOC_X86_64_32S
8496 || (reloc_type == BFD_RELOC_64
8497 && object_64bit))
d6ab8113
JB
8498 && (i.op[n].disps->X_op == O_symbol
8499 || (i.op[n].disps->X_op == O_add
8500 && ((symbol_get_value_expression
8501 (i.op[n].disps->X_op_symbol)->X_op)
8502 == O_subtract))))
8503 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25
JJ
8504 {
8505 offsetT add;
8506
8507 if (insn_start_frag == frag_now)
8508 add = (p - frag_now->fr_literal) - insn_start_off;
8509 else
8510 {
8511 fragS *fr;
8512
8513 add = insn_start_frag->fr_fix - insn_start_off;
8514 for (fr = insn_start_frag->fr_next;
8515 fr && fr != frag_now; fr = fr->fr_next)
8516 add += fr->fr_fix;
8517 add += p - frag_now->fr_literal;
8518 }
8519
4fa24527 8520 if (!object_64bit)
7b81dfbb
AJ
8521 {
8522 reloc_type = BFD_RELOC_386_GOTPC;
8523 i.op[n].imms->X_add_number += add;
8524 }
8525 else if (reloc_type == BFD_RELOC_64)
8526 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 8527 else
7b81dfbb
AJ
8528 /* Don't do the adjustment for x86-64, as there
8529 the pcrel addressing is relative to the _next_
8530 insn, and that is taken care of in other code. */
d6ab8113 8531 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 8532 }
02a86693
L
8533 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
8534 size, i.op[n].disps, pcrel,
8535 reloc_type);
8536 /* Check for "call/jmp *mem", "mov mem, %reg",
8537 "test %reg, mem" and "binop mem, %reg" where binop
8538 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
8539 instructions without data prefix. Always generate
8540 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
8541 if (i.prefix[DATA_PREFIX] == 0
8542 && (generate_relax_relocations
8543 || (!object_64bit
8544 && i.rm.mode == 0
8545 && i.rm.regmem == 5))
0cb4071e
L
8546 && (i.rm.mode == 2
8547 || (i.rm.mode == 0 && i.rm.regmem == 5))
02a86693
L
8548 && ((i.operands == 1
8549 && i.tm.base_opcode == 0xff
8550 && (i.rm.reg == 2 || i.rm.reg == 4))
8551 || (i.operands == 2
8552 && (i.tm.base_opcode == 0x8b
8553 || i.tm.base_opcode == 0x85
8554 || (i.tm.base_opcode & 0xc7) == 0x03))))
8555 {
8556 if (object_64bit)
8557 {
8558 fixP->fx_tcbit = i.rex != 0;
8559 if (i.base_reg
e968fc9b 8560 && (i.base_reg->reg_num == RegIP))
02a86693
L
8561 fixP->fx_tcbit2 = 1;
8562 }
8563 else
8564 fixP->fx_tcbit2 = 1;
8565 }
29b0f896
AM
8566 }
8567 }
8568 }
8569}
252b5132 8570
29b0f896 8571static void
64e74474 8572output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
8573{
8574 char *p;
8575 unsigned int n;
252b5132 8576
29b0f896
AM
8577 for (n = 0; n < i.operands; n++)
8578 {
43234a1e
L
8579 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
8580 if (i.rounding && (int) n == i.rounding->operand)
8581 continue;
8582
40fb9820 8583 if (operand_type_check (i.types[n], imm))
29b0f896
AM
8584 {
8585 if (i.op[n].imms->X_op == O_constant)
8586 {
e205caa7 8587 int size = imm_size (n);
29b0f896 8588 offsetT val;
b4cac588 8589
29b0f896
AM
8590 val = offset_in_range (i.op[n].imms->X_add_number,
8591 size);
8592 p = frag_more (size);
8593 md_number_to_chars (p, val, size);
8594 }
8595 else
8596 {
8597 /* Not absolute_section.
8598 Need a 32-bit fixup (don't support 8bit
8599 non-absolute imms). Try to support other
8600 sizes ... */
f86103b7 8601 enum bfd_reloc_code_real reloc_type;
e205caa7
L
8602 int size = imm_size (n);
8603 int sign;
29b0f896 8604
40fb9820 8605 if (i.types[n].bitfield.imm32s
a7d61044 8606 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 8607 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 8608 sign = 1;
e205caa7
L
8609 else
8610 sign = 0;
520dc8e8 8611
29b0f896 8612 p = frag_more (size);
d258b828 8613 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 8614
2bbd9c25
JJ
8615 /* This is tough to explain. We end up with this one if we
8616 * have operands that look like
8617 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
8618 * obtain the absolute address of the GOT, and it is strongly
8619 * preferable from a performance point of view to avoid using
8620 * a runtime relocation for this. The actual sequence of
8621 * instructions often look something like:
8622 *
8623 * call .L66
8624 * .L66:
8625 * popl %ebx
8626 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
8627 *
8628 * The call and pop essentially return the absolute address
8629 * of the label .L66 and store it in %ebx. The linker itself
8630 * will ultimately change the first operand of the addl so
8631 * that %ebx points to the GOT, but to keep things simple, the
8632 * .o file must have this operand set so that it generates not
8633 * the absolute address of .L66, but the absolute address of
8634 * itself. This allows the linker itself simply treat a GOTPC
8635 * relocation as asking for a pcrel offset to the GOT to be
8636 * added in, and the addend of the relocation is stored in the
8637 * operand field for the instruction itself.
8638 *
8639 * Our job here is to fix the operand so that it would add
8640 * the correct offset so that %ebx would point to itself. The
8641 * thing that is tricky is that .-.L66 will point to the
8642 * beginning of the instruction, so we need to further modify
8643 * the operand so that it will point to itself. There are
8644 * other cases where you have something like:
8645 *
8646 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
8647 *
8648 * and here no correction would be required. Internally in
8649 * the assembler we treat operands of this form as not being
8650 * pcrel since the '.' is explicitly mentioned, and I wonder
8651 * whether it would simplify matters to do it this way. Who
8652 * knows. In earlier versions of the PIC patches, the
8653 * pcrel_adjust field was used to store the correction, but
8654 * since the expression is not pcrel, I felt it would be
8655 * confusing to do it this way. */
8656
d6ab8113 8657 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
8658 || reloc_type == BFD_RELOC_X86_64_32S
8659 || reloc_type == BFD_RELOC_64)
29b0f896
AM
8660 && GOT_symbol
8661 && GOT_symbol == i.op[n].imms->X_add_symbol
8662 && (i.op[n].imms->X_op == O_symbol
8663 || (i.op[n].imms->X_op == O_add
8664 && ((symbol_get_value_expression
8665 (i.op[n].imms->X_op_symbol)->X_op)
8666 == O_subtract))))
8667 {
2bbd9c25
JJ
8668 offsetT add;
8669
8670 if (insn_start_frag == frag_now)
8671 add = (p - frag_now->fr_literal) - insn_start_off;
8672 else
8673 {
8674 fragS *fr;
8675
8676 add = insn_start_frag->fr_fix - insn_start_off;
8677 for (fr = insn_start_frag->fr_next;
8678 fr && fr != frag_now; fr = fr->fr_next)
8679 add += fr->fr_fix;
8680 add += p - frag_now->fr_literal;
8681 }
8682
4fa24527 8683 if (!object_64bit)
d6ab8113 8684 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 8685 else if (size == 4)
d6ab8113 8686 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
8687 else if (size == 8)
8688 reloc_type = BFD_RELOC_X86_64_GOTPC64;
2bbd9c25 8689 i.op[n].imms->X_add_number += add;
29b0f896 8690 }
29b0f896
AM
8691 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
8692 i.op[n].imms, 0, reloc_type);
8693 }
8694 }
8695 }
252b5132
RH
8696}
8697\f
d182319b
JB
8698/* x86_cons_fix_new is called via the expression parsing code when a
8699 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
8700static int cons_sign = -1;
8701
8702void
e3bb37b5 8703x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 8704 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 8705{
d258b828 8706 r = reloc (len, 0, cons_sign, r);
d182319b
JB
8707
8708#ifdef TE_PE
8709 if (exp->X_op == O_secrel)
8710 {
8711 exp->X_op = O_symbol;
8712 r = BFD_RELOC_32_SECREL;
8713 }
8714#endif
8715
8716 fix_new_exp (frag, off, len, exp, 0, r);
8717}
8718
357d1bd8
L
8719/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
8720 purpose of the `.dc.a' internal pseudo-op. */
8721
8722int
8723x86_address_bytes (void)
8724{
8725 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
8726 return 4;
8727 return stdoutput->arch_info->bits_per_address / 8;
8728}
8729
d382c579
TG
8730#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
8731 || defined (LEX_AT)
d258b828 8732# define lex_got(reloc, adjust, types) NULL
718ddfc0 8733#else
f3c180ae
AM
8734/* Parse operands of the form
8735 <symbol>@GOTOFF+<nnn>
8736 and similar .plt or .got references.
8737
8738 If we find one, set up the correct relocation in RELOC and copy the
8739 input string, minus the `@GOTOFF' into a malloc'd buffer for
8740 parsing by the calling routine. Return this buffer, and if ADJUST
8741 is non-null set it to the length of the string we removed from the
8742 input line. Otherwise return NULL. */
8743static char *
91d6fa6a 8744lex_got (enum bfd_reloc_code_real *rel,
64e74474 8745 int *adjust,
d258b828 8746 i386_operand_type *types)
f3c180ae 8747{
7b81dfbb
AJ
8748 /* Some of the relocations depend on the size of what field is to
8749 be relocated. But in our callers i386_immediate and i386_displacement
8750 we don't yet know the operand size (this will be set by insn
8751 matching). Hence we record the word32 relocation here,
8752 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
8753 static const struct {
8754 const char *str;
cff8d58a 8755 int len;
4fa24527 8756 const enum bfd_reloc_code_real rel[2];
40fb9820 8757 const i386_operand_type types64;
f3c180ae 8758 } gotrel[] = {
8ce3d284 8759#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
8760 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
8761 BFD_RELOC_SIZE32 },
8762 OPERAND_TYPE_IMM32_64 },
8ce3d284 8763#endif
cff8d58a
L
8764 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
8765 BFD_RELOC_X86_64_PLTOFF64 },
40fb9820 8766 OPERAND_TYPE_IMM64 },
cff8d58a
L
8767 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
8768 BFD_RELOC_X86_64_PLT32 },
40fb9820 8769 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8770 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
8771 BFD_RELOC_X86_64_GOTPLT64 },
40fb9820 8772 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
8773 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
8774 BFD_RELOC_X86_64_GOTOFF64 },
40fb9820 8775 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
8776 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
8777 BFD_RELOC_X86_64_GOTPCREL },
40fb9820 8778 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8779 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
8780 BFD_RELOC_X86_64_TLSGD },
40fb9820 8781 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8782 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
8783 _dummy_first_bfd_reloc_code_real },
40fb9820 8784 OPERAND_TYPE_NONE },
cff8d58a
L
8785 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
8786 BFD_RELOC_X86_64_TLSLD },
40fb9820 8787 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8788 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
8789 BFD_RELOC_X86_64_GOTTPOFF },
40fb9820 8790 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8791 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
8792 BFD_RELOC_X86_64_TPOFF32 },
40fb9820 8793 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
8794 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
8795 _dummy_first_bfd_reloc_code_real },
40fb9820 8796 OPERAND_TYPE_NONE },
cff8d58a
L
8797 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
8798 BFD_RELOC_X86_64_DTPOFF32 },
40fb9820 8799 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
8800 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
8801 _dummy_first_bfd_reloc_code_real },
40fb9820 8802 OPERAND_TYPE_NONE },
cff8d58a
L
8803 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
8804 _dummy_first_bfd_reloc_code_real },
40fb9820 8805 OPERAND_TYPE_NONE },
cff8d58a
L
8806 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
8807 BFD_RELOC_X86_64_GOT32 },
40fb9820 8808 OPERAND_TYPE_IMM32_32S_64_DISP32 },
cff8d58a
L
8809 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
8810 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
40fb9820 8811 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8812 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
8813 BFD_RELOC_X86_64_TLSDESC_CALL },
40fb9820 8814 OPERAND_TYPE_IMM32_32S_DISP32 },
f3c180ae
AM
8815 };
8816 char *cp;
8817 unsigned int j;
8818
d382c579 8819#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
8820 if (!IS_ELF)
8821 return NULL;
d382c579 8822#endif
718ddfc0 8823
f3c180ae 8824 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 8825 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
8826 return NULL;
8827
47465058 8828 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 8829 {
cff8d58a 8830 int len = gotrel[j].len;
28f81592 8831 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 8832 {
4fa24527 8833 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 8834 {
28f81592
AM
8835 int first, second;
8836 char *tmpbuf, *past_reloc;
f3c180ae 8837
91d6fa6a 8838 *rel = gotrel[j].rel[object_64bit];
f3c180ae 8839
3956db08
JB
8840 if (types)
8841 {
8842 if (flag_code != CODE_64BIT)
40fb9820
L
8843 {
8844 types->bitfield.imm32 = 1;
8845 types->bitfield.disp32 = 1;
8846 }
3956db08
JB
8847 else
8848 *types = gotrel[j].types64;
8849 }
8850
8fd4256d 8851 if (j != 0 && GOT_symbol == NULL)
f3c180ae
AM
8852 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
8853
28f81592 8854 /* The length of the first part of our input line. */
f3c180ae 8855 first = cp - input_line_pointer;
28f81592
AM
8856
8857 /* The second part goes from after the reloc token until
67c11a9b 8858 (and including) an end_of_line char or comma. */
28f81592 8859 past_reloc = cp + 1 + len;
67c11a9b
AM
8860 cp = past_reloc;
8861 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
8862 ++cp;
8863 second = cp + 1 - past_reloc;
28f81592
AM
8864
8865 /* Allocate and copy string. The trailing NUL shouldn't
8866 be necessary, but be safe. */
add39d23 8867 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 8868 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
8869 if (second != 0 && *past_reloc != ' ')
8870 /* Replace the relocation token with ' ', so that
8871 errors like foo@GOTOFF1 will be detected. */
8872 tmpbuf[first++] = ' ';
af89796a
L
8873 else
8874 /* Increment length by 1 if the relocation token is
8875 removed. */
8876 len++;
8877 if (adjust)
8878 *adjust = len;
0787a12d
AM
8879 memcpy (tmpbuf + first, past_reloc, second);
8880 tmpbuf[first + second] = '\0';
f3c180ae
AM
8881 return tmpbuf;
8882 }
8883
4fa24527
JB
8884 as_bad (_("@%s reloc is not supported with %d-bit output format"),
8885 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
8886 return NULL;
8887 }
8888 }
8889
8890 /* Might be a symbol version string. Don't as_bad here. */
8891 return NULL;
8892}
4e4f7c87 8893#endif
f3c180ae 8894
a988325c
NC
8895#ifdef TE_PE
8896#ifdef lex_got
8897#undef lex_got
8898#endif
8899/* Parse operands of the form
8900 <symbol>@SECREL32+<nnn>
8901
8902 If we find one, set up the correct relocation in RELOC and copy the
8903 input string, minus the `@SECREL32' into a malloc'd buffer for
8904 parsing by the calling routine. Return this buffer, and if ADJUST
8905 is non-null set it to the length of the string we removed from the
34bca508
L
8906 input line. Otherwise return NULL.
8907
a988325c
NC
8908 This function is copied from the ELF version above adjusted for PE targets. */
8909
8910static char *
8911lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
8912 int *adjust ATTRIBUTE_UNUSED,
d258b828 8913 i386_operand_type *types)
a988325c
NC
8914{
8915 static const struct
8916 {
8917 const char *str;
8918 int len;
8919 const enum bfd_reloc_code_real rel[2];
8920 const i386_operand_type types64;
8921 }
8922 gotrel[] =
8923 {
8924 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
8925 BFD_RELOC_32_SECREL },
8926 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
8927 };
8928
8929 char *cp;
8930 unsigned j;
8931
8932 for (cp = input_line_pointer; *cp != '@'; cp++)
8933 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
8934 return NULL;
8935
8936 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
8937 {
8938 int len = gotrel[j].len;
8939
8940 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
8941 {
8942 if (gotrel[j].rel[object_64bit] != 0)
8943 {
8944 int first, second;
8945 char *tmpbuf, *past_reloc;
8946
8947 *rel = gotrel[j].rel[object_64bit];
8948 if (adjust)
8949 *adjust = len;
8950
8951 if (types)
8952 {
8953 if (flag_code != CODE_64BIT)
8954 {
8955 types->bitfield.imm32 = 1;
8956 types->bitfield.disp32 = 1;
8957 }
8958 else
8959 *types = gotrel[j].types64;
8960 }
8961
8962 /* The length of the first part of our input line. */
8963 first = cp - input_line_pointer;
8964
8965 /* The second part goes from after the reloc token until
8966 (and including) an end_of_line char or comma. */
8967 past_reloc = cp + 1 + len;
8968 cp = past_reloc;
8969 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
8970 ++cp;
8971 second = cp + 1 - past_reloc;
8972
8973 /* Allocate and copy string. The trailing NUL shouldn't
8974 be necessary, but be safe. */
add39d23 8975 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
8976 memcpy (tmpbuf, input_line_pointer, first);
8977 if (second != 0 && *past_reloc != ' ')
8978 /* Replace the relocation token with ' ', so that
8979 errors like foo@SECLREL321 will be detected. */
8980 tmpbuf[first++] = ' ';
8981 memcpy (tmpbuf + first, past_reloc, second);
8982 tmpbuf[first + second] = '\0';
8983 return tmpbuf;
8984 }
8985
8986 as_bad (_("@%s reloc is not supported with %d-bit output format"),
8987 gotrel[j].str, 1 << (5 + object_64bit));
8988 return NULL;
8989 }
8990 }
8991
8992 /* Might be a symbol version string. Don't as_bad here. */
8993 return NULL;
8994}
8995
8996#endif /* TE_PE */
8997
62ebcb5c 8998bfd_reloc_code_real_type
e3bb37b5 8999x86_cons (expressionS *exp, int size)
f3c180ae 9000{
62ebcb5c
AM
9001 bfd_reloc_code_real_type got_reloc = NO_RELOC;
9002
ee86248c
JB
9003 intel_syntax = -intel_syntax;
9004
3c7b9c2c 9005 exp->X_md = 0;
4fa24527 9006 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
9007 {
9008 /* Handle @GOTOFF and the like in an expression. */
9009 char *save;
9010 char *gotfree_input_line;
4a57f2cf 9011 int adjust = 0;
f3c180ae
AM
9012
9013 save = input_line_pointer;
d258b828 9014 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
9015 if (gotfree_input_line)
9016 input_line_pointer = gotfree_input_line;
9017
9018 expression (exp);
9019
9020 if (gotfree_input_line)
9021 {
9022 /* expression () has merrily parsed up to the end of line,
9023 or a comma - in the wrong buffer. Transfer how far
9024 input_line_pointer has moved to the right buffer. */
9025 input_line_pointer = (save
9026 + (input_line_pointer - gotfree_input_line)
9027 + adjust);
9028 free (gotfree_input_line);
3992d3b7
AM
9029 if (exp->X_op == O_constant
9030 || exp->X_op == O_absent
9031 || exp->X_op == O_illegal
0398aac5 9032 || exp->X_op == O_register
3992d3b7
AM
9033 || exp->X_op == O_big)
9034 {
9035 char c = *input_line_pointer;
9036 *input_line_pointer = 0;
9037 as_bad (_("missing or invalid expression `%s'"), save);
9038 *input_line_pointer = c;
9039 }
b9519cfe
L
9040 else if ((got_reloc == BFD_RELOC_386_PLT32
9041 || got_reloc == BFD_RELOC_X86_64_PLT32)
9042 && exp->X_op != O_symbol)
9043 {
9044 char c = *input_line_pointer;
9045 *input_line_pointer = 0;
9046 as_bad (_("invalid PLT expression `%s'"), save);
9047 *input_line_pointer = c;
9048 }
f3c180ae
AM
9049 }
9050 }
9051 else
9052 expression (exp);
ee86248c
JB
9053
9054 intel_syntax = -intel_syntax;
9055
9056 if (intel_syntax)
9057 i386_intel_simplify (exp);
62ebcb5c
AM
9058
9059 return got_reloc;
f3c180ae 9060}
f3c180ae 9061
9f32dd5b
L
9062static void
9063signed_cons (int size)
6482c264 9064{
d182319b
JB
9065 if (flag_code == CODE_64BIT)
9066 cons_sign = 1;
9067 cons (size);
9068 cons_sign = -1;
6482c264
NC
9069}
9070
d182319b 9071#ifdef TE_PE
6482c264 9072static void
7016a5d5 9073pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
9074{
9075 expressionS exp;
9076
9077 do
9078 {
9079 expression (&exp);
9080 if (exp.X_op == O_symbol)
9081 exp.X_op = O_secrel;
9082
9083 emit_expr (&exp, 4);
9084 }
9085 while (*input_line_pointer++ == ',');
9086
9087 input_line_pointer--;
9088 demand_empty_rest_of_line ();
9089}
6482c264
NC
9090#endif
9091
43234a1e
L
9092/* Handle Vector operations. */
9093
9094static char *
9095check_VecOperations (char *op_string, char *op_end)
9096{
9097 const reg_entry *mask;
9098 const char *saved;
9099 char *end_op;
9100
9101 while (*op_string
9102 && (op_end == NULL || op_string < op_end))
9103 {
9104 saved = op_string;
9105 if (*op_string == '{')
9106 {
9107 op_string++;
9108
9109 /* Check broadcasts. */
9110 if (strncmp (op_string, "1to", 3) == 0)
9111 {
9112 int bcst_type;
9113
9114 if (i.broadcast)
9115 goto duplicated_vec_op;
9116
9117 op_string += 3;
9118 if (*op_string == '8')
8e6e0792 9119 bcst_type = 8;
b28d1bda 9120 else if (*op_string == '4')
8e6e0792 9121 bcst_type = 4;
b28d1bda 9122 else if (*op_string == '2')
8e6e0792 9123 bcst_type = 2;
43234a1e
L
9124 else if (*op_string == '1'
9125 && *(op_string+1) == '6')
9126 {
8e6e0792 9127 bcst_type = 16;
43234a1e
L
9128 op_string++;
9129 }
9130 else
9131 {
9132 as_bad (_("Unsupported broadcast: `%s'"), saved);
9133 return NULL;
9134 }
9135 op_string++;
9136
9137 broadcast_op.type = bcst_type;
9138 broadcast_op.operand = this_operand;
1f75763a 9139 broadcast_op.bytes = 0;
43234a1e
L
9140 i.broadcast = &broadcast_op;
9141 }
9142 /* Check masking operation. */
9143 else if ((mask = parse_register (op_string, &end_op)) != NULL)
9144 {
9145 /* k0 can't be used for write mask. */
6d2cd6b2 9146 if (!mask->reg_type.bitfield.regmask || mask->reg_num == 0)
43234a1e 9147 {
6d2cd6b2
JB
9148 as_bad (_("`%s%s' can't be used for write mask"),
9149 register_prefix, mask->reg_name);
43234a1e
L
9150 return NULL;
9151 }
9152
9153 if (!i.mask)
9154 {
9155 mask_op.mask = mask;
9156 mask_op.zeroing = 0;
9157 mask_op.operand = this_operand;
9158 i.mask = &mask_op;
9159 }
9160 else
9161 {
9162 if (i.mask->mask)
9163 goto duplicated_vec_op;
9164
9165 i.mask->mask = mask;
9166
9167 /* Only "{z}" is allowed here. No need to check
9168 zeroing mask explicitly. */
9169 if (i.mask->operand != this_operand)
9170 {
9171 as_bad (_("invalid write mask `%s'"), saved);
9172 return NULL;
9173 }
9174 }
9175
9176 op_string = end_op;
9177 }
9178 /* Check zeroing-flag for masking operation. */
9179 else if (*op_string == 'z')
9180 {
9181 if (!i.mask)
9182 {
9183 mask_op.mask = NULL;
9184 mask_op.zeroing = 1;
9185 mask_op.operand = this_operand;
9186 i.mask = &mask_op;
9187 }
9188 else
9189 {
9190 if (i.mask->zeroing)
9191 {
9192 duplicated_vec_op:
9193 as_bad (_("duplicated `%s'"), saved);
9194 return NULL;
9195 }
9196
9197 i.mask->zeroing = 1;
9198
9199 /* Only "{%k}" is allowed here. No need to check mask
9200 register explicitly. */
9201 if (i.mask->operand != this_operand)
9202 {
9203 as_bad (_("invalid zeroing-masking `%s'"),
9204 saved);
9205 return NULL;
9206 }
9207 }
9208
9209 op_string++;
9210 }
9211 else
9212 goto unknown_vec_op;
9213
9214 if (*op_string != '}')
9215 {
9216 as_bad (_("missing `}' in `%s'"), saved);
9217 return NULL;
9218 }
9219 op_string++;
0ba3a731
L
9220
9221 /* Strip whitespace since the addition of pseudo prefixes
9222 changed how the scrubber treats '{'. */
9223 if (is_space_char (*op_string))
9224 ++op_string;
9225
43234a1e
L
9226 continue;
9227 }
9228 unknown_vec_op:
9229 /* We don't know this one. */
9230 as_bad (_("unknown vector operation: `%s'"), saved);
9231 return NULL;
9232 }
9233
6d2cd6b2
JB
9234 if (i.mask && i.mask->zeroing && !i.mask->mask)
9235 {
9236 as_bad (_("zeroing-masking only allowed with write mask"));
9237 return NULL;
9238 }
9239
43234a1e
L
9240 return op_string;
9241}
9242
252b5132 9243static int
70e41ade 9244i386_immediate (char *imm_start)
252b5132
RH
9245{
9246 char *save_input_line_pointer;
f3c180ae 9247 char *gotfree_input_line;
252b5132 9248 segT exp_seg = 0;
47926f60 9249 expressionS *exp;
40fb9820
L
9250 i386_operand_type types;
9251
0dfbf9d7 9252 operand_type_set (&types, ~0);
252b5132
RH
9253
9254 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
9255 {
31b2323c
L
9256 as_bad (_("at most %d immediate operands are allowed"),
9257 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
9258 return 0;
9259 }
9260
9261 exp = &im_expressions[i.imm_operands++];
520dc8e8 9262 i.op[this_operand].imms = exp;
252b5132
RH
9263
9264 if (is_space_char (*imm_start))
9265 ++imm_start;
9266
9267 save_input_line_pointer = input_line_pointer;
9268 input_line_pointer = imm_start;
9269
d258b828 9270 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
9271 if (gotfree_input_line)
9272 input_line_pointer = gotfree_input_line;
252b5132
RH
9273
9274 exp_seg = expression (exp);
9275
83183c0c 9276 SKIP_WHITESPACE ();
43234a1e
L
9277
9278 /* Handle vector operations. */
9279 if (*input_line_pointer == '{')
9280 {
9281 input_line_pointer = check_VecOperations (input_line_pointer,
9282 NULL);
9283 if (input_line_pointer == NULL)
9284 return 0;
9285 }
9286
252b5132 9287 if (*input_line_pointer)
f3c180ae 9288 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
9289
9290 input_line_pointer = save_input_line_pointer;
f3c180ae 9291 if (gotfree_input_line)
ee86248c
JB
9292 {
9293 free (gotfree_input_line);
9294
9295 if (exp->X_op == O_constant || exp->X_op == O_register)
9296 exp->X_op = O_illegal;
9297 }
9298
9299 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
9300}
252b5132 9301
ee86248c
JB
9302static int
9303i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
9304 i386_operand_type types, const char *imm_start)
9305{
9306 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 9307 {
313c53d1
L
9308 if (imm_start)
9309 as_bad (_("missing or invalid immediate expression `%s'"),
9310 imm_start);
3992d3b7 9311 return 0;
252b5132 9312 }
3e73aa7c 9313 else if (exp->X_op == O_constant)
252b5132 9314 {
47926f60 9315 /* Size it properly later. */
40fb9820 9316 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
9317 /* If not 64bit, sign extend val. */
9318 if (flag_code != CODE_64BIT
4eed87de
AM
9319 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
9320 exp->X_add_number
9321 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 9322 }
4c63da97 9323#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 9324 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 9325 && exp_seg != absolute_section
47926f60 9326 && exp_seg != text_section
24eab124
AM
9327 && exp_seg != data_section
9328 && exp_seg != bss_section
9329 && exp_seg != undefined_section
f86103b7 9330 && !bfd_is_com_section (exp_seg))
252b5132 9331 {
d0b47220 9332 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
9333 return 0;
9334 }
9335#endif
a841bdf5 9336 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 9337 {
313c53d1
L
9338 if (imm_start)
9339 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
9340 return 0;
9341 }
252b5132
RH
9342 else
9343 {
9344 /* This is an address. The size of the address will be
24eab124 9345 determined later, depending on destination register,
3e73aa7c 9346 suffix, or the default for the section. */
40fb9820
L
9347 i.types[this_operand].bitfield.imm8 = 1;
9348 i.types[this_operand].bitfield.imm16 = 1;
9349 i.types[this_operand].bitfield.imm32 = 1;
9350 i.types[this_operand].bitfield.imm32s = 1;
9351 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
9352 i.types[this_operand] = operand_type_and (i.types[this_operand],
9353 types);
252b5132
RH
9354 }
9355
9356 return 1;
9357}
9358
551c1ca1 9359static char *
e3bb37b5 9360i386_scale (char *scale)
252b5132 9361{
551c1ca1
AM
9362 offsetT val;
9363 char *save = input_line_pointer;
252b5132 9364
551c1ca1
AM
9365 input_line_pointer = scale;
9366 val = get_absolute_expression ();
9367
9368 switch (val)
252b5132 9369 {
551c1ca1 9370 case 1:
252b5132
RH
9371 i.log2_scale_factor = 0;
9372 break;
551c1ca1 9373 case 2:
252b5132
RH
9374 i.log2_scale_factor = 1;
9375 break;
551c1ca1 9376 case 4:
252b5132
RH
9377 i.log2_scale_factor = 2;
9378 break;
551c1ca1 9379 case 8:
252b5132
RH
9380 i.log2_scale_factor = 3;
9381 break;
9382 default:
a724f0f4
JB
9383 {
9384 char sep = *input_line_pointer;
9385
9386 *input_line_pointer = '\0';
9387 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
9388 scale);
9389 *input_line_pointer = sep;
9390 input_line_pointer = save;
9391 return NULL;
9392 }
252b5132 9393 }
29b0f896 9394 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
9395 {
9396 as_warn (_("scale factor of %d without an index register"),
24eab124 9397 1 << i.log2_scale_factor);
252b5132 9398 i.log2_scale_factor = 0;
252b5132 9399 }
551c1ca1
AM
9400 scale = input_line_pointer;
9401 input_line_pointer = save;
9402 return scale;
252b5132
RH
9403}
9404
252b5132 9405static int
e3bb37b5 9406i386_displacement (char *disp_start, char *disp_end)
252b5132 9407{
29b0f896 9408 expressionS *exp;
252b5132
RH
9409 segT exp_seg = 0;
9410 char *save_input_line_pointer;
f3c180ae 9411 char *gotfree_input_line;
40fb9820
L
9412 int override;
9413 i386_operand_type bigdisp, types = anydisp;
3992d3b7 9414 int ret;
252b5132 9415
31b2323c
L
9416 if (i.disp_operands == MAX_MEMORY_OPERANDS)
9417 {
9418 as_bad (_("at most %d displacement operands are allowed"),
9419 MAX_MEMORY_OPERANDS);
9420 return 0;
9421 }
9422
0dfbf9d7 9423 operand_type_set (&bigdisp, 0);
40fb9820
L
9424 if ((i.types[this_operand].bitfield.jumpabsolute)
9425 || (!current_templates->start->opcode_modifier.jump
9426 && !current_templates->start->opcode_modifier.jumpdword))
e05278af 9427 {
40fb9820 9428 bigdisp.bitfield.disp32 = 1;
e05278af 9429 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
9430 if (flag_code == CODE_64BIT)
9431 {
9432 if (!override)
9433 {
9434 bigdisp.bitfield.disp32s = 1;
9435 bigdisp.bitfield.disp64 = 1;
9436 }
9437 }
9438 else if ((flag_code == CODE_16BIT) ^ override)
9439 {
9440 bigdisp.bitfield.disp32 = 0;
9441 bigdisp.bitfield.disp16 = 1;
9442 }
e05278af
JB
9443 }
9444 else
9445 {
9446 /* For PC-relative branches, the width of the displacement
9447 is dependent upon data size, not address size. */
e05278af 9448 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
9449 if (flag_code == CODE_64BIT)
9450 {
9451 if (override || i.suffix == WORD_MNEM_SUFFIX)
9452 bigdisp.bitfield.disp16 = 1;
9453 else
9454 {
9455 bigdisp.bitfield.disp32 = 1;
9456 bigdisp.bitfield.disp32s = 1;
9457 }
9458 }
9459 else
e05278af
JB
9460 {
9461 if (!override)
9462 override = (i.suffix == (flag_code != CODE_16BIT
9463 ? WORD_MNEM_SUFFIX
9464 : LONG_MNEM_SUFFIX));
40fb9820
L
9465 bigdisp.bitfield.disp32 = 1;
9466 if ((flag_code == CODE_16BIT) ^ override)
9467 {
9468 bigdisp.bitfield.disp32 = 0;
9469 bigdisp.bitfield.disp16 = 1;
9470 }
e05278af 9471 }
e05278af 9472 }
c6fb90c8
L
9473 i.types[this_operand] = operand_type_or (i.types[this_operand],
9474 bigdisp);
252b5132
RH
9475
9476 exp = &disp_expressions[i.disp_operands];
520dc8e8 9477 i.op[this_operand].disps = exp;
252b5132
RH
9478 i.disp_operands++;
9479 save_input_line_pointer = input_line_pointer;
9480 input_line_pointer = disp_start;
9481 END_STRING_AND_SAVE (disp_end);
9482
9483#ifndef GCC_ASM_O_HACK
9484#define GCC_ASM_O_HACK 0
9485#endif
9486#if GCC_ASM_O_HACK
9487 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 9488 if (i.types[this_operand].bitfield.baseIndex
24eab124 9489 && displacement_string_end[-1] == '+')
252b5132
RH
9490 {
9491 /* This hack is to avoid a warning when using the "o"
24eab124
AM
9492 constraint within gcc asm statements.
9493 For instance:
9494
9495 #define _set_tssldt_desc(n,addr,limit,type) \
9496 __asm__ __volatile__ ( \
9497 "movw %w2,%0\n\t" \
9498 "movw %w1,2+%0\n\t" \
9499 "rorl $16,%1\n\t" \
9500 "movb %b1,4+%0\n\t" \
9501 "movb %4,5+%0\n\t" \
9502 "movb $0,6+%0\n\t" \
9503 "movb %h1,7+%0\n\t" \
9504 "rorl $16,%1" \
9505 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
9506
9507 This works great except that the output assembler ends
9508 up looking a bit weird if it turns out that there is
9509 no offset. You end up producing code that looks like:
9510
9511 #APP
9512 movw $235,(%eax)
9513 movw %dx,2+(%eax)
9514 rorl $16,%edx
9515 movb %dl,4+(%eax)
9516 movb $137,5+(%eax)
9517 movb $0,6+(%eax)
9518 movb %dh,7+(%eax)
9519 rorl $16,%edx
9520 #NO_APP
9521
47926f60 9522 So here we provide the missing zero. */
24eab124
AM
9523
9524 *displacement_string_end = '0';
252b5132
RH
9525 }
9526#endif
d258b828 9527 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
9528 if (gotfree_input_line)
9529 input_line_pointer = gotfree_input_line;
252b5132 9530
24eab124 9531 exp_seg = expression (exp);
252b5132 9532
636c26b0
AM
9533 SKIP_WHITESPACE ();
9534 if (*input_line_pointer)
9535 as_bad (_("junk `%s' after expression"), input_line_pointer);
9536#if GCC_ASM_O_HACK
9537 RESTORE_END_STRING (disp_end + 1);
9538#endif
636c26b0 9539 input_line_pointer = save_input_line_pointer;
636c26b0 9540 if (gotfree_input_line)
ee86248c
JB
9541 {
9542 free (gotfree_input_line);
9543
9544 if (exp->X_op == O_constant || exp->X_op == O_register)
9545 exp->X_op = O_illegal;
9546 }
9547
9548 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
9549
9550 RESTORE_END_STRING (disp_end);
9551
9552 return ret;
9553}
9554
9555static int
9556i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
9557 i386_operand_type types, const char *disp_start)
9558{
9559 i386_operand_type bigdisp;
9560 int ret = 1;
636c26b0 9561
24eab124
AM
9562 /* We do this to make sure that the section symbol is in
9563 the symbol table. We will ultimately change the relocation
47926f60 9564 to be relative to the beginning of the section. */
1ae12ab7 9565 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
9566 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
9567 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 9568 {
636c26b0 9569 if (exp->X_op != O_symbol)
3992d3b7 9570 goto inv_disp;
636c26b0 9571
e5cb08ac 9572 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
9573 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
9574 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 9575 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
9576 exp->X_op = O_subtract;
9577 exp->X_op_symbol = GOT_symbol;
1ae12ab7 9578 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 9579 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
9580 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
9581 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 9582 else
29b0f896 9583 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 9584 }
252b5132 9585
3992d3b7
AM
9586 else if (exp->X_op == O_absent
9587 || exp->X_op == O_illegal
ee86248c 9588 || exp->X_op == O_big)
2daf4fd8 9589 {
3992d3b7
AM
9590 inv_disp:
9591 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 9592 disp_start);
3992d3b7 9593 ret = 0;
2daf4fd8
AM
9594 }
9595
0e1147d9
L
9596 else if (flag_code == CODE_64BIT
9597 && !i.prefix[ADDR_PREFIX]
9598 && exp->X_op == O_constant)
9599 {
9600 /* Since displacement is signed extended to 64bit, don't allow
9601 disp32 and turn off disp32s if they are out of range. */
9602 i.types[this_operand].bitfield.disp32 = 0;
9603 if (!fits_in_signed_long (exp->X_add_number))
9604 {
9605 i.types[this_operand].bitfield.disp32s = 0;
9606 if (i.types[this_operand].bitfield.baseindex)
9607 {
9608 as_bad (_("0x%lx out range of signed 32bit displacement"),
9609 (long) exp->X_add_number);
9610 ret = 0;
9611 }
9612 }
9613 }
9614
4c63da97 9615#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
9616 else if (exp->X_op != O_constant
9617 && OUTPUT_FLAVOR == bfd_target_aout_flavour
9618 && exp_seg != absolute_section
9619 && exp_seg != text_section
9620 && exp_seg != data_section
9621 && exp_seg != bss_section
9622 && exp_seg != undefined_section
9623 && !bfd_is_com_section (exp_seg))
24eab124 9624 {
d0b47220 9625 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 9626 ret = 0;
24eab124 9627 }
252b5132 9628#endif
3956db08 9629
40fb9820
L
9630 /* Check if this is a displacement only operand. */
9631 bigdisp = i.types[this_operand];
9632 bigdisp.bitfield.disp8 = 0;
9633 bigdisp.bitfield.disp16 = 0;
9634 bigdisp.bitfield.disp32 = 0;
9635 bigdisp.bitfield.disp32s = 0;
9636 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 9637 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
9638 i.types[this_operand] = operand_type_and (i.types[this_operand],
9639 types);
3956db08 9640
3992d3b7 9641 return ret;
252b5132
RH
9642}
9643
2abc2bec
JB
9644/* Return the active addressing mode, taking address override and
9645 registers forming the address into consideration. Update the
9646 address override prefix if necessary. */
47926f60 9647
2abc2bec
JB
9648static enum flag_code
9649i386_addressing_mode (void)
252b5132 9650{
be05d201
L
9651 enum flag_code addr_mode;
9652
9653 if (i.prefix[ADDR_PREFIX])
9654 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
9655 else
9656 {
9657 addr_mode = flag_code;
9658
24eab124 9659#if INFER_ADDR_PREFIX
be05d201
L
9660 if (i.mem_operands == 0)
9661 {
9662 /* Infer address prefix from the first memory operand. */
9663 const reg_entry *addr_reg = i.base_reg;
9664
9665 if (addr_reg == NULL)
9666 addr_reg = i.index_reg;
eecb386c 9667
be05d201
L
9668 if (addr_reg)
9669 {
e968fc9b 9670 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
9671 addr_mode = CODE_32BIT;
9672 else if (flag_code != CODE_64BIT
dc821c5f 9673 && addr_reg->reg_type.bitfield.word)
be05d201
L
9674 addr_mode = CODE_16BIT;
9675
9676 if (addr_mode != flag_code)
9677 {
9678 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
9679 i.prefixes += 1;
9680 /* Change the size of any displacement too. At most one
9681 of Disp16 or Disp32 is set.
9682 FIXME. There doesn't seem to be any real need for
9683 separate Disp16 and Disp32 flags. The same goes for
9684 Imm16 and Imm32. Removing them would probably clean
9685 up the code quite a lot. */
9686 if (flag_code != CODE_64BIT
9687 && (i.types[this_operand].bitfield.disp16
9688 || i.types[this_operand].bitfield.disp32))
9689 i.types[this_operand]
9690 = operand_type_xor (i.types[this_operand], disp16_32);
9691 }
9692 }
9693 }
24eab124 9694#endif
be05d201
L
9695 }
9696
2abc2bec
JB
9697 return addr_mode;
9698}
9699
9700/* Make sure the memory operand we've been dealt is valid.
9701 Return 1 on success, 0 on a failure. */
9702
9703static int
9704i386_index_check (const char *operand_string)
9705{
9706 const char *kind = "base/index";
9707 enum flag_code addr_mode = i386_addressing_mode ();
9708
fc0763e6
JB
9709 if (current_templates->start->opcode_modifier.isstring
9710 && !current_templates->start->opcode_modifier.immext
9711 && (current_templates->end[-1].opcode_modifier.isstring
9712 || i.mem_operands))
9713 {
9714 /* Memory operands of string insns are special in that they only allow
9715 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
9716 const reg_entry *expected_reg;
9717 static const char *di_si[][2] =
9718 {
9719 { "esi", "edi" },
9720 { "si", "di" },
9721 { "rsi", "rdi" }
9722 };
9723 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
9724
9725 kind = "string address";
9726
8325cc63 9727 if (current_templates->start->opcode_modifier.repprefixok)
fc0763e6
JB
9728 {
9729 i386_operand_type type = current_templates->end[-1].operand_types[0];
9730
9731 if (!type.bitfield.baseindex
9732 || ((!i.mem_operands != !intel_syntax)
9733 && current_templates->end[-1].operand_types[1]
9734 .bitfield.baseindex))
9735 type = current_templates->end[-1].operand_types[1];
be05d201
L
9736 expected_reg = hash_find (reg_hash,
9737 di_si[addr_mode][type.bitfield.esseg]);
9738
fc0763e6
JB
9739 }
9740 else
be05d201 9741 expected_reg = hash_find (reg_hash, bx[addr_mode]);
fc0763e6 9742
be05d201
L
9743 if (i.base_reg != expected_reg
9744 || i.index_reg
fc0763e6 9745 || operand_type_check (i.types[this_operand], disp))
fc0763e6 9746 {
be05d201
L
9747 /* The second memory operand must have the same size as
9748 the first one. */
9749 if (i.mem_operands
9750 && i.base_reg
9751 && !((addr_mode == CODE_64BIT
dc821c5f 9752 && i.base_reg->reg_type.bitfield.qword)
be05d201 9753 || (addr_mode == CODE_32BIT
dc821c5f
JB
9754 ? i.base_reg->reg_type.bitfield.dword
9755 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
9756 goto bad_address;
9757
fc0763e6
JB
9758 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
9759 operand_string,
9760 intel_syntax ? '[' : '(',
9761 register_prefix,
be05d201 9762 expected_reg->reg_name,
fc0763e6 9763 intel_syntax ? ']' : ')');
be05d201 9764 return 1;
fc0763e6 9765 }
be05d201
L
9766 else
9767 return 1;
9768
9769bad_address:
9770 as_bad (_("`%s' is not a valid %s expression"),
9771 operand_string, kind);
9772 return 0;
3e73aa7c
JH
9773 }
9774 else
9775 {
be05d201
L
9776 if (addr_mode != CODE_16BIT)
9777 {
9778 /* 32-bit/64-bit checks. */
9779 if ((i.base_reg
e968fc9b
JB
9780 && ((addr_mode == CODE_64BIT
9781 ? !i.base_reg->reg_type.bitfield.qword
9782 : !i.base_reg->reg_type.bitfield.dword)
9783 || (i.index_reg && i.base_reg->reg_num == RegIP)
9784 || i.base_reg->reg_num == RegIZ))
be05d201 9785 || (i.index_reg
1b54b8d7
JB
9786 && !i.index_reg->reg_type.bitfield.xmmword
9787 && !i.index_reg->reg_type.bitfield.ymmword
9788 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 9789 && ((addr_mode == CODE_64BIT
e968fc9b
JB
9790 ? !i.index_reg->reg_type.bitfield.qword
9791 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
9792 || !i.index_reg->reg_type.bitfield.baseindex)))
9793 goto bad_address;
8178be5b
JB
9794
9795 /* bndmk, bndldx, and bndstx have special restrictions. */
9796 if (current_templates->start->base_opcode == 0xf30f1b
9797 || (current_templates->start->base_opcode & ~1) == 0x0f1a)
9798 {
9799 /* They cannot use RIP-relative addressing. */
e968fc9b 9800 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
9801 {
9802 as_bad (_("`%s' cannot be used here"), operand_string);
9803 return 0;
9804 }
9805
9806 /* bndldx and bndstx ignore their scale factor. */
9807 if (current_templates->start->base_opcode != 0xf30f1b
9808 && i.log2_scale_factor)
9809 as_warn (_("register scaling is being ignored here"));
9810 }
be05d201
L
9811 }
9812 else
3e73aa7c 9813 {
be05d201 9814 /* 16-bit checks. */
3e73aa7c 9815 if ((i.base_reg
dc821c5f 9816 && (!i.base_reg->reg_type.bitfield.word
40fb9820 9817 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 9818 || (i.index_reg
dc821c5f 9819 && (!i.index_reg->reg_type.bitfield.word
40fb9820 9820 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
9821 || !(i.base_reg
9822 && i.base_reg->reg_num < 6
9823 && i.index_reg->reg_num >= 6
9824 && i.log2_scale_factor == 0))))
be05d201 9825 goto bad_address;
3e73aa7c
JH
9826 }
9827 }
be05d201 9828 return 1;
24eab124 9829}
252b5132 9830
43234a1e
L
9831/* Handle vector immediates. */
9832
9833static int
9834RC_SAE_immediate (const char *imm_start)
9835{
9836 unsigned int match_found, j;
9837 const char *pstr = imm_start;
9838 expressionS *exp;
9839
9840 if (*pstr != '{')
9841 return 0;
9842
9843 pstr++;
9844 match_found = 0;
9845 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
9846 {
9847 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
9848 {
9849 if (!i.rounding)
9850 {
9851 rc_op.type = RC_NamesTable[j].type;
9852 rc_op.operand = this_operand;
9853 i.rounding = &rc_op;
9854 }
9855 else
9856 {
9857 as_bad (_("duplicated `%s'"), imm_start);
9858 return 0;
9859 }
9860 pstr += RC_NamesTable[j].len;
9861 match_found = 1;
9862 break;
9863 }
9864 }
9865 if (!match_found)
9866 return 0;
9867
9868 if (*pstr++ != '}')
9869 {
9870 as_bad (_("Missing '}': '%s'"), imm_start);
9871 return 0;
9872 }
9873 /* RC/SAE immediate string should contain nothing more. */;
9874 if (*pstr != 0)
9875 {
9876 as_bad (_("Junk after '}': '%s'"), imm_start);
9877 return 0;
9878 }
9879
9880 exp = &im_expressions[i.imm_operands++];
9881 i.op[this_operand].imms = exp;
9882
9883 exp->X_op = O_constant;
9884 exp->X_add_number = 0;
9885 exp->X_add_symbol = (symbolS *) 0;
9886 exp->X_op_symbol = (symbolS *) 0;
9887
9888 i.types[this_operand].bitfield.imm8 = 1;
9889 return 1;
9890}
9891
8325cc63
JB
9892/* Only string instructions can have a second memory operand, so
9893 reduce current_templates to just those if it contains any. */
9894static int
9895maybe_adjust_templates (void)
9896{
9897 const insn_template *t;
9898
9899 gas_assert (i.mem_operands == 1);
9900
9901 for (t = current_templates->start; t < current_templates->end; ++t)
9902 if (t->opcode_modifier.isstring)
9903 break;
9904
9905 if (t < current_templates->end)
9906 {
9907 static templates aux_templates;
9908 bfd_boolean recheck;
9909
9910 aux_templates.start = t;
9911 for (; t < current_templates->end; ++t)
9912 if (!t->opcode_modifier.isstring)
9913 break;
9914 aux_templates.end = t;
9915
9916 /* Determine whether to re-check the first memory operand. */
9917 recheck = (aux_templates.start != current_templates->start
9918 || t != current_templates->end);
9919
9920 current_templates = &aux_templates;
9921
9922 if (recheck)
9923 {
9924 i.mem_operands = 0;
9925 if (i.memop1_string != NULL
9926 && i386_index_check (i.memop1_string) == 0)
9927 return 0;
9928 i.mem_operands = 1;
9929 }
9930 }
9931
9932 return 1;
9933}
9934
fc0763e6 9935/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 9936 on error. */
252b5132 9937
252b5132 9938static int
a7619375 9939i386_att_operand (char *operand_string)
252b5132 9940{
af6bdddf
AM
9941 const reg_entry *r;
9942 char *end_op;
24eab124 9943 char *op_string = operand_string;
252b5132 9944
24eab124 9945 if (is_space_char (*op_string))
252b5132
RH
9946 ++op_string;
9947
24eab124 9948 /* We check for an absolute prefix (differentiating,
47926f60 9949 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
9950 if (*op_string == ABSOLUTE_PREFIX)
9951 {
9952 ++op_string;
9953 if (is_space_char (*op_string))
9954 ++op_string;
40fb9820 9955 i.types[this_operand].bitfield.jumpabsolute = 1;
24eab124 9956 }
252b5132 9957
47926f60 9958 /* Check if operand is a register. */
4d1bb795 9959 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 9960 {
40fb9820
L
9961 i386_operand_type temp;
9962
24eab124
AM
9963 /* Check for a segment override by searching for ':' after a
9964 segment register. */
9965 op_string = end_op;
9966 if (is_space_char (*op_string))
9967 ++op_string;
40fb9820
L
9968 if (*op_string == ':'
9969 && (r->reg_type.bitfield.sreg2
9970 || r->reg_type.bitfield.sreg3))
24eab124
AM
9971 {
9972 switch (r->reg_num)
9973 {
9974 case 0:
9975 i.seg[i.mem_operands] = &es;
9976 break;
9977 case 1:
9978 i.seg[i.mem_operands] = &cs;
9979 break;
9980 case 2:
9981 i.seg[i.mem_operands] = &ss;
9982 break;
9983 case 3:
9984 i.seg[i.mem_operands] = &ds;
9985 break;
9986 case 4:
9987 i.seg[i.mem_operands] = &fs;
9988 break;
9989 case 5:
9990 i.seg[i.mem_operands] = &gs;
9991 break;
9992 }
252b5132 9993
24eab124 9994 /* Skip the ':' and whitespace. */
252b5132
RH
9995 ++op_string;
9996 if (is_space_char (*op_string))
24eab124 9997 ++op_string;
252b5132 9998
24eab124
AM
9999 if (!is_digit_char (*op_string)
10000 && !is_identifier_char (*op_string)
10001 && *op_string != '('
10002 && *op_string != ABSOLUTE_PREFIX)
10003 {
10004 as_bad (_("bad memory operand `%s'"), op_string);
10005 return 0;
10006 }
47926f60 10007 /* Handle case of %es:*foo. */
24eab124
AM
10008 if (*op_string == ABSOLUTE_PREFIX)
10009 {
10010 ++op_string;
10011 if (is_space_char (*op_string))
10012 ++op_string;
40fb9820 10013 i.types[this_operand].bitfield.jumpabsolute = 1;
24eab124
AM
10014 }
10015 goto do_memory_reference;
10016 }
43234a1e
L
10017
10018 /* Handle vector operations. */
10019 if (*op_string == '{')
10020 {
10021 op_string = check_VecOperations (op_string, NULL);
10022 if (op_string == NULL)
10023 return 0;
10024 }
10025
24eab124
AM
10026 if (*op_string)
10027 {
d0b47220 10028 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
10029 return 0;
10030 }
40fb9820
L
10031 temp = r->reg_type;
10032 temp.bitfield.baseindex = 0;
c6fb90c8
L
10033 i.types[this_operand] = operand_type_or (i.types[this_operand],
10034 temp);
7d5e4556 10035 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 10036 i.op[this_operand].regs = r;
24eab124
AM
10037 i.reg_operands++;
10038 }
af6bdddf
AM
10039 else if (*op_string == REGISTER_PREFIX)
10040 {
10041 as_bad (_("bad register name `%s'"), op_string);
10042 return 0;
10043 }
24eab124 10044 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 10045 {
24eab124 10046 ++op_string;
40fb9820 10047 if (i.types[this_operand].bitfield.jumpabsolute)
24eab124 10048 {
d0b47220 10049 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
10050 return 0;
10051 }
10052 if (!i386_immediate (op_string))
10053 return 0;
10054 }
43234a1e
L
10055 else if (RC_SAE_immediate (operand_string))
10056 {
10057 /* If it is a RC or SAE immediate, do nothing. */
10058 ;
10059 }
24eab124
AM
10060 else if (is_digit_char (*op_string)
10061 || is_identifier_char (*op_string)
d02603dc 10062 || *op_string == '"'
e5cb08ac 10063 || *op_string == '(')
24eab124 10064 {
47926f60 10065 /* This is a memory reference of some sort. */
af6bdddf 10066 char *base_string;
252b5132 10067
47926f60 10068 /* Start and end of displacement string expression (if found). */
eecb386c
AM
10069 char *displacement_string_start;
10070 char *displacement_string_end;
43234a1e 10071 char *vop_start;
252b5132 10072
24eab124 10073 do_memory_reference:
8325cc63
JB
10074 if (i.mem_operands == 1 && !maybe_adjust_templates ())
10075 return 0;
24eab124 10076 if ((i.mem_operands == 1
40fb9820 10077 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
10078 || i.mem_operands == 2)
10079 {
10080 as_bad (_("too many memory references for `%s'"),
10081 current_templates->start->name);
10082 return 0;
10083 }
252b5132 10084
24eab124
AM
10085 /* Check for base index form. We detect the base index form by
10086 looking for an ')' at the end of the operand, searching
10087 for the '(' matching it, and finding a REGISTER_PREFIX or ','
10088 after the '('. */
af6bdddf 10089 base_string = op_string + strlen (op_string);
c3332e24 10090
43234a1e
L
10091 /* Handle vector operations. */
10092 vop_start = strchr (op_string, '{');
10093 if (vop_start && vop_start < base_string)
10094 {
10095 if (check_VecOperations (vop_start, base_string) == NULL)
10096 return 0;
10097 base_string = vop_start;
10098 }
10099
af6bdddf
AM
10100 --base_string;
10101 if (is_space_char (*base_string))
10102 --base_string;
252b5132 10103
47926f60 10104 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
10105 displacement_string_start = op_string;
10106 displacement_string_end = base_string + 1;
252b5132 10107
24eab124
AM
10108 if (*base_string == ')')
10109 {
af6bdddf 10110 char *temp_string;
24eab124
AM
10111 unsigned int parens_balanced = 1;
10112 /* We've already checked that the number of left & right ()'s are
47926f60 10113 equal, so this loop will not be infinite. */
24eab124
AM
10114 do
10115 {
10116 base_string--;
10117 if (*base_string == ')')
10118 parens_balanced++;
10119 if (*base_string == '(')
10120 parens_balanced--;
10121 }
10122 while (parens_balanced);
c3332e24 10123
af6bdddf 10124 temp_string = base_string;
c3332e24 10125
24eab124 10126 /* Skip past '(' and whitespace. */
252b5132
RH
10127 ++base_string;
10128 if (is_space_char (*base_string))
24eab124 10129 ++base_string;
252b5132 10130
af6bdddf 10131 if (*base_string == ','
4eed87de
AM
10132 || ((i.base_reg = parse_register (base_string, &end_op))
10133 != NULL))
252b5132 10134 {
af6bdddf 10135 displacement_string_end = temp_string;
252b5132 10136
40fb9820 10137 i.types[this_operand].bitfield.baseindex = 1;
252b5132 10138
af6bdddf 10139 if (i.base_reg)
24eab124 10140 {
24eab124
AM
10141 base_string = end_op;
10142 if (is_space_char (*base_string))
10143 ++base_string;
af6bdddf
AM
10144 }
10145
10146 /* There may be an index reg or scale factor here. */
10147 if (*base_string == ',')
10148 {
10149 ++base_string;
10150 if (is_space_char (*base_string))
10151 ++base_string;
10152
4eed87de
AM
10153 if ((i.index_reg = parse_register (base_string, &end_op))
10154 != NULL)
24eab124 10155 {
af6bdddf 10156 base_string = end_op;
24eab124
AM
10157 if (is_space_char (*base_string))
10158 ++base_string;
af6bdddf
AM
10159 if (*base_string == ',')
10160 {
10161 ++base_string;
10162 if (is_space_char (*base_string))
10163 ++base_string;
10164 }
e5cb08ac 10165 else if (*base_string != ')')
af6bdddf 10166 {
4eed87de
AM
10167 as_bad (_("expecting `,' or `)' "
10168 "after index register in `%s'"),
af6bdddf
AM
10169 operand_string);
10170 return 0;
10171 }
24eab124 10172 }
af6bdddf 10173 else if (*base_string == REGISTER_PREFIX)
24eab124 10174 {
f76bf5e0
L
10175 end_op = strchr (base_string, ',');
10176 if (end_op)
10177 *end_op = '\0';
af6bdddf 10178 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
10179 return 0;
10180 }
252b5132 10181
47926f60 10182 /* Check for scale factor. */
551c1ca1 10183 if (*base_string != ')')
af6bdddf 10184 {
551c1ca1
AM
10185 char *end_scale = i386_scale (base_string);
10186
10187 if (!end_scale)
af6bdddf 10188 return 0;
24eab124 10189
551c1ca1 10190 base_string = end_scale;
af6bdddf
AM
10191 if (is_space_char (*base_string))
10192 ++base_string;
10193 if (*base_string != ')')
10194 {
4eed87de
AM
10195 as_bad (_("expecting `)' "
10196 "after scale factor in `%s'"),
af6bdddf
AM
10197 operand_string);
10198 return 0;
10199 }
10200 }
10201 else if (!i.index_reg)
24eab124 10202 {
4eed87de
AM
10203 as_bad (_("expecting index register or scale factor "
10204 "after `,'; got '%c'"),
af6bdddf 10205 *base_string);
24eab124
AM
10206 return 0;
10207 }
10208 }
af6bdddf 10209 else if (*base_string != ')')
24eab124 10210 {
4eed87de
AM
10211 as_bad (_("expecting `,' or `)' "
10212 "after base register in `%s'"),
af6bdddf 10213 operand_string);
24eab124
AM
10214 return 0;
10215 }
c3332e24 10216 }
af6bdddf 10217 else if (*base_string == REGISTER_PREFIX)
c3332e24 10218 {
f76bf5e0
L
10219 end_op = strchr (base_string, ',');
10220 if (end_op)
10221 *end_op = '\0';
af6bdddf 10222 as_bad (_("bad register name `%s'"), base_string);
24eab124 10223 return 0;
c3332e24 10224 }
24eab124
AM
10225 }
10226
10227 /* If there's an expression beginning the operand, parse it,
10228 assuming displacement_string_start and
10229 displacement_string_end are meaningful. */
10230 if (displacement_string_start != displacement_string_end)
10231 {
10232 if (!i386_displacement (displacement_string_start,
10233 displacement_string_end))
10234 return 0;
10235 }
10236
10237 /* Special case for (%dx) while doing input/output op. */
10238 if (i.base_reg
2fb5be8d 10239 && i.base_reg->reg_type.bitfield.inoutportreg
24eab124
AM
10240 && i.index_reg == 0
10241 && i.log2_scale_factor == 0
10242 && i.seg[i.mem_operands] == 0
40fb9820 10243 && !operand_type_check (i.types[this_operand], disp))
24eab124 10244 {
2fb5be8d 10245 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
10246 return 1;
10247 }
10248
eecb386c
AM
10249 if (i386_index_check (operand_string) == 0)
10250 return 0;
c48dadc9 10251 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
10252 if (i.mem_operands == 0)
10253 i.memop1_string = xstrdup (operand_string);
24eab124
AM
10254 i.mem_operands++;
10255 }
10256 else
ce8a8b2f
AM
10257 {
10258 /* It's not a memory operand; argh! */
24eab124
AM
10259 as_bad (_("invalid char %s beginning operand %d `%s'"),
10260 output_invalid (*op_string),
10261 this_operand + 1,
10262 op_string);
10263 return 0;
10264 }
47926f60 10265 return 1; /* Normal return. */
252b5132
RH
10266}
10267\f
fa94de6b
RM
10268/* Calculate the maximum variable size (i.e., excluding fr_fix)
10269 that an rs_machine_dependent frag may reach. */
10270
10271unsigned int
10272i386_frag_max_var (fragS *frag)
10273{
10274 /* The only relaxable frags are for jumps.
10275 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
10276 gas_assert (frag->fr_type == rs_machine_dependent);
10277 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
10278}
10279
b084df0b
L
10280#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
10281static int
8dcea932 10282elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
10283{
10284 /* STT_GNU_IFUNC symbol must go through PLT. */
10285 if ((symbol_get_bfdsym (fr_symbol)->flags
10286 & BSF_GNU_INDIRECT_FUNCTION) != 0)
10287 return 0;
10288
10289 if (!S_IS_EXTERNAL (fr_symbol))
10290 /* Symbol may be weak or local. */
10291 return !S_IS_WEAK (fr_symbol);
10292
8dcea932
L
10293 /* Global symbols with non-default visibility can't be preempted. */
10294 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
10295 return 1;
10296
10297 if (fr_var != NO_RELOC)
10298 switch ((enum bfd_reloc_code_real) fr_var)
10299 {
10300 case BFD_RELOC_386_PLT32:
10301 case BFD_RELOC_X86_64_PLT32:
33eaf5de 10302 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
10303 return 0;
10304 default:
10305 abort ();
10306 }
10307
b084df0b
L
10308 /* Global symbols with default visibility in a shared library may be
10309 preempted by another definition. */
8dcea932 10310 return !shared;
b084df0b
L
10311}
10312#endif
10313
ee7fcc42
AM
10314/* md_estimate_size_before_relax()
10315
10316 Called just before relax() for rs_machine_dependent frags. The x86
10317 assembler uses these frags to handle variable size jump
10318 instructions.
10319
10320 Any symbol that is now undefined will not become defined.
10321 Return the correct fr_subtype in the frag.
10322 Return the initial "guess for variable size of frag" to caller.
10323 The guess is actually the growth beyond the fixed part. Whatever
10324 we do to grow the fixed or variable part contributes to our
10325 returned value. */
10326
252b5132 10327int
7016a5d5 10328md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 10329{
252b5132 10330 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
10331 check for un-relaxable symbols. On an ELF system, we can't relax
10332 an externally visible symbol, because it may be overridden by a
10333 shared library. */
10334 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 10335#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 10336 || (IS_ELF
8dcea932
L
10337 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
10338 fragP->fr_var))
fbeb56a4
DK
10339#endif
10340#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 10341 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 10342 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
10343#endif
10344 )
252b5132 10345 {
b98ef147
AM
10346 /* Symbol is undefined in this segment, or we need to keep a
10347 reloc so that weak symbols can be overridden. */
10348 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 10349 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
10350 unsigned char *opcode;
10351 int old_fr_fix;
f6af82bd 10352
ee7fcc42 10353 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 10354 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 10355 else if (size == 2)
f6af82bd 10356 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
10357#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
10358 else if (need_plt32_p (fragP->fr_symbol))
10359 reloc_type = BFD_RELOC_X86_64_PLT32;
10360#endif
f6af82bd
AM
10361 else
10362 reloc_type = BFD_RELOC_32_PCREL;
252b5132 10363
ee7fcc42
AM
10364 old_fr_fix = fragP->fr_fix;
10365 opcode = (unsigned char *) fragP->fr_opcode;
10366
fddf5b5b 10367 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 10368 {
fddf5b5b
AM
10369 case UNCOND_JUMP:
10370 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 10371 opcode[0] = 0xe9;
252b5132 10372 fragP->fr_fix += size;
062cd5e7
AS
10373 fix_new (fragP, old_fr_fix, size,
10374 fragP->fr_symbol,
10375 fragP->fr_offset, 1,
10376 reloc_type);
252b5132
RH
10377 break;
10378
fddf5b5b 10379 case COND_JUMP86:
412167cb
AM
10380 if (size == 2
10381 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
10382 {
10383 /* Negate the condition, and branch past an
10384 unconditional jump. */
10385 opcode[0] ^= 1;
10386 opcode[1] = 3;
10387 /* Insert an unconditional jump. */
10388 opcode[2] = 0xe9;
10389 /* We added two extra opcode bytes, and have a two byte
10390 offset. */
10391 fragP->fr_fix += 2 + 2;
062cd5e7
AS
10392 fix_new (fragP, old_fr_fix + 2, 2,
10393 fragP->fr_symbol,
10394 fragP->fr_offset, 1,
10395 reloc_type);
fddf5b5b
AM
10396 break;
10397 }
10398 /* Fall through. */
10399
10400 case COND_JUMP:
412167cb
AM
10401 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
10402 {
3e02c1cc
AM
10403 fixS *fixP;
10404
412167cb 10405 fragP->fr_fix += 1;
3e02c1cc
AM
10406 fixP = fix_new (fragP, old_fr_fix, 1,
10407 fragP->fr_symbol,
10408 fragP->fr_offset, 1,
10409 BFD_RELOC_8_PCREL);
10410 fixP->fx_signed = 1;
412167cb
AM
10411 break;
10412 }
93c2a809 10413
24eab124 10414 /* This changes the byte-displacement jump 0x7N
fddf5b5b 10415 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 10416 opcode[1] = opcode[0] + 0x10;
f6af82bd 10417 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
10418 /* We've added an opcode byte. */
10419 fragP->fr_fix += 1 + size;
062cd5e7
AS
10420 fix_new (fragP, old_fr_fix + 1, size,
10421 fragP->fr_symbol,
10422 fragP->fr_offset, 1,
10423 reloc_type);
252b5132 10424 break;
fddf5b5b
AM
10425
10426 default:
10427 BAD_CASE (fragP->fr_subtype);
10428 break;
252b5132
RH
10429 }
10430 frag_wane (fragP);
ee7fcc42 10431 return fragP->fr_fix - old_fr_fix;
252b5132 10432 }
93c2a809 10433
93c2a809
AM
10434 /* Guess size depending on current relax state. Initially the relax
10435 state will correspond to a short jump and we return 1, because
10436 the variable part of the frag (the branch offset) is one byte
10437 long. However, we can relax a section more than once and in that
10438 case we must either set fr_subtype back to the unrelaxed state,
10439 or return the value for the appropriate branch. */
10440 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
10441}
10442
47926f60
KH
10443/* Called after relax() is finished.
10444
10445 In: Address of frag.
10446 fr_type == rs_machine_dependent.
10447 fr_subtype is what the address relaxed to.
10448
10449 Out: Any fixSs and constants are set up.
10450 Caller will turn frag into a ".space 0". */
10451
252b5132 10452void
7016a5d5
TG
10453md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
10454 fragS *fragP)
252b5132 10455{
29b0f896 10456 unsigned char *opcode;
252b5132 10457 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
10458 offsetT target_address;
10459 offsetT opcode_address;
252b5132 10460 unsigned int extension = 0;
847f7ad4 10461 offsetT displacement_from_opcode_start;
252b5132
RH
10462
10463 opcode = (unsigned char *) fragP->fr_opcode;
10464
47926f60 10465 /* Address we want to reach in file space. */
252b5132 10466 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 10467
47926f60 10468 /* Address opcode resides at in file space. */
252b5132
RH
10469 opcode_address = fragP->fr_address + fragP->fr_fix;
10470
47926f60 10471 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
10472 displacement_from_opcode_start = target_address - opcode_address;
10473
fddf5b5b 10474 if ((fragP->fr_subtype & BIG) == 0)
252b5132 10475 {
47926f60
KH
10476 /* Don't have to change opcode. */
10477 extension = 1; /* 1 opcode + 1 displacement */
252b5132 10478 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
10479 }
10480 else
10481 {
10482 if (no_cond_jump_promotion
10483 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
10484 as_warn_where (fragP->fr_file, fragP->fr_line,
10485 _("long jump required"));
252b5132 10486
fddf5b5b
AM
10487 switch (fragP->fr_subtype)
10488 {
10489 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
10490 extension = 4; /* 1 opcode + 4 displacement */
10491 opcode[0] = 0xe9;
10492 where_to_put_displacement = &opcode[1];
10493 break;
252b5132 10494
fddf5b5b
AM
10495 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
10496 extension = 2; /* 1 opcode + 2 displacement */
10497 opcode[0] = 0xe9;
10498 where_to_put_displacement = &opcode[1];
10499 break;
252b5132 10500
fddf5b5b
AM
10501 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
10502 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
10503 extension = 5; /* 2 opcode + 4 displacement */
10504 opcode[1] = opcode[0] + 0x10;
10505 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
10506 where_to_put_displacement = &opcode[2];
10507 break;
252b5132 10508
fddf5b5b
AM
10509 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
10510 extension = 3; /* 2 opcode + 2 displacement */
10511 opcode[1] = opcode[0] + 0x10;
10512 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
10513 where_to_put_displacement = &opcode[2];
10514 break;
252b5132 10515
fddf5b5b
AM
10516 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
10517 extension = 4;
10518 opcode[0] ^= 1;
10519 opcode[1] = 3;
10520 opcode[2] = 0xe9;
10521 where_to_put_displacement = &opcode[3];
10522 break;
10523
10524 default:
10525 BAD_CASE (fragP->fr_subtype);
10526 break;
10527 }
252b5132 10528 }
fddf5b5b 10529
7b81dfbb
AJ
10530 /* If size if less then four we are sure that the operand fits,
10531 but if it's 4, then it could be that the displacement is larger
10532 then -/+ 2GB. */
10533 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
10534 && object_64bit
10535 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
10536 + ((addressT) 1 << 31))
10537 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
10538 {
10539 as_bad_where (fragP->fr_file, fragP->fr_line,
10540 _("jump target out of range"));
10541 /* Make us emit 0. */
10542 displacement_from_opcode_start = extension;
10543 }
47926f60 10544 /* Now put displacement after opcode. */
252b5132
RH
10545 md_number_to_chars ((char *) where_to_put_displacement,
10546 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 10547 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
10548 fragP->fr_fix += extension;
10549}
10550\f
7016a5d5 10551/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
10552 by our caller that we have all the info we need to fix it up.
10553
7016a5d5
TG
10554 Parameter valP is the pointer to the value of the bits.
10555
252b5132
RH
10556 On the 386, immediates, displacements, and data pointers are all in
10557 the same (little-endian) format, so we don't need to care about which
10558 we are handling. */
10559
94f592af 10560void
7016a5d5 10561md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 10562{
94f592af 10563 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 10564 valueT value = *valP;
252b5132 10565
f86103b7 10566#if !defined (TE_Mach)
93382f6d
AM
10567 if (fixP->fx_pcrel)
10568 {
10569 switch (fixP->fx_r_type)
10570 {
5865bb77
ILT
10571 default:
10572 break;
10573
d6ab8113
JB
10574 case BFD_RELOC_64:
10575 fixP->fx_r_type = BFD_RELOC_64_PCREL;
10576 break;
93382f6d 10577 case BFD_RELOC_32:
ae8887b5 10578 case BFD_RELOC_X86_64_32S:
93382f6d
AM
10579 fixP->fx_r_type = BFD_RELOC_32_PCREL;
10580 break;
10581 case BFD_RELOC_16:
10582 fixP->fx_r_type = BFD_RELOC_16_PCREL;
10583 break;
10584 case BFD_RELOC_8:
10585 fixP->fx_r_type = BFD_RELOC_8_PCREL;
10586 break;
10587 }
10588 }
252b5132 10589
a161fe53 10590 if (fixP->fx_addsy != NULL
31312f95 10591 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 10592 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 10593 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 10594 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 10595 && !use_rela_relocations)
252b5132 10596 {
31312f95
AM
10597 /* This is a hack. There should be a better way to handle this.
10598 This covers for the fact that bfd_install_relocation will
10599 subtract the current location (for partial_inplace, PC relative
10600 relocations); see more below. */
252b5132 10601#ifndef OBJ_AOUT
718ddfc0 10602 if (IS_ELF
252b5132
RH
10603#ifdef TE_PE
10604 || OUTPUT_FLAVOR == bfd_target_coff_flavour
10605#endif
10606 )
10607 value += fixP->fx_where + fixP->fx_frag->fr_address;
10608#endif
10609#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 10610 if (IS_ELF)
252b5132 10611 {
6539b54b 10612 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 10613
6539b54b 10614 if ((sym_seg == seg
2f66722d 10615 || (symbol_section_p (fixP->fx_addsy)
6539b54b 10616 && sym_seg != absolute_section))
af65af87 10617 && !generic_force_reloc (fixP))
2f66722d
AM
10618 {
10619 /* Yes, we add the values in twice. This is because
6539b54b
AM
10620 bfd_install_relocation subtracts them out again. I think
10621 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
10622 it. FIXME. */
10623 value += fixP->fx_where + fixP->fx_frag->fr_address;
10624 }
252b5132
RH
10625 }
10626#endif
10627#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
10628 /* For some reason, the PE format does not store a
10629 section address offset for a PC relative symbol. */
10630 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 10631 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
10632 value += md_pcrel_from (fixP);
10633#endif
10634 }
fbeb56a4 10635#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
10636 if (fixP->fx_addsy != NULL
10637 && S_IS_WEAK (fixP->fx_addsy)
10638 /* PR 16858: Do not modify weak function references. */
10639 && ! fixP->fx_pcrel)
fbeb56a4 10640 {
296a8689
NC
10641#if !defined (TE_PEP)
10642 /* For x86 PE weak function symbols are neither PC-relative
10643 nor do they set S_IS_FUNCTION. So the only reliable way
10644 to detect them is to check the flags of their containing
10645 section. */
10646 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
10647 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
10648 ;
10649 else
10650#endif
fbeb56a4
DK
10651 value -= S_GET_VALUE (fixP->fx_addsy);
10652 }
10653#endif
252b5132
RH
10654
10655 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 10656 and we must not disappoint it. */
252b5132 10657#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 10658 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
10659 switch (fixP->fx_r_type)
10660 {
10661 case BFD_RELOC_386_PLT32:
3e73aa7c 10662 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
10663 /* Make the jump instruction point to the address of the operand.
10664 At runtime we merely add the offset to the actual PLT entry.
10665 NB: Subtract the offset size only for jump instructions. */
10666 if (fixP->fx_pcrel)
10667 value = -4;
47926f60 10668 break;
31312f95 10669
13ae64f3
JJ
10670 case BFD_RELOC_386_TLS_GD:
10671 case BFD_RELOC_386_TLS_LDM:
13ae64f3 10672 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
10673 case BFD_RELOC_386_TLS_IE:
10674 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 10675 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
10676 case BFD_RELOC_X86_64_TLSGD:
10677 case BFD_RELOC_X86_64_TLSLD:
10678 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 10679 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
10680 value = 0; /* Fully resolved at runtime. No addend. */
10681 /* Fallthrough */
10682 case BFD_RELOC_386_TLS_LE:
10683 case BFD_RELOC_386_TLS_LDO_32:
10684 case BFD_RELOC_386_TLS_LE_32:
10685 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 10686 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 10687 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 10688 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
10689 S_SET_THREAD_LOCAL (fixP->fx_addsy);
10690 break;
10691
67a4f2b7
AO
10692 case BFD_RELOC_386_TLS_DESC_CALL:
10693 case BFD_RELOC_X86_64_TLSDESC_CALL:
10694 value = 0; /* Fully resolved at runtime. No addend. */
10695 S_SET_THREAD_LOCAL (fixP->fx_addsy);
10696 fixP->fx_done = 0;
10697 return;
10698
47926f60
KH
10699 case BFD_RELOC_VTABLE_INHERIT:
10700 case BFD_RELOC_VTABLE_ENTRY:
10701 fixP->fx_done = 0;
94f592af 10702 return;
47926f60
KH
10703
10704 default:
10705 break;
10706 }
10707#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 10708 *valP = value;
f86103b7 10709#endif /* !defined (TE_Mach) */
3e73aa7c 10710
3e73aa7c 10711 /* Are we finished with this relocation now? */
c6682705 10712 if (fixP->fx_addsy == NULL)
3e73aa7c 10713 fixP->fx_done = 1;
fbeb56a4
DK
10714#if defined (OBJ_COFF) && defined (TE_PE)
10715 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
10716 {
10717 fixP->fx_done = 0;
10718 /* Remember value for tc_gen_reloc. */
10719 fixP->fx_addnumber = value;
10720 /* Clear out the frag for now. */
10721 value = 0;
10722 }
10723#endif
3e73aa7c
JH
10724 else if (use_rela_relocations)
10725 {
10726 fixP->fx_no_overflow = 1;
062cd5e7
AS
10727 /* Remember value for tc_gen_reloc. */
10728 fixP->fx_addnumber = value;
3e73aa7c
JH
10729 value = 0;
10730 }
f86103b7 10731
94f592af 10732 md_number_to_chars (p, value, fixP->fx_size);
252b5132 10733}
252b5132 10734\f
6d4af3c2 10735const char *
499ac353 10736md_atof (int type, char *litP, int *sizeP)
252b5132 10737{
499ac353
NC
10738 /* This outputs the LITTLENUMs in REVERSE order;
10739 in accord with the bigendian 386. */
10740 return ieee_md_atof (type, litP, sizeP, FALSE);
252b5132
RH
10741}
10742\f
2d545b82 10743static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 10744
252b5132 10745static char *
e3bb37b5 10746output_invalid (int c)
252b5132 10747{
3882b010 10748 if (ISPRINT (c))
f9f21a03
L
10749 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
10750 "'%c'", c);
252b5132 10751 else
f9f21a03 10752 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 10753 "(0x%x)", (unsigned char) c);
252b5132
RH
10754 return output_invalid_buf;
10755}
10756
af6bdddf 10757/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
10758
10759static const reg_entry *
4d1bb795 10760parse_real_register (char *reg_string, char **end_op)
252b5132 10761{
af6bdddf
AM
10762 char *s = reg_string;
10763 char *p;
252b5132
RH
10764 char reg_name_given[MAX_REG_NAME_SIZE + 1];
10765 const reg_entry *r;
10766
10767 /* Skip possible REGISTER_PREFIX and possible whitespace. */
10768 if (*s == REGISTER_PREFIX)
10769 ++s;
10770
10771 if (is_space_char (*s))
10772 ++s;
10773
10774 p = reg_name_given;
af6bdddf 10775 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
10776 {
10777 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
10778 return (const reg_entry *) NULL;
10779 s++;
252b5132
RH
10780 }
10781
6588847e
DN
10782 /* For naked regs, make sure that we are not dealing with an identifier.
10783 This prevents confusing an identifier like `eax_var' with register
10784 `eax'. */
10785 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
10786 return (const reg_entry *) NULL;
10787
af6bdddf 10788 *end_op = s;
252b5132
RH
10789
10790 r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
10791
5f47d35b 10792 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 10793 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 10794 {
0e0eea78
JB
10795 if (!cpu_arch_flags.bitfield.cpu8087
10796 && !cpu_arch_flags.bitfield.cpu287
10797 && !cpu_arch_flags.bitfield.cpu387)
10798 return (const reg_entry *) NULL;
10799
5f47d35b
AM
10800 if (is_space_char (*s))
10801 ++s;
10802 if (*s == '(')
10803 {
af6bdddf 10804 ++s;
5f47d35b
AM
10805 if (is_space_char (*s))
10806 ++s;
10807 if (*s >= '0' && *s <= '7')
10808 {
db557034 10809 int fpr = *s - '0';
af6bdddf 10810 ++s;
5f47d35b
AM
10811 if (is_space_char (*s))
10812 ++s;
10813 if (*s == ')')
10814 {
10815 *end_op = s + 1;
1e9cc1c2 10816 r = (const reg_entry *) hash_find (reg_hash, "st(0)");
db557034
AM
10817 know (r);
10818 return r + fpr;
5f47d35b 10819 }
5f47d35b 10820 }
47926f60 10821 /* We have "%st(" then garbage. */
5f47d35b
AM
10822 return (const reg_entry *) NULL;
10823 }
10824 }
10825
a60de03c
JB
10826 if (r == NULL || allow_pseudo_reg)
10827 return r;
10828
0dfbf9d7 10829 if (operand_type_all_zero (&r->reg_type))
a60de03c
JB
10830 return (const reg_entry *) NULL;
10831
dc821c5f 10832 if ((r->reg_type.bitfield.dword
192dc9c6
JB
10833 || r->reg_type.bitfield.sreg3
10834 || r->reg_type.bitfield.control
10835 || r->reg_type.bitfield.debug
10836 || r->reg_type.bitfield.test)
10837 && !cpu_arch_flags.bitfield.cpui386)
10838 return (const reg_entry *) NULL;
10839
6e041cf4 10840 if (r->reg_type.bitfield.regmmx && !cpu_arch_flags.bitfield.cpummx)
192dc9c6
JB
10841 return (const reg_entry *) NULL;
10842
6e041cf4
JB
10843 if (!cpu_arch_flags.bitfield.cpuavx512f)
10844 {
10845 if (r->reg_type.bitfield.zmmword || r->reg_type.bitfield.regmask)
10846 return (const reg_entry *) NULL;
40f12533 10847
6e041cf4
JB
10848 if (!cpu_arch_flags.bitfield.cpuavx)
10849 {
10850 if (r->reg_type.bitfield.ymmword)
10851 return (const reg_entry *) NULL;
1848e567 10852
6e041cf4
JB
10853 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
10854 return (const reg_entry *) NULL;
10855 }
10856 }
43234a1e 10857
1adf7f56
JB
10858 if (r->reg_type.bitfield.regbnd && !cpu_arch_flags.bitfield.cpumpx)
10859 return (const reg_entry *) NULL;
10860
db51cc60 10861 /* Don't allow fake index register unless allow_index_reg isn't 0. */
e968fc9b 10862 if (!allow_index_reg && r->reg_num == RegIZ)
db51cc60
L
10863 return (const reg_entry *) NULL;
10864
1d3f8286
JB
10865 /* Upper 16 vector registers are only available with VREX in 64bit
10866 mode, and require EVEX encoding. */
10867 if (r->reg_flags & RegVRex)
43234a1e 10868 {
e951d5ca 10869 if (!cpu_arch_flags.bitfield.cpuavx512f
43234a1e
L
10870 || flag_code != CODE_64BIT)
10871 return (const reg_entry *) NULL;
1d3f8286
JB
10872
10873 i.vec_encoding = vex_encoding_evex;
43234a1e
L
10874 }
10875
4787f4a5
JB
10876 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
10877 && (!cpu_arch_flags.bitfield.cpulm || !r->reg_type.bitfield.control)
1ae00879 10878 && flag_code != CODE_64BIT)
20f0a1fc 10879 return (const reg_entry *) NULL;
1ae00879 10880
b7240065
JB
10881 if (r->reg_type.bitfield.sreg3 && r->reg_num == RegFlat && !intel_syntax)
10882 return (const reg_entry *) NULL;
10883
252b5132
RH
10884 return r;
10885}
4d1bb795
JB
10886
10887/* REG_STRING starts *before* REGISTER_PREFIX. */
10888
10889static const reg_entry *
10890parse_register (char *reg_string, char **end_op)
10891{
10892 const reg_entry *r;
10893
10894 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
10895 r = parse_real_register (reg_string, end_op);
10896 else
10897 r = NULL;
10898 if (!r)
10899 {
10900 char *save = input_line_pointer;
10901 char c;
10902 symbolS *symbolP;
10903
10904 input_line_pointer = reg_string;
d02603dc 10905 c = get_symbol_name (&reg_string);
4d1bb795
JB
10906 symbolP = symbol_find (reg_string);
10907 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
10908 {
10909 const expressionS *e = symbol_get_value_expression (symbolP);
10910
0398aac5 10911 know (e->X_op == O_register);
4eed87de 10912 know (e->X_add_number >= 0
c3fe08fa 10913 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 10914 r = i386_regtab + e->X_add_number;
d3bb6b49 10915 if ((r->reg_flags & RegVRex))
86fa6981 10916 i.vec_encoding = vex_encoding_evex;
4d1bb795
JB
10917 *end_op = input_line_pointer;
10918 }
10919 *input_line_pointer = c;
10920 input_line_pointer = save;
10921 }
10922 return r;
10923}
10924
10925int
10926i386_parse_name (char *name, expressionS *e, char *nextcharP)
10927{
10928 const reg_entry *r;
10929 char *end = input_line_pointer;
10930
10931 *end = *nextcharP;
10932 r = parse_register (name, &input_line_pointer);
10933 if (r && end <= input_line_pointer)
10934 {
10935 *nextcharP = *input_line_pointer;
10936 *input_line_pointer = 0;
10937 e->X_op = O_register;
10938 e->X_add_number = r - i386_regtab;
10939 return 1;
10940 }
10941 input_line_pointer = end;
10942 *end = 0;
ee86248c 10943 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
10944}
10945
10946void
10947md_operand (expressionS *e)
10948{
ee86248c
JB
10949 char *end;
10950 const reg_entry *r;
4d1bb795 10951
ee86248c
JB
10952 switch (*input_line_pointer)
10953 {
10954 case REGISTER_PREFIX:
10955 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
10956 if (r)
10957 {
10958 e->X_op = O_register;
10959 e->X_add_number = r - i386_regtab;
10960 input_line_pointer = end;
10961 }
ee86248c
JB
10962 break;
10963
10964 case '[':
9c2799c2 10965 gas_assert (intel_syntax);
ee86248c
JB
10966 end = input_line_pointer++;
10967 expression (e);
10968 if (*input_line_pointer == ']')
10969 {
10970 ++input_line_pointer;
10971 e->X_op_symbol = make_expr_symbol (e);
10972 e->X_add_symbol = NULL;
10973 e->X_add_number = 0;
10974 e->X_op = O_index;
10975 }
10976 else
10977 {
10978 e->X_op = O_absent;
10979 input_line_pointer = end;
10980 }
10981 break;
4d1bb795
JB
10982 }
10983}
10984
252b5132 10985\f
4cc782b5 10986#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 10987const char *md_shortopts = "kVQ:sqnO::";
252b5132 10988#else
b6f8c7c4 10989const char *md_shortopts = "qnO::";
252b5132 10990#endif
6e0b89ee 10991
3e73aa7c 10992#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
10993#define OPTION_64 (OPTION_MD_BASE + 1)
10994#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
10995#define OPTION_MARCH (OPTION_MD_BASE + 3)
10996#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
10997#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
10998#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
10999#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
11000#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 11001#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 11002#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 11003#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
11004#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
11005#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
11006#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 11007#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
11008#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
11009#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 11010#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 11011#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 11012#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 11013#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
11014#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
11015#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 11016#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 11017#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 11018#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
b3b91714 11019
99ad8390
NC
11020struct option md_longopts[] =
11021{
3e73aa7c 11022 {"32", no_argument, NULL, OPTION_32},
321098a5 11023#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 11024 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 11025 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
11026#endif
11027#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 11028 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 11029 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 11030 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 11031#endif
b3b91714 11032 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
11033 {"march", required_argument, NULL, OPTION_MARCH},
11034 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
11035 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
11036 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
11037 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
11038 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 11039 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 11040 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 11041 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 11042 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 11043 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 11044 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
11045 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
11046 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
11047# if defined (TE_PE) || defined (TE_PEP)
11048 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
11049#endif
d1982f93 11050 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 11051 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 11052 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 11053 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
5db04b09
L
11054 {"mamd64", no_argument, NULL, OPTION_MAMD64},
11055 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
11056 {NULL, no_argument, NULL, 0}
11057};
11058size_t md_longopts_size = sizeof (md_longopts);
11059
11060int
17b9d67d 11061md_parse_option (int c, const char *arg)
252b5132 11062{
91d6fa6a 11063 unsigned int j;
293f5f65 11064 char *arch, *next, *saved;
9103f4f4 11065
252b5132
RH
11066 switch (c)
11067 {
12b55ccc
L
11068 case 'n':
11069 optimize_align_code = 0;
11070 break;
11071
a38cf1db
AM
11072 case 'q':
11073 quiet_warnings = 1;
252b5132
RH
11074 break;
11075
11076#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
11077 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
11078 should be emitted or not. FIXME: Not implemented. */
11079 case 'Q':
252b5132
RH
11080 break;
11081
11082 /* -V: SVR4 argument to print version ID. */
11083 case 'V':
11084 print_version_id ();
11085 break;
11086
a38cf1db
AM
11087 /* -k: Ignore for FreeBSD compatibility. */
11088 case 'k':
252b5132 11089 break;
4cc782b5
ILT
11090
11091 case 's':
11092 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 11093 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 11094 break;
8dcea932
L
11095
11096 case OPTION_MSHARED:
11097 shared = 1;
11098 break;
b4a3a7b4
L
11099
11100 case OPTION_X86_USED_NOTE:
11101 if (strcasecmp (arg, "yes") == 0)
11102 x86_used_note = 1;
11103 else if (strcasecmp (arg, "no") == 0)
11104 x86_used_note = 0;
11105 else
11106 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
11107 break;
11108
11109
99ad8390 11110#endif
321098a5 11111#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 11112 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
11113 case OPTION_64:
11114 {
11115 const char **list, **l;
11116
3e73aa7c
JH
11117 list = bfd_target_list ();
11118 for (l = list; *l != NULL; l++)
8620418b 11119 if (CONST_STRNEQ (*l, "elf64-x86-64")
99ad8390
NC
11120 || strcmp (*l, "coff-x86-64") == 0
11121 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
11122 || strcmp (*l, "pei-x86-64") == 0
11123 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
11124 {
11125 default_arch = "x86_64";
11126 break;
11127 }
3e73aa7c 11128 if (*l == NULL)
2b5d6a91 11129 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
11130 free (list);
11131 }
11132 break;
11133#endif
252b5132 11134
351f65ca 11135#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 11136 case OPTION_X32:
351f65ca
L
11137 if (IS_ELF)
11138 {
11139 const char **list, **l;
11140
11141 list = bfd_target_list ();
11142 for (l = list; *l != NULL; l++)
11143 if (CONST_STRNEQ (*l, "elf32-x86-64"))
11144 {
11145 default_arch = "x86_64:32";
11146 break;
11147 }
11148 if (*l == NULL)
2b5d6a91 11149 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
11150 free (list);
11151 }
11152 else
11153 as_fatal (_("32bit x86_64 is only supported for ELF"));
11154 break;
11155#endif
11156
6e0b89ee
AM
11157 case OPTION_32:
11158 default_arch = "i386";
11159 break;
11160
b3b91714
AM
11161 case OPTION_DIVIDE:
11162#ifdef SVR4_COMMENT_CHARS
11163 {
11164 char *n, *t;
11165 const char *s;
11166
add39d23 11167 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
11168 t = n;
11169 for (s = i386_comment_chars; *s != '\0'; s++)
11170 if (*s != '/')
11171 *t++ = *s;
11172 *t = '\0';
11173 i386_comment_chars = n;
11174 }
11175#endif
11176 break;
11177
9103f4f4 11178 case OPTION_MARCH:
293f5f65
L
11179 saved = xstrdup (arg);
11180 arch = saved;
11181 /* Allow -march=+nosse. */
11182 if (*arch == '+')
11183 arch++;
6305a203 11184 do
9103f4f4 11185 {
6305a203 11186 if (*arch == '.')
2b5d6a91 11187 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
11188 next = strchr (arch, '+');
11189 if (next)
11190 *next++ = '\0';
91d6fa6a 11191 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 11192 {
91d6fa6a 11193 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 11194 {
6305a203 11195 /* Processor. */
1ded5609
JB
11196 if (! cpu_arch[j].flags.bitfield.cpui386)
11197 continue;
11198
91d6fa6a 11199 cpu_arch_name = cpu_arch[j].name;
6305a203 11200 cpu_sub_arch_name = NULL;
91d6fa6a
NC
11201 cpu_arch_flags = cpu_arch[j].flags;
11202 cpu_arch_isa = cpu_arch[j].type;
11203 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
11204 if (!cpu_arch_tune_set)
11205 {
11206 cpu_arch_tune = cpu_arch_isa;
11207 cpu_arch_tune_flags = cpu_arch_isa_flags;
11208 }
11209 break;
11210 }
91d6fa6a
NC
11211 else if (*cpu_arch [j].name == '.'
11212 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 11213 {
33eaf5de 11214 /* ISA extension. */
6305a203 11215 i386_cpu_flags flags;
309d3373 11216
293f5f65
L
11217 flags = cpu_flags_or (cpu_arch_flags,
11218 cpu_arch[j].flags);
81486035 11219
5b64d091 11220 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
11221 {
11222 if (cpu_sub_arch_name)
11223 {
11224 char *name = cpu_sub_arch_name;
11225 cpu_sub_arch_name = concat (name,
91d6fa6a 11226 cpu_arch[j].name,
1bf57e9f 11227 (const char *) NULL);
6305a203
L
11228 free (name);
11229 }
11230 else
91d6fa6a 11231 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 11232 cpu_arch_flags = flags;
a586129e 11233 cpu_arch_isa_flags = flags;
6305a203 11234 }
0089dace
L
11235 else
11236 cpu_arch_isa_flags
11237 = cpu_flags_or (cpu_arch_isa_flags,
11238 cpu_arch[j].flags);
6305a203 11239 break;
ccc9c027 11240 }
9103f4f4 11241 }
6305a203 11242
293f5f65
L
11243 if (j >= ARRAY_SIZE (cpu_arch))
11244 {
33eaf5de 11245 /* Disable an ISA extension. */
293f5f65
L
11246 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
11247 if (strcmp (arch, cpu_noarch [j].name) == 0)
11248 {
11249 i386_cpu_flags flags;
11250
11251 flags = cpu_flags_and_not (cpu_arch_flags,
11252 cpu_noarch[j].flags);
11253 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
11254 {
11255 if (cpu_sub_arch_name)
11256 {
11257 char *name = cpu_sub_arch_name;
11258 cpu_sub_arch_name = concat (arch,
11259 (const char *) NULL);
11260 free (name);
11261 }
11262 else
11263 cpu_sub_arch_name = xstrdup (arch);
11264 cpu_arch_flags = flags;
11265 cpu_arch_isa_flags = flags;
11266 }
11267 break;
11268 }
11269
11270 if (j >= ARRAY_SIZE (cpu_noarch))
11271 j = ARRAY_SIZE (cpu_arch);
11272 }
11273
91d6fa6a 11274 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 11275 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
11276
11277 arch = next;
9103f4f4 11278 }
293f5f65
L
11279 while (next != NULL);
11280 free (saved);
9103f4f4
L
11281 break;
11282
11283 case OPTION_MTUNE:
11284 if (*arg == '.')
2b5d6a91 11285 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 11286 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 11287 {
91d6fa6a 11288 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 11289 {
ccc9c027 11290 cpu_arch_tune_set = 1;
91d6fa6a
NC
11291 cpu_arch_tune = cpu_arch [j].type;
11292 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
11293 break;
11294 }
11295 }
91d6fa6a 11296 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 11297 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
11298 break;
11299
1efbbeb4
L
11300 case OPTION_MMNEMONIC:
11301 if (strcasecmp (arg, "att") == 0)
11302 intel_mnemonic = 0;
11303 else if (strcasecmp (arg, "intel") == 0)
11304 intel_mnemonic = 1;
11305 else
2b5d6a91 11306 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
11307 break;
11308
11309 case OPTION_MSYNTAX:
11310 if (strcasecmp (arg, "att") == 0)
11311 intel_syntax = 0;
11312 else if (strcasecmp (arg, "intel") == 0)
11313 intel_syntax = 1;
11314 else
2b5d6a91 11315 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
11316 break;
11317
11318 case OPTION_MINDEX_REG:
11319 allow_index_reg = 1;
11320 break;
11321
11322 case OPTION_MNAKED_REG:
11323 allow_naked_reg = 1;
11324 break;
11325
c0f3af97
L
11326 case OPTION_MSSE2AVX:
11327 sse2avx = 1;
11328 break;
11329
daf50ae7
L
11330 case OPTION_MSSE_CHECK:
11331 if (strcasecmp (arg, "error") == 0)
7bab8ab5 11332 sse_check = check_error;
daf50ae7 11333 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 11334 sse_check = check_warning;
daf50ae7 11335 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 11336 sse_check = check_none;
daf50ae7 11337 else
2b5d6a91 11338 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
11339 break;
11340
7bab8ab5
JB
11341 case OPTION_MOPERAND_CHECK:
11342 if (strcasecmp (arg, "error") == 0)
11343 operand_check = check_error;
11344 else if (strcasecmp (arg, "warning") == 0)
11345 operand_check = check_warning;
11346 else if (strcasecmp (arg, "none") == 0)
11347 operand_check = check_none;
11348 else
11349 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
11350 break;
11351
539f890d
L
11352 case OPTION_MAVXSCALAR:
11353 if (strcasecmp (arg, "128") == 0)
11354 avxscalar = vex128;
11355 else if (strcasecmp (arg, "256") == 0)
11356 avxscalar = vex256;
11357 else
2b5d6a91 11358 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
11359 break;
11360
03751133
L
11361 case OPTION_MVEXWIG:
11362 if (strcmp (arg, "0") == 0)
11363 vexwig = evexw0;
11364 else if (strcmp (arg, "1") == 0)
11365 vexwig = evexw1;
11366 else
11367 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
11368 break;
11369
7e8b059b
L
11370 case OPTION_MADD_BND_PREFIX:
11371 add_bnd_prefix = 1;
11372 break;
11373
43234a1e
L
11374 case OPTION_MEVEXLIG:
11375 if (strcmp (arg, "128") == 0)
11376 evexlig = evexl128;
11377 else if (strcmp (arg, "256") == 0)
11378 evexlig = evexl256;
11379 else if (strcmp (arg, "512") == 0)
11380 evexlig = evexl512;
11381 else
11382 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
11383 break;
11384
d3d3c6db
IT
11385 case OPTION_MEVEXRCIG:
11386 if (strcmp (arg, "rne") == 0)
11387 evexrcig = rne;
11388 else if (strcmp (arg, "rd") == 0)
11389 evexrcig = rd;
11390 else if (strcmp (arg, "ru") == 0)
11391 evexrcig = ru;
11392 else if (strcmp (arg, "rz") == 0)
11393 evexrcig = rz;
11394 else
11395 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
11396 break;
11397
43234a1e
L
11398 case OPTION_MEVEXWIG:
11399 if (strcmp (arg, "0") == 0)
11400 evexwig = evexw0;
11401 else if (strcmp (arg, "1") == 0)
11402 evexwig = evexw1;
11403 else
11404 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
11405 break;
11406
167ad85b
TG
11407# if defined (TE_PE) || defined (TE_PEP)
11408 case OPTION_MBIG_OBJ:
11409 use_big_obj = 1;
11410 break;
11411#endif
11412
d1982f93 11413 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
11414 if (strcasecmp (arg, "yes") == 0)
11415 omit_lock_prefix = 1;
11416 else if (strcasecmp (arg, "no") == 0)
11417 omit_lock_prefix = 0;
11418 else
11419 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
11420 break;
11421
e4e00185
AS
11422 case OPTION_MFENCE_AS_LOCK_ADD:
11423 if (strcasecmp (arg, "yes") == 0)
11424 avoid_fence = 1;
11425 else if (strcasecmp (arg, "no") == 0)
11426 avoid_fence = 0;
11427 else
11428 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
11429 break;
11430
0cb4071e
L
11431 case OPTION_MRELAX_RELOCATIONS:
11432 if (strcasecmp (arg, "yes") == 0)
11433 generate_relax_relocations = 1;
11434 else if (strcasecmp (arg, "no") == 0)
11435 generate_relax_relocations = 0;
11436 else
11437 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
11438 break;
11439
5db04b09 11440 case OPTION_MAMD64:
e89c5eaa 11441 intel64 = 0;
5db04b09
L
11442 break;
11443
11444 case OPTION_MINTEL64:
e89c5eaa 11445 intel64 = 1;
5db04b09
L
11446 break;
11447
b6f8c7c4
L
11448 case 'O':
11449 if (arg == NULL)
11450 {
11451 optimize = 1;
11452 /* Turn off -Os. */
11453 optimize_for_space = 0;
11454 }
11455 else if (*arg == 's')
11456 {
11457 optimize_for_space = 1;
11458 /* Turn on all encoding optimizations. */
41fd2579 11459 optimize = INT_MAX;
b6f8c7c4
L
11460 }
11461 else
11462 {
11463 optimize = atoi (arg);
11464 /* Turn off -Os. */
11465 optimize_for_space = 0;
11466 }
11467 break;
11468
252b5132
RH
11469 default:
11470 return 0;
11471 }
11472 return 1;
11473}
11474
8a2c8fef
L
11475#define MESSAGE_TEMPLATE \
11476" "
11477
293f5f65
L
11478static char *
11479output_message (FILE *stream, char *p, char *message, char *start,
11480 int *left_p, const char *name, int len)
11481{
11482 int size = sizeof (MESSAGE_TEMPLATE);
11483 int left = *left_p;
11484
11485 /* Reserve 2 spaces for ", " or ",\0" */
11486 left -= len + 2;
11487
11488 /* Check if there is any room. */
11489 if (left >= 0)
11490 {
11491 if (p != start)
11492 {
11493 *p++ = ',';
11494 *p++ = ' ';
11495 }
11496 p = mempcpy (p, name, len);
11497 }
11498 else
11499 {
11500 /* Output the current message now and start a new one. */
11501 *p++ = ',';
11502 *p = '\0';
11503 fprintf (stream, "%s\n", message);
11504 p = start;
11505 left = size - (start - message) - len - 2;
11506
11507 gas_assert (left >= 0);
11508
11509 p = mempcpy (p, name, len);
11510 }
11511
11512 *left_p = left;
11513 return p;
11514}
11515
8a2c8fef 11516static void
1ded5609 11517show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
11518{
11519 static char message[] = MESSAGE_TEMPLATE;
11520 char *start = message + 27;
11521 char *p;
11522 int size = sizeof (MESSAGE_TEMPLATE);
11523 int left;
11524 const char *name;
11525 int len;
11526 unsigned int j;
11527
11528 p = start;
11529 left = size - (start - message);
11530 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
11531 {
11532 /* Should it be skipped? */
11533 if (cpu_arch [j].skip)
11534 continue;
11535
11536 name = cpu_arch [j].name;
11537 len = cpu_arch [j].len;
11538 if (*name == '.')
11539 {
11540 /* It is an extension. Skip if we aren't asked to show it. */
11541 if (ext)
11542 {
11543 name++;
11544 len--;
11545 }
11546 else
11547 continue;
11548 }
11549 else if (ext)
11550 {
11551 /* It is an processor. Skip if we show only extension. */
11552 continue;
11553 }
1ded5609
JB
11554 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
11555 {
11556 /* It is an impossible processor - skip. */
11557 continue;
11558 }
8a2c8fef 11559
293f5f65 11560 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
11561 }
11562
293f5f65
L
11563 /* Display disabled extensions. */
11564 if (ext)
11565 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
11566 {
11567 name = cpu_noarch [j].name;
11568 len = cpu_noarch [j].len;
11569 p = output_message (stream, p, message, start, &left, name,
11570 len);
11571 }
11572
8a2c8fef
L
11573 *p = '\0';
11574 fprintf (stream, "%s\n", message);
11575}
11576
252b5132 11577void
8a2c8fef 11578md_show_usage (FILE *stream)
252b5132 11579{
4cc782b5
ILT
11580#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11581 fprintf (stream, _("\
a38cf1db
AM
11582 -Q ignored\n\
11583 -V print assembler version number\n\
b3b91714
AM
11584 -k ignored\n"));
11585#endif
11586 fprintf (stream, _("\
12b55ccc 11587 -n Do not optimize code alignment\n\
b3b91714
AM
11588 -q quieten some warnings\n"));
11589#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11590 fprintf (stream, _("\
a38cf1db 11591 -s ignored\n"));
b3b91714 11592#endif
d7f449c0
L
11593#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
11594 || defined (TE_PE) || defined (TE_PEP))
751d281c 11595 fprintf (stream, _("\
570561f7 11596 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 11597#endif
b3b91714
AM
11598#ifdef SVR4_COMMENT_CHARS
11599 fprintf (stream, _("\
11600 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
11601#else
11602 fprintf (stream, _("\
b3b91714 11603 --divide ignored\n"));
4cc782b5 11604#endif
9103f4f4 11605 fprintf (stream, _("\
6305a203 11606 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 11607 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 11608 show_arch (stream, 0, 1);
8a2c8fef
L
11609 fprintf (stream, _("\
11610 EXTENSION is combination of:\n"));
1ded5609 11611 show_arch (stream, 1, 0);
6305a203 11612 fprintf (stream, _("\
8a2c8fef 11613 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 11614 show_arch (stream, 0, 0);
ba104c83 11615 fprintf (stream, _("\
c0f3af97
L
11616 -msse2avx encode SSE instructions with VEX prefix\n"));
11617 fprintf (stream, _("\
7c5c05ef 11618 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
11619 check SSE instructions\n"));
11620 fprintf (stream, _("\
7c5c05ef 11621 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
11622 check operand combinations for validity\n"));
11623 fprintf (stream, _("\
7c5c05ef
L
11624 -mavxscalar=[128|256] (default: 128)\n\
11625 encode scalar AVX instructions with specific vector\n\
539f890d
L
11626 length\n"));
11627 fprintf (stream, _("\
03751133
L
11628 -mvexwig=[0|1] (default: 0)\n\
11629 encode VEX instructions with specific VEX.W value\n\
11630 for VEX.W bit ignored instructions\n"));
11631 fprintf (stream, _("\
7c5c05ef
L
11632 -mevexlig=[128|256|512] (default: 128)\n\
11633 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
11634 length\n"));
11635 fprintf (stream, _("\
7c5c05ef
L
11636 -mevexwig=[0|1] (default: 0)\n\
11637 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
11638 for EVEX.W bit ignored instructions\n"));
11639 fprintf (stream, _("\
7c5c05ef 11640 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
11641 encode EVEX instructions with specific EVEX.RC value\n\
11642 for SAE-only ignored instructions\n"));
11643 fprintf (stream, _("\
7c5c05ef
L
11644 -mmnemonic=[att|intel] "));
11645 if (SYSV386_COMPAT)
11646 fprintf (stream, _("(default: att)\n"));
11647 else
11648 fprintf (stream, _("(default: intel)\n"));
11649 fprintf (stream, _("\
11650 use AT&T/Intel mnemonic\n"));
ba104c83 11651 fprintf (stream, _("\
7c5c05ef
L
11652 -msyntax=[att|intel] (default: att)\n\
11653 use AT&T/Intel syntax\n"));
ba104c83
L
11654 fprintf (stream, _("\
11655 -mindex-reg support pseudo index registers\n"));
11656 fprintf (stream, _("\
11657 -mnaked-reg don't require `%%' prefix for registers\n"));
11658 fprintf (stream, _("\
7e8b059b 11659 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 11660#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
11661 fprintf (stream, _("\
11662 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
11663 fprintf (stream, _("\
11664 -mx86-used-note=[no|yes] "));
11665 if (DEFAULT_X86_USED_NOTE)
11666 fprintf (stream, _("(default: yes)\n"));
11667 else
11668 fprintf (stream, _("(default: no)\n"));
11669 fprintf (stream, _("\
11670 generate x86 used ISA and feature properties\n"));
11671#endif
11672#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
11673 fprintf (stream, _("\
11674 -mbig-obj generate big object files\n"));
11675#endif
d022bddd 11676 fprintf (stream, _("\
7c5c05ef 11677 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 11678 strip all lock prefixes\n"));
5db04b09 11679 fprintf (stream, _("\
7c5c05ef 11680 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
11681 encode lfence, mfence and sfence as\n\
11682 lock addl $0x0, (%%{re}sp)\n"));
11683 fprintf (stream, _("\
7c5c05ef
L
11684 -mrelax-relocations=[no|yes] "));
11685 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
11686 fprintf (stream, _("(default: yes)\n"));
11687 else
11688 fprintf (stream, _("(default: no)\n"));
11689 fprintf (stream, _("\
0cb4071e
L
11690 generate relax relocations\n"));
11691 fprintf (stream, _("\
7c5c05ef 11692 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
11693 fprintf (stream, _("\
11694 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
11695}
11696
3e73aa7c 11697#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 11698 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 11699 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
11700
11701/* Pick the target format to use. */
11702
47926f60 11703const char *
e3bb37b5 11704i386_target_format (void)
252b5132 11705{
351f65ca
L
11706 if (!strncmp (default_arch, "x86_64", 6))
11707 {
11708 update_code_flag (CODE_64BIT, 1);
11709 if (default_arch[6] == '\0')
7f56bc95 11710 x86_elf_abi = X86_64_ABI;
351f65ca 11711 else
7f56bc95 11712 x86_elf_abi = X86_64_X32_ABI;
351f65ca 11713 }
3e73aa7c 11714 else if (!strcmp (default_arch, "i386"))
78f12dd3 11715 update_code_flag (CODE_32BIT, 1);
5197d474
L
11716 else if (!strcmp (default_arch, "iamcu"))
11717 {
11718 update_code_flag (CODE_32BIT, 1);
11719 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
11720 {
11721 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
11722 cpu_arch_name = "iamcu";
11723 cpu_sub_arch_name = NULL;
11724 cpu_arch_flags = iamcu_flags;
11725 cpu_arch_isa = PROCESSOR_IAMCU;
11726 cpu_arch_isa_flags = iamcu_flags;
11727 if (!cpu_arch_tune_set)
11728 {
11729 cpu_arch_tune = cpu_arch_isa;
11730 cpu_arch_tune_flags = cpu_arch_isa_flags;
11731 }
11732 }
8d471ec1 11733 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
11734 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
11735 cpu_arch_name);
11736 }
3e73aa7c 11737 else
2b5d6a91 11738 as_fatal (_("unknown architecture"));
89507696
JB
11739
11740 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
11741 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
11742 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
11743 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
11744
252b5132
RH
11745 switch (OUTPUT_FLAVOR)
11746 {
9384f2ff 11747#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 11748 case bfd_target_aout_flavour:
47926f60 11749 return AOUT_TARGET_FORMAT;
4c63da97 11750#endif
9384f2ff
AM
11751#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
11752# if defined (TE_PE) || defined (TE_PEP)
11753 case bfd_target_coff_flavour:
167ad85b
TG
11754 if (flag_code == CODE_64BIT)
11755 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
11756 else
11757 return "pe-i386";
9384f2ff 11758# elif defined (TE_GO32)
0561d57c
JK
11759 case bfd_target_coff_flavour:
11760 return "coff-go32";
9384f2ff 11761# else
252b5132
RH
11762 case bfd_target_coff_flavour:
11763 return "coff-i386";
9384f2ff 11764# endif
4c63da97 11765#endif
3e73aa7c 11766#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 11767 case bfd_target_elf_flavour:
3e73aa7c 11768 {
351f65ca
L
11769 const char *format;
11770
11771 switch (x86_elf_abi)
4fa24527 11772 {
351f65ca
L
11773 default:
11774 format = ELF_TARGET_FORMAT;
11775 break;
7f56bc95 11776 case X86_64_ABI:
351f65ca 11777 use_rela_relocations = 1;
4fa24527 11778 object_64bit = 1;
351f65ca
L
11779 format = ELF_TARGET_FORMAT64;
11780 break;
7f56bc95 11781 case X86_64_X32_ABI:
4fa24527 11782 use_rela_relocations = 1;
351f65ca 11783 object_64bit = 1;
862be3fb 11784 disallow_64bit_reloc = 1;
351f65ca
L
11785 format = ELF_TARGET_FORMAT32;
11786 break;
4fa24527 11787 }
3632d14b 11788 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 11789 {
7f56bc95 11790 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
11791 as_fatal (_("Intel L1OM is 64bit only"));
11792 return ELF_TARGET_L1OM_FORMAT;
11793 }
b49f93f6 11794 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
11795 {
11796 if (x86_elf_abi != X86_64_ABI)
11797 as_fatal (_("Intel K1OM is 64bit only"));
11798 return ELF_TARGET_K1OM_FORMAT;
11799 }
81486035
L
11800 else if (cpu_arch_isa == PROCESSOR_IAMCU)
11801 {
11802 if (x86_elf_abi != I386_ABI)
11803 as_fatal (_("Intel MCU is 32bit only"));
11804 return ELF_TARGET_IAMCU_FORMAT;
11805 }
8a9036a4 11806 else
351f65ca 11807 return format;
3e73aa7c 11808 }
e57f8c65
TG
11809#endif
11810#if defined (OBJ_MACH_O)
11811 case bfd_target_mach_o_flavour:
d382c579
TG
11812 if (flag_code == CODE_64BIT)
11813 {
11814 use_rela_relocations = 1;
11815 object_64bit = 1;
11816 return "mach-o-x86-64";
11817 }
11818 else
11819 return "mach-o-i386";
4c63da97 11820#endif
252b5132
RH
11821 default:
11822 abort ();
11823 return NULL;
11824 }
11825}
11826
47926f60 11827#endif /* OBJ_MAYBE_ more than one */
252b5132 11828\f
252b5132 11829symbolS *
7016a5d5 11830md_undefined_symbol (char *name)
252b5132 11831{
18dc2407
ILT
11832 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
11833 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
11834 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
11835 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
11836 {
11837 if (!GOT_symbol)
11838 {
11839 if (symbol_find (name))
11840 as_bad (_("GOT already in symbol table"));
11841 GOT_symbol = symbol_new (name, undefined_section,
11842 (valueT) 0, &zero_address_frag);
11843 };
11844 return GOT_symbol;
11845 }
252b5132
RH
11846 return 0;
11847}
11848
11849/* Round up a section size to the appropriate boundary. */
47926f60 11850
252b5132 11851valueT
7016a5d5 11852md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 11853{
4c63da97
AM
11854#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
11855 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
11856 {
11857 /* For a.out, force the section size to be aligned. If we don't do
11858 this, BFD will align it for us, but it will not write out the
11859 final bytes of the section. This may be a bug in BFD, but it is
11860 easier to fix it here since that is how the other a.out targets
11861 work. */
11862 int align;
11863
11864 align = bfd_get_section_alignment (stdoutput, segment);
8d3842cd 11865 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 11866 }
252b5132
RH
11867#endif
11868
11869 return size;
11870}
11871
11872/* On the i386, PC-relative offsets are relative to the start of the
11873 next instruction. That is, the address of the offset, plus its
11874 size, since the offset is always the last part of the insn. */
11875
11876long
e3bb37b5 11877md_pcrel_from (fixS *fixP)
252b5132
RH
11878{
11879 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
11880}
11881
11882#ifndef I386COFF
11883
11884static void
e3bb37b5 11885s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 11886{
29b0f896 11887 int temp;
252b5132 11888
8a75718c
JB
11889#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11890 if (IS_ELF)
11891 obj_elf_section_change_hook ();
11892#endif
252b5132
RH
11893 temp = get_absolute_expression ();
11894 subseg_set (bss_section, (subsegT) temp);
11895 demand_empty_rest_of_line ();
11896}
11897
11898#endif
11899
252b5132 11900void
e3bb37b5 11901i386_validate_fix (fixS *fixp)
252b5132 11902{
02a86693 11903 if (fixp->fx_subsy)
252b5132 11904 {
02a86693 11905 if (fixp->fx_subsy == GOT_symbol)
23df1078 11906 {
02a86693
L
11907 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
11908 {
11909 if (!object_64bit)
11910 abort ();
11911#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11912 if (fixp->fx_tcbit2)
56ceb5b5
L
11913 fixp->fx_r_type = (fixp->fx_tcbit
11914 ? BFD_RELOC_X86_64_REX_GOTPCRELX
11915 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
11916 else
11917#endif
11918 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
11919 }
d6ab8113 11920 else
02a86693
L
11921 {
11922 if (!object_64bit)
11923 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
11924 else
11925 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
11926 }
11927 fixp->fx_subsy = 0;
23df1078 11928 }
252b5132 11929 }
02a86693
L
11930#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11931 else if (!object_64bit)
11932 {
11933 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
11934 && fixp->fx_tcbit2)
11935 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
11936 }
11937#endif
252b5132
RH
11938}
11939
252b5132 11940arelent *
7016a5d5 11941tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
11942{
11943 arelent *rel;
11944 bfd_reloc_code_real_type code;
11945
11946 switch (fixp->fx_r_type)
11947 {
8ce3d284 11948#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
11949 case BFD_RELOC_SIZE32:
11950 case BFD_RELOC_SIZE64:
11951 if (S_IS_DEFINED (fixp->fx_addsy)
11952 && !S_IS_EXTERNAL (fixp->fx_addsy))
11953 {
11954 /* Resolve size relocation against local symbol to size of
11955 the symbol plus addend. */
11956 valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
11957 if (fixp->fx_r_type == BFD_RELOC_SIZE32
11958 && !fits_in_unsigned_long (value))
11959 as_bad_where (fixp->fx_file, fixp->fx_line,
11960 _("symbol size computation overflow"));
11961 fixp->fx_addsy = NULL;
11962 fixp->fx_subsy = NULL;
11963 md_apply_fix (fixp, (valueT *) &value, NULL);
11964 return NULL;
11965 }
8ce3d284 11966#endif
1a0670f3 11967 /* Fall through. */
8fd4256d 11968
3e73aa7c
JH
11969 case BFD_RELOC_X86_64_PLT32:
11970 case BFD_RELOC_X86_64_GOT32:
11971 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
11972 case BFD_RELOC_X86_64_GOTPCRELX:
11973 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
11974 case BFD_RELOC_386_PLT32:
11975 case BFD_RELOC_386_GOT32:
02a86693 11976 case BFD_RELOC_386_GOT32X:
252b5132
RH
11977 case BFD_RELOC_386_GOTOFF:
11978 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
11979 case BFD_RELOC_386_TLS_GD:
11980 case BFD_RELOC_386_TLS_LDM:
11981 case BFD_RELOC_386_TLS_LDO_32:
11982 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
11983 case BFD_RELOC_386_TLS_IE:
11984 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
11985 case BFD_RELOC_386_TLS_LE_32:
11986 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
11987 case BFD_RELOC_386_TLS_GOTDESC:
11988 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
11989 case BFD_RELOC_X86_64_TLSGD:
11990 case BFD_RELOC_X86_64_TLSLD:
11991 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 11992 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
11993 case BFD_RELOC_X86_64_GOTTPOFF:
11994 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
11995 case BFD_RELOC_X86_64_TPOFF64:
11996 case BFD_RELOC_X86_64_GOTOFF64:
11997 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
11998 case BFD_RELOC_X86_64_GOT64:
11999 case BFD_RELOC_X86_64_GOTPCREL64:
12000 case BFD_RELOC_X86_64_GOTPC64:
12001 case BFD_RELOC_X86_64_GOTPLT64:
12002 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
12003 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
12004 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
12005 case BFD_RELOC_RVA:
12006 case BFD_RELOC_VTABLE_ENTRY:
12007 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
12008#ifdef TE_PE
12009 case BFD_RELOC_32_SECREL:
12010#endif
252b5132
RH
12011 code = fixp->fx_r_type;
12012 break;
dbbaec26
L
12013 case BFD_RELOC_X86_64_32S:
12014 if (!fixp->fx_pcrel)
12015 {
12016 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
12017 code = fixp->fx_r_type;
12018 break;
12019 }
1a0670f3 12020 /* Fall through. */
252b5132 12021 default:
93382f6d 12022 if (fixp->fx_pcrel)
252b5132 12023 {
93382f6d
AM
12024 switch (fixp->fx_size)
12025 {
12026 default:
b091f402
AM
12027 as_bad_where (fixp->fx_file, fixp->fx_line,
12028 _("can not do %d byte pc-relative relocation"),
12029 fixp->fx_size);
93382f6d
AM
12030 code = BFD_RELOC_32_PCREL;
12031 break;
12032 case 1: code = BFD_RELOC_8_PCREL; break;
12033 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 12034 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
12035#ifdef BFD64
12036 case 8: code = BFD_RELOC_64_PCREL; break;
12037#endif
93382f6d
AM
12038 }
12039 }
12040 else
12041 {
12042 switch (fixp->fx_size)
12043 {
12044 default:
b091f402
AM
12045 as_bad_where (fixp->fx_file, fixp->fx_line,
12046 _("can not do %d byte relocation"),
12047 fixp->fx_size);
93382f6d
AM
12048 code = BFD_RELOC_32;
12049 break;
12050 case 1: code = BFD_RELOC_8; break;
12051 case 2: code = BFD_RELOC_16; break;
12052 case 4: code = BFD_RELOC_32; break;
937149dd 12053#ifdef BFD64
3e73aa7c 12054 case 8: code = BFD_RELOC_64; break;
937149dd 12055#endif
93382f6d 12056 }
252b5132
RH
12057 }
12058 break;
12059 }
252b5132 12060
d182319b
JB
12061 if ((code == BFD_RELOC_32
12062 || code == BFD_RELOC_32_PCREL
12063 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
12064 && GOT_symbol
12065 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 12066 {
4fa24527 12067 if (!object_64bit)
d6ab8113
JB
12068 code = BFD_RELOC_386_GOTPC;
12069 else
12070 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 12071 }
7b81dfbb
AJ
12072 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
12073 && GOT_symbol
12074 && fixp->fx_addsy == GOT_symbol)
12075 {
12076 code = BFD_RELOC_X86_64_GOTPC64;
12077 }
252b5132 12078
add39d23
TS
12079 rel = XNEW (arelent);
12080 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 12081 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
12082
12083 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 12084
3e73aa7c
JH
12085 if (!use_rela_relocations)
12086 {
12087 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
12088 vtable entry to be used in the relocation's section offset. */
12089 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
12090 rel->address = fixp->fx_offset;
fbeb56a4
DK
12091#if defined (OBJ_COFF) && defined (TE_PE)
12092 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
12093 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
12094 else
12095#endif
c6682705 12096 rel->addend = 0;
3e73aa7c
JH
12097 }
12098 /* Use the rela in 64bit mode. */
252b5132 12099 else
3e73aa7c 12100 {
862be3fb
L
12101 if (disallow_64bit_reloc)
12102 switch (code)
12103 {
862be3fb
L
12104 case BFD_RELOC_X86_64_DTPOFF64:
12105 case BFD_RELOC_X86_64_TPOFF64:
12106 case BFD_RELOC_64_PCREL:
12107 case BFD_RELOC_X86_64_GOTOFF64:
12108 case BFD_RELOC_X86_64_GOT64:
12109 case BFD_RELOC_X86_64_GOTPCREL64:
12110 case BFD_RELOC_X86_64_GOTPC64:
12111 case BFD_RELOC_X86_64_GOTPLT64:
12112 case BFD_RELOC_X86_64_PLTOFF64:
12113 as_bad_where (fixp->fx_file, fixp->fx_line,
12114 _("cannot represent relocation type %s in x32 mode"),
12115 bfd_get_reloc_code_name (code));
12116 break;
12117 default:
12118 break;
12119 }
12120
062cd5e7
AS
12121 if (!fixp->fx_pcrel)
12122 rel->addend = fixp->fx_offset;
12123 else
12124 switch (code)
12125 {
12126 case BFD_RELOC_X86_64_PLT32:
12127 case BFD_RELOC_X86_64_GOT32:
12128 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
12129 case BFD_RELOC_X86_64_GOTPCRELX:
12130 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
12131 case BFD_RELOC_X86_64_TLSGD:
12132 case BFD_RELOC_X86_64_TLSLD:
12133 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
12134 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
12135 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
12136 rel->addend = fixp->fx_offset - fixp->fx_size;
12137 break;
12138 default:
12139 rel->addend = (section->vma
12140 - fixp->fx_size
12141 + fixp->fx_addnumber
12142 + md_pcrel_from (fixp));
12143 break;
12144 }
3e73aa7c
JH
12145 }
12146
252b5132
RH
12147 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
12148 if (rel->howto == NULL)
12149 {
12150 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 12151 _("cannot represent relocation type %s"),
252b5132
RH
12152 bfd_get_reloc_code_name (code));
12153 /* Set howto to a garbage value so that we can keep going. */
12154 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 12155 gas_assert (rel->howto != NULL);
252b5132
RH
12156 }
12157
12158 return rel;
12159}
12160
ee86248c 12161#include "tc-i386-intel.c"
54cfded0 12162
a60de03c
JB
12163void
12164tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 12165{
a60de03c
JB
12166 int saved_naked_reg;
12167 char saved_register_dot;
54cfded0 12168
a60de03c
JB
12169 saved_naked_reg = allow_naked_reg;
12170 allow_naked_reg = 1;
12171 saved_register_dot = register_chars['.'];
12172 register_chars['.'] = '.';
12173 allow_pseudo_reg = 1;
12174 expression_and_evaluate (exp);
12175 allow_pseudo_reg = 0;
12176 register_chars['.'] = saved_register_dot;
12177 allow_naked_reg = saved_naked_reg;
12178
e96d56a1 12179 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 12180 {
a60de03c
JB
12181 if ((addressT) exp->X_add_number < i386_regtab_size)
12182 {
12183 exp->X_op = O_constant;
12184 exp->X_add_number = i386_regtab[exp->X_add_number]
12185 .dw2_regnum[flag_code >> 1];
12186 }
12187 else
12188 exp->X_op = O_illegal;
54cfded0 12189 }
54cfded0
AM
12190}
12191
12192void
12193tc_x86_frame_initial_instructions (void)
12194{
a60de03c
JB
12195 static unsigned int sp_regno[2];
12196
12197 if (!sp_regno[flag_code >> 1])
12198 {
12199 char *saved_input = input_line_pointer;
12200 char sp[][4] = {"esp", "rsp"};
12201 expressionS exp;
a4447b93 12202
a60de03c
JB
12203 input_line_pointer = sp[flag_code >> 1];
12204 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 12205 gas_assert (exp.X_op == O_constant);
a60de03c
JB
12206 sp_regno[flag_code >> 1] = exp.X_add_number;
12207 input_line_pointer = saved_input;
12208 }
a4447b93 12209
61ff971f
L
12210 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
12211 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 12212}
d2b2c203 12213
d7921315
L
12214int
12215x86_dwarf2_addr_size (void)
12216{
12217#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
12218 if (x86_elf_abi == X86_64_X32_ABI)
12219 return 4;
12220#endif
12221 return bfd_arch_bits_per_address (stdoutput) / 8;
12222}
12223
d2b2c203
DJ
12224int
12225i386_elf_section_type (const char *str, size_t len)
12226{
12227 if (flag_code == CODE_64BIT
12228 && len == sizeof ("unwind") - 1
12229 && strncmp (str, "unwind", 6) == 0)
12230 return SHT_X86_64_UNWIND;
12231
12232 return -1;
12233}
bb41ade5 12234
ad5fec3b
EB
12235#ifdef TE_SOLARIS
12236void
12237i386_solaris_fix_up_eh_frame (segT sec)
12238{
12239 if (flag_code == CODE_64BIT)
12240 elf_section_type (sec) = SHT_X86_64_UNWIND;
12241}
12242#endif
12243
bb41ade5
AM
12244#ifdef TE_PE
12245void
12246tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
12247{
91d6fa6a 12248 expressionS exp;
bb41ade5 12249
91d6fa6a
NC
12250 exp.X_op = O_secrel;
12251 exp.X_add_symbol = symbol;
12252 exp.X_add_number = 0;
12253 emit_expr (&exp, size);
bb41ade5
AM
12254}
12255#endif
3b22753a
L
12256
12257#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12258/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
12259
01e1a5bc 12260bfd_vma
6d4af3c2 12261x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
12262{
12263 if (flag_code == CODE_64BIT)
12264 {
12265 if (letter == 'l')
12266 return SHF_X86_64_LARGE;
12267
8f3bae45 12268 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 12269 }
3b22753a 12270 else
8f3bae45 12271 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
12272 return -1;
12273}
12274
01e1a5bc 12275bfd_vma
3b22753a
L
12276x86_64_section_word (char *str, size_t len)
12277{
8620418b 12278 if (len == 5 && flag_code == CODE_64BIT && CONST_STRNEQ (str, "large"))
3b22753a
L
12279 return SHF_X86_64_LARGE;
12280
12281 return -1;
12282}
12283
12284static void
12285handle_large_common (int small ATTRIBUTE_UNUSED)
12286{
12287 if (flag_code != CODE_64BIT)
12288 {
12289 s_comm_internal (0, elf_common_parse);
12290 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
12291 }
12292 else
12293 {
12294 static segT lbss_section;
12295 asection *saved_com_section_ptr = elf_com_section_ptr;
12296 asection *saved_bss_section = bss_section;
12297
12298 if (lbss_section == NULL)
12299 {
12300 flagword applicable;
12301 segT seg = now_seg;
12302 subsegT subseg = now_subseg;
12303
12304 /* The .lbss section is for local .largecomm symbols. */
12305 lbss_section = subseg_new (".lbss", 0);
12306 applicable = bfd_applicable_section_flags (stdoutput);
12307 bfd_set_section_flags (stdoutput, lbss_section,
12308 applicable & SEC_ALLOC);
12309 seg_info (lbss_section)->bss = 1;
12310
12311 subseg_set (seg, subseg);
12312 }
12313
12314 elf_com_section_ptr = &_bfd_elf_large_com_section;
12315 bss_section = lbss_section;
12316
12317 s_comm_internal (0, elf_common_parse);
12318
12319 elf_com_section_ptr = saved_com_section_ptr;
12320 bss_section = saved_bss_section;
12321 }
12322}
12323#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
This page took 2.842746 seconds and 4 git commands to generate.