]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-i386.c
Update a comment in psymtab.h
[thirdparty/binutils-gdb.git] / gas / config / tc-i386.c
CommitLineData
b534c6d3 1/* tc-i386.c -- Assemble code for the Intel 80386
b3adc24a 2 Copyright (C) 1989-2020 Free Software Foundation, Inc.
252b5132
RH
3
4 This file is part of GAS, the GNU Assembler.
5
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
ec2655a6 8 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
9 any later version.
10
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
252b5132 20
47926f60
KH
21/* Intel 80386 machine specific gas.
22 Written by Eliot Dresselhaus (eliot@mgm.mit.edu).
3e73aa7c 23 x86_64 support by Jan Hubicka (jh@suse.cz)
0f10071e 24 VIA PadLock support by Michal Ludvig (mludvig@suse.cz)
47926f60
KH
25 Bugs & suggestions are completely welcome. This is free software.
26 Please help us make it better. */
252b5132 27
252b5132 28#include "as.h"
3882b010 29#include "safe-ctype.h"
252b5132 30#include "subsegs.h"
316e2c05 31#include "dwarf2dbg.h"
54cfded0 32#include "dw2gencfi.h"
d2b2c203 33#include "elf/x86-64.h"
40fb9820 34#include "opcodes/i386-init.h"
252b5132 35
41fd2579
L
36#ifdef HAVE_LIMITS_H
37#include <limits.h>
38#else
39#ifdef HAVE_SYS_PARAM_H
40#include <sys/param.h>
41#endif
42#ifndef INT_MAX
43#define INT_MAX (int) (((unsigned) (-1)) >> 1)
44#endif
45#endif
46
252b5132
RH
47#ifndef REGISTER_WARNINGS
48#define REGISTER_WARNINGS 1
49#endif
50
c3332e24 51#ifndef INFER_ADDR_PREFIX
eecb386c 52#define INFER_ADDR_PREFIX 1
c3332e24
AM
53#endif
54
29b0f896
AM
55#ifndef DEFAULT_ARCH
56#define DEFAULT_ARCH "i386"
246fcdee 57#endif
252b5132 58
edde18a5
AM
59#ifndef INLINE
60#if __GNUC__ >= 2
61#define INLINE __inline__
62#else
63#define INLINE
64#endif
65#endif
66
6305a203
L
67/* Prefixes will be emitted in the order defined below.
68 WAIT_PREFIX must be the first prefix since FWAIT is really is an
69 instruction, and so must come before any prefixes.
70 The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
42164a71 71 REP_PREFIX/HLE_PREFIX, LOCK_PREFIX. */
6305a203
L
72#define WAIT_PREFIX 0
73#define SEG_PREFIX 1
74#define ADDR_PREFIX 2
75#define DATA_PREFIX 3
c32fa91d 76#define REP_PREFIX 4
42164a71 77#define HLE_PREFIX REP_PREFIX
7e8b059b 78#define BND_PREFIX REP_PREFIX
c32fa91d 79#define LOCK_PREFIX 5
4e9ac44a
L
80#define REX_PREFIX 6 /* must come last. */
81#define MAX_PREFIXES 7 /* max prefixes per opcode */
6305a203
L
82
83/* we define the syntax here (modulo base,index,scale syntax) */
84#define REGISTER_PREFIX '%'
85#define IMMEDIATE_PREFIX '$'
86#define ABSOLUTE_PREFIX '*'
87
88/* these are the instruction mnemonic suffixes in AT&T syntax or
89 memory operand size in Intel syntax. */
90#define WORD_MNEM_SUFFIX 'w'
91#define BYTE_MNEM_SUFFIX 'b'
92#define SHORT_MNEM_SUFFIX 's'
93#define LONG_MNEM_SUFFIX 'l'
94#define QWORD_MNEM_SUFFIX 'q'
6305a203
L
95/* Intel Syntax. Use a non-ascii letter since since it never appears
96 in instructions. */
97#define LONG_DOUBLE_MNEM_SUFFIX '\1'
98
99#define END_OF_INSN '\0'
100
79dec6b7
JB
101/* This matches the C -> StaticRounding alias in the opcode table. */
102#define commutative staticrounding
103
6305a203
L
104/*
105 'templates' is for grouping together 'template' structures for opcodes
106 of the same name. This is only used for storing the insns in the grand
107 ole hash table of insns.
108 The templates themselves start at START and range up to (but not including)
109 END.
110 */
111typedef struct
112{
d3ce72d0
NC
113 const insn_template *start;
114 const insn_template *end;
6305a203
L
115}
116templates;
117
118/* 386 operand encoding bytes: see 386 book for details of this. */
119typedef struct
120{
121 unsigned int regmem; /* codes register or memory operand */
122 unsigned int reg; /* codes register operand (or extended opcode) */
123 unsigned int mode; /* how to interpret regmem & reg */
124}
125modrm_byte;
126
127/* x86-64 extension prefix. */
128typedef int rex_byte;
129
6305a203
L
130/* 386 opcode byte to code indirect addressing. */
131typedef struct
132{
133 unsigned base;
134 unsigned index;
135 unsigned scale;
136}
137sib_byte;
138
6305a203
L
139/* x86 arch names, types and features */
140typedef struct
141{
142 const char *name; /* arch name */
8a2c8fef 143 unsigned int len; /* arch string length */
6305a203
L
144 enum processor_type type; /* arch type */
145 i386_cpu_flags flags; /* cpu feature flags */
8a2c8fef 146 unsigned int skip; /* show_arch should skip this. */
6305a203
L
147}
148arch_entry;
149
293f5f65
L
150/* Used to turn off indicated flags. */
151typedef struct
152{
153 const char *name; /* arch name */
154 unsigned int len; /* arch string length */
155 i386_cpu_flags flags; /* cpu feature flags */
156}
157noarch_entry;
158
78f12dd3 159static void update_code_flag (int, int);
e3bb37b5
L
160static void set_code_flag (int);
161static void set_16bit_gcc_code_flag (int);
162static void set_intel_syntax (int);
1efbbeb4 163static void set_intel_mnemonic (int);
db51cc60 164static void set_allow_index_reg (int);
7bab8ab5 165static void set_check (int);
e3bb37b5 166static void set_cpu_arch (int);
6482c264 167#ifdef TE_PE
e3bb37b5 168static void pe_directive_secrel (int);
6482c264 169#endif
e3bb37b5
L
170static void signed_cons (int);
171static char *output_invalid (int c);
ee86248c
JB
172static int i386_finalize_immediate (segT, expressionS *, i386_operand_type,
173 const char *);
174static int i386_finalize_displacement (segT, expressionS *, i386_operand_type,
175 const char *);
a7619375 176static int i386_att_operand (char *);
e3bb37b5 177static int i386_intel_operand (char *, int);
ee86248c
JB
178static int i386_intel_simplify (expressionS *);
179static int i386_intel_parse_name (const char *, expressionS *);
e3bb37b5
L
180static const reg_entry *parse_register (char *, char **);
181static char *parse_insn (char *, char *);
182static char *parse_operands (char *, const char *);
183static void swap_operands (void);
4d456e3d 184static void swap_2_operands (int, int);
48bcea9f 185static enum flag_code i386_addressing_mode (void);
e3bb37b5
L
186static void optimize_imm (void);
187static void optimize_disp (void);
83b16ac6 188static const insn_template *match_template (char);
e3bb37b5
L
189static int check_string (void);
190static int process_suffix (void);
191static int check_byte_reg (void);
192static int check_long_reg (void);
193static int check_qword_reg (void);
194static int check_word_reg (void);
195static int finalize_imm (void);
196static int process_operands (void);
197static const seg_entry *build_modrm_byte (void);
198static void output_insn (void);
199static void output_imm (fragS *, offsetT);
200static void output_disp (fragS *, offsetT);
29b0f896 201#ifndef I386COFF
e3bb37b5 202static void s_bss (int);
252b5132 203#endif
17d4e2a2
L
204#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
205static void handle_large_common (int small ATTRIBUTE_UNUSED);
b4a3a7b4
L
206
207/* GNU_PROPERTY_X86_ISA_1_USED. */
208static unsigned int x86_isa_1_used;
209/* GNU_PROPERTY_X86_FEATURE_2_USED. */
210static unsigned int x86_feature_2_used;
211/* Generate x86 used ISA and feature properties. */
212static unsigned int x86_used_note = DEFAULT_X86_USED_NOTE;
17d4e2a2 213#endif
252b5132 214
a847613f 215static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 216
43234a1e
L
217/* This struct describes rounding control and SAE in the instruction. */
218struct RC_Operation
219{
220 enum rc_type
221 {
222 rne = 0,
223 rd,
224 ru,
225 rz,
226 saeonly
227 } type;
228 int operand;
229};
230
231static struct RC_Operation rc_op;
232
233/* The struct describes masking, applied to OPERAND in the instruction.
234 MASK is a pointer to the corresponding mask register. ZEROING tells
235 whether merging or zeroing mask is used. */
236struct Mask_Operation
237{
238 const reg_entry *mask;
239 unsigned int zeroing;
240 /* The operand where this operation is associated. */
241 int operand;
242};
243
244static struct Mask_Operation mask_op;
245
246/* The struct describes broadcasting, applied to OPERAND. FACTOR is
247 broadcast factor. */
248struct Broadcast_Operation
249{
8e6e0792 250 /* Type of broadcast: {1to2}, {1to4}, {1to8}, or {1to16}. */
43234a1e
L
251 int type;
252
253 /* Index of broadcasted operand. */
254 int operand;
4a1b91ea
L
255
256 /* Number of bytes to broadcast. */
257 int bytes;
43234a1e
L
258};
259
260static struct Broadcast_Operation broadcast_op;
261
c0f3af97
L
262/* VEX prefix. */
263typedef struct
264{
43234a1e
L
265 /* VEX prefix is either 2 byte or 3 byte. EVEX is 4 byte. */
266 unsigned char bytes[4];
c0f3af97
L
267 unsigned int length;
268 /* Destination or source register specifier. */
269 const reg_entry *register_specifier;
270} vex_prefix;
271
252b5132 272/* 'md_assemble ()' gathers together information and puts it into a
47926f60 273 i386_insn. */
252b5132 274
520dc8e8
AM
275union i386_op
276 {
277 expressionS *disps;
278 expressionS *imms;
279 const reg_entry *regs;
280 };
281
a65babc9
L
282enum i386_error
283 {
86e026a4 284 operand_size_mismatch,
a65babc9
L
285 operand_type_mismatch,
286 register_type_mismatch,
287 number_of_operands_mismatch,
288 invalid_instruction_suffix,
289 bad_imm4,
a65babc9
L
290 unsupported_with_intel_mnemonic,
291 unsupported_syntax,
6c30d220
L
292 unsupported,
293 invalid_vsib_address,
7bab8ab5 294 invalid_vector_register_set,
43234a1e
L
295 unsupported_vector_index_register,
296 unsupported_broadcast,
43234a1e
L
297 broadcast_needed,
298 unsupported_masking,
299 mask_not_on_destination,
300 no_default_mask,
301 unsupported_rc_sae,
302 rc_sae_operand_not_last_imm,
303 invalid_register_operand,
a65babc9
L
304 };
305
252b5132
RH
306struct _i386_insn
307 {
47926f60 308 /* TM holds the template for the insn were currently assembling. */
d3ce72d0 309 insn_template tm;
252b5132 310
7d5e4556
L
311 /* SUFFIX holds the instruction size suffix for byte, word, dword
312 or qword, if given. */
252b5132
RH
313 char suffix;
314
47926f60 315 /* OPERANDS gives the number of given operands. */
252b5132
RH
316 unsigned int operands;
317
318 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
319 of given register, displacement, memory operands and immediate
47926f60 320 operands. */
252b5132
RH
321 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
322
323 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 324 use OP[i] for the corresponding operand. */
40fb9820 325 i386_operand_type types[MAX_OPERANDS];
252b5132 326
520dc8e8
AM
327 /* Displacement expression, immediate expression, or register for each
328 operand. */
329 union i386_op op[MAX_OPERANDS];
252b5132 330
3e73aa7c
JH
331 /* Flags for operands. */
332 unsigned int flags[MAX_OPERANDS];
333#define Operand_PCrel 1
c48dadc9 334#define Operand_Mem 2
3e73aa7c 335
252b5132 336 /* Relocation type for operand */
f86103b7 337 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 338
252b5132
RH
339 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
340 the base index byte below. */
341 const reg_entry *base_reg;
342 const reg_entry *index_reg;
343 unsigned int log2_scale_factor;
344
345 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 346 explicit segment overrides are given. */
ce8a8b2f 347 const seg_entry *seg[2];
252b5132 348
8325cc63
JB
349 /* Copied first memory operand string, for re-checking. */
350 char *memop1_string;
351
252b5132
RH
352 /* PREFIX holds all the given prefix opcodes (usually null).
353 PREFIXES is the number of prefix opcodes. */
354 unsigned int prefixes;
355 unsigned char prefix[MAX_PREFIXES];
356
50128d0c
JB
357 /* Register is in low 3 bits of opcode. */
358 bfd_boolean short_form;
359
6f2f06be
JB
360 /* The operand to a branch insn indicates an absolute branch. */
361 bfd_boolean jumpabsolute;
362
b4a3a7b4
L
363 /* Has MMX register operands. */
364 bfd_boolean has_regmmx;
365
366 /* Has XMM register operands. */
367 bfd_boolean has_regxmm;
368
369 /* Has YMM register operands. */
370 bfd_boolean has_regymm;
371
372 /* Has ZMM register operands. */
373 bfd_boolean has_regzmm;
374
e379e5f3
L
375 /* Has GOTPC or TLS relocation. */
376 bfd_boolean has_gotpc_tls_reloc;
377
252b5132 378 /* RM and SIB are the modrm byte and the sib byte where the
c1e679ec 379 addressing modes of this insn are encoded. */
252b5132 380 modrm_byte rm;
3e73aa7c 381 rex_byte rex;
43234a1e 382 rex_byte vrex;
252b5132 383 sib_byte sib;
c0f3af97 384 vex_prefix vex;
b6169b20 385
43234a1e
L
386 /* Masking attributes. */
387 struct Mask_Operation *mask;
388
389 /* Rounding control and SAE attributes. */
390 struct RC_Operation *rounding;
391
392 /* Broadcasting attributes. */
393 struct Broadcast_Operation *broadcast;
394
395 /* Compressed disp8*N attribute. */
396 unsigned int memshift;
397
86fa6981
L
398 /* Prefer load or store in encoding. */
399 enum
400 {
401 dir_encoding_default = 0,
402 dir_encoding_load,
64c49ab3
JB
403 dir_encoding_store,
404 dir_encoding_swap
86fa6981 405 } dir_encoding;
891edac4 406
a501d77e
L
407 /* Prefer 8bit or 32bit displacement in encoding. */
408 enum
409 {
410 disp_encoding_default = 0,
411 disp_encoding_8bit,
412 disp_encoding_32bit
413 } disp_encoding;
f8a5c266 414
6b6b6807
L
415 /* Prefer the REX byte in encoding. */
416 bfd_boolean rex_encoding;
417
b6f8c7c4
L
418 /* Disable instruction size optimization. */
419 bfd_boolean no_optimize;
420
86fa6981
L
421 /* How to encode vector instructions. */
422 enum
423 {
424 vex_encoding_default = 0,
42e04b36 425 vex_encoding_vex,
86fa6981
L
426 vex_encoding_vex3,
427 vex_encoding_evex
428 } vec_encoding;
429
d5de92cf
L
430 /* REP prefix. */
431 const char *rep_prefix;
432
165de32a
L
433 /* HLE prefix. */
434 const char *hle_prefix;
42164a71 435
7e8b059b
L
436 /* Have BND prefix. */
437 const char *bnd_prefix;
438
04ef582a
L
439 /* Have NOTRACK prefix. */
440 const char *notrack_prefix;
441
891edac4 442 /* Error message. */
a65babc9 443 enum i386_error error;
252b5132
RH
444 };
445
446typedef struct _i386_insn i386_insn;
447
43234a1e
L
448/* Link RC type with corresponding string, that'll be looked for in
449 asm. */
450struct RC_name
451{
452 enum rc_type type;
453 const char *name;
454 unsigned int len;
455};
456
457static const struct RC_name RC_NamesTable[] =
458{
459 { rne, STRING_COMMA_LEN ("rn-sae") },
460 { rd, STRING_COMMA_LEN ("rd-sae") },
461 { ru, STRING_COMMA_LEN ("ru-sae") },
462 { rz, STRING_COMMA_LEN ("rz-sae") },
463 { saeonly, STRING_COMMA_LEN ("sae") },
464};
465
252b5132
RH
466/* List of chars besides those in app.c:symbol_chars that can start an
467 operand. Used to prevent the scrubber eating vital white-space. */
86fa6981 468const char extra_symbol_chars[] = "*%-([{}"
252b5132 469#ifdef LEX_AT
32137342
NC
470 "@"
471#endif
472#ifdef LEX_QM
473 "?"
252b5132 474#endif
32137342 475 ;
252b5132 476
29b0f896
AM
477#if (defined (TE_I386AIX) \
478 || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
3896cfd5 479 && !defined (TE_GNU) \
29b0f896 480 && !defined (TE_LINUX) \
8d63c93e 481 && !defined (TE_NACL) \
29b0f896 482 && !defined (TE_FreeBSD) \
5b806d27 483 && !defined (TE_DragonFly) \
29b0f896 484 && !defined (TE_NetBSD)))
252b5132 485/* This array holds the chars that always start a comment. If the
b3b91714
AM
486 pre-processor is disabled, these aren't very useful. The option
487 --divide will remove '/' from this list. */
488const char *i386_comment_chars = "#/";
489#define SVR4_COMMENT_CHARS 1
252b5132 490#define PREFIX_SEPARATOR '\\'
252b5132 491
b3b91714
AM
492#else
493const char *i386_comment_chars = "#";
494#define PREFIX_SEPARATOR '/'
495#endif
496
252b5132
RH
497/* This array holds the chars that only start a comment at the beginning of
498 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
499 .line and .file directives will appear in the pre-processed output.
500 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 501 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
502 #NO_APP at the beginning of its output.
503 Also note that comments started like this one will always work if
252b5132 504 '/' isn't otherwise defined. */
b3b91714 505const char line_comment_chars[] = "#/";
252b5132 506
63a0b638 507const char line_separator_chars[] = ";";
252b5132 508
ce8a8b2f
AM
509/* Chars that can be used to separate mant from exp in floating point
510 nums. */
252b5132
RH
511const char EXP_CHARS[] = "eE";
512
ce8a8b2f
AM
513/* Chars that mean this number is a floating point constant
514 As in 0f12.456
515 or 0d1.2345e12. */
252b5132
RH
516const char FLT_CHARS[] = "fFdDxX";
517
ce8a8b2f 518/* Tables for lexical analysis. */
252b5132
RH
519static char mnemonic_chars[256];
520static char register_chars[256];
521static char operand_chars[256];
522static char identifier_chars[256];
523static char digit_chars[256];
524
ce8a8b2f 525/* Lexical macros. */
252b5132
RH
526#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
527#define is_operand_char(x) (operand_chars[(unsigned char) x])
528#define is_register_char(x) (register_chars[(unsigned char) x])
529#define is_space_char(x) ((x) == ' ')
530#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
531#define is_digit_char(x) (digit_chars[(unsigned char) x])
532
0234cb7c 533/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
534static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
535
536/* md_assemble() always leaves the strings it's passed unaltered. To
537 effect this we maintain a stack of saved characters that we've smashed
538 with '\0's (indicating end of strings for various sub-fields of the
47926f60 539 assembler instruction). */
252b5132 540static char save_stack[32];
ce8a8b2f 541static char *save_stack_p;
252b5132
RH
542#define END_STRING_AND_SAVE(s) \
543 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
544#define RESTORE_END_STRING(s) \
545 do { *(s) = *--save_stack_p; } while (0)
546
47926f60 547/* The instruction we're assembling. */
252b5132
RH
548static i386_insn i;
549
550/* Possible templates for current insn. */
551static const templates *current_templates;
552
31b2323c
L
553/* Per instruction expressionS buffers: max displacements & immediates. */
554static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
555static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 556
47926f60 557/* Current operand we are working on. */
ee86248c 558static int this_operand = -1;
252b5132 559
3e73aa7c
JH
560/* We support four different modes. FLAG_CODE variable is used to distinguish
561 these. */
562
563enum flag_code {
564 CODE_32BIT,
565 CODE_16BIT,
566 CODE_64BIT };
567
568static enum flag_code flag_code;
4fa24527 569static unsigned int object_64bit;
862be3fb 570static unsigned int disallow_64bit_reloc;
3e73aa7c 571static int use_rela_relocations = 0;
e379e5f3
L
572/* __tls_get_addr/___tls_get_addr symbol for TLS. */
573static const char *tls_get_addr;
3e73aa7c 574
7af8ed2d
NC
575#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
576 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
577 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
578
351f65ca
L
579/* The ELF ABI to use. */
580enum x86_elf_abi
581{
582 I386_ABI,
7f56bc95
L
583 X86_64_ABI,
584 X86_64_X32_ABI
351f65ca
L
585};
586
587static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 588#endif
351f65ca 589
167ad85b
TG
590#if defined (TE_PE) || defined (TE_PEP)
591/* Use big object file format. */
592static int use_big_obj = 0;
593#endif
594
8dcea932
L
595#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
596/* 1 if generating code for a shared library. */
597static int shared = 0;
598#endif
599
47926f60
KH
600/* 1 for intel syntax,
601 0 if att syntax. */
602static int intel_syntax = 0;
252b5132 603
4b5aaf5f
L
604static enum x86_64_isa
605{
606 amd64 = 1, /* AMD64 ISA. */
607 intel64 /* Intel64 ISA. */
608} isa64;
e89c5eaa 609
1efbbeb4
L
610/* 1 for intel mnemonic,
611 0 if att mnemonic. */
612static int intel_mnemonic = !SYSV386_COMPAT;
613
a60de03c
JB
614/* 1 if pseudo registers are permitted. */
615static int allow_pseudo_reg = 0;
616
47926f60
KH
617/* 1 if register prefix % not required. */
618static int allow_naked_reg = 0;
252b5132 619
33eaf5de 620/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
621 instructions supporting it, even if this prefix wasn't specified
622 explicitly. */
623static int add_bnd_prefix = 0;
624
ba104c83 625/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
626static int allow_index_reg = 0;
627
d022bddd
IT
628/* 1 if the assembler should ignore LOCK prefix, even if it was
629 specified explicitly. */
630static int omit_lock_prefix = 0;
631
e4e00185
AS
632/* 1 if the assembler should encode lfence, mfence, and sfence as
633 "lock addl $0, (%{re}sp)". */
634static int avoid_fence = 0;
635
e379e5f3
L
636/* Type of the previous instruction. */
637static struct
638 {
639 segT seg;
640 const char *file;
641 const char *name;
642 unsigned int line;
643 enum last_insn_kind
644 {
645 last_insn_other = 0,
646 last_insn_directive,
647 last_insn_prefix
648 } kind;
649 } last_insn;
650
0cb4071e
L
651/* 1 if the assembler should generate relax relocations. */
652
653static int generate_relax_relocations
654 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
655
7bab8ab5 656static enum check_kind
daf50ae7 657 {
7bab8ab5
JB
658 check_none = 0,
659 check_warning,
660 check_error
daf50ae7 661 }
7bab8ab5 662sse_check, operand_check = check_warning;
daf50ae7 663
e379e5f3
L
664/* Non-zero if branches should be aligned within power of 2 boundary. */
665static int align_branch_power = 0;
666
667/* Types of branches to align. */
668enum align_branch_kind
669 {
670 align_branch_none = 0,
671 align_branch_jcc = 1,
672 align_branch_fused = 2,
673 align_branch_jmp = 3,
674 align_branch_call = 4,
675 align_branch_indirect = 5,
676 align_branch_ret = 6
677 };
678
679/* Type bits of branches to align. */
680enum align_branch_bit
681 {
682 align_branch_jcc_bit = 1 << align_branch_jcc,
683 align_branch_fused_bit = 1 << align_branch_fused,
684 align_branch_jmp_bit = 1 << align_branch_jmp,
685 align_branch_call_bit = 1 << align_branch_call,
686 align_branch_indirect_bit = 1 << align_branch_indirect,
687 align_branch_ret_bit = 1 << align_branch_ret
688 };
689
690static unsigned int align_branch = (align_branch_jcc_bit
691 | align_branch_fused_bit
692 | align_branch_jmp_bit);
693
694/* The maximum padding size for fused jcc. CMP like instruction can
695 be 9 bytes and jcc can be 6 bytes. Leave room just in case for
696 prefixes. */
697#define MAX_FUSED_JCC_PADDING_SIZE 20
698
699/* The maximum number of prefixes added for an instruction. */
700static unsigned int align_branch_prefix_size = 5;
701
b6f8c7c4
L
702/* Optimization:
703 1. Clear the REX_W bit with register operand if possible.
704 2. Above plus use 128bit vector instruction to clear the full vector
705 register.
706 */
707static int optimize = 0;
708
709/* Optimization:
710 1. Clear the REX_W bit with register operand if possible.
711 2. Above plus use 128bit vector instruction to clear the full vector
712 register.
713 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
714 "testb $imm7,%r8".
715 */
716static int optimize_for_space = 0;
717
2ca3ace5
L
718/* Register prefix used for error message. */
719static const char *register_prefix = "%";
720
47926f60
KH
721/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
722 leave, push, and pop instructions so that gcc has the same stack
723 frame as in 32 bit mode. */
724static char stackop_size = '\0';
eecb386c 725
12b55ccc
L
726/* Non-zero to optimize code alignment. */
727int optimize_align_code = 1;
728
47926f60
KH
729/* Non-zero to quieten some warnings. */
730static int quiet_warnings = 0;
a38cf1db 731
47926f60
KH
732/* CPU name. */
733static const char *cpu_arch_name = NULL;
6305a203 734static char *cpu_sub_arch_name = NULL;
a38cf1db 735
47926f60 736/* CPU feature flags. */
40fb9820
L
737static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
738
ccc9c027
L
739/* If we have selected a cpu we are generating instructions for. */
740static int cpu_arch_tune_set = 0;
741
9103f4f4 742/* Cpu we are generating instructions for. */
fbf3f584 743enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4
L
744
745/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 746static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 747
ccc9c027 748/* CPU instruction set architecture used. */
fbf3f584 749enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 750
9103f4f4 751/* CPU feature flags of instruction set architecture used. */
fbf3f584 752i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 753
fddf5b5b
AM
754/* If set, conditional jumps are not automatically promoted to handle
755 larger than a byte offset. */
756static unsigned int no_cond_jump_promotion = 0;
757
c0f3af97
L
758/* Encode SSE instructions with VEX prefix. */
759static unsigned int sse2avx;
760
539f890d
L
761/* Encode scalar AVX instructions with specific vector length. */
762static enum
763 {
764 vex128 = 0,
765 vex256
766 } avxscalar;
767
03751133
L
768/* Encode VEX WIG instructions with specific vex.w. */
769static enum
770 {
771 vexw0 = 0,
772 vexw1
773 } vexwig;
774
43234a1e
L
775/* Encode scalar EVEX LIG instructions with specific vector length. */
776static enum
777 {
778 evexl128 = 0,
779 evexl256,
780 evexl512
781 } evexlig;
782
783/* Encode EVEX WIG instructions with specific evex.w. */
784static enum
785 {
786 evexw0 = 0,
787 evexw1
788 } evexwig;
789
d3d3c6db
IT
790/* Value to encode in EVEX RC bits, for SAE-only instructions. */
791static enum rc_type evexrcig = rne;
792
29b0f896 793/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 794static symbolS *GOT_symbol;
29b0f896 795
a4447b93
RH
796/* The dwarf2 return column, adjusted for 32 or 64 bit. */
797unsigned int x86_dwarf2_return_column;
798
799/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
800int x86_cie_data_alignment;
801
252b5132 802/* Interface to relax_segment.
fddf5b5b
AM
803 There are 3 major relax states for 386 jump insns because the
804 different types of jumps add different sizes to frags when we're
e379e5f3
L
805 figuring out what sort of jump to choose to reach a given label.
806
807 BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING are used to align
808 branches which are handled by md_estimate_size_before_relax() and
809 i386_generic_table_relax_frag(). */
252b5132 810
47926f60 811/* Types. */
93c2a809
AM
812#define UNCOND_JUMP 0
813#define COND_JUMP 1
814#define COND_JUMP86 2
e379e5f3
L
815#define BRANCH_PADDING 3
816#define BRANCH_PREFIX 4
817#define FUSED_JCC_PADDING 5
fddf5b5b 818
47926f60 819/* Sizes. */
252b5132
RH
820#define CODE16 1
821#define SMALL 0
29b0f896 822#define SMALL16 (SMALL | CODE16)
252b5132 823#define BIG 2
29b0f896 824#define BIG16 (BIG | CODE16)
252b5132
RH
825
826#ifndef INLINE
827#ifdef __GNUC__
828#define INLINE __inline__
829#else
830#define INLINE
831#endif
832#endif
833
fddf5b5b
AM
834#define ENCODE_RELAX_STATE(type, size) \
835 ((relax_substateT) (((type) << 2) | (size)))
836#define TYPE_FROM_RELAX_STATE(s) \
837 ((s) >> 2)
838#define DISP_SIZE_FROM_RELAX_STATE(s) \
839 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
840
841/* This table is used by relax_frag to promote short jumps to long
842 ones where necessary. SMALL (short) jumps may be promoted to BIG
843 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
844 don't allow a short jump in a 32 bit code segment to be promoted to
845 a 16 bit offset jump because it's slower (requires data size
846 prefix), and doesn't work, unless the destination is in the bottom
847 64k of the code segment (The top 16 bits of eip are zeroed). */
848
849const relax_typeS md_relax_table[] =
850{
24eab124
AM
851 /* The fields are:
852 1) most positive reach of this state,
853 2) most negative reach of this state,
93c2a809 854 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 855 4) which index into the table to try if we can't fit into this one. */
252b5132 856
fddf5b5b 857 /* UNCOND_JUMP states. */
93c2a809
AM
858 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
859 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
860 /* dword jmp adds 4 bytes to frag:
861 0 extra opcode bytes, 4 displacement bytes. */
252b5132 862 {0, 0, 4, 0},
93c2a809
AM
863 /* word jmp adds 2 byte2 to frag:
864 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
865 {0, 0, 2, 0},
866
93c2a809
AM
867 /* COND_JUMP states. */
868 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
869 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
870 /* dword conditionals adds 5 bytes to frag:
871 1 extra opcode byte, 4 displacement bytes. */
872 {0, 0, 5, 0},
fddf5b5b 873 /* word conditionals add 3 bytes to frag:
93c2a809
AM
874 1 extra opcode byte, 2 displacement bytes. */
875 {0, 0, 3, 0},
876
877 /* COND_JUMP86 states. */
878 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
879 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
880 /* dword conditionals adds 5 bytes to frag:
881 1 extra opcode byte, 4 displacement bytes. */
882 {0, 0, 5, 0},
883 /* word conditionals add 4 bytes to frag:
884 1 displacement byte and a 3 byte long branch insn. */
885 {0, 0, 4, 0}
252b5132
RH
886};
887
9103f4f4
L
888static const arch_entry cpu_arch[] =
889{
89507696
JB
890 /* Do not replace the first two entries - i386_target_format()
891 relies on them being there in this order. */
8a2c8fef 892 { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
293f5f65 893 CPU_GENERIC32_FLAGS, 0 },
8a2c8fef 894 { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
293f5f65 895 CPU_GENERIC64_FLAGS, 0 },
8a2c8fef 896 { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
293f5f65 897 CPU_NONE_FLAGS, 0 },
8a2c8fef 898 { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
293f5f65 899 CPU_I186_FLAGS, 0 },
8a2c8fef 900 { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
293f5f65 901 CPU_I286_FLAGS, 0 },
8a2c8fef 902 { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
293f5f65 903 CPU_I386_FLAGS, 0 },
8a2c8fef 904 { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
293f5f65 905 CPU_I486_FLAGS, 0 },
8a2c8fef 906 { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
293f5f65 907 CPU_I586_FLAGS, 0 },
8a2c8fef 908 { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
293f5f65 909 CPU_I686_FLAGS, 0 },
8a2c8fef 910 { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
293f5f65 911 CPU_I586_FLAGS, 0 },
8a2c8fef 912 { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
293f5f65 913 CPU_PENTIUMPRO_FLAGS, 0 },
8a2c8fef 914 { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
293f5f65 915 CPU_P2_FLAGS, 0 },
8a2c8fef 916 { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
293f5f65 917 CPU_P3_FLAGS, 0 },
8a2c8fef 918 { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
293f5f65 919 CPU_P4_FLAGS, 0 },
8a2c8fef 920 { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
293f5f65 921 CPU_CORE_FLAGS, 0 },
8a2c8fef 922 { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
293f5f65 923 CPU_NOCONA_FLAGS, 0 },
8a2c8fef 924 { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
293f5f65 925 CPU_CORE_FLAGS, 1 },
8a2c8fef 926 { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
293f5f65 927 CPU_CORE_FLAGS, 0 },
8a2c8fef 928 { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
293f5f65 929 CPU_CORE2_FLAGS, 1 },
8a2c8fef 930 { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
293f5f65 931 CPU_CORE2_FLAGS, 0 },
8a2c8fef 932 { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
293f5f65 933 CPU_COREI7_FLAGS, 0 },
8a2c8fef 934 { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
293f5f65 935 CPU_L1OM_FLAGS, 0 },
7a9068fe 936 { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
293f5f65 937 CPU_K1OM_FLAGS, 0 },
81486035 938 { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
293f5f65 939 CPU_IAMCU_FLAGS, 0 },
8a2c8fef 940 { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
293f5f65 941 CPU_K6_FLAGS, 0 },
8a2c8fef 942 { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
293f5f65 943 CPU_K6_2_FLAGS, 0 },
8a2c8fef 944 { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
293f5f65 945 CPU_ATHLON_FLAGS, 0 },
8a2c8fef 946 { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
293f5f65 947 CPU_K8_FLAGS, 1 },
8a2c8fef 948 { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
293f5f65 949 CPU_K8_FLAGS, 0 },
8a2c8fef 950 { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
293f5f65 951 CPU_K8_FLAGS, 0 },
8a2c8fef 952 { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
293f5f65 953 CPU_AMDFAM10_FLAGS, 0 },
8aedb9fe 954 { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
293f5f65 955 CPU_BDVER1_FLAGS, 0 },
8aedb9fe 956 { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
293f5f65 957 CPU_BDVER2_FLAGS, 0 },
5e5c50d3 958 { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
293f5f65 959 CPU_BDVER3_FLAGS, 0 },
c7b0bd56 960 { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
293f5f65 961 CPU_BDVER4_FLAGS, 0 },
029f3522 962 { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
293f5f65 963 CPU_ZNVER1_FLAGS, 0 },
a9660a6f
AP
964 { STRING_COMMA_LEN ("znver2"), PROCESSOR_ZNVER,
965 CPU_ZNVER2_FLAGS, 0 },
7b458c12 966 { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
293f5f65 967 CPU_BTVER1_FLAGS, 0 },
7b458c12 968 { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
293f5f65 969 CPU_BTVER2_FLAGS, 0 },
8a2c8fef 970 { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
293f5f65 971 CPU_8087_FLAGS, 0 },
8a2c8fef 972 { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
293f5f65 973 CPU_287_FLAGS, 0 },
8a2c8fef 974 { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
293f5f65 975 CPU_387_FLAGS, 0 },
1848e567
L
976 { STRING_COMMA_LEN (".687"), PROCESSOR_UNKNOWN,
977 CPU_687_FLAGS, 0 },
d871f3f4
L
978 { STRING_COMMA_LEN (".cmov"), PROCESSOR_UNKNOWN,
979 CPU_CMOV_FLAGS, 0 },
980 { STRING_COMMA_LEN (".fxsr"), PROCESSOR_UNKNOWN,
981 CPU_FXSR_FLAGS, 0 },
8a2c8fef 982 { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
293f5f65 983 CPU_MMX_FLAGS, 0 },
8a2c8fef 984 { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
293f5f65 985 CPU_SSE_FLAGS, 0 },
8a2c8fef 986 { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
293f5f65 987 CPU_SSE2_FLAGS, 0 },
8a2c8fef 988 { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
293f5f65 989 CPU_SSE3_FLAGS, 0 },
8a2c8fef 990 { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
293f5f65 991 CPU_SSSE3_FLAGS, 0 },
8a2c8fef 992 { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
293f5f65 993 CPU_SSE4_1_FLAGS, 0 },
8a2c8fef 994 { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
293f5f65 995 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 996 { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
293f5f65 997 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 998 { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
293f5f65 999 CPU_AVX_FLAGS, 0 },
6c30d220 1000 { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
293f5f65 1001 CPU_AVX2_FLAGS, 0 },
43234a1e 1002 { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
293f5f65 1003 CPU_AVX512F_FLAGS, 0 },
43234a1e 1004 { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
293f5f65 1005 CPU_AVX512CD_FLAGS, 0 },
43234a1e 1006 { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
293f5f65 1007 CPU_AVX512ER_FLAGS, 0 },
43234a1e 1008 { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
293f5f65 1009 CPU_AVX512PF_FLAGS, 0 },
1dfc6506 1010 { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
293f5f65 1011 CPU_AVX512DQ_FLAGS, 0 },
1dfc6506 1012 { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
293f5f65 1013 CPU_AVX512BW_FLAGS, 0 },
1dfc6506 1014 { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
293f5f65 1015 CPU_AVX512VL_FLAGS, 0 },
8a2c8fef 1016 { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
293f5f65 1017 CPU_VMX_FLAGS, 0 },
8729a6f6 1018 { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
293f5f65 1019 CPU_VMFUNC_FLAGS, 0 },
8a2c8fef 1020 { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
293f5f65 1021 CPU_SMX_FLAGS, 0 },
8a2c8fef 1022 { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
293f5f65 1023 CPU_XSAVE_FLAGS, 0 },
c7b8aa3a 1024 { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
293f5f65 1025 CPU_XSAVEOPT_FLAGS, 0 },
1dfc6506 1026 { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
293f5f65 1027 CPU_XSAVEC_FLAGS, 0 },
1dfc6506 1028 { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
293f5f65 1029 CPU_XSAVES_FLAGS, 0 },
8a2c8fef 1030 { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
293f5f65 1031 CPU_AES_FLAGS, 0 },
8a2c8fef 1032 { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
293f5f65 1033 CPU_PCLMUL_FLAGS, 0 },
8a2c8fef 1034 { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
293f5f65 1035 CPU_PCLMUL_FLAGS, 1 },
c7b8aa3a 1036 { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
293f5f65 1037 CPU_FSGSBASE_FLAGS, 0 },
c7b8aa3a 1038 { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
293f5f65 1039 CPU_RDRND_FLAGS, 0 },
c7b8aa3a 1040 { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
293f5f65 1041 CPU_F16C_FLAGS, 0 },
6c30d220 1042 { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
293f5f65 1043 CPU_BMI2_FLAGS, 0 },
8a2c8fef 1044 { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
293f5f65 1045 CPU_FMA_FLAGS, 0 },
8a2c8fef 1046 { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
293f5f65 1047 CPU_FMA4_FLAGS, 0 },
8a2c8fef 1048 { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
293f5f65 1049 CPU_XOP_FLAGS, 0 },
8a2c8fef 1050 { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
293f5f65 1051 CPU_LWP_FLAGS, 0 },
8a2c8fef 1052 { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
293f5f65 1053 CPU_MOVBE_FLAGS, 0 },
60aa667e 1054 { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
293f5f65 1055 CPU_CX16_FLAGS, 0 },
8a2c8fef 1056 { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
293f5f65 1057 CPU_EPT_FLAGS, 0 },
6c30d220 1058 { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
293f5f65 1059 CPU_LZCNT_FLAGS, 0 },
42164a71 1060 { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
293f5f65 1061 CPU_HLE_FLAGS, 0 },
42164a71 1062 { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
293f5f65 1063 CPU_RTM_FLAGS, 0 },
6c30d220 1064 { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
293f5f65 1065 CPU_INVPCID_FLAGS, 0 },
8a2c8fef 1066 { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
293f5f65 1067 CPU_CLFLUSH_FLAGS, 0 },
22109423 1068 { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
293f5f65 1069 CPU_NOP_FLAGS, 0 },
8a2c8fef 1070 { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
293f5f65 1071 CPU_SYSCALL_FLAGS, 0 },
8a2c8fef 1072 { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
293f5f65 1073 CPU_RDTSCP_FLAGS, 0 },
8a2c8fef 1074 { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
293f5f65 1075 CPU_3DNOW_FLAGS, 0 },
8a2c8fef 1076 { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
293f5f65 1077 CPU_3DNOWA_FLAGS, 0 },
8a2c8fef 1078 { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
293f5f65 1079 CPU_PADLOCK_FLAGS, 0 },
8a2c8fef 1080 { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
293f5f65 1081 CPU_SVME_FLAGS, 1 },
8a2c8fef 1082 { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
293f5f65 1083 CPU_SVME_FLAGS, 0 },
8a2c8fef 1084 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
293f5f65 1085 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 1086 { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
293f5f65 1087 CPU_ABM_FLAGS, 0 },
87973e9f 1088 { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
293f5f65 1089 CPU_BMI_FLAGS, 0 },
2a2a0f38 1090 { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
293f5f65 1091 CPU_TBM_FLAGS, 0 },
e2e1fcde 1092 { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
293f5f65 1093 CPU_ADX_FLAGS, 0 },
e2e1fcde 1094 { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
293f5f65 1095 CPU_RDSEED_FLAGS, 0 },
e2e1fcde 1096 { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
293f5f65 1097 CPU_PRFCHW_FLAGS, 0 },
5c111e37 1098 { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
293f5f65 1099 CPU_SMAP_FLAGS, 0 },
7e8b059b 1100 { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
293f5f65 1101 CPU_MPX_FLAGS, 0 },
a0046408 1102 { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
293f5f65 1103 CPU_SHA_FLAGS, 0 },
963f3586 1104 { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
293f5f65 1105 CPU_CLFLUSHOPT_FLAGS, 0 },
dcf893b5 1106 { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
293f5f65 1107 CPU_PREFETCHWT1_FLAGS, 0 },
2cf200a4 1108 { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
293f5f65 1109 CPU_SE1_FLAGS, 0 },
c5e7287a 1110 { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
293f5f65 1111 CPU_CLWB_FLAGS, 0 },
2cc1b5aa 1112 { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
293f5f65 1113 CPU_AVX512IFMA_FLAGS, 0 },
14f195c9 1114 { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
293f5f65 1115 CPU_AVX512VBMI_FLAGS, 0 },
920d2ddc
IT
1116 { STRING_COMMA_LEN (".avx512_4fmaps"), PROCESSOR_UNKNOWN,
1117 CPU_AVX512_4FMAPS_FLAGS, 0 },
47acf0bd
IT
1118 { STRING_COMMA_LEN (".avx512_4vnniw"), PROCESSOR_UNKNOWN,
1119 CPU_AVX512_4VNNIW_FLAGS, 0 },
620214f7
IT
1120 { STRING_COMMA_LEN (".avx512_vpopcntdq"), PROCESSOR_UNKNOWN,
1121 CPU_AVX512_VPOPCNTDQ_FLAGS, 0 },
53467f57
IT
1122 { STRING_COMMA_LEN (".avx512_vbmi2"), PROCESSOR_UNKNOWN,
1123 CPU_AVX512_VBMI2_FLAGS, 0 },
8cfcb765
IT
1124 { STRING_COMMA_LEN (".avx512_vnni"), PROCESSOR_UNKNOWN,
1125 CPU_AVX512_VNNI_FLAGS, 0 },
ee6872be
IT
1126 { STRING_COMMA_LEN (".avx512_bitalg"), PROCESSOR_UNKNOWN,
1127 CPU_AVX512_BITALG_FLAGS, 0 },
029f3522 1128 { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
293f5f65 1129 CPU_CLZERO_FLAGS, 0 },
9916071f 1130 { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
293f5f65 1131 CPU_MWAITX_FLAGS, 0 },
8eab4136 1132 { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
293f5f65 1133 CPU_OSPKE_FLAGS, 0 },
8bc52696 1134 { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
293f5f65 1135 CPU_RDPID_FLAGS, 0 },
6b40c462
L
1136 { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
1137 CPU_PTWRITE_FLAGS, 0 },
d777820b
IT
1138 { STRING_COMMA_LEN (".ibt"), PROCESSOR_UNKNOWN,
1139 CPU_IBT_FLAGS, 0 },
1140 { STRING_COMMA_LEN (".shstk"), PROCESSOR_UNKNOWN,
1141 CPU_SHSTK_FLAGS, 0 },
48521003
IT
1142 { STRING_COMMA_LEN (".gfni"), PROCESSOR_UNKNOWN,
1143 CPU_GFNI_FLAGS, 0 },
8dcf1fad
IT
1144 { STRING_COMMA_LEN (".vaes"), PROCESSOR_UNKNOWN,
1145 CPU_VAES_FLAGS, 0 },
ff1982d5
IT
1146 { STRING_COMMA_LEN (".vpclmulqdq"), PROCESSOR_UNKNOWN,
1147 CPU_VPCLMULQDQ_FLAGS, 0 },
3233d7d0
IT
1148 { STRING_COMMA_LEN (".wbnoinvd"), PROCESSOR_UNKNOWN,
1149 CPU_WBNOINVD_FLAGS, 0 },
be3a8dca
IT
1150 { STRING_COMMA_LEN (".pconfig"), PROCESSOR_UNKNOWN,
1151 CPU_PCONFIG_FLAGS, 0 },
de89d0a3
IT
1152 { STRING_COMMA_LEN (".waitpkg"), PROCESSOR_UNKNOWN,
1153 CPU_WAITPKG_FLAGS, 0 },
c48935d7
IT
1154 { STRING_COMMA_LEN (".cldemote"), PROCESSOR_UNKNOWN,
1155 CPU_CLDEMOTE_FLAGS, 0 },
c0a30a9f
L
1156 { STRING_COMMA_LEN (".movdiri"), PROCESSOR_UNKNOWN,
1157 CPU_MOVDIRI_FLAGS, 0 },
1158 { STRING_COMMA_LEN (".movdir64b"), PROCESSOR_UNKNOWN,
1159 CPU_MOVDIR64B_FLAGS, 0 },
d6aab7a1
XG
1160 { STRING_COMMA_LEN (".avx512_bf16"), PROCESSOR_UNKNOWN,
1161 CPU_AVX512_BF16_FLAGS, 0 },
9186c494
L
1162 { STRING_COMMA_LEN (".avx512_vp2intersect"), PROCESSOR_UNKNOWN,
1163 CPU_AVX512_VP2INTERSECT_FLAGS, 0 },
dd455cf5
L
1164 { STRING_COMMA_LEN (".enqcmd"), PROCESSOR_UNKNOWN,
1165 CPU_ENQCMD_FLAGS, 0 },
142861df
JB
1166 { STRING_COMMA_LEN (".rdpru"), PROCESSOR_UNKNOWN,
1167 CPU_RDPRU_FLAGS, 0 },
1168 { STRING_COMMA_LEN (".mcommit"), PROCESSOR_UNKNOWN,
1169 CPU_MCOMMIT_FLAGS, 0 },
293f5f65
L
1170};
1171
1172static const noarch_entry cpu_noarch[] =
1173{
1174 { STRING_COMMA_LEN ("no87"), CPU_ANY_X87_FLAGS },
1848e567
L
1175 { STRING_COMMA_LEN ("no287"), CPU_ANY_287_FLAGS },
1176 { STRING_COMMA_LEN ("no387"), CPU_ANY_387_FLAGS },
1177 { STRING_COMMA_LEN ("no687"), CPU_ANY_687_FLAGS },
d871f3f4
L
1178 { STRING_COMMA_LEN ("nocmov"), CPU_ANY_CMOV_FLAGS },
1179 { STRING_COMMA_LEN ("nofxsr"), CPU_ANY_FXSR_FLAGS },
293f5f65
L
1180 { STRING_COMMA_LEN ("nommx"), CPU_ANY_MMX_FLAGS },
1181 { STRING_COMMA_LEN ("nosse"), CPU_ANY_SSE_FLAGS },
1848e567
L
1182 { STRING_COMMA_LEN ("nosse2"), CPU_ANY_SSE2_FLAGS },
1183 { STRING_COMMA_LEN ("nosse3"), CPU_ANY_SSE3_FLAGS },
1184 { STRING_COMMA_LEN ("nossse3"), CPU_ANY_SSSE3_FLAGS },
1185 { STRING_COMMA_LEN ("nosse4.1"), CPU_ANY_SSE4_1_FLAGS },
1186 { STRING_COMMA_LEN ("nosse4.2"), CPU_ANY_SSE4_2_FLAGS },
1187 { STRING_COMMA_LEN ("nosse4"), CPU_ANY_SSE4_1_FLAGS },
293f5f65 1188 { STRING_COMMA_LEN ("noavx"), CPU_ANY_AVX_FLAGS },
1848e567 1189 { STRING_COMMA_LEN ("noavx2"), CPU_ANY_AVX2_FLAGS },
144b71e2
L
1190 { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
1191 { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
1192 { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
1193 { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
1194 { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
1195 { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
1196 { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
1197 { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
1198 { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
920d2ddc 1199 { STRING_COMMA_LEN ("noavx512_4fmaps"), CPU_ANY_AVX512_4FMAPS_FLAGS },
47acf0bd 1200 { STRING_COMMA_LEN ("noavx512_4vnniw"), CPU_ANY_AVX512_4VNNIW_FLAGS },
620214f7 1201 { STRING_COMMA_LEN ("noavx512_vpopcntdq"), CPU_ANY_AVX512_VPOPCNTDQ_FLAGS },
53467f57 1202 { STRING_COMMA_LEN ("noavx512_vbmi2"), CPU_ANY_AVX512_VBMI2_FLAGS },
8cfcb765 1203 { STRING_COMMA_LEN ("noavx512_vnni"), CPU_ANY_AVX512_VNNI_FLAGS },
ee6872be 1204 { STRING_COMMA_LEN ("noavx512_bitalg"), CPU_ANY_AVX512_BITALG_FLAGS },
d777820b
IT
1205 { STRING_COMMA_LEN ("noibt"), CPU_ANY_IBT_FLAGS },
1206 { STRING_COMMA_LEN ("noshstk"), CPU_ANY_SHSTK_FLAGS },
c0a30a9f
L
1207 { STRING_COMMA_LEN ("nomovdiri"), CPU_ANY_MOVDIRI_FLAGS },
1208 { STRING_COMMA_LEN ("nomovdir64b"), CPU_ANY_MOVDIR64B_FLAGS },
d6aab7a1 1209 { STRING_COMMA_LEN ("noavx512_bf16"), CPU_ANY_AVX512_BF16_FLAGS },
9186c494 1210 { STRING_COMMA_LEN ("noavx512_vp2intersect"), CPU_ANY_SHSTK_FLAGS },
dd455cf5 1211 { STRING_COMMA_LEN ("noenqcmd"), CPU_ANY_ENQCMD_FLAGS },
e413e4e9
AM
1212};
1213
704209c0 1214#ifdef I386COFF
a6c24e68
NC
1215/* Like s_lcomm_internal in gas/read.c but the alignment string
1216 is allowed to be optional. */
1217
1218static symbolS *
1219pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1220{
1221 addressT align = 0;
1222
1223 SKIP_WHITESPACE ();
1224
7ab9ffdd 1225 if (needs_align
a6c24e68
NC
1226 && *input_line_pointer == ',')
1227 {
1228 align = parse_align (needs_align - 1);
7ab9ffdd 1229
a6c24e68
NC
1230 if (align == (addressT) -1)
1231 return NULL;
1232 }
1233 else
1234 {
1235 if (size >= 8)
1236 align = 3;
1237 else if (size >= 4)
1238 align = 2;
1239 else if (size >= 2)
1240 align = 1;
1241 else
1242 align = 0;
1243 }
1244
1245 bss_alloc (symbolP, size, align);
1246 return symbolP;
1247}
1248
704209c0 1249static void
a6c24e68
NC
1250pe_lcomm (int needs_align)
1251{
1252 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1253}
704209c0 1254#endif
a6c24e68 1255
29b0f896
AM
1256const pseudo_typeS md_pseudo_table[] =
1257{
1258#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1259 {"align", s_align_bytes, 0},
1260#else
1261 {"align", s_align_ptwo, 0},
1262#endif
1263 {"arch", set_cpu_arch, 0},
1264#ifndef I386COFF
1265 {"bss", s_bss, 0},
a6c24e68
NC
1266#else
1267 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1268#endif
1269 {"ffloat", float_cons, 'f'},
1270 {"dfloat", float_cons, 'd'},
1271 {"tfloat", float_cons, 'x'},
1272 {"value", cons, 2},
d182319b 1273 {"slong", signed_cons, 4},
29b0f896
AM
1274 {"noopt", s_ignore, 0},
1275 {"optim", s_ignore, 0},
1276 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1277 {"code16", set_code_flag, CODE_16BIT},
1278 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1279#ifdef BFD64
29b0f896 1280 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1281#endif
29b0f896
AM
1282 {"intel_syntax", set_intel_syntax, 1},
1283 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1284 {"intel_mnemonic", set_intel_mnemonic, 1},
1285 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1286 {"allow_index_reg", set_allow_index_reg, 1},
1287 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1288 {"sse_check", set_check, 0},
1289 {"operand_check", set_check, 1},
3b22753a
L
1290#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1291 {"largecomm", handle_large_common, 0},
07a53e5c 1292#else
68d20676 1293 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1294 {"loc", dwarf2_directive_loc, 0},
1295 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1296#endif
6482c264
NC
1297#ifdef TE_PE
1298 {"secrel32", pe_directive_secrel, 0},
1299#endif
29b0f896
AM
1300 {0, 0, 0}
1301};
1302
1303/* For interface with expression (). */
1304extern char *input_line_pointer;
1305
1306/* Hash table for instruction mnemonic lookup. */
1307static struct hash_control *op_hash;
1308
1309/* Hash table for register lookup. */
1310static struct hash_control *reg_hash;
1311\f
ce8a8b2f
AM
1312 /* Various efficient no-op patterns for aligning code labels.
1313 Note: Don't try to assemble the instructions in the comments.
1314 0L and 0w are not legal. */
62a02d25
L
1315static const unsigned char f32_1[] =
1316 {0x90}; /* nop */
1317static const unsigned char f32_2[] =
1318 {0x66,0x90}; /* xchg %ax,%ax */
1319static const unsigned char f32_3[] =
1320 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1321static const unsigned char f32_4[] =
1322 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
62a02d25
L
1323static const unsigned char f32_6[] =
1324 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1325static const unsigned char f32_7[] =
1326 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
62a02d25 1327static const unsigned char f16_3[] =
3ae729d5 1328 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
62a02d25 1329static const unsigned char f16_4[] =
3ae729d5
L
1330 {0x8d,0xb4,0x00,0x00}; /* lea 0W(%si),%si */
1331static const unsigned char jump_disp8[] =
1332 {0xeb}; /* jmp disp8 */
1333static const unsigned char jump32_disp32[] =
1334 {0xe9}; /* jmp disp32 */
1335static const unsigned char jump16_disp32[] =
1336 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1337/* 32-bit NOPs patterns. */
1338static const unsigned char *const f32_patt[] = {
3ae729d5 1339 f32_1, f32_2, f32_3, f32_4, NULL, f32_6, f32_7
62a02d25
L
1340};
1341/* 16-bit NOPs patterns. */
1342static const unsigned char *const f16_patt[] = {
3ae729d5 1343 f32_1, f32_2, f16_3, f16_4
62a02d25
L
1344};
1345/* nopl (%[re]ax) */
1346static const unsigned char alt_3[] =
1347 {0x0f,0x1f,0x00};
1348/* nopl 0(%[re]ax) */
1349static const unsigned char alt_4[] =
1350 {0x0f,0x1f,0x40,0x00};
1351/* nopl 0(%[re]ax,%[re]ax,1) */
1352static const unsigned char alt_5[] =
1353 {0x0f,0x1f,0x44,0x00,0x00};
1354/* nopw 0(%[re]ax,%[re]ax,1) */
1355static const unsigned char alt_6[] =
1356 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1357/* nopl 0L(%[re]ax) */
1358static const unsigned char alt_7[] =
1359 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1360/* nopl 0L(%[re]ax,%[re]ax,1) */
1361static const unsigned char alt_8[] =
1362 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1363/* nopw 0L(%[re]ax,%[re]ax,1) */
1364static const unsigned char alt_9[] =
1365 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1366/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1367static const unsigned char alt_10[] =
1368 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
3ae729d5
L
1369/* data16 nopw %cs:0L(%eax,%eax,1) */
1370static const unsigned char alt_11[] =
1371 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1372/* 32-bit and 64-bit NOPs patterns. */
1373static const unsigned char *const alt_patt[] = {
1374 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1375 alt_9, alt_10, alt_11
62a02d25
L
1376};
1377
1378/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1379 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1380
1381static void
1382i386_output_nops (char *where, const unsigned char *const *patt,
1383 int count, int max_single_nop_size)
1384
1385{
3ae729d5
L
1386 /* Place the longer NOP first. */
1387 int last;
1388 int offset;
3076e594
NC
1389 const unsigned char *nops;
1390
1391 if (max_single_nop_size < 1)
1392 {
1393 as_fatal (_("i386_output_nops called to generate nops of at most %d bytes!"),
1394 max_single_nop_size);
1395 return;
1396 }
1397
1398 nops = patt[max_single_nop_size - 1];
3ae729d5
L
1399
1400 /* Use the smaller one if the requsted one isn't available. */
1401 if (nops == NULL)
62a02d25 1402 {
3ae729d5
L
1403 max_single_nop_size--;
1404 nops = patt[max_single_nop_size - 1];
62a02d25
L
1405 }
1406
3ae729d5
L
1407 last = count % max_single_nop_size;
1408
1409 count -= last;
1410 for (offset = 0; offset < count; offset += max_single_nop_size)
1411 memcpy (where + offset, nops, max_single_nop_size);
1412
1413 if (last)
1414 {
1415 nops = patt[last - 1];
1416 if (nops == NULL)
1417 {
1418 /* Use the smaller one plus one-byte NOP if the needed one
1419 isn't available. */
1420 last--;
1421 nops = patt[last - 1];
1422 memcpy (where + offset, nops, last);
1423 where[offset + last] = *patt[0];
1424 }
1425 else
1426 memcpy (where + offset, nops, last);
1427 }
62a02d25
L
1428}
1429
3ae729d5
L
1430static INLINE int
1431fits_in_imm7 (offsetT num)
1432{
1433 return (num & 0x7f) == num;
1434}
1435
1436static INLINE int
1437fits_in_imm31 (offsetT num)
1438{
1439 return (num & 0x7fffffff) == num;
1440}
62a02d25
L
1441
1442/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1443 single NOP instruction LIMIT. */
1444
1445void
3ae729d5 1446i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1447{
3ae729d5 1448 const unsigned char *const *patt = NULL;
62a02d25 1449 int max_single_nop_size;
3ae729d5
L
1450 /* Maximum number of NOPs before switching to jump over NOPs. */
1451 int max_number_of_nops;
62a02d25 1452
3ae729d5 1453 switch (fragP->fr_type)
62a02d25 1454 {
3ae729d5
L
1455 case rs_fill_nop:
1456 case rs_align_code:
1457 break;
e379e5f3
L
1458 case rs_machine_dependent:
1459 /* Allow NOP padding for jumps and calls. */
1460 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
1461 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
1462 break;
1463 /* Fall through. */
3ae729d5 1464 default:
62a02d25
L
1465 return;
1466 }
1467
ccc9c027
L
1468 /* We need to decide which NOP sequence to use for 32bit and
1469 64bit. When -mtune= is used:
4eed87de 1470
76bc74dc
L
1471 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
1472 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1473 2. For the rest, alt_patt will be used.
1474
1475 When -mtune= isn't used, alt_patt will be used if
22109423 1476 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will
76bc74dc 1477 be used.
ccc9c027
L
1478
1479 When -march= or .arch is used, we can't use anything beyond
1480 cpu_arch_isa_flags. */
1481
1482 if (flag_code == CODE_16BIT)
1483 {
3ae729d5
L
1484 patt = f16_patt;
1485 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1486 /* Limit number of NOPs to 2 in 16-bit mode. */
1487 max_number_of_nops = 2;
252b5132 1488 }
33fef721 1489 else
ccc9c027 1490 {
fbf3f584 1491 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027
L
1492 {
1493 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
1494 switch (cpu_arch_tune)
1495 {
1496 case PROCESSOR_UNKNOWN:
1497 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423
L
1498 optimize with nops. */
1499 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1500 patt = alt_patt;
ccc9c027
L
1501 else
1502 patt = f32_patt;
1503 break;
ccc9c027
L
1504 case PROCESSOR_PENTIUM4:
1505 case PROCESSOR_NOCONA:
ef05d495 1506 case PROCESSOR_CORE:
76bc74dc 1507 case PROCESSOR_CORE2:
bd5295b2 1508 case PROCESSOR_COREI7:
3632d14b 1509 case PROCESSOR_L1OM:
7a9068fe 1510 case PROCESSOR_K1OM:
76bc74dc 1511 case PROCESSOR_GENERIC64:
ccc9c027
L
1512 case PROCESSOR_K6:
1513 case PROCESSOR_ATHLON:
1514 case PROCESSOR_K8:
4eed87de 1515 case PROCESSOR_AMDFAM10:
8aedb9fe 1516 case PROCESSOR_BD:
029f3522 1517 case PROCESSOR_ZNVER:
7b458c12 1518 case PROCESSOR_BT:
80b8656c 1519 patt = alt_patt;
ccc9c027 1520 break;
76bc74dc 1521 case PROCESSOR_I386:
ccc9c027
L
1522 case PROCESSOR_I486:
1523 case PROCESSOR_PENTIUM:
2dde1948 1524 case PROCESSOR_PENTIUMPRO:
81486035 1525 case PROCESSOR_IAMCU:
ccc9c027
L
1526 case PROCESSOR_GENERIC32:
1527 patt = f32_patt;
1528 break;
4eed87de 1529 }
ccc9c027
L
1530 }
1531 else
1532 {
fbf3f584 1533 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1534 {
1535 case PROCESSOR_UNKNOWN:
e6a14101 1536 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1537 PROCESSOR_UNKNOWN. */
1538 abort ();
1539 break;
1540
76bc74dc 1541 case PROCESSOR_I386:
ccc9c027
L
1542 case PROCESSOR_I486:
1543 case PROCESSOR_PENTIUM:
81486035 1544 case PROCESSOR_IAMCU:
ccc9c027
L
1545 case PROCESSOR_K6:
1546 case PROCESSOR_ATHLON:
1547 case PROCESSOR_K8:
4eed87de 1548 case PROCESSOR_AMDFAM10:
8aedb9fe 1549 case PROCESSOR_BD:
029f3522 1550 case PROCESSOR_ZNVER:
7b458c12 1551 case PROCESSOR_BT:
ccc9c027
L
1552 case PROCESSOR_GENERIC32:
1553 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423
L
1554 with nops. */
1555 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1556 patt = alt_patt;
ccc9c027
L
1557 else
1558 patt = f32_patt;
1559 break;
76bc74dc
L
1560 case PROCESSOR_PENTIUMPRO:
1561 case PROCESSOR_PENTIUM4:
1562 case PROCESSOR_NOCONA:
1563 case PROCESSOR_CORE:
ef05d495 1564 case PROCESSOR_CORE2:
bd5295b2 1565 case PROCESSOR_COREI7:
3632d14b 1566 case PROCESSOR_L1OM:
7a9068fe 1567 case PROCESSOR_K1OM:
22109423 1568 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1569 patt = alt_patt;
ccc9c027
L
1570 else
1571 patt = f32_patt;
1572 break;
1573 case PROCESSOR_GENERIC64:
80b8656c 1574 patt = alt_patt;
ccc9c027 1575 break;
4eed87de 1576 }
ccc9c027
L
1577 }
1578
76bc74dc
L
1579 if (patt == f32_patt)
1580 {
3ae729d5
L
1581 max_single_nop_size = sizeof (f32_patt) / sizeof (f32_patt[0]);
1582 /* Limit number of NOPs to 2 for older processors. */
1583 max_number_of_nops = 2;
76bc74dc
L
1584 }
1585 else
1586 {
3ae729d5
L
1587 max_single_nop_size = sizeof (alt_patt) / sizeof (alt_patt[0]);
1588 /* Limit number of NOPs to 7 for newer processors. */
1589 max_number_of_nops = 7;
1590 }
1591 }
1592
1593 if (limit == 0)
1594 limit = max_single_nop_size;
1595
1596 if (fragP->fr_type == rs_fill_nop)
1597 {
1598 /* Output NOPs for .nop directive. */
1599 if (limit > max_single_nop_size)
1600 {
1601 as_bad_where (fragP->fr_file, fragP->fr_line,
1602 _("invalid single nop size: %d "
1603 "(expect within [0, %d])"),
1604 limit, max_single_nop_size);
1605 return;
1606 }
1607 }
e379e5f3 1608 else if (fragP->fr_type != rs_machine_dependent)
3ae729d5
L
1609 fragP->fr_var = count;
1610
1611 if ((count / max_single_nop_size) > max_number_of_nops)
1612 {
1613 /* Generate jump over NOPs. */
1614 offsetT disp = count - 2;
1615 if (fits_in_imm7 (disp))
1616 {
1617 /* Use "jmp disp8" if possible. */
1618 count = disp;
1619 where[0] = jump_disp8[0];
1620 where[1] = count;
1621 where += 2;
1622 }
1623 else
1624 {
1625 unsigned int size_of_jump;
1626
1627 if (flag_code == CODE_16BIT)
1628 {
1629 where[0] = jump16_disp32[0];
1630 where[1] = jump16_disp32[1];
1631 size_of_jump = 2;
1632 }
1633 else
1634 {
1635 where[0] = jump32_disp32[0];
1636 size_of_jump = 1;
1637 }
1638
1639 count -= size_of_jump + 4;
1640 if (!fits_in_imm31 (count))
1641 {
1642 as_bad_where (fragP->fr_file, fragP->fr_line,
1643 _("jump over nop padding out of range"));
1644 return;
1645 }
1646
1647 md_number_to_chars (where + size_of_jump, count, 4);
1648 where += size_of_jump + 4;
76bc74dc 1649 }
ccc9c027 1650 }
3ae729d5
L
1651
1652 /* Generate multiple NOPs. */
1653 i386_output_nops (where, patt, count, limit);
252b5132
RH
1654}
1655
c6fb90c8 1656static INLINE int
0dfbf9d7 1657operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1658{
0dfbf9d7 1659 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1660 {
1661 case 3:
0dfbf9d7 1662 if (x->array[2])
c6fb90c8 1663 return 0;
1a0670f3 1664 /* Fall through. */
c6fb90c8 1665 case 2:
0dfbf9d7 1666 if (x->array[1])
c6fb90c8 1667 return 0;
1a0670f3 1668 /* Fall through. */
c6fb90c8 1669 case 1:
0dfbf9d7 1670 return !x->array[0];
c6fb90c8
L
1671 default:
1672 abort ();
1673 }
40fb9820
L
1674}
1675
c6fb90c8 1676static INLINE void
0dfbf9d7 1677operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1678{
0dfbf9d7 1679 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1680 {
1681 case 3:
0dfbf9d7 1682 x->array[2] = v;
1a0670f3 1683 /* Fall through. */
c6fb90c8 1684 case 2:
0dfbf9d7 1685 x->array[1] = v;
1a0670f3 1686 /* Fall through. */
c6fb90c8 1687 case 1:
0dfbf9d7 1688 x->array[0] = v;
1a0670f3 1689 /* Fall through. */
c6fb90c8
L
1690 break;
1691 default:
1692 abort ();
1693 }
bab6aec1
JB
1694
1695 x->bitfield.class = ClassNone;
75e5731b 1696 x->bitfield.instance = InstanceNone;
c6fb90c8 1697}
40fb9820 1698
c6fb90c8 1699static INLINE int
0dfbf9d7
L
1700operand_type_equal (const union i386_operand_type *x,
1701 const union i386_operand_type *y)
c6fb90c8 1702{
0dfbf9d7 1703 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1704 {
1705 case 3:
0dfbf9d7 1706 if (x->array[2] != y->array[2])
c6fb90c8 1707 return 0;
1a0670f3 1708 /* Fall through. */
c6fb90c8 1709 case 2:
0dfbf9d7 1710 if (x->array[1] != y->array[1])
c6fb90c8 1711 return 0;
1a0670f3 1712 /* Fall through. */
c6fb90c8 1713 case 1:
0dfbf9d7 1714 return x->array[0] == y->array[0];
c6fb90c8
L
1715 break;
1716 default:
1717 abort ();
1718 }
1719}
40fb9820 1720
0dfbf9d7
L
1721static INLINE int
1722cpu_flags_all_zero (const union i386_cpu_flags *x)
1723{
1724 switch (ARRAY_SIZE(x->array))
1725 {
53467f57
IT
1726 case 4:
1727 if (x->array[3])
1728 return 0;
1729 /* Fall through. */
0dfbf9d7
L
1730 case 3:
1731 if (x->array[2])
1732 return 0;
1a0670f3 1733 /* Fall through. */
0dfbf9d7
L
1734 case 2:
1735 if (x->array[1])
1736 return 0;
1a0670f3 1737 /* Fall through. */
0dfbf9d7
L
1738 case 1:
1739 return !x->array[0];
1740 default:
1741 abort ();
1742 }
1743}
1744
0dfbf9d7
L
1745static INLINE int
1746cpu_flags_equal (const union i386_cpu_flags *x,
1747 const union i386_cpu_flags *y)
1748{
1749 switch (ARRAY_SIZE(x->array))
1750 {
53467f57
IT
1751 case 4:
1752 if (x->array[3] != y->array[3])
1753 return 0;
1754 /* Fall through. */
0dfbf9d7
L
1755 case 3:
1756 if (x->array[2] != y->array[2])
1757 return 0;
1a0670f3 1758 /* Fall through. */
0dfbf9d7
L
1759 case 2:
1760 if (x->array[1] != y->array[1])
1761 return 0;
1a0670f3 1762 /* Fall through. */
0dfbf9d7
L
1763 case 1:
1764 return x->array[0] == y->array[0];
1765 break;
1766 default:
1767 abort ();
1768 }
1769}
c6fb90c8
L
1770
1771static INLINE int
1772cpu_flags_check_cpu64 (i386_cpu_flags f)
1773{
1774 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
1775 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
1776}
1777
c6fb90c8
L
1778static INLINE i386_cpu_flags
1779cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1780{
c6fb90c8
L
1781 switch (ARRAY_SIZE (x.array))
1782 {
53467f57
IT
1783 case 4:
1784 x.array [3] &= y.array [3];
1785 /* Fall through. */
c6fb90c8
L
1786 case 3:
1787 x.array [2] &= y.array [2];
1a0670f3 1788 /* Fall through. */
c6fb90c8
L
1789 case 2:
1790 x.array [1] &= y.array [1];
1a0670f3 1791 /* Fall through. */
c6fb90c8
L
1792 case 1:
1793 x.array [0] &= y.array [0];
1794 break;
1795 default:
1796 abort ();
1797 }
1798 return x;
1799}
40fb9820 1800
c6fb90c8
L
1801static INLINE i386_cpu_flags
1802cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1803{
c6fb90c8 1804 switch (ARRAY_SIZE (x.array))
40fb9820 1805 {
53467f57
IT
1806 case 4:
1807 x.array [3] |= y.array [3];
1808 /* Fall through. */
c6fb90c8
L
1809 case 3:
1810 x.array [2] |= y.array [2];
1a0670f3 1811 /* Fall through. */
c6fb90c8
L
1812 case 2:
1813 x.array [1] |= y.array [1];
1a0670f3 1814 /* Fall through. */
c6fb90c8
L
1815 case 1:
1816 x.array [0] |= y.array [0];
40fb9820
L
1817 break;
1818 default:
1819 abort ();
1820 }
40fb9820
L
1821 return x;
1822}
1823
309d3373
JB
1824static INLINE i386_cpu_flags
1825cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1826{
1827 switch (ARRAY_SIZE (x.array))
1828 {
53467f57
IT
1829 case 4:
1830 x.array [3] &= ~y.array [3];
1831 /* Fall through. */
309d3373
JB
1832 case 3:
1833 x.array [2] &= ~y.array [2];
1a0670f3 1834 /* Fall through. */
309d3373
JB
1835 case 2:
1836 x.array [1] &= ~y.array [1];
1a0670f3 1837 /* Fall through. */
309d3373
JB
1838 case 1:
1839 x.array [0] &= ~y.array [0];
1840 break;
1841 default:
1842 abort ();
1843 }
1844 return x;
1845}
1846
c0f3af97
L
1847#define CPU_FLAGS_ARCH_MATCH 0x1
1848#define CPU_FLAGS_64BIT_MATCH 0x2
1849
c0f3af97 1850#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1851 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1852
1853/* Return CPU flags match bits. */
3629bb00 1854
40fb9820 1855static int
d3ce72d0 1856cpu_flags_match (const insn_template *t)
40fb9820 1857{
c0f3af97
L
1858 i386_cpu_flags x = t->cpu_flags;
1859 int match = cpu_flags_check_cpu64 (x) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820
L
1860
1861 x.bitfield.cpu64 = 0;
1862 x.bitfield.cpuno64 = 0;
1863
0dfbf9d7 1864 if (cpu_flags_all_zero (&x))
c0f3af97
L
1865 {
1866 /* This instruction is available on all archs. */
db12e14e 1867 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1868 }
3629bb00
L
1869 else
1870 {
c0f3af97 1871 /* This instruction is available only on some archs. */
3629bb00
L
1872 i386_cpu_flags cpu = cpu_arch_flags;
1873
ab592e75
JB
1874 /* AVX512VL is no standalone feature - match it and then strip it. */
1875 if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl)
1876 return match;
1877 x.bitfield.cpuavx512vl = 0;
1878
3629bb00 1879 cpu = cpu_flags_and (x, cpu);
c0f3af97
L
1880 if (!cpu_flags_all_zero (&cpu))
1881 {
a5ff0eb2
L
1882 if (x.bitfield.cpuavx)
1883 {
929f69fa 1884 /* We need to check a few extra flags with AVX. */
b9d49817
JB
1885 if (cpu.bitfield.cpuavx
1886 && (!t->opcode_modifier.sse2avx || sse2avx)
1887 && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
929f69fa 1888 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
b9d49817
JB
1889 && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
1890 match |= CPU_FLAGS_ARCH_MATCH;
a5ff0eb2 1891 }
929f69fa
JB
1892 else if (x.bitfield.cpuavx512f)
1893 {
1894 /* We need to check a few extra flags with AVX512F. */
1895 if (cpu.bitfield.cpuavx512f
1896 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
1897 && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes)
1898 && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq))
1899 match |= CPU_FLAGS_ARCH_MATCH;
1900 }
a5ff0eb2 1901 else
db12e14e 1902 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1903 }
3629bb00 1904 }
c0f3af97 1905 return match;
40fb9820
L
1906}
1907
c6fb90c8
L
1908static INLINE i386_operand_type
1909operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 1910{
bab6aec1
JB
1911 if (x.bitfield.class != y.bitfield.class)
1912 x.bitfield.class = ClassNone;
75e5731b
JB
1913 if (x.bitfield.instance != y.bitfield.instance)
1914 x.bitfield.instance = InstanceNone;
bab6aec1 1915
c6fb90c8
L
1916 switch (ARRAY_SIZE (x.array))
1917 {
1918 case 3:
1919 x.array [2] &= y.array [2];
1a0670f3 1920 /* Fall through. */
c6fb90c8
L
1921 case 2:
1922 x.array [1] &= y.array [1];
1a0670f3 1923 /* Fall through. */
c6fb90c8
L
1924 case 1:
1925 x.array [0] &= y.array [0];
1926 break;
1927 default:
1928 abort ();
1929 }
1930 return x;
40fb9820
L
1931}
1932
73053c1f
JB
1933static INLINE i386_operand_type
1934operand_type_and_not (i386_operand_type x, i386_operand_type y)
1935{
bab6aec1 1936 gas_assert (y.bitfield.class == ClassNone);
75e5731b 1937 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 1938
73053c1f
JB
1939 switch (ARRAY_SIZE (x.array))
1940 {
1941 case 3:
1942 x.array [2] &= ~y.array [2];
1943 /* Fall through. */
1944 case 2:
1945 x.array [1] &= ~y.array [1];
1946 /* Fall through. */
1947 case 1:
1948 x.array [0] &= ~y.array [0];
1949 break;
1950 default:
1951 abort ();
1952 }
1953 return x;
1954}
1955
c6fb90c8
L
1956static INLINE i386_operand_type
1957operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 1958{
bab6aec1
JB
1959 gas_assert (x.bitfield.class == ClassNone ||
1960 y.bitfield.class == ClassNone ||
1961 x.bitfield.class == y.bitfield.class);
75e5731b
JB
1962 gas_assert (x.bitfield.instance == InstanceNone ||
1963 y.bitfield.instance == InstanceNone ||
1964 x.bitfield.instance == y.bitfield.instance);
bab6aec1 1965
c6fb90c8 1966 switch (ARRAY_SIZE (x.array))
40fb9820 1967 {
c6fb90c8
L
1968 case 3:
1969 x.array [2] |= y.array [2];
1a0670f3 1970 /* Fall through. */
c6fb90c8
L
1971 case 2:
1972 x.array [1] |= y.array [1];
1a0670f3 1973 /* Fall through. */
c6fb90c8
L
1974 case 1:
1975 x.array [0] |= y.array [0];
40fb9820
L
1976 break;
1977 default:
1978 abort ();
1979 }
c6fb90c8
L
1980 return x;
1981}
40fb9820 1982
c6fb90c8
L
1983static INLINE i386_operand_type
1984operand_type_xor (i386_operand_type x, i386_operand_type y)
1985{
bab6aec1 1986 gas_assert (y.bitfield.class == ClassNone);
75e5731b 1987 gas_assert (y.bitfield.instance == InstanceNone);
bab6aec1 1988
c6fb90c8
L
1989 switch (ARRAY_SIZE (x.array))
1990 {
1991 case 3:
1992 x.array [2] ^= y.array [2];
1a0670f3 1993 /* Fall through. */
c6fb90c8
L
1994 case 2:
1995 x.array [1] ^= y.array [1];
1a0670f3 1996 /* Fall through. */
c6fb90c8
L
1997 case 1:
1998 x.array [0] ^= y.array [0];
1999 break;
2000 default:
2001 abort ();
2002 }
40fb9820
L
2003 return x;
2004}
2005
40fb9820
L
2006static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
2007static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
2008static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
2009static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
bab6aec1
JB
2010static const i386_operand_type anydisp = OPERAND_TYPE_ANYDISP;
2011static const i386_operand_type anyimm = OPERAND_TYPE_ANYIMM;
40fb9820 2012static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
43234a1e 2013static const i386_operand_type regmask = OPERAND_TYPE_REGMASK;
40fb9820
L
2014static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
2015static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
2016static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
2017static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
2018static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
2019static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
2020static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
2021static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
2022static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
2023
2024enum operand_type
2025{
2026 reg,
40fb9820
L
2027 imm,
2028 disp,
2029 anymem
2030};
2031
c6fb90c8 2032static INLINE int
40fb9820
L
2033operand_type_check (i386_operand_type t, enum operand_type c)
2034{
2035 switch (c)
2036 {
2037 case reg:
bab6aec1 2038 return t.bitfield.class == Reg;
40fb9820 2039
40fb9820
L
2040 case imm:
2041 return (t.bitfield.imm8
2042 || t.bitfield.imm8s
2043 || t.bitfield.imm16
2044 || t.bitfield.imm32
2045 || t.bitfield.imm32s
2046 || t.bitfield.imm64);
2047
2048 case disp:
2049 return (t.bitfield.disp8
2050 || t.bitfield.disp16
2051 || t.bitfield.disp32
2052 || t.bitfield.disp32s
2053 || t.bitfield.disp64);
2054
2055 case anymem:
2056 return (t.bitfield.disp8
2057 || t.bitfield.disp16
2058 || t.bitfield.disp32
2059 || t.bitfield.disp32s
2060 || t.bitfield.disp64
2061 || t.bitfield.baseindex);
2062
2063 default:
2064 abort ();
2065 }
2cfe26b6
AM
2066
2067 return 0;
40fb9820
L
2068}
2069
7a54636a
L
2070/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit size
2071 between operand GIVEN and opeand WANTED for instruction template T. */
5c07affc
L
2072
2073static INLINE int
7a54636a
L
2074match_operand_size (const insn_template *t, unsigned int wanted,
2075 unsigned int given)
5c07affc 2076{
3ac21baa
JB
2077 return !((i.types[given].bitfield.byte
2078 && !t->operand_types[wanted].bitfield.byte)
2079 || (i.types[given].bitfield.word
2080 && !t->operand_types[wanted].bitfield.word)
2081 || (i.types[given].bitfield.dword
2082 && !t->operand_types[wanted].bitfield.dword)
2083 || (i.types[given].bitfield.qword
2084 && !t->operand_types[wanted].bitfield.qword)
2085 || (i.types[given].bitfield.tbyte
2086 && !t->operand_types[wanted].bitfield.tbyte));
5c07affc
L
2087}
2088
dd40ce22
L
2089/* Return 1 if there is no conflict in SIMD register between operand
2090 GIVEN and opeand WANTED for instruction template T. */
1b54b8d7
JB
2091
2092static INLINE int
dd40ce22
L
2093match_simd_size (const insn_template *t, unsigned int wanted,
2094 unsigned int given)
1b54b8d7 2095{
3ac21baa
JB
2096 return !((i.types[given].bitfield.xmmword
2097 && !t->operand_types[wanted].bitfield.xmmword)
2098 || (i.types[given].bitfield.ymmword
2099 && !t->operand_types[wanted].bitfield.ymmword)
2100 || (i.types[given].bitfield.zmmword
2101 && !t->operand_types[wanted].bitfield.zmmword));
1b54b8d7
JB
2102}
2103
7a54636a
L
2104/* Return 1 if there is no conflict in any size between operand GIVEN
2105 and opeand WANTED for instruction template T. */
5c07affc
L
2106
2107static INLINE int
dd40ce22
L
2108match_mem_size (const insn_template *t, unsigned int wanted,
2109 unsigned int given)
5c07affc 2110{
7a54636a 2111 return (match_operand_size (t, wanted, given)
3ac21baa 2112 && !((i.types[given].bitfield.unspecified
af508cb9 2113 && !i.broadcast
3ac21baa
JB
2114 && !t->operand_types[wanted].bitfield.unspecified)
2115 || (i.types[given].bitfield.fword
2116 && !t->operand_types[wanted].bitfield.fword)
1b54b8d7
JB
2117 /* For scalar opcode templates to allow register and memory
2118 operands at the same time, some special casing is needed
d6793fa1
JB
2119 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
2120 down-conversion vpmov*. */
3528c362 2121 || ((t->operand_types[wanted].bitfield.class == RegSIMD
1b54b8d7 2122 && !t->opcode_modifier.broadcast
3ac21baa
JB
2123 && (t->operand_types[wanted].bitfield.byte
2124 || t->operand_types[wanted].bitfield.word
2125 || t->operand_types[wanted].bitfield.dword
2126 || t->operand_types[wanted].bitfield.qword))
2127 ? (i.types[given].bitfield.xmmword
2128 || i.types[given].bitfield.ymmword
2129 || i.types[given].bitfield.zmmword)
2130 : !match_simd_size(t, wanted, given))));
5c07affc
L
2131}
2132
3ac21baa
JB
2133/* Return value has MATCH_STRAIGHT set if there is no size conflict on any
2134 operands for instruction template T, and it has MATCH_REVERSE set if there
2135 is no size conflict on any operands for the template with operands reversed
2136 (and the template allows for reversing in the first place). */
5c07affc 2137
3ac21baa
JB
2138#define MATCH_STRAIGHT 1
2139#define MATCH_REVERSE 2
2140
2141static INLINE unsigned int
d3ce72d0 2142operand_size_match (const insn_template *t)
5c07affc 2143{
3ac21baa 2144 unsigned int j, match = MATCH_STRAIGHT;
5c07affc 2145
0cfa3eb3 2146 /* Don't check non-absolute jump instructions. */
5c07affc 2147 if (t->opcode_modifier.jump
0cfa3eb3 2148 && t->opcode_modifier.jump != JUMP_ABSOLUTE)
5c07affc
L
2149 return match;
2150
2151 /* Check memory and accumulator operand size. */
2152 for (j = 0; j < i.operands; j++)
2153 {
3528c362
JB
2154 if (i.types[j].bitfield.class != Reg
2155 && i.types[j].bitfield.class != RegSIMD
601e8564 2156 && t->opcode_modifier.anysize)
5c07affc
L
2157 continue;
2158
bab6aec1 2159 if (t->operand_types[j].bitfield.class == Reg
7a54636a 2160 && !match_operand_size (t, j, j))
5c07affc
L
2161 {
2162 match = 0;
2163 break;
2164 }
2165
3528c362 2166 if (t->operand_types[j].bitfield.class == RegSIMD
3ac21baa 2167 && !match_simd_size (t, j, j))
1b54b8d7
JB
2168 {
2169 match = 0;
2170 break;
2171 }
2172
75e5731b 2173 if (t->operand_types[j].bitfield.instance == Accum
7a54636a 2174 && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
1b54b8d7
JB
2175 {
2176 match = 0;
2177 break;
2178 }
2179
c48dadc9 2180 if ((i.flags[j] & Operand_Mem) && !match_mem_size (t, j, j))
5c07affc
L
2181 {
2182 match = 0;
2183 break;
2184 }
2185 }
2186
3ac21baa 2187 if (!t->opcode_modifier.d)
891edac4
L
2188 {
2189mismatch:
3ac21baa
JB
2190 if (!match)
2191 i.error = operand_size_mismatch;
2192 return match;
891edac4 2193 }
5c07affc
L
2194
2195 /* Check reverse. */
f5eb1d70 2196 gas_assert (i.operands >= 2 && i.operands <= 3);
5c07affc 2197
f5eb1d70 2198 for (j = 0; j < i.operands; j++)
5c07affc 2199 {
f5eb1d70
JB
2200 unsigned int given = i.operands - j - 1;
2201
bab6aec1 2202 if (t->operand_types[j].bitfield.class == Reg
f5eb1d70 2203 && !match_operand_size (t, j, given))
891edac4 2204 goto mismatch;
5c07affc 2205
3528c362 2206 if (t->operand_types[j].bitfield.class == RegSIMD
f5eb1d70 2207 && !match_simd_size (t, j, given))
dbbc8b7e
JB
2208 goto mismatch;
2209
75e5731b 2210 if (t->operand_types[j].bitfield.instance == Accum
f5eb1d70
JB
2211 && (!match_operand_size (t, j, given)
2212 || !match_simd_size (t, j, given)))
dbbc8b7e
JB
2213 goto mismatch;
2214
f5eb1d70 2215 if ((i.flags[given] & Operand_Mem) && !match_mem_size (t, j, given))
891edac4 2216 goto mismatch;
5c07affc
L
2217 }
2218
3ac21baa 2219 return match | MATCH_REVERSE;
5c07affc
L
2220}
2221
c6fb90c8 2222static INLINE int
40fb9820
L
2223operand_type_match (i386_operand_type overlap,
2224 i386_operand_type given)
2225{
2226 i386_operand_type temp = overlap;
2227
7d5e4556 2228 temp.bitfield.unspecified = 0;
5c07affc
L
2229 temp.bitfield.byte = 0;
2230 temp.bitfield.word = 0;
2231 temp.bitfield.dword = 0;
2232 temp.bitfield.fword = 0;
2233 temp.bitfield.qword = 0;
2234 temp.bitfield.tbyte = 0;
2235 temp.bitfield.xmmword = 0;
c0f3af97 2236 temp.bitfield.ymmword = 0;
43234a1e 2237 temp.bitfield.zmmword = 0;
0dfbf9d7 2238 if (operand_type_all_zero (&temp))
891edac4 2239 goto mismatch;
40fb9820 2240
6f2f06be 2241 if (given.bitfield.baseindex == overlap.bitfield.baseindex)
891edac4
L
2242 return 1;
2243
2244mismatch:
a65babc9 2245 i.error = operand_type_mismatch;
891edac4 2246 return 0;
40fb9820
L
2247}
2248
7d5e4556 2249/* If given types g0 and g1 are registers they must be of the same type
10c17abd
JB
2250 unless the expected operand type register overlap is null.
2251 Memory operand size of certain SIMD instructions is also being checked
2252 here. */
40fb9820 2253
c6fb90c8 2254static INLINE int
dc821c5f 2255operand_type_register_match (i386_operand_type g0,
40fb9820 2256 i386_operand_type t0,
40fb9820
L
2257 i386_operand_type g1,
2258 i386_operand_type t1)
2259{
bab6aec1 2260 if (g0.bitfield.class != Reg
3528c362 2261 && g0.bitfield.class != RegSIMD
10c17abd
JB
2262 && (!operand_type_check (g0, anymem)
2263 || g0.bitfield.unspecified
3528c362 2264 || t0.bitfield.class != RegSIMD))
40fb9820
L
2265 return 1;
2266
bab6aec1 2267 if (g1.bitfield.class != Reg
3528c362 2268 && g1.bitfield.class != RegSIMD
10c17abd
JB
2269 && (!operand_type_check (g1, anymem)
2270 || g1.bitfield.unspecified
3528c362 2271 || t1.bitfield.class != RegSIMD))
40fb9820
L
2272 return 1;
2273
dc821c5f
JB
2274 if (g0.bitfield.byte == g1.bitfield.byte
2275 && g0.bitfield.word == g1.bitfield.word
2276 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2277 && g0.bitfield.qword == g1.bitfield.qword
2278 && g0.bitfield.xmmword == g1.bitfield.xmmword
2279 && g0.bitfield.ymmword == g1.bitfield.ymmword
2280 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2281 return 1;
2282
dc821c5f
JB
2283 if (!(t0.bitfield.byte & t1.bitfield.byte)
2284 && !(t0.bitfield.word & t1.bitfield.word)
2285 && !(t0.bitfield.dword & t1.bitfield.dword)
10c17abd
JB
2286 && !(t0.bitfield.qword & t1.bitfield.qword)
2287 && !(t0.bitfield.xmmword & t1.bitfield.xmmword)
2288 && !(t0.bitfield.ymmword & t1.bitfield.ymmword)
2289 && !(t0.bitfield.zmmword & t1.bitfield.zmmword))
891edac4
L
2290 return 1;
2291
a65babc9 2292 i.error = register_type_mismatch;
891edac4
L
2293
2294 return 0;
40fb9820
L
2295}
2296
4c692bc7
JB
2297static INLINE unsigned int
2298register_number (const reg_entry *r)
2299{
2300 unsigned int nr = r->reg_num;
2301
2302 if (r->reg_flags & RegRex)
2303 nr += 8;
2304
200cbe0f
L
2305 if (r->reg_flags & RegVRex)
2306 nr += 16;
2307
4c692bc7
JB
2308 return nr;
2309}
2310
252b5132 2311static INLINE unsigned int
40fb9820 2312mode_from_disp_size (i386_operand_type t)
252b5132 2313{
b5014f7a 2314 if (t.bitfield.disp8)
40fb9820
L
2315 return 1;
2316 else if (t.bitfield.disp16
2317 || t.bitfield.disp32
2318 || t.bitfield.disp32s)
2319 return 2;
2320 else
2321 return 0;
252b5132
RH
2322}
2323
2324static INLINE int
65879393 2325fits_in_signed_byte (addressT num)
252b5132 2326{
65879393 2327 return num + 0x80 <= 0xff;
47926f60 2328}
252b5132
RH
2329
2330static INLINE int
65879393 2331fits_in_unsigned_byte (addressT num)
252b5132 2332{
65879393 2333 return num <= 0xff;
47926f60 2334}
252b5132
RH
2335
2336static INLINE int
65879393 2337fits_in_unsigned_word (addressT num)
252b5132 2338{
65879393 2339 return num <= 0xffff;
47926f60 2340}
252b5132
RH
2341
2342static INLINE int
65879393 2343fits_in_signed_word (addressT num)
252b5132 2344{
65879393 2345 return num + 0x8000 <= 0xffff;
47926f60 2346}
2a962e6d 2347
3e73aa7c 2348static INLINE int
65879393 2349fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2350{
2351#ifndef BFD64
2352 return 1;
2353#else
65879393 2354 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2355#endif
2356} /* fits_in_signed_long() */
2a962e6d 2357
3e73aa7c 2358static INLINE int
65879393 2359fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2360{
2361#ifndef BFD64
2362 return 1;
2363#else
65879393 2364 return num <= 0xffffffff;
3e73aa7c
JH
2365#endif
2366} /* fits_in_unsigned_long() */
252b5132 2367
43234a1e 2368static INLINE int
b5014f7a 2369fits_in_disp8 (offsetT num)
43234a1e
L
2370{
2371 int shift = i.memshift;
2372 unsigned int mask;
2373
2374 if (shift == -1)
2375 abort ();
2376
2377 mask = (1 << shift) - 1;
2378
2379 /* Return 0 if NUM isn't properly aligned. */
2380 if ((num & mask))
2381 return 0;
2382
2383 /* Check if NUM will fit in 8bit after shift. */
2384 return fits_in_signed_byte (num >> shift);
2385}
2386
a683cc34
SP
2387static INLINE int
2388fits_in_imm4 (offsetT num)
2389{
2390 return (num & 0xf) == num;
2391}
2392
40fb9820 2393static i386_operand_type
e3bb37b5 2394smallest_imm_type (offsetT num)
252b5132 2395{
40fb9820 2396 i386_operand_type t;
7ab9ffdd 2397
0dfbf9d7 2398 operand_type_set (&t, 0);
40fb9820
L
2399 t.bitfield.imm64 = 1;
2400
2401 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2402 {
2403 /* This code is disabled on the 486 because all the Imm1 forms
2404 in the opcode table are slower on the i486. They're the
2405 versions with the implicitly specified single-position
2406 displacement, which has another syntax if you really want to
2407 use that form. */
40fb9820
L
2408 t.bitfield.imm1 = 1;
2409 t.bitfield.imm8 = 1;
2410 t.bitfield.imm8s = 1;
2411 t.bitfield.imm16 = 1;
2412 t.bitfield.imm32 = 1;
2413 t.bitfield.imm32s = 1;
2414 }
2415 else if (fits_in_signed_byte (num))
2416 {
2417 t.bitfield.imm8 = 1;
2418 t.bitfield.imm8s = 1;
2419 t.bitfield.imm16 = 1;
2420 t.bitfield.imm32 = 1;
2421 t.bitfield.imm32s = 1;
2422 }
2423 else if (fits_in_unsigned_byte (num))
2424 {
2425 t.bitfield.imm8 = 1;
2426 t.bitfield.imm16 = 1;
2427 t.bitfield.imm32 = 1;
2428 t.bitfield.imm32s = 1;
2429 }
2430 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2431 {
2432 t.bitfield.imm16 = 1;
2433 t.bitfield.imm32 = 1;
2434 t.bitfield.imm32s = 1;
2435 }
2436 else if (fits_in_signed_long (num))
2437 {
2438 t.bitfield.imm32 = 1;
2439 t.bitfield.imm32s = 1;
2440 }
2441 else if (fits_in_unsigned_long (num))
2442 t.bitfield.imm32 = 1;
2443
2444 return t;
47926f60 2445}
252b5132 2446
847f7ad4 2447static offsetT
e3bb37b5 2448offset_in_range (offsetT val, int size)
847f7ad4 2449{
508866be 2450 addressT mask;
ba2adb93 2451
847f7ad4
AM
2452 switch (size)
2453 {
508866be
L
2454 case 1: mask = ((addressT) 1 << 8) - 1; break;
2455 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 2456 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
2457#ifdef BFD64
2458 case 8: mask = ((addressT) 2 << 63) - 1; break;
2459#endif
47926f60 2460 default: abort ();
847f7ad4
AM
2461 }
2462
9de868bf
L
2463#ifdef BFD64
2464 /* If BFD64, sign extend val for 32bit address mode. */
2465 if (flag_code != CODE_64BIT
2466 || i.prefix[ADDR_PREFIX])
3e73aa7c
JH
2467 if ((val & ~(((addressT) 2 << 31) - 1)) == 0)
2468 val = (val ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
fa289fb8 2469#endif
ba2adb93 2470
47926f60 2471 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
2472 {
2473 char buf1[40], buf2[40];
2474
2475 sprint_value (buf1, val);
2476 sprint_value (buf2, val & mask);
2477 as_warn (_("%s shortened to %s"), buf1, buf2);
2478 }
2479 return val & mask;
2480}
2481
c32fa91d
L
2482enum PREFIX_GROUP
2483{
2484 PREFIX_EXIST = 0,
2485 PREFIX_LOCK,
2486 PREFIX_REP,
04ef582a 2487 PREFIX_DS,
c32fa91d
L
2488 PREFIX_OTHER
2489};
2490
2491/* Returns
2492 a. PREFIX_EXIST if attempting to add a prefix where one from the
2493 same class already exists.
2494 b. PREFIX_LOCK if lock prefix is added.
2495 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2496 d. PREFIX_DS if ds prefix is added.
2497 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2498 */
2499
2500static enum PREFIX_GROUP
e3bb37b5 2501add_prefix (unsigned int prefix)
252b5132 2502{
c32fa91d 2503 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2504 unsigned int q;
252b5132 2505
29b0f896
AM
2506 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2507 && flag_code == CODE_64BIT)
b1905489 2508 {
161a04f6 2509 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2510 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2511 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2512 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2513 ret = PREFIX_EXIST;
b1905489
JB
2514 q = REX_PREFIX;
2515 }
3e73aa7c 2516 else
b1905489
JB
2517 {
2518 switch (prefix)
2519 {
2520 default:
2521 abort ();
2522
b1905489 2523 case DS_PREFIX_OPCODE:
04ef582a
L
2524 ret = PREFIX_DS;
2525 /* Fall through. */
2526 case CS_PREFIX_OPCODE:
b1905489
JB
2527 case ES_PREFIX_OPCODE:
2528 case FS_PREFIX_OPCODE:
2529 case GS_PREFIX_OPCODE:
2530 case SS_PREFIX_OPCODE:
2531 q = SEG_PREFIX;
2532 break;
2533
2534 case REPNE_PREFIX_OPCODE:
2535 case REPE_PREFIX_OPCODE:
c32fa91d
L
2536 q = REP_PREFIX;
2537 ret = PREFIX_REP;
2538 break;
2539
b1905489 2540 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2541 q = LOCK_PREFIX;
2542 ret = PREFIX_LOCK;
b1905489
JB
2543 break;
2544
2545 case FWAIT_OPCODE:
2546 q = WAIT_PREFIX;
2547 break;
2548
2549 case ADDR_PREFIX_OPCODE:
2550 q = ADDR_PREFIX;
2551 break;
2552
2553 case DATA_PREFIX_OPCODE:
2554 q = DATA_PREFIX;
2555 break;
2556 }
2557 if (i.prefix[q] != 0)
c32fa91d 2558 ret = PREFIX_EXIST;
b1905489 2559 }
252b5132 2560
b1905489 2561 if (ret)
252b5132 2562 {
b1905489
JB
2563 if (!i.prefix[q])
2564 ++i.prefixes;
2565 i.prefix[q] |= prefix;
252b5132 2566 }
b1905489
JB
2567 else
2568 as_bad (_("same type of prefix used twice"));
252b5132 2569
252b5132
RH
2570 return ret;
2571}
2572
2573static void
78f12dd3 2574update_code_flag (int value, int check)
eecb386c 2575{
78f12dd3
L
2576 PRINTF_LIKE ((*as_error));
2577
1e9cc1c2 2578 flag_code = (enum flag_code) value;
40fb9820
L
2579 if (flag_code == CODE_64BIT)
2580 {
2581 cpu_arch_flags.bitfield.cpu64 = 1;
2582 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
2583 }
2584 else
2585 {
2586 cpu_arch_flags.bitfield.cpu64 = 0;
2587 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
2588 }
2589 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c 2590 {
78f12dd3
L
2591 if (check)
2592 as_error = as_fatal;
2593 else
2594 as_error = as_bad;
2595 (*as_error) (_("64bit mode not supported on `%s'."),
2596 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2597 }
40fb9820 2598 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c 2599 {
78f12dd3
L
2600 if (check)
2601 as_error = as_fatal;
2602 else
2603 as_error = as_bad;
2604 (*as_error) (_("32bit mode not supported on `%s'."),
2605 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2606 }
eecb386c
AM
2607 stackop_size = '\0';
2608}
2609
78f12dd3
L
2610static void
2611set_code_flag (int value)
2612{
2613 update_code_flag (value, 0);
2614}
2615
eecb386c 2616static void
e3bb37b5 2617set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2618{
1e9cc1c2 2619 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2620 if (flag_code != CODE_16BIT)
2621 abort ();
2622 cpu_arch_flags.bitfield.cpu64 = 0;
2623 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 2624 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2625}
2626
2627static void
e3bb37b5 2628set_intel_syntax (int syntax_flag)
252b5132
RH
2629{
2630 /* Find out if register prefixing is specified. */
2631 int ask_naked_reg = 0;
2632
2633 SKIP_WHITESPACE ();
29b0f896 2634 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2635 {
d02603dc
NC
2636 char *string;
2637 int e = get_symbol_name (&string);
252b5132 2638
47926f60 2639 if (strcmp (string, "prefix") == 0)
252b5132 2640 ask_naked_reg = 1;
47926f60 2641 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2642 ask_naked_reg = -1;
2643 else
d0b47220 2644 as_bad (_("bad argument to syntax directive."));
d02603dc 2645 (void) restore_line_pointer (e);
252b5132
RH
2646 }
2647 demand_empty_rest_of_line ();
c3332e24 2648
252b5132
RH
2649 intel_syntax = syntax_flag;
2650
2651 if (ask_naked_reg == 0)
f86103b7
AM
2652 allow_naked_reg = (intel_syntax
2653 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2654 else
2655 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2656
ee86248c 2657 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
7ab9ffdd 2658
e4a3b5a4 2659 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 2660 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 2661 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
2662}
2663
1efbbeb4
L
2664static void
2665set_intel_mnemonic (int mnemonic_flag)
2666{
e1d4d893 2667 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2668}
2669
db51cc60
L
2670static void
2671set_allow_index_reg (int flag)
2672{
2673 allow_index_reg = flag;
2674}
2675
cb19c032 2676static void
7bab8ab5 2677set_check (int what)
cb19c032 2678{
7bab8ab5
JB
2679 enum check_kind *kind;
2680 const char *str;
2681
2682 if (what)
2683 {
2684 kind = &operand_check;
2685 str = "operand";
2686 }
2687 else
2688 {
2689 kind = &sse_check;
2690 str = "sse";
2691 }
2692
cb19c032
L
2693 SKIP_WHITESPACE ();
2694
2695 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2696 {
d02603dc
NC
2697 char *string;
2698 int e = get_symbol_name (&string);
cb19c032
L
2699
2700 if (strcmp (string, "none") == 0)
7bab8ab5 2701 *kind = check_none;
cb19c032 2702 else if (strcmp (string, "warning") == 0)
7bab8ab5 2703 *kind = check_warning;
cb19c032 2704 else if (strcmp (string, "error") == 0)
7bab8ab5 2705 *kind = check_error;
cb19c032 2706 else
7bab8ab5 2707 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2708 (void) restore_line_pointer (e);
cb19c032
L
2709 }
2710 else
7bab8ab5 2711 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2712
2713 demand_empty_rest_of_line ();
2714}
2715
8a9036a4
L
2716static void
2717check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2718 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2719{
2720#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2721 static const char *arch;
2722
2723 /* Intel LIOM is only supported on ELF. */
2724 if (!IS_ELF)
2725 return;
2726
2727 if (!arch)
2728 {
2729 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2730 use default_arch. */
2731 arch = cpu_arch_name;
2732 if (!arch)
2733 arch = default_arch;
2734 }
2735
81486035
L
2736 /* If we are targeting Intel MCU, we must enable it. */
2737 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_IAMCU
2738 || new_flag.bitfield.cpuiamcu)
2739 return;
2740
3632d14b 2741 /* If we are targeting Intel L1OM, we must enable it. */
8a9036a4 2742 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_L1OM
1e9cc1c2 2743 || new_flag.bitfield.cpul1om)
8a9036a4 2744 return;
76ba9986 2745
7a9068fe
L
2746 /* If we are targeting Intel K1OM, we must enable it. */
2747 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_K1OM
2748 || new_flag.bitfield.cpuk1om)
2749 return;
2750
8a9036a4
L
2751 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2752#endif
2753}
2754
e413e4e9 2755static void
e3bb37b5 2756set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2757{
47926f60 2758 SKIP_WHITESPACE ();
e413e4e9 2759
29b0f896 2760 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9 2761 {
d02603dc
NC
2762 char *string;
2763 int e = get_symbol_name (&string);
91d6fa6a 2764 unsigned int j;
40fb9820 2765 i386_cpu_flags flags;
e413e4e9 2766
91d6fa6a 2767 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
e413e4e9 2768 {
91d6fa6a 2769 if (strcmp (string, cpu_arch[j].name) == 0)
e413e4e9 2770 {
91d6fa6a 2771 check_cpu_arch_compatible (string, cpu_arch[j].flags);
8a9036a4 2772
5c6af06e
JB
2773 if (*string != '.')
2774 {
91d6fa6a 2775 cpu_arch_name = cpu_arch[j].name;
5c6af06e 2776 cpu_sub_arch_name = NULL;
91d6fa6a 2777 cpu_arch_flags = cpu_arch[j].flags;
40fb9820
L
2778 if (flag_code == CODE_64BIT)
2779 {
2780 cpu_arch_flags.bitfield.cpu64 = 1;
2781 cpu_arch_flags.bitfield.cpuno64 = 0;
2782 }
2783 else
2784 {
2785 cpu_arch_flags.bitfield.cpu64 = 0;
2786 cpu_arch_flags.bitfield.cpuno64 = 1;
2787 }
91d6fa6a
NC
2788 cpu_arch_isa = cpu_arch[j].type;
2789 cpu_arch_isa_flags = cpu_arch[j].flags;
ccc9c027
L
2790 if (!cpu_arch_tune_set)
2791 {
2792 cpu_arch_tune = cpu_arch_isa;
2793 cpu_arch_tune_flags = cpu_arch_isa_flags;
2794 }
5c6af06e
JB
2795 break;
2796 }
40fb9820 2797
293f5f65
L
2798 flags = cpu_flags_or (cpu_arch_flags,
2799 cpu_arch[j].flags);
81486035 2800
5b64d091 2801 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
5c6af06e 2802 {
6305a203
L
2803 if (cpu_sub_arch_name)
2804 {
2805 char *name = cpu_sub_arch_name;
2806 cpu_sub_arch_name = concat (name,
91d6fa6a 2807 cpu_arch[j].name,
1bf57e9f 2808 (const char *) NULL);
6305a203
L
2809 free (name);
2810 }
2811 else
91d6fa6a 2812 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
40fb9820 2813 cpu_arch_flags = flags;
a586129e 2814 cpu_arch_isa_flags = flags;
5c6af06e 2815 }
0089dace
L
2816 else
2817 cpu_arch_isa_flags
2818 = cpu_flags_or (cpu_arch_isa_flags,
2819 cpu_arch[j].flags);
d02603dc 2820 (void) restore_line_pointer (e);
5c6af06e
JB
2821 demand_empty_rest_of_line ();
2822 return;
e413e4e9
AM
2823 }
2824 }
293f5f65
L
2825
2826 if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
2827 {
33eaf5de 2828 /* Disable an ISA extension. */
293f5f65
L
2829 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
2830 if (strcmp (string + 1, cpu_noarch [j].name) == 0)
2831 {
2832 flags = cpu_flags_and_not (cpu_arch_flags,
2833 cpu_noarch[j].flags);
2834 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2835 {
2836 if (cpu_sub_arch_name)
2837 {
2838 char *name = cpu_sub_arch_name;
2839 cpu_sub_arch_name = concat (name, string,
2840 (const char *) NULL);
2841 free (name);
2842 }
2843 else
2844 cpu_sub_arch_name = xstrdup (string);
2845 cpu_arch_flags = flags;
2846 cpu_arch_isa_flags = flags;
2847 }
2848 (void) restore_line_pointer (e);
2849 demand_empty_rest_of_line ();
2850 return;
2851 }
2852
2853 j = ARRAY_SIZE (cpu_arch);
2854 }
2855
91d6fa6a 2856 if (j >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
2857 as_bad (_("no such architecture: `%s'"), string);
2858
2859 *input_line_pointer = e;
2860 }
2861 else
2862 as_bad (_("missing cpu architecture"));
2863
fddf5b5b
AM
2864 no_cond_jump_promotion = 0;
2865 if (*input_line_pointer == ','
29b0f896 2866 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 2867 {
d02603dc
NC
2868 char *string;
2869 char e;
2870
2871 ++input_line_pointer;
2872 e = get_symbol_name (&string);
fddf5b5b
AM
2873
2874 if (strcmp (string, "nojumps") == 0)
2875 no_cond_jump_promotion = 1;
2876 else if (strcmp (string, "jumps") == 0)
2877 ;
2878 else
2879 as_bad (_("no such architecture modifier: `%s'"), string);
2880
d02603dc 2881 (void) restore_line_pointer (e);
fddf5b5b
AM
2882 }
2883
e413e4e9
AM
2884 demand_empty_rest_of_line ();
2885}
2886
8a9036a4
L
2887enum bfd_architecture
2888i386_arch (void)
2889{
3632d14b 2890 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4
L
2891 {
2892 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2893 || flag_code != CODE_64BIT)
2894 as_fatal (_("Intel L1OM is 64bit ELF only"));
2895 return bfd_arch_l1om;
2896 }
7a9068fe
L
2897 else if (cpu_arch_isa == PROCESSOR_K1OM)
2898 {
2899 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2900 || flag_code != CODE_64BIT)
2901 as_fatal (_("Intel K1OM is 64bit ELF only"));
2902 return bfd_arch_k1om;
2903 }
81486035
L
2904 else if (cpu_arch_isa == PROCESSOR_IAMCU)
2905 {
2906 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2907 || flag_code == CODE_64BIT)
2908 as_fatal (_("Intel MCU is 32bit ELF only"));
2909 return bfd_arch_iamcu;
2910 }
8a9036a4
L
2911 else
2912 return bfd_arch_i386;
2913}
2914
b9d79e03 2915unsigned long
7016a5d5 2916i386_mach (void)
b9d79e03 2917{
351f65ca 2918 if (!strncmp (default_arch, "x86_64", 6))
8a9036a4 2919 {
3632d14b 2920 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 2921 {
351f65ca
L
2922 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2923 || default_arch[6] != '\0')
8a9036a4
L
2924 as_fatal (_("Intel L1OM is 64bit ELF only"));
2925 return bfd_mach_l1om;
2926 }
7a9068fe
L
2927 else if (cpu_arch_isa == PROCESSOR_K1OM)
2928 {
2929 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2930 || default_arch[6] != '\0')
2931 as_fatal (_("Intel K1OM is 64bit ELF only"));
2932 return bfd_mach_k1om;
2933 }
351f65ca 2934 else if (default_arch[6] == '\0')
8a9036a4 2935 return bfd_mach_x86_64;
351f65ca
L
2936 else
2937 return bfd_mach_x64_32;
8a9036a4 2938 }
5197d474
L
2939 else if (!strcmp (default_arch, "i386")
2940 || !strcmp (default_arch, "iamcu"))
81486035
L
2941 {
2942 if (cpu_arch_isa == PROCESSOR_IAMCU)
2943 {
2944 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
2945 as_fatal (_("Intel MCU is 32bit ELF only"));
2946 return bfd_mach_i386_iamcu;
2947 }
2948 else
2949 return bfd_mach_i386_i386;
2950 }
b9d79e03 2951 else
2b5d6a91 2952 as_fatal (_("unknown architecture"));
b9d79e03 2953}
b9d79e03 2954\f
252b5132 2955void
7016a5d5 2956md_begin (void)
252b5132
RH
2957{
2958 const char *hash_err;
2959
86fa6981
L
2960 /* Support pseudo prefixes like {disp32}. */
2961 lex_type ['{'] = LEX_BEGIN_NAME;
2962
47926f60 2963 /* Initialize op_hash hash table. */
252b5132
RH
2964 op_hash = hash_new ();
2965
2966 {
d3ce72d0 2967 const insn_template *optab;
29b0f896 2968 templates *core_optab;
252b5132 2969
47926f60
KH
2970 /* Setup for loop. */
2971 optab = i386_optab;
add39d23 2972 core_optab = XNEW (templates);
252b5132
RH
2973 core_optab->start = optab;
2974
2975 while (1)
2976 {
2977 ++optab;
2978 if (optab->name == NULL
2979 || strcmp (optab->name, (optab - 1)->name) != 0)
2980 {
2981 /* different name --> ship out current template list;
47926f60 2982 add to hash table; & begin anew. */
252b5132
RH
2983 core_optab->end = optab;
2984 hash_err = hash_insert (op_hash,
2985 (optab - 1)->name,
5a49b8ac 2986 (void *) core_optab);
252b5132
RH
2987 if (hash_err)
2988 {
b37df7c4 2989 as_fatal (_("can't hash %s: %s"),
252b5132
RH
2990 (optab - 1)->name,
2991 hash_err);
2992 }
2993 if (optab->name == NULL)
2994 break;
add39d23 2995 core_optab = XNEW (templates);
252b5132
RH
2996 core_optab->start = optab;
2997 }
2998 }
2999 }
3000
47926f60 3001 /* Initialize reg_hash hash table. */
252b5132
RH
3002 reg_hash = hash_new ();
3003 {
29b0f896 3004 const reg_entry *regtab;
c3fe08fa 3005 unsigned int regtab_size = i386_regtab_size;
252b5132 3006
c3fe08fa 3007 for (regtab = i386_regtab; regtab_size--; regtab++)
252b5132 3008 {
5a49b8ac 3009 hash_err = hash_insert (reg_hash, regtab->reg_name, (void *) regtab);
252b5132 3010 if (hash_err)
b37df7c4 3011 as_fatal (_("can't hash %s: %s"),
3e73aa7c
JH
3012 regtab->reg_name,
3013 hash_err);
252b5132
RH
3014 }
3015 }
3016
47926f60 3017 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 3018 {
29b0f896
AM
3019 int c;
3020 char *p;
252b5132
RH
3021
3022 for (c = 0; c < 256; c++)
3023 {
3882b010 3024 if (ISDIGIT (c))
252b5132
RH
3025 {
3026 digit_chars[c] = c;
3027 mnemonic_chars[c] = c;
3028 register_chars[c] = c;
3029 operand_chars[c] = c;
3030 }
3882b010 3031 else if (ISLOWER (c))
252b5132
RH
3032 {
3033 mnemonic_chars[c] = c;
3034 register_chars[c] = c;
3035 operand_chars[c] = c;
3036 }
3882b010 3037 else if (ISUPPER (c))
252b5132 3038 {
3882b010 3039 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
3040 register_chars[c] = mnemonic_chars[c];
3041 operand_chars[c] = c;
3042 }
43234a1e 3043 else if (c == '{' || c == '}')
86fa6981
L
3044 {
3045 mnemonic_chars[c] = c;
3046 operand_chars[c] = c;
3047 }
252b5132 3048
3882b010 3049 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
3050 identifier_chars[c] = c;
3051 else if (c >= 128)
3052 {
3053 identifier_chars[c] = c;
3054 operand_chars[c] = c;
3055 }
3056 }
3057
3058#ifdef LEX_AT
3059 identifier_chars['@'] = '@';
32137342
NC
3060#endif
3061#ifdef LEX_QM
3062 identifier_chars['?'] = '?';
3063 operand_chars['?'] = '?';
252b5132 3064#endif
252b5132 3065 digit_chars['-'] = '-';
c0f3af97 3066 mnemonic_chars['_'] = '_';
791fe849 3067 mnemonic_chars['-'] = '-';
0003779b 3068 mnemonic_chars['.'] = '.';
252b5132
RH
3069 identifier_chars['_'] = '_';
3070 identifier_chars['.'] = '.';
3071
3072 for (p = operand_special_chars; *p != '\0'; p++)
3073 operand_chars[(unsigned char) *p] = *p;
3074 }
3075
a4447b93
RH
3076 if (flag_code == CODE_64BIT)
3077 {
ca19b261
KT
3078#if defined (OBJ_COFF) && defined (TE_PE)
3079 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
3080 ? 32 : 16);
3081#else
a4447b93 3082 x86_dwarf2_return_column = 16;
ca19b261 3083#endif
61ff971f 3084 x86_cie_data_alignment = -8;
a4447b93
RH
3085 }
3086 else
3087 {
3088 x86_dwarf2_return_column = 8;
3089 x86_cie_data_alignment = -4;
3090 }
e379e5f3
L
3091
3092 /* NB: FUSED_JCC_PADDING frag must have sufficient room so that it
3093 can be turned into BRANCH_PREFIX frag. */
3094 if (align_branch_prefix_size > MAX_FUSED_JCC_PADDING_SIZE)
3095 abort ();
252b5132
RH
3096}
3097
3098void
e3bb37b5 3099i386_print_statistics (FILE *file)
252b5132
RH
3100{
3101 hash_print_statistics (file, "i386 opcode", op_hash);
3102 hash_print_statistics (file, "i386 register", reg_hash);
3103}
3104\f
252b5132
RH
3105#ifdef DEBUG386
3106
ce8a8b2f 3107/* Debugging routines for md_assemble. */
d3ce72d0 3108static void pte (insn_template *);
40fb9820 3109static void pt (i386_operand_type);
e3bb37b5
L
3110static void pe (expressionS *);
3111static void ps (symbolS *);
252b5132
RH
3112
3113static void
2c703856 3114pi (const char *line, i386_insn *x)
252b5132 3115{
09137c09 3116 unsigned int j;
252b5132
RH
3117
3118 fprintf (stdout, "%s: template ", line);
3119 pte (&x->tm);
09f131f2
JH
3120 fprintf (stdout, " address: base %s index %s scale %x\n",
3121 x->base_reg ? x->base_reg->reg_name : "none",
3122 x->index_reg ? x->index_reg->reg_name : "none",
3123 x->log2_scale_factor);
3124 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 3125 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
3126 fprintf (stdout, " sib: base %x index %x scale %x\n",
3127 x->sib.base, x->sib.index, x->sib.scale);
3128 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
3129 (x->rex & REX_W) != 0,
3130 (x->rex & REX_R) != 0,
3131 (x->rex & REX_X) != 0,
3132 (x->rex & REX_B) != 0);
09137c09 3133 for (j = 0; j < x->operands; j++)
252b5132 3134 {
09137c09
SP
3135 fprintf (stdout, " #%d: ", j + 1);
3136 pt (x->types[j]);
252b5132 3137 fprintf (stdout, "\n");
bab6aec1 3138 if (x->types[j].bitfield.class == Reg
3528c362
JB
3139 || x->types[j].bitfield.class == RegMMX
3140 || x->types[j].bitfield.class == RegSIMD
00cee14f 3141 || x->types[j].bitfield.class == SReg
4a5c67ed
JB
3142 || x->types[j].bitfield.class == RegCR
3143 || x->types[j].bitfield.class == RegDR
3144 || x->types[j].bitfield.class == RegTR)
09137c09
SP
3145 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
3146 if (operand_type_check (x->types[j], imm))
3147 pe (x->op[j].imms);
3148 if (operand_type_check (x->types[j], disp))
3149 pe (x->op[j].disps);
252b5132
RH
3150 }
3151}
3152
3153static void
d3ce72d0 3154pte (insn_template *t)
252b5132 3155{
09137c09 3156 unsigned int j;
252b5132 3157 fprintf (stdout, " %d operands ", t->operands);
47926f60 3158 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
3159 if (t->extension_opcode != None)
3160 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 3161 if (t->opcode_modifier.d)
252b5132 3162 fprintf (stdout, "D");
40fb9820 3163 if (t->opcode_modifier.w)
252b5132
RH
3164 fprintf (stdout, "W");
3165 fprintf (stdout, "\n");
09137c09 3166 for (j = 0; j < t->operands; j++)
252b5132 3167 {
09137c09
SP
3168 fprintf (stdout, " #%d type ", j + 1);
3169 pt (t->operand_types[j]);
252b5132
RH
3170 fprintf (stdout, "\n");
3171 }
3172}
3173
3174static void
e3bb37b5 3175pe (expressionS *e)
252b5132 3176{
24eab124 3177 fprintf (stdout, " operation %d\n", e->X_op);
b77ad1d4
AM
3178 fprintf (stdout, " add_number %ld (%lx)\n",
3179 (long) e->X_add_number, (long) e->X_add_number);
252b5132
RH
3180 if (e->X_add_symbol)
3181 {
3182 fprintf (stdout, " add_symbol ");
3183 ps (e->X_add_symbol);
3184 fprintf (stdout, "\n");
3185 }
3186 if (e->X_op_symbol)
3187 {
3188 fprintf (stdout, " op_symbol ");
3189 ps (e->X_op_symbol);
3190 fprintf (stdout, "\n");
3191 }
3192}
3193
3194static void
e3bb37b5 3195ps (symbolS *s)
252b5132
RH
3196{
3197 fprintf (stdout, "%s type %s%s",
3198 S_GET_NAME (s),
3199 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3200 segment_name (S_GET_SEGMENT (s)));
3201}
3202
7b81dfbb 3203static struct type_name
252b5132 3204 {
40fb9820
L
3205 i386_operand_type mask;
3206 const char *name;
252b5132 3207 }
7b81dfbb 3208const type_names[] =
252b5132 3209{
40fb9820
L
3210 { OPERAND_TYPE_REG8, "r8" },
3211 { OPERAND_TYPE_REG16, "r16" },
3212 { OPERAND_TYPE_REG32, "r32" },
3213 { OPERAND_TYPE_REG64, "r64" },
2c703856
JB
3214 { OPERAND_TYPE_ACC8, "acc8" },
3215 { OPERAND_TYPE_ACC16, "acc16" },
3216 { OPERAND_TYPE_ACC32, "acc32" },
3217 { OPERAND_TYPE_ACC64, "acc64" },
40fb9820
L
3218 { OPERAND_TYPE_IMM8, "i8" },
3219 { OPERAND_TYPE_IMM8, "i8s" },
3220 { OPERAND_TYPE_IMM16, "i16" },
3221 { OPERAND_TYPE_IMM32, "i32" },
3222 { OPERAND_TYPE_IMM32S, "i32s" },
3223 { OPERAND_TYPE_IMM64, "i64" },
3224 { OPERAND_TYPE_IMM1, "i1" },
3225 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
3226 { OPERAND_TYPE_DISP8, "d8" },
3227 { OPERAND_TYPE_DISP16, "d16" },
3228 { OPERAND_TYPE_DISP32, "d32" },
3229 { OPERAND_TYPE_DISP32S, "d32s" },
3230 { OPERAND_TYPE_DISP64, "d64" },
3231 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
3232 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
3233 { OPERAND_TYPE_CONTROL, "control reg" },
3234 { OPERAND_TYPE_TEST, "test reg" },
3235 { OPERAND_TYPE_DEBUG, "debug reg" },
3236 { OPERAND_TYPE_FLOATREG, "FReg" },
3237 { OPERAND_TYPE_FLOATACC, "FAcc" },
21df382b 3238 { OPERAND_TYPE_SREG, "SReg" },
40fb9820
L
3239 { OPERAND_TYPE_REGMMX, "rMMX" },
3240 { OPERAND_TYPE_REGXMM, "rXMM" },
0349dc08 3241 { OPERAND_TYPE_REGYMM, "rYMM" },
43234a1e
L
3242 { OPERAND_TYPE_REGZMM, "rZMM" },
3243 { OPERAND_TYPE_REGMASK, "Mask reg" },
252b5132
RH
3244};
3245
3246static void
40fb9820 3247pt (i386_operand_type t)
252b5132 3248{
40fb9820 3249 unsigned int j;
c6fb90c8 3250 i386_operand_type a;
252b5132 3251
40fb9820 3252 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3253 {
3254 a = operand_type_and (t, type_names[j].mask);
2c703856 3255 if (operand_type_equal (&a, &type_names[j].mask))
c6fb90c8
L
3256 fprintf (stdout, "%s, ", type_names[j].name);
3257 }
252b5132
RH
3258 fflush (stdout);
3259}
3260
3261#endif /* DEBUG386 */
3262\f
252b5132 3263static bfd_reloc_code_real_type
3956db08 3264reloc (unsigned int size,
64e74474
AM
3265 int pcrel,
3266 int sign,
3267 bfd_reloc_code_real_type other)
252b5132 3268{
47926f60 3269 if (other != NO_RELOC)
3956db08 3270 {
91d6fa6a 3271 reloc_howto_type *rel;
3956db08
JB
3272
3273 if (size == 8)
3274 switch (other)
3275 {
64e74474
AM
3276 case BFD_RELOC_X86_64_GOT32:
3277 return BFD_RELOC_X86_64_GOT64;
3278 break;
553d1284
L
3279 case BFD_RELOC_X86_64_GOTPLT64:
3280 return BFD_RELOC_X86_64_GOTPLT64;
3281 break;
64e74474
AM
3282 case BFD_RELOC_X86_64_PLTOFF64:
3283 return BFD_RELOC_X86_64_PLTOFF64;
3284 break;
3285 case BFD_RELOC_X86_64_GOTPC32:
3286 other = BFD_RELOC_X86_64_GOTPC64;
3287 break;
3288 case BFD_RELOC_X86_64_GOTPCREL:
3289 other = BFD_RELOC_X86_64_GOTPCREL64;
3290 break;
3291 case BFD_RELOC_X86_64_TPOFF32:
3292 other = BFD_RELOC_X86_64_TPOFF64;
3293 break;
3294 case BFD_RELOC_X86_64_DTPOFF32:
3295 other = BFD_RELOC_X86_64_DTPOFF64;
3296 break;
3297 default:
3298 break;
3956db08 3299 }
e05278af 3300
8ce3d284 3301#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3302 if (other == BFD_RELOC_SIZE32)
3303 {
3304 if (size == 8)
1ab668bf 3305 other = BFD_RELOC_SIZE64;
8fd4256d 3306 if (pcrel)
1ab668bf
AM
3307 {
3308 as_bad (_("there are no pc-relative size relocations"));
3309 return NO_RELOC;
3310 }
8fd4256d 3311 }
8ce3d284 3312#endif
8fd4256d 3313
e05278af 3314 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3315 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3316 sign = -1;
3317
91d6fa6a
NC
3318 rel = bfd_reloc_type_lookup (stdoutput, other);
3319 if (!rel)
3956db08 3320 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3321 else if (size != bfd_get_reloc_size (rel))
3956db08 3322 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3323 bfd_get_reloc_size (rel),
3956db08 3324 size);
91d6fa6a 3325 else if (pcrel && !rel->pc_relative)
3956db08 3326 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3327 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3328 && !sign)
91d6fa6a 3329 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3330 && sign > 0))
3956db08
JB
3331 as_bad (_("relocated field and relocation type differ in signedness"));
3332 else
3333 return other;
3334 return NO_RELOC;
3335 }
252b5132
RH
3336
3337 if (pcrel)
3338 {
3e73aa7c 3339 if (!sign)
3956db08 3340 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3341 switch (size)
3342 {
3343 case 1: return BFD_RELOC_8_PCREL;
3344 case 2: return BFD_RELOC_16_PCREL;
d258b828 3345 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3346 case 8: return BFD_RELOC_64_PCREL;
252b5132 3347 }
3956db08 3348 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3349 }
3350 else
3351 {
3956db08 3352 if (sign > 0)
e5cb08ac 3353 switch (size)
3e73aa7c
JH
3354 {
3355 case 4: return BFD_RELOC_X86_64_32S;
3356 }
3357 else
3358 switch (size)
3359 {
3360 case 1: return BFD_RELOC_8;
3361 case 2: return BFD_RELOC_16;
3362 case 4: return BFD_RELOC_32;
3363 case 8: return BFD_RELOC_64;
3364 }
3956db08
JB
3365 as_bad (_("cannot do %s %u byte relocation"),
3366 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3367 }
3368
0cc9e1d3 3369 return NO_RELOC;
252b5132
RH
3370}
3371
47926f60
KH
3372/* Here we decide which fixups can be adjusted to make them relative to
3373 the beginning of the section instead of the symbol. Basically we need
3374 to make sure that the dynamic relocations are done correctly, so in
3375 some cases we force the original symbol to be used. */
3376
252b5132 3377int
e3bb37b5 3378tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3379{
6d249963 3380#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3381 if (!IS_ELF)
31312f95
AM
3382 return 1;
3383
a161fe53
AM
3384 /* Don't adjust pc-relative references to merge sections in 64-bit
3385 mode. */
3386 if (use_rela_relocations
3387 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3388 && fixP->fx_pcrel)
252b5132 3389 return 0;
31312f95 3390
8d01d9a9
AJ
3391 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3392 and changed later by validate_fix. */
3393 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3394 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3395 return 0;
3396
8fd4256d
L
3397 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3398 for size relocations. */
3399 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3400 || fixP->fx_r_type == BFD_RELOC_SIZE64
3401 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132
RH
3402 || fixP->fx_r_type == BFD_RELOC_386_PLT32
3403 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3404 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3405 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3406 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3407 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3408 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3409 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3410 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3411 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3412 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3413 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3414 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c
JH
3415 || fixP->fx_r_type == BFD_RELOC_X86_64_PLT32
3416 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3417 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3418 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3419 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3420 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3421 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3422 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3423 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3424 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3425 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3426 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3427 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3428 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3429 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3430 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3431 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3432 return 0;
31312f95 3433#endif
252b5132
RH
3434 return 1;
3435}
252b5132 3436
b4cac588 3437static int
e3bb37b5 3438intel_float_operand (const char *mnemonic)
252b5132 3439{
9306ca4a
JB
3440 /* Note that the value returned is meaningful only for opcodes with (memory)
3441 operands, hence the code here is free to improperly handle opcodes that
3442 have no operands (for better performance and smaller code). */
3443
3444 if (mnemonic[0] != 'f')
3445 return 0; /* non-math */
3446
3447 switch (mnemonic[1])
3448 {
3449 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3450 the fs segment override prefix not currently handled because no
3451 call path can make opcodes without operands get here */
3452 case 'i':
3453 return 2 /* integer op */;
3454 case 'l':
3455 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3456 return 3; /* fldcw/fldenv */
3457 break;
3458 case 'n':
3459 if (mnemonic[2] != 'o' /* fnop */)
3460 return 3; /* non-waiting control op */
3461 break;
3462 case 'r':
3463 if (mnemonic[2] == 's')
3464 return 3; /* frstor/frstpm */
3465 break;
3466 case 's':
3467 if (mnemonic[2] == 'a')
3468 return 3; /* fsave */
3469 if (mnemonic[2] == 't')
3470 {
3471 switch (mnemonic[3])
3472 {
3473 case 'c': /* fstcw */
3474 case 'd': /* fstdw */
3475 case 'e': /* fstenv */
3476 case 's': /* fsts[gw] */
3477 return 3;
3478 }
3479 }
3480 break;
3481 case 'x':
3482 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3483 return 0; /* fxsave/fxrstor are not really math ops */
3484 break;
3485 }
252b5132 3486
9306ca4a 3487 return 1;
252b5132
RH
3488}
3489
c0f3af97
L
3490/* Build the VEX prefix. */
3491
3492static void
d3ce72d0 3493build_vex_prefix (const insn_template *t)
c0f3af97
L
3494{
3495 unsigned int register_specifier;
3496 unsigned int implied_prefix;
3497 unsigned int vector_length;
03751133 3498 unsigned int w;
c0f3af97
L
3499
3500 /* Check register specifier. */
3501 if (i.vex.register_specifier)
43234a1e
L
3502 {
3503 register_specifier =
3504 ~register_number (i.vex.register_specifier) & 0xf;
3505 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3506 }
c0f3af97
L
3507 else
3508 register_specifier = 0xf;
3509
79f0fa25
L
3510 /* Use 2-byte VEX prefix by swapping destination and source operand
3511 if there are more than 1 register operand. */
3512 if (i.reg_operands > 1
3513 && i.vec_encoding != vex_encoding_vex3
86fa6981 3514 && i.dir_encoding == dir_encoding_default
fa99fab2 3515 && i.operands == i.reg_operands
dbbc8b7e 3516 && operand_type_equal (&i.types[0], &i.types[i.operands - 1])
7f399153 3517 && i.tm.opcode_modifier.vexopcode == VEX0F
dbbc8b7e 3518 && (i.tm.opcode_modifier.load || i.tm.opcode_modifier.d)
fa99fab2
L
3519 && i.rex == REX_B)
3520 {
3521 unsigned int xchg = i.operands - 1;
3522 union i386_op temp_op;
3523 i386_operand_type temp_type;
3524
3525 temp_type = i.types[xchg];
3526 i.types[xchg] = i.types[0];
3527 i.types[0] = temp_type;
3528 temp_op = i.op[xchg];
3529 i.op[xchg] = i.op[0];
3530 i.op[0] = temp_op;
3531
9c2799c2 3532 gas_assert (i.rm.mode == 3);
fa99fab2
L
3533
3534 i.rex = REX_R;
3535 xchg = i.rm.regmem;
3536 i.rm.regmem = i.rm.reg;
3537 i.rm.reg = xchg;
3538
dbbc8b7e
JB
3539 if (i.tm.opcode_modifier.d)
3540 i.tm.base_opcode ^= (i.tm.base_opcode & 0xee) != 0x6e
3541 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
3542 else /* Use the next insn. */
3543 i.tm = t[1];
fa99fab2
L
3544 }
3545
79dec6b7
JB
3546 /* Use 2-byte VEX prefix by swapping commutative source operands if there
3547 are no memory operands and at least 3 register ones. */
3548 if (i.reg_operands >= 3
3549 && i.vec_encoding != vex_encoding_vex3
3550 && i.reg_operands == i.operands - i.imm_operands
3551 && i.tm.opcode_modifier.vex
3552 && i.tm.opcode_modifier.commutative
3553 && (i.tm.opcode_modifier.sse2avx || optimize > 1)
3554 && i.rex == REX_B
3555 && i.vex.register_specifier
3556 && !(i.vex.register_specifier->reg_flags & RegRex))
3557 {
3558 unsigned int xchg = i.operands - i.reg_operands;
3559 union i386_op temp_op;
3560 i386_operand_type temp_type;
3561
3562 gas_assert (i.tm.opcode_modifier.vexopcode == VEX0F);
3563 gas_assert (!i.tm.opcode_modifier.sae);
3564 gas_assert (operand_type_equal (&i.types[i.operands - 2],
3565 &i.types[i.operands - 3]));
3566 gas_assert (i.rm.mode == 3);
3567
3568 temp_type = i.types[xchg];
3569 i.types[xchg] = i.types[xchg + 1];
3570 i.types[xchg + 1] = temp_type;
3571 temp_op = i.op[xchg];
3572 i.op[xchg] = i.op[xchg + 1];
3573 i.op[xchg + 1] = temp_op;
3574
3575 i.rex = 0;
3576 xchg = i.rm.regmem | 8;
3577 i.rm.regmem = ~register_specifier & 0xf;
3578 gas_assert (!(i.rm.regmem & 8));
3579 i.vex.register_specifier += xchg - i.rm.regmem;
3580 register_specifier = ~xchg & 0xf;
3581 }
3582
539f890d
L
3583 if (i.tm.opcode_modifier.vex == VEXScalar)
3584 vector_length = avxscalar;
10c17abd
JB
3585 else if (i.tm.opcode_modifier.vex == VEX256)
3586 vector_length = 1;
539f890d 3587 else
10c17abd 3588 {
56522fc5 3589 unsigned int op;
10c17abd 3590
c7213af9
L
3591 /* Determine vector length from the last multi-length vector
3592 operand. */
10c17abd 3593 vector_length = 0;
56522fc5 3594 for (op = t->operands; op--;)
10c17abd
JB
3595 if (t->operand_types[op].bitfield.xmmword
3596 && t->operand_types[op].bitfield.ymmword
3597 && i.types[op].bitfield.ymmword)
3598 {
3599 vector_length = 1;
3600 break;
3601 }
3602 }
c0f3af97
L
3603
3604 switch ((i.tm.base_opcode >> 8) & 0xff)
3605 {
3606 case 0:
3607 implied_prefix = 0;
3608 break;
3609 case DATA_PREFIX_OPCODE:
3610 implied_prefix = 1;
3611 break;
3612 case REPE_PREFIX_OPCODE:
3613 implied_prefix = 2;
3614 break;
3615 case REPNE_PREFIX_OPCODE:
3616 implied_prefix = 3;
3617 break;
3618 default:
3619 abort ();
3620 }
3621
03751133
L
3622 /* Check the REX.W bit and VEXW. */
3623 if (i.tm.opcode_modifier.vexw == VEXWIG)
3624 w = (vexwig == vexw1 || (i.rex & REX_W)) ? 1 : 0;
3625 else if (i.tm.opcode_modifier.vexw)
3626 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3627 else
931d03b7 3628 w = (flag_code == CODE_64BIT ? i.rex & REX_W : vexwig == vexw1) ? 1 : 0;
03751133 3629
c0f3af97 3630 /* Use 2-byte VEX prefix if possible. */
03751133
L
3631 if (w == 0
3632 && i.vec_encoding != vex_encoding_vex3
86fa6981 3633 && i.tm.opcode_modifier.vexopcode == VEX0F
c0f3af97
L
3634 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3635 {
3636 /* 2-byte VEX prefix. */
3637 unsigned int r;
3638
3639 i.vex.length = 2;
3640 i.vex.bytes[0] = 0xc5;
3641
3642 /* Check the REX.R bit. */
3643 r = (i.rex & REX_R) ? 0 : 1;
3644 i.vex.bytes[1] = (r << 7
3645 | register_specifier << 3
3646 | vector_length << 2
3647 | implied_prefix);
3648 }
3649 else
3650 {
3651 /* 3-byte VEX prefix. */
03751133 3652 unsigned int m;
c0f3af97 3653
f88c9eb0 3654 i.vex.length = 3;
f88c9eb0 3655
7f399153 3656 switch (i.tm.opcode_modifier.vexopcode)
5dd85c99 3657 {
7f399153
L
3658 case VEX0F:
3659 m = 0x1;
80de6e00 3660 i.vex.bytes[0] = 0xc4;
7f399153
L
3661 break;
3662 case VEX0F38:
3663 m = 0x2;
80de6e00 3664 i.vex.bytes[0] = 0xc4;
7f399153
L
3665 break;
3666 case VEX0F3A:
3667 m = 0x3;
80de6e00 3668 i.vex.bytes[0] = 0xc4;
7f399153
L
3669 break;
3670 case XOP08:
5dd85c99
SP
3671 m = 0x8;
3672 i.vex.bytes[0] = 0x8f;
7f399153
L
3673 break;
3674 case XOP09:
f88c9eb0
SP
3675 m = 0x9;
3676 i.vex.bytes[0] = 0x8f;
7f399153
L
3677 break;
3678 case XOP0A:
f88c9eb0
SP
3679 m = 0xa;
3680 i.vex.bytes[0] = 0x8f;
7f399153
L
3681 break;
3682 default:
3683 abort ();
f88c9eb0 3684 }
c0f3af97 3685
c0f3af97
L
3686 /* The high 3 bits of the second VEX byte are 1's compliment
3687 of RXB bits from REX. */
3688 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3689
c0f3af97
L
3690 i.vex.bytes[2] = (w << 7
3691 | register_specifier << 3
3692 | vector_length << 2
3693 | implied_prefix);
3694 }
3695}
3696
e771e7c9
JB
3697static INLINE bfd_boolean
3698is_evex_encoding (const insn_template *t)
3699{
7091c612 3700 return t->opcode_modifier.evex || t->opcode_modifier.disp8memshift
e771e7c9 3701 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
a80195f1 3702 || t->opcode_modifier.sae;
e771e7c9
JB
3703}
3704
7a8655d2
JB
3705static INLINE bfd_boolean
3706is_any_vex_encoding (const insn_template *t)
3707{
3708 return t->opcode_modifier.vex || t->opcode_modifier.vexopcode
3709 || is_evex_encoding (t);
3710}
3711
43234a1e
L
3712/* Build the EVEX prefix. */
3713
3714static void
3715build_evex_prefix (void)
3716{
3717 unsigned int register_specifier;
3718 unsigned int implied_prefix;
3719 unsigned int m, w;
3720 rex_byte vrex_used = 0;
3721
3722 /* Check register specifier. */
3723 if (i.vex.register_specifier)
3724 {
3725 gas_assert ((i.vrex & REX_X) == 0);
3726
3727 register_specifier = i.vex.register_specifier->reg_num;
3728 if ((i.vex.register_specifier->reg_flags & RegRex))
3729 register_specifier += 8;
3730 /* The upper 16 registers are encoded in the fourth byte of the
3731 EVEX prefix. */
3732 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3733 i.vex.bytes[3] = 0x8;
3734 register_specifier = ~register_specifier & 0xf;
3735 }
3736 else
3737 {
3738 register_specifier = 0xf;
3739
3740 /* Encode upper 16 vector index register in the fourth byte of
3741 the EVEX prefix. */
3742 if (!(i.vrex & REX_X))
3743 i.vex.bytes[3] = 0x8;
3744 else
3745 vrex_used |= REX_X;
3746 }
3747
3748 switch ((i.tm.base_opcode >> 8) & 0xff)
3749 {
3750 case 0:
3751 implied_prefix = 0;
3752 break;
3753 case DATA_PREFIX_OPCODE:
3754 implied_prefix = 1;
3755 break;
3756 case REPE_PREFIX_OPCODE:
3757 implied_prefix = 2;
3758 break;
3759 case REPNE_PREFIX_OPCODE:
3760 implied_prefix = 3;
3761 break;
3762 default:
3763 abort ();
3764 }
3765
3766 /* 4 byte EVEX prefix. */
3767 i.vex.length = 4;
3768 i.vex.bytes[0] = 0x62;
3769
3770 /* mmmm bits. */
3771 switch (i.tm.opcode_modifier.vexopcode)
3772 {
3773 case VEX0F:
3774 m = 1;
3775 break;
3776 case VEX0F38:
3777 m = 2;
3778 break;
3779 case VEX0F3A:
3780 m = 3;
3781 break;
3782 default:
3783 abort ();
3784 break;
3785 }
3786
3787 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3788 bits from REX. */
3789 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3790
3791 /* The fifth bit of the second EVEX byte is 1's compliment of the
3792 REX_R bit in VREX. */
3793 if (!(i.vrex & REX_R))
3794 i.vex.bytes[1] |= 0x10;
3795 else
3796 vrex_used |= REX_R;
3797
3798 if ((i.reg_operands + i.imm_operands) == i.operands)
3799 {
3800 /* When all operands are registers, the REX_X bit in REX is not
3801 used. We reuse it to encode the upper 16 registers, which is
3802 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3803 as 1's compliment. */
3804 if ((i.vrex & REX_B))
3805 {
3806 vrex_used |= REX_B;
3807 i.vex.bytes[1] &= ~0x40;
3808 }
3809 }
3810
3811 /* EVEX instructions shouldn't need the REX prefix. */
3812 i.vrex &= ~vrex_used;
3813 gas_assert (i.vrex == 0);
3814
6865c043
L
3815 /* Check the REX.W bit and VEXW. */
3816 if (i.tm.opcode_modifier.vexw == VEXWIG)
3817 w = (evexwig == evexw1 || (i.rex & REX_W)) ? 1 : 0;
3818 else if (i.tm.opcode_modifier.vexw)
3819 w = i.tm.opcode_modifier.vexw == VEXW1 ? 1 : 0;
3820 else
931d03b7 3821 w = (flag_code == CODE_64BIT ? i.rex & REX_W : evexwig == evexw1) ? 1 : 0;
43234a1e
L
3822
3823 /* Encode the U bit. */
3824 implied_prefix |= 0x4;
3825
3826 /* The third byte of the EVEX prefix. */
3827 i.vex.bytes[2] = (w << 7 | register_specifier << 3 | implied_prefix);
3828
3829 /* The fourth byte of the EVEX prefix. */
3830 /* The zeroing-masking bit. */
3831 if (i.mask && i.mask->zeroing)
3832 i.vex.bytes[3] |= 0x80;
3833
3834 /* Don't always set the broadcast bit if there is no RC. */
3835 if (!i.rounding)
3836 {
3837 /* Encode the vector length. */
3838 unsigned int vec_length;
3839
e771e7c9
JB
3840 if (!i.tm.opcode_modifier.evex
3841 || i.tm.opcode_modifier.evex == EVEXDYN)
3842 {
56522fc5 3843 unsigned int op;
e771e7c9 3844
c7213af9
L
3845 /* Determine vector length from the last multi-length vector
3846 operand. */
e771e7c9 3847 vec_length = 0;
56522fc5 3848 for (op = i.operands; op--;)
e771e7c9
JB
3849 if (i.tm.operand_types[op].bitfield.xmmword
3850 + i.tm.operand_types[op].bitfield.ymmword
3851 + i.tm.operand_types[op].bitfield.zmmword > 1)
3852 {
3853 if (i.types[op].bitfield.zmmword)
c7213af9
L
3854 {
3855 i.tm.opcode_modifier.evex = EVEX512;
3856 break;
3857 }
e771e7c9 3858 else if (i.types[op].bitfield.ymmword)
c7213af9
L
3859 {
3860 i.tm.opcode_modifier.evex = EVEX256;
3861 break;
3862 }
e771e7c9 3863 else if (i.types[op].bitfield.xmmword)
c7213af9
L
3864 {
3865 i.tm.opcode_modifier.evex = EVEX128;
3866 break;
3867 }
625cbd7a
JB
3868 else if (i.broadcast && (int) op == i.broadcast->operand)
3869 {
4a1b91ea 3870 switch (i.broadcast->bytes)
625cbd7a
JB
3871 {
3872 case 64:
3873 i.tm.opcode_modifier.evex = EVEX512;
3874 break;
3875 case 32:
3876 i.tm.opcode_modifier.evex = EVEX256;
3877 break;
3878 case 16:
3879 i.tm.opcode_modifier.evex = EVEX128;
3880 break;
3881 default:
c7213af9 3882 abort ();
625cbd7a 3883 }
c7213af9 3884 break;
625cbd7a 3885 }
e771e7c9 3886 }
c7213af9 3887
56522fc5 3888 if (op >= MAX_OPERANDS)
c7213af9 3889 abort ();
e771e7c9
JB
3890 }
3891
43234a1e
L
3892 switch (i.tm.opcode_modifier.evex)
3893 {
3894 case EVEXLIG: /* LL' is ignored */
3895 vec_length = evexlig << 5;
3896 break;
3897 case EVEX128:
3898 vec_length = 0 << 5;
3899 break;
3900 case EVEX256:
3901 vec_length = 1 << 5;
3902 break;
3903 case EVEX512:
3904 vec_length = 2 << 5;
3905 break;
3906 default:
3907 abort ();
3908 break;
3909 }
3910 i.vex.bytes[3] |= vec_length;
3911 /* Encode the broadcast bit. */
3912 if (i.broadcast)
3913 i.vex.bytes[3] |= 0x10;
3914 }
3915 else
3916 {
3917 if (i.rounding->type != saeonly)
3918 i.vex.bytes[3] |= 0x10 | (i.rounding->type << 5);
3919 else
d3d3c6db 3920 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e
L
3921 }
3922
3923 if (i.mask && i.mask->mask)
3924 i.vex.bytes[3] |= i.mask->mask->reg_num;
3925}
3926
65da13b5
L
3927static void
3928process_immext (void)
3929{
3930 expressionS *exp;
3931
c0f3af97 3932 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
3933 which is coded in the same place as an 8-bit immediate field
3934 would be. Here we fake an 8-bit immediate operand from the
3935 opcode suffix stored in tm.extension_opcode.
3936
c1e679ec 3937 AVX instructions also use this encoding, for some of
c0f3af97 3938 3 argument instructions. */
65da13b5 3939
43234a1e 3940 gas_assert (i.imm_operands <= 1
7ab9ffdd 3941 && (i.operands <= 2
7a8655d2 3942 || (is_any_vex_encoding (&i.tm)
7ab9ffdd 3943 && i.operands <= 4)));
65da13b5
L
3944
3945 exp = &im_expressions[i.imm_operands++];
3946 i.op[i.operands].imms = exp;
3947 i.types[i.operands] = imm8;
3948 i.operands++;
3949 exp->X_op = O_constant;
3950 exp->X_add_number = i.tm.extension_opcode;
3951 i.tm.extension_opcode = None;
3952}
3953
42164a71
L
3954
3955static int
3956check_hle (void)
3957{
3958 switch (i.tm.opcode_modifier.hleprefixok)
3959 {
3960 default:
3961 abort ();
82c2def5 3962 case HLEPrefixNone:
165de32a
L
3963 as_bad (_("invalid instruction `%s' after `%s'"),
3964 i.tm.name, i.hle_prefix);
42164a71 3965 return 0;
82c2def5 3966 case HLEPrefixLock:
42164a71
L
3967 if (i.prefix[LOCK_PREFIX])
3968 return 1;
165de32a 3969 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 3970 return 0;
82c2def5 3971 case HLEPrefixAny:
42164a71 3972 return 1;
82c2def5 3973 case HLEPrefixRelease:
42164a71
L
3974 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
3975 {
3976 as_bad (_("instruction `%s' after `xacquire' not allowed"),
3977 i.tm.name);
3978 return 0;
3979 }
8dc0818e 3980 if (i.mem_operands == 0 || !(i.flags[i.operands - 1] & Operand_Mem))
42164a71
L
3981 {
3982 as_bad (_("memory destination needed for instruction `%s'"
3983 " after `xrelease'"), i.tm.name);
3984 return 0;
3985 }
3986 return 1;
3987 }
3988}
3989
b6f8c7c4
L
3990/* Try the shortest encoding by shortening operand size. */
3991
3992static void
3993optimize_encoding (void)
3994{
a0a1771e 3995 unsigned int j;
b6f8c7c4
L
3996
3997 if (optimize_for_space
72aea328 3998 && !is_any_vex_encoding (&i.tm)
b6f8c7c4
L
3999 && i.reg_operands == 1
4000 && i.imm_operands == 1
4001 && !i.types[1].bitfield.byte
4002 && i.op[0].imms->X_op == O_constant
4003 && fits_in_imm7 (i.op[0].imms->X_add_number)
72aea328 4004 && (i.tm.base_opcode == 0xa8
b6f8c7c4
L
4005 || (i.tm.base_opcode == 0xf6
4006 && i.tm.extension_opcode == 0x0)))
4007 {
4008 /* Optimize: -Os:
4009 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
4010 */
4011 unsigned int base_regnum = i.op[1].regs->reg_num;
4012 if (flag_code == CODE_64BIT || base_regnum < 4)
4013 {
4014 i.types[1].bitfield.byte = 1;
4015 /* Ignore the suffix. */
4016 i.suffix = 0;
7697afb6
JB
4017 /* Convert to byte registers. */
4018 if (i.types[1].bitfield.word)
4019 j = 16;
4020 else if (i.types[1].bitfield.dword)
4021 j = 32;
4022 else
4023 j = 48;
4024 if (!(i.op[1].regs->reg_flags & RegRex) && base_regnum < 4)
4025 j += 8;
4026 i.op[1].regs -= j;
b6f8c7c4
L
4027 }
4028 }
4029 else if (flag_code == CODE_64BIT
72aea328 4030 && !is_any_vex_encoding (&i.tm)
d3d50934
L
4031 && ((i.types[1].bitfield.qword
4032 && i.reg_operands == 1
b6f8c7c4
L
4033 && i.imm_operands == 1
4034 && i.op[0].imms->X_op == O_constant
507916b8 4035 && ((i.tm.base_opcode == 0xb8
b6f8c7c4
L
4036 && i.tm.extension_opcode == None
4037 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
4038 || (fits_in_imm31 (i.op[0].imms->X_add_number)
72aea328
JB
4039 && ((i.tm.base_opcode == 0x24
4040 || i.tm.base_opcode == 0xa8)
b6f8c7c4
L
4041 || (i.tm.base_opcode == 0x80
4042 && i.tm.extension_opcode == 0x4)
4043 || ((i.tm.base_opcode == 0xf6
507916b8 4044 || (i.tm.base_opcode | 1) == 0xc7)
b8364fa7
JB
4045 && i.tm.extension_opcode == 0x0)))
4046 || (fits_in_imm7 (i.op[0].imms->X_add_number)
4047 && i.tm.base_opcode == 0x83
4048 && i.tm.extension_opcode == 0x4)))
d3d50934
L
4049 || (i.types[0].bitfield.qword
4050 && ((i.reg_operands == 2
4051 && i.op[0].regs == i.op[1].regs
72aea328
JB
4052 && (i.tm.base_opcode == 0x30
4053 || i.tm.base_opcode == 0x28))
d3d50934
L
4054 || (i.reg_operands == 1
4055 && i.operands == 1
72aea328 4056 && i.tm.base_opcode == 0x30)))))
b6f8c7c4
L
4057 {
4058 /* Optimize: -O:
4059 andq $imm31, %r64 -> andl $imm31, %r32
b8364fa7 4060 andq $imm7, %r64 -> andl $imm7, %r32
b6f8c7c4
L
4061 testq $imm31, %r64 -> testl $imm31, %r32
4062 xorq %r64, %r64 -> xorl %r32, %r32
4063 subq %r64, %r64 -> subl %r32, %r32
4064 movq $imm31, %r64 -> movl $imm31, %r32
4065 movq $imm32, %r64 -> movl $imm32, %r32
4066 */
4067 i.tm.opcode_modifier.norex64 = 1;
507916b8 4068 if (i.tm.base_opcode == 0xb8 || (i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4069 {
4070 /* Handle
4071 movq $imm31, %r64 -> movl $imm31, %r32
4072 movq $imm32, %r64 -> movl $imm32, %r32
4073 */
4074 i.tm.operand_types[0].bitfield.imm32 = 1;
4075 i.tm.operand_types[0].bitfield.imm32s = 0;
4076 i.tm.operand_types[0].bitfield.imm64 = 0;
4077 i.types[0].bitfield.imm32 = 1;
4078 i.types[0].bitfield.imm32s = 0;
4079 i.types[0].bitfield.imm64 = 0;
4080 i.types[1].bitfield.dword = 1;
4081 i.types[1].bitfield.qword = 0;
507916b8 4082 if ((i.tm.base_opcode | 1) == 0xc7)
b6f8c7c4
L
4083 {
4084 /* Handle
4085 movq $imm31, %r64 -> movl $imm31, %r32
4086 */
507916b8 4087 i.tm.base_opcode = 0xb8;
b6f8c7c4 4088 i.tm.extension_opcode = None;
507916b8 4089 i.tm.opcode_modifier.w = 0;
b6f8c7c4
L
4090 i.tm.opcode_modifier.modrm = 0;
4091 }
4092 }
4093 }
5641ec01
JB
4094 else if (optimize > 1
4095 && !optimize_for_space
72aea328 4096 && !is_any_vex_encoding (&i.tm)
5641ec01
JB
4097 && i.reg_operands == 2
4098 && i.op[0].regs == i.op[1].regs
4099 && ((i.tm.base_opcode & ~(Opcode_D | 1)) == 0x8
4100 || (i.tm.base_opcode & ~(Opcode_D | 1)) == 0x20)
4101 && (flag_code != CODE_64BIT || !i.types[0].bitfield.dword))
4102 {
4103 /* Optimize: -O2:
4104 andb %rN, %rN -> testb %rN, %rN
4105 andw %rN, %rN -> testw %rN, %rN
4106 andq %rN, %rN -> testq %rN, %rN
4107 orb %rN, %rN -> testb %rN, %rN
4108 orw %rN, %rN -> testw %rN, %rN
4109 orq %rN, %rN -> testq %rN, %rN
4110
4111 and outside of 64-bit mode
4112
4113 andl %rN, %rN -> testl %rN, %rN
4114 orl %rN, %rN -> testl %rN, %rN
4115 */
4116 i.tm.base_opcode = 0x84 | (i.tm.base_opcode & 1);
4117 }
99112332 4118 else if (i.reg_operands == 3
b6f8c7c4
L
4119 && i.op[0].regs == i.op[1].regs
4120 && !i.types[2].bitfield.xmmword
4121 && (i.tm.opcode_modifier.vex
7a69eac3 4122 || ((!i.mask || i.mask->zeroing)
b6f8c7c4 4123 && !i.rounding
e771e7c9 4124 && is_evex_encoding (&i.tm)
80c34c38 4125 && (i.vec_encoding != vex_encoding_evex
dd22218c 4126 || cpu_arch_isa_flags.bitfield.cpuavx512vl
80c34c38 4127 || i.tm.cpu_flags.bitfield.cpuavx512vl
7091c612 4128 || (i.tm.operand_types[2].bitfield.zmmword
dd22218c 4129 && i.types[2].bitfield.ymmword))))
b6f8c7c4
L
4130 && ((i.tm.base_opcode == 0x55
4131 || i.tm.base_opcode == 0x6655
4132 || i.tm.base_opcode == 0x66df
4133 || i.tm.base_opcode == 0x57
4134 || i.tm.base_opcode == 0x6657
8305403a
L
4135 || i.tm.base_opcode == 0x66ef
4136 || i.tm.base_opcode == 0x66f8
4137 || i.tm.base_opcode == 0x66f9
4138 || i.tm.base_opcode == 0x66fa
1424ad86
JB
4139 || i.tm.base_opcode == 0x66fb
4140 || i.tm.base_opcode == 0x42
4141 || i.tm.base_opcode == 0x6642
4142 || i.tm.base_opcode == 0x47
4143 || i.tm.base_opcode == 0x6647)
b6f8c7c4
L
4144 && i.tm.extension_opcode == None))
4145 {
99112332 4146 /* Optimize: -O1:
8305403a
L
4147 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
4148 vpsubq and vpsubw:
b6f8c7c4
L
4149 EVEX VOP %zmmM, %zmmM, %zmmN
4150 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4151 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4152 EVEX VOP %ymmM, %ymmM, %ymmN
4153 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4154 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4155 VEX VOP %ymmM, %ymmM, %ymmN
4156 -> VEX VOP %xmmM, %xmmM, %xmmN
4157 VOP, one of vpandn and vpxor:
4158 VEX VOP %ymmM, %ymmM, %ymmN
4159 -> VEX VOP %xmmM, %xmmM, %xmmN
4160 VOP, one of vpandnd and vpandnq:
4161 EVEX VOP %zmmM, %zmmM, %zmmN
4162 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4163 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4164 EVEX VOP %ymmM, %ymmM, %ymmN
4165 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4166 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4167 VOP, one of vpxord and vpxorq:
4168 EVEX VOP %zmmM, %zmmM, %zmmN
4169 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4170 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
b6f8c7c4
L
4171 EVEX VOP %ymmM, %ymmM, %ymmN
4172 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
99112332 4173 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16) (-O2)
1424ad86
JB
4174 VOP, one of kxord and kxorq:
4175 VEX VOP %kM, %kM, %kN
4176 -> VEX kxorw %kM, %kM, %kN
4177 VOP, one of kandnd and kandnq:
4178 VEX VOP %kM, %kM, %kN
4179 -> VEX kandnw %kM, %kM, %kN
b6f8c7c4 4180 */
e771e7c9 4181 if (is_evex_encoding (&i.tm))
b6f8c7c4 4182 {
7b1d7ca1 4183 if (i.vec_encoding != vex_encoding_evex)
b6f8c7c4
L
4184 {
4185 i.tm.opcode_modifier.vex = VEX128;
4186 i.tm.opcode_modifier.vexw = VEXW0;
4187 i.tm.opcode_modifier.evex = 0;
4188 }
7b1d7ca1 4189 else if (optimize > 1)
dd22218c
L
4190 i.tm.opcode_modifier.evex = EVEX128;
4191 else
4192 return;
b6f8c7c4 4193 }
f74a6307 4194 else if (i.tm.operand_types[0].bitfield.class == RegMask)
1424ad86
JB
4195 {
4196 i.tm.base_opcode &= 0xff;
4197 i.tm.opcode_modifier.vexw = VEXW0;
4198 }
b6f8c7c4
L
4199 else
4200 i.tm.opcode_modifier.vex = VEX128;
4201
4202 if (i.tm.opcode_modifier.vex)
4203 for (j = 0; j < 3; j++)
4204 {
4205 i.types[j].bitfield.xmmword = 1;
4206 i.types[j].bitfield.ymmword = 0;
4207 }
4208 }
392a5972 4209 else if (i.vec_encoding != vex_encoding_evex
97ed31ae 4210 && !i.types[0].bitfield.zmmword
392a5972 4211 && !i.types[1].bitfield.zmmword
97ed31ae 4212 && !i.mask
a0a1771e 4213 && !i.broadcast
97ed31ae 4214 && is_evex_encoding (&i.tm)
392a5972
L
4215 && ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0x666f
4216 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf36f
a0a1771e
JB
4217 || (i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f
4218 || (i.tm.base_opcode & ~4) == 0x66db
4219 || (i.tm.base_opcode & ~4) == 0x66eb)
97ed31ae
L
4220 && i.tm.extension_opcode == None)
4221 {
4222 /* Optimize: -O1:
4223 VOP, one of vmovdqa32, vmovdqa64, vmovdqu8, vmovdqu16,
4224 vmovdqu32 and vmovdqu64:
4225 EVEX VOP %xmmM, %xmmN
4226 -> VEX vmovdqa|vmovdqu %xmmM, %xmmN (M and N < 16)
4227 EVEX VOP %ymmM, %ymmN
4228 -> VEX vmovdqa|vmovdqu %ymmM, %ymmN (M and N < 16)
4229 EVEX VOP %xmmM, mem
4230 -> VEX vmovdqa|vmovdqu %xmmM, mem (M < 16)
4231 EVEX VOP %ymmM, mem
4232 -> VEX vmovdqa|vmovdqu %ymmM, mem (M < 16)
4233 EVEX VOP mem, %xmmN
4234 -> VEX mvmovdqa|vmovdquem, %xmmN (N < 16)
4235 EVEX VOP mem, %ymmN
4236 -> VEX vmovdqa|vmovdqu mem, %ymmN (N < 16)
a0a1771e
JB
4237 VOP, one of vpand, vpandn, vpor, vpxor:
4238 EVEX VOP{d,q} %xmmL, %xmmM, %xmmN
4239 -> VEX VOP %xmmL, %xmmM, %xmmN (L, M, and N < 16)
4240 EVEX VOP{d,q} %ymmL, %ymmM, %ymmN
4241 -> VEX VOP %ymmL, %ymmM, %ymmN (L, M, and N < 16)
4242 EVEX VOP{d,q} mem, %xmmM, %xmmN
4243 -> VEX VOP mem, %xmmM, %xmmN (M and N < 16)
4244 EVEX VOP{d,q} mem, %ymmM, %ymmN
4245 -> VEX VOP mem, %ymmM, %ymmN (M and N < 16)
97ed31ae 4246 */
a0a1771e 4247 for (j = 0; j < i.operands; j++)
392a5972
L
4248 if (operand_type_check (i.types[j], disp)
4249 && i.op[j].disps->X_op == O_constant)
4250 {
4251 /* Since the VEX prefix has 2 or 3 bytes, the EVEX prefix
4252 has 4 bytes, EVEX Disp8 has 1 byte and VEX Disp32 has 4
4253 bytes, we choose EVEX Disp8 over VEX Disp32. */
4254 int evex_disp8, vex_disp8;
4255 unsigned int memshift = i.memshift;
4256 offsetT n = i.op[j].disps->X_add_number;
4257
4258 evex_disp8 = fits_in_disp8 (n);
4259 i.memshift = 0;
4260 vex_disp8 = fits_in_disp8 (n);
4261 if (evex_disp8 != vex_disp8)
4262 {
4263 i.memshift = memshift;
4264 return;
4265 }
4266
4267 i.types[j].bitfield.disp8 = vex_disp8;
4268 break;
4269 }
4270 if ((i.tm.base_opcode & ~Opcode_SIMD_IntD) == 0xf26f)
4271 i.tm.base_opcode ^= 0xf36f ^ 0xf26f;
97ed31ae
L
4272 i.tm.opcode_modifier.vex
4273 = i.types[0].bitfield.ymmword ? VEX256 : VEX128;
4274 i.tm.opcode_modifier.vexw = VEXW0;
79dec6b7
JB
4275 /* VPAND, VPOR, and VPXOR are commutative. */
4276 if (i.reg_operands == 3 && i.tm.base_opcode != 0x66df)
4277 i.tm.opcode_modifier.commutative = 1;
97ed31ae
L
4278 i.tm.opcode_modifier.evex = 0;
4279 i.tm.opcode_modifier.masking = 0;
a0a1771e 4280 i.tm.opcode_modifier.broadcast = 0;
97ed31ae
L
4281 i.tm.opcode_modifier.disp8memshift = 0;
4282 i.memshift = 0;
a0a1771e
JB
4283 if (j < i.operands)
4284 i.types[j].bitfield.disp8
4285 = fits_in_disp8 (i.op[j].disps->X_add_number);
97ed31ae 4286 }
b6f8c7c4
L
4287}
4288
252b5132
RH
4289/* This is the guts of the machine-dependent assembler. LINE points to a
4290 machine dependent instruction. This function is supposed to emit
4291 the frags/bytes it assembles to. */
4292
4293void
65da13b5 4294md_assemble (char *line)
252b5132 4295{
40fb9820 4296 unsigned int j;
83b16ac6 4297 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 4298 const insn_template *t;
252b5132 4299
47926f60 4300 /* Initialize globals. */
252b5132
RH
4301 memset (&i, '\0', sizeof (i));
4302 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 4303 i.reloc[j] = NO_RELOC;
252b5132
RH
4304 memset (disp_expressions, '\0', sizeof (disp_expressions));
4305 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 4306 save_stack_p = save_stack;
252b5132
RH
4307
4308 /* First parse an instruction mnemonic & call i386_operand for the operands.
4309 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 4310 start of a (possibly prefixed) mnemonic. */
252b5132 4311
29b0f896
AM
4312 line = parse_insn (line, mnemonic);
4313 if (line == NULL)
4314 return;
83b16ac6 4315 mnem_suffix = i.suffix;
252b5132 4316
29b0f896 4317 line = parse_operands (line, mnemonic);
ee86248c 4318 this_operand = -1;
8325cc63
JB
4319 xfree (i.memop1_string);
4320 i.memop1_string = NULL;
29b0f896
AM
4321 if (line == NULL)
4322 return;
252b5132 4323
29b0f896
AM
4324 /* Now we've parsed the mnemonic into a set of templates, and have the
4325 operands at hand. */
4326
4327 /* All intel opcodes have reversed operands except for "bound" and
4328 "enter". We also don't reverse intersegment "jmp" and "call"
4329 instructions with 2 immediate operands so that the immediate segment
050dfa73 4330 precedes the offset, as it does when in AT&T mode. */
4d456e3d
L
4331 if (intel_syntax
4332 && i.operands > 1
29b0f896 4333 && (strcmp (mnemonic, "bound") != 0)
30123838 4334 && (strcmp (mnemonic, "invlpga") != 0)
40fb9820
L
4335 && !(operand_type_check (i.types[0], imm)
4336 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4337 swap_operands ();
4338
ec56d5c0
JB
4339 /* The order of the immediates should be reversed
4340 for 2 immediates extrq and insertq instructions */
4341 if (i.imm_operands == 2
4342 && (strcmp (mnemonic, "extrq") == 0
4343 || strcmp (mnemonic, "insertq") == 0))
4344 swap_2_operands (0, 1);
4345
29b0f896
AM
4346 if (i.imm_operands)
4347 optimize_imm ();
4348
b300c311
L
4349 /* Don't optimize displacement for movabs since it only takes 64bit
4350 displacement. */
4351 if (i.disp_operands
a501d77e 4352 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4353 && (flag_code != CODE_64BIT
4354 || strcmp (mnemonic, "movabs") != 0))
4355 optimize_disp ();
29b0f896
AM
4356
4357 /* Next, we find a template that matches the given insn,
4358 making sure the overlap of the given operands types is consistent
4359 with the template operand types. */
252b5132 4360
83b16ac6 4361 if (!(t = match_template (mnem_suffix)))
29b0f896 4362 return;
252b5132 4363
7bab8ab5 4364 if (sse_check != check_none
81f8a913 4365 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4366 && !i.tm.cpu_flags.bitfield.cpuavx
569d50f1 4367 && !i.tm.cpu_flags.bitfield.cpuavx512f
daf50ae7
L
4368 && (i.tm.cpu_flags.bitfield.cpusse
4369 || i.tm.cpu_flags.bitfield.cpusse2
4370 || i.tm.cpu_flags.bitfield.cpusse3
4371 || i.tm.cpu_flags.bitfield.cpussse3
4372 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e 4373 || i.tm.cpu_flags.bitfield.cpusse4_2
569d50f1 4374 || i.tm.cpu_flags.bitfield.cpusse4a
6e3e5c9e
JB
4375 || i.tm.cpu_flags.bitfield.cpupclmul
4376 || i.tm.cpu_flags.bitfield.cpuaes
569d50f1 4377 || i.tm.cpu_flags.bitfield.cpusha
6e3e5c9e 4378 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4379 {
7bab8ab5 4380 (sse_check == check_warning
daf50ae7
L
4381 ? as_warn
4382 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4383 }
4384
321fd21e
L
4385 /* Zap movzx and movsx suffix. The suffix has been set from
4386 "word ptr" or "byte ptr" on the source operand in Intel syntax
4387 or extracted from mnemonic in AT&T syntax. But we'll use
4388 the destination register to choose the suffix for encoding. */
4389 if ((i.tm.base_opcode & ~9) == 0x0fb6)
cd61ebfe 4390 {
321fd21e
L
4391 /* In Intel syntax, there must be a suffix. In AT&T syntax, if
4392 there is no suffix, the default will be byte extension. */
4393 if (i.reg_operands != 2
4394 && !i.suffix
7ab9ffdd 4395 && intel_syntax)
321fd21e
L
4396 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
4397
4398 i.suffix = 0;
cd61ebfe 4399 }
24eab124 4400
40fb9820 4401 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4402 if (!add_prefix (FWAIT_OPCODE))
4403 return;
252b5132 4404
d5de92cf
L
4405 /* Check if REP prefix is OK. */
4406 if (i.rep_prefix && !i.tm.opcode_modifier.repprefixok)
4407 {
4408 as_bad (_("invalid instruction `%s' after `%s'"),
4409 i.tm.name, i.rep_prefix);
4410 return;
4411 }
4412
c1ba0266
L
4413 /* Check for lock without a lockable instruction. Destination operand
4414 must be memory unless it is xchg (0x86). */
c32fa91d
L
4415 if (i.prefix[LOCK_PREFIX]
4416 && (!i.tm.opcode_modifier.islockable
c1ba0266
L
4417 || i.mem_operands == 0
4418 || (i.tm.base_opcode != 0x86
8dc0818e 4419 && !(i.flags[i.operands - 1] & Operand_Mem))))
c32fa91d
L
4420 {
4421 as_bad (_("expecting lockable instruction after `lock'"));
4422 return;
4423 }
4424
7a8655d2
JB
4425 /* Check for data size prefix on VEX/XOP/EVEX encoded insns. */
4426 if (i.prefix[DATA_PREFIX] && is_any_vex_encoding (&i.tm))
4427 {
4428 as_bad (_("data size prefix invalid with `%s'"), i.tm.name);
4429 return;
4430 }
4431
42164a71 4432 /* Check if HLE prefix is OK. */
165de32a 4433 if (i.hle_prefix && !check_hle ())
42164a71
L
4434 return;
4435
7e8b059b
L
4436 /* Check BND prefix. */
4437 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
4438 as_bad (_("expecting valid branch instruction after `bnd'"));
4439
04ef582a 4440 /* Check NOTRACK prefix. */
9fef80d6
L
4441 if (i.notrack_prefix && !i.tm.opcode_modifier.notrackprefixok)
4442 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 4443
327e8c42
JB
4444 if (i.tm.cpu_flags.bitfield.cpumpx)
4445 {
4446 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4447 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
4448 else if (flag_code != CODE_16BIT
4449 ? i.prefix[ADDR_PREFIX]
4450 : i.mem_operands && !i.prefix[ADDR_PREFIX])
4451 as_bad (_("16-bit address isn't allowed in MPX instructions"));
4452 }
7e8b059b
L
4453
4454 /* Insert BND prefix. */
76d3a78a
JB
4455 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
4456 {
4457 if (!i.prefix[BND_PREFIX])
4458 add_prefix (BND_PREFIX_OPCODE);
4459 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
4460 {
4461 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
4462 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
4463 }
4464 }
7e8b059b 4465
29b0f896 4466 /* Check string instruction segment overrides. */
51c8edf6 4467 if (i.tm.opcode_modifier.isstring >= IS_STRING_ES_OP0)
29b0f896 4468 {
51c8edf6 4469 gas_assert (i.mem_operands);
29b0f896 4470 if (!check_string ())
5dd0794d 4471 return;
fc0763e6 4472 i.disp_operands = 0;
29b0f896 4473 }
5dd0794d 4474
b6f8c7c4
L
4475 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
4476 optimize_encoding ();
4477
29b0f896
AM
4478 if (!process_suffix ())
4479 return;
e413e4e9 4480
bc0844ae
L
4481 /* Update operand types. */
4482 for (j = 0; j < i.operands; j++)
4483 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
4484
29b0f896
AM
4485 /* Make still unresolved immediate matches conform to size of immediate
4486 given in i.suffix. */
4487 if (!finalize_imm ())
4488 return;
252b5132 4489
40fb9820 4490 if (i.types[0].bitfield.imm1)
29b0f896 4491 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 4492
9afe6eb8
L
4493 /* We only need to check those implicit registers for instructions
4494 with 3 operands or less. */
4495 if (i.operands <= 3)
4496 for (j = 0; j < i.operands; j++)
75e5731b
JB
4497 if (i.types[j].bitfield.instance != InstanceNone
4498 && !i.types[j].bitfield.xmmword)
9afe6eb8 4499 i.reg_operands--;
40fb9820 4500
c0f3af97
L
4501 /* ImmExt should be processed after SSE2AVX. */
4502 if (!i.tm.opcode_modifier.sse2avx
4503 && i.tm.opcode_modifier.immext)
65da13b5 4504 process_immext ();
252b5132 4505
29b0f896
AM
4506 /* For insns with operands there are more diddles to do to the opcode. */
4507 if (i.operands)
4508 {
4509 if (!process_operands ())
4510 return;
4511 }
40fb9820 4512 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
4513 {
4514 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
4515 as_warn (_("translating to `%sp'"), i.tm.name);
4516 }
252b5132 4517
7a8655d2 4518 if (is_any_vex_encoding (&i.tm))
9e5e5283 4519 {
c1dc7af5 4520 if (!cpu_arch_flags.bitfield.cpui286)
9e5e5283 4521 {
c1dc7af5 4522 as_bad (_("instruction `%s' isn't supported outside of protected mode."),
9e5e5283
L
4523 i.tm.name);
4524 return;
4525 }
c0f3af97 4526
9e5e5283
L
4527 if (i.tm.opcode_modifier.vex)
4528 build_vex_prefix (t);
4529 else
4530 build_evex_prefix ();
4531 }
43234a1e 4532
5dd85c99
SP
4533 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
4534 instructions may define INT_OPCODE as well, so avoid this corner
4535 case for those instructions that use MODRM. */
4536 if (i.tm.base_opcode == INT_OPCODE
a6461c02
SP
4537 && !i.tm.opcode_modifier.modrm
4538 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
4539 {
4540 i.tm.base_opcode = INT3_OPCODE;
4541 i.imm_operands = 0;
4542 }
252b5132 4543
0cfa3eb3
JB
4544 if ((i.tm.opcode_modifier.jump == JUMP
4545 || i.tm.opcode_modifier.jump == JUMP_BYTE
4546 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896
AM
4547 && i.op[0].disps->X_op == O_constant)
4548 {
4549 /* Convert "jmp constant" (and "call constant") to a jump (call) to
4550 the absolute address given by the constant. Since ix86 jumps and
4551 calls are pc relative, we need to generate a reloc. */
4552 i.op[0].disps->X_add_symbol = &abs_symbol;
4553 i.op[0].disps->X_op = O_symbol;
4554 }
252b5132 4555
40fb9820 4556 if (i.tm.opcode_modifier.rex64)
161a04f6 4557 i.rex |= REX_W;
252b5132 4558
29b0f896
AM
4559 /* For 8 bit registers we need an empty rex prefix. Also if the
4560 instruction already has a prefix, we need to convert old
4561 registers to new ones. */
773f551c 4562
bab6aec1 4563 if ((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte
29b0f896 4564 && (i.op[0].regs->reg_flags & RegRex64) != 0)
bab6aec1 4565 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte
29b0f896 4566 && (i.op[1].regs->reg_flags & RegRex64) != 0)
bab6aec1
JB
4567 || (((i.types[0].bitfield.class == Reg && i.types[0].bitfield.byte)
4568 || (i.types[1].bitfield.class == Reg && i.types[1].bitfield.byte))
29b0f896
AM
4569 && i.rex != 0))
4570 {
4571 int x;
726c5dcd 4572
29b0f896
AM
4573 i.rex |= REX_OPCODE;
4574 for (x = 0; x < 2; x++)
4575 {
4576 /* Look for 8 bit operand that uses old registers. */
bab6aec1 4577 if (i.types[x].bitfield.class == Reg && i.types[x].bitfield.byte
29b0f896 4578 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 4579 {
3f93af61 4580 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
29b0f896
AM
4581 /* In case it is "hi" register, give up. */
4582 if (i.op[x].regs->reg_num > 3)
a540244d 4583 as_bad (_("can't encode register '%s%s' in an "
4eed87de 4584 "instruction requiring REX prefix."),
a540244d 4585 register_prefix, i.op[x].regs->reg_name);
773f551c 4586
29b0f896
AM
4587 /* Otherwise it is equivalent to the extended register.
4588 Since the encoding doesn't change this is merely
4589 cosmetic cleanup for debug output. */
4590
4591 i.op[x].regs = i.op[x].regs + 8;
773f551c 4592 }
29b0f896
AM
4593 }
4594 }
773f551c 4595
6b6b6807
L
4596 if (i.rex == 0 && i.rex_encoding)
4597 {
4598 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
3f93af61 4599 that uses legacy register. If it is "hi" register, don't add
6b6b6807
L
4600 the REX_OPCODE byte. */
4601 int x;
4602 for (x = 0; x < 2; x++)
bab6aec1 4603 if (i.types[x].bitfield.class == Reg
6b6b6807
L
4604 && i.types[x].bitfield.byte
4605 && (i.op[x].regs->reg_flags & RegRex64) == 0
4606 && i.op[x].regs->reg_num > 3)
4607 {
3f93af61 4608 gas_assert (!(i.op[x].regs->reg_flags & RegRex));
6b6b6807
L
4609 i.rex_encoding = FALSE;
4610 break;
4611 }
4612
4613 if (i.rex_encoding)
4614 i.rex = REX_OPCODE;
4615 }
4616
7ab9ffdd 4617 if (i.rex != 0)
29b0f896
AM
4618 add_prefix (REX_OPCODE | i.rex);
4619
4620 /* We are ready to output the insn. */
4621 output_insn ();
e379e5f3
L
4622
4623 last_insn.seg = now_seg;
4624
4625 if (i.tm.opcode_modifier.isprefix)
4626 {
4627 last_insn.kind = last_insn_prefix;
4628 last_insn.name = i.tm.name;
4629 last_insn.file = as_where (&last_insn.line);
4630 }
4631 else
4632 last_insn.kind = last_insn_other;
29b0f896
AM
4633}
4634
4635static char *
e3bb37b5 4636parse_insn (char *line, char *mnemonic)
29b0f896
AM
4637{
4638 char *l = line;
4639 char *token_start = l;
4640 char *mnem_p;
5c6af06e 4641 int supported;
d3ce72d0 4642 const insn_template *t;
b6169b20 4643 char *dot_p = NULL;
29b0f896 4644
29b0f896
AM
4645 while (1)
4646 {
4647 mnem_p = mnemonic;
4648 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
4649 {
b6169b20
L
4650 if (*mnem_p == '.')
4651 dot_p = mnem_p;
29b0f896
AM
4652 mnem_p++;
4653 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 4654 {
29b0f896
AM
4655 as_bad (_("no such instruction: `%s'"), token_start);
4656 return NULL;
4657 }
4658 l++;
4659 }
4660 if (!is_space_char (*l)
4661 && *l != END_OF_INSN
e44823cf
JB
4662 && (intel_syntax
4663 || (*l != PREFIX_SEPARATOR
4664 && *l != ',')))
29b0f896
AM
4665 {
4666 as_bad (_("invalid character %s in mnemonic"),
4667 output_invalid (*l));
4668 return NULL;
4669 }
4670 if (token_start == l)
4671 {
e44823cf 4672 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
4673 as_bad (_("expecting prefix; got nothing"));
4674 else
4675 as_bad (_("expecting mnemonic; got nothing"));
4676 return NULL;
4677 }
45288df1 4678
29b0f896 4679 /* Look up instruction (or prefix) via hash table. */
d3ce72d0 4680 current_templates = (const templates *) hash_find (op_hash, mnemonic);
47926f60 4681
29b0f896
AM
4682 if (*l != END_OF_INSN
4683 && (!is_space_char (*l) || l[1] != END_OF_INSN)
4684 && current_templates
40fb9820 4685 && current_templates->start->opcode_modifier.isprefix)
29b0f896 4686 {
c6fb90c8 4687 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
4688 {
4689 as_bad ((flag_code != CODE_64BIT
4690 ? _("`%s' is only supported in 64-bit mode")
4691 : _("`%s' is not supported in 64-bit mode")),
4692 current_templates->start->name);
4693 return NULL;
4694 }
29b0f896
AM
4695 /* If we are in 16-bit mode, do not allow addr16 or data16.
4696 Similarly, in 32-bit mode, do not allow addr32 or data32. */
673fe0f0
JB
4697 if ((current_templates->start->opcode_modifier.size == SIZE16
4698 || current_templates->start->opcode_modifier.size == SIZE32)
29b0f896 4699 && flag_code != CODE_64BIT
673fe0f0 4700 && ((current_templates->start->opcode_modifier.size == SIZE32)
29b0f896
AM
4701 ^ (flag_code == CODE_16BIT)))
4702 {
4703 as_bad (_("redundant %s prefix"),
4704 current_templates->start->name);
4705 return NULL;
45288df1 4706 }
86fa6981 4707 if (current_templates->start->opcode_length == 0)
29b0f896 4708 {
86fa6981
L
4709 /* Handle pseudo prefixes. */
4710 switch (current_templates->start->base_opcode)
4711 {
4712 case 0x0:
4713 /* {disp8} */
4714 i.disp_encoding = disp_encoding_8bit;
4715 break;
4716 case 0x1:
4717 /* {disp32} */
4718 i.disp_encoding = disp_encoding_32bit;
4719 break;
4720 case 0x2:
4721 /* {load} */
4722 i.dir_encoding = dir_encoding_load;
4723 break;
4724 case 0x3:
4725 /* {store} */
4726 i.dir_encoding = dir_encoding_store;
4727 break;
4728 case 0x4:
42e04b36
L
4729 /* {vex} */
4730 i.vec_encoding = vex_encoding_vex;
86fa6981
L
4731 break;
4732 case 0x5:
4733 /* {vex3} */
4734 i.vec_encoding = vex_encoding_vex3;
4735 break;
4736 case 0x6:
4737 /* {evex} */
4738 i.vec_encoding = vex_encoding_evex;
4739 break;
6b6b6807
L
4740 case 0x7:
4741 /* {rex} */
4742 i.rex_encoding = TRUE;
4743 break;
b6f8c7c4
L
4744 case 0x8:
4745 /* {nooptimize} */
4746 i.no_optimize = TRUE;
4747 break;
86fa6981
L
4748 default:
4749 abort ();
4750 }
4751 }
4752 else
4753 {
4754 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 4755 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 4756 {
4e9ac44a
L
4757 case PREFIX_EXIST:
4758 return NULL;
4759 case PREFIX_DS:
d777820b 4760 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
4761 i.notrack_prefix = current_templates->start->name;
4762 break;
4763 case PREFIX_REP:
4764 if (current_templates->start->cpu_flags.bitfield.cpuhle)
4765 i.hle_prefix = current_templates->start->name;
4766 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
4767 i.bnd_prefix = current_templates->start->name;
4768 else
4769 i.rep_prefix = current_templates->start->name;
4770 break;
4771 default:
4772 break;
86fa6981 4773 }
29b0f896
AM
4774 }
4775 /* Skip past PREFIX_SEPARATOR and reset token_start. */
4776 token_start = ++l;
4777 }
4778 else
4779 break;
4780 }
45288df1 4781
30a55f88 4782 if (!current_templates)
b6169b20 4783 {
07d5e953
JB
4784 /* Deprecated functionality (new code should use pseudo-prefixes instead):
4785 Check if we should swap operand or force 32bit displacement in
f8a5c266 4786 encoding. */
30a55f88 4787 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
64c49ab3 4788 i.dir_encoding = dir_encoding_swap;
8d63c93e 4789 else if (mnem_p - 3 == dot_p
a501d77e
L
4790 && dot_p[1] == 'd'
4791 && dot_p[2] == '8')
4792 i.disp_encoding = disp_encoding_8bit;
8d63c93e 4793 else if (mnem_p - 4 == dot_p
f8a5c266
L
4794 && dot_p[1] == 'd'
4795 && dot_p[2] == '3'
4796 && dot_p[3] == '2')
a501d77e 4797 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
4798 else
4799 goto check_suffix;
4800 mnem_p = dot_p;
4801 *dot_p = '\0';
d3ce72d0 4802 current_templates = (const templates *) hash_find (op_hash, mnemonic);
b6169b20
L
4803 }
4804
29b0f896
AM
4805 if (!current_templates)
4806 {
b6169b20 4807check_suffix:
1c529385 4808 if (mnem_p > mnemonic)
29b0f896 4809 {
1c529385
LH
4810 /* See if we can get a match by trimming off a suffix. */
4811 switch (mnem_p[-1])
29b0f896 4812 {
1c529385
LH
4813 case WORD_MNEM_SUFFIX:
4814 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
29b0f896
AM
4815 i.suffix = SHORT_MNEM_SUFFIX;
4816 else
1c529385
LH
4817 /* Fall through. */
4818 case BYTE_MNEM_SUFFIX:
4819 case QWORD_MNEM_SUFFIX:
4820 i.suffix = mnem_p[-1];
29b0f896 4821 mnem_p[-1] = '\0';
d3ce72d0 4822 current_templates = (const templates *) hash_find (op_hash,
1c529385
LH
4823 mnemonic);
4824 break;
4825 case SHORT_MNEM_SUFFIX:
4826 case LONG_MNEM_SUFFIX:
4827 if (!intel_syntax)
4828 {
4829 i.suffix = mnem_p[-1];
4830 mnem_p[-1] = '\0';
4831 current_templates = (const templates *) hash_find (op_hash,
4832 mnemonic);
4833 }
4834 break;
4835
4836 /* Intel Syntax. */
4837 case 'd':
4838 if (intel_syntax)
4839 {
4840 if (intel_float_operand (mnemonic) == 1)
4841 i.suffix = SHORT_MNEM_SUFFIX;
4842 else
4843 i.suffix = LONG_MNEM_SUFFIX;
4844 mnem_p[-1] = '\0';
4845 current_templates = (const templates *) hash_find (op_hash,
4846 mnemonic);
4847 }
4848 break;
29b0f896 4849 }
29b0f896 4850 }
1c529385 4851
29b0f896
AM
4852 if (!current_templates)
4853 {
4854 as_bad (_("no such instruction: `%s'"), token_start);
4855 return NULL;
4856 }
4857 }
252b5132 4858
0cfa3eb3
JB
4859 if (current_templates->start->opcode_modifier.jump == JUMP
4860 || current_templates->start->opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
4861 {
4862 /* Check for a branch hint. We allow ",pt" and ",pn" for
4863 predict taken and predict not taken respectively.
4864 I'm not sure that branch hints actually do anything on loop
4865 and jcxz insns (JumpByte) for current Pentium4 chips. They
4866 may work in the future and it doesn't hurt to accept them
4867 now. */
4868 if (l[0] == ',' && l[1] == 'p')
4869 {
4870 if (l[2] == 't')
4871 {
4872 if (!add_prefix (DS_PREFIX_OPCODE))
4873 return NULL;
4874 l += 3;
4875 }
4876 else if (l[2] == 'n')
4877 {
4878 if (!add_prefix (CS_PREFIX_OPCODE))
4879 return NULL;
4880 l += 3;
4881 }
4882 }
4883 }
4884 /* Any other comma loses. */
4885 if (*l == ',')
4886 {
4887 as_bad (_("invalid character %s in mnemonic"),
4888 output_invalid (*l));
4889 return NULL;
4890 }
252b5132 4891
29b0f896 4892 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
4893 supported = 0;
4894 for (t = current_templates->start; t < current_templates->end; ++t)
4895 {
c0f3af97
L
4896 supported |= cpu_flags_match (t);
4897 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
4898 {
4899 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
4900 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 4901
548d0ee6
JB
4902 return l;
4903 }
29b0f896 4904 }
3629bb00 4905
548d0ee6
JB
4906 if (!(supported & CPU_FLAGS_64BIT_MATCH))
4907 as_bad (flag_code == CODE_64BIT
4908 ? _("`%s' is not supported in 64-bit mode")
4909 : _("`%s' is only supported in 64-bit mode"),
4910 current_templates->start->name);
4911 else
4912 as_bad (_("`%s' is not supported on `%s%s'"),
4913 current_templates->start->name,
4914 cpu_arch_name ? cpu_arch_name : default_arch,
4915 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 4916
548d0ee6 4917 return NULL;
29b0f896 4918}
252b5132 4919
29b0f896 4920static char *
e3bb37b5 4921parse_operands (char *l, const char *mnemonic)
29b0f896
AM
4922{
4923 char *token_start;
3138f287 4924
29b0f896
AM
4925 /* 1 if operand is pending after ','. */
4926 unsigned int expecting_operand = 0;
252b5132 4927
29b0f896
AM
4928 /* Non-zero if operand parens not balanced. */
4929 unsigned int paren_not_balanced;
4930
4931 while (*l != END_OF_INSN)
4932 {
4933 /* Skip optional white space before operand. */
4934 if (is_space_char (*l))
4935 ++l;
d02603dc 4936 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
4937 {
4938 as_bad (_("invalid character %s before operand %d"),
4939 output_invalid (*l),
4940 i.operands + 1);
4941 return NULL;
4942 }
d02603dc 4943 token_start = l; /* After white space. */
29b0f896
AM
4944 paren_not_balanced = 0;
4945 while (paren_not_balanced || *l != ',')
4946 {
4947 if (*l == END_OF_INSN)
4948 {
4949 if (paren_not_balanced)
4950 {
4951 if (!intel_syntax)
4952 as_bad (_("unbalanced parenthesis in operand %d."),
4953 i.operands + 1);
4954 else
4955 as_bad (_("unbalanced brackets in operand %d."),
4956 i.operands + 1);
4957 return NULL;
4958 }
4959 else
4960 break; /* we are done */
4961 }
d02603dc 4962 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
4963 {
4964 as_bad (_("invalid character %s in operand %d"),
4965 output_invalid (*l),
4966 i.operands + 1);
4967 return NULL;
4968 }
4969 if (!intel_syntax)
4970 {
4971 if (*l == '(')
4972 ++paren_not_balanced;
4973 if (*l == ')')
4974 --paren_not_balanced;
4975 }
4976 else
4977 {
4978 if (*l == '[')
4979 ++paren_not_balanced;
4980 if (*l == ']')
4981 --paren_not_balanced;
4982 }
4983 l++;
4984 }
4985 if (l != token_start)
4986 { /* Yes, we've read in another operand. */
4987 unsigned int operand_ok;
4988 this_operand = i.operands++;
4989 if (i.operands > MAX_OPERANDS)
4990 {
4991 as_bad (_("spurious operands; (%d operands/instruction max)"),
4992 MAX_OPERANDS);
4993 return NULL;
4994 }
9d46ce34 4995 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
4996 /* Now parse operand adding info to 'i' as we go along. */
4997 END_STRING_AND_SAVE (l);
4998
1286ab78
L
4999 if (i.mem_operands > 1)
5000 {
5001 as_bad (_("too many memory references for `%s'"),
5002 mnemonic);
5003 return 0;
5004 }
5005
29b0f896
AM
5006 if (intel_syntax)
5007 operand_ok =
5008 i386_intel_operand (token_start,
5009 intel_float_operand (mnemonic));
5010 else
a7619375 5011 operand_ok = i386_att_operand (token_start);
29b0f896
AM
5012
5013 RESTORE_END_STRING (l);
5014 if (!operand_ok)
5015 return NULL;
5016 }
5017 else
5018 {
5019 if (expecting_operand)
5020 {
5021 expecting_operand_after_comma:
5022 as_bad (_("expecting operand after ','; got nothing"));
5023 return NULL;
5024 }
5025 if (*l == ',')
5026 {
5027 as_bad (_("expecting operand before ','; got nothing"));
5028 return NULL;
5029 }
5030 }
7f3f1ea2 5031
29b0f896
AM
5032 /* Now *l must be either ',' or END_OF_INSN. */
5033 if (*l == ',')
5034 {
5035 if (*++l == END_OF_INSN)
5036 {
5037 /* Just skip it, if it's \n complain. */
5038 goto expecting_operand_after_comma;
5039 }
5040 expecting_operand = 1;
5041 }
5042 }
5043 return l;
5044}
7f3f1ea2 5045
050dfa73 5046static void
4d456e3d 5047swap_2_operands (int xchg1, int xchg2)
050dfa73
MM
5048{
5049 union i386_op temp_op;
40fb9820 5050 i386_operand_type temp_type;
c48dadc9 5051 unsigned int temp_flags;
050dfa73 5052 enum bfd_reloc_code_real temp_reloc;
4eed87de 5053
050dfa73
MM
5054 temp_type = i.types[xchg2];
5055 i.types[xchg2] = i.types[xchg1];
5056 i.types[xchg1] = temp_type;
c48dadc9
JB
5057
5058 temp_flags = i.flags[xchg2];
5059 i.flags[xchg2] = i.flags[xchg1];
5060 i.flags[xchg1] = temp_flags;
5061
050dfa73
MM
5062 temp_op = i.op[xchg2];
5063 i.op[xchg2] = i.op[xchg1];
5064 i.op[xchg1] = temp_op;
c48dadc9 5065
050dfa73
MM
5066 temp_reloc = i.reloc[xchg2];
5067 i.reloc[xchg2] = i.reloc[xchg1];
5068 i.reloc[xchg1] = temp_reloc;
43234a1e
L
5069
5070 if (i.mask)
5071 {
5072 if (i.mask->operand == xchg1)
5073 i.mask->operand = xchg2;
5074 else if (i.mask->operand == xchg2)
5075 i.mask->operand = xchg1;
5076 }
5077 if (i.broadcast)
5078 {
5079 if (i.broadcast->operand == xchg1)
5080 i.broadcast->operand = xchg2;
5081 else if (i.broadcast->operand == xchg2)
5082 i.broadcast->operand = xchg1;
5083 }
5084 if (i.rounding)
5085 {
5086 if (i.rounding->operand == xchg1)
5087 i.rounding->operand = xchg2;
5088 else if (i.rounding->operand == xchg2)
5089 i.rounding->operand = xchg1;
5090 }
050dfa73
MM
5091}
5092
29b0f896 5093static void
e3bb37b5 5094swap_operands (void)
29b0f896 5095{
b7c61d9a 5096 switch (i.operands)
050dfa73 5097 {
c0f3af97 5098 case 5:
b7c61d9a 5099 case 4:
4d456e3d 5100 swap_2_operands (1, i.operands - 2);
1a0670f3 5101 /* Fall through. */
b7c61d9a
L
5102 case 3:
5103 case 2:
4d456e3d 5104 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
5105 break;
5106 default:
5107 abort ();
29b0f896 5108 }
29b0f896
AM
5109
5110 if (i.mem_operands == 2)
5111 {
5112 const seg_entry *temp_seg;
5113 temp_seg = i.seg[0];
5114 i.seg[0] = i.seg[1];
5115 i.seg[1] = temp_seg;
5116 }
5117}
252b5132 5118
29b0f896
AM
5119/* Try to ensure constant immediates are represented in the smallest
5120 opcode possible. */
5121static void
e3bb37b5 5122optimize_imm (void)
29b0f896
AM
5123{
5124 char guess_suffix = 0;
5125 int op;
252b5132 5126
29b0f896
AM
5127 if (i.suffix)
5128 guess_suffix = i.suffix;
5129 else if (i.reg_operands)
5130 {
5131 /* Figure out a suffix from the last register operand specified.
75e5731b
JB
5132 We can't do this properly yet, i.e. excluding special register
5133 instances, but the following works for instructions with
5134 immediates. In any case, we can't set i.suffix yet. */
29b0f896 5135 for (op = i.operands; --op >= 0;)
bab6aec1
JB
5136 if (i.types[op].bitfield.class != Reg)
5137 continue;
5138 else if (i.types[op].bitfield.byte)
7ab9ffdd 5139 {
40fb9820
L
5140 guess_suffix = BYTE_MNEM_SUFFIX;
5141 break;
5142 }
bab6aec1 5143 else if (i.types[op].bitfield.word)
252b5132 5144 {
40fb9820
L
5145 guess_suffix = WORD_MNEM_SUFFIX;
5146 break;
5147 }
bab6aec1 5148 else if (i.types[op].bitfield.dword)
40fb9820
L
5149 {
5150 guess_suffix = LONG_MNEM_SUFFIX;
5151 break;
5152 }
bab6aec1 5153 else if (i.types[op].bitfield.qword)
40fb9820
L
5154 {
5155 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 5156 break;
252b5132 5157 }
29b0f896
AM
5158 }
5159 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
5160 guess_suffix = WORD_MNEM_SUFFIX;
5161
5162 for (op = i.operands; --op >= 0;)
40fb9820 5163 if (operand_type_check (i.types[op], imm))
29b0f896
AM
5164 {
5165 switch (i.op[op].imms->X_op)
252b5132 5166 {
29b0f896
AM
5167 case O_constant:
5168 /* If a suffix is given, this operand may be shortened. */
5169 switch (guess_suffix)
252b5132 5170 {
29b0f896 5171 case LONG_MNEM_SUFFIX:
40fb9820
L
5172 i.types[op].bitfield.imm32 = 1;
5173 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5174 break;
5175 case WORD_MNEM_SUFFIX:
40fb9820
L
5176 i.types[op].bitfield.imm16 = 1;
5177 i.types[op].bitfield.imm32 = 1;
5178 i.types[op].bitfield.imm32s = 1;
5179 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
5180 break;
5181 case BYTE_MNEM_SUFFIX:
40fb9820
L
5182 i.types[op].bitfield.imm8 = 1;
5183 i.types[op].bitfield.imm8s = 1;
5184 i.types[op].bitfield.imm16 = 1;
5185 i.types[op].bitfield.imm32 = 1;
5186 i.types[op].bitfield.imm32s = 1;
5187 i.types[op].bitfield.imm64 = 1;
29b0f896 5188 break;
252b5132 5189 }
252b5132 5190
29b0f896
AM
5191 /* If this operand is at most 16 bits, convert it
5192 to a signed 16 bit number before trying to see
5193 whether it will fit in an even smaller size.
5194 This allows a 16-bit operand such as $0xffe0 to
5195 be recognised as within Imm8S range. */
40fb9820 5196 if ((i.types[op].bitfield.imm16)
29b0f896 5197 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 5198 {
29b0f896
AM
5199 i.op[op].imms->X_add_number =
5200 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
5201 }
a28def75
L
5202#ifdef BFD64
5203 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 5204 if ((i.types[op].bitfield.imm32)
29b0f896
AM
5205 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
5206 == 0))
5207 {
5208 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
5209 ^ ((offsetT) 1 << 31))
5210 - ((offsetT) 1 << 31));
5211 }
a28def75 5212#endif
40fb9820 5213 i.types[op]
c6fb90c8
L
5214 = operand_type_or (i.types[op],
5215 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 5216
29b0f896
AM
5217 /* We must avoid matching of Imm32 templates when 64bit
5218 only immediate is available. */
5219 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 5220 i.types[op].bitfield.imm32 = 0;
29b0f896 5221 break;
252b5132 5222
29b0f896
AM
5223 case O_absent:
5224 case O_register:
5225 abort ();
5226
5227 /* Symbols and expressions. */
5228 default:
9cd96992
JB
5229 /* Convert symbolic operand to proper sizes for matching, but don't
5230 prevent matching a set of insns that only supports sizes other
5231 than those matching the insn suffix. */
5232 {
40fb9820 5233 i386_operand_type mask, allowed;
d3ce72d0 5234 const insn_template *t;
9cd96992 5235
0dfbf9d7
L
5236 operand_type_set (&mask, 0);
5237 operand_type_set (&allowed, 0);
40fb9820 5238
4eed87de
AM
5239 for (t = current_templates->start;
5240 t < current_templates->end;
5241 ++t)
bab6aec1
JB
5242 {
5243 allowed = operand_type_or (allowed, t->operand_types[op]);
5244 allowed = operand_type_and (allowed, anyimm);
5245 }
9cd96992
JB
5246 switch (guess_suffix)
5247 {
5248 case QWORD_MNEM_SUFFIX:
40fb9820
L
5249 mask.bitfield.imm64 = 1;
5250 mask.bitfield.imm32s = 1;
9cd96992
JB
5251 break;
5252 case LONG_MNEM_SUFFIX:
40fb9820 5253 mask.bitfield.imm32 = 1;
9cd96992
JB
5254 break;
5255 case WORD_MNEM_SUFFIX:
40fb9820 5256 mask.bitfield.imm16 = 1;
9cd96992
JB
5257 break;
5258 case BYTE_MNEM_SUFFIX:
40fb9820 5259 mask.bitfield.imm8 = 1;
9cd96992
JB
5260 break;
5261 default:
9cd96992
JB
5262 break;
5263 }
c6fb90c8 5264 allowed = operand_type_and (mask, allowed);
0dfbf9d7 5265 if (!operand_type_all_zero (&allowed))
c6fb90c8 5266 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 5267 }
29b0f896 5268 break;
252b5132 5269 }
29b0f896
AM
5270 }
5271}
47926f60 5272
29b0f896
AM
5273/* Try to use the smallest displacement type too. */
5274static void
e3bb37b5 5275optimize_disp (void)
29b0f896
AM
5276{
5277 int op;
3e73aa7c 5278
29b0f896 5279 for (op = i.operands; --op >= 0;)
40fb9820 5280 if (operand_type_check (i.types[op], disp))
252b5132 5281 {
b300c311 5282 if (i.op[op].disps->X_op == O_constant)
252b5132 5283 {
91d6fa6a 5284 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 5285
40fb9820 5286 if (i.types[op].bitfield.disp16
91d6fa6a 5287 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
5288 {
5289 /* If this operand is at most 16 bits, convert
5290 to a signed 16 bit number and don't use 64bit
5291 displacement. */
91d6fa6a 5292 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 5293 i.types[op].bitfield.disp64 = 0;
b300c311 5294 }
a28def75
L
5295#ifdef BFD64
5296 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
40fb9820 5297 if (i.types[op].bitfield.disp32
91d6fa6a 5298 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
b300c311
L
5299 {
5300 /* If this operand is at most 32 bits, convert
5301 to a signed 32 bit number and don't use 64bit
5302 displacement. */
91d6fa6a
NC
5303 op_disp &= (((offsetT) 2 << 31) - 1);
5304 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 5305 i.types[op].bitfield.disp64 = 0;
b300c311 5306 }
a28def75 5307#endif
91d6fa6a 5308 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 5309 {
40fb9820
L
5310 i.types[op].bitfield.disp8 = 0;
5311 i.types[op].bitfield.disp16 = 0;
5312 i.types[op].bitfield.disp32 = 0;
5313 i.types[op].bitfield.disp32s = 0;
5314 i.types[op].bitfield.disp64 = 0;
b300c311
L
5315 i.op[op].disps = 0;
5316 i.disp_operands--;
5317 }
5318 else if (flag_code == CODE_64BIT)
5319 {
91d6fa6a 5320 if (fits_in_signed_long (op_disp))
28a9d8f5 5321 {
40fb9820
L
5322 i.types[op].bitfield.disp64 = 0;
5323 i.types[op].bitfield.disp32s = 1;
28a9d8f5 5324 }
0e1147d9 5325 if (i.prefix[ADDR_PREFIX]
91d6fa6a 5326 && fits_in_unsigned_long (op_disp))
40fb9820 5327 i.types[op].bitfield.disp32 = 1;
b300c311 5328 }
40fb9820
L
5329 if ((i.types[op].bitfield.disp32
5330 || i.types[op].bitfield.disp32s
5331 || i.types[op].bitfield.disp16)
b5014f7a 5332 && fits_in_disp8 (op_disp))
40fb9820 5333 i.types[op].bitfield.disp8 = 1;
252b5132 5334 }
67a4f2b7
AO
5335 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
5336 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
5337 {
5338 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
5339 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
5340 i.types[op].bitfield.disp8 = 0;
5341 i.types[op].bitfield.disp16 = 0;
5342 i.types[op].bitfield.disp32 = 0;
5343 i.types[op].bitfield.disp32s = 0;
5344 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
5345 }
5346 else
b300c311 5347 /* We only support 64bit displacement on constants. */
40fb9820 5348 i.types[op].bitfield.disp64 = 0;
252b5132 5349 }
29b0f896
AM
5350}
5351
4a1b91ea
L
5352/* Return 1 if there is a match in broadcast bytes between operand
5353 GIVEN and instruction template T. */
5354
5355static INLINE int
5356match_broadcast_size (const insn_template *t, unsigned int given)
5357{
5358 return ((t->opcode_modifier.broadcast == BYTE_BROADCAST
5359 && i.types[given].bitfield.byte)
5360 || (t->opcode_modifier.broadcast == WORD_BROADCAST
5361 && i.types[given].bitfield.word)
5362 || (t->opcode_modifier.broadcast == DWORD_BROADCAST
5363 && i.types[given].bitfield.dword)
5364 || (t->opcode_modifier.broadcast == QWORD_BROADCAST
5365 && i.types[given].bitfield.qword));
5366}
5367
6c30d220
L
5368/* Check if operands are valid for the instruction. */
5369
5370static int
5371check_VecOperands (const insn_template *t)
5372{
43234a1e 5373 unsigned int op;
e2195274
JB
5374 i386_cpu_flags cpu;
5375 static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
5376
5377 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
5378 any one operand are implicity requiring AVX512VL support if the actual
5379 operand size is YMMword or XMMword. Since this function runs after
5380 template matching, there's no need to check for YMMword/XMMword in
5381 the template. */
5382 cpu = cpu_flags_and (t->cpu_flags, avx512);
5383 if (!cpu_flags_all_zero (&cpu)
5384 && !t->cpu_flags.bitfield.cpuavx512vl
5385 && !cpu_arch_flags.bitfield.cpuavx512vl)
5386 {
5387 for (op = 0; op < t->operands; ++op)
5388 {
5389 if (t->operand_types[op].bitfield.zmmword
5390 && (i.types[op].bitfield.ymmword
5391 || i.types[op].bitfield.xmmword))
5392 {
5393 i.error = unsupported;
5394 return 1;
5395 }
5396 }
5397 }
43234a1e 5398
6c30d220
L
5399 /* Without VSIB byte, we can't have a vector register for index. */
5400 if (!t->opcode_modifier.vecsib
5401 && i.index_reg
1b54b8d7
JB
5402 && (i.index_reg->reg_type.bitfield.xmmword
5403 || i.index_reg->reg_type.bitfield.ymmword
5404 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
5405 {
5406 i.error = unsupported_vector_index_register;
5407 return 1;
5408 }
5409
ad8ecc81
MZ
5410 /* Check if default mask is allowed. */
5411 if (t->opcode_modifier.nodefmask
5412 && (!i.mask || i.mask->mask->reg_num == 0))
5413 {
5414 i.error = no_default_mask;
5415 return 1;
5416 }
5417
7bab8ab5
JB
5418 /* For VSIB byte, we need a vector register for index, and all vector
5419 registers must be distinct. */
5420 if (t->opcode_modifier.vecsib)
5421 {
5422 if (!i.index_reg
6c30d220 5423 || !((t->opcode_modifier.vecsib == VecSIB128
1b54b8d7 5424 && i.index_reg->reg_type.bitfield.xmmword)
6c30d220 5425 || (t->opcode_modifier.vecsib == VecSIB256
1b54b8d7 5426 && i.index_reg->reg_type.bitfield.ymmword)
43234a1e 5427 || (t->opcode_modifier.vecsib == VecSIB512
1b54b8d7 5428 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
5429 {
5430 i.error = invalid_vsib_address;
5431 return 1;
5432 }
5433
43234a1e
L
5434 gas_assert (i.reg_operands == 2 || i.mask);
5435 if (i.reg_operands == 2 && !i.mask)
5436 {
3528c362 5437 gas_assert (i.types[0].bitfield.class == RegSIMD);
1b54b8d7
JB
5438 gas_assert (i.types[0].bitfield.xmmword
5439 || i.types[0].bitfield.ymmword);
3528c362 5440 gas_assert (i.types[2].bitfield.class == RegSIMD);
1b54b8d7
JB
5441 gas_assert (i.types[2].bitfield.xmmword
5442 || i.types[2].bitfield.ymmword);
43234a1e
L
5443 if (operand_check == check_none)
5444 return 0;
5445 if (register_number (i.op[0].regs)
5446 != register_number (i.index_reg)
5447 && register_number (i.op[2].regs)
5448 != register_number (i.index_reg)
5449 && register_number (i.op[0].regs)
5450 != register_number (i.op[2].regs))
5451 return 0;
5452 if (operand_check == check_error)
5453 {
5454 i.error = invalid_vector_register_set;
5455 return 1;
5456 }
5457 as_warn (_("mask, index, and destination registers should be distinct"));
5458 }
8444f82a
MZ
5459 else if (i.reg_operands == 1 && i.mask)
5460 {
3528c362 5461 if (i.types[1].bitfield.class == RegSIMD
1b54b8d7
JB
5462 && (i.types[1].bitfield.xmmword
5463 || i.types[1].bitfield.ymmword
5464 || i.types[1].bitfield.zmmword)
8444f82a
MZ
5465 && (register_number (i.op[1].regs)
5466 == register_number (i.index_reg)))
5467 {
5468 if (operand_check == check_error)
5469 {
5470 i.error = invalid_vector_register_set;
5471 return 1;
5472 }
5473 if (operand_check != check_none)
5474 as_warn (_("index and destination registers should be distinct"));
5475 }
5476 }
43234a1e 5477 }
7bab8ab5 5478
43234a1e
L
5479 /* Check if broadcast is supported by the instruction and is applied
5480 to the memory operand. */
5481 if (i.broadcast)
5482 {
8e6e0792 5483 i386_operand_type type, overlap;
43234a1e
L
5484
5485 /* Check if specified broadcast is supported in this instruction,
4a1b91ea 5486 and its broadcast bytes match the memory operand. */
32546502 5487 op = i.broadcast->operand;
8e6e0792 5488 if (!t->opcode_modifier.broadcast
c48dadc9 5489 || !(i.flags[op] & Operand_Mem)
c39e5b26 5490 || (!i.types[op].bitfield.unspecified
4a1b91ea 5491 && !match_broadcast_size (t, op)))
43234a1e
L
5492 {
5493 bad_broadcast:
5494 i.error = unsupported_broadcast;
5495 return 1;
5496 }
8e6e0792 5497
4a1b91ea
L
5498 i.broadcast->bytes = ((1 << (t->opcode_modifier.broadcast - 1))
5499 * i.broadcast->type);
8e6e0792 5500 operand_type_set (&type, 0);
4a1b91ea 5501 switch (i.broadcast->bytes)
8e6e0792 5502 {
4a1b91ea
L
5503 case 2:
5504 type.bitfield.word = 1;
5505 break;
5506 case 4:
5507 type.bitfield.dword = 1;
5508 break;
8e6e0792
JB
5509 case 8:
5510 type.bitfield.qword = 1;
5511 break;
5512 case 16:
5513 type.bitfield.xmmword = 1;
5514 break;
5515 case 32:
5516 type.bitfield.ymmword = 1;
5517 break;
5518 case 64:
5519 type.bitfield.zmmword = 1;
5520 break;
5521 default:
5522 goto bad_broadcast;
5523 }
5524
5525 overlap = operand_type_and (type, t->operand_types[op]);
5526 if (operand_type_all_zero (&overlap))
5527 goto bad_broadcast;
5528
5529 if (t->opcode_modifier.checkregsize)
5530 {
5531 unsigned int j;
5532
e2195274 5533 type.bitfield.baseindex = 1;
8e6e0792
JB
5534 for (j = 0; j < i.operands; ++j)
5535 {
5536 if (j != op
5537 && !operand_type_register_match(i.types[j],
5538 t->operand_types[j],
5539 type,
5540 t->operand_types[op]))
5541 goto bad_broadcast;
5542 }
5543 }
43234a1e
L
5544 }
5545 /* If broadcast is supported in this instruction, we need to check if
5546 operand of one-element size isn't specified without broadcast. */
5547 else if (t->opcode_modifier.broadcast && i.mem_operands)
5548 {
5549 /* Find memory operand. */
5550 for (op = 0; op < i.operands; op++)
8dc0818e 5551 if (i.flags[op] & Operand_Mem)
43234a1e
L
5552 break;
5553 gas_assert (op < i.operands);
5554 /* Check size of the memory operand. */
4a1b91ea 5555 if (match_broadcast_size (t, op))
43234a1e
L
5556 {
5557 i.error = broadcast_needed;
5558 return 1;
5559 }
5560 }
c39e5b26
JB
5561 else
5562 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
5563
5564 /* Check if requested masking is supported. */
ae2387fe 5565 if (i.mask)
43234a1e 5566 {
ae2387fe
JB
5567 switch (t->opcode_modifier.masking)
5568 {
5569 case BOTH_MASKING:
5570 break;
5571 case MERGING_MASKING:
5572 if (i.mask->zeroing)
5573 {
5574 case 0:
5575 i.error = unsupported_masking;
5576 return 1;
5577 }
5578 break;
5579 case DYNAMIC_MASKING:
5580 /* Memory destinations allow only merging masking. */
5581 if (i.mask->zeroing && i.mem_operands)
5582 {
5583 /* Find memory operand. */
5584 for (op = 0; op < i.operands; op++)
c48dadc9 5585 if (i.flags[op] & Operand_Mem)
ae2387fe
JB
5586 break;
5587 gas_assert (op < i.operands);
5588 if (op == i.operands - 1)
5589 {
5590 i.error = unsupported_masking;
5591 return 1;
5592 }
5593 }
5594 break;
5595 default:
5596 abort ();
5597 }
43234a1e
L
5598 }
5599
5600 /* Check if masking is applied to dest operand. */
5601 if (i.mask && (i.mask->operand != (int) (i.operands - 1)))
5602 {
5603 i.error = mask_not_on_destination;
5604 return 1;
5605 }
5606
43234a1e
L
5607 /* Check RC/SAE. */
5608 if (i.rounding)
5609 {
a80195f1
JB
5610 if (!t->opcode_modifier.sae
5611 || (i.rounding->type != saeonly && !t->opcode_modifier.staticrounding))
43234a1e
L
5612 {
5613 i.error = unsupported_rc_sae;
5614 return 1;
5615 }
5616 /* If the instruction has several immediate operands and one of
5617 them is rounding, the rounding operand should be the last
5618 immediate operand. */
5619 if (i.imm_operands > 1
5620 && i.rounding->operand != (int) (i.imm_operands - 1))
7bab8ab5 5621 {
43234a1e 5622 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
5623 return 1;
5624 }
6c30d220
L
5625 }
5626
43234a1e 5627 /* Check vector Disp8 operand. */
b5014f7a
JB
5628 if (t->opcode_modifier.disp8memshift
5629 && i.disp_encoding != disp_encoding_32bit)
43234a1e
L
5630 {
5631 if (i.broadcast)
4a1b91ea 5632 i.memshift = t->opcode_modifier.broadcast - 1;
7091c612 5633 else if (t->opcode_modifier.disp8memshift != DISP8_SHIFT_VL)
43234a1e 5634 i.memshift = t->opcode_modifier.disp8memshift;
7091c612
JB
5635 else
5636 {
5637 const i386_operand_type *type = NULL;
5638
5639 i.memshift = 0;
5640 for (op = 0; op < i.operands; op++)
8dc0818e 5641 if (i.flags[op] & Operand_Mem)
7091c612 5642 {
4174bfff
JB
5643 if (t->opcode_modifier.evex == EVEXLIG)
5644 i.memshift = 2 + (i.suffix == QWORD_MNEM_SUFFIX);
5645 else if (t->operand_types[op].bitfield.xmmword
5646 + t->operand_types[op].bitfield.ymmword
5647 + t->operand_types[op].bitfield.zmmword <= 1)
7091c612
JB
5648 type = &t->operand_types[op];
5649 else if (!i.types[op].bitfield.unspecified)
5650 type = &i.types[op];
5651 }
3528c362 5652 else if (i.types[op].bitfield.class == RegSIMD
4174bfff 5653 && t->opcode_modifier.evex != EVEXLIG)
7091c612
JB
5654 {
5655 if (i.types[op].bitfield.zmmword)
5656 i.memshift = 6;
5657 else if (i.types[op].bitfield.ymmword && i.memshift < 5)
5658 i.memshift = 5;
5659 else if (i.types[op].bitfield.xmmword && i.memshift < 4)
5660 i.memshift = 4;
5661 }
5662
5663 if (type)
5664 {
5665 if (type->bitfield.zmmword)
5666 i.memshift = 6;
5667 else if (type->bitfield.ymmword)
5668 i.memshift = 5;
5669 else if (type->bitfield.xmmword)
5670 i.memshift = 4;
5671 }
5672
5673 /* For the check in fits_in_disp8(). */
5674 if (i.memshift == 0)
5675 i.memshift = -1;
5676 }
43234a1e
L
5677
5678 for (op = 0; op < i.operands; op++)
5679 if (operand_type_check (i.types[op], disp)
5680 && i.op[op].disps->X_op == O_constant)
5681 {
b5014f7a 5682 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 5683 {
b5014f7a
JB
5684 i.types[op].bitfield.disp8 = 1;
5685 return 0;
43234a1e 5686 }
b5014f7a 5687 i.types[op].bitfield.disp8 = 0;
43234a1e
L
5688 }
5689 }
b5014f7a
JB
5690
5691 i.memshift = 0;
43234a1e 5692
6c30d220
L
5693 return 0;
5694}
5695
43f3e2ee 5696/* Check if operands are valid for the instruction. Update VEX
a683cc34
SP
5697 operand types. */
5698
5699static int
5700VEX_check_operands (const insn_template *t)
5701{
86fa6981 5702 if (i.vec_encoding == vex_encoding_evex)
43234a1e 5703 {
86fa6981 5704 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 5705 if (!is_evex_encoding (t))
86fa6981
L
5706 {
5707 i.error = unsupported;
5708 return 1;
5709 }
5710 return 0;
43234a1e
L
5711 }
5712
a683cc34 5713 if (!t->opcode_modifier.vex)
86fa6981
L
5714 {
5715 /* This instruction template doesn't have VEX prefix. */
5716 if (i.vec_encoding != vex_encoding_default)
5717 {
5718 i.error = unsupported;
5719 return 1;
5720 }
5721 return 0;
5722 }
a683cc34 5723
9d3bf266
JB
5724 /* Check the special Imm4 cases; must be the first operand. */
5725 if (t->cpu_flags.bitfield.cpuxop && t->operands == 5)
a683cc34
SP
5726 {
5727 if (i.op[0].imms->X_op != O_constant
5728 || !fits_in_imm4 (i.op[0].imms->X_add_number))
891edac4 5729 {
a65babc9 5730 i.error = bad_imm4;
891edac4
L
5731 return 1;
5732 }
a683cc34 5733
9d3bf266
JB
5734 /* Turn off Imm<N> so that update_imm won't complain. */
5735 operand_type_set (&i.types[0], 0);
a683cc34
SP
5736 }
5737
5738 return 0;
5739}
5740
d3ce72d0 5741static const insn_template *
83b16ac6 5742match_template (char mnem_suffix)
29b0f896
AM
5743{
5744 /* Points to template once we've found it. */
d3ce72d0 5745 const insn_template *t;
40fb9820 5746 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 5747 i386_operand_type overlap4;
29b0f896 5748 unsigned int found_reverse_match;
dc2be329 5749 i386_opcode_modifier suffix_check;
40fb9820 5750 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 5751 int addr_prefix_disp;
45a4bb20 5752 unsigned int j, size_match, check_register;
5614d22c 5753 enum i386_error specific_error = 0;
29b0f896 5754
c0f3af97
L
5755#if MAX_OPERANDS != 5
5756# error "MAX_OPERANDS must be 5."
f48ff2ae
L
5757#endif
5758
29b0f896 5759 found_reverse_match = 0;
539e75ad 5760 addr_prefix_disp = -1;
40fb9820 5761
dc2be329 5762 /* Prepare for mnemonic suffix check. */
40fb9820 5763 memset (&suffix_check, 0, sizeof (suffix_check));
dc2be329
L
5764 switch (mnem_suffix)
5765 {
5766 case BYTE_MNEM_SUFFIX:
5767 suffix_check.no_bsuf = 1;
5768 break;
5769 case WORD_MNEM_SUFFIX:
5770 suffix_check.no_wsuf = 1;
5771 break;
5772 case SHORT_MNEM_SUFFIX:
5773 suffix_check.no_ssuf = 1;
5774 break;
5775 case LONG_MNEM_SUFFIX:
5776 suffix_check.no_lsuf = 1;
5777 break;
5778 case QWORD_MNEM_SUFFIX:
5779 suffix_check.no_qsuf = 1;
5780 break;
5781 default:
5782 /* NB: In Intel syntax, normally we can check for memory operand
5783 size when there is no mnemonic suffix. But jmp and call have
5784 2 different encodings with Dword memory operand size, one with
5785 No_ldSuf and the other without. i.suffix is set to
5786 LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf. */
5787 if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
5788 suffix_check.no_ldsuf = 1;
83b16ac6
JB
5789 }
5790
01559ecc
L
5791 /* Must have right number of operands. */
5792 i.error = number_of_operands_mismatch;
5793
45aa61fe 5794 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 5795 {
539e75ad 5796 addr_prefix_disp = -1;
dbbc8b7e 5797 found_reverse_match = 0;
539e75ad 5798
29b0f896
AM
5799 if (i.operands != t->operands)
5800 continue;
5801
50aecf8c 5802 /* Check processor support. */
a65babc9 5803 i.error = unsupported;
45a4bb20 5804 if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH)
50aecf8c
L
5805 continue;
5806
e1d4d893 5807 /* Check AT&T mnemonic. */
a65babc9 5808 i.error = unsupported_with_intel_mnemonic;
e1d4d893 5809 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
5810 continue;
5811
4b5aaf5f 5812 /* Check AT&T/Intel syntax. */
a65babc9 5813 i.error = unsupported_syntax;
5c07affc 5814 if ((intel_syntax && t->opcode_modifier.attsyntax)
4b5aaf5f 5815 || (!intel_syntax && t->opcode_modifier.intelsyntax))
1efbbeb4
L
5816 continue;
5817
4b5aaf5f
L
5818 /* Check Intel64/AMD64 ISA. */
5819 switch (isa64)
5820 {
5821 default:
5822 /* Default: Don't accept Intel64. */
5823 if (t->opcode_modifier.isa64 == INTEL64)
5824 continue;
5825 break;
5826 case amd64:
5827 /* -mamd64: Don't accept Intel64 and Intel64 only. */
5828 if (t->opcode_modifier.isa64 >= INTEL64)
5829 continue;
5830 break;
5831 case intel64:
5832 /* -mintel64: Don't accept AMD64. */
5833 if (t->opcode_modifier.isa64 == AMD64)
5834 continue;
5835 break;
5836 }
5837
dc2be329 5838 /* Check the suffix. */
a65babc9 5839 i.error = invalid_instruction_suffix;
dc2be329
L
5840 if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
5841 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
5842 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
5843 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
5844 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
5845 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
83b16ac6 5846 continue;
29b0f896 5847
3ac21baa
JB
5848 size_match = operand_size_match (t);
5849 if (!size_match)
7d5e4556 5850 continue;
539e75ad 5851
6f2f06be
JB
5852 /* This is intentionally not
5853
0cfa3eb3 5854 if (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE))
6f2f06be
JB
5855
5856 as the case of a missing * on the operand is accepted (perhaps with
5857 a warning, issued further down). */
0cfa3eb3 5858 if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
6f2f06be
JB
5859 {
5860 i.error = operand_type_mismatch;
5861 continue;
5862 }
5863
5c07affc
L
5864 for (j = 0; j < MAX_OPERANDS; j++)
5865 operand_types[j] = t->operand_types[j];
5866
45aa61fe
AM
5867 /* In general, don't allow 64-bit operands in 32-bit mode. */
5868 if (i.suffix == QWORD_MNEM_SUFFIX
5869 && flag_code != CODE_64BIT
5870 && (intel_syntax
40fb9820 5871 ? (!t->opcode_modifier.ignoresize
625cbd7a 5872 && !t->opcode_modifier.broadcast
45aa61fe
AM
5873 && !intel_float_operand (t->name))
5874 : intel_float_operand (t->name) != 2)
3528c362
JB
5875 && ((operand_types[0].bitfield.class != RegMMX
5876 && operand_types[0].bitfield.class != RegSIMD)
5877 || (operand_types[t->operands > 1].bitfield.class != RegMMX
5878 && operand_types[t->operands > 1].bitfield.class != RegSIMD))
45aa61fe
AM
5879 && (t->base_opcode != 0x0fc7
5880 || t->extension_opcode != 1 /* cmpxchg8b */))
5881 continue;
5882
192dc9c6
JB
5883 /* In general, don't allow 32-bit operands on pre-386. */
5884 else if (i.suffix == LONG_MNEM_SUFFIX
5885 && !cpu_arch_flags.bitfield.cpui386
5886 && (intel_syntax
5887 ? (!t->opcode_modifier.ignoresize
5888 && !intel_float_operand (t->name))
5889 : intel_float_operand (t->name) != 2)
3528c362
JB
5890 && ((operand_types[0].bitfield.class != RegMMX
5891 && operand_types[0].bitfield.class != RegSIMD)
5892 || (operand_types[t->operands > 1].bitfield.class != RegMMX
5893 && operand_types[t->operands > 1].bitfield.class
5894 != RegSIMD)))
192dc9c6
JB
5895 continue;
5896
29b0f896 5897 /* Do not verify operands when there are none. */
50aecf8c 5898 else
29b0f896 5899 {
c6fb90c8 5900 if (!t->operands)
2dbab7d5
L
5901 /* We've found a match; break out of loop. */
5902 break;
29b0f896 5903 }
252b5132 5904
48bcea9f
JB
5905 if (!t->opcode_modifier.jump
5906 || t->opcode_modifier.jump == JUMP_ABSOLUTE)
5907 {
5908 /* There should be only one Disp operand. */
5909 for (j = 0; j < MAX_OPERANDS; j++)
5910 if (operand_type_check (operand_types[j], disp))
539e75ad 5911 break;
48bcea9f
JB
5912 if (j < MAX_OPERANDS)
5913 {
5914 bfd_boolean override = (i.prefix[ADDR_PREFIX] != 0);
5915
5916 addr_prefix_disp = j;
5917
5918 /* Address size prefix will turn Disp64/Disp32S/Disp32/Disp16
5919 operand into Disp32/Disp32/Disp16/Disp32 operand. */
5920 switch (flag_code)
40fb9820 5921 {
48bcea9f
JB
5922 case CODE_16BIT:
5923 override = !override;
5924 /* Fall through. */
5925 case CODE_32BIT:
5926 if (operand_types[j].bitfield.disp32
5927 && operand_types[j].bitfield.disp16)
40fb9820 5928 {
48bcea9f
JB
5929 operand_types[j].bitfield.disp16 = override;
5930 operand_types[j].bitfield.disp32 = !override;
40fb9820 5931 }
48bcea9f
JB
5932 operand_types[j].bitfield.disp32s = 0;
5933 operand_types[j].bitfield.disp64 = 0;
5934 break;
5935
5936 case CODE_64BIT:
5937 if (operand_types[j].bitfield.disp32s
5938 || operand_types[j].bitfield.disp64)
40fb9820 5939 {
48bcea9f
JB
5940 operand_types[j].bitfield.disp64 &= !override;
5941 operand_types[j].bitfield.disp32s &= !override;
5942 operand_types[j].bitfield.disp32 = override;
40fb9820 5943 }
48bcea9f
JB
5944 operand_types[j].bitfield.disp16 = 0;
5945 break;
40fb9820 5946 }
539e75ad 5947 }
48bcea9f 5948 }
539e75ad 5949
02a86693
L
5950 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
5951 if (i.reloc[0] == BFD_RELOC_386_GOT32 && t->base_opcode == 0xa0)
5952 continue;
5953
56ffb741 5954 /* We check register size if needed. */
e2195274
JB
5955 if (t->opcode_modifier.checkregsize)
5956 {
5957 check_register = (1 << t->operands) - 1;
5958 if (i.broadcast)
5959 check_register &= ~(1 << i.broadcast->operand);
5960 }
5961 else
5962 check_register = 0;
5963
c6fb90c8 5964 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
5965 switch (t->operands)
5966 {
5967 case 1:
40fb9820 5968 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
5969 continue;
5970 break;
5971 case 2:
33eaf5de 5972 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
5973 only in 32bit mode and we can use opcode 0x90. In 64bit
5974 mode, we can't use 0x90 for xchg %eax, %eax since it should
5975 zero-extend %eax to %rax. */
5976 if (flag_code == CODE_64BIT
5977 && t->base_opcode == 0x90
75e5731b
JB
5978 && i.types[0].bitfield.instance == Accum
5979 && i.types[0].bitfield.dword
5980 && i.types[1].bitfield.instance == Accum
5981 && i.types[1].bitfield.dword)
8b38ad71 5982 continue;
1212781b
JB
5983 /* xrelease mov %eax, <disp> is another special case. It must not
5984 match the accumulator-only encoding of mov. */
5985 if (flag_code != CODE_64BIT
5986 && i.hle_prefix
5987 && t->base_opcode == 0xa0
75e5731b 5988 && i.types[0].bitfield.instance == Accum
8dc0818e 5989 && (i.flags[1] & Operand_Mem))
1212781b 5990 continue;
f5eb1d70
JB
5991 /* Fall through. */
5992
5993 case 3:
3ac21baa
JB
5994 if (!(size_match & MATCH_STRAIGHT))
5995 goto check_reverse;
64c49ab3
JB
5996 /* Reverse direction of operands if swapping is possible in the first
5997 place (operands need to be symmetric) and
5998 - the load form is requested, and the template is a store form,
5999 - the store form is requested, and the template is a load form,
6000 - the non-default (swapped) form is requested. */
6001 overlap1 = operand_type_and (operand_types[0], operand_types[1]);
f5eb1d70 6002 if (t->opcode_modifier.d && i.reg_operands == i.operands
64c49ab3
JB
6003 && !operand_type_all_zero (&overlap1))
6004 switch (i.dir_encoding)
6005 {
6006 case dir_encoding_load:
6007 if (operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6008 || t->opcode_modifier.regmem)
64c49ab3
JB
6009 goto check_reverse;
6010 break;
6011
6012 case dir_encoding_store:
6013 if (!operand_type_check (operand_types[i.operands - 1], anymem)
dfd69174 6014 && !t->opcode_modifier.regmem)
64c49ab3
JB
6015 goto check_reverse;
6016 break;
6017
6018 case dir_encoding_swap:
6019 goto check_reverse;
6020
6021 case dir_encoding_default:
6022 break;
6023 }
86fa6981 6024 /* If we want store form, we skip the current load. */
64c49ab3
JB
6025 if ((i.dir_encoding == dir_encoding_store
6026 || i.dir_encoding == dir_encoding_swap)
86fa6981
L
6027 && i.mem_operands == 0
6028 && t->opcode_modifier.load)
fa99fab2 6029 continue;
1a0670f3 6030 /* Fall through. */
f48ff2ae 6031 case 4:
c0f3af97 6032 case 5:
c6fb90c8 6033 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
6034 if (!operand_type_match (overlap0, i.types[0])
6035 || !operand_type_match (overlap1, i.types[1])
e2195274 6036 || ((check_register & 3) == 3
dc821c5f 6037 && !operand_type_register_match (i.types[0],
40fb9820 6038 operand_types[0],
dc821c5f 6039 i.types[1],
40fb9820 6040 operand_types[1])))
29b0f896
AM
6041 {
6042 /* Check if other direction is valid ... */
38e314eb 6043 if (!t->opcode_modifier.d)
29b0f896
AM
6044 continue;
6045
b6169b20 6046check_reverse:
3ac21baa
JB
6047 if (!(size_match & MATCH_REVERSE))
6048 continue;
29b0f896 6049 /* Try reversing direction of operands. */
f5eb1d70
JB
6050 overlap0 = operand_type_and (i.types[0], operand_types[i.operands - 1]);
6051 overlap1 = operand_type_and (i.types[i.operands - 1], operand_types[0]);
40fb9820 6052 if (!operand_type_match (overlap0, i.types[0])
f5eb1d70 6053 || !operand_type_match (overlap1, i.types[i.operands - 1])
45664ddb 6054 || (check_register
dc821c5f 6055 && !operand_type_register_match (i.types[0],
f5eb1d70
JB
6056 operand_types[i.operands - 1],
6057 i.types[i.operands - 1],
45664ddb 6058 operand_types[0])))
29b0f896
AM
6059 {
6060 /* Does not match either direction. */
6061 continue;
6062 }
38e314eb 6063 /* found_reverse_match holds which of D or FloatR
29b0f896 6064 we've found. */
38e314eb
JB
6065 if (!t->opcode_modifier.d)
6066 found_reverse_match = 0;
6067 else if (operand_types[0].bitfield.tbyte)
8a2ed489 6068 found_reverse_match = Opcode_FloatD;
dbbc8b7e 6069 else if (operand_types[0].bitfield.xmmword
f5eb1d70 6070 || operand_types[i.operands - 1].bitfield.xmmword
3528c362
JB
6071 || operand_types[0].bitfield.class == RegMMX
6072 || operand_types[i.operands - 1].bitfield.class == RegMMX
dbbc8b7e
JB
6073 || is_any_vex_encoding(t))
6074 found_reverse_match = (t->base_opcode & 0xee) != 0x6e
6075 ? Opcode_SIMD_FloatD : Opcode_SIMD_IntD;
8a2ed489 6076 else
38e314eb 6077 found_reverse_match = Opcode_D;
40fb9820 6078 if (t->opcode_modifier.floatr)
8a2ed489 6079 found_reverse_match |= Opcode_FloatR;
29b0f896 6080 }
f48ff2ae 6081 else
29b0f896 6082 {
f48ff2ae 6083 /* Found a forward 2 operand match here. */
d1cbb4db
L
6084 switch (t->operands)
6085 {
c0f3af97
L
6086 case 5:
6087 overlap4 = operand_type_and (i.types[4],
6088 operand_types[4]);
1a0670f3 6089 /* Fall through. */
d1cbb4db 6090 case 4:
c6fb90c8
L
6091 overlap3 = operand_type_and (i.types[3],
6092 operand_types[3]);
1a0670f3 6093 /* Fall through. */
d1cbb4db 6094 case 3:
c6fb90c8
L
6095 overlap2 = operand_type_and (i.types[2],
6096 operand_types[2]);
d1cbb4db
L
6097 break;
6098 }
29b0f896 6099
f48ff2ae
L
6100 switch (t->operands)
6101 {
c0f3af97
L
6102 case 5:
6103 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 6104 || !operand_type_register_match (i.types[3],
c0f3af97 6105 operand_types[3],
c0f3af97
L
6106 i.types[4],
6107 operand_types[4]))
6108 continue;
1a0670f3 6109 /* Fall through. */
f48ff2ae 6110 case 4:
40fb9820 6111 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
6112 || ((check_register & 0xa) == 0xa
6113 && !operand_type_register_match (i.types[1],
f7768225
JB
6114 operand_types[1],
6115 i.types[3],
e2195274
JB
6116 operand_types[3]))
6117 || ((check_register & 0xc) == 0xc
6118 && !operand_type_register_match (i.types[2],
6119 operand_types[2],
6120 i.types[3],
6121 operand_types[3])))
f48ff2ae 6122 continue;
1a0670f3 6123 /* Fall through. */
f48ff2ae
L
6124 case 3:
6125 /* Here we make use of the fact that there are no
23e42951 6126 reverse match 3 operand instructions. */
40fb9820 6127 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
6128 || ((check_register & 5) == 5
6129 && !operand_type_register_match (i.types[0],
23e42951
JB
6130 operand_types[0],
6131 i.types[2],
e2195274
JB
6132 operand_types[2]))
6133 || ((check_register & 6) == 6
6134 && !operand_type_register_match (i.types[1],
6135 operand_types[1],
6136 i.types[2],
6137 operand_types[2])))
f48ff2ae
L
6138 continue;
6139 break;
6140 }
29b0f896 6141 }
f48ff2ae 6142 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
6143 slip through to break. */
6144 }
c0f3af97 6145
5614d22c
JB
6146 /* Check if vector and VEX operands are valid. */
6147 if (check_VecOperands (t) || VEX_check_operands (t))
6148 {
6149 specific_error = i.error;
6150 continue;
6151 }
a683cc34 6152
29b0f896
AM
6153 /* We've found a match; break out of loop. */
6154 break;
6155 }
6156
6157 if (t == current_templates->end)
6158 {
6159 /* We found no match. */
a65babc9 6160 const char *err_msg;
5614d22c 6161 switch (specific_error ? specific_error : i.error)
a65babc9
L
6162 {
6163 default:
6164 abort ();
86e026a4 6165 case operand_size_mismatch:
a65babc9
L
6166 err_msg = _("operand size mismatch");
6167 break;
6168 case operand_type_mismatch:
6169 err_msg = _("operand type mismatch");
6170 break;
6171 case register_type_mismatch:
6172 err_msg = _("register type mismatch");
6173 break;
6174 case number_of_operands_mismatch:
6175 err_msg = _("number of operands mismatch");
6176 break;
6177 case invalid_instruction_suffix:
6178 err_msg = _("invalid instruction suffix");
6179 break;
6180 case bad_imm4:
4a2608e3 6181 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 6182 break;
a65babc9
L
6183 case unsupported_with_intel_mnemonic:
6184 err_msg = _("unsupported with Intel mnemonic");
6185 break;
6186 case unsupported_syntax:
6187 err_msg = _("unsupported syntax");
6188 break;
6189 case unsupported:
35262a23 6190 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
6191 current_templates->start->name);
6192 return NULL;
6c30d220
L
6193 case invalid_vsib_address:
6194 err_msg = _("invalid VSIB address");
6195 break;
7bab8ab5
JB
6196 case invalid_vector_register_set:
6197 err_msg = _("mask, index, and destination registers must be distinct");
6198 break;
6c30d220
L
6199 case unsupported_vector_index_register:
6200 err_msg = _("unsupported vector index register");
6201 break;
43234a1e
L
6202 case unsupported_broadcast:
6203 err_msg = _("unsupported broadcast");
6204 break;
43234a1e
L
6205 case broadcast_needed:
6206 err_msg = _("broadcast is needed for operand of such type");
6207 break;
6208 case unsupported_masking:
6209 err_msg = _("unsupported masking");
6210 break;
6211 case mask_not_on_destination:
6212 err_msg = _("mask not on destination operand");
6213 break;
6214 case no_default_mask:
6215 err_msg = _("default mask isn't allowed");
6216 break;
6217 case unsupported_rc_sae:
6218 err_msg = _("unsupported static rounding/sae");
6219 break;
6220 case rc_sae_operand_not_last_imm:
6221 if (intel_syntax)
6222 err_msg = _("RC/SAE operand must precede immediate operands");
6223 else
6224 err_msg = _("RC/SAE operand must follow immediate operands");
6225 break;
6226 case invalid_register_operand:
6227 err_msg = _("invalid register operand");
6228 break;
a65babc9
L
6229 }
6230 as_bad (_("%s for `%s'"), err_msg,
891edac4 6231 current_templates->start->name);
fa99fab2 6232 return NULL;
29b0f896 6233 }
252b5132 6234
29b0f896
AM
6235 if (!quiet_warnings)
6236 {
6237 if (!intel_syntax
0cfa3eb3 6238 && (i.jumpabsolute != (t->opcode_modifier.jump == JUMP_ABSOLUTE)))
6f2f06be 6239 as_warn (_("indirect %s without `*'"), t->name);
29b0f896 6240
40fb9820
L
6241 if (t->opcode_modifier.isprefix
6242 && t->opcode_modifier.ignoresize)
29b0f896
AM
6243 {
6244 /* Warn them that a data or address size prefix doesn't
6245 affect assembly of the next line of code. */
6246 as_warn (_("stand-alone `%s' prefix"), t->name);
6247 }
6248 }
6249
6250 /* Copy the template we found. */
6251 i.tm = *t;
539e75ad
L
6252
6253 if (addr_prefix_disp != -1)
6254 i.tm.operand_types[addr_prefix_disp]
6255 = operand_types[addr_prefix_disp];
6256
29b0f896
AM
6257 if (found_reverse_match)
6258 {
dfd69174
JB
6259 /* If we found a reverse match we must alter the opcode direction
6260 bit and clear/flip the regmem modifier one. found_reverse_match
6261 holds bits to change (different for int & float insns). */
29b0f896
AM
6262
6263 i.tm.base_opcode ^= found_reverse_match;
6264
f5eb1d70
JB
6265 i.tm.operand_types[0] = operand_types[i.operands - 1];
6266 i.tm.operand_types[i.operands - 1] = operand_types[0];
dfd69174
JB
6267
6268 /* Certain SIMD insns have their load forms specified in the opcode
6269 table, and hence we need to _set_ RegMem instead of clearing it.
6270 We need to avoid setting the bit though on insns like KMOVW. */
6271 i.tm.opcode_modifier.regmem
6272 = i.tm.opcode_modifier.modrm && i.tm.opcode_modifier.d
6273 && i.tm.operands > 2U - i.tm.opcode_modifier.sse2avx
6274 && !i.tm.opcode_modifier.regmem;
29b0f896
AM
6275 }
6276
fa99fab2 6277 return t;
29b0f896
AM
6278}
6279
6280static int
e3bb37b5 6281check_string (void)
29b0f896 6282{
51c8edf6
JB
6283 unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
6284 unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
8dc0818e 6285
51c8edf6 6286 if (i.seg[op] != NULL && i.seg[op] != &es)
29b0f896 6287 {
51c8edf6
JB
6288 as_bad (_("`%s' operand %u must use `%ses' segment"),
6289 i.tm.name,
6290 intel_syntax ? i.tm.operands - es_op : es_op + 1,
6291 register_prefix);
6292 return 0;
29b0f896 6293 }
51c8edf6
JB
6294
6295 /* There's only ever one segment override allowed per instruction.
6296 This instruction possibly has a legal segment override on the
6297 second operand, so copy the segment to where non-string
6298 instructions store it, allowing common code. */
6299 i.seg[op] = i.seg[1];
6300
29b0f896
AM
6301 return 1;
6302}
6303
6304static int
543613e9 6305process_suffix (void)
29b0f896
AM
6306{
6307 /* If matched instruction specifies an explicit instruction mnemonic
6308 suffix, use it. */
673fe0f0 6309 if (i.tm.opcode_modifier.size == SIZE16)
40fb9820 6310 i.suffix = WORD_MNEM_SUFFIX;
673fe0f0 6311 else if (i.tm.opcode_modifier.size == SIZE32)
40fb9820 6312 i.suffix = LONG_MNEM_SUFFIX;
673fe0f0 6313 else if (i.tm.opcode_modifier.size == SIZE64)
40fb9820 6314 i.suffix = QWORD_MNEM_SUFFIX;
13e600d0
JB
6315 else if (i.reg_operands
6316 && (i.operands > 1 || i.types[0].bitfield.class == Reg))
29b0f896
AM
6317 {
6318 /* If there's no instruction mnemonic suffix we try to invent one
13e600d0 6319 based on GPR operands. */
29b0f896
AM
6320 if (!i.suffix)
6321 {
6322 /* We take i.suffix from the last register operand specified,
6323 Destination register type is more significant than source
381d071f
L
6324 register type. crc32 in SSE4.2 prefers source register
6325 type. */
1a035124 6326 unsigned int op = i.tm.base_opcode != 0xf20f38f0 ? i.operands : 1;
20592a94 6327
1a035124
JB
6328 while (op--)
6329 if (i.tm.operand_types[op].bitfield.instance == InstanceNone
6330 || i.tm.operand_types[op].bitfield.instance == Accum)
6331 {
6332 if (i.types[op].bitfield.class != Reg)
6333 continue;
6334 if (i.types[op].bitfield.byte)
6335 i.suffix = BYTE_MNEM_SUFFIX;
6336 else if (i.types[op].bitfield.word)
6337 i.suffix = WORD_MNEM_SUFFIX;
6338 else if (i.types[op].bitfield.dword)
6339 i.suffix = LONG_MNEM_SUFFIX;
6340 else if (i.types[op].bitfield.qword)
6341 i.suffix = QWORD_MNEM_SUFFIX;
6342 else
6343 continue;
6344 break;
6345 }
29b0f896
AM
6346 }
6347 else if (i.suffix == BYTE_MNEM_SUFFIX)
6348 {
2eb952a4
L
6349 if (intel_syntax
6350 && i.tm.opcode_modifier.ignoresize
6351 && i.tm.opcode_modifier.no_bsuf)
6352 i.suffix = 0;
6353 else if (!check_byte_reg ())
29b0f896
AM
6354 return 0;
6355 }
6356 else if (i.suffix == LONG_MNEM_SUFFIX)
6357 {
2eb952a4
L
6358 if (intel_syntax
6359 && i.tm.opcode_modifier.ignoresize
9f123b91
JB
6360 && i.tm.opcode_modifier.no_lsuf
6361 && !i.tm.opcode_modifier.todword
6362 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
6363 i.suffix = 0;
6364 else if (!check_long_reg ())
29b0f896
AM
6365 return 0;
6366 }
6367 else if (i.suffix == QWORD_MNEM_SUFFIX)
6368 {
955e1e6a
L
6369 if (intel_syntax
6370 && i.tm.opcode_modifier.ignoresize
9f123b91
JB
6371 && i.tm.opcode_modifier.no_qsuf
6372 && !i.tm.opcode_modifier.todword
6373 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
6374 i.suffix = 0;
6375 else if (!check_qword_reg ())
29b0f896
AM
6376 return 0;
6377 }
6378 else if (i.suffix == WORD_MNEM_SUFFIX)
6379 {
2eb952a4
L
6380 if (intel_syntax
6381 && i.tm.opcode_modifier.ignoresize
6382 && i.tm.opcode_modifier.no_wsuf)
6383 i.suffix = 0;
6384 else if (!check_word_reg ())
29b0f896
AM
6385 return 0;
6386 }
40fb9820 6387 else if (intel_syntax && i.tm.opcode_modifier.ignoresize)
29b0f896
AM
6388 /* Do nothing if the instruction is going to ignore the prefix. */
6389 ;
6390 else
6391 abort ();
6392 }
62b3f548 6393 else if (i.tm.opcode_modifier.defaultsize && !i.suffix)
29b0f896 6394 {
13e600d0
JB
6395 i.suffix = stackop_size;
6396 if (stackop_size == LONG_MNEM_SUFFIX)
06f74c5c
L
6397 {
6398 /* stackop_size is set to LONG_MNEM_SUFFIX for the
6399 .code16gcc directive to support 16-bit mode with
6400 32-bit address. For IRET without a suffix, generate
6401 16-bit IRET (opcode 0xcf) to return from an interrupt
6402 handler. */
13e600d0
JB
6403 if (i.tm.base_opcode == 0xcf)
6404 {
6405 i.suffix = WORD_MNEM_SUFFIX;
6406 as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
6407 }
6408 /* Warn about changed behavior for segment register push/pop. */
6409 else if ((i.tm.base_opcode | 1) == 0x07)
6410 as_warn (_("generating 32-bit `%s', unlike earlier gas versions"),
6411 i.tm.name);
06f74c5c 6412 }
29b0f896 6413 }
c006a730 6414 else if (!i.suffix
0cfa3eb3
JB
6415 && (i.tm.opcode_modifier.jump == JUMP_ABSOLUTE
6416 || i.tm.opcode_modifier.jump == JUMP_BYTE
6417 || i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT
64e74474
AM
6418 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
6419 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
6420 {
6421 switch (flag_code)
6422 {
6423 case CODE_64BIT:
40fb9820 6424 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a
JB
6425 {
6426 i.suffix = QWORD_MNEM_SUFFIX;
6427 break;
6428 }
1a0670f3 6429 /* Fall through. */
9306ca4a 6430 case CODE_32BIT:
40fb9820 6431 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
6432 i.suffix = LONG_MNEM_SUFFIX;
6433 break;
6434 case CODE_16BIT:
40fb9820 6435 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
6436 i.suffix = WORD_MNEM_SUFFIX;
6437 break;
6438 }
6439 }
252b5132 6440
c006a730 6441 if (!i.suffix
873494c8
JB
6442 && (!i.tm.opcode_modifier.defaultsize
6443 /* Also cover lret/retf/iret in 64-bit mode. */
6444 || (flag_code == CODE_64BIT
6445 && !i.tm.opcode_modifier.no_lsuf
6446 && !i.tm.opcode_modifier.no_qsuf))
62b3f548
JB
6447 && !i.tm.opcode_modifier.ignoresize
6448 /* Accept FLDENV et al without suffix. */
6449 && (i.tm.opcode_modifier.no_ssuf || i.tm.opcode_modifier.floatmf))
29b0f896 6450 {
c006a730
JB
6451 unsigned int suffixes;
6452
6453 suffixes = !i.tm.opcode_modifier.no_bsuf;
6454 if (!i.tm.opcode_modifier.no_wsuf)
6455 suffixes |= 1 << 1;
6456 if (!i.tm.opcode_modifier.no_lsuf)
6457 suffixes |= 1 << 2;
6458 if (!i.tm.opcode_modifier.no_ldsuf)
6459 suffixes |= 1 << 3;
6460 if (!i.tm.opcode_modifier.no_ssuf)
6461 suffixes |= 1 << 4;
6462 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
6463 suffixes |= 1 << 5;
6464
6465 /* Are multiple suffixes allowed? */
6466 if (suffixes & (suffixes - 1))
9306ca4a 6467 {
873494c8
JB
6468 if (intel_syntax
6469 && (!i.tm.opcode_modifier.defaultsize
6470 || operand_check == check_error))
9306ca4a 6471 {
c006a730 6472 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
9306ca4a
JB
6473 return 0;
6474 }
c006a730 6475 if (operand_check == check_error)
9306ca4a 6476 {
c006a730
JB
6477 as_bad (_("no instruction mnemonic suffix given and "
6478 "no register operands; can't size `%s'"), i.tm.name);
9306ca4a
JB
6479 return 0;
6480 }
c006a730 6481 if (operand_check == check_warning)
873494c8
JB
6482 as_warn (_("%s; using default for `%s'"),
6483 intel_syntax
6484 ? _("ambiguous operand size")
6485 : _("no instruction mnemonic suffix given and "
6486 "no register operands"),
6487 i.tm.name);
c006a730
JB
6488
6489 if (i.tm.opcode_modifier.floatmf)
6490 i.suffix = SHORT_MNEM_SUFFIX;
6491 else if (flag_code == CODE_16BIT)
6492 i.suffix = WORD_MNEM_SUFFIX;
1a035124 6493 else if (!i.tm.opcode_modifier.no_lsuf)
c006a730 6494 i.suffix = LONG_MNEM_SUFFIX;
1a035124
JB
6495 else
6496 i.suffix = QWORD_MNEM_SUFFIX;
9306ca4a 6497 }
29b0f896 6498 }
252b5132 6499
50128d0c
JB
6500 if (!i.tm.opcode_modifier.modrm && i.reg_operands && i.tm.operands < 3)
6501 i.short_form = (i.tm.operand_types[0].bitfield.class == Reg)
6502 != (i.tm.operand_types[1].bitfield.class == Reg);
6503
d2224064
JB
6504 /* Change the opcode based on the operand size given by i.suffix. */
6505 switch (i.suffix)
29b0f896 6506 {
d2224064
JB
6507 /* Size floating point instruction. */
6508 case LONG_MNEM_SUFFIX:
6509 if (i.tm.opcode_modifier.floatmf)
6510 {
6511 i.tm.base_opcode ^= 4;
6512 break;
6513 }
6514 /* fall through */
6515 case WORD_MNEM_SUFFIX:
6516 case QWORD_MNEM_SUFFIX:
29b0f896 6517 /* It's not a byte, select word/dword operation. */
40fb9820 6518 if (i.tm.opcode_modifier.w)
29b0f896 6519 {
50128d0c 6520 if (i.short_form)
29b0f896
AM
6521 i.tm.base_opcode |= 8;
6522 else
6523 i.tm.base_opcode |= 1;
6524 }
d2224064
JB
6525 /* fall through */
6526 case SHORT_MNEM_SUFFIX:
29b0f896
AM
6527 /* Now select between word & dword operations via the operand
6528 size prefix, except for instructions that will ignore this
6529 prefix anyway. */
75c0a438 6530 if (i.reg_operands > 0
bab6aec1 6531 && i.types[0].bitfield.class == Reg
75c0a438 6532 && i.tm.opcode_modifier.addrprefixopreg
474da251 6533 && (i.tm.operand_types[0].bitfield.instance == Accum
75c0a438 6534 || i.operands == 1))
cb712a9e 6535 {
ca61edf2
L
6536 /* The address size override prefix changes the size of the
6537 first operand. */
40fb9820 6538 if ((flag_code == CODE_32BIT
75c0a438 6539 && i.op[0].regs->reg_type.bitfield.word)
40fb9820 6540 || (flag_code != CODE_32BIT
75c0a438 6541 && i.op[0].regs->reg_type.bitfield.dword))
cb712a9e
L
6542 if (!add_prefix (ADDR_PREFIX_OPCODE))
6543 return 0;
6544 }
6545 else if (i.suffix != QWORD_MNEM_SUFFIX
40fb9820
L
6546 && !i.tm.opcode_modifier.ignoresize
6547 && !i.tm.opcode_modifier.floatmf
a38d7118 6548 && !is_any_vex_encoding (&i.tm)
cb712a9e
L
6549 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
6550 || (flag_code == CODE_64BIT
0cfa3eb3 6551 && i.tm.opcode_modifier.jump == JUMP_BYTE)))
24eab124
AM
6552 {
6553 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 6554
0cfa3eb3 6555 if (i.tm.opcode_modifier.jump == JUMP_BYTE) /* jcxz, loop */
29b0f896 6556 prefix = ADDR_PREFIX_OPCODE;
252b5132 6557
29b0f896
AM
6558 if (!add_prefix (prefix))
6559 return 0;
24eab124 6560 }
252b5132 6561
29b0f896
AM
6562 /* Set mode64 for an operand. */
6563 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 6564 && flag_code == CODE_64BIT
d2224064 6565 && !i.tm.opcode_modifier.norex64
46e883c5 6566 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
6567 need rex64. */
6568 && ! (i.operands == 2
6569 && i.tm.base_opcode == 0x90
6570 && i.tm.extension_opcode == None
75e5731b
JB
6571 && i.types[0].bitfield.instance == Accum
6572 && i.types[0].bitfield.qword
6573 && i.types[1].bitfield.instance == Accum
6574 && i.types[1].bitfield.qword))
d2224064 6575 i.rex |= REX_W;
3e73aa7c 6576
d2224064 6577 break;
29b0f896 6578 }
7ecd2f8b 6579
c0a30a9f
L
6580 if (i.reg_operands != 0
6581 && i.operands > 1
6582 && i.tm.opcode_modifier.addrprefixopreg
474da251 6583 && i.tm.operand_types[0].bitfield.instance != Accum)
c0a30a9f
L
6584 {
6585 /* Check invalid register operand when the address size override
6586 prefix changes the size of register operands. */
6587 unsigned int op;
6588 enum { need_word, need_dword, need_qword } need;
6589
6590 if (flag_code == CODE_32BIT)
6591 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
6592 else
6593 {
6594 if (i.prefix[ADDR_PREFIX])
6595 need = need_dword;
6596 else
6597 need = flag_code == CODE_64BIT ? need_qword : need_word;
6598 }
6599
6600 for (op = 0; op < i.operands; op++)
bab6aec1 6601 if (i.types[op].bitfield.class == Reg
c0a30a9f
L
6602 && ((need == need_word
6603 && !i.op[op].regs->reg_type.bitfield.word)
6604 || (need == need_dword
6605 && !i.op[op].regs->reg_type.bitfield.dword)
6606 || (need == need_qword
6607 && !i.op[op].regs->reg_type.bitfield.qword)))
6608 {
6609 as_bad (_("invalid register operand size for `%s'"),
6610 i.tm.name);
6611 return 0;
6612 }
6613 }
6614
29b0f896
AM
6615 return 1;
6616}
3e73aa7c 6617
29b0f896 6618static int
543613e9 6619check_byte_reg (void)
29b0f896
AM
6620{
6621 int op;
543613e9 6622
29b0f896
AM
6623 for (op = i.operands; --op >= 0;)
6624 {
dc821c5f 6625 /* Skip non-register operands. */
bab6aec1 6626 if (i.types[op].bitfield.class != Reg)
dc821c5f
JB
6627 continue;
6628
29b0f896
AM
6629 /* If this is an eight bit register, it's OK. If it's the 16 or
6630 32 bit version of an eight bit register, we will just use the
6631 low portion, and that's OK too. */
dc821c5f 6632 if (i.types[op].bitfield.byte)
29b0f896
AM
6633 continue;
6634
5a819eb9 6635 /* I/O port address operands are OK too. */
75e5731b
JB
6636 if (i.tm.operand_types[op].bitfield.instance == RegD
6637 && i.tm.operand_types[op].bitfield.word)
5a819eb9
JB
6638 continue;
6639
9344ff29
L
6640 /* crc32 doesn't generate this warning. */
6641 if (i.tm.base_opcode == 0xf20f38f0)
6642 continue;
6643
dc821c5f
JB
6644 if ((i.types[op].bitfield.word
6645 || i.types[op].bitfield.dword
6646 || i.types[op].bitfield.qword)
5a819eb9
JB
6647 && i.op[op].regs->reg_num < 4
6648 /* Prohibit these changes in 64bit mode, since the lowering
6649 would be more complicated. */
6650 && flag_code != CODE_64BIT)
29b0f896 6651 {
29b0f896 6652#if REGISTER_WARNINGS
5a819eb9 6653 if (!quiet_warnings)
a540244d
L
6654 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
6655 register_prefix,
dc821c5f 6656 (i.op[op].regs + (i.types[op].bitfield.word
29b0f896
AM
6657 ? REGNAM_AL - REGNAM_AX
6658 : REGNAM_AL - REGNAM_EAX))->reg_name,
a540244d 6659 register_prefix,
29b0f896
AM
6660 i.op[op].regs->reg_name,
6661 i.suffix);
6662#endif
6663 continue;
6664 }
6665 /* Any other register is bad. */
bab6aec1 6666 if (i.types[op].bitfield.class == Reg
3528c362
JB
6667 || i.types[op].bitfield.class == RegMMX
6668 || i.types[op].bitfield.class == RegSIMD
00cee14f 6669 || i.types[op].bitfield.class == SReg
4a5c67ed
JB
6670 || i.types[op].bitfield.class == RegCR
6671 || i.types[op].bitfield.class == RegDR
6672 || i.types[op].bitfield.class == RegTR)
29b0f896 6673 {
a540244d
L
6674 as_bad (_("`%s%s' not allowed with `%s%c'"),
6675 register_prefix,
29b0f896
AM
6676 i.op[op].regs->reg_name,
6677 i.tm.name,
6678 i.suffix);
6679 return 0;
6680 }
6681 }
6682 return 1;
6683}
6684
6685static int
e3bb37b5 6686check_long_reg (void)
29b0f896
AM
6687{
6688 int op;
6689
6690 for (op = i.operands; --op >= 0;)
dc821c5f 6691 /* Skip non-register operands. */
bab6aec1 6692 if (i.types[op].bitfield.class != Reg)
dc821c5f 6693 continue;
29b0f896
AM
6694 /* Reject eight bit registers, except where the template requires
6695 them. (eg. movzb) */
dc821c5f 6696 else if (i.types[op].bitfield.byte
bab6aec1 6697 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6698 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
6699 && (i.tm.operand_types[op].bitfield.word
6700 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6701 {
a540244d
L
6702 as_bad (_("`%s%s' not allowed with `%s%c'"),
6703 register_prefix,
29b0f896
AM
6704 i.op[op].regs->reg_name,
6705 i.tm.name,
6706 i.suffix);
6707 return 0;
6708 }
be4c5e58
L
6709 /* Error if the e prefix on a general reg is missing. */
6710 else if (i.types[op].bitfield.word
bab6aec1 6711 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6712 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 6713 && i.tm.operand_types[op].bitfield.dword)
29b0f896 6714 {
be4c5e58
L
6715 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
6716 register_prefix, i.op[op].regs->reg_name,
6717 i.suffix);
6718 return 0;
252b5132 6719 }
e4630f71 6720 /* Warn if the r prefix on a general reg is present. */
dc821c5f 6721 else if (i.types[op].bitfield.qword
bab6aec1 6722 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6723 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 6724 && i.tm.operand_types[op].bitfield.dword)
252b5132 6725 {
34828aad 6726 if (intel_syntax
bc31405e
L
6727 && (i.tm.opcode_modifier.toqword
6728 /* Also convert to QWORD for MOVSXD. */
6729 || i.tm.base_opcode == 0x63)
3528c362 6730 && i.types[0].bitfield.class != RegSIMD)
34828aad 6731 {
ca61edf2 6732 /* Convert to QWORD. We want REX byte. */
34828aad
L
6733 i.suffix = QWORD_MNEM_SUFFIX;
6734 }
6735 else
6736 {
2b5d6a91 6737 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
6738 register_prefix, i.op[op].regs->reg_name,
6739 i.suffix);
6740 return 0;
6741 }
29b0f896
AM
6742 }
6743 return 1;
6744}
252b5132 6745
29b0f896 6746static int
e3bb37b5 6747check_qword_reg (void)
29b0f896
AM
6748{
6749 int op;
252b5132 6750
29b0f896 6751 for (op = i.operands; --op >= 0; )
dc821c5f 6752 /* Skip non-register operands. */
bab6aec1 6753 if (i.types[op].bitfield.class != Reg)
dc821c5f 6754 continue;
29b0f896
AM
6755 /* Reject eight bit registers, except where the template requires
6756 them. (eg. movzb) */
dc821c5f 6757 else if (i.types[op].bitfield.byte
bab6aec1 6758 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6759 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
6760 && (i.tm.operand_types[op].bitfield.word
6761 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6762 {
a540244d
L
6763 as_bad (_("`%s%s' not allowed with `%s%c'"),
6764 register_prefix,
29b0f896
AM
6765 i.op[op].regs->reg_name,
6766 i.tm.name,
6767 i.suffix);
6768 return 0;
6769 }
e4630f71 6770 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
6771 else if ((i.types[op].bitfield.word
6772 || i.types[op].bitfield.dword)
bab6aec1 6773 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6774 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 6775 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
6776 {
6777 /* Prohibit these changes in the 64bit mode, since the
6778 lowering is more complicated. */
34828aad 6779 if (intel_syntax
ca61edf2 6780 && i.tm.opcode_modifier.todword
3528c362 6781 && i.types[0].bitfield.class != RegSIMD)
34828aad 6782 {
ca61edf2 6783 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
6784 i.suffix = LONG_MNEM_SUFFIX;
6785 }
6786 else
6787 {
2b5d6a91 6788 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
6789 register_prefix, i.op[op].regs->reg_name,
6790 i.suffix);
6791 return 0;
6792 }
252b5132 6793 }
29b0f896
AM
6794 return 1;
6795}
252b5132 6796
29b0f896 6797static int
e3bb37b5 6798check_word_reg (void)
29b0f896
AM
6799{
6800 int op;
6801 for (op = i.operands; --op >= 0;)
dc821c5f 6802 /* Skip non-register operands. */
bab6aec1 6803 if (i.types[op].bitfield.class != Reg)
dc821c5f 6804 continue;
29b0f896
AM
6805 /* Reject eight bit registers, except where the template requires
6806 them. (eg. movzb) */
dc821c5f 6807 else if (i.types[op].bitfield.byte
bab6aec1 6808 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6809 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f
JB
6810 && (i.tm.operand_types[op].bitfield.word
6811 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6812 {
a540244d
L
6813 as_bad (_("`%s%s' not allowed with `%s%c'"),
6814 register_prefix,
29b0f896
AM
6815 i.op[op].regs->reg_name,
6816 i.tm.name,
6817 i.suffix);
6818 return 0;
6819 }
e4630f71 6820 /* Warn if the e or r prefix on a general reg is present. */
29b0f896 6821 else if ((!quiet_warnings || flag_code == CODE_64BIT)
dc821c5f
JB
6822 && (i.types[op].bitfield.dword
6823 || i.types[op].bitfield.qword)
bab6aec1 6824 && (i.tm.operand_types[op].bitfield.class == Reg
75e5731b 6825 || i.tm.operand_types[op].bitfield.instance == Accum)
dc821c5f 6826 && i.tm.operand_types[op].bitfield.word)
252b5132 6827 {
29b0f896
AM
6828 /* Prohibit these changes in the 64bit mode, since the
6829 lowering is more complicated. */
6830 if (flag_code == CODE_64BIT)
252b5132 6831 {
2b5d6a91 6832 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
2ca3ace5 6833 register_prefix, i.op[op].regs->reg_name,
29b0f896
AM
6834 i.suffix);
6835 return 0;
252b5132 6836 }
29b0f896 6837#if REGISTER_WARNINGS
cecf1424
JB
6838 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
6839 register_prefix,
6840 (i.op[op].regs + REGNAM_AX - REGNAM_EAX)->reg_name,
6841 register_prefix, i.op[op].regs->reg_name, i.suffix);
29b0f896
AM
6842#endif
6843 }
6844 return 1;
6845}
252b5132 6846
29b0f896 6847static int
40fb9820 6848update_imm (unsigned int j)
29b0f896 6849{
bc0844ae 6850 i386_operand_type overlap = i.types[j];
40fb9820
L
6851 if ((overlap.bitfield.imm8
6852 || overlap.bitfield.imm8s
6853 || overlap.bitfield.imm16
6854 || overlap.bitfield.imm32
6855 || overlap.bitfield.imm32s
6856 || overlap.bitfield.imm64)
0dfbf9d7
L
6857 && !operand_type_equal (&overlap, &imm8)
6858 && !operand_type_equal (&overlap, &imm8s)
6859 && !operand_type_equal (&overlap, &imm16)
6860 && !operand_type_equal (&overlap, &imm32)
6861 && !operand_type_equal (&overlap, &imm32s)
6862 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
6863 {
6864 if (i.suffix)
6865 {
40fb9820
L
6866 i386_operand_type temp;
6867
0dfbf9d7 6868 operand_type_set (&temp, 0);
7ab9ffdd 6869 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
6870 {
6871 temp.bitfield.imm8 = overlap.bitfield.imm8;
6872 temp.bitfield.imm8s = overlap.bitfield.imm8s;
6873 }
6874 else if (i.suffix == WORD_MNEM_SUFFIX)
6875 temp.bitfield.imm16 = overlap.bitfield.imm16;
6876 else if (i.suffix == QWORD_MNEM_SUFFIX)
6877 {
6878 temp.bitfield.imm64 = overlap.bitfield.imm64;
6879 temp.bitfield.imm32s = overlap.bitfield.imm32s;
6880 }
6881 else
6882 temp.bitfield.imm32 = overlap.bitfield.imm32;
6883 overlap = temp;
29b0f896 6884 }
0dfbf9d7
L
6885 else if (operand_type_equal (&overlap, &imm16_32_32s)
6886 || operand_type_equal (&overlap, &imm16_32)
6887 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 6888 {
40fb9820 6889 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 6890 overlap = imm16;
40fb9820 6891 else
65da13b5 6892 overlap = imm32s;
29b0f896 6893 }
0dfbf9d7
L
6894 if (!operand_type_equal (&overlap, &imm8)
6895 && !operand_type_equal (&overlap, &imm8s)
6896 && !operand_type_equal (&overlap, &imm16)
6897 && !operand_type_equal (&overlap, &imm32)
6898 && !operand_type_equal (&overlap, &imm32s)
6899 && !operand_type_equal (&overlap, &imm64))
29b0f896 6900 {
4eed87de
AM
6901 as_bad (_("no instruction mnemonic suffix given; "
6902 "can't determine immediate size"));
29b0f896
AM
6903 return 0;
6904 }
6905 }
40fb9820 6906 i.types[j] = overlap;
29b0f896 6907
40fb9820
L
6908 return 1;
6909}
6910
6911static int
6912finalize_imm (void)
6913{
bc0844ae 6914 unsigned int j, n;
29b0f896 6915
bc0844ae
L
6916 /* Update the first 2 immediate operands. */
6917 n = i.operands > 2 ? 2 : i.operands;
6918 if (n)
6919 {
6920 for (j = 0; j < n; j++)
6921 if (update_imm (j) == 0)
6922 return 0;
40fb9820 6923
bc0844ae
L
6924 /* The 3rd operand can't be immediate operand. */
6925 gas_assert (operand_type_check (i.types[2], imm) == 0);
6926 }
29b0f896
AM
6927
6928 return 1;
6929}
6930
6931static int
e3bb37b5 6932process_operands (void)
29b0f896
AM
6933{
6934 /* Default segment register this instruction will use for memory
6935 accesses. 0 means unknown. This is only for optimizing out
6936 unnecessary segment overrides. */
6937 const seg_entry *default_seg = 0;
6938
2426c15f 6939 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 6940 {
91d6fa6a
NC
6941 unsigned int dupl = i.operands;
6942 unsigned int dest = dupl - 1;
9fcfb3d7
L
6943 unsigned int j;
6944
c0f3af97 6945 /* The destination must be an xmm register. */
9c2799c2 6946 gas_assert (i.reg_operands
91d6fa6a 6947 && MAX_OPERANDS > dupl
7ab9ffdd 6948 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 6949
75e5731b 6950 if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 6951 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 6952 {
8cd7925b 6953 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
6954 {
6955 /* Keep xmm0 for instructions with VEX prefix and 3
6956 sources. */
75e5731b 6957 i.tm.operand_types[0].bitfield.instance = InstanceNone;
3528c362 6958 i.tm.operand_types[0].bitfield.class = RegSIMD;
c0f3af97
L
6959 goto duplicate;
6960 }
e2ec9d29 6961 else
c0f3af97
L
6962 {
6963 /* We remove the first xmm0 and keep the number of
6964 operands unchanged, which in fact duplicates the
6965 destination. */
6966 for (j = 1; j < i.operands; j++)
6967 {
6968 i.op[j - 1] = i.op[j];
6969 i.types[j - 1] = i.types[j];
6970 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
8dc0818e 6971 i.flags[j - 1] = i.flags[j];
c0f3af97
L
6972 }
6973 }
6974 }
6975 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 6976 {
91d6fa6a 6977 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
6978 && (i.tm.opcode_modifier.vexsources
6979 == VEX3SOURCES));
c0f3af97
L
6980
6981 /* Add the implicit xmm0 for instructions with VEX prefix
6982 and 3 sources. */
6983 for (j = i.operands; j > 0; j--)
6984 {
6985 i.op[j] = i.op[j - 1];
6986 i.types[j] = i.types[j - 1];
6987 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
8dc0818e 6988 i.flags[j] = i.flags[j - 1];
c0f3af97
L
6989 }
6990 i.op[0].regs
6991 = (const reg_entry *) hash_find (reg_hash, "xmm0");
7ab9ffdd 6992 i.types[0] = regxmm;
c0f3af97
L
6993 i.tm.operand_types[0] = regxmm;
6994
6995 i.operands += 2;
6996 i.reg_operands += 2;
6997 i.tm.operands += 2;
6998
91d6fa6a 6999 dupl++;
c0f3af97 7000 dest++;
91d6fa6a
NC
7001 i.op[dupl] = i.op[dest];
7002 i.types[dupl] = i.types[dest];
7003 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7004 i.flags[dupl] = i.flags[dest];
e2ec9d29 7005 }
c0f3af97
L
7006 else
7007 {
7008duplicate:
7009 i.operands++;
7010 i.reg_operands++;
7011 i.tm.operands++;
7012
91d6fa6a
NC
7013 i.op[dupl] = i.op[dest];
7014 i.types[dupl] = i.types[dest];
7015 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
8dc0818e 7016 i.flags[dupl] = i.flags[dest];
c0f3af97
L
7017 }
7018
7019 if (i.tm.opcode_modifier.immext)
7020 process_immext ();
7021 }
75e5731b 7022 else if (i.tm.operand_types[0].bitfield.instance == Accum
1b54b8d7 7023 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
7024 {
7025 unsigned int j;
7026
9fcfb3d7
L
7027 for (j = 1; j < i.operands; j++)
7028 {
7029 i.op[j - 1] = i.op[j];
7030 i.types[j - 1] = i.types[j];
7031
7032 /* We need to adjust fields in i.tm since they are used by
7033 build_modrm_byte. */
7034 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
8dc0818e
JB
7035
7036 i.flags[j - 1] = i.flags[j];
9fcfb3d7
L
7037 }
7038
e2ec9d29
L
7039 i.operands--;
7040 i.reg_operands--;
e2ec9d29
L
7041 i.tm.operands--;
7042 }
920d2ddc
IT
7043 else if (i.tm.opcode_modifier.implicitquadgroup)
7044 {
a477a8c4
JB
7045 unsigned int regnum, first_reg_in_group, last_reg_in_group;
7046
920d2ddc 7047 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
3528c362 7048 gas_assert (i.operands >= 2 && i.types[1].bitfield.class == RegSIMD);
a477a8c4
JB
7049 regnum = register_number (i.op[1].regs);
7050 first_reg_in_group = regnum & ~3;
7051 last_reg_in_group = first_reg_in_group + 3;
7052 if (regnum != first_reg_in_group)
7053 as_warn (_("source register `%s%s' implicitly denotes"
7054 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
7055 register_prefix, i.op[1].regs->reg_name,
7056 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
7057 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
7058 i.tm.name);
7059 }
e2ec9d29
L
7060 else if (i.tm.opcode_modifier.regkludge)
7061 {
7062 /* The imul $imm, %reg instruction is converted into
7063 imul $imm, %reg, %reg, and the clr %reg instruction
7064 is converted into xor %reg, %reg. */
7065
7066 unsigned int first_reg_op;
7067
7068 if (operand_type_check (i.types[0], reg))
7069 first_reg_op = 0;
7070 else
7071 first_reg_op = 1;
7072 /* Pretend we saw the extra register operand. */
9c2799c2 7073 gas_assert (i.reg_operands == 1
7ab9ffdd 7074 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
7075 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
7076 i.types[first_reg_op + 1] = i.types[first_reg_op];
7077 i.operands++;
7078 i.reg_operands++;
29b0f896
AM
7079 }
7080
85b80b0f 7081 if (i.tm.opcode_modifier.modrm)
29b0f896
AM
7082 {
7083 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
7084 must be put into the modrm byte). Now, we make the modrm and
7085 index base bytes based on all the info we've collected. */
29b0f896
AM
7086
7087 default_seg = build_modrm_byte ();
7088 }
00cee14f 7089 else if (i.types[0].bitfield.class == SReg)
85b80b0f
JB
7090 {
7091 if (flag_code != CODE_64BIT
7092 ? i.tm.base_opcode == POP_SEG_SHORT
7093 && i.op[0].regs->reg_num == 1
7094 : (i.tm.base_opcode | 1) == POP_SEG386_SHORT
7095 && i.op[0].regs->reg_num < 4)
7096 {
7097 as_bad (_("you can't `%s %s%s'"),
7098 i.tm.name, register_prefix, i.op[0].regs->reg_name);
7099 return 0;
7100 }
7101 if ( i.op[0].regs->reg_num > 3 && i.tm.opcode_length == 1 )
7102 {
7103 i.tm.base_opcode ^= POP_SEG_SHORT ^ POP_SEG386_SHORT;
7104 i.tm.opcode_length = 2;
7105 }
7106 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
7107 }
8a2ed489 7108 else if ((i.tm.base_opcode & ~0x3) == MOV_AX_DISP32)
29b0f896
AM
7109 {
7110 default_seg = &ds;
7111 }
40fb9820 7112 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
7113 {
7114 /* For the string instructions that allow a segment override
7115 on one of their operands, the default segment is ds. */
7116 default_seg = &ds;
7117 }
50128d0c 7118 else if (i.short_form)
85b80b0f
JB
7119 {
7120 /* The register or float register operand is in operand
7121 0 or 1. */
bab6aec1 7122 unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
85b80b0f
JB
7123
7124 /* Register goes in low 3 bits of opcode. */
7125 i.tm.base_opcode |= i.op[op].regs->reg_num;
7126 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7127 i.rex |= REX_B;
7128 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
7129 {
7130 /* Warn about some common errors, but press on regardless.
7131 The first case can be generated by gcc (<= 2.8.1). */
7132 if (i.operands == 2)
7133 {
7134 /* Reversed arguments on faddp, fsubp, etc. */
7135 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
7136 register_prefix, i.op[!intel_syntax].regs->reg_name,
7137 register_prefix, i.op[intel_syntax].regs->reg_name);
7138 }
7139 else
7140 {
7141 /* Extraneous `l' suffix on fp insn. */
7142 as_warn (_("translating to `%s %s%s'"), i.tm.name,
7143 register_prefix, i.op[0].regs->reg_name);
7144 }
7145 }
7146 }
29b0f896 7147
75178d9d
L
7148 if (i.tm.base_opcode == 0x8d /* lea */
7149 && i.seg[0]
7150 && !quiet_warnings)
30123838 7151 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
52271982
AM
7152
7153 /* If a segment was explicitly specified, and the specified segment
7154 is not the default, use an opcode prefix to select it. If we
7155 never figured out what the default segment is, then default_seg
7156 will be zero at this point, and the specified segment prefix will
7157 always be used. */
29b0f896
AM
7158 if ((i.seg[0]) && (i.seg[0] != default_seg))
7159 {
7160 if (!add_prefix (i.seg[0]->seg_prefix))
7161 return 0;
7162 }
7163 return 1;
7164}
7165
7166static const seg_entry *
e3bb37b5 7167build_modrm_byte (void)
29b0f896
AM
7168{
7169 const seg_entry *default_seg = 0;
c0f3af97 7170 unsigned int source, dest;
8cd7925b 7171 int vex_3_sources;
c0f3af97 7172
8cd7925b 7173 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
7174 if (vex_3_sources)
7175 {
91d6fa6a 7176 unsigned int nds, reg_slot;
4c2c6516 7177 expressionS *exp;
c0f3af97 7178
6b8d3588 7179 dest = i.operands - 1;
c0f3af97 7180 nds = dest - 1;
922d8de8 7181
a683cc34 7182 /* There are 2 kinds of instructions:
bed3d976 7183 1. 5 operands: 4 register operands or 3 register operands
9d3bf266 7184 plus 1 memory operand plus one Imm4 operand, VexXDS, and
bed3d976 7185 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 7186 ZMM register.
bed3d976 7187 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 7188 plus 1 memory operand, with VexXDS. */
922d8de8 7189 gas_assert ((i.reg_operands == 4
bed3d976
JB
7190 || (i.reg_operands == 3 && i.mem_operands == 1))
7191 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323 7192 && i.tm.opcode_modifier.vexw
3528c362 7193 && i.tm.operand_types[dest].bitfield.class == RegSIMD);
a683cc34 7194
48db9223
JB
7195 /* If VexW1 is set, the first non-immediate operand is the source and
7196 the second non-immediate one is encoded in the immediate operand. */
7197 if (i.tm.opcode_modifier.vexw == VEXW1)
7198 {
7199 source = i.imm_operands;
7200 reg_slot = i.imm_operands + 1;
7201 }
7202 else
7203 {
7204 source = i.imm_operands + 1;
7205 reg_slot = i.imm_operands;
7206 }
7207
a683cc34 7208 if (i.imm_operands == 0)
bed3d976
JB
7209 {
7210 /* When there is no immediate operand, generate an 8bit
7211 immediate operand to encode the first operand. */
7212 exp = &im_expressions[i.imm_operands++];
7213 i.op[i.operands].imms = exp;
7214 i.types[i.operands] = imm8;
7215 i.operands++;
7216
3528c362 7217 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
bed3d976
JB
7218 exp->X_op = O_constant;
7219 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
7220 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
7221 }
922d8de8 7222 else
bed3d976 7223 {
9d3bf266
JB
7224 gas_assert (i.imm_operands == 1);
7225 gas_assert (fits_in_imm4 (i.op[0].imms->X_add_number));
7226 gas_assert (!i.tm.opcode_modifier.immext);
a683cc34 7227
9d3bf266
JB
7228 /* Turn on Imm8 again so that output_imm will generate it. */
7229 i.types[0].bitfield.imm8 = 1;
bed3d976 7230
3528c362 7231 gas_assert (i.tm.operand_types[reg_slot].bitfield.class == RegSIMD);
9d3bf266 7232 i.op[0].imms->X_add_number
bed3d976 7233 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 7234 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 7235 }
a683cc34 7236
3528c362 7237 gas_assert (i.tm.operand_types[nds].bitfield.class == RegSIMD);
dae39acc 7238 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
7239 }
7240 else
7241 source = dest = 0;
29b0f896
AM
7242
7243 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
7244 implicit registers do not count. If there are 3 register
7245 operands, it must be a instruction with VexNDS. For a
7246 instruction with VexNDD, the destination register is encoded
7247 in VEX prefix. If there are 4 register operands, it must be
7248 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
7249 if (i.mem_operands == 0
7250 && ((i.reg_operands == 2
2426c15f 7251 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 7252 || (i.reg_operands == 3
2426c15f 7253 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 7254 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 7255 {
cab737b9
L
7256 switch (i.operands)
7257 {
7258 case 2:
7259 source = 0;
7260 break;
7261 case 3:
c81128dc
L
7262 /* When there are 3 operands, one of them may be immediate,
7263 which may be the first or the last operand. Otherwise,
c0f3af97
L
7264 the first operand must be shift count register (cl) or it
7265 is an instruction with VexNDS. */
9c2799c2 7266 gas_assert (i.imm_operands == 1
7ab9ffdd 7267 || (i.imm_operands == 0
2426c15f 7268 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
75e5731b
JB
7269 || (i.types[0].bitfield.instance == RegC
7270 && i.types[0].bitfield.byte))));
40fb9820 7271 if (operand_type_check (i.types[0], imm)
75e5731b
JB
7272 || (i.types[0].bitfield.instance == RegC
7273 && i.types[0].bitfield.byte))
40fb9820
L
7274 source = 1;
7275 else
7276 source = 0;
cab737b9
L
7277 break;
7278 case 4:
368d64cc
L
7279 /* When there are 4 operands, the first two must be 8bit
7280 immediate operands. The source operand will be the 3rd
c0f3af97
L
7281 one.
7282
7283 For instructions with VexNDS, if the first operand
7284 an imm8, the source operand is the 2nd one. If the last
7285 operand is imm8, the source operand is the first one. */
9c2799c2 7286 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
7287 && i.types[0].bitfield.imm8
7288 && i.types[1].bitfield.imm8)
2426c15f 7289 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
7290 && i.imm_operands == 1
7291 && (i.types[0].bitfield.imm8
43234a1e
L
7292 || i.types[i.operands - 1].bitfield.imm8
7293 || i.rounding)));
9f2670f2
L
7294 if (i.imm_operands == 2)
7295 source = 2;
7296 else
c0f3af97
L
7297 {
7298 if (i.types[0].bitfield.imm8)
7299 source = 1;
7300 else
7301 source = 0;
7302 }
c0f3af97
L
7303 break;
7304 case 5:
e771e7c9 7305 if (is_evex_encoding (&i.tm))
43234a1e
L
7306 {
7307 /* For EVEX instructions, when there are 5 operands, the
7308 first one must be immediate operand. If the second one
7309 is immediate operand, the source operand is the 3th
7310 one. If the last one is immediate operand, the source
7311 operand is the 2nd one. */
7312 gas_assert (i.imm_operands == 2
7313 && i.tm.opcode_modifier.sae
7314 && operand_type_check (i.types[0], imm));
7315 if (operand_type_check (i.types[1], imm))
7316 source = 2;
7317 else if (operand_type_check (i.types[4], imm))
7318 source = 1;
7319 else
7320 abort ();
7321 }
cab737b9
L
7322 break;
7323 default:
7324 abort ();
7325 }
7326
c0f3af97
L
7327 if (!vex_3_sources)
7328 {
7329 dest = source + 1;
7330
43234a1e
L
7331 /* RC/SAE operand could be between DEST and SRC. That happens
7332 when one operand is GPR and the other one is XMM/YMM/ZMM
7333 register. */
7334 if (i.rounding && i.rounding->operand == (int) dest)
7335 dest++;
7336
2426c15f 7337 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 7338 {
43234a1e 7339 /* For instructions with VexNDS, the register-only source
c5d0745b 7340 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
dfd69174 7341 register. It is encoded in VEX prefix. */
f12dc422
L
7342
7343 i386_operand_type op;
7344 unsigned int vvvv;
7345
7346 /* Check register-only source operand when two source
7347 operands are swapped. */
7348 if (!i.tm.operand_types[source].bitfield.baseindex
7349 && i.tm.operand_types[dest].bitfield.baseindex)
7350 {
7351 vvvv = source;
7352 source = dest;
7353 }
7354 else
7355 vvvv = dest;
7356
7357 op = i.tm.operand_types[vvvv];
c0f3af97 7358 if ((dest + 1) >= i.operands
bab6aec1 7359 || ((op.bitfield.class != Reg
dc821c5f 7360 || (!op.bitfield.dword && !op.bitfield.qword))
3528c362 7361 && op.bitfield.class != RegSIMD
43234a1e 7362 && !operand_type_equal (&op, &regmask)))
c0f3af97 7363 abort ();
f12dc422 7364 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
7365 dest++;
7366 }
7367 }
29b0f896
AM
7368
7369 i.rm.mode = 3;
dfd69174
JB
7370 /* One of the register operands will be encoded in the i.rm.reg
7371 field, the other in the combined i.rm.mode and i.rm.regmem
29b0f896
AM
7372 fields. If no form of this instruction supports a memory
7373 destination operand, then we assume the source operand may
7374 sometimes be a memory operand and so we need to store the
7375 destination in the i.rm.reg field. */
dfd69174 7376 if (!i.tm.opcode_modifier.regmem
40fb9820 7377 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
7378 {
7379 i.rm.reg = i.op[dest].regs->reg_num;
7380 i.rm.regmem = i.op[source].regs->reg_num;
3528c362
JB
7381 if (i.op[dest].regs->reg_type.bitfield.class == RegMMX
7382 || i.op[source].regs->reg_type.bitfield.class == RegMMX)
b4a3a7b4 7383 i.has_regmmx = TRUE;
3528c362
JB
7384 else if (i.op[dest].regs->reg_type.bitfield.class == RegSIMD
7385 || i.op[source].regs->reg_type.bitfield.class == RegSIMD)
b4a3a7b4
L
7386 {
7387 if (i.types[dest].bitfield.zmmword
7388 || i.types[source].bitfield.zmmword)
7389 i.has_regzmm = TRUE;
7390 else if (i.types[dest].bitfield.ymmword
7391 || i.types[source].bitfield.ymmword)
7392 i.has_regymm = TRUE;
7393 else
7394 i.has_regxmm = TRUE;
7395 }
29b0f896 7396 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 7397 i.rex |= REX_R;
43234a1e
L
7398 if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
7399 i.vrex |= REX_R;
29b0f896 7400 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 7401 i.rex |= REX_B;
43234a1e
L
7402 if ((i.op[source].regs->reg_flags & RegVRex) != 0)
7403 i.vrex |= REX_B;
29b0f896
AM
7404 }
7405 else
7406 {
7407 i.rm.reg = i.op[source].regs->reg_num;
7408 i.rm.regmem = i.op[dest].regs->reg_num;
7409 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 7410 i.rex |= REX_B;
43234a1e
L
7411 if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
7412 i.vrex |= REX_B;
29b0f896 7413 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 7414 i.rex |= REX_R;
43234a1e
L
7415 if ((i.op[source].regs->reg_flags & RegVRex) != 0)
7416 i.vrex |= REX_R;
29b0f896 7417 }
e0c7f900 7418 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 7419 {
4a5c67ed 7420 if (i.types[!i.tm.opcode_modifier.regmem].bitfield.class != RegCR)
c4a530c5 7421 abort ();
e0c7f900 7422 i.rex &= ~REX_R;
c4a530c5
JB
7423 add_prefix (LOCK_PREFIX_OPCODE);
7424 }
29b0f896
AM
7425 }
7426 else
7427 { /* If it's not 2 reg operands... */
c0f3af97
L
7428 unsigned int mem;
7429
29b0f896
AM
7430 if (i.mem_operands)
7431 {
7432 unsigned int fake_zero_displacement = 0;
99018f42 7433 unsigned int op;
4eed87de 7434
7ab9ffdd 7435 for (op = 0; op < i.operands; op++)
8dc0818e 7436 if (i.flags[op] & Operand_Mem)
7ab9ffdd 7437 break;
7ab9ffdd 7438 gas_assert (op < i.operands);
29b0f896 7439
6c30d220
L
7440 if (i.tm.opcode_modifier.vecsib)
7441 {
e968fc9b 7442 if (i.index_reg->reg_num == RegIZ)
6c30d220
L
7443 abort ();
7444
7445 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7446 if (!i.base_reg)
7447 {
7448 i.sib.base = NO_BASE_REGISTER;
7449 i.sib.scale = i.log2_scale_factor;
7450 i.types[op].bitfield.disp8 = 0;
7451 i.types[op].bitfield.disp16 = 0;
7452 i.types[op].bitfield.disp64 = 0;
43083a50 7453 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
6c30d220
L
7454 {
7455 /* Must be 32 bit */
7456 i.types[op].bitfield.disp32 = 1;
7457 i.types[op].bitfield.disp32s = 0;
7458 }
7459 else
7460 {
7461 i.types[op].bitfield.disp32 = 0;
7462 i.types[op].bitfield.disp32s = 1;
7463 }
7464 }
7465 i.sib.index = i.index_reg->reg_num;
7466 if ((i.index_reg->reg_flags & RegRex) != 0)
7467 i.rex |= REX_X;
43234a1e
L
7468 if ((i.index_reg->reg_flags & RegVRex) != 0)
7469 i.vrex |= REX_X;
6c30d220
L
7470 }
7471
29b0f896
AM
7472 default_seg = &ds;
7473
7474 if (i.base_reg == 0)
7475 {
7476 i.rm.mode = 0;
7477 if (!i.disp_operands)
9bb129e8 7478 fake_zero_displacement = 1;
29b0f896
AM
7479 if (i.index_reg == 0)
7480 {
73053c1f
JB
7481 i386_operand_type newdisp;
7482
6c30d220 7483 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 7484 /* Operand is just <disp> */
20f0a1fc 7485 if (flag_code == CODE_64BIT)
29b0f896
AM
7486 {
7487 /* 64bit mode overwrites the 32bit absolute
7488 addressing by RIP relative addressing and
7489 absolute addressing is encoded by one of the
7490 redundant SIB forms. */
7491 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7492 i.sib.base = NO_BASE_REGISTER;
7493 i.sib.index = NO_INDEX_REGISTER;
73053c1f 7494 newdisp = (!i.prefix[ADDR_PREFIX] ? disp32s : disp32);
20f0a1fc 7495 }
fc225355
L
7496 else if ((flag_code == CODE_16BIT)
7497 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
7498 {
7499 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 7500 newdisp = disp16;
20f0a1fc
NC
7501 }
7502 else
7503 {
7504 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 7505 newdisp = disp32;
29b0f896 7506 }
73053c1f
JB
7507 i.types[op] = operand_type_and_not (i.types[op], anydisp);
7508 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 7509 }
6c30d220 7510 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 7511 {
6c30d220 7512 /* !i.base_reg && i.index_reg */
e968fc9b 7513 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
7514 i.sib.index = NO_INDEX_REGISTER;
7515 else
7516 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
7517 i.sib.base = NO_BASE_REGISTER;
7518 i.sib.scale = i.log2_scale_factor;
7519 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
7520 i.types[op].bitfield.disp8 = 0;
7521 i.types[op].bitfield.disp16 = 0;
7522 i.types[op].bitfield.disp64 = 0;
43083a50 7523 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
40fb9820
L
7524 {
7525 /* Must be 32 bit */
7526 i.types[op].bitfield.disp32 = 1;
7527 i.types[op].bitfield.disp32s = 0;
7528 }
29b0f896 7529 else
40fb9820
L
7530 {
7531 i.types[op].bitfield.disp32 = 0;
7532 i.types[op].bitfield.disp32s = 1;
7533 }
29b0f896 7534 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 7535 i.rex |= REX_X;
29b0f896
AM
7536 }
7537 }
7538 /* RIP addressing for 64bit mode. */
e968fc9b 7539 else if (i.base_reg->reg_num == RegIP)
29b0f896 7540 {
6c30d220 7541 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 7542 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
7543 i.types[op].bitfield.disp8 = 0;
7544 i.types[op].bitfield.disp16 = 0;
7545 i.types[op].bitfield.disp32 = 0;
7546 i.types[op].bitfield.disp32s = 1;
7547 i.types[op].bitfield.disp64 = 0;
71903a11 7548 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
7549 if (! i.disp_operands)
7550 fake_zero_displacement = 1;
29b0f896 7551 }
dc821c5f 7552 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 7553 {
6c30d220 7554 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
7555 switch (i.base_reg->reg_num)
7556 {
7557 case 3: /* (%bx) */
7558 if (i.index_reg == 0)
7559 i.rm.regmem = 7;
7560 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
7561 i.rm.regmem = i.index_reg->reg_num - 6;
7562 break;
7563 case 5: /* (%bp) */
7564 default_seg = &ss;
7565 if (i.index_reg == 0)
7566 {
7567 i.rm.regmem = 6;
40fb9820 7568 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
7569 {
7570 /* fake (%bp) into 0(%bp) */
b5014f7a 7571 i.types[op].bitfield.disp8 = 1;
252b5132 7572 fake_zero_displacement = 1;
29b0f896
AM
7573 }
7574 }
7575 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
7576 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
7577 break;
7578 default: /* (%si) -> 4 or (%di) -> 5 */
7579 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
7580 }
7581 i.rm.mode = mode_from_disp_size (i.types[op]);
7582 }
7583 else /* i.base_reg and 32/64 bit mode */
7584 {
7585 if (flag_code == CODE_64BIT
40fb9820
L
7586 && operand_type_check (i.types[op], disp))
7587 {
73053c1f
JB
7588 i.types[op].bitfield.disp16 = 0;
7589 i.types[op].bitfield.disp64 = 0;
40fb9820 7590 if (i.prefix[ADDR_PREFIX] == 0)
73053c1f
JB
7591 {
7592 i.types[op].bitfield.disp32 = 0;
7593 i.types[op].bitfield.disp32s = 1;
7594 }
40fb9820 7595 else
73053c1f
JB
7596 {
7597 i.types[op].bitfield.disp32 = 1;
7598 i.types[op].bitfield.disp32s = 0;
7599 }
40fb9820 7600 }
20f0a1fc 7601
6c30d220
L
7602 if (!i.tm.opcode_modifier.vecsib)
7603 i.rm.regmem = i.base_reg->reg_num;
29b0f896 7604 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 7605 i.rex |= REX_B;
29b0f896
AM
7606 i.sib.base = i.base_reg->reg_num;
7607 /* x86-64 ignores REX prefix bit here to avoid decoder
7608 complications. */
848930b2
JB
7609 if (!(i.base_reg->reg_flags & RegRex)
7610 && (i.base_reg->reg_num == EBP_REG_NUM
7611 || i.base_reg->reg_num == ESP_REG_NUM))
29b0f896 7612 default_seg = &ss;
848930b2 7613 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 7614 {
848930b2 7615 fake_zero_displacement = 1;
b5014f7a 7616 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
7617 }
7618 i.sib.scale = i.log2_scale_factor;
7619 if (i.index_reg == 0)
7620 {
6c30d220 7621 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
7622 /* <disp>(%esp) becomes two byte modrm with no index
7623 register. We've already stored the code for esp
7624 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
7625 Any base register besides %esp will not use the
7626 extra modrm byte. */
7627 i.sib.index = NO_INDEX_REGISTER;
29b0f896 7628 }
6c30d220 7629 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 7630 {
e968fc9b 7631 if (i.index_reg->reg_num == RegIZ)
db51cc60
L
7632 i.sib.index = NO_INDEX_REGISTER;
7633 else
7634 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
7635 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7636 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 7637 i.rex |= REX_X;
29b0f896 7638 }
67a4f2b7
AO
7639
7640 if (i.disp_operands
7641 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
7642 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
7643 i.rm.mode = 0;
7644 else
a501d77e
L
7645 {
7646 if (!fake_zero_displacement
7647 && !i.disp_operands
7648 && i.disp_encoding)
7649 {
7650 fake_zero_displacement = 1;
7651 if (i.disp_encoding == disp_encoding_8bit)
7652 i.types[op].bitfield.disp8 = 1;
7653 else
7654 i.types[op].bitfield.disp32 = 1;
7655 }
7656 i.rm.mode = mode_from_disp_size (i.types[op]);
7657 }
29b0f896 7658 }
252b5132 7659
29b0f896
AM
7660 if (fake_zero_displacement)
7661 {
7662 /* Fakes a zero displacement assuming that i.types[op]
7663 holds the correct displacement size. */
7664 expressionS *exp;
7665
9c2799c2 7666 gas_assert (i.op[op].disps == 0);
29b0f896
AM
7667 exp = &disp_expressions[i.disp_operands++];
7668 i.op[op].disps = exp;
7669 exp->X_op = O_constant;
7670 exp->X_add_number = 0;
7671 exp->X_add_symbol = (symbolS *) 0;
7672 exp->X_op_symbol = (symbolS *) 0;
7673 }
c0f3af97
L
7674
7675 mem = op;
29b0f896 7676 }
c0f3af97
L
7677 else
7678 mem = ~0;
252b5132 7679
8c43a48b 7680 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
7681 {
7682 if (operand_type_check (i.types[0], imm))
7683 i.vex.register_specifier = NULL;
7684 else
7685 {
7686 /* VEX.vvvv encodes one of the sources when the first
7687 operand is not an immediate. */
1ef99a7b 7688 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
7689 i.vex.register_specifier = i.op[0].regs;
7690 else
7691 i.vex.register_specifier = i.op[1].regs;
7692 }
7693
7694 /* Destination is a XMM register encoded in the ModRM.reg
7695 and VEX.R bit. */
7696 i.rm.reg = i.op[2].regs->reg_num;
7697 if ((i.op[2].regs->reg_flags & RegRex) != 0)
7698 i.rex |= REX_R;
7699
7700 /* ModRM.rm and VEX.B encodes the other source. */
7701 if (!i.mem_operands)
7702 {
7703 i.rm.mode = 3;
7704
1ef99a7b 7705 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
7706 i.rm.regmem = i.op[1].regs->reg_num;
7707 else
7708 i.rm.regmem = i.op[0].regs->reg_num;
7709
7710 if ((i.op[1].regs->reg_flags & RegRex) != 0)
7711 i.rex |= REX_B;
7712 }
7713 }
2426c15f 7714 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
7715 {
7716 i.vex.register_specifier = i.op[2].regs;
7717 if (!i.mem_operands)
7718 {
7719 i.rm.mode = 3;
7720 i.rm.regmem = i.op[1].regs->reg_num;
7721 if ((i.op[1].regs->reg_flags & RegRex) != 0)
7722 i.rex |= REX_B;
7723 }
7724 }
29b0f896
AM
7725 /* Fill in i.rm.reg or i.rm.regmem field with register operand
7726 (if any) based on i.tm.extension_opcode. Again, we must be
7727 careful to make sure that segment/control/debug/test/MMX
7728 registers are coded into the i.rm.reg field. */
f88c9eb0 7729 else if (i.reg_operands)
29b0f896 7730 {
99018f42 7731 unsigned int op;
7ab9ffdd
L
7732 unsigned int vex_reg = ~0;
7733
7734 for (op = 0; op < i.operands; op++)
b4a3a7b4 7735 {
bab6aec1 7736 if (i.types[op].bitfield.class == Reg
f74a6307
JB
7737 || i.types[op].bitfield.class == RegBND
7738 || i.types[op].bitfield.class == RegMask
00cee14f 7739 || i.types[op].bitfield.class == SReg
4a5c67ed
JB
7740 || i.types[op].bitfield.class == RegCR
7741 || i.types[op].bitfield.class == RegDR
7742 || i.types[op].bitfield.class == RegTR)
b4a3a7b4 7743 break;
3528c362 7744 if (i.types[op].bitfield.class == RegSIMD)
b4a3a7b4
L
7745 {
7746 if (i.types[op].bitfield.zmmword)
7747 i.has_regzmm = TRUE;
7748 else if (i.types[op].bitfield.ymmword)
7749 i.has_regymm = TRUE;
7750 else
7751 i.has_regxmm = TRUE;
7752 break;
7753 }
3528c362 7754 if (i.types[op].bitfield.class == RegMMX)
b4a3a7b4
L
7755 {
7756 i.has_regmmx = TRUE;
7757 break;
7758 }
7759 }
c0209578 7760
7ab9ffdd
L
7761 if (vex_3_sources)
7762 op = dest;
2426c15f 7763 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
7764 {
7765 /* For instructions with VexNDS, the register-only
7766 source operand is encoded in VEX prefix. */
7767 gas_assert (mem != (unsigned int) ~0);
c0f3af97 7768
7ab9ffdd 7769 if (op > mem)
c0f3af97 7770 {
7ab9ffdd
L
7771 vex_reg = op++;
7772 gas_assert (op < i.operands);
c0f3af97
L
7773 }
7774 else
c0f3af97 7775 {
f12dc422
L
7776 /* Check register-only source operand when two source
7777 operands are swapped. */
7778 if (!i.tm.operand_types[op].bitfield.baseindex
7779 && i.tm.operand_types[op + 1].bitfield.baseindex)
7780 {
7781 vex_reg = op;
7782 op += 2;
7783 gas_assert (mem == (vex_reg + 1)
7784 && op < i.operands);
7785 }
7786 else
7787 {
7788 vex_reg = op + 1;
7789 gas_assert (vex_reg < i.operands);
7790 }
c0f3af97 7791 }
7ab9ffdd 7792 }
2426c15f 7793 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 7794 {
f12dc422 7795 /* For instructions with VexNDD, the register destination
7ab9ffdd 7796 is encoded in VEX prefix. */
f12dc422
L
7797 if (i.mem_operands == 0)
7798 {
7799 /* There is no memory operand. */
7800 gas_assert ((op + 2) == i.operands);
7801 vex_reg = op + 1;
7802 }
7803 else
8d63c93e 7804 {
ed438a93
JB
7805 /* There are only 2 non-immediate operands. */
7806 gas_assert (op < i.imm_operands + 2
7807 && i.operands == i.imm_operands + 2);
7808 vex_reg = i.imm_operands + 1;
f12dc422 7809 }
7ab9ffdd
L
7810 }
7811 else
7812 gas_assert (op < i.operands);
99018f42 7813
7ab9ffdd
L
7814 if (vex_reg != (unsigned int) ~0)
7815 {
f12dc422 7816 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 7817
bab6aec1 7818 if ((type->bitfield.class != Reg
dc821c5f 7819 || (!type->bitfield.dword && !type->bitfield.qword))
3528c362 7820 && type->bitfield.class != RegSIMD
43234a1e 7821 && !operand_type_equal (type, &regmask))
7ab9ffdd 7822 abort ();
f88c9eb0 7823
7ab9ffdd
L
7824 i.vex.register_specifier = i.op[vex_reg].regs;
7825 }
7826
1b9f0c97
L
7827 /* Don't set OP operand twice. */
7828 if (vex_reg != op)
7ab9ffdd 7829 {
1b9f0c97
L
7830 /* If there is an extension opcode to put here, the
7831 register number must be put into the regmem field. */
7832 if (i.tm.extension_opcode != None)
7833 {
7834 i.rm.regmem = i.op[op].regs->reg_num;
7835 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7836 i.rex |= REX_B;
43234a1e
L
7837 if ((i.op[op].regs->reg_flags & RegVRex) != 0)
7838 i.vrex |= REX_B;
1b9f0c97
L
7839 }
7840 else
7841 {
7842 i.rm.reg = i.op[op].regs->reg_num;
7843 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7844 i.rex |= REX_R;
43234a1e
L
7845 if ((i.op[op].regs->reg_flags & RegVRex) != 0)
7846 i.vrex |= REX_R;
1b9f0c97 7847 }
7ab9ffdd 7848 }
252b5132 7849
29b0f896
AM
7850 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
7851 must set it to 3 to indicate this is a register operand
7852 in the regmem field. */
7853 if (!i.mem_operands)
7854 i.rm.mode = 3;
7855 }
252b5132 7856
29b0f896 7857 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 7858 if (i.tm.extension_opcode != None)
29b0f896
AM
7859 i.rm.reg = i.tm.extension_opcode;
7860 }
7861 return default_seg;
7862}
252b5132 7863
376cd056
JB
7864static unsigned int
7865flip_code16 (unsigned int code16)
7866{
7867 gas_assert (i.tm.operands == 1);
7868
7869 return !(i.prefix[REX_PREFIX] & REX_W)
7870 && (code16 ? i.tm.operand_types[0].bitfield.disp32
7871 || i.tm.operand_types[0].bitfield.disp32s
7872 : i.tm.operand_types[0].bitfield.disp16)
7873 ? CODE16 : 0;
7874}
7875
29b0f896 7876static void
e3bb37b5 7877output_branch (void)
29b0f896
AM
7878{
7879 char *p;
f8a5c266 7880 int size;
29b0f896
AM
7881 int code16;
7882 int prefix;
7883 relax_substateT subtype;
7884 symbolS *sym;
7885 offsetT off;
7886
f8a5c266 7887 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 7888 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
7889
7890 prefix = 0;
7891 if (i.prefix[DATA_PREFIX] != 0)
252b5132 7892 {
29b0f896
AM
7893 prefix = 1;
7894 i.prefixes -= 1;
376cd056 7895 code16 ^= flip_code16(code16);
252b5132 7896 }
29b0f896
AM
7897 /* Pentium4 branch hints. */
7898 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
7899 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 7900 {
29b0f896
AM
7901 prefix++;
7902 i.prefixes--;
7903 }
7904 if (i.prefix[REX_PREFIX] != 0)
7905 {
7906 prefix++;
7907 i.prefixes--;
2f66722d
AM
7908 }
7909
7e8b059b
L
7910 /* BND prefixed jump. */
7911 if (i.prefix[BND_PREFIX] != 0)
7912 {
6cb0a70e
JB
7913 prefix++;
7914 i.prefixes--;
7e8b059b
L
7915 }
7916
f2810fe0
JB
7917 if (i.prefixes != 0)
7918 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
29b0f896
AM
7919
7920 /* It's always a symbol; End frag & setup for relax.
7921 Make sure there is enough room in this frag for the largest
7922 instruction we may generate in md_convert_frag. This is 2
7923 bytes for the opcode and room for the prefix and largest
7924 displacement. */
7925 frag_grow (prefix + 2 + 4);
7926 /* Prefix and 1 opcode byte go in fr_fix. */
7927 p = frag_more (prefix + 1);
7928 if (i.prefix[DATA_PREFIX] != 0)
7929 *p++ = DATA_PREFIX_OPCODE;
7930 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
7931 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
7932 *p++ = i.prefix[SEG_PREFIX];
6cb0a70e
JB
7933 if (i.prefix[BND_PREFIX] != 0)
7934 *p++ = BND_PREFIX_OPCODE;
29b0f896
AM
7935 if (i.prefix[REX_PREFIX] != 0)
7936 *p++ = i.prefix[REX_PREFIX];
7937 *p = i.tm.base_opcode;
7938
7939 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 7940 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 7941 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 7942 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 7943 else
f8a5c266 7944 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 7945 subtype |= code16;
3e73aa7c 7946
29b0f896
AM
7947 sym = i.op[0].disps->X_add_symbol;
7948 off = i.op[0].disps->X_add_number;
3e73aa7c 7949
29b0f896
AM
7950 if (i.op[0].disps->X_op != O_constant
7951 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 7952 {
29b0f896
AM
7953 /* Handle complex expressions. */
7954 sym = make_expr_symbol (i.op[0].disps);
7955 off = 0;
7956 }
3e73aa7c 7957
29b0f896
AM
7958 /* 1 possible extra opcode + 4 byte displacement go in var part.
7959 Pass reloc in fr_var. */
d258b828 7960 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 7961}
3e73aa7c 7962
bd7ab16b
L
7963#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7964/* Return TRUE iff PLT32 relocation should be used for branching to
7965 symbol S. */
7966
7967static bfd_boolean
7968need_plt32_p (symbolS *s)
7969{
7970 /* PLT32 relocation is ELF only. */
7971 if (!IS_ELF)
7972 return FALSE;
7973
a5def729
RO
7974#ifdef TE_SOLARIS
7975 /* Don't emit PLT32 relocation on Solaris: neither native linker nor
7976 krtld support it. */
7977 return FALSE;
7978#endif
7979
bd7ab16b
L
7980 /* Since there is no need to prepare for PLT branch on x86-64, we
7981 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
7982 be used as a marker for 32-bit PC-relative branches. */
7983 if (!object_64bit)
7984 return FALSE;
7985
7986 /* Weak or undefined symbol need PLT32 relocation. */
7987 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
7988 return TRUE;
7989
7990 /* Non-global symbol doesn't need PLT32 relocation. */
7991 if (! S_IS_EXTERNAL (s))
7992 return FALSE;
7993
7994 /* Other global symbols need PLT32 relocation. NB: Symbol with
7995 non-default visibilities are treated as normal global symbol
7996 so that PLT32 relocation can be used as a marker for 32-bit
7997 PC-relative branches. It is useful for linker relaxation. */
7998 return TRUE;
7999}
8000#endif
8001
29b0f896 8002static void
e3bb37b5 8003output_jump (void)
29b0f896
AM
8004{
8005 char *p;
8006 int size;
3e02c1cc 8007 fixS *fixP;
bd7ab16b 8008 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 8009
0cfa3eb3 8010 if (i.tm.opcode_modifier.jump == JUMP_BYTE)
29b0f896
AM
8011 {
8012 /* This is a loop or jecxz type instruction. */
8013 size = 1;
8014 if (i.prefix[ADDR_PREFIX] != 0)
8015 {
8016 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
8017 i.prefixes -= 1;
8018 }
8019 /* Pentium4 branch hints. */
8020 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
8021 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
8022 {
8023 FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
8024 i.prefixes--;
3e73aa7c
JH
8025 }
8026 }
29b0f896
AM
8027 else
8028 {
8029 int code16;
3e73aa7c 8030
29b0f896
AM
8031 code16 = 0;
8032 if (flag_code == CODE_16BIT)
8033 code16 = CODE16;
3e73aa7c 8034
29b0f896
AM
8035 if (i.prefix[DATA_PREFIX] != 0)
8036 {
8037 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
8038 i.prefixes -= 1;
376cd056 8039 code16 ^= flip_code16(code16);
29b0f896 8040 }
252b5132 8041
29b0f896
AM
8042 size = 4;
8043 if (code16)
8044 size = 2;
8045 }
9fcc94b6 8046
6cb0a70e
JB
8047 /* BND prefixed jump. */
8048 if (i.prefix[BND_PREFIX] != 0)
29b0f896 8049 {
6cb0a70e 8050 FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
29b0f896
AM
8051 i.prefixes -= 1;
8052 }
252b5132 8053
6cb0a70e 8054 if (i.prefix[REX_PREFIX] != 0)
7e8b059b 8055 {
6cb0a70e 8056 FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
7e8b059b
L
8057 i.prefixes -= 1;
8058 }
8059
f2810fe0
JB
8060 if (i.prefixes != 0)
8061 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
e0890092 8062
42164a71
L
8063 p = frag_more (i.tm.opcode_length + size);
8064 switch (i.tm.opcode_length)
8065 {
8066 case 2:
8067 *p++ = i.tm.base_opcode >> 8;
1a0670f3 8068 /* Fall through. */
42164a71
L
8069 case 1:
8070 *p++ = i.tm.base_opcode;
8071 break;
8072 default:
8073 abort ();
8074 }
e0890092 8075
bd7ab16b
L
8076#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8077 if (size == 4
8078 && jump_reloc == NO_RELOC
8079 && need_plt32_p (i.op[0].disps->X_add_symbol))
8080 jump_reloc = BFD_RELOC_X86_64_PLT32;
8081#endif
8082
8083 jump_reloc = reloc (size, 1, 1, jump_reloc);
8084
3e02c1cc 8085 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 8086 i.op[0].disps, 1, jump_reloc);
3e02c1cc
AM
8087
8088 /* All jumps handled here are signed, but don't use a signed limit
8089 check for 32 and 16 bit jumps as we want to allow wrap around at
8090 4G and 64k respectively. */
8091 if (size == 1)
8092 fixP->fx_signed = 1;
29b0f896 8093}
e0890092 8094
29b0f896 8095static void
e3bb37b5 8096output_interseg_jump (void)
29b0f896
AM
8097{
8098 char *p;
8099 int size;
8100 int prefix;
8101 int code16;
252b5132 8102
29b0f896
AM
8103 code16 = 0;
8104 if (flag_code == CODE_16BIT)
8105 code16 = CODE16;
a217f122 8106
29b0f896
AM
8107 prefix = 0;
8108 if (i.prefix[DATA_PREFIX] != 0)
8109 {
8110 prefix = 1;
8111 i.prefixes -= 1;
8112 code16 ^= CODE16;
8113 }
6cb0a70e
JB
8114
8115 gas_assert (!i.prefix[REX_PREFIX]);
252b5132 8116
29b0f896
AM
8117 size = 4;
8118 if (code16)
8119 size = 2;
252b5132 8120
f2810fe0
JB
8121 if (i.prefixes != 0)
8122 as_warn (_("skipping prefixes on `%s'"), i.tm.name);
252b5132 8123
29b0f896
AM
8124 /* 1 opcode; 2 segment; offset */
8125 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 8126
29b0f896
AM
8127 if (i.prefix[DATA_PREFIX] != 0)
8128 *p++ = DATA_PREFIX_OPCODE;
252b5132 8129
29b0f896
AM
8130 if (i.prefix[REX_PREFIX] != 0)
8131 *p++ = i.prefix[REX_PREFIX];
252b5132 8132
29b0f896
AM
8133 *p++ = i.tm.base_opcode;
8134 if (i.op[1].imms->X_op == O_constant)
8135 {
8136 offsetT n = i.op[1].imms->X_add_number;
252b5132 8137
29b0f896
AM
8138 if (size == 2
8139 && !fits_in_unsigned_word (n)
8140 && !fits_in_signed_word (n))
8141 {
8142 as_bad (_("16-bit jump out of range"));
8143 return;
8144 }
8145 md_number_to_chars (p, n, size);
8146 }
8147 else
8148 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 8149 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
29b0f896
AM
8150 if (i.op[0].imms->X_op != O_constant)
8151 as_bad (_("can't handle non absolute segment in `%s'"),
8152 i.tm.name);
8153 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
8154}
a217f122 8155
b4a3a7b4
L
8156#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8157void
8158x86_cleanup (void)
8159{
8160 char *p;
8161 asection *seg = now_seg;
8162 subsegT subseg = now_subseg;
8163 asection *sec;
8164 unsigned int alignment, align_size_1;
8165 unsigned int isa_1_descsz, feature_2_descsz, descsz;
8166 unsigned int isa_1_descsz_raw, feature_2_descsz_raw;
8167 unsigned int padding;
8168
8169 if (!IS_ELF || !x86_used_note)
8170 return;
8171
b4a3a7b4
L
8172 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X86;
8173
8174 /* The .note.gnu.property section layout:
8175
8176 Field Length Contents
8177 ---- ---- ----
8178 n_namsz 4 4
8179 n_descsz 4 The note descriptor size
8180 n_type 4 NT_GNU_PROPERTY_TYPE_0
8181 n_name 4 "GNU"
8182 n_desc n_descsz The program property array
8183 .... .... ....
8184 */
8185
8186 /* Create the .note.gnu.property section. */
8187 sec = subseg_new (NOTE_GNU_PROPERTY_SECTION_NAME, 0);
fd361982 8188 bfd_set_section_flags (sec,
b4a3a7b4
L
8189 (SEC_ALLOC
8190 | SEC_LOAD
8191 | SEC_DATA
8192 | SEC_HAS_CONTENTS
8193 | SEC_READONLY));
8194
8195 if (get_elf_backend_data (stdoutput)->s->elfclass == ELFCLASS64)
8196 {
8197 align_size_1 = 7;
8198 alignment = 3;
8199 }
8200 else
8201 {
8202 align_size_1 = 3;
8203 alignment = 2;
8204 }
8205
fd361982 8206 bfd_set_section_alignment (sec, alignment);
b4a3a7b4
L
8207 elf_section_type (sec) = SHT_NOTE;
8208
8209 /* GNU_PROPERTY_X86_ISA_1_USED: 4-byte type + 4-byte data size
8210 + 4-byte data */
8211 isa_1_descsz_raw = 4 + 4 + 4;
8212 /* Align GNU_PROPERTY_X86_ISA_1_USED. */
8213 isa_1_descsz = (isa_1_descsz_raw + align_size_1) & ~align_size_1;
8214
8215 feature_2_descsz_raw = isa_1_descsz;
8216 /* GNU_PROPERTY_X86_FEATURE_2_USED: 4-byte type + 4-byte data size
8217 + 4-byte data */
8218 feature_2_descsz_raw += 4 + 4 + 4;
8219 /* Align GNU_PROPERTY_X86_FEATURE_2_USED. */
8220 feature_2_descsz = ((feature_2_descsz_raw + align_size_1)
8221 & ~align_size_1);
8222
8223 descsz = feature_2_descsz;
8224 /* Section size: n_namsz + n_descsz + n_type + n_name + n_descsz. */
8225 p = frag_more (4 + 4 + 4 + 4 + descsz);
8226
8227 /* Write n_namsz. */
8228 md_number_to_chars (p, (valueT) 4, 4);
8229
8230 /* Write n_descsz. */
8231 md_number_to_chars (p + 4, (valueT) descsz, 4);
8232
8233 /* Write n_type. */
8234 md_number_to_chars (p + 4 * 2, (valueT) NT_GNU_PROPERTY_TYPE_0, 4);
8235
8236 /* Write n_name. */
8237 memcpy (p + 4 * 3, "GNU", 4);
8238
8239 /* Write 4-byte type. */
8240 md_number_to_chars (p + 4 * 4,
8241 (valueT) GNU_PROPERTY_X86_ISA_1_USED, 4);
8242
8243 /* Write 4-byte data size. */
8244 md_number_to_chars (p + 4 * 5, (valueT) 4, 4);
8245
8246 /* Write 4-byte data. */
8247 md_number_to_chars (p + 4 * 6, (valueT) x86_isa_1_used, 4);
8248
8249 /* Zero out paddings. */
8250 padding = isa_1_descsz - isa_1_descsz_raw;
8251 if (padding)
8252 memset (p + 4 * 7, 0, padding);
8253
8254 /* Write 4-byte type. */
8255 md_number_to_chars (p + isa_1_descsz + 4 * 4,
8256 (valueT) GNU_PROPERTY_X86_FEATURE_2_USED, 4);
8257
8258 /* Write 4-byte data size. */
8259 md_number_to_chars (p + isa_1_descsz + 4 * 5, (valueT) 4, 4);
8260
8261 /* Write 4-byte data. */
8262 md_number_to_chars (p + isa_1_descsz + 4 * 6,
8263 (valueT) x86_feature_2_used, 4);
8264
8265 /* Zero out paddings. */
8266 padding = feature_2_descsz - feature_2_descsz_raw;
8267 if (padding)
8268 memset (p + isa_1_descsz + 4 * 7, 0, padding);
8269
8270 /* We probably can't restore the current segment, for there likely
8271 isn't one yet... */
8272 if (seg && subseg)
8273 subseg_set (seg, subseg);
8274}
8275#endif
8276
9c33702b
JB
8277static unsigned int
8278encoding_length (const fragS *start_frag, offsetT start_off,
8279 const char *frag_now_ptr)
8280{
8281 unsigned int len = 0;
8282
8283 if (start_frag != frag_now)
8284 {
8285 const fragS *fr = start_frag;
8286
8287 do {
8288 len += fr->fr_fix;
8289 fr = fr->fr_next;
8290 } while (fr && fr != frag_now);
8291 }
8292
8293 return len - start_off + (frag_now_ptr - frag_now->fr_literal);
8294}
8295
e379e5f3
L
8296/* Return 1 for test, and, cmp, add, sub, inc and dec which may
8297 be macro-fused with conditional jumps. */
8298
8299static int
8300maybe_fused_with_jcc_p (void)
8301{
8302 /* No RIP address. */
8303 if (i.base_reg && i.base_reg->reg_num == RegIP)
8304 return 0;
8305
8306 /* No VEX/EVEX encoding. */
8307 if (is_any_vex_encoding (&i.tm))
8308 return 0;
8309
8310 /* and, add, sub with destination register. */
8311 if ((i.tm.base_opcode >= 0x20 && i.tm.base_opcode <= 0x25)
8312 || i.tm.base_opcode <= 5
8313 || (i.tm.base_opcode >= 0x28 && i.tm.base_opcode <= 0x2d)
8314 || ((i.tm.base_opcode | 3) == 0x83
8315 && ((i.tm.extension_opcode | 1) == 0x5
8316 || i.tm.extension_opcode == 0x0)))
8317 return (i.types[1].bitfield.class == Reg
8318 || i.types[1].bitfield.instance == Accum);
8319
8320 /* test, cmp with any register. */
8321 if ((i.tm.base_opcode | 1) == 0x85
8322 || (i.tm.base_opcode | 1) == 0xa9
8323 || ((i.tm.base_opcode | 1) == 0xf7
8324 && i.tm.extension_opcode == 0)
8325 || (i.tm.base_opcode >= 0x38 && i.tm.base_opcode <= 0x3d)
8326 || ((i.tm.base_opcode | 3) == 0x83
8327 && (i.tm.extension_opcode == 0x7)))
8328 return (i.types[0].bitfield.class == Reg
8329 || i.types[0].bitfield.instance == Accum
8330 || i.types[1].bitfield.class == Reg
8331 || i.types[1].bitfield.instance == Accum);
8332
8333 /* inc, dec with any register. */
8334 if ((i.tm.cpu_flags.bitfield.cpuno64
8335 && (i.tm.base_opcode | 0xf) == 0x4f)
8336 || ((i.tm.base_opcode | 1) == 0xff
8337 && i.tm.extension_opcode <= 0x1))
8338 return (i.types[0].bitfield.class == Reg
8339 || i.types[0].bitfield.instance == Accum);
8340
8341 return 0;
8342}
8343
8344/* Return 1 if a FUSED_JCC_PADDING frag should be generated. */
8345
8346static int
8347add_fused_jcc_padding_frag_p (void)
8348{
8349 /* NB: Don't work with COND_JUMP86 without i386. */
8350 if (!align_branch_power
8351 || now_seg == absolute_section
8352 || !cpu_arch_flags.bitfield.cpui386
8353 || !(align_branch & align_branch_fused_bit))
8354 return 0;
8355
8356 if (maybe_fused_with_jcc_p ())
8357 {
8358 if (last_insn.kind == last_insn_other
8359 || last_insn.seg != now_seg)
8360 return 1;
8361 if (flag_debug)
8362 as_warn_where (last_insn.file, last_insn.line,
8363 _("`%s` skips -malign-branch-boundary on `%s`"),
8364 last_insn.name, i.tm.name);
8365 }
8366
8367 return 0;
8368}
8369
8370/* Return 1 if a BRANCH_PREFIX frag should be generated. */
8371
8372static int
8373add_branch_prefix_frag_p (void)
8374{
8375 /* NB: Don't work with COND_JUMP86 without i386. Don't add prefix
8376 to PadLock instructions since they include prefixes in opcode. */
8377 if (!align_branch_power
8378 || !align_branch_prefix_size
8379 || now_seg == absolute_section
8380 || i.tm.cpu_flags.bitfield.cpupadlock
8381 || !cpu_arch_flags.bitfield.cpui386)
8382 return 0;
8383
8384 /* Don't add prefix if it is a prefix or there is no operand in case
8385 that segment prefix is special. */
8386 if (!i.operands || i.tm.opcode_modifier.isprefix)
8387 return 0;
8388
8389 if (last_insn.kind == last_insn_other
8390 || last_insn.seg != now_seg)
8391 return 1;
8392
8393 if (flag_debug)
8394 as_warn_where (last_insn.file, last_insn.line,
8395 _("`%s` skips -malign-branch-boundary on `%s`"),
8396 last_insn.name, i.tm.name);
8397
8398 return 0;
8399}
8400
8401/* Return 1 if a BRANCH_PADDING frag should be generated. */
8402
8403static int
8404add_branch_padding_frag_p (enum align_branch_kind *branch_p)
8405{
8406 int add_padding;
8407
8408 /* NB: Don't work with COND_JUMP86 without i386. */
8409 if (!align_branch_power
8410 || now_seg == absolute_section
8411 || !cpu_arch_flags.bitfield.cpui386)
8412 return 0;
8413
8414 add_padding = 0;
8415
8416 /* Check for jcc and direct jmp. */
8417 if (i.tm.opcode_modifier.jump == JUMP)
8418 {
8419 if (i.tm.base_opcode == JUMP_PC_RELATIVE)
8420 {
8421 *branch_p = align_branch_jmp;
8422 add_padding = align_branch & align_branch_jmp_bit;
8423 }
8424 else
8425 {
8426 *branch_p = align_branch_jcc;
8427 if ((align_branch & align_branch_jcc_bit))
8428 add_padding = 1;
8429 }
8430 }
8431 else if (is_any_vex_encoding (&i.tm))
8432 return 0;
8433 else if ((i.tm.base_opcode | 1) == 0xc3)
8434 {
8435 /* Near ret. */
8436 *branch_p = align_branch_ret;
8437 if ((align_branch & align_branch_ret_bit))
8438 add_padding = 1;
8439 }
8440 else
8441 {
8442 /* Check for indirect jmp, direct and indirect calls. */
8443 if (i.tm.base_opcode == 0xe8)
8444 {
8445 /* Direct call. */
8446 *branch_p = align_branch_call;
8447 if ((align_branch & align_branch_call_bit))
8448 add_padding = 1;
8449 }
8450 else if (i.tm.base_opcode == 0xff
8451 && (i.tm.extension_opcode == 2
8452 || i.tm.extension_opcode == 4))
8453 {
8454 /* Indirect call and jmp. */
8455 *branch_p = align_branch_indirect;
8456 if ((align_branch & align_branch_indirect_bit))
8457 add_padding = 1;
8458 }
8459
8460 if (add_padding
8461 && i.disp_operands
8462 && tls_get_addr
8463 && (i.op[0].disps->X_op == O_symbol
8464 || (i.op[0].disps->X_op == O_subtract
8465 && i.op[0].disps->X_op_symbol == GOT_symbol)))
8466 {
8467 symbolS *s = i.op[0].disps->X_add_symbol;
8468 /* No padding to call to global or undefined tls_get_addr. */
8469 if ((S_IS_EXTERNAL (s) || !S_IS_DEFINED (s))
8470 && strcmp (S_GET_NAME (s), tls_get_addr) == 0)
8471 return 0;
8472 }
8473 }
8474
8475 if (add_padding
8476 && last_insn.kind != last_insn_other
8477 && last_insn.seg == now_seg)
8478 {
8479 if (flag_debug)
8480 as_warn_where (last_insn.file, last_insn.line,
8481 _("`%s` skips -malign-branch-boundary on `%s`"),
8482 last_insn.name, i.tm.name);
8483 return 0;
8484 }
8485
8486 return add_padding;
8487}
8488
29b0f896 8489static void
e3bb37b5 8490output_insn (void)
29b0f896 8491{
2bbd9c25
JJ
8492 fragS *insn_start_frag;
8493 offsetT insn_start_off;
e379e5f3
L
8494 fragS *fragP = NULL;
8495 enum align_branch_kind branch = align_branch_none;
2bbd9c25 8496
b4a3a7b4
L
8497#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8498 if (IS_ELF && x86_used_note)
8499 {
8500 if (i.tm.cpu_flags.bitfield.cpucmov)
8501 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_CMOV;
8502 if (i.tm.cpu_flags.bitfield.cpusse)
8503 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE;
8504 if (i.tm.cpu_flags.bitfield.cpusse2)
8505 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE2;
8506 if (i.tm.cpu_flags.bitfield.cpusse3)
8507 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE3;
8508 if (i.tm.cpu_flags.bitfield.cpussse3)
8509 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSSE3;
8510 if (i.tm.cpu_flags.bitfield.cpusse4_1)
8511 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_1;
8512 if (i.tm.cpu_flags.bitfield.cpusse4_2)
8513 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_SSE4_2;
8514 if (i.tm.cpu_flags.bitfield.cpuavx)
8515 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX;
8516 if (i.tm.cpu_flags.bitfield.cpuavx2)
8517 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX2;
8518 if (i.tm.cpu_flags.bitfield.cpufma)
8519 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_FMA;
8520 if (i.tm.cpu_flags.bitfield.cpuavx512f)
8521 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512F;
8522 if (i.tm.cpu_flags.bitfield.cpuavx512cd)
8523 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512CD;
8524 if (i.tm.cpu_flags.bitfield.cpuavx512er)
8525 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512ER;
8526 if (i.tm.cpu_flags.bitfield.cpuavx512pf)
8527 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512PF;
8528 if (i.tm.cpu_flags.bitfield.cpuavx512vl)
8529 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512VL;
8530 if (i.tm.cpu_flags.bitfield.cpuavx512dq)
8531 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512DQ;
8532 if (i.tm.cpu_flags.bitfield.cpuavx512bw)
8533 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512BW;
8534 if (i.tm.cpu_flags.bitfield.cpuavx512_4fmaps)
8535 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS;
8536 if (i.tm.cpu_flags.bitfield.cpuavx512_4vnniw)
8537 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW;
8538 if (i.tm.cpu_flags.bitfield.cpuavx512_bitalg)
8539 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BITALG;
8540 if (i.tm.cpu_flags.bitfield.cpuavx512ifma)
8541 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_IFMA;
8542 if (i.tm.cpu_flags.bitfield.cpuavx512vbmi)
8543 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI;
8544 if (i.tm.cpu_flags.bitfield.cpuavx512_vbmi2)
8545 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2;
8546 if (i.tm.cpu_flags.bitfield.cpuavx512_vnni)
8547 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_VNNI;
462cac58
L
8548 if (i.tm.cpu_flags.bitfield.cpuavx512_bf16)
8549 x86_isa_1_used |= GNU_PROPERTY_X86_ISA_1_AVX512_BF16;
b4a3a7b4
L
8550
8551 if (i.tm.cpu_flags.bitfield.cpu8087
8552 || i.tm.cpu_flags.bitfield.cpu287
8553 || i.tm.cpu_flags.bitfield.cpu387
8554 || i.tm.cpu_flags.bitfield.cpu687
8555 || i.tm.cpu_flags.bitfield.cpufisttp)
8556 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_X87;
319ff62c
JB
8557 if (i.has_regmmx
8558 || i.tm.base_opcode == 0xf77 /* emms */
8559 || i.tm.base_opcode == 0xf0e /* femms */)
b4a3a7b4
L
8560 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_MMX;
8561 if (i.has_regxmm)
8562 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XMM;
8563 if (i.has_regymm)
8564 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_YMM;
8565 if (i.has_regzmm)
8566 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_ZMM;
8567 if (i.tm.cpu_flags.bitfield.cpufxsr)
8568 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_FXSR;
8569 if (i.tm.cpu_flags.bitfield.cpuxsave)
8570 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVE;
8571 if (i.tm.cpu_flags.bitfield.cpuxsaveopt)
8572 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT;
8573 if (i.tm.cpu_flags.bitfield.cpuxsavec)
8574 x86_feature_2_used |= GNU_PROPERTY_X86_FEATURE_2_XSAVEC;
8575 }
8576#endif
8577
29b0f896
AM
8578 /* Tie dwarf2 debug info to the address at the start of the insn.
8579 We can't do this after the insn has been output as the current
8580 frag may have been closed off. eg. by frag_var. */
8581 dwarf2_emit_insn (0);
8582
2bbd9c25
JJ
8583 insn_start_frag = frag_now;
8584 insn_start_off = frag_now_fix ();
8585
e379e5f3
L
8586 if (add_branch_padding_frag_p (&branch))
8587 {
8588 char *p;
8589 /* Branch can be 8 bytes. Leave some room for prefixes. */
8590 unsigned int max_branch_padding_size = 14;
8591
8592 /* Align section to boundary. */
8593 record_alignment (now_seg, align_branch_power);
8594
8595 /* Make room for padding. */
8596 frag_grow (max_branch_padding_size);
8597
8598 /* Start of the padding. */
8599 p = frag_more (0);
8600
8601 fragP = frag_now;
8602
8603 frag_var (rs_machine_dependent, max_branch_padding_size, 0,
8604 ENCODE_RELAX_STATE (BRANCH_PADDING, 0),
8605 NULL, 0, p);
8606
8607 fragP->tc_frag_data.branch_type = branch;
8608 fragP->tc_frag_data.max_bytes = max_branch_padding_size;
8609 }
8610
29b0f896 8611 /* Output jumps. */
0cfa3eb3 8612 if (i.tm.opcode_modifier.jump == JUMP)
29b0f896 8613 output_branch ();
0cfa3eb3
JB
8614 else if (i.tm.opcode_modifier.jump == JUMP_BYTE
8615 || i.tm.opcode_modifier.jump == JUMP_DWORD)
29b0f896 8616 output_jump ();
0cfa3eb3 8617 else if (i.tm.opcode_modifier.jump == JUMP_INTERSEGMENT)
29b0f896
AM
8618 output_interseg_jump ();
8619 else
8620 {
8621 /* Output normal instructions here. */
8622 char *p;
8623 unsigned char *q;
47465058 8624 unsigned int j;
331d2d0d 8625 unsigned int prefix;
4dffcebc 8626
e4e00185 8627 if (avoid_fence
c3949f43
JB
8628 && (i.tm.base_opcode == 0xfaee8
8629 || i.tm.base_opcode == 0xfaef0
8630 || i.tm.base_opcode == 0xfaef8))
e4e00185
AS
8631 {
8632 /* Encode lfence, mfence, and sfence as
8633 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
8634 offsetT val = 0x240483f0ULL;
8635 p = frag_more (5);
8636 md_number_to_chars (p, val, 5);
8637 return;
8638 }
8639
d022bddd
IT
8640 /* Some processors fail on LOCK prefix. This options makes
8641 assembler ignore LOCK prefix and serves as a workaround. */
8642 if (omit_lock_prefix)
8643 {
8644 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE)
8645 return;
8646 i.prefix[LOCK_PREFIX] = 0;
8647 }
8648
e379e5f3
L
8649 if (branch)
8650 /* Skip if this is a branch. */
8651 ;
8652 else if (add_fused_jcc_padding_frag_p ())
8653 {
8654 /* Make room for padding. */
8655 frag_grow (MAX_FUSED_JCC_PADDING_SIZE);
8656 p = frag_more (0);
8657
8658 fragP = frag_now;
8659
8660 frag_var (rs_machine_dependent, MAX_FUSED_JCC_PADDING_SIZE, 0,
8661 ENCODE_RELAX_STATE (FUSED_JCC_PADDING, 0),
8662 NULL, 0, p);
8663
8664 fragP->tc_frag_data.branch_type = align_branch_fused;
8665 fragP->tc_frag_data.max_bytes = MAX_FUSED_JCC_PADDING_SIZE;
8666 }
8667 else if (add_branch_prefix_frag_p ())
8668 {
8669 unsigned int max_prefix_size = align_branch_prefix_size;
8670
8671 /* Make room for padding. */
8672 frag_grow (max_prefix_size);
8673 p = frag_more (0);
8674
8675 fragP = frag_now;
8676
8677 frag_var (rs_machine_dependent, max_prefix_size, 0,
8678 ENCODE_RELAX_STATE (BRANCH_PREFIX, 0),
8679 NULL, 0, p);
8680
8681 fragP->tc_frag_data.max_bytes = max_prefix_size;
8682 }
8683
43234a1e
L
8684 /* Since the VEX/EVEX prefix contains the implicit prefix, we
8685 don't need the explicit prefix. */
8686 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 8687 {
c0f3af97 8688 switch (i.tm.opcode_length)
bc4bd9ab 8689 {
c0f3af97
L
8690 case 3:
8691 if (i.tm.base_opcode & 0xff000000)
4dffcebc 8692 {
c0f3af97 8693 prefix = (i.tm.base_opcode >> 24) & 0xff;
c3949f43
JB
8694 if (!i.tm.cpu_flags.bitfield.cpupadlock
8695 || prefix != REPE_PREFIX_OPCODE
8696 || (i.prefix[REP_PREFIX] != REPE_PREFIX_OPCODE))
8697 add_prefix (prefix);
c0f3af97
L
8698 }
8699 break;
8700 case 2:
8701 if ((i.tm.base_opcode & 0xff0000) != 0)
8702 {
8703 prefix = (i.tm.base_opcode >> 16) & 0xff;
c3949f43 8704 add_prefix (prefix);
4dffcebc 8705 }
c0f3af97
L
8706 break;
8707 case 1:
8708 break;
390c91cf
L
8709 case 0:
8710 /* Check for pseudo prefixes. */
8711 as_bad_where (insn_start_frag->fr_file,
8712 insn_start_frag->fr_line,
8713 _("pseudo prefix without instruction"));
8714 return;
c0f3af97
L
8715 default:
8716 abort ();
bc4bd9ab 8717 }
c0f3af97 8718
6d19a37a 8719#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
8720 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
8721 R_X86_64_GOTTPOFF relocation so that linker can safely
14470f07
L
8722 perform IE->LE optimization. A dummy REX_OPCODE prefix
8723 is also needed for lea with R_X86_64_GOTPC32_TLSDESC
8724 relocation for GDesc -> IE/LE optimization. */
cf61b747
L
8725 if (x86_elf_abi == X86_64_X32_ABI
8726 && i.operands == 2
14470f07
L
8727 && (i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
8728 || i.reloc[0] == BFD_RELOC_X86_64_GOTPC32_TLSDESC)
cf61b747
L
8729 && i.prefix[REX_PREFIX] == 0)
8730 add_prefix (REX_OPCODE);
6d19a37a 8731#endif
cf61b747 8732
c0f3af97
L
8733 /* The prefix bytes. */
8734 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
8735 if (*q)
8736 FRAG_APPEND_1_CHAR (*q);
0f10071e 8737 }
ae5c1c7b 8738 else
c0f3af97
L
8739 {
8740 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
8741 if (*q)
8742 switch (j)
8743 {
8744 case REX_PREFIX:
8745 /* REX byte is encoded in VEX prefix. */
8746 break;
8747 case SEG_PREFIX:
8748 case ADDR_PREFIX:
8749 FRAG_APPEND_1_CHAR (*q);
8750 break;
8751 default:
8752 /* There should be no other prefixes for instructions
8753 with VEX prefix. */
8754 abort ();
8755 }
8756
43234a1e
L
8757 /* For EVEX instructions i.vrex should become 0 after
8758 build_evex_prefix. For VEX instructions upper 16 registers
8759 aren't available, so VREX should be 0. */
8760 if (i.vrex)
8761 abort ();
c0f3af97
L
8762 /* Now the VEX prefix. */
8763 p = frag_more (i.vex.length);
8764 for (j = 0; j < i.vex.length; j++)
8765 p[j] = i.vex.bytes[j];
8766 }
252b5132 8767
29b0f896 8768 /* Now the opcode; be careful about word order here! */
4dffcebc 8769 if (i.tm.opcode_length == 1)
29b0f896
AM
8770 {
8771 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
8772 }
8773 else
8774 {
4dffcebc 8775 switch (i.tm.opcode_length)
331d2d0d 8776 {
43234a1e
L
8777 case 4:
8778 p = frag_more (4);
8779 *p++ = (i.tm.base_opcode >> 24) & 0xff;
8780 *p++ = (i.tm.base_opcode >> 16) & 0xff;
8781 break;
4dffcebc 8782 case 3:
331d2d0d
L
8783 p = frag_more (3);
8784 *p++ = (i.tm.base_opcode >> 16) & 0xff;
4dffcebc
L
8785 break;
8786 case 2:
8787 p = frag_more (2);
8788 break;
8789 default:
8790 abort ();
8791 break;
331d2d0d 8792 }
0f10071e 8793
29b0f896
AM
8794 /* Put out high byte first: can't use md_number_to_chars! */
8795 *p++ = (i.tm.base_opcode >> 8) & 0xff;
8796 *p = i.tm.base_opcode & 0xff;
8797 }
3e73aa7c 8798
29b0f896 8799 /* Now the modrm byte and sib byte (if present). */
40fb9820 8800 if (i.tm.opcode_modifier.modrm)
29b0f896 8801 {
4a3523fa
L
8802 FRAG_APPEND_1_CHAR ((i.rm.regmem << 0
8803 | i.rm.reg << 3
8804 | i.rm.mode << 6));
29b0f896
AM
8805 /* If i.rm.regmem == ESP (4)
8806 && i.rm.mode != (Register mode)
8807 && not 16 bit
8808 ==> need second modrm byte. */
8809 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
8810 && i.rm.mode != 3
dc821c5f 8811 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
4a3523fa
L
8812 FRAG_APPEND_1_CHAR ((i.sib.base << 0
8813 | i.sib.index << 3
8814 | i.sib.scale << 6));
29b0f896 8815 }
3e73aa7c 8816
29b0f896 8817 if (i.disp_operands)
2bbd9c25 8818 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 8819
29b0f896 8820 if (i.imm_operands)
2bbd9c25 8821 output_imm (insn_start_frag, insn_start_off);
9c33702b
JB
8822
8823 /*
8824 * frag_now_fix () returning plain abs_section_offset when we're in the
8825 * absolute section, and abs_section_offset not getting updated as data
8826 * gets added to the frag breaks the logic below.
8827 */
8828 if (now_seg != absolute_section)
8829 {
8830 j = encoding_length (insn_start_frag, insn_start_off, frag_more (0));
8831 if (j > 15)
8832 as_warn (_("instruction length of %u bytes exceeds the limit of 15"),
8833 j);
e379e5f3
L
8834 else if (fragP)
8835 {
8836 /* NB: Don't add prefix with GOTPC relocation since
8837 output_disp() above depends on the fixed encoding
8838 length. Can't add prefix with TLS relocation since
8839 it breaks TLS linker optimization. */
8840 unsigned int max = i.has_gotpc_tls_reloc ? 0 : 15 - j;
8841 /* Prefix count on the current instruction. */
8842 unsigned int count = i.vex.length;
8843 unsigned int k;
8844 for (k = 0; k < ARRAY_SIZE (i.prefix); k++)
8845 /* REX byte is encoded in VEX/EVEX prefix. */
8846 if (i.prefix[k] && (k != REX_PREFIX || !i.vex.length))
8847 count++;
8848
8849 /* Count prefixes for extended opcode maps. */
8850 if (!i.vex.length)
8851 switch (i.tm.opcode_length)
8852 {
8853 case 3:
8854 if (((i.tm.base_opcode >> 16) & 0xff) == 0xf)
8855 {
8856 count++;
8857 switch ((i.tm.base_opcode >> 8) & 0xff)
8858 {
8859 case 0x38:
8860 case 0x3a:
8861 count++;
8862 break;
8863 default:
8864 break;
8865 }
8866 }
8867 break;
8868 case 2:
8869 if (((i.tm.base_opcode >> 8) & 0xff) == 0xf)
8870 count++;
8871 break;
8872 case 1:
8873 break;
8874 default:
8875 abort ();
8876 }
8877
8878 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
8879 == BRANCH_PREFIX)
8880 {
8881 /* Set the maximum prefix size in BRANCH_PREFIX
8882 frag. */
8883 if (fragP->tc_frag_data.max_bytes > max)
8884 fragP->tc_frag_data.max_bytes = max;
8885 if (fragP->tc_frag_data.max_bytes > count)
8886 fragP->tc_frag_data.max_bytes -= count;
8887 else
8888 fragP->tc_frag_data.max_bytes = 0;
8889 }
8890 else
8891 {
8892 /* Remember the maximum prefix size in FUSED_JCC_PADDING
8893 frag. */
8894 unsigned int max_prefix_size;
8895 if (align_branch_prefix_size > max)
8896 max_prefix_size = max;
8897 else
8898 max_prefix_size = align_branch_prefix_size;
8899 if (max_prefix_size > count)
8900 fragP->tc_frag_data.max_prefix_length
8901 = max_prefix_size - count;
8902 }
8903
8904 /* Use existing segment prefix if possible. Use CS
8905 segment prefix in 64-bit mode. In 32-bit mode, use SS
8906 segment prefix with ESP/EBP base register and use DS
8907 segment prefix without ESP/EBP base register. */
8908 if (i.prefix[SEG_PREFIX])
8909 fragP->tc_frag_data.default_prefix = i.prefix[SEG_PREFIX];
8910 else if (flag_code == CODE_64BIT)
8911 fragP->tc_frag_data.default_prefix = CS_PREFIX_OPCODE;
8912 else if (i.base_reg
8913 && (i.base_reg->reg_num == 4
8914 || i.base_reg->reg_num == 5))
8915 fragP->tc_frag_data.default_prefix = SS_PREFIX_OPCODE;
8916 else
8917 fragP->tc_frag_data.default_prefix = DS_PREFIX_OPCODE;
8918 }
9c33702b 8919 }
29b0f896 8920 }
252b5132 8921
e379e5f3
L
8922 /* NB: Don't work with COND_JUMP86 without i386. */
8923 if (align_branch_power
8924 && now_seg != absolute_section
8925 && cpu_arch_flags.bitfield.cpui386)
8926 {
8927 /* Terminate each frag so that we can add prefix and check for
8928 fused jcc. */
8929 frag_wane (frag_now);
8930 frag_new (0);
8931 }
8932
29b0f896
AM
8933#ifdef DEBUG386
8934 if (flag_debug)
8935 {
7b81dfbb 8936 pi ("" /*line*/, &i);
29b0f896
AM
8937 }
8938#endif /* DEBUG386 */
8939}
252b5132 8940
e205caa7
L
8941/* Return the size of the displacement operand N. */
8942
8943static int
8944disp_size (unsigned int n)
8945{
8946 int size = 4;
43234a1e 8947
b5014f7a 8948 if (i.types[n].bitfield.disp64)
40fb9820
L
8949 size = 8;
8950 else if (i.types[n].bitfield.disp8)
8951 size = 1;
8952 else if (i.types[n].bitfield.disp16)
8953 size = 2;
e205caa7
L
8954 return size;
8955}
8956
8957/* Return the size of the immediate operand N. */
8958
8959static int
8960imm_size (unsigned int n)
8961{
8962 int size = 4;
40fb9820
L
8963 if (i.types[n].bitfield.imm64)
8964 size = 8;
8965 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
8966 size = 1;
8967 else if (i.types[n].bitfield.imm16)
8968 size = 2;
e205caa7
L
8969 return size;
8970}
8971
29b0f896 8972static void
64e74474 8973output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
8974{
8975 char *p;
8976 unsigned int n;
252b5132 8977
29b0f896
AM
8978 for (n = 0; n < i.operands; n++)
8979 {
b5014f7a 8980 if (operand_type_check (i.types[n], disp))
29b0f896
AM
8981 {
8982 if (i.op[n].disps->X_op == O_constant)
8983 {
e205caa7 8984 int size = disp_size (n);
43234a1e 8985 offsetT val = i.op[n].disps->X_add_number;
252b5132 8986
629cfaf1
JB
8987 val = offset_in_range (val >> (size == 1 ? i.memshift : 0),
8988 size);
29b0f896
AM
8989 p = frag_more (size);
8990 md_number_to_chars (p, val, size);
8991 }
8992 else
8993 {
f86103b7 8994 enum bfd_reloc_code_real reloc_type;
e205caa7 8995 int size = disp_size (n);
40fb9820 8996 int sign = i.types[n].bitfield.disp32s;
29b0f896 8997 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 8998 fixS *fixP;
29b0f896 8999
e205caa7 9000 /* We can't have 8 bit displacement here. */
9c2799c2 9001 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 9002
29b0f896
AM
9003 /* The PC relative address is computed relative
9004 to the instruction boundary, so in case immediate
9005 fields follows, we need to adjust the value. */
9006 if (pcrel && i.imm_operands)
9007 {
29b0f896 9008 unsigned int n1;
e205caa7 9009 int sz = 0;
252b5132 9010
29b0f896 9011 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 9012 if (operand_type_check (i.types[n1], imm))
252b5132 9013 {
e205caa7
L
9014 /* Only one immediate is allowed for PC
9015 relative address. */
9c2799c2 9016 gas_assert (sz == 0);
e205caa7
L
9017 sz = imm_size (n1);
9018 i.op[n].disps->X_add_number -= sz;
252b5132 9019 }
29b0f896 9020 /* We should find the immediate. */
9c2799c2 9021 gas_assert (sz != 0);
29b0f896 9022 }
520dc8e8 9023
29b0f896 9024 p = frag_more (size);
d258b828 9025 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 9026 if (GOT_symbol
2bbd9c25 9027 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 9028 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9029 || reloc_type == BFD_RELOC_X86_64_32S
9030 || (reloc_type == BFD_RELOC_64
9031 && object_64bit))
d6ab8113
JB
9032 && (i.op[n].disps->X_op == O_symbol
9033 || (i.op[n].disps->X_op == O_add
9034 && ((symbol_get_value_expression
9035 (i.op[n].disps->X_op_symbol)->X_op)
9036 == O_subtract))))
9037 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25 9038 {
4fa24527 9039 if (!object_64bit)
7b81dfbb
AJ
9040 {
9041 reloc_type = BFD_RELOC_386_GOTPC;
e379e5f3 9042 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9043 i.op[n].imms->X_add_number +=
9044 encoding_length (insn_start_frag, insn_start_off, p);
7b81dfbb
AJ
9045 }
9046 else if (reloc_type == BFD_RELOC_64)
9047 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 9048 else
7b81dfbb
AJ
9049 /* Don't do the adjustment for x86-64, as there
9050 the pcrel addressing is relative to the _next_
9051 insn, and that is taken care of in other code. */
d6ab8113 9052 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 9053 }
e379e5f3
L
9054 else if (align_branch_power)
9055 {
9056 switch (reloc_type)
9057 {
9058 case BFD_RELOC_386_TLS_GD:
9059 case BFD_RELOC_386_TLS_LDM:
9060 case BFD_RELOC_386_TLS_IE:
9061 case BFD_RELOC_386_TLS_IE_32:
9062 case BFD_RELOC_386_TLS_GOTIE:
9063 case BFD_RELOC_386_TLS_GOTDESC:
9064 case BFD_RELOC_386_TLS_DESC_CALL:
9065 case BFD_RELOC_X86_64_TLSGD:
9066 case BFD_RELOC_X86_64_TLSLD:
9067 case BFD_RELOC_X86_64_GOTTPOFF:
9068 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
9069 case BFD_RELOC_X86_64_TLSDESC_CALL:
9070 i.has_gotpc_tls_reloc = TRUE;
9071 default:
9072 break;
9073 }
9074 }
02a86693
L
9075 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
9076 size, i.op[n].disps, pcrel,
9077 reloc_type);
9078 /* Check for "call/jmp *mem", "mov mem, %reg",
9079 "test %reg, mem" and "binop mem, %reg" where binop
9080 is one of adc, add, and, cmp, or, sbb, sub, xor
e60f4d3b
L
9081 instructions without data prefix. Always generate
9082 R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
9083 if (i.prefix[DATA_PREFIX] == 0
9084 && (generate_relax_relocations
9085 || (!object_64bit
9086 && i.rm.mode == 0
9087 && i.rm.regmem == 5))
0cb4071e
L
9088 && (i.rm.mode == 2
9089 || (i.rm.mode == 0 && i.rm.regmem == 5))
2ae4c703 9090 && !is_any_vex_encoding(&i.tm)
02a86693
L
9091 && ((i.operands == 1
9092 && i.tm.base_opcode == 0xff
9093 && (i.rm.reg == 2 || i.rm.reg == 4))
9094 || (i.operands == 2
9095 && (i.tm.base_opcode == 0x8b
9096 || i.tm.base_opcode == 0x85
2ae4c703 9097 || (i.tm.base_opcode & ~0x38) == 0x03))))
02a86693
L
9098 {
9099 if (object_64bit)
9100 {
9101 fixP->fx_tcbit = i.rex != 0;
9102 if (i.base_reg
e968fc9b 9103 && (i.base_reg->reg_num == RegIP))
02a86693
L
9104 fixP->fx_tcbit2 = 1;
9105 }
9106 else
9107 fixP->fx_tcbit2 = 1;
9108 }
29b0f896
AM
9109 }
9110 }
9111 }
9112}
252b5132 9113
29b0f896 9114static void
64e74474 9115output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
9116{
9117 char *p;
9118 unsigned int n;
252b5132 9119
29b0f896
AM
9120 for (n = 0; n < i.operands; n++)
9121 {
43234a1e
L
9122 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
9123 if (i.rounding && (int) n == i.rounding->operand)
9124 continue;
9125
40fb9820 9126 if (operand_type_check (i.types[n], imm))
29b0f896
AM
9127 {
9128 if (i.op[n].imms->X_op == O_constant)
9129 {
e205caa7 9130 int size = imm_size (n);
29b0f896 9131 offsetT val;
b4cac588 9132
29b0f896
AM
9133 val = offset_in_range (i.op[n].imms->X_add_number,
9134 size);
9135 p = frag_more (size);
9136 md_number_to_chars (p, val, size);
9137 }
9138 else
9139 {
9140 /* Not absolute_section.
9141 Need a 32-bit fixup (don't support 8bit
9142 non-absolute imms). Try to support other
9143 sizes ... */
f86103b7 9144 enum bfd_reloc_code_real reloc_type;
e205caa7
L
9145 int size = imm_size (n);
9146 int sign;
29b0f896 9147
40fb9820 9148 if (i.types[n].bitfield.imm32s
a7d61044 9149 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 9150 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 9151 sign = 1;
e205caa7
L
9152 else
9153 sign = 0;
520dc8e8 9154
29b0f896 9155 p = frag_more (size);
d258b828 9156 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 9157
2bbd9c25
JJ
9158 /* This is tough to explain. We end up with this one if we
9159 * have operands that look like
9160 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
9161 * obtain the absolute address of the GOT, and it is strongly
9162 * preferable from a performance point of view to avoid using
9163 * a runtime relocation for this. The actual sequence of
9164 * instructions often look something like:
9165 *
9166 * call .L66
9167 * .L66:
9168 * popl %ebx
9169 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
9170 *
9171 * The call and pop essentially return the absolute address
9172 * of the label .L66 and store it in %ebx. The linker itself
9173 * will ultimately change the first operand of the addl so
9174 * that %ebx points to the GOT, but to keep things simple, the
9175 * .o file must have this operand set so that it generates not
9176 * the absolute address of .L66, but the absolute address of
9177 * itself. This allows the linker itself simply treat a GOTPC
9178 * relocation as asking for a pcrel offset to the GOT to be
9179 * added in, and the addend of the relocation is stored in the
9180 * operand field for the instruction itself.
9181 *
9182 * Our job here is to fix the operand so that it would add
9183 * the correct offset so that %ebx would point to itself. The
9184 * thing that is tricky is that .-.L66 will point to the
9185 * beginning of the instruction, so we need to further modify
9186 * the operand so that it will point to itself. There are
9187 * other cases where you have something like:
9188 *
9189 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
9190 *
9191 * and here no correction would be required. Internally in
9192 * the assembler we treat operands of this form as not being
9193 * pcrel since the '.' is explicitly mentioned, and I wonder
9194 * whether it would simplify matters to do it this way. Who
9195 * knows. In earlier versions of the PIC patches, the
9196 * pcrel_adjust field was used to store the correction, but
9197 * since the expression is not pcrel, I felt it would be
9198 * confusing to do it this way. */
9199
d6ab8113 9200 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
9201 || reloc_type == BFD_RELOC_X86_64_32S
9202 || reloc_type == BFD_RELOC_64)
29b0f896
AM
9203 && GOT_symbol
9204 && GOT_symbol == i.op[n].imms->X_add_symbol
9205 && (i.op[n].imms->X_op == O_symbol
9206 || (i.op[n].imms->X_op == O_add
9207 && ((symbol_get_value_expression
9208 (i.op[n].imms->X_op_symbol)->X_op)
9209 == O_subtract))))
9210 {
4fa24527 9211 if (!object_64bit)
d6ab8113 9212 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 9213 else if (size == 4)
d6ab8113 9214 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
9215 else if (size == 8)
9216 reloc_type = BFD_RELOC_X86_64_GOTPC64;
e379e5f3 9217 i.has_gotpc_tls_reloc = TRUE;
d583596c
JB
9218 i.op[n].imms->X_add_number +=
9219 encoding_length (insn_start_frag, insn_start_off, p);
29b0f896 9220 }
29b0f896
AM
9221 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
9222 i.op[n].imms, 0, reloc_type);
9223 }
9224 }
9225 }
252b5132
RH
9226}
9227\f
d182319b
JB
9228/* x86_cons_fix_new is called via the expression parsing code when a
9229 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
9230static int cons_sign = -1;
9231
9232void
e3bb37b5 9233x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 9234 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 9235{
d258b828 9236 r = reloc (len, 0, cons_sign, r);
d182319b
JB
9237
9238#ifdef TE_PE
9239 if (exp->X_op == O_secrel)
9240 {
9241 exp->X_op = O_symbol;
9242 r = BFD_RELOC_32_SECREL;
9243 }
9244#endif
9245
9246 fix_new_exp (frag, off, len, exp, 0, r);
9247}
9248
357d1bd8
L
9249/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
9250 purpose of the `.dc.a' internal pseudo-op. */
9251
9252int
9253x86_address_bytes (void)
9254{
9255 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
9256 return 4;
9257 return stdoutput->arch_info->bits_per_address / 8;
9258}
9259
d382c579
TG
9260#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
9261 || defined (LEX_AT)
d258b828 9262# define lex_got(reloc, adjust, types) NULL
718ddfc0 9263#else
f3c180ae
AM
9264/* Parse operands of the form
9265 <symbol>@GOTOFF+<nnn>
9266 and similar .plt or .got references.
9267
9268 If we find one, set up the correct relocation in RELOC and copy the
9269 input string, minus the `@GOTOFF' into a malloc'd buffer for
9270 parsing by the calling routine. Return this buffer, and if ADJUST
9271 is non-null set it to the length of the string we removed from the
9272 input line. Otherwise return NULL. */
9273static char *
91d6fa6a 9274lex_got (enum bfd_reloc_code_real *rel,
64e74474 9275 int *adjust,
d258b828 9276 i386_operand_type *types)
f3c180ae 9277{
7b81dfbb
AJ
9278 /* Some of the relocations depend on the size of what field is to
9279 be relocated. But in our callers i386_immediate and i386_displacement
9280 we don't yet know the operand size (this will be set by insn
9281 matching). Hence we record the word32 relocation here,
9282 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
9283 static const struct {
9284 const char *str;
cff8d58a 9285 int len;
4fa24527 9286 const enum bfd_reloc_code_real rel[2];
40fb9820 9287 const i386_operand_type types64;
f3c180ae 9288 } gotrel[] = {
8ce3d284 9289#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
9290 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
9291 BFD_RELOC_SIZE32 },
9292 OPERAND_TYPE_IMM32_64 },
8ce3d284 9293#endif
cff8d58a
L
9294 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
9295 BFD_RELOC_X86_64_PLTOFF64 },
40fb9820 9296 OPERAND_TYPE_IMM64 },
cff8d58a
L
9297 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
9298 BFD_RELOC_X86_64_PLT32 },
40fb9820 9299 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9300 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
9301 BFD_RELOC_X86_64_GOTPLT64 },
40fb9820 9302 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
9303 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
9304 BFD_RELOC_X86_64_GOTOFF64 },
40fb9820 9305 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
9306 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
9307 BFD_RELOC_X86_64_GOTPCREL },
40fb9820 9308 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9309 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
9310 BFD_RELOC_X86_64_TLSGD },
40fb9820 9311 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9312 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
9313 _dummy_first_bfd_reloc_code_real },
40fb9820 9314 OPERAND_TYPE_NONE },
cff8d58a
L
9315 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
9316 BFD_RELOC_X86_64_TLSLD },
40fb9820 9317 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9318 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
9319 BFD_RELOC_X86_64_GOTTPOFF },
40fb9820 9320 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9321 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
9322 BFD_RELOC_X86_64_TPOFF32 },
40fb9820 9323 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
9324 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
9325 _dummy_first_bfd_reloc_code_real },
40fb9820 9326 OPERAND_TYPE_NONE },
cff8d58a
L
9327 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
9328 BFD_RELOC_X86_64_DTPOFF32 },
40fb9820 9329 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
9330 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
9331 _dummy_first_bfd_reloc_code_real },
40fb9820 9332 OPERAND_TYPE_NONE },
cff8d58a
L
9333 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
9334 _dummy_first_bfd_reloc_code_real },
40fb9820 9335 OPERAND_TYPE_NONE },
cff8d58a
L
9336 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
9337 BFD_RELOC_X86_64_GOT32 },
40fb9820 9338 OPERAND_TYPE_IMM32_32S_64_DISP32 },
cff8d58a
L
9339 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
9340 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
40fb9820 9341 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
9342 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
9343 BFD_RELOC_X86_64_TLSDESC_CALL },
40fb9820 9344 OPERAND_TYPE_IMM32_32S_DISP32 },
f3c180ae
AM
9345 };
9346 char *cp;
9347 unsigned int j;
9348
d382c579 9349#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
9350 if (!IS_ELF)
9351 return NULL;
d382c579 9352#endif
718ddfc0 9353
f3c180ae 9354 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 9355 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
9356 return NULL;
9357
47465058 9358 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 9359 {
cff8d58a 9360 int len = gotrel[j].len;
28f81592 9361 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 9362 {
4fa24527 9363 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 9364 {
28f81592
AM
9365 int first, second;
9366 char *tmpbuf, *past_reloc;
f3c180ae 9367
91d6fa6a 9368 *rel = gotrel[j].rel[object_64bit];
f3c180ae 9369
3956db08
JB
9370 if (types)
9371 {
9372 if (flag_code != CODE_64BIT)
40fb9820
L
9373 {
9374 types->bitfield.imm32 = 1;
9375 types->bitfield.disp32 = 1;
9376 }
3956db08
JB
9377 else
9378 *types = gotrel[j].types64;
9379 }
9380
8fd4256d 9381 if (j != 0 && GOT_symbol == NULL)
f3c180ae
AM
9382 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
9383
28f81592 9384 /* The length of the first part of our input line. */
f3c180ae 9385 first = cp - input_line_pointer;
28f81592
AM
9386
9387 /* The second part goes from after the reloc token until
67c11a9b 9388 (and including) an end_of_line char or comma. */
28f81592 9389 past_reloc = cp + 1 + len;
67c11a9b
AM
9390 cp = past_reloc;
9391 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
9392 ++cp;
9393 second = cp + 1 - past_reloc;
28f81592
AM
9394
9395 /* Allocate and copy string. The trailing NUL shouldn't
9396 be necessary, but be safe. */
add39d23 9397 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 9398 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
9399 if (second != 0 && *past_reloc != ' ')
9400 /* Replace the relocation token with ' ', so that
9401 errors like foo@GOTOFF1 will be detected. */
9402 tmpbuf[first++] = ' ';
af89796a
L
9403 else
9404 /* Increment length by 1 if the relocation token is
9405 removed. */
9406 len++;
9407 if (adjust)
9408 *adjust = len;
0787a12d
AM
9409 memcpy (tmpbuf + first, past_reloc, second);
9410 tmpbuf[first + second] = '\0';
f3c180ae
AM
9411 return tmpbuf;
9412 }
9413
4fa24527
JB
9414 as_bad (_("@%s reloc is not supported with %d-bit output format"),
9415 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
9416 return NULL;
9417 }
9418 }
9419
9420 /* Might be a symbol version string. Don't as_bad here. */
9421 return NULL;
9422}
4e4f7c87 9423#endif
f3c180ae 9424
a988325c
NC
9425#ifdef TE_PE
9426#ifdef lex_got
9427#undef lex_got
9428#endif
9429/* Parse operands of the form
9430 <symbol>@SECREL32+<nnn>
9431
9432 If we find one, set up the correct relocation in RELOC and copy the
9433 input string, minus the `@SECREL32' into a malloc'd buffer for
9434 parsing by the calling routine. Return this buffer, and if ADJUST
9435 is non-null set it to the length of the string we removed from the
34bca508
L
9436 input line. Otherwise return NULL.
9437
a988325c
NC
9438 This function is copied from the ELF version above adjusted for PE targets. */
9439
9440static char *
9441lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
9442 int *adjust ATTRIBUTE_UNUSED,
d258b828 9443 i386_operand_type *types)
a988325c
NC
9444{
9445 static const struct
9446 {
9447 const char *str;
9448 int len;
9449 const enum bfd_reloc_code_real rel[2];
9450 const i386_operand_type types64;
9451 }
9452 gotrel[] =
9453 {
9454 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
9455 BFD_RELOC_32_SECREL },
9456 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
9457 };
9458
9459 char *cp;
9460 unsigned j;
9461
9462 for (cp = input_line_pointer; *cp != '@'; cp++)
9463 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
9464 return NULL;
9465
9466 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
9467 {
9468 int len = gotrel[j].len;
9469
9470 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
9471 {
9472 if (gotrel[j].rel[object_64bit] != 0)
9473 {
9474 int first, second;
9475 char *tmpbuf, *past_reloc;
9476
9477 *rel = gotrel[j].rel[object_64bit];
9478 if (adjust)
9479 *adjust = len;
9480
9481 if (types)
9482 {
9483 if (flag_code != CODE_64BIT)
9484 {
9485 types->bitfield.imm32 = 1;
9486 types->bitfield.disp32 = 1;
9487 }
9488 else
9489 *types = gotrel[j].types64;
9490 }
9491
9492 /* The length of the first part of our input line. */
9493 first = cp - input_line_pointer;
9494
9495 /* The second part goes from after the reloc token until
9496 (and including) an end_of_line char or comma. */
9497 past_reloc = cp + 1 + len;
9498 cp = past_reloc;
9499 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
9500 ++cp;
9501 second = cp + 1 - past_reloc;
9502
9503 /* Allocate and copy string. The trailing NUL shouldn't
9504 be necessary, but be safe. */
add39d23 9505 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
9506 memcpy (tmpbuf, input_line_pointer, first);
9507 if (second != 0 && *past_reloc != ' ')
9508 /* Replace the relocation token with ' ', so that
9509 errors like foo@SECLREL321 will be detected. */
9510 tmpbuf[first++] = ' ';
9511 memcpy (tmpbuf + first, past_reloc, second);
9512 tmpbuf[first + second] = '\0';
9513 return tmpbuf;
9514 }
9515
9516 as_bad (_("@%s reloc is not supported with %d-bit output format"),
9517 gotrel[j].str, 1 << (5 + object_64bit));
9518 return NULL;
9519 }
9520 }
9521
9522 /* Might be a symbol version string. Don't as_bad here. */
9523 return NULL;
9524}
9525
9526#endif /* TE_PE */
9527
62ebcb5c 9528bfd_reloc_code_real_type
e3bb37b5 9529x86_cons (expressionS *exp, int size)
f3c180ae 9530{
62ebcb5c
AM
9531 bfd_reloc_code_real_type got_reloc = NO_RELOC;
9532
ee86248c
JB
9533 intel_syntax = -intel_syntax;
9534
3c7b9c2c 9535 exp->X_md = 0;
4fa24527 9536 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
9537 {
9538 /* Handle @GOTOFF and the like in an expression. */
9539 char *save;
9540 char *gotfree_input_line;
4a57f2cf 9541 int adjust = 0;
f3c180ae
AM
9542
9543 save = input_line_pointer;
d258b828 9544 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
9545 if (gotfree_input_line)
9546 input_line_pointer = gotfree_input_line;
9547
9548 expression (exp);
9549
9550 if (gotfree_input_line)
9551 {
9552 /* expression () has merrily parsed up to the end of line,
9553 or a comma - in the wrong buffer. Transfer how far
9554 input_line_pointer has moved to the right buffer. */
9555 input_line_pointer = (save
9556 + (input_line_pointer - gotfree_input_line)
9557 + adjust);
9558 free (gotfree_input_line);
3992d3b7
AM
9559 if (exp->X_op == O_constant
9560 || exp->X_op == O_absent
9561 || exp->X_op == O_illegal
0398aac5 9562 || exp->X_op == O_register
3992d3b7
AM
9563 || exp->X_op == O_big)
9564 {
9565 char c = *input_line_pointer;
9566 *input_line_pointer = 0;
9567 as_bad (_("missing or invalid expression `%s'"), save);
9568 *input_line_pointer = c;
9569 }
b9519cfe
L
9570 else if ((got_reloc == BFD_RELOC_386_PLT32
9571 || got_reloc == BFD_RELOC_X86_64_PLT32)
9572 && exp->X_op != O_symbol)
9573 {
9574 char c = *input_line_pointer;
9575 *input_line_pointer = 0;
9576 as_bad (_("invalid PLT expression `%s'"), save);
9577 *input_line_pointer = c;
9578 }
f3c180ae
AM
9579 }
9580 }
9581 else
9582 expression (exp);
ee86248c
JB
9583
9584 intel_syntax = -intel_syntax;
9585
9586 if (intel_syntax)
9587 i386_intel_simplify (exp);
62ebcb5c
AM
9588
9589 return got_reloc;
f3c180ae 9590}
f3c180ae 9591
9f32dd5b
L
9592static void
9593signed_cons (int size)
6482c264 9594{
d182319b
JB
9595 if (flag_code == CODE_64BIT)
9596 cons_sign = 1;
9597 cons (size);
9598 cons_sign = -1;
6482c264
NC
9599}
9600
d182319b 9601#ifdef TE_PE
6482c264 9602static void
7016a5d5 9603pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
9604{
9605 expressionS exp;
9606
9607 do
9608 {
9609 expression (&exp);
9610 if (exp.X_op == O_symbol)
9611 exp.X_op = O_secrel;
9612
9613 emit_expr (&exp, 4);
9614 }
9615 while (*input_line_pointer++ == ',');
9616
9617 input_line_pointer--;
9618 demand_empty_rest_of_line ();
9619}
6482c264
NC
9620#endif
9621
43234a1e
L
9622/* Handle Vector operations. */
9623
9624static char *
9625check_VecOperations (char *op_string, char *op_end)
9626{
9627 const reg_entry *mask;
9628 const char *saved;
9629 char *end_op;
9630
9631 while (*op_string
9632 && (op_end == NULL || op_string < op_end))
9633 {
9634 saved = op_string;
9635 if (*op_string == '{')
9636 {
9637 op_string++;
9638
9639 /* Check broadcasts. */
9640 if (strncmp (op_string, "1to", 3) == 0)
9641 {
9642 int bcst_type;
9643
9644 if (i.broadcast)
9645 goto duplicated_vec_op;
9646
9647 op_string += 3;
9648 if (*op_string == '8')
8e6e0792 9649 bcst_type = 8;
b28d1bda 9650 else if (*op_string == '4')
8e6e0792 9651 bcst_type = 4;
b28d1bda 9652 else if (*op_string == '2')
8e6e0792 9653 bcst_type = 2;
43234a1e
L
9654 else if (*op_string == '1'
9655 && *(op_string+1) == '6')
9656 {
8e6e0792 9657 bcst_type = 16;
43234a1e
L
9658 op_string++;
9659 }
9660 else
9661 {
9662 as_bad (_("Unsupported broadcast: `%s'"), saved);
9663 return NULL;
9664 }
9665 op_string++;
9666
9667 broadcast_op.type = bcst_type;
9668 broadcast_op.operand = this_operand;
1f75763a 9669 broadcast_op.bytes = 0;
43234a1e
L
9670 i.broadcast = &broadcast_op;
9671 }
9672 /* Check masking operation. */
9673 else if ((mask = parse_register (op_string, &end_op)) != NULL)
9674 {
9675 /* k0 can't be used for write mask. */
f74a6307 9676 if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
43234a1e 9677 {
6d2cd6b2
JB
9678 as_bad (_("`%s%s' can't be used for write mask"),
9679 register_prefix, mask->reg_name);
43234a1e
L
9680 return NULL;
9681 }
9682
9683 if (!i.mask)
9684 {
9685 mask_op.mask = mask;
9686 mask_op.zeroing = 0;
9687 mask_op.operand = this_operand;
9688 i.mask = &mask_op;
9689 }
9690 else
9691 {
9692 if (i.mask->mask)
9693 goto duplicated_vec_op;
9694
9695 i.mask->mask = mask;
9696
9697 /* Only "{z}" is allowed here. No need to check
9698 zeroing mask explicitly. */
9699 if (i.mask->operand != this_operand)
9700 {
9701 as_bad (_("invalid write mask `%s'"), saved);
9702 return NULL;
9703 }
9704 }
9705
9706 op_string = end_op;
9707 }
9708 /* Check zeroing-flag for masking operation. */
9709 else if (*op_string == 'z')
9710 {
9711 if (!i.mask)
9712 {
9713 mask_op.mask = NULL;
9714 mask_op.zeroing = 1;
9715 mask_op.operand = this_operand;
9716 i.mask = &mask_op;
9717 }
9718 else
9719 {
9720 if (i.mask->zeroing)
9721 {
9722 duplicated_vec_op:
9723 as_bad (_("duplicated `%s'"), saved);
9724 return NULL;
9725 }
9726
9727 i.mask->zeroing = 1;
9728
9729 /* Only "{%k}" is allowed here. No need to check mask
9730 register explicitly. */
9731 if (i.mask->operand != this_operand)
9732 {
9733 as_bad (_("invalid zeroing-masking `%s'"),
9734 saved);
9735 return NULL;
9736 }
9737 }
9738
9739 op_string++;
9740 }
9741 else
9742 goto unknown_vec_op;
9743
9744 if (*op_string != '}')
9745 {
9746 as_bad (_("missing `}' in `%s'"), saved);
9747 return NULL;
9748 }
9749 op_string++;
0ba3a731
L
9750
9751 /* Strip whitespace since the addition of pseudo prefixes
9752 changed how the scrubber treats '{'. */
9753 if (is_space_char (*op_string))
9754 ++op_string;
9755
43234a1e
L
9756 continue;
9757 }
9758 unknown_vec_op:
9759 /* We don't know this one. */
9760 as_bad (_("unknown vector operation: `%s'"), saved);
9761 return NULL;
9762 }
9763
6d2cd6b2
JB
9764 if (i.mask && i.mask->zeroing && !i.mask->mask)
9765 {
9766 as_bad (_("zeroing-masking only allowed with write mask"));
9767 return NULL;
9768 }
9769
43234a1e
L
9770 return op_string;
9771}
9772
252b5132 9773static int
70e41ade 9774i386_immediate (char *imm_start)
252b5132
RH
9775{
9776 char *save_input_line_pointer;
f3c180ae 9777 char *gotfree_input_line;
252b5132 9778 segT exp_seg = 0;
47926f60 9779 expressionS *exp;
40fb9820
L
9780 i386_operand_type types;
9781
0dfbf9d7 9782 operand_type_set (&types, ~0);
252b5132
RH
9783
9784 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
9785 {
31b2323c
L
9786 as_bad (_("at most %d immediate operands are allowed"),
9787 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
9788 return 0;
9789 }
9790
9791 exp = &im_expressions[i.imm_operands++];
520dc8e8 9792 i.op[this_operand].imms = exp;
252b5132
RH
9793
9794 if (is_space_char (*imm_start))
9795 ++imm_start;
9796
9797 save_input_line_pointer = input_line_pointer;
9798 input_line_pointer = imm_start;
9799
d258b828 9800 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
9801 if (gotfree_input_line)
9802 input_line_pointer = gotfree_input_line;
252b5132
RH
9803
9804 exp_seg = expression (exp);
9805
83183c0c 9806 SKIP_WHITESPACE ();
43234a1e
L
9807
9808 /* Handle vector operations. */
9809 if (*input_line_pointer == '{')
9810 {
9811 input_line_pointer = check_VecOperations (input_line_pointer,
9812 NULL);
9813 if (input_line_pointer == NULL)
9814 return 0;
9815 }
9816
252b5132 9817 if (*input_line_pointer)
f3c180ae 9818 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
9819
9820 input_line_pointer = save_input_line_pointer;
f3c180ae 9821 if (gotfree_input_line)
ee86248c
JB
9822 {
9823 free (gotfree_input_line);
9824
9825 if (exp->X_op == O_constant || exp->X_op == O_register)
9826 exp->X_op = O_illegal;
9827 }
9828
9829 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
9830}
252b5132 9831
ee86248c
JB
9832static int
9833i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
9834 i386_operand_type types, const char *imm_start)
9835{
9836 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 9837 {
313c53d1
L
9838 if (imm_start)
9839 as_bad (_("missing or invalid immediate expression `%s'"),
9840 imm_start);
3992d3b7 9841 return 0;
252b5132 9842 }
3e73aa7c 9843 else if (exp->X_op == O_constant)
252b5132 9844 {
47926f60 9845 /* Size it properly later. */
40fb9820 9846 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
9847 /* If not 64bit, sign extend val. */
9848 if (flag_code != CODE_64BIT
4eed87de
AM
9849 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
9850 exp->X_add_number
9851 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 9852 }
4c63da97 9853#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 9854 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 9855 && exp_seg != absolute_section
47926f60 9856 && exp_seg != text_section
24eab124
AM
9857 && exp_seg != data_section
9858 && exp_seg != bss_section
9859 && exp_seg != undefined_section
f86103b7 9860 && !bfd_is_com_section (exp_seg))
252b5132 9861 {
d0b47220 9862 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
9863 return 0;
9864 }
9865#endif
a841bdf5 9866 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 9867 {
313c53d1
L
9868 if (imm_start)
9869 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
9870 return 0;
9871 }
252b5132
RH
9872 else
9873 {
9874 /* This is an address. The size of the address will be
24eab124 9875 determined later, depending on destination register,
3e73aa7c 9876 suffix, or the default for the section. */
40fb9820
L
9877 i.types[this_operand].bitfield.imm8 = 1;
9878 i.types[this_operand].bitfield.imm16 = 1;
9879 i.types[this_operand].bitfield.imm32 = 1;
9880 i.types[this_operand].bitfield.imm32s = 1;
9881 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
9882 i.types[this_operand] = operand_type_and (i.types[this_operand],
9883 types);
252b5132
RH
9884 }
9885
9886 return 1;
9887}
9888
551c1ca1 9889static char *
e3bb37b5 9890i386_scale (char *scale)
252b5132 9891{
551c1ca1
AM
9892 offsetT val;
9893 char *save = input_line_pointer;
252b5132 9894
551c1ca1
AM
9895 input_line_pointer = scale;
9896 val = get_absolute_expression ();
9897
9898 switch (val)
252b5132 9899 {
551c1ca1 9900 case 1:
252b5132
RH
9901 i.log2_scale_factor = 0;
9902 break;
551c1ca1 9903 case 2:
252b5132
RH
9904 i.log2_scale_factor = 1;
9905 break;
551c1ca1 9906 case 4:
252b5132
RH
9907 i.log2_scale_factor = 2;
9908 break;
551c1ca1 9909 case 8:
252b5132
RH
9910 i.log2_scale_factor = 3;
9911 break;
9912 default:
a724f0f4
JB
9913 {
9914 char sep = *input_line_pointer;
9915
9916 *input_line_pointer = '\0';
9917 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
9918 scale);
9919 *input_line_pointer = sep;
9920 input_line_pointer = save;
9921 return NULL;
9922 }
252b5132 9923 }
29b0f896 9924 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
9925 {
9926 as_warn (_("scale factor of %d without an index register"),
24eab124 9927 1 << i.log2_scale_factor);
252b5132 9928 i.log2_scale_factor = 0;
252b5132 9929 }
551c1ca1
AM
9930 scale = input_line_pointer;
9931 input_line_pointer = save;
9932 return scale;
252b5132
RH
9933}
9934
252b5132 9935static int
e3bb37b5 9936i386_displacement (char *disp_start, char *disp_end)
252b5132 9937{
29b0f896 9938 expressionS *exp;
252b5132
RH
9939 segT exp_seg = 0;
9940 char *save_input_line_pointer;
f3c180ae 9941 char *gotfree_input_line;
40fb9820
L
9942 int override;
9943 i386_operand_type bigdisp, types = anydisp;
3992d3b7 9944 int ret;
252b5132 9945
31b2323c
L
9946 if (i.disp_operands == MAX_MEMORY_OPERANDS)
9947 {
9948 as_bad (_("at most %d displacement operands are allowed"),
9949 MAX_MEMORY_OPERANDS);
9950 return 0;
9951 }
9952
0dfbf9d7 9953 operand_type_set (&bigdisp, 0);
6f2f06be 9954 if (i.jumpabsolute
48bcea9f 9955 || i.types[this_operand].bitfield.baseindex
0cfa3eb3
JB
9956 || (current_templates->start->opcode_modifier.jump != JUMP
9957 && current_templates->start->opcode_modifier.jump != JUMP_DWORD))
e05278af 9958 {
48bcea9f 9959 i386_addressing_mode ();
e05278af 9960 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
9961 if (flag_code == CODE_64BIT)
9962 {
9963 if (!override)
9964 {
9965 bigdisp.bitfield.disp32s = 1;
9966 bigdisp.bitfield.disp64 = 1;
9967 }
48bcea9f
JB
9968 else
9969 bigdisp.bitfield.disp32 = 1;
40fb9820
L
9970 }
9971 else if ((flag_code == CODE_16BIT) ^ override)
40fb9820 9972 bigdisp.bitfield.disp16 = 1;
48bcea9f
JB
9973 else
9974 bigdisp.bitfield.disp32 = 1;
e05278af
JB
9975 }
9976 else
9977 {
376cd056
JB
9978 /* For PC-relative branches, the width of the displacement may be
9979 dependent upon data size, but is never dependent upon address size.
9980 Also make sure to not unintentionally match against a non-PC-relative
9981 branch template. */
9982 static templates aux_templates;
9983 const insn_template *t = current_templates->start;
9984 bfd_boolean has_intel64 = FALSE;
9985
9986 aux_templates.start = t;
9987 while (++t < current_templates->end)
9988 {
9989 if (t->opcode_modifier.jump
9990 != current_templates->start->opcode_modifier.jump)
9991 break;
4b5aaf5f 9992 if ((t->opcode_modifier.isa64 >= INTEL64))
376cd056
JB
9993 has_intel64 = TRUE;
9994 }
9995 if (t < current_templates->end)
9996 {
9997 aux_templates.end = t;
9998 current_templates = &aux_templates;
9999 }
10000
e05278af 10001 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
10002 if (flag_code == CODE_64BIT)
10003 {
376cd056
JB
10004 if ((override || i.suffix == WORD_MNEM_SUFFIX)
10005 && (!intel64 || !has_intel64))
40fb9820
L
10006 bigdisp.bitfield.disp16 = 1;
10007 else
48bcea9f 10008 bigdisp.bitfield.disp32s = 1;
40fb9820
L
10009 }
10010 else
e05278af
JB
10011 {
10012 if (!override)
10013 override = (i.suffix == (flag_code != CODE_16BIT
10014 ? WORD_MNEM_SUFFIX
10015 : LONG_MNEM_SUFFIX));
40fb9820
L
10016 bigdisp.bitfield.disp32 = 1;
10017 if ((flag_code == CODE_16BIT) ^ override)
10018 {
10019 bigdisp.bitfield.disp32 = 0;
10020 bigdisp.bitfield.disp16 = 1;
10021 }
e05278af 10022 }
e05278af 10023 }
c6fb90c8
L
10024 i.types[this_operand] = operand_type_or (i.types[this_operand],
10025 bigdisp);
252b5132
RH
10026
10027 exp = &disp_expressions[i.disp_operands];
520dc8e8 10028 i.op[this_operand].disps = exp;
252b5132
RH
10029 i.disp_operands++;
10030 save_input_line_pointer = input_line_pointer;
10031 input_line_pointer = disp_start;
10032 END_STRING_AND_SAVE (disp_end);
10033
10034#ifndef GCC_ASM_O_HACK
10035#define GCC_ASM_O_HACK 0
10036#endif
10037#if GCC_ASM_O_HACK
10038 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 10039 if (i.types[this_operand].bitfield.baseIndex
24eab124 10040 && displacement_string_end[-1] == '+')
252b5132
RH
10041 {
10042 /* This hack is to avoid a warning when using the "o"
24eab124
AM
10043 constraint within gcc asm statements.
10044 For instance:
10045
10046 #define _set_tssldt_desc(n,addr,limit,type) \
10047 __asm__ __volatile__ ( \
10048 "movw %w2,%0\n\t" \
10049 "movw %w1,2+%0\n\t" \
10050 "rorl $16,%1\n\t" \
10051 "movb %b1,4+%0\n\t" \
10052 "movb %4,5+%0\n\t" \
10053 "movb $0,6+%0\n\t" \
10054 "movb %h1,7+%0\n\t" \
10055 "rorl $16,%1" \
10056 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
10057
10058 This works great except that the output assembler ends
10059 up looking a bit weird if it turns out that there is
10060 no offset. You end up producing code that looks like:
10061
10062 #APP
10063 movw $235,(%eax)
10064 movw %dx,2+(%eax)
10065 rorl $16,%edx
10066 movb %dl,4+(%eax)
10067 movb $137,5+(%eax)
10068 movb $0,6+(%eax)
10069 movb %dh,7+(%eax)
10070 rorl $16,%edx
10071 #NO_APP
10072
47926f60 10073 So here we provide the missing zero. */
24eab124
AM
10074
10075 *displacement_string_end = '0';
252b5132
RH
10076 }
10077#endif
d258b828 10078 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
10079 if (gotfree_input_line)
10080 input_line_pointer = gotfree_input_line;
252b5132 10081
24eab124 10082 exp_seg = expression (exp);
252b5132 10083
636c26b0
AM
10084 SKIP_WHITESPACE ();
10085 if (*input_line_pointer)
10086 as_bad (_("junk `%s' after expression"), input_line_pointer);
10087#if GCC_ASM_O_HACK
10088 RESTORE_END_STRING (disp_end + 1);
10089#endif
636c26b0 10090 input_line_pointer = save_input_line_pointer;
636c26b0 10091 if (gotfree_input_line)
ee86248c
JB
10092 {
10093 free (gotfree_input_line);
10094
10095 if (exp->X_op == O_constant || exp->X_op == O_register)
10096 exp->X_op = O_illegal;
10097 }
10098
10099 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
10100
10101 RESTORE_END_STRING (disp_end);
10102
10103 return ret;
10104}
10105
10106static int
10107i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
10108 i386_operand_type types, const char *disp_start)
10109{
10110 i386_operand_type bigdisp;
10111 int ret = 1;
636c26b0 10112
24eab124
AM
10113 /* We do this to make sure that the section symbol is in
10114 the symbol table. We will ultimately change the relocation
47926f60 10115 to be relative to the beginning of the section. */
1ae12ab7 10116 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
10117 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
10118 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 10119 {
636c26b0 10120 if (exp->X_op != O_symbol)
3992d3b7 10121 goto inv_disp;
636c26b0 10122
e5cb08ac 10123 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
10124 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
10125 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 10126 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
10127 exp->X_op = O_subtract;
10128 exp->X_op_symbol = GOT_symbol;
1ae12ab7 10129 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 10130 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
10131 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
10132 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 10133 else
29b0f896 10134 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 10135 }
252b5132 10136
3992d3b7
AM
10137 else if (exp->X_op == O_absent
10138 || exp->X_op == O_illegal
ee86248c 10139 || exp->X_op == O_big)
2daf4fd8 10140 {
3992d3b7
AM
10141 inv_disp:
10142 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 10143 disp_start);
3992d3b7 10144 ret = 0;
2daf4fd8
AM
10145 }
10146
0e1147d9
L
10147 else if (flag_code == CODE_64BIT
10148 && !i.prefix[ADDR_PREFIX]
10149 && exp->X_op == O_constant)
10150 {
10151 /* Since displacement is signed extended to 64bit, don't allow
10152 disp32 and turn off disp32s if they are out of range. */
10153 i.types[this_operand].bitfield.disp32 = 0;
10154 if (!fits_in_signed_long (exp->X_add_number))
10155 {
10156 i.types[this_operand].bitfield.disp32s = 0;
10157 if (i.types[this_operand].bitfield.baseindex)
10158 {
10159 as_bad (_("0x%lx out range of signed 32bit displacement"),
10160 (long) exp->X_add_number);
10161 ret = 0;
10162 }
10163 }
10164 }
10165
4c63da97 10166#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
10167 else if (exp->X_op != O_constant
10168 && OUTPUT_FLAVOR == bfd_target_aout_flavour
10169 && exp_seg != absolute_section
10170 && exp_seg != text_section
10171 && exp_seg != data_section
10172 && exp_seg != bss_section
10173 && exp_seg != undefined_section
10174 && !bfd_is_com_section (exp_seg))
24eab124 10175 {
d0b47220 10176 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 10177 ret = 0;
24eab124 10178 }
252b5132 10179#endif
3956db08 10180
48bcea9f
JB
10181 if (current_templates->start->opcode_modifier.jump == JUMP_BYTE
10182 /* Constants get taken care of by optimize_disp(). */
10183 && exp->X_op != O_constant)
10184 i.types[this_operand].bitfield.disp8 = 1;
10185
40fb9820
L
10186 /* Check if this is a displacement only operand. */
10187 bigdisp = i.types[this_operand];
10188 bigdisp.bitfield.disp8 = 0;
10189 bigdisp.bitfield.disp16 = 0;
10190 bigdisp.bitfield.disp32 = 0;
10191 bigdisp.bitfield.disp32s = 0;
10192 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 10193 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
10194 i.types[this_operand] = operand_type_and (i.types[this_operand],
10195 types);
3956db08 10196
3992d3b7 10197 return ret;
252b5132
RH
10198}
10199
2abc2bec
JB
10200/* Return the active addressing mode, taking address override and
10201 registers forming the address into consideration. Update the
10202 address override prefix if necessary. */
47926f60 10203
2abc2bec
JB
10204static enum flag_code
10205i386_addressing_mode (void)
252b5132 10206{
be05d201
L
10207 enum flag_code addr_mode;
10208
10209 if (i.prefix[ADDR_PREFIX])
10210 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
10211 else
10212 {
10213 addr_mode = flag_code;
10214
24eab124 10215#if INFER_ADDR_PREFIX
be05d201
L
10216 if (i.mem_operands == 0)
10217 {
10218 /* Infer address prefix from the first memory operand. */
10219 const reg_entry *addr_reg = i.base_reg;
10220
10221 if (addr_reg == NULL)
10222 addr_reg = i.index_reg;
eecb386c 10223
be05d201
L
10224 if (addr_reg)
10225 {
e968fc9b 10226 if (addr_reg->reg_type.bitfield.dword)
be05d201
L
10227 addr_mode = CODE_32BIT;
10228 else if (flag_code != CODE_64BIT
dc821c5f 10229 && addr_reg->reg_type.bitfield.word)
be05d201
L
10230 addr_mode = CODE_16BIT;
10231
10232 if (addr_mode != flag_code)
10233 {
10234 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
10235 i.prefixes += 1;
10236 /* Change the size of any displacement too. At most one
10237 of Disp16 or Disp32 is set.
10238 FIXME. There doesn't seem to be any real need for
10239 separate Disp16 and Disp32 flags. The same goes for
10240 Imm16 and Imm32. Removing them would probably clean
10241 up the code quite a lot. */
10242 if (flag_code != CODE_64BIT
10243 && (i.types[this_operand].bitfield.disp16
10244 || i.types[this_operand].bitfield.disp32))
10245 i.types[this_operand]
10246 = operand_type_xor (i.types[this_operand], disp16_32);
10247 }
10248 }
10249 }
24eab124 10250#endif
be05d201
L
10251 }
10252
2abc2bec
JB
10253 return addr_mode;
10254}
10255
10256/* Make sure the memory operand we've been dealt is valid.
10257 Return 1 on success, 0 on a failure. */
10258
10259static int
10260i386_index_check (const char *operand_string)
10261{
10262 const char *kind = "base/index";
10263 enum flag_code addr_mode = i386_addressing_mode ();
10264
fc0763e6 10265 if (current_templates->start->opcode_modifier.isstring
c3949f43 10266 && !current_templates->start->cpu_flags.bitfield.cpupadlock
fc0763e6
JB
10267 && (current_templates->end[-1].opcode_modifier.isstring
10268 || i.mem_operands))
10269 {
10270 /* Memory operands of string insns are special in that they only allow
10271 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
10272 const reg_entry *expected_reg;
10273 static const char *di_si[][2] =
10274 {
10275 { "esi", "edi" },
10276 { "si", "di" },
10277 { "rsi", "rdi" }
10278 };
10279 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
10280
10281 kind = "string address";
10282
8325cc63 10283 if (current_templates->start->opcode_modifier.repprefixok)
fc0763e6 10284 {
51c8edf6
JB
10285 int es_op = current_templates->end[-1].opcode_modifier.isstring
10286 - IS_STRING_ES_OP0;
10287 int op = 0;
fc0763e6 10288
51c8edf6 10289 if (!current_templates->end[-1].operand_types[0].bitfield.baseindex
fc0763e6
JB
10290 || ((!i.mem_operands != !intel_syntax)
10291 && current_templates->end[-1].operand_types[1]
10292 .bitfield.baseindex))
51c8edf6
JB
10293 op = 1;
10294 expected_reg = hash_find (reg_hash, di_si[addr_mode][op == es_op]);
fc0763e6
JB
10295 }
10296 else
be05d201 10297 expected_reg = hash_find (reg_hash, bx[addr_mode]);
fc0763e6 10298
be05d201
L
10299 if (i.base_reg != expected_reg
10300 || i.index_reg
fc0763e6 10301 || operand_type_check (i.types[this_operand], disp))
fc0763e6 10302 {
be05d201
L
10303 /* The second memory operand must have the same size as
10304 the first one. */
10305 if (i.mem_operands
10306 && i.base_reg
10307 && !((addr_mode == CODE_64BIT
dc821c5f 10308 && i.base_reg->reg_type.bitfield.qword)
be05d201 10309 || (addr_mode == CODE_32BIT
dc821c5f
JB
10310 ? i.base_reg->reg_type.bitfield.dword
10311 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
10312 goto bad_address;
10313
fc0763e6
JB
10314 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
10315 operand_string,
10316 intel_syntax ? '[' : '(',
10317 register_prefix,
be05d201 10318 expected_reg->reg_name,
fc0763e6 10319 intel_syntax ? ']' : ')');
be05d201 10320 return 1;
fc0763e6 10321 }
be05d201
L
10322 else
10323 return 1;
10324
10325bad_address:
10326 as_bad (_("`%s' is not a valid %s expression"),
10327 operand_string, kind);
10328 return 0;
3e73aa7c
JH
10329 }
10330 else
10331 {
be05d201
L
10332 if (addr_mode != CODE_16BIT)
10333 {
10334 /* 32-bit/64-bit checks. */
10335 if ((i.base_reg
e968fc9b
JB
10336 && ((addr_mode == CODE_64BIT
10337 ? !i.base_reg->reg_type.bitfield.qword
10338 : !i.base_reg->reg_type.bitfield.dword)
10339 || (i.index_reg && i.base_reg->reg_num == RegIP)
10340 || i.base_reg->reg_num == RegIZ))
be05d201 10341 || (i.index_reg
1b54b8d7
JB
10342 && !i.index_reg->reg_type.bitfield.xmmword
10343 && !i.index_reg->reg_type.bitfield.ymmword
10344 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 10345 && ((addr_mode == CODE_64BIT
e968fc9b
JB
10346 ? !i.index_reg->reg_type.bitfield.qword
10347 : !i.index_reg->reg_type.bitfield.dword)
be05d201
L
10348 || !i.index_reg->reg_type.bitfield.baseindex)))
10349 goto bad_address;
8178be5b
JB
10350
10351 /* bndmk, bndldx, and bndstx have special restrictions. */
10352 if (current_templates->start->base_opcode == 0xf30f1b
10353 || (current_templates->start->base_opcode & ~1) == 0x0f1a)
10354 {
10355 /* They cannot use RIP-relative addressing. */
e968fc9b 10356 if (i.base_reg && i.base_reg->reg_num == RegIP)
8178be5b
JB
10357 {
10358 as_bad (_("`%s' cannot be used here"), operand_string);
10359 return 0;
10360 }
10361
10362 /* bndldx and bndstx ignore their scale factor. */
10363 if (current_templates->start->base_opcode != 0xf30f1b
10364 && i.log2_scale_factor)
10365 as_warn (_("register scaling is being ignored here"));
10366 }
be05d201
L
10367 }
10368 else
3e73aa7c 10369 {
be05d201 10370 /* 16-bit checks. */
3e73aa7c 10371 if ((i.base_reg
dc821c5f 10372 && (!i.base_reg->reg_type.bitfield.word
40fb9820 10373 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 10374 || (i.index_reg
dc821c5f 10375 && (!i.index_reg->reg_type.bitfield.word
40fb9820 10376 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
10377 || !(i.base_reg
10378 && i.base_reg->reg_num < 6
10379 && i.index_reg->reg_num >= 6
10380 && i.log2_scale_factor == 0))))
be05d201 10381 goto bad_address;
3e73aa7c
JH
10382 }
10383 }
be05d201 10384 return 1;
24eab124 10385}
252b5132 10386
43234a1e
L
10387/* Handle vector immediates. */
10388
10389static int
10390RC_SAE_immediate (const char *imm_start)
10391{
10392 unsigned int match_found, j;
10393 const char *pstr = imm_start;
10394 expressionS *exp;
10395
10396 if (*pstr != '{')
10397 return 0;
10398
10399 pstr++;
10400 match_found = 0;
10401 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
10402 {
10403 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
10404 {
10405 if (!i.rounding)
10406 {
10407 rc_op.type = RC_NamesTable[j].type;
10408 rc_op.operand = this_operand;
10409 i.rounding = &rc_op;
10410 }
10411 else
10412 {
10413 as_bad (_("duplicated `%s'"), imm_start);
10414 return 0;
10415 }
10416 pstr += RC_NamesTable[j].len;
10417 match_found = 1;
10418 break;
10419 }
10420 }
10421 if (!match_found)
10422 return 0;
10423
10424 if (*pstr++ != '}')
10425 {
10426 as_bad (_("Missing '}': '%s'"), imm_start);
10427 return 0;
10428 }
10429 /* RC/SAE immediate string should contain nothing more. */;
10430 if (*pstr != 0)
10431 {
10432 as_bad (_("Junk after '}': '%s'"), imm_start);
10433 return 0;
10434 }
10435
10436 exp = &im_expressions[i.imm_operands++];
10437 i.op[this_operand].imms = exp;
10438
10439 exp->X_op = O_constant;
10440 exp->X_add_number = 0;
10441 exp->X_add_symbol = (symbolS *) 0;
10442 exp->X_op_symbol = (symbolS *) 0;
10443
10444 i.types[this_operand].bitfield.imm8 = 1;
10445 return 1;
10446}
10447
8325cc63
JB
10448/* Only string instructions can have a second memory operand, so
10449 reduce current_templates to just those if it contains any. */
10450static int
10451maybe_adjust_templates (void)
10452{
10453 const insn_template *t;
10454
10455 gas_assert (i.mem_operands == 1);
10456
10457 for (t = current_templates->start; t < current_templates->end; ++t)
10458 if (t->opcode_modifier.isstring)
10459 break;
10460
10461 if (t < current_templates->end)
10462 {
10463 static templates aux_templates;
10464 bfd_boolean recheck;
10465
10466 aux_templates.start = t;
10467 for (; t < current_templates->end; ++t)
10468 if (!t->opcode_modifier.isstring)
10469 break;
10470 aux_templates.end = t;
10471
10472 /* Determine whether to re-check the first memory operand. */
10473 recheck = (aux_templates.start != current_templates->start
10474 || t != current_templates->end);
10475
10476 current_templates = &aux_templates;
10477
10478 if (recheck)
10479 {
10480 i.mem_operands = 0;
10481 if (i.memop1_string != NULL
10482 && i386_index_check (i.memop1_string) == 0)
10483 return 0;
10484 i.mem_operands = 1;
10485 }
10486 }
10487
10488 return 1;
10489}
10490
fc0763e6 10491/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 10492 on error. */
252b5132 10493
252b5132 10494static int
a7619375 10495i386_att_operand (char *operand_string)
252b5132 10496{
af6bdddf
AM
10497 const reg_entry *r;
10498 char *end_op;
24eab124 10499 char *op_string = operand_string;
252b5132 10500
24eab124 10501 if (is_space_char (*op_string))
252b5132
RH
10502 ++op_string;
10503
24eab124 10504 /* We check for an absolute prefix (differentiating,
47926f60 10505 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
10506 if (*op_string == ABSOLUTE_PREFIX)
10507 {
10508 ++op_string;
10509 if (is_space_char (*op_string))
10510 ++op_string;
6f2f06be 10511 i.jumpabsolute = TRUE;
24eab124 10512 }
252b5132 10513
47926f60 10514 /* Check if operand is a register. */
4d1bb795 10515 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 10516 {
40fb9820
L
10517 i386_operand_type temp;
10518
24eab124
AM
10519 /* Check for a segment override by searching for ':' after a
10520 segment register. */
10521 op_string = end_op;
10522 if (is_space_char (*op_string))
10523 ++op_string;
00cee14f 10524 if (*op_string == ':' && r->reg_type.bitfield.class == SReg)
24eab124
AM
10525 {
10526 switch (r->reg_num)
10527 {
10528 case 0:
10529 i.seg[i.mem_operands] = &es;
10530 break;
10531 case 1:
10532 i.seg[i.mem_operands] = &cs;
10533 break;
10534 case 2:
10535 i.seg[i.mem_operands] = &ss;
10536 break;
10537 case 3:
10538 i.seg[i.mem_operands] = &ds;
10539 break;
10540 case 4:
10541 i.seg[i.mem_operands] = &fs;
10542 break;
10543 case 5:
10544 i.seg[i.mem_operands] = &gs;
10545 break;
10546 }
252b5132 10547
24eab124 10548 /* Skip the ':' and whitespace. */
252b5132
RH
10549 ++op_string;
10550 if (is_space_char (*op_string))
24eab124 10551 ++op_string;
252b5132 10552
24eab124
AM
10553 if (!is_digit_char (*op_string)
10554 && !is_identifier_char (*op_string)
10555 && *op_string != '('
10556 && *op_string != ABSOLUTE_PREFIX)
10557 {
10558 as_bad (_("bad memory operand `%s'"), op_string);
10559 return 0;
10560 }
47926f60 10561 /* Handle case of %es:*foo. */
24eab124
AM
10562 if (*op_string == ABSOLUTE_PREFIX)
10563 {
10564 ++op_string;
10565 if (is_space_char (*op_string))
10566 ++op_string;
6f2f06be 10567 i.jumpabsolute = TRUE;
24eab124
AM
10568 }
10569 goto do_memory_reference;
10570 }
43234a1e
L
10571
10572 /* Handle vector operations. */
10573 if (*op_string == '{')
10574 {
10575 op_string = check_VecOperations (op_string, NULL);
10576 if (op_string == NULL)
10577 return 0;
10578 }
10579
24eab124
AM
10580 if (*op_string)
10581 {
d0b47220 10582 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
10583 return 0;
10584 }
40fb9820
L
10585 temp = r->reg_type;
10586 temp.bitfield.baseindex = 0;
c6fb90c8
L
10587 i.types[this_operand] = operand_type_or (i.types[this_operand],
10588 temp);
7d5e4556 10589 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 10590 i.op[this_operand].regs = r;
24eab124
AM
10591 i.reg_operands++;
10592 }
af6bdddf
AM
10593 else if (*op_string == REGISTER_PREFIX)
10594 {
10595 as_bad (_("bad register name `%s'"), op_string);
10596 return 0;
10597 }
24eab124 10598 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 10599 {
24eab124 10600 ++op_string;
6f2f06be 10601 if (i.jumpabsolute)
24eab124 10602 {
d0b47220 10603 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
10604 return 0;
10605 }
10606 if (!i386_immediate (op_string))
10607 return 0;
10608 }
43234a1e
L
10609 else if (RC_SAE_immediate (operand_string))
10610 {
10611 /* If it is a RC or SAE immediate, do nothing. */
10612 ;
10613 }
24eab124
AM
10614 else if (is_digit_char (*op_string)
10615 || is_identifier_char (*op_string)
d02603dc 10616 || *op_string == '"'
e5cb08ac 10617 || *op_string == '(')
24eab124 10618 {
47926f60 10619 /* This is a memory reference of some sort. */
af6bdddf 10620 char *base_string;
252b5132 10621
47926f60 10622 /* Start and end of displacement string expression (if found). */
eecb386c
AM
10623 char *displacement_string_start;
10624 char *displacement_string_end;
43234a1e 10625 char *vop_start;
252b5132 10626
24eab124 10627 do_memory_reference:
8325cc63
JB
10628 if (i.mem_operands == 1 && !maybe_adjust_templates ())
10629 return 0;
24eab124 10630 if ((i.mem_operands == 1
40fb9820 10631 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
10632 || i.mem_operands == 2)
10633 {
10634 as_bad (_("too many memory references for `%s'"),
10635 current_templates->start->name);
10636 return 0;
10637 }
252b5132 10638
24eab124
AM
10639 /* Check for base index form. We detect the base index form by
10640 looking for an ')' at the end of the operand, searching
10641 for the '(' matching it, and finding a REGISTER_PREFIX or ','
10642 after the '('. */
af6bdddf 10643 base_string = op_string + strlen (op_string);
c3332e24 10644
43234a1e
L
10645 /* Handle vector operations. */
10646 vop_start = strchr (op_string, '{');
10647 if (vop_start && vop_start < base_string)
10648 {
10649 if (check_VecOperations (vop_start, base_string) == NULL)
10650 return 0;
10651 base_string = vop_start;
10652 }
10653
af6bdddf
AM
10654 --base_string;
10655 if (is_space_char (*base_string))
10656 --base_string;
252b5132 10657
47926f60 10658 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
10659 displacement_string_start = op_string;
10660 displacement_string_end = base_string + 1;
252b5132 10661
24eab124
AM
10662 if (*base_string == ')')
10663 {
af6bdddf 10664 char *temp_string;
24eab124
AM
10665 unsigned int parens_balanced = 1;
10666 /* We've already checked that the number of left & right ()'s are
47926f60 10667 equal, so this loop will not be infinite. */
24eab124
AM
10668 do
10669 {
10670 base_string--;
10671 if (*base_string == ')')
10672 parens_balanced++;
10673 if (*base_string == '(')
10674 parens_balanced--;
10675 }
10676 while (parens_balanced);
c3332e24 10677
af6bdddf 10678 temp_string = base_string;
c3332e24 10679
24eab124 10680 /* Skip past '(' and whitespace. */
252b5132
RH
10681 ++base_string;
10682 if (is_space_char (*base_string))
24eab124 10683 ++base_string;
252b5132 10684
af6bdddf 10685 if (*base_string == ','
4eed87de
AM
10686 || ((i.base_reg = parse_register (base_string, &end_op))
10687 != NULL))
252b5132 10688 {
af6bdddf 10689 displacement_string_end = temp_string;
252b5132 10690
40fb9820 10691 i.types[this_operand].bitfield.baseindex = 1;
252b5132 10692
af6bdddf 10693 if (i.base_reg)
24eab124 10694 {
24eab124
AM
10695 base_string = end_op;
10696 if (is_space_char (*base_string))
10697 ++base_string;
af6bdddf
AM
10698 }
10699
10700 /* There may be an index reg or scale factor here. */
10701 if (*base_string == ',')
10702 {
10703 ++base_string;
10704 if (is_space_char (*base_string))
10705 ++base_string;
10706
4eed87de
AM
10707 if ((i.index_reg = parse_register (base_string, &end_op))
10708 != NULL)
24eab124 10709 {
af6bdddf 10710 base_string = end_op;
24eab124
AM
10711 if (is_space_char (*base_string))
10712 ++base_string;
af6bdddf
AM
10713 if (*base_string == ',')
10714 {
10715 ++base_string;
10716 if (is_space_char (*base_string))
10717 ++base_string;
10718 }
e5cb08ac 10719 else if (*base_string != ')')
af6bdddf 10720 {
4eed87de
AM
10721 as_bad (_("expecting `,' or `)' "
10722 "after index register in `%s'"),
af6bdddf
AM
10723 operand_string);
10724 return 0;
10725 }
24eab124 10726 }
af6bdddf 10727 else if (*base_string == REGISTER_PREFIX)
24eab124 10728 {
f76bf5e0
L
10729 end_op = strchr (base_string, ',');
10730 if (end_op)
10731 *end_op = '\0';
af6bdddf 10732 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
10733 return 0;
10734 }
252b5132 10735
47926f60 10736 /* Check for scale factor. */
551c1ca1 10737 if (*base_string != ')')
af6bdddf 10738 {
551c1ca1
AM
10739 char *end_scale = i386_scale (base_string);
10740
10741 if (!end_scale)
af6bdddf 10742 return 0;
24eab124 10743
551c1ca1 10744 base_string = end_scale;
af6bdddf
AM
10745 if (is_space_char (*base_string))
10746 ++base_string;
10747 if (*base_string != ')')
10748 {
4eed87de
AM
10749 as_bad (_("expecting `)' "
10750 "after scale factor in `%s'"),
af6bdddf
AM
10751 operand_string);
10752 return 0;
10753 }
10754 }
10755 else if (!i.index_reg)
24eab124 10756 {
4eed87de
AM
10757 as_bad (_("expecting index register or scale factor "
10758 "after `,'; got '%c'"),
af6bdddf 10759 *base_string);
24eab124
AM
10760 return 0;
10761 }
10762 }
af6bdddf 10763 else if (*base_string != ')')
24eab124 10764 {
4eed87de
AM
10765 as_bad (_("expecting `,' or `)' "
10766 "after base register in `%s'"),
af6bdddf 10767 operand_string);
24eab124
AM
10768 return 0;
10769 }
c3332e24 10770 }
af6bdddf 10771 else if (*base_string == REGISTER_PREFIX)
c3332e24 10772 {
f76bf5e0
L
10773 end_op = strchr (base_string, ',');
10774 if (end_op)
10775 *end_op = '\0';
af6bdddf 10776 as_bad (_("bad register name `%s'"), base_string);
24eab124 10777 return 0;
c3332e24 10778 }
24eab124
AM
10779 }
10780
10781 /* If there's an expression beginning the operand, parse it,
10782 assuming displacement_string_start and
10783 displacement_string_end are meaningful. */
10784 if (displacement_string_start != displacement_string_end)
10785 {
10786 if (!i386_displacement (displacement_string_start,
10787 displacement_string_end))
10788 return 0;
10789 }
10790
10791 /* Special case for (%dx) while doing input/output op. */
10792 if (i.base_reg
75e5731b
JB
10793 && i.base_reg->reg_type.bitfield.instance == RegD
10794 && i.base_reg->reg_type.bitfield.word
24eab124
AM
10795 && i.index_reg == 0
10796 && i.log2_scale_factor == 0
10797 && i.seg[i.mem_operands] == 0
40fb9820 10798 && !operand_type_check (i.types[this_operand], disp))
24eab124 10799 {
2fb5be8d 10800 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
10801 return 1;
10802 }
10803
eecb386c
AM
10804 if (i386_index_check (operand_string) == 0)
10805 return 0;
c48dadc9 10806 i.flags[this_operand] |= Operand_Mem;
8325cc63
JB
10807 if (i.mem_operands == 0)
10808 i.memop1_string = xstrdup (operand_string);
24eab124
AM
10809 i.mem_operands++;
10810 }
10811 else
ce8a8b2f
AM
10812 {
10813 /* It's not a memory operand; argh! */
24eab124
AM
10814 as_bad (_("invalid char %s beginning operand %d `%s'"),
10815 output_invalid (*op_string),
10816 this_operand + 1,
10817 op_string);
10818 return 0;
10819 }
47926f60 10820 return 1; /* Normal return. */
252b5132
RH
10821}
10822\f
fa94de6b
RM
10823/* Calculate the maximum variable size (i.e., excluding fr_fix)
10824 that an rs_machine_dependent frag may reach. */
10825
10826unsigned int
10827i386_frag_max_var (fragS *frag)
10828{
10829 /* The only relaxable frags are for jumps.
10830 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
10831 gas_assert (frag->fr_type == rs_machine_dependent);
10832 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
10833}
10834
b084df0b
L
10835#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
10836static int
8dcea932 10837elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
10838{
10839 /* STT_GNU_IFUNC symbol must go through PLT. */
10840 if ((symbol_get_bfdsym (fr_symbol)->flags
10841 & BSF_GNU_INDIRECT_FUNCTION) != 0)
10842 return 0;
10843
10844 if (!S_IS_EXTERNAL (fr_symbol))
10845 /* Symbol may be weak or local. */
10846 return !S_IS_WEAK (fr_symbol);
10847
8dcea932
L
10848 /* Global symbols with non-default visibility can't be preempted. */
10849 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
10850 return 1;
10851
10852 if (fr_var != NO_RELOC)
10853 switch ((enum bfd_reloc_code_real) fr_var)
10854 {
10855 case BFD_RELOC_386_PLT32:
10856 case BFD_RELOC_X86_64_PLT32:
33eaf5de 10857 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
10858 return 0;
10859 default:
10860 abort ();
10861 }
10862
b084df0b
L
10863 /* Global symbols with default visibility in a shared library may be
10864 preempted by another definition. */
8dcea932 10865 return !shared;
b084df0b
L
10866}
10867#endif
10868
e379e5f3
L
10869/* Return the next non-empty frag. */
10870
10871static fragS *
10872i386_next_non_empty_frag (fragS *fragP)
10873{
10874 /* There may be a frag with a ".fill 0" when there is no room in
10875 the current frag for frag_grow in output_insn. */
10876 for (fragP = fragP->fr_next;
10877 (fragP != NULL
10878 && fragP->fr_type == rs_fill
10879 && fragP->fr_fix == 0);
10880 fragP = fragP->fr_next)
10881 ;
10882 return fragP;
10883}
10884
10885/* Return the next jcc frag after BRANCH_PADDING. */
10886
10887static fragS *
10888i386_next_jcc_frag (fragS *fragP)
10889{
10890 if (!fragP)
10891 return NULL;
10892
10893 if (fragP->fr_type == rs_machine_dependent
10894 && (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
10895 == BRANCH_PADDING))
10896 {
10897 fragP = i386_next_non_empty_frag (fragP);
10898 if (fragP->fr_type != rs_machine_dependent)
10899 return NULL;
10900 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == COND_JUMP)
10901 return fragP;
10902 }
10903
10904 return NULL;
10905}
10906
10907/* Classify BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags. */
10908
10909static void
10910i386_classify_machine_dependent_frag (fragS *fragP)
10911{
10912 fragS *cmp_fragP;
10913 fragS *pad_fragP;
10914 fragS *branch_fragP;
10915 fragS *next_fragP;
10916 unsigned int max_prefix_length;
10917
10918 if (fragP->tc_frag_data.classified)
10919 return;
10920
10921 /* First scan for BRANCH_PADDING and FUSED_JCC_PADDING. Convert
10922 FUSED_JCC_PADDING and merge BRANCH_PADDING. */
10923 for (next_fragP = fragP;
10924 next_fragP != NULL;
10925 next_fragP = next_fragP->fr_next)
10926 {
10927 next_fragP->tc_frag_data.classified = 1;
10928 if (next_fragP->fr_type == rs_machine_dependent)
10929 switch (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype))
10930 {
10931 case BRANCH_PADDING:
10932 /* The BRANCH_PADDING frag must be followed by a branch
10933 frag. */
10934 branch_fragP = i386_next_non_empty_frag (next_fragP);
10935 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
10936 break;
10937 case FUSED_JCC_PADDING:
10938 /* Check if this is a fused jcc:
10939 FUSED_JCC_PADDING
10940 CMP like instruction
10941 BRANCH_PADDING
10942 COND_JUMP
10943 */
10944 cmp_fragP = i386_next_non_empty_frag (next_fragP);
10945 pad_fragP = i386_next_non_empty_frag (cmp_fragP);
10946 branch_fragP = i386_next_jcc_frag (pad_fragP);
10947 if (branch_fragP)
10948 {
10949 /* The BRANCH_PADDING frag is merged with the
10950 FUSED_JCC_PADDING frag. */
10951 next_fragP->tc_frag_data.u.branch_fragP = branch_fragP;
10952 /* CMP like instruction size. */
10953 next_fragP->tc_frag_data.cmp_size = cmp_fragP->fr_fix;
10954 frag_wane (pad_fragP);
10955 /* Skip to branch_fragP. */
10956 next_fragP = branch_fragP;
10957 }
10958 else if (next_fragP->tc_frag_data.max_prefix_length)
10959 {
10960 /* Turn FUSED_JCC_PADDING into BRANCH_PREFIX if it isn't
10961 a fused jcc. */
10962 next_fragP->fr_subtype
10963 = ENCODE_RELAX_STATE (BRANCH_PREFIX, 0);
10964 next_fragP->tc_frag_data.max_bytes
10965 = next_fragP->tc_frag_data.max_prefix_length;
10966 /* This will be updated in the BRANCH_PREFIX scan. */
10967 next_fragP->tc_frag_data.max_prefix_length = 0;
10968 }
10969 else
10970 frag_wane (next_fragP);
10971 break;
10972 }
10973 }
10974
10975 /* Stop if there is no BRANCH_PREFIX. */
10976 if (!align_branch_prefix_size)
10977 return;
10978
10979 /* Scan for BRANCH_PREFIX. */
10980 for (; fragP != NULL; fragP = fragP->fr_next)
10981 {
10982 if (fragP->fr_type != rs_machine_dependent
10983 || (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
10984 != BRANCH_PREFIX))
10985 continue;
10986
10987 /* Count all BRANCH_PREFIX frags before BRANCH_PADDING and
10988 COND_JUMP_PREFIX. */
10989 max_prefix_length = 0;
10990 for (next_fragP = fragP;
10991 next_fragP != NULL;
10992 next_fragP = next_fragP->fr_next)
10993 {
10994 if (next_fragP->fr_type == rs_fill)
10995 /* Skip rs_fill frags. */
10996 continue;
10997 else if (next_fragP->fr_type != rs_machine_dependent)
10998 /* Stop for all other frags. */
10999 break;
11000
11001 /* rs_machine_dependent frags. */
11002 if (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11003 == BRANCH_PREFIX)
11004 {
11005 /* Count BRANCH_PREFIX frags. */
11006 if (max_prefix_length >= MAX_FUSED_JCC_PADDING_SIZE)
11007 {
11008 max_prefix_length = MAX_FUSED_JCC_PADDING_SIZE;
11009 frag_wane (next_fragP);
11010 }
11011 else
11012 max_prefix_length
11013 += next_fragP->tc_frag_data.max_bytes;
11014 }
11015 else if ((TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11016 == BRANCH_PADDING)
11017 || (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11018 == FUSED_JCC_PADDING))
11019 {
11020 /* Stop at BRANCH_PADDING and FUSED_JCC_PADDING. */
11021 fragP->tc_frag_data.u.padding_fragP = next_fragP;
11022 break;
11023 }
11024 else
11025 /* Stop for other rs_machine_dependent frags. */
11026 break;
11027 }
11028
11029 fragP->tc_frag_data.max_prefix_length = max_prefix_length;
11030
11031 /* Skip to the next frag. */
11032 fragP = next_fragP;
11033 }
11034}
11035
11036/* Compute padding size for
11037
11038 FUSED_JCC_PADDING
11039 CMP like instruction
11040 BRANCH_PADDING
11041 COND_JUMP/UNCOND_JUMP
11042
11043 or
11044
11045 BRANCH_PADDING
11046 COND_JUMP/UNCOND_JUMP
11047 */
11048
11049static int
11050i386_branch_padding_size (fragS *fragP, offsetT address)
11051{
11052 unsigned int offset, size, padding_size;
11053 fragS *branch_fragP = fragP->tc_frag_data.u.branch_fragP;
11054
11055 /* The start address of the BRANCH_PADDING or FUSED_JCC_PADDING frag. */
11056 if (!address)
11057 address = fragP->fr_address;
11058 address += fragP->fr_fix;
11059
11060 /* CMP like instrunction size. */
11061 size = fragP->tc_frag_data.cmp_size;
11062
11063 /* The base size of the branch frag. */
11064 size += branch_fragP->fr_fix;
11065
11066 /* Add opcode and displacement bytes for the rs_machine_dependent
11067 branch frag. */
11068 if (branch_fragP->fr_type == rs_machine_dependent)
11069 size += md_relax_table[branch_fragP->fr_subtype].rlx_length;
11070
11071 /* Check if branch is within boundary and doesn't end at the last
11072 byte. */
11073 offset = address & ((1U << align_branch_power) - 1);
11074 if ((offset + size) >= (1U << align_branch_power))
11075 /* Padding needed to avoid crossing boundary. */
11076 padding_size = (1U << align_branch_power) - offset;
11077 else
11078 /* No padding needed. */
11079 padding_size = 0;
11080
11081 /* The return value may be saved in tc_frag_data.length which is
11082 unsigned byte. */
11083 if (!fits_in_unsigned_byte (padding_size))
11084 abort ();
11085
11086 return padding_size;
11087}
11088
11089/* i386_generic_table_relax_frag()
11090
11091 Handle BRANCH_PADDING, BRANCH_PREFIX and FUSED_JCC_PADDING frags to
11092 grow/shrink padding to align branch frags. Hand others to
11093 relax_frag(). */
11094
11095long
11096i386_generic_table_relax_frag (segT segment, fragS *fragP, long stretch)
11097{
11098 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11099 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11100 {
11101 long padding_size = i386_branch_padding_size (fragP, 0);
11102 long grow = padding_size - fragP->tc_frag_data.length;
11103
11104 /* When the BRANCH_PREFIX frag is used, the computed address
11105 must match the actual address and there should be no padding. */
11106 if (fragP->tc_frag_data.padding_address
11107 && (fragP->tc_frag_data.padding_address != fragP->fr_address
11108 || padding_size))
11109 abort ();
11110
11111 /* Update the padding size. */
11112 if (grow)
11113 fragP->tc_frag_data.length = padding_size;
11114
11115 return grow;
11116 }
11117 else if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11118 {
11119 fragS *padding_fragP, *next_fragP;
11120 long padding_size, left_size, last_size;
11121
11122 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
11123 if (!padding_fragP)
11124 /* Use the padding set by the leading BRANCH_PREFIX frag. */
11125 return (fragP->tc_frag_data.length
11126 - fragP->tc_frag_data.last_length);
11127
11128 /* Compute the relative address of the padding frag in the very
11129 first time where the BRANCH_PREFIX frag sizes are zero. */
11130 if (!fragP->tc_frag_data.padding_address)
11131 fragP->tc_frag_data.padding_address
11132 = padding_fragP->fr_address - (fragP->fr_address - stretch);
11133
11134 /* First update the last length from the previous interation. */
11135 left_size = fragP->tc_frag_data.prefix_length;
11136 for (next_fragP = fragP;
11137 next_fragP != padding_fragP;
11138 next_fragP = next_fragP->fr_next)
11139 if (next_fragP->fr_type == rs_machine_dependent
11140 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11141 == BRANCH_PREFIX))
11142 {
11143 if (left_size)
11144 {
11145 int max = next_fragP->tc_frag_data.max_bytes;
11146 if (max)
11147 {
11148 int size;
11149 if (max > left_size)
11150 size = left_size;
11151 else
11152 size = max;
11153 left_size -= size;
11154 next_fragP->tc_frag_data.last_length = size;
11155 }
11156 }
11157 else
11158 next_fragP->tc_frag_data.last_length = 0;
11159 }
11160
11161 /* Check the padding size for the padding frag. */
11162 padding_size = i386_branch_padding_size
11163 (padding_fragP, (fragP->fr_address
11164 + fragP->tc_frag_data.padding_address));
11165
11166 last_size = fragP->tc_frag_data.prefix_length;
11167 /* Check if there is change from the last interation. */
11168 if (padding_size == last_size)
11169 {
11170 /* Update the expected address of the padding frag. */
11171 padding_fragP->tc_frag_data.padding_address
11172 = (fragP->fr_address + padding_size
11173 + fragP->tc_frag_data.padding_address);
11174 return 0;
11175 }
11176
11177 if (padding_size > fragP->tc_frag_data.max_prefix_length)
11178 {
11179 /* No padding if there is no sufficient room. Clear the
11180 expected address of the padding frag. */
11181 padding_fragP->tc_frag_data.padding_address = 0;
11182 padding_size = 0;
11183 }
11184 else
11185 /* Store the expected address of the padding frag. */
11186 padding_fragP->tc_frag_data.padding_address
11187 = (fragP->fr_address + padding_size
11188 + fragP->tc_frag_data.padding_address);
11189
11190 fragP->tc_frag_data.prefix_length = padding_size;
11191
11192 /* Update the length for the current interation. */
11193 left_size = padding_size;
11194 for (next_fragP = fragP;
11195 next_fragP != padding_fragP;
11196 next_fragP = next_fragP->fr_next)
11197 if (next_fragP->fr_type == rs_machine_dependent
11198 && (TYPE_FROM_RELAX_STATE (next_fragP->fr_subtype)
11199 == BRANCH_PREFIX))
11200 {
11201 if (left_size)
11202 {
11203 int max = next_fragP->tc_frag_data.max_bytes;
11204 if (max)
11205 {
11206 int size;
11207 if (max > left_size)
11208 size = left_size;
11209 else
11210 size = max;
11211 left_size -= size;
11212 next_fragP->tc_frag_data.length = size;
11213 }
11214 }
11215 else
11216 next_fragP->tc_frag_data.length = 0;
11217 }
11218
11219 return (fragP->tc_frag_data.length
11220 - fragP->tc_frag_data.last_length);
11221 }
11222 return relax_frag (segment, fragP, stretch);
11223}
11224
ee7fcc42
AM
11225/* md_estimate_size_before_relax()
11226
11227 Called just before relax() for rs_machine_dependent frags. The x86
11228 assembler uses these frags to handle variable size jump
11229 instructions.
11230
11231 Any symbol that is now undefined will not become defined.
11232 Return the correct fr_subtype in the frag.
11233 Return the initial "guess for variable size of frag" to caller.
11234 The guess is actually the growth beyond the fixed part. Whatever
11235 we do to grow the fixed or variable part contributes to our
11236 returned value. */
11237
252b5132 11238int
7016a5d5 11239md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 11240{
e379e5f3
L
11241 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11242 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX
11243 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING)
11244 {
11245 i386_classify_machine_dependent_frag (fragP);
11246 return fragP->tc_frag_data.length;
11247 }
11248
252b5132 11249 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
11250 check for un-relaxable symbols. On an ELF system, we can't relax
11251 an externally visible symbol, because it may be overridden by a
11252 shared library. */
11253 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 11254#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 11255 || (IS_ELF
8dcea932
L
11256 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
11257 fragP->fr_var))
fbeb56a4
DK
11258#endif
11259#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 11260 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 11261 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
11262#endif
11263 )
252b5132 11264 {
b98ef147
AM
11265 /* Symbol is undefined in this segment, or we need to keep a
11266 reloc so that weak symbols can be overridden. */
11267 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 11268 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
11269 unsigned char *opcode;
11270 int old_fr_fix;
f6af82bd 11271
ee7fcc42 11272 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 11273 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 11274 else if (size == 2)
f6af82bd 11275 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
11276#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11277 else if (need_plt32_p (fragP->fr_symbol))
11278 reloc_type = BFD_RELOC_X86_64_PLT32;
11279#endif
f6af82bd
AM
11280 else
11281 reloc_type = BFD_RELOC_32_PCREL;
252b5132 11282
ee7fcc42
AM
11283 old_fr_fix = fragP->fr_fix;
11284 opcode = (unsigned char *) fragP->fr_opcode;
11285
fddf5b5b 11286 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 11287 {
fddf5b5b
AM
11288 case UNCOND_JUMP:
11289 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 11290 opcode[0] = 0xe9;
252b5132 11291 fragP->fr_fix += size;
062cd5e7
AS
11292 fix_new (fragP, old_fr_fix, size,
11293 fragP->fr_symbol,
11294 fragP->fr_offset, 1,
11295 reloc_type);
252b5132
RH
11296 break;
11297
fddf5b5b 11298 case COND_JUMP86:
412167cb
AM
11299 if (size == 2
11300 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
11301 {
11302 /* Negate the condition, and branch past an
11303 unconditional jump. */
11304 opcode[0] ^= 1;
11305 opcode[1] = 3;
11306 /* Insert an unconditional jump. */
11307 opcode[2] = 0xe9;
11308 /* We added two extra opcode bytes, and have a two byte
11309 offset. */
11310 fragP->fr_fix += 2 + 2;
062cd5e7
AS
11311 fix_new (fragP, old_fr_fix + 2, 2,
11312 fragP->fr_symbol,
11313 fragP->fr_offset, 1,
11314 reloc_type);
fddf5b5b
AM
11315 break;
11316 }
11317 /* Fall through. */
11318
11319 case COND_JUMP:
412167cb
AM
11320 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
11321 {
3e02c1cc
AM
11322 fixS *fixP;
11323
412167cb 11324 fragP->fr_fix += 1;
3e02c1cc
AM
11325 fixP = fix_new (fragP, old_fr_fix, 1,
11326 fragP->fr_symbol,
11327 fragP->fr_offset, 1,
11328 BFD_RELOC_8_PCREL);
11329 fixP->fx_signed = 1;
412167cb
AM
11330 break;
11331 }
93c2a809 11332
24eab124 11333 /* This changes the byte-displacement jump 0x7N
fddf5b5b 11334 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 11335 opcode[1] = opcode[0] + 0x10;
f6af82bd 11336 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
11337 /* We've added an opcode byte. */
11338 fragP->fr_fix += 1 + size;
062cd5e7
AS
11339 fix_new (fragP, old_fr_fix + 1, size,
11340 fragP->fr_symbol,
11341 fragP->fr_offset, 1,
11342 reloc_type);
252b5132 11343 break;
fddf5b5b
AM
11344
11345 default:
11346 BAD_CASE (fragP->fr_subtype);
11347 break;
252b5132
RH
11348 }
11349 frag_wane (fragP);
ee7fcc42 11350 return fragP->fr_fix - old_fr_fix;
252b5132 11351 }
93c2a809 11352
93c2a809
AM
11353 /* Guess size depending on current relax state. Initially the relax
11354 state will correspond to a short jump and we return 1, because
11355 the variable part of the frag (the branch offset) is one byte
11356 long. However, we can relax a section more than once and in that
11357 case we must either set fr_subtype back to the unrelaxed state,
11358 or return the value for the appropriate branch. */
11359 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
11360}
11361
47926f60
KH
11362/* Called after relax() is finished.
11363
11364 In: Address of frag.
11365 fr_type == rs_machine_dependent.
11366 fr_subtype is what the address relaxed to.
11367
11368 Out: Any fixSs and constants are set up.
11369 Caller will turn frag into a ".space 0". */
11370
252b5132 11371void
7016a5d5
TG
11372md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
11373 fragS *fragP)
252b5132 11374{
29b0f896 11375 unsigned char *opcode;
252b5132 11376 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
11377 offsetT target_address;
11378 offsetT opcode_address;
252b5132 11379 unsigned int extension = 0;
847f7ad4 11380 offsetT displacement_from_opcode_start;
252b5132 11381
e379e5f3
L
11382 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PADDING
11383 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == FUSED_JCC_PADDING
11384 || TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11385 {
11386 /* Generate nop padding. */
11387 unsigned int size = fragP->tc_frag_data.length;
11388 if (size)
11389 {
11390 if (size > fragP->tc_frag_data.max_bytes)
11391 abort ();
11392
11393 if (flag_debug)
11394 {
11395 const char *msg;
11396 const char *branch = "branch";
11397 const char *prefix = "";
11398 fragS *padding_fragP;
11399 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype)
11400 == BRANCH_PREFIX)
11401 {
11402 padding_fragP = fragP->tc_frag_data.u.padding_fragP;
11403 switch (fragP->tc_frag_data.default_prefix)
11404 {
11405 default:
11406 abort ();
11407 break;
11408 case CS_PREFIX_OPCODE:
11409 prefix = " cs";
11410 break;
11411 case DS_PREFIX_OPCODE:
11412 prefix = " ds";
11413 break;
11414 case ES_PREFIX_OPCODE:
11415 prefix = " es";
11416 break;
11417 case FS_PREFIX_OPCODE:
11418 prefix = " fs";
11419 break;
11420 case GS_PREFIX_OPCODE:
11421 prefix = " gs";
11422 break;
11423 case SS_PREFIX_OPCODE:
11424 prefix = " ss";
11425 break;
11426 }
11427 if (padding_fragP)
11428 msg = _("%s:%u: add %d%s at 0x%llx to align "
11429 "%s within %d-byte boundary\n");
11430 else
11431 msg = _("%s:%u: add additional %d%s at 0x%llx to "
11432 "align %s within %d-byte boundary\n");
11433 }
11434 else
11435 {
11436 padding_fragP = fragP;
11437 msg = _("%s:%u: add %d%s-byte nop at 0x%llx to align "
11438 "%s within %d-byte boundary\n");
11439 }
11440
11441 if (padding_fragP)
11442 switch (padding_fragP->tc_frag_data.branch_type)
11443 {
11444 case align_branch_jcc:
11445 branch = "jcc";
11446 break;
11447 case align_branch_fused:
11448 branch = "fused jcc";
11449 break;
11450 case align_branch_jmp:
11451 branch = "jmp";
11452 break;
11453 case align_branch_call:
11454 branch = "call";
11455 break;
11456 case align_branch_indirect:
11457 branch = "indiret branch";
11458 break;
11459 case align_branch_ret:
11460 branch = "ret";
11461 break;
11462 default:
11463 break;
11464 }
11465
11466 fprintf (stdout, msg,
11467 fragP->fr_file, fragP->fr_line, size, prefix,
11468 (long long) fragP->fr_address, branch,
11469 1 << align_branch_power);
11470 }
11471 if (TYPE_FROM_RELAX_STATE (fragP->fr_subtype) == BRANCH_PREFIX)
11472 memset (fragP->fr_opcode,
11473 fragP->tc_frag_data.default_prefix, size);
11474 else
11475 i386_generate_nops (fragP, (char *) fragP->fr_opcode,
11476 size, 0);
11477 fragP->fr_fix += size;
11478 }
11479 return;
11480 }
11481
252b5132
RH
11482 opcode = (unsigned char *) fragP->fr_opcode;
11483
47926f60 11484 /* Address we want to reach in file space. */
252b5132 11485 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 11486
47926f60 11487 /* Address opcode resides at in file space. */
252b5132
RH
11488 opcode_address = fragP->fr_address + fragP->fr_fix;
11489
47926f60 11490 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
11491 displacement_from_opcode_start = target_address - opcode_address;
11492
fddf5b5b 11493 if ((fragP->fr_subtype & BIG) == 0)
252b5132 11494 {
47926f60
KH
11495 /* Don't have to change opcode. */
11496 extension = 1; /* 1 opcode + 1 displacement */
252b5132 11497 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
11498 }
11499 else
11500 {
11501 if (no_cond_jump_promotion
11502 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
11503 as_warn_where (fragP->fr_file, fragP->fr_line,
11504 _("long jump required"));
252b5132 11505
fddf5b5b
AM
11506 switch (fragP->fr_subtype)
11507 {
11508 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
11509 extension = 4; /* 1 opcode + 4 displacement */
11510 opcode[0] = 0xe9;
11511 where_to_put_displacement = &opcode[1];
11512 break;
252b5132 11513
fddf5b5b
AM
11514 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
11515 extension = 2; /* 1 opcode + 2 displacement */
11516 opcode[0] = 0xe9;
11517 where_to_put_displacement = &opcode[1];
11518 break;
252b5132 11519
fddf5b5b
AM
11520 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
11521 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
11522 extension = 5; /* 2 opcode + 4 displacement */
11523 opcode[1] = opcode[0] + 0x10;
11524 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
11525 where_to_put_displacement = &opcode[2];
11526 break;
252b5132 11527
fddf5b5b
AM
11528 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
11529 extension = 3; /* 2 opcode + 2 displacement */
11530 opcode[1] = opcode[0] + 0x10;
11531 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
11532 where_to_put_displacement = &opcode[2];
11533 break;
252b5132 11534
fddf5b5b
AM
11535 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
11536 extension = 4;
11537 opcode[0] ^= 1;
11538 opcode[1] = 3;
11539 opcode[2] = 0xe9;
11540 where_to_put_displacement = &opcode[3];
11541 break;
11542
11543 default:
11544 BAD_CASE (fragP->fr_subtype);
11545 break;
11546 }
252b5132 11547 }
fddf5b5b 11548
7b81dfbb
AJ
11549 /* If size if less then four we are sure that the operand fits,
11550 but if it's 4, then it could be that the displacement is larger
11551 then -/+ 2GB. */
11552 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
11553 && object_64bit
11554 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
11555 + ((addressT) 1 << 31))
11556 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
11557 {
11558 as_bad_where (fragP->fr_file, fragP->fr_line,
11559 _("jump target out of range"));
11560 /* Make us emit 0. */
11561 displacement_from_opcode_start = extension;
11562 }
47926f60 11563 /* Now put displacement after opcode. */
252b5132
RH
11564 md_number_to_chars ((char *) where_to_put_displacement,
11565 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 11566 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
11567 fragP->fr_fix += extension;
11568}
11569\f
7016a5d5 11570/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
11571 by our caller that we have all the info we need to fix it up.
11572
7016a5d5
TG
11573 Parameter valP is the pointer to the value of the bits.
11574
252b5132
RH
11575 On the 386, immediates, displacements, and data pointers are all in
11576 the same (little-endian) format, so we don't need to care about which
11577 we are handling. */
11578
94f592af 11579void
7016a5d5 11580md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 11581{
94f592af 11582 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 11583 valueT value = *valP;
252b5132 11584
f86103b7 11585#if !defined (TE_Mach)
93382f6d
AM
11586 if (fixP->fx_pcrel)
11587 {
11588 switch (fixP->fx_r_type)
11589 {
5865bb77
ILT
11590 default:
11591 break;
11592
d6ab8113
JB
11593 case BFD_RELOC_64:
11594 fixP->fx_r_type = BFD_RELOC_64_PCREL;
11595 break;
93382f6d 11596 case BFD_RELOC_32:
ae8887b5 11597 case BFD_RELOC_X86_64_32S:
93382f6d
AM
11598 fixP->fx_r_type = BFD_RELOC_32_PCREL;
11599 break;
11600 case BFD_RELOC_16:
11601 fixP->fx_r_type = BFD_RELOC_16_PCREL;
11602 break;
11603 case BFD_RELOC_8:
11604 fixP->fx_r_type = BFD_RELOC_8_PCREL;
11605 break;
11606 }
11607 }
252b5132 11608
a161fe53 11609 if (fixP->fx_addsy != NULL
31312f95 11610 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 11611 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 11612 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 11613 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 11614 && !use_rela_relocations)
252b5132 11615 {
31312f95
AM
11616 /* This is a hack. There should be a better way to handle this.
11617 This covers for the fact that bfd_install_relocation will
11618 subtract the current location (for partial_inplace, PC relative
11619 relocations); see more below. */
252b5132 11620#ifndef OBJ_AOUT
718ddfc0 11621 if (IS_ELF
252b5132
RH
11622#ifdef TE_PE
11623 || OUTPUT_FLAVOR == bfd_target_coff_flavour
11624#endif
11625 )
11626 value += fixP->fx_where + fixP->fx_frag->fr_address;
11627#endif
11628#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 11629 if (IS_ELF)
252b5132 11630 {
6539b54b 11631 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 11632
6539b54b 11633 if ((sym_seg == seg
2f66722d 11634 || (symbol_section_p (fixP->fx_addsy)
6539b54b 11635 && sym_seg != absolute_section))
af65af87 11636 && !generic_force_reloc (fixP))
2f66722d
AM
11637 {
11638 /* Yes, we add the values in twice. This is because
6539b54b
AM
11639 bfd_install_relocation subtracts them out again. I think
11640 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
11641 it. FIXME. */
11642 value += fixP->fx_where + fixP->fx_frag->fr_address;
11643 }
252b5132
RH
11644 }
11645#endif
11646#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
11647 /* For some reason, the PE format does not store a
11648 section address offset for a PC relative symbol. */
11649 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 11650 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
11651 value += md_pcrel_from (fixP);
11652#endif
11653 }
fbeb56a4 11654#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
11655 if (fixP->fx_addsy != NULL
11656 && S_IS_WEAK (fixP->fx_addsy)
11657 /* PR 16858: Do not modify weak function references. */
11658 && ! fixP->fx_pcrel)
fbeb56a4 11659 {
296a8689
NC
11660#if !defined (TE_PEP)
11661 /* For x86 PE weak function symbols are neither PC-relative
11662 nor do they set S_IS_FUNCTION. So the only reliable way
11663 to detect them is to check the flags of their containing
11664 section. */
11665 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
11666 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
11667 ;
11668 else
11669#endif
fbeb56a4
DK
11670 value -= S_GET_VALUE (fixP->fx_addsy);
11671 }
11672#endif
252b5132
RH
11673
11674 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 11675 and we must not disappoint it. */
252b5132 11676#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 11677 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
11678 switch (fixP->fx_r_type)
11679 {
11680 case BFD_RELOC_386_PLT32:
3e73aa7c 11681 case BFD_RELOC_X86_64_PLT32:
b9519cfe
L
11682 /* Make the jump instruction point to the address of the operand.
11683 At runtime we merely add the offset to the actual PLT entry.
11684 NB: Subtract the offset size only for jump instructions. */
11685 if (fixP->fx_pcrel)
11686 value = -4;
47926f60 11687 break;
31312f95 11688
13ae64f3
JJ
11689 case BFD_RELOC_386_TLS_GD:
11690 case BFD_RELOC_386_TLS_LDM:
13ae64f3 11691 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
11692 case BFD_RELOC_386_TLS_IE:
11693 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 11694 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
11695 case BFD_RELOC_X86_64_TLSGD:
11696 case BFD_RELOC_X86_64_TLSLD:
11697 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 11698 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
11699 value = 0; /* Fully resolved at runtime. No addend. */
11700 /* Fallthrough */
11701 case BFD_RELOC_386_TLS_LE:
11702 case BFD_RELOC_386_TLS_LDO_32:
11703 case BFD_RELOC_386_TLS_LE_32:
11704 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 11705 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 11706 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 11707 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
11708 S_SET_THREAD_LOCAL (fixP->fx_addsy);
11709 break;
11710
67a4f2b7
AO
11711 case BFD_RELOC_386_TLS_DESC_CALL:
11712 case BFD_RELOC_X86_64_TLSDESC_CALL:
11713 value = 0; /* Fully resolved at runtime. No addend. */
11714 S_SET_THREAD_LOCAL (fixP->fx_addsy);
11715 fixP->fx_done = 0;
11716 return;
11717
47926f60
KH
11718 case BFD_RELOC_VTABLE_INHERIT:
11719 case BFD_RELOC_VTABLE_ENTRY:
11720 fixP->fx_done = 0;
94f592af 11721 return;
47926f60
KH
11722
11723 default:
11724 break;
11725 }
11726#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 11727 *valP = value;
f86103b7 11728#endif /* !defined (TE_Mach) */
3e73aa7c 11729
3e73aa7c 11730 /* Are we finished with this relocation now? */
c6682705 11731 if (fixP->fx_addsy == NULL)
3e73aa7c 11732 fixP->fx_done = 1;
fbeb56a4
DK
11733#if defined (OBJ_COFF) && defined (TE_PE)
11734 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
11735 {
11736 fixP->fx_done = 0;
11737 /* Remember value for tc_gen_reloc. */
11738 fixP->fx_addnumber = value;
11739 /* Clear out the frag for now. */
11740 value = 0;
11741 }
11742#endif
3e73aa7c
JH
11743 else if (use_rela_relocations)
11744 {
11745 fixP->fx_no_overflow = 1;
062cd5e7
AS
11746 /* Remember value for tc_gen_reloc. */
11747 fixP->fx_addnumber = value;
3e73aa7c
JH
11748 value = 0;
11749 }
f86103b7 11750
94f592af 11751 md_number_to_chars (p, value, fixP->fx_size);
252b5132 11752}
252b5132 11753\f
6d4af3c2 11754const char *
499ac353 11755md_atof (int type, char *litP, int *sizeP)
252b5132 11756{
499ac353
NC
11757 /* This outputs the LITTLENUMs in REVERSE order;
11758 in accord with the bigendian 386. */
11759 return ieee_md_atof (type, litP, sizeP, FALSE);
252b5132
RH
11760}
11761\f
2d545b82 11762static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 11763
252b5132 11764static char *
e3bb37b5 11765output_invalid (int c)
252b5132 11766{
3882b010 11767 if (ISPRINT (c))
f9f21a03
L
11768 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
11769 "'%c'", c);
252b5132 11770 else
f9f21a03 11771 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 11772 "(0x%x)", (unsigned char) c);
252b5132
RH
11773 return output_invalid_buf;
11774}
11775
af6bdddf 11776/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
11777
11778static const reg_entry *
4d1bb795 11779parse_real_register (char *reg_string, char **end_op)
252b5132 11780{
af6bdddf
AM
11781 char *s = reg_string;
11782 char *p;
252b5132
RH
11783 char reg_name_given[MAX_REG_NAME_SIZE + 1];
11784 const reg_entry *r;
11785
11786 /* Skip possible REGISTER_PREFIX and possible whitespace. */
11787 if (*s == REGISTER_PREFIX)
11788 ++s;
11789
11790 if (is_space_char (*s))
11791 ++s;
11792
11793 p = reg_name_given;
af6bdddf 11794 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
11795 {
11796 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
11797 return (const reg_entry *) NULL;
11798 s++;
252b5132
RH
11799 }
11800
6588847e
DN
11801 /* For naked regs, make sure that we are not dealing with an identifier.
11802 This prevents confusing an identifier like `eax_var' with register
11803 `eax'. */
11804 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
11805 return (const reg_entry *) NULL;
11806
af6bdddf 11807 *end_op = s;
252b5132
RH
11808
11809 r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
11810
5f47d35b 11811 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 11812 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 11813 {
0e0eea78
JB
11814 if (!cpu_arch_flags.bitfield.cpu8087
11815 && !cpu_arch_flags.bitfield.cpu287
11816 && !cpu_arch_flags.bitfield.cpu387)
11817 return (const reg_entry *) NULL;
11818
5f47d35b
AM
11819 if (is_space_char (*s))
11820 ++s;
11821 if (*s == '(')
11822 {
af6bdddf 11823 ++s;
5f47d35b
AM
11824 if (is_space_char (*s))
11825 ++s;
11826 if (*s >= '0' && *s <= '7')
11827 {
db557034 11828 int fpr = *s - '0';
af6bdddf 11829 ++s;
5f47d35b
AM
11830 if (is_space_char (*s))
11831 ++s;
11832 if (*s == ')')
11833 {
11834 *end_op = s + 1;
1e9cc1c2 11835 r = (const reg_entry *) hash_find (reg_hash, "st(0)");
db557034
AM
11836 know (r);
11837 return r + fpr;
5f47d35b 11838 }
5f47d35b 11839 }
47926f60 11840 /* We have "%st(" then garbage. */
5f47d35b
AM
11841 return (const reg_entry *) NULL;
11842 }
11843 }
11844
a60de03c
JB
11845 if (r == NULL || allow_pseudo_reg)
11846 return r;
11847
0dfbf9d7 11848 if (operand_type_all_zero (&r->reg_type))
a60de03c
JB
11849 return (const reg_entry *) NULL;
11850
dc821c5f 11851 if ((r->reg_type.bitfield.dword
00cee14f 11852 || (r->reg_type.bitfield.class == SReg && r->reg_num > 3)
4a5c67ed
JB
11853 || r->reg_type.bitfield.class == RegCR
11854 || r->reg_type.bitfield.class == RegDR
11855 || r->reg_type.bitfield.class == RegTR)
192dc9c6
JB
11856 && !cpu_arch_flags.bitfield.cpui386)
11857 return (const reg_entry *) NULL;
11858
3528c362 11859 if (r->reg_type.bitfield.class == RegMMX && !cpu_arch_flags.bitfield.cpummx)
192dc9c6
JB
11860 return (const reg_entry *) NULL;
11861
6e041cf4
JB
11862 if (!cpu_arch_flags.bitfield.cpuavx512f)
11863 {
f74a6307
JB
11864 if (r->reg_type.bitfield.zmmword
11865 || r->reg_type.bitfield.class == RegMask)
6e041cf4 11866 return (const reg_entry *) NULL;
40f12533 11867
6e041cf4
JB
11868 if (!cpu_arch_flags.bitfield.cpuavx)
11869 {
11870 if (r->reg_type.bitfield.ymmword)
11871 return (const reg_entry *) NULL;
1848e567 11872
6e041cf4
JB
11873 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
11874 return (const reg_entry *) NULL;
11875 }
11876 }
43234a1e 11877
f74a6307 11878 if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
1adf7f56
JB
11879 return (const reg_entry *) NULL;
11880
db51cc60 11881 /* Don't allow fake index register unless allow_index_reg isn't 0. */
e968fc9b 11882 if (!allow_index_reg && r->reg_num == RegIZ)
db51cc60
L
11883 return (const reg_entry *) NULL;
11884
1d3f8286
JB
11885 /* Upper 16 vector registers are only available with VREX in 64bit
11886 mode, and require EVEX encoding. */
11887 if (r->reg_flags & RegVRex)
43234a1e 11888 {
e951d5ca 11889 if (!cpu_arch_flags.bitfield.cpuavx512f
43234a1e
L
11890 || flag_code != CODE_64BIT)
11891 return (const reg_entry *) NULL;
1d3f8286
JB
11892
11893 i.vec_encoding = vex_encoding_evex;
43234a1e
L
11894 }
11895
4787f4a5 11896 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
4a5c67ed 11897 && (!cpu_arch_flags.bitfield.cpulm || r->reg_type.bitfield.class != RegCR)
1ae00879 11898 && flag_code != CODE_64BIT)
20f0a1fc 11899 return (const reg_entry *) NULL;
1ae00879 11900
00cee14f
JB
11901 if (r->reg_type.bitfield.class == SReg && r->reg_num == RegFlat
11902 && !intel_syntax)
b7240065
JB
11903 return (const reg_entry *) NULL;
11904
252b5132
RH
11905 return r;
11906}
4d1bb795
JB
11907
11908/* REG_STRING starts *before* REGISTER_PREFIX. */
11909
11910static const reg_entry *
11911parse_register (char *reg_string, char **end_op)
11912{
11913 const reg_entry *r;
11914
11915 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
11916 r = parse_real_register (reg_string, end_op);
11917 else
11918 r = NULL;
11919 if (!r)
11920 {
11921 char *save = input_line_pointer;
11922 char c;
11923 symbolS *symbolP;
11924
11925 input_line_pointer = reg_string;
d02603dc 11926 c = get_symbol_name (&reg_string);
4d1bb795
JB
11927 symbolP = symbol_find (reg_string);
11928 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
11929 {
11930 const expressionS *e = symbol_get_value_expression (symbolP);
11931
0398aac5 11932 know (e->X_op == O_register);
4eed87de 11933 know (e->X_add_number >= 0
c3fe08fa 11934 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 11935 r = i386_regtab + e->X_add_number;
d3bb6b49 11936 if ((r->reg_flags & RegVRex))
86fa6981 11937 i.vec_encoding = vex_encoding_evex;
4d1bb795
JB
11938 *end_op = input_line_pointer;
11939 }
11940 *input_line_pointer = c;
11941 input_line_pointer = save;
11942 }
11943 return r;
11944}
11945
11946int
11947i386_parse_name (char *name, expressionS *e, char *nextcharP)
11948{
11949 const reg_entry *r;
11950 char *end = input_line_pointer;
11951
11952 *end = *nextcharP;
11953 r = parse_register (name, &input_line_pointer);
11954 if (r && end <= input_line_pointer)
11955 {
11956 *nextcharP = *input_line_pointer;
11957 *input_line_pointer = 0;
11958 e->X_op = O_register;
11959 e->X_add_number = r - i386_regtab;
11960 return 1;
11961 }
11962 input_line_pointer = end;
11963 *end = 0;
ee86248c 11964 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
11965}
11966
11967void
11968md_operand (expressionS *e)
11969{
ee86248c
JB
11970 char *end;
11971 const reg_entry *r;
4d1bb795 11972
ee86248c
JB
11973 switch (*input_line_pointer)
11974 {
11975 case REGISTER_PREFIX:
11976 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
11977 if (r)
11978 {
11979 e->X_op = O_register;
11980 e->X_add_number = r - i386_regtab;
11981 input_line_pointer = end;
11982 }
ee86248c
JB
11983 break;
11984
11985 case '[':
9c2799c2 11986 gas_assert (intel_syntax);
ee86248c
JB
11987 end = input_line_pointer++;
11988 expression (e);
11989 if (*input_line_pointer == ']')
11990 {
11991 ++input_line_pointer;
11992 e->X_op_symbol = make_expr_symbol (e);
11993 e->X_add_symbol = NULL;
11994 e->X_add_number = 0;
11995 e->X_op = O_index;
11996 }
11997 else
11998 {
11999 e->X_op = O_absent;
12000 input_line_pointer = end;
12001 }
12002 break;
4d1bb795
JB
12003 }
12004}
12005
252b5132 12006\f
4cc782b5 12007#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 12008const char *md_shortopts = "kVQ:sqnO::";
252b5132 12009#else
b6f8c7c4 12010const char *md_shortopts = "qnO::";
252b5132 12011#endif
6e0b89ee 12012
3e73aa7c 12013#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
12014#define OPTION_64 (OPTION_MD_BASE + 1)
12015#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
12016#define OPTION_MARCH (OPTION_MD_BASE + 3)
12017#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
12018#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
12019#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
12020#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
12021#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 12022#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 12023#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 12024#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
12025#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
12026#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
12027#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 12028#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
12029#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
12030#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 12031#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 12032#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 12033#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 12034#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
12035#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
12036#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 12037#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b4a3a7b4 12038#define OPTION_X86_USED_NOTE (OPTION_MD_BASE + 25)
03751133 12039#define OPTION_MVEXWIG (OPTION_MD_BASE + 26)
e379e5f3
L
12040#define OPTION_MALIGN_BRANCH_BOUNDARY (OPTION_MD_BASE + 27)
12041#define OPTION_MALIGN_BRANCH_PREFIX_SIZE (OPTION_MD_BASE + 28)
12042#define OPTION_MALIGN_BRANCH (OPTION_MD_BASE + 29)
76cf450b 12043#define OPTION_MBRANCHES_WITH_32B_BOUNDARIES (OPTION_MD_BASE + 30)
b3b91714 12044
99ad8390
NC
12045struct option md_longopts[] =
12046{
3e73aa7c 12047 {"32", no_argument, NULL, OPTION_32},
321098a5 12048#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12049 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 12050 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
12051#endif
12052#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12053 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 12054 {"mshared", no_argument, NULL, OPTION_MSHARED},
b4a3a7b4 12055 {"mx86-used-note", required_argument, NULL, OPTION_X86_USED_NOTE},
6e0b89ee 12056#endif
b3b91714 12057 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
12058 {"march", required_argument, NULL, OPTION_MARCH},
12059 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
12060 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
12061 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
12062 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
12063 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 12064 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 12065 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 12066 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 12067 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
03751133 12068 {"mvexwig", required_argument, NULL, OPTION_MVEXWIG},
7e8b059b 12069 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
12070 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
12071 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
12072# if defined (TE_PE) || defined (TE_PEP)
12073 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
12074#endif
d1982f93 12075 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 12076 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 12077 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 12078 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
e379e5f3
L
12079 {"malign-branch-boundary", required_argument, NULL, OPTION_MALIGN_BRANCH_BOUNDARY},
12080 {"malign-branch-prefix-size", required_argument, NULL, OPTION_MALIGN_BRANCH_PREFIX_SIZE},
12081 {"malign-branch", required_argument, NULL, OPTION_MALIGN_BRANCH},
76cf450b 12082 {"mbranches-within-32B-boundaries", no_argument, NULL, OPTION_MBRANCHES_WITH_32B_BOUNDARIES},
5db04b09
L
12083 {"mamd64", no_argument, NULL, OPTION_MAMD64},
12084 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
12085 {NULL, no_argument, NULL, 0}
12086};
12087size_t md_longopts_size = sizeof (md_longopts);
12088
12089int
17b9d67d 12090md_parse_option (int c, const char *arg)
252b5132 12091{
91d6fa6a 12092 unsigned int j;
e379e5f3 12093 char *arch, *next, *saved, *type;
9103f4f4 12094
252b5132
RH
12095 switch (c)
12096 {
12b55ccc
L
12097 case 'n':
12098 optimize_align_code = 0;
12099 break;
12100
a38cf1db
AM
12101 case 'q':
12102 quiet_warnings = 1;
252b5132
RH
12103 break;
12104
12105#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
12106 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
12107 should be emitted or not. FIXME: Not implemented. */
12108 case 'Q':
d4693039
JB
12109 if ((arg[0] != 'y' && arg[0] != 'n') || arg[1])
12110 return 0;
252b5132
RH
12111 break;
12112
12113 /* -V: SVR4 argument to print version ID. */
12114 case 'V':
12115 print_version_id ();
12116 break;
12117
a38cf1db
AM
12118 /* -k: Ignore for FreeBSD compatibility. */
12119 case 'k':
252b5132 12120 break;
4cc782b5
ILT
12121
12122 case 's':
12123 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 12124 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 12125 break;
8dcea932
L
12126
12127 case OPTION_MSHARED:
12128 shared = 1;
12129 break;
b4a3a7b4
L
12130
12131 case OPTION_X86_USED_NOTE:
12132 if (strcasecmp (arg, "yes") == 0)
12133 x86_used_note = 1;
12134 else if (strcasecmp (arg, "no") == 0)
12135 x86_used_note = 0;
12136 else
12137 as_fatal (_("invalid -mx86-used-note= option: `%s'"), arg);
12138 break;
12139
12140
99ad8390 12141#endif
321098a5 12142#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 12143 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
12144 case OPTION_64:
12145 {
12146 const char **list, **l;
12147
3e73aa7c
JH
12148 list = bfd_target_list ();
12149 for (l = list; *l != NULL; l++)
8620418b 12150 if (CONST_STRNEQ (*l, "elf64-x86-64")
99ad8390
NC
12151 || strcmp (*l, "coff-x86-64") == 0
12152 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
12153 || strcmp (*l, "pei-x86-64") == 0
12154 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
12155 {
12156 default_arch = "x86_64";
12157 break;
12158 }
3e73aa7c 12159 if (*l == NULL)
2b5d6a91 12160 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
12161 free (list);
12162 }
12163 break;
12164#endif
252b5132 12165
351f65ca 12166#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 12167 case OPTION_X32:
351f65ca
L
12168 if (IS_ELF)
12169 {
12170 const char **list, **l;
12171
12172 list = bfd_target_list ();
12173 for (l = list; *l != NULL; l++)
12174 if (CONST_STRNEQ (*l, "elf32-x86-64"))
12175 {
12176 default_arch = "x86_64:32";
12177 break;
12178 }
12179 if (*l == NULL)
2b5d6a91 12180 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
12181 free (list);
12182 }
12183 else
12184 as_fatal (_("32bit x86_64 is only supported for ELF"));
12185 break;
12186#endif
12187
6e0b89ee
AM
12188 case OPTION_32:
12189 default_arch = "i386";
12190 break;
12191
b3b91714
AM
12192 case OPTION_DIVIDE:
12193#ifdef SVR4_COMMENT_CHARS
12194 {
12195 char *n, *t;
12196 const char *s;
12197
add39d23 12198 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
12199 t = n;
12200 for (s = i386_comment_chars; *s != '\0'; s++)
12201 if (*s != '/')
12202 *t++ = *s;
12203 *t = '\0';
12204 i386_comment_chars = n;
12205 }
12206#endif
12207 break;
12208
9103f4f4 12209 case OPTION_MARCH:
293f5f65
L
12210 saved = xstrdup (arg);
12211 arch = saved;
12212 /* Allow -march=+nosse. */
12213 if (*arch == '+')
12214 arch++;
6305a203 12215 do
9103f4f4 12216 {
6305a203 12217 if (*arch == '.')
2b5d6a91 12218 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
12219 next = strchr (arch, '+');
12220 if (next)
12221 *next++ = '\0';
91d6fa6a 12222 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 12223 {
91d6fa6a 12224 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 12225 {
6305a203 12226 /* Processor. */
1ded5609
JB
12227 if (! cpu_arch[j].flags.bitfield.cpui386)
12228 continue;
12229
91d6fa6a 12230 cpu_arch_name = cpu_arch[j].name;
6305a203 12231 cpu_sub_arch_name = NULL;
91d6fa6a
NC
12232 cpu_arch_flags = cpu_arch[j].flags;
12233 cpu_arch_isa = cpu_arch[j].type;
12234 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
12235 if (!cpu_arch_tune_set)
12236 {
12237 cpu_arch_tune = cpu_arch_isa;
12238 cpu_arch_tune_flags = cpu_arch_isa_flags;
12239 }
12240 break;
12241 }
91d6fa6a
NC
12242 else if (*cpu_arch [j].name == '.'
12243 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 12244 {
33eaf5de 12245 /* ISA extension. */
6305a203 12246 i386_cpu_flags flags;
309d3373 12247
293f5f65
L
12248 flags = cpu_flags_or (cpu_arch_flags,
12249 cpu_arch[j].flags);
81486035 12250
5b64d091 12251 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
12252 {
12253 if (cpu_sub_arch_name)
12254 {
12255 char *name = cpu_sub_arch_name;
12256 cpu_sub_arch_name = concat (name,
91d6fa6a 12257 cpu_arch[j].name,
1bf57e9f 12258 (const char *) NULL);
6305a203
L
12259 free (name);
12260 }
12261 else
91d6fa6a 12262 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 12263 cpu_arch_flags = flags;
a586129e 12264 cpu_arch_isa_flags = flags;
6305a203 12265 }
0089dace
L
12266 else
12267 cpu_arch_isa_flags
12268 = cpu_flags_or (cpu_arch_isa_flags,
12269 cpu_arch[j].flags);
6305a203 12270 break;
ccc9c027 12271 }
9103f4f4 12272 }
6305a203 12273
293f5f65
L
12274 if (j >= ARRAY_SIZE (cpu_arch))
12275 {
33eaf5de 12276 /* Disable an ISA extension. */
293f5f65
L
12277 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
12278 if (strcmp (arch, cpu_noarch [j].name) == 0)
12279 {
12280 i386_cpu_flags flags;
12281
12282 flags = cpu_flags_and_not (cpu_arch_flags,
12283 cpu_noarch[j].flags);
12284 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
12285 {
12286 if (cpu_sub_arch_name)
12287 {
12288 char *name = cpu_sub_arch_name;
12289 cpu_sub_arch_name = concat (arch,
12290 (const char *) NULL);
12291 free (name);
12292 }
12293 else
12294 cpu_sub_arch_name = xstrdup (arch);
12295 cpu_arch_flags = flags;
12296 cpu_arch_isa_flags = flags;
12297 }
12298 break;
12299 }
12300
12301 if (j >= ARRAY_SIZE (cpu_noarch))
12302 j = ARRAY_SIZE (cpu_arch);
12303 }
12304
91d6fa6a 12305 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 12306 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
12307
12308 arch = next;
9103f4f4 12309 }
293f5f65
L
12310 while (next != NULL);
12311 free (saved);
9103f4f4
L
12312 break;
12313
12314 case OPTION_MTUNE:
12315 if (*arg == '.')
2b5d6a91 12316 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 12317 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 12318 {
91d6fa6a 12319 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 12320 {
ccc9c027 12321 cpu_arch_tune_set = 1;
91d6fa6a
NC
12322 cpu_arch_tune = cpu_arch [j].type;
12323 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
12324 break;
12325 }
12326 }
91d6fa6a 12327 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 12328 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
12329 break;
12330
1efbbeb4
L
12331 case OPTION_MMNEMONIC:
12332 if (strcasecmp (arg, "att") == 0)
12333 intel_mnemonic = 0;
12334 else if (strcasecmp (arg, "intel") == 0)
12335 intel_mnemonic = 1;
12336 else
2b5d6a91 12337 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
12338 break;
12339
12340 case OPTION_MSYNTAX:
12341 if (strcasecmp (arg, "att") == 0)
12342 intel_syntax = 0;
12343 else if (strcasecmp (arg, "intel") == 0)
12344 intel_syntax = 1;
12345 else
2b5d6a91 12346 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
12347 break;
12348
12349 case OPTION_MINDEX_REG:
12350 allow_index_reg = 1;
12351 break;
12352
12353 case OPTION_MNAKED_REG:
12354 allow_naked_reg = 1;
12355 break;
12356
c0f3af97
L
12357 case OPTION_MSSE2AVX:
12358 sse2avx = 1;
12359 break;
12360
daf50ae7
L
12361 case OPTION_MSSE_CHECK:
12362 if (strcasecmp (arg, "error") == 0)
7bab8ab5 12363 sse_check = check_error;
daf50ae7 12364 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 12365 sse_check = check_warning;
daf50ae7 12366 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 12367 sse_check = check_none;
daf50ae7 12368 else
2b5d6a91 12369 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
12370 break;
12371
7bab8ab5
JB
12372 case OPTION_MOPERAND_CHECK:
12373 if (strcasecmp (arg, "error") == 0)
12374 operand_check = check_error;
12375 else if (strcasecmp (arg, "warning") == 0)
12376 operand_check = check_warning;
12377 else if (strcasecmp (arg, "none") == 0)
12378 operand_check = check_none;
12379 else
12380 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
12381 break;
12382
539f890d
L
12383 case OPTION_MAVXSCALAR:
12384 if (strcasecmp (arg, "128") == 0)
12385 avxscalar = vex128;
12386 else if (strcasecmp (arg, "256") == 0)
12387 avxscalar = vex256;
12388 else
2b5d6a91 12389 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
12390 break;
12391
03751133
L
12392 case OPTION_MVEXWIG:
12393 if (strcmp (arg, "0") == 0)
40c9c8de 12394 vexwig = vexw0;
03751133 12395 else if (strcmp (arg, "1") == 0)
40c9c8de 12396 vexwig = vexw1;
03751133
L
12397 else
12398 as_fatal (_("invalid -mvexwig= option: `%s'"), arg);
12399 break;
12400
7e8b059b
L
12401 case OPTION_MADD_BND_PREFIX:
12402 add_bnd_prefix = 1;
12403 break;
12404
43234a1e
L
12405 case OPTION_MEVEXLIG:
12406 if (strcmp (arg, "128") == 0)
12407 evexlig = evexl128;
12408 else if (strcmp (arg, "256") == 0)
12409 evexlig = evexl256;
12410 else if (strcmp (arg, "512") == 0)
12411 evexlig = evexl512;
12412 else
12413 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
12414 break;
12415
d3d3c6db
IT
12416 case OPTION_MEVEXRCIG:
12417 if (strcmp (arg, "rne") == 0)
12418 evexrcig = rne;
12419 else if (strcmp (arg, "rd") == 0)
12420 evexrcig = rd;
12421 else if (strcmp (arg, "ru") == 0)
12422 evexrcig = ru;
12423 else if (strcmp (arg, "rz") == 0)
12424 evexrcig = rz;
12425 else
12426 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
12427 break;
12428
43234a1e
L
12429 case OPTION_MEVEXWIG:
12430 if (strcmp (arg, "0") == 0)
12431 evexwig = evexw0;
12432 else if (strcmp (arg, "1") == 0)
12433 evexwig = evexw1;
12434 else
12435 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
12436 break;
12437
167ad85b
TG
12438# if defined (TE_PE) || defined (TE_PEP)
12439 case OPTION_MBIG_OBJ:
12440 use_big_obj = 1;
12441 break;
12442#endif
12443
d1982f93 12444 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
12445 if (strcasecmp (arg, "yes") == 0)
12446 omit_lock_prefix = 1;
12447 else if (strcasecmp (arg, "no") == 0)
12448 omit_lock_prefix = 0;
12449 else
12450 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
12451 break;
12452
e4e00185
AS
12453 case OPTION_MFENCE_AS_LOCK_ADD:
12454 if (strcasecmp (arg, "yes") == 0)
12455 avoid_fence = 1;
12456 else if (strcasecmp (arg, "no") == 0)
12457 avoid_fence = 0;
12458 else
12459 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
12460 break;
12461
0cb4071e
L
12462 case OPTION_MRELAX_RELOCATIONS:
12463 if (strcasecmp (arg, "yes") == 0)
12464 generate_relax_relocations = 1;
12465 else if (strcasecmp (arg, "no") == 0)
12466 generate_relax_relocations = 0;
12467 else
12468 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
12469 break;
12470
e379e5f3
L
12471 case OPTION_MALIGN_BRANCH_BOUNDARY:
12472 {
12473 char *end;
12474 long int align = strtoul (arg, &end, 0);
12475 if (*end == '\0')
12476 {
12477 if (align == 0)
12478 {
12479 align_branch_power = 0;
12480 break;
12481 }
12482 else if (align >= 16)
12483 {
12484 int align_power;
12485 for (align_power = 0;
12486 (align & 1) == 0;
12487 align >>= 1, align_power++)
12488 continue;
12489 /* Limit alignment power to 31. */
12490 if (align == 1 && align_power < 32)
12491 {
12492 align_branch_power = align_power;
12493 break;
12494 }
12495 }
12496 }
12497 as_fatal (_("invalid -malign-branch-boundary= value: %s"), arg);
12498 }
12499 break;
12500
12501 case OPTION_MALIGN_BRANCH_PREFIX_SIZE:
12502 {
12503 char *end;
12504 int align = strtoul (arg, &end, 0);
12505 /* Some processors only support 5 prefixes. */
12506 if (*end == '\0' && align >= 0 && align < 6)
12507 {
12508 align_branch_prefix_size = align;
12509 break;
12510 }
12511 as_fatal (_("invalid -malign-branch-prefix-size= value: %s"),
12512 arg);
12513 }
12514 break;
12515
12516 case OPTION_MALIGN_BRANCH:
12517 align_branch = 0;
12518 saved = xstrdup (arg);
12519 type = saved;
12520 do
12521 {
12522 next = strchr (type, '+');
12523 if (next)
12524 *next++ = '\0';
12525 if (strcasecmp (type, "jcc") == 0)
12526 align_branch |= align_branch_jcc_bit;
12527 else if (strcasecmp (type, "fused") == 0)
12528 align_branch |= align_branch_fused_bit;
12529 else if (strcasecmp (type, "jmp") == 0)
12530 align_branch |= align_branch_jmp_bit;
12531 else if (strcasecmp (type, "call") == 0)
12532 align_branch |= align_branch_call_bit;
12533 else if (strcasecmp (type, "ret") == 0)
12534 align_branch |= align_branch_ret_bit;
12535 else if (strcasecmp (type, "indirect") == 0)
12536 align_branch |= align_branch_indirect_bit;
12537 else
12538 as_fatal (_("invalid -malign-branch= option: `%s'"), arg);
12539 type = next;
12540 }
12541 while (next != NULL);
12542 free (saved);
12543 break;
12544
76cf450b
L
12545 case OPTION_MBRANCHES_WITH_32B_BOUNDARIES:
12546 align_branch_power = 5;
12547 align_branch_prefix_size = 5;
12548 align_branch = (align_branch_jcc_bit
12549 | align_branch_fused_bit
12550 | align_branch_jmp_bit);
12551 break;
12552
5db04b09 12553 case OPTION_MAMD64:
4b5aaf5f 12554 isa64 = amd64;
5db04b09
L
12555 break;
12556
12557 case OPTION_MINTEL64:
4b5aaf5f 12558 isa64 = intel64;
5db04b09
L
12559 break;
12560
b6f8c7c4
L
12561 case 'O':
12562 if (arg == NULL)
12563 {
12564 optimize = 1;
12565 /* Turn off -Os. */
12566 optimize_for_space = 0;
12567 }
12568 else if (*arg == 's')
12569 {
12570 optimize_for_space = 1;
12571 /* Turn on all encoding optimizations. */
41fd2579 12572 optimize = INT_MAX;
b6f8c7c4
L
12573 }
12574 else
12575 {
12576 optimize = atoi (arg);
12577 /* Turn off -Os. */
12578 optimize_for_space = 0;
12579 }
12580 break;
12581
252b5132
RH
12582 default:
12583 return 0;
12584 }
12585 return 1;
12586}
12587
8a2c8fef
L
12588#define MESSAGE_TEMPLATE \
12589" "
12590
293f5f65
L
12591static char *
12592output_message (FILE *stream, char *p, char *message, char *start,
12593 int *left_p, const char *name, int len)
12594{
12595 int size = sizeof (MESSAGE_TEMPLATE);
12596 int left = *left_p;
12597
12598 /* Reserve 2 spaces for ", " or ",\0" */
12599 left -= len + 2;
12600
12601 /* Check if there is any room. */
12602 if (left >= 0)
12603 {
12604 if (p != start)
12605 {
12606 *p++ = ',';
12607 *p++ = ' ';
12608 }
12609 p = mempcpy (p, name, len);
12610 }
12611 else
12612 {
12613 /* Output the current message now and start a new one. */
12614 *p++ = ',';
12615 *p = '\0';
12616 fprintf (stream, "%s\n", message);
12617 p = start;
12618 left = size - (start - message) - len - 2;
12619
12620 gas_assert (left >= 0);
12621
12622 p = mempcpy (p, name, len);
12623 }
12624
12625 *left_p = left;
12626 return p;
12627}
12628
8a2c8fef 12629static void
1ded5609 12630show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
12631{
12632 static char message[] = MESSAGE_TEMPLATE;
12633 char *start = message + 27;
12634 char *p;
12635 int size = sizeof (MESSAGE_TEMPLATE);
12636 int left;
12637 const char *name;
12638 int len;
12639 unsigned int j;
12640
12641 p = start;
12642 left = size - (start - message);
12643 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
12644 {
12645 /* Should it be skipped? */
12646 if (cpu_arch [j].skip)
12647 continue;
12648
12649 name = cpu_arch [j].name;
12650 len = cpu_arch [j].len;
12651 if (*name == '.')
12652 {
12653 /* It is an extension. Skip if we aren't asked to show it. */
12654 if (ext)
12655 {
12656 name++;
12657 len--;
12658 }
12659 else
12660 continue;
12661 }
12662 else if (ext)
12663 {
12664 /* It is an processor. Skip if we show only extension. */
12665 continue;
12666 }
1ded5609
JB
12667 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
12668 {
12669 /* It is an impossible processor - skip. */
12670 continue;
12671 }
8a2c8fef 12672
293f5f65 12673 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
12674 }
12675
293f5f65
L
12676 /* Display disabled extensions. */
12677 if (ext)
12678 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
12679 {
12680 name = cpu_noarch [j].name;
12681 len = cpu_noarch [j].len;
12682 p = output_message (stream, p, message, start, &left, name,
12683 len);
12684 }
12685
8a2c8fef
L
12686 *p = '\0';
12687 fprintf (stream, "%s\n", message);
12688}
12689
252b5132 12690void
8a2c8fef 12691md_show_usage (FILE *stream)
252b5132 12692{
4cc782b5
ILT
12693#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12694 fprintf (stream, _("\
d4693039 12695 -Qy, -Qn ignored\n\
a38cf1db 12696 -V print assembler version number\n\
b3b91714
AM
12697 -k ignored\n"));
12698#endif
12699 fprintf (stream, _("\
12b55ccc 12700 -n Do not optimize code alignment\n\
b3b91714
AM
12701 -q quieten some warnings\n"));
12702#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12703 fprintf (stream, _("\
a38cf1db 12704 -s ignored\n"));
b3b91714 12705#endif
d7f449c0
L
12706#if defined BFD64 && (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
12707 || defined (TE_PE) || defined (TE_PEP))
751d281c 12708 fprintf (stream, _("\
570561f7 12709 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 12710#endif
b3b91714
AM
12711#ifdef SVR4_COMMENT_CHARS
12712 fprintf (stream, _("\
12713 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
12714#else
12715 fprintf (stream, _("\
b3b91714 12716 --divide ignored\n"));
4cc782b5 12717#endif
9103f4f4 12718 fprintf (stream, _("\
6305a203 12719 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 12720 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 12721 show_arch (stream, 0, 1);
8a2c8fef
L
12722 fprintf (stream, _("\
12723 EXTENSION is combination of:\n"));
1ded5609 12724 show_arch (stream, 1, 0);
6305a203 12725 fprintf (stream, _("\
8a2c8fef 12726 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 12727 show_arch (stream, 0, 0);
ba104c83 12728 fprintf (stream, _("\
c0f3af97
L
12729 -msse2avx encode SSE instructions with VEX prefix\n"));
12730 fprintf (stream, _("\
7c5c05ef 12731 -msse-check=[none|error|warning] (default: warning)\n\
daf50ae7
L
12732 check SSE instructions\n"));
12733 fprintf (stream, _("\
7c5c05ef 12734 -moperand-check=[none|error|warning] (default: warning)\n\
7bab8ab5
JB
12735 check operand combinations for validity\n"));
12736 fprintf (stream, _("\
7c5c05ef
L
12737 -mavxscalar=[128|256] (default: 128)\n\
12738 encode scalar AVX instructions with specific vector\n\
539f890d
L
12739 length\n"));
12740 fprintf (stream, _("\
03751133
L
12741 -mvexwig=[0|1] (default: 0)\n\
12742 encode VEX instructions with specific VEX.W value\n\
12743 for VEX.W bit ignored instructions\n"));
12744 fprintf (stream, _("\
7c5c05ef
L
12745 -mevexlig=[128|256|512] (default: 128)\n\
12746 encode scalar EVEX instructions with specific vector\n\
43234a1e
L
12747 length\n"));
12748 fprintf (stream, _("\
7c5c05ef
L
12749 -mevexwig=[0|1] (default: 0)\n\
12750 encode EVEX instructions with specific EVEX.W value\n\
43234a1e
L
12751 for EVEX.W bit ignored instructions\n"));
12752 fprintf (stream, _("\
7c5c05ef 12753 -mevexrcig=[rne|rd|ru|rz] (default: rne)\n\
d3d3c6db
IT
12754 encode EVEX instructions with specific EVEX.RC value\n\
12755 for SAE-only ignored instructions\n"));
12756 fprintf (stream, _("\
7c5c05ef
L
12757 -mmnemonic=[att|intel] "));
12758 if (SYSV386_COMPAT)
12759 fprintf (stream, _("(default: att)\n"));
12760 else
12761 fprintf (stream, _("(default: intel)\n"));
12762 fprintf (stream, _("\
12763 use AT&T/Intel mnemonic\n"));
ba104c83 12764 fprintf (stream, _("\
7c5c05ef
L
12765 -msyntax=[att|intel] (default: att)\n\
12766 use AT&T/Intel syntax\n"));
ba104c83
L
12767 fprintf (stream, _("\
12768 -mindex-reg support pseudo index registers\n"));
12769 fprintf (stream, _("\
12770 -mnaked-reg don't require `%%' prefix for registers\n"));
12771 fprintf (stream, _("\
7e8b059b 12772 -madd-bnd-prefix add BND prefix for all valid branches\n"));
b4a3a7b4 12773#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8dcea932
L
12774 fprintf (stream, _("\
12775 -mshared disable branch optimization for shared code\n"));
b4a3a7b4
L
12776 fprintf (stream, _("\
12777 -mx86-used-note=[no|yes] "));
12778 if (DEFAULT_X86_USED_NOTE)
12779 fprintf (stream, _("(default: yes)\n"));
12780 else
12781 fprintf (stream, _("(default: no)\n"));
12782 fprintf (stream, _("\
12783 generate x86 used ISA and feature properties\n"));
12784#endif
12785#if defined (TE_PE) || defined (TE_PEP)
167ad85b
TG
12786 fprintf (stream, _("\
12787 -mbig-obj generate big object files\n"));
12788#endif
d022bddd 12789 fprintf (stream, _("\
7c5c05ef 12790 -momit-lock-prefix=[no|yes] (default: no)\n\
d022bddd 12791 strip all lock prefixes\n"));
5db04b09 12792 fprintf (stream, _("\
7c5c05ef 12793 -mfence-as-lock-add=[no|yes] (default: no)\n\
e4e00185
AS
12794 encode lfence, mfence and sfence as\n\
12795 lock addl $0x0, (%%{re}sp)\n"));
12796 fprintf (stream, _("\
7c5c05ef
L
12797 -mrelax-relocations=[no|yes] "));
12798 if (DEFAULT_GENERATE_X86_RELAX_RELOCATIONS)
12799 fprintf (stream, _("(default: yes)\n"));
12800 else
12801 fprintf (stream, _("(default: no)\n"));
12802 fprintf (stream, _("\
0cb4071e
L
12803 generate relax relocations\n"));
12804 fprintf (stream, _("\
e379e5f3
L
12805 -malign-branch-boundary=NUM (default: 0)\n\
12806 align branches within NUM byte boundary\n"));
12807 fprintf (stream, _("\
12808 -malign-branch=TYPE[+TYPE...] (default: jcc+fused+jmp)\n\
12809 TYPE is combination of jcc, fused, jmp, call, ret,\n\
12810 indirect\n\
12811 specify types of branches to align\n"));
12812 fprintf (stream, _("\
12813 -malign-branch-prefix-size=NUM (default: 5)\n\
12814 align branches with NUM prefixes per instruction\n"));
12815 fprintf (stream, _("\
76cf450b
L
12816 -mbranches-within-32B-boundaries\n\
12817 align branches within 32 byte boundary\n"));
12818 fprintf (stream, _("\
7c5c05ef 12819 -mamd64 accept only AMD64 ISA [default]\n"));
5db04b09
L
12820 fprintf (stream, _("\
12821 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
12822}
12823
3e73aa7c 12824#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 12825 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 12826 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
12827
12828/* Pick the target format to use. */
12829
47926f60 12830const char *
e3bb37b5 12831i386_target_format (void)
252b5132 12832{
351f65ca
L
12833 if (!strncmp (default_arch, "x86_64", 6))
12834 {
12835 update_code_flag (CODE_64BIT, 1);
12836 if (default_arch[6] == '\0')
7f56bc95 12837 x86_elf_abi = X86_64_ABI;
351f65ca 12838 else
7f56bc95 12839 x86_elf_abi = X86_64_X32_ABI;
351f65ca 12840 }
3e73aa7c 12841 else if (!strcmp (default_arch, "i386"))
78f12dd3 12842 update_code_flag (CODE_32BIT, 1);
5197d474
L
12843 else if (!strcmp (default_arch, "iamcu"))
12844 {
12845 update_code_flag (CODE_32BIT, 1);
12846 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
12847 {
12848 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
12849 cpu_arch_name = "iamcu";
12850 cpu_sub_arch_name = NULL;
12851 cpu_arch_flags = iamcu_flags;
12852 cpu_arch_isa = PROCESSOR_IAMCU;
12853 cpu_arch_isa_flags = iamcu_flags;
12854 if (!cpu_arch_tune_set)
12855 {
12856 cpu_arch_tune = cpu_arch_isa;
12857 cpu_arch_tune_flags = cpu_arch_isa_flags;
12858 }
12859 }
8d471ec1 12860 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
12861 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
12862 cpu_arch_name);
12863 }
3e73aa7c 12864 else
2b5d6a91 12865 as_fatal (_("unknown architecture"));
89507696
JB
12866
12867 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
12868 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
12869 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
12870 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
12871
252b5132
RH
12872 switch (OUTPUT_FLAVOR)
12873 {
9384f2ff 12874#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 12875 case bfd_target_aout_flavour:
47926f60 12876 return AOUT_TARGET_FORMAT;
4c63da97 12877#endif
9384f2ff
AM
12878#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
12879# if defined (TE_PE) || defined (TE_PEP)
12880 case bfd_target_coff_flavour:
167ad85b
TG
12881 if (flag_code == CODE_64BIT)
12882 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
12883 else
12884 return "pe-i386";
9384f2ff 12885# elif defined (TE_GO32)
0561d57c
JK
12886 case bfd_target_coff_flavour:
12887 return "coff-go32";
9384f2ff 12888# else
252b5132
RH
12889 case bfd_target_coff_flavour:
12890 return "coff-i386";
9384f2ff 12891# endif
4c63da97 12892#endif
3e73aa7c 12893#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 12894 case bfd_target_elf_flavour:
3e73aa7c 12895 {
351f65ca
L
12896 const char *format;
12897
12898 switch (x86_elf_abi)
4fa24527 12899 {
351f65ca
L
12900 default:
12901 format = ELF_TARGET_FORMAT;
e379e5f3
L
12902#ifndef TE_SOLARIS
12903 tls_get_addr = "___tls_get_addr";
12904#endif
351f65ca 12905 break;
7f56bc95 12906 case X86_64_ABI:
351f65ca 12907 use_rela_relocations = 1;
4fa24527 12908 object_64bit = 1;
e379e5f3
L
12909#ifndef TE_SOLARIS
12910 tls_get_addr = "__tls_get_addr";
12911#endif
351f65ca
L
12912 format = ELF_TARGET_FORMAT64;
12913 break;
7f56bc95 12914 case X86_64_X32_ABI:
4fa24527 12915 use_rela_relocations = 1;
351f65ca 12916 object_64bit = 1;
e379e5f3
L
12917#ifndef TE_SOLARIS
12918 tls_get_addr = "__tls_get_addr";
12919#endif
862be3fb 12920 disallow_64bit_reloc = 1;
351f65ca
L
12921 format = ELF_TARGET_FORMAT32;
12922 break;
4fa24527 12923 }
3632d14b 12924 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 12925 {
7f56bc95 12926 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
12927 as_fatal (_("Intel L1OM is 64bit only"));
12928 return ELF_TARGET_L1OM_FORMAT;
12929 }
b49f93f6 12930 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
12931 {
12932 if (x86_elf_abi != X86_64_ABI)
12933 as_fatal (_("Intel K1OM is 64bit only"));
12934 return ELF_TARGET_K1OM_FORMAT;
12935 }
81486035
L
12936 else if (cpu_arch_isa == PROCESSOR_IAMCU)
12937 {
12938 if (x86_elf_abi != I386_ABI)
12939 as_fatal (_("Intel MCU is 32bit only"));
12940 return ELF_TARGET_IAMCU_FORMAT;
12941 }
8a9036a4 12942 else
351f65ca 12943 return format;
3e73aa7c 12944 }
e57f8c65
TG
12945#endif
12946#if defined (OBJ_MACH_O)
12947 case bfd_target_mach_o_flavour:
d382c579
TG
12948 if (flag_code == CODE_64BIT)
12949 {
12950 use_rela_relocations = 1;
12951 object_64bit = 1;
12952 return "mach-o-x86-64";
12953 }
12954 else
12955 return "mach-o-i386";
4c63da97 12956#endif
252b5132
RH
12957 default:
12958 abort ();
12959 return NULL;
12960 }
12961}
12962
47926f60 12963#endif /* OBJ_MAYBE_ more than one */
252b5132 12964\f
252b5132 12965symbolS *
7016a5d5 12966md_undefined_symbol (char *name)
252b5132 12967{
18dc2407
ILT
12968 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
12969 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
12970 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
12971 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
12972 {
12973 if (!GOT_symbol)
12974 {
12975 if (symbol_find (name))
12976 as_bad (_("GOT already in symbol table"));
12977 GOT_symbol = symbol_new (name, undefined_section,
12978 (valueT) 0, &zero_address_frag);
12979 };
12980 return GOT_symbol;
12981 }
252b5132
RH
12982 return 0;
12983}
12984
12985/* Round up a section size to the appropriate boundary. */
47926f60 12986
252b5132 12987valueT
7016a5d5 12988md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 12989{
4c63da97
AM
12990#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
12991 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
12992 {
12993 /* For a.out, force the section size to be aligned. If we don't do
12994 this, BFD will align it for us, but it will not write out the
12995 final bytes of the section. This may be a bug in BFD, but it is
12996 easier to fix it here since that is how the other a.out targets
12997 work. */
12998 int align;
12999
fd361982 13000 align = bfd_section_alignment (segment);
8d3842cd 13001 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 13002 }
252b5132
RH
13003#endif
13004
13005 return size;
13006}
13007
13008/* On the i386, PC-relative offsets are relative to the start of the
13009 next instruction. That is, the address of the offset, plus its
13010 size, since the offset is always the last part of the insn. */
13011
13012long
e3bb37b5 13013md_pcrel_from (fixS *fixP)
252b5132
RH
13014{
13015 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
13016}
13017
13018#ifndef I386COFF
13019
13020static void
e3bb37b5 13021s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 13022{
29b0f896 13023 int temp;
252b5132 13024
8a75718c
JB
13025#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13026 if (IS_ELF)
13027 obj_elf_section_change_hook ();
13028#endif
252b5132
RH
13029 temp = get_absolute_expression ();
13030 subseg_set (bss_section, (subsegT) temp);
13031 demand_empty_rest_of_line ();
13032}
13033
13034#endif
13035
e379e5f3
L
13036/* Remember constant directive. */
13037
13038void
13039i386_cons_align (int ignore ATTRIBUTE_UNUSED)
13040{
13041 if (last_insn.kind != last_insn_directive
13042 && (bfd_section_flags (now_seg) & SEC_CODE))
13043 {
13044 last_insn.seg = now_seg;
13045 last_insn.kind = last_insn_directive;
13046 last_insn.name = "constant directive";
13047 last_insn.file = as_where (&last_insn.line);
13048 }
13049}
13050
252b5132 13051void
e3bb37b5 13052i386_validate_fix (fixS *fixp)
252b5132 13053{
02a86693 13054 if (fixp->fx_subsy)
252b5132 13055 {
02a86693 13056 if (fixp->fx_subsy == GOT_symbol)
23df1078 13057 {
02a86693
L
13058 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
13059 {
13060 if (!object_64bit)
13061 abort ();
13062#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13063 if (fixp->fx_tcbit2)
56ceb5b5
L
13064 fixp->fx_r_type = (fixp->fx_tcbit
13065 ? BFD_RELOC_X86_64_REX_GOTPCRELX
13066 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
13067 else
13068#endif
13069 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
13070 }
d6ab8113 13071 else
02a86693
L
13072 {
13073 if (!object_64bit)
13074 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
13075 else
13076 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
13077 }
13078 fixp->fx_subsy = 0;
23df1078 13079 }
252b5132 13080 }
02a86693
L
13081#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13082 else if (!object_64bit)
13083 {
13084 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
13085 && fixp->fx_tcbit2)
13086 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
13087 }
13088#endif
252b5132
RH
13089}
13090
252b5132 13091arelent *
7016a5d5 13092tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
13093{
13094 arelent *rel;
13095 bfd_reloc_code_real_type code;
13096
13097 switch (fixp->fx_r_type)
13098 {
8ce3d284 13099#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
13100 case BFD_RELOC_SIZE32:
13101 case BFD_RELOC_SIZE64:
13102 if (S_IS_DEFINED (fixp->fx_addsy)
13103 && !S_IS_EXTERNAL (fixp->fx_addsy))
13104 {
13105 /* Resolve size relocation against local symbol to size of
13106 the symbol plus addend. */
13107 valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
13108 if (fixp->fx_r_type == BFD_RELOC_SIZE32
13109 && !fits_in_unsigned_long (value))
13110 as_bad_where (fixp->fx_file, fixp->fx_line,
13111 _("symbol size computation overflow"));
13112 fixp->fx_addsy = NULL;
13113 fixp->fx_subsy = NULL;
13114 md_apply_fix (fixp, (valueT *) &value, NULL);
13115 return NULL;
13116 }
8ce3d284 13117#endif
1a0670f3 13118 /* Fall through. */
8fd4256d 13119
3e73aa7c
JH
13120 case BFD_RELOC_X86_64_PLT32:
13121 case BFD_RELOC_X86_64_GOT32:
13122 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
13123 case BFD_RELOC_X86_64_GOTPCRELX:
13124 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
13125 case BFD_RELOC_386_PLT32:
13126 case BFD_RELOC_386_GOT32:
02a86693 13127 case BFD_RELOC_386_GOT32X:
252b5132
RH
13128 case BFD_RELOC_386_GOTOFF:
13129 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
13130 case BFD_RELOC_386_TLS_GD:
13131 case BFD_RELOC_386_TLS_LDM:
13132 case BFD_RELOC_386_TLS_LDO_32:
13133 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
13134 case BFD_RELOC_386_TLS_IE:
13135 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
13136 case BFD_RELOC_386_TLS_LE_32:
13137 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
13138 case BFD_RELOC_386_TLS_GOTDESC:
13139 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
13140 case BFD_RELOC_X86_64_TLSGD:
13141 case BFD_RELOC_X86_64_TLSLD:
13142 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 13143 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
13144 case BFD_RELOC_X86_64_GOTTPOFF:
13145 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
13146 case BFD_RELOC_X86_64_TPOFF64:
13147 case BFD_RELOC_X86_64_GOTOFF64:
13148 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
13149 case BFD_RELOC_X86_64_GOT64:
13150 case BFD_RELOC_X86_64_GOTPCREL64:
13151 case BFD_RELOC_X86_64_GOTPC64:
13152 case BFD_RELOC_X86_64_GOTPLT64:
13153 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
13154 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
13155 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
13156 case BFD_RELOC_RVA:
13157 case BFD_RELOC_VTABLE_ENTRY:
13158 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
13159#ifdef TE_PE
13160 case BFD_RELOC_32_SECREL:
13161#endif
252b5132
RH
13162 code = fixp->fx_r_type;
13163 break;
dbbaec26
L
13164 case BFD_RELOC_X86_64_32S:
13165 if (!fixp->fx_pcrel)
13166 {
13167 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
13168 code = fixp->fx_r_type;
13169 break;
13170 }
1a0670f3 13171 /* Fall through. */
252b5132 13172 default:
93382f6d 13173 if (fixp->fx_pcrel)
252b5132 13174 {
93382f6d
AM
13175 switch (fixp->fx_size)
13176 {
13177 default:
b091f402
AM
13178 as_bad_where (fixp->fx_file, fixp->fx_line,
13179 _("can not do %d byte pc-relative relocation"),
13180 fixp->fx_size);
93382f6d
AM
13181 code = BFD_RELOC_32_PCREL;
13182 break;
13183 case 1: code = BFD_RELOC_8_PCREL; break;
13184 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 13185 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
13186#ifdef BFD64
13187 case 8: code = BFD_RELOC_64_PCREL; break;
13188#endif
93382f6d
AM
13189 }
13190 }
13191 else
13192 {
13193 switch (fixp->fx_size)
13194 {
13195 default:
b091f402
AM
13196 as_bad_where (fixp->fx_file, fixp->fx_line,
13197 _("can not do %d byte relocation"),
13198 fixp->fx_size);
93382f6d
AM
13199 code = BFD_RELOC_32;
13200 break;
13201 case 1: code = BFD_RELOC_8; break;
13202 case 2: code = BFD_RELOC_16; break;
13203 case 4: code = BFD_RELOC_32; break;
937149dd 13204#ifdef BFD64
3e73aa7c 13205 case 8: code = BFD_RELOC_64; break;
937149dd 13206#endif
93382f6d 13207 }
252b5132
RH
13208 }
13209 break;
13210 }
252b5132 13211
d182319b
JB
13212 if ((code == BFD_RELOC_32
13213 || code == BFD_RELOC_32_PCREL
13214 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
13215 && GOT_symbol
13216 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 13217 {
4fa24527 13218 if (!object_64bit)
d6ab8113
JB
13219 code = BFD_RELOC_386_GOTPC;
13220 else
13221 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 13222 }
7b81dfbb
AJ
13223 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
13224 && GOT_symbol
13225 && fixp->fx_addsy == GOT_symbol)
13226 {
13227 code = BFD_RELOC_X86_64_GOTPC64;
13228 }
252b5132 13229
add39d23
TS
13230 rel = XNEW (arelent);
13231 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 13232 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
13233
13234 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 13235
3e73aa7c
JH
13236 if (!use_rela_relocations)
13237 {
13238 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
13239 vtable entry to be used in the relocation's section offset. */
13240 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13241 rel->address = fixp->fx_offset;
fbeb56a4
DK
13242#if defined (OBJ_COFF) && defined (TE_PE)
13243 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
13244 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
13245 else
13246#endif
c6682705 13247 rel->addend = 0;
3e73aa7c
JH
13248 }
13249 /* Use the rela in 64bit mode. */
252b5132 13250 else
3e73aa7c 13251 {
862be3fb
L
13252 if (disallow_64bit_reloc)
13253 switch (code)
13254 {
862be3fb
L
13255 case BFD_RELOC_X86_64_DTPOFF64:
13256 case BFD_RELOC_X86_64_TPOFF64:
13257 case BFD_RELOC_64_PCREL:
13258 case BFD_RELOC_X86_64_GOTOFF64:
13259 case BFD_RELOC_X86_64_GOT64:
13260 case BFD_RELOC_X86_64_GOTPCREL64:
13261 case BFD_RELOC_X86_64_GOTPC64:
13262 case BFD_RELOC_X86_64_GOTPLT64:
13263 case BFD_RELOC_X86_64_PLTOFF64:
13264 as_bad_where (fixp->fx_file, fixp->fx_line,
13265 _("cannot represent relocation type %s in x32 mode"),
13266 bfd_get_reloc_code_name (code));
13267 break;
13268 default:
13269 break;
13270 }
13271
062cd5e7
AS
13272 if (!fixp->fx_pcrel)
13273 rel->addend = fixp->fx_offset;
13274 else
13275 switch (code)
13276 {
13277 case BFD_RELOC_X86_64_PLT32:
13278 case BFD_RELOC_X86_64_GOT32:
13279 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
13280 case BFD_RELOC_X86_64_GOTPCRELX:
13281 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
13282 case BFD_RELOC_X86_64_TLSGD:
13283 case BFD_RELOC_X86_64_TLSLD:
13284 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
13285 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
13286 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
13287 rel->addend = fixp->fx_offset - fixp->fx_size;
13288 break;
13289 default:
13290 rel->addend = (section->vma
13291 - fixp->fx_size
13292 + fixp->fx_addnumber
13293 + md_pcrel_from (fixp));
13294 break;
13295 }
3e73aa7c
JH
13296 }
13297
252b5132
RH
13298 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
13299 if (rel->howto == NULL)
13300 {
13301 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 13302 _("cannot represent relocation type %s"),
252b5132
RH
13303 bfd_get_reloc_code_name (code));
13304 /* Set howto to a garbage value so that we can keep going. */
13305 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 13306 gas_assert (rel->howto != NULL);
252b5132
RH
13307 }
13308
13309 return rel;
13310}
13311
ee86248c 13312#include "tc-i386-intel.c"
54cfded0 13313
a60de03c
JB
13314void
13315tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 13316{
a60de03c
JB
13317 int saved_naked_reg;
13318 char saved_register_dot;
54cfded0 13319
a60de03c
JB
13320 saved_naked_reg = allow_naked_reg;
13321 allow_naked_reg = 1;
13322 saved_register_dot = register_chars['.'];
13323 register_chars['.'] = '.';
13324 allow_pseudo_reg = 1;
13325 expression_and_evaluate (exp);
13326 allow_pseudo_reg = 0;
13327 register_chars['.'] = saved_register_dot;
13328 allow_naked_reg = saved_naked_reg;
13329
e96d56a1 13330 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 13331 {
a60de03c
JB
13332 if ((addressT) exp->X_add_number < i386_regtab_size)
13333 {
13334 exp->X_op = O_constant;
13335 exp->X_add_number = i386_regtab[exp->X_add_number]
13336 .dw2_regnum[flag_code >> 1];
13337 }
13338 else
13339 exp->X_op = O_illegal;
54cfded0 13340 }
54cfded0
AM
13341}
13342
13343void
13344tc_x86_frame_initial_instructions (void)
13345{
a60de03c
JB
13346 static unsigned int sp_regno[2];
13347
13348 if (!sp_regno[flag_code >> 1])
13349 {
13350 char *saved_input = input_line_pointer;
13351 char sp[][4] = {"esp", "rsp"};
13352 expressionS exp;
a4447b93 13353
a60de03c
JB
13354 input_line_pointer = sp[flag_code >> 1];
13355 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 13356 gas_assert (exp.X_op == O_constant);
a60de03c
JB
13357 sp_regno[flag_code >> 1] = exp.X_add_number;
13358 input_line_pointer = saved_input;
13359 }
a4447b93 13360
61ff971f
L
13361 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
13362 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 13363}
d2b2c203 13364
d7921315
L
13365int
13366x86_dwarf2_addr_size (void)
13367{
13368#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
13369 if (x86_elf_abi == X86_64_X32_ABI)
13370 return 4;
13371#endif
13372 return bfd_arch_bits_per_address (stdoutput) / 8;
13373}
13374
d2b2c203
DJ
13375int
13376i386_elf_section_type (const char *str, size_t len)
13377{
13378 if (flag_code == CODE_64BIT
13379 && len == sizeof ("unwind") - 1
13380 && strncmp (str, "unwind", 6) == 0)
13381 return SHT_X86_64_UNWIND;
13382
13383 return -1;
13384}
bb41ade5 13385
ad5fec3b
EB
13386#ifdef TE_SOLARIS
13387void
13388i386_solaris_fix_up_eh_frame (segT sec)
13389{
13390 if (flag_code == CODE_64BIT)
13391 elf_section_type (sec) = SHT_X86_64_UNWIND;
13392}
13393#endif
13394
bb41ade5
AM
13395#ifdef TE_PE
13396void
13397tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
13398{
91d6fa6a 13399 expressionS exp;
bb41ade5 13400
91d6fa6a
NC
13401 exp.X_op = O_secrel;
13402 exp.X_add_symbol = symbol;
13403 exp.X_add_number = 0;
13404 emit_expr (&exp, size);
bb41ade5
AM
13405}
13406#endif
3b22753a
L
13407
13408#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13409/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
13410
01e1a5bc 13411bfd_vma
6d4af3c2 13412x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
13413{
13414 if (flag_code == CODE_64BIT)
13415 {
13416 if (letter == 'l')
13417 return SHF_X86_64_LARGE;
13418
8f3bae45 13419 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 13420 }
3b22753a 13421 else
8f3bae45 13422 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
13423 return -1;
13424}
13425
01e1a5bc 13426bfd_vma
3b22753a
L
13427x86_64_section_word (char *str, size_t len)
13428{
8620418b 13429 if (len == 5 && flag_code == CODE_64BIT && CONST_STRNEQ (str, "large"))
3b22753a
L
13430 return SHF_X86_64_LARGE;
13431
13432 return -1;
13433}
13434
13435static void
13436handle_large_common (int small ATTRIBUTE_UNUSED)
13437{
13438 if (flag_code != CODE_64BIT)
13439 {
13440 s_comm_internal (0, elf_common_parse);
13441 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
13442 }
13443 else
13444 {
13445 static segT lbss_section;
13446 asection *saved_com_section_ptr = elf_com_section_ptr;
13447 asection *saved_bss_section = bss_section;
13448
13449 if (lbss_section == NULL)
13450 {
13451 flagword applicable;
13452 segT seg = now_seg;
13453 subsegT subseg = now_subseg;
13454
13455 /* The .lbss section is for local .largecomm symbols. */
13456 lbss_section = subseg_new (".lbss", 0);
13457 applicable = bfd_applicable_section_flags (stdoutput);
fd361982 13458 bfd_set_section_flags (lbss_section, applicable & SEC_ALLOC);
3b22753a
L
13459 seg_info (lbss_section)->bss = 1;
13460
13461 subseg_set (seg, subseg);
13462 }
13463
13464 elf_com_section_ptr = &_bfd_elf_large_com_section;
13465 bss_section = lbss_section;
13466
13467 s_comm_internal (0, elf_common_parse);
13468
13469 elf_com_section_ptr = saved_com_section_ptr;
13470 bss_section = saved_bss_section;
13471 }
13472}
13473#endif /* OBJ_ELF || OBJ_MAYBE_ELF */