Automatic date update in version.in
[deliverable/binutils-gdb.git] / gas / config / tc-i386.c
CommitLineData
b534c6d3 1/* tc-i386.c -- Assemble code for the Intel 80386
219d1afa 2 Copyright (C) 1989-2018 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
252b5132
RH
36#ifndef REGISTER_WARNINGS
37#define REGISTER_WARNINGS 1
38#endif
39
c3332e24 40#ifndef INFER_ADDR_PREFIX
eecb386c 41#define INFER_ADDR_PREFIX 1
c3332e24
AM
42#endif
43
29b0f896
AM
44#ifndef DEFAULT_ARCH
45#define DEFAULT_ARCH "i386"
246fcdee 46#endif
252b5132 47
edde18a5
AM
48#ifndef INLINE
49#if __GNUC__ >= 2
50#define INLINE __inline__
51#else
52#define INLINE
53#endif
54#endif
55
6305a203
L
56/* Prefixes will be emitted in the order defined below.
57 WAIT_PREFIX must be the first prefix since FWAIT is really is an
58 instruction, and so must come before any prefixes.
59 The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
42164a71 60 REP_PREFIX/HLE_PREFIX, LOCK_PREFIX. */
6305a203
L
61#define WAIT_PREFIX 0
62#define SEG_PREFIX 1
63#define ADDR_PREFIX 2
64#define DATA_PREFIX 3
c32fa91d 65#define REP_PREFIX 4
42164a71 66#define HLE_PREFIX REP_PREFIX
7e8b059b 67#define BND_PREFIX REP_PREFIX
c32fa91d 68#define LOCK_PREFIX 5
4e9ac44a
L
69#define REX_PREFIX 6 /* must come last. */
70#define MAX_PREFIXES 7 /* max prefixes per opcode */
6305a203
L
71
72/* we define the syntax here (modulo base,index,scale syntax) */
73#define REGISTER_PREFIX '%'
74#define IMMEDIATE_PREFIX '$'
75#define ABSOLUTE_PREFIX '*'
76
77/* these are the instruction mnemonic suffixes in AT&T syntax or
78 memory operand size in Intel syntax. */
79#define WORD_MNEM_SUFFIX 'w'
80#define BYTE_MNEM_SUFFIX 'b'
81#define SHORT_MNEM_SUFFIX 's'
82#define LONG_MNEM_SUFFIX 'l'
83#define QWORD_MNEM_SUFFIX 'q'
6305a203
L
84/* Intel Syntax. Use a non-ascii letter since since it never appears
85 in instructions. */
86#define LONG_DOUBLE_MNEM_SUFFIX '\1'
87
88#define END_OF_INSN '\0'
89
90/*
91 'templates' is for grouping together 'template' structures for opcodes
92 of the same name. This is only used for storing the insns in the grand
93 ole hash table of insns.
94 The templates themselves start at START and range up to (but not including)
95 END.
96 */
97typedef struct
98{
d3ce72d0
NC
99 const insn_template *start;
100 const insn_template *end;
6305a203
L
101}
102templates;
103
104/* 386 operand encoding bytes: see 386 book for details of this. */
105typedef struct
106{
107 unsigned int regmem; /* codes register or memory operand */
108 unsigned int reg; /* codes register operand (or extended opcode) */
109 unsigned int mode; /* how to interpret regmem & reg */
110}
111modrm_byte;
112
113/* x86-64 extension prefix. */
114typedef int rex_byte;
115
6305a203
L
116/* 386 opcode byte to code indirect addressing. */
117typedef struct
118{
119 unsigned base;
120 unsigned index;
121 unsigned scale;
122}
123sib_byte;
124
6305a203
L
125/* x86 arch names, types and features */
126typedef struct
127{
128 const char *name; /* arch name */
8a2c8fef 129 unsigned int len; /* arch string length */
6305a203
L
130 enum processor_type type; /* arch type */
131 i386_cpu_flags flags; /* cpu feature flags */
8a2c8fef 132 unsigned int skip; /* show_arch should skip this. */
6305a203
L
133}
134arch_entry;
135
293f5f65
L
136/* Used to turn off indicated flags. */
137typedef struct
138{
139 const char *name; /* arch name */
140 unsigned int len; /* arch string length */
141 i386_cpu_flags flags; /* cpu feature flags */
142}
143noarch_entry;
144
78f12dd3 145static void update_code_flag (int, int);
e3bb37b5
L
146static void set_code_flag (int);
147static void set_16bit_gcc_code_flag (int);
148static void set_intel_syntax (int);
1efbbeb4 149static void set_intel_mnemonic (int);
db51cc60 150static void set_allow_index_reg (int);
7bab8ab5 151static void set_check (int);
e3bb37b5 152static void set_cpu_arch (int);
6482c264 153#ifdef TE_PE
e3bb37b5 154static void pe_directive_secrel (int);
6482c264 155#endif
e3bb37b5
L
156static void signed_cons (int);
157static char *output_invalid (int c);
ee86248c
JB
158static int i386_finalize_immediate (segT, expressionS *, i386_operand_type,
159 const char *);
160static int i386_finalize_displacement (segT, expressionS *, i386_operand_type,
161 const char *);
a7619375 162static int i386_att_operand (char *);
e3bb37b5 163static int i386_intel_operand (char *, int);
ee86248c
JB
164static int i386_intel_simplify (expressionS *);
165static int i386_intel_parse_name (const char *, expressionS *);
e3bb37b5
L
166static const reg_entry *parse_register (char *, char **);
167static char *parse_insn (char *, char *);
168static char *parse_operands (char *, const char *);
169static void swap_operands (void);
4d456e3d 170static void swap_2_operands (int, int);
e3bb37b5
L
171static void optimize_imm (void);
172static void optimize_disp (void);
83b16ac6 173static const insn_template *match_template (char);
e3bb37b5
L
174static int check_string (void);
175static int process_suffix (void);
176static int check_byte_reg (void);
177static int check_long_reg (void);
178static int check_qword_reg (void);
179static int check_word_reg (void);
180static int finalize_imm (void);
181static int process_operands (void);
182static const seg_entry *build_modrm_byte (void);
183static void output_insn (void);
184static void output_imm (fragS *, offsetT);
185static void output_disp (fragS *, offsetT);
29b0f896 186#ifndef I386COFF
e3bb37b5 187static void s_bss (int);
252b5132 188#endif
17d4e2a2
L
189#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
190static void handle_large_common (int small ATTRIBUTE_UNUSED);
191#endif
252b5132 192
a847613f 193static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 194
43234a1e
L
195/* This struct describes rounding control and SAE in the instruction. */
196struct RC_Operation
197{
198 enum rc_type
199 {
200 rne = 0,
201 rd,
202 ru,
203 rz,
204 saeonly
205 } type;
206 int operand;
207};
208
209static struct RC_Operation rc_op;
210
211/* The struct describes masking, applied to OPERAND in the instruction.
212 MASK is a pointer to the corresponding mask register. ZEROING tells
213 whether merging or zeroing mask is used. */
214struct Mask_Operation
215{
216 const reg_entry *mask;
217 unsigned int zeroing;
218 /* The operand where this operation is associated. */
219 int operand;
220};
221
222static struct Mask_Operation mask_op;
223
224/* The struct describes broadcasting, applied to OPERAND. FACTOR is
225 broadcast factor. */
226struct Broadcast_Operation
227{
8e6e0792 228 /* Type of broadcast: {1to2}, {1to4}, {1to8}, or {1to16}. */
43234a1e
L
229 int type;
230
231 /* Index of broadcasted operand. */
232 int operand;
233};
234
235static struct Broadcast_Operation broadcast_op;
236
c0f3af97
L
237/* VEX prefix. */
238typedef struct
239{
43234a1e
L
240 /* VEX prefix is either 2 byte or 3 byte. EVEX is 4 byte. */
241 unsigned char bytes[4];
c0f3af97
L
242 unsigned int length;
243 /* Destination or source register specifier. */
244 const reg_entry *register_specifier;
245} vex_prefix;
246
252b5132 247/* 'md_assemble ()' gathers together information and puts it into a
47926f60 248 i386_insn. */
252b5132 249
520dc8e8
AM
250union i386_op
251 {
252 expressionS *disps;
253 expressionS *imms;
254 const reg_entry *regs;
255 };
256
a65babc9
L
257enum i386_error
258 {
86e026a4 259 operand_size_mismatch,
a65babc9
L
260 operand_type_mismatch,
261 register_type_mismatch,
262 number_of_operands_mismatch,
263 invalid_instruction_suffix,
264 bad_imm4,
a65babc9
L
265 unsupported_with_intel_mnemonic,
266 unsupported_syntax,
6c30d220
L
267 unsupported,
268 invalid_vsib_address,
7bab8ab5 269 invalid_vector_register_set,
43234a1e
L
270 unsupported_vector_index_register,
271 unsupported_broadcast,
272 broadcast_not_on_src_operand,
273 broadcast_needed,
274 unsupported_masking,
275 mask_not_on_destination,
276 no_default_mask,
277 unsupported_rc_sae,
278 rc_sae_operand_not_last_imm,
279 invalid_register_operand,
a65babc9
L
280 };
281
252b5132
RH
282struct _i386_insn
283 {
47926f60 284 /* TM holds the template for the insn were currently assembling. */
d3ce72d0 285 insn_template tm;
252b5132 286
7d5e4556
L
287 /* SUFFIX holds the instruction size suffix for byte, word, dword
288 or qword, if given. */
252b5132
RH
289 char suffix;
290
47926f60 291 /* OPERANDS gives the number of given operands. */
252b5132
RH
292 unsigned int operands;
293
294 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
295 of given register, displacement, memory operands and immediate
47926f60 296 operands. */
252b5132
RH
297 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
298
299 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 300 use OP[i] for the corresponding operand. */
40fb9820 301 i386_operand_type types[MAX_OPERANDS];
252b5132 302
520dc8e8
AM
303 /* Displacement expression, immediate expression, or register for each
304 operand. */
305 union i386_op op[MAX_OPERANDS];
252b5132 306
3e73aa7c
JH
307 /* Flags for operands. */
308 unsigned int flags[MAX_OPERANDS];
309#define Operand_PCrel 1
310
252b5132 311 /* Relocation type for operand */
f86103b7 312 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 313
252b5132
RH
314 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
315 the base index byte below. */
316 const reg_entry *base_reg;
317 const reg_entry *index_reg;
318 unsigned int log2_scale_factor;
319
320 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 321 explicit segment overrides are given. */
ce8a8b2f 322 const seg_entry *seg[2];
252b5132 323
8325cc63
JB
324 /* Copied first memory operand string, for re-checking. */
325 char *memop1_string;
326
252b5132
RH
327 /* PREFIX holds all the given prefix opcodes (usually null).
328 PREFIXES is the number of prefix opcodes. */
329 unsigned int prefixes;
330 unsigned char prefix[MAX_PREFIXES];
331
332 /* RM and SIB are the modrm byte and the sib byte where the
c1e679ec 333 addressing modes of this insn are encoded. */
252b5132 334 modrm_byte rm;
3e73aa7c 335 rex_byte rex;
43234a1e 336 rex_byte vrex;
252b5132 337 sib_byte sib;
c0f3af97 338 vex_prefix vex;
b6169b20 339
43234a1e
L
340 /* Masking attributes. */
341 struct Mask_Operation *mask;
342
343 /* Rounding control and SAE attributes. */
344 struct RC_Operation *rounding;
345
346 /* Broadcasting attributes. */
347 struct Broadcast_Operation *broadcast;
348
349 /* Compressed disp8*N attribute. */
350 unsigned int memshift;
351
86fa6981
L
352 /* Prefer load or store in encoding. */
353 enum
354 {
355 dir_encoding_default = 0,
356 dir_encoding_load,
357 dir_encoding_store
358 } dir_encoding;
891edac4 359
a501d77e
L
360 /* Prefer 8bit or 32bit displacement in encoding. */
361 enum
362 {
363 disp_encoding_default = 0,
364 disp_encoding_8bit,
365 disp_encoding_32bit
366 } disp_encoding;
f8a5c266 367
6b6b6807
L
368 /* Prefer the REX byte in encoding. */
369 bfd_boolean rex_encoding;
370
b6f8c7c4
L
371 /* Disable instruction size optimization. */
372 bfd_boolean no_optimize;
373
86fa6981
L
374 /* How to encode vector instructions. */
375 enum
376 {
377 vex_encoding_default = 0,
378 vex_encoding_vex2,
379 vex_encoding_vex3,
380 vex_encoding_evex
381 } vec_encoding;
382
d5de92cf
L
383 /* REP prefix. */
384 const char *rep_prefix;
385
165de32a
L
386 /* HLE prefix. */
387 const char *hle_prefix;
42164a71 388
7e8b059b
L
389 /* Have BND prefix. */
390 const char *bnd_prefix;
391
04ef582a
L
392 /* Have NOTRACK prefix. */
393 const char *notrack_prefix;
394
891edac4 395 /* Error message. */
a65babc9 396 enum i386_error error;
252b5132
RH
397 };
398
399typedef struct _i386_insn i386_insn;
400
43234a1e
L
401/* Link RC type with corresponding string, that'll be looked for in
402 asm. */
403struct RC_name
404{
405 enum rc_type type;
406 const char *name;
407 unsigned int len;
408};
409
410static const struct RC_name RC_NamesTable[] =
411{
412 { rne, STRING_COMMA_LEN ("rn-sae") },
413 { rd, STRING_COMMA_LEN ("rd-sae") },
414 { ru, STRING_COMMA_LEN ("ru-sae") },
415 { rz, STRING_COMMA_LEN ("rz-sae") },
416 { saeonly, STRING_COMMA_LEN ("sae") },
417};
418
252b5132
RH
419/* List of chars besides those in app.c:symbol_chars that can start an
420 operand. Used to prevent the scrubber eating vital white-space. */
86fa6981 421const char extra_symbol_chars[] = "*%-([{}"
252b5132 422#ifdef LEX_AT
32137342
NC
423 "@"
424#endif
425#ifdef LEX_QM
426 "?"
252b5132 427#endif
32137342 428 ;
252b5132 429
29b0f896
AM
430#if (defined (TE_I386AIX) \
431 || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
3896cfd5 432 && !defined (TE_GNU) \
29b0f896 433 && !defined (TE_LINUX) \
8d63c93e 434 && !defined (TE_NACL) \
29b0f896 435 && !defined (TE_FreeBSD) \
5b806d27 436 && !defined (TE_DragonFly) \
29b0f896 437 && !defined (TE_NetBSD)))
252b5132 438/* This array holds the chars that always start a comment. If the
b3b91714
AM
439 pre-processor is disabled, these aren't very useful. The option
440 --divide will remove '/' from this list. */
441const char *i386_comment_chars = "#/";
442#define SVR4_COMMENT_CHARS 1
252b5132 443#define PREFIX_SEPARATOR '\\'
252b5132 444
b3b91714
AM
445#else
446const char *i386_comment_chars = "#";
447#define PREFIX_SEPARATOR '/'
448#endif
449
252b5132
RH
450/* This array holds the chars that only start a comment at the beginning of
451 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
452 .line and .file directives will appear in the pre-processed output.
453 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 454 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
455 #NO_APP at the beginning of its output.
456 Also note that comments started like this one will always work if
252b5132 457 '/' isn't otherwise defined. */
b3b91714 458const char line_comment_chars[] = "#/";
252b5132 459
63a0b638 460const char line_separator_chars[] = ";";
252b5132 461
ce8a8b2f
AM
462/* Chars that can be used to separate mant from exp in floating point
463 nums. */
252b5132
RH
464const char EXP_CHARS[] = "eE";
465
ce8a8b2f
AM
466/* Chars that mean this number is a floating point constant
467 As in 0f12.456
468 or 0d1.2345e12. */
252b5132
RH
469const char FLT_CHARS[] = "fFdDxX";
470
ce8a8b2f 471/* Tables for lexical analysis. */
252b5132
RH
472static char mnemonic_chars[256];
473static char register_chars[256];
474static char operand_chars[256];
475static char identifier_chars[256];
476static char digit_chars[256];
477
ce8a8b2f 478/* Lexical macros. */
252b5132
RH
479#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
480#define is_operand_char(x) (operand_chars[(unsigned char) x])
481#define is_register_char(x) (register_chars[(unsigned char) x])
482#define is_space_char(x) ((x) == ' ')
483#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
484#define is_digit_char(x) (digit_chars[(unsigned char) x])
485
0234cb7c 486/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
487static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
488
489/* md_assemble() always leaves the strings it's passed unaltered. To
490 effect this we maintain a stack of saved characters that we've smashed
491 with '\0's (indicating end of strings for various sub-fields of the
47926f60 492 assembler instruction). */
252b5132 493static char save_stack[32];
ce8a8b2f 494static char *save_stack_p;
252b5132
RH
495#define END_STRING_AND_SAVE(s) \
496 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
497#define RESTORE_END_STRING(s) \
498 do { *(s) = *--save_stack_p; } while (0)
499
47926f60 500/* The instruction we're assembling. */
252b5132
RH
501static i386_insn i;
502
503/* Possible templates for current insn. */
504static const templates *current_templates;
505
31b2323c
L
506/* Per instruction expressionS buffers: max displacements & immediates. */
507static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
508static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 509
47926f60 510/* Current operand we are working on. */
ee86248c 511static int this_operand = -1;
252b5132 512
3e73aa7c
JH
513/* We support four different modes. FLAG_CODE variable is used to distinguish
514 these. */
515
516enum flag_code {
517 CODE_32BIT,
518 CODE_16BIT,
519 CODE_64BIT };
520
521static enum flag_code flag_code;
4fa24527 522static unsigned int object_64bit;
862be3fb 523static unsigned int disallow_64bit_reloc;
3e73aa7c
JH
524static int use_rela_relocations = 0;
525
7af8ed2d
NC
526#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
527 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
528 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
529
351f65ca
L
530/* The ELF ABI to use. */
531enum x86_elf_abi
532{
533 I386_ABI,
7f56bc95
L
534 X86_64_ABI,
535 X86_64_X32_ABI
351f65ca
L
536};
537
538static enum x86_elf_abi x86_elf_abi = I386_ABI;
7af8ed2d 539#endif
351f65ca 540
167ad85b
TG
541#if defined (TE_PE) || defined (TE_PEP)
542/* Use big object file format. */
543static int use_big_obj = 0;
544#endif
545
8dcea932
L
546#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
547/* 1 if generating code for a shared library. */
548static int shared = 0;
549#endif
550
47926f60
KH
551/* 1 for intel syntax,
552 0 if att syntax. */
553static int intel_syntax = 0;
252b5132 554
e89c5eaa
L
555/* 1 for Intel64 ISA,
556 0 if AMD64 ISA. */
557static int intel64;
558
1efbbeb4
L
559/* 1 for intel mnemonic,
560 0 if att mnemonic. */
561static int intel_mnemonic = !SYSV386_COMPAT;
562
a60de03c
JB
563/* 1 if pseudo registers are permitted. */
564static int allow_pseudo_reg = 0;
565
47926f60
KH
566/* 1 if register prefix % not required. */
567static int allow_naked_reg = 0;
252b5132 568
33eaf5de 569/* 1 if the assembler should add BND prefix for all control-transferring
7e8b059b
L
570 instructions supporting it, even if this prefix wasn't specified
571 explicitly. */
572static int add_bnd_prefix = 0;
573
ba104c83 574/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
575static int allow_index_reg = 0;
576
d022bddd
IT
577/* 1 if the assembler should ignore LOCK prefix, even if it was
578 specified explicitly. */
579static int omit_lock_prefix = 0;
580
e4e00185
AS
581/* 1 if the assembler should encode lfence, mfence, and sfence as
582 "lock addl $0, (%{re}sp)". */
583static int avoid_fence = 0;
584
0cb4071e
L
585/* 1 if the assembler should generate relax relocations. */
586
587static int generate_relax_relocations
588 = DEFAULT_GENERATE_X86_RELAX_RELOCATIONS;
589
7bab8ab5 590static enum check_kind
daf50ae7 591 {
7bab8ab5
JB
592 check_none = 0,
593 check_warning,
594 check_error
daf50ae7 595 }
7bab8ab5 596sse_check, operand_check = check_warning;
daf50ae7 597
b6f8c7c4
L
598/* Optimization:
599 1. Clear the REX_W bit with register operand if possible.
600 2. Above plus use 128bit vector instruction to clear the full vector
601 register.
602 */
603static int optimize = 0;
604
605/* Optimization:
606 1. Clear the REX_W bit with register operand if possible.
607 2. Above plus use 128bit vector instruction to clear the full vector
608 register.
609 3. Above plus optimize "test{q,l,w} $imm8,%r{64,32,16}" to
610 "testb $imm7,%r8".
611 */
612static int optimize_for_space = 0;
613
2ca3ace5
L
614/* Register prefix used for error message. */
615static const char *register_prefix = "%";
616
47926f60
KH
617/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
618 leave, push, and pop instructions so that gcc has the same stack
619 frame as in 32 bit mode. */
620static char stackop_size = '\0';
eecb386c 621
12b55ccc
L
622/* Non-zero to optimize code alignment. */
623int optimize_align_code = 1;
624
47926f60
KH
625/* Non-zero to quieten some warnings. */
626static int quiet_warnings = 0;
a38cf1db 627
47926f60
KH
628/* CPU name. */
629static const char *cpu_arch_name = NULL;
6305a203 630static char *cpu_sub_arch_name = NULL;
a38cf1db 631
47926f60 632/* CPU feature flags. */
40fb9820
L
633static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
634
ccc9c027
L
635/* If we have selected a cpu we are generating instructions for. */
636static int cpu_arch_tune_set = 0;
637
9103f4f4 638/* Cpu we are generating instructions for. */
fbf3f584 639enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
9103f4f4
L
640
641/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 642static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 643
ccc9c027 644/* CPU instruction set architecture used. */
fbf3f584 645enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
ccc9c027 646
9103f4f4 647/* CPU feature flags of instruction set architecture used. */
fbf3f584 648i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 649
fddf5b5b
AM
650/* If set, conditional jumps are not automatically promoted to handle
651 larger than a byte offset. */
652static unsigned int no_cond_jump_promotion = 0;
653
c0f3af97
L
654/* Encode SSE instructions with VEX prefix. */
655static unsigned int sse2avx;
656
539f890d
L
657/* Encode scalar AVX instructions with specific vector length. */
658static enum
659 {
660 vex128 = 0,
661 vex256
662 } avxscalar;
663
43234a1e
L
664/* Encode scalar EVEX LIG instructions with specific vector length. */
665static enum
666 {
667 evexl128 = 0,
668 evexl256,
669 evexl512
670 } evexlig;
671
672/* Encode EVEX WIG instructions with specific evex.w. */
673static enum
674 {
675 evexw0 = 0,
676 evexw1
677 } evexwig;
678
d3d3c6db
IT
679/* Value to encode in EVEX RC bits, for SAE-only instructions. */
680static enum rc_type evexrcig = rne;
681
29b0f896 682/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 683static symbolS *GOT_symbol;
29b0f896 684
a4447b93
RH
685/* The dwarf2 return column, adjusted for 32 or 64 bit. */
686unsigned int x86_dwarf2_return_column;
687
688/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
689int x86_cie_data_alignment;
690
252b5132 691/* Interface to relax_segment.
fddf5b5b
AM
692 There are 3 major relax states for 386 jump insns because the
693 different types of jumps add different sizes to frags when we're
694 figuring out what sort of jump to choose to reach a given label. */
252b5132 695
47926f60 696/* Types. */
93c2a809
AM
697#define UNCOND_JUMP 0
698#define COND_JUMP 1
699#define COND_JUMP86 2
fddf5b5b 700
47926f60 701/* Sizes. */
252b5132
RH
702#define CODE16 1
703#define SMALL 0
29b0f896 704#define SMALL16 (SMALL | CODE16)
252b5132 705#define BIG 2
29b0f896 706#define BIG16 (BIG | CODE16)
252b5132
RH
707
708#ifndef INLINE
709#ifdef __GNUC__
710#define INLINE __inline__
711#else
712#define INLINE
713#endif
714#endif
715
fddf5b5b
AM
716#define ENCODE_RELAX_STATE(type, size) \
717 ((relax_substateT) (((type) << 2) | (size)))
718#define TYPE_FROM_RELAX_STATE(s) \
719 ((s) >> 2)
720#define DISP_SIZE_FROM_RELAX_STATE(s) \
721 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
722
723/* This table is used by relax_frag to promote short jumps to long
724 ones where necessary. SMALL (short) jumps may be promoted to BIG
725 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
726 don't allow a short jump in a 32 bit code segment to be promoted to
727 a 16 bit offset jump because it's slower (requires data size
728 prefix), and doesn't work, unless the destination is in the bottom
729 64k of the code segment (The top 16 bits of eip are zeroed). */
730
731const relax_typeS md_relax_table[] =
732{
24eab124
AM
733 /* The fields are:
734 1) most positive reach of this state,
735 2) most negative reach of this state,
93c2a809 736 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 737 4) which index into the table to try if we can't fit into this one. */
252b5132 738
fddf5b5b 739 /* UNCOND_JUMP states. */
93c2a809
AM
740 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
741 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
742 /* dword jmp adds 4 bytes to frag:
743 0 extra opcode bytes, 4 displacement bytes. */
252b5132 744 {0, 0, 4, 0},
93c2a809
AM
745 /* word jmp adds 2 byte2 to frag:
746 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
747 {0, 0, 2, 0},
748
93c2a809
AM
749 /* COND_JUMP states. */
750 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
751 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
752 /* dword conditionals adds 5 bytes to frag:
753 1 extra opcode byte, 4 displacement bytes. */
754 {0, 0, 5, 0},
fddf5b5b 755 /* word conditionals add 3 bytes to frag:
93c2a809
AM
756 1 extra opcode byte, 2 displacement bytes. */
757 {0, 0, 3, 0},
758
759 /* COND_JUMP86 states. */
760 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
761 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
762 /* dword conditionals adds 5 bytes to frag:
763 1 extra opcode byte, 4 displacement bytes. */
764 {0, 0, 5, 0},
765 /* word conditionals add 4 bytes to frag:
766 1 displacement byte and a 3 byte long branch insn. */
767 {0, 0, 4, 0}
252b5132
RH
768};
769
9103f4f4
L
770static const arch_entry cpu_arch[] =
771{
89507696
JB
772 /* Do not replace the first two entries - i386_target_format()
773 relies on them being there in this order. */
8a2c8fef 774 { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
293f5f65 775 CPU_GENERIC32_FLAGS, 0 },
8a2c8fef 776 { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
293f5f65 777 CPU_GENERIC64_FLAGS, 0 },
8a2c8fef 778 { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
293f5f65 779 CPU_NONE_FLAGS, 0 },
8a2c8fef 780 { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
293f5f65 781 CPU_I186_FLAGS, 0 },
8a2c8fef 782 { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
293f5f65 783 CPU_I286_FLAGS, 0 },
8a2c8fef 784 { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
293f5f65 785 CPU_I386_FLAGS, 0 },
8a2c8fef 786 { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
293f5f65 787 CPU_I486_FLAGS, 0 },
8a2c8fef 788 { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
293f5f65 789 CPU_I586_FLAGS, 0 },
8a2c8fef 790 { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
293f5f65 791 CPU_I686_FLAGS, 0 },
8a2c8fef 792 { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
293f5f65 793 CPU_I586_FLAGS, 0 },
8a2c8fef 794 { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
293f5f65 795 CPU_PENTIUMPRO_FLAGS, 0 },
8a2c8fef 796 { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
293f5f65 797 CPU_P2_FLAGS, 0 },
8a2c8fef 798 { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
293f5f65 799 CPU_P3_FLAGS, 0 },
8a2c8fef 800 { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
293f5f65 801 CPU_P4_FLAGS, 0 },
8a2c8fef 802 { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
293f5f65 803 CPU_CORE_FLAGS, 0 },
8a2c8fef 804 { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
293f5f65 805 CPU_NOCONA_FLAGS, 0 },
8a2c8fef 806 { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
293f5f65 807 CPU_CORE_FLAGS, 1 },
8a2c8fef 808 { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
293f5f65 809 CPU_CORE_FLAGS, 0 },
8a2c8fef 810 { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
293f5f65 811 CPU_CORE2_FLAGS, 1 },
8a2c8fef 812 { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
293f5f65 813 CPU_CORE2_FLAGS, 0 },
8a2c8fef 814 { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
293f5f65 815 CPU_COREI7_FLAGS, 0 },
8a2c8fef 816 { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
293f5f65 817 CPU_L1OM_FLAGS, 0 },
7a9068fe 818 { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
293f5f65 819 CPU_K1OM_FLAGS, 0 },
81486035 820 { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
293f5f65 821 CPU_IAMCU_FLAGS, 0 },
8a2c8fef 822 { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
293f5f65 823 CPU_K6_FLAGS, 0 },
8a2c8fef 824 { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
293f5f65 825 CPU_K6_2_FLAGS, 0 },
8a2c8fef 826 { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
293f5f65 827 CPU_ATHLON_FLAGS, 0 },
8a2c8fef 828 { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
293f5f65 829 CPU_K8_FLAGS, 1 },
8a2c8fef 830 { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
293f5f65 831 CPU_K8_FLAGS, 0 },
8a2c8fef 832 { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
293f5f65 833 CPU_K8_FLAGS, 0 },
8a2c8fef 834 { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
293f5f65 835 CPU_AMDFAM10_FLAGS, 0 },
8aedb9fe 836 { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
293f5f65 837 CPU_BDVER1_FLAGS, 0 },
8aedb9fe 838 { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
293f5f65 839 CPU_BDVER2_FLAGS, 0 },
5e5c50d3 840 { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
293f5f65 841 CPU_BDVER3_FLAGS, 0 },
c7b0bd56 842 { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
293f5f65 843 CPU_BDVER4_FLAGS, 0 },
029f3522 844 { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
293f5f65 845 CPU_ZNVER1_FLAGS, 0 },
a9660a6f
AP
846 { STRING_COMMA_LEN ("znver2"), PROCESSOR_ZNVER,
847 CPU_ZNVER2_FLAGS, 0 },
7b458c12 848 { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
293f5f65 849 CPU_BTVER1_FLAGS, 0 },
7b458c12 850 { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
293f5f65 851 CPU_BTVER2_FLAGS, 0 },
8a2c8fef 852 { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
293f5f65 853 CPU_8087_FLAGS, 0 },
8a2c8fef 854 { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
293f5f65 855 CPU_287_FLAGS, 0 },
8a2c8fef 856 { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
293f5f65 857 CPU_387_FLAGS, 0 },
1848e567
L
858 { STRING_COMMA_LEN (".687"), PROCESSOR_UNKNOWN,
859 CPU_687_FLAGS, 0 },
8a2c8fef 860 { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
293f5f65 861 CPU_MMX_FLAGS, 0 },
8a2c8fef 862 { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
293f5f65 863 CPU_SSE_FLAGS, 0 },
8a2c8fef 864 { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
293f5f65 865 CPU_SSE2_FLAGS, 0 },
8a2c8fef 866 { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
293f5f65 867 CPU_SSE3_FLAGS, 0 },
8a2c8fef 868 { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
293f5f65 869 CPU_SSSE3_FLAGS, 0 },
8a2c8fef 870 { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
293f5f65 871 CPU_SSE4_1_FLAGS, 0 },
8a2c8fef 872 { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
293f5f65 873 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 874 { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
293f5f65 875 CPU_SSE4_2_FLAGS, 0 },
8a2c8fef 876 { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
293f5f65 877 CPU_AVX_FLAGS, 0 },
6c30d220 878 { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
293f5f65 879 CPU_AVX2_FLAGS, 0 },
43234a1e 880 { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
293f5f65 881 CPU_AVX512F_FLAGS, 0 },
43234a1e 882 { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
293f5f65 883 CPU_AVX512CD_FLAGS, 0 },
43234a1e 884 { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
293f5f65 885 CPU_AVX512ER_FLAGS, 0 },
43234a1e 886 { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
293f5f65 887 CPU_AVX512PF_FLAGS, 0 },
1dfc6506 888 { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
293f5f65 889 CPU_AVX512DQ_FLAGS, 0 },
1dfc6506 890 { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
293f5f65 891 CPU_AVX512BW_FLAGS, 0 },
1dfc6506 892 { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
293f5f65 893 CPU_AVX512VL_FLAGS, 0 },
8a2c8fef 894 { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
293f5f65 895 CPU_VMX_FLAGS, 0 },
8729a6f6 896 { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
293f5f65 897 CPU_VMFUNC_FLAGS, 0 },
8a2c8fef 898 { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
293f5f65 899 CPU_SMX_FLAGS, 0 },
8a2c8fef 900 { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
293f5f65 901 CPU_XSAVE_FLAGS, 0 },
c7b8aa3a 902 { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
293f5f65 903 CPU_XSAVEOPT_FLAGS, 0 },
1dfc6506 904 { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
293f5f65 905 CPU_XSAVEC_FLAGS, 0 },
1dfc6506 906 { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
293f5f65 907 CPU_XSAVES_FLAGS, 0 },
8a2c8fef 908 { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
293f5f65 909 CPU_AES_FLAGS, 0 },
8a2c8fef 910 { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
293f5f65 911 CPU_PCLMUL_FLAGS, 0 },
8a2c8fef 912 { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
293f5f65 913 CPU_PCLMUL_FLAGS, 1 },
c7b8aa3a 914 { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
293f5f65 915 CPU_FSGSBASE_FLAGS, 0 },
c7b8aa3a 916 { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
293f5f65 917 CPU_RDRND_FLAGS, 0 },
c7b8aa3a 918 { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
293f5f65 919 CPU_F16C_FLAGS, 0 },
6c30d220 920 { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
293f5f65 921 CPU_BMI2_FLAGS, 0 },
8a2c8fef 922 { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
293f5f65 923 CPU_FMA_FLAGS, 0 },
8a2c8fef 924 { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
293f5f65 925 CPU_FMA4_FLAGS, 0 },
8a2c8fef 926 { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
293f5f65 927 CPU_XOP_FLAGS, 0 },
8a2c8fef 928 { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
293f5f65 929 CPU_LWP_FLAGS, 0 },
8a2c8fef 930 { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
293f5f65 931 CPU_MOVBE_FLAGS, 0 },
60aa667e 932 { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
293f5f65 933 CPU_CX16_FLAGS, 0 },
8a2c8fef 934 { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
293f5f65 935 CPU_EPT_FLAGS, 0 },
6c30d220 936 { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
293f5f65 937 CPU_LZCNT_FLAGS, 0 },
42164a71 938 { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
293f5f65 939 CPU_HLE_FLAGS, 0 },
42164a71 940 { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
293f5f65 941 CPU_RTM_FLAGS, 0 },
6c30d220 942 { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
293f5f65 943 CPU_INVPCID_FLAGS, 0 },
8a2c8fef 944 { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
293f5f65 945 CPU_CLFLUSH_FLAGS, 0 },
22109423 946 { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
293f5f65 947 CPU_NOP_FLAGS, 0 },
8a2c8fef 948 { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
293f5f65 949 CPU_SYSCALL_FLAGS, 0 },
8a2c8fef 950 { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
293f5f65 951 CPU_RDTSCP_FLAGS, 0 },
8a2c8fef 952 { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
293f5f65 953 CPU_3DNOW_FLAGS, 0 },
8a2c8fef 954 { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
293f5f65 955 CPU_3DNOWA_FLAGS, 0 },
8a2c8fef 956 { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
293f5f65 957 CPU_PADLOCK_FLAGS, 0 },
8a2c8fef 958 { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
293f5f65 959 CPU_SVME_FLAGS, 1 },
8a2c8fef 960 { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
293f5f65 961 CPU_SVME_FLAGS, 0 },
8a2c8fef 962 { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
293f5f65 963 CPU_SSE4A_FLAGS, 0 },
8a2c8fef 964 { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
293f5f65 965 CPU_ABM_FLAGS, 0 },
87973e9f 966 { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
293f5f65 967 CPU_BMI_FLAGS, 0 },
2a2a0f38 968 { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
293f5f65 969 CPU_TBM_FLAGS, 0 },
e2e1fcde 970 { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
293f5f65 971 CPU_ADX_FLAGS, 0 },
e2e1fcde 972 { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
293f5f65 973 CPU_RDSEED_FLAGS, 0 },
e2e1fcde 974 { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
293f5f65 975 CPU_PRFCHW_FLAGS, 0 },
5c111e37 976 { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
293f5f65 977 CPU_SMAP_FLAGS, 0 },
7e8b059b 978 { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
293f5f65 979 CPU_MPX_FLAGS, 0 },
a0046408 980 { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
293f5f65 981 CPU_SHA_FLAGS, 0 },
963f3586 982 { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
293f5f65 983 CPU_CLFLUSHOPT_FLAGS, 0 },
dcf893b5 984 { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
293f5f65 985 CPU_PREFETCHWT1_FLAGS, 0 },
2cf200a4 986 { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
293f5f65 987 CPU_SE1_FLAGS, 0 },
c5e7287a 988 { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
293f5f65 989 CPU_CLWB_FLAGS, 0 },
2cc1b5aa 990 { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
293f5f65 991 CPU_AVX512IFMA_FLAGS, 0 },
14f195c9 992 { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
293f5f65 993 CPU_AVX512VBMI_FLAGS, 0 },
920d2ddc
IT
994 { STRING_COMMA_LEN (".avx512_4fmaps"), PROCESSOR_UNKNOWN,
995 CPU_AVX512_4FMAPS_FLAGS, 0 },
47acf0bd
IT
996 { STRING_COMMA_LEN (".avx512_4vnniw"), PROCESSOR_UNKNOWN,
997 CPU_AVX512_4VNNIW_FLAGS, 0 },
620214f7
IT
998 { STRING_COMMA_LEN (".avx512_vpopcntdq"), PROCESSOR_UNKNOWN,
999 CPU_AVX512_VPOPCNTDQ_FLAGS, 0 },
53467f57
IT
1000 { STRING_COMMA_LEN (".avx512_vbmi2"), PROCESSOR_UNKNOWN,
1001 CPU_AVX512_VBMI2_FLAGS, 0 },
8cfcb765
IT
1002 { STRING_COMMA_LEN (".avx512_vnni"), PROCESSOR_UNKNOWN,
1003 CPU_AVX512_VNNI_FLAGS, 0 },
ee6872be
IT
1004 { STRING_COMMA_LEN (".avx512_bitalg"), PROCESSOR_UNKNOWN,
1005 CPU_AVX512_BITALG_FLAGS, 0 },
029f3522 1006 { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
293f5f65 1007 CPU_CLZERO_FLAGS, 0 },
9916071f 1008 { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
293f5f65 1009 CPU_MWAITX_FLAGS, 0 },
8eab4136 1010 { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
293f5f65 1011 CPU_OSPKE_FLAGS, 0 },
8bc52696 1012 { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
293f5f65 1013 CPU_RDPID_FLAGS, 0 },
6b40c462
L
1014 { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
1015 CPU_PTWRITE_FLAGS, 0 },
d777820b
IT
1016 { STRING_COMMA_LEN (".ibt"), PROCESSOR_UNKNOWN,
1017 CPU_IBT_FLAGS, 0 },
1018 { STRING_COMMA_LEN (".shstk"), PROCESSOR_UNKNOWN,
1019 CPU_SHSTK_FLAGS, 0 },
48521003
IT
1020 { STRING_COMMA_LEN (".gfni"), PROCESSOR_UNKNOWN,
1021 CPU_GFNI_FLAGS, 0 },
8dcf1fad
IT
1022 { STRING_COMMA_LEN (".vaes"), PROCESSOR_UNKNOWN,
1023 CPU_VAES_FLAGS, 0 },
ff1982d5
IT
1024 { STRING_COMMA_LEN (".vpclmulqdq"), PROCESSOR_UNKNOWN,
1025 CPU_VPCLMULQDQ_FLAGS, 0 },
3233d7d0
IT
1026 { STRING_COMMA_LEN (".wbnoinvd"), PROCESSOR_UNKNOWN,
1027 CPU_WBNOINVD_FLAGS, 0 },
be3a8dca
IT
1028 { STRING_COMMA_LEN (".pconfig"), PROCESSOR_UNKNOWN,
1029 CPU_PCONFIG_FLAGS, 0 },
de89d0a3
IT
1030 { STRING_COMMA_LEN (".waitpkg"), PROCESSOR_UNKNOWN,
1031 CPU_WAITPKG_FLAGS, 0 },
c48935d7
IT
1032 { STRING_COMMA_LEN (".cldemote"), PROCESSOR_UNKNOWN,
1033 CPU_CLDEMOTE_FLAGS, 0 },
c0a30a9f
L
1034 { STRING_COMMA_LEN (".movdiri"), PROCESSOR_UNKNOWN,
1035 CPU_MOVDIRI_FLAGS, 0 },
1036 { STRING_COMMA_LEN (".movdir64b"), PROCESSOR_UNKNOWN,
1037 CPU_MOVDIR64B_FLAGS, 0 },
293f5f65
L
1038};
1039
1040static const noarch_entry cpu_noarch[] =
1041{
1042 { STRING_COMMA_LEN ("no87"), CPU_ANY_X87_FLAGS },
1848e567
L
1043 { STRING_COMMA_LEN ("no287"), CPU_ANY_287_FLAGS },
1044 { STRING_COMMA_LEN ("no387"), CPU_ANY_387_FLAGS },
1045 { STRING_COMMA_LEN ("no687"), CPU_ANY_687_FLAGS },
293f5f65
L
1046 { STRING_COMMA_LEN ("nommx"), CPU_ANY_MMX_FLAGS },
1047 { STRING_COMMA_LEN ("nosse"), CPU_ANY_SSE_FLAGS },
1848e567
L
1048 { STRING_COMMA_LEN ("nosse2"), CPU_ANY_SSE2_FLAGS },
1049 { STRING_COMMA_LEN ("nosse3"), CPU_ANY_SSE3_FLAGS },
1050 { STRING_COMMA_LEN ("nossse3"), CPU_ANY_SSSE3_FLAGS },
1051 { STRING_COMMA_LEN ("nosse4.1"), CPU_ANY_SSE4_1_FLAGS },
1052 { STRING_COMMA_LEN ("nosse4.2"), CPU_ANY_SSE4_2_FLAGS },
1053 { STRING_COMMA_LEN ("nosse4"), CPU_ANY_SSE4_1_FLAGS },
293f5f65 1054 { STRING_COMMA_LEN ("noavx"), CPU_ANY_AVX_FLAGS },
1848e567 1055 { STRING_COMMA_LEN ("noavx2"), CPU_ANY_AVX2_FLAGS },
144b71e2
L
1056 { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
1057 { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
1058 { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
1059 { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
1060 { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
1061 { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
1062 { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
1063 { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
1064 { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
920d2ddc 1065 { STRING_COMMA_LEN ("noavx512_4fmaps"), CPU_ANY_AVX512_4FMAPS_FLAGS },
47acf0bd 1066 { STRING_COMMA_LEN ("noavx512_4vnniw"), CPU_ANY_AVX512_4VNNIW_FLAGS },
620214f7 1067 { STRING_COMMA_LEN ("noavx512_vpopcntdq"), CPU_ANY_AVX512_VPOPCNTDQ_FLAGS },
53467f57 1068 { STRING_COMMA_LEN ("noavx512_vbmi2"), CPU_ANY_AVX512_VBMI2_FLAGS },
8cfcb765 1069 { STRING_COMMA_LEN ("noavx512_vnni"), CPU_ANY_AVX512_VNNI_FLAGS },
ee6872be 1070 { STRING_COMMA_LEN ("noavx512_bitalg"), CPU_ANY_AVX512_BITALG_FLAGS },
d777820b
IT
1071 { STRING_COMMA_LEN ("noibt"), CPU_ANY_IBT_FLAGS },
1072 { STRING_COMMA_LEN ("noshstk"), CPU_ANY_SHSTK_FLAGS },
c0a30a9f
L
1073 { STRING_COMMA_LEN ("nomovdiri"), CPU_ANY_MOVDIRI_FLAGS },
1074 { STRING_COMMA_LEN ("nomovdir64b"), CPU_ANY_MOVDIR64B_FLAGS },
e413e4e9
AM
1075};
1076
704209c0 1077#ifdef I386COFF
a6c24e68
NC
1078/* Like s_lcomm_internal in gas/read.c but the alignment string
1079 is allowed to be optional. */
1080
1081static symbolS *
1082pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
1083{
1084 addressT align = 0;
1085
1086 SKIP_WHITESPACE ();
1087
7ab9ffdd 1088 if (needs_align
a6c24e68
NC
1089 && *input_line_pointer == ',')
1090 {
1091 align = parse_align (needs_align - 1);
7ab9ffdd 1092
a6c24e68
NC
1093 if (align == (addressT) -1)
1094 return NULL;
1095 }
1096 else
1097 {
1098 if (size >= 8)
1099 align = 3;
1100 else if (size >= 4)
1101 align = 2;
1102 else if (size >= 2)
1103 align = 1;
1104 else
1105 align = 0;
1106 }
1107
1108 bss_alloc (symbolP, size, align);
1109 return symbolP;
1110}
1111
704209c0 1112static void
a6c24e68
NC
1113pe_lcomm (int needs_align)
1114{
1115 s_comm_internal (needs_align * 2, pe_lcomm_internal);
1116}
704209c0 1117#endif
a6c24e68 1118
29b0f896
AM
1119const pseudo_typeS md_pseudo_table[] =
1120{
1121#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
1122 {"align", s_align_bytes, 0},
1123#else
1124 {"align", s_align_ptwo, 0},
1125#endif
1126 {"arch", set_cpu_arch, 0},
1127#ifndef I386COFF
1128 {"bss", s_bss, 0},
a6c24e68
NC
1129#else
1130 {"lcomm", pe_lcomm, 1},
29b0f896
AM
1131#endif
1132 {"ffloat", float_cons, 'f'},
1133 {"dfloat", float_cons, 'd'},
1134 {"tfloat", float_cons, 'x'},
1135 {"value", cons, 2},
d182319b 1136 {"slong", signed_cons, 4},
29b0f896
AM
1137 {"noopt", s_ignore, 0},
1138 {"optim", s_ignore, 0},
1139 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
1140 {"code16", set_code_flag, CODE_16BIT},
1141 {"code32", set_code_flag, CODE_32BIT},
da5f19a2 1142#ifdef BFD64
29b0f896 1143 {"code64", set_code_flag, CODE_64BIT},
da5f19a2 1144#endif
29b0f896
AM
1145 {"intel_syntax", set_intel_syntax, 1},
1146 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
1147 {"intel_mnemonic", set_intel_mnemonic, 1},
1148 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
1149 {"allow_index_reg", set_allow_index_reg, 1},
1150 {"disallow_index_reg", set_allow_index_reg, 0},
7bab8ab5
JB
1151 {"sse_check", set_check, 0},
1152 {"operand_check", set_check, 1},
3b22753a
L
1153#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1154 {"largecomm", handle_large_common, 0},
07a53e5c 1155#else
68d20676 1156 {"file", dwarf2_directive_file, 0},
07a53e5c
RH
1157 {"loc", dwarf2_directive_loc, 0},
1158 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 1159#endif
6482c264
NC
1160#ifdef TE_PE
1161 {"secrel32", pe_directive_secrel, 0},
1162#endif
29b0f896
AM
1163 {0, 0, 0}
1164};
1165
1166/* For interface with expression (). */
1167extern char *input_line_pointer;
1168
1169/* Hash table for instruction mnemonic lookup. */
1170static struct hash_control *op_hash;
1171
1172/* Hash table for register lookup. */
1173static struct hash_control *reg_hash;
1174\f
ce8a8b2f
AM
1175 /* Various efficient no-op patterns for aligning code labels.
1176 Note: Don't try to assemble the instructions in the comments.
1177 0L and 0w are not legal. */
62a02d25
L
1178static const unsigned char f32_1[] =
1179 {0x90}; /* nop */
1180static const unsigned char f32_2[] =
1181 {0x66,0x90}; /* xchg %ax,%ax */
1182static const unsigned char f32_3[] =
1183 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
1184static const unsigned char f32_4[] =
1185 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
62a02d25
L
1186static const unsigned char f32_6[] =
1187 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
1188static const unsigned char f32_7[] =
1189 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
62a02d25 1190static const unsigned char f16_3[] =
3ae729d5 1191 {0x8d,0x74,0x00}; /* lea 0(%si),%si */
62a02d25 1192static const unsigned char f16_4[] =
3ae729d5
L
1193 {0x8d,0xb4,0x00,0x00}; /* lea 0W(%si),%si */
1194static const unsigned char jump_disp8[] =
1195 {0xeb}; /* jmp disp8 */
1196static const unsigned char jump32_disp32[] =
1197 {0xe9}; /* jmp disp32 */
1198static const unsigned char jump16_disp32[] =
1199 {0x66,0xe9}; /* jmp disp32 */
62a02d25
L
1200/* 32-bit NOPs patterns. */
1201static const unsigned char *const f32_patt[] = {
3ae729d5 1202 f32_1, f32_2, f32_3, f32_4, NULL, f32_6, f32_7
62a02d25
L
1203};
1204/* 16-bit NOPs patterns. */
1205static const unsigned char *const f16_patt[] = {
3ae729d5 1206 f32_1, f32_2, f16_3, f16_4
62a02d25
L
1207};
1208/* nopl (%[re]ax) */
1209static const unsigned char alt_3[] =
1210 {0x0f,0x1f,0x00};
1211/* nopl 0(%[re]ax) */
1212static const unsigned char alt_4[] =
1213 {0x0f,0x1f,0x40,0x00};
1214/* nopl 0(%[re]ax,%[re]ax,1) */
1215static const unsigned char alt_5[] =
1216 {0x0f,0x1f,0x44,0x00,0x00};
1217/* nopw 0(%[re]ax,%[re]ax,1) */
1218static const unsigned char alt_6[] =
1219 {0x66,0x0f,0x1f,0x44,0x00,0x00};
1220/* nopl 0L(%[re]ax) */
1221static const unsigned char alt_7[] =
1222 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
1223/* nopl 0L(%[re]ax,%[re]ax,1) */
1224static const unsigned char alt_8[] =
1225 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1226/* nopw 0L(%[re]ax,%[re]ax,1) */
1227static const unsigned char alt_9[] =
1228 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
1229/* nopw %cs:0L(%[re]ax,%[re]ax,1) */
1230static const unsigned char alt_10[] =
1231 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
3ae729d5
L
1232/* data16 nopw %cs:0L(%eax,%eax,1) */
1233static const unsigned char alt_11[] =
1234 {0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
62a02d25
L
1235/* 32-bit and 64-bit NOPs patterns. */
1236static const unsigned char *const alt_patt[] = {
1237 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
3ae729d5 1238 alt_9, alt_10, alt_11
62a02d25
L
1239};
1240
1241/* Genenerate COUNT bytes of NOPs to WHERE from PATT with the maximum
1242 size of a single NOP instruction MAX_SINGLE_NOP_SIZE. */
1243
1244static void
1245i386_output_nops (char *where, const unsigned char *const *patt,
1246 int count, int max_single_nop_size)
1247
1248{
3ae729d5
L
1249 /* Place the longer NOP first. */
1250 int last;
1251 int offset;
1252 const unsigned char *nops = patt[max_single_nop_size - 1];
1253
1254 /* Use the smaller one if the requsted one isn't available. */
1255 if (nops == NULL)
62a02d25 1256 {
3ae729d5
L
1257 max_single_nop_size--;
1258 nops = patt[max_single_nop_size - 1];
62a02d25
L
1259 }
1260
3ae729d5
L
1261 last = count % max_single_nop_size;
1262
1263 count -= last;
1264 for (offset = 0; offset < count; offset += max_single_nop_size)
1265 memcpy (where + offset, nops, max_single_nop_size);
1266
1267 if (last)
1268 {
1269 nops = patt[last - 1];
1270 if (nops == NULL)
1271 {
1272 /* Use the smaller one plus one-byte NOP if the needed one
1273 isn't available. */
1274 last--;
1275 nops = patt[last - 1];
1276 memcpy (where + offset, nops, last);
1277 where[offset + last] = *patt[0];
1278 }
1279 else
1280 memcpy (where + offset, nops, last);
1281 }
62a02d25
L
1282}
1283
3ae729d5
L
1284static INLINE int
1285fits_in_imm7 (offsetT num)
1286{
1287 return (num & 0x7f) == num;
1288}
1289
1290static INLINE int
1291fits_in_imm31 (offsetT num)
1292{
1293 return (num & 0x7fffffff) == num;
1294}
62a02d25
L
1295
1296/* Genenerate COUNT bytes of NOPs to WHERE with the maximum size of a
1297 single NOP instruction LIMIT. */
1298
1299void
3ae729d5 1300i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
62a02d25 1301{
3ae729d5 1302 const unsigned char *const *patt = NULL;
62a02d25 1303 int max_single_nop_size;
3ae729d5
L
1304 /* Maximum number of NOPs before switching to jump over NOPs. */
1305 int max_number_of_nops;
62a02d25 1306
3ae729d5 1307 switch (fragP->fr_type)
62a02d25 1308 {
3ae729d5
L
1309 case rs_fill_nop:
1310 case rs_align_code:
1311 break;
1312 default:
62a02d25
L
1313 return;
1314 }
1315
ccc9c027
L
1316 /* We need to decide which NOP sequence to use for 32bit and
1317 64bit. When -mtune= is used:
4eed87de 1318
76bc74dc
L
1319 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
1320 PROCESSOR_GENERIC32, f32_patt will be used.
80b8656c
L
1321 2. For the rest, alt_patt will be used.
1322
1323 When -mtune= isn't used, alt_patt will be used if
22109423 1324 cpu_arch_isa_flags has CpuNop. Otherwise, f32_patt will
76bc74dc 1325 be used.
ccc9c027
L
1326
1327 When -march= or .arch is used, we can't use anything beyond
1328 cpu_arch_isa_flags. */
1329
1330 if (flag_code == CODE_16BIT)
1331 {
3ae729d5
L
1332 patt = f16_patt;
1333 max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
1334 /* Limit number of NOPs to 2 in 16-bit mode. */
1335 max_number_of_nops = 2;
252b5132 1336 }
33fef721 1337 else
ccc9c027 1338 {
fbf3f584 1339 if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
ccc9c027
L
1340 {
1341 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
1342 switch (cpu_arch_tune)
1343 {
1344 case PROCESSOR_UNKNOWN:
1345 /* We use cpu_arch_isa_flags to check if we SHOULD
22109423
L
1346 optimize with nops. */
1347 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1348 patt = alt_patt;
ccc9c027
L
1349 else
1350 patt = f32_patt;
1351 break;
ccc9c027
L
1352 case PROCESSOR_PENTIUM4:
1353 case PROCESSOR_NOCONA:
ef05d495 1354 case PROCESSOR_CORE:
76bc74dc 1355 case PROCESSOR_CORE2:
bd5295b2 1356 case PROCESSOR_COREI7:
3632d14b 1357 case PROCESSOR_L1OM:
7a9068fe 1358 case PROCESSOR_K1OM:
76bc74dc 1359 case PROCESSOR_GENERIC64:
ccc9c027
L
1360 case PROCESSOR_K6:
1361 case PROCESSOR_ATHLON:
1362 case PROCESSOR_K8:
4eed87de 1363 case PROCESSOR_AMDFAM10:
8aedb9fe 1364 case PROCESSOR_BD:
029f3522 1365 case PROCESSOR_ZNVER:
7b458c12 1366 case PROCESSOR_BT:
80b8656c 1367 patt = alt_patt;
ccc9c027 1368 break;
76bc74dc 1369 case PROCESSOR_I386:
ccc9c027
L
1370 case PROCESSOR_I486:
1371 case PROCESSOR_PENTIUM:
2dde1948 1372 case PROCESSOR_PENTIUMPRO:
81486035 1373 case PROCESSOR_IAMCU:
ccc9c027
L
1374 case PROCESSOR_GENERIC32:
1375 patt = f32_patt;
1376 break;
4eed87de 1377 }
ccc9c027
L
1378 }
1379 else
1380 {
fbf3f584 1381 switch (fragP->tc_frag_data.tune)
ccc9c027
L
1382 {
1383 case PROCESSOR_UNKNOWN:
e6a14101 1384 /* When cpu_arch_isa is set, cpu_arch_tune shouldn't be
ccc9c027
L
1385 PROCESSOR_UNKNOWN. */
1386 abort ();
1387 break;
1388
76bc74dc 1389 case PROCESSOR_I386:
ccc9c027
L
1390 case PROCESSOR_I486:
1391 case PROCESSOR_PENTIUM:
81486035 1392 case PROCESSOR_IAMCU:
ccc9c027
L
1393 case PROCESSOR_K6:
1394 case PROCESSOR_ATHLON:
1395 case PROCESSOR_K8:
4eed87de 1396 case PROCESSOR_AMDFAM10:
8aedb9fe 1397 case PROCESSOR_BD:
029f3522 1398 case PROCESSOR_ZNVER:
7b458c12 1399 case PROCESSOR_BT:
ccc9c027
L
1400 case PROCESSOR_GENERIC32:
1401 /* We use cpu_arch_isa_flags to check if we CAN optimize
22109423
L
1402 with nops. */
1403 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1404 patt = alt_patt;
ccc9c027
L
1405 else
1406 patt = f32_patt;
1407 break;
76bc74dc
L
1408 case PROCESSOR_PENTIUMPRO:
1409 case PROCESSOR_PENTIUM4:
1410 case PROCESSOR_NOCONA:
1411 case PROCESSOR_CORE:
ef05d495 1412 case PROCESSOR_CORE2:
bd5295b2 1413 case PROCESSOR_COREI7:
3632d14b 1414 case PROCESSOR_L1OM:
7a9068fe 1415 case PROCESSOR_K1OM:
22109423 1416 if (fragP->tc_frag_data.isa_flags.bitfield.cpunop)
80b8656c 1417 patt = alt_patt;
ccc9c027
L
1418 else
1419 patt = f32_patt;
1420 break;
1421 case PROCESSOR_GENERIC64:
80b8656c 1422 patt = alt_patt;
ccc9c027 1423 break;
4eed87de 1424 }
ccc9c027
L
1425 }
1426
76bc74dc
L
1427 if (patt == f32_patt)
1428 {
3ae729d5
L
1429 max_single_nop_size = sizeof (f32_patt) / sizeof (f32_patt[0]);
1430 /* Limit number of NOPs to 2 for older processors. */
1431 max_number_of_nops = 2;
76bc74dc
L
1432 }
1433 else
1434 {
3ae729d5
L
1435 max_single_nop_size = sizeof (alt_patt) / sizeof (alt_patt[0]);
1436 /* Limit number of NOPs to 7 for newer processors. */
1437 max_number_of_nops = 7;
1438 }
1439 }
1440
1441 if (limit == 0)
1442 limit = max_single_nop_size;
1443
1444 if (fragP->fr_type == rs_fill_nop)
1445 {
1446 /* Output NOPs for .nop directive. */
1447 if (limit > max_single_nop_size)
1448 {
1449 as_bad_where (fragP->fr_file, fragP->fr_line,
1450 _("invalid single nop size: %d "
1451 "(expect within [0, %d])"),
1452 limit, max_single_nop_size);
1453 return;
1454 }
1455 }
1456 else
1457 fragP->fr_var = count;
1458
1459 if ((count / max_single_nop_size) > max_number_of_nops)
1460 {
1461 /* Generate jump over NOPs. */
1462 offsetT disp = count - 2;
1463 if (fits_in_imm7 (disp))
1464 {
1465 /* Use "jmp disp8" if possible. */
1466 count = disp;
1467 where[0] = jump_disp8[0];
1468 where[1] = count;
1469 where += 2;
1470 }
1471 else
1472 {
1473 unsigned int size_of_jump;
1474
1475 if (flag_code == CODE_16BIT)
1476 {
1477 where[0] = jump16_disp32[0];
1478 where[1] = jump16_disp32[1];
1479 size_of_jump = 2;
1480 }
1481 else
1482 {
1483 where[0] = jump32_disp32[0];
1484 size_of_jump = 1;
1485 }
1486
1487 count -= size_of_jump + 4;
1488 if (!fits_in_imm31 (count))
1489 {
1490 as_bad_where (fragP->fr_file, fragP->fr_line,
1491 _("jump over nop padding out of range"));
1492 return;
1493 }
1494
1495 md_number_to_chars (where + size_of_jump, count, 4);
1496 where += size_of_jump + 4;
76bc74dc 1497 }
ccc9c027 1498 }
3ae729d5
L
1499
1500 /* Generate multiple NOPs. */
1501 i386_output_nops (where, patt, count, limit);
252b5132
RH
1502}
1503
c6fb90c8 1504static INLINE int
0dfbf9d7 1505operand_type_all_zero (const union i386_operand_type *x)
40fb9820 1506{
0dfbf9d7 1507 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1508 {
1509 case 3:
0dfbf9d7 1510 if (x->array[2])
c6fb90c8 1511 return 0;
1a0670f3 1512 /* Fall through. */
c6fb90c8 1513 case 2:
0dfbf9d7 1514 if (x->array[1])
c6fb90c8 1515 return 0;
1a0670f3 1516 /* Fall through. */
c6fb90c8 1517 case 1:
0dfbf9d7 1518 return !x->array[0];
c6fb90c8
L
1519 default:
1520 abort ();
1521 }
40fb9820
L
1522}
1523
c6fb90c8 1524static INLINE void
0dfbf9d7 1525operand_type_set (union i386_operand_type *x, unsigned int v)
40fb9820 1526{
0dfbf9d7 1527 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1528 {
1529 case 3:
0dfbf9d7 1530 x->array[2] = v;
1a0670f3 1531 /* Fall through. */
c6fb90c8 1532 case 2:
0dfbf9d7 1533 x->array[1] = v;
1a0670f3 1534 /* Fall through. */
c6fb90c8 1535 case 1:
0dfbf9d7 1536 x->array[0] = v;
1a0670f3 1537 /* Fall through. */
c6fb90c8
L
1538 break;
1539 default:
1540 abort ();
1541 }
1542}
40fb9820 1543
c6fb90c8 1544static INLINE int
0dfbf9d7
L
1545operand_type_equal (const union i386_operand_type *x,
1546 const union i386_operand_type *y)
c6fb90c8 1547{
0dfbf9d7 1548 switch (ARRAY_SIZE(x->array))
c6fb90c8
L
1549 {
1550 case 3:
0dfbf9d7 1551 if (x->array[2] != y->array[2])
c6fb90c8 1552 return 0;
1a0670f3 1553 /* Fall through. */
c6fb90c8 1554 case 2:
0dfbf9d7 1555 if (x->array[1] != y->array[1])
c6fb90c8 1556 return 0;
1a0670f3 1557 /* Fall through. */
c6fb90c8 1558 case 1:
0dfbf9d7 1559 return x->array[0] == y->array[0];
c6fb90c8
L
1560 break;
1561 default:
1562 abort ();
1563 }
1564}
40fb9820 1565
0dfbf9d7
L
1566static INLINE int
1567cpu_flags_all_zero (const union i386_cpu_flags *x)
1568{
1569 switch (ARRAY_SIZE(x->array))
1570 {
53467f57
IT
1571 case 4:
1572 if (x->array[3])
1573 return 0;
1574 /* Fall through. */
0dfbf9d7
L
1575 case 3:
1576 if (x->array[2])
1577 return 0;
1a0670f3 1578 /* Fall through. */
0dfbf9d7
L
1579 case 2:
1580 if (x->array[1])
1581 return 0;
1a0670f3 1582 /* Fall through. */
0dfbf9d7
L
1583 case 1:
1584 return !x->array[0];
1585 default:
1586 abort ();
1587 }
1588}
1589
0dfbf9d7
L
1590static INLINE int
1591cpu_flags_equal (const union i386_cpu_flags *x,
1592 const union i386_cpu_flags *y)
1593{
1594 switch (ARRAY_SIZE(x->array))
1595 {
53467f57
IT
1596 case 4:
1597 if (x->array[3] != y->array[3])
1598 return 0;
1599 /* Fall through. */
0dfbf9d7
L
1600 case 3:
1601 if (x->array[2] != y->array[2])
1602 return 0;
1a0670f3 1603 /* Fall through. */
0dfbf9d7
L
1604 case 2:
1605 if (x->array[1] != y->array[1])
1606 return 0;
1a0670f3 1607 /* Fall through. */
0dfbf9d7
L
1608 case 1:
1609 return x->array[0] == y->array[0];
1610 break;
1611 default:
1612 abort ();
1613 }
1614}
c6fb90c8
L
1615
1616static INLINE int
1617cpu_flags_check_cpu64 (i386_cpu_flags f)
1618{
1619 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
1620 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
1621}
1622
c6fb90c8
L
1623static INLINE i386_cpu_flags
1624cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1625{
c6fb90c8
L
1626 switch (ARRAY_SIZE (x.array))
1627 {
53467f57
IT
1628 case 4:
1629 x.array [3] &= y.array [3];
1630 /* Fall through. */
c6fb90c8
L
1631 case 3:
1632 x.array [2] &= y.array [2];
1a0670f3 1633 /* Fall through. */
c6fb90c8
L
1634 case 2:
1635 x.array [1] &= y.array [1];
1a0670f3 1636 /* Fall through. */
c6fb90c8
L
1637 case 1:
1638 x.array [0] &= y.array [0];
1639 break;
1640 default:
1641 abort ();
1642 }
1643 return x;
1644}
40fb9820 1645
c6fb90c8
L
1646static INLINE i386_cpu_flags
1647cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 1648{
c6fb90c8 1649 switch (ARRAY_SIZE (x.array))
40fb9820 1650 {
53467f57
IT
1651 case 4:
1652 x.array [3] |= y.array [3];
1653 /* Fall through. */
c6fb90c8
L
1654 case 3:
1655 x.array [2] |= y.array [2];
1a0670f3 1656 /* Fall through. */
c6fb90c8
L
1657 case 2:
1658 x.array [1] |= y.array [1];
1a0670f3 1659 /* Fall through. */
c6fb90c8
L
1660 case 1:
1661 x.array [0] |= y.array [0];
40fb9820
L
1662 break;
1663 default:
1664 abort ();
1665 }
40fb9820
L
1666 return x;
1667}
1668
309d3373
JB
1669static INLINE i386_cpu_flags
1670cpu_flags_and_not (i386_cpu_flags x, i386_cpu_flags y)
1671{
1672 switch (ARRAY_SIZE (x.array))
1673 {
53467f57
IT
1674 case 4:
1675 x.array [3] &= ~y.array [3];
1676 /* Fall through. */
309d3373
JB
1677 case 3:
1678 x.array [2] &= ~y.array [2];
1a0670f3 1679 /* Fall through. */
309d3373
JB
1680 case 2:
1681 x.array [1] &= ~y.array [1];
1a0670f3 1682 /* Fall through. */
309d3373
JB
1683 case 1:
1684 x.array [0] &= ~y.array [0];
1685 break;
1686 default:
1687 abort ();
1688 }
1689 return x;
1690}
1691
c0f3af97
L
1692#define CPU_FLAGS_ARCH_MATCH 0x1
1693#define CPU_FLAGS_64BIT_MATCH 0x2
1694
c0f3af97 1695#define CPU_FLAGS_PERFECT_MATCH \
db12e14e 1696 (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
c0f3af97
L
1697
1698/* Return CPU flags match bits. */
3629bb00 1699
40fb9820 1700static int
d3ce72d0 1701cpu_flags_match (const insn_template *t)
40fb9820 1702{
c0f3af97
L
1703 i386_cpu_flags x = t->cpu_flags;
1704 int match = cpu_flags_check_cpu64 (x) ? CPU_FLAGS_64BIT_MATCH : 0;
40fb9820
L
1705
1706 x.bitfield.cpu64 = 0;
1707 x.bitfield.cpuno64 = 0;
1708
0dfbf9d7 1709 if (cpu_flags_all_zero (&x))
c0f3af97
L
1710 {
1711 /* This instruction is available on all archs. */
db12e14e 1712 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1713 }
3629bb00
L
1714 else
1715 {
c0f3af97 1716 /* This instruction is available only on some archs. */
3629bb00
L
1717 i386_cpu_flags cpu = cpu_arch_flags;
1718
ab592e75
JB
1719 /* AVX512VL is no standalone feature - match it and then strip it. */
1720 if (x.bitfield.cpuavx512vl && !cpu.bitfield.cpuavx512vl)
1721 return match;
1722 x.bitfield.cpuavx512vl = 0;
1723
3629bb00 1724 cpu = cpu_flags_and (x, cpu);
c0f3af97
L
1725 if (!cpu_flags_all_zero (&cpu))
1726 {
a5ff0eb2
L
1727 if (x.bitfield.cpuavx)
1728 {
929f69fa 1729 /* We need to check a few extra flags with AVX. */
b9d49817
JB
1730 if (cpu.bitfield.cpuavx
1731 && (!t->opcode_modifier.sse2avx || sse2avx)
1732 && (!x.bitfield.cpuaes || cpu.bitfield.cpuaes)
929f69fa 1733 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
b9d49817
JB
1734 && (!x.bitfield.cpupclmul || cpu.bitfield.cpupclmul))
1735 match |= CPU_FLAGS_ARCH_MATCH;
a5ff0eb2 1736 }
929f69fa
JB
1737 else if (x.bitfield.cpuavx512f)
1738 {
1739 /* We need to check a few extra flags with AVX512F. */
1740 if (cpu.bitfield.cpuavx512f
1741 && (!x.bitfield.cpugfni || cpu.bitfield.cpugfni)
1742 && (!x.bitfield.cpuvaes || cpu.bitfield.cpuvaes)
1743 && (!x.bitfield.cpuvpclmulqdq || cpu.bitfield.cpuvpclmulqdq))
1744 match |= CPU_FLAGS_ARCH_MATCH;
1745 }
a5ff0eb2 1746 else
db12e14e 1747 match |= CPU_FLAGS_ARCH_MATCH;
c0f3af97 1748 }
3629bb00 1749 }
c0f3af97 1750 return match;
40fb9820
L
1751}
1752
c6fb90c8
L
1753static INLINE i386_operand_type
1754operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 1755{
c6fb90c8
L
1756 switch (ARRAY_SIZE (x.array))
1757 {
1758 case 3:
1759 x.array [2] &= y.array [2];
1a0670f3 1760 /* Fall through. */
c6fb90c8
L
1761 case 2:
1762 x.array [1] &= y.array [1];
1a0670f3 1763 /* Fall through. */
c6fb90c8
L
1764 case 1:
1765 x.array [0] &= y.array [0];
1766 break;
1767 default:
1768 abort ();
1769 }
1770 return x;
40fb9820
L
1771}
1772
73053c1f
JB
1773static INLINE i386_operand_type
1774operand_type_and_not (i386_operand_type x, i386_operand_type y)
1775{
1776 switch (ARRAY_SIZE (x.array))
1777 {
1778 case 3:
1779 x.array [2] &= ~y.array [2];
1780 /* Fall through. */
1781 case 2:
1782 x.array [1] &= ~y.array [1];
1783 /* Fall through. */
1784 case 1:
1785 x.array [0] &= ~y.array [0];
1786 break;
1787 default:
1788 abort ();
1789 }
1790 return x;
1791}
1792
c6fb90c8
L
1793static INLINE i386_operand_type
1794operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 1795{
c6fb90c8 1796 switch (ARRAY_SIZE (x.array))
40fb9820 1797 {
c6fb90c8
L
1798 case 3:
1799 x.array [2] |= y.array [2];
1a0670f3 1800 /* Fall through. */
c6fb90c8
L
1801 case 2:
1802 x.array [1] |= y.array [1];
1a0670f3 1803 /* Fall through. */
c6fb90c8
L
1804 case 1:
1805 x.array [0] |= y.array [0];
40fb9820
L
1806 break;
1807 default:
1808 abort ();
1809 }
c6fb90c8
L
1810 return x;
1811}
40fb9820 1812
c6fb90c8
L
1813static INLINE i386_operand_type
1814operand_type_xor (i386_operand_type x, i386_operand_type y)
1815{
1816 switch (ARRAY_SIZE (x.array))
1817 {
1818 case 3:
1819 x.array [2] ^= y.array [2];
1a0670f3 1820 /* Fall through. */
c6fb90c8
L
1821 case 2:
1822 x.array [1] ^= y.array [1];
1a0670f3 1823 /* Fall through. */
c6fb90c8
L
1824 case 1:
1825 x.array [0] ^= y.array [0];
1826 break;
1827 default:
1828 abort ();
1829 }
40fb9820
L
1830 return x;
1831}
1832
1833static const i386_operand_type acc32 = OPERAND_TYPE_ACC32;
1834static const i386_operand_type acc64 = OPERAND_TYPE_ACC64;
40fb9820
L
1835static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
1836static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
1837static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
1838static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
1839static const i386_operand_type anydisp
1840 = OPERAND_TYPE_ANYDISP;
40fb9820 1841static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
43234a1e 1842static const i386_operand_type regmask = OPERAND_TYPE_REGMASK;
40fb9820
L
1843static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
1844static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
1845static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
1846static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
1847static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
1848static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
1849static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
1850static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
1851static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
a683cc34 1852static const i386_operand_type vec_imm4 = OPERAND_TYPE_VEC_IMM4;
40fb9820
L
1853
1854enum operand_type
1855{
1856 reg,
40fb9820
L
1857 imm,
1858 disp,
1859 anymem
1860};
1861
c6fb90c8 1862static INLINE int
40fb9820
L
1863operand_type_check (i386_operand_type t, enum operand_type c)
1864{
1865 switch (c)
1866 {
1867 case reg:
dc821c5f 1868 return t.bitfield.reg;
40fb9820 1869
40fb9820
L
1870 case imm:
1871 return (t.bitfield.imm8
1872 || t.bitfield.imm8s
1873 || t.bitfield.imm16
1874 || t.bitfield.imm32
1875 || t.bitfield.imm32s
1876 || t.bitfield.imm64);
1877
1878 case disp:
1879 return (t.bitfield.disp8
1880 || t.bitfield.disp16
1881 || t.bitfield.disp32
1882 || t.bitfield.disp32s
1883 || t.bitfield.disp64);
1884
1885 case anymem:
1886 return (t.bitfield.disp8
1887 || t.bitfield.disp16
1888 || t.bitfield.disp32
1889 || t.bitfield.disp32s
1890 || t.bitfield.disp64
1891 || t.bitfield.baseindex);
1892
1893 default:
1894 abort ();
1895 }
2cfe26b6
AM
1896
1897 return 0;
40fb9820
L
1898}
1899
ca0d63fe 1900/* Return 1 if there is no conflict in 8bit/16bit/32bit/64bit/80bit on
5c07affc
L
1901 operand J for instruction template T. */
1902
1903static INLINE int
d3ce72d0 1904match_reg_size (const insn_template *t, unsigned int j)
5c07affc
L
1905{
1906 return !((i.types[j].bitfield.byte
1907 && !t->operand_types[j].bitfield.byte)
1908 || (i.types[j].bitfield.word
1909 && !t->operand_types[j].bitfield.word)
1910 || (i.types[j].bitfield.dword
1911 && !t->operand_types[j].bitfield.dword)
1912 || (i.types[j].bitfield.qword
ca0d63fe
JB
1913 && !t->operand_types[j].bitfield.qword)
1914 || (i.types[j].bitfield.tbyte
1915 && !t->operand_types[j].bitfield.tbyte));
5c07affc
L
1916}
1917
1b54b8d7
JB
1918/* Return 1 if there is no conflict in SIMD register on
1919 operand J for instruction template T. */
1920
1921static INLINE int
1922match_simd_size (const insn_template *t, unsigned int j)
1923{
1924 return !((i.types[j].bitfield.xmmword
1925 && !t->operand_types[j].bitfield.xmmword)
1926 || (i.types[j].bitfield.ymmword
1927 && !t->operand_types[j].bitfield.ymmword)
1928 || (i.types[j].bitfield.zmmword
1929 && !t->operand_types[j].bitfield.zmmword));
1930}
1931
5c07affc
L
1932/* Return 1 if there is no conflict in any size on operand J for
1933 instruction template T. */
1934
1935static INLINE int
d3ce72d0 1936match_mem_size (const insn_template *t, unsigned int j)
5c07affc
L
1937{
1938 return (match_reg_size (t, j)
1939 && !((i.types[j].bitfield.unspecified
af508cb9 1940 && !i.broadcast
5c07affc
L
1941 && !t->operand_types[j].bitfield.unspecified)
1942 || (i.types[j].bitfield.fword
1943 && !t->operand_types[j].bitfield.fword)
1b54b8d7
JB
1944 /* For scalar opcode templates to allow register and memory
1945 operands at the same time, some special casing is needed
d6793fa1
JB
1946 here. Also for v{,p}broadcast*, {,v}pmov{s,z}*, and
1947 down-conversion vpmov*. */
1b54b8d7
JB
1948 || ((t->operand_types[j].bitfield.regsimd
1949 && !t->opcode_modifier.broadcast
d6793fa1
JB
1950 && (t->operand_types[j].bitfield.byte
1951 || t->operand_types[j].bitfield.word
1952 || t->operand_types[j].bitfield.dword
1b54b8d7
JB
1953 || t->operand_types[j].bitfield.qword))
1954 ? (i.types[j].bitfield.xmmword
1955 || i.types[j].bitfield.ymmword
1956 || i.types[j].bitfield.zmmword)
1957 : !match_simd_size(t, j))));
5c07affc
L
1958}
1959
1960/* Return 1 if there is no size conflict on any operands for
1961 instruction template T. */
1962
1963static INLINE int
d3ce72d0 1964operand_size_match (const insn_template *t)
5c07affc
L
1965{
1966 unsigned int j;
1967 int match = 1;
1968
1969 /* Don't check jump instructions. */
1970 if (t->opcode_modifier.jump
1971 || t->opcode_modifier.jumpbyte
1972 || t->opcode_modifier.jumpdword
1973 || t->opcode_modifier.jumpintersegment)
1974 return match;
1975
1976 /* Check memory and accumulator operand size. */
1977 for (j = 0; j < i.operands; j++)
1978 {
1b54b8d7
JB
1979 if (!i.types[j].bitfield.reg && !i.types[j].bitfield.regsimd
1980 && t->operand_types[j].bitfield.anysize)
5c07affc
L
1981 continue;
1982
1b54b8d7 1983 if (t->operand_types[j].bitfield.reg
dc821c5f 1984 && !match_reg_size (t, j))
5c07affc
L
1985 {
1986 match = 0;
1987 break;
1988 }
1989
1b54b8d7
JB
1990 if (t->operand_types[j].bitfield.regsimd
1991 && !match_simd_size (t, j))
1992 {
1993 match = 0;
1994 break;
1995 }
1996
1997 if (t->operand_types[j].bitfield.acc
1998 && (!match_reg_size (t, j) || !match_simd_size (t, j)))
1999 {
2000 match = 0;
2001 break;
2002 }
2003
5c07affc
L
2004 if (i.types[j].bitfield.mem && !match_mem_size (t, j))
2005 {
2006 match = 0;
2007 break;
2008 }
2009 }
2010
891edac4 2011 if (match)
5c07affc 2012 return match;
38e314eb 2013 else if (!t->opcode_modifier.d)
891edac4
L
2014 {
2015mismatch:
86e026a4 2016 i.error = operand_size_mismatch;
891edac4
L
2017 return 0;
2018 }
5c07affc
L
2019
2020 /* Check reverse. */
9c2799c2 2021 gas_assert (i.operands == 2);
5c07affc
L
2022
2023 match = 1;
2024 for (j = 0; j < 2; j++)
2025 {
dc821c5f
JB
2026 if ((t->operand_types[j].bitfield.reg
2027 || t->operand_types[j].bitfield.acc)
5c07affc 2028 && !match_reg_size (t, j ? 0 : 1))
891edac4 2029 goto mismatch;
5c07affc
L
2030
2031 if (i.types[j].bitfield.mem
2032 && !match_mem_size (t, j ? 0 : 1))
891edac4 2033 goto mismatch;
5c07affc
L
2034 }
2035
2036 return match;
2037}
2038
c6fb90c8 2039static INLINE int
40fb9820
L
2040operand_type_match (i386_operand_type overlap,
2041 i386_operand_type given)
2042{
2043 i386_operand_type temp = overlap;
2044
2045 temp.bitfield.jumpabsolute = 0;
7d5e4556 2046 temp.bitfield.unspecified = 0;
5c07affc
L
2047 temp.bitfield.byte = 0;
2048 temp.bitfield.word = 0;
2049 temp.bitfield.dword = 0;
2050 temp.bitfield.fword = 0;
2051 temp.bitfield.qword = 0;
2052 temp.bitfield.tbyte = 0;
2053 temp.bitfield.xmmword = 0;
c0f3af97 2054 temp.bitfield.ymmword = 0;
43234a1e 2055 temp.bitfield.zmmword = 0;
0dfbf9d7 2056 if (operand_type_all_zero (&temp))
891edac4 2057 goto mismatch;
40fb9820 2058
891edac4
L
2059 if (given.bitfield.baseindex == overlap.bitfield.baseindex
2060 && given.bitfield.jumpabsolute == overlap.bitfield.jumpabsolute)
2061 return 1;
2062
2063mismatch:
a65babc9 2064 i.error = operand_type_mismatch;
891edac4 2065 return 0;
40fb9820
L
2066}
2067
7d5e4556 2068/* If given types g0 and g1 are registers they must be of the same type
10c17abd
JB
2069 unless the expected operand type register overlap is null.
2070 Memory operand size of certain SIMD instructions is also being checked
2071 here. */
40fb9820 2072
c6fb90c8 2073static INLINE int
dc821c5f 2074operand_type_register_match (i386_operand_type g0,
40fb9820 2075 i386_operand_type t0,
40fb9820
L
2076 i386_operand_type g1,
2077 i386_operand_type t1)
2078{
10c17abd
JB
2079 if (!g0.bitfield.reg
2080 && !g0.bitfield.regsimd
2081 && (!operand_type_check (g0, anymem)
2082 || g0.bitfield.unspecified
2083 || !t0.bitfield.regsimd))
40fb9820
L
2084 return 1;
2085
10c17abd
JB
2086 if (!g1.bitfield.reg
2087 && !g1.bitfield.regsimd
2088 && (!operand_type_check (g1, anymem)
2089 || g1.bitfield.unspecified
2090 || !t1.bitfield.regsimd))
40fb9820
L
2091 return 1;
2092
dc821c5f
JB
2093 if (g0.bitfield.byte == g1.bitfield.byte
2094 && g0.bitfield.word == g1.bitfield.word
2095 && g0.bitfield.dword == g1.bitfield.dword
10c17abd
JB
2096 && g0.bitfield.qword == g1.bitfield.qword
2097 && g0.bitfield.xmmword == g1.bitfield.xmmword
2098 && g0.bitfield.ymmword == g1.bitfield.ymmword
2099 && g0.bitfield.zmmword == g1.bitfield.zmmword)
40fb9820
L
2100 return 1;
2101
dc821c5f
JB
2102 if (!(t0.bitfield.byte & t1.bitfield.byte)
2103 && !(t0.bitfield.word & t1.bitfield.word)
2104 && !(t0.bitfield.dword & t1.bitfield.dword)
10c17abd
JB
2105 && !(t0.bitfield.qword & t1.bitfield.qword)
2106 && !(t0.bitfield.xmmword & t1.bitfield.xmmword)
2107 && !(t0.bitfield.ymmword & t1.bitfield.ymmword)
2108 && !(t0.bitfield.zmmword & t1.bitfield.zmmword))
891edac4
L
2109 return 1;
2110
a65babc9 2111 i.error = register_type_mismatch;
891edac4
L
2112
2113 return 0;
40fb9820
L
2114}
2115
4c692bc7
JB
2116static INLINE unsigned int
2117register_number (const reg_entry *r)
2118{
2119 unsigned int nr = r->reg_num;
2120
2121 if (r->reg_flags & RegRex)
2122 nr += 8;
2123
200cbe0f
L
2124 if (r->reg_flags & RegVRex)
2125 nr += 16;
2126
4c692bc7
JB
2127 return nr;
2128}
2129
252b5132 2130static INLINE unsigned int
40fb9820 2131mode_from_disp_size (i386_operand_type t)
252b5132 2132{
b5014f7a 2133 if (t.bitfield.disp8)
40fb9820
L
2134 return 1;
2135 else if (t.bitfield.disp16
2136 || t.bitfield.disp32
2137 || t.bitfield.disp32s)
2138 return 2;
2139 else
2140 return 0;
252b5132
RH
2141}
2142
2143static INLINE int
65879393 2144fits_in_signed_byte (addressT num)
252b5132 2145{
65879393 2146 return num + 0x80 <= 0xff;
47926f60 2147}
252b5132
RH
2148
2149static INLINE int
65879393 2150fits_in_unsigned_byte (addressT num)
252b5132 2151{
65879393 2152 return num <= 0xff;
47926f60 2153}
252b5132
RH
2154
2155static INLINE int
65879393 2156fits_in_unsigned_word (addressT num)
252b5132 2157{
65879393 2158 return num <= 0xffff;
47926f60 2159}
252b5132
RH
2160
2161static INLINE int
65879393 2162fits_in_signed_word (addressT num)
252b5132 2163{
65879393 2164 return num + 0x8000 <= 0xffff;
47926f60 2165}
2a962e6d 2166
3e73aa7c 2167static INLINE int
65879393 2168fits_in_signed_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2169{
2170#ifndef BFD64
2171 return 1;
2172#else
65879393 2173 return num + 0x80000000 <= 0xffffffff;
3e73aa7c
JH
2174#endif
2175} /* fits_in_signed_long() */
2a962e6d 2176
3e73aa7c 2177static INLINE int
65879393 2178fits_in_unsigned_long (addressT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
2179{
2180#ifndef BFD64
2181 return 1;
2182#else
65879393 2183 return num <= 0xffffffff;
3e73aa7c
JH
2184#endif
2185} /* fits_in_unsigned_long() */
252b5132 2186
43234a1e 2187static INLINE int
b5014f7a 2188fits_in_disp8 (offsetT num)
43234a1e
L
2189{
2190 int shift = i.memshift;
2191 unsigned int mask;
2192
2193 if (shift == -1)
2194 abort ();
2195
2196 mask = (1 << shift) - 1;
2197
2198 /* Return 0 if NUM isn't properly aligned. */
2199 if ((num & mask))
2200 return 0;
2201
2202 /* Check if NUM will fit in 8bit after shift. */
2203 return fits_in_signed_byte (num >> shift);
2204}
2205
a683cc34
SP
2206static INLINE int
2207fits_in_imm4 (offsetT num)
2208{
2209 return (num & 0xf) == num;
2210}
2211
40fb9820 2212static i386_operand_type
e3bb37b5 2213smallest_imm_type (offsetT num)
252b5132 2214{
40fb9820 2215 i386_operand_type t;
7ab9ffdd 2216
0dfbf9d7 2217 operand_type_set (&t, 0);
40fb9820
L
2218 t.bitfield.imm64 = 1;
2219
2220 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
2221 {
2222 /* This code is disabled on the 486 because all the Imm1 forms
2223 in the opcode table are slower on the i486. They're the
2224 versions with the implicitly specified single-position
2225 displacement, which has another syntax if you really want to
2226 use that form. */
40fb9820
L
2227 t.bitfield.imm1 = 1;
2228 t.bitfield.imm8 = 1;
2229 t.bitfield.imm8s = 1;
2230 t.bitfield.imm16 = 1;
2231 t.bitfield.imm32 = 1;
2232 t.bitfield.imm32s = 1;
2233 }
2234 else if (fits_in_signed_byte (num))
2235 {
2236 t.bitfield.imm8 = 1;
2237 t.bitfield.imm8s = 1;
2238 t.bitfield.imm16 = 1;
2239 t.bitfield.imm32 = 1;
2240 t.bitfield.imm32s = 1;
2241 }
2242 else if (fits_in_unsigned_byte (num))
2243 {
2244 t.bitfield.imm8 = 1;
2245 t.bitfield.imm16 = 1;
2246 t.bitfield.imm32 = 1;
2247 t.bitfield.imm32s = 1;
2248 }
2249 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
2250 {
2251 t.bitfield.imm16 = 1;
2252 t.bitfield.imm32 = 1;
2253 t.bitfield.imm32s = 1;
2254 }
2255 else if (fits_in_signed_long (num))
2256 {
2257 t.bitfield.imm32 = 1;
2258 t.bitfield.imm32s = 1;
2259 }
2260 else if (fits_in_unsigned_long (num))
2261 t.bitfield.imm32 = 1;
2262
2263 return t;
47926f60 2264}
252b5132 2265
847f7ad4 2266static offsetT
e3bb37b5 2267offset_in_range (offsetT val, int size)
847f7ad4 2268{
508866be 2269 addressT mask;
ba2adb93 2270
847f7ad4
AM
2271 switch (size)
2272 {
508866be
L
2273 case 1: mask = ((addressT) 1 << 8) - 1; break;
2274 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 2275 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
2276#ifdef BFD64
2277 case 8: mask = ((addressT) 2 << 63) - 1; break;
2278#endif
47926f60 2279 default: abort ();
847f7ad4
AM
2280 }
2281
9de868bf
L
2282#ifdef BFD64
2283 /* If BFD64, sign extend val for 32bit address mode. */
2284 if (flag_code != CODE_64BIT
2285 || i.prefix[ADDR_PREFIX])
3e73aa7c
JH
2286 if ((val & ~(((addressT) 2 << 31) - 1)) == 0)
2287 val = (val ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
fa289fb8 2288#endif
ba2adb93 2289
47926f60 2290 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
2291 {
2292 char buf1[40], buf2[40];
2293
2294 sprint_value (buf1, val);
2295 sprint_value (buf2, val & mask);
2296 as_warn (_("%s shortened to %s"), buf1, buf2);
2297 }
2298 return val & mask;
2299}
2300
c32fa91d
L
2301enum PREFIX_GROUP
2302{
2303 PREFIX_EXIST = 0,
2304 PREFIX_LOCK,
2305 PREFIX_REP,
04ef582a 2306 PREFIX_DS,
c32fa91d
L
2307 PREFIX_OTHER
2308};
2309
2310/* Returns
2311 a. PREFIX_EXIST if attempting to add a prefix where one from the
2312 same class already exists.
2313 b. PREFIX_LOCK if lock prefix is added.
2314 c. PREFIX_REP if rep/repne prefix is added.
04ef582a
L
2315 d. PREFIX_DS if ds prefix is added.
2316 e. PREFIX_OTHER if other prefix is added.
c32fa91d
L
2317 */
2318
2319static enum PREFIX_GROUP
e3bb37b5 2320add_prefix (unsigned int prefix)
252b5132 2321{
c32fa91d 2322 enum PREFIX_GROUP ret = PREFIX_OTHER;
b1905489 2323 unsigned int q;
252b5132 2324
29b0f896
AM
2325 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
2326 && flag_code == CODE_64BIT)
b1905489 2327 {
161a04f6 2328 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
44846f29
JB
2329 || (i.prefix[REX_PREFIX] & prefix & REX_R)
2330 || (i.prefix[REX_PREFIX] & prefix & REX_X)
2331 || (i.prefix[REX_PREFIX] & prefix & REX_B))
c32fa91d 2332 ret = PREFIX_EXIST;
b1905489
JB
2333 q = REX_PREFIX;
2334 }
3e73aa7c 2335 else
b1905489
JB
2336 {
2337 switch (prefix)
2338 {
2339 default:
2340 abort ();
2341
b1905489 2342 case DS_PREFIX_OPCODE:
04ef582a
L
2343 ret = PREFIX_DS;
2344 /* Fall through. */
2345 case CS_PREFIX_OPCODE:
b1905489
JB
2346 case ES_PREFIX_OPCODE:
2347 case FS_PREFIX_OPCODE:
2348 case GS_PREFIX_OPCODE:
2349 case SS_PREFIX_OPCODE:
2350 q = SEG_PREFIX;
2351 break;
2352
2353 case REPNE_PREFIX_OPCODE:
2354 case REPE_PREFIX_OPCODE:
c32fa91d
L
2355 q = REP_PREFIX;
2356 ret = PREFIX_REP;
2357 break;
2358
b1905489 2359 case LOCK_PREFIX_OPCODE:
c32fa91d
L
2360 q = LOCK_PREFIX;
2361 ret = PREFIX_LOCK;
b1905489
JB
2362 break;
2363
2364 case FWAIT_OPCODE:
2365 q = WAIT_PREFIX;
2366 break;
2367
2368 case ADDR_PREFIX_OPCODE:
2369 q = ADDR_PREFIX;
2370 break;
2371
2372 case DATA_PREFIX_OPCODE:
2373 q = DATA_PREFIX;
2374 break;
2375 }
2376 if (i.prefix[q] != 0)
c32fa91d 2377 ret = PREFIX_EXIST;
b1905489 2378 }
252b5132 2379
b1905489 2380 if (ret)
252b5132 2381 {
b1905489
JB
2382 if (!i.prefix[q])
2383 ++i.prefixes;
2384 i.prefix[q] |= prefix;
252b5132 2385 }
b1905489
JB
2386 else
2387 as_bad (_("same type of prefix used twice"));
252b5132 2388
252b5132
RH
2389 return ret;
2390}
2391
2392static void
78f12dd3 2393update_code_flag (int value, int check)
eecb386c 2394{
78f12dd3
L
2395 PRINTF_LIKE ((*as_error));
2396
1e9cc1c2 2397 flag_code = (enum flag_code) value;
40fb9820
L
2398 if (flag_code == CODE_64BIT)
2399 {
2400 cpu_arch_flags.bitfield.cpu64 = 1;
2401 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
2402 }
2403 else
2404 {
2405 cpu_arch_flags.bitfield.cpu64 = 0;
2406 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
2407 }
2408 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c 2409 {
78f12dd3
L
2410 if (check)
2411 as_error = as_fatal;
2412 else
2413 as_error = as_bad;
2414 (*as_error) (_("64bit mode not supported on `%s'."),
2415 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2416 }
40fb9820 2417 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c 2418 {
78f12dd3
L
2419 if (check)
2420 as_error = as_fatal;
2421 else
2422 as_error = as_bad;
2423 (*as_error) (_("32bit mode not supported on `%s'."),
2424 cpu_arch_name ? cpu_arch_name : default_arch);
3e73aa7c 2425 }
eecb386c
AM
2426 stackop_size = '\0';
2427}
2428
78f12dd3
L
2429static void
2430set_code_flag (int value)
2431{
2432 update_code_flag (value, 0);
2433}
2434
eecb386c 2435static void
e3bb37b5 2436set_16bit_gcc_code_flag (int new_code_flag)
252b5132 2437{
1e9cc1c2 2438 flag_code = (enum flag_code) new_code_flag;
40fb9820
L
2439 if (flag_code != CODE_16BIT)
2440 abort ();
2441 cpu_arch_flags.bitfield.cpu64 = 0;
2442 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 2443 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
2444}
2445
2446static void
e3bb37b5 2447set_intel_syntax (int syntax_flag)
252b5132
RH
2448{
2449 /* Find out if register prefixing is specified. */
2450 int ask_naked_reg = 0;
2451
2452 SKIP_WHITESPACE ();
29b0f896 2453 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132 2454 {
d02603dc
NC
2455 char *string;
2456 int e = get_symbol_name (&string);
252b5132 2457
47926f60 2458 if (strcmp (string, "prefix") == 0)
252b5132 2459 ask_naked_reg = 1;
47926f60 2460 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
2461 ask_naked_reg = -1;
2462 else
d0b47220 2463 as_bad (_("bad argument to syntax directive."));
d02603dc 2464 (void) restore_line_pointer (e);
252b5132
RH
2465 }
2466 demand_empty_rest_of_line ();
c3332e24 2467
252b5132
RH
2468 intel_syntax = syntax_flag;
2469
2470 if (ask_naked_reg == 0)
f86103b7
AM
2471 allow_naked_reg = (intel_syntax
2472 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
2473 else
2474 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 2475
ee86248c 2476 expr_set_rank (O_full_ptr, syntax_flag ? 10 : 0);
7ab9ffdd 2477
e4a3b5a4 2478 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 2479 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 2480 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
2481}
2482
1efbbeb4
L
2483static void
2484set_intel_mnemonic (int mnemonic_flag)
2485{
e1d4d893 2486 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
2487}
2488
db51cc60
L
2489static void
2490set_allow_index_reg (int flag)
2491{
2492 allow_index_reg = flag;
2493}
2494
cb19c032 2495static void
7bab8ab5 2496set_check (int what)
cb19c032 2497{
7bab8ab5
JB
2498 enum check_kind *kind;
2499 const char *str;
2500
2501 if (what)
2502 {
2503 kind = &operand_check;
2504 str = "operand";
2505 }
2506 else
2507 {
2508 kind = &sse_check;
2509 str = "sse";
2510 }
2511
cb19c032
L
2512 SKIP_WHITESPACE ();
2513
2514 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2515 {
d02603dc
NC
2516 char *string;
2517 int e = get_symbol_name (&string);
cb19c032
L
2518
2519 if (strcmp (string, "none") == 0)
7bab8ab5 2520 *kind = check_none;
cb19c032 2521 else if (strcmp (string, "warning") == 0)
7bab8ab5 2522 *kind = check_warning;
cb19c032 2523 else if (strcmp (string, "error") == 0)
7bab8ab5 2524 *kind = check_error;
cb19c032 2525 else
7bab8ab5 2526 as_bad (_("bad argument to %s_check directive."), str);
d02603dc 2527 (void) restore_line_pointer (e);
cb19c032
L
2528 }
2529 else
7bab8ab5 2530 as_bad (_("missing argument for %s_check directive"), str);
cb19c032
L
2531
2532 demand_empty_rest_of_line ();
2533}
2534
8a9036a4
L
2535static void
2536check_cpu_arch_compatible (const char *name ATTRIBUTE_UNUSED,
1e9cc1c2 2537 i386_cpu_flags new_flag ATTRIBUTE_UNUSED)
8a9036a4
L
2538{
2539#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2540 static const char *arch;
2541
2542 /* Intel LIOM is only supported on ELF. */
2543 if (!IS_ELF)
2544 return;
2545
2546 if (!arch)
2547 {
2548 /* Use cpu_arch_name if it is set in md_parse_option. Otherwise
2549 use default_arch. */
2550 arch = cpu_arch_name;
2551 if (!arch)
2552 arch = default_arch;
2553 }
2554
81486035
L
2555 /* If we are targeting Intel MCU, we must enable it. */
2556 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_IAMCU
2557 || new_flag.bitfield.cpuiamcu)
2558 return;
2559
3632d14b 2560 /* If we are targeting Intel L1OM, we must enable it. */
8a9036a4 2561 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_L1OM
1e9cc1c2 2562 || new_flag.bitfield.cpul1om)
8a9036a4 2563 return;
76ba9986 2564
7a9068fe
L
2565 /* If we are targeting Intel K1OM, we must enable it. */
2566 if (get_elf_backend_data (stdoutput)->elf_machine_code != EM_K1OM
2567 || new_flag.bitfield.cpuk1om)
2568 return;
2569
8a9036a4
L
2570 as_bad (_("`%s' is not supported on `%s'"), name, arch);
2571#endif
2572}
2573
e413e4e9 2574static void
e3bb37b5 2575set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 2576{
47926f60 2577 SKIP_WHITESPACE ();
e413e4e9 2578
29b0f896 2579 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9 2580 {
d02603dc
NC
2581 char *string;
2582 int e = get_symbol_name (&string);
91d6fa6a 2583 unsigned int j;
40fb9820 2584 i386_cpu_flags flags;
e413e4e9 2585
91d6fa6a 2586 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
e413e4e9 2587 {
91d6fa6a 2588 if (strcmp (string, cpu_arch[j].name) == 0)
e413e4e9 2589 {
91d6fa6a 2590 check_cpu_arch_compatible (string, cpu_arch[j].flags);
8a9036a4 2591
5c6af06e
JB
2592 if (*string != '.')
2593 {
91d6fa6a 2594 cpu_arch_name = cpu_arch[j].name;
5c6af06e 2595 cpu_sub_arch_name = NULL;
91d6fa6a 2596 cpu_arch_flags = cpu_arch[j].flags;
40fb9820
L
2597 if (flag_code == CODE_64BIT)
2598 {
2599 cpu_arch_flags.bitfield.cpu64 = 1;
2600 cpu_arch_flags.bitfield.cpuno64 = 0;
2601 }
2602 else
2603 {
2604 cpu_arch_flags.bitfield.cpu64 = 0;
2605 cpu_arch_flags.bitfield.cpuno64 = 1;
2606 }
91d6fa6a
NC
2607 cpu_arch_isa = cpu_arch[j].type;
2608 cpu_arch_isa_flags = cpu_arch[j].flags;
ccc9c027
L
2609 if (!cpu_arch_tune_set)
2610 {
2611 cpu_arch_tune = cpu_arch_isa;
2612 cpu_arch_tune_flags = cpu_arch_isa_flags;
2613 }
5c6af06e
JB
2614 break;
2615 }
40fb9820 2616
293f5f65
L
2617 flags = cpu_flags_or (cpu_arch_flags,
2618 cpu_arch[j].flags);
81486035 2619
5b64d091 2620 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
5c6af06e 2621 {
6305a203
L
2622 if (cpu_sub_arch_name)
2623 {
2624 char *name = cpu_sub_arch_name;
2625 cpu_sub_arch_name = concat (name,
91d6fa6a 2626 cpu_arch[j].name,
1bf57e9f 2627 (const char *) NULL);
6305a203
L
2628 free (name);
2629 }
2630 else
91d6fa6a 2631 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
40fb9820 2632 cpu_arch_flags = flags;
a586129e 2633 cpu_arch_isa_flags = flags;
5c6af06e 2634 }
0089dace
L
2635 else
2636 cpu_arch_isa_flags
2637 = cpu_flags_or (cpu_arch_isa_flags,
2638 cpu_arch[j].flags);
d02603dc 2639 (void) restore_line_pointer (e);
5c6af06e
JB
2640 demand_empty_rest_of_line ();
2641 return;
e413e4e9
AM
2642 }
2643 }
293f5f65
L
2644
2645 if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
2646 {
33eaf5de 2647 /* Disable an ISA extension. */
293f5f65
L
2648 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
2649 if (strcmp (string + 1, cpu_noarch [j].name) == 0)
2650 {
2651 flags = cpu_flags_and_not (cpu_arch_flags,
2652 cpu_noarch[j].flags);
2653 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
2654 {
2655 if (cpu_sub_arch_name)
2656 {
2657 char *name = cpu_sub_arch_name;
2658 cpu_sub_arch_name = concat (name, string,
2659 (const char *) NULL);
2660 free (name);
2661 }
2662 else
2663 cpu_sub_arch_name = xstrdup (string);
2664 cpu_arch_flags = flags;
2665 cpu_arch_isa_flags = flags;
2666 }
2667 (void) restore_line_pointer (e);
2668 demand_empty_rest_of_line ();
2669 return;
2670 }
2671
2672 j = ARRAY_SIZE (cpu_arch);
2673 }
2674
91d6fa6a 2675 if (j >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
2676 as_bad (_("no such architecture: `%s'"), string);
2677
2678 *input_line_pointer = e;
2679 }
2680 else
2681 as_bad (_("missing cpu architecture"));
2682
fddf5b5b
AM
2683 no_cond_jump_promotion = 0;
2684 if (*input_line_pointer == ','
29b0f896 2685 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b 2686 {
d02603dc
NC
2687 char *string;
2688 char e;
2689
2690 ++input_line_pointer;
2691 e = get_symbol_name (&string);
fddf5b5b
AM
2692
2693 if (strcmp (string, "nojumps") == 0)
2694 no_cond_jump_promotion = 1;
2695 else if (strcmp (string, "jumps") == 0)
2696 ;
2697 else
2698 as_bad (_("no such architecture modifier: `%s'"), string);
2699
d02603dc 2700 (void) restore_line_pointer (e);
fddf5b5b
AM
2701 }
2702
e413e4e9
AM
2703 demand_empty_rest_of_line ();
2704}
2705
8a9036a4
L
2706enum bfd_architecture
2707i386_arch (void)
2708{
3632d14b 2709 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4
L
2710 {
2711 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2712 || flag_code != CODE_64BIT)
2713 as_fatal (_("Intel L1OM is 64bit ELF only"));
2714 return bfd_arch_l1om;
2715 }
7a9068fe
L
2716 else if (cpu_arch_isa == PROCESSOR_K1OM)
2717 {
2718 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2719 || flag_code != CODE_64BIT)
2720 as_fatal (_("Intel K1OM is 64bit ELF only"));
2721 return bfd_arch_k1om;
2722 }
81486035
L
2723 else if (cpu_arch_isa == PROCESSOR_IAMCU)
2724 {
2725 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2726 || flag_code == CODE_64BIT)
2727 as_fatal (_("Intel MCU is 32bit ELF only"));
2728 return bfd_arch_iamcu;
2729 }
8a9036a4
L
2730 else
2731 return bfd_arch_i386;
2732}
2733
b9d79e03 2734unsigned long
7016a5d5 2735i386_mach (void)
b9d79e03 2736{
351f65ca 2737 if (!strncmp (default_arch, "x86_64", 6))
8a9036a4 2738 {
3632d14b 2739 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 2740 {
351f65ca
L
2741 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2742 || default_arch[6] != '\0')
8a9036a4
L
2743 as_fatal (_("Intel L1OM is 64bit ELF only"));
2744 return bfd_mach_l1om;
2745 }
7a9068fe
L
2746 else if (cpu_arch_isa == PROCESSOR_K1OM)
2747 {
2748 if (OUTPUT_FLAVOR != bfd_target_elf_flavour
2749 || default_arch[6] != '\0')
2750 as_fatal (_("Intel K1OM is 64bit ELF only"));
2751 return bfd_mach_k1om;
2752 }
351f65ca 2753 else if (default_arch[6] == '\0')
8a9036a4 2754 return bfd_mach_x86_64;
351f65ca
L
2755 else
2756 return bfd_mach_x64_32;
8a9036a4 2757 }
5197d474
L
2758 else if (!strcmp (default_arch, "i386")
2759 || !strcmp (default_arch, "iamcu"))
81486035
L
2760 {
2761 if (cpu_arch_isa == PROCESSOR_IAMCU)
2762 {
2763 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
2764 as_fatal (_("Intel MCU is 32bit ELF only"));
2765 return bfd_mach_i386_iamcu;
2766 }
2767 else
2768 return bfd_mach_i386_i386;
2769 }
b9d79e03 2770 else
2b5d6a91 2771 as_fatal (_("unknown architecture"));
b9d79e03 2772}
b9d79e03 2773\f
252b5132 2774void
7016a5d5 2775md_begin (void)
252b5132
RH
2776{
2777 const char *hash_err;
2778
86fa6981
L
2779 /* Support pseudo prefixes like {disp32}. */
2780 lex_type ['{'] = LEX_BEGIN_NAME;
2781
47926f60 2782 /* Initialize op_hash hash table. */
252b5132
RH
2783 op_hash = hash_new ();
2784
2785 {
d3ce72d0 2786 const insn_template *optab;
29b0f896 2787 templates *core_optab;
252b5132 2788
47926f60
KH
2789 /* Setup for loop. */
2790 optab = i386_optab;
add39d23 2791 core_optab = XNEW (templates);
252b5132
RH
2792 core_optab->start = optab;
2793
2794 while (1)
2795 {
2796 ++optab;
2797 if (optab->name == NULL
2798 || strcmp (optab->name, (optab - 1)->name) != 0)
2799 {
2800 /* different name --> ship out current template list;
47926f60 2801 add to hash table; & begin anew. */
252b5132
RH
2802 core_optab->end = optab;
2803 hash_err = hash_insert (op_hash,
2804 (optab - 1)->name,
5a49b8ac 2805 (void *) core_optab);
252b5132
RH
2806 if (hash_err)
2807 {
b37df7c4 2808 as_fatal (_("can't hash %s: %s"),
252b5132
RH
2809 (optab - 1)->name,
2810 hash_err);
2811 }
2812 if (optab->name == NULL)
2813 break;
add39d23 2814 core_optab = XNEW (templates);
252b5132
RH
2815 core_optab->start = optab;
2816 }
2817 }
2818 }
2819
47926f60 2820 /* Initialize reg_hash hash table. */
252b5132
RH
2821 reg_hash = hash_new ();
2822 {
29b0f896 2823 const reg_entry *regtab;
c3fe08fa 2824 unsigned int regtab_size = i386_regtab_size;
252b5132 2825
c3fe08fa 2826 for (regtab = i386_regtab; regtab_size--; regtab++)
252b5132 2827 {
5a49b8ac 2828 hash_err = hash_insert (reg_hash, regtab->reg_name, (void *) regtab);
252b5132 2829 if (hash_err)
b37df7c4 2830 as_fatal (_("can't hash %s: %s"),
3e73aa7c
JH
2831 regtab->reg_name,
2832 hash_err);
252b5132
RH
2833 }
2834 }
2835
47926f60 2836 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 2837 {
29b0f896
AM
2838 int c;
2839 char *p;
252b5132
RH
2840
2841 for (c = 0; c < 256; c++)
2842 {
3882b010 2843 if (ISDIGIT (c))
252b5132
RH
2844 {
2845 digit_chars[c] = c;
2846 mnemonic_chars[c] = c;
2847 register_chars[c] = c;
2848 operand_chars[c] = c;
2849 }
3882b010 2850 else if (ISLOWER (c))
252b5132
RH
2851 {
2852 mnemonic_chars[c] = c;
2853 register_chars[c] = c;
2854 operand_chars[c] = c;
2855 }
3882b010 2856 else if (ISUPPER (c))
252b5132 2857 {
3882b010 2858 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
2859 register_chars[c] = mnemonic_chars[c];
2860 operand_chars[c] = c;
2861 }
43234a1e 2862 else if (c == '{' || c == '}')
86fa6981
L
2863 {
2864 mnemonic_chars[c] = c;
2865 operand_chars[c] = c;
2866 }
252b5132 2867
3882b010 2868 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
2869 identifier_chars[c] = c;
2870 else if (c >= 128)
2871 {
2872 identifier_chars[c] = c;
2873 operand_chars[c] = c;
2874 }
2875 }
2876
2877#ifdef LEX_AT
2878 identifier_chars['@'] = '@';
32137342
NC
2879#endif
2880#ifdef LEX_QM
2881 identifier_chars['?'] = '?';
2882 operand_chars['?'] = '?';
252b5132 2883#endif
252b5132 2884 digit_chars['-'] = '-';
c0f3af97 2885 mnemonic_chars['_'] = '_';
791fe849 2886 mnemonic_chars['-'] = '-';
0003779b 2887 mnemonic_chars['.'] = '.';
252b5132
RH
2888 identifier_chars['_'] = '_';
2889 identifier_chars['.'] = '.';
2890
2891 for (p = operand_special_chars; *p != '\0'; p++)
2892 operand_chars[(unsigned char) *p] = *p;
2893 }
2894
a4447b93
RH
2895 if (flag_code == CODE_64BIT)
2896 {
ca19b261
KT
2897#if defined (OBJ_COFF) && defined (TE_PE)
2898 x86_dwarf2_return_column = (OUTPUT_FLAVOR == bfd_target_coff_flavour
2899 ? 32 : 16);
2900#else
a4447b93 2901 x86_dwarf2_return_column = 16;
ca19b261 2902#endif
61ff971f 2903 x86_cie_data_alignment = -8;
a4447b93
RH
2904 }
2905 else
2906 {
2907 x86_dwarf2_return_column = 8;
2908 x86_cie_data_alignment = -4;
2909 }
252b5132
RH
2910}
2911
2912void
e3bb37b5 2913i386_print_statistics (FILE *file)
252b5132
RH
2914{
2915 hash_print_statistics (file, "i386 opcode", op_hash);
2916 hash_print_statistics (file, "i386 register", reg_hash);
2917}
2918\f
252b5132
RH
2919#ifdef DEBUG386
2920
ce8a8b2f 2921/* Debugging routines for md_assemble. */
d3ce72d0 2922static void pte (insn_template *);
40fb9820 2923static void pt (i386_operand_type);
e3bb37b5
L
2924static void pe (expressionS *);
2925static void ps (symbolS *);
252b5132
RH
2926
2927static void
e3bb37b5 2928pi (char *line, i386_insn *x)
252b5132 2929{
09137c09 2930 unsigned int j;
252b5132
RH
2931
2932 fprintf (stdout, "%s: template ", line);
2933 pte (&x->tm);
09f131f2
JH
2934 fprintf (stdout, " address: base %s index %s scale %x\n",
2935 x->base_reg ? x->base_reg->reg_name : "none",
2936 x->index_reg ? x->index_reg->reg_name : "none",
2937 x->log2_scale_factor);
2938 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 2939 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
2940 fprintf (stdout, " sib: base %x index %x scale %x\n",
2941 x->sib.base, x->sib.index, x->sib.scale);
2942 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
2943 (x->rex & REX_W) != 0,
2944 (x->rex & REX_R) != 0,
2945 (x->rex & REX_X) != 0,
2946 (x->rex & REX_B) != 0);
09137c09 2947 for (j = 0; j < x->operands; j++)
252b5132 2948 {
09137c09
SP
2949 fprintf (stdout, " #%d: ", j + 1);
2950 pt (x->types[j]);
252b5132 2951 fprintf (stdout, "\n");
dc821c5f 2952 if (x->types[j].bitfield.reg
09137c09 2953 || x->types[j].bitfield.regmmx
1b54b8d7 2954 || x->types[j].bitfield.regsimd
09137c09
SP
2955 || x->types[j].bitfield.sreg2
2956 || x->types[j].bitfield.sreg3
2957 || x->types[j].bitfield.control
2958 || x->types[j].bitfield.debug
2959 || x->types[j].bitfield.test)
2960 fprintf (stdout, "%s\n", x->op[j].regs->reg_name);
2961 if (operand_type_check (x->types[j], imm))
2962 pe (x->op[j].imms);
2963 if (operand_type_check (x->types[j], disp))
2964 pe (x->op[j].disps);
252b5132
RH
2965 }
2966}
2967
2968static void
d3ce72d0 2969pte (insn_template *t)
252b5132 2970{
09137c09 2971 unsigned int j;
252b5132 2972 fprintf (stdout, " %d operands ", t->operands);
47926f60 2973 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
2974 if (t->extension_opcode != None)
2975 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 2976 if (t->opcode_modifier.d)
252b5132 2977 fprintf (stdout, "D");
40fb9820 2978 if (t->opcode_modifier.w)
252b5132
RH
2979 fprintf (stdout, "W");
2980 fprintf (stdout, "\n");
09137c09 2981 for (j = 0; j < t->operands; j++)
252b5132 2982 {
09137c09
SP
2983 fprintf (stdout, " #%d type ", j + 1);
2984 pt (t->operand_types[j]);
252b5132
RH
2985 fprintf (stdout, "\n");
2986 }
2987}
2988
2989static void
e3bb37b5 2990pe (expressionS *e)
252b5132 2991{
24eab124 2992 fprintf (stdout, " operation %d\n", e->X_op);
b77ad1d4
AM
2993 fprintf (stdout, " add_number %ld (%lx)\n",
2994 (long) e->X_add_number, (long) e->X_add_number);
252b5132
RH
2995 if (e->X_add_symbol)
2996 {
2997 fprintf (stdout, " add_symbol ");
2998 ps (e->X_add_symbol);
2999 fprintf (stdout, "\n");
3000 }
3001 if (e->X_op_symbol)
3002 {
3003 fprintf (stdout, " op_symbol ");
3004 ps (e->X_op_symbol);
3005 fprintf (stdout, "\n");
3006 }
3007}
3008
3009static void
e3bb37b5 3010ps (symbolS *s)
252b5132
RH
3011{
3012 fprintf (stdout, "%s type %s%s",
3013 S_GET_NAME (s),
3014 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
3015 segment_name (S_GET_SEGMENT (s)));
3016}
3017
7b81dfbb 3018static struct type_name
252b5132 3019 {
40fb9820
L
3020 i386_operand_type mask;
3021 const char *name;
252b5132 3022 }
7b81dfbb 3023const type_names[] =
252b5132 3024{
40fb9820
L
3025 { OPERAND_TYPE_REG8, "r8" },
3026 { OPERAND_TYPE_REG16, "r16" },
3027 { OPERAND_TYPE_REG32, "r32" },
3028 { OPERAND_TYPE_REG64, "r64" },
3029 { OPERAND_TYPE_IMM8, "i8" },
3030 { OPERAND_TYPE_IMM8, "i8s" },
3031 { OPERAND_TYPE_IMM16, "i16" },
3032 { OPERAND_TYPE_IMM32, "i32" },
3033 { OPERAND_TYPE_IMM32S, "i32s" },
3034 { OPERAND_TYPE_IMM64, "i64" },
3035 { OPERAND_TYPE_IMM1, "i1" },
3036 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
3037 { OPERAND_TYPE_DISP8, "d8" },
3038 { OPERAND_TYPE_DISP16, "d16" },
3039 { OPERAND_TYPE_DISP32, "d32" },
3040 { OPERAND_TYPE_DISP32S, "d32s" },
3041 { OPERAND_TYPE_DISP64, "d64" },
3042 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
3043 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
3044 { OPERAND_TYPE_CONTROL, "control reg" },
3045 { OPERAND_TYPE_TEST, "test reg" },
3046 { OPERAND_TYPE_DEBUG, "debug reg" },
3047 { OPERAND_TYPE_FLOATREG, "FReg" },
3048 { OPERAND_TYPE_FLOATACC, "FAcc" },
3049 { OPERAND_TYPE_SREG2, "SReg2" },
3050 { OPERAND_TYPE_SREG3, "SReg3" },
3051 { OPERAND_TYPE_ACC, "Acc" },
3052 { OPERAND_TYPE_JUMPABSOLUTE, "Jump Absolute" },
3053 { OPERAND_TYPE_REGMMX, "rMMX" },
3054 { OPERAND_TYPE_REGXMM, "rXMM" },
0349dc08 3055 { OPERAND_TYPE_REGYMM, "rYMM" },
43234a1e
L
3056 { OPERAND_TYPE_REGZMM, "rZMM" },
3057 { OPERAND_TYPE_REGMASK, "Mask reg" },
40fb9820 3058 { OPERAND_TYPE_ESSEG, "es" },
252b5132
RH
3059};
3060
3061static void
40fb9820 3062pt (i386_operand_type t)
252b5132 3063{
40fb9820 3064 unsigned int j;
c6fb90c8 3065 i386_operand_type a;
252b5132 3066
40fb9820 3067 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
3068 {
3069 a = operand_type_and (t, type_names[j].mask);
0349dc08 3070 if (!operand_type_all_zero (&a))
c6fb90c8
L
3071 fprintf (stdout, "%s, ", type_names[j].name);
3072 }
252b5132
RH
3073 fflush (stdout);
3074}
3075
3076#endif /* DEBUG386 */
3077\f
252b5132 3078static bfd_reloc_code_real_type
3956db08 3079reloc (unsigned int size,
64e74474
AM
3080 int pcrel,
3081 int sign,
3082 bfd_reloc_code_real_type other)
252b5132 3083{
47926f60 3084 if (other != NO_RELOC)
3956db08 3085 {
91d6fa6a 3086 reloc_howto_type *rel;
3956db08
JB
3087
3088 if (size == 8)
3089 switch (other)
3090 {
64e74474
AM
3091 case BFD_RELOC_X86_64_GOT32:
3092 return BFD_RELOC_X86_64_GOT64;
3093 break;
553d1284
L
3094 case BFD_RELOC_X86_64_GOTPLT64:
3095 return BFD_RELOC_X86_64_GOTPLT64;
3096 break;
64e74474
AM
3097 case BFD_RELOC_X86_64_PLTOFF64:
3098 return BFD_RELOC_X86_64_PLTOFF64;
3099 break;
3100 case BFD_RELOC_X86_64_GOTPC32:
3101 other = BFD_RELOC_X86_64_GOTPC64;
3102 break;
3103 case BFD_RELOC_X86_64_GOTPCREL:
3104 other = BFD_RELOC_X86_64_GOTPCREL64;
3105 break;
3106 case BFD_RELOC_X86_64_TPOFF32:
3107 other = BFD_RELOC_X86_64_TPOFF64;
3108 break;
3109 case BFD_RELOC_X86_64_DTPOFF32:
3110 other = BFD_RELOC_X86_64_DTPOFF64;
3111 break;
3112 default:
3113 break;
3956db08 3114 }
e05278af 3115
8ce3d284 3116#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
3117 if (other == BFD_RELOC_SIZE32)
3118 {
3119 if (size == 8)
1ab668bf 3120 other = BFD_RELOC_SIZE64;
8fd4256d 3121 if (pcrel)
1ab668bf
AM
3122 {
3123 as_bad (_("there are no pc-relative size relocations"));
3124 return NO_RELOC;
3125 }
8fd4256d 3126 }
8ce3d284 3127#endif
8fd4256d 3128
e05278af 3129 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
f2d8a97c 3130 if (size == 4 && (flag_code != CODE_64BIT || disallow_64bit_reloc))
e05278af
JB
3131 sign = -1;
3132
91d6fa6a
NC
3133 rel = bfd_reloc_type_lookup (stdoutput, other);
3134 if (!rel)
3956db08 3135 as_bad (_("unknown relocation (%u)"), other);
91d6fa6a 3136 else if (size != bfd_get_reloc_size (rel))
3956db08 3137 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
91d6fa6a 3138 bfd_get_reloc_size (rel),
3956db08 3139 size);
91d6fa6a 3140 else if (pcrel && !rel->pc_relative)
3956db08 3141 as_bad (_("non-pc-relative relocation for pc-relative field"));
91d6fa6a 3142 else if ((rel->complain_on_overflow == complain_overflow_signed
3956db08 3143 && !sign)
91d6fa6a 3144 || (rel->complain_on_overflow == complain_overflow_unsigned
64e74474 3145 && sign > 0))
3956db08
JB
3146 as_bad (_("relocated field and relocation type differ in signedness"));
3147 else
3148 return other;
3149 return NO_RELOC;
3150 }
252b5132
RH
3151
3152 if (pcrel)
3153 {
3e73aa7c 3154 if (!sign)
3956db08 3155 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
3156 switch (size)
3157 {
3158 case 1: return BFD_RELOC_8_PCREL;
3159 case 2: return BFD_RELOC_16_PCREL;
d258b828 3160 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 3161 case 8: return BFD_RELOC_64_PCREL;
252b5132 3162 }
3956db08 3163 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
3164 }
3165 else
3166 {
3956db08 3167 if (sign > 0)
e5cb08ac 3168 switch (size)
3e73aa7c
JH
3169 {
3170 case 4: return BFD_RELOC_X86_64_32S;
3171 }
3172 else
3173 switch (size)
3174 {
3175 case 1: return BFD_RELOC_8;
3176 case 2: return BFD_RELOC_16;
3177 case 4: return BFD_RELOC_32;
3178 case 8: return BFD_RELOC_64;
3179 }
3956db08
JB
3180 as_bad (_("cannot do %s %u byte relocation"),
3181 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
3182 }
3183
0cc9e1d3 3184 return NO_RELOC;
252b5132
RH
3185}
3186
47926f60
KH
3187/* Here we decide which fixups can be adjusted to make them relative to
3188 the beginning of the section instead of the symbol. Basically we need
3189 to make sure that the dynamic relocations are done correctly, so in
3190 some cases we force the original symbol to be used. */
3191
252b5132 3192int
e3bb37b5 3193tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 3194{
6d249963 3195#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 3196 if (!IS_ELF)
31312f95
AM
3197 return 1;
3198
a161fe53
AM
3199 /* Don't adjust pc-relative references to merge sections in 64-bit
3200 mode. */
3201 if (use_rela_relocations
3202 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
3203 && fixP->fx_pcrel)
252b5132 3204 return 0;
31312f95 3205
8d01d9a9
AJ
3206 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
3207 and changed later by validate_fix. */
3208 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
3209 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
3210 return 0;
3211
8fd4256d
L
3212 /* Adjust_reloc_syms doesn't know about the GOT. Need to keep symbol
3213 for size relocations. */
3214 if (fixP->fx_r_type == BFD_RELOC_SIZE32
3215 || fixP->fx_r_type == BFD_RELOC_SIZE64
3216 || fixP->fx_r_type == BFD_RELOC_386_GOTOFF
252b5132
RH
3217 || fixP->fx_r_type == BFD_RELOC_386_PLT32
3218 || fixP->fx_r_type == BFD_RELOC_386_GOT32
02a86693 3219 || fixP->fx_r_type == BFD_RELOC_386_GOT32X
13ae64f3
JJ
3220 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
3221 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
3222 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
3223 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
3224 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
3225 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
3226 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
3227 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
3228 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
3229 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c
JH
3230 || fixP->fx_r_type == BFD_RELOC_X86_64_PLT32
3231 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 3232 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
56ceb5b5
L
3233 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCRELX
3234 || fixP->fx_r_type == BFD_RELOC_X86_64_REX_GOTPCRELX
bffbf940
JJ
3235 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
3236 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
3237 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 3238 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
3239 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
3240 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
3241 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
3242 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
3243 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
3244 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
3245 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3246 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3247 return 0;
31312f95 3248#endif
252b5132
RH
3249 return 1;
3250}
252b5132 3251
b4cac588 3252static int
e3bb37b5 3253intel_float_operand (const char *mnemonic)
252b5132 3254{
9306ca4a
JB
3255 /* Note that the value returned is meaningful only for opcodes with (memory)
3256 operands, hence the code here is free to improperly handle opcodes that
3257 have no operands (for better performance and smaller code). */
3258
3259 if (mnemonic[0] != 'f')
3260 return 0; /* non-math */
3261
3262 switch (mnemonic[1])
3263 {
3264 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
3265 the fs segment override prefix not currently handled because no
3266 call path can make opcodes without operands get here */
3267 case 'i':
3268 return 2 /* integer op */;
3269 case 'l':
3270 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
3271 return 3; /* fldcw/fldenv */
3272 break;
3273 case 'n':
3274 if (mnemonic[2] != 'o' /* fnop */)
3275 return 3; /* non-waiting control op */
3276 break;
3277 case 'r':
3278 if (mnemonic[2] == 's')
3279 return 3; /* frstor/frstpm */
3280 break;
3281 case 's':
3282 if (mnemonic[2] == 'a')
3283 return 3; /* fsave */
3284 if (mnemonic[2] == 't')
3285 {
3286 switch (mnemonic[3])
3287 {
3288 case 'c': /* fstcw */
3289 case 'd': /* fstdw */
3290 case 'e': /* fstenv */
3291 case 's': /* fsts[gw] */
3292 return 3;
3293 }
3294 }
3295 break;
3296 case 'x':
3297 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
3298 return 0; /* fxsave/fxrstor are not really math ops */
3299 break;
3300 }
252b5132 3301
9306ca4a 3302 return 1;
252b5132
RH
3303}
3304
c0f3af97
L
3305/* Build the VEX prefix. */
3306
3307static void
d3ce72d0 3308build_vex_prefix (const insn_template *t)
c0f3af97
L
3309{
3310 unsigned int register_specifier;
3311 unsigned int implied_prefix;
3312 unsigned int vector_length;
3313
3314 /* Check register specifier. */
3315 if (i.vex.register_specifier)
43234a1e
L
3316 {
3317 register_specifier =
3318 ~register_number (i.vex.register_specifier) & 0xf;
3319 gas_assert ((i.vex.register_specifier->reg_flags & RegVRex) == 0);
3320 }
c0f3af97
L
3321 else
3322 register_specifier = 0xf;
3323
33eaf5de 3324 /* Use 2-byte VEX prefix by swapping destination and source
fa99fab2 3325 operand. */
86fa6981
L
3326 if (i.vec_encoding != vex_encoding_vex3
3327 && i.dir_encoding == dir_encoding_default
fa99fab2 3328 && i.operands == i.reg_operands
7f399153 3329 && i.tm.opcode_modifier.vexopcode == VEX0F
86fa6981 3330 && i.tm.opcode_modifier.load
fa99fab2
L
3331 && i.rex == REX_B)
3332 {
3333 unsigned int xchg = i.operands - 1;
3334 union i386_op temp_op;
3335 i386_operand_type temp_type;
3336
3337 temp_type = i.types[xchg];
3338 i.types[xchg] = i.types[0];
3339 i.types[0] = temp_type;
3340 temp_op = i.op[xchg];
3341 i.op[xchg] = i.op[0];
3342 i.op[0] = temp_op;
3343
9c2799c2 3344 gas_assert (i.rm.mode == 3);
fa99fab2
L
3345
3346 i.rex = REX_R;
3347 xchg = i.rm.regmem;
3348 i.rm.regmem = i.rm.reg;
3349 i.rm.reg = xchg;
3350
3351 /* Use the next insn. */
3352 i.tm = t[1];
3353 }
3354
539f890d
L
3355 if (i.tm.opcode_modifier.vex == VEXScalar)
3356 vector_length = avxscalar;
10c17abd
JB
3357 else if (i.tm.opcode_modifier.vex == VEX256)
3358 vector_length = 1;
539f890d 3359 else
10c17abd
JB
3360 {
3361 unsigned int op;
3362
3363 vector_length = 0;
3364 for (op = 0; op < t->operands; ++op)
3365 if (t->operand_types[op].bitfield.xmmword
3366 && t->operand_types[op].bitfield.ymmword
3367 && i.types[op].bitfield.ymmword)
3368 {
3369 vector_length = 1;
3370 break;
3371 }
3372 }
c0f3af97
L
3373
3374 switch ((i.tm.base_opcode >> 8) & 0xff)
3375 {
3376 case 0:
3377 implied_prefix = 0;
3378 break;
3379 case DATA_PREFIX_OPCODE:
3380 implied_prefix = 1;
3381 break;
3382 case REPE_PREFIX_OPCODE:
3383 implied_prefix = 2;
3384 break;
3385 case REPNE_PREFIX_OPCODE:
3386 implied_prefix = 3;
3387 break;
3388 default:
3389 abort ();
3390 }
3391
3392 /* Use 2-byte VEX prefix if possible. */
86fa6981
L
3393 if (i.vec_encoding != vex_encoding_vex3
3394 && i.tm.opcode_modifier.vexopcode == VEX0F
04251de0 3395 && i.tm.opcode_modifier.vexw != VEXW1
c0f3af97
L
3396 && (i.rex & (REX_W | REX_X | REX_B)) == 0)
3397 {
3398 /* 2-byte VEX prefix. */
3399 unsigned int r;
3400
3401 i.vex.length = 2;
3402 i.vex.bytes[0] = 0xc5;
3403
3404 /* Check the REX.R bit. */
3405 r = (i.rex & REX_R) ? 0 : 1;
3406 i.vex.bytes[1] = (r << 7
3407 | register_specifier << 3
3408 | vector_length << 2
3409 | implied_prefix);
3410 }
3411 else
3412 {
3413 /* 3-byte VEX prefix. */
3414 unsigned int m, w;
3415
f88c9eb0 3416 i.vex.length = 3;
f88c9eb0 3417
7f399153 3418 switch (i.tm.opcode_modifier.vexopcode)
5dd85c99 3419 {
7f399153
L
3420 case VEX0F:
3421 m = 0x1;
80de6e00 3422 i.vex.bytes[0] = 0xc4;
7f399153
L
3423 break;
3424 case VEX0F38:
3425 m = 0x2;
80de6e00 3426 i.vex.bytes[0] = 0xc4;
7f399153
L
3427 break;
3428 case VEX0F3A:
3429 m = 0x3;
80de6e00 3430 i.vex.bytes[0] = 0xc4;
7f399153
L
3431 break;
3432 case XOP08:
5dd85c99
SP
3433 m = 0x8;
3434 i.vex.bytes[0] = 0x8f;
7f399153
L
3435 break;
3436 case XOP09:
f88c9eb0
SP
3437 m = 0x9;
3438 i.vex.bytes[0] = 0x8f;
7f399153
L
3439 break;
3440 case XOP0A:
f88c9eb0
SP
3441 m = 0xa;
3442 i.vex.bytes[0] = 0x8f;
7f399153
L
3443 break;
3444 default:
3445 abort ();
f88c9eb0 3446 }
c0f3af97 3447
c0f3af97
L
3448 /* The high 3 bits of the second VEX byte are 1's compliment
3449 of RXB bits from REX. */
3450 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3451
3452 /* Check the REX.W bit. */
3453 w = (i.rex & REX_W) ? 1 : 0;
b28d1bda
IT
3454 if (i.tm.opcode_modifier.vexw == VEXW1)
3455 w = 1;
c0f3af97
L
3456
3457 i.vex.bytes[2] = (w << 7
3458 | register_specifier << 3
3459 | vector_length << 2
3460 | implied_prefix);
3461 }
3462}
3463
e771e7c9
JB
3464static INLINE bfd_boolean
3465is_evex_encoding (const insn_template *t)
3466{
3467 return t->opcode_modifier.evex
3468 || t->opcode_modifier.broadcast || t->opcode_modifier.masking
3469 || t->opcode_modifier.staticrounding || t->opcode_modifier.sae;
3470}
3471
43234a1e
L
3472/* Build the EVEX prefix. */
3473
3474static void
3475build_evex_prefix (void)
3476{
3477 unsigned int register_specifier;
3478 unsigned int implied_prefix;
3479 unsigned int m, w;
3480 rex_byte vrex_used = 0;
3481
3482 /* Check register specifier. */
3483 if (i.vex.register_specifier)
3484 {
3485 gas_assert ((i.vrex & REX_X) == 0);
3486
3487 register_specifier = i.vex.register_specifier->reg_num;
3488 if ((i.vex.register_specifier->reg_flags & RegRex))
3489 register_specifier += 8;
3490 /* The upper 16 registers are encoded in the fourth byte of the
3491 EVEX prefix. */
3492 if (!(i.vex.register_specifier->reg_flags & RegVRex))
3493 i.vex.bytes[3] = 0x8;
3494 register_specifier = ~register_specifier & 0xf;
3495 }
3496 else
3497 {
3498 register_specifier = 0xf;
3499
3500 /* Encode upper 16 vector index register in the fourth byte of
3501 the EVEX prefix. */
3502 if (!(i.vrex & REX_X))
3503 i.vex.bytes[3] = 0x8;
3504 else
3505 vrex_used |= REX_X;
3506 }
3507
3508 switch ((i.tm.base_opcode >> 8) & 0xff)
3509 {
3510 case 0:
3511 implied_prefix = 0;
3512 break;
3513 case DATA_PREFIX_OPCODE:
3514 implied_prefix = 1;
3515 break;
3516 case REPE_PREFIX_OPCODE:
3517 implied_prefix = 2;
3518 break;
3519 case REPNE_PREFIX_OPCODE:
3520 implied_prefix = 3;
3521 break;
3522 default:
3523 abort ();
3524 }
3525
3526 /* 4 byte EVEX prefix. */
3527 i.vex.length = 4;
3528 i.vex.bytes[0] = 0x62;
3529
3530 /* mmmm bits. */
3531 switch (i.tm.opcode_modifier.vexopcode)
3532 {
3533 case VEX0F:
3534 m = 1;
3535 break;
3536 case VEX0F38:
3537 m = 2;
3538 break;
3539 case VEX0F3A:
3540 m = 3;
3541 break;
3542 default:
3543 abort ();
3544 break;
3545 }
3546
3547 /* The high 3 bits of the second EVEX byte are 1's compliment of RXB
3548 bits from REX. */
3549 i.vex.bytes[1] = (~i.rex & 0x7) << 5 | m;
3550
3551 /* The fifth bit of the second EVEX byte is 1's compliment of the
3552 REX_R bit in VREX. */
3553 if (!(i.vrex & REX_R))
3554 i.vex.bytes[1] |= 0x10;
3555 else
3556 vrex_used |= REX_R;
3557
3558 if ((i.reg_operands + i.imm_operands) == i.operands)
3559 {
3560 /* When all operands are registers, the REX_X bit in REX is not
3561 used. We reuse it to encode the upper 16 registers, which is
3562 indicated by the REX_B bit in VREX. The REX_X bit is encoded
3563 as 1's compliment. */
3564 if ((i.vrex & REX_B))
3565 {
3566 vrex_used |= REX_B;
3567 i.vex.bytes[1] &= ~0x40;
3568 }
3569 }
3570
3571 /* EVEX instructions shouldn't need the REX prefix. */
3572 i.vrex &= ~vrex_used;
3573 gas_assert (i.vrex == 0);
3574
3575 /* Check the REX.W bit. */
3576 w = (i.rex & REX_W) ? 1 : 0;
3577 if (i.tm.opcode_modifier.vexw)
3578 {
3579 if (i.tm.opcode_modifier.vexw == VEXW1)
3580 w = 1;
3581 }
3582 /* If w is not set it means we are dealing with WIG instruction. */
3583 else if (!w)
3584 {
3585 if (evexwig == evexw1)
3586 w = 1;
3587 }
3588
3589 /* Encode the U bit. */
3590 implied_prefix |= 0x4;
3591
3592 /* The third byte of the EVEX prefix. */
3593 i.vex.bytes[2] = (w << 7 | register_specifier << 3 | implied_prefix);
3594
3595 /* The fourth byte of the EVEX prefix. */
3596 /* The zeroing-masking bit. */
3597 if (i.mask && i.mask->zeroing)
3598 i.vex.bytes[3] |= 0x80;
3599
3600 /* Don't always set the broadcast bit if there is no RC. */
3601 if (!i.rounding)
3602 {
3603 /* Encode the vector length. */
3604 unsigned int vec_length;
3605
e771e7c9
JB
3606 if (!i.tm.opcode_modifier.evex
3607 || i.tm.opcode_modifier.evex == EVEXDYN)
3608 {
3609 unsigned int op;
3610
3611 vec_length = 0;
3612 for (op = 0; op < i.tm.operands; ++op)
3613 if (i.tm.operand_types[op].bitfield.xmmword
3614 + i.tm.operand_types[op].bitfield.ymmword
3615 + i.tm.operand_types[op].bitfield.zmmword > 1)
3616 {
3617 if (i.types[op].bitfield.zmmword)
3618 i.tm.opcode_modifier.evex = EVEX512;
3619 else if (i.types[op].bitfield.ymmword)
3620 i.tm.opcode_modifier.evex = EVEX256;
3621 else if (i.types[op].bitfield.xmmword)
3622 i.tm.opcode_modifier.evex = EVEX128;
3623 else
3624 continue;
3625 break;
3626 }
3627 }
3628
43234a1e
L
3629 switch (i.tm.opcode_modifier.evex)
3630 {
3631 case EVEXLIG: /* LL' is ignored */
3632 vec_length = evexlig << 5;
3633 break;
3634 case EVEX128:
3635 vec_length = 0 << 5;
3636 break;
3637 case EVEX256:
3638 vec_length = 1 << 5;
3639 break;
3640 case EVEX512:
3641 vec_length = 2 << 5;
3642 break;
3643 default:
3644 abort ();
3645 break;
3646 }
3647 i.vex.bytes[3] |= vec_length;
3648 /* Encode the broadcast bit. */
3649 if (i.broadcast)
3650 i.vex.bytes[3] |= 0x10;
3651 }
3652 else
3653 {
3654 if (i.rounding->type != saeonly)
3655 i.vex.bytes[3] |= 0x10 | (i.rounding->type << 5);
3656 else
d3d3c6db 3657 i.vex.bytes[3] |= 0x10 | (evexrcig << 5);
43234a1e
L
3658 }
3659
3660 if (i.mask && i.mask->mask)
3661 i.vex.bytes[3] |= i.mask->mask->reg_num;
3662}
3663
65da13b5
L
3664static void
3665process_immext (void)
3666{
3667 expressionS *exp;
3668
4c692bc7
JB
3669 if ((i.tm.cpu_flags.bitfield.cpusse3 || i.tm.cpu_flags.bitfield.cpusvme)
3670 && i.operands > 0)
65da13b5 3671 {
4c692bc7
JB
3672 /* MONITOR/MWAIT as well as SVME instructions have fixed operands
3673 with an opcode suffix which is coded in the same place as an
3674 8-bit immediate field would be.
3675 Here we check those operands and remove them afterwards. */
65da13b5
L
3676 unsigned int x;
3677
3678 for (x = 0; x < i.operands; x++)
4c692bc7 3679 if (register_number (i.op[x].regs) != x)
65da13b5 3680 as_bad (_("can't use register '%s%s' as operand %d in '%s'."),
1fed0ba1
L
3681 register_prefix, i.op[x].regs->reg_name, x + 1,
3682 i.tm.name);
3683
3684 i.operands = 0;
65da13b5
L
3685 }
3686
9916071f
AP
3687 if (i.tm.cpu_flags.bitfield.cpumwaitx && i.operands > 0)
3688 {
3689 /* MONITORX/MWAITX instructions have fixed operands with an opcode
3690 suffix which is coded in the same place as an 8-bit immediate
3691 field would be.
3692 Here we check those operands and remove them afterwards. */
3693 unsigned int x;
3694
3695 if (i.operands != 3)
3696 abort();
3697
3698 for (x = 0; x < 2; x++)
3699 if (register_number (i.op[x].regs) != x)
3700 goto bad_register_operand;
3701
3702 /* Check for third operand for mwaitx/monitorx insn. */
3703 if (register_number (i.op[x].regs)
3704 != (x + (i.tm.extension_opcode == 0xfb)))
3705 {
3706bad_register_operand:
3707 as_bad (_("can't use register '%s%s' as operand %d in '%s'."),
3708 register_prefix, i.op[x].regs->reg_name, x+1,
3709 i.tm.name);
3710 }
3711
3712 i.operands = 0;
3713 }
3714
c0f3af97 3715 /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
65da13b5
L
3716 which is coded in the same place as an 8-bit immediate field
3717 would be. Here we fake an 8-bit immediate operand from the
3718 opcode suffix stored in tm.extension_opcode.
3719
c1e679ec 3720 AVX instructions also use this encoding, for some of
c0f3af97 3721 3 argument instructions. */
65da13b5 3722
43234a1e 3723 gas_assert (i.imm_operands <= 1
7ab9ffdd 3724 && (i.operands <= 2
43234a1e 3725 || ((i.tm.opcode_modifier.vex
e771e7c9
JB
3726 || i.tm.opcode_modifier.vexopcode
3727 || is_evex_encoding (&i.tm))
7ab9ffdd 3728 && i.operands <= 4)));
65da13b5
L
3729
3730 exp = &im_expressions[i.imm_operands++];
3731 i.op[i.operands].imms = exp;
3732 i.types[i.operands] = imm8;
3733 i.operands++;
3734 exp->X_op = O_constant;
3735 exp->X_add_number = i.tm.extension_opcode;
3736 i.tm.extension_opcode = None;
3737}
3738
42164a71
L
3739
3740static int
3741check_hle (void)
3742{
3743 switch (i.tm.opcode_modifier.hleprefixok)
3744 {
3745 default:
3746 abort ();
82c2def5 3747 case HLEPrefixNone:
165de32a
L
3748 as_bad (_("invalid instruction `%s' after `%s'"),
3749 i.tm.name, i.hle_prefix);
42164a71 3750 return 0;
82c2def5 3751 case HLEPrefixLock:
42164a71
L
3752 if (i.prefix[LOCK_PREFIX])
3753 return 1;
165de32a 3754 as_bad (_("missing `lock' with `%s'"), i.hle_prefix);
42164a71 3755 return 0;
82c2def5 3756 case HLEPrefixAny:
42164a71 3757 return 1;
82c2def5 3758 case HLEPrefixRelease:
42164a71
L
3759 if (i.prefix[HLE_PREFIX] != XRELEASE_PREFIX_OPCODE)
3760 {
3761 as_bad (_("instruction `%s' after `xacquire' not allowed"),
3762 i.tm.name);
3763 return 0;
3764 }
3765 if (i.mem_operands == 0
3766 || !operand_type_check (i.types[i.operands - 1], anymem))
3767 {
3768 as_bad (_("memory destination needed for instruction `%s'"
3769 " after `xrelease'"), i.tm.name);
3770 return 0;
3771 }
3772 return 1;
3773 }
3774}
3775
b6f8c7c4
L
3776/* Try the shortest encoding by shortening operand size. */
3777
3778static void
3779optimize_encoding (void)
3780{
3781 int j;
3782
3783 if (optimize_for_space
3784 && i.reg_operands == 1
3785 && i.imm_operands == 1
3786 && !i.types[1].bitfield.byte
3787 && i.op[0].imms->X_op == O_constant
3788 && fits_in_imm7 (i.op[0].imms->X_add_number)
3789 && ((i.tm.base_opcode == 0xa8
3790 && i.tm.extension_opcode == None)
3791 || (i.tm.base_opcode == 0xf6
3792 && i.tm.extension_opcode == 0x0)))
3793 {
3794 /* Optimize: -Os:
3795 test $imm7, %r64/%r32/%r16 -> test $imm7, %r8
3796 */
3797 unsigned int base_regnum = i.op[1].regs->reg_num;
3798 if (flag_code == CODE_64BIT || base_regnum < 4)
3799 {
3800 i.types[1].bitfield.byte = 1;
3801 /* Ignore the suffix. */
3802 i.suffix = 0;
3803 if (base_regnum >= 4
3804 && !(i.op[1].regs->reg_flags & RegRex))
3805 {
3806 /* Handle SP, BP, SI and DI registers. */
3807 if (i.types[1].bitfield.word)
3808 j = 16;
3809 else if (i.types[1].bitfield.dword)
3810 j = 32;
3811 else
3812 j = 48;
3813 i.op[1].regs -= j;
3814 }
3815 }
3816 }
3817 else if (flag_code == CODE_64BIT
d3d50934
L
3818 && ((i.types[1].bitfield.qword
3819 && i.reg_operands == 1
b6f8c7c4
L
3820 && i.imm_operands == 1
3821 && i.op[0].imms->X_op == O_constant
3822 && ((i.tm.base_opcode == 0xb0
3823 && i.tm.extension_opcode == None
3824 && fits_in_unsigned_long (i.op[0].imms->X_add_number))
3825 || (fits_in_imm31 (i.op[0].imms->X_add_number)
3826 && (((i.tm.base_opcode == 0x24
3827 || i.tm.base_opcode == 0xa8)
3828 && i.tm.extension_opcode == None)
3829 || (i.tm.base_opcode == 0x80
3830 && i.tm.extension_opcode == 0x4)
3831 || ((i.tm.base_opcode == 0xf6
3832 || i.tm.base_opcode == 0xc6)
3833 && i.tm.extension_opcode == 0x0)))))
d3d50934
L
3834 || (i.types[0].bitfield.qword
3835 && ((i.reg_operands == 2
3836 && i.op[0].regs == i.op[1].regs
3837 && ((i.tm.base_opcode == 0x30
3838 || i.tm.base_opcode == 0x28)
3839 && i.tm.extension_opcode == None))
3840 || (i.reg_operands == 1
3841 && i.operands == 1
3842 && i.tm.base_opcode == 0x30
3843 && i.tm.extension_opcode == None)))))
b6f8c7c4
L
3844 {
3845 /* Optimize: -O:
3846 andq $imm31, %r64 -> andl $imm31, %r32
3847 testq $imm31, %r64 -> testl $imm31, %r32
3848 xorq %r64, %r64 -> xorl %r32, %r32
3849 subq %r64, %r64 -> subl %r32, %r32
3850 movq $imm31, %r64 -> movl $imm31, %r32
3851 movq $imm32, %r64 -> movl $imm32, %r32
3852 */
3853 i.tm.opcode_modifier.norex64 = 1;
3854 if (i.tm.base_opcode == 0xb0 || i.tm.base_opcode == 0xc6)
3855 {
3856 /* Handle
3857 movq $imm31, %r64 -> movl $imm31, %r32
3858 movq $imm32, %r64 -> movl $imm32, %r32
3859 */
3860 i.tm.operand_types[0].bitfield.imm32 = 1;
3861 i.tm.operand_types[0].bitfield.imm32s = 0;
3862 i.tm.operand_types[0].bitfield.imm64 = 0;
3863 i.types[0].bitfield.imm32 = 1;
3864 i.types[0].bitfield.imm32s = 0;
3865 i.types[0].bitfield.imm64 = 0;
3866 i.types[1].bitfield.dword = 1;
3867 i.types[1].bitfield.qword = 0;
3868 if (i.tm.base_opcode == 0xc6)
3869 {
3870 /* Handle
3871 movq $imm31, %r64 -> movl $imm31, %r32
3872 */
3873 i.tm.base_opcode = 0xb0;
3874 i.tm.extension_opcode = None;
3875 i.tm.opcode_modifier.shortform = 1;
3876 i.tm.opcode_modifier.modrm = 0;
3877 }
3878 }
3879 }
3880 else if (optimize > 1
3881 && i.reg_operands == 3
3882 && i.op[0].regs == i.op[1].regs
3883 && !i.types[2].bitfield.xmmword
3884 && (i.tm.opcode_modifier.vex
7a69eac3 3885 || ((!i.mask || i.mask->zeroing)
b6f8c7c4 3886 && !i.rounding
e771e7c9 3887 && is_evex_encoding (&i.tm)
80c34c38
L
3888 && (i.vec_encoding != vex_encoding_evex
3889 || i.tm.cpu_flags.bitfield.cpuavx512vl
0089dace 3890 || cpu_arch_isa_flags.bitfield.cpuavx512vl)))
b6f8c7c4
L
3891 && ((i.tm.base_opcode == 0x55
3892 || i.tm.base_opcode == 0x6655
3893 || i.tm.base_opcode == 0x66df
3894 || i.tm.base_opcode == 0x57
3895 || i.tm.base_opcode == 0x6657
8305403a
L
3896 || i.tm.base_opcode == 0x66ef
3897 || i.tm.base_opcode == 0x66f8
3898 || i.tm.base_opcode == 0x66f9
3899 || i.tm.base_opcode == 0x66fa
3900 || i.tm.base_opcode == 0x66fb)
b6f8c7c4
L
3901 && i.tm.extension_opcode == None))
3902 {
3903 /* Optimize: -O2:
8305403a
L
3904 VOP, one of vandnps, vandnpd, vxorps, vxorpd, vpsubb, vpsubd,
3905 vpsubq and vpsubw:
b6f8c7c4
L
3906 EVEX VOP %zmmM, %zmmM, %zmmN
3907 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
3908 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16)
3909 EVEX VOP %ymmM, %ymmM, %ymmN
3910 -> VEX VOP %xmmM, %xmmM, %xmmN (M and N < 16)
3911 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16)
3912 VEX VOP %ymmM, %ymmM, %ymmN
3913 -> VEX VOP %xmmM, %xmmM, %xmmN
3914 VOP, one of vpandn and vpxor:
3915 VEX VOP %ymmM, %ymmM, %ymmN
3916 -> VEX VOP %xmmM, %xmmM, %xmmN
3917 VOP, one of vpandnd and vpandnq:
3918 EVEX VOP %zmmM, %zmmM, %zmmN
3919 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
3920 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16)
3921 EVEX VOP %ymmM, %ymmM, %ymmN
3922 -> VEX vpandn %xmmM, %xmmM, %xmmN (M and N < 16)
3923 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16)
3924 VOP, one of vpxord and vpxorq:
3925 EVEX VOP %zmmM, %zmmM, %zmmN
3926 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
3927 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16)
3928 EVEX VOP %ymmM, %ymmM, %ymmN
3929 -> VEX vpxor %xmmM, %xmmM, %xmmN (M and N < 16)
3930 -> EVEX VOP %xmmM, %xmmM, %xmmN (M || N >= 16)
3931 */
e771e7c9 3932 if (is_evex_encoding (&i.tm))
b6f8c7c4 3933 {
0089dace 3934 if (i.vec_encoding == vex_encoding_evex)
b6f8c7c4
L
3935 i.tm.opcode_modifier.evex = EVEX128;
3936 else
3937 {
3938 i.tm.opcode_modifier.vex = VEX128;
3939 i.tm.opcode_modifier.vexw = VEXW0;
3940 i.tm.opcode_modifier.evex = 0;
3941 }
3942 }
3943 else
3944 i.tm.opcode_modifier.vex = VEX128;
3945
3946 if (i.tm.opcode_modifier.vex)
3947 for (j = 0; j < 3; j++)
3948 {
3949 i.types[j].bitfield.xmmword = 1;
3950 i.types[j].bitfield.ymmword = 0;
3951 }
3952 }
3953}
3954
252b5132
RH
3955/* This is the guts of the machine-dependent assembler. LINE points to a
3956 machine dependent instruction. This function is supposed to emit
3957 the frags/bytes it assembles to. */
3958
3959void
65da13b5 3960md_assemble (char *line)
252b5132 3961{
40fb9820 3962 unsigned int j;
83b16ac6 3963 char mnemonic[MAX_MNEM_SIZE], mnem_suffix;
d3ce72d0 3964 const insn_template *t;
252b5132 3965
47926f60 3966 /* Initialize globals. */
252b5132
RH
3967 memset (&i, '\0', sizeof (i));
3968 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 3969 i.reloc[j] = NO_RELOC;
252b5132
RH
3970 memset (disp_expressions, '\0', sizeof (disp_expressions));
3971 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 3972 save_stack_p = save_stack;
252b5132
RH
3973
3974 /* First parse an instruction mnemonic & call i386_operand for the operands.
3975 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 3976 start of a (possibly prefixed) mnemonic. */
252b5132 3977
29b0f896
AM
3978 line = parse_insn (line, mnemonic);
3979 if (line == NULL)
3980 return;
83b16ac6 3981 mnem_suffix = i.suffix;
252b5132 3982
29b0f896 3983 line = parse_operands (line, mnemonic);
ee86248c 3984 this_operand = -1;
8325cc63
JB
3985 xfree (i.memop1_string);
3986 i.memop1_string = NULL;
29b0f896
AM
3987 if (line == NULL)
3988 return;
252b5132 3989
29b0f896
AM
3990 /* Now we've parsed the mnemonic into a set of templates, and have the
3991 operands at hand. */
3992
3993 /* All intel opcodes have reversed operands except for "bound" and
3994 "enter". We also don't reverse intersegment "jmp" and "call"
3995 instructions with 2 immediate operands so that the immediate segment
050dfa73 3996 precedes the offset, as it does when in AT&T mode. */
4d456e3d
L
3997 if (intel_syntax
3998 && i.operands > 1
29b0f896 3999 && (strcmp (mnemonic, "bound") != 0)
30123838 4000 && (strcmp (mnemonic, "invlpga") != 0)
40fb9820
L
4001 && !(operand_type_check (i.types[0], imm)
4002 && operand_type_check (i.types[1], imm)))
29b0f896
AM
4003 swap_operands ();
4004
ec56d5c0
JB
4005 /* The order of the immediates should be reversed
4006 for 2 immediates extrq and insertq instructions */
4007 if (i.imm_operands == 2
4008 && (strcmp (mnemonic, "extrq") == 0
4009 || strcmp (mnemonic, "insertq") == 0))
4010 swap_2_operands (0, 1);
4011
29b0f896
AM
4012 if (i.imm_operands)
4013 optimize_imm ();
4014
b300c311
L
4015 /* Don't optimize displacement for movabs since it only takes 64bit
4016 displacement. */
4017 if (i.disp_operands
a501d77e 4018 && i.disp_encoding != disp_encoding_32bit
862be3fb
L
4019 && (flag_code != CODE_64BIT
4020 || strcmp (mnemonic, "movabs") != 0))
4021 optimize_disp ();
29b0f896
AM
4022
4023 /* Next, we find a template that matches the given insn,
4024 making sure the overlap of the given operands types is consistent
4025 with the template operand types. */
252b5132 4026
83b16ac6 4027 if (!(t = match_template (mnem_suffix)))
29b0f896 4028 return;
252b5132 4029
7bab8ab5 4030 if (sse_check != check_none
81f8a913 4031 && !i.tm.opcode_modifier.noavx
6e3e5c9e 4032 && !i.tm.cpu_flags.bitfield.cpuavx
daf50ae7
L
4033 && (i.tm.cpu_flags.bitfield.cpusse
4034 || i.tm.cpu_flags.bitfield.cpusse2
4035 || i.tm.cpu_flags.bitfield.cpusse3
4036 || i.tm.cpu_flags.bitfield.cpussse3
4037 || i.tm.cpu_flags.bitfield.cpusse4_1
6e3e5c9e
JB
4038 || i.tm.cpu_flags.bitfield.cpusse4_2
4039 || i.tm.cpu_flags.bitfield.cpupclmul
4040 || i.tm.cpu_flags.bitfield.cpuaes
4041 || i.tm.cpu_flags.bitfield.cpugfni))
daf50ae7 4042 {
7bab8ab5 4043 (sse_check == check_warning
daf50ae7
L
4044 ? as_warn
4045 : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
4046 }
4047
321fd21e
L
4048 /* Zap movzx and movsx suffix. The suffix has been set from
4049 "word ptr" or "byte ptr" on the source operand in Intel syntax
4050 or extracted from mnemonic in AT&T syntax. But we'll use
4051 the destination register to choose the suffix for encoding. */
4052 if ((i.tm.base_opcode & ~9) == 0x0fb6)
cd61ebfe 4053 {
321fd21e
L
4054 /* In Intel syntax, there must be a suffix. In AT&T syntax, if
4055 there is no suffix, the default will be byte extension. */
4056 if (i.reg_operands != 2
4057 && !i.suffix
7ab9ffdd 4058 && intel_syntax)
321fd21e
L
4059 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
4060
4061 i.suffix = 0;
cd61ebfe 4062 }
24eab124 4063
40fb9820 4064 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
4065 if (!add_prefix (FWAIT_OPCODE))
4066 return;
252b5132 4067
d5de92cf
L
4068 /* Check if REP prefix is OK. */
4069 if (i.rep_prefix && !i.tm.opcode_modifier.repprefixok)
4070 {
4071 as_bad (_("invalid instruction `%s' after `%s'"),
4072 i.tm.name, i.rep_prefix);
4073 return;
4074 }
4075
c1ba0266
L
4076 /* Check for lock without a lockable instruction. Destination operand
4077 must be memory unless it is xchg (0x86). */
c32fa91d
L
4078 if (i.prefix[LOCK_PREFIX]
4079 && (!i.tm.opcode_modifier.islockable
c1ba0266
L
4080 || i.mem_operands == 0
4081 || (i.tm.base_opcode != 0x86
4082 && !operand_type_check (i.types[i.operands - 1], anymem))))
c32fa91d
L
4083 {
4084 as_bad (_("expecting lockable instruction after `lock'"));
4085 return;
4086 }
4087
42164a71 4088 /* Check if HLE prefix is OK. */
165de32a 4089 if (i.hle_prefix && !check_hle ())
42164a71
L
4090 return;
4091
7e8b059b
L
4092 /* Check BND prefix. */
4093 if (i.bnd_prefix && !i.tm.opcode_modifier.bndprefixok)
4094 as_bad (_("expecting valid branch instruction after `bnd'"));
4095
04ef582a 4096 /* Check NOTRACK prefix. */
9fef80d6
L
4097 if (i.notrack_prefix && !i.tm.opcode_modifier.notrackprefixok)
4098 as_bad (_("expecting indirect branch instruction after `notrack'"));
04ef582a 4099
327e8c42
JB
4100 if (i.tm.cpu_flags.bitfield.cpumpx)
4101 {
4102 if (flag_code == CODE_64BIT && i.prefix[ADDR_PREFIX])
4103 as_bad (_("32-bit address isn't allowed in 64-bit MPX instructions."));
4104 else if (flag_code != CODE_16BIT
4105 ? i.prefix[ADDR_PREFIX]
4106 : i.mem_operands && !i.prefix[ADDR_PREFIX])
4107 as_bad (_("16-bit address isn't allowed in MPX instructions"));
4108 }
7e8b059b
L
4109
4110 /* Insert BND prefix. */
76d3a78a
JB
4111 if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok)
4112 {
4113 if (!i.prefix[BND_PREFIX])
4114 add_prefix (BND_PREFIX_OPCODE);
4115 else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE)
4116 {
4117 as_warn (_("replacing `rep'/`repe' prefix by `bnd'"));
4118 i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE;
4119 }
4120 }
7e8b059b 4121
29b0f896 4122 /* Check string instruction segment overrides. */
40fb9820 4123 if (i.tm.opcode_modifier.isstring && i.mem_operands != 0)
29b0f896
AM
4124 {
4125 if (!check_string ())
5dd0794d 4126 return;
fc0763e6 4127 i.disp_operands = 0;
29b0f896 4128 }
5dd0794d 4129
b6f8c7c4
L
4130 if (optimize && !i.no_optimize && i.tm.opcode_modifier.optimize)
4131 optimize_encoding ();
4132
29b0f896
AM
4133 if (!process_suffix ())
4134 return;
e413e4e9 4135
bc0844ae
L
4136 /* Update operand types. */
4137 for (j = 0; j < i.operands; j++)
4138 i.types[j] = operand_type_and (i.types[j], i.tm.operand_types[j]);
4139
29b0f896
AM
4140 /* Make still unresolved immediate matches conform to size of immediate
4141 given in i.suffix. */
4142 if (!finalize_imm ())
4143 return;
252b5132 4144
40fb9820 4145 if (i.types[0].bitfield.imm1)
29b0f896 4146 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 4147
9afe6eb8
L
4148 /* We only need to check those implicit registers for instructions
4149 with 3 operands or less. */
4150 if (i.operands <= 3)
4151 for (j = 0; j < i.operands; j++)
4152 if (i.types[j].bitfield.inoutportreg
4153 || i.types[j].bitfield.shiftcount
1b54b8d7 4154 || (i.types[j].bitfield.acc && !i.types[j].bitfield.xmmword))
9afe6eb8 4155 i.reg_operands--;
40fb9820 4156
c0f3af97
L
4157 /* ImmExt should be processed after SSE2AVX. */
4158 if (!i.tm.opcode_modifier.sse2avx
4159 && i.tm.opcode_modifier.immext)
65da13b5 4160 process_immext ();
252b5132 4161
29b0f896
AM
4162 /* For insns with operands there are more diddles to do to the opcode. */
4163 if (i.operands)
4164 {
4165 if (!process_operands ())
4166 return;
4167 }
40fb9820 4168 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
4169 {
4170 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
4171 as_warn (_("translating to `%sp'"), i.tm.name);
4172 }
252b5132 4173
e771e7c9
JB
4174 if (i.tm.opcode_modifier.vex || i.tm.opcode_modifier.vexopcode
4175 || is_evex_encoding (&i.tm))
9e5e5283
L
4176 {
4177 if (flag_code == CODE_16BIT)
4178 {
4179 as_bad (_("instruction `%s' isn't supported in 16-bit mode."),
4180 i.tm.name);
4181 return;
4182 }
c0f3af97 4183
9e5e5283
L
4184 if (i.tm.opcode_modifier.vex)
4185 build_vex_prefix (t);
4186 else
4187 build_evex_prefix ();
4188 }
43234a1e 4189
5dd85c99
SP
4190 /* Handle conversion of 'int $3' --> special int3 insn. XOP or FMA4
4191 instructions may define INT_OPCODE as well, so avoid this corner
4192 case for those instructions that use MODRM. */
4193 if (i.tm.base_opcode == INT_OPCODE
a6461c02
SP
4194 && !i.tm.opcode_modifier.modrm
4195 && i.op[0].imms->X_add_number == 3)
29b0f896
AM
4196 {
4197 i.tm.base_opcode = INT3_OPCODE;
4198 i.imm_operands = 0;
4199 }
252b5132 4200
40fb9820
L
4201 if ((i.tm.opcode_modifier.jump
4202 || i.tm.opcode_modifier.jumpbyte
4203 || i.tm.opcode_modifier.jumpdword)
29b0f896
AM
4204 && i.op[0].disps->X_op == O_constant)
4205 {
4206 /* Convert "jmp constant" (and "call constant") to a jump (call) to
4207 the absolute address given by the constant. Since ix86 jumps and
4208 calls are pc relative, we need to generate a reloc. */
4209 i.op[0].disps->X_add_symbol = &abs_symbol;
4210 i.op[0].disps->X_op = O_symbol;
4211 }
252b5132 4212
40fb9820 4213 if (i.tm.opcode_modifier.rex64)
161a04f6 4214 i.rex |= REX_W;
252b5132 4215
29b0f896
AM
4216 /* For 8 bit registers we need an empty rex prefix. Also if the
4217 instruction already has a prefix, we need to convert old
4218 registers to new ones. */
773f551c 4219
dc821c5f 4220 if ((i.types[0].bitfield.reg && i.types[0].bitfield.byte
29b0f896 4221 && (i.op[0].regs->reg_flags & RegRex64) != 0)
dc821c5f 4222 || (i.types[1].bitfield.reg && i.types[1].bitfield.byte
29b0f896 4223 && (i.op[1].regs->reg_flags & RegRex64) != 0)
dc821c5f
JB
4224 || (((i.types[0].bitfield.reg && i.types[0].bitfield.byte)
4225 || (i.types[1].bitfield.reg && i.types[1].bitfield.byte))
29b0f896
AM
4226 && i.rex != 0))
4227 {
4228 int x;
726c5dcd 4229
29b0f896
AM
4230 i.rex |= REX_OPCODE;
4231 for (x = 0; x < 2; x++)
4232 {
4233 /* Look for 8 bit operand that uses old registers. */
dc821c5f 4234 if (i.types[x].bitfield.reg && i.types[x].bitfield.byte
29b0f896 4235 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 4236 {
29b0f896
AM
4237 /* In case it is "hi" register, give up. */
4238 if (i.op[x].regs->reg_num > 3)
a540244d 4239 as_bad (_("can't encode register '%s%s' in an "
4eed87de 4240 "instruction requiring REX prefix."),
a540244d 4241 register_prefix, i.op[x].regs->reg_name);
773f551c 4242
29b0f896
AM
4243 /* Otherwise it is equivalent to the extended register.
4244 Since the encoding doesn't change this is merely
4245 cosmetic cleanup for debug output. */
4246
4247 i.op[x].regs = i.op[x].regs + 8;
773f551c 4248 }
29b0f896
AM
4249 }
4250 }
773f551c 4251
6b6b6807
L
4252 if (i.rex == 0 && i.rex_encoding)
4253 {
4254 /* Check if we can add a REX_OPCODE byte. Look for 8 bit operand
4255 that uses legacy register. If it is "hi" register, don't add
4256 the REX_OPCODE byte. */
4257 int x;
4258 for (x = 0; x < 2; x++)
4259 if (i.types[x].bitfield.reg
4260 && i.types[x].bitfield.byte
4261 && (i.op[x].regs->reg_flags & RegRex64) == 0
4262 && i.op[x].regs->reg_num > 3)
4263 {
4264 i.rex_encoding = FALSE;
4265 break;
4266 }
4267
4268 if (i.rex_encoding)
4269 i.rex = REX_OPCODE;
4270 }
4271
7ab9ffdd 4272 if (i.rex != 0)
29b0f896
AM
4273 add_prefix (REX_OPCODE | i.rex);
4274
4275 /* We are ready to output the insn. */
4276 output_insn ();
4277}
4278
4279static char *
e3bb37b5 4280parse_insn (char *line, char *mnemonic)
29b0f896
AM
4281{
4282 char *l = line;
4283 char *token_start = l;
4284 char *mnem_p;
5c6af06e 4285 int supported;
d3ce72d0 4286 const insn_template *t;
b6169b20 4287 char *dot_p = NULL;
29b0f896 4288
29b0f896
AM
4289 while (1)
4290 {
4291 mnem_p = mnemonic;
4292 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
4293 {
b6169b20
L
4294 if (*mnem_p == '.')
4295 dot_p = mnem_p;
29b0f896
AM
4296 mnem_p++;
4297 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 4298 {
29b0f896
AM
4299 as_bad (_("no such instruction: `%s'"), token_start);
4300 return NULL;
4301 }
4302 l++;
4303 }
4304 if (!is_space_char (*l)
4305 && *l != END_OF_INSN
e44823cf
JB
4306 && (intel_syntax
4307 || (*l != PREFIX_SEPARATOR
4308 && *l != ',')))
29b0f896
AM
4309 {
4310 as_bad (_("invalid character %s in mnemonic"),
4311 output_invalid (*l));
4312 return NULL;
4313 }
4314 if (token_start == l)
4315 {
e44823cf 4316 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
4317 as_bad (_("expecting prefix; got nothing"));
4318 else
4319 as_bad (_("expecting mnemonic; got nothing"));
4320 return NULL;
4321 }
45288df1 4322
29b0f896 4323 /* Look up instruction (or prefix) via hash table. */
d3ce72d0 4324 current_templates = (const templates *) hash_find (op_hash, mnemonic);
47926f60 4325
29b0f896
AM
4326 if (*l != END_OF_INSN
4327 && (!is_space_char (*l) || l[1] != END_OF_INSN)
4328 && current_templates
40fb9820 4329 && current_templates->start->opcode_modifier.isprefix)
29b0f896 4330 {
c6fb90c8 4331 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
4332 {
4333 as_bad ((flag_code != CODE_64BIT
4334 ? _("`%s' is only supported in 64-bit mode")
4335 : _("`%s' is not supported in 64-bit mode")),
4336 current_templates->start->name);
4337 return NULL;
4338 }
29b0f896
AM
4339 /* If we are in 16-bit mode, do not allow addr16 or data16.
4340 Similarly, in 32-bit mode, do not allow addr32 or data32. */
40fb9820
L
4341 if ((current_templates->start->opcode_modifier.size16
4342 || current_templates->start->opcode_modifier.size32)
29b0f896 4343 && flag_code != CODE_64BIT
40fb9820 4344 && (current_templates->start->opcode_modifier.size32
29b0f896
AM
4345 ^ (flag_code == CODE_16BIT)))
4346 {
4347 as_bad (_("redundant %s prefix"),
4348 current_templates->start->name);
4349 return NULL;
45288df1 4350 }
86fa6981 4351 if (current_templates->start->opcode_length == 0)
29b0f896 4352 {
86fa6981
L
4353 /* Handle pseudo prefixes. */
4354 switch (current_templates->start->base_opcode)
4355 {
4356 case 0x0:
4357 /* {disp8} */
4358 i.disp_encoding = disp_encoding_8bit;
4359 break;
4360 case 0x1:
4361 /* {disp32} */
4362 i.disp_encoding = disp_encoding_32bit;
4363 break;
4364 case 0x2:
4365 /* {load} */
4366 i.dir_encoding = dir_encoding_load;
4367 break;
4368 case 0x3:
4369 /* {store} */
4370 i.dir_encoding = dir_encoding_store;
4371 break;
4372 case 0x4:
4373 /* {vex2} */
4374 i.vec_encoding = vex_encoding_vex2;
4375 break;
4376 case 0x5:
4377 /* {vex3} */
4378 i.vec_encoding = vex_encoding_vex3;
4379 break;
4380 case 0x6:
4381 /* {evex} */
4382 i.vec_encoding = vex_encoding_evex;
4383 break;
6b6b6807
L
4384 case 0x7:
4385 /* {rex} */
4386 i.rex_encoding = TRUE;
4387 break;
b6f8c7c4
L
4388 case 0x8:
4389 /* {nooptimize} */
4390 i.no_optimize = TRUE;
4391 break;
86fa6981
L
4392 default:
4393 abort ();
4394 }
4395 }
4396 else
4397 {
4398 /* Add prefix, checking for repeated prefixes. */
4e9ac44a 4399 switch (add_prefix (current_templates->start->base_opcode))
86fa6981 4400 {
4e9ac44a
L
4401 case PREFIX_EXIST:
4402 return NULL;
4403 case PREFIX_DS:
d777820b 4404 if (current_templates->start->cpu_flags.bitfield.cpuibt)
4e9ac44a
L
4405 i.notrack_prefix = current_templates->start->name;
4406 break;
4407 case PREFIX_REP:
4408 if (current_templates->start->cpu_flags.bitfield.cpuhle)
4409 i.hle_prefix = current_templates->start->name;
4410 else if (current_templates->start->cpu_flags.bitfield.cpumpx)
4411 i.bnd_prefix = current_templates->start->name;
4412 else
4413 i.rep_prefix = current_templates->start->name;
4414 break;
4415 default:
4416 break;
86fa6981 4417 }
29b0f896
AM
4418 }
4419 /* Skip past PREFIX_SEPARATOR and reset token_start. */
4420 token_start = ++l;
4421 }
4422 else
4423 break;
4424 }
45288df1 4425
30a55f88 4426 if (!current_templates)
b6169b20 4427 {
f8a5c266
L
4428 /* Check if we should swap operand or force 32bit displacement in
4429 encoding. */
30a55f88 4430 if (mnem_p - 2 == dot_p && dot_p[1] == 's')
86fa6981 4431 i.dir_encoding = dir_encoding_store;
8d63c93e 4432 else if (mnem_p - 3 == dot_p
a501d77e
L
4433 && dot_p[1] == 'd'
4434 && dot_p[2] == '8')
4435 i.disp_encoding = disp_encoding_8bit;
8d63c93e 4436 else if (mnem_p - 4 == dot_p
f8a5c266
L
4437 && dot_p[1] == 'd'
4438 && dot_p[2] == '3'
4439 && dot_p[3] == '2')
a501d77e 4440 i.disp_encoding = disp_encoding_32bit;
30a55f88
L
4441 else
4442 goto check_suffix;
4443 mnem_p = dot_p;
4444 *dot_p = '\0';
d3ce72d0 4445 current_templates = (const templates *) hash_find (op_hash, mnemonic);
b6169b20
L
4446 }
4447
29b0f896
AM
4448 if (!current_templates)
4449 {
b6169b20 4450check_suffix:
29b0f896
AM
4451 /* See if we can get a match by trimming off a suffix. */
4452 switch (mnem_p[-1])
4453 {
4454 case WORD_MNEM_SUFFIX:
9306ca4a
JB
4455 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
4456 i.suffix = SHORT_MNEM_SUFFIX;
4457 else
1a0670f3 4458 /* Fall through. */
29b0f896
AM
4459 case BYTE_MNEM_SUFFIX:
4460 case QWORD_MNEM_SUFFIX:
4461 i.suffix = mnem_p[-1];
4462 mnem_p[-1] = '\0';
d3ce72d0
NC
4463 current_templates = (const templates *) hash_find (op_hash,
4464 mnemonic);
29b0f896
AM
4465 break;
4466 case SHORT_MNEM_SUFFIX:
4467 case LONG_MNEM_SUFFIX:
4468 if (!intel_syntax)
4469 {
4470 i.suffix = mnem_p[-1];
4471 mnem_p[-1] = '\0';
d3ce72d0
NC
4472 current_templates = (const templates *) hash_find (op_hash,
4473 mnemonic);
29b0f896
AM
4474 }
4475 break;
252b5132 4476
29b0f896
AM
4477 /* Intel Syntax. */
4478 case 'd':
4479 if (intel_syntax)
4480 {
9306ca4a 4481 if (intel_float_operand (mnemonic) == 1)
29b0f896
AM
4482 i.suffix = SHORT_MNEM_SUFFIX;
4483 else
4484 i.suffix = LONG_MNEM_SUFFIX;
4485 mnem_p[-1] = '\0';
d3ce72d0
NC
4486 current_templates = (const templates *) hash_find (op_hash,
4487 mnemonic);
29b0f896
AM
4488 }
4489 break;
4490 }
4491 if (!current_templates)
4492 {
4493 as_bad (_("no such instruction: `%s'"), token_start);
4494 return NULL;
4495 }
4496 }
252b5132 4497
40fb9820
L
4498 if (current_templates->start->opcode_modifier.jump
4499 || current_templates->start->opcode_modifier.jumpbyte)
29b0f896
AM
4500 {
4501 /* Check for a branch hint. We allow ",pt" and ",pn" for
4502 predict taken and predict not taken respectively.
4503 I'm not sure that branch hints actually do anything on loop
4504 and jcxz insns (JumpByte) for current Pentium4 chips. They
4505 may work in the future and it doesn't hurt to accept them
4506 now. */
4507 if (l[0] == ',' && l[1] == 'p')
4508 {
4509 if (l[2] == 't')
4510 {
4511 if (!add_prefix (DS_PREFIX_OPCODE))
4512 return NULL;
4513 l += 3;
4514 }
4515 else if (l[2] == 'n')
4516 {
4517 if (!add_prefix (CS_PREFIX_OPCODE))
4518 return NULL;
4519 l += 3;
4520 }
4521 }
4522 }
4523 /* Any other comma loses. */
4524 if (*l == ',')
4525 {
4526 as_bad (_("invalid character %s in mnemonic"),
4527 output_invalid (*l));
4528 return NULL;
4529 }
252b5132 4530
29b0f896 4531 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
4532 supported = 0;
4533 for (t = current_templates->start; t < current_templates->end; ++t)
4534 {
c0f3af97
L
4535 supported |= cpu_flags_match (t);
4536 if (supported == CPU_FLAGS_PERFECT_MATCH)
548d0ee6
JB
4537 {
4538 if (!cpu_arch_flags.bitfield.cpui386 && (flag_code != CODE_16BIT))
4539 as_warn (_("use .code16 to ensure correct addressing mode"));
3629bb00 4540
548d0ee6
JB
4541 return l;
4542 }
29b0f896 4543 }
3629bb00 4544
548d0ee6
JB
4545 if (!(supported & CPU_FLAGS_64BIT_MATCH))
4546 as_bad (flag_code == CODE_64BIT
4547 ? _("`%s' is not supported in 64-bit mode")
4548 : _("`%s' is only supported in 64-bit mode"),
4549 current_templates->start->name);
4550 else
4551 as_bad (_("`%s' is not supported on `%s%s'"),
4552 current_templates->start->name,
4553 cpu_arch_name ? cpu_arch_name : default_arch,
4554 cpu_sub_arch_name ? cpu_sub_arch_name : "");
252b5132 4555
548d0ee6 4556 return NULL;
29b0f896 4557}
252b5132 4558
29b0f896 4559static char *
e3bb37b5 4560parse_operands (char *l, const char *mnemonic)
29b0f896
AM
4561{
4562 char *token_start;
3138f287 4563
29b0f896
AM
4564 /* 1 if operand is pending after ','. */
4565 unsigned int expecting_operand = 0;
252b5132 4566
29b0f896
AM
4567 /* Non-zero if operand parens not balanced. */
4568 unsigned int paren_not_balanced;
4569
4570 while (*l != END_OF_INSN)
4571 {
4572 /* Skip optional white space before operand. */
4573 if (is_space_char (*l))
4574 ++l;
d02603dc 4575 if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
29b0f896
AM
4576 {
4577 as_bad (_("invalid character %s before operand %d"),
4578 output_invalid (*l),
4579 i.operands + 1);
4580 return NULL;
4581 }
d02603dc 4582 token_start = l; /* After white space. */
29b0f896
AM
4583 paren_not_balanced = 0;
4584 while (paren_not_balanced || *l != ',')
4585 {
4586 if (*l == END_OF_INSN)
4587 {
4588 if (paren_not_balanced)
4589 {
4590 if (!intel_syntax)
4591 as_bad (_("unbalanced parenthesis in operand %d."),
4592 i.operands + 1);
4593 else
4594 as_bad (_("unbalanced brackets in operand %d."),
4595 i.operands + 1);
4596 return NULL;
4597 }
4598 else
4599 break; /* we are done */
4600 }
d02603dc 4601 else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
29b0f896
AM
4602 {
4603 as_bad (_("invalid character %s in operand %d"),
4604 output_invalid (*l),
4605 i.operands + 1);
4606 return NULL;
4607 }
4608 if (!intel_syntax)
4609 {
4610 if (*l == '(')
4611 ++paren_not_balanced;
4612 if (*l == ')')
4613 --paren_not_balanced;
4614 }
4615 else
4616 {
4617 if (*l == '[')
4618 ++paren_not_balanced;
4619 if (*l == ']')
4620 --paren_not_balanced;
4621 }
4622 l++;
4623 }
4624 if (l != token_start)
4625 { /* Yes, we've read in another operand. */
4626 unsigned int operand_ok;
4627 this_operand = i.operands++;
4628 if (i.operands > MAX_OPERANDS)
4629 {
4630 as_bad (_("spurious operands; (%d operands/instruction max)"),
4631 MAX_OPERANDS);
4632 return NULL;
4633 }
9d46ce34 4634 i.types[this_operand].bitfield.unspecified = 1;
29b0f896
AM
4635 /* Now parse operand adding info to 'i' as we go along. */
4636 END_STRING_AND_SAVE (l);
4637
4638 if (intel_syntax)
4639 operand_ok =
4640 i386_intel_operand (token_start,
4641 intel_float_operand (mnemonic));
4642 else
a7619375 4643 operand_ok = i386_att_operand (token_start);
29b0f896
AM
4644
4645 RESTORE_END_STRING (l);
4646 if (!operand_ok)
4647 return NULL;
4648 }
4649 else
4650 {
4651 if (expecting_operand)
4652 {
4653 expecting_operand_after_comma:
4654 as_bad (_("expecting operand after ','; got nothing"));
4655 return NULL;
4656 }
4657 if (*l == ',')
4658 {
4659 as_bad (_("expecting operand before ','; got nothing"));
4660 return NULL;
4661 }
4662 }
7f3f1ea2 4663
29b0f896
AM
4664 /* Now *l must be either ',' or END_OF_INSN. */
4665 if (*l == ',')
4666 {
4667 if (*++l == END_OF_INSN)
4668 {
4669 /* Just skip it, if it's \n complain. */
4670 goto expecting_operand_after_comma;
4671 }
4672 expecting_operand = 1;
4673 }
4674 }
4675 return l;
4676}
7f3f1ea2 4677
050dfa73 4678static void
4d456e3d 4679swap_2_operands (int xchg1, int xchg2)
050dfa73
MM
4680{
4681 union i386_op temp_op;
40fb9820 4682 i386_operand_type temp_type;
050dfa73 4683 enum bfd_reloc_code_real temp_reloc;
4eed87de 4684
050dfa73
MM
4685 temp_type = i.types[xchg2];
4686 i.types[xchg2] = i.types[xchg1];
4687 i.types[xchg1] = temp_type;
4688 temp_op = i.op[xchg2];
4689 i.op[xchg2] = i.op[xchg1];
4690 i.op[xchg1] = temp_op;
4691 temp_reloc = i.reloc[xchg2];
4692 i.reloc[xchg2] = i.reloc[xchg1];
4693 i.reloc[xchg1] = temp_reloc;
43234a1e
L
4694
4695 if (i.mask)
4696 {
4697 if (i.mask->operand == xchg1)
4698 i.mask->operand = xchg2;
4699 else if (i.mask->operand == xchg2)
4700 i.mask->operand = xchg1;
4701 }
4702 if (i.broadcast)
4703 {
4704 if (i.broadcast->operand == xchg1)
4705 i.broadcast->operand = xchg2;
4706 else if (i.broadcast->operand == xchg2)
4707 i.broadcast->operand = xchg1;
4708 }
4709 if (i.rounding)
4710 {
4711 if (i.rounding->operand == xchg1)
4712 i.rounding->operand = xchg2;
4713 else if (i.rounding->operand == xchg2)
4714 i.rounding->operand = xchg1;
4715 }
050dfa73
MM
4716}
4717
29b0f896 4718static void
e3bb37b5 4719swap_operands (void)
29b0f896 4720{
b7c61d9a 4721 switch (i.operands)
050dfa73 4722 {
c0f3af97 4723 case 5:
b7c61d9a 4724 case 4:
4d456e3d 4725 swap_2_operands (1, i.operands - 2);
1a0670f3 4726 /* Fall through. */
b7c61d9a
L
4727 case 3:
4728 case 2:
4d456e3d 4729 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
4730 break;
4731 default:
4732 abort ();
29b0f896 4733 }
29b0f896
AM
4734
4735 if (i.mem_operands == 2)
4736 {
4737 const seg_entry *temp_seg;
4738 temp_seg = i.seg[0];
4739 i.seg[0] = i.seg[1];
4740 i.seg[1] = temp_seg;
4741 }
4742}
252b5132 4743
29b0f896
AM
4744/* Try to ensure constant immediates are represented in the smallest
4745 opcode possible. */
4746static void
e3bb37b5 4747optimize_imm (void)
29b0f896
AM
4748{
4749 char guess_suffix = 0;
4750 int op;
252b5132 4751
29b0f896
AM
4752 if (i.suffix)
4753 guess_suffix = i.suffix;
4754 else if (i.reg_operands)
4755 {
4756 /* Figure out a suffix from the last register operand specified.
4757 We can't do this properly yet, ie. excluding InOutPortReg,
4758 but the following works for instructions with immediates.
4759 In any case, we can't set i.suffix yet. */
4760 for (op = i.operands; --op >= 0;)
dc821c5f 4761 if (i.types[op].bitfield.reg && i.types[op].bitfield.byte)
7ab9ffdd 4762 {
40fb9820
L
4763 guess_suffix = BYTE_MNEM_SUFFIX;
4764 break;
4765 }
dc821c5f 4766 else if (i.types[op].bitfield.reg && i.types[op].bitfield.word)
252b5132 4767 {
40fb9820
L
4768 guess_suffix = WORD_MNEM_SUFFIX;
4769 break;
4770 }
dc821c5f 4771 else if (i.types[op].bitfield.reg && i.types[op].bitfield.dword)
40fb9820
L
4772 {
4773 guess_suffix = LONG_MNEM_SUFFIX;
4774 break;
4775 }
dc821c5f 4776 else if (i.types[op].bitfield.reg && i.types[op].bitfield.qword)
40fb9820
L
4777 {
4778 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 4779 break;
252b5132 4780 }
29b0f896
AM
4781 }
4782 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
4783 guess_suffix = WORD_MNEM_SUFFIX;
4784
4785 for (op = i.operands; --op >= 0;)
40fb9820 4786 if (operand_type_check (i.types[op], imm))
29b0f896
AM
4787 {
4788 switch (i.op[op].imms->X_op)
252b5132 4789 {
29b0f896
AM
4790 case O_constant:
4791 /* If a suffix is given, this operand may be shortened. */
4792 switch (guess_suffix)
252b5132 4793 {
29b0f896 4794 case LONG_MNEM_SUFFIX:
40fb9820
L
4795 i.types[op].bitfield.imm32 = 1;
4796 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
4797 break;
4798 case WORD_MNEM_SUFFIX:
40fb9820
L
4799 i.types[op].bitfield.imm16 = 1;
4800 i.types[op].bitfield.imm32 = 1;
4801 i.types[op].bitfield.imm32s = 1;
4802 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
4803 break;
4804 case BYTE_MNEM_SUFFIX:
40fb9820
L
4805 i.types[op].bitfield.imm8 = 1;
4806 i.types[op].bitfield.imm8s = 1;
4807 i.types[op].bitfield.imm16 = 1;
4808 i.types[op].bitfield.imm32 = 1;
4809 i.types[op].bitfield.imm32s = 1;
4810 i.types[op].bitfield.imm64 = 1;
29b0f896 4811 break;
252b5132 4812 }
252b5132 4813
29b0f896
AM
4814 /* If this operand is at most 16 bits, convert it
4815 to a signed 16 bit number before trying to see
4816 whether it will fit in an even smaller size.
4817 This allows a 16-bit operand such as $0xffe0 to
4818 be recognised as within Imm8S range. */
40fb9820 4819 if ((i.types[op].bitfield.imm16)
29b0f896 4820 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 4821 {
29b0f896
AM
4822 i.op[op].imms->X_add_number =
4823 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
4824 }
a28def75
L
4825#ifdef BFD64
4826 /* Store 32-bit immediate in 64-bit for 64-bit BFD. */
40fb9820 4827 if ((i.types[op].bitfield.imm32)
29b0f896
AM
4828 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
4829 == 0))
4830 {
4831 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
4832 ^ ((offsetT) 1 << 31))
4833 - ((offsetT) 1 << 31));
4834 }
a28def75 4835#endif
40fb9820 4836 i.types[op]
c6fb90c8
L
4837 = operand_type_or (i.types[op],
4838 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 4839
29b0f896
AM
4840 /* We must avoid matching of Imm32 templates when 64bit
4841 only immediate is available. */
4842 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 4843 i.types[op].bitfield.imm32 = 0;
29b0f896 4844 break;
252b5132 4845
29b0f896
AM
4846 case O_absent:
4847 case O_register:
4848 abort ();
4849
4850 /* Symbols and expressions. */
4851 default:
9cd96992
JB
4852 /* Convert symbolic operand to proper sizes for matching, but don't
4853 prevent matching a set of insns that only supports sizes other
4854 than those matching the insn suffix. */
4855 {
40fb9820 4856 i386_operand_type mask, allowed;
d3ce72d0 4857 const insn_template *t;
9cd96992 4858
0dfbf9d7
L
4859 operand_type_set (&mask, 0);
4860 operand_type_set (&allowed, 0);
40fb9820 4861
4eed87de
AM
4862 for (t = current_templates->start;
4863 t < current_templates->end;
4864 ++t)
c6fb90c8
L
4865 allowed = operand_type_or (allowed,
4866 t->operand_types[op]);
9cd96992
JB
4867 switch (guess_suffix)
4868 {
4869 case QWORD_MNEM_SUFFIX:
40fb9820
L
4870 mask.bitfield.imm64 = 1;
4871 mask.bitfield.imm32s = 1;
9cd96992
JB
4872 break;
4873 case LONG_MNEM_SUFFIX:
40fb9820 4874 mask.bitfield.imm32 = 1;
9cd96992
JB
4875 break;
4876 case WORD_MNEM_SUFFIX:
40fb9820 4877 mask.bitfield.imm16 = 1;
9cd96992
JB
4878 break;
4879 case BYTE_MNEM_SUFFIX:
40fb9820 4880 mask.bitfield.imm8 = 1;
9cd96992
JB
4881 break;
4882 default:
9cd96992
JB
4883 break;
4884 }
c6fb90c8 4885 allowed = operand_type_and (mask, allowed);
0dfbf9d7 4886 if (!operand_type_all_zero (&allowed))
c6fb90c8 4887 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 4888 }
29b0f896 4889 break;
252b5132 4890 }
29b0f896
AM
4891 }
4892}
47926f60 4893
29b0f896
AM
4894/* Try to use the smallest displacement type too. */
4895static void
e3bb37b5 4896optimize_disp (void)
29b0f896
AM
4897{
4898 int op;
3e73aa7c 4899
29b0f896 4900 for (op = i.operands; --op >= 0;)
40fb9820 4901 if (operand_type_check (i.types[op], disp))
252b5132 4902 {
b300c311 4903 if (i.op[op].disps->X_op == O_constant)
252b5132 4904 {
91d6fa6a 4905 offsetT op_disp = i.op[op].disps->X_add_number;
29b0f896 4906
40fb9820 4907 if (i.types[op].bitfield.disp16
91d6fa6a 4908 && (op_disp & ~(offsetT) 0xffff) == 0)
b300c311
L
4909 {
4910 /* If this operand is at most 16 bits, convert
4911 to a signed 16 bit number and don't use 64bit
4912 displacement. */
91d6fa6a 4913 op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 4914 i.types[op].bitfield.disp64 = 0;
b300c311 4915 }
a28def75
L
4916#ifdef BFD64
4917 /* Optimize 64-bit displacement to 32-bit for 64-bit BFD. */
40fb9820 4918 if (i.types[op].bitfield.disp32
91d6fa6a 4919 && (op_disp & ~(((offsetT) 2 << 31) - 1)) == 0)
b300c311
L
4920 {
4921 /* If this operand is at most 32 bits, convert
4922 to a signed 32 bit number and don't use 64bit
4923 displacement. */
91d6fa6a
NC
4924 op_disp &= (((offsetT) 2 << 31) - 1);
4925 op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 4926 i.types[op].bitfield.disp64 = 0;
b300c311 4927 }
a28def75 4928#endif
91d6fa6a 4929 if (!op_disp && i.types[op].bitfield.baseindex)
b300c311 4930 {
40fb9820
L
4931 i.types[op].bitfield.disp8 = 0;
4932 i.types[op].bitfield.disp16 = 0;
4933 i.types[op].bitfield.disp32 = 0;
4934 i.types[op].bitfield.disp32s = 0;
4935 i.types[op].bitfield.disp64 = 0;
b300c311
L
4936 i.op[op].disps = 0;
4937 i.disp_operands--;
4938 }
4939 else if (flag_code == CODE_64BIT)
4940 {
91d6fa6a 4941 if (fits_in_signed_long (op_disp))
28a9d8f5 4942 {
40fb9820
L
4943 i.types[op].bitfield.disp64 = 0;
4944 i.types[op].bitfield.disp32s = 1;
28a9d8f5 4945 }
0e1147d9 4946 if (i.prefix[ADDR_PREFIX]
91d6fa6a 4947 && fits_in_unsigned_long (op_disp))
40fb9820 4948 i.types[op].bitfield.disp32 = 1;
b300c311 4949 }
40fb9820
L
4950 if ((i.types[op].bitfield.disp32
4951 || i.types[op].bitfield.disp32s
4952 || i.types[op].bitfield.disp16)
b5014f7a 4953 && fits_in_disp8 (op_disp))
40fb9820 4954 i.types[op].bitfield.disp8 = 1;
252b5132 4955 }
67a4f2b7
AO
4956 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
4957 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
4958 {
4959 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
4960 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
4961 i.types[op].bitfield.disp8 = 0;
4962 i.types[op].bitfield.disp16 = 0;
4963 i.types[op].bitfield.disp32 = 0;
4964 i.types[op].bitfield.disp32s = 0;
4965 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
4966 }
4967 else
b300c311 4968 /* We only support 64bit displacement on constants. */
40fb9820 4969 i.types[op].bitfield.disp64 = 0;
252b5132 4970 }
29b0f896
AM
4971}
4972
6c30d220
L
4973/* Check if operands are valid for the instruction. */
4974
4975static int
4976check_VecOperands (const insn_template *t)
4977{
43234a1e 4978 unsigned int op;
e2195274
JB
4979 i386_cpu_flags cpu;
4980 static const i386_cpu_flags avx512 = CPU_ANY_AVX512F_FLAGS;
4981
4982 /* Templates allowing for ZMMword as well as YMMword and/or XMMword for
4983 any one operand are implicity requiring AVX512VL support if the actual
4984 operand size is YMMword or XMMword. Since this function runs after
4985 template matching, there's no need to check for YMMword/XMMword in
4986 the template. */
4987 cpu = cpu_flags_and (t->cpu_flags, avx512);
4988 if (!cpu_flags_all_zero (&cpu)
4989 && !t->cpu_flags.bitfield.cpuavx512vl
4990 && !cpu_arch_flags.bitfield.cpuavx512vl)
4991 {
4992 for (op = 0; op < t->operands; ++op)
4993 {
4994 if (t->operand_types[op].bitfield.zmmword
4995 && (i.types[op].bitfield.ymmword
4996 || i.types[op].bitfield.xmmword))
4997 {
4998 i.error = unsupported;
4999 return 1;
5000 }
5001 }
5002 }
43234a1e 5003
6c30d220
L
5004 /* Without VSIB byte, we can't have a vector register for index. */
5005 if (!t->opcode_modifier.vecsib
5006 && i.index_reg
1b54b8d7
JB
5007 && (i.index_reg->reg_type.bitfield.xmmword
5008 || i.index_reg->reg_type.bitfield.ymmword
5009 || i.index_reg->reg_type.bitfield.zmmword))
6c30d220
L
5010 {
5011 i.error = unsupported_vector_index_register;
5012 return 1;
5013 }
5014
ad8ecc81
MZ
5015 /* Check if default mask is allowed. */
5016 if (t->opcode_modifier.nodefmask
5017 && (!i.mask || i.mask->mask->reg_num == 0))
5018 {
5019 i.error = no_default_mask;
5020 return 1;
5021 }
5022
7bab8ab5
JB
5023 /* For VSIB byte, we need a vector register for index, and all vector
5024 registers must be distinct. */
5025 if (t->opcode_modifier.vecsib)
5026 {
5027 if (!i.index_reg
6c30d220 5028 || !((t->opcode_modifier.vecsib == VecSIB128
1b54b8d7 5029 && i.index_reg->reg_type.bitfield.xmmword)
6c30d220 5030 || (t->opcode_modifier.vecsib == VecSIB256
1b54b8d7 5031 && i.index_reg->reg_type.bitfield.ymmword)
43234a1e 5032 || (t->opcode_modifier.vecsib == VecSIB512
1b54b8d7 5033 && i.index_reg->reg_type.bitfield.zmmword)))
7bab8ab5
JB
5034 {
5035 i.error = invalid_vsib_address;
5036 return 1;
5037 }
5038
43234a1e
L
5039 gas_assert (i.reg_operands == 2 || i.mask);
5040 if (i.reg_operands == 2 && !i.mask)
5041 {
1b54b8d7
JB
5042 gas_assert (i.types[0].bitfield.regsimd);
5043 gas_assert (i.types[0].bitfield.xmmword
5044 || i.types[0].bitfield.ymmword);
5045 gas_assert (i.types[2].bitfield.regsimd);
5046 gas_assert (i.types[2].bitfield.xmmword
5047 || i.types[2].bitfield.ymmword);
43234a1e
L
5048 if (operand_check == check_none)
5049 return 0;
5050 if (register_number (i.op[0].regs)
5051 != register_number (i.index_reg)
5052 && register_number (i.op[2].regs)
5053 != register_number (i.index_reg)
5054 && register_number (i.op[0].regs)
5055 != register_number (i.op[2].regs))
5056 return 0;
5057 if (operand_check == check_error)
5058 {
5059 i.error = invalid_vector_register_set;
5060 return 1;
5061 }
5062 as_warn (_("mask, index, and destination registers should be distinct"));
5063 }
8444f82a
MZ
5064 else if (i.reg_operands == 1 && i.mask)
5065 {
1b54b8d7
JB
5066 if (i.types[1].bitfield.regsimd
5067 && (i.types[1].bitfield.xmmword
5068 || i.types[1].bitfield.ymmword
5069 || i.types[1].bitfield.zmmword)
8444f82a
MZ
5070 && (register_number (i.op[1].regs)
5071 == register_number (i.index_reg)))
5072 {
5073 if (operand_check == check_error)
5074 {
5075 i.error = invalid_vector_register_set;
5076 return 1;
5077 }
5078 if (operand_check != check_none)
5079 as_warn (_("index and destination registers should be distinct"));
5080 }
5081 }
43234a1e 5082 }
7bab8ab5 5083
43234a1e
L
5084 /* Check if broadcast is supported by the instruction and is applied
5085 to the memory operand. */
5086 if (i.broadcast)
5087 {
8e6e0792 5088 i386_operand_type type, overlap;
43234a1e
L
5089
5090 /* Check if specified broadcast is supported in this instruction,
c39e5b26 5091 and it's applied to memory operand of DWORD or QWORD type. */
32546502 5092 op = i.broadcast->operand;
8e6e0792 5093 if (!t->opcode_modifier.broadcast
32546502 5094 || !i.types[op].bitfield.mem
c39e5b26
JB
5095 || (!i.types[op].bitfield.unspecified
5096 && (t->operand_types[op].bitfield.dword
5097 ? !i.types[op].bitfield.dword
5098 : !i.types[op].bitfield.qword)))
43234a1e
L
5099 {
5100 bad_broadcast:
5101 i.error = unsupported_broadcast;
5102 return 1;
5103 }
8e6e0792
JB
5104
5105 operand_type_set (&type, 0);
c39e5b26 5106 switch ((t->operand_types[op].bitfield.dword ? 4 : 8) * i.broadcast->type)
8e6e0792
JB
5107 {
5108 case 8:
5109 type.bitfield.qword = 1;
5110 break;
5111 case 16:
5112 type.bitfield.xmmword = 1;
5113 break;
5114 case 32:
5115 type.bitfield.ymmword = 1;
5116 break;
5117 case 64:
5118 type.bitfield.zmmword = 1;
5119 break;
5120 default:
5121 goto bad_broadcast;
5122 }
5123
5124 overlap = operand_type_and (type, t->operand_types[op]);
5125 if (operand_type_all_zero (&overlap))
5126 goto bad_broadcast;
5127
5128 if (t->opcode_modifier.checkregsize)
5129 {
5130 unsigned int j;
5131
e2195274 5132 type.bitfield.baseindex = 1;
8e6e0792
JB
5133 for (j = 0; j < i.operands; ++j)
5134 {
5135 if (j != op
5136 && !operand_type_register_match(i.types[j],
5137 t->operand_types[j],
5138 type,
5139 t->operand_types[op]))
5140 goto bad_broadcast;
5141 }
5142 }
43234a1e
L
5143 }
5144 /* If broadcast is supported in this instruction, we need to check if
5145 operand of one-element size isn't specified without broadcast. */
5146 else if (t->opcode_modifier.broadcast && i.mem_operands)
5147 {
5148 /* Find memory operand. */
5149 for (op = 0; op < i.operands; op++)
5150 if (operand_type_check (i.types[op], anymem))
5151 break;
5152 gas_assert (op < i.operands);
5153 /* Check size of the memory operand. */
c39e5b26
JB
5154 if (t->operand_types[op].bitfield.dword
5155 ? i.types[op].bitfield.dword
5156 : i.types[op].bitfield.qword)
43234a1e
L
5157 {
5158 i.error = broadcast_needed;
5159 return 1;
5160 }
5161 }
c39e5b26
JB
5162 else
5163 op = MAX_OPERANDS - 1; /* Avoid uninitialized variable warning. */
43234a1e
L
5164
5165 /* Check if requested masking is supported. */
5166 if (i.mask
5167 && (!t->opcode_modifier.masking
5168 || (i.mask->zeroing
5169 && t->opcode_modifier.masking == MERGING_MASKING)))
5170 {
5171 i.error = unsupported_masking;
5172 return 1;
5173 }
5174
5175 /* Check if masking is applied to dest operand. */
5176 if (i.mask && (i.mask->operand != (int) (i.operands - 1)))
5177 {
5178 i.error = mask_not_on_destination;
5179 return 1;
5180 }
5181
43234a1e
L
5182 /* Check RC/SAE. */
5183 if (i.rounding)
5184 {
5185 if ((i.rounding->type != saeonly
5186 && !t->opcode_modifier.staticrounding)
5187 || (i.rounding->type == saeonly
5188 && (t->opcode_modifier.staticrounding
5189 || !t->opcode_modifier.sae)))
5190 {
5191 i.error = unsupported_rc_sae;
5192 return 1;
5193 }
5194 /* If the instruction has several immediate operands and one of
5195 them is rounding, the rounding operand should be the last
5196 immediate operand. */
5197 if (i.imm_operands > 1
5198 && i.rounding->operand != (int) (i.imm_operands - 1))
7bab8ab5 5199 {
43234a1e 5200 i.error = rc_sae_operand_not_last_imm;
7bab8ab5
JB
5201 return 1;
5202 }
6c30d220
L
5203 }
5204
43234a1e 5205 /* Check vector Disp8 operand. */
b5014f7a
JB
5206 if (t->opcode_modifier.disp8memshift
5207 && i.disp_encoding != disp_encoding_32bit)
43234a1e
L
5208 {
5209 if (i.broadcast)
c39e5b26 5210 i.memshift = t->operand_types[op].bitfield.dword ? 2 : 3;
43234a1e
L
5211 else
5212 i.memshift = t->opcode_modifier.disp8memshift;
5213
5214 for (op = 0; op < i.operands; op++)
5215 if (operand_type_check (i.types[op], disp)
5216 && i.op[op].disps->X_op == O_constant)
5217 {
b5014f7a 5218 if (fits_in_disp8 (i.op[op].disps->X_add_number))
43234a1e 5219 {
b5014f7a
JB
5220 i.types[op].bitfield.disp8 = 1;
5221 return 0;
43234a1e 5222 }
b5014f7a 5223 i.types[op].bitfield.disp8 = 0;
43234a1e
L
5224 }
5225 }
b5014f7a
JB
5226
5227 i.memshift = 0;
43234a1e 5228
6c30d220
L
5229 return 0;
5230}
5231
43f3e2ee 5232/* Check if operands are valid for the instruction. Update VEX
a683cc34
SP
5233 operand types. */
5234
5235static int
5236VEX_check_operands (const insn_template *t)
5237{
86fa6981 5238 if (i.vec_encoding == vex_encoding_evex)
43234a1e 5239 {
86fa6981 5240 /* This instruction must be encoded with EVEX prefix. */
e771e7c9 5241 if (!is_evex_encoding (t))
86fa6981
L
5242 {
5243 i.error = unsupported;
5244 return 1;
5245 }
5246 return 0;
43234a1e
L
5247 }
5248
a683cc34 5249 if (!t->opcode_modifier.vex)
86fa6981
L
5250 {
5251 /* This instruction template doesn't have VEX prefix. */
5252 if (i.vec_encoding != vex_encoding_default)
5253 {
5254 i.error = unsupported;
5255 return 1;
5256 }
5257 return 0;
5258 }
a683cc34
SP
5259
5260 /* Only check VEX_Imm4, which must be the first operand. */
5261 if (t->operand_types[0].bitfield.vec_imm4)
5262 {
5263 if (i.op[0].imms->X_op != O_constant
5264 || !fits_in_imm4 (i.op[0].imms->X_add_number))
891edac4 5265 {
a65babc9 5266 i.error = bad_imm4;
891edac4
L
5267 return 1;
5268 }
a683cc34
SP
5269
5270 /* Turn off Imm8 so that update_imm won't complain. */
5271 i.types[0] = vec_imm4;
5272 }
5273
5274 return 0;
5275}
5276
d3ce72d0 5277static const insn_template *
83b16ac6 5278match_template (char mnem_suffix)
29b0f896
AM
5279{
5280 /* Points to template once we've found it. */
d3ce72d0 5281 const insn_template *t;
40fb9820 5282 i386_operand_type overlap0, overlap1, overlap2, overlap3;
c0f3af97 5283 i386_operand_type overlap4;
29b0f896 5284 unsigned int found_reverse_match;
83b16ac6 5285 i386_opcode_modifier suffix_check, mnemsuf_check;
40fb9820 5286 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 5287 int addr_prefix_disp;
a5c311ca 5288 unsigned int j;
3629bb00 5289 unsigned int found_cpu_match;
45664ddb 5290 unsigned int check_register;
5614d22c 5291 enum i386_error specific_error = 0;
29b0f896 5292
c0f3af97
L
5293#if MAX_OPERANDS != 5
5294# error "MAX_OPERANDS must be 5."
f48ff2ae
L
5295#endif
5296
29b0f896 5297 found_reverse_match = 0;
539e75ad 5298 addr_prefix_disp = -1;
40fb9820
L
5299
5300 memset (&suffix_check, 0, sizeof (suffix_check));
e2195274
JB
5301 if (intel_syntax && i.broadcast)
5302 /* nothing */;
5303 else if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
5304 suffix_check.no_bsuf = 1;
5305 else if (i.suffix == WORD_MNEM_SUFFIX)
5306 suffix_check.no_wsuf = 1;
5307 else if (i.suffix == SHORT_MNEM_SUFFIX)
5308 suffix_check.no_ssuf = 1;
5309 else if (i.suffix == LONG_MNEM_SUFFIX)
5310 suffix_check.no_lsuf = 1;
5311 else if (i.suffix == QWORD_MNEM_SUFFIX)
5312 suffix_check.no_qsuf = 1;
5313 else if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
7ce189b3 5314 suffix_check.no_ldsuf = 1;
29b0f896 5315
83b16ac6
JB
5316 memset (&mnemsuf_check, 0, sizeof (mnemsuf_check));
5317 if (intel_syntax)
5318 {
5319 switch (mnem_suffix)
5320 {
5321 case BYTE_MNEM_SUFFIX: mnemsuf_check.no_bsuf = 1; break;
5322 case WORD_MNEM_SUFFIX: mnemsuf_check.no_wsuf = 1; break;
5323 case SHORT_MNEM_SUFFIX: mnemsuf_check.no_ssuf = 1; break;
5324 case LONG_MNEM_SUFFIX: mnemsuf_check.no_lsuf = 1; break;
5325 case QWORD_MNEM_SUFFIX: mnemsuf_check.no_qsuf = 1; break;
5326 }
5327 }
5328
01559ecc
L
5329 /* Must have right number of operands. */
5330 i.error = number_of_operands_mismatch;
5331
45aa61fe 5332 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 5333 {
539e75ad
L
5334 addr_prefix_disp = -1;
5335
29b0f896
AM
5336 if (i.operands != t->operands)
5337 continue;
5338
50aecf8c 5339 /* Check processor support. */
a65babc9 5340 i.error = unsupported;
c0f3af97
L
5341 found_cpu_match = (cpu_flags_match (t)
5342 == CPU_FLAGS_PERFECT_MATCH);
50aecf8c
L
5343 if (!found_cpu_match)
5344 continue;
5345
e1d4d893 5346 /* Check AT&T mnemonic. */
a65babc9 5347 i.error = unsupported_with_intel_mnemonic;
e1d4d893 5348 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
5349 continue;
5350
e92bae62 5351 /* Check AT&T/Intel syntax and Intel64/AMD64 ISA. */
a65babc9 5352 i.error = unsupported_syntax;
5c07affc 5353 if ((intel_syntax && t->opcode_modifier.attsyntax)
e92bae62
L
5354 || (!intel_syntax && t->opcode_modifier.intelsyntax)
5355 || (intel64 && t->opcode_modifier.amd64)
5356 || (!intel64 && t->opcode_modifier.intel64))
1efbbeb4
L
5357 continue;
5358
20592a94 5359 /* Check the suffix, except for some instructions in intel mode. */
a65babc9 5360 i.error = invalid_instruction_suffix;
567e4e96
L
5361 if ((!intel_syntax || !t->opcode_modifier.ignoresize)
5362 && ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
5363 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
5364 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
5365 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
5366 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
5367 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf)))
29b0f896 5368 continue;
83b16ac6
JB
5369 /* In Intel mode all mnemonic suffixes must be explicitly allowed. */
5370 if ((t->opcode_modifier.no_bsuf && mnemsuf_check.no_bsuf)
5371 || (t->opcode_modifier.no_wsuf && mnemsuf_check.no_wsuf)
5372 || (t->opcode_modifier.no_lsuf && mnemsuf_check.no_lsuf)
5373 || (t->opcode_modifier.no_ssuf && mnemsuf_check.no_ssuf)
5374 || (t->opcode_modifier.no_qsuf && mnemsuf_check.no_qsuf)
5375 || (t->opcode_modifier.no_ldsuf && mnemsuf_check.no_ldsuf))
5376 continue;
29b0f896 5377
5c07affc 5378 if (!operand_size_match (t))
7d5e4556 5379 continue;
539e75ad 5380
5c07affc
L
5381 for (j = 0; j < MAX_OPERANDS; j++)
5382 operand_types[j] = t->operand_types[j];
5383
45aa61fe
AM
5384 /* In general, don't allow 64-bit operands in 32-bit mode. */
5385 if (i.suffix == QWORD_MNEM_SUFFIX
5386 && flag_code != CODE_64BIT
5387 && (intel_syntax
40fb9820 5388 ? (!t->opcode_modifier.ignoresize
45aa61fe
AM
5389 && !intel_float_operand (t->name))
5390 : intel_float_operand (t->name) != 2)
40fb9820 5391 && ((!operand_types[0].bitfield.regmmx
1b54b8d7 5392 && !operand_types[0].bitfield.regsimd)
40fb9820 5393 || (!operand_types[t->operands > 1].bitfield.regmmx
1b54b8d7 5394 && !operand_types[t->operands > 1].bitfield.regsimd))
45aa61fe
AM
5395 && (t->base_opcode != 0x0fc7
5396 || t->extension_opcode != 1 /* cmpxchg8b */))
5397 continue;
5398
192dc9c6
JB
5399 /* In general, don't allow 32-bit operands on pre-386. */
5400 else if (i.suffix == LONG_MNEM_SUFFIX
5401 && !cpu_arch_flags.bitfield.cpui386
5402 && (intel_syntax
5403 ? (!t->opcode_modifier.ignoresize
5404 && !intel_float_operand (t->name))
5405 : intel_float_operand (t->name) != 2)
5406 && ((!operand_types[0].bitfield.regmmx
1b54b8d7 5407 && !operand_types[0].bitfield.regsimd)
192dc9c6 5408 || (!operand_types[t->operands > 1].bitfield.regmmx
1b54b8d7 5409 && !operand_types[t->operands > 1].bitfield.regsimd)))
192dc9c6
JB
5410 continue;
5411
29b0f896 5412 /* Do not verify operands when there are none. */
50aecf8c 5413 else
29b0f896 5414 {
c6fb90c8 5415 if (!t->operands)
2dbab7d5
L
5416 /* We've found a match; break out of loop. */
5417 break;
29b0f896 5418 }
252b5132 5419
539e75ad
L
5420 /* Address size prefix will turn Disp64/Disp32/Disp16 operand
5421 into Disp32/Disp16/Disp32 operand. */
5422 if (i.prefix[ADDR_PREFIX] != 0)
5423 {
40fb9820 5424 /* There should be only one Disp operand. */
539e75ad
L
5425 switch (flag_code)
5426 {
5427 case CODE_16BIT:
40fb9820
L
5428 for (j = 0; j < MAX_OPERANDS; j++)
5429 {
5430 if (operand_types[j].bitfield.disp16)
5431 {
5432 addr_prefix_disp = j;
5433 operand_types[j].bitfield.disp32 = 1;
5434 operand_types[j].bitfield.disp16 = 0;
5435 break;
5436 }
5437 }
539e75ad
L
5438 break;
5439 case CODE_32BIT:
40fb9820
L
5440 for (j = 0; j < MAX_OPERANDS; j++)
5441 {
5442 if (operand_types[j].bitfield.disp32)
5443 {
5444 addr_prefix_disp = j;
5445 operand_types[j].bitfield.disp32 = 0;
5446 operand_types[j].bitfield.disp16 = 1;
5447 break;
5448 }
5449 }
539e75ad
L
5450 break;
5451 case CODE_64BIT:
40fb9820
L
5452 for (j = 0; j < MAX_OPERANDS; j++)
5453 {
5454 if (operand_types[j].bitfield.disp64)
5455 {
5456 addr_prefix_disp = j;
5457 operand_types[j].bitfield.disp64 = 0;
5458 operand_types[j].bitfield.disp32 = 1;
5459 break;
5460 }
5461 }
539e75ad
L
5462 break;
5463 }
539e75ad
L
5464 }
5465
02a86693
L
5466 /* Force 0x8b encoding for "mov foo@GOT, %eax". */
5467 if (i.reloc[0] == BFD_RELOC_386_GOT32 && t->base_opcode == 0xa0)
5468 continue;
5469
56ffb741 5470 /* We check register size if needed. */
e2195274
JB
5471 if (t->opcode_modifier.checkregsize)
5472 {
5473 check_register = (1 << t->operands) - 1;
5474 if (i.broadcast)
5475 check_register &= ~(1 << i.broadcast->operand);
5476 }
5477 else
5478 check_register = 0;
5479
c6fb90c8 5480 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
5481 switch (t->operands)
5482 {
5483 case 1:
40fb9820 5484 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
5485 continue;
5486 break;
5487 case 2:
33eaf5de 5488 /* xchg %eax, %eax is a special case. It is an alias for nop
8b38ad71
L
5489 only in 32bit mode and we can use opcode 0x90. In 64bit
5490 mode, we can't use 0x90 for xchg %eax, %eax since it should
5491 zero-extend %eax to %rax. */
5492 if (flag_code == CODE_64BIT
5493 && t->base_opcode == 0x90
0dfbf9d7
L
5494 && operand_type_equal (&i.types [0], &acc32)
5495 && operand_type_equal (&i.types [1], &acc32))
8b38ad71 5496 continue;
1212781b
JB
5497 /* xrelease mov %eax, <disp> is another special case. It must not
5498 match the accumulator-only encoding of mov. */
5499 if (flag_code != CODE_64BIT
5500 && i.hle_prefix
5501 && t->base_opcode == 0xa0
5502 && i.types[0].bitfield.acc
5503 && operand_type_check (i.types[1], anymem))
5504 continue;
86fa6981
L
5505 /* If we want store form, we reverse direction of operands. */
5506 if (i.dir_encoding == dir_encoding_store
5507 && t->opcode_modifier.d)
5508 goto check_reverse;
1a0670f3 5509 /* Fall through. */
b6169b20 5510
29b0f896 5511 case 3:
86fa6981
L
5512 /* If we want store form, we skip the current load. */
5513 if (i.dir_encoding == dir_encoding_store
5514 && i.mem_operands == 0
5515 && t->opcode_modifier.load)
fa99fab2 5516 continue;
1a0670f3 5517 /* Fall through. */
f48ff2ae 5518 case 4:
c0f3af97 5519 case 5:
c6fb90c8 5520 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
5521 if (!operand_type_match (overlap0, i.types[0])
5522 || !operand_type_match (overlap1, i.types[1])
e2195274 5523 || ((check_register & 3) == 3
dc821c5f 5524 && !operand_type_register_match (i.types[0],
40fb9820 5525 operand_types[0],
dc821c5f 5526 i.types[1],
40fb9820 5527 operand_types[1])))
29b0f896
AM
5528 {
5529 /* Check if other direction is valid ... */
38e314eb 5530 if (!t->opcode_modifier.d)
29b0f896
AM
5531 continue;
5532
b6169b20 5533check_reverse:
29b0f896 5534 /* Try reversing direction of operands. */
c6fb90c8
L
5535 overlap0 = operand_type_and (i.types[0], operand_types[1]);
5536 overlap1 = operand_type_and (i.types[1], operand_types[0]);
40fb9820
L
5537 if (!operand_type_match (overlap0, i.types[0])
5538 || !operand_type_match (overlap1, i.types[1])
45664ddb 5539 || (check_register
dc821c5f 5540 && !operand_type_register_match (i.types[0],
45664ddb 5541 operand_types[1],
45664ddb
L
5542 i.types[1],
5543 operand_types[0])))
29b0f896
AM
5544 {
5545 /* Does not match either direction. */
5546 continue;
5547 }
38e314eb 5548 /* found_reverse_match holds which of D or FloatR
29b0f896 5549 we've found. */
38e314eb
JB
5550 if (!t->opcode_modifier.d)
5551 found_reverse_match = 0;
5552 else if (operand_types[0].bitfield.tbyte)
8a2ed489
L
5553 found_reverse_match = Opcode_FloatD;
5554 else
38e314eb 5555 found_reverse_match = Opcode_D;
40fb9820 5556 if (t->opcode_modifier.floatr)
8a2ed489 5557 found_reverse_match |= Opcode_FloatR;
29b0f896 5558 }
f48ff2ae 5559 else
29b0f896 5560 {
f48ff2ae 5561 /* Found a forward 2 operand match here. */
d1cbb4db
L
5562 switch (t->operands)
5563 {
c0f3af97
L
5564 case 5:
5565 overlap4 = operand_type_and (i.types[4],
5566 operand_types[4]);
1a0670f3 5567 /* Fall through. */
d1cbb4db 5568 case 4:
c6fb90c8
L
5569 overlap3 = operand_type_and (i.types[3],
5570 operand_types[3]);
1a0670f3 5571 /* Fall through. */
d1cbb4db 5572 case 3:
c6fb90c8
L
5573 overlap2 = operand_type_and (i.types[2],
5574 operand_types[2]);
d1cbb4db
L
5575 break;
5576 }
29b0f896 5577
f48ff2ae
L
5578 switch (t->operands)
5579 {
c0f3af97
L
5580 case 5:
5581 if (!operand_type_match (overlap4, i.types[4])
dc821c5f 5582 || !operand_type_register_match (i.types[3],
c0f3af97 5583 operand_types[3],
c0f3af97
L
5584 i.types[4],
5585 operand_types[4]))
5586 continue;
1a0670f3 5587 /* Fall through. */
f48ff2ae 5588 case 4:
40fb9820 5589 if (!operand_type_match (overlap3, i.types[3])
e2195274
JB
5590 || ((check_register & 0xa) == 0xa
5591 && !operand_type_register_match (i.types[1],
f7768225
JB
5592 operand_types[1],
5593 i.types[3],
e2195274
JB
5594 operand_types[3]))
5595 || ((check_register & 0xc) == 0xc
5596 && !operand_type_register_match (i.types[2],
5597 operand_types[2],
5598 i.types[3],
5599 operand_types[3])))
f48ff2ae 5600 continue;
1a0670f3 5601 /* Fall through. */
f48ff2ae
L
5602 case 3:
5603 /* Here we make use of the fact that there are no
23e42951 5604 reverse match 3 operand instructions. */
40fb9820 5605 if (!operand_type_match (overlap2, i.types[2])
e2195274
JB
5606 || ((check_register & 5) == 5
5607 && !operand_type_register_match (i.types[0],
23e42951
JB
5608 operand_types[0],
5609 i.types[2],
e2195274
JB
5610 operand_types[2]))
5611 || ((check_register & 6) == 6
5612 && !operand_type_register_match (i.types[1],
5613 operand_types[1],
5614 i.types[2],
5615 operand_types[2])))
f48ff2ae
L
5616 continue;
5617 break;
5618 }
29b0f896 5619 }
f48ff2ae 5620 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
5621 slip through to break. */
5622 }
3629bb00 5623 if (!found_cpu_match)
29b0f896
AM
5624 {
5625 found_reverse_match = 0;
5626 continue;
5627 }
c0f3af97 5628
5614d22c
JB
5629 /* Check if vector and VEX operands are valid. */
5630 if (check_VecOperands (t) || VEX_check_operands (t))
5631 {
5632 specific_error = i.error;
5633 continue;
5634 }
a683cc34 5635
29b0f896
AM
5636 /* We've found a match; break out of loop. */
5637 break;
5638 }
5639
5640 if (t == current_templates->end)
5641 {
5642 /* We found no match. */
a65babc9 5643 const char *err_msg;
5614d22c 5644 switch (specific_error ? specific_error : i.error)
a65babc9
L
5645 {
5646 default:
5647 abort ();
86e026a4 5648 case operand_size_mismatch:
a65babc9
L
5649 err_msg = _("operand size mismatch");
5650 break;
5651 case operand_type_mismatch:
5652 err_msg = _("operand type mismatch");
5653 break;
5654 case register_type_mismatch:
5655 err_msg = _("register type mismatch");
5656 break;
5657 case number_of_operands_mismatch:
5658 err_msg = _("number of operands mismatch");
5659 break;
5660 case invalid_instruction_suffix:
5661 err_msg = _("invalid instruction suffix");
5662 break;
5663 case bad_imm4:
4a2608e3 5664 err_msg = _("constant doesn't fit in 4 bits");
a65babc9 5665 break;
a65babc9
L
5666 case unsupported_with_intel_mnemonic:
5667 err_msg = _("unsupported with Intel mnemonic");
5668 break;
5669 case unsupported_syntax:
5670 err_msg = _("unsupported syntax");
5671 break;
5672 case unsupported:
35262a23 5673 as_bad (_("unsupported instruction `%s'"),
10efe3f6
L
5674 current_templates->start->name);
5675 return NULL;
6c30d220
L
5676 case invalid_vsib_address:
5677 err_msg = _("invalid VSIB address");
5678 break;
7bab8ab5
JB
5679 case invalid_vector_register_set:
5680 err_msg = _("mask, index, and destination registers must be distinct");
5681 break;
6c30d220
L
5682 case unsupported_vector_index_register:
5683 err_msg = _("unsupported vector index register");
5684 break;
43234a1e
L
5685 case unsupported_broadcast:
5686 err_msg = _("unsupported broadcast");
5687 break;
5688 case broadcast_not_on_src_operand:
5689 err_msg = _("broadcast not on source memory operand");
5690 break;
5691 case broadcast_needed:
5692 err_msg = _("broadcast is needed for operand of such type");
5693 break;
5694 case unsupported_masking:
5695 err_msg = _("unsupported masking");
5696 break;
5697 case mask_not_on_destination:
5698 err_msg = _("mask not on destination operand");
5699 break;
5700 case no_default_mask:
5701 err_msg = _("default mask isn't allowed");
5702 break;
5703 case unsupported_rc_sae:
5704 err_msg = _("unsupported static rounding/sae");
5705 break;
5706 case rc_sae_operand_not_last_imm:
5707 if (intel_syntax)
5708 err_msg = _("RC/SAE operand must precede immediate operands");
5709 else
5710 err_msg = _("RC/SAE operand must follow immediate operands");
5711 break;
5712 case invalid_register_operand:
5713 err_msg = _("invalid register operand");
5714 break;
a65babc9
L
5715 }
5716 as_bad (_("%s for `%s'"), err_msg,
891edac4 5717 current_templates->start->name);
fa99fab2 5718 return NULL;
29b0f896 5719 }
252b5132 5720
29b0f896
AM
5721 if (!quiet_warnings)
5722 {
5723 if (!intel_syntax
40fb9820
L
5724 && (i.types[0].bitfield.jumpabsolute
5725 != operand_types[0].bitfield.jumpabsolute))
29b0f896
AM
5726 {
5727 as_warn (_("indirect %s without `*'"), t->name);
5728 }
5729
40fb9820
L
5730 if (t->opcode_modifier.isprefix
5731 && t->opcode_modifier.ignoresize)
29b0f896
AM
5732 {
5733 /* Warn them that a data or address size prefix doesn't
5734 affect assembly of the next line of code. */
5735 as_warn (_("stand-alone `%s' prefix"), t->name);
5736 }
5737 }
5738
5739 /* Copy the template we found. */
5740 i.tm = *t;
539e75ad
L
5741
5742 if (addr_prefix_disp != -1)
5743 i.tm.operand_types[addr_prefix_disp]
5744 = operand_types[addr_prefix_disp];
5745
29b0f896
AM
5746 if (found_reverse_match)
5747 {
5748 /* If we found a reverse match we must alter the opcode
5749 direction bit. found_reverse_match holds bits to change
5750 (different for int & float insns). */
5751
5752 i.tm.base_opcode ^= found_reverse_match;
5753
539e75ad
L
5754 i.tm.operand_types[0] = operand_types[1];
5755 i.tm.operand_types[1] = operand_types[0];
29b0f896
AM
5756 }
5757
fa99fab2 5758 return t;
29b0f896
AM
5759}
5760
5761static int
e3bb37b5 5762check_string (void)
29b0f896 5763{
40fb9820
L
5764 int mem_op = operand_type_check (i.types[0], anymem) ? 0 : 1;
5765 if (i.tm.operand_types[mem_op].bitfield.esseg)
29b0f896
AM
5766 {
5767 if (i.seg[0] != NULL && i.seg[0] != &es)
5768 {
a87af027 5769 as_bad (_("`%s' operand %d must use `%ses' segment"),
29b0f896 5770 i.tm.name,
a87af027
JB
5771 mem_op + 1,
5772 register_prefix);
29b0f896
AM
5773 return 0;
5774 }
5775 /* There's only ever one segment override allowed per instruction.
5776 This instruction possibly has a legal segment override on the
5777 second operand, so copy the segment to where non-string
5778 instructions store it, allowing common code. */
5779 i.seg[0] = i.seg[1];
5780 }
40fb9820 5781 else if (i.tm.operand_types[mem_op + 1].bitfield.esseg)
29b0f896
AM
5782 {
5783 if (i.seg[1] != NULL && i.seg[1] != &es)
5784 {
a87af027 5785 as_bad (_("`%s' operand %d must use `%ses' segment"),
29b0f896 5786 i.tm.name,
a87af027
JB
5787 mem_op + 2,
5788 register_prefix);
29b0f896
AM
5789 return 0;
5790 }
5791 }
5792 return 1;
5793}
5794
5795static int
543613e9 5796process_suffix (void)
29b0f896
AM
5797{
5798 /* If matched instruction specifies an explicit instruction mnemonic
5799 suffix, use it. */
40fb9820
L
5800 if (i.tm.opcode_modifier.size16)
5801 i.suffix = WORD_MNEM_SUFFIX;
5802 else if (i.tm.opcode_modifier.size32)
5803 i.suffix = LONG_MNEM_SUFFIX;
5804 else if (i.tm.opcode_modifier.size64)
5805 i.suffix = QWORD_MNEM_SUFFIX;
29b0f896
AM
5806 else if (i.reg_operands)
5807 {
5808 /* If there's no instruction mnemonic suffix we try to invent one
5809 based on register operands. */
5810 if (!i.suffix)
5811 {
5812 /* We take i.suffix from the last register operand specified,
5813 Destination register type is more significant than source
381d071f
L
5814 register type. crc32 in SSE4.2 prefers source register
5815 type. */
5816 if (i.tm.base_opcode == 0xf20f38f1)
5817 {
dc821c5f 5818 if (i.types[0].bitfield.reg && i.types[0].bitfield.word)
40fb9820 5819 i.suffix = WORD_MNEM_SUFFIX;
dc821c5f 5820 else if (i.types[0].bitfield.reg && i.types[0].bitfield.dword)
40fb9820 5821 i.suffix = LONG_MNEM_SUFFIX;
dc821c5f 5822 else if (i.types[0].bitfield.reg && i.types[0].bitfield.qword)
40fb9820 5823 i.suffix = QWORD_MNEM_SUFFIX;
381d071f 5824 }
9344ff29 5825 else if (i.tm.base_opcode == 0xf20f38f0)
20592a94 5826 {
dc821c5f 5827 if (i.types[0].bitfield.reg && i.types[0].bitfield.byte)
20592a94
L
5828 i.suffix = BYTE_MNEM_SUFFIX;
5829 }
381d071f
L
5830
5831 if (!i.suffix)
5832 {
5833 int op;
5834
20592a94
L
5835 if (i.tm.base_opcode == 0xf20f38f1
5836 || i.tm.base_opcode == 0xf20f38f0)
5837 {
5838 /* We have to know the operand size for crc32. */
5839 as_bad (_("ambiguous memory operand size for `%s`"),
5840 i.tm.name);
5841 return 0;
5842 }
5843
381d071f 5844 for (op = i.operands; --op >= 0;)
b76bc5d5
JB
5845 if (!i.tm.operand_types[op].bitfield.inoutportreg
5846 && !i.tm.operand_types[op].bitfield.shiftcount)
381d071f 5847 {
8819ada6
JB
5848 if (!i.types[op].bitfield.reg)
5849 continue;
5850 if (i.types[op].bitfield.byte)
5851 i.suffix = BYTE_MNEM_SUFFIX;
5852 else if (i.types[op].bitfield.word)
5853 i.suffix = WORD_MNEM_SUFFIX;
5854 else if (i.types[op].bitfield.dword)
5855 i.suffix = LONG_MNEM_SUFFIX;
5856 else if (i.types[op].bitfield.qword)
5857 i.suffix = QWORD_MNEM_SUFFIX;
5858 else
5859 continue;
5860 break;
381d071f
L
5861 }
5862 }
29b0f896
AM
5863 }
5864 else if (i.suffix == BYTE_MNEM_SUFFIX)
5865 {
2eb952a4
L
5866 if (intel_syntax
5867 && i.tm.opcode_modifier.ignoresize
5868 && i.tm.opcode_modifier.no_bsuf)
5869 i.suffix = 0;
5870 else if (!check_byte_reg ())
29b0f896
AM
5871 return 0;
5872 }
5873 else if (i.suffix == LONG_MNEM_SUFFIX)
5874 {
2eb952a4
L
5875 if (intel_syntax
5876 && i.tm.opcode_modifier.ignoresize
9f123b91
JB
5877 && i.tm.opcode_modifier.no_lsuf
5878 && !i.tm.opcode_modifier.todword
5879 && !i.tm.opcode_modifier.toqword)
2eb952a4
L
5880 i.suffix = 0;
5881 else if (!check_long_reg ())
29b0f896
AM
5882 return 0;
5883 }
5884 else if (i.suffix == QWORD_MNEM_SUFFIX)
5885 {
955e1e6a
L
5886 if (intel_syntax
5887 && i.tm.opcode_modifier.ignoresize
9f123b91
JB
5888 && i.tm.opcode_modifier.no_qsuf
5889 && !i.tm.opcode_modifier.todword
5890 && !i.tm.opcode_modifier.toqword)
955e1e6a
L
5891 i.suffix = 0;
5892 else if (!check_qword_reg ())
29b0f896
AM
5893 return 0;
5894 }
5895 else if (i.suffix == WORD_MNEM_SUFFIX)
5896 {
2eb952a4
L
5897 if (intel_syntax
5898 && i.tm.opcode_modifier.ignoresize
5899 && i.tm.opcode_modifier.no_wsuf)
5900 i.suffix = 0;
5901 else if (!check_word_reg ())
29b0f896
AM
5902 return 0;
5903 }
40fb9820 5904 else if (intel_syntax && i.tm.opcode_modifier.ignoresize)
29b0f896
AM
5905 /* Do nothing if the instruction is going to ignore the prefix. */
5906 ;
5907 else
5908 abort ();
5909 }
40fb9820 5910 else if (i.tm.opcode_modifier.defaultsize
9306ca4a
JB
5911 && !i.suffix
5912 /* exclude fldenv/frstor/fsave/fstenv */
40fb9820 5913 && i.tm.opcode_modifier.no_ssuf)
29b0f896
AM
5914 {
5915 i.suffix = stackop_size;
5916 }
9306ca4a
JB
5917 else if (intel_syntax
5918 && !i.suffix
40fb9820
L
5919 && (i.tm.operand_types[0].bitfield.jumpabsolute
5920 || i.tm.opcode_modifier.jumpbyte
5921 || i.tm.opcode_modifier.jumpintersegment
64e74474
AM
5922 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
5923 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
5924 {
5925 switch (flag_code)
5926 {
5927 case CODE_64BIT:
40fb9820 5928 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a
JB
5929 {
5930 i.suffix = QWORD_MNEM_SUFFIX;
5931 break;
5932 }
1a0670f3 5933 /* Fall through. */
9306ca4a 5934 case CODE_32BIT:
40fb9820 5935 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
5936 i.suffix = LONG_MNEM_SUFFIX;
5937 break;
5938 case CODE_16BIT:
40fb9820 5939 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
5940 i.suffix = WORD_MNEM_SUFFIX;
5941 break;
5942 }
5943 }
252b5132 5944
9306ca4a 5945 if (!i.suffix)
29b0f896 5946 {
9306ca4a
JB
5947 if (!intel_syntax)
5948 {
40fb9820 5949 if (i.tm.opcode_modifier.w)
9306ca4a 5950 {
4eed87de
AM
5951 as_bad (_("no instruction mnemonic suffix given and "
5952 "no register operands; can't size instruction"));
9306ca4a
JB
5953 return 0;
5954 }
5955 }
5956 else
5957 {
40fb9820 5958 unsigned int suffixes;
7ab9ffdd 5959
40fb9820
L
5960 suffixes = !i.tm.opcode_modifier.no_bsuf;
5961 if (!i.tm.opcode_modifier.no_wsuf)
5962 suffixes |= 1 << 1;
5963 if (!i.tm.opcode_modifier.no_lsuf)
5964 suffixes |= 1 << 2;
fc4adea1 5965 if (!i.tm.opcode_modifier.no_ldsuf)
40fb9820
L
5966 suffixes |= 1 << 3;
5967 if (!i.tm.opcode_modifier.no_ssuf)
5968 suffixes |= 1 << 4;
c2b9da16 5969 if (flag_code == CODE_64BIT && !i.tm.opcode_modifier.no_qsuf)
40fb9820
L
5970 suffixes |= 1 << 5;
5971
5972 /* There are more than suffix matches. */
5973 if (i.tm.opcode_modifier.w
9306ca4a 5974 || ((suffixes & (suffixes - 1))
40fb9820
L
5975 && !i.tm.opcode_modifier.defaultsize
5976 && !i.tm.opcode_modifier.ignoresize))
9306ca4a
JB
5977 {
5978 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
5979 return 0;
5980 }
5981 }
29b0f896 5982 }
252b5132 5983
d2224064
JB
5984 /* Change the opcode based on the operand size given by i.suffix. */
5985 switch (i.suffix)
29b0f896 5986 {
d2224064
JB
5987 /* Size floating point instruction. */
5988 case LONG_MNEM_SUFFIX:
5989 if (i.tm.opcode_modifier.floatmf)
5990 {
5991 i.tm.base_opcode ^= 4;
5992 break;
5993 }
5994 /* fall through */
5995 case WORD_MNEM_SUFFIX:
5996 case QWORD_MNEM_SUFFIX:
29b0f896 5997 /* It's not a byte, select word/dword operation. */
40fb9820 5998 if (i.tm.opcode_modifier.w)
29b0f896 5999 {
40fb9820 6000 if (i.tm.opcode_modifier.shortform)
29b0f896
AM
6001 i.tm.base_opcode |= 8;
6002 else
6003 i.tm.base_opcode |= 1;
6004 }
d2224064
JB
6005 /* fall through */
6006 case SHORT_MNEM_SUFFIX:
29b0f896
AM
6007 /* Now select between word & dword operations via the operand
6008 size prefix, except for instructions that will ignore this
6009 prefix anyway. */
75c0a438
L
6010 if (i.reg_operands > 0
6011 && i.types[0].bitfield.reg
6012 && i.tm.opcode_modifier.addrprefixopreg
6013 && (i.tm.opcode_modifier.immext
6014 || i.operands == 1))
cb712a9e 6015 {
ca61edf2
L
6016 /* The address size override prefix changes the size of the
6017 first operand. */
40fb9820 6018 if ((flag_code == CODE_32BIT
75c0a438 6019 && i.op[0].regs->reg_type.bitfield.word)
40fb9820 6020 || (flag_code != CODE_32BIT
75c0a438 6021 && i.op[0].regs->reg_type.bitfield.dword))
cb712a9e
L
6022 if (!add_prefix (ADDR_PREFIX_OPCODE))
6023 return 0;
6024 }
6025 else if (i.suffix != QWORD_MNEM_SUFFIX
40fb9820
L
6026 && !i.tm.opcode_modifier.ignoresize
6027 && !i.tm.opcode_modifier.floatmf
cb712a9e
L
6028 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
6029 || (flag_code == CODE_64BIT
40fb9820 6030 && i.tm.opcode_modifier.jumpbyte)))
24eab124
AM
6031 {
6032 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 6033
40fb9820 6034 if (i.tm.opcode_modifier.jumpbyte) /* jcxz, loop */
29b0f896 6035 prefix = ADDR_PREFIX_OPCODE;
252b5132 6036
29b0f896
AM
6037 if (!add_prefix (prefix))
6038 return 0;
24eab124 6039 }
252b5132 6040
29b0f896
AM
6041 /* Set mode64 for an operand. */
6042 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 6043 && flag_code == CODE_64BIT
d2224064 6044 && !i.tm.opcode_modifier.norex64
46e883c5 6045 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d2224064
JB
6046 need rex64. */
6047 && ! (i.operands == 2
6048 && i.tm.base_opcode == 0x90
6049 && i.tm.extension_opcode == None
6050 && operand_type_equal (&i.types [0], &acc64)
6051 && operand_type_equal (&i.types [1], &acc64)))
6052 i.rex |= REX_W;
3e73aa7c 6053
d2224064 6054 break;
29b0f896 6055 }
7ecd2f8b 6056
c0a30a9f
L
6057 if (i.reg_operands != 0
6058 && i.operands > 1
6059 && i.tm.opcode_modifier.addrprefixopreg
6060 && !i.tm.opcode_modifier.immext)
6061 {
6062 /* Check invalid register operand when the address size override
6063 prefix changes the size of register operands. */
6064 unsigned int op;
6065 enum { need_word, need_dword, need_qword } need;
6066
6067 if (flag_code == CODE_32BIT)
6068 need = i.prefix[ADDR_PREFIX] ? need_word : need_dword;
6069 else
6070 {
6071 if (i.prefix[ADDR_PREFIX])
6072 need = need_dword;
6073 else
6074 need = flag_code == CODE_64BIT ? need_qword : need_word;
6075 }
6076
6077 for (op = 0; op < i.operands; op++)
6078 if (i.types[op].bitfield.reg
6079 && ((need == need_word
6080 && !i.op[op].regs->reg_type.bitfield.word)
6081 || (need == need_dword
6082 && !i.op[op].regs->reg_type.bitfield.dword)
6083 || (need == need_qword
6084 && !i.op[op].regs->reg_type.bitfield.qword)))
6085 {
6086 as_bad (_("invalid register operand size for `%s'"),
6087 i.tm.name);
6088 return 0;
6089 }
6090 }
6091
29b0f896
AM
6092 return 1;
6093}
3e73aa7c 6094
29b0f896 6095static int
543613e9 6096check_byte_reg (void)
29b0f896
AM
6097{
6098 int op;
543613e9 6099
29b0f896
AM
6100 for (op = i.operands; --op >= 0;)
6101 {
dc821c5f
JB
6102 /* Skip non-register operands. */
6103 if (!i.types[op].bitfield.reg)
6104 continue;
6105
29b0f896
AM
6106 /* If this is an eight bit register, it's OK. If it's the 16 or
6107 32 bit version of an eight bit register, we will just use the
6108 low portion, and that's OK too. */
dc821c5f 6109 if (i.types[op].bitfield.byte)
29b0f896
AM
6110 continue;
6111
5a819eb9
JB
6112 /* I/O port address operands are OK too. */
6113 if (i.tm.operand_types[op].bitfield.inoutportreg)
6114 continue;
6115
9344ff29
L
6116 /* crc32 doesn't generate this warning. */
6117 if (i.tm.base_opcode == 0xf20f38f0)
6118 continue;
6119
dc821c5f
JB
6120 if ((i.types[op].bitfield.word
6121 || i.types[op].bitfield.dword
6122 || i.types[op].bitfield.qword)
5a819eb9
JB
6123 && i.op[op].regs->reg_num < 4
6124 /* Prohibit these changes in 64bit mode, since the lowering
6125 would be more complicated. */
6126 && flag_code != CODE_64BIT)
29b0f896 6127 {
29b0f896 6128#if REGISTER_WARNINGS
5a819eb9 6129 if (!quiet_warnings)
a540244d
L
6130 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
6131 register_prefix,
dc821c5f 6132 (i.op[op].regs + (i.types[op].bitfield.word
29b0f896
AM
6133 ? REGNAM_AL - REGNAM_AX
6134 : REGNAM_AL - REGNAM_EAX))->reg_name,
a540244d 6135 register_prefix,
29b0f896
AM
6136 i.op[op].regs->reg_name,
6137 i.suffix);
6138#endif
6139 continue;
6140 }
6141 /* Any other register is bad. */
dc821c5f 6142 if (i.types[op].bitfield.reg
40fb9820 6143 || i.types[op].bitfield.regmmx
1b54b8d7 6144 || i.types[op].bitfield.regsimd
40fb9820
L
6145 || i.types[op].bitfield.sreg2
6146 || i.types[op].bitfield.sreg3
6147 || i.types[op].bitfield.control
6148 || i.types[op].bitfield.debug
ca0d63fe 6149 || i.types[op].bitfield.test)
29b0f896 6150 {
a540244d
L
6151 as_bad (_("`%s%s' not allowed with `%s%c'"),
6152 register_prefix,
29b0f896
AM
6153 i.op[op].regs->reg_name,
6154 i.tm.name,
6155 i.suffix);
6156 return 0;
6157 }
6158 }
6159 return 1;
6160}
6161
6162static int
e3bb37b5 6163check_long_reg (void)
29b0f896
AM
6164{
6165 int op;
6166
6167 for (op = i.operands; --op >= 0;)
dc821c5f
JB
6168 /* Skip non-register operands. */
6169 if (!i.types[op].bitfield.reg)
6170 continue;
29b0f896
AM
6171 /* Reject eight bit registers, except where the template requires
6172 them. (eg. movzb) */
dc821c5f
JB
6173 else if (i.types[op].bitfield.byte
6174 && (i.tm.operand_types[op].bitfield.reg
6175 || i.tm.operand_types[op].bitfield.acc)
6176 && (i.tm.operand_types[op].bitfield.word
6177 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6178 {
a540244d
L
6179 as_bad (_("`%s%s' not allowed with `%s%c'"),
6180 register_prefix,
29b0f896
AM
6181 i.op[op].regs->reg_name,
6182 i.tm.name,
6183 i.suffix);
6184 return 0;
6185 }
e4630f71 6186 /* Warn if the e prefix on a general reg is missing. */
29b0f896 6187 else if ((!quiet_warnings || flag_code == CODE_64BIT)
dc821c5f
JB
6188 && i.types[op].bitfield.word
6189 && (i.tm.operand_types[op].bitfield.reg
6190 || i.tm.operand_types[op].bitfield.acc)
6191 && i.tm.operand_types[op].bitfield.dword)
29b0f896
AM
6192 {
6193 /* Prohibit these changes in the 64bit mode, since the
6194 lowering is more complicated. */
6195 if (flag_code == CODE_64BIT)
252b5132 6196 {
2b5d6a91 6197 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
2ca3ace5 6198 register_prefix, i.op[op].regs->reg_name,
29b0f896
AM
6199 i.suffix);
6200 return 0;
252b5132 6201 }
29b0f896 6202#if REGISTER_WARNINGS
cecf1424
JB
6203 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
6204 register_prefix,
6205 (i.op[op].regs + REGNAM_EAX - REGNAM_AX)->reg_name,
6206 register_prefix, i.op[op].regs->reg_name, i.suffix);
29b0f896 6207#endif
252b5132 6208 }
e4630f71 6209 /* Warn if the r prefix on a general reg is present. */
dc821c5f
JB
6210 else if (i.types[op].bitfield.qword
6211 && (i.tm.operand_types[op].bitfield.reg
6212 || i.tm.operand_types[op].bitfield.acc)
6213 && i.tm.operand_types[op].bitfield.dword)
252b5132 6214 {
34828aad 6215 if (intel_syntax
ca61edf2 6216 && i.tm.opcode_modifier.toqword
1b54b8d7 6217 && !i.types[0].bitfield.regsimd)
34828aad 6218 {
ca61edf2 6219 /* Convert to QWORD. We want REX byte. */
34828aad
L
6220 i.suffix = QWORD_MNEM_SUFFIX;
6221 }
6222 else
6223 {
2b5d6a91 6224 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
6225 register_prefix, i.op[op].regs->reg_name,
6226 i.suffix);
6227 return 0;
6228 }
29b0f896
AM
6229 }
6230 return 1;
6231}
252b5132 6232
29b0f896 6233static int
e3bb37b5 6234check_qword_reg (void)
29b0f896
AM
6235{
6236 int op;
252b5132 6237
29b0f896 6238 for (op = i.operands; --op >= 0; )
dc821c5f
JB
6239 /* Skip non-register operands. */
6240 if (!i.types[op].bitfield.reg)
6241 continue;
29b0f896
AM
6242 /* Reject eight bit registers, except where the template requires
6243 them. (eg. movzb) */
dc821c5f
JB
6244 else if (i.types[op].bitfield.byte
6245 && (i.tm.operand_types[op].bitfield.reg
6246 || i.tm.operand_types[op].bitfield.acc)
6247 && (i.tm.operand_types[op].bitfield.word
6248 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6249 {
a540244d
L
6250 as_bad (_("`%s%s' not allowed with `%s%c'"),
6251 register_prefix,
29b0f896
AM
6252 i.op[op].regs->reg_name,
6253 i.tm.name,
6254 i.suffix);
6255 return 0;
6256 }
e4630f71 6257 /* Warn if the r prefix on a general reg is missing. */
dc821c5f
JB
6258 else if ((i.types[op].bitfield.word
6259 || i.types[op].bitfield.dword)
6260 && (i.tm.operand_types[op].bitfield.reg
6261 || i.tm.operand_types[op].bitfield.acc)
6262 && i.tm.operand_types[op].bitfield.qword)
29b0f896
AM
6263 {
6264 /* Prohibit these changes in the 64bit mode, since the
6265 lowering is more complicated. */
34828aad 6266 if (intel_syntax
ca61edf2 6267 && i.tm.opcode_modifier.todword
1b54b8d7 6268 && !i.types[0].bitfield.regsimd)
34828aad 6269 {
ca61edf2 6270 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
6271 i.suffix = LONG_MNEM_SUFFIX;
6272 }
6273 else
6274 {
2b5d6a91 6275 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
34828aad
L
6276 register_prefix, i.op[op].regs->reg_name,
6277 i.suffix);
6278 return 0;
6279 }
252b5132 6280 }
29b0f896
AM
6281 return 1;
6282}
252b5132 6283
29b0f896 6284static int
e3bb37b5 6285check_word_reg (void)
29b0f896
AM
6286{
6287 int op;
6288 for (op = i.operands; --op >= 0;)
dc821c5f
JB
6289 /* Skip non-register operands. */
6290 if (!i.types[op].bitfield.reg)
6291 continue;
29b0f896
AM
6292 /* Reject eight bit registers, except where the template requires
6293 them. (eg. movzb) */
dc821c5f
JB
6294 else if (i.types[op].bitfield.byte
6295 && (i.tm.operand_types[op].bitfield.reg
6296 || i.tm.operand_types[op].bitfield.acc)
6297 && (i.tm.operand_types[op].bitfield.word
6298 || i.tm.operand_types[op].bitfield.dword))
29b0f896 6299 {
a540244d
L
6300 as_bad (_("`%s%s' not allowed with `%s%c'"),
6301 register_prefix,
29b0f896
AM
6302 i.op[op].regs->reg_name,
6303 i.tm.name,
6304 i.suffix);
6305 return 0;
6306 }
e4630f71 6307 /* Warn if the e or r prefix on a general reg is present. */
29b0f896 6308 else if ((!quiet_warnings || flag_code == CODE_64BIT)
dc821c5f
JB
6309 && (i.types[op].bitfield.dword
6310 || i.types[op].bitfield.qword)
6311 && (i.tm.operand_types[op].bitfield.reg
6312 || i.tm.operand_types[op].bitfield.acc)
6313 && i.tm.operand_types[op].bitfield.word)
252b5132 6314 {
29b0f896
AM
6315 /* Prohibit these changes in the 64bit mode, since the
6316 lowering is more complicated. */
6317 if (flag_code == CODE_64BIT)
252b5132 6318 {
2b5d6a91 6319 as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
2ca3ace5 6320 register_prefix, i.op[op].regs->reg_name,
29b0f896
AM
6321 i.suffix);
6322 return 0;
252b5132 6323 }
29b0f896 6324#if REGISTER_WARNINGS
cecf1424
JB
6325 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
6326 register_prefix,
6327 (i.op[op].regs + REGNAM_AX - REGNAM_EAX)->reg_name,
6328 register_prefix, i.op[op].regs->reg_name, i.suffix);
29b0f896
AM
6329#endif
6330 }
6331 return 1;
6332}
252b5132 6333
29b0f896 6334static int
40fb9820 6335update_imm (unsigned int j)
29b0f896 6336{
bc0844ae 6337 i386_operand_type overlap = i.types[j];
40fb9820
L
6338 if ((overlap.bitfield.imm8
6339 || overlap.bitfield.imm8s
6340 || overlap.bitfield.imm16
6341 || overlap.bitfield.imm32
6342 || overlap.bitfield.imm32s
6343 || overlap.bitfield.imm64)
0dfbf9d7
L
6344 && !operand_type_equal (&overlap, &imm8)
6345 && !operand_type_equal (&overlap, &imm8s)
6346 && !operand_type_equal (&overlap, &imm16)
6347 && !operand_type_equal (&overlap, &imm32)
6348 && !operand_type_equal (&overlap, &imm32s)
6349 && !operand_type_equal (&overlap, &imm64))
29b0f896
AM
6350 {
6351 if (i.suffix)
6352 {
40fb9820
L
6353 i386_operand_type temp;
6354
0dfbf9d7 6355 operand_type_set (&temp, 0);
7ab9ffdd 6356 if (i.suffix == BYTE_MNEM_SUFFIX)
40fb9820
L
6357 {
6358 temp.bitfield.imm8 = overlap.bitfield.imm8;
6359 temp.bitfield.imm8s = overlap.bitfield.imm8s;
6360 }
6361 else if (i.suffix == WORD_MNEM_SUFFIX)
6362 temp.bitfield.imm16 = overlap.bitfield.imm16;
6363 else if (i.suffix == QWORD_MNEM_SUFFIX)
6364 {
6365 temp.bitfield.imm64 = overlap.bitfield.imm64;
6366 temp.bitfield.imm32s = overlap.bitfield.imm32s;
6367 }
6368 else
6369 temp.bitfield.imm32 = overlap.bitfield.imm32;
6370 overlap = temp;
29b0f896 6371 }
0dfbf9d7
L
6372 else if (operand_type_equal (&overlap, &imm16_32_32s)
6373 || operand_type_equal (&overlap, &imm16_32)
6374 || operand_type_equal (&overlap, &imm16_32s))
29b0f896 6375 {
40fb9820 6376 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
65da13b5 6377 overlap = imm16;
40fb9820 6378 else
65da13b5 6379 overlap = imm32s;
29b0f896 6380 }
0dfbf9d7
L
6381 if (!operand_type_equal (&overlap, &imm8)
6382 && !operand_type_equal (&overlap, &imm8s)
6383 && !operand_type_equal (&overlap, &imm16)
6384 && !operand_type_equal (&overlap, &imm32)
6385 && !operand_type_equal (&overlap, &imm32s)
6386 && !operand_type_equal (&overlap, &imm64))
29b0f896 6387 {
4eed87de
AM
6388 as_bad (_("no instruction mnemonic suffix given; "
6389 "can't determine immediate size"));
29b0f896
AM
6390 return 0;
6391 }
6392 }
40fb9820 6393 i.types[j] = overlap;
29b0f896 6394
40fb9820
L
6395 return 1;
6396}
6397
6398static int
6399finalize_imm (void)
6400{
bc0844ae 6401 unsigned int j, n;
29b0f896 6402
bc0844ae
L
6403 /* Update the first 2 immediate operands. */
6404 n = i.operands > 2 ? 2 : i.operands;
6405 if (n)
6406 {
6407 for (j = 0; j < n; j++)
6408 if (update_imm (j) == 0)
6409 return 0;
40fb9820 6410
bc0844ae
L
6411 /* The 3rd operand can't be immediate operand. */
6412 gas_assert (operand_type_check (i.types[2], imm) == 0);
6413 }
29b0f896
AM
6414
6415 return 1;
6416}
6417
6418static int
e3bb37b5 6419process_operands (void)
29b0f896
AM
6420{
6421 /* Default segment register this instruction will use for memory
6422 accesses. 0 means unknown. This is only for optimizing out
6423 unnecessary segment overrides. */
6424 const seg_entry *default_seg = 0;
6425
2426c15f 6426 if (i.tm.opcode_modifier.sse2avx && i.tm.opcode_modifier.vexvvvv)
29b0f896 6427 {
91d6fa6a
NC
6428 unsigned int dupl = i.operands;
6429 unsigned int dest = dupl - 1;
9fcfb3d7
L
6430 unsigned int j;
6431
c0f3af97 6432 /* The destination must be an xmm register. */
9c2799c2 6433 gas_assert (i.reg_operands
91d6fa6a 6434 && MAX_OPERANDS > dupl
7ab9ffdd 6435 && operand_type_equal (&i.types[dest], &regxmm));
c0f3af97 6436
1b54b8d7
JB
6437 if (i.tm.operand_types[0].bitfield.acc
6438 && i.tm.operand_types[0].bitfield.xmmword)
e2ec9d29 6439 {
8cd7925b 6440 if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
c0f3af97
L
6441 {
6442 /* Keep xmm0 for instructions with VEX prefix and 3
6443 sources. */
1b54b8d7
JB
6444 i.tm.operand_types[0].bitfield.acc = 0;
6445 i.tm.operand_types[0].bitfield.regsimd = 1;
c0f3af97
L
6446 goto duplicate;
6447 }
e2ec9d29 6448 else
c0f3af97
L
6449 {
6450 /* We remove the first xmm0 and keep the number of
6451 operands unchanged, which in fact duplicates the
6452 destination. */
6453 for (j = 1; j < i.operands; j++)
6454 {
6455 i.op[j - 1] = i.op[j];
6456 i.types[j - 1] = i.types[j];
6457 i.tm.operand_types[j - 1] = i.tm.operand_types[j];
6458 }
6459 }
6460 }
6461 else if (i.tm.opcode_modifier.implicit1stxmm0)
7ab9ffdd 6462 {
91d6fa6a 6463 gas_assert ((MAX_OPERANDS - 1) > dupl
8cd7925b
L
6464 && (i.tm.opcode_modifier.vexsources
6465 == VEX3SOURCES));
c0f3af97
L
6466
6467 /* Add the implicit xmm0 for instructions with VEX prefix
6468 and 3 sources. */
6469 for (j = i.operands; j > 0; j--)
6470 {
6471 i.op[j] = i.op[j - 1];
6472 i.types[j] = i.types[j - 1];
6473 i.tm.operand_types[j] = i.tm.operand_types[j - 1];
6474 }
6475 i.op[0].regs
6476 = (const reg_entry *) hash_find (reg_hash, "xmm0");
7ab9ffdd 6477 i.types[0] = regxmm;
c0f3af97
L
6478 i.tm.operand_types[0] = regxmm;
6479
6480 i.operands += 2;
6481 i.reg_operands += 2;
6482 i.tm.operands += 2;
6483
91d6fa6a 6484 dupl++;
c0f3af97 6485 dest++;
91d6fa6a
NC
6486 i.op[dupl] = i.op[dest];
6487 i.types[dupl] = i.types[dest];
6488 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
e2ec9d29 6489 }
c0f3af97
L
6490 else
6491 {
6492duplicate:
6493 i.operands++;
6494 i.reg_operands++;
6495 i.tm.operands++;
6496
91d6fa6a
NC
6497 i.op[dupl] = i.op[dest];
6498 i.types[dupl] = i.types[dest];
6499 i.tm.operand_types[dupl] = i.tm.operand_types[dest];
c0f3af97
L
6500 }
6501
6502 if (i.tm.opcode_modifier.immext)
6503 process_immext ();
6504 }
1b54b8d7
JB
6505 else if (i.tm.operand_types[0].bitfield.acc
6506 && i.tm.operand_types[0].bitfield.xmmword)
c0f3af97
L
6507 {
6508 unsigned int j;
6509
9fcfb3d7
L
6510 for (j = 1; j < i.operands; j++)
6511 {
6512 i.op[j - 1] = i.op[j];
6513 i.types[j - 1] = i.types[j];
6514
6515 /* We need to adjust fields in i.tm since they are used by
6516 build_modrm_byte. */
6517 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
6518 }
6519
e2ec9d29
L
6520 i.operands--;
6521 i.reg_operands--;
e2ec9d29
L
6522 i.tm.operands--;
6523 }
920d2ddc
IT
6524 else if (i.tm.opcode_modifier.implicitquadgroup)
6525 {
a477a8c4
JB
6526 unsigned int regnum, first_reg_in_group, last_reg_in_group;
6527
920d2ddc 6528 /* The second operand must be {x,y,z}mmN, where N is a multiple of 4. */
10c17abd 6529 gas_assert (i.operands >= 2 && i.types[1].bitfield.regsimd);
a477a8c4
JB
6530 regnum = register_number (i.op[1].regs);
6531 first_reg_in_group = regnum & ~3;
6532 last_reg_in_group = first_reg_in_group + 3;
6533 if (regnum != first_reg_in_group)
6534 as_warn (_("source register `%s%s' implicitly denotes"
6535 " `%s%.3s%u' to `%s%.3s%u' source group in `%s'"),
6536 register_prefix, i.op[1].regs->reg_name,
6537 register_prefix, i.op[1].regs->reg_name, first_reg_in_group,
6538 register_prefix, i.op[1].regs->reg_name, last_reg_in_group,
6539 i.tm.name);
6540 }
e2ec9d29
L
6541 else if (i.tm.opcode_modifier.regkludge)
6542 {
6543 /* The imul $imm, %reg instruction is converted into
6544 imul $imm, %reg, %reg, and the clr %reg instruction
6545 is converted into xor %reg, %reg. */
6546
6547 unsigned int first_reg_op;
6548
6549 if (operand_type_check (i.types[0], reg))
6550 first_reg_op = 0;
6551 else
6552 first_reg_op = 1;
6553 /* Pretend we saw the extra register operand. */
9c2799c2 6554 gas_assert (i.reg_operands == 1
7ab9ffdd 6555 && i.op[first_reg_op + 1].regs == 0);
e2ec9d29
L
6556 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
6557 i.types[first_reg_op + 1] = i.types[first_reg_op];
6558 i.operands++;
6559 i.reg_operands++;
29b0f896
AM
6560 }
6561
40fb9820 6562 if (i.tm.opcode_modifier.shortform)
29b0f896 6563 {
40fb9820
L
6564 if (i.types[0].bitfield.sreg2
6565 || i.types[0].bitfield.sreg3)
29b0f896 6566 {
4eed87de
AM
6567 if (i.tm.base_opcode == POP_SEG_SHORT
6568 && i.op[0].regs->reg_num == 1)
29b0f896 6569 {
a87af027 6570 as_bad (_("you can't `pop %scs'"), register_prefix);
4eed87de 6571 return 0;
29b0f896 6572 }
4eed87de
AM
6573 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
6574 if ((i.op[0].regs->reg_flags & RegRex) != 0)
161a04f6 6575 i.rex |= REX_B;
4eed87de
AM
6576 }
6577 else
6578 {
7ab9ffdd 6579 /* The register or float register operand is in operand
85f10a01 6580 0 or 1. */
40fb9820 6581 unsigned int op;
7ab9ffdd 6582
ca0d63fe 6583 if ((i.types[0].bitfield.reg && i.types[0].bitfield.tbyte)
7ab9ffdd
L
6584 || operand_type_check (i.types[0], reg))
6585 op = 0;
6586 else
6587 op = 1;
4eed87de
AM
6588 /* Register goes in low 3 bits of opcode. */
6589 i.tm.base_opcode |= i.op[op].regs->reg_num;
6590 if ((i.op[op].regs->reg_flags & RegRex) != 0)
161a04f6 6591 i.rex |= REX_B;
40fb9820 6592 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896 6593 {
4eed87de
AM
6594 /* Warn about some common errors, but press on regardless.
6595 The first case can be generated by gcc (<= 2.8.1). */
6596 if (i.operands == 2)
6597 {
6598 /* Reversed arguments on faddp, fsubp, etc. */
a540244d 6599 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
d8a1b51e
JB
6600 register_prefix, i.op[!intel_syntax].regs->reg_name,
6601 register_prefix, i.op[intel_syntax].regs->reg_name);
4eed87de
AM
6602 }
6603 else
6604 {
6605 /* Extraneous `l' suffix on fp insn. */
a540244d
L
6606 as_warn (_("translating to `%s %s%s'"), i.tm.name,
6607 register_prefix, i.op[0].regs->reg_name);
4eed87de 6608 }
29b0f896
AM
6609 }
6610 }
6611 }
40fb9820 6612 else if (i.tm.opcode_modifier.modrm)
29b0f896
AM
6613 {
6614 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
6615 must be put into the modrm byte). Now, we make the modrm and
6616 index base bytes based on all the info we've collected. */
29b0f896
AM
6617
6618 default_seg = build_modrm_byte ();
6619 }
8a2ed489 6620 else if ((i.tm.base_opcode & ~0x3) == MOV_AX_DISP32)
29b0f896
AM
6621 {
6622 default_seg = &ds;
6623 }
40fb9820 6624 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
6625 {
6626 /* For the string instructions that allow a segment override
6627 on one of their operands, the default segment is ds. */
6628 default_seg = &ds;
6629 }
6630
75178d9d
L
6631 if (i.tm.base_opcode == 0x8d /* lea */
6632 && i.seg[0]
6633 && !quiet_warnings)
30123838 6634 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
52271982
AM
6635
6636 /* If a segment was explicitly specified, and the specified segment
6637 is not the default, use an opcode prefix to select it. If we
6638 never figured out what the default segment is, then default_seg
6639 will be zero at this point, and the specified segment prefix will
6640 always be used. */
29b0f896
AM
6641 if ((i.seg[0]) && (i.seg[0] != default_seg))
6642 {
6643 if (!add_prefix (i.seg[0]->seg_prefix))
6644 return 0;
6645 }
6646 return 1;
6647}
6648
6649static const seg_entry *
e3bb37b5 6650build_modrm_byte (void)
29b0f896
AM
6651{
6652 const seg_entry *default_seg = 0;
c0f3af97 6653 unsigned int source, dest;
8cd7925b 6654 int vex_3_sources;
c0f3af97 6655
8cd7925b 6656 vex_3_sources = i.tm.opcode_modifier.vexsources == VEX3SOURCES;
c0f3af97
L
6657 if (vex_3_sources)
6658 {
91d6fa6a 6659 unsigned int nds, reg_slot;
4c2c6516 6660 expressionS *exp;
c0f3af97 6661
6b8d3588 6662 dest = i.operands - 1;
c0f3af97 6663 nds = dest - 1;
922d8de8 6664
a683cc34 6665 /* There are 2 kinds of instructions:
bed3d976
JB
6666 1. 5 operands: 4 register operands or 3 register operands
6667 plus 1 memory operand plus one Vec_Imm4 operand, VexXDS, and
6668 VexW0 or VexW1. The destination must be either XMM, YMM or
43234a1e 6669 ZMM register.
bed3d976 6670 2. 4 operands: 4 register operands or 3 register operands
2f1bada2 6671 plus 1 memory operand, with VexXDS. */
922d8de8 6672 gas_assert ((i.reg_operands == 4
bed3d976
JB
6673 || (i.reg_operands == 3 && i.mem_operands == 1))
6674 && i.tm.opcode_modifier.vexvvvv == VEXXDS
dcd7e323
JB
6675 && i.tm.opcode_modifier.vexw
6676 && i.tm.operand_types[dest].bitfield.regsimd);
a683cc34 6677
48db9223
JB
6678 /* If VexW1 is set, the first non-immediate operand is the source and
6679 the second non-immediate one is encoded in the immediate operand. */
6680 if (i.tm.opcode_modifier.vexw == VEXW1)
6681 {
6682 source = i.imm_operands;
6683 reg_slot = i.imm_operands + 1;
6684 }
6685 else
6686 {
6687 source = i.imm_operands + 1;
6688 reg_slot = i.imm_operands;
6689 }
6690
a683cc34 6691 if (i.imm_operands == 0)
bed3d976
JB
6692 {
6693 /* When there is no immediate operand, generate an 8bit
6694 immediate operand to encode the first operand. */
6695 exp = &im_expressions[i.imm_operands++];
6696 i.op[i.operands].imms = exp;
6697 i.types[i.operands] = imm8;
6698 i.operands++;
6699
6700 gas_assert (i.tm.operand_types[reg_slot].bitfield.regsimd);
6701 exp->X_op = O_constant;
6702 exp->X_add_number = register_number (i.op[reg_slot].regs) << 4;
43234a1e
L
6703 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
6704 }
922d8de8 6705 else
bed3d976
JB
6706 {
6707 unsigned int imm_slot;
a683cc34 6708
2f1bada2
JB
6709 gas_assert (i.imm_operands == 1 && i.types[0].bitfield.vec_imm4);
6710
bed3d976
JB
6711 if (i.tm.opcode_modifier.immext)
6712 {
6713 /* When ImmExt is set, the immediate byte is the last
6714 operand. */
6715 imm_slot = i.operands - 1;
6716 source--;
6717 reg_slot--;
6718 }
6719 else
6720 {
6721 imm_slot = 0;
6722
6723 /* Turn on Imm8 so that output_imm will generate it. */
6724 i.types[imm_slot].bitfield.imm8 = 1;
6725 }
6726
6727 gas_assert (i.tm.operand_types[reg_slot].bitfield.regsimd);
6728 i.op[imm_slot].imms->X_add_number
6729 |= register_number (i.op[reg_slot].regs) << 4;
43234a1e 6730 gas_assert ((i.op[reg_slot].regs->reg_flags & RegVRex) == 0);
bed3d976 6731 }
a683cc34 6732
10c17abd 6733 gas_assert (i.tm.operand_types[nds].bitfield.regsimd);
dae39acc 6734 i.vex.register_specifier = i.op[nds].regs;
c0f3af97
L
6735 }
6736 else
6737 source = dest = 0;
29b0f896
AM
6738
6739 /* i.reg_operands MUST be the number of real register operands;
c0f3af97
L
6740 implicit registers do not count. If there are 3 register
6741 operands, it must be a instruction with VexNDS. For a
6742 instruction with VexNDD, the destination register is encoded
6743 in VEX prefix. If there are 4 register operands, it must be
6744 a instruction with VEX prefix and 3 sources. */
7ab9ffdd
L
6745 if (i.mem_operands == 0
6746 && ((i.reg_operands == 2
2426c15f 6747 && i.tm.opcode_modifier.vexvvvv <= VEXXDS)
7ab9ffdd 6748 || (i.reg_operands == 3
2426c15f 6749 && i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd 6750 || (i.reg_operands == 4 && vex_3_sources)))
29b0f896 6751 {
cab737b9
L
6752 switch (i.operands)
6753 {
6754 case 2:
6755 source = 0;
6756 break;
6757 case 3:
c81128dc
L
6758 /* When there are 3 operands, one of them may be immediate,
6759 which may be the first or the last operand. Otherwise,
c0f3af97
L
6760 the first operand must be shift count register (cl) or it
6761 is an instruction with VexNDS. */
9c2799c2 6762 gas_assert (i.imm_operands == 1
7ab9ffdd 6763 || (i.imm_operands == 0
2426c15f 6764 && (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd 6765 || i.types[0].bitfield.shiftcount)));
40fb9820
L
6766 if (operand_type_check (i.types[0], imm)
6767 || i.types[0].bitfield.shiftcount)
6768 source = 1;
6769 else
6770 source = 0;
cab737b9
L
6771 break;
6772 case 4:
368d64cc
L
6773 /* When there are 4 operands, the first two must be 8bit
6774 immediate operands. The source operand will be the 3rd
c0f3af97
L
6775 one.
6776
6777 For instructions with VexNDS, if the first operand
6778 an imm8, the source operand is the 2nd one. If the last
6779 operand is imm8, the source operand is the first one. */
9c2799c2 6780 gas_assert ((i.imm_operands == 2
7ab9ffdd
L
6781 && i.types[0].bitfield.imm8
6782 && i.types[1].bitfield.imm8)
2426c15f 6783 || (i.tm.opcode_modifier.vexvvvv == VEXXDS
7ab9ffdd
L
6784 && i.imm_operands == 1
6785 && (i.types[0].bitfield.imm8
43234a1e
L
6786 || i.types[i.operands - 1].bitfield.imm8
6787 || i.rounding)));
9f2670f2
L
6788 if (i.imm_operands == 2)
6789 source = 2;
6790 else
c0f3af97
L
6791 {
6792 if (i.types[0].bitfield.imm8)
6793 source = 1;
6794 else
6795 source = 0;
6796 }
c0f3af97
L
6797 break;
6798 case 5:
e771e7c9 6799 if (is_evex_encoding (&i.tm))
43234a1e
L
6800 {
6801 /* For EVEX instructions, when there are 5 operands, the
6802 first one must be immediate operand. If the second one
6803 is immediate operand, the source operand is the 3th
6804 one. If the last one is immediate operand, the source
6805 operand is the 2nd one. */
6806 gas_assert (i.imm_operands == 2
6807 && i.tm.opcode_modifier.sae
6808 && operand_type_check (i.types[0], imm));
6809 if (operand_type_check (i.types[1], imm))
6810 source = 2;
6811 else if (operand_type_check (i.types[4], imm))
6812 source = 1;
6813 else
6814 abort ();
6815 }
cab737b9
L
6816 break;
6817 default:
6818 abort ();
6819 }
6820
c0f3af97
L
6821 if (!vex_3_sources)
6822 {
6823 dest = source + 1;
6824
43234a1e
L
6825 /* RC/SAE operand could be between DEST and SRC. That happens
6826 when one operand is GPR and the other one is XMM/YMM/ZMM
6827 register. */
6828 if (i.rounding && i.rounding->operand == (int) dest)
6829 dest++;
6830
2426c15f 6831 if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
c0f3af97 6832 {
43234a1e 6833 /* For instructions with VexNDS, the register-only source
c5d0745b 6834 operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
43234a1e
L
6835 register. It is encoded in VEX prefix. We need to
6836 clear RegMem bit before calling operand_type_equal. */
f12dc422
L
6837
6838 i386_operand_type op;
6839 unsigned int vvvv;
6840
6841 /* Check register-only source operand when two source
6842 operands are swapped. */
6843 if (!i.tm.operand_types[source].bitfield.baseindex
6844 && i.tm.operand_types[dest].bitfield.baseindex)
6845 {
6846 vvvv = source;
6847 source = dest;
6848 }
6849 else
6850 vvvv = dest;
6851
6852 op = i.tm.operand_types[vvvv];
fa99fab2 6853 op.bitfield.regmem = 0;
c0f3af97 6854 if ((dest + 1) >= i.operands
dc821c5f
JB
6855 || ((!op.bitfield.reg
6856 || (!op.bitfield.dword && !op.bitfield.qword))
10c17abd 6857 && !op.bitfield.regsimd
43234a1e 6858 && !operand_type_equal (&op, &regmask)))
c0f3af97 6859 abort ();
f12dc422 6860 i.vex.register_specifier = i.op[vvvv].regs;
c0f3af97
L
6861 dest++;
6862 }
6863 }
29b0f896
AM
6864
6865 i.rm.mode = 3;
6866 /* One of the register operands will be encoded in the i.tm.reg
6867 field, the other in the combined i.tm.mode and i.tm.regmem
6868 fields. If no form of this instruction supports a memory
6869 destination operand, then we assume the source operand may
6870 sometimes be a memory operand and so we need to store the
6871 destination in the i.rm.reg field. */
40fb9820
L
6872 if (!i.tm.operand_types[dest].bitfield.regmem
6873 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
6874 {
6875 i.rm.reg = i.op[dest].regs->reg_num;
6876 i.rm.regmem = i.op[source].regs->reg_num;
6877 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 6878 i.rex |= REX_R;
43234a1e
L
6879 if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
6880 i.vrex |= REX_R;
29b0f896 6881 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 6882 i.rex |= REX_B;
43234a1e
L
6883 if ((i.op[source].regs->reg_flags & RegVRex) != 0)
6884 i.vrex |= REX_B;
29b0f896
AM
6885 }
6886 else
6887 {
6888 i.rm.reg = i.op[source].regs->reg_num;
6889 i.rm.regmem = i.op[dest].regs->reg_num;
6890 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 6891 i.rex |= REX_B;
43234a1e
L
6892 if ((i.op[dest].regs->reg_flags & RegVRex) != 0)
6893 i.vrex |= REX_B;
29b0f896 6894 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 6895 i.rex |= REX_R;
43234a1e
L
6896 if ((i.op[source].regs->reg_flags & RegVRex) != 0)
6897 i.vrex |= REX_R;
29b0f896 6898 }
e0c7f900 6899 if (flag_code != CODE_64BIT && (i.rex & REX_R))
c4a530c5 6900 {
e0c7f900 6901 if (!i.types[i.tm.operand_types[0].bitfield.regmem].bitfield.control)
c4a530c5 6902 abort ();
e0c7f900 6903 i.rex &= ~REX_R;
c4a530c5
JB
6904 add_prefix (LOCK_PREFIX_OPCODE);
6905 }
29b0f896
AM
6906 }
6907 else
6908 { /* If it's not 2 reg operands... */
c0f3af97
L
6909 unsigned int mem;
6910
29b0f896
AM
6911 if (i.mem_operands)
6912 {
6913 unsigned int fake_zero_displacement = 0;
99018f42 6914 unsigned int op;
4eed87de 6915
7ab9ffdd
L
6916 for (op = 0; op < i.operands; op++)
6917 if (operand_type_check (i.types[op], anymem))
6918 break;
7ab9ffdd 6919 gas_assert (op < i.operands);
29b0f896 6920
6c30d220
L
6921 if (i.tm.opcode_modifier.vecsib)
6922 {
6923 if (i.index_reg->reg_num == RegEiz
6924 || i.index_reg->reg_num == RegRiz)
6925 abort ();
6926
6927 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
6928 if (!i.base_reg)
6929 {
6930 i.sib.base = NO_BASE_REGISTER;
6931 i.sib.scale = i.log2_scale_factor;
6932 i.types[op].bitfield.disp8 = 0;
6933 i.types[op].bitfield.disp16 = 0;
6934 i.types[op].bitfield.disp64 = 0;
43083a50 6935 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
6c30d220
L
6936 {
6937 /* Must be 32 bit */
6938 i.types[op].bitfield.disp32 = 1;
6939 i.types[op].bitfield.disp32s = 0;
6940 }
6941 else
6942 {
6943 i.types[op].bitfield.disp32 = 0;
6944 i.types[op].bitfield.disp32s = 1;
6945 }
6946 }
6947 i.sib.index = i.index_reg->reg_num;
6948 if ((i.index_reg->reg_flags & RegRex) != 0)
6949 i.rex |= REX_X;
43234a1e
L
6950 if ((i.index_reg->reg_flags & RegVRex) != 0)
6951 i.vrex |= REX_X;
6c30d220
L
6952 }
6953
29b0f896
AM
6954 default_seg = &ds;
6955
6956 if (i.base_reg == 0)
6957 {
6958 i.rm.mode = 0;
6959 if (!i.disp_operands)
9bb129e8 6960 fake_zero_displacement = 1;
29b0f896
AM
6961 if (i.index_reg == 0)
6962 {
73053c1f
JB
6963 i386_operand_type newdisp;
6964
6c30d220 6965 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 6966 /* Operand is just <disp> */
20f0a1fc 6967 if (flag_code == CODE_64BIT)
29b0f896
AM
6968 {
6969 /* 64bit mode overwrites the 32bit absolute
6970 addressing by RIP relative addressing and
6971 absolute addressing is encoded by one of the
6972 redundant SIB forms. */
6973 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
6974 i.sib.base = NO_BASE_REGISTER;
6975 i.sib.index = NO_INDEX_REGISTER;
73053c1f 6976 newdisp = (!i.prefix[ADDR_PREFIX] ? disp32s : disp32);
20f0a1fc 6977 }
fc225355
L
6978 else if ((flag_code == CODE_16BIT)
6979 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
6980 {
6981 i.rm.regmem = NO_BASE_REGISTER_16;
73053c1f 6982 newdisp = disp16;
20f0a1fc
NC
6983 }
6984 else
6985 {
6986 i.rm.regmem = NO_BASE_REGISTER;
73053c1f 6987 newdisp = disp32;
29b0f896 6988 }
73053c1f
JB
6989 i.types[op] = operand_type_and_not (i.types[op], anydisp);
6990 i.types[op] = operand_type_or (i.types[op], newdisp);
29b0f896 6991 }
6c30d220 6992 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 6993 {
6c30d220 6994 /* !i.base_reg && i.index_reg */
db51cc60
L
6995 if (i.index_reg->reg_num == RegEiz
6996 || i.index_reg->reg_num == RegRiz)
6997 i.sib.index = NO_INDEX_REGISTER;
6998 else
6999 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
7000 i.sib.base = NO_BASE_REGISTER;
7001 i.sib.scale = i.log2_scale_factor;
7002 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
7003 i.types[op].bitfield.disp8 = 0;
7004 i.types[op].bitfield.disp16 = 0;
7005 i.types[op].bitfield.disp64 = 0;
43083a50 7006 if (flag_code != CODE_64BIT || i.prefix[ADDR_PREFIX])
40fb9820
L
7007 {
7008 /* Must be 32 bit */
7009 i.types[op].bitfield.disp32 = 1;
7010 i.types[op].bitfield.disp32s = 0;
7011 }
29b0f896 7012 else
40fb9820
L
7013 {
7014 i.types[op].bitfield.disp32 = 0;
7015 i.types[op].bitfield.disp32s = 1;
7016 }
29b0f896 7017 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 7018 i.rex |= REX_X;
29b0f896
AM
7019 }
7020 }
7021 /* RIP addressing for 64bit mode. */
9a04903e
JB
7022 else if (i.base_reg->reg_num == RegRip ||
7023 i.base_reg->reg_num == RegEip)
29b0f896 7024 {
6c30d220 7025 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896 7026 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
7027 i.types[op].bitfield.disp8 = 0;
7028 i.types[op].bitfield.disp16 = 0;
7029 i.types[op].bitfield.disp32 = 0;
7030 i.types[op].bitfield.disp32s = 1;
7031 i.types[op].bitfield.disp64 = 0;
71903a11 7032 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
7033 if (! i.disp_operands)
7034 fake_zero_displacement = 1;
29b0f896 7035 }
dc821c5f 7036 else if (i.base_reg->reg_type.bitfield.word)
29b0f896 7037 {
6c30d220 7038 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
7039 switch (i.base_reg->reg_num)
7040 {
7041 case 3: /* (%bx) */
7042 if (i.index_reg == 0)
7043 i.rm.regmem = 7;
7044 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
7045 i.rm.regmem = i.index_reg->reg_num - 6;
7046 break;
7047 case 5: /* (%bp) */
7048 default_seg = &ss;
7049 if (i.index_reg == 0)
7050 {
7051 i.rm.regmem = 6;
40fb9820 7052 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
7053 {
7054 /* fake (%bp) into 0(%bp) */
b5014f7a 7055 i.types[op].bitfield.disp8 = 1;
252b5132 7056 fake_zero_displacement = 1;
29b0f896
AM
7057 }
7058 }
7059 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
7060 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
7061 break;
7062 default: /* (%si) -> 4 or (%di) -> 5 */
7063 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
7064 }
7065 i.rm.mode = mode_from_disp_size (i.types[op]);
7066 }
7067 else /* i.base_reg and 32/64 bit mode */
7068 {
7069 if (flag_code == CODE_64BIT
40fb9820
L
7070 && operand_type_check (i.types[op], disp))
7071 {
73053c1f
JB
7072 i.types[op].bitfield.disp16 = 0;
7073 i.types[op].bitfield.disp64 = 0;
40fb9820 7074 if (i.prefix[ADDR_PREFIX] == 0)
73053c1f
JB
7075 {
7076 i.types[op].bitfield.disp32 = 0;
7077 i.types[op].bitfield.disp32s = 1;
7078 }
40fb9820 7079 else
73053c1f
JB
7080 {
7081 i.types[op].bitfield.disp32 = 1;
7082 i.types[op].bitfield.disp32s = 0;
7083 }
40fb9820 7084 }
20f0a1fc 7085
6c30d220
L
7086 if (!i.tm.opcode_modifier.vecsib)
7087 i.rm.regmem = i.base_reg->reg_num;
29b0f896 7088 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 7089 i.rex |= REX_B;
29b0f896
AM
7090 i.sib.base = i.base_reg->reg_num;
7091 /* x86-64 ignores REX prefix bit here to avoid decoder
7092 complications. */
848930b2
JB
7093 if (!(i.base_reg->reg_flags & RegRex)
7094 && (i.base_reg->reg_num == EBP_REG_NUM
7095 || i.base_reg->reg_num == ESP_REG_NUM))
29b0f896 7096 default_seg = &ss;
848930b2 7097 if (i.base_reg->reg_num == 5 && i.disp_operands == 0)
29b0f896 7098 {
848930b2 7099 fake_zero_displacement = 1;
b5014f7a 7100 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
7101 }
7102 i.sib.scale = i.log2_scale_factor;
7103 if (i.index_reg == 0)
7104 {
6c30d220 7105 gas_assert (!i.tm.opcode_modifier.vecsib);
29b0f896
AM
7106 /* <disp>(%esp) becomes two byte modrm with no index
7107 register. We've already stored the code for esp
7108 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
7109 Any base register besides %esp will not use the
7110 extra modrm byte. */
7111 i.sib.index = NO_INDEX_REGISTER;
29b0f896 7112 }
6c30d220 7113 else if (!i.tm.opcode_modifier.vecsib)
29b0f896 7114 {
db51cc60
L
7115 if (i.index_reg->reg_num == RegEiz
7116 || i.index_reg->reg_num == RegRiz)
7117 i.sib.index = NO_INDEX_REGISTER;
7118 else
7119 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
7120 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
7121 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 7122 i.rex |= REX_X;
29b0f896 7123 }
67a4f2b7
AO
7124
7125 if (i.disp_operands
7126 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
7127 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
7128 i.rm.mode = 0;
7129 else
a501d77e
L
7130 {
7131 if (!fake_zero_displacement
7132 && !i.disp_operands
7133 && i.disp_encoding)
7134 {
7135 fake_zero_displacement = 1;
7136 if (i.disp_encoding == disp_encoding_8bit)
7137 i.types[op].bitfield.disp8 = 1;
7138 else
7139 i.types[op].bitfield.disp32 = 1;
7140 }
7141 i.rm.mode = mode_from_disp_size (i.types[op]);
7142 }
29b0f896 7143 }
252b5132 7144
29b0f896
AM
7145 if (fake_zero_displacement)
7146 {
7147 /* Fakes a zero displacement assuming that i.types[op]
7148 holds the correct displacement size. */
7149 expressionS *exp;
7150
9c2799c2 7151 gas_assert (i.op[op].disps == 0);
29b0f896
AM
7152 exp = &disp_expressions[i.disp_operands++];
7153 i.op[op].disps = exp;
7154 exp->X_op = O_constant;
7155 exp->X_add_number = 0;
7156 exp->X_add_symbol = (symbolS *) 0;
7157 exp->X_op_symbol = (symbolS *) 0;
7158 }
c0f3af97
L
7159
7160 mem = op;
29b0f896 7161 }
c0f3af97
L
7162 else
7163 mem = ~0;
252b5132 7164
8c43a48b 7165 if (i.tm.opcode_modifier.vexsources == XOP2SOURCES)
5dd85c99
SP
7166 {
7167 if (operand_type_check (i.types[0], imm))
7168 i.vex.register_specifier = NULL;
7169 else
7170 {
7171 /* VEX.vvvv encodes one of the sources when the first
7172 operand is not an immediate. */
1ef99a7b 7173 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
7174 i.vex.register_specifier = i.op[0].regs;
7175 else
7176 i.vex.register_specifier = i.op[1].regs;
7177 }
7178
7179 /* Destination is a XMM register encoded in the ModRM.reg
7180 and VEX.R bit. */
7181 i.rm.reg = i.op[2].regs->reg_num;
7182 if ((i.op[2].regs->reg_flags & RegRex) != 0)
7183 i.rex |= REX_R;
7184
7185 /* ModRM.rm and VEX.B encodes the other source. */
7186 if (!i.mem_operands)
7187 {
7188 i.rm.mode = 3;
7189
1ef99a7b 7190 if (i.tm.opcode_modifier.vexw == VEXW0)
5dd85c99
SP
7191 i.rm.regmem = i.op[1].regs->reg_num;
7192 else
7193 i.rm.regmem = i.op[0].regs->reg_num;
7194
7195 if ((i.op[1].regs->reg_flags & RegRex) != 0)
7196 i.rex |= REX_B;
7197 }
7198 }
2426c15f 7199 else if (i.tm.opcode_modifier.vexvvvv == VEXLWP)
f88c9eb0
SP
7200 {
7201 i.vex.register_specifier = i.op[2].regs;
7202 if (!i.mem_operands)
7203 {
7204 i.rm.mode = 3;
7205 i.rm.regmem = i.op[1].regs->reg_num;
7206 if ((i.op[1].regs->reg_flags & RegRex) != 0)
7207 i.rex |= REX_B;
7208 }
7209 }
29b0f896
AM
7210 /* Fill in i.rm.reg or i.rm.regmem field with register operand
7211 (if any) based on i.tm.extension_opcode. Again, we must be
7212 careful to make sure that segment/control/debug/test/MMX
7213 registers are coded into the i.rm.reg field. */
f88c9eb0 7214 else if (i.reg_operands)
29b0f896 7215 {
99018f42 7216 unsigned int op;
7ab9ffdd
L
7217 unsigned int vex_reg = ~0;
7218
7219 for (op = 0; op < i.operands; op++)
dc821c5f 7220 if (i.types[op].bitfield.reg
7ab9ffdd 7221 || i.types[op].bitfield.regmmx
1b54b8d7 7222 || i.types[op].bitfield.regsimd
7e8b059b 7223 || i.types[op].bitfield.regbnd
43234a1e 7224 || i.types[op].bitfield.regmask
7ab9ffdd
L
7225 || i.types[op].bitfield.sreg2
7226 || i.types[op].bitfield.sreg3
7227 || i.types[op].bitfield.control
7228 || i.types[op].bitfield.debug
7229 || i.types[op].bitfield.test)
7230 break;
c0209578 7231
7ab9ffdd
L
7232 if (vex_3_sources)
7233 op = dest;
2426c15f 7234 else if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
7ab9ffdd
L
7235 {
7236 /* For instructions with VexNDS, the register-only
7237 source operand is encoded in VEX prefix. */
7238 gas_assert (mem != (unsigned int) ~0);
c0f3af97 7239
7ab9ffdd 7240 if (op > mem)
c0f3af97 7241 {
7ab9ffdd
L
7242 vex_reg = op++;
7243 gas_assert (op < i.operands);
c0f3af97
L
7244 }
7245 else
c0f3af97 7246 {
f12dc422
L
7247 /* Check register-only source operand when two source
7248 operands are swapped. */
7249 if (!i.tm.operand_types[op].bitfield.baseindex
7250 && i.tm.operand_types[op + 1].bitfield.baseindex)
7251 {
7252 vex_reg = op;
7253 op += 2;
7254 gas_assert (mem == (vex_reg + 1)
7255 && op < i.operands);
7256 }
7257 else
7258 {
7259 vex_reg = op + 1;
7260 gas_assert (vex_reg < i.operands);
7261 }
c0f3af97 7262 }
7ab9ffdd 7263 }
2426c15f 7264 else if (i.tm.opcode_modifier.vexvvvv == VEXNDD)
7ab9ffdd 7265 {
f12dc422 7266 /* For instructions with VexNDD, the register destination
7ab9ffdd 7267 is encoded in VEX prefix. */
f12dc422
L
7268 if (i.mem_operands == 0)
7269 {
7270 /* There is no memory operand. */
7271 gas_assert ((op + 2) == i.operands);
7272 vex_reg = op + 1;
7273 }
7274 else
8d63c93e 7275 {
ed438a93
JB
7276 /* There are only 2 non-immediate operands. */
7277 gas_assert (op < i.imm_operands + 2
7278 && i.operands == i.imm_operands + 2);
7279 vex_reg = i.imm_operands + 1;
f12dc422 7280 }
7ab9ffdd
L
7281 }
7282 else
7283 gas_assert (op < i.operands);
99018f42 7284
7ab9ffdd
L
7285 if (vex_reg != (unsigned int) ~0)
7286 {
f12dc422 7287 i386_operand_type *type = &i.tm.operand_types[vex_reg];
7ab9ffdd 7288
dc821c5f
JB
7289 if ((!type->bitfield.reg
7290 || (!type->bitfield.dword && !type->bitfield.qword))
10c17abd 7291 && !type->bitfield.regsimd
43234a1e 7292 && !operand_type_equal (type, &regmask))
7ab9ffdd 7293 abort ();
f88c9eb0 7294
7ab9ffdd
L
7295 i.vex.register_specifier = i.op[vex_reg].regs;
7296 }
7297
1b9f0c97
L
7298 /* Don't set OP operand twice. */
7299 if (vex_reg != op)
7ab9ffdd 7300 {
1b9f0c97
L
7301 /* If there is an extension opcode to put here, the
7302 register number must be put into the regmem field. */
7303 if (i.tm.extension_opcode != None)
7304 {
7305 i.rm.regmem = i.op[op].regs->reg_num;
7306 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7307 i.rex |= REX_B;
43234a1e
L
7308 if ((i.op[op].regs->reg_flags & RegVRex) != 0)
7309 i.vrex |= REX_B;
1b9f0c97
L
7310 }
7311 else
7312 {
7313 i.rm.reg = i.op[op].regs->reg_num;
7314 if ((i.op[op].regs->reg_flags & RegRex) != 0)
7315 i.rex |= REX_R;
43234a1e
L
7316 if ((i.op[op].regs->reg_flags & RegVRex) != 0)
7317 i.vrex |= REX_R;
1b9f0c97 7318 }
7ab9ffdd 7319 }
252b5132 7320
29b0f896
AM
7321 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
7322 must set it to 3 to indicate this is a register operand
7323 in the regmem field. */
7324 if (!i.mem_operands)
7325 i.rm.mode = 3;
7326 }
252b5132 7327
29b0f896 7328 /* Fill in i.rm.reg field with extension opcode (if any). */
c1e679ec 7329 if (i.tm.extension_opcode != None)
29b0f896
AM
7330 i.rm.reg = i.tm.extension_opcode;
7331 }
7332 return default_seg;
7333}
252b5132 7334
29b0f896 7335static void
e3bb37b5 7336output_branch (void)
29b0f896
AM
7337{
7338 char *p;
f8a5c266 7339 int size;
29b0f896
AM
7340 int code16;
7341 int prefix;
7342 relax_substateT subtype;
7343 symbolS *sym;
7344 offsetT off;
7345
f8a5c266 7346 code16 = flag_code == CODE_16BIT ? CODE16 : 0;
a501d77e 7347 size = i.disp_encoding == disp_encoding_32bit ? BIG : SMALL;
29b0f896
AM
7348
7349 prefix = 0;
7350 if (i.prefix[DATA_PREFIX] != 0)
252b5132 7351 {
29b0f896
AM
7352 prefix = 1;
7353 i.prefixes -= 1;
7354 code16 ^= CODE16;
252b5132 7355 }
29b0f896
AM
7356 /* Pentium4 branch hints. */
7357 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
7358 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 7359 {
29b0f896
AM
7360 prefix++;
7361 i.prefixes--;
7362 }
7363 if (i.prefix[REX_PREFIX] != 0)
7364 {
7365 prefix++;
7366 i.prefixes--;
2f66722d
AM
7367 }
7368
7e8b059b
L
7369 /* BND prefixed jump. */
7370 if (i.prefix[BND_PREFIX] != 0)
7371 {
7372 FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
7373 i.prefixes -= 1;
7374 }
7375
29b0f896
AM
7376 if (i.prefixes != 0 && !intel_syntax)
7377 as_warn (_("skipping prefixes on this instruction"));
7378
7379 /* It's always a symbol; End frag & setup for relax.
7380 Make sure there is enough room in this frag for the largest
7381 instruction we may generate in md_convert_frag. This is 2
7382 bytes for the opcode and room for the prefix and largest
7383 displacement. */
7384 frag_grow (prefix + 2 + 4);
7385 /* Prefix and 1 opcode byte go in fr_fix. */
7386 p = frag_more (prefix + 1);
7387 if (i.prefix[DATA_PREFIX] != 0)
7388 *p++ = DATA_PREFIX_OPCODE;
7389 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
7390 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
7391 *p++ = i.prefix[SEG_PREFIX];
7392 if (i.prefix[REX_PREFIX] != 0)
7393 *p++ = i.prefix[REX_PREFIX];
7394 *p = i.tm.base_opcode;
7395
7396 if ((unsigned char) *p == JUMP_PC_RELATIVE)
f8a5c266 7397 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, size);
40fb9820 7398 else if (cpu_arch_flags.bitfield.cpui386)
f8a5c266 7399 subtype = ENCODE_RELAX_STATE (COND_JUMP, size);
29b0f896 7400 else
f8a5c266 7401 subtype = ENCODE_RELAX_STATE (COND_JUMP86, size);
29b0f896 7402 subtype |= code16;
3e73aa7c 7403
29b0f896
AM
7404 sym = i.op[0].disps->X_add_symbol;
7405 off = i.op[0].disps->X_add_number;
3e73aa7c 7406
29b0f896
AM
7407 if (i.op[0].disps->X_op != O_constant
7408 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 7409 {
29b0f896
AM
7410 /* Handle complex expressions. */
7411 sym = make_expr_symbol (i.op[0].disps);
7412 off = 0;
7413 }
3e73aa7c 7414
29b0f896
AM
7415 /* 1 possible extra opcode + 4 byte displacement go in var part.
7416 Pass reloc in fr_var. */
d258b828 7417 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
29b0f896 7418}
3e73aa7c 7419
bd7ab16b
L
7420#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7421/* Return TRUE iff PLT32 relocation should be used for branching to
7422 symbol S. */
7423
7424static bfd_boolean
7425need_plt32_p (symbolS *s)
7426{
7427 /* PLT32 relocation is ELF only. */
7428 if (!IS_ELF)
7429 return FALSE;
7430
7431 /* Since there is no need to prepare for PLT branch on x86-64, we
7432 can generate R_X86_64_PLT32, instead of R_X86_64_PC32, which can
7433 be used as a marker for 32-bit PC-relative branches. */
7434 if (!object_64bit)
7435 return FALSE;
7436
7437 /* Weak or undefined symbol need PLT32 relocation. */
7438 if (S_IS_WEAK (s) || !S_IS_DEFINED (s))
7439 return TRUE;
7440
7441 /* Non-global symbol doesn't need PLT32 relocation. */
7442 if (! S_IS_EXTERNAL (s))
7443 return FALSE;
7444
7445 /* Other global symbols need PLT32 relocation. NB: Symbol with
7446 non-default visibilities are treated as normal global symbol
7447 so that PLT32 relocation can be used as a marker for 32-bit
7448 PC-relative branches. It is useful for linker relaxation. */
7449 return TRUE;
7450}
7451#endif
7452
29b0f896 7453static void
e3bb37b5 7454output_jump (void)
29b0f896
AM
7455{
7456 char *p;
7457 int size;
3e02c1cc 7458 fixS *fixP;
bd7ab16b 7459 bfd_reloc_code_real_type jump_reloc = i.reloc[0];
29b0f896 7460
40fb9820 7461 if (i.tm.opcode_modifier.jumpbyte)
29b0f896
AM
7462 {
7463 /* This is a loop or jecxz type instruction. */
7464 size = 1;
7465 if (i.prefix[ADDR_PREFIX] != 0)
7466 {
7467 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
7468 i.prefixes -= 1;
7469 }
7470 /* Pentium4 branch hints. */
7471 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
7472 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
7473 {
7474 FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
7475 i.prefixes--;
3e73aa7c
JH
7476 }
7477 }
29b0f896
AM
7478 else
7479 {
7480 int code16;
3e73aa7c 7481
29b0f896
AM
7482 code16 = 0;
7483 if (flag_code == CODE_16BIT)
7484 code16 = CODE16;
3e73aa7c 7485
29b0f896
AM
7486 if (i.prefix[DATA_PREFIX] != 0)
7487 {
7488 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
7489 i.prefixes -= 1;
7490 code16 ^= CODE16;
7491 }
252b5132 7492
29b0f896
AM
7493 size = 4;
7494 if (code16)
7495 size = 2;
7496 }
9fcc94b6 7497
29b0f896
AM
7498 if (i.prefix[REX_PREFIX] != 0)
7499 {
7500 FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
7501 i.prefixes -= 1;
7502 }
252b5132 7503
7e8b059b
L
7504 /* BND prefixed jump. */
7505 if (i.prefix[BND_PREFIX] != 0)
7506 {
7507 FRAG_APPEND_1_CHAR (i.prefix[BND_PREFIX]);
7508 i.prefixes -= 1;
7509 }
7510
29b0f896
AM
7511 if (i.prefixes != 0 && !intel_syntax)
7512 as_warn (_("skipping prefixes on this instruction"));
e0890092 7513
42164a71
L
7514 p = frag_more (i.tm.opcode_length + size);
7515 switch (i.tm.opcode_length)
7516 {
7517 case 2:
7518 *p++ = i.tm.base_opcode >> 8;
1a0670f3 7519 /* Fall through. */
42164a71
L
7520 case 1:
7521 *p++ = i.tm.base_opcode;
7522 break;
7523 default:
7524 abort ();
7525 }
e0890092 7526
bd7ab16b
L
7527#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7528 if (size == 4
7529 && jump_reloc == NO_RELOC
7530 && need_plt32_p (i.op[0].disps->X_add_symbol))
7531 jump_reloc = BFD_RELOC_X86_64_PLT32;
7532#endif
7533
7534 jump_reloc = reloc (size, 1, 1, jump_reloc);
7535
3e02c1cc 7536 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
bd7ab16b 7537 i.op[0].disps, 1, jump_reloc);
3e02c1cc
AM
7538
7539 /* All jumps handled here are signed, but don't use a signed limit
7540 check for 32 and 16 bit jumps as we want to allow wrap around at
7541 4G and 64k respectively. */
7542 if (size == 1)
7543 fixP->fx_signed = 1;
29b0f896 7544}
e0890092 7545
29b0f896 7546static void
e3bb37b5 7547output_interseg_jump (void)
29b0f896
AM
7548{
7549 char *p;
7550 int size;
7551 int prefix;
7552 int code16;
252b5132 7553
29b0f896
AM
7554 code16 = 0;
7555 if (flag_code == CODE_16BIT)
7556 code16 = CODE16;
a217f122 7557
29b0f896
AM
7558 prefix = 0;
7559 if (i.prefix[DATA_PREFIX] != 0)
7560 {
7561 prefix = 1;
7562 i.prefixes -= 1;
7563 code16 ^= CODE16;
7564 }
7565 if (i.prefix[REX_PREFIX] != 0)
7566 {
7567 prefix++;
7568 i.prefixes -= 1;
7569 }
252b5132 7570
29b0f896
AM
7571 size = 4;
7572 if (code16)
7573 size = 2;
252b5132 7574
29b0f896
AM
7575 if (i.prefixes != 0 && !intel_syntax)
7576 as_warn (_("skipping prefixes on this instruction"));
252b5132 7577
29b0f896
AM
7578 /* 1 opcode; 2 segment; offset */
7579 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 7580
29b0f896
AM
7581 if (i.prefix[DATA_PREFIX] != 0)
7582 *p++ = DATA_PREFIX_OPCODE;
252b5132 7583
29b0f896
AM
7584 if (i.prefix[REX_PREFIX] != 0)
7585 *p++ = i.prefix[REX_PREFIX];
252b5132 7586
29b0f896
AM
7587 *p++ = i.tm.base_opcode;
7588 if (i.op[1].imms->X_op == O_constant)
7589 {
7590 offsetT n = i.op[1].imms->X_add_number;
252b5132 7591
29b0f896
AM
7592 if (size == 2
7593 && !fits_in_unsigned_word (n)
7594 && !fits_in_signed_word (n))
7595 {
7596 as_bad (_("16-bit jump out of range"));
7597 return;
7598 }
7599 md_number_to_chars (p, n, size);
7600 }
7601 else
7602 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
d258b828 7603 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
29b0f896
AM
7604 if (i.op[0].imms->X_op != O_constant)
7605 as_bad (_("can't handle non absolute segment in `%s'"),
7606 i.tm.name);
7607 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
7608}
a217f122 7609
29b0f896 7610static void
e3bb37b5 7611output_insn (void)
29b0f896 7612{
2bbd9c25
JJ
7613 fragS *insn_start_frag;
7614 offsetT insn_start_off;
7615
29b0f896
AM
7616 /* Tie dwarf2 debug info to the address at the start of the insn.
7617 We can't do this after the insn has been output as the current
7618 frag may have been closed off. eg. by frag_var. */
7619 dwarf2_emit_insn (0);
7620
2bbd9c25
JJ
7621 insn_start_frag = frag_now;
7622 insn_start_off = frag_now_fix ();
7623
29b0f896 7624 /* Output jumps. */
40fb9820 7625 if (i.tm.opcode_modifier.jump)
29b0f896 7626 output_branch ();
40fb9820
L
7627 else if (i.tm.opcode_modifier.jumpbyte
7628 || i.tm.opcode_modifier.jumpdword)
29b0f896 7629 output_jump ();
40fb9820 7630 else if (i.tm.opcode_modifier.jumpintersegment)
29b0f896
AM
7631 output_interseg_jump ();
7632 else
7633 {
7634 /* Output normal instructions here. */
7635 char *p;
7636 unsigned char *q;
47465058 7637 unsigned int j;
331d2d0d 7638 unsigned int prefix;
4dffcebc 7639
e4e00185
AS
7640 if (avoid_fence
7641 && i.tm.base_opcode == 0xfae
7642 && i.operands == 1
7643 && i.imm_operands == 1
7644 && (i.op[0].imms->X_add_number == 0xe8
7645 || i.op[0].imms->X_add_number == 0xf0
7646 || i.op[0].imms->X_add_number == 0xf8))
7647 {
7648 /* Encode lfence, mfence, and sfence as
7649 f0 83 04 24 00 lock addl $0x0, (%{re}sp). */
7650 offsetT val = 0x240483f0ULL;
7651 p = frag_more (5);
7652 md_number_to_chars (p, val, 5);
7653 return;
7654 }
7655
d022bddd
IT
7656 /* Some processors fail on LOCK prefix. This options makes
7657 assembler ignore LOCK prefix and serves as a workaround. */
7658 if (omit_lock_prefix)
7659 {
7660 if (i.tm.base_opcode == LOCK_PREFIX_OPCODE)
7661 return;
7662 i.prefix[LOCK_PREFIX] = 0;
7663 }
7664
43234a1e
L
7665 /* Since the VEX/EVEX prefix contains the implicit prefix, we
7666 don't need the explicit prefix. */
7667 if (!i.tm.opcode_modifier.vex && !i.tm.opcode_modifier.evex)
bc4bd9ab 7668 {
c0f3af97 7669 switch (i.tm.opcode_length)
bc4bd9ab 7670 {
c0f3af97
L
7671 case 3:
7672 if (i.tm.base_opcode & 0xff000000)
4dffcebc 7673 {
c0f3af97 7674 prefix = (i.tm.base_opcode >> 24) & 0xff;
bd59a631 7675 add_prefix (prefix);
c0f3af97
L
7676 }
7677 break;
7678 case 2:
7679 if ((i.tm.base_opcode & 0xff0000) != 0)
7680 {
7681 prefix = (i.tm.base_opcode >> 16) & 0xff;
bd59a631
JB
7682 if (!i.tm.cpu_flags.bitfield.cpupadlock
7683 || prefix != REPE_PREFIX_OPCODE
7684 || (i.prefix[REP_PREFIX] != REPE_PREFIX_OPCODE))
4dffcebc
L
7685 add_prefix (prefix);
7686 }
c0f3af97
L
7687 break;
7688 case 1:
7689 break;
390c91cf
L
7690 case 0:
7691 /* Check for pseudo prefixes. */
7692 as_bad_where (insn_start_frag->fr_file,
7693 insn_start_frag->fr_line,
7694 _("pseudo prefix without instruction"));
7695 return;
c0f3af97
L
7696 default:
7697 abort ();
bc4bd9ab 7698 }
c0f3af97 7699
6d19a37a 7700#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
cf61b747
L
7701 /* For x32, add a dummy REX_OPCODE prefix for mov/add with
7702 R_X86_64_GOTTPOFF relocation so that linker can safely
7703 perform IE->LE optimization. */
7704 if (x86_elf_abi == X86_64_X32_ABI
7705 && i.operands == 2
7706 && i.reloc[0] == BFD_RELOC_X86_64_GOTTPOFF
7707 && i.prefix[REX_PREFIX] == 0)
7708 add_prefix (REX_OPCODE);
6d19a37a 7709#endif
cf61b747 7710
c0f3af97
L
7711 /* The prefix bytes. */
7712 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
7713 if (*q)
7714 FRAG_APPEND_1_CHAR (*q);
0f10071e 7715 }
ae5c1c7b 7716 else
c0f3af97
L
7717 {
7718 for (j = 0, q = i.prefix; j < ARRAY_SIZE (i.prefix); j++, q++)
7719 if (*q)
7720 switch (j)
7721 {
7722 case REX_PREFIX:
7723 /* REX byte is encoded in VEX prefix. */
7724 break;
7725 case SEG_PREFIX:
7726 case ADDR_PREFIX:
7727 FRAG_APPEND_1_CHAR (*q);
7728 break;
7729 default:
7730 /* There should be no other prefixes for instructions
7731 with VEX prefix. */
7732 abort ();
7733 }
7734
43234a1e
L
7735 /* For EVEX instructions i.vrex should become 0 after
7736 build_evex_prefix. For VEX instructions upper 16 registers
7737 aren't available, so VREX should be 0. */
7738 if (i.vrex)
7739 abort ();
c0f3af97
L
7740 /* Now the VEX prefix. */
7741 p = frag_more (i.vex.length);
7742 for (j = 0; j < i.vex.length; j++)
7743 p[j] = i.vex.bytes[j];
7744 }
252b5132 7745
29b0f896 7746 /* Now the opcode; be careful about word order here! */
4dffcebc 7747 if (i.tm.opcode_length == 1)
29b0f896
AM
7748 {
7749 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
7750 }
7751 else
7752 {
4dffcebc 7753 switch (i.tm.opcode_length)
331d2d0d 7754 {
43234a1e
L
7755 case 4:
7756 p = frag_more (4);
7757 *p++ = (i.tm.base_opcode >> 24) & 0xff;
7758 *p++ = (i.tm.base_opcode >> 16) & 0xff;
7759 break;
4dffcebc 7760 case 3:
331d2d0d
L
7761 p = frag_more (3);
7762 *p++ = (i.tm.base_opcode >> 16) & 0xff;
4dffcebc
L
7763 break;
7764 case 2:
7765 p = frag_more (2);
7766 break;
7767 default:
7768 abort ();
7769 break;
331d2d0d 7770 }
0f10071e 7771
29b0f896
AM
7772 /* Put out high byte first: can't use md_number_to_chars! */
7773 *p++ = (i.tm.base_opcode >> 8) & 0xff;
7774 *p = i.tm.base_opcode & 0xff;
7775 }
3e73aa7c 7776
29b0f896 7777 /* Now the modrm byte and sib byte (if present). */
40fb9820 7778 if (i.tm.opcode_modifier.modrm)
29b0f896 7779 {
4a3523fa
L
7780 FRAG_APPEND_1_CHAR ((i.rm.regmem << 0
7781 | i.rm.reg << 3
7782 | i.rm.mode << 6));
29b0f896
AM
7783 /* If i.rm.regmem == ESP (4)
7784 && i.rm.mode != (Register mode)
7785 && not 16 bit
7786 ==> need second modrm byte. */
7787 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
7788 && i.rm.mode != 3
dc821c5f 7789 && !(i.base_reg && i.base_reg->reg_type.bitfield.word))
4a3523fa
L
7790 FRAG_APPEND_1_CHAR ((i.sib.base << 0
7791 | i.sib.index << 3
7792 | i.sib.scale << 6));
29b0f896 7793 }
3e73aa7c 7794
29b0f896 7795 if (i.disp_operands)
2bbd9c25 7796 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 7797
29b0f896 7798 if (i.imm_operands)
2bbd9c25 7799 output_imm (insn_start_frag, insn_start_off);
29b0f896 7800 }
252b5132 7801
29b0f896
AM
7802#ifdef DEBUG386
7803 if (flag_debug)
7804 {
7b81dfbb 7805 pi ("" /*line*/, &i);
29b0f896
AM
7806 }
7807#endif /* DEBUG386 */
7808}
252b5132 7809
e205caa7
L
7810/* Return the size of the displacement operand N. */
7811
7812static int
7813disp_size (unsigned int n)
7814{
7815 int size = 4;
43234a1e 7816
b5014f7a 7817 if (i.types[n].bitfield.disp64)
40fb9820
L
7818 size = 8;
7819 else if (i.types[n].bitfield.disp8)
7820 size = 1;
7821 else if (i.types[n].bitfield.disp16)
7822 size = 2;
e205caa7
L
7823 return size;
7824}
7825
7826/* Return the size of the immediate operand N. */
7827
7828static int
7829imm_size (unsigned int n)
7830{
7831 int size = 4;
40fb9820
L
7832 if (i.types[n].bitfield.imm64)
7833 size = 8;
7834 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
7835 size = 1;
7836 else if (i.types[n].bitfield.imm16)
7837 size = 2;
e205caa7
L
7838 return size;
7839}
7840
29b0f896 7841static void
64e74474 7842output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
7843{
7844 char *p;
7845 unsigned int n;
252b5132 7846
29b0f896
AM
7847 for (n = 0; n < i.operands; n++)
7848 {
b5014f7a 7849 if (operand_type_check (i.types[n], disp))
29b0f896
AM
7850 {
7851 if (i.op[n].disps->X_op == O_constant)
7852 {
e205caa7 7853 int size = disp_size (n);
43234a1e 7854 offsetT val = i.op[n].disps->X_add_number;
252b5132 7855
b5014f7a 7856 val = offset_in_range (val >> i.memshift, size);
29b0f896
AM
7857 p = frag_more (size);
7858 md_number_to_chars (p, val, size);
7859 }
7860 else
7861 {
f86103b7 7862 enum bfd_reloc_code_real reloc_type;
e205caa7 7863 int size = disp_size (n);
40fb9820 7864 int sign = i.types[n].bitfield.disp32s;
29b0f896 7865 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
02a86693 7866 fixS *fixP;
29b0f896 7867
e205caa7 7868 /* We can't have 8 bit displacement here. */
9c2799c2 7869 gas_assert (!i.types[n].bitfield.disp8);
e205caa7 7870
29b0f896
AM
7871 /* The PC relative address is computed relative
7872 to the instruction boundary, so in case immediate
7873 fields follows, we need to adjust the value. */
7874 if (pcrel && i.imm_operands)
7875 {
29b0f896 7876 unsigned int n1;
e205caa7 7877 int sz = 0;
252b5132 7878
29b0f896 7879 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 7880 if (operand_type_check (i.types[n1], imm))
252b5132 7881 {
e205caa7
L
7882 /* Only one immediate is allowed for PC
7883 relative address. */
9c2799c2 7884 gas_assert (sz == 0);
e205caa7
L
7885 sz = imm_size (n1);
7886 i.op[n].disps->X_add_number -= sz;
252b5132 7887 }
29b0f896 7888 /* We should find the immediate. */
9c2799c2 7889 gas_assert (sz != 0);
29b0f896 7890 }
520dc8e8 7891
29b0f896 7892 p = frag_more (size);
d258b828 7893 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 7894 if (GOT_symbol
2bbd9c25 7895 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 7896 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
7897 || reloc_type == BFD_RELOC_X86_64_32S
7898 || (reloc_type == BFD_RELOC_64
7899 && object_64bit))
d6ab8113
JB
7900 && (i.op[n].disps->X_op == O_symbol
7901 || (i.op[n].disps->X_op == O_add
7902 && ((symbol_get_value_expression
7903 (i.op[n].disps->X_op_symbol)->X_op)
7904 == O_subtract))))
7905 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25
JJ
7906 {
7907 offsetT add;
7908
7909 if (insn_start_frag == frag_now)
7910 add = (p - frag_now->fr_literal) - insn_start_off;
7911 else
7912 {
7913 fragS *fr;
7914
7915 add = insn_start_frag->fr_fix - insn_start_off;
7916 for (fr = insn_start_frag->fr_next;
7917 fr && fr != frag_now; fr = fr->fr_next)
7918 add += fr->fr_fix;
7919 add += p - frag_now->fr_literal;
7920 }
7921
4fa24527 7922 if (!object_64bit)
7b81dfbb
AJ
7923 {
7924 reloc_type = BFD_RELOC_386_GOTPC;
7925 i.op[n].imms->X_add_number += add;
7926 }
7927 else if (reloc_type == BFD_RELOC_64)
7928 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 7929 else
7b81dfbb
AJ
7930 /* Don't do the adjustment for x86-64, as there
7931 the pcrel addressing is relative to the _next_
7932 insn, and that is taken care of in other code. */
d6ab8113 7933 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 7934 }
02a86693
L
7935 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal,
7936 size, i.op[n].disps, pcrel,
7937 reloc_type);
7938 /* Check for "call/jmp *mem", "mov mem, %reg",
7939 "test %reg, mem" and "binop mem, %reg" where binop
7940 is one of adc, add, and, cmp, or, sbb, sub, xor
0cb4071e
L
7941 instructions. Always generate R_386_GOT32X for
7942 "sym*GOT" operand in 32-bit mode. */
7943 if ((generate_relax_relocations
7944 || (!object_64bit
7945 && i.rm.mode == 0
7946 && i.rm.regmem == 5))
7947 && (i.rm.mode == 2
7948 || (i.rm.mode == 0 && i.rm.regmem == 5))
02a86693
L
7949 && ((i.operands == 1
7950 && i.tm.base_opcode == 0xff
7951 && (i.rm.reg == 2 || i.rm.reg == 4))
7952 || (i.operands == 2
7953 && (i.tm.base_opcode == 0x8b
7954 || i.tm.base_opcode == 0x85
7955 || (i.tm.base_opcode & 0xc7) == 0x03))))
7956 {
7957 if (object_64bit)
7958 {
7959 fixP->fx_tcbit = i.rex != 0;
7960 if (i.base_reg
7961 && (i.base_reg->reg_num == RegRip
7962 || i.base_reg->reg_num == RegEip))
7963 fixP->fx_tcbit2 = 1;
7964 }
7965 else
7966 fixP->fx_tcbit2 = 1;
7967 }
29b0f896
AM
7968 }
7969 }
7970 }
7971}
252b5132 7972
29b0f896 7973static void
64e74474 7974output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
7975{
7976 char *p;
7977 unsigned int n;
252b5132 7978
29b0f896
AM
7979 for (n = 0; n < i.operands; n++)
7980 {
43234a1e
L
7981 /* Skip SAE/RC Imm operand in EVEX. They are already handled. */
7982 if (i.rounding && (int) n == i.rounding->operand)
7983 continue;
7984
40fb9820 7985 if (operand_type_check (i.types[n], imm))
29b0f896
AM
7986 {
7987 if (i.op[n].imms->X_op == O_constant)
7988 {
e205caa7 7989 int size = imm_size (n);
29b0f896 7990 offsetT val;
b4cac588 7991
29b0f896
AM
7992 val = offset_in_range (i.op[n].imms->X_add_number,
7993 size);
7994 p = frag_more (size);
7995 md_number_to_chars (p, val, size);
7996 }
7997 else
7998 {
7999 /* Not absolute_section.
8000 Need a 32-bit fixup (don't support 8bit
8001 non-absolute imms). Try to support other
8002 sizes ... */
f86103b7 8003 enum bfd_reloc_code_real reloc_type;
e205caa7
L
8004 int size = imm_size (n);
8005 int sign;
29b0f896 8006
40fb9820 8007 if (i.types[n].bitfield.imm32s
a7d61044 8008 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 8009 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 8010 sign = 1;
e205caa7
L
8011 else
8012 sign = 0;
520dc8e8 8013
29b0f896 8014 p = frag_more (size);
d258b828 8015 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 8016
2bbd9c25
JJ
8017 /* This is tough to explain. We end up with this one if we
8018 * have operands that look like
8019 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
8020 * obtain the absolute address of the GOT, and it is strongly
8021 * preferable from a performance point of view to avoid using
8022 * a runtime relocation for this. The actual sequence of
8023 * instructions often look something like:
8024 *
8025 * call .L66
8026 * .L66:
8027 * popl %ebx
8028 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
8029 *
8030 * The call and pop essentially return the absolute address
8031 * of the label .L66 and store it in %ebx. The linker itself
8032 * will ultimately change the first operand of the addl so
8033 * that %ebx points to the GOT, but to keep things simple, the
8034 * .o file must have this operand set so that it generates not
8035 * the absolute address of .L66, but the absolute address of
8036 * itself. This allows the linker itself simply treat a GOTPC
8037 * relocation as asking for a pcrel offset to the GOT to be
8038 * added in, and the addend of the relocation is stored in the
8039 * operand field for the instruction itself.
8040 *
8041 * Our job here is to fix the operand so that it would add
8042 * the correct offset so that %ebx would point to itself. The
8043 * thing that is tricky is that .-.L66 will point to the
8044 * beginning of the instruction, so we need to further modify
8045 * the operand so that it will point to itself. There are
8046 * other cases where you have something like:
8047 *
8048 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
8049 *
8050 * and here no correction would be required. Internally in
8051 * the assembler we treat operands of this form as not being
8052 * pcrel since the '.' is explicitly mentioned, and I wonder
8053 * whether it would simplify matters to do it this way. Who
8054 * knows. In earlier versions of the PIC patches, the
8055 * pcrel_adjust field was used to store the correction, but
8056 * since the expression is not pcrel, I felt it would be
8057 * confusing to do it this way. */
8058
d6ab8113 8059 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
8060 || reloc_type == BFD_RELOC_X86_64_32S
8061 || reloc_type == BFD_RELOC_64)
29b0f896
AM
8062 && GOT_symbol
8063 && GOT_symbol == i.op[n].imms->X_add_symbol
8064 && (i.op[n].imms->X_op == O_symbol
8065 || (i.op[n].imms->X_op == O_add
8066 && ((symbol_get_value_expression
8067 (i.op[n].imms->X_op_symbol)->X_op)
8068 == O_subtract))))
8069 {
2bbd9c25
JJ
8070 offsetT add;
8071
8072 if (insn_start_frag == frag_now)
8073 add = (p - frag_now->fr_literal) - insn_start_off;
8074 else
8075 {
8076 fragS *fr;
8077
8078 add = insn_start_frag->fr_fix - insn_start_off;
8079 for (fr = insn_start_frag->fr_next;
8080 fr && fr != frag_now; fr = fr->fr_next)
8081 add += fr->fr_fix;
8082 add += p - frag_now->fr_literal;
8083 }
8084
4fa24527 8085 if (!object_64bit)
d6ab8113 8086 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 8087 else if (size == 4)
d6ab8113 8088 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
8089 else if (size == 8)
8090 reloc_type = BFD_RELOC_X86_64_GOTPC64;
2bbd9c25 8091 i.op[n].imms->X_add_number += add;
29b0f896 8092 }
29b0f896
AM
8093 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
8094 i.op[n].imms, 0, reloc_type);
8095 }
8096 }
8097 }
252b5132
RH
8098}
8099\f
d182319b
JB
8100/* x86_cons_fix_new is called via the expression parsing code when a
8101 reloc is needed. We use this hook to get the correct .got reloc. */
d182319b
JB
8102static int cons_sign = -1;
8103
8104void
e3bb37b5 8105x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
62ebcb5c 8106 expressionS *exp, bfd_reloc_code_real_type r)
d182319b 8107{
d258b828 8108 r = reloc (len, 0, cons_sign, r);
d182319b
JB
8109
8110#ifdef TE_PE
8111 if (exp->X_op == O_secrel)
8112 {
8113 exp->X_op = O_symbol;
8114 r = BFD_RELOC_32_SECREL;
8115 }
8116#endif
8117
8118 fix_new_exp (frag, off, len, exp, 0, r);
8119}
8120
357d1bd8
L
8121/* Export the ABI address size for use by TC_ADDRESS_BYTES for the
8122 purpose of the `.dc.a' internal pseudo-op. */
8123
8124int
8125x86_address_bytes (void)
8126{
8127 if ((stdoutput->arch_info->mach & bfd_mach_x64_32))
8128 return 4;
8129 return stdoutput->arch_info->bits_per_address / 8;
8130}
8131
d382c579
TG
8132#if !(defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (OBJ_MACH_O)) \
8133 || defined (LEX_AT)
d258b828 8134# define lex_got(reloc, adjust, types) NULL
718ddfc0 8135#else
f3c180ae
AM
8136/* Parse operands of the form
8137 <symbol>@GOTOFF+<nnn>
8138 and similar .plt or .got references.
8139
8140 If we find one, set up the correct relocation in RELOC and copy the
8141 input string, minus the `@GOTOFF' into a malloc'd buffer for
8142 parsing by the calling routine. Return this buffer, and if ADJUST
8143 is non-null set it to the length of the string we removed from the
8144 input line. Otherwise return NULL. */
8145static char *
91d6fa6a 8146lex_got (enum bfd_reloc_code_real *rel,
64e74474 8147 int *adjust,
d258b828 8148 i386_operand_type *types)
f3c180ae 8149{
7b81dfbb
AJ
8150 /* Some of the relocations depend on the size of what field is to
8151 be relocated. But in our callers i386_immediate and i386_displacement
8152 we don't yet know the operand size (this will be set by insn
8153 matching). Hence we record the word32 relocation here,
8154 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
8155 static const struct {
8156 const char *str;
cff8d58a 8157 int len;
4fa24527 8158 const enum bfd_reloc_code_real rel[2];
40fb9820 8159 const i386_operand_type types64;
f3c180ae 8160 } gotrel[] = {
8ce3d284 8161#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
8162 { STRING_COMMA_LEN ("SIZE"), { BFD_RELOC_SIZE32,
8163 BFD_RELOC_SIZE32 },
8164 OPERAND_TYPE_IMM32_64 },
8ce3d284 8165#endif
cff8d58a
L
8166 { STRING_COMMA_LEN ("PLTOFF"), { _dummy_first_bfd_reloc_code_real,
8167 BFD_RELOC_X86_64_PLTOFF64 },
40fb9820 8168 OPERAND_TYPE_IMM64 },
cff8d58a
L
8169 { STRING_COMMA_LEN ("PLT"), { BFD_RELOC_386_PLT32,
8170 BFD_RELOC_X86_64_PLT32 },
40fb9820 8171 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8172 { STRING_COMMA_LEN ("GOTPLT"), { _dummy_first_bfd_reloc_code_real,
8173 BFD_RELOC_X86_64_GOTPLT64 },
40fb9820 8174 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
8175 { STRING_COMMA_LEN ("GOTOFF"), { BFD_RELOC_386_GOTOFF,
8176 BFD_RELOC_X86_64_GOTOFF64 },
40fb9820 8177 OPERAND_TYPE_IMM64_DISP64 },
cff8d58a
L
8178 { STRING_COMMA_LEN ("GOTPCREL"), { _dummy_first_bfd_reloc_code_real,
8179 BFD_RELOC_X86_64_GOTPCREL },
40fb9820 8180 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8181 { STRING_COMMA_LEN ("TLSGD"), { BFD_RELOC_386_TLS_GD,
8182 BFD_RELOC_X86_64_TLSGD },
40fb9820 8183 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8184 { STRING_COMMA_LEN ("TLSLDM"), { BFD_RELOC_386_TLS_LDM,
8185 _dummy_first_bfd_reloc_code_real },
40fb9820 8186 OPERAND_TYPE_NONE },
cff8d58a
L
8187 { STRING_COMMA_LEN ("TLSLD"), { _dummy_first_bfd_reloc_code_real,
8188 BFD_RELOC_X86_64_TLSLD },
40fb9820 8189 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8190 { STRING_COMMA_LEN ("GOTTPOFF"), { BFD_RELOC_386_TLS_IE_32,
8191 BFD_RELOC_X86_64_GOTTPOFF },
40fb9820 8192 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8193 { STRING_COMMA_LEN ("TPOFF"), { BFD_RELOC_386_TLS_LE_32,
8194 BFD_RELOC_X86_64_TPOFF32 },
40fb9820 8195 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
8196 { STRING_COMMA_LEN ("NTPOFF"), { BFD_RELOC_386_TLS_LE,
8197 _dummy_first_bfd_reloc_code_real },
40fb9820 8198 OPERAND_TYPE_NONE },
cff8d58a
L
8199 { STRING_COMMA_LEN ("DTPOFF"), { BFD_RELOC_386_TLS_LDO_32,
8200 BFD_RELOC_X86_64_DTPOFF32 },
40fb9820 8201 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
cff8d58a
L
8202 { STRING_COMMA_LEN ("GOTNTPOFF"),{ BFD_RELOC_386_TLS_GOTIE,
8203 _dummy_first_bfd_reloc_code_real },
40fb9820 8204 OPERAND_TYPE_NONE },
cff8d58a
L
8205 { STRING_COMMA_LEN ("INDNTPOFF"),{ BFD_RELOC_386_TLS_IE,
8206 _dummy_first_bfd_reloc_code_real },
40fb9820 8207 OPERAND_TYPE_NONE },
cff8d58a
L
8208 { STRING_COMMA_LEN ("GOT"), { BFD_RELOC_386_GOT32,
8209 BFD_RELOC_X86_64_GOT32 },
40fb9820 8210 OPERAND_TYPE_IMM32_32S_64_DISP32 },
cff8d58a
L
8211 { STRING_COMMA_LEN ("TLSDESC"), { BFD_RELOC_386_TLS_GOTDESC,
8212 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
40fb9820 8213 OPERAND_TYPE_IMM32_32S_DISP32 },
cff8d58a
L
8214 { STRING_COMMA_LEN ("TLSCALL"), { BFD_RELOC_386_TLS_DESC_CALL,
8215 BFD_RELOC_X86_64_TLSDESC_CALL },
40fb9820 8216 OPERAND_TYPE_IMM32_32S_DISP32 },
f3c180ae
AM
8217 };
8218 char *cp;
8219 unsigned int j;
8220
d382c579 8221#if defined (OBJ_MAYBE_ELF)
718ddfc0
JB
8222 if (!IS_ELF)
8223 return NULL;
d382c579 8224#endif
718ddfc0 8225
f3c180ae 8226 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 8227 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
8228 return NULL;
8229
47465058 8230 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae 8231 {
cff8d58a 8232 int len = gotrel[j].len;
28f81592 8233 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 8234 {
4fa24527 8235 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 8236 {
28f81592
AM
8237 int first, second;
8238 char *tmpbuf, *past_reloc;
f3c180ae 8239
91d6fa6a 8240 *rel = gotrel[j].rel[object_64bit];
f3c180ae 8241
3956db08
JB
8242 if (types)
8243 {
8244 if (flag_code != CODE_64BIT)
40fb9820
L
8245 {
8246 types->bitfield.imm32 = 1;
8247 types->bitfield.disp32 = 1;
8248 }
3956db08
JB
8249 else
8250 *types = gotrel[j].types64;
8251 }
8252
8fd4256d 8253 if (j != 0 && GOT_symbol == NULL)
f3c180ae
AM
8254 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
8255
28f81592 8256 /* The length of the first part of our input line. */
f3c180ae 8257 first = cp - input_line_pointer;
28f81592
AM
8258
8259 /* The second part goes from after the reloc token until
67c11a9b 8260 (and including) an end_of_line char or comma. */
28f81592 8261 past_reloc = cp + 1 + len;
67c11a9b
AM
8262 cp = past_reloc;
8263 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
8264 ++cp;
8265 second = cp + 1 - past_reloc;
28f81592
AM
8266
8267 /* Allocate and copy string. The trailing NUL shouldn't
8268 be necessary, but be safe. */
add39d23 8269 tmpbuf = XNEWVEC (char, first + second + 2);
f3c180ae 8270 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
8271 if (second != 0 && *past_reloc != ' ')
8272 /* Replace the relocation token with ' ', so that
8273 errors like foo@GOTOFF1 will be detected. */
8274 tmpbuf[first++] = ' ';
af89796a
L
8275 else
8276 /* Increment length by 1 if the relocation token is
8277 removed. */
8278 len++;
8279 if (adjust)
8280 *adjust = len;
0787a12d
AM
8281 memcpy (tmpbuf + first, past_reloc, second);
8282 tmpbuf[first + second] = '\0';
f3c180ae
AM
8283 return tmpbuf;
8284 }
8285
4fa24527
JB
8286 as_bad (_("@%s reloc is not supported with %d-bit output format"),
8287 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
8288 return NULL;
8289 }
8290 }
8291
8292 /* Might be a symbol version string. Don't as_bad here. */
8293 return NULL;
8294}
4e4f7c87 8295#endif
f3c180ae 8296
a988325c
NC
8297#ifdef TE_PE
8298#ifdef lex_got
8299#undef lex_got
8300#endif
8301/* Parse operands of the form
8302 <symbol>@SECREL32+<nnn>
8303
8304 If we find one, set up the correct relocation in RELOC and copy the
8305 input string, minus the `@SECREL32' into a malloc'd buffer for
8306 parsing by the calling routine. Return this buffer, and if ADJUST
8307 is non-null set it to the length of the string we removed from the
34bca508
L
8308 input line. Otherwise return NULL.
8309
a988325c
NC
8310 This function is copied from the ELF version above adjusted for PE targets. */
8311
8312static char *
8313lex_got (enum bfd_reloc_code_real *rel ATTRIBUTE_UNUSED,
8314 int *adjust ATTRIBUTE_UNUSED,
d258b828 8315 i386_operand_type *types)
a988325c
NC
8316{
8317 static const struct
8318 {
8319 const char *str;
8320 int len;
8321 const enum bfd_reloc_code_real rel[2];
8322 const i386_operand_type types64;
8323 }
8324 gotrel[] =
8325 {
8326 { STRING_COMMA_LEN ("SECREL32"), { BFD_RELOC_32_SECREL,
8327 BFD_RELOC_32_SECREL },
8328 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
8329 };
8330
8331 char *cp;
8332 unsigned j;
8333
8334 for (cp = input_line_pointer; *cp != '@'; cp++)
8335 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
8336 return NULL;
8337
8338 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
8339 {
8340 int len = gotrel[j].len;
8341
8342 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
8343 {
8344 if (gotrel[j].rel[object_64bit] != 0)
8345 {
8346 int first, second;
8347 char *tmpbuf, *past_reloc;
8348
8349 *rel = gotrel[j].rel[object_64bit];
8350 if (adjust)
8351 *adjust = len;
8352
8353 if (types)
8354 {
8355 if (flag_code != CODE_64BIT)
8356 {
8357 types->bitfield.imm32 = 1;
8358 types->bitfield.disp32 = 1;
8359 }
8360 else
8361 *types = gotrel[j].types64;
8362 }
8363
8364 /* The length of the first part of our input line. */
8365 first = cp - input_line_pointer;
8366
8367 /* The second part goes from after the reloc token until
8368 (and including) an end_of_line char or comma. */
8369 past_reloc = cp + 1 + len;
8370 cp = past_reloc;
8371 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
8372 ++cp;
8373 second = cp + 1 - past_reloc;
8374
8375 /* Allocate and copy string. The trailing NUL shouldn't
8376 be necessary, but be safe. */
add39d23 8377 tmpbuf = XNEWVEC (char, first + second + 2);
a988325c
NC
8378 memcpy (tmpbuf, input_line_pointer, first);
8379 if (second != 0 && *past_reloc != ' ')
8380 /* Replace the relocation token with ' ', so that
8381 errors like foo@SECLREL321 will be detected. */
8382 tmpbuf[first++] = ' ';
8383 memcpy (tmpbuf + first, past_reloc, second);
8384 tmpbuf[first + second] = '\0';
8385 return tmpbuf;
8386 }
8387
8388 as_bad (_("@%s reloc is not supported with %d-bit output format"),
8389 gotrel[j].str, 1 << (5 + object_64bit));
8390 return NULL;
8391 }
8392 }
8393
8394 /* Might be a symbol version string. Don't as_bad here. */
8395 return NULL;
8396}
8397
8398#endif /* TE_PE */
8399
62ebcb5c 8400bfd_reloc_code_real_type
e3bb37b5 8401x86_cons (expressionS *exp, int size)
f3c180ae 8402{
62ebcb5c
AM
8403 bfd_reloc_code_real_type got_reloc = NO_RELOC;
8404
ee86248c
JB
8405 intel_syntax = -intel_syntax;
8406
3c7b9c2c 8407 exp->X_md = 0;
4fa24527 8408 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
8409 {
8410 /* Handle @GOTOFF and the like in an expression. */
8411 char *save;
8412 char *gotfree_input_line;
4a57f2cf 8413 int adjust = 0;
f3c180ae
AM
8414
8415 save = input_line_pointer;
d258b828 8416 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
8417 if (gotfree_input_line)
8418 input_line_pointer = gotfree_input_line;
8419
8420 expression (exp);
8421
8422 if (gotfree_input_line)
8423 {
8424 /* expression () has merrily parsed up to the end of line,
8425 or a comma - in the wrong buffer. Transfer how far
8426 input_line_pointer has moved to the right buffer. */
8427 input_line_pointer = (save
8428 + (input_line_pointer - gotfree_input_line)
8429 + adjust);
8430 free (gotfree_input_line);
3992d3b7
AM
8431 if (exp->X_op == O_constant
8432 || exp->X_op == O_absent
8433 || exp->X_op == O_illegal
0398aac5 8434 || exp->X_op == O_register
3992d3b7
AM
8435 || exp->X_op == O_big)
8436 {
8437 char c = *input_line_pointer;
8438 *input_line_pointer = 0;
8439 as_bad (_("missing or invalid expression `%s'"), save);
8440 *input_line_pointer = c;
8441 }
f3c180ae
AM
8442 }
8443 }
8444 else
8445 expression (exp);
ee86248c
JB
8446
8447 intel_syntax = -intel_syntax;
8448
8449 if (intel_syntax)
8450 i386_intel_simplify (exp);
62ebcb5c
AM
8451
8452 return got_reloc;
f3c180ae 8453}
f3c180ae 8454
9f32dd5b
L
8455static void
8456signed_cons (int size)
6482c264 8457{
d182319b
JB
8458 if (flag_code == CODE_64BIT)
8459 cons_sign = 1;
8460 cons (size);
8461 cons_sign = -1;
6482c264
NC
8462}
8463
d182319b 8464#ifdef TE_PE
6482c264 8465static void
7016a5d5 8466pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
6482c264
NC
8467{
8468 expressionS exp;
8469
8470 do
8471 {
8472 expression (&exp);
8473 if (exp.X_op == O_symbol)
8474 exp.X_op = O_secrel;
8475
8476 emit_expr (&exp, 4);
8477 }
8478 while (*input_line_pointer++ == ',');
8479
8480 input_line_pointer--;
8481 demand_empty_rest_of_line ();
8482}
6482c264
NC
8483#endif
8484
43234a1e
L
8485/* Handle Vector operations. */
8486
8487static char *
8488check_VecOperations (char *op_string, char *op_end)
8489{
8490 const reg_entry *mask;
8491 const char *saved;
8492 char *end_op;
8493
8494 while (*op_string
8495 && (op_end == NULL || op_string < op_end))
8496 {
8497 saved = op_string;
8498 if (*op_string == '{')
8499 {
8500 op_string++;
8501
8502 /* Check broadcasts. */
8503 if (strncmp (op_string, "1to", 3) == 0)
8504 {
8505 int bcst_type;
8506
8507 if (i.broadcast)
8508 goto duplicated_vec_op;
8509
8510 op_string += 3;
8511 if (*op_string == '8')
8e6e0792 8512 bcst_type = 8;
b28d1bda 8513 else if (*op_string == '4')
8e6e0792 8514 bcst_type = 4;
b28d1bda 8515 else if (*op_string == '2')
8e6e0792 8516 bcst_type = 2;
43234a1e
L
8517 else if (*op_string == '1'
8518 && *(op_string+1) == '6')
8519 {
8e6e0792 8520 bcst_type = 16;
43234a1e
L
8521 op_string++;
8522 }
8523 else
8524 {
8525 as_bad (_("Unsupported broadcast: `%s'"), saved);
8526 return NULL;
8527 }
8528 op_string++;
8529
8530 broadcast_op.type = bcst_type;
8531 broadcast_op.operand = this_operand;
8532 i.broadcast = &broadcast_op;
8533 }
8534 /* Check masking operation. */
8535 else if ((mask = parse_register (op_string, &end_op)) != NULL)
8536 {
8537 /* k0 can't be used for write mask. */
6d2cd6b2 8538 if (!mask->reg_type.bitfield.regmask || mask->reg_num == 0)
43234a1e 8539 {
6d2cd6b2
JB
8540 as_bad (_("`%s%s' can't be used for write mask"),
8541 register_prefix, mask->reg_name);
43234a1e
L
8542 return NULL;
8543 }
8544
8545 if (!i.mask)
8546 {
8547 mask_op.mask = mask;
8548 mask_op.zeroing = 0;
8549 mask_op.operand = this_operand;
8550 i.mask = &mask_op;
8551 }
8552 else
8553 {
8554 if (i.mask->mask)
8555 goto duplicated_vec_op;
8556
8557 i.mask->mask = mask;
8558
8559 /* Only "{z}" is allowed here. No need to check
8560 zeroing mask explicitly. */
8561 if (i.mask->operand != this_operand)
8562 {
8563 as_bad (_("invalid write mask `%s'"), saved);
8564 return NULL;
8565 }
8566 }
8567
8568 op_string = end_op;
8569 }
8570 /* Check zeroing-flag for masking operation. */
8571 else if (*op_string == 'z')
8572 {
8573 if (!i.mask)
8574 {
8575 mask_op.mask = NULL;
8576 mask_op.zeroing = 1;
8577 mask_op.operand = this_operand;
8578 i.mask = &mask_op;
8579 }
8580 else
8581 {
8582 if (i.mask->zeroing)
8583 {
8584 duplicated_vec_op:
8585 as_bad (_("duplicated `%s'"), saved);
8586 return NULL;
8587 }
8588
8589 i.mask->zeroing = 1;
8590
8591 /* Only "{%k}" is allowed here. No need to check mask
8592 register explicitly. */
8593 if (i.mask->operand != this_operand)
8594 {
8595 as_bad (_("invalid zeroing-masking `%s'"),
8596 saved);
8597 return NULL;
8598 }
8599 }
8600
8601 op_string++;
8602 }
8603 else
8604 goto unknown_vec_op;
8605
8606 if (*op_string != '}')
8607 {
8608 as_bad (_("missing `}' in `%s'"), saved);
8609 return NULL;
8610 }
8611 op_string++;
0ba3a731
L
8612
8613 /* Strip whitespace since the addition of pseudo prefixes
8614 changed how the scrubber treats '{'. */
8615 if (is_space_char (*op_string))
8616 ++op_string;
8617
43234a1e
L
8618 continue;
8619 }
8620 unknown_vec_op:
8621 /* We don't know this one. */
8622 as_bad (_("unknown vector operation: `%s'"), saved);
8623 return NULL;
8624 }
8625
6d2cd6b2
JB
8626 if (i.mask && i.mask->zeroing && !i.mask->mask)
8627 {
8628 as_bad (_("zeroing-masking only allowed with write mask"));
8629 return NULL;
8630 }
8631
43234a1e
L
8632 return op_string;
8633}
8634
252b5132 8635static int
70e41ade 8636i386_immediate (char *imm_start)
252b5132
RH
8637{
8638 char *save_input_line_pointer;
f3c180ae 8639 char *gotfree_input_line;
252b5132 8640 segT exp_seg = 0;
47926f60 8641 expressionS *exp;
40fb9820
L
8642 i386_operand_type types;
8643
0dfbf9d7 8644 operand_type_set (&types, ~0);
252b5132
RH
8645
8646 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
8647 {
31b2323c
L
8648 as_bad (_("at most %d immediate operands are allowed"),
8649 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
8650 return 0;
8651 }
8652
8653 exp = &im_expressions[i.imm_operands++];
520dc8e8 8654 i.op[this_operand].imms = exp;
252b5132
RH
8655
8656 if (is_space_char (*imm_start))
8657 ++imm_start;
8658
8659 save_input_line_pointer = input_line_pointer;
8660 input_line_pointer = imm_start;
8661
d258b828 8662 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
8663 if (gotfree_input_line)
8664 input_line_pointer = gotfree_input_line;
252b5132
RH
8665
8666 exp_seg = expression (exp);
8667
83183c0c 8668 SKIP_WHITESPACE ();
43234a1e
L
8669
8670 /* Handle vector operations. */
8671 if (*input_line_pointer == '{')
8672 {
8673 input_line_pointer = check_VecOperations (input_line_pointer,
8674 NULL);
8675 if (input_line_pointer == NULL)
8676 return 0;
8677 }
8678
252b5132 8679 if (*input_line_pointer)
f3c180ae 8680 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
8681
8682 input_line_pointer = save_input_line_pointer;
f3c180ae 8683 if (gotfree_input_line)
ee86248c
JB
8684 {
8685 free (gotfree_input_line);
8686
8687 if (exp->X_op == O_constant || exp->X_op == O_register)
8688 exp->X_op = O_illegal;
8689 }
8690
8691 return i386_finalize_immediate (exp_seg, exp, types, imm_start);
8692}
252b5132 8693
ee86248c
JB
8694static int
8695i386_finalize_immediate (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
8696 i386_operand_type types, const char *imm_start)
8697{
8698 if (exp->X_op == O_absent || exp->X_op == O_illegal || exp->X_op == O_big)
252b5132 8699 {
313c53d1
L
8700 if (imm_start)
8701 as_bad (_("missing or invalid immediate expression `%s'"),
8702 imm_start);
3992d3b7 8703 return 0;
252b5132 8704 }
3e73aa7c 8705 else if (exp->X_op == O_constant)
252b5132 8706 {
47926f60 8707 /* Size it properly later. */
40fb9820 8708 i.types[this_operand].bitfield.imm64 = 1;
13f864ae
L
8709 /* If not 64bit, sign extend val. */
8710 if (flag_code != CODE_64BIT
4eed87de
AM
8711 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
8712 exp->X_add_number
8713 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 8714 }
4c63da97 8715#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 8716 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 8717 && exp_seg != absolute_section
47926f60 8718 && exp_seg != text_section
24eab124
AM
8719 && exp_seg != data_section
8720 && exp_seg != bss_section
8721 && exp_seg != undefined_section
f86103b7 8722 && !bfd_is_com_section (exp_seg))
252b5132 8723 {
d0b47220 8724 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
8725 return 0;
8726 }
8727#endif
a841bdf5 8728 else if (!intel_syntax && exp_seg == reg_section)
bb8f5920 8729 {
313c53d1
L
8730 if (imm_start)
8731 as_bad (_("illegal immediate register operand %s"), imm_start);
bb8f5920
L
8732 return 0;
8733 }
252b5132
RH
8734 else
8735 {
8736 /* This is an address. The size of the address will be
24eab124 8737 determined later, depending on destination register,
3e73aa7c 8738 suffix, or the default for the section. */
40fb9820
L
8739 i.types[this_operand].bitfield.imm8 = 1;
8740 i.types[this_operand].bitfield.imm16 = 1;
8741 i.types[this_operand].bitfield.imm32 = 1;
8742 i.types[this_operand].bitfield.imm32s = 1;
8743 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
8744 i.types[this_operand] = operand_type_and (i.types[this_operand],
8745 types);
252b5132
RH
8746 }
8747
8748 return 1;
8749}
8750
551c1ca1 8751static char *
e3bb37b5 8752i386_scale (char *scale)
252b5132 8753{
551c1ca1
AM
8754 offsetT val;
8755 char *save = input_line_pointer;
252b5132 8756
551c1ca1
AM
8757 input_line_pointer = scale;
8758 val = get_absolute_expression ();
8759
8760 switch (val)
252b5132 8761 {
551c1ca1 8762 case 1:
252b5132
RH
8763 i.log2_scale_factor = 0;
8764 break;
551c1ca1 8765 case 2:
252b5132
RH
8766 i.log2_scale_factor = 1;
8767 break;
551c1ca1 8768 case 4:
252b5132
RH
8769 i.log2_scale_factor = 2;
8770 break;
551c1ca1 8771 case 8:
252b5132
RH
8772 i.log2_scale_factor = 3;
8773 break;
8774 default:
a724f0f4
JB
8775 {
8776 char sep = *input_line_pointer;
8777
8778 *input_line_pointer = '\0';
8779 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
8780 scale);
8781 *input_line_pointer = sep;
8782 input_line_pointer = save;
8783 return NULL;
8784 }
252b5132 8785 }
29b0f896 8786 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
8787 {
8788 as_warn (_("scale factor of %d without an index register"),
24eab124 8789 1 << i.log2_scale_factor);
252b5132 8790 i.log2_scale_factor = 0;
252b5132 8791 }
551c1ca1
AM
8792 scale = input_line_pointer;
8793 input_line_pointer = save;
8794 return scale;
252b5132
RH
8795}
8796
252b5132 8797static int
e3bb37b5 8798i386_displacement (char *disp_start, char *disp_end)
252b5132 8799{
29b0f896 8800 expressionS *exp;
252b5132
RH
8801 segT exp_seg = 0;
8802 char *save_input_line_pointer;
f3c180ae 8803 char *gotfree_input_line;
40fb9820
L
8804 int override;
8805 i386_operand_type bigdisp, types = anydisp;
3992d3b7 8806 int ret;
252b5132 8807
31b2323c
L
8808 if (i.disp_operands == MAX_MEMORY_OPERANDS)
8809 {
8810 as_bad (_("at most %d displacement operands are allowed"),
8811 MAX_MEMORY_OPERANDS);
8812 return 0;
8813 }
8814
0dfbf9d7 8815 operand_type_set (&bigdisp, 0);
40fb9820
L
8816 if ((i.types[this_operand].bitfield.jumpabsolute)
8817 || (!current_templates->start->opcode_modifier.jump
8818 && !current_templates->start->opcode_modifier.jumpdword))
e05278af 8819 {
40fb9820 8820 bigdisp.bitfield.disp32 = 1;
e05278af 8821 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
8822 if (flag_code == CODE_64BIT)
8823 {
8824 if (!override)
8825 {
8826 bigdisp.bitfield.disp32s = 1;
8827 bigdisp.bitfield.disp64 = 1;
8828 }
8829 }
8830 else if ((flag_code == CODE_16BIT) ^ override)
8831 {
8832 bigdisp.bitfield.disp32 = 0;
8833 bigdisp.bitfield.disp16 = 1;
8834 }
e05278af
JB
8835 }
8836 else
8837 {
8838 /* For PC-relative branches, the width of the displacement
8839 is dependent upon data size, not address size. */
e05278af 8840 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
8841 if (flag_code == CODE_64BIT)
8842 {
8843 if (override || i.suffix == WORD_MNEM_SUFFIX)
8844 bigdisp.bitfield.disp16 = 1;
8845 else
8846 {
8847 bigdisp.bitfield.disp32 = 1;
8848 bigdisp.bitfield.disp32s = 1;
8849 }
8850 }
8851 else
e05278af
JB
8852 {
8853 if (!override)
8854 override = (i.suffix == (flag_code != CODE_16BIT
8855 ? WORD_MNEM_SUFFIX
8856 : LONG_MNEM_SUFFIX));
40fb9820
L
8857 bigdisp.bitfield.disp32 = 1;
8858 if ((flag_code == CODE_16BIT) ^ override)
8859 {
8860 bigdisp.bitfield.disp32 = 0;
8861 bigdisp.bitfield.disp16 = 1;
8862 }
e05278af 8863 }
e05278af 8864 }
c6fb90c8
L
8865 i.types[this_operand] = operand_type_or (i.types[this_operand],
8866 bigdisp);
252b5132
RH
8867
8868 exp = &disp_expressions[i.disp_operands];
520dc8e8 8869 i.op[this_operand].disps = exp;
252b5132
RH
8870 i.disp_operands++;
8871 save_input_line_pointer = input_line_pointer;
8872 input_line_pointer = disp_start;
8873 END_STRING_AND_SAVE (disp_end);
8874
8875#ifndef GCC_ASM_O_HACK
8876#define GCC_ASM_O_HACK 0
8877#endif
8878#if GCC_ASM_O_HACK
8879 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 8880 if (i.types[this_operand].bitfield.baseIndex
24eab124 8881 && displacement_string_end[-1] == '+')
252b5132
RH
8882 {
8883 /* This hack is to avoid a warning when using the "o"
24eab124
AM
8884 constraint within gcc asm statements.
8885 For instance:
8886
8887 #define _set_tssldt_desc(n,addr,limit,type) \
8888 __asm__ __volatile__ ( \
8889 "movw %w2,%0\n\t" \
8890 "movw %w1,2+%0\n\t" \
8891 "rorl $16,%1\n\t" \
8892 "movb %b1,4+%0\n\t" \
8893 "movb %4,5+%0\n\t" \
8894 "movb $0,6+%0\n\t" \
8895 "movb %h1,7+%0\n\t" \
8896 "rorl $16,%1" \
8897 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
8898
8899 This works great except that the output assembler ends
8900 up looking a bit weird if it turns out that there is
8901 no offset. You end up producing code that looks like:
8902
8903 #APP
8904 movw $235,(%eax)
8905 movw %dx,2+(%eax)
8906 rorl $16,%edx
8907 movb %dl,4+(%eax)
8908 movb $137,5+(%eax)
8909 movb $0,6+(%eax)
8910 movb %dh,7+(%eax)
8911 rorl $16,%edx
8912 #NO_APP
8913
47926f60 8914 So here we provide the missing zero. */
24eab124
AM
8915
8916 *displacement_string_end = '0';
252b5132
RH
8917 }
8918#endif
d258b828 8919 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
8920 if (gotfree_input_line)
8921 input_line_pointer = gotfree_input_line;
252b5132 8922
24eab124 8923 exp_seg = expression (exp);
252b5132 8924
636c26b0
AM
8925 SKIP_WHITESPACE ();
8926 if (*input_line_pointer)
8927 as_bad (_("junk `%s' after expression"), input_line_pointer);
8928#if GCC_ASM_O_HACK
8929 RESTORE_END_STRING (disp_end + 1);
8930#endif
636c26b0 8931 input_line_pointer = save_input_line_pointer;
636c26b0 8932 if (gotfree_input_line)
ee86248c
JB
8933 {
8934 free (gotfree_input_line);
8935
8936 if (exp->X_op == O_constant || exp->X_op == O_register)
8937 exp->X_op = O_illegal;
8938 }
8939
8940 ret = i386_finalize_displacement (exp_seg, exp, types, disp_start);
8941
8942 RESTORE_END_STRING (disp_end);
8943
8944 return ret;
8945}
8946
8947static int
8948i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
8949 i386_operand_type types, const char *disp_start)
8950{
8951 i386_operand_type bigdisp;
8952 int ret = 1;
636c26b0 8953
24eab124
AM
8954 /* We do this to make sure that the section symbol is in
8955 the symbol table. We will ultimately change the relocation
47926f60 8956 to be relative to the beginning of the section. */
1ae12ab7 8957 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
8958 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
8959 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 8960 {
636c26b0 8961 if (exp->X_op != O_symbol)
3992d3b7 8962 goto inv_disp;
636c26b0 8963
e5cb08ac 8964 if (S_IS_LOCAL (exp->X_add_symbol)
c64efb4b
L
8965 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section
8966 && S_GET_SEGMENT (exp->X_add_symbol) != expr_section)
24eab124 8967 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
8968 exp->X_op = O_subtract;
8969 exp->X_op_symbol = GOT_symbol;
1ae12ab7 8970 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 8971 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
8972 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
8973 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 8974 else
29b0f896 8975 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 8976 }
252b5132 8977
3992d3b7
AM
8978 else if (exp->X_op == O_absent
8979 || exp->X_op == O_illegal
ee86248c 8980 || exp->X_op == O_big)
2daf4fd8 8981 {
3992d3b7
AM
8982 inv_disp:
8983 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 8984 disp_start);
3992d3b7 8985 ret = 0;
2daf4fd8
AM
8986 }
8987
0e1147d9
L
8988 else if (flag_code == CODE_64BIT
8989 && !i.prefix[ADDR_PREFIX]
8990 && exp->X_op == O_constant)
8991 {
8992 /* Since displacement is signed extended to 64bit, don't allow
8993 disp32 and turn off disp32s if they are out of range. */
8994 i.types[this_operand].bitfield.disp32 = 0;
8995 if (!fits_in_signed_long (exp->X_add_number))
8996 {
8997 i.types[this_operand].bitfield.disp32s = 0;
8998 if (i.types[this_operand].bitfield.baseindex)
8999 {
9000 as_bad (_("0x%lx out range of signed 32bit displacement"),
9001 (long) exp->X_add_number);
9002 ret = 0;
9003 }
9004 }
9005 }
9006
4c63da97 9007#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
9008 else if (exp->X_op != O_constant
9009 && OUTPUT_FLAVOR == bfd_target_aout_flavour
9010 && exp_seg != absolute_section
9011 && exp_seg != text_section
9012 && exp_seg != data_section
9013 && exp_seg != bss_section
9014 && exp_seg != undefined_section
9015 && !bfd_is_com_section (exp_seg))
24eab124 9016 {
d0b47220 9017 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 9018 ret = 0;
24eab124 9019 }
252b5132 9020#endif
3956db08 9021
40fb9820
L
9022 /* Check if this is a displacement only operand. */
9023 bigdisp = i.types[this_operand];
9024 bigdisp.bitfield.disp8 = 0;
9025 bigdisp.bitfield.disp16 = 0;
9026 bigdisp.bitfield.disp32 = 0;
9027 bigdisp.bitfield.disp32s = 0;
9028 bigdisp.bitfield.disp64 = 0;
0dfbf9d7 9029 if (operand_type_all_zero (&bigdisp))
c6fb90c8
L
9030 i.types[this_operand] = operand_type_and (i.types[this_operand],
9031 types);
3956db08 9032
3992d3b7 9033 return ret;
252b5132
RH
9034}
9035
2abc2bec
JB
9036/* Return the active addressing mode, taking address override and
9037 registers forming the address into consideration. Update the
9038 address override prefix if necessary. */
47926f60 9039
2abc2bec
JB
9040static enum flag_code
9041i386_addressing_mode (void)
252b5132 9042{
be05d201
L
9043 enum flag_code addr_mode;
9044
9045 if (i.prefix[ADDR_PREFIX])
9046 addr_mode = flag_code == CODE_32BIT ? CODE_16BIT : CODE_32BIT;
9047 else
9048 {
9049 addr_mode = flag_code;
9050
24eab124 9051#if INFER_ADDR_PREFIX
be05d201
L
9052 if (i.mem_operands == 0)
9053 {
9054 /* Infer address prefix from the first memory operand. */
9055 const reg_entry *addr_reg = i.base_reg;
9056
9057 if (addr_reg == NULL)
9058 addr_reg = i.index_reg;
eecb386c 9059
be05d201
L
9060 if (addr_reg)
9061 {
9062 if (addr_reg->reg_num == RegEip
9063 || addr_reg->reg_num == RegEiz
dc821c5f 9064 || addr_reg->reg_type.bitfield.dword)
be05d201
L
9065 addr_mode = CODE_32BIT;
9066 else if (flag_code != CODE_64BIT
dc821c5f 9067 && addr_reg->reg_type.bitfield.word)
be05d201
L
9068 addr_mode = CODE_16BIT;
9069
9070 if (addr_mode != flag_code)
9071 {
9072 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
9073 i.prefixes += 1;
9074 /* Change the size of any displacement too. At most one
9075 of Disp16 or Disp32 is set.
9076 FIXME. There doesn't seem to be any real need for
9077 separate Disp16 and Disp32 flags. The same goes for
9078 Imm16 and Imm32. Removing them would probably clean
9079 up the code quite a lot. */
9080 if (flag_code != CODE_64BIT
9081 && (i.types[this_operand].bitfield.disp16
9082 || i.types[this_operand].bitfield.disp32))
9083 i.types[this_operand]
9084 = operand_type_xor (i.types[this_operand], disp16_32);
9085 }
9086 }
9087 }
24eab124 9088#endif
be05d201
L
9089 }
9090
2abc2bec
JB
9091 return addr_mode;
9092}
9093
9094/* Make sure the memory operand we've been dealt is valid.
9095 Return 1 on success, 0 on a failure. */
9096
9097static int
9098i386_index_check (const char *operand_string)
9099{
9100 const char *kind = "base/index";
9101 enum flag_code addr_mode = i386_addressing_mode ();
9102
fc0763e6
JB
9103 if (current_templates->start->opcode_modifier.isstring
9104 && !current_templates->start->opcode_modifier.immext
9105 && (current_templates->end[-1].opcode_modifier.isstring
9106 || i.mem_operands))
9107 {
9108 /* Memory operands of string insns are special in that they only allow
9109 a single register (rDI, rSI, or rBX) as their memory address. */
be05d201
L
9110 const reg_entry *expected_reg;
9111 static const char *di_si[][2] =
9112 {
9113 { "esi", "edi" },
9114 { "si", "di" },
9115 { "rsi", "rdi" }
9116 };
9117 static const char *bx[] = { "ebx", "bx", "rbx" };
fc0763e6
JB
9118
9119 kind = "string address";
9120
8325cc63 9121 if (current_templates->start->opcode_modifier.repprefixok)
fc0763e6
JB
9122 {
9123 i386_operand_type type = current_templates->end[-1].operand_types[0];
9124
9125 if (!type.bitfield.baseindex
9126 || ((!i.mem_operands != !intel_syntax)
9127 && current_templates->end[-1].operand_types[1]
9128 .bitfield.baseindex))
9129 type = current_templates->end[-1].operand_types[1];
be05d201
L
9130 expected_reg = hash_find (reg_hash,
9131 di_si[addr_mode][type.bitfield.esseg]);
9132
fc0763e6
JB
9133 }
9134 else
be05d201 9135 expected_reg = hash_find (reg_hash, bx[addr_mode]);
fc0763e6 9136
be05d201
L
9137 if (i.base_reg != expected_reg
9138 || i.index_reg
fc0763e6 9139 || operand_type_check (i.types[this_operand], disp))
fc0763e6 9140 {
be05d201
L
9141 /* The second memory operand must have the same size as
9142 the first one. */
9143 if (i.mem_operands
9144 && i.base_reg
9145 && !((addr_mode == CODE_64BIT
dc821c5f 9146 && i.base_reg->reg_type.bitfield.qword)
be05d201 9147 || (addr_mode == CODE_32BIT
dc821c5f
JB
9148 ? i.base_reg->reg_type.bitfield.dword
9149 : i.base_reg->reg_type.bitfield.word)))
be05d201
L
9150 goto bad_address;
9151
fc0763e6
JB
9152 as_warn (_("`%s' is not valid here (expected `%c%s%s%c')"),
9153 operand_string,
9154 intel_syntax ? '[' : '(',
9155 register_prefix,
be05d201 9156 expected_reg->reg_name,
fc0763e6 9157 intel_syntax ? ']' : ')');
be05d201 9158 return 1;
fc0763e6 9159 }
be05d201
L
9160 else
9161 return 1;
9162
9163bad_address:
9164 as_bad (_("`%s' is not a valid %s expression"),
9165 operand_string, kind);
9166 return 0;
3e73aa7c
JH
9167 }
9168 else
9169 {
be05d201
L
9170 if (addr_mode != CODE_16BIT)
9171 {
9172 /* 32-bit/64-bit checks. */
9173 if ((i.base_reg
9174 && (addr_mode == CODE_64BIT
dc821c5f
JB
9175 ? !i.base_reg->reg_type.bitfield.qword
9176 : !i.base_reg->reg_type.bitfield.dword)
be05d201
L
9177 && (i.index_reg
9178 || (i.base_reg->reg_num
9179 != (addr_mode == CODE_64BIT ? RegRip : RegEip))))
9180 || (i.index_reg
1b54b8d7
JB
9181 && !i.index_reg->reg_type.bitfield.xmmword
9182 && !i.index_reg->reg_type.bitfield.ymmword
9183 && !i.index_reg->reg_type.bitfield.zmmword
be05d201 9184 && ((addr_mode == CODE_64BIT
dc821c5f 9185 ? !(i.index_reg->reg_type.bitfield.qword
be05d201 9186 || i.index_reg->reg_num == RegRiz)
dc821c5f 9187 : !(i.index_reg->reg_type.bitfield.dword
be05d201
L
9188 || i.index_reg->reg_num == RegEiz))
9189 || !i.index_reg->reg_type.bitfield.baseindex)))
9190 goto bad_address;
8178be5b
JB
9191
9192 /* bndmk, bndldx, and bndstx have special restrictions. */
9193 if (current_templates->start->base_opcode == 0xf30f1b
9194 || (current_templates->start->base_opcode & ~1) == 0x0f1a)
9195 {
9196 /* They cannot use RIP-relative addressing. */
9197 if (i.base_reg && i.base_reg->reg_num == RegRip)
9198 {
9199 as_bad (_("`%s' cannot be used here"), operand_string);
9200 return 0;
9201 }
9202
9203 /* bndldx and bndstx ignore their scale factor. */
9204 if (current_templates->start->base_opcode != 0xf30f1b
9205 && i.log2_scale_factor)
9206 as_warn (_("register scaling is being ignored here"));
9207 }
be05d201
L
9208 }
9209 else
3e73aa7c 9210 {
be05d201 9211 /* 16-bit checks. */
3e73aa7c 9212 if ((i.base_reg
dc821c5f 9213 && (!i.base_reg->reg_type.bitfield.word
40fb9820 9214 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 9215 || (i.index_reg
dc821c5f 9216 && (!i.index_reg->reg_type.bitfield.word
40fb9820 9217 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
9218 || !(i.base_reg
9219 && i.base_reg->reg_num < 6
9220 && i.index_reg->reg_num >= 6
9221 && i.log2_scale_factor == 0))))
be05d201 9222 goto bad_address;
3e73aa7c
JH
9223 }
9224 }
be05d201 9225 return 1;
24eab124 9226}
252b5132 9227
43234a1e
L
9228/* Handle vector immediates. */
9229
9230static int
9231RC_SAE_immediate (const char *imm_start)
9232{
9233 unsigned int match_found, j;
9234 const char *pstr = imm_start;
9235 expressionS *exp;
9236
9237 if (*pstr != '{')
9238 return 0;
9239
9240 pstr++;
9241 match_found = 0;
9242 for (j = 0; j < ARRAY_SIZE (RC_NamesTable); j++)
9243 {
9244 if (!strncmp (pstr, RC_NamesTable[j].name, RC_NamesTable[j].len))
9245 {
9246 if (!i.rounding)
9247 {
9248 rc_op.type = RC_NamesTable[j].type;
9249 rc_op.operand = this_operand;
9250 i.rounding = &rc_op;
9251 }
9252 else
9253 {
9254 as_bad (_("duplicated `%s'"), imm_start);
9255 return 0;
9256 }
9257 pstr += RC_NamesTable[j].len;
9258 match_found = 1;
9259 break;
9260 }
9261 }
9262 if (!match_found)
9263 return 0;
9264
9265 if (*pstr++ != '}')
9266 {
9267 as_bad (_("Missing '}': '%s'"), imm_start);
9268 return 0;
9269 }
9270 /* RC/SAE immediate string should contain nothing more. */;
9271 if (*pstr != 0)
9272 {
9273 as_bad (_("Junk after '}': '%s'"), imm_start);
9274 return 0;
9275 }
9276
9277 exp = &im_expressions[i.imm_operands++];
9278 i.op[this_operand].imms = exp;
9279
9280 exp->X_op = O_constant;
9281 exp->X_add_number = 0;
9282 exp->X_add_symbol = (symbolS *) 0;
9283 exp->X_op_symbol = (symbolS *) 0;
9284
9285 i.types[this_operand].bitfield.imm8 = 1;
9286 return 1;
9287}
9288
8325cc63
JB
9289/* Only string instructions can have a second memory operand, so
9290 reduce current_templates to just those if it contains any. */
9291static int
9292maybe_adjust_templates (void)
9293{
9294 const insn_template *t;
9295
9296 gas_assert (i.mem_operands == 1);
9297
9298 for (t = current_templates->start; t < current_templates->end; ++t)
9299 if (t->opcode_modifier.isstring)
9300 break;
9301
9302 if (t < current_templates->end)
9303 {
9304 static templates aux_templates;
9305 bfd_boolean recheck;
9306
9307 aux_templates.start = t;
9308 for (; t < current_templates->end; ++t)
9309 if (!t->opcode_modifier.isstring)
9310 break;
9311 aux_templates.end = t;
9312
9313 /* Determine whether to re-check the first memory operand. */
9314 recheck = (aux_templates.start != current_templates->start
9315 || t != current_templates->end);
9316
9317 current_templates = &aux_templates;
9318
9319 if (recheck)
9320 {
9321 i.mem_operands = 0;
9322 if (i.memop1_string != NULL
9323 && i386_index_check (i.memop1_string) == 0)
9324 return 0;
9325 i.mem_operands = 1;
9326 }
9327 }
9328
9329 return 1;
9330}
9331
fc0763e6 9332/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
47926f60 9333 on error. */
252b5132 9334
252b5132 9335static int
a7619375 9336i386_att_operand (char *operand_string)
252b5132 9337{
af6bdddf
AM
9338 const reg_entry *r;
9339 char *end_op;
24eab124 9340 char *op_string = operand_string;
252b5132 9341
24eab124 9342 if (is_space_char (*op_string))
252b5132
RH
9343 ++op_string;
9344
24eab124 9345 /* We check for an absolute prefix (differentiating,
47926f60 9346 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
9347 if (*op_string == ABSOLUTE_PREFIX)
9348 {
9349 ++op_string;
9350 if (is_space_char (*op_string))
9351 ++op_string;
40fb9820 9352 i.types[this_operand].bitfield.jumpabsolute = 1;
24eab124 9353 }
252b5132 9354
47926f60 9355 /* Check if operand is a register. */
4d1bb795 9356 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 9357 {
40fb9820
L
9358 i386_operand_type temp;
9359
24eab124
AM
9360 /* Check for a segment override by searching for ':' after a
9361 segment register. */
9362 op_string = end_op;
9363 if (is_space_char (*op_string))
9364 ++op_string;
40fb9820
L
9365 if (*op_string == ':'
9366 && (r->reg_type.bitfield.sreg2
9367 || r->reg_type.bitfield.sreg3))
24eab124
AM
9368 {
9369 switch (r->reg_num)
9370 {
9371 case 0:
9372 i.seg[i.mem_operands] = &es;
9373 break;
9374 case 1:
9375 i.seg[i.mem_operands] = &cs;
9376 break;
9377 case 2:
9378 i.seg[i.mem_operands] = &ss;
9379 break;
9380 case 3:
9381 i.seg[i.mem_operands] = &ds;
9382 break;
9383 case 4:
9384 i.seg[i.mem_operands] = &fs;
9385 break;
9386 case 5:
9387 i.seg[i.mem_operands] = &gs;
9388 break;
9389 }
252b5132 9390
24eab124 9391 /* Skip the ':' and whitespace. */
252b5132
RH
9392 ++op_string;
9393 if (is_space_char (*op_string))
24eab124 9394 ++op_string;
252b5132 9395
24eab124
AM
9396 if (!is_digit_char (*op_string)
9397 && !is_identifier_char (*op_string)
9398 && *op_string != '('
9399 && *op_string != ABSOLUTE_PREFIX)
9400 {
9401 as_bad (_("bad memory operand `%s'"), op_string);
9402 return 0;
9403 }
47926f60 9404 /* Handle case of %es:*foo. */
24eab124
AM
9405 if (*op_string == ABSOLUTE_PREFIX)
9406 {
9407 ++op_string;
9408 if (is_space_char (*op_string))
9409 ++op_string;
40fb9820 9410 i.types[this_operand].bitfield.jumpabsolute = 1;
24eab124
AM
9411 }
9412 goto do_memory_reference;
9413 }
43234a1e
L
9414
9415 /* Handle vector operations. */
9416 if (*op_string == '{')
9417 {
9418 op_string = check_VecOperations (op_string, NULL);
9419 if (op_string == NULL)
9420 return 0;
9421 }
9422
24eab124
AM
9423 if (*op_string)
9424 {
d0b47220 9425 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
9426 return 0;
9427 }
40fb9820
L
9428 temp = r->reg_type;
9429 temp.bitfield.baseindex = 0;
c6fb90c8
L
9430 i.types[this_operand] = operand_type_or (i.types[this_operand],
9431 temp);
7d5e4556 9432 i.types[this_operand].bitfield.unspecified = 0;
520dc8e8 9433 i.op[this_operand].regs = r;
24eab124
AM
9434 i.reg_operands++;
9435 }
af6bdddf
AM
9436 else if (*op_string == REGISTER_PREFIX)
9437 {
9438 as_bad (_("bad register name `%s'"), op_string);
9439 return 0;
9440 }
24eab124 9441 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 9442 {
24eab124 9443 ++op_string;
40fb9820 9444 if (i.types[this_operand].bitfield.jumpabsolute)
24eab124 9445 {
d0b47220 9446 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
9447 return 0;
9448 }
9449 if (!i386_immediate (op_string))
9450 return 0;
9451 }
43234a1e
L
9452 else if (RC_SAE_immediate (operand_string))
9453 {
9454 /* If it is a RC or SAE immediate, do nothing. */
9455 ;
9456 }
24eab124
AM
9457 else if (is_digit_char (*op_string)
9458 || is_identifier_char (*op_string)
d02603dc 9459 || *op_string == '"'
e5cb08ac 9460 || *op_string == '(')
24eab124 9461 {
47926f60 9462 /* This is a memory reference of some sort. */
af6bdddf 9463 char *base_string;
252b5132 9464
47926f60 9465 /* Start and end of displacement string expression (if found). */
eecb386c
AM
9466 char *displacement_string_start;
9467 char *displacement_string_end;
43234a1e 9468 char *vop_start;
252b5132 9469
24eab124 9470 do_memory_reference:
8325cc63
JB
9471 if (i.mem_operands == 1 && !maybe_adjust_templates ())
9472 return 0;
24eab124 9473 if ((i.mem_operands == 1
40fb9820 9474 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
9475 || i.mem_operands == 2)
9476 {
9477 as_bad (_("too many memory references for `%s'"),
9478 current_templates->start->name);
9479 return 0;
9480 }
252b5132 9481
24eab124
AM
9482 /* Check for base index form. We detect the base index form by
9483 looking for an ')' at the end of the operand, searching
9484 for the '(' matching it, and finding a REGISTER_PREFIX or ','
9485 after the '('. */
af6bdddf 9486 base_string = op_string + strlen (op_string);
c3332e24 9487
43234a1e
L
9488 /* Handle vector operations. */
9489 vop_start = strchr (op_string, '{');
9490 if (vop_start && vop_start < base_string)
9491 {
9492 if (check_VecOperations (vop_start, base_string) == NULL)
9493 return 0;
9494 base_string = vop_start;
9495 }
9496
af6bdddf
AM
9497 --base_string;
9498 if (is_space_char (*base_string))
9499 --base_string;
252b5132 9500
47926f60 9501 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
9502 displacement_string_start = op_string;
9503 displacement_string_end = base_string + 1;
252b5132 9504
24eab124
AM
9505 if (*base_string == ')')
9506 {
af6bdddf 9507 char *temp_string;
24eab124
AM
9508 unsigned int parens_balanced = 1;
9509 /* We've already checked that the number of left & right ()'s are
47926f60 9510 equal, so this loop will not be infinite. */
24eab124
AM
9511 do
9512 {
9513 base_string--;
9514 if (*base_string == ')')
9515 parens_balanced++;
9516 if (*base_string == '(')
9517 parens_balanced--;
9518 }
9519 while (parens_balanced);
c3332e24 9520
af6bdddf 9521 temp_string = base_string;
c3332e24 9522
24eab124 9523 /* Skip past '(' and whitespace. */
252b5132
RH
9524 ++base_string;
9525 if (is_space_char (*base_string))
24eab124 9526 ++base_string;
252b5132 9527
af6bdddf 9528 if (*base_string == ','
4eed87de
AM
9529 || ((i.base_reg = parse_register (base_string, &end_op))
9530 != NULL))
252b5132 9531 {
af6bdddf 9532 displacement_string_end = temp_string;
252b5132 9533
40fb9820 9534 i.types[this_operand].bitfield.baseindex = 1;
252b5132 9535
af6bdddf 9536 if (i.base_reg)
24eab124 9537 {
24eab124
AM
9538 base_string = end_op;
9539 if (is_space_char (*base_string))
9540 ++base_string;
af6bdddf
AM
9541 }
9542
9543 /* There may be an index reg or scale factor here. */
9544 if (*base_string == ',')
9545 {
9546 ++base_string;
9547 if (is_space_char (*base_string))
9548 ++base_string;
9549
4eed87de
AM
9550 if ((i.index_reg = parse_register (base_string, &end_op))
9551 != NULL)
24eab124 9552 {
af6bdddf 9553 base_string = end_op;
24eab124
AM
9554 if (is_space_char (*base_string))
9555 ++base_string;
af6bdddf
AM
9556 if (*base_string == ',')
9557 {
9558 ++base_string;
9559 if (is_space_char (*base_string))
9560 ++base_string;
9561 }
e5cb08ac 9562 else if (*base_string != ')')
af6bdddf 9563 {
4eed87de
AM
9564 as_bad (_("expecting `,' or `)' "
9565 "after index register in `%s'"),
af6bdddf
AM
9566 operand_string);
9567 return 0;
9568 }
24eab124 9569 }
af6bdddf 9570 else if (*base_string == REGISTER_PREFIX)
24eab124 9571 {
f76bf5e0
L
9572 end_op = strchr (base_string, ',');
9573 if (end_op)
9574 *end_op = '\0';
af6bdddf 9575 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
9576 return 0;
9577 }
252b5132 9578
47926f60 9579 /* Check for scale factor. */
551c1ca1 9580 if (*base_string != ')')
af6bdddf 9581 {
551c1ca1
AM
9582 char *end_scale = i386_scale (base_string);
9583
9584 if (!end_scale)
af6bdddf 9585 return 0;
24eab124 9586
551c1ca1 9587 base_string = end_scale;
af6bdddf
AM
9588 if (is_space_char (*base_string))
9589 ++base_string;
9590 if (*base_string != ')')
9591 {
4eed87de
AM
9592 as_bad (_("expecting `)' "
9593 "after scale factor in `%s'"),
af6bdddf
AM
9594 operand_string);
9595 return 0;
9596 }
9597 }
9598 else if (!i.index_reg)
24eab124 9599 {
4eed87de
AM
9600 as_bad (_("expecting index register or scale factor "
9601 "after `,'; got '%c'"),
af6bdddf 9602 *base_string);
24eab124
AM
9603 return 0;
9604 }
9605 }
af6bdddf 9606 else if (*base_string != ')')
24eab124 9607 {
4eed87de
AM
9608 as_bad (_("expecting `,' or `)' "
9609 "after base register in `%s'"),
af6bdddf 9610 operand_string);
24eab124
AM
9611 return 0;
9612 }
c3332e24 9613 }
af6bdddf 9614 else if (*base_string == REGISTER_PREFIX)
c3332e24 9615 {
f76bf5e0
L
9616 end_op = strchr (base_string, ',');
9617 if (end_op)
9618 *end_op = '\0';
af6bdddf 9619 as_bad (_("bad register name `%s'"), base_string);
24eab124 9620 return 0;
c3332e24 9621 }
24eab124
AM
9622 }
9623
9624 /* If there's an expression beginning the operand, parse it,
9625 assuming displacement_string_start and
9626 displacement_string_end are meaningful. */
9627 if (displacement_string_start != displacement_string_end)
9628 {
9629 if (!i386_displacement (displacement_string_start,
9630 displacement_string_end))
9631 return 0;
9632 }
9633
9634 /* Special case for (%dx) while doing input/output op. */
9635 if (i.base_reg
2fb5be8d 9636 && i.base_reg->reg_type.bitfield.inoutportreg
24eab124
AM
9637 && i.index_reg == 0
9638 && i.log2_scale_factor == 0
9639 && i.seg[i.mem_operands] == 0
40fb9820 9640 && !operand_type_check (i.types[this_operand], disp))
24eab124 9641 {
2fb5be8d 9642 i.types[this_operand] = i.base_reg->reg_type;
24eab124
AM
9643 return 1;
9644 }
9645
eecb386c
AM
9646 if (i386_index_check (operand_string) == 0)
9647 return 0;
5c07affc 9648 i.types[this_operand].bitfield.mem = 1;
8325cc63
JB
9649 if (i.mem_operands == 0)
9650 i.memop1_string = xstrdup (operand_string);
24eab124
AM
9651 i.mem_operands++;
9652 }
9653 else
ce8a8b2f
AM
9654 {
9655 /* It's not a memory operand; argh! */
24eab124
AM
9656 as_bad (_("invalid char %s beginning operand %d `%s'"),
9657 output_invalid (*op_string),
9658 this_operand + 1,
9659 op_string);
9660 return 0;
9661 }
47926f60 9662 return 1; /* Normal return. */
252b5132
RH
9663}
9664\f
fa94de6b
RM
9665/* Calculate the maximum variable size (i.e., excluding fr_fix)
9666 that an rs_machine_dependent frag may reach. */
9667
9668unsigned int
9669i386_frag_max_var (fragS *frag)
9670{
9671 /* The only relaxable frags are for jumps.
9672 Unconditional jumps can grow by 4 bytes and others by 5 bytes. */
9673 gas_assert (frag->fr_type == rs_machine_dependent);
9674 return TYPE_FROM_RELAX_STATE (frag->fr_subtype) == UNCOND_JUMP ? 4 : 5;
9675}
9676
b084df0b
L
9677#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
9678static int
8dcea932 9679elf_symbol_resolved_in_segment_p (symbolS *fr_symbol, offsetT fr_var)
b084df0b
L
9680{
9681 /* STT_GNU_IFUNC symbol must go through PLT. */
9682 if ((symbol_get_bfdsym (fr_symbol)->flags
9683 & BSF_GNU_INDIRECT_FUNCTION) != 0)
9684 return 0;
9685
9686 if (!S_IS_EXTERNAL (fr_symbol))
9687 /* Symbol may be weak or local. */
9688 return !S_IS_WEAK (fr_symbol);
9689
8dcea932
L
9690 /* Global symbols with non-default visibility can't be preempted. */
9691 if (ELF_ST_VISIBILITY (S_GET_OTHER (fr_symbol)) != STV_DEFAULT)
9692 return 1;
9693
9694 if (fr_var != NO_RELOC)
9695 switch ((enum bfd_reloc_code_real) fr_var)
9696 {
9697 case BFD_RELOC_386_PLT32:
9698 case BFD_RELOC_X86_64_PLT32:
33eaf5de 9699 /* Symbol with PLT relocation may be preempted. */
8dcea932
L
9700 return 0;
9701 default:
9702 abort ();
9703 }
9704
b084df0b
L
9705 /* Global symbols with default visibility in a shared library may be
9706 preempted by another definition. */
8dcea932 9707 return !shared;
b084df0b
L
9708}
9709#endif
9710
ee7fcc42
AM
9711/* md_estimate_size_before_relax()
9712
9713 Called just before relax() for rs_machine_dependent frags. The x86
9714 assembler uses these frags to handle variable size jump
9715 instructions.
9716
9717 Any symbol that is now undefined will not become defined.
9718 Return the correct fr_subtype in the frag.
9719 Return the initial "guess for variable size of frag" to caller.
9720 The guess is actually the growth beyond the fixed part. Whatever
9721 we do to grow the fixed or variable part contributes to our
9722 returned value. */
9723
252b5132 9724int
7016a5d5 9725md_estimate_size_before_relax (fragS *fragP, segT segment)
252b5132 9726{
252b5132 9727 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
9728 check for un-relaxable symbols. On an ELF system, we can't relax
9729 an externally visible symbol, because it may be overridden by a
9730 shared library. */
9731 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 9732#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 9733 || (IS_ELF
8dcea932
L
9734 && !elf_symbol_resolved_in_segment_p (fragP->fr_symbol,
9735 fragP->fr_var))
fbeb56a4
DK
9736#endif
9737#if defined (OBJ_COFF) && defined (TE_PE)
7ab9ffdd 9738 || (OUTPUT_FLAVOR == bfd_target_coff_flavour
fbeb56a4 9739 && S_IS_WEAK (fragP->fr_symbol))
b98ef147
AM
9740#endif
9741 )
252b5132 9742 {
b98ef147
AM
9743 /* Symbol is undefined in this segment, or we need to keep a
9744 reloc so that weak symbols can be overridden. */
9745 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 9746 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
9747 unsigned char *opcode;
9748 int old_fr_fix;
f6af82bd 9749
ee7fcc42 9750 if (fragP->fr_var != NO_RELOC)
1e9cc1c2 9751 reloc_type = (enum bfd_reloc_code_real) fragP->fr_var;
b98ef147 9752 else if (size == 2)
f6af82bd 9753 reloc_type = BFD_RELOC_16_PCREL;
bd7ab16b
L
9754#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
9755 else if (need_plt32_p (fragP->fr_symbol))
9756 reloc_type = BFD_RELOC_X86_64_PLT32;
9757#endif
f6af82bd
AM
9758 else
9759 reloc_type = BFD_RELOC_32_PCREL;
252b5132 9760
ee7fcc42
AM
9761 old_fr_fix = fragP->fr_fix;
9762 opcode = (unsigned char *) fragP->fr_opcode;
9763
fddf5b5b 9764 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 9765 {
fddf5b5b
AM
9766 case UNCOND_JUMP:
9767 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 9768 opcode[0] = 0xe9;
252b5132 9769 fragP->fr_fix += size;
062cd5e7
AS
9770 fix_new (fragP, old_fr_fix, size,
9771 fragP->fr_symbol,
9772 fragP->fr_offset, 1,
9773 reloc_type);
252b5132
RH
9774 break;
9775
fddf5b5b 9776 case COND_JUMP86:
412167cb
AM
9777 if (size == 2
9778 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
9779 {
9780 /* Negate the condition, and branch past an
9781 unconditional jump. */
9782 opcode[0] ^= 1;
9783 opcode[1] = 3;
9784 /* Insert an unconditional jump. */
9785 opcode[2] = 0xe9;
9786 /* We added two extra opcode bytes, and have a two byte
9787 offset. */
9788 fragP->fr_fix += 2 + 2;
062cd5e7
AS
9789 fix_new (fragP, old_fr_fix + 2, 2,
9790 fragP->fr_symbol,
9791 fragP->fr_offset, 1,
9792 reloc_type);
fddf5b5b
AM
9793 break;
9794 }
9795 /* Fall through. */
9796
9797 case COND_JUMP:
412167cb
AM
9798 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
9799 {
3e02c1cc
AM
9800 fixS *fixP;
9801
412167cb 9802 fragP->fr_fix += 1;
3e02c1cc
AM
9803 fixP = fix_new (fragP, old_fr_fix, 1,
9804 fragP->fr_symbol,
9805 fragP->fr_offset, 1,
9806 BFD_RELOC_8_PCREL);
9807 fixP->fx_signed = 1;
412167cb
AM
9808 break;
9809 }
93c2a809 9810
24eab124 9811 /* This changes the byte-displacement jump 0x7N
fddf5b5b 9812 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 9813 opcode[1] = opcode[0] + 0x10;
f6af82bd 9814 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
9815 /* We've added an opcode byte. */
9816 fragP->fr_fix += 1 + size;
062cd5e7
AS
9817 fix_new (fragP, old_fr_fix + 1, size,
9818 fragP->fr_symbol,
9819 fragP->fr_offset, 1,
9820 reloc_type);
252b5132 9821 break;
fddf5b5b
AM
9822
9823 default:
9824 BAD_CASE (fragP->fr_subtype);
9825 break;
252b5132
RH
9826 }
9827 frag_wane (fragP);
ee7fcc42 9828 return fragP->fr_fix - old_fr_fix;
252b5132 9829 }
93c2a809 9830
93c2a809
AM
9831 /* Guess size depending on current relax state. Initially the relax
9832 state will correspond to a short jump and we return 1, because
9833 the variable part of the frag (the branch offset) is one byte
9834 long. However, we can relax a section more than once and in that
9835 case we must either set fr_subtype back to the unrelaxed state,
9836 or return the value for the appropriate branch. */
9837 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
9838}
9839
47926f60
KH
9840/* Called after relax() is finished.
9841
9842 In: Address of frag.
9843 fr_type == rs_machine_dependent.
9844 fr_subtype is what the address relaxed to.
9845
9846 Out: Any fixSs and constants are set up.
9847 Caller will turn frag into a ".space 0". */
9848
252b5132 9849void
7016a5d5
TG
9850md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
9851 fragS *fragP)
252b5132 9852{
29b0f896 9853 unsigned char *opcode;
252b5132 9854 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
9855 offsetT target_address;
9856 offsetT opcode_address;
252b5132 9857 unsigned int extension = 0;
847f7ad4 9858 offsetT displacement_from_opcode_start;
252b5132
RH
9859
9860 opcode = (unsigned char *) fragP->fr_opcode;
9861
47926f60 9862 /* Address we want to reach in file space. */
252b5132 9863 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 9864
47926f60 9865 /* Address opcode resides at in file space. */
252b5132
RH
9866 opcode_address = fragP->fr_address + fragP->fr_fix;
9867
47926f60 9868 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
9869 displacement_from_opcode_start = target_address - opcode_address;
9870
fddf5b5b 9871 if ((fragP->fr_subtype & BIG) == 0)
252b5132 9872 {
47926f60
KH
9873 /* Don't have to change opcode. */
9874 extension = 1; /* 1 opcode + 1 displacement */
252b5132 9875 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
9876 }
9877 else
9878 {
9879 if (no_cond_jump_promotion
9880 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
9881 as_warn_where (fragP->fr_file, fragP->fr_line,
9882 _("long jump required"));
252b5132 9883
fddf5b5b
AM
9884 switch (fragP->fr_subtype)
9885 {
9886 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
9887 extension = 4; /* 1 opcode + 4 displacement */
9888 opcode[0] = 0xe9;
9889 where_to_put_displacement = &opcode[1];
9890 break;
252b5132 9891
fddf5b5b
AM
9892 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
9893 extension = 2; /* 1 opcode + 2 displacement */
9894 opcode[0] = 0xe9;
9895 where_to_put_displacement = &opcode[1];
9896 break;
252b5132 9897
fddf5b5b
AM
9898 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
9899 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
9900 extension = 5; /* 2 opcode + 4 displacement */
9901 opcode[1] = opcode[0] + 0x10;
9902 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
9903 where_to_put_displacement = &opcode[2];
9904 break;
252b5132 9905
fddf5b5b
AM
9906 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
9907 extension = 3; /* 2 opcode + 2 displacement */
9908 opcode[1] = opcode[0] + 0x10;
9909 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
9910 where_to_put_displacement = &opcode[2];
9911 break;
252b5132 9912
fddf5b5b
AM
9913 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
9914 extension = 4;
9915 opcode[0] ^= 1;
9916 opcode[1] = 3;
9917 opcode[2] = 0xe9;
9918 where_to_put_displacement = &opcode[3];
9919 break;
9920
9921 default:
9922 BAD_CASE (fragP->fr_subtype);
9923 break;
9924 }
252b5132 9925 }
fddf5b5b 9926
7b81dfbb
AJ
9927 /* If size if less then four we are sure that the operand fits,
9928 but if it's 4, then it could be that the displacement is larger
9929 then -/+ 2GB. */
9930 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
9931 && object_64bit
9932 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
9933 + ((addressT) 1 << 31))
9934 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
9935 {
9936 as_bad_where (fragP->fr_file, fragP->fr_line,
9937 _("jump target out of range"));
9938 /* Make us emit 0. */
9939 displacement_from_opcode_start = extension;
9940 }
47926f60 9941 /* Now put displacement after opcode. */
252b5132
RH
9942 md_number_to_chars ((char *) where_to_put_displacement,
9943 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 9944 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
9945 fragP->fr_fix += extension;
9946}
9947\f
7016a5d5 9948/* Apply a fixup (fixP) to segment data, once it has been determined
252b5132
RH
9949 by our caller that we have all the info we need to fix it up.
9950
7016a5d5
TG
9951 Parameter valP is the pointer to the value of the bits.
9952
252b5132
RH
9953 On the 386, immediates, displacements, and data pointers are all in
9954 the same (little-endian) format, so we don't need to care about which
9955 we are handling. */
9956
94f592af 9957void
7016a5d5 9958md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
252b5132 9959{
94f592af 9960 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 9961 valueT value = *valP;
252b5132 9962
f86103b7 9963#if !defined (TE_Mach)
93382f6d
AM
9964 if (fixP->fx_pcrel)
9965 {
9966 switch (fixP->fx_r_type)
9967 {
5865bb77
ILT
9968 default:
9969 break;
9970
d6ab8113
JB
9971 case BFD_RELOC_64:
9972 fixP->fx_r_type = BFD_RELOC_64_PCREL;
9973 break;
93382f6d 9974 case BFD_RELOC_32:
ae8887b5 9975 case BFD_RELOC_X86_64_32S:
93382f6d
AM
9976 fixP->fx_r_type = BFD_RELOC_32_PCREL;
9977 break;
9978 case BFD_RELOC_16:
9979 fixP->fx_r_type = BFD_RELOC_16_PCREL;
9980 break;
9981 case BFD_RELOC_8:
9982 fixP->fx_r_type = BFD_RELOC_8_PCREL;
9983 break;
9984 }
9985 }
252b5132 9986
a161fe53 9987 if (fixP->fx_addsy != NULL
31312f95 9988 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 9989 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95 9990 || fixP->fx_r_type == BFD_RELOC_16_PCREL
d258b828 9991 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
31312f95 9992 && !use_rela_relocations)
252b5132 9993 {
31312f95
AM
9994 /* This is a hack. There should be a better way to handle this.
9995 This covers for the fact that bfd_install_relocation will
9996 subtract the current location (for partial_inplace, PC relative
9997 relocations); see more below. */
252b5132 9998#ifndef OBJ_AOUT
718ddfc0 9999 if (IS_ELF
252b5132
RH
10000#ifdef TE_PE
10001 || OUTPUT_FLAVOR == bfd_target_coff_flavour
10002#endif
10003 )
10004 value += fixP->fx_where + fixP->fx_frag->fr_address;
10005#endif
10006#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 10007 if (IS_ELF)
252b5132 10008 {
6539b54b 10009 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 10010
6539b54b 10011 if ((sym_seg == seg
2f66722d 10012 || (symbol_section_p (fixP->fx_addsy)
6539b54b 10013 && sym_seg != absolute_section))
af65af87 10014 && !generic_force_reloc (fixP))
2f66722d
AM
10015 {
10016 /* Yes, we add the values in twice. This is because
6539b54b
AM
10017 bfd_install_relocation subtracts them out again. I think
10018 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
10019 it. FIXME. */
10020 value += fixP->fx_where + fixP->fx_frag->fr_address;
10021 }
252b5132
RH
10022 }
10023#endif
10024#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
10025 /* For some reason, the PE format does not store a
10026 section address offset for a PC relative symbol. */
10027 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 10028 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
10029 value += md_pcrel_from (fixP);
10030#endif
10031 }
fbeb56a4 10032#if defined (OBJ_COFF) && defined (TE_PE)
f01c1a09
NC
10033 if (fixP->fx_addsy != NULL
10034 && S_IS_WEAK (fixP->fx_addsy)
10035 /* PR 16858: Do not modify weak function references. */
10036 && ! fixP->fx_pcrel)
fbeb56a4 10037 {
296a8689
NC
10038#if !defined (TE_PEP)
10039 /* For x86 PE weak function symbols are neither PC-relative
10040 nor do they set S_IS_FUNCTION. So the only reliable way
10041 to detect them is to check the flags of their containing
10042 section. */
10043 if (S_GET_SEGMENT (fixP->fx_addsy) != NULL
10044 && S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_CODE)
10045 ;
10046 else
10047#endif
fbeb56a4
DK
10048 value -= S_GET_VALUE (fixP->fx_addsy);
10049 }
10050#endif
252b5132
RH
10051
10052 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 10053 and we must not disappoint it. */
252b5132 10054#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 10055 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
10056 switch (fixP->fx_r_type)
10057 {
10058 case BFD_RELOC_386_PLT32:
3e73aa7c 10059 case BFD_RELOC_X86_64_PLT32:
47926f60
KH
10060 /* Make the jump instruction point to the address of the operand. At
10061 runtime we merely add the offset to the actual PLT entry. */
10062 value = -4;
10063 break;
31312f95 10064
13ae64f3
JJ
10065 case BFD_RELOC_386_TLS_GD:
10066 case BFD_RELOC_386_TLS_LDM:
13ae64f3 10067 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
10068 case BFD_RELOC_386_TLS_IE:
10069 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 10070 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
10071 case BFD_RELOC_X86_64_TLSGD:
10072 case BFD_RELOC_X86_64_TLSLD:
10073 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 10074 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
10075 value = 0; /* Fully resolved at runtime. No addend. */
10076 /* Fallthrough */
10077 case BFD_RELOC_386_TLS_LE:
10078 case BFD_RELOC_386_TLS_LDO_32:
10079 case BFD_RELOC_386_TLS_LE_32:
10080 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 10081 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 10082 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 10083 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
10084 S_SET_THREAD_LOCAL (fixP->fx_addsy);
10085 break;
10086
67a4f2b7
AO
10087 case BFD_RELOC_386_TLS_DESC_CALL:
10088 case BFD_RELOC_X86_64_TLSDESC_CALL:
10089 value = 0; /* Fully resolved at runtime. No addend. */
10090 S_SET_THREAD_LOCAL (fixP->fx_addsy);
10091 fixP->fx_done = 0;
10092 return;
10093
47926f60
KH
10094 case BFD_RELOC_VTABLE_INHERIT:
10095 case BFD_RELOC_VTABLE_ENTRY:
10096 fixP->fx_done = 0;
94f592af 10097 return;
47926f60
KH
10098
10099 default:
10100 break;
10101 }
10102#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 10103 *valP = value;
f86103b7 10104#endif /* !defined (TE_Mach) */
3e73aa7c 10105
3e73aa7c 10106 /* Are we finished with this relocation now? */
c6682705 10107 if (fixP->fx_addsy == NULL)
3e73aa7c 10108 fixP->fx_done = 1;
fbeb56a4
DK
10109#if defined (OBJ_COFF) && defined (TE_PE)
10110 else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
10111 {
10112 fixP->fx_done = 0;
10113 /* Remember value for tc_gen_reloc. */
10114 fixP->fx_addnumber = value;
10115 /* Clear out the frag for now. */
10116 value = 0;
10117 }
10118#endif
3e73aa7c
JH
10119 else if (use_rela_relocations)
10120 {
10121 fixP->fx_no_overflow = 1;
062cd5e7
AS
10122 /* Remember value for tc_gen_reloc. */
10123 fixP->fx_addnumber = value;
3e73aa7c
JH
10124 value = 0;
10125 }
f86103b7 10126
94f592af 10127 md_number_to_chars (p, value, fixP->fx_size);
252b5132 10128}
252b5132 10129\f
6d4af3c2 10130const char *
499ac353 10131md_atof (int type, char *litP, int *sizeP)
252b5132 10132{
499ac353
NC
10133 /* This outputs the LITTLENUMs in REVERSE order;
10134 in accord with the bigendian 386. */
10135 return ieee_md_atof (type, litP, sizeP, FALSE);
252b5132
RH
10136}
10137\f
2d545b82 10138static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 10139
252b5132 10140static char *
e3bb37b5 10141output_invalid (int c)
252b5132 10142{
3882b010 10143 if (ISPRINT (c))
f9f21a03
L
10144 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
10145 "'%c'", c);
252b5132 10146 else
f9f21a03 10147 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 10148 "(0x%x)", (unsigned char) c);
252b5132
RH
10149 return output_invalid_buf;
10150}
10151
af6bdddf 10152/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
10153
10154static const reg_entry *
4d1bb795 10155parse_real_register (char *reg_string, char **end_op)
252b5132 10156{
af6bdddf
AM
10157 char *s = reg_string;
10158 char *p;
252b5132
RH
10159 char reg_name_given[MAX_REG_NAME_SIZE + 1];
10160 const reg_entry *r;
10161
10162 /* Skip possible REGISTER_PREFIX and possible whitespace. */
10163 if (*s == REGISTER_PREFIX)
10164 ++s;
10165
10166 if (is_space_char (*s))
10167 ++s;
10168
10169 p = reg_name_given;
af6bdddf 10170 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
10171 {
10172 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
10173 return (const reg_entry *) NULL;
10174 s++;
252b5132
RH
10175 }
10176
6588847e
DN
10177 /* For naked regs, make sure that we are not dealing with an identifier.
10178 This prevents confusing an identifier like `eax_var' with register
10179 `eax'. */
10180 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
10181 return (const reg_entry *) NULL;
10182
af6bdddf 10183 *end_op = s;
252b5132
RH
10184
10185 r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
10186
5f47d35b 10187 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 10188 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 10189 {
0e0eea78
JB
10190 if (!cpu_arch_flags.bitfield.cpu8087
10191 && !cpu_arch_flags.bitfield.cpu287
10192 && !cpu_arch_flags.bitfield.cpu387)
10193 return (const reg_entry *) NULL;
10194
5f47d35b
AM
10195 if (is_space_char (*s))
10196 ++s;
10197 if (*s == '(')
10198 {
af6bdddf 10199 ++s;
5f47d35b
AM
10200 if (is_space_char (*s))
10201 ++s;
10202 if (*s >= '0' && *s <= '7')
10203 {
db557034 10204 int fpr = *s - '0';
af6bdddf 10205 ++s;
5f47d35b
AM
10206 if (is_space_char (*s))
10207 ++s;
10208 if (*s == ')')
10209 {
10210 *end_op = s + 1;
1e9cc1c2 10211 r = (const reg_entry *) hash_find (reg_hash, "st(0)");
db557034
AM
10212 know (r);
10213 return r + fpr;
5f47d35b 10214 }
5f47d35b 10215 }
47926f60 10216 /* We have "%st(" then garbage. */
5f47d35b
AM
10217 return (const reg_entry *) NULL;
10218 }
10219 }
10220
a60de03c
JB
10221 if (r == NULL || allow_pseudo_reg)
10222 return r;
10223
0dfbf9d7 10224 if (operand_type_all_zero (&r->reg_type))
a60de03c
JB
10225 return (const reg_entry *) NULL;
10226
dc821c5f 10227 if ((r->reg_type.bitfield.dword
192dc9c6
JB
10228 || r->reg_type.bitfield.sreg3
10229 || r->reg_type.bitfield.control
10230 || r->reg_type.bitfield.debug
10231 || r->reg_type.bitfield.test)
10232 && !cpu_arch_flags.bitfield.cpui386)
10233 return (const reg_entry *) NULL;
10234
6e041cf4 10235 if (r->reg_type.bitfield.regmmx && !cpu_arch_flags.bitfield.cpummx)
192dc9c6
JB
10236 return (const reg_entry *) NULL;
10237
6e041cf4
JB
10238 if (!cpu_arch_flags.bitfield.cpuavx512f)
10239 {
10240 if (r->reg_type.bitfield.zmmword || r->reg_type.bitfield.regmask)
10241 return (const reg_entry *) NULL;
40f12533 10242
6e041cf4
JB
10243 if (!cpu_arch_flags.bitfield.cpuavx)
10244 {
10245 if (r->reg_type.bitfield.ymmword)
10246 return (const reg_entry *) NULL;
1848e567 10247
6e041cf4
JB
10248 if (!cpu_arch_flags.bitfield.cpusse && r->reg_type.bitfield.xmmword)
10249 return (const reg_entry *) NULL;
10250 }
10251 }
43234a1e 10252
1adf7f56
JB
10253 if (r->reg_type.bitfield.regbnd && !cpu_arch_flags.bitfield.cpumpx)
10254 return (const reg_entry *) NULL;
10255
db51cc60 10256 /* Don't allow fake index register unless allow_index_reg isn't 0. */
a60de03c 10257 if (!allow_index_reg
db51cc60
L
10258 && (r->reg_num == RegEiz || r->reg_num == RegRiz))
10259 return (const reg_entry *) NULL;
10260
1d3f8286
JB
10261 /* Upper 16 vector registers are only available with VREX in 64bit
10262 mode, and require EVEX encoding. */
10263 if (r->reg_flags & RegVRex)
43234a1e
L
10264 {
10265 if (!cpu_arch_flags.bitfield.cpuvrex
10266 || flag_code != CODE_64BIT)
10267 return (const reg_entry *) NULL;
1d3f8286
JB
10268
10269 i.vec_encoding = vex_encoding_evex;
43234a1e
L
10270 }
10271
4787f4a5
JB
10272 if (((r->reg_flags & (RegRex64 | RegRex)) || r->reg_type.bitfield.qword)
10273 && (!cpu_arch_flags.bitfield.cpulm || !r->reg_type.bitfield.control)
1ae00879 10274 && flag_code != CODE_64BIT)
20f0a1fc 10275 return (const reg_entry *) NULL;
1ae00879 10276
b7240065
JB
10277 if (r->reg_type.bitfield.sreg3 && r->reg_num == RegFlat && !intel_syntax)
10278 return (const reg_entry *) NULL;
10279
252b5132
RH
10280 return r;
10281}
4d1bb795
JB
10282
10283/* REG_STRING starts *before* REGISTER_PREFIX. */
10284
10285static const reg_entry *
10286parse_register (char *reg_string, char **end_op)
10287{
10288 const reg_entry *r;
10289
10290 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
10291 r = parse_real_register (reg_string, end_op);
10292 else
10293 r = NULL;
10294 if (!r)
10295 {
10296 char *save = input_line_pointer;
10297 char c;
10298 symbolS *symbolP;
10299
10300 input_line_pointer = reg_string;
d02603dc 10301 c = get_symbol_name (&reg_string);
4d1bb795
JB
10302 symbolP = symbol_find (reg_string);
10303 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
10304 {
10305 const expressionS *e = symbol_get_value_expression (symbolP);
10306
0398aac5 10307 know (e->X_op == O_register);
4eed87de 10308 know (e->X_add_number >= 0
c3fe08fa 10309 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795 10310 r = i386_regtab + e->X_add_number;
d3bb6b49 10311 if ((r->reg_flags & RegVRex))
86fa6981 10312 i.vec_encoding = vex_encoding_evex;
4d1bb795
JB
10313 *end_op = input_line_pointer;
10314 }
10315 *input_line_pointer = c;
10316 input_line_pointer = save;
10317 }
10318 return r;
10319}
10320
10321int
10322i386_parse_name (char *name, expressionS *e, char *nextcharP)
10323{
10324 const reg_entry *r;
10325 char *end = input_line_pointer;
10326
10327 *end = *nextcharP;
10328 r = parse_register (name, &input_line_pointer);
10329 if (r && end <= input_line_pointer)
10330 {
10331 *nextcharP = *input_line_pointer;
10332 *input_line_pointer = 0;
10333 e->X_op = O_register;
10334 e->X_add_number = r - i386_regtab;
10335 return 1;
10336 }
10337 input_line_pointer = end;
10338 *end = 0;
ee86248c 10339 return intel_syntax ? i386_intel_parse_name (name, e) : 0;
4d1bb795
JB
10340}
10341
10342void
10343md_operand (expressionS *e)
10344{
ee86248c
JB
10345 char *end;
10346 const reg_entry *r;
4d1bb795 10347
ee86248c
JB
10348 switch (*input_line_pointer)
10349 {
10350 case REGISTER_PREFIX:
10351 r = parse_real_register (input_line_pointer, &end);
4d1bb795
JB
10352 if (r)
10353 {
10354 e->X_op = O_register;
10355 e->X_add_number = r - i386_regtab;
10356 input_line_pointer = end;
10357 }
ee86248c
JB
10358 break;
10359
10360 case '[':
9c2799c2 10361 gas_assert (intel_syntax);
ee86248c
JB
10362 end = input_line_pointer++;
10363 expression (e);
10364 if (*input_line_pointer == ']')
10365 {
10366 ++input_line_pointer;
10367 e->X_op_symbol = make_expr_symbol (e);
10368 e->X_add_symbol = NULL;
10369 e->X_add_number = 0;
10370 e->X_op = O_index;
10371 }
10372 else
10373 {
10374 e->X_op = O_absent;
10375 input_line_pointer = end;
10376 }
10377 break;
4d1bb795
JB
10378 }
10379}
10380
252b5132 10381\f
4cc782b5 10382#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b6f8c7c4 10383const char *md_shortopts = "kVQ:sqnO::";
252b5132 10384#else
b6f8c7c4 10385const char *md_shortopts = "qnO::";
252b5132 10386#endif
6e0b89ee 10387
3e73aa7c 10388#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
10389#define OPTION_64 (OPTION_MD_BASE + 1)
10390#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
10391#define OPTION_MARCH (OPTION_MD_BASE + 3)
10392#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
10393#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
10394#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
10395#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
10396#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
bd5dea88 10397#define OPTION_MRELAX_RELOCATIONS (OPTION_MD_BASE + 9)
c0f3af97 10398#define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
daf50ae7 10399#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
7bab8ab5
JB
10400#define OPTION_MOPERAND_CHECK (OPTION_MD_BASE + 12)
10401#define OPTION_MAVXSCALAR (OPTION_MD_BASE + 13)
10402#define OPTION_X32 (OPTION_MD_BASE + 14)
7e8b059b 10403#define OPTION_MADD_BND_PREFIX (OPTION_MD_BASE + 15)
43234a1e
L
10404#define OPTION_MEVEXLIG (OPTION_MD_BASE + 16)
10405#define OPTION_MEVEXWIG (OPTION_MD_BASE + 17)
167ad85b 10406#define OPTION_MBIG_OBJ (OPTION_MD_BASE + 18)
d1982f93 10407#define OPTION_MOMIT_LOCK_PREFIX (OPTION_MD_BASE + 19)
d3d3c6db 10408#define OPTION_MEVEXRCIG (OPTION_MD_BASE + 20)
8dcea932 10409#define OPTION_MSHARED (OPTION_MD_BASE + 21)
5db04b09
L
10410#define OPTION_MAMD64 (OPTION_MD_BASE + 22)
10411#define OPTION_MINTEL64 (OPTION_MD_BASE + 23)
e4e00185 10412#define OPTION_MFENCE_AS_LOCK_ADD (OPTION_MD_BASE + 24)
b3b91714 10413
99ad8390
NC
10414struct option md_longopts[] =
10415{
3e73aa7c 10416 {"32", no_argument, NULL, OPTION_32},
321098a5 10417#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 10418 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c 10419 {"64", no_argument, NULL, OPTION_64},
351f65ca
L
10420#endif
10421#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 10422 {"x32", no_argument, NULL, OPTION_X32},
8dcea932 10423 {"mshared", no_argument, NULL, OPTION_MSHARED},
6e0b89ee 10424#endif
b3b91714 10425 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
10426 {"march", required_argument, NULL, OPTION_MARCH},
10427 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
10428 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
10429 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
10430 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
10431 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
c0f3af97 10432 {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
daf50ae7 10433 {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
7bab8ab5 10434 {"moperand-check", required_argument, NULL, OPTION_MOPERAND_CHECK},
539f890d 10435 {"mavxscalar", required_argument, NULL, OPTION_MAVXSCALAR},
7e8b059b 10436 {"madd-bnd-prefix", no_argument, NULL, OPTION_MADD_BND_PREFIX},
43234a1e
L
10437 {"mevexlig", required_argument, NULL, OPTION_MEVEXLIG},
10438 {"mevexwig", required_argument, NULL, OPTION_MEVEXWIG},
167ad85b
TG
10439# if defined (TE_PE) || defined (TE_PEP)
10440 {"mbig-obj", no_argument, NULL, OPTION_MBIG_OBJ},
10441#endif
d1982f93 10442 {"momit-lock-prefix", required_argument, NULL, OPTION_MOMIT_LOCK_PREFIX},
e4e00185 10443 {"mfence-as-lock-add", required_argument, NULL, OPTION_MFENCE_AS_LOCK_ADD},
0cb4071e 10444 {"mrelax-relocations", required_argument, NULL, OPTION_MRELAX_RELOCATIONS},
d3d3c6db 10445 {"mevexrcig", required_argument, NULL, OPTION_MEVEXRCIG},
5db04b09
L
10446 {"mamd64", no_argument, NULL, OPTION_MAMD64},
10447 {"mintel64", no_argument, NULL, OPTION_MINTEL64},
252b5132
RH
10448 {NULL, no_argument, NULL, 0}
10449};
10450size_t md_longopts_size = sizeof (md_longopts);
10451
10452int
17b9d67d 10453md_parse_option (int c, const char *arg)
252b5132 10454{
91d6fa6a 10455 unsigned int j;
293f5f65 10456 char *arch, *next, *saved;
9103f4f4 10457
252b5132
RH
10458 switch (c)
10459 {
12b55ccc
L
10460 case 'n':
10461 optimize_align_code = 0;
10462 break;
10463
a38cf1db
AM
10464 case 'q':
10465 quiet_warnings = 1;
252b5132
RH
10466 break;
10467
10468#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
10469 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
10470 should be emitted or not. FIXME: Not implemented. */
10471 case 'Q':
252b5132
RH
10472 break;
10473
10474 /* -V: SVR4 argument to print version ID. */
10475 case 'V':
10476 print_version_id ();
10477 break;
10478
a38cf1db
AM
10479 /* -k: Ignore for FreeBSD compatibility. */
10480 case 'k':
252b5132 10481 break;
4cc782b5
ILT
10482
10483 case 's':
10484 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 10485 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 10486 break;
8dcea932
L
10487
10488 case OPTION_MSHARED:
10489 shared = 1;
10490 break;
99ad8390 10491#endif
321098a5 10492#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
d382c579 10493 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
3e73aa7c
JH
10494 case OPTION_64:
10495 {
10496 const char **list, **l;
10497
3e73aa7c
JH
10498 list = bfd_target_list ();
10499 for (l = list; *l != NULL; l++)
8620418b 10500 if (CONST_STRNEQ (*l, "elf64-x86-64")
99ad8390
NC
10501 || strcmp (*l, "coff-x86-64") == 0
10502 || strcmp (*l, "pe-x86-64") == 0
d382c579
TG
10503 || strcmp (*l, "pei-x86-64") == 0
10504 || strcmp (*l, "mach-o-x86-64") == 0)
6e0b89ee
AM
10505 {
10506 default_arch = "x86_64";
10507 break;
10508 }
3e73aa7c 10509 if (*l == NULL)
2b5d6a91 10510 as_fatal (_("no compiled in support for x86_64"));
3e73aa7c
JH
10511 free (list);
10512 }
10513 break;
10514#endif
252b5132 10515
351f65ca 10516#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
570561f7 10517 case OPTION_X32:
351f65ca
L
10518 if (IS_ELF)
10519 {
10520 const char **list, **l;
10521
10522 list = bfd_target_list ();
10523 for (l = list; *l != NULL; l++)
10524 if (CONST_STRNEQ (*l, "elf32-x86-64"))
10525 {
10526 default_arch = "x86_64:32";
10527 break;
10528 }
10529 if (*l == NULL)
2b5d6a91 10530 as_fatal (_("no compiled in support for 32bit x86_64"));
351f65ca
L
10531 free (list);
10532 }
10533 else
10534 as_fatal (_("32bit x86_64 is only supported for ELF"));
10535 break;
10536#endif
10537
6e0b89ee
AM
10538 case OPTION_32:
10539 default_arch = "i386";
10540 break;
10541
b3b91714
AM
10542 case OPTION_DIVIDE:
10543#ifdef SVR4_COMMENT_CHARS
10544 {
10545 char *n, *t;
10546 const char *s;
10547
add39d23 10548 n = XNEWVEC (char, strlen (i386_comment_chars) + 1);
b3b91714
AM
10549 t = n;
10550 for (s = i386_comment_chars; *s != '\0'; s++)
10551 if (*s != '/')
10552 *t++ = *s;
10553 *t = '\0';
10554 i386_comment_chars = n;
10555 }
10556#endif
10557 break;
10558
9103f4f4 10559 case OPTION_MARCH:
293f5f65
L
10560 saved = xstrdup (arg);
10561 arch = saved;
10562 /* Allow -march=+nosse. */
10563 if (*arch == '+')
10564 arch++;
6305a203 10565 do
9103f4f4 10566 {
6305a203 10567 if (*arch == '.')
2b5d6a91 10568 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
10569 next = strchr (arch, '+');
10570 if (next)
10571 *next++ = '\0';
91d6fa6a 10572 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 10573 {
91d6fa6a 10574 if (strcmp (arch, cpu_arch [j].name) == 0)
ccc9c027 10575 {
6305a203 10576 /* Processor. */
1ded5609
JB
10577 if (! cpu_arch[j].flags.bitfield.cpui386)
10578 continue;
10579
91d6fa6a 10580 cpu_arch_name = cpu_arch[j].name;
6305a203 10581 cpu_sub_arch_name = NULL;
91d6fa6a
NC
10582 cpu_arch_flags = cpu_arch[j].flags;
10583 cpu_arch_isa = cpu_arch[j].type;
10584 cpu_arch_isa_flags = cpu_arch[j].flags;
6305a203
L
10585 if (!cpu_arch_tune_set)
10586 {
10587 cpu_arch_tune = cpu_arch_isa;
10588 cpu_arch_tune_flags = cpu_arch_isa_flags;
10589 }
10590 break;
10591 }
91d6fa6a
NC
10592 else if (*cpu_arch [j].name == '.'
10593 && strcmp (arch, cpu_arch [j].name + 1) == 0)
6305a203 10594 {
33eaf5de 10595 /* ISA extension. */
6305a203 10596 i386_cpu_flags flags;
309d3373 10597
293f5f65
L
10598 flags = cpu_flags_or (cpu_arch_flags,
10599 cpu_arch[j].flags);
81486035 10600
5b64d091 10601 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
6305a203
L
10602 {
10603 if (cpu_sub_arch_name)
10604 {
10605 char *name = cpu_sub_arch_name;
10606 cpu_sub_arch_name = concat (name,
91d6fa6a 10607 cpu_arch[j].name,
1bf57e9f 10608 (const char *) NULL);
6305a203
L
10609 free (name);
10610 }
10611 else
91d6fa6a 10612 cpu_sub_arch_name = xstrdup (cpu_arch[j].name);
6305a203 10613 cpu_arch_flags = flags;
a586129e 10614 cpu_arch_isa_flags = flags;
6305a203 10615 }
0089dace
L
10616 else
10617 cpu_arch_isa_flags
10618 = cpu_flags_or (cpu_arch_isa_flags,
10619 cpu_arch[j].flags);
6305a203 10620 break;
ccc9c027 10621 }
9103f4f4 10622 }
6305a203 10623
293f5f65
L
10624 if (j >= ARRAY_SIZE (cpu_arch))
10625 {
33eaf5de 10626 /* Disable an ISA extension. */
293f5f65
L
10627 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
10628 if (strcmp (arch, cpu_noarch [j].name) == 0)
10629 {
10630 i386_cpu_flags flags;
10631
10632 flags = cpu_flags_and_not (cpu_arch_flags,
10633 cpu_noarch[j].flags);
10634 if (!cpu_flags_equal (&flags, &cpu_arch_flags))
10635 {
10636 if (cpu_sub_arch_name)
10637 {
10638 char *name = cpu_sub_arch_name;
10639 cpu_sub_arch_name = concat (arch,
10640 (const char *) NULL);
10641 free (name);
10642 }
10643 else
10644 cpu_sub_arch_name = xstrdup (arch);
10645 cpu_arch_flags = flags;
10646 cpu_arch_isa_flags = flags;
10647 }
10648 break;
10649 }
10650
10651 if (j >= ARRAY_SIZE (cpu_noarch))
10652 j = ARRAY_SIZE (cpu_arch);
10653 }
10654
91d6fa6a 10655 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 10656 as_fatal (_("invalid -march= option: `%s'"), arg);
6305a203
L
10657
10658 arch = next;
9103f4f4 10659 }
293f5f65
L
10660 while (next != NULL);
10661 free (saved);
9103f4f4
L
10662 break;
10663
10664 case OPTION_MTUNE:
10665 if (*arg == '.')
2b5d6a91 10666 as_fatal (_("invalid -mtune= option: `%s'"), arg);
91d6fa6a 10667 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
9103f4f4 10668 {
91d6fa6a 10669 if (strcmp (arg, cpu_arch [j].name) == 0)
9103f4f4 10670 {
ccc9c027 10671 cpu_arch_tune_set = 1;
91d6fa6a
NC
10672 cpu_arch_tune = cpu_arch [j].type;
10673 cpu_arch_tune_flags = cpu_arch[j].flags;
9103f4f4
L
10674 break;
10675 }
10676 }
91d6fa6a 10677 if (j >= ARRAY_SIZE (cpu_arch))
2b5d6a91 10678 as_fatal (_("invalid -mtune= option: `%s'"), arg);
9103f4f4
L
10679 break;
10680
1efbbeb4
L
10681 case OPTION_MMNEMONIC:
10682 if (strcasecmp (arg, "att") == 0)
10683 intel_mnemonic = 0;
10684 else if (strcasecmp (arg, "intel") == 0)
10685 intel_mnemonic = 1;
10686 else
2b5d6a91 10687 as_fatal (_("invalid -mmnemonic= option: `%s'"), arg);
1efbbeb4
L
10688 break;
10689
10690 case OPTION_MSYNTAX:
10691 if (strcasecmp (arg, "att") == 0)
10692 intel_syntax = 0;
10693 else if (strcasecmp (arg, "intel") == 0)
10694 intel_syntax = 1;
10695 else
2b5d6a91 10696 as_fatal (_("invalid -msyntax= option: `%s'"), arg);
1efbbeb4
L
10697 break;
10698
10699 case OPTION_MINDEX_REG:
10700 allow_index_reg = 1;
10701 break;
10702
10703 case OPTION_MNAKED_REG:
10704 allow_naked_reg = 1;
10705 break;
10706
c0f3af97
L
10707 case OPTION_MSSE2AVX:
10708 sse2avx = 1;
10709 break;
10710
daf50ae7
L
10711 case OPTION_MSSE_CHECK:
10712 if (strcasecmp (arg, "error") == 0)
7bab8ab5 10713 sse_check = check_error;
daf50ae7 10714 else if (strcasecmp (arg, "warning") == 0)
7bab8ab5 10715 sse_check = check_warning;
daf50ae7 10716 else if (strcasecmp (arg, "none") == 0)
7bab8ab5 10717 sse_check = check_none;
daf50ae7 10718 else
2b5d6a91 10719 as_fatal (_("invalid -msse-check= option: `%s'"), arg);
daf50ae7
L
10720 break;
10721
7bab8ab5
JB
10722 case OPTION_MOPERAND_CHECK:
10723 if (strcasecmp (arg, "error") == 0)
10724 operand_check = check_error;
10725 else if (strcasecmp (arg, "warning") == 0)
10726 operand_check = check_warning;
10727 else if (strcasecmp (arg, "none") == 0)
10728 operand_check = check_none;
10729 else
10730 as_fatal (_("invalid -moperand-check= option: `%s'"), arg);
10731 break;
10732
539f890d
L
10733 case OPTION_MAVXSCALAR:
10734 if (strcasecmp (arg, "128") == 0)
10735 avxscalar = vex128;
10736 else if (strcasecmp (arg, "256") == 0)
10737 avxscalar = vex256;
10738 else
2b5d6a91 10739 as_fatal (_("invalid -mavxscalar= option: `%s'"), arg);
539f890d
L
10740 break;
10741
7e8b059b
L
10742 case OPTION_MADD_BND_PREFIX:
10743 add_bnd_prefix = 1;
10744 break;
10745
43234a1e
L
10746 case OPTION_MEVEXLIG:
10747 if (strcmp (arg, "128") == 0)
10748 evexlig = evexl128;
10749 else if (strcmp (arg, "256") == 0)
10750 evexlig = evexl256;
10751 else if (strcmp (arg, "512") == 0)
10752 evexlig = evexl512;
10753 else
10754 as_fatal (_("invalid -mevexlig= option: `%s'"), arg);
10755 break;
10756
d3d3c6db
IT
10757 case OPTION_MEVEXRCIG:
10758 if (strcmp (arg, "rne") == 0)
10759 evexrcig = rne;
10760 else if (strcmp (arg, "rd") == 0)
10761 evexrcig = rd;
10762 else if (strcmp (arg, "ru") == 0)
10763 evexrcig = ru;
10764 else if (strcmp (arg, "rz") == 0)
10765 evexrcig = rz;
10766 else
10767 as_fatal (_("invalid -mevexrcig= option: `%s'"), arg);
10768 break;
10769
43234a1e
L
10770 case OPTION_MEVEXWIG:
10771 if (strcmp (arg, "0") == 0)
10772 evexwig = evexw0;
10773 else if (strcmp (arg, "1") == 0)
10774 evexwig = evexw1;
10775 else
10776 as_fatal (_("invalid -mevexwig= option: `%s'"), arg);
10777 break;
10778
167ad85b
TG
10779# if defined (TE_PE) || defined (TE_PEP)
10780 case OPTION_MBIG_OBJ:
10781 use_big_obj = 1;
10782 break;
10783#endif
10784
d1982f93 10785 case OPTION_MOMIT_LOCK_PREFIX:
d022bddd
IT
10786 if (strcasecmp (arg, "yes") == 0)
10787 omit_lock_prefix = 1;
10788 else if (strcasecmp (arg, "no") == 0)
10789 omit_lock_prefix = 0;
10790 else
10791 as_fatal (_("invalid -momit-lock-prefix= option: `%s'"), arg);
10792 break;
10793
e4e00185
AS
10794 case OPTION_MFENCE_AS_LOCK_ADD:
10795 if (strcasecmp (arg, "yes") == 0)
10796 avoid_fence = 1;
10797 else if (strcasecmp (arg, "no") == 0)
10798 avoid_fence = 0;
10799 else
10800 as_fatal (_("invalid -mfence-as-lock-add= option: `%s'"), arg);
10801 break;
10802
0cb4071e
L
10803 case OPTION_MRELAX_RELOCATIONS:
10804 if (strcasecmp (arg, "yes") == 0)
10805 generate_relax_relocations = 1;
10806 else if (strcasecmp (arg, "no") == 0)
10807 generate_relax_relocations = 0;
10808 else
10809 as_fatal (_("invalid -mrelax-relocations= option: `%s'"), arg);
10810 break;
10811
5db04b09 10812 case OPTION_MAMD64:
e89c5eaa 10813 intel64 = 0;
5db04b09
L
10814 break;
10815
10816 case OPTION_MINTEL64:
e89c5eaa 10817 intel64 = 1;
5db04b09
L
10818 break;
10819
b6f8c7c4
L
10820 case 'O':
10821 if (arg == NULL)
10822 {
10823 optimize = 1;
10824 /* Turn off -Os. */
10825 optimize_for_space = 0;
10826 }
10827 else if (*arg == 's')
10828 {
10829 optimize_for_space = 1;
10830 /* Turn on all encoding optimizations. */
10831 optimize = -1;
10832 }
10833 else
10834 {
10835 optimize = atoi (arg);
10836 /* Turn off -Os. */
10837 optimize_for_space = 0;
10838 }
10839 break;
10840
252b5132
RH
10841 default:
10842 return 0;
10843 }
10844 return 1;
10845}
10846
8a2c8fef
L
10847#define MESSAGE_TEMPLATE \
10848" "
10849
293f5f65
L
10850static char *
10851output_message (FILE *stream, char *p, char *message, char *start,
10852 int *left_p, const char *name, int len)
10853{
10854 int size = sizeof (MESSAGE_TEMPLATE);
10855 int left = *left_p;
10856
10857 /* Reserve 2 spaces for ", " or ",\0" */
10858 left -= len + 2;
10859
10860 /* Check if there is any room. */
10861 if (left >= 0)
10862 {
10863 if (p != start)
10864 {
10865 *p++ = ',';
10866 *p++ = ' ';
10867 }
10868 p = mempcpy (p, name, len);
10869 }
10870 else
10871 {
10872 /* Output the current message now and start a new one. */
10873 *p++ = ',';
10874 *p = '\0';
10875 fprintf (stream, "%s\n", message);
10876 p = start;
10877 left = size - (start - message) - len - 2;
10878
10879 gas_assert (left >= 0);
10880
10881 p = mempcpy (p, name, len);
10882 }
10883
10884 *left_p = left;
10885 return p;
10886}
10887
8a2c8fef 10888static void
1ded5609 10889show_arch (FILE *stream, int ext, int check)
8a2c8fef
L
10890{
10891 static char message[] = MESSAGE_TEMPLATE;
10892 char *start = message + 27;
10893 char *p;
10894 int size = sizeof (MESSAGE_TEMPLATE);
10895 int left;
10896 const char *name;
10897 int len;
10898 unsigned int j;
10899
10900 p = start;
10901 left = size - (start - message);
10902 for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
10903 {
10904 /* Should it be skipped? */
10905 if (cpu_arch [j].skip)
10906 continue;
10907
10908 name = cpu_arch [j].name;
10909 len = cpu_arch [j].len;
10910 if (*name == '.')
10911 {
10912 /* It is an extension. Skip if we aren't asked to show it. */
10913 if (ext)
10914 {
10915 name++;
10916 len--;
10917 }
10918 else
10919 continue;
10920 }
10921 else if (ext)
10922 {
10923 /* It is an processor. Skip if we show only extension. */
10924 continue;
10925 }
1ded5609
JB
10926 else if (check && ! cpu_arch[j].flags.bitfield.cpui386)
10927 {
10928 /* It is an impossible processor - skip. */
10929 continue;
10930 }
8a2c8fef 10931
293f5f65 10932 p = output_message (stream, p, message, start, &left, name, len);
8a2c8fef
L
10933 }
10934
293f5f65
L
10935 /* Display disabled extensions. */
10936 if (ext)
10937 for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
10938 {
10939 name = cpu_noarch [j].name;
10940 len = cpu_noarch [j].len;
10941 p = output_message (stream, p, message, start, &left, name,
10942 len);
10943 }
10944
8a2c8fef
L
10945 *p = '\0';
10946 fprintf (stream, "%s\n", message);
10947}
10948
252b5132 10949void
8a2c8fef 10950md_show_usage (FILE *stream)
252b5132 10951{
4cc782b5
ILT
10952#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
10953 fprintf (stream, _("\
a38cf1db
AM
10954 -Q ignored\n\
10955 -V print assembler version number\n\
b3b91714
AM
10956 -k ignored\n"));
10957#endif
10958 fprintf (stream, _("\
12b55ccc 10959 -n Do not optimize code alignment\n\
b3b91714
AM
10960 -q quieten some warnings\n"));
10961#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
10962 fprintf (stream, _("\
a38cf1db 10963 -s ignored\n"));
b3b91714 10964#endif
321098a5
L
10965#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
10966 || defined (TE_PE) || defined (TE_PEP))
751d281c 10967 fprintf (stream, _("\
570561f7 10968 --32/--64/--x32 generate 32bit/64bit/x32 code\n"));
751d281c 10969#endif
b3b91714
AM
10970#ifdef SVR4_COMMENT_CHARS
10971 fprintf (stream, _("\
10972 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
10973#else
10974 fprintf (stream, _("\
b3b91714 10975 --divide ignored\n"));
4cc782b5 10976#endif
9103f4f4 10977 fprintf (stream, _("\
6305a203 10978 -march=CPU[,+EXTENSION...]\n\
8a2c8fef 10979 generate code for CPU and EXTENSION, CPU is one of:\n"));
1ded5609 10980 show_arch (stream, 0, 1);
8a2c8fef
L
10981 fprintf (stream, _("\
10982 EXTENSION is combination of:\n"));
1ded5609 10983 show_arch (stream, 1, 0);
6305a203 10984 fprintf (stream, _("\
8a2c8fef 10985 -mtune=CPU optimize for CPU, CPU is one of:\n"));
1ded5609 10986 show_arch (stream, 0, 0);
ba104c83 10987 fprintf (stream, _("\
c0f3af97
L
10988 -msse2avx encode SSE instructions with VEX prefix\n"));
10989 fprintf (stream, _("\
daf50ae7
L
10990 -msse-check=[none|error|warning]\n\
10991 check SSE instructions\n"));
10992 fprintf (stream, _("\
7bab8ab5
JB
10993 -moperand-check=[none|error|warning]\n\
10994 check operand combinations for validity\n"));
10995 fprintf (stream, _("\
539f890d
L
10996 -mavxscalar=[128|256] encode scalar AVX instructions with specific vector\n\
10997 length\n"));
10998 fprintf (stream, _("\
43234a1e
L
10999 -mevexlig=[128|256|512] encode scalar EVEX instructions with specific vector\n\
11000 length\n"));
11001 fprintf (stream, _("\
11002 -mevexwig=[0|1] encode EVEX instructions with specific EVEX.W value\n\
11003 for EVEX.W bit ignored instructions\n"));
11004 fprintf (stream, _("\
d3d3c6db
IT
11005 -mevexrcig=[rne|rd|ru|rz]\n\
11006 encode EVEX instructions with specific EVEX.RC value\n\
11007 for SAE-only ignored instructions\n"));
11008 fprintf (stream, _("\
ba104c83
L
11009 -mmnemonic=[att|intel] use AT&T/Intel mnemonic\n"));
11010 fprintf (stream, _("\
11011 -msyntax=[att|intel] use AT&T/Intel syntax\n"));
11012 fprintf (stream, _("\
11013 -mindex-reg support pseudo index registers\n"));
11014 fprintf (stream, _("\
11015 -mnaked-reg don't require `%%' prefix for registers\n"));
11016 fprintf (stream, _("\
7e8b059b 11017 -madd-bnd-prefix add BND prefix for all valid branches\n"));
8dcea932
L
11018 fprintf (stream, _("\
11019 -mshared disable branch optimization for shared code\n"));
167ad85b
TG
11020# if defined (TE_PE) || defined (TE_PEP)
11021 fprintf (stream, _("\
11022 -mbig-obj generate big object files\n"));
11023#endif
d022bddd
IT
11024 fprintf (stream, _("\
11025 -momit-lock-prefix=[no|yes]\n\
11026 strip all lock prefixes\n"));
5db04b09 11027 fprintf (stream, _("\
e4e00185
AS
11028 -mfence-as-lock-add=[no|yes]\n\
11029 encode lfence, mfence and sfence as\n\
11030 lock addl $0x0, (%%{re}sp)\n"));
11031 fprintf (stream, _("\
0cb4071e
L
11032 -mrelax-relocations=[no|yes]\n\
11033 generate relax relocations\n"));
11034 fprintf (stream, _("\
5db04b09
L
11035 -mamd64 accept only AMD64 ISA\n"));
11036 fprintf (stream, _("\
11037 -mintel64 accept only Intel64 ISA\n"));
252b5132
RH
11038}
11039
3e73aa7c 11040#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
321098a5 11041 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
e57f8c65 11042 || defined (TE_PE) || defined (TE_PEP) || defined (OBJ_MACH_O))
252b5132
RH
11043
11044/* Pick the target format to use. */
11045
47926f60 11046const char *
e3bb37b5 11047i386_target_format (void)
252b5132 11048{
351f65ca
L
11049 if (!strncmp (default_arch, "x86_64", 6))
11050 {
11051 update_code_flag (CODE_64BIT, 1);
11052 if (default_arch[6] == '\0')
7f56bc95 11053 x86_elf_abi = X86_64_ABI;
351f65ca 11054 else
7f56bc95 11055 x86_elf_abi = X86_64_X32_ABI;
351f65ca 11056 }
3e73aa7c 11057 else if (!strcmp (default_arch, "i386"))
78f12dd3 11058 update_code_flag (CODE_32BIT, 1);
5197d474
L
11059 else if (!strcmp (default_arch, "iamcu"))
11060 {
11061 update_code_flag (CODE_32BIT, 1);
11062 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
11063 {
11064 static const i386_cpu_flags iamcu_flags = CPU_IAMCU_FLAGS;
11065 cpu_arch_name = "iamcu";
11066 cpu_sub_arch_name = NULL;
11067 cpu_arch_flags = iamcu_flags;
11068 cpu_arch_isa = PROCESSOR_IAMCU;
11069 cpu_arch_isa_flags = iamcu_flags;
11070 if (!cpu_arch_tune_set)
11071 {
11072 cpu_arch_tune = cpu_arch_isa;
11073 cpu_arch_tune_flags = cpu_arch_isa_flags;
11074 }
11075 }
8d471ec1 11076 else if (cpu_arch_isa != PROCESSOR_IAMCU)
5197d474
L
11077 as_fatal (_("Intel MCU doesn't support `%s' architecture"),
11078 cpu_arch_name);
11079 }
3e73aa7c 11080 else
2b5d6a91 11081 as_fatal (_("unknown architecture"));
89507696
JB
11082
11083 if (cpu_flags_all_zero (&cpu_arch_isa_flags))
11084 cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].flags;
11085 if (cpu_flags_all_zero (&cpu_arch_tune_flags))
11086 cpu_arch_tune_flags = cpu_arch[flag_code == CODE_64BIT].flags;
11087
252b5132
RH
11088 switch (OUTPUT_FLAVOR)
11089 {
9384f2ff 11090#if defined (OBJ_MAYBE_AOUT) || defined (OBJ_AOUT)
4c63da97 11091 case bfd_target_aout_flavour:
47926f60 11092 return AOUT_TARGET_FORMAT;
4c63da97 11093#endif
9384f2ff
AM
11094#if defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)
11095# if defined (TE_PE) || defined (TE_PEP)
11096 case bfd_target_coff_flavour:
167ad85b
TG
11097 if (flag_code == CODE_64BIT)
11098 return use_big_obj ? "pe-bigobj-x86-64" : "pe-x86-64";
11099 else
11100 return "pe-i386";
9384f2ff 11101# elif defined (TE_GO32)
0561d57c
JK
11102 case bfd_target_coff_flavour:
11103 return "coff-go32";
9384f2ff 11104# else
252b5132
RH
11105 case bfd_target_coff_flavour:
11106 return "coff-i386";
9384f2ff 11107# endif
4c63da97 11108#endif
3e73aa7c 11109#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 11110 case bfd_target_elf_flavour:
3e73aa7c 11111 {
351f65ca
L
11112 const char *format;
11113
11114 switch (x86_elf_abi)
4fa24527 11115 {
351f65ca
L
11116 default:
11117 format = ELF_TARGET_FORMAT;
11118 break;
7f56bc95 11119 case X86_64_ABI:
351f65ca 11120 use_rela_relocations = 1;
4fa24527 11121 object_64bit = 1;
351f65ca
L
11122 format = ELF_TARGET_FORMAT64;
11123 break;
7f56bc95 11124 case X86_64_X32_ABI:
4fa24527 11125 use_rela_relocations = 1;
351f65ca 11126 object_64bit = 1;
862be3fb 11127 disallow_64bit_reloc = 1;
351f65ca
L
11128 format = ELF_TARGET_FORMAT32;
11129 break;
4fa24527 11130 }
3632d14b 11131 if (cpu_arch_isa == PROCESSOR_L1OM)
8a9036a4 11132 {
7f56bc95 11133 if (x86_elf_abi != X86_64_ABI)
8a9036a4
L
11134 as_fatal (_("Intel L1OM is 64bit only"));
11135 return ELF_TARGET_L1OM_FORMAT;
11136 }
b49f93f6 11137 else if (cpu_arch_isa == PROCESSOR_K1OM)
7a9068fe
L
11138 {
11139 if (x86_elf_abi != X86_64_ABI)
11140 as_fatal (_("Intel K1OM is 64bit only"));
11141 return ELF_TARGET_K1OM_FORMAT;
11142 }
81486035
L
11143 else if (cpu_arch_isa == PROCESSOR_IAMCU)
11144 {
11145 if (x86_elf_abi != I386_ABI)
11146 as_fatal (_("Intel MCU is 32bit only"));
11147 return ELF_TARGET_IAMCU_FORMAT;
11148 }
8a9036a4 11149 else
351f65ca 11150 return format;
3e73aa7c 11151 }
e57f8c65
TG
11152#endif
11153#if defined (OBJ_MACH_O)
11154 case bfd_target_mach_o_flavour:
d382c579
TG
11155 if (flag_code == CODE_64BIT)
11156 {
11157 use_rela_relocations = 1;
11158 object_64bit = 1;
11159 return "mach-o-x86-64";
11160 }
11161 else
11162 return "mach-o-i386";
4c63da97 11163#endif
252b5132
RH
11164 default:
11165 abort ();
11166 return NULL;
11167 }
11168}
11169
47926f60 11170#endif /* OBJ_MAYBE_ more than one */
252b5132 11171\f
252b5132 11172symbolS *
7016a5d5 11173md_undefined_symbol (char *name)
252b5132 11174{
18dc2407
ILT
11175 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
11176 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
11177 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
11178 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
11179 {
11180 if (!GOT_symbol)
11181 {
11182 if (symbol_find (name))
11183 as_bad (_("GOT already in symbol table"));
11184 GOT_symbol = symbol_new (name, undefined_section,
11185 (valueT) 0, &zero_address_frag);
11186 };
11187 return GOT_symbol;
11188 }
252b5132
RH
11189 return 0;
11190}
11191
11192/* Round up a section size to the appropriate boundary. */
47926f60 11193
252b5132 11194valueT
7016a5d5 11195md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
252b5132 11196{
4c63da97
AM
11197#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
11198 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
11199 {
11200 /* For a.out, force the section size to be aligned. If we don't do
11201 this, BFD will align it for us, but it will not write out the
11202 final bytes of the section. This may be a bug in BFD, but it is
11203 easier to fix it here since that is how the other a.out targets
11204 work. */
11205 int align;
11206
11207 align = bfd_get_section_alignment (stdoutput, segment);
8d3842cd 11208 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4c63da97 11209 }
252b5132
RH
11210#endif
11211
11212 return size;
11213}
11214
11215/* On the i386, PC-relative offsets are relative to the start of the
11216 next instruction. That is, the address of the offset, plus its
11217 size, since the offset is always the last part of the insn. */
11218
11219long
e3bb37b5 11220md_pcrel_from (fixS *fixP)
252b5132
RH
11221{
11222 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
11223}
11224
11225#ifndef I386COFF
11226
11227static void
e3bb37b5 11228s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 11229{
29b0f896 11230 int temp;
252b5132 11231
8a75718c
JB
11232#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11233 if (IS_ELF)
11234 obj_elf_section_change_hook ();
11235#endif
252b5132
RH
11236 temp = get_absolute_expression ();
11237 subseg_set (bss_section, (subsegT) temp);
11238 demand_empty_rest_of_line ();
11239}
11240
11241#endif
11242
252b5132 11243void
e3bb37b5 11244i386_validate_fix (fixS *fixp)
252b5132 11245{
02a86693 11246 if (fixp->fx_subsy)
252b5132 11247 {
02a86693 11248 if (fixp->fx_subsy == GOT_symbol)
23df1078 11249 {
02a86693
L
11250 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
11251 {
11252 if (!object_64bit)
11253 abort ();
11254#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11255 if (fixp->fx_tcbit2)
56ceb5b5
L
11256 fixp->fx_r_type = (fixp->fx_tcbit
11257 ? BFD_RELOC_X86_64_REX_GOTPCRELX
11258 : BFD_RELOC_X86_64_GOTPCRELX);
02a86693
L
11259 else
11260#endif
11261 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
11262 }
d6ab8113 11263 else
02a86693
L
11264 {
11265 if (!object_64bit)
11266 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
11267 else
11268 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
11269 }
11270 fixp->fx_subsy = 0;
23df1078 11271 }
252b5132 11272 }
02a86693
L
11273#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11274 else if (!object_64bit)
11275 {
11276 if (fixp->fx_r_type == BFD_RELOC_386_GOT32
11277 && fixp->fx_tcbit2)
11278 fixp->fx_r_type = BFD_RELOC_386_GOT32X;
11279 }
11280#endif
252b5132
RH
11281}
11282
252b5132 11283arelent *
7016a5d5 11284tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
11285{
11286 arelent *rel;
11287 bfd_reloc_code_real_type code;
11288
11289 switch (fixp->fx_r_type)
11290 {
8ce3d284 11291#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8fd4256d
L
11292 case BFD_RELOC_SIZE32:
11293 case BFD_RELOC_SIZE64:
11294 if (S_IS_DEFINED (fixp->fx_addsy)
11295 && !S_IS_EXTERNAL (fixp->fx_addsy))
11296 {
11297 /* Resolve size relocation against local symbol to size of
11298 the symbol plus addend. */
11299 valueT value = S_GET_SIZE (fixp->fx_addsy) + fixp->fx_offset;
11300 if (fixp->fx_r_type == BFD_RELOC_SIZE32
11301 && !fits_in_unsigned_long (value))
11302 as_bad_where (fixp->fx_file, fixp->fx_line,
11303 _("symbol size computation overflow"));
11304 fixp->fx_addsy = NULL;
11305 fixp->fx_subsy = NULL;
11306 md_apply_fix (fixp, (valueT *) &value, NULL);
11307 return NULL;
11308 }
8ce3d284 11309#endif
1a0670f3 11310 /* Fall through. */
8fd4256d 11311
3e73aa7c
JH
11312 case BFD_RELOC_X86_64_PLT32:
11313 case BFD_RELOC_X86_64_GOT32:
11314 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
11315 case BFD_RELOC_X86_64_GOTPCRELX:
11316 case BFD_RELOC_X86_64_REX_GOTPCRELX:
252b5132
RH
11317 case BFD_RELOC_386_PLT32:
11318 case BFD_RELOC_386_GOT32:
02a86693 11319 case BFD_RELOC_386_GOT32X:
252b5132
RH
11320 case BFD_RELOC_386_GOTOFF:
11321 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
11322 case BFD_RELOC_386_TLS_GD:
11323 case BFD_RELOC_386_TLS_LDM:
11324 case BFD_RELOC_386_TLS_LDO_32:
11325 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
11326 case BFD_RELOC_386_TLS_IE:
11327 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
11328 case BFD_RELOC_386_TLS_LE_32:
11329 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
11330 case BFD_RELOC_386_TLS_GOTDESC:
11331 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
11332 case BFD_RELOC_X86_64_TLSGD:
11333 case BFD_RELOC_X86_64_TLSLD:
11334 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 11335 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
11336 case BFD_RELOC_X86_64_GOTTPOFF:
11337 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
11338 case BFD_RELOC_X86_64_TPOFF64:
11339 case BFD_RELOC_X86_64_GOTOFF64:
11340 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
11341 case BFD_RELOC_X86_64_GOT64:
11342 case BFD_RELOC_X86_64_GOTPCREL64:
11343 case BFD_RELOC_X86_64_GOTPC64:
11344 case BFD_RELOC_X86_64_GOTPLT64:
11345 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
11346 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
11347 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
11348 case BFD_RELOC_RVA:
11349 case BFD_RELOC_VTABLE_ENTRY:
11350 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
11351#ifdef TE_PE
11352 case BFD_RELOC_32_SECREL:
11353#endif
252b5132
RH
11354 code = fixp->fx_r_type;
11355 break;
dbbaec26
L
11356 case BFD_RELOC_X86_64_32S:
11357 if (!fixp->fx_pcrel)
11358 {
11359 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
11360 code = fixp->fx_r_type;
11361 break;
11362 }
1a0670f3 11363 /* Fall through. */
252b5132 11364 default:
93382f6d 11365 if (fixp->fx_pcrel)
252b5132 11366 {
93382f6d
AM
11367 switch (fixp->fx_size)
11368 {
11369 default:
b091f402
AM
11370 as_bad_where (fixp->fx_file, fixp->fx_line,
11371 _("can not do %d byte pc-relative relocation"),
11372 fixp->fx_size);
93382f6d
AM
11373 code = BFD_RELOC_32_PCREL;
11374 break;
11375 case 1: code = BFD_RELOC_8_PCREL; break;
11376 case 2: code = BFD_RELOC_16_PCREL; break;
d258b828 11377 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
11378#ifdef BFD64
11379 case 8: code = BFD_RELOC_64_PCREL; break;
11380#endif
93382f6d
AM
11381 }
11382 }
11383 else
11384 {
11385 switch (fixp->fx_size)
11386 {
11387 default:
b091f402
AM
11388 as_bad_where (fixp->fx_file, fixp->fx_line,
11389 _("can not do %d byte relocation"),
11390 fixp->fx_size);
93382f6d
AM
11391 code = BFD_RELOC_32;
11392 break;
11393 case 1: code = BFD_RELOC_8; break;
11394 case 2: code = BFD_RELOC_16; break;
11395 case 4: code = BFD_RELOC_32; break;
937149dd 11396#ifdef BFD64
3e73aa7c 11397 case 8: code = BFD_RELOC_64; break;
937149dd 11398#endif
93382f6d 11399 }
252b5132
RH
11400 }
11401 break;
11402 }
252b5132 11403
d182319b
JB
11404 if ((code == BFD_RELOC_32
11405 || code == BFD_RELOC_32_PCREL
11406 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
11407 && GOT_symbol
11408 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 11409 {
4fa24527 11410 if (!object_64bit)
d6ab8113
JB
11411 code = BFD_RELOC_386_GOTPC;
11412 else
11413 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 11414 }
7b81dfbb
AJ
11415 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
11416 && GOT_symbol
11417 && fixp->fx_addsy == GOT_symbol)
11418 {
11419 code = BFD_RELOC_X86_64_GOTPC64;
11420 }
252b5132 11421
add39d23
TS
11422 rel = XNEW (arelent);
11423 rel->sym_ptr_ptr = XNEW (asymbol *);
49309057 11424 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
11425
11426 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 11427
3e73aa7c
JH
11428 if (!use_rela_relocations)
11429 {
11430 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
11431 vtable entry to be used in the relocation's section offset. */
11432 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
11433 rel->address = fixp->fx_offset;
fbeb56a4
DK
11434#if defined (OBJ_COFF) && defined (TE_PE)
11435 else if (fixp->fx_addsy && S_IS_WEAK (fixp->fx_addsy))
11436 rel->addend = fixp->fx_addnumber - (S_GET_VALUE (fixp->fx_addsy) * 2);
11437 else
11438#endif
c6682705 11439 rel->addend = 0;
3e73aa7c
JH
11440 }
11441 /* Use the rela in 64bit mode. */
252b5132 11442 else
3e73aa7c 11443 {
862be3fb
L
11444 if (disallow_64bit_reloc)
11445 switch (code)
11446 {
862be3fb
L
11447 case BFD_RELOC_X86_64_DTPOFF64:
11448 case BFD_RELOC_X86_64_TPOFF64:
11449 case BFD_RELOC_64_PCREL:
11450 case BFD_RELOC_X86_64_GOTOFF64:
11451 case BFD_RELOC_X86_64_GOT64:
11452 case BFD_RELOC_X86_64_GOTPCREL64:
11453 case BFD_RELOC_X86_64_GOTPC64:
11454 case BFD_RELOC_X86_64_GOTPLT64:
11455 case BFD_RELOC_X86_64_PLTOFF64:
11456 as_bad_where (fixp->fx_file, fixp->fx_line,
11457 _("cannot represent relocation type %s in x32 mode"),
11458 bfd_get_reloc_code_name (code));
11459 break;
11460 default:
11461 break;
11462 }
11463
062cd5e7
AS
11464 if (!fixp->fx_pcrel)
11465 rel->addend = fixp->fx_offset;
11466 else
11467 switch (code)
11468 {
11469 case BFD_RELOC_X86_64_PLT32:
11470 case BFD_RELOC_X86_64_GOT32:
11471 case BFD_RELOC_X86_64_GOTPCREL:
56ceb5b5
L
11472 case BFD_RELOC_X86_64_GOTPCRELX:
11473 case BFD_RELOC_X86_64_REX_GOTPCRELX:
bffbf940
JJ
11474 case BFD_RELOC_X86_64_TLSGD:
11475 case BFD_RELOC_X86_64_TLSLD:
11476 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
11477 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
11478 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
11479 rel->addend = fixp->fx_offset - fixp->fx_size;
11480 break;
11481 default:
11482 rel->addend = (section->vma
11483 - fixp->fx_size
11484 + fixp->fx_addnumber
11485 + md_pcrel_from (fixp));
11486 break;
11487 }
3e73aa7c
JH
11488 }
11489
252b5132
RH
11490 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
11491 if (rel->howto == NULL)
11492 {
11493 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 11494 _("cannot represent relocation type %s"),
252b5132
RH
11495 bfd_get_reloc_code_name (code));
11496 /* Set howto to a garbage value so that we can keep going. */
11497 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
9c2799c2 11498 gas_assert (rel->howto != NULL);
252b5132
RH
11499 }
11500
11501 return rel;
11502}
11503
ee86248c 11504#include "tc-i386-intel.c"
54cfded0 11505
a60de03c
JB
11506void
11507tc_x86_parse_to_dw2regnum (expressionS *exp)
54cfded0 11508{
a60de03c
JB
11509 int saved_naked_reg;
11510 char saved_register_dot;
54cfded0 11511
a60de03c
JB
11512 saved_naked_reg = allow_naked_reg;
11513 allow_naked_reg = 1;
11514 saved_register_dot = register_chars['.'];
11515 register_chars['.'] = '.';
11516 allow_pseudo_reg = 1;
11517 expression_and_evaluate (exp);
11518 allow_pseudo_reg = 0;
11519 register_chars['.'] = saved_register_dot;
11520 allow_naked_reg = saved_naked_reg;
11521
e96d56a1 11522 if (exp->X_op == O_register && exp->X_add_number >= 0)
54cfded0 11523 {
a60de03c
JB
11524 if ((addressT) exp->X_add_number < i386_regtab_size)
11525 {
11526 exp->X_op = O_constant;
11527 exp->X_add_number = i386_regtab[exp->X_add_number]
11528 .dw2_regnum[flag_code >> 1];
11529 }
11530 else
11531 exp->X_op = O_illegal;
54cfded0 11532 }
54cfded0
AM
11533}
11534
11535void
11536tc_x86_frame_initial_instructions (void)
11537{
a60de03c
JB
11538 static unsigned int sp_regno[2];
11539
11540 if (!sp_regno[flag_code >> 1])
11541 {
11542 char *saved_input = input_line_pointer;
11543 char sp[][4] = {"esp", "rsp"};
11544 expressionS exp;
a4447b93 11545
a60de03c
JB
11546 input_line_pointer = sp[flag_code >> 1];
11547 tc_x86_parse_to_dw2regnum (&exp);
9c2799c2 11548 gas_assert (exp.X_op == O_constant);
a60de03c
JB
11549 sp_regno[flag_code >> 1] = exp.X_add_number;
11550 input_line_pointer = saved_input;
11551 }
a4447b93 11552
61ff971f
L
11553 cfi_add_CFA_def_cfa (sp_regno[flag_code >> 1], -x86_cie_data_alignment);
11554 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 11555}
d2b2c203 11556
d7921315
L
11557int
11558x86_dwarf2_addr_size (void)
11559{
11560#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
11561 if (x86_elf_abi == X86_64_X32_ABI)
11562 return 4;
11563#endif
11564 return bfd_arch_bits_per_address (stdoutput) / 8;
11565}
11566
d2b2c203
DJ
11567int
11568i386_elf_section_type (const char *str, size_t len)
11569{
11570 if (flag_code == CODE_64BIT
11571 && len == sizeof ("unwind") - 1
11572 && strncmp (str, "unwind", 6) == 0)
11573 return SHT_X86_64_UNWIND;
11574
11575 return -1;
11576}
bb41ade5 11577
ad5fec3b
EB
11578#ifdef TE_SOLARIS
11579void
11580i386_solaris_fix_up_eh_frame (segT sec)
11581{
11582 if (flag_code == CODE_64BIT)
11583 elf_section_type (sec) = SHT_X86_64_UNWIND;
11584}
11585#endif
11586
bb41ade5
AM
11587#ifdef TE_PE
11588void
11589tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
11590{
91d6fa6a 11591 expressionS exp;
bb41ade5 11592
91d6fa6a
NC
11593 exp.X_op = O_secrel;
11594 exp.X_add_symbol = symbol;
11595 exp.X_add_number = 0;
11596 emit_expr (&exp, size);
bb41ade5
AM
11597}
11598#endif
3b22753a
L
11599
11600#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
11601/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
11602
01e1a5bc 11603bfd_vma
6d4af3c2 11604x86_64_section_letter (int letter, const char **ptr_msg)
3b22753a
L
11605{
11606 if (flag_code == CODE_64BIT)
11607 {
11608 if (letter == 'l')
11609 return SHF_X86_64_LARGE;
11610
8f3bae45 11611 *ptr_msg = _("bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 11612 }
3b22753a 11613 else
8f3bae45 11614 *ptr_msg = _("bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
11615 return -1;
11616}
11617
01e1a5bc 11618bfd_vma
3b22753a
L
11619x86_64_section_word (char *str, size_t len)
11620{
8620418b 11621 if (len == 5 && flag_code == CODE_64BIT && CONST_STRNEQ (str, "large"))
3b22753a
L
11622 return SHF_X86_64_LARGE;
11623
11624 return -1;
11625}
11626
11627static void
11628handle_large_common (int small ATTRIBUTE_UNUSED)
11629{
11630 if (flag_code != CODE_64BIT)
11631 {
11632 s_comm_internal (0, elf_common_parse);
11633 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
11634 }
11635 else
11636 {
11637 static segT lbss_section;
11638 asection *saved_com_section_ptr = elf_com_section_ptr;
11639 asection *saved_bss_section = bss_section;
11640
11641 if (lbss_section == NULL)
11642 {
11643 flagword applicable;
11644 segT seg = now_seg;
11645 subsegT subseg = now_subseg;
11646
11647 /* The .lbss section is for local .largecomm symbols. */
11648 lbss_section = subseg_new (".lbss", 0);
11649 applicable = bfd_applicable_section_flags (stdoutput);
11650 bfd_set_section_flags (stdoutput, lbss_section,
11651 applicable & SEC_ALLOC);
11652 seg_info (lbss_section)->bss = 1;
11653
11654 subseg_set (seg, subseg);
11655 }
11656
11657 elf_com_section_ptr = &_bfd_elf_large_com_section;
11658 bss_section = lbss_section;
11659
11660 s_comm_internal (0, elf_common_parse);
11661
11662 elf_com_section_ptr = saved_com_section_ptr;
11663 bss_section = saved_bss_section;
11664 }
11665}
11666#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
This page took 2.121097 seconds and 4 git commands to generate.