2008-01-10 H.J. Lu <hongjiu.lu@intel.com>
[deliverable/binutils-gdb.git] / gas / config / tc-i386.c
CommitLineData
b534c6d3 1/* tc-i386.c -- Assemble code for the Intel 80386
f7e42eb4 2 Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
5dd15031 3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
47926f60 4 Free Software Foundation, Inc.
252b5132
RH
5
6 This file is part of GAS, the GNU Assembler.
7
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
ec2655a6 10 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
11 any later version.
12
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
252b5132 22
47926f60
KH
23/* Intel 80386 machine specific gas.
24 Written by Eliot Dresselhaus (eliot@mgm.mit.edu).
3e73aa7c 25 x86_64 support by Jan Hubicka (jh@suse.cz)
0f10071e 26 VIA PadLock support by Michal Ludvig (mludvig@suse.cz)
47926f60
KH
27 Bugs & suggestions are completely welcome. This is free software.
28 Please help us make it better. */
252b5132 29
252b5132 30#include "as.h"
3882b010 31#include "safe-ctype.h"
252b5132 32#include "subsegs.h"
316e2c05 33#include "dwarf2dbg.h"
54cfded0 34#include "dw2gencfi.h"
d2b2c203 35#include "elf/x86-64.h"
40fb9820 36#include "opcodes/i386-init.h"
252b5132 37
252b5132
RH
38#ifndef REGISTER_WARNINGS
39#define REGISTER_WARNINGS 1
40#endif
41
c3332e24 42#ifndef INFER_ADDR_PREFIX
eecb386c 43#define INFER_ADDR_PREFIX 1
c3332e24
AM
44#endif
45
29b0f896
AM
46#ifndef DEFAULT_ARCH
47#define DEFAULT_ARCH "i386"
246fcdee 48#endif
252b5132 49
edde18a5
AM
50#ifndef INLINE
51#if __GNUC__ >= 2
52#define INLINE __inline__
53#else
54#define INLINE
55#endif
56#endif
57
e3bb37b5
L
58static void set_code_flag (int);
59static void set_16bit_gcc_code_flag (int);
60static void set_intel_syntax (int);
1efbbeb4 61static void set_intel_mnemonic (int);
db51cc60 62static void set_allow_index_reg (int);
e3bb37b5 63static void set_cpu_arch (int);
6482c264 64#ifdef TE_PE
e3bb37b5 65static void pe_directive_secrel (int);
6482c264 66#endif
e3bb37b5
L
67static void signed_cons (int);
68static char *output_invalid (int c);
a7619375 69static int i386_att_operand (char *);
e3bb37b5
L
70static int i386_intel_operand (char *, int);
71static const reg_entry *parse_register (char *, char **);
72static char *parse_insn (char *, char *);
73static char *parse_operands (char *, const char *);
74static void swap_operands (void);
4d456e3d 75static void swap_2_operands (int, int);
e3bb37b5
L
76static void optimize_imm (void);
77static void optimize_disp (void);
78static int match_template (void);
79static int check_string (void);
80static int process_suffix (void);
81static int check_byte_reg (void);
82static int check_long_reg (void);
83static int check_qword_reg (void);
84static int check_word_reg (void);
85static int finalize_imm (void);
85f10a01 86static void process_drex (void);
e3bb37b5
L
87static int process_operands (void);
88static const seg_entry *build_modrm_byte (void);
89static void output_insn (void);
90static void output_imm (fragS *, offsetT);
91static void output_disp (fragS *, offsetT);
29b0f896 92#ifndef I386COFF
e3bb37b5 93static void s_bss (int);
252b5132 94#endif
17d4e2a2
L
95#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
96static void handle_large_common (int small ATTRIBUTE_UNUSED);
97#endif
252b5132 98
a847613f 99static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 100
252b5132 101/* 'md_assemble ()' gathers together information and puts it into a
47926f60 102 i386_insn. */
252b5132 103
520dc8e8
AM
104union i386_op
105 {
106 expressionS *disps;
107 expressionS *imms;
108 const reg_entry *regs;
109 };
110
252b5132
RH
111struct _i386_insn
112 {
47926f60 113 /* TM holds the template for the insn were currently assembling. */
252b5132
RH
114 template tm;
115
116 /* SUFFIX holds the instruction mnemonic suffix if given.
117 (e.g. 'l' for 'movl') */
118 char suffix;
119
47926f60 120 /* OPERANDS gives the number of given operands. */
252b5132
RH
121 unsigned int operands;
122
123 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
124 of given register, displacement, memory operands and immediate
47926f60 125 operands. */
252b5132
RH
126 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
127
128 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 129 use OP[i] for the corresponding operand. */
40fb9820 130 i386_operand_type types[MAX_OPERANDS];
252b5132 131
520dc8e8
AM
132 /* Displacement expression, immediate expression, or register for each
133 operand. */
134 union i386_op op[MAX_OPERANDS];
252b5132 135
3e73aa7c
JH
136 /* Flags for operands. */
137 unsigned int flags[MAX_OPERANDS];
138#define Operand_PCrel 1
139
252b5132 140 /* Relocation type for operand */
f86103b7 141 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 142
252b5132
RH
143 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
144 the base index byte below. */
145 const reg_entry *base_reg;
146 const reg_entry *index_reg;
147 unsigned int log2_scale_factor;
148
149 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 150 explicit segment overrides are given. */
ce8a8b2f 151 const seg_entry *seg[2];
252b5132
RH
152
153 /* PREFIX holds all the given prefix opcodes (usually null).
154 PREFIXES is the number of prefix opcodes. */
155 unsigned int prefixes;
156 unsigned char prefix[MAX_PREFIXES];
157
158 /* RM and SIB are the modrm byte and the sib byte where the
85f10a01
MM
159 addressing modes of this insn are encoded. DREX is the byte
160 added by the SSE5 instructions. */
252b5132
RH
161
162 modrm_byte rm;
3e73aa7c 163 rex_byte rex;
252b5132 164 sib_byte sib;
85f10a01 165 drex_byte drex;
252b5132
RH
166 };
167
168typedef struct _i386_insn i386_insn;
169
170/* List of chars besides those in app.c:symbol_chars that can start an
171 operand. Used to prevent the scrubber eating vital white-space. */
32137342 172const char extra_symbol_chars[] = "*%-(["
252b5132 173#ifdef LEX_AT
32137342
NC
174 "@"
175#endif
176#ifdef LEX_QM
177 "?"
252b5132 178#endif
32137342 179 ;
252b5132 180
29b0f896
AM
181#if (defined (TE_I386AIX) \
182 || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
3896cfd5 183 && !defined (TE_GNU) \
29b0f896 184 && !defined (TE_LINUX) \
32137342 185 && !defined (TE_NETWARE) \
29b0f896
AM
186 && !defined (TE_FreeBSD) \
187 && !defined (TE_NetBSD)))
252b5132 188/* This array holds the chars that always start a comment. If the
b3b91714
AM
189 pre-processor is disabled, these aren't very useful. The option
190 --divide will remove '/' from this list. */
191const char *i386_comment_chars = "#/";
192#define SVR4_COMMENT_CHARS 1
252b5132 193#define PREFIX_SEPARATOR '\\'
252b5132 194
b3b91714
AM
195#else
196const char *i386_comment_chars = "#";
197#define PREFIX_SEPARATOR '/'
198#endif
199
252b5132
RH
200/* This array holds the chars that only start a comment at the beginning of
201 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
202 .line and .file directives will appear in the pre-processed output.
203 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 204 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
205 #NO_APP at the beginning of its output.
206 Also note that comments started like this one will always work if
252b5132 207 '/' isn't otherwise defined. */
b3b91714 208const char line_comment_chars[] = "#/";
252b5132 209
63a0b638 210const char line_separator_chars[] = ";";
252b5132 211
ce8a8b2f
AM
212/* Chars that can be used to separate mant from exp in floating point
213 nums. */
252b5132
RH
214const char EXP_CHARS[] = "eE";
215
ce8a8b2f
AM
216/* Chars that mean this number is a floating point constant
217 As in 0f12.456
218 or 0d1.2345e12. */
252b5132
RH
219const char FLT_CHARS[] = "fFdDxX";
220
ce8a8b2f 221/* Tables for lexical analysis. */
252b5132
RH
222static char mnemonic_chars[256];
223static char register_chars[256];
224static char operand_chars[256];
225static char identifier_chars[256];
226static char digit_chars[256];
227
ce8a8b2f 228/* Lexical macros. */
252b5132
RH
229#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
230#define is_operand_char(x) (operand_chars[(unsigned char) x])
231#define is_register_char(x) (register_chars[(unsigned char) x])
232#define is_space_char(x) ((x) == ' ')
233#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
234#define is_digit_char(x) (digit_chars[(unsigned char) x])
235
0234cb7c 236/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
237static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
238
239/* md_assemble() always leaves the strings it's passed unaltered. To
240 effect this we maintain a stack of saved characters that we've smashed
241 with '\0's (indicating end of strings for various sub-fields of the
47926f60 242 assembler instruction). */
252b5132 243static char save_stack[32];
ce8a8b2f 244static char *save_stack_p;
252b5132
RH
245#define END_STRING_AND_SAVE(s) \
246 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
247#define RESTORE_END_STRING(s) \
248 do { *(s) = *--save_stack_p; } while (0)
249
47926f60 250/* The instruction we're assembling. */
252b5132
RH
251static i386_insn i;
252
253/* Possible templates for current insn. */
254static const templates *current_templates;
255
31b2323c
L
256/* Per instruction expressionS buffers: max displacements & immediates. */
257static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
258static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
252b5132 259
47926f60
KH
260/* Current operand we are working on. */
261static int this_operand;
252b5132 262
3e73aa7c
JH
263/* We support four different modes. FLAG_CODE variable is used to distinguish
264 these. */
265
266enum flag_code {
267 CODE_32BIT,
268 CODE_16BIT,
269 CODE_64BIT };
270
271static enum flag_code flag_code;
4fa24527 272static unsigned int object_64bit;
3e73aa7c
JH
273static int use_rela_relocations = 0;
274
275/* The names used to print error messages. */
b77a7acd 276static const char *flag_code_names[] =
3e73aa7c
JH
277 {
278 "32",
279 "16",
280 "64"
281 };
252b5132 282
47926f60
KH
283/* 1 for intel syntax,
284 0 if att syntax. */
285static int intel_syntax = 0;
252b5132 286
1efbbeb4
L
287/* 1 for intel mnemonic,
288 0 if att mnemonic. */
289static int intel_mnemonic = !SYSV386_COMPAT;
290
5209009a 291/* 1 if support old (<= 2.8.1) versions of gcc. */
1efbbeb4
L
292static int old_gcc = OLDGCC_COMPAT;
293
47926f60
KH
294/* 1 if register prefix % not required. */
295static int allow_naked_reg = 0;
252b5132 296
ba104c83 297/* 1 if pseudo index register, eiz/riz, is allowed . */
db51cc60
L
298static int allow_index_reg = 0;
299
2ca3ace5
L
300/* Register prefix used for error message. */
301static const char *register_prefix = "%";
302
47926f60
KH
303/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
304 leave, push, and pop instructions so that gcc has the same stack
305 frame as in 32 bit mode. */
306static char stackop_size = '\0';
eecb386c 307
12b55ccc
L
308/* Non-zero to optimize code alignment. */
309int optimize_align_code = 1;
310
47926f60
KH
311/* Non-zero to quieten some warnings. */
312static int quiet_warnings = 0;
a38cf1db 313
47926f60
KH
314/* CPU name. */
315static const char *cpu_arch_name = NULL;
5c6af06e 316static const char *cpu_sub_arch_name = NULL;
a38cf1db 317
47926f60 318/* CPU feature flags. */
40fb9820
L
319static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
320
ccc9c027
L
321/* If we have selected a cpu we are generating instructions for. */
322static int cpu_arch_tune_set = 0;
323
9103f4f4
L
324/* Cpu we are generating instructions for. */
325static enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
326
327/* CPU feature flags of cpu we are generating instructions for. */
40fb9820 328static i386_cpu_flags cpu_arch_tune_flags;
9103f4f4 329
ccc9c027
L
330/* CPU instruction set architecture used. */
331static enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
332
9103f4f4 333/* CPU feature flags of instruction set architecture used. */
40fb9820 334static i386_cpu_flags cpu_arch_isa_flags;
9103f4f4 335
fddf5b5b
AM
336/* If set, conditional jumps are not automatically promoted to handle
337 larger than a byte offset. */
338static unsigned int no_cond_jump_promotion = 0;
339
29b0f896 340/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 341static symbolS *GOT_symbol;
29b0f896 342
a4447b93
RH
343/* The dwarf2 return column, adjusted for 32 or 64 bit. */
344unsigned int x86_dwarf2_return_column;
345
346/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
347int x86_cie_data_alignment;
348
252b5132 349/* Interface to relax_segment.
fddf5b5b
AM
350 There are 3 major relax states for 386 jump insns because the
351 different types of jumps add different sizes to frags when we're
352 figuring out what sort of jump to choose to reach a given label. */
252b5132 353
47926f60 354/* Types. */
93c2a809
AM
355#define UNCOND_JUMP 0
356#define COND_JUMP 1
357#define COND_JUMP86 2
fddf5b5b 358
47926f60 359/* Sizes. */
252b5132
RH
360#define CODE16 1
361#define SMALL 0
29b0f896 362#define SMALL16 (SMALL | CODE16)
252b5132 363#define BIG 2
29b0f896 364#define BIG16 (BIG | CODE16)
252b5132
RH
365
366#ifndef INLINE
367#ifdef __GNUC__
368#define INLINE __inline__
369#else
370#define INLINE
371#endif
372#endif
373
fddf5b5b
AM
374#define ENCODE_RELAX_STATE(type, size) \
375 ((relax_substateT) (((type) << 2) | (size)))
376#define TYPE_FROM_RELAX_STATE(s) \
377 ((s) >> 2)
378#define DISP_SIZE_FROM_RELAX_STATE(s) \
379 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
380
381/* This table is used by relax_frag to promote short jumps to long
382 ones where necessary. SMALL (short) jumps may be promoted to BIG
383 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
384 don't allow a short jump in a 32 bit code segment to be promoted to
385 a 16 bit offset jump because it's slower (requires data size
386 prefix), and doesn't work, unless the destination is in the bottom
387 64k of the code segment (The top 16 bits of eip are zeroed). */
388
389const relax_typeS md_relax_table[] =
390{
24eab124
AM
391 /* The fields are:
392 1) most positive reach of this state,
393 2) most negative reach of this state,
93c2a809 394 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 395 4) which index into the table to try if we can't fit into this one. */
252b5132 396
fddf5b5b 397 /* UNCOND_JUMP states. */
93c2a809
AM
398 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
399 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
400 /* dword jmp adds 4 bytes to frag:
401 0 extra opcode bytes, 4 displacement bytes. */
252b5132 402 {0, 0, 4, 0},
93c2a809
AM
403 /* word jmp adds 2 byte2 to frag:
404 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
405 {0, 0, 2, 0},
406
93c2a809
AM
407 /* COND_JUMP states. */
408 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
409 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
410 /* dword conditionals adds 5 bytes to frag:
411 1 extra opcode byte, 4 displacement bytes. */
412 {0, 0, 5, 0},
fddf5b5b 413 /* word conditionals add 3 bytes to frag:
93c2a809
AM
414 1 extra opcode byte, 2 displacement bytes. */
415 {0, 0, 3, 0},
416
417 /* COND_JUMP86 states. */
418 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
419 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
420 /* dword conditionals adds 5 bytes to frag:
421 1 extra opcode byte, 4 displacement bytes. */
422 {0, 0, 5, 0},
423 /* word conditionals add 4 bytes to frag:
424 1 displacement byte and a 3 byte long branch insn. */
425 {0, 0, 4, 0}
252b5132
RH
426};
427
9103f4f4
L
428static const arch_entry cpu_arch[] =
429{
430 {"generic32", PROCESSOR_GENERIC32,
40fb9820 431 CPU_GENERIC32_FLAGS },
9103f4f4 432 {"generic64", PROCESSOR_GENERIC64,
40fb9820 433 CPU_GENERIC64_FLAGS },
9103f4f4 434 {"i8086", PROCESSOR_UNKNOWN,
40fb9820 435 CPU_NONE_FLAGS },
9103f4f4 436 {"i186", PROCESSOR_UNKNOWN,
40fb9820 437 CPU_I186_FLAGS },
9103f4f4 438 {"i286", PROCESSOR_UNKNOWN,
40fb9820 439 CPU_I286_FLAGS },
76bc74dc 440 {"i386", PROCESSOR_I386,
40fb9820 441 CPU_I386_FLAGS },
9103f4f4 442 {"i486", PROCESSOR_I486,
40fb9820 443 CPU_I486_FLAGS },
9103f4f4 444 {"i586", PROCESSOR_PENTIUM,
40fb9820 445 CPU_I586_FLAGS },
9103f4f4 446 {"i686", PROCESSOR_PENTIUMPRO,
40fb9820 447 CPU_I686_FLAGS },
9103f4f4 448 {"pentium", PROCESSOR_PENTIUM,
40fb9820 449 CPU_I586_FLAGS },
9103f4f4 450 {"pentiumpro",PROCESSOR_PENTIUMPRO,
40fb9820 451 CPU_I686_FLAGS },
9103f4f4 452 {"pentiumii", PROCESSOR_PENTIUMPRO,
40fb9820 453 CPU_P2_FLAGS },
9103f4f4 454 {"pentiumiii",PROCESSOR_PENTIUMPRO,
40fb9820 455 CPU_P3_FLAGS },
9103f4f4 456 {"pentium4", PROCESSOR_PENTIUM4,
40fb9820 457 CPU_P4_FLAGS },
9103f4f4 458 {"prescott", PROCESSOR_NOCONA,
40fb9820 459 CPU_CORE_FLAGS },
9103f4f4 460 {"nocona", PROCESSOR_NOCONA,
40fb9820 461 CPU_NOCONA_FLAGS },
ef05d495 462 {"yonah", PROCESSOR_CORE,
40fb9820 463 CPU_CORE_FLAGS },
ef05d495 464 {"core", PROCESSOR_CORE,
40fb9820 465 CPU_CORE_FLAGS },
ef05d495 466 {"merom", PROCESSOR_CORE2,
40fb9820 467 CPU_CORE2_FLAGS },
ef05d495 468 {"core2", PROCESSOR_CORE2,
40fb9820 469 CPU_CORE2_FLAGS },
9103f4f4 470 {"k6", PROCESSOR_K6,
40fb9820 471 CPU_K6_FLAGS },
9103f4f4 472 {"k6_2", PROCESSOR_K6,
40fb9820 473 CPU_K6_2_FLAGS },
9103f4f4 474 {"athlon", PROCESSOR_ATHLON,
40fb9820 475 CPU_ATHLON_FLAGS },
9103f4f4 476 {"sledgehammer", PROCESSOR_K8,
40fb9820 477 CPU_K8_FLAGS },
9103f4f4 478 {"opteron", PROCESSOR_K8,
40fb9820 479 CPU_K8_FLAGS },
9103f4f4 480 {"k8", PROCESSOR_K8,
40fb9820 481 CPU_K8_FLAGS },
050dfa73 482 {"amdfam10", PROCESSOR_AMDFAM10,
40fb9820 483 CPU_AMDFAM10_FLAGS },
9103f4f4 484 {".mmx", PROCESSOR_UNKNOWN,
40fb9820 485 CPU_MMX_FLAGS },
9103f4f4 486 {".sse", PROCESSOR_UNKNOWN,
40fb9820 487 CPU_SSE_FLAGS },
9103f4f4 488 {".sse2", PROCESSOR_UNKNOWN,
40fb9820 489 CPU_SSE2_FLAGS },
9103f4f4 490 {".sse3", PROCESSOR_UNKNOWN,
40fb9820 491 CPU_SSE3_FLAGS },
ef05d495 492 {".ssse3", PROCESSOR_UNKNOWN,
40fb9820 493 CPU_SSSE3_FLAGS },
42903f7f 494 {".sse4.1", PROCESSOR_UNKNOWN,
40fb9820 495 CPU_SSE4_1_FLAGS },
381d071f 496 {".sse4.2", PROCESSOR_UNKNOWN,
40fb9820 497 CPU_SSE4_2_FLAGS },
381d071f 498 {".sse4", PROCESSOR_UNKNOWN,
40fb9820 499 CPU_SSE4_2_FLAGS },
9103f4f4 500 {".3dnow", PROCESSOR_UNKNOWN,
40fb9820 501 CPU_3DNOW_FLAGS },
9103f4f4 502 {".3dnowa", PROCESSOR_UNKNOWN,
40fb9820 503 CPU_3DNOWA_FLAGS },
9103f4f4 504 {".padlock", PROCESSOR_UNKNOWN,
40fb9820 505 CPU_PADLOCK_FLAGS },
9103f4f4 506 {".pacifica", PROCESSOR_UNKNOWN,
40fb9820 507 CPU_SVME_FLAGS },
9103f4f4 508 {".svme", PROCESSOR_UNKNOWN,
40fb9820 509 CPU_SVME_FLAGS },
050dfa73 510 {".sse4a", PROCESSOR_UNKNOWN,
40fb9820 511 CPU_SSE4A_FLAGS },
050dfa73 512 {".abm", PROCESSOR_UNKNOWN,
40fb9820 513 CPU_ABM_FLAGS },
85f10a01
MM
514 {".sse5", PROCESSOR_UNKNOWN,
515 CPU_SSE5_FLAGS },
e413e4e9
AM
516};
517
29b0f896
AM
518const pseudo_typeS md_pseudo_table[] =
519{
520#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
521 {"align", s_align_bytes, 0},
522#else
523 {"align", s_align_ptwo, 0},
524#endif
525 {"arch", set_cpu_arch, 0},
526#ifndef I386COFF
527 {"bss", s_bss, 0},
528#endif
529 {"ffloat", float_cons, 'f'},
530 {"dfloat", float_cons, 'd'},
531 {"tfloat", float_cons, 'x'},
532 {"value", cons, 2},
d182319b 533 {"slong", signed_cons, 4},
29b0f896
AM
534 {"noopt", s_ignore, 0},
535 {"optim", s_ignore, 0},
536 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
537 {"code16", set_code_flag, CODE_16BIT},
538 {"code32", set_code_flag, CODE_32BIT},
539 {"code64", set_code_flag, CODE_64BIT},
540 {"intel_syntax", set_intel_syntax, 1},
541 {"att_syntax", set_intel_syntax, 0},
1efbbeb4
L
542 {"intel_mnemonic", set_intel_mnemonic, 1},
543 {"att_mnemonic", set_intel_mnemonic, 0},
db51cc60
L
544 {"allow_index_reg", set_allow_index_reg, 1},
545 {"disallow_index_reg", set_allow_index_reg, 0},
3b22753a
L
546#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
547 {"largecomm", handle_large_common, 0},
07a53e5c 548#else
e3bb37b5 549 {"file", (void (*) (int)) dwarf2_directive_file, 0},
07a53e5c
RH
550 {"loc", dwarf2_directive_loc, 0},
551 {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
3b22753a 552#endif
6482c264
NC
553#ifdef TE_PE
554 {"secrel32", pe_directive_secrel, 0},
555#endif
29b0f896
AM
556 {0, 0, 0}
557};
558
559/* For interface with expression (). */
560extern char *input_line_pointer;
561
562/* Hash table for instruction mnemonic lookup. */
563static struct hash_control *op_hash;
564
565/* Hash table for register lookup. */
566static struct hash_control *reg_hash;
567\f
252b5132 568void
e3bb37b5 569i386_align_code (fragS *fragP, int count)
252b5132 570{
ce8a8b2f
AM
571 /* Various efficient no-op patterns for aligning code labels.
572 Note: Don't try to assemble the instructions in the comments.
573 0L and 0w are not legal. */
252b5132
RH
574 static const char f32_1[] =
575 {0x90}; /* nop */
576 static const char f32_2[] =
ccc9c027 577 {0x66,0x90}; /* xchg %ax,%ax */
252b5132
RH
578 static const char f32_3[] =
579 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
580 static const char f32_4[] =
581 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
582 static const char f32_5[] =
583 {0x90, /* nop */
584 0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
585 static const char f32_6[] =
586 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
587 static const char f32_7[] =
588 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
589 static const char f32_8[] =
590 {0x90, /* nop */
591 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
592 static const char f32_9[] =
593 {0x89,0xf6, /* movl %esi,%esi */
594 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
595 static const char f32_10[] =
596 {0x8d,0x76,0x00, /* leal 0(%esi),%esi */
597 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
598 static const char f32_11[] =
599 {0x8d,0x74,0x26,0x00, /* leal 0(%esi,1),%esi */
600 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
601 static const char f32_12[] =
602 {0x8d,0xb6,0x00,0x00,0x00,0x00, /* leal 0L(%esi),%esi */
603 0x8d,0xbf,0x00,0x00,0x00,0x00}; /* leal 0L(%edi),%edi */
604 static const char f32_13[] =
605 {0x8d,0xb6,0x00,0x00,0x00,0x00, /* leal 0L(%esi),%esi */
606 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
607 static const char f32_14[] =
608 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00, /* leal 0L(%esi,1),%esi */
609 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
c3332e24
AM
610 static const char f16_3[] =
611 {0x8d,0x74,0x00}; /* lea 0(%esi),%esi */
252b5132
RH
612 static const char f16_4[] =
613 {0x8d,0xb4,0x00,0x00}; /* lea 0w(%si),%si */
614 static const char f16_5[] =
615 {0x90, /* nop */
616 0x8d,0xb4,0x00,0x00}; /* lea 0w(%si),%si */
617 static const char f16_6[] =
618 {0x89,0xf6, /* mov %si,%si */
619 0x8d,0xbd,0x00,0x00}; /* lea 0w(%di),%di */
620 static const char f16_7[] =
621 {0x8d,0x74,0x00, /* lea 0(%si),%si */
622 0x8d,0xbd,0x00,0x00}; /* lea 0w(%di),%di */
623 static const char f16_8[] =
624 {0x8d,0xb4,0x00,0x00, /* lea 0w(%si),%si */
625 0x8d,0xbd,0x00,0x00}; /* lea 0w(%di),%di */
76bc74dc
L
626 static const char jump_31[] =
627 {0xeb,0x1d,0x90,0x90,0x90,0x90,0x90, /* jmp .+31; lotsa nops */
628 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,
629 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,
630 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90};
252b5132
RH
631 static const char *const f32_patt[] = {
632 f32_1, f32_2, f32_3, f32_4, f32_5, f32_6, f32_7, f32_8,
76bc74dc 633 f32_9, f32_10, f32_11, f32_12, f32_13, f32_14
252b5132
RH
634 };
635 static const char *const f16_patt[] = {
76bc74dc 636 f32_1, f32_2, f16_3, f16_4, f16_5, f16_6, f16_7, f16_8
252b5132 637 };
ccc9c027
L
638 /* nopl (%[re]ax) */
639 static const char alt_3[] =
640 {0x0f,0x1f,0x00};
641 /* nopl 0(%[re]ax) */
642 static const char alt_4[] =
643 {0x0f,0x1f,0x40,0x00};
644 /* nopl 0(%[re]ax,%[re]ax,1) */
645 static const char alt_5[] =
646 {0x0f,0x1f,0x44,0x00,0x00};
647 /* nopw 0(%[re]ax,%[re]ax,1) */
648 static const char alt_6[] =
649 {0x66,0x0f,0x1f,0x44,0x00,0x00};
650 /* nopl 0L(%[re]ax) */
651 static const char alt_7[] =
652 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
653 /* nopl 0L(%[re]ax,%[re]ax,1) */
654 static const char alt_8[] =
655 {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
656 /* nopw 0L(%[re]ax,%[re]ax,1) */
657 static const char alt_9[] =
658 {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
659 /* nopw %cs:0L(%[re]ax,%[re]ax,1) */
660 static const char alt_10[] =
661 {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
662 /* data16
663 nopw %cs:0L(%[re]ax,%[re]ax,1) */
664 static const char alt_long_11[] =
665 {0x66,
666 0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
667 /* data16
668 data16
669 nopw %cs:0L(%[re]ax,%[re]ax,1) */
670 static const char alt_long_12[] =
671 {0x66,
672 0x66,
673 0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
674 /* data16
675 data16
676 data16
677 nopw %cs:0L(%[re]ax,%[re]ax,1) */
678 static const char alt_long_13[] =
679 {0x66,
680 0x66,
681 0x66,
682 0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
683 /* data16
684 data16
685 data16
686 data16
687 nopw %cs:0L(%[re]ax,%[re]ax,1) */
688 static const char alt_long_14[] =
689 {0x66,
690 0x66,
691 0x66,
692 0x66,
693 0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
694 /* data16
695 data16
696 data16
697 data16
698 data16
699 nopw %cs:0L(%[re]ax,%[re]ax,1) */
700 static const char alt_long_15[] =
701 {0x66,
702 0x66,
703 0x66,
704 0x66,
705 0x66,
706 0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
707 /* nopl 0(%[re]ax,%[re]ax,1)
708 nopw 0(%[re]ax,%[re]ax,1) */
709 static const char alt_short_11[] =
710 {0x0f,0x1f,0x44,0x00,0x00,
711 0x66,0x0f,0x1f,0x44,0x00,0x00};
712 /* nopw 0(%[re]ax,%[re]ax,1)
713 nopw 0(%[re]ax,%[re]ax,1) */
714 static const char alt_short_12[] =
715 {0x66,0x0f,0x1f,0x44,0x00,0x00,
716 0x66,0x0f,0x1f,0x44,0x00,0x00};
717 /* nopw 0(%[re]ax,%[re]ax,1)
718 nopl 0L(%[re]ax) */
719 static const char alt_short_13[] =
720 {0x66,0x0f,0x1f,0x44,0x00,0x00,
721 0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
722 /* nopl 0L(%[re]ax)
723 nopl 0L(%[re]ax) */
724 static const char alt_short_14[] =
725 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00,
726 0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
727 /* nopl 0L(%[re]ax)
728 nopl 0L(%[re]ax,%[re]ax,1) */
729 static const char alt_short_15[] =
730 {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00,
731 0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
732 static const char *const alt_short_patt[] = {
733 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
734 alt_9, alt_10, alt_short_11, alt_short_12, alt_short_13,
735 alt_short_14, alt_short_15
736 };
737 static const char *const alt_long_patt[] = {
738 f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
739 alt_9, alt_10, alt_long_11, alt_long_12, alt_long_13,
740 alt_long_14, alt_long_15
741 };
252b5132 742
76bc74dc
L
743 /* Only align for at least a positive non-zero boundary. */
744 if (count <= 0 || count > MAX_MEM_FOR_RS_ALIGN_CODE)
33fef721 745 return;
3e73aa7c 746
ccc9c027
L
747 /* We need to decide which NOP sequence to use for 32bit and
748 64bit. When -mtune= is used:
4eed87de 749
76bc74dc
L
750 1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
751 PROCESSOR_GENERIC32, f32_patt will be used.
752 2. For PROCESSOR_PENTIUMPRO, PROCESSOR_PENTIUM4, PROCESSOR_NOCONA,
753 PROCESSOR_CORE, PROCESSOR_CORE2, and PROCESSOR_GENERIC64,
754 alt_long_patt will be used.
755 3. For PROCESSOR_ATHLON, PROCESSOR_K6, PROCESSOR_K8 and
756 PROCESSOR_AMDFAM10, alt_short_patt will be used.
ccc9c027 757
76bc74dc
L
758 When -mtune= isn't used, alt_long_patt will be used if
759 cpu_arch_isa_flags has Cpu686. Otherwise, f32_patt will
760 be used.
ccc9c027
L
761
762 When -march= or .arch is used, we can't use anything beyond
763 cpu_arch_isa_flags. */
764
765 if (flag_code == CODE_16BIT)
766 {
ccc9c027 767 if (count > 8)
33fef721 768 {
76bc74dc
L
769 memcpy (fragP->fr_literal + fragP->fr_fix,
770 jump_31, count);
771 /* Adjust jump offset. */
772 fragP->fr_literal[fragP->fr_fix + 1] = count - 2;
252b5132 773 }
76bc74dc
L
774 else
775 memcpy (fragP->fr_literal + fragP->fr_fix,
776 f16_patt[count - 1], count);
252b5132 777 }
33fef721 778 else
ccc9c027
L
779 {
780 const char *const *patt = NULL;
781
782 if (cpu_arch_isa == PROCESSOR_UNKNOWN)
783 {
784 /* PROCESSOR_UNKNOWN means that all ISAs may be used. */
785 switch (cpu_arch_tune)
786 {
787 case PROCESSOR_UNKNOWN:
788 /* We use cpu_arch_isa_flags to check if we SHOULD
789 optimize for Cpu686. */
40fb9820 790 if (cpu_arch_isa_flags.bitfield.cpui686)
76bc74dc 791 patt = alt_long_patt;
ccc9c027
L
792 else
793 patt = f32_patt;
794 break;
ccc9c027
L
795 case PROCESSOR_PENTIUMPRO:
796 case PROCESSOR_PENTIUM4:
797 case PROCESSOR_NOCONA:
ef05d495 798 case PROCESSOR_CORE:
76bc74dc
L
799 case PROCESSOR_CORE2:
800 case PROCESSOR_GENERIC64:
801 patt = alt_long_patt;
802 break;
ccc9c027
L
803 case PROCESSOR_K6:
804 case PROCESSOR_ATHLON:
805 case PROCESSOR_K8:
4eed87de 806 case PROCESSOR_AMDFAM10:
ccc9c027
L
807 patt = alt_short_patt;
808 break;
76bc74dc 809 case PROCESSOR_I386:
ccc9c027
L
810 case PROCESSOR_I486:
811 case PROCESSOR_PENTIUM:
812 case PROCESSOR_GENERIC32:
813 patt = f32_patt;
814 break;
4eed87de 815 }
ccc9c027
L
816 }
817 else
818 {
819 switch (cpu_arch_tune)
820 {
821 case PROCESSOR_UNKNOWN:
822 /* When cpu_arch_isa is net, cpu_arch_tune shouldn't be
823 PROCESSOR_UNKNOWN. */
824 abort ();
825 break;
826
76bc74dc 827 case PROCESSOR_I386:
ccc9c027
L
828 case PROCESSOR_I486:
829 case PROCESSOR_PENTIUM:
ccc9c027
L
830 case PROCESSOR_K6:
831 case PROCESSOR_ATHLON:
832 case PROCESSOR_K8:
4eed87de 833 case PROCESSOR_AMDFAM10:
ccc9c027
L
834 case PROCESSOR_GENERIC32:
835 /* We use cpu_arch_isa_flags to check if we CAN optimize
836 for Cpu686. */
40fb9820 837 if (cpu_arch_isa_flags.bitfield.cpui686)
ccc9c027
L
838 patt = alt_short_patt;
839 else
840 patt = f32_patt;
841 break;
76bc74dc
L
842 case PROCESSOR_PENTIUMPRO:
843 case PROCESSOR_PENTIUM4:
844 case PROCESSOR_NOCONA:
845 case PROCESSOR_CORE:
ef05d495 846 case PROCESSOR_CORE2:
40fb9820 847 if (cpu_arch_isa_flags.bitfield.cpui686)
ccc9c027
L
848 patt = alt_long_patt;
849 else
850 patt = f32_patt;
851 break;
852 case PROCESSOR_GENERIC64:
76bc74dc 853 patt = alt_long_patt;
ccc9c027 854 break;
4eed87de 855 }
ccc9c027
L
856 }
857
76bc74dc
L
858 if (patt == f32_patt)
859 {
860 /* If the padding is less than 15 bytes, we use the normal
861 ones. Otherwise, we use a jump instruction and adjust
862 its offset. */
863 if (count < 15)
864 memcpy (fragP->fr_literal + fragP->fr_fix,
865 patt[count - 1], count);
866 else
867 {
868 memcpy (fragP->fr_literal + fragP->fr_fix,
869 jump_31, count);
870 /* Adjust jump offset. */
871 fragP->fr_literal[fragP->fr_fix + 1] = count - 2;
872 }
873 }
874 else
875 {
876 /* Maximum length of an instruction is 15 byte. If the
877 padding is greater than 15 bytes and we don't use jump,
878 we have to break it into smaller pieces. */
879 int padding = count;
880 while (padding > 15)
881 {
882 padding -= 15;
883 memcpy (fragP->fr_literal + fragP->fr_fix + padding,
884 patt [14], 15);
885 }
886
887 if (padding)
888 memcpy (fragP->fr_literal + fragP->fr_fix,
889 patt [padding - 1], padding);
890 }
ccc9c027 891 }
33fef721 892 fragP->fr_var = count;
252b5132
RH
893}
894
c6fb90c8
L
895static INLINE int
896uints_all_zero (const unsigned int *x, unsigned int size)
40fb9820 897{
c6fb90c8
L
898 switch (size)
899 {
900 case 3:
901 if (x[2])
902 return 0;
903 case 2:
904 if (x[1])
905 return 0;
906 case 1:
907 return !x[0];
908 default:
909 abort ();
910 }
40fb9820
L
911}
912
c6fb90c8
L
913static INLINE void
914uints_set (unsigned int *x, unsigned int v, unsigned int size)
40fb9820 915{
c6fb90c8
L
916 switch (size)
917 {
918 case 3:
919 x[2] = v;
920 case 2:
921 x[1] = v;
922 case 1:
923 x[0] = v;
924 break;
925 default:
926 abort ();
927 }
928}
40fb9820 929
c6fb90c8
L
930static INLINE int
931uints_equal (const unsigned int *x, const unsigned int *y,
932 unsigned int size)
933{
934 switch (size)
935 {
936 case 3:
937 if (x[2] != y [2])
938 return 0;
939 case 2:
940 if (x[1] != y [1])
941 return 0;
942 case 1:
943 return x[0] == y [0];
944 break;
945 default:
946 abort ();
947 }
948}
40fb9820 949
c6fb90c8
L
950#define UINTS_ALL_ZERO(x) \
951 uints_all_zero ((x).array, ARRAY_SIZE ((x).array))
952#define UINTS_SET(x, v) \
953 uints_set ((x).array, v, ARRAY_SIZE ((x).array))
954#define UINTS_CLEAR(x) \
955 uints_set ((x).array, 0, ARRAY_SIZE ((x).array))
956#define UINTS_EQUAL(x, y) \
957 uints_equal ((x).array, (y).array, ARRAY_SIZE ((x).array))
958
959static INLINE int
960cpu_flags_check_cpu64 (i386_cpu_flags f)
961{
962 return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
963 || (flag_code != CODE_64BIT && f.bitfield.cpu64));
40fb9820
L
964}
965
c6fb90c8
L
966static INLINE i386_cpu_flags
967cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 968{
c6fb90c8
L
969 switch (ARRAY_SIZE (x.array))
970 {
971 case 3:
972 x.array [2] &= y.array [2];
973 case 2:
974 x.array [1] &= y.array [1];
975 case 1:
976 x.array [0] &= y.array [0];
977 break;
978 default:
979 abort ();
980 }
981 return x;
982}
40fb9820 983
c6fb90c8
L
984static INLINE i386_cpu_flags
985cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
40fb9820 986{
c6fb90c8 987 switch (ARRAY_SIZE (x.array))
40fb9820 988 {
c6fb90c8
L
989 case 3:
990 x.array [2] |= y.array [2];
991 case 2:
992 x.array [1] |= y.array [1];
993 case 1:
994 x.array [0] |= y.array [0];
40fb9820
L
995 break;
996 default:
997 abort ();
998 }
40fb9820
L
999 return x;
1000}
1001
3629bb00
L
1002/* Return 3 if there is a perfect match, 2 if compatible with 64bit,
1003 1 if compatible with arch, 0 if there is no match. */
1004
40fb9820
L
1005static int
1006cpu_flags_match (i386_cpu_flags x)
1007{
3629bb00 1008 int overlap = cpu_flags_check_cpu64 (x) ? 2 : 0;
40fb9820
L
1009
1010 x.bitfield.cpu64 = 0;
1011 x.bitfield.cpuno64 = 0;
1012
3629bb00
L
1013 if (UINTS_ALL_ZERO (x))
1014 overlap |= 1;
1015 else
1016 {
1017 i386_cpu_flags cpu = cpu_arch_flags;
1018
1019 cpu.bitfield.cpu64 = 0;
1020 cpu.bitfield.cpuno64 = 0;
1021 cpu = cpu_flags_and (x, cpu);
1022 overlap |= UINTS_ALL_ZERO (cpu) ? 0 : 1;
1023 }
1024 return overlap;
40fb9820
L
1025}
1026
c6fb90c8
L
1027static INLINE i386_operand_type
1028operand_type_and (i386_operand_type x, i386_operand_type y)
40fb9820 1029{
c6fb90c8
L
1030 switch (ARRAY_SIZE (x.array))
1031 {
1032 case 3:
1033 x.array [2] &= y.array [2];
1034 case 2:
1035 x.array [1] &= y.array [1];
1036 case 1:
1037 x.array [0] &= y.array [0];
1038 break;
1039 default:
1040 abort ();
1041 }
1042 return x;
40fb9820
L
1043}
1044
c6fb90c8
L
1045static INLINE i386_operand_type
1046operand_type_or (i386_operand_type x, i386_operand_type y)
40fb9820 1047{
c6fb90c8 1048 switch (ARRAY_SIZE (x.array))
40fb9820 1049 {
c6fb90c8
L
1050 case 3:
1051 x.array [2] |= y.array [2];
1052 case 2:
1053 x.array [1] |= y.array [1];
1054 case 1:
1055 x.array [0] |= y.array [0];
40fb9820
L
1056 break;
1057 default:
1058 abort ();
1059 }
c6fb90c8
L
1060 return x;
1061}
40fb9820 1062
c6fb90c8
L
1063static INLINE i386_operand_type
1064operand_type_xor (i386_operand_type x, i386_operand_type y)
1065{
1066 switch (ARRAY_SIZE (x.array))
1067 {
1068 case 3:
1069 x.array [2] ^= y.array [2];
1070 case 2:
1071 x.array [1] ^= y.array [1];
1072 case 1:
1073 x.array [0] ^= y.array [0];
1074 break;
1075 default:
1076 abort ();
1077 }
40fb9820
L
1078 return x;
1079}
1080
1081static const i386_operand_type acc32 = OPERAND_TYPE_ACC32;
1082static const i386_operand_type acc64 = OPERAND_TYPE_ACC64;
1083static const i386_operand_type control = OPERAND_TYPE_CONTROL;
1084static const i386_operand_type reg16_inoutportreg
1085 = OPERAND_TYPE_REG16_INOUTPORTREG;
1086static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
1087static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
1088static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
1089static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
1090static const i386_operand_type anydisp
1091 = OPERAND_TYPE_ANYDISP;
40fb9820
L
1092static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
1093static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
1094static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
1095static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
1096static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
1097static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
1098static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
1099static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
1100static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
1101static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
1102
1103enum operand_type
1104{
1105 reg,
40fb9820
L
1106 imm,
1107 disp,
1108 anymem
1109};
1110
c6fb90c8 1111static INLINE int
40fb9820
L
1112operand_type_check (i386_operand_type t, enum operand_type c)
1113{
1114 switch (c)
1115 {
1116 case reg:
1117 return (t.bitfield.reg8
1118 || t.bitfield.reg16
1119 || t.bitfield.reg32
1120 || t.bitfield.reg64);
1121
40fb9820
L
1122 case imm:
1123 return (t.bitfield.imm8
1124 || t.bitfield.imm8s
1125 || t.bitfield.imm16
1126 || t.bitfield.imm32
1127 || t.bitfield.imm32s
1128 || t.bitfield.imm64);
1129
1130 case disp:
1131 return (t.bitfield.disp8
1132 || t.bitfield.disp16
1133 || t.bitfield.disp32
1134 || t.bitfield.disp32s
1135 || t.bitfield.disp64);
1136
1137 case anymem:
1138 return (t.bitfield.disp8
1139 || t.bitfield.disp16
1140 || t.bitfield.disp32
1141 || t.bitfield.disp32s
1142 || t.bitfield.disp64
1143 || t.bitfield.baseindex);
1144
1145 default:
1146 abort ();
1147 }
1148}
1149
c6fb90c8 1150static INLINE int
40fb9820
L
1151operand_type_match (i386_operand_type overlap,
1152 i386_operand_type given)
1153{
1154 i386_operand_type temp = overlap;
1155
1156 temp.bitfield.jumpabsolute = 0;
c6fb90c8 1157 if (UINTS_ALL_ZERO (temp))
40fb9820
L
1158 return 0;
1159
1160 return (given.bitfield.baseindex == overlap.bitfield.baseindex
1161 && given.bitfield.jumpabsolute == overlap.bitfield.jumpabsolute);
1162}
1163
1164/* If given types r0 and r1 are registers they must be of the same type
1165 unless the expected operand type register overlap is null.
1166 Note that Acc in a template matches every size of reg. */
1167
c6fb90c8 1168static INLINE int
40fb9820
L
1169operand_type_register_match (i386_operand_type m0,
1170 i386_operand_type g0,
1171 i386_operand_type t0,
1172 i386_operand_type m1,
1173 i386_operand_type g1,
1174 i386_operand_type t1)
1175{
1176 if (!operand_type_check (g0, reg))
1177 return 1;
1178
1179 if (!operand_type_check (g1, reg))
1180 return 1;
1181
1182 if (g0.bitfield.reg8 == g1.bitfield.reg8
1183 && g0.bitfield.reg16 == g1.bitfield.reg16
1184 && g0.bitfield.reg32 == g1.bitfield.reg32
1185 && g0.bitfield.reg64 == g1.bitfield.reg64)
1186 return 1;
1187
1188 if (m0.bitfield.acc)
1189 {
1190 t0.bitfield.reg8 = 1;
1191 t0.bitfield.reg16 = 1;
1192 t0.bitfield.reg32 = 1;
1193 t0.bitfield.reg64 = 1;
1194 }
1195
1196 if (m1.bitfield.acc)
1197 {
1198 t1.bitfield.reg8 = 1;
1199 t1.bitfield.reg16 = 1;
1200 t1.bitfield.reg32 = 1;
1201 t1.bitfield.reg64 = 1;
1202 }
1203
1204 return (!(t0.bitfield.reg8 & t1.bitfield.reg8)
1205 && !(t0.bitfield.reg16 & t1.bitfield.reg16)
1206 && !(t0.bitfield.reg32 & t1.bitfield.reg32)
1207 && !(t0.bitfield.reg64 & t1.bitfield.reg64));
1208}
1209
252b5132 1210static INLINE unsigned int
40fb9820 1211mode_from_disp_size (i386_operand_type t)
252b5132 1212{
40fb9820
L
1213 if (t.bitfield.disp8)
1214 return 1;
1215 else if (t.bitfield.disp16
1216 || t.bitfield.disp32
1217 || t.bitfield.disp32s)
1218 return 2;
1219 else
1220 return 0;
252b5132
RH
1221}
1222
1223static INLINE int
e3bb37b5 1224fits_in_signed_byte (offsetT num)
252b5132
RH
1225{
1226 return (num >= -128) && (num <= 127);
47926f60 1227}
252b5132
RH
1228
1229static INLINE int
e3bb37b5 1230fits_in_unsigned_byte (offsetT num)
252b5132
RH
1231{
1232 return (num & 0xff) == num;
47926f60 1233}
252b5132
RH
1234
1235static INLINE int
e3bb37b5 1236fits_in_unsigned_word (offsetT num)
252b5132
RH
1237{
1238 return (num & 0xffff) == num;
47926f60 1239}
252b5132
RH
1240
1241static INLINE int
e3bb37b5 1242fits_in_signed_word (offsetT num)
252b5132
RH
1243{
1244 return (-32768 <= num) && (num <= 32767);
47926f60 1245}
2a962e6d 1246
3e73aa7c 1247static INLINE int
e3bb37b5 1248fits_in_signed_long (offsetT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
1249{
1250#ifndef BFD64
1251 return 1;
1252#else
1253 return (!(((offsetT) -1 << 31) & num)
1254 || (((offsetT) -1 << 31) & num) == ((offsetT) -1 << 31));
1255#endif
1256} /* fits_in_signed_long() */
2a962e6d 1257
3e73aa7c 1258static INLINE int
e3bb37b5 1259fits_in_unsigned_long (offsetT num ATTRIBUTE_UNUSED)
3e73aa7c
JH
1260{
1261#ifndef BFD64
1262 return 1;
1263#else
1264 return (num & (((offsetT) 2 << 31) - 1)) == num;
1265#endif
1266} /* fits_in_unsigned_long() */
252b5132 1267
40fb9820 1268static i386_operand_type
e3bb37b5 1269smallest_imm_type (offsetT num)
252b5132 1270{
40fb9820
L
1271 i386_operand_type t;
1272
c6fb90c8 1273 UINTS_CLEAR (t);
40fb9820
L
1274 t.bitfield.imm64 = 1;
1275
1276 if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
e413e4e9
AM
1277 {
1278 /* This code is disabled on the 486 because all the Imm1 forms
1279 in the opcode table are slower on the i486. They're the
1280 versions with the implicitly specified single-position
1281 displacement, which has another syntax if you really want to
1282 use that form. */
40fb9820
L
1283 t.bitfield.imm1 = 1;
1284 t.bitfield.imm8 = 1;
1285 t.bitfield.imm8s = 1;
1286 t.bitfield.imm16 = 1;
1287 t.bitfield.imm32 = 1;
1288 t.bitfield.imm32s = 1;
1289 }
1290 else if (fits_in_signed_byte (num))
1291 {
1292 t.bitfield.imm8 = 1;
1293 t.bitfield.imm8s = 1;
1294 t.bitfield.imm16 = 1;
1295 t.bitfield.imm32 = 1;
1296 t.bitfield.imm32s = 1;
1297 }
1298 else if (fits_in_unsigned_byte (num))
1299 {
1300 t.bitfield.imm8 = 1;
1301 t.bitfield.imm16 = 1;
1302 t.bitfield.imm32 = 1;
1303 t.bitfield.imm32s = 1;
1304 }
1305 else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
1306 {
1307 t.bitfield.imm16 = 1;
1308 t.bitfield.imm32 = 1;
1309 t.bitfield.imm32s = 1;
1310 }
1311 else if (fits_in_signed_long (num))
1312 {
1313 t.bitfield.imm32 = 1;
1314 t.bitfield.imm32s = 1;
1315 }
1316 else if (fits_in_unsigned_long (num))
1317 t.bitfield.imm32 = 1;
1318
1319 return t;
47926f60 1320}
252b5132 1321
847f7ad4 1322static offsetT
e3bb37b5 1323offset_in_range (offsetT val, int size)
847f7ad4 1324{
508866be 1325 addressT mask;
ba2adb93 1326
847f7ad4
AM
1327 switch (size)
1328 {
508866be
L
1329 case 1: mask = ((addressT) 1 << 8) - 1; break;
1330 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 1331 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
1332#ifdef BFD64
1333 case 8: mask = ((addressT) 2 << 63) - 1; break;
1334#endif
47926f60 1335 default: abort ();
847f7ad4
AM
1336 }
1337
ba2adb93 1338 /* If BFD64, sign extend val. */
3e73aa7c
JH
1339 if (!use_rela_relocations)
1340 if ((val & ~(((addressT) 2 << 31) - 1)) == 0)
1341 val = (val ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
ba2adb93 1342
47926f60 1343 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
1344 {
1345 char buf1[40], buf2[40];
1346
1347 sprint_value (buf1, val);
1348 sprint_value (buf2, val & mask);
1349 as_warn (_("%s shortened to %s"), buf1, buf2);
1350 }
1351 return val & mask;
1352}
1353
252b5132
RH
1354/* Returns 0 if attempting to add a prefix where one from the same
1355 class already exists, 1 if non rep/repne added, 2 if rep/repne
1356 added. */
1357static int
e3bb37b5 1358add_prefix (unsigned int prefix)
252b5132
RH
1359{
1360 int ret = 1;
b1905489 1361 unsigned int q;
252b5132 1362
29b0f896
AM
1363 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
1364 && flag_code == CODE_64BIT)
b1905489 1365 {
161a04f6
L
1366 if ((i.prefix[REX_PREFIX] & prefix & REX_W)
1367 || ((i.prefix[REX_PREFIX] & (REX_R | REX_X | REX_B))
1368 && (prefix & (REX_R | REX_X | REX_B))))
b1905489
JB
1369 ret = 0;
1370 q = REX_PREFIX;
1371 }
3e73aa7c 1372 else
b1905489
JB
1373 {
1374 switch (prefix)
1375 {
1376 default:
1377 abort ();
1378
1379 case CS_PREFIX_OPCODE:
1380 case DS_PREFIX_OPCODE:
1381 case ES_PREFIX_OPCODE:
1382 case FS_PREFIX_OPCODE:
1383 case GS_PREFIX_OPCODE:
1384 case SS_PREFIX_OPCODE:
1385 q = SEG_PREFIX;
1386 break;
1387
1388 case REPNE_PREFIX_OPCODE:
1389 case REPE_PREFIX_OPCODE:
1390 ret = 2;
1391 /* fall thru */
1392 case LOCK_PREFIX_OPCODE:
1393 q = LOCKREP_PREFIX;
1394 break;
1395
1396 case FWAIT_OPCODE:
1397 q = WAIT_PREFIX;
1398 break;
1399
1400 case ADDR_PREFIX_OPCODE:
1401 q = ADDR_PREFIX;
1402 break;
1403
1404 case DATA_PREFIX_OPCODE:
1405 q = DATA_PREFIX;
1406 break;
1407 }
1408 if (i.prefix[q] != 0)
1409 ret = 0;
1410 }
252b5132 1411
b1905489 1412 if (ret)
252b5132 1413 {
b1905489
JB
1414 if (!i.prefix[q])
1415 ++i.prefixes;
1416 i.prefix[q] |= prefix;
252b5132 1417 }
b1905489
JB
1418 else
1419 as_bad (_("same type of prefix used twice"));
252b5132 1420
252b5132
RH
1421 return ret;
1422}
1423
1424static void
e3bb37b5 1425set_code_flag (int value)
eecb386c 1426{
3e73aa7c 1427 flag_code = value;
40fb9820
L
1428 if (flag_code == CODE_64BIT)
1429 {
1430 cpu_arch_flags.bitfield.cpu64 = 1;
1431 cpu_arch_flags.bitfield.cpuno64 = 0;
40fb9820
L
1432 }
1433 else
1434 {
1435 cpu_arch_flags.bitfield.cpu64 = 0;
1436 cpu_arch_flags.bitfield.cpuno64 = 1;
40fb9820
L
1437 }
1438 if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
3e73aa7c
JH
1439 {
1440 as_bad (_("64bit mode not supported on this CPU."));
1441 }
40fb9820 1442 if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
3e73aa7c
JH
1443 {
1444 as_bad (_("32bit mode not supported on this CPU."));
1445 }
eecb386c
AM
1446 stackop_size = '\0';
1447}
1448
1449static void
e3bb37b5 1450set_16bit_gcc_code_flag (int new_code_flag)
252b5132 1451{
3e73aa7c 1452 flag_code = new_code_flag;
40fb9820
L
1453 if (flag_code != CODE_16BIT)
1454 abort ();
1455 cpu_arch_flags.bitfield.cpu64 = 0;
1456 cpu_arch_flags.bitfield.cpuno64 = 1;
9306ca4a 1457 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
1458}
1459
1460static void
e3bb37b5 1461set_intel_syntax (int syntax_flag)
252b5132
RH
1462{
1463 /* Find out if register prefixing is specified. */
1464 int ask_naked_reg = 0;
1465
1466 SKIP_WHITESPACE ();
29b0f896 1467 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132
RH
1468 {
1469 char *string = input_line_pointer;
1470 int e = get_symbol_end ();
1471
47926f60 1472 if (strcmp (string, "prefix") == 0)
252b5132 1473 ask_naked_reg = 1;
47926f60 1474 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
1475 ask_naked_reg = -1;
1476 else
d0b47220 1477 as_bad (_("bad argument to syntax directive."));
252b5132
RH
1478 *input_line_pointer = e;
1479 }
1480 demand_empty_rest_of_line ();
c3332e24 1481
252b5132
RH
1482 intel_syntax = syntax_flag;
1483
1484 if (ask_naked_reg == 0)
f86103b7
AM
1485 allow_naked_reg = (intel_syntax
1486 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
1487 else
1488 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a 1489
e4a3b5a4 1490 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
9306ca4a 1491 identifier_chars['$'] = intel_syntax ? '$' : 0;
e4a3b5a4 1492 register_prefix = allow_naked_reg ? "" : "%";
252b5132
RH
1493}
1494
1efbbeb4
L
1495static void
1496set_intel_mnemonic (int mnemonic_flag)
1497{
e1d4d893 1498 intel_mnemonic = mnemonic_flag;
1efbbeb4
L
1499}
1500
db51cc60
L
1501static void
1502set_allow_index_reg (int flag)
1503{
1504 allow_index_reg = flag;
1505}
1506
e413e4e9 1507static void
e3bb37b5 1508set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
e413e4e9 1509{
47926f60 1510 SKIP_WHITESPACE ();
e413e4e9 1511
29b0f896 1512 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9
AM
1513 {
1514 char *string = input_line_pointer;
1515 int e = get_symbol_end ();
9103f4f4 1516 unsigned int i;
40fb9820 1517 i386_cpu_flags flags;
e413e4e9 1518
9103f4f4 1519 for (i = 0; i < ARRAY_SIZE (cpu_arch); i++)
e413e4e9
AM
1520 {
1521 if (strcmp (string, cpu_arch[i].name) == 0)
1522 {
5c6af06e
JB
1523 if (*string != '.')
1524 {
1525 cpu_arch_name = cpu_arch[i].name;
1526 cpu_sub_arch_name = NULL;
40fb9820
L
1527 cpu_arch_flags = cpu_arch[i].flags;
1528 if (flag_code == CODE_64BIT)
1529 {
1530 cpu_arch_flags.bitfield.cpu64 = 1;
1531 cpu_arch_flags.bitfield.cpuno64 = 0;
1532 }
1533 else
1534 {
1535 cpu_arch_flags.bitfield.cpu64 = 0;
1536 cpu_arch_flags.bitfield.cpuno64 = 1;
1537 }
ccc9c027 1538 cpu_arch_isa = cpu_arch[i].type;
9103f4f4 1539 cpu_arch_isa_flags = cpu_arch[i].flags;
ccc9c027
L
1540 if (!cpu_arch_tune_set)
1541 {
1542 cpu_arch_tune = cpu_arch_isa;
1543 cpu_arch_tune_flags = cpu_arch_isa_flags;
1544 }
5c6af06e
JB
1545 break;
1546 }
40fb9820 1547
c6fb90c8
L
1548 flags = cpu_flags_or (cpu_arch_flags,
1549 cpu_arch[i].flags);
1550 if (!UINTS_EQUAL (flags, cpu_arch_flags))
5c6af06e
JB
1551 {
1552 cpu_sub_arch_name = cpu_arch[i].name;
40fb9820 1553 cpu_arch_flags = flags;
5c6af06e
JB
1554 }
1555 *input_line_pointer = e;
1556 demand_empty_rest_of_line ();
1557 return;
e413e4e9
AM
1558 }
1559 }
9103f4f4 1560 if (i >= ARRAY_SIZE (cpu_arch))
e413e4e9
AM
1561 as_bad (_("no such architecture: `%s'"), string);
1562
1563 *input_line_pointer = e;
1564 }
1565 else
1566 as_bad (_("missing cpu architecture"));
1567
fddf5b5b
AM
1568 no_cond_jump_promotion = 0;
1569 if (*input_line_pointer == ','
29b0f896 1570 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b
AM
1571 {
1572 char *string = ++input_line_pointer;
1573 int e = get_symbol_end ();
1574
1575 if (strcmp (string, "nojumps") == 0)
1576 no_cond_jump_promotion = 1;
1577 else if (strcmp (string, "jumps") == 0)
1578 ;
1579 else
1580 as_bad (_("no such architecture modifier: `%s'"), string);
1581
1582 *input_line_pointer = e;
1583 }
1584
e413e4e9
AM
1585 demand_empty_rest_of_line ();
1586}
1587
b9d79e03
JH
1588unsigned long
1589i386_mach ()
1590{
1591 if (!strcmp (default_arch, "x86_64"))
1592 return bfd_mach_x86_64;
1593 else if (!strcmp (default_arch, "i386"))
1594 return bfd_mach_i386_i386;
1595 else
1596 as_fatal (_("Unknown architecture"));
1597}
b9d79e03 1598\f
252b5132
RH
1599void
1600md_begin ()
1601{
1602 const char *hash_err;
1603
47926f60 1604 /* Initialize op_hash hash table. */
252b5132
RH
1605 op_hash = hash_new ();
1606
1607 {
29b0f896
AM
1608 const template *optab;
1609 templates *core_optab;
252b5132 1610
47926f60
KH
1611 /* Setup for loop. */
1612 optab = i386_optab;
252b5132
RH
1613 core_optab = (templates *) xmalloc (sizeof (templates));
1614 core_optab->start = optab;
1615
1616 while (1)
1617 {
1618 ++optab;
1619 if (optab->name == NULL
1620 || strcmp (optab->name, (optab - 1)->name) != 0)
1621 {
1622 /* different name --> ship out current template list;
47926f60 1623 add to hash table; & begin anew. */
252b5132
RH
1624 core_optab->end = optab;
1625 hash_err = hash_insert (op_hash,
1626 (optab - 1)->name,
1627 (PTR) core_optab);
1628 if (hash_err)
1629 {
252b5132
RH
1630 as_fatal (_("Internal Error: Can't hash %s: %s"),
1631 (optab - 1)->name,
1632 hash_err);
1633 }
1634 if (optab->name == NULL)
1635 break;
1636 core_optab = (templates *) xmalloc (sizeof (templates));
1637 core_optab->start = optab;
1638 }
1639 }
1640 }
1641
47926f60 1642 /* Initialize reg_hash hash table. */
252b5132
RH
1643 reg_hash = hash_new ();
1644 {
29b0f896 1645 const reg_entry *regtab;
c3fe08fa 1646 unsigned int regtab_size = i386_regtab_size;
252b5132 1647
c3fe08fa 1648 for (regtab = i386_regtab; regtab_size--; regtab++)
252b5132
RH
1649 {
1650 hash_err = hash_insert (reg_hash, regtab->reg_name, (PTR) regtab);
1651 if (hash_err)
3e73aa7c
JH
1652 as_fatal (_("Internal Error: Can't hash %s: %s"),
1653 regtab->reg_name,
1654 hash_err);
252b5132
RH
1655 }
1656 }
1657
47926f60 1658 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 1659 {
29b0f896
AM
1660 int c;
1661 char *p;
252b5132
RH
1662
1663 for (c = 0; c < 256; c++)
1664 {
3882b010 1665 if (ISDIGIT (c))
252b5132
RH
1666 {
1667 digit_chars[c] = c;
1668 mnemonic_chars[c] = c;
1669 register_chars[c] = c;
1670 operand_chars[c] = c;
1671 }
3882b010 1672 else if (ISLOWER (c))
252b5132
RH
1673 {
1674 mnemonic_chars[c] = c;
1675 register_chars[c] = c;
1676 operand_chars[c] = c;
1677 }
3882b010 1678 else if (ISUPPER (c))
252b5132 1679 {
3882b010 1680 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
1681 register_chars[c] = mnemonic_chars[c];
1682 operand_chars[c] = c;
1683 }
1684
3882b010 1685 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
1686 identifier_chars[c] = c;
1687 else if (c >= 128)
1688 {
1689 identifier_chars[c] = c;
1690 operand_chars[c] = c;
1691 }
1692 }
1693
1694#ifdef LEX_AT
1695 identifier_chars['@'] = '@';
32137342
NC
1696#endif
1697#ifdef LEX_QM
1698 identifier_chars['?'] = '?';
1699 operand_chars['?'] = '?';
252b5132 1700#endif
252b5132 1701 digit_chars['-'] = '-';
791fe849 1702 mnemonic_chars['-'] = '-';
0003779b 1703 mnemonic_chars['.'] = '.';
252b5132
RH
1704 identifier_chars['_'] = '_';
1705 identifier_chars['.'] = '.';
1706
1707 for (p = operand_special_chars; *p != '\0'; p++)
1708 operand_chars[(unsigned char) *p] = *p;
1709 }
1710
1711#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 1712 if (IS_ELF)
252b5132
RH
1713 {
1714 record_alignment (text_section, 2);
1715 record_alignment (data_section, 2);
1716 record_alignment (bss_section, 2);
1717 }
1718#endif
a4447b93
RH
1719
1720 if (flag_code == CODE_64BIT)
1721 {
1722 x86_dwarf2_return_column = 16;
1723 x86_cie_data_alignment = -8;
1724 }
1725 else
1726 {
1727 x86_dwarf2_return_column = 8;
1728 x86_cie_data_alignment = -4;
1729 }
252b5132
RH
1730}
1731
1732void
e3bb37b5 1733i386_print_statistics (FILE *file)
252b5132
RH
1734{
1735 hash_print_statistics (file, "i386 opcode", op_hash);
1736 hash_print_statistics (file, "i386 register", reg_hash);
1737}
1738\f
252b5132
RH
1739#ifdef DEBUG386
1740
ce8a8b2f 1741/* Debugging routines for md_assemble. */
e3bb37b5 1742static void pte (template *);
40fb9820 1743static void pt (i386_operand_type);
e3bb37b5
L
1744static void pe (expressionS *);
1745static void ps (symbolS *);
252b5132
RH
1746
1747static void
e3bb37b5 1748pi (char *line, i386_insn *x)
252b5132 1749{
09f131f2 1750 unsigned int i;
252b5132
RH
1751
1752 fprintf (stdout, "%s: template ", line);
1753 pte (&x->tm);
09f131f2
JH
1754 fprintf (stdout, " address: base %s index %s scale %x\n",
1755 x->base_reg ? x->base_reg->reg_name : "none",
1756 x->index_reg ? x->index_reg->reg_name : "none",
1757 x->log2_scale_factor);
1758 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 1759 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
1760 fprintf (stdout, " sib: base %x index %x scale %x\n",
1761 x->sib.base, x->sib.index, x->sib.scale);
1762 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
161a04f6
L
1763 (x->rex & REX_W) != 0,
1764 (x->rex & REX_R) != 0,
1765 (x->rex & REX_X) != 0,
1766 (x->rex & REX_B) != 0);
85f10a01
MM
1767 fprintf (stdout, " drex: reg %d rex 0x%x\n",
1768 x->drex.reg, x->drex.rex);
252b5132
RH
1769 for (i = 0; i < x->operands; i++)
1770 {
1771 fprintf (stdout, " #%d: ", i + 1);
1772 pt (x->types[i]);
1773 fprintf (stdout, "\n");
40fb9820
L
1774 if (x->types[i].bitfield.reg8
1775 || x->types[i].bitfield.reg16
1776 || x->types[i].bitfield.reg32
1777 || x->types[i].bitfield.reg64
1778 || x->types[i].bitfield.regmmx
1779 || x->types[i].bitfield.regxmm
1780 || x->types[i].bitfield.sreg2
1781 || x->types[i].bitfield.sreg3
1782 || x->types[i].bitfield.control
1783 || x->types[i].bitfield.debug
1784 || x->types[i].bitfield.test)
520dc8e8 1785 fprintf (stdout, "%s\n", x->op[i].regs->reg_name);
40fb9820 1786 if (operand_type_check (x->types[i], imm))
520dc8e8 1787 pe (x->op[i].imms);
40fb9820 1788 if (operand_type_check (x->types[i], disp))
520dc8e8 1789 pe (x->op[i].disps);
252b5132
RH
1790 }
1791}
1792
1793static void
e3bb37b5 1794pte (template *t)
252b5132 1795{
09f131f2 1796 unsigned int i;
252b5132 1797 fprintf (stdout, " %d operands ", t->operands);
47926f60 1798 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
1799 if (t->extension_opcode != None)
1800 fprintf (stdout, "ext %x ", t->extension_opcode);
40fb9820 1801 if (t->opcode_modifier.d)
252b5132 1802 fprintf (stdout, "D");
40fb9820 1803 if (t->opcode_modifier.w)
252b5132
RH
1804 fprintf (stdout, "W");
1805 fprintf (stdout, "\n");
1806 for (i = 0; i < t->operands; i++)
1807 {
1808 fprintf (stdout, " #%d type ", i + 1);
1809 pt (t->operand_types[i]);
1810 fprintf (stdout, "\n");
1811 }
1812}
1813
1814static void
e3bb37b5 1815pe (expressionS *e)
252b5132 1816{
24eab124 1817 fprintf (stdout, " operation %d\n", e->X_op);
b77ad1d4
AM
1818 fprintf (stdout, " add_number %ld (%lx)\n",
1819 (long) e->X_add_number, (long) e->X_add_number);
252b5132
RH
1820 if (e->X_add_symbol)
1821 {
1822 fprintf (stdout, " add_symbol ");
1823 ps (e->X_add_symbol);
1824 fprintf (stdout, "\n");
1825 }
1826 if (e->X_op_symbol)
1827 {
1828 fprintf (stdout, " op_symbol ");
1829 ps (e->X_op_symbol);
1830 fprintf (stdout, "\n");
1831 }
1832}
1833
1834static void
e3bb37b5 1835ps (symbolS *s)
252b5132
RH
1836{
1837 fprintf (stdout, "%s type %s%s",
1838 S_GET_NAME (s),
1839 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
1840 segment_name (S_GET_SEGMENT (s)));
1841}
1842
7b81dfbb 1843static struct type_name
252b5132 1844 {
40fb9820
L
1845 i386_operand_type mask;
1846 const char *name;
252b5132 1847 }
7b81dfbb 1848const type_names[] =
252b5132 1849{
40fb9820
L
1850 { OPERAND_TYPE_REG8, "r8" },
1851 { OPERAND_TYPE_REG16, "r16" },
1852 { OPERAND_TYPE_REG32, "r32" },
1853 { OPERAND_TYPE_REG64, "r64" },
1854 { OPERAND_TYPE_IMM8, "i8" },
1855 { OPERAND_TYPE_IMM8, "i8s" },
1856 { OPERAND_TYPE_IMM16, "i16" },
1857 { OPERAND_TYPE_IMM32, "i32" },
1858 { OPERAND_TYPE_IMM32S, "i32s" },
1859 { OPERAND_TYPE_IMM64, "i64" },
1860 { OPERAND_TYPE_IMM1, "i1" },
1861 { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
1862 { OPERAND_TYPE_DISP8, "d8" },
1863 { OPERAND_TYPE_DISP16, "d16" },
1864 { OPERAND_TYPE_DISP32, "d32" },
1865 { OPERAND_TYPE_DISP32S, "d32s" },
1866 { OPERAND_TYPE_DISP64, "d64" },
1867 { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
1868 { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
1869 { OPERAND_TYPE_CONTROL, "control reg" },
1870 { OPERAND_TYPE_TEST, "test reg" },
1871 { OPERAND_TYPE_DEBUG, "debug reg" },
1872 { OPERAND_TYPE_FLOATREG, "FReg" },
1873 { OPERAND_TYPE_FLOATACC, "FAcc" },
1874 { OPERAND_TYPE_SREG2, "SReg2" },
1875 { OPERAND_TYPE_SREG3, "SReg3" },
1876 { OPERAND_TYPE_ACC, "Acc" },
1877 { OPERAND_TYPE_JUMPABSOLUTE, "Jump Absolute" },
1878 { OPERAND_TYPE_REGMMX, "rMMX" },
1879 { OPERAND_TYPE_REGXMM, "rXMM" },
1880 { OPERAND_TYPE_ESSEG, "es" },
252b5132
RH
1881};
1882
1883static void
40fb9820 1884pt (i386_operand_type t)
252b5132 1885{
40fb9820 1886 unsigned int j;
c6fb90c8 1887 i386_operand_type a;
252b5132 1888
40fb9820 1889 for (j = 0; j < ARRAY_SIZE (type_names); j++)
c6fb90c8
L
1890 {
1891 a = operand_type_and (t, type_names[j].mask);
1892 if (!UINTS_ALL_ZERO (a))
1893 fprintf (stdout, "%s, ", type_names[j].name);
1894 }
252b5132
RH
1895 fflush (stdout);
1896}
1897
1898#endif /* DEBUG386 */
1899\f
252b5132 1900static bfd_reloc_code_real_type
3956db08 1901reloc (unsigned int size,
64e74474
AM
1902 int pcrel,
1903 int sign,
1904 bfd_reloc_code_real_type other)
252b5132 1905{
47926f60 1906 if (other != NO_RELOC)
3956db08
JB
1907 {
1908 reloc_howto_type *reloc;
1909
1910 if (size == 8)
1911 switch (other)
1912 {
64e74474
AM
1913 case BFD_RELOC_X86_64_GOT32:
1914 return BFD_RELOC_X86_64_GOT64;
1915 break;
1916 case BFD_RELOC_X86_64_PLTOFF64:
1917 return BFD_RELOC_X86_64_PLTOFF64;
1918 break;
1919 case BFD_RELOC_X86_64_GOTPC32:
1920 other = BFD_RELOC_X86_64_GOTPC64;
1921 break;
1922 case BFD_RELOC_X86_64_GOTPCREL:
1923 other = BFD_RELOC_X86_64_GOTPCREL64;
1924 break;
1925 case BFD_RELOC_X86_64_TPOFF32:
1926 other = BFD_RELOC_X86_64_TPOFF64;
1927 break;
1928 case BFD_RELOC_X86_64_DTPOFF32:
1929 other = BFD_RELOC_X86_64_DTPOFF64;
1930 break;
1931 default:
1932 break;
3956db08 1933 }
e05278af
JB
1934
1935 /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless. */
1936 if (size == 4 && flag_code != CODE_64BIT)
1937 sign = -1;
1938
3956db08
JB
1939 reloc = bfd_reloc_type_lookup (stdoutput, other);
1940 if (!reloc)
1941 as_bad (_("unknown relocation (%u)"), other);
1942 else if (size != bfd_get_reloc_size (reloc))
1943 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
1944 bfd_get_reloc_size (reloc),
1945 size);
1946 else if (pcrel && !reloc->pc_relative)
1947 as_bad (_("non-pc-relative relocation for pc-relative field"));
1948 else if ((reloc->complain_on_overflow == complain_overflow_signed
1949 && !sign)
1950 || (reloc->complain_on_overflow == complain_overflow_unsigned
64e74474 1951 && sign > 0))
3956db08
JB
1952 as_bad (_("relocated field and relocation type differ in signedness"));
1953 else
1954 return other;
1955 return NO_RELOC;
1956 }
252b5132
RH
1957
1958 if (pcrel)
1959 {
3e73aa7c 1960 if (!sign)
3956db08 1961 as_bad (_("there are no unsigned pc-relative relocations"));
252b5132
RH
1962 switch (size)
1963 {
1964 case 1: return BFD_RELOC_8_PCREL;
1965 case 2: return BFD_RELOC_16_PCREL;
1966 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 1967 case 8: return BFD_RELOC_64_PCREL;
252b5132 1968 }
3956db08 1969 as_bad (_("cannot do %u byte pc-relative relocation"), size);
252b5132
RH
1970 }
1971 else
1972 {
3956db08 1973 if (sign > 0)
e5cb08ac 1974 switch (size)
3e73aa7c
JH
1975 {
1976 case 4: return BFD_RELOC_X86_64_32S;
1977 }
1978 else
1979 switch (size)
1980 {
1981 case 1: return BFD_RELOC_8;
1982 case 2: return BFD_RELOC_16;
1983 case 4: return BFD_RELOC_32;
1984 case 8: return BFD_RELOC_64;
1985 }
3956db08
JB
1986 as_bad (_("cannot do %s %u byte relocation"),
1987 sign > 0 ? "signed" : "unsigned", size);
252b5132
RH
1988 }
1989
bfb32b52 1990 abort ();
252b5132
RH
1991 return BFD_RELOC_NONE;
1992}
1993
47926f60
KH
1994/* Here we decide which fixups can be adjusted to make them relative to
1995 the beginning of the section instead of the symbol. Basically we need
1996 to make sure that the dynamic relocations are done correctly, so in
1997 some cases we force the original symbol to be used. */
1998
252b5132 1999int
e3bb37b5 2000tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
252b5132 2001{
6d249963 2002#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 2003 if (!IS_ELF)
31312f95
AM
2004 return 1;
2005
a161fe53
AM
2006 /* Don't adjust pc-relative references to merge sections in 64-bit
2007 mode. */
2008 if (use_rela_relocations
2009 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
2010 && fixP->fx_pcrel)
252b5132 2011 return 0;
31312f95 2012
8d01d9a9
AJ
2013 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
2014 and changed later by validate_fix. */
2015 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
2016 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
2017 return 0;
2018
ce8a8b2f 2019 /* adjust_reloc_syms doesn't know about the GOT. */
252b5132
RH
2020 if (fixP->fx_r_type == BFD_RELOC_386_GOTOFF
2021 || fixP->fx_r_type == BFD_RELOC_386_PLT32
2022 || fixP->fx_r_type == BFD_RELOC_386_GOT32
13ae64f3
JJ
2023 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
2024 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
2025 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
2026 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
2027 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
2028 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
2029 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
2030 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
67a4f2b7
AO
2031 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
2032 || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
3e73aa7c
JH
2033 || fixP->fx_r_type == BFD_RELOC_X86_64_PLT32
2034 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 2035 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
bffbf940
JJ
2036 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
2037 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
2038 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 2039 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
2040 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
2041 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
2042 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
2043 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
67a4f2b7
AO
2044 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
2045 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
252b5132
RH
2046 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2047 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2048 return 0;
31312f95 2049#endif
252b5132
RH
2050 return 1;
2051}
252b5132 2052
b4cac588 2053static int
e3bb37b5 2054intel_float_operand (const char *mnemonic)
252b5132 2055{
9306ca4a
JB
2056 /* Note that the value returned is meaningful only for opcodes with (memory)
2057 operands, hence the code here is free to improperly handle opcodes that
2058 have no operands (for better performance and smaller code). */
2059
2060 if (mnemonic[0] != 'f')
2061 return 0; /* non-math */
2062
2063 switch (mnemonic[1])
2064 {
2065 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
2066 the fs segment override prefix not currently handled because no
2067 call path can make opcodes without operands get here */
2068 case 'i':
2069 return 2 /* integer op */;
2070 case 'l':
2071 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
2072 return 3; /* fldcw/fldenv */
2073 break;
2074 case 'n':
2075 if (mnemonic[2] != 'o' /* fnop */)
2076 return 3; /* non-waiting control op */
2077 break;
2078 case 'r':
2079 if (mnemonic[2] == 's')
2080 return 3; /* frstor/frstpm */
2081 break;
2082 case 's':
2083 if (mnemonic[2] == 'a')
2084 return 3; /* fsave */
2085 if (mnemonic[2] == 't')
2086 {
2087 switch (mnemonic[3])
2088 {
2089 case 'c': /* fstcw */
2090 case 'd': /* fstdw */
2091 case 'e': /* fstenv */
2092 case 's': /* fsts[gw] */
2093 return 3;
2094 }
2095 }
2096 break;
2097 case 'x':
2098 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
2099 return 0; /* fxsave/fxrstor are not really math ops */
2100 break;
2101 }
252b5132 2102
9306ca4a 2103 return 1;
252b5132
RH
2104}
2105
2106/* This is the guts of the machine-dependent assembler. LINE points to a
2107 machine dependent instruction. This function is supposed to emit
2108 the frags/bytes it assembles to. */
2109
2110void
2111md_assemble (line)
2112 char *line;
2113{
40fb9820 2114 unsigned int j;
252b5132
RH
2115 char mnemonic[MAX_MNEM_SIZE];
2116
47926f60 2117 /* Initialize globals. */
252b5132
RH
2118 memset (&i, '\0', sizeof (i));
2119 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 2120 i.reloc[j] = NO_RELOC;
252b5132
RH
2121 memset (disp_expressions, '\0', sizeof (disp_expressions));
2122 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 2123 save_stack_p = save_stack;
252b5132
RH
2124
2125 /* First parse an instruction mnemonic & call i386_operand for the operands.
2126 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 2127 start of a (possibly prefixed) mnemonic. */
252b5132 2128
29b0f896
AM
2129 line = parse_insn (line, mnemonic);
2130 if (line == NULL)
2131 return;
252b5132 2132
29b0f896
AM
2133 line = parse_operands (line, mnemonic);
2134 if (line == NULL)
2135 return;
252b5132 2136
29b0f896
AM
2137 /* Now we've parsed the mnemonic into a set of templates, and have the
2138 operands at hand. */
2139
2140 /* All intel opcodes have reversed operands except for "bound" and
2141 "enter". We also don't reverse intersegment "jmp" and "call"
2142 instructions with 2 immediate operands so that the immediate segment
050dfa73 2143 precedes the offset, as it does when in AT&T mode. */
4d456e3d
L
2144 if (intel_syntax
2145 && i.operands > 1
29b0f896 2146 && (strcmp (mnemonic, "bound") != 0)
30123838 2147 && (strcmp (mnemonic, "invlpga") != 0)
40fb9820
L
2148 && !(operand_type_check (i.types[0], imm)
2149 && operand_type_check (i.types[1], imm)))
29b0f896
AM
2150 swap_operands ();
2151
ec56d5c0
JB
2152 /* The order of the immediates should be reversed
2153 for 2 immediates extrq and insertq instructions */
2154 if (i.imm_operands == 2
2155 && (strcmp (mnemonic, "extrq") == 0
2156 || strcmp (mnemonic, "insertq") == 0))
2157 swap_2_operands (0, 1);
2158
29b0f896
AM
2159 if (i.imm_operands)
2160 optimize_imm ();
2161
b300c311
L
2162 /* Don't optimize displacement for movabs since it only takes 64bit
2163 displacement. */
2164 if (i.disp_operands
2165 && (flag_code != CODE_64BIT
2166 || strcmp (mnemonic, "movabs") != 0))
29b0f896
AM
2167 optimize_disp ();
2168
2169 /* Next, we find a template that matches the given insn,
2170 making sure the overlap of the given operands types is consistent
2171 with the template operand types. */
252b5132 2172
29b0f896
AM
2173 if (!match_template ())
2174 return;
252b5132 2175
cd61ebfe
AM
2176 if (intel_syntax)
2177 {
cd61ebfe
AM
2178 /* Zap movzx and movsx suffix. The suffix may have been set from
2179 "word ptr" or "byte ptr" on the source operand, but we'll use
2180 the suffix later to choose the destination register. */
2181 if ((i.tm.base_opcode & ~9) == 0x0fb6)
9306ca4a
JB
2182 {
2183 if (i.reg_operands < 2
2184 && !i.suffix
40fb9820
L
2185 && (!i.tm.opcode_modifier.no_bsuf
2186 || !i.tm.opcode_modifier.no_wsuf
2187 || !i.tm.opcode_modifier.no_lsuf
2188 || !i.tm.opcode_modifier.no_ssuf
7ce189b3 2189 || !i.tm.opcode_modifier.no_ldsuf
40fb9820 2190 || !i.tm.opcode_modifier.no_qsuf))
9306ca4a
JB
2191 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
2192
2193 i.suffix = 0;
2194 }
cd61ebfe 2195 }
24eab124 2196
40fb9820 2197 if (i.tm.opcode_modifier.fwait)
29b0f896
AM
2198 if (!add_prefix (FWAIT_OPCODE))
2199 return;
252b5132 2200
29b0f896 2201 /* Check string instruction segment overrides. */
40fb9820 2202 if (i.tm.opcode_modifier.isstring && i.mem_operands != 0)
29b0f896
AM
2203 {
2204 if (!check_string ())
5dd0794d 2205 return;
29b0f896 2206 }
5dd0794d 2207
29b0f896
AM
2208 if (!process_suffix ())
2209 return;
e413e4e9 2210
29b0f896
AM
2211 /* Make still unresolved immediate matches conform to size of immediate
2212 given in i.suffix. */
2213 if (!finalize_imm ())
2214 return;
252b5132 2215
40fb9820 2216 if (i.types[0].bitfield.imm1)
29b0f896 2217 i.imm_operands = 0; /* kludge for shift insns. */
252b5132 2218
40fb9820 2219 for (j = 0; j < 3; j++)
c6fb90c8
L
2220 if (i.types[j].bitfield.inoutportreg
2221 || i.types[j].bitfield.shiftcount
2222 || i.types[j].bitfield.acc
2223 || i.types[j].bitfield.floatacc)
40fb9820
L
2224 i.reg_operands--;
2225
2226 if (i.tm.opcode_modifier.immext)
29b0f896 2227 {
02fc3089
L
2228 expressionS *exp;
2229
40fb9820 2230 if (i.tm.cpu_flags.bitfield.cpusse3 && i.operands > 0)
ca164297 2231 {
b7d9ef37 2232 /* Streaming SIMD extensions 3 Instructions have the fixed
ca164297
L
2233 operands with an opcode suffix which is coded in the same
2234 place as an 8-bit immediate field would be. Here we check
2235 those operands and remove them afterwards. */
2236 unsigned int x;
2237
a4622f40 2238 for (x = 0; x < i.operands; x++)
ca164297 2239 if (i.op[x].regs->reg_num != x)
a540244d
L
2240 as_bad (_("can't use register '%s%s' as operand %d in '%s'."),
2241 register_prefix,
2242 i.op[x].regs->reg_name,
2243 x + 1,
2244 i.tm.name);
ca164297
L
2245 i.operands = 0;
2246 }
2247
29b0f896
AM
2248 /* These AMD 3DNow! and Intel Katmai New Instructions have an
2249 opcode suffix which is coded in the same place as an 8-bit
2250 immediate field would be. Here we fake an 8-bit immediate
85f10a01
MM
2251 operand from the opcode suffix stored in tm.extension_opcode.
2252 SSE5 also uses this encoding, for some of its 3 argument
2253 instructions. */
252b5132 2254
85f10a01
MM
2255 assert (i.imm_operands == 0
2256 && (i.operands <= 2
2257 || (i.tm.cpu_flags.bitfield.cpusse5
2258 && i.operands <= 3)));
252b5132 2259
29b0f896
AM
2260 exp = &im_expressions[i.imm_operands++];
2261 i.op[i.operands].imms = exp;
c6fb90c8 2262 UINTS_CLEAR (i.types[i.operands]);
40fb9820
L
2263 i.types[i.operands].bitfield.imm8 = 1;
2264 i.operands++;
29b0f896
AM
2265 exp->X_op = O_constant;
2266 exp->X_add_number = i.tm.extension_opcode;
2267 i.tm.extension_opcode = None;
2268 }
252b5132 2269
29b0f896
AM
2270 /* For insns with operands there are more diddles to do to the opcode. */
2271 if (i.operands)
2272 {
2273 if (!process_operands ())
2274 return;
2275 }
40fb9820 2276 else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896
AM
2277 {
2278 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
2279 as_warn (_("translating to `%sp'"), i.tm.name);
2280 }
252b5132 2281
29b0f896
AM
2282 /* Handle conversion of 'int $3' --> special int3 insn. */
2283 if (i.tm.base_opcode == INT_OPCODE && i.op[0].imms->X_add_number == 3)
2284 {
2285 i.tm.base_opcode = INT3_OPCODE;
2286 i.imm_operands = 0;
2287 }
252b5132 2288
40fb9820
L
2289 if ((i.tm.opcode_modifier.jump
2290 || i.tm.opcode_modifier.jumpbyte
2291 || i.tm.opcode_modifier.jumpdword)
29b0f896
AM
2292 && i.op[0].disps->X_op == O_constant)
2293 {
2294 /* Convert "jmp constant" (and "call constant") to a jump (call) to
2295 the absolute address given by the constant. Since ix86 jumps and
2296 calls are pc relative, we need to generate a reloc. */
2297 i.op[0].disps->X_add_symbol = &abs_symbol;
2298 i.op[0].disps->X_op = O_symbol;
2299 }
252b5132 2300
40fb9820 2301 if (i.tm.opcode_modifier.rex64)
161a04f6 2302 i.rex |= REX_W;
252b5132 2303
29b0f896
AM
2304 /* For 8 bit registers we need an empty rex prefix. Also if the
2305 instruction already has a prefix, we need to convert old
2306 registers to new ones. */
773f551c 2307
40fb9820 2308 if ((i.types[0].bitfield.reg8
29b0f896 2309 && (i.op[0].regs->reg_flags & RegRex64) != 0)
40fb9820 2310 || (i.types[1].bitfield.reg8
29b0f896 2311 && (i.op[1].regs->reg_flags & RegRex64) != 0)
40fb9820
L
2312 || ((i.types[0].bitfield.reg8
2313 || i.types[1].bitfield.reg8)
29b0f896
AM
2314 && i.rex != 0))
2315 {
2316 int x;
726c5dcd 2317
29b0f896
AM
2318 i.rex |= REX_OPCODE;
2319 for (x = 0; x < 2; x++)
2320 {
2321 /* Look for 8 bit operand that uses old registers. */
40fb9820 2322 if (i.types[x].bitfield.reg8
29b0f896 2323 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 2324 {
29b0f896
AM
2325 /* In case it is "hi" register, give up. */
2326 if (i.op[x].regs->reg_num > 3)
a540244d 2327 as_bad (_("can't encode register '%s%s' in an "
4eed87de 2328 "instruction requiring REX prefix."),
a540244d 2329 register_prefix, i.op[x].regs->reg_name);
773f551c 2330
29b0f896
AM
2331 /* Otherwise it is equivalent to the extended register.
2332 Since the encoding doesn't change this is merely
2333 cosmetic cleanup for debug output. */
2334
2335 i.op[x].regs = i.op[x].regs + 8;
773f551c 2336 }
29b0f896
AM
2337 }
2338 }
773f551c 2339
85f10a01
MM
2340 /* If the instruction has the DREX attribute (aka SSE5), don't emit a
2341 REX prefix. */
2342 if (i.tm.opcode_modifier.drex || i.tm.opcode_modifier.drexc)
2343 {
2344 i.drex.rex = i.rex;
2345 i.rex = 0;
2346 }
2347 else if (i.rex != 0)
29b0f896
AM
2348 add_prefix (REX_OPCODE | i.rex);
2349
2350 /* We are ready to output the insn. */
2351 output_insn ();
2352}
2353
2354static char *
e3bb37b5 2355parse_insn (char *line, char *mnemonic)
29b0f896
AM
2356{
2357 char *l = line;
2358 char *token_start = l;
2359 char *mnem_p;
5c6af06e
JB
2360 int supported;
2361 const template *t;
29b0f896
AM
2362
2363 /* Non-zero if we found a prefix only acceptable with string insns. */
2364 const char *expecting_string_instruction = NULL;
45288df1 2365
29b0f896
AM
2366 while (1)
2367 {
2368 mnem_p = mnemonic;
2369 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
2370 {
2371 mnem_p++;
2372 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 2373 {
29b0f896
AM
2374 as_bad (_("no such instruction: `%s'"), token_start);
2375 return NULL;
2376 }
2377 l++;
2378 }
2379 if (!is_space_char (*l)
2380 && *l != END_OF_INSN
e44823cf
JB
2381 && (intel_syntax
2382 || (*l != PREFIX_SEPARATOR
2383 && *l != ',')))
29b0f896
AM
2384 {
2385 as_bad (_("invalid character %s in mnemonic"),
2386 output_invalid (*l));
2387 return NULL;
2388 }
2389 if (token_start == l)
2390 {
e44823cf 2391 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
2392 as_bad (_("expecting prefix; got nothing"));
2393 else
2394 as_bad (_("expecting mnemonic; got nothing"));
2395 return NULL;
2396 }
45288df1 2397
29b0f896
AM
2398 /* Look up instruction (or prefix) via hash table. */
2399 current_templates = hash_find (op_hash, mnemonic);
47926f60 2400
29b0f896
AM
2401 if (*l != END_OF_INSN
2402 && (!is_space_char (*l) || l[1] != END_OF_INSN)
2403 && current_templates
40fb9820 2404 && current_templates->start->opcode_modifier.isprefix)
29b0f896 2405 {
c6fb90c8 2406 if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2dd88dca
JB
2407 {
2408 as_bad ((flag_code != CODE_64BIT
2409 ? _("`%s' is only supported in 64-bit mode")
2410 : _("`%s' is not supported in 64-bit mode")),
2411 current_templates->start->name);
2412 return NULL;
2413 }
29b0f896
AM
2414 /* If we are in 16-bit mode, do not allow addr16 or data16.
2415 Similarly, in 32-bit mode, do not allow addr32 or data32. */
40fb9820
L
2416 if ((current_templates->start->opcode_modifier.size16
2417 || current_templates->start->opcode_modifier.size32)
29b0f896 2418 && flag_code != CODE_64BIT
40fb9820 2419 && (current_templates->start->opcode_modifier.size32
29b0f896
AM
2420 ^ (flag_code == CODE_16BIT)))
2421 {
2422 as_bad (_("redundant %s prefix"),
2423 current_templates->start->name);
2424 return NULL;
45288df1 2425 }
29b0f896
AM
2426 /* Add prefix, checking for repeated prefixes. */
2427 switch (add_prefix (current_templates->start->base_opcode))
2428 {
2429 case 0:
2430 return NULL;
2431 case 2:
2432 expecting_string_instruction = current_templates->start->name;
2433 break;
2434 }
2435 /* Skip past PREFIX_SEPARATOR and reset token_start. */
2436 token_start = ++l;
2437 }
2438 else
2439 break;
2440 }
45288df1 2441
29b0f896
AM
2442 if (!current_templates)
2443 {
2444 /* See if we can get a match by trimming off a suffix. */
2445 switch (mnem_p[-1])
2446 {
2447 case WORD_MNEM_SUFFIX:
9306ca4a
JB
2448 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
2449 i.suffix = SHORT_MNEM_SUFFIX;
2450 else
29b0f896
AM
2451 case BYTE_MNEM_SUFFIX:
2452 case QWORD_MNEM_SUFFIX:
2453 i.suffix = mnem_p[-1];
2454 mnem_p[-1] = '\0';
2455 current_templates = hash_find (op_hash, mnemonic);
2456 break;
2457 case SHORT_MNEM_SUFFIX:
2458 case LONG_MNEM_SUFFIX:
2459 if (!intel_syntax)
2460 {
2461 i.suffix = mnem_p[-1];
2462 mnem_p[-1] = '\0';
2463 current_templates = hash_find (op_hash, mnemonic);
2464 }
2465 break;
252b5132 2466
29b0f896
AM
2467 /* Intel Syntax. */
2468 case 'd':
2469 if (intel_syntax)
2470 {
9306ca4a 2471 if (intel_float_operand (mnemonic) == 1)
29b0f896
AM
2472 i.suffix = SHORT_MNEM_SUFFIX;
2473 else
2474 i.suffix = LONG_MNEM_SUFFIX;
2475 mnem_p[-1] = '\0';
2476 current_templates = hash_find (op_hash, mnemonic);
2477 }
2478 break;
2479 }
2480 if (!current_templates)
2481 {
2482 as_bad (_("no such instruction: `%s'"), token_start);
2483 return NULL;
2484 }
2485 }
252b5132 2486
40fb9820
L
2487 if (current_templates->start->opcode_modifier.jump
2488 || current_templates->start->opcode_modifier.jumpbyte)
29b0f896
AM
2489 {
2490 /* Check for a branch hint. We allow ",pt" and ",pn" for
2491 predict taken and predict not taken respectively.
2492 I'm not sure that branch hints actually do anything on loop
2493 and jcxz insns (JumpByte) for current Pentium4 chips. They
2494 may work in the future and it doesn't hurt to accept them
2495 now. */
2496 if (l[0] == ',' && l[1] == 'p')
2497 {
2498 if (l[2] == 't')
2499 {
2500 if (!add_prefix (DS_PREFIX_OPCODE))
2501 return NULL;
2502 l += 3;
2503 }
2504 else if (l[2] == 'n')
2505 {
2506 if (!add_prefix (CS_PREFIX_OPCODE))
2507 return NULL;
2508 l += 3;
2509 }
2510 }
2511 }
2512 /* Any other comma loses. */
2513 if (*l == ',')
2514 {
2515 as_bad (_("invalid character %s in mnemonic"),
2516 output_invalid (*l));
2517 return NULL;
2518 }
252b5132 2519
29b0f896 2520 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
2521 supported = 0;
2522 for (t = current_templates->start; t < current_templates->end; ++t)
2523 {
3629bb00
L
2524 supported |= cpu_flags_match (t->cpu_flags);
2525 if (supported == 3)
2526 goto skip;
5c6af06e 2527 }
3629bb00 2528
5c6af06e
JB
2529 if (!(supported & 2))
2530 {
2531 as_bad (flag_code == CODE_64BIT
2532 ? _("`%s' is not supported in 64-bit mode")
2533 : _("`%s' is only supported in 64-bit mode"),
2534 current_templates->start->name);
2535 return NULL;
2536 }
2537 if (!(supported & 1))
29b0f896 2538 {
3629bb00
L
2539 as_bad (_("`%s' is not supported on `%s%s'"),
2540 current_templates->start->name, cpu_arch_name,
2541 cpu_sub_arch_name ? cpu_sub_arch_name : "");
2542 return NULL;
29b0f896 2543 }
3629bb00
L
2544
2545skip:
2546 if (!cpu_arch_flags.bitfield.cpui386
40fb9820 2547 && (flag_code != CODE_16BIT))
29b0f896
AM
2548 {
2549 as_warn (_("use .code16 to ensure correct addressing mode"));
2550 }
252b5132 2551
29b0f896 2552 /* Check for rep/repne without a string instruction. */
f41bbced 2553 if (expecting_string_instruction)
29b0f896 2554 {
f41bbced
JB
2555 static templates override;
2556
2557 for (t = current_templates->start; t < current_templates->end; ++t)
40fb9820 2558 if (t->opcode_modifier.isstring)
f41bbced
JB
2559 break;
2560 if (t >= current_templates->end)
2561 {
2562 as_bad (_("expecting string instruction after `%s'"),
64e74474 2563 expecting_string_instruction);
f41bbced
JB
2564 return NULL;
2565 }
2566 for (override.start = t; t < current_templates->end; ++t)
40fb9820 2567 if (!t->opcode_modifier.isstring)
f41bbced
JB
2568 break;
2569 override.end = t;
2570 current_templates = &override;
29b0f896 2571 }
252b5132 2572
29b0f896
AM
2573 return l;
2574}
252b5132 2575
29b0f896 2576static char *
e3bb37b5 2577parse_operands (char *l, const char *mnemonic)
29b0f896
AM
2578{
2579 char *token_start;
3138f287 2580
29b0f896
AM
2581 /* 1 if operand is pending after ','. */
2582 unsigned int expecting_operand = 0;
252b5132 2583
29b0f896
AM
2584 /* Non-zero if operand parens not balanced. */
2585 unsigned int paren_not_balanced;
2586
2587 while (*l != END_OF_INSN)
2588 {
2589 /* Skip optional white space before operand. */
2590 if (is_space_char (*l))
2591 ++l;
2592 if (!is_operand_char (*l) && *l != END_OF_INSN)
2593 {
2594 as_bad (_("invalid character %s before operand %d"),
2595 output_invalid (*l),
2596 i.operands + 1);
2597 return NULL;
2598 }
2599 token_start = l; /* after white space */
2600 paren_not_balanced = 0;
2601 while (paren_not_balanced || *l != ',')
2602 {
2603 if (*l == END_OF_INSN)
2604 {
2605 if (paren_not_balanced)
2606 {
2607 if (!intel_syntax)
2608 as_bad (_("unbalanced parenthesis in operand %d."),
2609 i.operands + 1);
2610 else
2611 as_bad (_("unbalanced brackets in operand %d."),
2612 i.operands + 1);
2613 return NULL;
2614 }
2615 else
2616 break; /* we are done */
2617 }
2618 else if (!is_operand_char (*l) && !is_space_char (*l))
2619 {
2620 as_bad (_("invalid character %s in operand %d"),
2621 output_invalid (*l),
2622 i.operands + 1);
2623 return NULL;
2624 }
2625 if (!intel_syntax)
2626 {
2627 if (*l == '(')
2628 ++paren_not_balanced;
2629 if (*l == ')')
2630 --paren_not_balanced;
2631 }
2632 else
2633 {
2634 if (*l == '[')
2635 ++paren_not_balanced;
2636 if (*l == ']')
2637 --paren_not_balanced;
2638 }
2639 l++;
2640 }
2641 if (l != token_start)
2642 { /* Yes, we've read in another operand. */
2643 unsigned int operand_ok;
2644 this_operand = i.operands++;
2645 if (i.operands > MAX_OPERANDS)
2646 {
2647 as_bad (_("spurious operands; (%d operands/instruction max)"),
2648 MAX_OPERANDS);
2649 return NULL;
2650 }
2651 /* Now parse operand adding info to 'i' as we go along. */
2652 END_STRING_AND_SAVE (l);
2653
2654 if (intel_syntax)
2655 operand_ok =
2656 i386_intel_operand (token_start,
2657 intel_float_operand (mnemonic));
2658 else
a7619375 2659 operand_ok = i386_att_operand (token_start);
29b0f896
AM
2660
2661 RESTORE_END_STRING (l);
2662 if (!operand_ok)
2663 return NULL;
2664 }
2665 else
2666 {
2667 if (expecting_operand)
2668 {
2669 expecting_operand_after_comma:
2670 as_bad (_("expecting operand after ','; got nothing"));
2671 return NULL;
2672 }
2673 if (*l == ',')
2674 {
2675 as_bad (_("expecting operand before ','; got nothing"));
2676 return NULL;
2677 }
2678 }
7f3f1ea2 2679
29b0f896
AM
2680 /* Now *l must be either ',' or END_OF_INSN. */
2681 if (*l == ',')
2682 {
2683 if (*++l == END_OF_INSN)
2684 {
2685 /* Just skip it, if it's \n complain. */
2686 goto expecting_operand_after_comma;
2687 }
2688 expecting_operand = 1;
2689 }
2690 }
2691 return l;
2692}
7f3f1ea2 2693
050dfa73 2694static void
4d456e3d 2695swap_2_operands (int xchg1, int xchg2)
050dfa73
MM
2696{
2697 union i386_op temp_op;
40fb9820 2698 i386_operand_type temp_type;
050dfa73 2699 enum bfd_reloc_code_real temp_reloc;
4eed87de 2700
050dfa73
MM
2701 temp_type = i.types[xchg2];
2702 i.types[xchg2] = i.types[xchg1];
2703 i.types[xchg1] = temp_type;
2704 temp_op = i.op[xchg2];
2705 i.op[xchg2] = i.op[xchg1];
2706 i.op[xchg1] = temp_op;
2707 temp_reloc = i.reloc[xchg2];
2708 i.reloc[xchg2] = i.reloc[xchg1];
2709 i.reloc[xchg1] = temp_reloc;
2710}
2711
29b0f896 2712static void
e3bb37b5 2713swap_operands (void)
29b0f896 2714{
b7c61d9a 2715 switch (i.operands)
050dfa73 2716 {
b7c61d9a 2717 case 4:
4d456e3d 2718 swap_2_operands (1, i.operands - 2);
b7c61d9a
L
2719 case 3:
2720 case 2:
4d456e3d 2721 swap_2_operands (0, i.operands - 1);
b7c61d9a
L
2722 break;
2723 default:
2724 abort ();
29b0f896 2725 }
29b0f896
AM
2726
2727 if (i.mem_operands == 2)
2728 {
2729 const seg_entry *temp_seg;
2730 temp_seg = i.seg[0];
2731 i.seg[0] = i.seg[1];
2732 i.seg[1] = temp_seg;
2733 }
2734}
252b5132 2735
29b0f896
AM
2736/* Try to ensure constant immediates are represented in the smallest
2737 opcode possible. */
2738static void
e3bb37b5 2739optimize_imm (void)
29b0f896
AM
2740{
2741 char guess_suffix = 0;
2742 int op;
252b5132 2743
29b0f896
AM
2744 if (i.suffix)
2745 guess_suffix = i.suffix;
2746 else if (i.reg_operands)
2747 {
2748 /* Figure out a suffix from the last register operand specified.
2749 We can't do this properly yet, ie. excluding InOutPortReg,
2750 but the following works for instructions with immediates.
2751 In any case, we can't set i.suffix yet. */
2752 for (op = i.operands; --op >= 0;)
40fb9820
L
2753 if (i.types[op].bitfield.reg8)
2754 {
2755 guess_suffix = BYTE_MNEM_SUFFIX;
2756 break;
2757 }
2758 else if (i.types[op].bitfield.reg16)
252b5132 2759 {
40fb9820
L
2760 guess_suffix = WORD_MNEM_SUFFIX;
2761 break;
2762 }
2763 else if (i.types[op].bitfield.reg32)
2764 {
2765 guess_suffix = LONG_MNEM_SUFFIX;
2766 break;
2767 }
2768 else if (i.types[op].bitfield.reg64)
2769 {
2770 guess_suffix = QWORD_MNEM_SUFFIX;
29b0f896 2771 break;
252b5132 2772 }
29b0f896
AM
2773 }
2774 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
2775 guess_suffix = WORD_MNEM_SUFFIX;
2776
2777 for (op = i.operands; --op >= 0;)
40fb9820 2778 if (operand_type_check (i.types[op], imm))
29b0f896
AM
2779 {
2780 switch (i.op[op].imms->X_op)
252b5132 2781 {
29b0f896
AM
2782 case O_constant:
2783 /* If a suffix is given, this operand may be shortened. */
2784 switch (guess_suffix)
252b5132 2785 {
29b0f896 2786 case LONG_MNEM_SUFFIX:
40fb9820
L
2787 i.types[op].bitfield.imm32 = 1;
2788 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
2789 break;
2790 case WORD_MNEM_SUFFIX:
40fb9820
L
2791 i.types[op].bitfield.imm16 = 1;
2792 i.types[op].bitfield.imm32 = 1;
2793 i.types[op].bitfield.imm32s = 1;
2794 i.types[op].bitfield.imm64 = 1;
29b0f896
AM
2795 break;
2796 case BYTE_MNEM_SUFFIX:
40fb9820
L
2797 i.types[op].bitfield.imm8 = 1;
2798 i.types[op].bitfield.imm8s = 1;
2799 i.types[op].bitfield.imm16 = 1;
2800 i.types[op].bitfield.imm32 = 1;
2801 i.types[op].bitfield.imm32s = 1;
2802 i.types[op].bitfield.imm64 = 1;
29b0f896 2803 break;
252b5132 2804 }
252b5132 2805
29b0f896
AM
2806 /* If this operand is at most 16 bits, convert it
2807 to a signed 16 bit number before trying to see
2808 whether it will fit in an even smaller size.
2809 This allows a 16-bit operand such as $0xffe0 to
2810 be recognised as within Imm8S range. */
40fb9820 2811 if ((i.types[op].bitfield.imm16)
29b0f896 2812 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 2813 {
29b0f896
AM
2814 i.op[op].imms->X_add_number =
2815 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
2816 }
40fb9820 2817 if ((i.types[op].bitfield.imm32)
29b0f896
AM
2818 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
2819 == 0))
2820 {
2821 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
2822 ^ ((offsetT) 1 << 31))
2823 - ((offsetT) 1 << 31));
2824 }
40fb9820 2825 i.types[op]
c6fb90c8
L
2826 = operand_type_or (i.types[op],
2827 smallest_imm_type (i.op[op].imms->X_add_number));
252b5132 2828
29b0f896
AM
2829 /* We must avoid matching of Imm32 templates when 64bit
2830 only immediate is available. */
2831 if (guess_suffix == QWORD_MNEM_SUFFIX)
40fb9820 2832 i.types[op].bitfield.imm32 = 0;
29b0f896 2833 break;
252b5132 2834
29b0f896
AM
2835 case O_absent:
2836 case O_register:
2837 abort ();
2838
2839 /* Symbols and expressions. */
2840 default:
9cd96992
JB
2841 /* Convert symbolic operand to proper sizes for matching, but don't
2842 prevent matching a set of insns that only supports sizes other
2843 than those matching the insn suffix. */
2844 {
40fb9820 2845 i386_operand_type mask, allowed;
9cd96992
JB
2846 const template *t;
2847
c6fb90c8
L
2848 UINTS_CLEAR (mask);
2849 UINTS_CLEAR (allowed);
40fb9820 2850
4eed87de
AM
2851 for (t = current_templates->start;
2852 t < current_templates->end;
2853 ++t)
c6fb90c8
L
2854 allowed = operand_type_or (allowed,
2855 t->operand_types[op]);
9cd96992
JB
2856 switch (guess_suffix)
2857 {
2858 case QWORD_MNEM_SUFFIX:
40fb9820
L
2859 mask.bitfield.imm64 = 1;
2860 mask.bitfield.imm32s = 1;
9cd96992
JB
2861 break;
2862 case LONG_MNEM_SUFFIX:
40fb9820 2863 mask.bitfield.imm32 = 1;
9cd96992
JB
2864 break;
2865 case WORD_MNEM_SUFFIX:
40fb9820 2866 mask.bitfield.imm16 = 1;
9cd96992
JB
2867 break;
2868 case BYTE_MNEM_SUFFIX:
40fb9820 2869 mask.bitfield.imm8 = 1;
9cd96992
JB
2870 break;
2871 default:
9cd96992
JB
2872 break;
2873 }
c6fb90c8
L
2874 allowed = operand_type_and (mask, allowed);
2875 if (!UINTS_ALL_ZERO (allowed))
2876 i.types[op] = operand_type_and (i.types[op], mask);
9cd96992 2877 }
29b0f896 2878 break;
252b5132 2879 }
29b0f896
AM
2880 }
2881}
47926f60 2882
29b0f896
AM
2883/* Try to use the smallest displacement type too. */
2884static void
e3bb37b5 2885optimize_disp (void)
29b0f896
AM
2886{
2887 int op;
3e73aa7c 2888
29b0f896 2889 for (op = i.operands; --op >= 0;)
40fb9820 2890 if (operand_type_check (i.types[op], disp))
252b5132 2891 {
b300c311 2892 if (i.op[op].disps->X_op == O_constant)
252b5132 2893 {
b300c311 2894 offsetT disp = i.op[op].disps->X_add_number;
29b0f896 2895
40fb9820 2896 if (i.types[op].bitfield.disp16
b300c311
L
2897 && (disp & ~(offsetT) 0xffff) == 0)
2898 {
2899 /* If this operand is at most 16 bits, convert
2900 to a signed 16 bit number and don't use 64bit
2901 displacement. */
2902 disp = (((disp & 0xffff) ^ 0x8000) - 0x8000);
40fb9820 2903 i.types[op].bitfield.disp64 = 0;
b300c311 2904 }
40fb9820 2905 if (i.types[op].bitfield.disp32
b300c311
L
2906 && (disp & ~(((offsetT) 2 << 31) - 1)) == 0)
2907 {
2908 /* If this operand is at most 32 bits, convert
2909 to a signed 32 bit number and don't use 64bit
2910 displacement. */
2911 disp &= (((offsetT) 2 << 31) - 1);
2912 disp = (disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
40fb9820 2913 i.types[op].bitfield.disp64 = 0;
b300c311 2914 }
40fb9820 2915 if (!disp && i.types[op].bitfield.baseindex)
b300c311 2916 {
40fb9820
L
2917 i.types[op].bitfield.disp8 = 0;
2918 i.types[op].bitfield.disp16 = 0;
2919 i.types[op].bitfield.disp32 = 0;
2920 i.types[op].bitfield.disp32s = 0;
2921 i.types[op].bitfield.disp64 = 0;
b300c311
L
2922 i.op[op].disps = 0;
2923 i.disp_operands--;
2924 }
2925 else if (flag_code == CODE_64BIT)
2926 {
2927 if (fits_in_signed_long (disp))
28a9d8f5 2928 {
40fb9820
L
2929 i.types[op].bitfield.disp64 = 0;
2930 i.types[op].bitfield.disp32s = 1;
28a9d8f5 2931 }
b300c311 2932 if (fits_in_unsigned_long (disp))
40fb9820 2933 i.types[op].bitfield.disp32 = 1;
b300c311 2934 }
40fb9820
L
2935 if ((i.types[op].bitfield.disp32
2936 || i.types[op].bitfield.disp32s
2937 || i.types[op].bitfield.disp16)
b300c311 2938 && fits_in_signed_byte (disp))
40fb9820 2939 i.types[op].bitfield.disp8 = 1;
252b5132 2940 }
67a4f2b7
AO
2941 else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
2942 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
2943 {
2944 fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
2945 i.op[op].disps, 0, i.reloc[op]);
40fb9820
L
2946 i.types[op].bitfield.disp8 = 0;
2947 i.types[op].bitfield.disp16 = 0;
2948 i.types[op].bitfield.disp32 = 0;
2949 i.types[op].bitfield.disp32s = 0;
2950 i.types[op].bitfield.disp64 = 0;
67a4f2b7
AO
2951 }
2952 else
b300c311 2953 /* We only support 64bit displacement on constants. */
40fb9820 2954 i.types[op].bitfield.disp64 = 0;
252b5132 2955 }
29b0f896
AM
2956}
2957
2958static int
e3bb37b5 2959match_template (void)
29b0f896
AM
2960{
2961 /* Points to template once we've found it. */
2962 const template *t;
40fb9820 2963 i386_operand_type overlap0, overlap1, overlap2, overlap3;
29b0f896 2964 unsigned int found_reverse_match;
40fb9820
L
2965 i386_opcode_modifier suffix_check;
2966 i386_operand_type operand_types [MAX_OPERANDS];
539e75ad 2967 int addr_prefix_disp;
a5c311ca 2968 unsigned int j;
3629bb00 2969 unsigned int found_cpu_match;
45664ddb 2970 unsigned int check_register;
29b0f896 2971
f48ff2ae
L
2972#if MAX_OPERANDS != 4
2973# error "MAX_OPERANDS must be 4."
2974#endif
2975
29b0f896 2976 found_reverse_match = 0;
539e75ad 2977 addr_prefix_disp = -1;
40fb9820
L
2978
2979 memset (&suffix_check, 0, sizeof (suffix_check));
2980 if (i.suffix == BYTE_MNEM_SUFFIX)
2981 suffix_check.no_bsuf = 1;
2982 else if (i.suffix == WORD_MNEM_SUFFIX)
2983 suffix_check.no_wsuf = 1;
2984 else if (i.suffix == SHORT_MNEM_SUFFIX)
2985 suffix_check.no_ssuf = 1;
2986 else if (i.suffix == LONG_MNEM_SUFFIX)
2987 suffix_check.no_lsuf = 1;
2988 else if (i.suffix == QWORD_MNEM_SUFFIX)
2989 suffix_check.no_qsuf = 1;
2990 else if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
7ce189b3 2991 suffix_check.no_ldsuf = 1;
582d5edd 2992 else if (i.suffix == XMMWORD_MNEM_SUFFIX)
24995bd6 2993 suffix_check.xmmword = 1;
29b0f896 2994
45aa61fe 2995 for (t = current_templates->start; t < current_templates->end; t++)
29b0f896 2996 {
539e75ad
L
2997 addr_prefix_disp = -1;
2998
29b0f896
AM
2999 /* Must have right number of operands. */
3000 if (i.operands != t->operands)
3001 continue;
3002
e1d4d893
L
3003 /* Check old gcc support. */
3004 if (!old_gcc && t->opcode_modifier.oldgcc)
3005 continue;
3006
3007 /* Check AT&T mnemonic. */
3008 if (intel_mnemonic && t->opcode_modifier.attmnemonic)
1efbbeb4
L
3009 continue;
3010
e1d4d893
L
3011 /* Check Intel syntax. */
3012 if (intel_syntax && t->opcode_modifier.attsyntax)
1efbbeb4
L
3013 continue;
3014
20592a94 3015 /* Check the suffix, except for some instructions in intel mode. */
567e4e96
L
3016 if ((!intel_syntax || !t->opcode_modifier.ignoresize)
3017 && ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
3018 || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
3019 || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
3020 || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
3021 || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
3022 || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf)))
29b0f896
AM
3023 continue;
3024
582d5edd
L
3025 /* Check the memory size in Intel mode when it is provided if
3026 needed. */
3027 if (intel_syntax
3028 && i.suffix
3029 && t->opcode_modifier.checksize
3030 && (!t->opcode_modifier.byte || !suffix_check.no_bsuf)
3031 && (!t->opcode_modifier.word || !suffix_check.no_wsuf)
3032 && (!t->opcode_modifier.dword || !suffix_check.no_lsuf)
3033 && (!t->opcode_modifier.qword || !suffix_check.no_qsuf)
24995bd6 3034 && (!t->opcode_modifier.xmmword || !suffix_check.xmmword))
582d5edd
L
3035 continue;
3036
a5c311ca
L
3037 for (j = 0; j < MAX_OPERANDS; j++)
3038 operand_types [j] = t->operand_types [j];
539e75ad 3039
45aa61fe
AM
3040 /* In general, don't allow 64-bit operands in 32-bit mode. */
3041 if (i.suffix == QWORD_MNEM_SUFFIX
3042 && flag_code != CODE_64BIT
3043 && (intel_syntax
40fb9820 3044 ? (!t->opcode_modifier.ignoresize
45aa61fe
AM
3045 && !intel_float_operand (t->name))
3046 : intel_float_operand (t->name) != 2)
40fb9820
L
3047 && ((!operand_types[0].bitfield.regmmx
3048 && !operand_types[0].bitfield.regxmm)
3049 || (!operand_types[t->operands > 1].bitfield.regmmx
3050 && !!operand_types[t->operands > 1].bitfield.regxmm))
45aa61fe
AM
3051 && (t->base_opcode != 0x0fc7
3052 || t->extension_opcode != 1 /* cmpxchg8b */))
3053 continue;
3054
29b0f896 3055 /* Do not verify operands when there are none. */
c6fb90c8 3056 else
29b0f896 3057 {
3629bb00 3058 found_cpu_match = cpu_flags_match (t->cpu_flags) == 3;
2dbab7d5
L
3059 if (!found_cpu_match)
3060 continue;
c6fb90c8 3061 if (!t->operands)
2dbab7d5
L
3062 /* We've found a match; break out of loop. */
3063 break;
29b0f896 3064 }
252b5132 3065
539e75ad
L
3066 /* Address size prefix will turn Disp64/Disp32/Disp16 operand
3067 into Disp32/Disp16/Disp32 operand. */
3068 if (i.prefix[ADDR_PREFIX] != 0)
3069 {
40fb9820 3070 /* There should be only one Disp operand. */
539e75ad
L
3071 switch (flag_code)
3072 {
3073 case CODE_16BIT:
40fb9820
L
3074 for (j = 0; j < MAX_OPERANDS; j++)
3075 {
3076 if (operand_types[j].bitfield.disp16)
3077 {
3078 addr_prefix_disp = j;
3079 operand_types[j].bitfield.disp32 = 1;
3080 operand_types[j].bitfield.disp16 = 0;
3081 break;
3082 }
3083 }
539e75ad
L
3084 break;
3085 case CODE_32BIT:
40fb9820
L
3086 for (j = 0; j < MAX_OPERANDS; j++)
3087 {
3088 if (operand_types[j].bitfield.disp32)
3089 {
3090 addr_prefix_disp = j;
3091 operand_types[j].bitfield.disp32 = 0;
3092 operand_types[j].bitfield.disp16 = 1;
3093 break;
3094 }
3095 }
539e75ad
L
3096 break;
3097 case CODE_64BIT:
40fb9820
L
3098 for (j = 0; j < MAX_OPERANDS; j++)
3099 {
3100 if (operand_types[j].bitfield.disp64)
3101 {
3102 addr_prefix_disp = j;
3103 operand_types[j].bitfield.disp64 = 0;
3104 operand_types[j].bitfield.disp32 = 1;
3105 break;
3106 }
3107 }
539e75ad
L
3108 break;
3109 }
539e75ad
L
3110 }
3111
45664ddb
L
3112 /* We check register size only if size of operands can be
3113 encoded the canonical way. */
3114 check_register = t->opcode_modifier.w;
c6fb90c8 3115 overlap0 = operand_type_and (i.types[0], operand_types[0]);
29b0f896
AM
3116 switch (t->operands)
3117 {
3118 case 1:
40fb9820 3119 if (!operand_type_match (overlap0, i.types[0]))
29b0f896
AM
3120 continue;
3121 break;
3122 case 2:
8b38ad71
L
3123 /* xchg %eax, %eax is a special case. It is an aliase for nop
3124 only in 32bit mode and we can use opcode 0x90. In 64bit
3125 mode, we can't use 0x90 for xchg %eax, %eax since it should
3126 zero-extend %eax to %rax. */
3127 if (flag_code == CODE_64BIT
3128 && t->base_opcode == 0x90
c6fb90c8
L
3129 && UINTS_EQUAL (i.types [0], acc32)
3130 && UINTS_EQUAL (i.types [1], acc32))
8b38ad71 3131 continue;
29b0f896 3132 case 3:
f48ff2ae 3133 case 4:
c6fb90c8 3134 overlap1 = operand_type_and (i.types[1], operand_types[1]);
40fb9820
L
3135 if (!operand_type_match (overlap0, i.types[0])
3136 || !operand_type_match (overlap1, i.types[1])
45664ddb
L
3137 || (check_register
3138 && !operand_type_register_match (overlap0, i.types[0],
40fb9820
L
3139 operand_types[0],
3140 overlap1, i.types[1],
3141 operand_types[1])))
29b0f896
AM
3142 {
3143 /* Check if other direction is valid ... */
40fb9820 3144 if (!t->opcode_modifier.d && !t->opcode_modifier.floatd)
29b0f896
AM
3145 continue;
3146
3147 /* Try reversing direction of operands. */
c6fb90c8
L
3148 overlap0 = operand_type_and (i.types[0], operand_types[1]);
3149 overlap1 = operand_type_and (i.types[1], operand_types[0]);
40fb9820
L
3150 if (!operand_type_match (overlap0, i.types[0])
3151 || !operand_type_match (overlap1, i.types[1])
45664ddb
L
3152 || (check_register
3153 && !operand_type_register_match (overlap0,
3154 i.types[0],
3155 operand_types[1],
3156 overlap1,
3157 i.types[1],
3158 operand_types[0])))
29b0f896
AM
3159 {
3160 /* Does not match either direction. */
3161 continue;
3162 }
3163 /* found_reverse_match holds which of D or FloatDR
3164 we've found. */
40fb9820 3165 if (t->opcode_modifier.d)
8a2ed489 3166 found_reverse_match = Opcode_D;
40fb9820 3167 else if (t->opcode_modifier.floatd)
8a2ed489
L
3168 found_reverse_match = Opcode_FloatD;
3169 else
3170 found_reverse_match = 0;
40fb9820 3171 if (t->opcode_modifier.floatr)
8a2ed489 3172 found_reverse_match |= Opcode_FloatR;
29b0f896 3173 }
f48ff2ae 3174 else
29b0f896 3175 {
f48ff2ae 3176 /* Found a forward 2 operand match here. */
d1cbb4db
L
3177 switch (t->operands)
3178 {
3179 case 4:
c6fb90c8
L
3180 overlap3 = operand_type_and (i.types[3],
3181 operand_types[3]);
d1cbb4db 3182 case 3:
c6fb90c8
L
3183 overlap2 = operand_type_and (i.types[2],
3184 operand_types[2]);
d1cbb4db
L
3185 break;
3186 }
29b0f896 3187
f48ff2ae
L
3188 switch (t->operands)
3189 {
3190 case 4:
40fb9820 3191 if (!operand_type_match (overlap3, i.types[3])
45664ddb
L
3192 || (check_register
3193 && !operand_type_register_match (overlap2,
3194 i.types[2],
3195 operand_types[2],
3196 overlap3,
3197 i.types[3],
3198 operand_types[3])))
f48ff2ae
L
3199 continue;
3200 case 3:
3201 /* Here we make use of the fact that there are no
3202 reverse match 3 operand instructions, and all 3
3203 operand instructions only need to be checked for
3204 register consistency between operands 2 and 3. */
40fb9820 3205 if (!operand_type_match (overlap2, i.types[2])
45664ddb
L
3206 || (check_register
3207 && !operand_type_register_match (overlap1,
3208 i.types[1],
3209 operand_types[1],
3210 overlap2,
3211 i.types[2],
3212 operand_types[2])))
f48ff2ae
L
3213 continue;
3214 break;
3215 }
29b0f896 3216 }
f48ff2ae 3217 /* Found either forward/reverse 2, 3 or 4 operand match here:
29b0f896
AM
3218 slip through to break. */
3219 }
3629bb00 3220 if (!found_cpu_match)
29b0f896
AM
3221 {
3222 found_reverse_match = 0;
3223 continue;
3224 }
3225 /* We've found a match; break out of loop. */
3226 break;
3227 }
3228
3229 if (t == current_templates->end)
3230 {
3231 /* We found no match. */
3232 as_bad (_("suffix or operands invalid for `%s'"),
3233 current_templates->start->name);
3234 return 0;
3235 }
252b5132 3236
29b0f896
AM
3237 if (!quiet_warnings)
3238 {
3239 if (!intel_syntax
40fb9820
L
3240 && (i.types[0].bitfield.jumpabsolute
3241 != operand_types[0].bitfield.jumpabsolute))
29b0f896
AM
3242 {
3243 as_warn (_("indirect %s without `*'"), t->name);
3244 }
3245
40fb9820
L
3246 if (t->opcode_modifier.isprefix
3247 && t->opcode_modifier.ignoresize)
29b0f896
AM
3248 {
3249 /* Warn them that a data or address size prefix doesn't
3250 affect assembly of the next line of code. */
3251 as_warn (_("stand-alone `%s' prefix"), t->name);
3252 }
3253 }
3254
3255 /* Copy the template we found. */
3256 i.tm = *t;
539e75ad
L
3257
3258 if (addr_prefix_disp != -1)
3259 i.tm.operand_types[addr_prefix_disp]
3260 = operand_types[addr_prefix_disp];
3261
29b0f896
AM
3262 if (found_reverse_match)
3263 {
3264 /* If we found a reverse match we must alter the opcode
3265 direction bit. found_reverse_match holds bits to change
3266 (different for int & float insns). */
3267
3268 i.tm.base_opcode ^= found_reverse_match;
3269
539e75ad
L
3270 i.tm.operand_types[0] = operand_types[1];
3271 i.tm.operand_types[1] = operand_types[0];
29b0f896
AM
3272 }
3273
3274 return 1;
3275}
3276
3277static int
e3bb37b5 3278check_string (void)
29b0f896 3279{
40fb9820
L
3280 int mem_op = operand_type_check (i.types[0], anymem) ? 0 : 1;
3281 if (i.tm.operand_types[mem_op].bitfield.esseg)
29b0f896
AM
3282 {
3283 if (i.seg[0] != NULL && i.seg[0] != &es)
3284 {
3285 as_bad (_("`%s' operand %d must use `%%es' segment"),
3286 i.tm.name,
3287 mem_op + 1);
3288 return 0;
3289 }
3290 /* There's only ever one segment override allowed per instruction.
3291 This instruction possibly has a legal segment override on the
3292 second operand, so copy the segment to where non-string
3293 instructions store it, allowing common code. */
3294 i.seg[0] = i.seg[1];
3295 }
40fb9820 3296 else if (i.tm.operand_types[mem_op + 1].bitfield.esseg)
29b0f896
AM
3297 {
3298 if (i.seg[1] != NULL && i.seg[1] != &es)
3299 {
3300 as_bad (_("`%s' operand %d must use `%%es' segment"),
3301 i.tm.name,
3302 mem_op + 2);
3303 return 0;
3304 }
3305 }
3306 return 1;
3307}
3308
3309static int
543613e9 3310process_suffix (void)
29b0f896
AM
3311{
3312 /* If matched instruction specifies an explicit instruction mnemonic
3313 suffix, use it. */
40fb9820
L
3314 if (i.tm.opcode_modifier.size16)
3315 i.suffix = WORD_MNEM_SUFFIX;
3316 else if (i.tm.opcode_modifier.size32)
3317 i.suffix = LONG_MNEM_SUFFIX;
3318 else if (i.tm.opcode_modifier.size64)
3319 i.suffix = QWORD_MNEM_SUFFIX;
29b0f896
AM
3320 else if (i.reg_operands)
3321 {
3322 /* If there's no instruction mnemonic suffix we try to invent one
3323 based on register operands. */
3324 if (!i.suffix)
3325 {
3326 /* We take i.suffix from the last register operand specified,
3327 Destination register type is more significant than source
381d071f
L
3328 register type. crc32 in SSE4.2 prefers source register
3329 type. */
3330 if (i.tm.base_opcode == 0xf20f38f1)
3331 {
40fb9820
L
3332 if (i.types[0].bitfield.reg16)
3333 i.suffix = WORD_MNEM_SUFFIX;
3334 else if (i.types[0].bitfield.reg32)
3335 i.suffix = LONG_MNEM_SUFFIX;
3336 else if (i.types[0].bitfield.reg64)
3337 i.suffix = QWORD_MNEM_SUFFIX;
381d071f 3338 }
9344ff29 3339 else if (i.tm.base_opcode == 0xf20f38f0)
20592a94 3340 {
40fb9820 3341 if (i.types[0].bitfield.reg8)
20592a94
L
3342 i.suffix = BYTE_MNEM_SUFFIX;
3343 }
381d071f
L
3344
3345 if (!i.suffix)
3346 {
3347 int op;
3348
20592a94
L
3349 if (i.tm.base_opcode == 0xf20f38f1
3350 || i.tm.base_opcode == 0xf20f38f0)
3351 {
3352 /* We have to know the operand size for crc32. */
3353 as_bad (_("ambiguous memory operand size for `%s`"),
3354 i.tm.name);
3355 return 0;
3356 }
3357
381d071f 3358 for (op = i.operands; --op >= 0;)
40fb9820 3359 if (!i.tm.operand_types[op].bitfield.inoutportreg)
381d071f 3360 {
40fb9820
L
3361 if (i.types[op].bitfield.reg8)
3362 {
3363 i.suffix = BYTE_MNEM_SUFFIX;
3364 break;
3365 }
3366 else if (i.types[op].bitfield.reg16)
3367 {
3368 i.suffix = WORD_MNEM_SUFFIX;
3369 break;
3370 }
3371 else if (i.types[op].bitfield.reg32)
3372 {
3373 i.suffix = LONG_MNEM_SUFFIX;
3374 break;
3375 }
3376 else if (i.types[op].bitfield.reg64)
3377 {
3378 i.suffix = QWORD_MNEM_SUFFIX;
3379 break;
3380 }
381d071f
L
3381 }
3382 }
29b0f896
AM
3383 }
3384 else if (i.suffix == BYTE_MNEM_SUFFIX)
3385 {
3386 if (!check_byte_reg ())
3387 return 0;
3388 }
3389 else if (i.suffix == LONG_MNEM_SUFFIX)
3390 {
3391 if (!check_long_reg ())
3392 return 0;
3393 }
3394 else if (i.suffix == QWORD_MNEM_SUFFIX)
3395 {
955e1e6a
L
3396 if (intel_syntax
3397 && i.tm.opcode_modifier.ignoresize
3398 && i.tm.opcode_modifier.no_qsuf)
3399 i.suffix = 0;
3400 else if (!check_qword_reg ())
29b0f896
AM
3401 return 0;
3402 }
3403 else if (i.suffix == WORD_MNEM_SUFFIX)
3404 {
3405 if (!check_word_reg ())
3406 return 0;
3407 }
582d5edd
L
3408 else if (i.suffix == XMMWORD_MNEM_SUFFIX)
3409 {
3410 /* Skip if the instruction has x suffix. match_template
3411 should check if it is a valid suffix. */
3412 }
40fb9820 3413 else if (intel_syntax && i.tm.opcode_modifier.ignoresize)
29b0f896
AM
3414 /* Do nothing if the instruction is going to ignore the prefix. */
3415 ;
3416 else
3417 abort ();
3418 }
40fb9820 3419 else if (i.tm.opcode_modifier.defaultsize
9306ca4a
JB
3420 && !i.suffix
3421 /* exclude fldenv/frstor/fsave/fstenv */
40fb9820 3422 && i.tm.opcode_modifier.no_ssuf)
29b0f896
AM
3423 {
3424 i.suffix = stackop_size;
3425 }
9306ca4a
JB
3426 else if (intel_syntax
3427 && !i.suffix
40fb9820
L
3428 && (i.tm.operand_types[0].bitfield.jumpabsolute
3429 || i.tm.opcode_modifier.jumpbyte
3430 || i.tm.opcode_modifier.jumpintersegment
64e74474
AM
3431 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
3432 && i.tm.extension_opcode <= 3)))
9306ca4a
JB
3433 {
3434 switch (flag_code)
3435 {
3436 case CODE_64BIT:
40fb9820 3437 if (!i.tm.opcode_modifier.no_qsuf)
9306ca4a
JB
3438 {
3439 i.suffix = QWORD_MNEM_SUFFIX;
3440 break;
3441 }
3442 case CODE_32BIT:
40fb9820 3443 if (!i.tm.opcode_modifier.no_lsuf)
9306ca4a
JB
3444 i.suffix = LONG_MNEM_SUFFIX;
3445 break;
3446 case CODE_16BIT:
40fb9820 3447 if (!i.tm.opcode_modifier.no_wsuf)
9306ca4a
JB
3448 i.suffix = WORD_MNEM_SUFFIX;
3449 break;
3450 }
3451 }
252b5132 3452
9306ca4a 3453 if (!i.suffix)
29b0f896 3454 {
9306ca4a
JB
3455 if (!intel_syntax)
3456 {
40fb9820 3457 if (i.tm.opcode_modifier.w)
9306ca4a 3458 {
4eed87de
AM
3459 as_bad (_("no instruction mnemonic suffix given and "
3460 "no register operands; can't size instruction"));
9306ca4a
JB
3461 return 0;
3462 }
3463 }
3464 else
3465 {
40fb9820
L
3466 unsigned int suffixes;
3467
3468 suffixes = !i.tm.opcode_modifier.no_bsuf;
3469 if (!i.tm.opcode_modifier.no_wsuf)
3470 suffixes |= 1 << 1;
3471 if (!i.tm.opcode_modifier.no_lsuf)
3472 suffixes |= 1 << 2;
fc4adea1 3473 if (!i.tm.opcode_modifier.no_ldsuf)
40fb9820
L
3474 suffixes |= 1 << 3;
3475 if (!i.tm.opcode_modifier.no_ssuf)
3476 suffixes |= 1 << 4;
3477 if (!i.tm.opcode_modifier.no_qsuf)
3478 suffixes |= 1 << 5;
3479
3480 /* There are more than suffix matches. */
3481 if (i.tm.opcode_modifier.w
9306ca4a 3482 || ((suffixes & (suffixes - 1))
40fb9820
L
3483 && !i.tm.opcode_modifier.defaultsize
3484 && !i.tm.opcode_modifier.ignoresize))
9306ca4a
JB
3485 {
3486 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
3487 return 0;
3488 }
3489 }
29b0f896 3490 }
252b5132 3491
9306ca4a
JB
3492 /* Change the opcode based on the operand size given by i.suffix;
3493 We don't need to change things for byte insns. */
3494
582d5edd
L
3495 if (i.suffix
3496 && i.suffix != BYTE_MNEM_SUFFIX
3497 && i.suffix != XMMWORD_MNEM_SUFFIX)
29b0f896
AM
3498 {
3499 /* It's not a byte, select word/dword operation. */
40fb9820 3500 if (i.tm.opcode_modifier.w)
29b0f896 3501 {
40fb9820 3502 if (i.tm.opcode_modifier.shortform)
29b0f896
AM
3503 i.tm.base_opcode |= 8;
3504 else
3505 i.tm.base_opcode |= 1;
3506 }
0f3f3d8b 3507
29b0f896
AM
3508 /* Now select between word & dword operations via the operand
3509 size prefix, except for instructions that will ignore this
3510 prefix anyway. */
ca61edf2 3511 if (i.tm.opcode_modifier.addrprefixop0)
cb712a9e 3512 {
ca61edf2
L
3513 /* The address size override prefix changes the size of the
3514 first operand. */
40fb9820
L
3515 if ((flag_code == CODE_32BIT
3516 && i.op->regs[0].reg_type.bitfield.reg16)
3517 || (flag_code != CODE_32BIT
3518 && i.op->regs[0].reg_type.bitfield.reg32))
cb712a9e
L
3519 if (!add_prefix (ADDR_PREFIX_OPCODE))
3520 return 0;
3521 }
3522 else if (i.suffix != QWORD_MNEM_SUFFIX
3523 && i.suffix != LONG_DOUBLE_MNEM_SUFFIX
40fb9820
L
3524 && !i.tm.opcode_modifier.ignoresize
3525 && !i.tm.opcode_modifier.floatmf
cb712a9e
L
3526 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
3527 || (flag_code == CODE_64BIT
40fb9820 3528 && i.tm.opcode_modifier.jumpbyte)))
24eab124
AM
3529 {
3530 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 3531
40fb9820 3532 if (i.tm.opcode_modifier.jumpbyte) /* jcxz, loop */
29b0f896 3533 prefix = ADDR_PREFIX_OPCODE;
252b5132 3534
29b0f896
AM
3535 if (!add_prefix (prefix))
3536 return 0;
24eab124 3537 }
252b5132 3538
29b0f896
AM
3539 /* Set mode64 for an operand. */
3540 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 3541 && flag_code == CODE_64BIT
40fb9820 3542 && !i.tm.opcode_modifier.norex64)
46e883c5
L
3543 {
3544 /* Special case for xchg %rax,%rax. It is NOP and doesn't
d9a5e5e5
L
3545 need rex64. cmpxchg8b is also a special case. */
3546 if (! (i.operands == 2
3547 && i.tm.base_opcode == 0x90
3548 && i.tm.extension_opcode == None
c6fb90c8
L
3549 && UINTS_EQUAL (i.types [0], acc64)
3550 && UINTS_EQUAL (i.types [1], acc64))
d9a5e5e5
L
3551 && ! (i.operands == 1
3552 && i.tm.base_opcode == 0xfc7
3553 && i.tm.extension_opcode == 1
40fb9820
L
3554 && !operand_type_check (i.types [0], reg)
3555 && operand_type_check (i.types [0], anymem)))
f6bee062 3556 i.rex |= REX_W;
46e883c5 3557 }
3e73aa7c 3558
29b0f896
AM
3559 /* Size floating point instruction. */
3560 if (i.suffix == LONG_MNEM_SUFFIX)
40fb9820 3561 if (i.tm.opcode_modifier.floatmf)
543613e9 3562 i.tm.base_opcode ^= 4;
29b0f896 3563 }
7ecd2f8b 3564
29b0f896
AM
3565 return 1;
3566}
3e73aa7c 3567
29b0f896 3568static int
543613e9 3569check_byte_reg (void)
29b0f896
AM
3570{
3571 int op;
543613e9 3572
29b0f896
AM
3573 for (op = i.operands; --op >= 0;)
3574 {
3575 /* If this is an eight bit register, it's OK. If it's the 16 or
3576 32 bit version of an eight bit register, we will just use the
3577 low portion, and that's OK too. */
40fb9820 3578 if (i.types[op].bitfield.reg8)
29b0f896
AM
3579 continue;
3580
ca61edf2
L
3581 /* Don't generate this warning if not needed. */
3582 if (intel_syntax && i.tm.opcode_modifier.byteokintel)
29b0f896
AM
3583 continue;
3584
9344ff29
L
3585 /* crc32 doesn't generate this warning. */
3586 if (i.tm.base_opcode == 0xf20f38f0)
3587 continue;
3588
40fb9820
L
3589 if ((i.types[op].bitfield.reg16
3590 || i.types[op].bitfield.reg32
3591 || i.types[op].bitfield.reg64)
3592 && i.op[op].regs->reg_num < 4)
29b0f896
AM
3593 {
3594 /* Prohibit these changes in the 64bit mode, since the
3595 lowering is more complicated. */
3596 if (flag_code == CODE_64BIT
40fb9820 3597 && !i.tm.operand_types[op].bitfield.inoutportreg)
29b0f896 3598 {
2ca3ace5
L
3599 as_bad (_("Incorrect register `%s%s' used with `%c' suffix"),
3600 register_prefix, i.op[op].regs->reg_name,
29b0f896
AM
3601 i.suffix);
3602 return 0;
3603 }
3604#if REGISTER_WARNINGS
3605 if (!quiet_warnings
40fb9820 3606 && !i.tm.operand_types[op].bitfield.inoutportreg)
a540244d
L
3607 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
3608 register_prefix,
40fb9820 3609 (i.op[op].regs + (i.types[op].bitfield.reg16
29b0f896
AM
3610 ? REGNAM_AL - REGNAM_AX
3611 : REGNAM_AL - REGNAM_EAX))->reg_name,
a540244d 3612 register_prefix,
29b0f896
AM
3613 i.op[op].regs->reg_name,
3614 i.suffix);
3615#endif
3616 continue;
3617 }
3618 /* Any other register is bad. */
40fb9820
L
3619 if (i.types[op].bitfield.reg16
3620 || i.types[op].bitfield.reg32
3621 || i.types[op].bitfield.reg64
3622 || i.types[op].bitfield.regmmx
3623 || i.types[op].bitfield.regxmm
3624 || i.types[op].bitfield.sreg2
3625 || i.types[op].bitfield.sreg3
3626 || i.types[op].bitfield.control
3627 || i.types[op].bitfield.debug
3628 || i.types[op].bitfield.test
3629 || i.types[op].bitfield.floatreg
3630 || i.types[op].bitfield.floatacc)
29b0f896 3631 {
a540244d
L
3632 as_bad (_("`%s%s' not allowed with `%s%c'"),
3633 register_prefix,
29b0f896
AM
3634 i.op[op].regs->reg_name,
3635 i.tm.name,
3636 i.suffix);
3637 return 0;
3638 }
3639 }
3640 return 1;
3641}
3642
3643static int
e3bb37b5 3644check_long_reg (void)
29b0f896
AM
3645{
3646 int op;
3647
3648 for (op = i.operands; --op >= 0;)
3649 /* Reject eight bit registers, except where the template requires
3650 them. (eg. movzb) */
40fb9820
L
3651 if (i.types[op].bitfield.reg8
3652 && (i.tm.operand_types[op].bitfield.reg16
3653 || i.tm.operand_types[op].bitfield.reg32
3654 || i.tm.operand_types[op].bitfield.acc))
29b0f896 3655 {
a540244d
L
3656 as_bad (_("`%s%s' not allowed with `%s%c'"),
3657 register_prefix,
29b0f896
AM
3658 i.op[op].regs->reg_name,
3659 i.tm.name,
3660 i.suffix);
3661 return 0;
3662 }
3663 /* Warn if the e prefix on a general reg is missing. */
3664 else if ((!quiet_warnings || flag_code == CODE_64BIT)
40fb9820
L
3665 && i.types[op].bitfield.reg16
3666 && (i.tm.operand_types[op].bitfield.reg32
3667 || i.tm.operand_types[op].bitfield.acc))
29b0f896
AM
3668 {
3669 /* Prohibit these changes in the 64bit mode, since the
3670 lowering is more complicated. */
3671 if (flag_code == CODE_64BIT)
252b5132 3672 {
2ca3ace5
L
3673 as_bad (_("Incorrect register `%s%s' used with `%c' suffix"),
3674 register_prefix, i.op[op].regs->reg_name,
29b0f896
AM
3675 i.suffix);
3676 return 0;
252b5132 3677 }
29b0f896
AM
3678#if REGISTER_WARNINGS
3679 else
a540244d
L
3680 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
3681 register_prefix,
29b0f896 3682 (i.op[op].regs + REGNAM_EAX - REGNAM_AX)->reg_name,
a540244d 3683 register_prefix,
29b0f896
AM
3684 i.op[op].regs->reg_name,
3685 i.suffix);
3686#endif
252b5132 3687 }
29b0f896 3688 /* Warn if the r prefix on a general reg is missing. */
40fb9820
L
3689 else if (i.types[op].bitfield.reg64
3690 && (i.tm.operand_types[op].bitfield.reg32
3691 || i.tm.operand_types[op].bitfield.acc))
252b5132 3692 {
34828aad 3693 if (intel_syntax
ca61edf2 3694 && i.tm.opcode_modifier.toqword
40fb9820 3695 && !i.types[0].bitfield.regxmm)
34828aad 3696 {
ca61edf2 3697 /* Convert to QWORD. We want REX byte. */
34828aad
L
3698 i.suffix = QWORD_MNEM_SUFFIX;
3699 }
3700 else
3701 {
3702 as_bad (_("Incorrect register `%s%s' used with `%c' suffix"),
3703 register_prefix, i.op[op].regs->reg_name,
3704 i.suffix);
3705 return 0;
3706 }
29b0f896
AM
3707 }
3708 return 1;
3709}
252b5132 3710
29b0f896 3711static int
e3bb37b5 3712check_qword_reg (void)
29b0f896
AM
3713{
3714 int op;
252b5132 3715
29b0f896
AM
3716 for (op = i.operands; --op >= 0; )
3717 /* Reject eight bit registers, except where the template requires
3718 them. (eg. movzb) */
40fb9820
L
3719 if (i.types[op].bitfield.reg8
3720 && (i.tm.operand_types[op].bitfield.reg16
3721 || i.tm.operand_types[op].bitfield.reg32
3722 || i.tm.operand_types[op].bitfield.acc))
29b0f896 3723 {
a540244d
L
3724 as_bad (_("`%s%s' not allowed with `%s%c'"),
3725 register_prefix,
29b0f896
AM
3726 i.op[op].regs->reg_name,
3727 i.tm.name,
3728 i.suffix);
3729 return 0;
3730 }
3731 /* Warn if the e prefix on a general reg is missing. */
40fb9820
L
3732 else if ((i.types[op].bitfield.reg16
3733 || i.types[op].bitfield.reg32)
3734 && (i.tm.operand_types[op].bitfield.reg32
3735 || i.tm.operand_types[op].bitfield.acc))
29b0f896
AM
3736 {
3737 /* Prohibit these changes in the 64bit mode, since the
3738 lowering is more complicated. */
34828aad 3739 if (intel_syntax
ca61edf2 3740 && i.tm.opcode_modifier.todword
40fb9820 3741 && !i.types[0].bitfield.regxmm)
34828aad 3742 {
ca61edf2 3743 /* Convert to DWORD. We don't want REX byte. */
34828aad
L
3744 i.suffix = LONG_MNEM_SUFFIX;
3745 }
3746 else
3747 {
3748 as_bad (_("Incorrect register `%s%s' used with `%c' suffix"),
3749 register_prefix, i.op[op].regs->reg_name,
3750 i.suffix);
3751 return 0;
3752 }
252b5132 3753 }
29b0f896
AM
3754 return 1;
3755}
252b5132 3756
29b0f896 3757static int
e3bb37b5 3758check_word_reg (void)
29b0f896
AM
3759{
3760 int op;
3761 for (op = i.operands; --op >= 0;)
3762 /* Reject eight bit registers, except where the template requires
3763 them. (eg. movzb) */
40fb9820
L
3764 if (i.types[op].bitfield.reg8
3765 && (i.tm.operand_types[op].bitfield.reg16
3766 || i.tm.operand_types[op].bitfield.reg32
3767 || i.tm.operand_types[op].bitfield.acc))
29b0f896 3768 {
a540244d
L
3769 as_bad (_("`%s%s' not allowed with `%s%c'"),
3770 register_prefix,
29b0f896
AM
3771 i.op[op].regs->reg_name,
3772 i.tm.name,
3773 i.suffix);
3774 return 0;
3775 }
3776 /* Warn if the e prefix on a general reg is present. */
3777 else if ((!quiet_warnings || flag_code == CODE_64BIT)
40fb9820
L
3778 && i.types[op].bitfield.reg32
3779 && (i.tm.operand_types[op].bitfield.reg16
3780 || i.tm.operand_types[op].bitfield.acc))
252b5132 3781 {
29b0f896
AM
3782 /* Prohibit these changes in the 64bit mode, since the
3783 lowering is more complicated. */
3784 if (flag_code == CODE_64BIT)
252b5132 3785 {
2ca3ace5
L
3786 as_bad (_("Incorrect register `%s%s' used with `%c' suffix"),
3787 register_prefix, i.op[op].regs->reg_name,
29b0f896
AM
3788 i.suffix);
3789 return 0;
252b5132 3790 }
29b0f896
AM
3791 else
3792#if REGISTER_WARNINGS
a540244d
L
3793 as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
3794 register_prefix,
29b0f896 3795 (i.op[op].regs + REGNAM_AX - REGNAM_EAX)->reg_name,
a540244d 3796 register_prefix,
29b0f896
AM
3797 i.op[op].regs->reg_name,
3798 i.suffix);
3799#endif
3800 }
3801 return 1;
3802}
252b5132 3803
29b0f896 3804static int
40fb9820 3805update_imm (unsigned int j)
29b0f896 3806{
40fb9820
L
3807 i386_operand_type overlap;
3808
c6fb90c8 3809 overlap = operand_type_and (i.types[j], i.tm.operand_types[j]);
40fb9820
L
3810 if ((overlap.bitfield.imm8
3811 || overlap.bitfield.imm8s
3812 || overlap.bitfield.imm16
3813 || overlap.bitfield.imm32
3814 || overlap.bitfield.imm32s
3815 || overlap.bitfield.imm64)
c6fb90c8
L
3816 && !UINTS_EQUAL (overlap, imm8)
3817 && !UINTS_EQUAL (overlap, imm8s)
3818 && !UINTS_EQUAL (overlap, imm16)
3819 && !UINTS_EQUAL (overlap, imm32)
3820 && !UINTS_EQUAL (overlap, imm32s)
3821 && !UINTS_EQUAL (overlap, imm64))
29b0f896
AM
3822 {
3823 if (i.suffix)
3824 {
40fb9820
L
3825 i386_operand_type temp;
3826
c6fb90c8 3827 UINTS_CLEAR (temp);
40fb9820
L
3828 if (i.suffix == BYTE_MNEM_SUFFIX)
3829 {
3830 temp.bitfield.imm8 = overlap.bitfield.imm8;
3831 temp.bitfield.imm8s = overlap.bitfield.imm8s;
3832 }
3833 else if (i.suffix == WORD_MNEM_SUFFIX)
3834 temp.bitfield.imm16 = overlap.bitfield.imm16;
3835 else if (i.suffix == QWORD_MNEM_SUFFIX)
3836 {
3837 temp.bitfield.imm64 = overlap.bitfield.imm64;
3838 temp.bitfield.imm32s = overlap.bitfield.imm32s;
3839 }
3840 else
3841 temp.bitfield.imm32 = overlap.bitfield.imm32;
3842 overlap = temp;
29b0f896 3843 }
c6fb90c8
L
3844 else if (UINTS_EQUAL (overlap, imm16_32_32s)
3845 || UINTS_EQUAL (overlap, imm16_32)
3846 || UINTS_EQUAL (overlap, imm16_32s))
29b0f896 3847 {
c6fb90c8 3848 UINTS_CLEAR (overlap);
40fb9820
L
3849 if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
3850 overlap.bitfield.imm16 = 1;
3851 else
3852 overlap.bitfield.imm32s = 1;
29b0f896 3853 }
c6fb90c8
L
3854 if (!UINTS_EQUAL (overlap, imm8)
3855 && !UINTS_EQUAL (overlap, imm8s)
3856 && !UINTS_EQUAL (overlap, imm16)
3857 && !UINTS_EQUAL (overlap, imm32)
3858 && !UINTS_EQUAL (overlap, imm32s)
3859 && !UINTS_EQUAL (overlap, imm64))
29b0f896 3860 {
4eed87de
AM
3861 as_bad (_("no instruction mnemonic suffix given; "
3862 "can't determine immediate size"));
29b0f896
AM
3863 return 0;
3864 }
3865 }
40fb9820 3866 i.types[j] = overlap;
29b0f896 3867
40fb9820
L
3868 return 1;
3869}
3870
3871static int
3872finalize_imm (void)
3873{
3874 unsigned int j;
29b0f896 3875
40fb9820
L
3876 for (j = 0; j < 2; j++)
3877 if (update_imm (j) == 0)
3878 return 0;
3879
c6fb90c8 3880 i.types[2] = operand_type_and (i.types[2], i.tm.operand_types[2]);
40fb9820 3881 assert (operand_type_check (i.types[2], imm) == 0);
29b0f896
AM
3882
3883 return 1;
3884}
3885
85f10a01
MM
3886static void
3887process_drex (void)
3888{
5dd15031
JJ
3889 i.drex.modrm_reg = 0;
3890 i.drex.modrm_regmem = 0;
85f10a01
MM
3891
3892 /* SSE5 4 operand instructions must have the destination the same as
3893 one of the inputs. Figure out the destination register and cache
3894 it away in the drex field, and remember which fields to use for
3895 the modrm byte. */
3896 if (i.tm.opcode_modifier.drex
3897 && i.tm.opcode_modifier.drexv
3898 && i.operands == 4)
3899 {
3900 i.tm.extension_opcode = None;
3901
3902 /* Case 1: 4 operand insn, dest = src1, src3 = register. */
3903 if (i.types[0].bitfield.regxmm != 0
3904 && i.types[1].bitfield.regxmm != 0
3905 && i.types[2].bitfield.regxmm != 0
3906 && i.types[3].bitfield.regxmm != 0
3907 && i.op[0].regs->reg_num == i.op[3].regs->reg_num
3908 && i.op[0].regs->reg_flags == i.op[3].regs->reg_flags)
3909 {
3910 /* Clear the arguments that are stored in drex. */
3911 UINTS_CLEAR (i.types[0]);
3912 UINTS_CLEAR (i.types[3]);
3913 i.reg_operands -= 2;
3914
3915 /* There are two different ways to encode a 4 operand
3916 instruction with all registers that uses OC1 set to
3917 0 or 1. Favor setting OC1 to 0 since this mimics the
3918 actions of other SSE5 assemblers. Use modrm encoding 2
3919 for register/register. Include the high order bit that
3920 is normally stored in the REX byte in the register
3921 field. */
3922 i.tm.extension_opcode = DREX_X1_XMEM_X2_X1;
3923 i.drex.modrm_reg = 2;
3924 i.drex.modrm_regmem = 1;
3925 i.drex.reg = (i.op[3].regs->reg_num
3926 + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
3927 }
3928
3929 /* Case 2: 4 operand insn, dest = src1, src3 = memory. */
3930 else if (i.types[0].bitfield.regxmm != 0
3931 && i.types[1].bitfield.regxmm != 0
3932 && (i.types[2].bitfield.regxmm
3933 || operand_type_check (i.types[2], anymem))
3934 && i.types[3].bitfield.regxmm != 0
3935 && i.op[0].regs->reg_num == i.op[3].regs->reg_num
3936 && i.op[0].regs->reg_flags == i.op[3].regs->reg_flags)
3937 {
3938 /* clear the arguments that are stored in drex */
3939 UINTS_CLEAR (i.types[0]);
3940 UINTS_CLEAR (i.types[3]);
3941 i.reg_operands -= 2;
3942
3943 /* Specify the modrm encoding for memory addressing. Include
3944 the high order bit that is normally stored in the REX byte
3945 in the register field. */
3946 i.tm.extension_opcode = DREX_X1_X2_XMEM_X1;
3947 i.drex.modrm_reg = 1;
3948 i.drex.modrm_regmem = 2;
3949 i.drex.reg = (i.op[3].regs->reg_num
3950 + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
3951 }
3952
3953 /* Case 3: 4 operand insn, dest = src1, src2 = memory. */
3954 else if (i.types[0].bitfield.regxmm != 0
3955 && operand_type_check (i.types[1], anymem) != 0
3956 && i.types[2].bitfield.regxmm != 0
3957 && i.types[3].bitfield.regxmm != 0
3958 && i.op[0].regs->reg_num == i.op[3].regs->reg_num
3959 && i.op[0].regs->reg_flags == i.op[3].regs->reg_flags)
3960 {
3961 /* Clear the arguments that are stored in drex. */
3962 UINTS_CLEAR (i.types[0]);
3963 UINTS_CLEAR (i.types[3]);
3964 i.reg_operands -= 2;
3965
3966 /* Specify the modrm encoding for memory addressing. Include
3967 the high order bit that is normally stored in the REX byte
3968 in the register field. */
3969 i.tm.extension_opcode = DREX_X1_XMEM_X2_X1;
3970 i.drex.modrm_reg = 2;
3971 i.drex.modrm_regmem = 1;
3972 i.drex.reg = (i.op[3].regs->reg_num
3973 + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
3974 }
3975
3976 /* Case 4: 4 operand insn, dest = src3, src2 = register. */
3977 else if (i.types[0].bitfield.regxmm != 0
3978 && i.types[1].bitfield.regxmm != 0
3979 && i.types[2].bitfield.regxmm != 0
3980 && i.types[3].bitfield.regxmm != 0
3981 && i.op[2].regs->reg_num == i.op[3].regs->reg_num
3982 && i.op[2].regs->reg_flags == i.op[3].regs->reg_flags)
3983 {
3984 /* clear the arguments that are stored in drex */
3985 UINTS_CLEAR (i.types[2]);
3986 UINTS_CLEAR (i.types[3]);
3987 i.reg_operands -= 2;
3988
3989 /* There are two different ways to encode a 4 operand
3990 instruction with all registers that uses OC1 set to
3991 0 or 1. Favor setting OC1 to 0 since this mimics the
3992 actions of other SSE5 assemblers. Use modrm encoding
3993 2 for register/register. Include the high order bit that
3994 is normally stored in the REX byte in the register
3995 field. */
3996 i.tm.extension_opcode = DREX_XMEM_X1_X2_X2;
3997 i.drex.modrm_reg = 1;
3998 i.drex.modrm_regmem = 0;
3999
4000 /* Remember the register, including the upper bits */
4001 i.drex.reg = (i.op[3].regs->reg_num
4002 + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
4003 }
4004
4005 /* Case 5: 4 operand insn, dest = src3, src2 = memory. */
4006 else if (i.types[0].bitfield.regxmm != 0
4007 && (i.types[1].bitfield.regxmm
4008 || operand_type_check (i.types[1], anymem))
4009 && i.types[2].bitfield.regxmm != 0
4010 && i.types[3].bitfield.regxmm != 0
4011 && i.op[2].regs->reg_num == i.op[3].regs->reg_num
4012 && i.op[2].regs->reg_flags == i.op[3].regs->reg_flags)
4013 {
4014 /* Clear the arguments that are stored in drex. */
4015 UINTS_CLEAR (i.types[2]);
4016 UINTS_CLEAR (i.types[3]);
4017 i.reg_operands -= 2;
4018
4019 /* Specify the modrm encoding and remember the register
4020 including the bits normally stored in the REX byte. */
4021 i.tm.extension_opcode = DREX_X1_XMEM_X2_X2;
4022 i.drex.modrm_reg = 0;
4023 i.drex.modrm_regmem = 1;
4024 i.drex.reg = (i.op[3].regs->reg_num
4025 + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
4026 }
4027
4028 /* Case 6: 4 operand insn, dest = src3, src1 = memory. */
4029 else if (operand_type_check (i.types[0], anymem) != 0
4030 && i.types[1].bitfield.regxmm != 0
4031 && i.types[2].bitfield.regxmm != 0
4032 && i.types[3].bitfield.regxmm != 0
4033 && i.op[2].regs->reg_num == i.op[3].regs->reg_num
4034 && i.op[2].regs->reg_flags == i.op[3].regs->reg_flags)
4035 {
4036 /* clear the arguments that are stored in drex */
4037 UINTS_CLEAR (i.types[2]);
4038 UINTS_CLEAR (i.types[3]);
4039 i.reg_operands -= 2;
4040
4041 /* Specify the modrm encoding and remember the register
4042 including the bits normally stored in the REX byte. */
4043 i.tm.extension_opcode = DREX_XMEM_X1_X2_X2;
4044 i.drex.modrm_reg = 1;
4045 i.drex.modrm_regmem = 0;
4046 i.drex.reg = (i.op[3].regs->reg_num
4047 + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
4048 }
4049
4050 else
4051 as_bad (_("Incorrect operands for the '%s' instruction"),
4052 i.tm.name);
4053 }
4054
4055 /* SSE5 instructions with the DREX byte where the only memory operand
4056 is in the 2nd argument, and the first and last xmm register must
4057 match, and is encoded in the DREX byte. */
4058 else if (i.tm.opcode_modifier.drex
4059 && !i.tm.opcode_modifier.drexv
4060 && i.operands == 4)
4061 {
4062 /* Case 1: 4 operand insn, dest = src1, src3 = reg/mem. */
4063 if (i.types[0].bitfield.regxmm != 0
4064 && (i.types[1].bitfield.regxmm
4065 || operand_type_check(i.types[1], anymem))
4066 && i.types[2].bitfield.regxmm != 0
4067 && i.types[3].bitfield.regxmm != 0
4068 && i.op[0].regs->reg_num == i.op[3].regs->reg_num
4069 && i.op[0].regs->reg_flags == i.op[3].regs->reg_flags)
4070 {
4071 /* clear the arguments that are stored in drex */
4072 UINTS_CLEAR (i.types[0]);
4073 UINTS_CLEAR (i.types[3]);
4074 i.reg_operands -= 2;
4075
4076 /* Specify the modrm encoding and remember the register
4077 including the high bit normally stored in the REX
4078 byte. */
4079 i.drex.modrm_reg = 2;
4080 i.drex.modrm_regmem = 1;
4081 i.drex.reg = (i.op[3].regs->reg_num
4082 + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
4083 }
4084
4085 else
4086 as_bad (_("Incorrect operands for the '%s' instruction"),
4087 i.tm.name);
4088 }
4089
4090 /* SSE5 3 operand instructions that the result is a register, being
4091 either operand can be a memory operand, using OC0 to note which
4092 one is the memory. */
4093 else if (i.tm.opcode_modifier.drex
4094 && i.tm.opcode_modifier.drexv
4095 && i.operands == 3)
4096 {
4097 i.tm.extension_opcode = None;
4098
4099 /* Case 1: 3 operand insn, src1 = register. */
4100 if (i.types[0].bitfield.regxmm != 0
4101 && i.types[1].bitfield.regxmm != 0
4102 && i.types[2].bitfield.regxmm != 0)
4103 {
4104 /* Clear the arguments that are stored in drex. */
4105 UINTS_CLEAR (i.types[2]);
4106 i.reg_operands--;
4107
4108 /* Specify the modrm encoding and remember the register
4109 including the high bit normally stored in the REX byte. */
4110 i.tm.extension_opcode = DREX_XMEM_X1_X2;
4111 i.drex.modrm_reg = 1;
4112 i.drex.modrm_regmem = 0;
4113 i.drex.reg = (i.op[2].regs->reg_num
4114 + ((i.op[2].regs->reg_flags & RegRex) ? 8 : 0));
4115 }
4116
4117 /* Case 2: 3 operand insn, src1 = memory. */
4118 else if (operand_type_check (i.types[0], anymem) != 0
4119 && i.types[1].bitfield.regxmm != 0
4120 && i.types[2].bitfield.regxmm != 0)
4121 {
4122 /* Clear the arguments that are stored in drex. */
4123 UINTS_CLEAR (i.types[2]);
4124 i.reg_operands--;
4125
4126 /* Specify the modrm encoding and remember the register
4127 including the high bit normally stored in the REX
4128 byte. */
4129 i.tm.extension_opcode = DREX_XMEM_X1_X2;
4130 i.drex.modrm_reg = 1;
4131 i.drex.modrm_regmem = 0;
4132 i.drex.reg = (i.op[2].regs->reg_num
4133 + ((i.op[2].regs->reg_flags & RegRex) ? 8 : 0));
4134 }
4135
4136 /* Case 3: 3 operand insn, src2 = memory. */
4137 else if (i.types[0].bitfield.regxmm != 0
4138 && operand_type_check (i.types[1], anymem) != 0
4139 && i.types[2].bitfield.regxmm != 0)
4140 {
4141 /* Clear the arguments that are stored in drex. */
4142 UINTS_CLEAR (i.types[2]);
4143 i.reg_operands--;
4144
4145 /* Specify the modrm encoding and remember the register
4146 including the high bit normally stored in the REX byte. */
4147 i.tm.extension_opcode = DREX_X1_XMEM_X2;
4148 i.drex.modrm_reg = 0;
4149 i.drex.modrm_regmem = 1;
4150 i.drex.reg = (i.op[2].regs->reg_num
4151 + ((i.op[2].regs->reg_flags & RegRex) ? 8 : 0));
4152 }
4153
4154 else
4155 as_bad (_("Incorrect operands for the '%s' instruction"),
4156 i.tm.name);
4157 }
4158
4159 /* SSE5 4 operand instructions that are the comparison instructions
4160 where the first operand is the immediate value of the comparison
4161 to be done. */
4162 else if (i.tm.opcode_modifier.drexc != 0 && i.operands == 4)
4163 {
4164 /* Case 1: 4 operand insn, src1 = reg/memory. */
4165 if (operand_type_check (i.types[0], imm) != 0
4166 && (i.types[1].bitfield.regxmm
4167 || operand_type_check (i.types[1], anymem))
4168 && i.types[2].bitfield.regxmm != 0
4169 && i.types[3].bitfield.regxmm != 0)
4170 {
4171 /* clear the arguments that are stored in drex */
4172 UINTS_CLEAR (i.types[3]);
4173 i.reg_operands--;
4174
4175 /* Specify the modrm encoding and remember the register
4176 including the high bit normally stored in the REX byte. */
4177 i.drex.modrm_reg = 2;
4178 i.drex.modrm_regmem = 1;
4179 i.drex.reg = (i.op[3].regs->reg_num
4180 + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
4181 }
4182
4183 /* Case 2: 3 operand insn with ImmExt that places the
4184 opcode_extension as an immediate argument. This is used for
4185 all of the varients of comparison that supplies the appropriate
4186 value as part of the instruction. */
4187 else if ((i.types[0].bitfield.regxmm
4188 || operand_type_check (i.types[0], anymem))
4189 && i.types[1].bitfield.regxmm != 0
4190 && i.types[2].bitfield.regxmm != 0
4191 && operand_type_check (i.types[3], imm) != 0)
4192 {
4193 /* clear the arguments that are stored in drex */
4194 UINTS_CLEAR (i.types[2]);
4195 i.reg_operands--;
4196
4197 /* Specify the modrm encoding and remember the register
4198 including the high bit normally stored in the REX byte. */
4199 i.drex.modrm_reg = 1;
4200 i.drex.modrm_regmem = 0;
4201 i.drex.reg = (i.op[2].regs->reg_num
4202 + ((i.op[2].regs->reg_flags & RegRex) ? 8 : 0));
4203 }
4204
4205 else
4206 as_bad (_("Incorrect operands for the '%s' instruction"),
4207 i.tm.name);
4208 }
4209
4210 else if (i.tm.opcode_modifier.drex
4211 || i.tm.opcode_modifier.drexv
4212 || i.tm.opcode_modifier.drexc)
4213 as_bad (_("Internal error for the '%s' instruction"), i.tm.name);
4214}
4215
29b0f896 4216static int
e3bb37b5 4217process_operands (void)
29b0f896
AM
4218{
4219 /* Default segment register this instruction will use for memory
4220 accesses. 0 means unknown. This is only for optimizing out
4221 unnecessary segment overrides. */
4222 const seg_entry *default_seg = 0;
4223
85f10a01
MM
4224 /* Handle all of the DREX munging that SSE5 needs. */
4225 if (i.tm.opcode_modifier.drex
4226 || i.tm.opcode_modifier.drexv
4227 || i.tm.opcode_modifier.drexc)
4228 process_drex ();
4229
e2ec9d29 4230 if (i.tm.opcode_modifier.firstxmm0)
29b0f896 4231 {
9fcfb3d7
L
4232 unsigned int j;
4233
e2ec9d29
L
4234 /* The first operand is implicit and must be xmm0. */
4235 assert (i.reg_operands && UINTS_EQUAL (i.types[0], regxmm));
4236 if (i.op[0].regs->reg_num != 0)
4237 {
4238 if (intel_syntax)
4239 as_bad (_("the last operand of `%s' must be `%sxmm0'"),
4240 i.tm.name, register_prefix);
4241 else
4242 as_bad (_("the first operand of `%s' must be `%sxmm0'"),
4243 i.tm.name, register_prefix);
4244 return 0;
4245 }
9fcfb3d7
L
4246
4247 for (j = 1; j < i.operands; j++)
4248 {
4249 i.op[j - 1] = i.op[j];
4250 i.types[j - 1] = i.types[j];
4251
4252 /* We need to adjust fields in i.tm since they are used by
4253 build_modrm_byte. */
4254 i.tm.operand_types [j - 1] = i.tm.operand_types [j];
4255 }
4256
e2ec9d29
L
4257 i.operands--;
4258 i.reg_operands--;
e2ec9d29
L
4259 i.tm.operands--;
4260 }
4261 else if (i.tm.opcode_modifier.regkludge)
4262 {
4263 /* The imul $imm, %reg instruction is converted into
4264 imul $imm, %reg, %reg, and the clr %reg instruction
4265 is converted into xor %reg, %reg. */
4266
4267 unsigned int first_reg_op;
4268
4269 if (operand_type_check (i.types[0], reg))
4270 first_reg_op = 0;
4271 else
4272 first_reg_op = 1;
4273 /* Pretend we saw the extra register operand. */
4274 assert (i.reg_operands == 1
4275 && i.op[first_reg_op + 1].regs == 0);
4276 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
4277 i.types[first_reg_op + 1] = i.types[first_reg_op];
4278 i.operands++;
4279 i.reg_operands++;
29b0f896
AM
4280 }
4281
40fb9820 4282 if (i.tm.opcode_modifier.shortform)
29b0f896 4283 {
40fb9820
L
4284 if (i.types[0].bitfield.sreg2
4285 || i.types[0].bitfield.sreg3)
29b0f896 4286 {
4eed87de
AM
4287 if (i.tm.base_opcode == POP_SEG_SHORT
4288 && i.op[0].regs->reg_num == 1)
29b0f896 4289 {
4eed87de
AM
4290 as_bad (_("you can't `pop %%cs'"));
4291 return 0;
29b0f896 4292 }
4eed87de
AM
4293 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
4294 if ((i.op[0].regs->reg_flags & RegRex) != 0)
161a04f6 4295 i.rex |= REX_B;
4eed87de
AM
4296 }
4297 else
4298 {
85f10a01
MM
4299 /* The register or float register operand is in operand
4300 0 or 1. */
40fb9820
L
4301 unsigned int op;
4302
4303 if (i.types[0].bitfield.floatreg
4304 || operand_type_check (i.types[0], reg))
4305 op = 0;
4306 else
4307 op = 1;
4eed87de
AM
4308 /* Register goes in low 3 bits of opcode. */
4309 i.tm.base_opcode |= i.op[op].regs->reg_num;
4310 if ((i.op[op].regs->reg_flags & RegRex) != 0)
161a04f6 4311 i.rex |= REX_B;
40fb9820 4312 if (!quiet_warnings && i.tm.opcode_modifier.ugh)
29b0f896 4313 {
4eed87de
AM
4314 /* Warn about some common errors, but press on regardless.
4315 The first case can be generated by gcc (<= 2.8.1). */
4316 if (i.operands == 2)
4317 {
4318 /* Reversed arguments on faddp, fsubp, etc. */
a540244d
L
4319 as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
4320 register_prefix, i.op[1].regs->reg_name,
4321 register_prefix, i.op[0].regs->reg_name);
4eed87de
AM
4322 }
4323 else
4324 {
4325 /* Extraneous `l' suffix on fp insn. */
a540244d
L
4326 as_warn (_("translating to `%s %s%s'"), i.tm.name,
4327 register_prefix, i.op[0].regs->reg_name);
4eed87de 4328 }
29b0f896
AM
4329 }
4330 }
4331 }
40fb9820 4332 else if (i.tm.opcode_modifier.modrm)
29b0f896
AM
4333 {
4334 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
4335 must be put into the modrm byte). Now, we make the modrm and
4336 index base bytes based on all the info we've collected. */
29b0f896
AM
4337
4338 default_seg = build_modrm_byte ();
4339 }
8a2ed489 4340 else if ((i.tm.base_opcode & ~0x3) == MOV_AX_DISP32)
29b0f896
AM
4341 {
4342 default_seg = &ds;
4343 }
40fb9820 4344 else if (i.tm.opcode_modifier.isstring)
29b0f896
AM
4345 {
4346 /* For the string instructions that allow a segment override
4347 on one of their operands, the default segment is ds. */
4348 default_seg = &ds;
4349 }
4350
75178d9d
L
4351 if (i.tm.base_opcode == 0x8d /* lea */
4352 && i.seg[0]
4353 && !quiet_warnings)
30123838 4354 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
52271982
AM
4355
4356 /* If a segment was explicitly specified, and the specified segment
4357 is not the default, use an opcode prefix to select it. If we
4358 never figured out what the default segment is, then default_seg
4359 will be zero at this point, and the specified segment prefix will
4360 always be used. */
29b0f896
AM
4361 if ((i.seg[0]) && (i.seg[0] != default_seg))
4362 {
4363 if (!add_prefix (i.seg[0]->seg_prefix))
4364 return 0;
4365 }
4366 return 1;
4367}
4368
4369static const seg_entry *
e3bb37b5 4370build_modrm_byte (void)
29b0f896
AM
4371{
4372 const seg_entry *default_seg = 0;
4373
85f10a01
MM
4374 /* SSE5 4 operand instructions are encoded in such a way that one of
4375 the inputs must match the destination register. Process_drex hides
4376 the 3rd argument in the drex field, so that by the time we get
4377 here, it looks to GAS as if this is a 2 operand instruction. */
4378 if ((i.tm.opcode_modifier.drex
4379 || i.tm.opcode_modifier.drexv
b5016f89 4380 || i.tm.opcode_modifier.drexc)
85f10a01
MM
4381 && i.reg_operands == 2)
4382 {
4383 const reg_entry *reg = i.op[i.drex.modrm_reg].regs;
4384 const reg_entry *regmem = i.op[i.drex.modrm_regmem].regs;
4385
4386 i.rm.reg = reg->reg_num;
4387 i.rm.regmem = regmem->reg_num;
4388 i.rm.mode = 3;
4389 if ((reg->reg_flags & RegRex) != 0)
4390 i.rex |= REX_R;
4391 if ((regmem->reg_flags & RegRex) != 0)
4392 i.rex |= REX_B;
4393 }
4394
29b0f896
AM
4395 /* i.reg_operands MUST be the number of real register operands;
4396 implicit registers do not count. */
85f10a01 4397 else if (i.reg_operands == 2)
29b0f896
AM
4398 {
4399 unsigned int source, dest;
cab737b9
L
4400
4401 switch (i.operands)
4402 {
4403 case 2:
4404 source = 0;
4405 break;
4406 case 3:
c81128dc
L
4407 /* When there are 3 operands, one of them may be immediate,
4408 which may be the first or the last operand. Otherwise,
4409 the first operand must be shift count register (cl). */
4410 assert (i.imm_operands == 1
4411 || (i.imm_operands == 0
40fb9820
L
4412 && i.types[0].bitfield.shiftcount));
4413 if (operand_type_check (i.types[0], imm)
4414 || i.types[0].bitfield.shiftcount)
4415 source = 1;
4416 else
4417 source = 0;
cab737b9
L
4418 break;
4419 case 4:
368d64cc
L
4420 /* When there are 4 operands, the first two must be 8bit
4421 immediate operands. The source operand will be the 3rd
4422 one. */
cab737b9 4423 assert (i.imm_operands == 2
368d64cc
L
4424 && i.types[0].bitfield.imm8
4425 && i.types[1].bitfield.imm8);
cab737b9
L
4426 source = 2;
4427 break;
4428 default:
4429 abort ();
4430 }
4431
29b0f896
AM
4432 dest = source + 1;
4433
4434 i.rm.mode = 3;
4435 /* One of the register operands will be encoded in the i.tm.reg
4436 field, the other in the combined i.tm.mode and i.tm.regmem
4437 fields. If no form of this instruction supports a memory
4438 destination operand, then we assume the source operand may
4439 sometimes be a memory operand and so we need to store the
4440 destination in the i.rm.reg field. */
40fb9820
L
4441 if (!i.tm.operand_types[dest].bitfield.regmem
4442 && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
29b0f896
AM
4443 {
4444 i.rm.reg = i.op[dest].regs->reg_num;
4445 i.rm.regmem = i.op[source].regs->reg_num;
4446 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 4447 i.rex |= REX_R;
29b0f896 4448 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 4449 i.rex |= REX_B;
29b0f896
AM
4450 }
4451 else
4452 {
4453 i.rm.reg = i.op[source].regs->reg_num;
4454 i.rm.regmem = i.op[dest].regs->reg_num;
4455 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
161a04f6 4456 i.rex |= REX_B;
29b0f896 4457 if ((i.op[source].regs->reg_flags & RegRex) != 0)
161a04f6 4458 i.rex |= REX_R;
29b0f896 4459 }
161a04f6 4460 if (flag_code != CODE_64BIT && (i.rex & (REX_R | REX_B)))
c4a530c5 4461 {
40fb9820
L
4462 if (!i.types[0].bitfield.control
4463 && !i.types[1].bitfield.control)
c4a530c5 4464 abort ();
161a04f6 4465 i.rex &= ~(REX_R | REX_B);
c4a530c5
JB
4466 add_prefix (LOCK_PREFIX_OPCODE);
4467 }
29b0f896
AM
4468 }
4469 else
4470 { /* If it's not 2 reg operands... */
4471 if (i.mem_operands)
4472 {
4473 unsigned int fake_zero_displacement = 0;
99018f42 4474 unsigned int op;
4eed87de 4475
85f10a01
MM
4476 /* This has been precalculated for SSE5 instructions
4477 that have a DREX field earlier in process_drex. */
b5016f89
L
4478 if (i.tm.opcode_modifier.drex
4479 || i.tm.opcode_modifier.drexv
4480 || i.tm.opcode_modifier.drexc)
85f10a01
MM
4481 op = i.drex.modrm_regmem;
4482 else
4483 {
c0209578
L
4484 for (op = 0; op < i.operands; op++)
4485 if (operand_type_check (i.types[op], anymem))
4486 break;
4487 assert (op < i.operands);
85f10a01 4488 }
29b0f896
AM
4489
4490 default_seg = &ds;
4491
4492 if (i.base_reg == 0)
4493 {
4494 i.rm.mode = 0;
4495 if (!i.disp_operands)
4496 fake_zero_displacement = 1;
4497 if (i.index_reg == 0)
4498 {
4499 /* Operand is just <disp> */
20f0a1fc 4500 if (flag_code == CODE_64BIT)
29b0f896
AM
4501 {
4502 /* 64bit mode overwrites the 32bit absolute
4503 addressing by RIP relative addressing and
4504 absolute addressing is encoded by one of the
4505 redundant SIB forms. */
4506 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
4507 i.sib.base = NO_BASE_REGISTER;
4508 i.sib.index = NO_INDEX_REGISTER;
fc225355 4509 i.types[op] = ((i.prefix[ADDR_PREFIX] == 0)
40fb9820 4510 ? disp32s : disp32);
20f0a1fc 4511 }
fc225355
L
4512 else if ((flag_code == CODE_16BIT)
4513 ^ (i.prefix[ADDR_PREFIX] != 0))
20f0a1fc
NC
4514 {
4515 i.rm.regmem = NO_BASE_REGISTER_16;
40fb9820 4516 i.types[op] = disp16;
20f0a1fc
NC
4517 }
4518 else
4519 {
4520 i.rm.regmem = NO_BASE_REGISTER;
40fb9820 4521 i.types[op] = disp32;
29b0f896
AM
4522 }
4523 }
4524 else /* !i.base_reg && i.index_reg */
4525 {
db51cc60
L
4526 if (i.index_reg->reg_num == RegEiz
4527 || i.index_reg->reg_num == RegRiz)
4528 i.sib.index = NO_INDEX_REGISTER;
4529 else
4530 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
4531 i.sib.base = NO_BASE_REGISTER;
4532 i.sib.scale = i.log2_scale_factor;
4533 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
40fb9820
L
4534 i.types[op].bitfield.disp8 = 0;
4535 i.types[op].bitfield.disp16 = 0;
4536 i.types[op].bitfield.disp64 = 0;
29b0f896 4537 if (flag_code != CODE_64BIT)
40fb9820
L
4538 {
4539 /* Must be 32 bit */
4540 i.types[op].bitfield.disp32 = 1;
4541 i.types[op].bitfield.disp32s = 0;
4542 }
29b0f896 4543 else
40fb9820
L
4544 {
4545 i.types[op].bitfield.disp32 = 0;
4546 i.types[op].bitfield.disp32s = 1;
4547 }
29b0f896 4548 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 4549 i.rex |= REX_X;
29b0f896
AM
4550 }
4551 }
4552 /* RIP addressing for 64bit mode. */
9a04903e
JB
4553 else if (i.base_reg->reg_num == RegRip ||
4554 i.base_reg->reg_num == RegEip)
29b0f896
AM
4555 {
4556 i.rm.regmem = NO_BASE_REGISTER;
40fb9820
L
4557 i.types[op].bitfield.disp8 = 0;
4558 i.types[op].bitfield.disp16 = 0;
4559 i.types[op].bitfield.disp32 = 0;
4560 i.types[op].bitfield.disp32s = 1;
4561 i.types[op].bitfield.disp64 = 0;
71903a11 4562 i.flags[op] |= Operand_PCrel;
20f0a1fc
NC
4563 if (! i.disp_operands)
4564 fake_zero_displacement = 1;
29b0f896 4565 }
40fb9820 4566 else if (i.base_reg->reg_type.bitfield.reg16)
29b0f896
AM
4567 {
4568 switch (i.base_reg->reg_num)
4569 {
4570 case 3: /* (%bx) */
4571 if (i.index_reg == 0)
4572 i.rm.regmem = 7;
4573 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
4574 i.rm.regmem = i.index_reg->reg_num - 6;
4575 break;
4576 case 5: /* (%bp) */
4577 default_seg = &ss;
4578 if (i.index_reg == 0)
4579 {
4580 i.rm.regmem = 6;
40fb9820 4581 if (operand_type_check (i.types[op], disp) == 0)
29b0f896
AM
4582 {
4583 /* fake (%bp) into 0(%bp) */
40fb9820 4584 i.types[op].bitfield.disp8 = 1;
252b5132 4585 fake_zero_displacement = 1;
29b0f896
AM
4586 }
4587 }
4588 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
4589 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
4590 break;
4591 default: /* (%si) -> 4 or (%di) -> 5 */
4592 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
4593 }
4594 i.rm.mode = mode_from_disp_size (i.types[op]);
4595 }
4596 else /* i.base_reg and 32/64 bit mode */
4597 {
4598 if (flag_code == CODE_64BIT
40fb9820
L
4599 && operand_type_check (i.types[op], disp))
4600 {
4601 i386_operand_type temp;
c6fb90c8 4602 UINTS_CLEAR (temp);
40fb9820
L
4603 temp.bitfield.disp8 = i.types[op].bitfield.disp8;
4604 i.types[op] = temp;
4605 if (i.prefix[ADDR_PREFIX] == 0)
4606 i.types[op].bitfield.disp32s = 1;
4607 else
4608 i.types[op].bitfield.disp32 = 1;
4609 }
20f0a1fc 4610
29b0f896
AM
4611 i.rm.regmem = i.base_reg->reg_num;
4612 if ((i.base_reg->reg_flags & RegRex) != 0)
161a04f6 4613 i.rex |= REX_B;
29b0f896
AM
4614 i.sib.base = i.base_reg->reg_num;
4615 /* x86-64 ignores REX prefix bit here to avoid decoder
4616 complications. */
4617 if ((i.base_reg->reg_num & 7) == EBP_REG_NUM)
4618 {
4619 default_seg = &ss;
4620 if (i.disp_operands == 0)
4621 {
4622 fake_zero_displacement = 1;
40fb9820 4623 i.types[op].bitfield.disp8 = 1;
29b0f896
AM
4624 }
4625 }
4626 else if (i.base_reg->reg_num == ESP_REG_NUM)
4627 {
4628 default_seg = &ss;
4629 }
4630 i.sib.scale = i.log2_scale_factor;
4631 if (i.index_reg == 0)
4632 {
4633 /* <disp>(%esp) becomes two byte modrm with no index
4634 register. We've already stored the code for esp
4635 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
4636 Any base register besides %esp will not use the
4637 extra modrm byte. */
4638 i.sib.index = NO_INDEX_REGISTER;
29b0f896
AM
4639 }
4640 else
4641 {
db51cc60
L
4642 if (i.index_reg->reg_num == RegEiz
4643 || i.index_reg->reg_num == RegRiz)
4644 i.sib.index = NO_INDEX_REGISTER;
4645 else
4646 i.sib.index = i.index_reg->reg_num;
29b0f896
AM
4647 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
4648 if ((i.index_reg->reg_flags & RegRex) != 0)
161a04f6 4649 i.rex |= REX_X;
29b0f896 4650 }
67a4f2b7
AO
4651
4652 if (i.disp_operands
4653 && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
4654 || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
4655 i.rm.mode = 0;
4656 else
4657 i.rm.mode = mode_from_disp_size (i.types[op]);
29b0f896 4658 }
252b5132 4659
29b0f896
AM
4660 if (fake_zero_displacement)
4661 {
4662 /* Fakes a zero displacement assuming that i.types[op]
4663 holds the correct displacement size. */
4664 expressionS *exp;
4665
4666 assert (i.op[op].disps == 0);
4667 exp = &disp_expressions[i.disp_operands++];
4668 i.op[op].disps = exp;
4669 exp->X_op = O_constant;
4670 exp->X_add_number = 0;
4671 exp->X_add_symbol = (symbolS *) 0;
4672 exp->X_op_symbol = (symbolS *) 0;
4673 }
4674 }
252b5132 4675
29b0f896
AM
4676 /* Fill in i.rm.reg or i.rm.regmem field with register operand
4677 (if any) based on i.tm.extension_opcode. Again, we must be
4678 careful to make sure that segment/control/debug/test/MMX
4679 registers are coded into the i.rm.reg field. */
4680 if (i.reg_operands)
4681 {
99018f42
L
4682 unsigned int op;
4683
85f10a01
MM
4684 /* This has been precalculated for SSE5 instructions
4685 that have a DREX field earlier in process_drex. */
b5016f89
L
4686 if (i.tm.opcode_modifier.drex
4687 || i.tm.opcode_modifier.drexv
4688 || i.tm.opcode_modifier.drexc)
85f10a01
MM
4689 {
4690 op = i.drex.modrm_reg;
4691 i.rm.reg = i.op[op].regs->reg_num;
4692 if ((i.op[op].regs->reg_flags & RegRex) != 0)
4693 i.rex |= REX_R;
4694 }
4695 else
4696 {
c0209578
L
4697 for (op = 0; op < i.operands; op++)
4698 if (i.types[op].bitfield.reg8
4699 || i.types[op].bitfield.reg16
4700 || i.types[op].bitfield.reg32
4701 || i.types[op].bitfield.reg64
4702 || i.types[op].bitfield.regmmx
4703 || i.types[op].bitfield.regxmm
4704 || i.types[op].bitfield.sreg2
4705 || i.types[op].bitfield.sreg3
4706 || i.types[op].bitfield.control
4707 || i.types[op].bitfield.debug
4708 || i.types[op].bitfield.test)
4709 break;
4710
4711 assert (op < i.operands);
99018f42 4712
85f10a01
MM
4713 /* If there is an extension opcode to put here, the
4714 register number must be put into the regmem field. */
c0209578
L
4715 if (i.tm.extension_opcode != None)
4716 {
4717 i.rm.regmem = i.op[op].regs->reg_num;
4718 if ((i.op[op].regs->reg_flags & RegRex) != 0)
4719 i.rex |= REX_B;
4720 }
4721 else
4722 {
4723 i.rm.reg = i.op[op].regs->reg_num;
4724 if ((i.op[op].regs->reg_flags & RegRex) != 0)
4725 i.rex |= REX_R;
4726 }
85f10a01 4727 }
252b5132 4728
29b0f896
AM
4729 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
4730 must set it to 3 to indicate this is a register operand
4731 in the regmem field. */
4732 if (!i.mem_operands)
4733 i.rm.mode = 3;
4734 }
252b5132 4735
29b0f896 4736 /* Fill in i.rm.reg field with extension opcode (if any). */
85f10a01
MM
4737 if (i.tm.extension_opcode != None
4738 && !(i.tm.opcode_modifier.drex
4739 || i.tm.opcode_modifier.drexv
4740 || i.tm.opcode_modifier.drexc))
29b0f896
AM
4741 i.rm.reg = i.tm.extension_opcode;
4742 }
4743 return default_seg;
4744}
252b5132 4745
29b0f896 4746static void
e3bb37b5 4747output_branch (void)
29b0f896
AM
4748{
4749 char *p;
4750 int code16;
4751 int prefix;
4752 relax_substateT subtype;
4753 symbolS *sym;
4754 offsetT off;
4755
4756 code16 = 0;
4757 if (flag_code == CODE_16BIT)
4758 code16 = CODE16;
4759
4760 prefix = 0;
4761 if (i.prefix[DATA_PREFIX] != 0)
252b5132 4762 {
29b0f896
AM
4763 prefix = 1;
4764 i.prefixes -= 1;
4765 code16 ^= CODE16;
252b5132 4766 }
29b0f896
AM
4767 /* Pentium4 branch hints. */
4768 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
4769 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 4770 {
29b0f896
AM
4771 prefix++;
4772 i.prefixes--;
4773 }
4774 if (i.prefix[REX_PREFIX] != 0)
4775 {
4776 prefix++;
4777 i.prefixes--;
2f66722d
AM
4778 }
4779
29b0f896
AM
4780 if (i.prefixes != 0 && !intel_syntax)
4781 as_warn (_("skipping prefixes on this instruction"));
4782
4783 /* It's always a symbol; End frag & setup for relax.
4784 Make sure there is enough room in this frag for the largest
4785 instruction we may generate in md_convert_frag. This is 2
4786 bytes for the opcode and room for the prefix and largest
4787 displacement. */
4788 frag_grow (prefix + 2 + 4);
4789 /* Prefix and 1 opcode byte go in fr_fix. */
4790 p = frag_more (prefix + 1);
4791 if (i.prefix[DATA_PREFIX] != 0)
4792 *p++ = DATA_PREFIX_OPCODE;
4793 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
4794 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
4795 *p++ = i.prefix[SEG_PREFIX];
4796 if (i.prefix[REX_PREFIX] != 0)
4797 *p++ = i.prefix[REX_PREFIX];
4798 *p = i.tm.base_opcode;
4799
4800 if ((unsigned char) *p == JUMP_PC_RELATIVE)
4801 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, SMALL);
40fb9820 4802 else if (cpu_arch_flags.bitfield.cpui386)
29b0f896
AM
4803 subtype = ENCODE_RELAX_STATE (COND_JUMP, SMALL);
4804 else
4805 subtype = ENCODE_RELAX_STATE (COND_JUMP86, SMALL);
4806 subtype |= code16;
3e73aa7c 4807
29b0f896
AM
4808 sym = i.op[0].disps->X_add_symbol;
4809 off = i.op[0].disps->X_add_number;
3e73aa7c 4810
29b0f896
AM
4811 if (i.op[0].disps->X_op != O_constant
4812 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 4813 {
29b0f896
AM
4814 /* Handle complex expressions. */
4815 sym = make_expr_symbol (i.op[0].disps);
4816 off = 0;
4817 }
3e73aa7c 4818
29b0f896
AM
4819 /* 1 possible extra opcode + 4 byte displacement go in var part.
4820 Pass reloc in fr_var. */
4821 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
4822}
3e73aa7c 4823
29b0f896 4824static void
e3bb37b5 4825output_jump (void)
29b0f896
AM
4826{
4827 char *p;
4828 int size;
3e02c1cc 4829 fixS *fixP;
29b0f896 4830
40fb9820 4831 if (i.tm.opcode_modifier.jumpbyte)
29b0f896
AM
4832 {
4833 /* This is a loop or jecxz type instruction. */
4834 size = 1;
4835 if (i.prefix[ADDR_PREFIX] != 0)
4836 {
4837 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
4838 i.prefixes -= 1;
4839 }
4840 /* Pentium4 branch hints. */
4841 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
4842 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
4843 {
4844 FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
4845 i.prefixes--;
3e73aa7c
JH
4846 }
4847 }
29b0f896
AM
4848 else
4849 {
4850 int code16;
3e73aa7c 4851
29b0f896
AM
4852 code16 = 0;
4853 if (flag_code == CODE_16BIT)
4854 code16 = CODE16;
3e73aa7c 4855
29b0f896
AM
4856 if (i.prefix[DATA_PREFIX] != 0)
4857 {
4858 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
4859 i.prefixes -= 1;
4860 code16 ^= CODE16;
4861 }
252b5132 4862
29b0f896
AM
4863 size = 4;
4864 if (code16)
4865 size = 2;
4866 }
9fcc94b6 4867
29b0f896
AM
4868 if (i.prefix[REX_PREFIX] != 0)
4869 {
4870 FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
4871 i.prefixes -= 1;
4872 }
252b5132 4873
29b0f896
AM
4874 if (i.prefixes != 0 && !intel_syntax)
4875 as_warn (_("skipping prefixes on this instruction"));
e0890092 4876
29b0f896
AM
4877 p = frag_more (1 + size);
4878 *p++ = i.tm.base_opcode;
e0890092 4879
3e02c1cc
AM
4880 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
4881 i.op[0].disps, 1, reloc (size, 1, 1, i.reloc[0]));
4882
4883 /* All jumps handled here are signed, but don't use a signed limit
4884 check for 32 and 16 bit jumps as we want to allow wrap around at
4885 4G and 64k respectively. */
4886 if (size == 1)
4887 fixP->fx_signed = 1;
29b0f896 4888}
e0890092 4889
29b0f896 4890static void
e3bb37b5 4891output_interseg_jump (void)
29b0f896
AM
4892{
4893 char *p;
4894 int size;
4895 int prefix;
4896 int code16;
252b5132 4897
29b0f896
AM
4898 code16 = 0;
4899 if (flag_code == CODE_16BIT)
4900 code16 = CODE16;
a217f122 4901
29b0f896
AM
4902 prefix = 0;
4903 if (i.prefix[DATA_PREFIX] != 0)
4904 {
4905 prefix = 1;
4906 i.prefixes -= 1;
4907 code16 ^= CODE16;
4908 }
4909 if (i.prefix[REX_PREFIX] != 0)
4910 {
4911 prefix++;
4912 i.prefixes -= 1;
4913 }
252b5132 4914
29b0f896
AM
4915 size = 4;
4916 if (code16)
4917 size = 2;
252b5132 4918
29b0f896
AM
4919 if (i.prefixes != 0 && !intel_syntax)
4920 as_warn (_("skipping prefixes on this instruction"));
252b5132 4921
29b0f896
AM
4922 /* 1 opcode; 2 segment; offset */
4923 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 4924
29b0f896
AM
4925 if (i.prefix[DATA_PREFIX] != 0)
4926 *p++ = DATA_PREFIX_OPCODE;
252b5132 4927
29b0f896
AM
4928 if (i.prefix[REX_PREFIX] != 0)
4929 *p++ = i.prefix[REX_PREFIX];
252b5132 4930
29b0f896
AM
4931 *p++ = i.tm.base_opcode;
4932 if (i.op[1].imms->X_op == O_constant)
4933 {
4934 offsetT n = i.op[1].imms->X_add_number;
252b5132 4935
29b0f896
AM
4936 if (size == 2
4937 && !fits_in_unsigned_word (n)
4938 && !fits_in_signed_word (n))
4939 {
4940 as_bad (_("16-bit jump out of range"));
4941 return;
4942 }
4943 md_number_to_chars (p, n, size);
4944 }
4945 else
4946 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
4947 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
4948 if (i.op[0].imms->X_op != O_constant)
4949 as_bad (_("can't handle non absolute segment in `%s'"),
4950 i.tm.name);
4951 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
4952}
a217f122 4953
29b0f896 4954static void
e3bb37b5 4955output_insn (void)
29b0f896 4956{
2bbd9c25
JJ
4957 fragS *insn_start_frag;
4958 offsetT insn_start_off;
4959
29b0f896
AM
4960 /* Tie dwarf2 debug info to the address at the start of the insn.
4961 We can't do this after the insn has been output as the current
4962 frag may have been closed off. eg. by frag_var. */
4963 dwarf2_emit_insn (0);
4964
2bbd9c25
JJ
4965 insn_start_frag = frag_now;
4966 insn_start_off = frag_now_fix ();
4967
29b0f896 4968 /* Output jumps. */
40fb9820 4969 if (i.tm.opcode_modifier.jump)
29b0f896 4970 output_branch ();
40fb9820
L
4971 else if (i.tm.opcode_modifier.jumpbyte
4972 || i.tm.opcode_modifier.jumpdword)
29b0f896 4973 output_jump ();
40fb9820 4974 else if (i.tm.opcode_modifier.jumpintersegment)
29b0f896
AM
4975 output_interseg_jump ();
4976 else
4977 {
4978 /* Output normal instructions here. */
4979 char *p;
4980 unsigned char *q;
47465058 4981 unsigned int j;
331d2d0d 4982 unsigned int prefix;
4dffcebc
L
4983
4984 switch (i.tm.opcode_length)
bc4bd9ab 4985 {
4dffcebc 4986 case 3:
331d2d0d
L
4987 if (i.tm.base_opcode & 0xff000000)
4988 {
4989 prefix = (i.tm.base_opcode >> 24) & 0xff;
4990 goto check_prefix;
4991 }
4dffcebc
L
4992 break;
4993 case 2:
4994 if ((i.tm.base_opcode & 0xff0000) != 0)
bc4bd9ab 4995 {
4dffcebc
L
4996 prefix = (i.tm.base_opcode >> 16) & 0xff;
4997 if (i.tm.cpu_flags.bitfield.cpupadlock)
4998 {
4999check_prefix:
5000 if (prefix != REPE_PREFIX_OPCODE
5001 || i.prefix[LOCKREP_PREFIX] != REPE_PREFIX_OPCODE)
5002 add_prefix (prefix);
5003 }
5004 else
bc4bd9ab
MK
5005 add_prefix (prefix);
5006 }
4dffcebc
L
5007 break;
5008 case 1:
5009 break;
5010 default:
5011 abort ();
0f10071e 5012 }
252b5132 5013
29b0f896 5014 /* The prefix bytes. */
47465058
L
5015 for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
5016 if (*q)
5017 FRAG_APPEND_1_CHAR (*q);
252b5132 5018
29b0f896 5019 /* Now the opcode; be careful about word order here! */
4dffcebc 5020 if (i.tm.opcode_length == 1)
29b0f896
AM
5021 {
5022 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
5023 }
5024 else
5025 {
4dffcebc 5026 switch (i.tm.opcode_length)
331d2d0d 5027 {
4dffcebc 5028 case 3:
331d2d0d
L
5029 p = frag_more (3);
5030 *p++ = (i.tm.base_opcode >> 16) & 0xff;
4dffcebc
L
5031 break;
5032 case 2:
5033 p = frag_more (2);
5034 break;
5035 default:
5036 abort ();
5037 break;
331d2d0d 5038 }
0f10071e 5039
29b0f896
AM
5040 /* Put out high byte first: can't use md_number_to_chars! */
5041 *p++ = (i.tm.base_opcode >> 8) & 0xff;
5042 *p = i.tm.base_opcode & 0xff;
85f10a01
MM
5043
5044 /* On SSE5, encode the OC1 bit in the DREX field if this
5045 encoding has multiple formats. */
5046 if (i.tm.opcode_modifier.drex
5047 && i.tm.opcode_modifier.drexv
5048 && DREX_OC1 (i.tm.extension_opcode))
5049 *p |= DREX_OC1_MASK;
29b0f896 5050 }
3e73aa7c 5051
29b0f896 5052 /* Now the modrm byte and sib byte (if present). */
40fb9820 5053 if (i.tm.opcode_modifier.modrm)
29b0f896 5054 {
4a3523fa
L
5055 FRAG_APPEND_1_CHAR ((i.rm.regmem << 0
5056 | i.rm.reg << 3
5057 | i.rm.mode << 6));
29b0f896
AM
5058 /* If i.rm.regmem == ESP (4)
5059 && i.rm.mode != (Register mode)
5060 && not 16 bit
5061 ==> need second modrm byte. */
5062 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
5063 && i.rm.mode != 3
40fb9820 5064 && !(i.base_reg && i.base_reg->reg_type.bitfield.reg16))
4a3523fa
L
5065 FRAG_APPEND_1_CHAR ((i.sib.base << 0
5066 | i.sib.index << 3
5067 | i.sib.scale << 6));
29b0f896 5068 }
3e73aa7c 5069
85f10a01
MM
5070 /* Write the DREX byte if needed. */
5071 if (i.tm.opcode_modifier.drex || i.tm.opcode_modifier.drexc)
5072 {
5073 p = frag_more (1);
5074 *p = (((i.drex.reg & 0xf) << 4) | (i.drex.rex & 0x7));
5075
5076 /* Encode the OC0 bit if this encoding has multiple
5077 formats. */
5078 if ((i.tm.opcode_modifier.drex
5079 || i.tm.opcode_modifier.drexv)
5080 && DREX_OC0 (i.tm.extension_opcode))
5081 *p |= DREX_OC0_MASK;
5082 }
5083
29b0f896 5084 if (i.disp_operands)
2bbd9c25 5085 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 5086
29b0f896 5087 if (i.imm_operands)
2bbd9c25 5088 output_imm (insn_start_frag, insn_start_off);
29b0f896 5089 }
252b5132 5090
29b0f896
AM
5091#ifdef DEBUG386
5092 if (flag_debug)
5093 {
7b81dfbb 5094 pi ("" /*line*/, &i);
29b0f896
AM
5095 }
5096#endif /* DEBUG386 */
5097}
252b5132 5098
e205caa7
L
5099/* Return the size of the displacement operand N. */
5100
5101static int
5102disp_size (unsigned int n)
5103{
5104 int size = 4;
40fb9820
L
5105 if (i.types[n].bitfield.disp64)
5106 size = 8;
5107 else if (i.types[n].bitfield.disp8)
5108 size = 1;
5109 else if (i.types[n].bitfield.disp16)
5110 size = 2;
e205caa7
L
5111 return size;
5112}
5113
5114/* Return the size of the immediate operand N. */
5115
5116static int
5117imm_size (unsigned int n)
5118{
5119 int size = 4;
40fb9820
L
5120 if (i.types[n].bitfield.imm64)
5121 size = 8;
5122 else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
5123 size = 1;
5124 else if (i.types[n].bitfield.imm16)
5125 size = 2;
e205caa7
L
5126 return size;
5127}
5128
29b0f896 5129static void
64e74474 5130output_disp (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
5131{
5132 char *p;
5133 unsigned int n;
252b5132 5134
29b0f896
AM
5135 for (n = 0; n < i.operands; n++)
5136 {
40fb9820 5137 if (operand_type_check (i.types[n], disp))
29b0f896
AM
5138 {
5139 if (i.op[n].disps->X_op == O_constant)
5140 {
e205caa7 5141 int size = disp_size (n);
29b0f896 5142 offsetT val;
252b5132 5143
29b0f896
AM
5144 val = offset_in_range (i.op[n].disps->X_add_number,
5145 size);
5146 p = frag_more (size);
5147 md_number_to_chars (p, val, size);
5148 }
5149 else
5150 {
f86103b7 5151 enum bfd_reloc_code_real reloc_type;
e205caa7 5152 int size = disp_size (n);
40fb9820 5153 int sign = i.types[n].bitfield.disp32s;
29b0f896
AM
5154 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
5155
e205caa7 5156 /* We can't have 8 bit displacement here. */
40fb9820 5157 assert (!i.types[n].bitfield.disp8);
e205caa7 5158
29b0f896
AM
5159 /* The PC relative address is computed relative
5160 to the instruction boundary, so in case immediate
5161 fields follows, we need to adjust the value. */
5162 if (pcrel && i.imm_operands)
5163 {
29b0f896 5164 unsigned int n1;
e205caa7 5165 int sz = 0;
252b5132 5166
29b0f896 5167 for (n1 = 0; n1 < i.operands; n1++)
40fb9820 5168 if (operand_type_check (i.types[n1], imm))
252b5132 5169 {
e205caa7
L
5170 /* Only one immediate is allowed for PC
5171 relative address. */
5172 assert (sz == 0);
5173 sz = imm_size (n1);
5174 i.op[n].disps->X_add_number -= sz;
252b5132 5175 }
29b0f896 5176 /* We should find the immediate. */
e205caa7 5177 assert (sz != 0);
29b0f896 5178 }
520dc8e8 5179
29b0f896 5180 p = frag_more (size);
2bbd9c25 5181 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 5182 if (GOT_symbol
2bbd9c25 5183 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113 5184 && (((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
5185 || reloc_type == BFD_RELOC_X86_64_32S
5186 || (reloc_type == BFD_RELOC_64
5187 && object_64bit))
d6ab8113
JB
5188 && (i.op[n].disps->X_op == O_symbol
5189 || (i.op[n].disps->X_op == O_add
5190 && ((symbol_get_value_expression
5191 (i.op[n].disps->X_op_symbol)->X_op)
5192 == O_subtract))))
5193 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25
JJ
5194 {
5195 offsetT add;
5196
5197 if (insn_start_frag == frag_now)
5198 add = (p - frag_now->fr_literal) - insn_start_off;
5199 else
5200 {
5201 fragS *fr;
5202
5203 add = insn_start_frag->fr_fix - insn_start_off;
5204 for (fr = insn_start_frag->fr_next;
5205 fr && fr != frag_now; fr = fr->fr_next)
5206 add += fr->fr_fix;
5207 add += p - frag_now->fr_literal;
5208 }
5209
4fa24527 5210 if (!object_64bit)
7b81dfbb
AJ
5211 {
5212 reloc_type = BFD_RELOC_386_GOTPC;
5213 i.op[n].imms->X_add_number += add;
5214 }
5215 else if (reloc_type == BFD_RELOC_64)
5216 reloc_type = BFD_RELOC_X86_64_GOTPC64;
d6ab8113 5217 else
7b81dfbb
AJ
5218 /* Don't do the adjustment for x86-64, as there
5219 the pcrel addressing is relative to the _next_
5220 insn, and that is taken care of in other code. */
d6ab8113 5221 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 5222 }
062cd5e7 5223 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
2bbd9c25 5224 i.op[n].disps, pcrel, reloc_type);
29b0f896
AM
5225 }
5226 }
5227 }
5228}
252b5132 5229
29b0f896 5230static void
64e74474 5231output_imm (fragS *insn_start_frag, offsetT insn_start_off)
29b0f896
AM
5232{
5233 char *p;
5234 unsigned int n;
252b5132 5235
29b0f896
AM
5236 for (n = 0; n < i.operands; n++)
5237 {
40fb9820 5238 if (operand_type_check (i.types[n], imm))
29b0f896
AM
5239 {
5240 if (i.op[n].imms->X_op == O_constant)
5241 {
e205caa7 5242 int size = imm_size (n);
29b0f896 5243 offsetT val;
b4cac588 5244
29b0f896
AM
5245 val = offset_in_range (i.op[n].imms->X_add_number,
5246 size);
5247 p = frag_more (size);
5248 md_number_to_chars (p, val, size);
5249 }
5250 else
5251 {
5252 /* Not absolute_section.
5253 Need a 32-bit fixup (don't support 8bit
5254 non-absolute imms). Try to support other
5255 sizes ... */
f86103b7 5256 enum bfd_reloc_code_real reloc_type;
e205caa7
L
5257 int size = imm_size (n);
5258 int sign;
29b0f896 5259
40fb9820 5260 if (i.types[n].bitfield.imm32s
a7d61044 5261 && (i.suffix == QWORD_MNEM_SUFFIX
40fb9820 5262 || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
29b0f896 5263 sign = 1;
e205caa7
L
5264 else
5265 sign = 0;
520dc8e8 5266
29b0f896
AM
5267 p = frag_more (size);
5268 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 5269
2bbd9c25
JJ
5270 /* This is tough to explain. We end up with this one if we
5271 * have operands that look like
5272 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
5273 * obtain the absolute address of the GOT, and it is strongly
5274 * preferable from a performance point of view to avoid using
5275 * a runtime relocation for this. The actual sequence of
5276 * instructions often look something like:
5277 *
5278 * call .L66
5279 * .L66:
5280 * popl %ebx
5281 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
5282 *
5283 * The call and pop essentially return the absolute address
5284 * of the label .L66 and store it in %ebx. The linker itself
5285 * will ultimately change the first operand of the addl so
5286 * that %ebx points to the GOT, but to keep things simple, the
5287 * .o file must have this operand set so that it generates not
5288 * the absolute address of .L66, but the absolute address of
5289 * itself. This allows the linker itself simply treat a GOTPC
5290 * relocation as asking for a pcrel offset to the GOT to be
5291 * added in, and the addend of the relocation is stored in the
5292 * operand field for the instruction itself.
5293 *
5294 * Our job here is to fix the operand so that it would add
5295 * the correct offset so that %ebx would point to itself. The
5296 * thing that is tricky is that .-.L66 will point to the
5297 * beginning of the instruction, so we need to further modify
5298 * the operand so that it will point to itself. There are
5299 * other cases where you have something like:
5300 *
5301 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
5302 *
5303 * and here no correction would be required. Internally in
5304 * the assembler we treat operands of this form as not being
5305 * pcrel since the '.' is explicitly mentioned, and I wonder
5306 * whether it would simplify matters to do it this way. Who
5307 * knows. In earlier versions of the PIC patches, the
5308 * pcrel_adjust field was used to store the correction, but
5309 * since the expression is not pcrel, I felt it would be
5310 * confusing to do it this way. */
5311
d6ab8113 5312 if ((reloc_type == BFD_RELOC_32
7b81dfbb
AJ
5313 || reloc_type == BFD_RELOC_X86_64_32S
5314 || reloc_type == BFD_RELOC_64)
29b0f896
AM
5315 && GOT_symbol
5316 && GOT_symbol == i.op[n].imms->X_add_symbol
5317 && (i.op[n].imms->X_op == O_symbol
5318 || (i.op[n].imms->X_op == O_add
5319 && ((symbol_get_value_expression
5320 (i.op[n].imms->X_op_symbol)->X_op)
5321 == O_subtract))))
5322 {
2bbd9c25
JJ
5323 offsetT add;
5324
5325 if (insn_start_frag == frag_now)
5326 add = (p - frag_now->fr_literal) - insn_start_off;
5327 else
5328 {
5329 fragS *fr;
5330
5331 add = insn_start_frag->fr_fix - insn_start_off;
5332 for (fr = insn_start_frag->fr_next;
5333 fr && fr != frag_now; fr = fr->fr_next)
5334 add += fr->fr_fix;
5335 add += p - frag_now->fr_literal;
5336 }
5337
4fa24527 5338 if (!object_64bit)
d6ab8113 5339 reloc_type = BFD_RELOC_386_GOTPC;
7b81dfbb 5340 else if (size == 4)
d6ab8113 5341 reloc_type = BFD_RELOC_X86_64_GOTPC32;
7b81dfbb
AJ
5342 else if (size == 8)
5343 reloc_type = BFD_RELOC_X86_64_GOTPC64;
2bbd9c25 5344 i.op[n].imms->X_add_number += add;
29b0f896 5345 }
29b0f896
AM
5346 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
5347 i.op[n].imms, 0, reloc_type);
5348 }
5349 }
5350 }
252b5132
RH
5351}
5352\f
d182319b
JB
5353/* x86_cons_fix_new is called via the expression parsing code when a
5354 reloc is needed. We use this hook to get the correct .got reloc. */
5355static enum bfd_reloc_code_real got_reloc = NO_RELOC;
5356static int cons_sign = -1;
5357
5358void
e3bb37b5 5359x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
64e74474 5360 expressionS *exp)
d182319b
JB
5361{
5362 enum bfd_reloc_code_real r = reloc (len, 0, cons_sign, got_reloc);
5363
5364 got_reloc = NO_RELOC;
5365
5366#ifdef TE_PE
5367 if (exp->X_op == O_secrel)
5368 {
5369 exp->X_op = O_symbol;
5370 r = BFD_RELOC_32_SECREL;
5371 }
5372#endif
5373
5374 fix_new_exp (frag, off, len, exp, 0, r);
5375}
5376
718ddfc0
JB
5377#if (!defined (OBJ_ELF) && !defined (OBJ_MAYBE_ELF)) || defined (LEX_AT)
5378# define lex_got(reloc, adjust, types) NULL
5379#else
f3c180ae
AM
5380/* Parse operands of the form
5381 <symbol>@GOTOFF+<nnn>
5382 and similar .plt or .got references.
5383
5384 If we find one, set up the correct relocation in RELOC and copy the
5385 input string, minus the `@GOTOFF' into a malloc'd buffer for
5386 parsing by the calling routine. Return this buffer, and if ADJUST
5387 is non-null set it to the length of the string we removed from the
5388 input line. Otherwise return NULL. */
5389static char *
3956db08 5390lex_got (enum bfd_reloc_code_real *reloc,
64e74474 5391 int *adjust,
40fb9820 5392 i386_operand_type *types)
f3c180ae 5393{
7b81dfbb
AJ
5394 /* Some of the relocations depend on the size of what field is to
5395 be relocated. But in our callers i386_immediate and i386_displacement
5396 we don't yet know the operand size (this will be set by insn
5397 matching). Hence we record the word32 relocation here,
5398 and adjust the reloc according to the real size in reloc(). */
f3c180ae
AM
5399 static const struct {
5400 const char *str;
4fa24527 5401 const enum bfd_reloc_code_real rel[2];
40fb9820 5402 const i386_operand_type types64;
f3c180ae 5403 } gotrel[] = {
4eed87de
AM
5404 { "PLTOFF", { 0,
5405 BFD_RELOC_X86_64_PLTOFF64 },
40fb9820 5406 OPERAND_TYPE_IMM64 },
4eed87de
AM
5407 { "PLT", { BFD_RELOC_386_PLT32,
5408 BFD_RELOC_X86_64_PLT32 },
40fb9820 5409 OPERAND_TYPE_IMM32_32S_DISP32 },
4eed87de
AM
5410 { "GOTPLT", { 0,
5411 BFD_RELOC_X86_64_GOTPLT64 },
40fb9820 5412 OPERAND_TYPE_IMM64_DISP64 },
4eed87de
AM
5413 { "GOTOFF", { BFD_RELOC_386_GOTOFF,
5414 BFD_RELOC_X86_64_GOTOFF64 },
40fb9820 5415 OPERAND_TYPE_IMM64_DISP64 },
4eed87de
AM
5416 { "GOTPCREL", { 0,
5417 BFD_RELOC_X86_64_GOTPCREL },
40fb9820 5418 OPERAND_TYPE_IMM32_32S_DISP32 },
4eed87de
AM
5419 { "TLSGD", { BFD_RELOC_386_TLS_GD,
5420 BFD_RELOC_X86_64_TLSGD },
40fb9820 5421 OPERAND_TYPE_IMM32_32S_DISP32 },
4eed87de
AM
5422 { "TLSLDM", { BFD_RELOC_386_TLS_LDM,
5423 0 },
40fb9820 5424 OPERAND_TYPE_NONE },
4eed87de
AM
5425 { "TLSLD", { 0,
5426 BFD_RELOC_X86_64_TLSLD },
40fb9820 5427 OPERAND_TYPE_IMM32_32S_DISP32 },
4eed87de
AM
5428 { "GOTTPOFF", { BFD_RELOC_386_TLS_IE_32,
5429 BFD_RELOC_X86_64_GOTTPOFF },
40fb9820 5430 OPERAND_TYPE_IMM32_32S_DISP32 },
4eed87de
AM
5431 { "TPOFF", { BFD_RELOC_386_TLS_LE_32,
5432 BFD_RELOC_X86_64_TPOFF32 },
40fb9820 5433 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
4eed87de
AM
5434 { "NTPOFF", { BFD_RELOC_386_TLS_LE,
5435 0 },
40fb9820 5436 OPERAND_TYPE_NONE },
4eed87de
AM
5437 { "DTPOFF", { BFD_RELOC_386_TLS_LDO_32,
5438 BFD_RELOC_X86_64_DTPOFF32 },
40fb9820
L
5439
5440 OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
4eed87de
AM
5441 { "GOTNTPOFF",{ BFD_RELOC_386_TLS_GOTIE,
5442 0 },
40fb9820 5443 OPERAND_TYPE_NONE },
4eed87de
AM
5444 { "INDNTPOFF",{ BFD_RELOC_386_TLS_IE,
5445 0 },
40fb9820 5446 OPERAND_TYPE_NONE },
4eed87de
AM
5447 { "GOT", { BFD_RELOC_386_GOT32,
5448 BFD_RELOC_X86_64_GOT32 },
40fb9820 5449 OPERAND_TYPE_IMM32_32S_64_DISP32 },
4eed87de
AM
5450 { "TLSDESC", { BFD_RELOC_386_TLS_GOTDESC,
5451 BFD_RELOC_X86_64_GOTPC32_TLSDESC },
40fb9820 5452 OPERAND_TYPE_IMM32_32S_DISP32 },
4eed87de
AM
5453 { "TLSCALL", { BFD_RELOC_386_TLS_DESC_CALL,
5454 BFD_RELOC_X86_64_TLSDESC_CALL },
40fb9820 5455 OPERAND_TYPE_IMM32_32S_DISP32 },
f3c180ae
AM
5456 };
5457 char *cp;
5458 unsigned int j;
5459
718ddfc0
JB
5460 if (!IS_ELF)
5461 return NULL;
5462
f3c180ae 5463 for (cp = input_line_pointer; *cp != '@'; cp++)
67c11a9b 5464 if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
f3c180ae
AM
5465 return NULL;
5466
47465058 5467 for (j = 0; j < ARRAY_SIZE (gotrel); j++)
f3c180ae
AM
5468 {
5469 int len;
5470
5471 len = strlen (gotrel[j].str);
28f81592 5472 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae 5473 {
4fa24527 5474 if (gotrel[j].rel[object_64bit] != 0)
f3c180ae 5475 {
28f81592
AM
5476 int first, second;
5477 char *tmpbuf, *past_reloc;
f3c180ae 5478
4fa24527 5479 *reloc = gotrel[j].rel[object_64bit];
28f81592
AM
5480 if (adjust)
5481 *adjust = len;
f3c180ae 5482
3956db08
JB
5483 if (types)
5484 {
5485 if (flag_code != CODE_64BIT)
40fb9820
L
5486 {
5487 types->bitfield.imm32 = 1;
5488 types->bitfield.disp32 = 1;
5489 }
3956db08
JB
5490 else
5491 *types = gotrel[j].types64;
5492 }
5493
f3c180ae
AM
5494 if (GOT_symbol == NULL)
5495 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
5496
28f81592 5497 /* The length of the first part of our input line. */
f3c180ae 5498 first = cp - input_line_pointer;
28f81592
AM
5499
5500 /* The second part goes from after the reloc token until
67c11a9b 5501 (and including) an end_of_line char or comma. */
28f81592 5502 past_reloc = cp + 1 + len;
67c11a9b
AM
5503 cp = past_reloc;
5504 while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
5505 ++cp;
5506 second = cp + 1 - past_reloc;
28f81592
AM
5507
5508 /* Allocate and copy string. The trailing NUL shouldn't
5509 be necessary, but be safe. */
5510 tmpbuf = xmalloc (first + second + 2);
f3c180ae 5511 memcpy (tmpbuf, input_line_pointer, first);
0787a12d
AM
5512 if (second != 0 && *past_reloc != ' ')
5513 /* Replace the relocation token with ' ', so that
5514 errors like foo@GOTOFF1 will be detected. */
5515 tmpbuf[first++] = ' ';
5516 memcpy (tmpbuf + first, past_reloc, second);
5517 tmpbuf[first + second] = '\0';
f3c180ae
AM
5518 return tmpbuf;
5519 }
5520
4fa24527
JB
5521 as_bad (_("@%s reloc is not supported with %d-bit output format"),
5522 gotrel[j].str, 1 << (5 + object_64bit));
f3c180ae
AM
5523 return NULL;
5524 }
5525 }
5526
5527 /* Might be a symbol version string. Don't as_bad here. */
5528 return NULL;
5529}
5530
f3c180ae 5531void
e3bb37b5 5532x86_cons (expressionS *exp, int size)
f3c180ae 5533{
4fa24527 5534 if (size == 4 || (object_64bit && size == 8))
f3c180ae
AM
5535 {
5536 /* Handle @GOTOFF and the like in an expression. */
5537 char *save;
5538 char *gotfree_input_line;
5539 int adjust;
5540
5541 save = input_line_pointer;
3956db08 5542 gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
f3c180ae
AM
5543 if (gotfree_input_line)
5544 input_line_pointer = gotfree_input_line;
5545
5546 expression (exp);
5547
5548 if (gotfree_input_line)
5549 {
5550 /* expression () has merrily parsed up to the end of line,
5551 or a comma - in the wrong buffer. Transfer how far
5552 input_line_pointer has moved to the right buffer. */
5553 input_line_pointer = (save
5554 + (input_line_pointer - gotfree_input_line)
5555 + adjust);
5556 free (gotfree_input_line);
3992d3b7
AM
5557 if (exp->X_op == O_constant
5558 || exp->X_op == O_absent
5559 || exp->X_op == O_illegal
5560 || exp->X_op == O_register
5561 || exp->X_op == O_big)
5562 {
5563 char c = *input_line_pointer;
5564 *input_line_pointer = 0;
5565 as_bad (_("missing or invalid expression `%s'"), save);
5566 *input_line_pointer = c;
5567 }
f3c180ae
AM
5568 }
5569 }
5570 else
5571 expression (exp);
5572}
5573#endif
5574
d182319b 5575static void signed_cons (int size)
6482c264 5576{
d182319b
JB
5577 if (flag_code == CODE_64BIT)
5578 cons_sign = 1;
5579 cons (size);
5580 cons_sign = -1;
6482c264
NC
5581}
5582
d182319b 5583#ifdef TE_PE
6482c264
NC
5584static void
5585pe_directive_secrel (dummy)
5586 int dummy ATTRIBUTE_UNUSED;
5587{
5588 expressionS exp;
5589
5590 do
5591 {
5592 expression (&exp);
5593 if (exp.X_op == O_symbol)
5594 exp.X_op = O_secrel;
5595
5596 emit_expr (&exp, 4);
5597 }
5598 while (*input_line_pointer++ == ',');
5599
5600 input_line_pointer--;
5601 demand_empty_rest_of_line ();
5602}
6482c264
NC
5603#endif
5604
252b5132 5605static int
70e41ade 5606i386_immediate (char *imm_start)
252b5132
RH
5607{
5608 char *save_input_line_pointer;
f3c180ae 5609 char *gotfree_input_line;
252b5132 5610 segT exp_seg = 0;
47926f60 5611 expressionS *exp;
40fb9820
L
5612 i386_operand_type types;
5613
c6fb90c8 5614 UINTS_SET (types, ~0);
252b5132
RH
5615
5616 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
5617 {
31b2323c
L
5618 as_bad (_("at most %d immediate operands are allowed"),
5619 MAX_IMMEDIATE_OPERANDS);
252b5132
RH
5620 return 0;
5621 }
5622
5623 exp = &im_expressions[i.imm_operands++];
520dc8e8 5624 i.op[this_operand].imms = exp;
252b5132
RH
5625
5626 if (is_space_char (*imm_start))
5627 ++imm_start;
5628
5629 save_input_line_pointer = input_line_pointer;
5630 input_line_pointer = imm_start;
5631
3956db08 5632 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
5633 if (gotfree_input_line)
5634 input_line_pointer = gotfree_input_line;
252b5132
RH
5635
5636 exp_seg = expression (exp);
5637
83183c0c 5638 SKIP_WHITESPACE ();
252b5132 5639 if (*input_line_pointer)
f3c180ae 5640 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
5641
5642 input_line_pointer = save_input_line_pointer;
f3c180ae
AM
5643 if (gotfree_input_line)
5644 free (gotfree_input_line);
252b5132 5645
3992d3b7
AM
5646 if (exp->X_op == O_absent
5647 || exp->X_op == O_illegal
5648 || exp->X_op == O_big
5649 || (gotfree_input_line
5650 && (exp->X_op == O_constant
5651 || exp->X_op == O_register)))
252b5132 5652 {
3992d3b7 5653 as_bad (_("missing or invalid immediate expression `%s'"),
24eab124 5654 imm_start);
3992d3b7 5655 return 0;
252b5132 5656 }
3e73aa7c 5657 else if (exp->X_op == O_constant)
252b5132 5658 {
47926f60 5659 /* Size it properly later. */
40fb9820 5660 i.types[this_operand].bitfield.imm64 = 1;
3e73aa7c 5661 /* If BFD64, sign extend val. */
4eed87de
AM
5662 if (!use_rela_relocations
5663 && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
5664 exp->X_add_number
5665 = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 5666 }
4c63da97 5667#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 5668 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 5669 && exp_seg != absolute_section
47926f60 5670 && exp_seg != text_section
24eab124
AM
5671 && exp_seg != data_section
5672 && exp_seg != bss_section
5673 && exp_seg != undefined_section
f86103b7 5674 && !bfd_is_com_section (exp_seg))
252b5132 5675 {
d0b47220 5676 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
5677 return 0;
5678 }
5679#endif
bb8f5920
L
5680 else if (!intel_syntax && exp->X_op == O_register)
5681 {
5682 as_bad (_("illegal immediate register operand %s"), imm_start);
5683 return 0;
5684 }
252b5132
RH
5685 else
5686 {
5687 /* This is an address. The size of the address will be
24eab124 5688 determined later, depending on destination register,
3e73aa7c 5689 suffix, or the default for the section. */
40fb9820
L
5690 i.types[this_operand].bitfield.imm8 = 1;
5691 i.types[this_operand].bitfield.imm16 = 1;
5692 i.types[this_operand].bitfield.imm32 = 1;
5693 i.types[this_operand].bitfield.imm32s = 1;
5694 i.types[this_operand].bitfield.imm64 = 1;
c6fb90c8
L
5695 i.types[this_operand] = operand_type_and (i.types[this_operand],
5696 types);
252b5132
RH
5697 }
5698
5699 return 1;
5700}
5701
551c1ca1 5702static char *
e3bb37b5 5703i386_scale (char *scale)
252b5132 5704{
551c1ca1
AM
5705 offsetT val;
5706 char *save = input_line_pointer;
252b5132 5707
551c1ca1
AM
5708 input_line_pointer = scale;
5709 val = get_absolute_expression ();
5710
5711 switch (val)
252b5132 5712 {
551c1ca1 5713 case 1:
252b5132
RH
5714 i.log2_scale_factor = 0;
5715 break;
551c1ca1 5716 case 2:
252b5132
RH
5717 i.log2_scale_factor = 1;
5718 break;
551c1ca1 5719 case 4:
252b5132
RH
5720 i.log2_scale_factor = 2;
5721 break;
551c1ca1 5722 case 8:
252b5132
RH
5723 i.log2_scale_factor = 3;
5724 break;
5725 default:
a724f0f4
JB
5726 {
5727 char sep = *input_line_pointer;
5728
5729 *input_line_pointer = '\0';
5730 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
5731 scale);
5732 *input_line_pointer = sep;
5733 input_line_pointer = save;
5734 return NULL;
5735 }
252b5132 5736 }
29b0f896 5737 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
5738 {
5739 as_warn (_("scale factor of %d without an index register"),
24eab124 5740 1 << i.log2_scale_factor);
252b5132 5741 i.log2_scale_factor = 0;
252b5132 5742 }
551c1ca1
AM
5743 scale = input_line_pointer;
5744 input_line_pointer = save;
5745 return scale;
252b5132
RH
5746}
5747
252b5132 5748static int
e3bb37b5 5749i386_displacement (char *disp_start, char *disp_end)
252b5132 5750{
29b0f896 5751 expressionS *exp;
252b5132
RH
5752 segT exp_seg = 0;
5753 char *save_input_line_pointer;
f3c180ae 5754 char *gotfree_input_line;
40fb9820
L
5755 int override;
5756 i386_operand_type bigdisp, types = anydisp;
3992d3b7 5757 int ret;
252b5132 5758
31b2323c
L
5759 if (i.disp_operands == MAX_MEMORY_OPERANDS)
5760 {
5761 as_bad (_("at most %d displacement operands are allowed"),
5762 MAX_MEMORY_OPERANDS);
5763 return 0;
5764 }
5765
c6fb90c8 5766 UINTS_CLEAR (bigdisp);
40fb9820
L
5767 if ((i.types[this_operand].bitfield.jumpabsolute)
5768 || (!current_templates->start->opcode_modifier.jump
5769 && !current_templates->start->opcode_modifier.jumpdword))
e05278af 5770 {
40fb9820 5771 bigdisp.bitfield.disp32 = 1;
e05278af 5772 override = (i.prefix[ADDR_PREFIX] != 0);
40fb9820
L
5773 if (flag_code == CODE_64BIT)
5774 {
5775 if (!override)
5776 {
5777 bigdisp.bitfield.disp32s = 1;
5778 bigdisp.bitfield.disp64 = 1;
5779 }
5780 }
5781 else if ((flag_code == CODE_16BIT) ^ override)
5782 {
5783 bigdisp.bitfield.disp32 = 0;
5784 bigdisp.bitfield.disp16 = 1;
5785 }
e05278af
JB
5786 }
5787 else
5788 {
5789 /* For PC-relative branches, the width of the displacement
5790 is dependent upon data size, not address size. */
e05278af 5791 override = (i.prefix[DATA_PREFIX] != 0);
40fb9820
L
5792 if (flag_code == CODE_64BIT)
5793 {
5794 if (override || i.suffix == WORD_MNEM_SUFFIX)
5795 bigdisp.bitfield.disp16 = 1;
5796 else
5797 {
5798 bigdisp.bitfield.disp32 = 1;
5799 bigdisp.bitfield.disp32s = 1;
5800 }
5801 }
5802 else
e05278af
JB
5803 {
5804 if (!override)
5805 override = (i.suffix == (flag_code != CODE_16BIT
5806 ? WORD_MNEM_SUFFIX
5807 : LONG_MNEM_SUFFIX));
40fb9820
L
5808 bigdisp.bitfield.disp32 = 1;
5809 if ((flag_code == CODE_16BIT) ^ override)
5810 {
5811 bigdisp.bitfield.disp32 = 0;
5812 bigdisp.bitfield.disp16 = 1;
5813 }
e05278af 5814 }
e05278af 5815 }
c6fb90c8
L
5816 i.types[this_operand] = operand_type_or (i.types[this_operand],
5817 bigdisp);
252b5132
RH
5818
5819 exp = &disp_expressions[i.disp_operands];
520dc8e8 5820 i.op[this_operand].disps = exp;
252b5132
RH
5821 i.disp_operands++;
5822 save_input_line_pointer = input_line_pointer;
5823 input_line_pointer = disp_start;
5824 END_STRING_AND_SAVE (disp_end);
5825
5826#ifndef GCC_ASM_O_HACK
5827#define GCC_ASM_O_HACK 0
5828#endif
5829#if GCC_ASM_O_HACK
5830 END_STRING_AND_SAVE (disp_end + 1);
40fb9820 5831 if (i.types[this_operand].bitfield.baseIndex
24eab124 5832 && displacement_string_end[-1] == '+')
252b5132
RH
5833 {
5834 /* This hack is to avoid a warning when using the "o"
24eab124
AM
5835 constraint within gcc asm statements.
5836 For instance:
5837
5838 #define _set_tssldt_desc(n,addr,limit,type) \
5839 __asm__ __volatile__ ( \
5840 "movw %w2,%0\n\t" \
5841 "movw %w1,2+%0\n\t" \
5842 "rorl $16,%1\n\t" \
5843 "movb %b1,4+%0\n\t" \
5844 "movb %4,5+%0\n\t" \
5845 "movb $0,6+%0\n\t" \
5846 "movb %h1,7+%0\n\t" \
5847 "rorl $16,%1" \
5848 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
5849
5850 This works great except that the output assembler ends
5851 up looking a bit weird if it turns out that there is
5852 no offset. You end up producing code that looks like:
5853
5854 #APP
5855 movw $235,(%eax)
5856 movw %dx,2+(%eax)
5857 rorl $16,%edx
5858 movb %dl,4+(%eax)
5859 movb $137,5+(%eax)
5860 movb $0,6+(%eax)
5861 movb %dh,7+(%eax)
5862 rorl $16,%edx
5863 #NO_APP
5864
47926f60 5865 So here we provide the missing zero. */
24eab124
AM
5866
5867 *displacement_string_end = '0';
252b5132
RH
5868 }
5869#endif
3956db08 5870 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
f3c180ae
AM
5871 if (gotfree_input_line)
5872 input_line_pointer = gotfree_input_line;
252b5132 5873
24eab124 5874 exp_seg = expression (exp);
252b5132 5875
636c26b0
AM
5876 SKIP_WHITESPACE ();
5877 if (*input_line_pointer)
5878 as_bad (_("junk `%s' after expression"), input_line_pointer);
5879#if GCC_ASM_O_HACK
5880 RESTORE_END_STRING (disp_end + 1);
5881#endif
636c26b0 5882 input_line_pointer = save_input_line_pointer;
636c26b0
AM
5883 if (gotfree_input_line)
5884 free (gotfree_input_line);
3992d3b7 5885 ret = 1;
636c26b0 5886
24eab124
AM
5887 /* We do this to make sure that the section symbol is in
5888 the symbol table. We will ultimately change the relocation
47926f60 5889 to be relative to the beginning of the section. */
1ae12ab7 5890 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
5891 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
5892 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 5893 {
636c26b0 5894 if (exp->X_op != O_symbol)
3992d3b7 5895 goto inv_disp;
636c26b0 5896
e5cb08ac 5897 if (S_IS_LOCAL (exp->X_add_symbol)
24eab124
AM
5898 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section)
5899 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
5900 exp->X_op = O_subtract;
5901 exp->X_op_symbol = GOT_symbol;
1ae12ab7 5902 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 5903 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
5904 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
5905 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 5906 else
29b0f896 5907 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 5908 }
252b5132 5909
3992d3b7
AM
5910 else if (exp->X_op == O_absent
5911 || exp->X_op == O_illegal
5912 || exp->X_op == O_big
5913 || (gotfree_input_line
5914 && (exp->X_op == O_constant
5915 || exp->X_op == O_register)))
2daf4fd8 5916 {
3992d3b7
AM
5917 inv_disp:
5918 as_bad (_("missing or invalid displacement expression `%s'"),
2daf4fd8 5919 disp_start);
3992d3b7 5920 ret = 0;
2daf4fd8
AM
5921 }
5922
4c63da97 5923#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3992d3b7
AM
5924 else if (exp->X_op != O_constant
5925 && OUTPUT_FLAVOR == bfd_target_aout_flavour
5926 && exp_seg != absolute_section
5927 && exp_seg != text_section
5928 && exp_seg != data_section
5929 && exp_seg != bss_section
5930 && exp_seg != undefined_section
5931 && !bfd_is_com_section (exp_seg))
24eab124 5932 {
d0b47220 5933 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
3992d3b7 5934 ret = 0;
24eab124 5935 }
252b5132 5936#endif
3956db08 5937
3992d3b7
AM
5938 RESTORE_END_STRING (disp_end);
5939
40fb9820
L
5940 /* Check if this is a displacement only operand. */
5941 bigdisp = i.types[this_operand];
5942 bigdisp.bitfield.disp8 = 0;
5943 bigdisp.bitfield.disp16 = 0;
5944 bigdisp.bitfield.disp32 = 0;
5945 bigdisp.bitfield.disp32s = 0;
5946 bigdisp.bitfield.disp64 = 0;
c6fb90c8
L
5947 if (UINTS_ALL_ZERO (bigdisp))
5948 i.types[this_operand] = operand_type_and (i.types[this_operand],
5949 types);
3956db08 5950
3992d3b7 5951 return ret;
252b5132
RH
5952}
5953
eecb386c 5954/* Make sure the memory operand we've been dealt is valid.
47926f60
KH
5955 Return 1 on success, 0 on a failure. */
5956
252b5132 5957static int
e3bb37b5 5958i386_index_check (const char *operand_string)
252b5132 5959{
3e73aa7c 5960 int ok;
24eab124 5961#if INFER_ADDR_PREFIX
eecb386c
AM
5962 int fudged = 0;
5963
24eab124
AM
5964 tryprefix:
5965#endif
3e73aa7c 5966 ok = 1;
75178d9d 5967 if (flag_code == CODE_64BIT)
64e74474 5968 {
64e74474 5969 if ((i.base_reg
40fb9820
L
5970 && ((i.prefix[ADDR_PREFIX] == 0
5971 && !i.base_reg->reg_type.bitfield.reg64)
5972 || (i.prefix[ADDR_PREFIX]
5973 && !i.base_reg->reg_type.bitfield.reg32))
5974 && (i.index_reg
9a04903e
JB
5975 || i.base_reg->reg_num !=
5976 (i.prefix[ADDR_PREFIX] == 0 ? RegRip : RegEip)))
64e74474 5977 || (i.index_reg
40fb9820
L
5978 && (!i.index_reg->reg_type.bitfield.baseindex
5979 || (i.prefix[ADDR_PREFIX] == 0
db51cc60
L
5980 && i.index_reg->reg_num != RegRiz
5981 && !i.index_reg->reg_type.bitfield.reg64
5982 )
40fb9820 5983 || (i.prefix[ADDR_PREFIX]
db51cc60 5984 && i.index_reg->reg_num != RegEiz
40fb9820 5985 && !i.index_reg->reg_type.bitfield.reg32))))
64e74474 5986 ok = 0;
3e73aa7c
JH
5987 }
5988 else
5989 {
5990 if ((flag_code == CODE_16BIT) ^ (i.prefix[ADDR_PREFIX] != 0))
5991 {
5992 /* 16bit checks. */
5993 if ((i.base_reg
40fb9820
L
5994 && (!i.base_reg->reg_type.bitfield.reg16
5995 || !i.base_reg->reg_type.bitfield.baseindex))
3e73aa7c 5996 || (i.index_reg
40fb9820
L
5997 && (!i.index_reg->reg_type.bitfield.reg16
5998 || !i.index_reg->reg_type.bitfield.baseindex
29b0f896
AM
5999 || !(i.base_reg
6000 && i.base_reg->reg_num < 6
6001 && i.index_reg->reg_num >= 6
6002 && i.log2_scale_factor == 0))))
3e73aa7c
JH
6003 ok = 0;
6004 }
6005 else
e5cb08ac 6006 {
3e73aa7c
JH
6007 /* 32bit checks. */
6008 if ((i.base_reg
40fb9820 6009 && !i.base_reg->reg_type.bitfield.reg32)
3e73aa7c 6010 || (i.index_reg
db51cc60
L
6011 && ((!i.index_reg->reg_type.bitfield.reg32
6012 && i.index_reg->reg_num != RegEiz)
40fb9820 6013 || !i.index_reg->reg_type.bitfield.baseindex)))
e5cb08ac 6014 ok = 0;
3e73aa7c
JH
6015 }
6016 }
6017 if (!ok)
24eab124
AM
6018 {
6019#if INFER_ADDR_PREFIX
20f0a1fc 6020 if (i.prefix[ADDR_PREFIX] == 0)
24eab124
AM
6021 {
6022 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
6023 i.prefixes += 1;
b23bac36
AM
6024 /* Change the size of any displacement too. At most one of
6025 Disp16 or Disp32 is set.
6026 FIXME. There doesn't seem to be any real need for separate
6027 Disp16 and Disp32 flags. The same goes for Imm16 and Imm32.
47926f60 6028 Removing them would probably clean up the code quite a lot. */
4eed87de 6029 if (flag_code != CODE_64BIT
40fb9820
L
6030 && (i.types[this_operand].bitfield.disp16
6031 || i.types[this_operand].bitfield.disp32))
6032 i.types[this_operand]
c6fb90c8 6033 = operand_type_xor (i.types[this_operand], disp16_32);
eecb386c 6034 fudged = 1;
24eab124
AM
6035 goto tryprefix;
6036 }
eecb386c
AM
6037 if (fudged)
6038 as_bad (_("`%s' is not a valid base/index expression"),
6039 operand_string);
6040 else
c388dee8 6041#endif
eecb386c
AM
6042 as_bad (_("`%s' is not a valid %s bit base/index expression"),
6043 operand_string,
3e73aa7c 6044 flag_code_names[flag_code]);
24eab124 6045 }
20f0a1fc 6046 return ok;
24eab124 6047}
252b5132 6048
252b5132 6049/* Parse OPERAND_STRING into the i386_insn structure I. Returns non-zero
47926f60 6050 on error. */
252b5132 6051
252b5132 6052static int
a7619375 6053i386_att_operand (char *operand_string)
252b5132 6054{
af6bdddf
AM
6055 const reg_entry *r;
6056 char *end_op;
24eab124 6057 char *op_string = operand_string;
252b5132 6058
24eab124 6059 if (is_space_char (*op_string))
252b5132
RH
6060 ++op_string;
6061
24eab124 6062 /* We check for an absolute prefix (differentiating,
47926f60 6063 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
6064 if (*op_string == ABSOLUTE_PREFIX)
6065 {
6066 ++op_string;
6067 if (is_space_char (*op_string))
6068 ++op_string;
40fb9820 6069 i.types[this_operand].bitfield.jumpabsolute = 1;
24eab124 6070 }
252b5132 6071
47926f60 6072 /* Check if operand is a register. */
4d1bb795 6073 if ((r = parse_register (op_string, &end_op)) != NULL)
24eab124 6074 {
40fb9820
L
6075 i386_operand_type temp;
6076
24eab124
AM
6077 /* Check for a segment override by searching for ':' after a
6078 segment register. */
6079 op_string = end_op;
6080 if (is_space_char (*op_string))
6081 ++op_string;
40fb9820
L
6082 if (*op_string == ':'
6083 && (r->reg_type.bitfield.sreg2
6084 || r->reg_type.bitfield.sreg3))
24eab124
AM
6085 {
6086 switch (r->reg_num)
6087 {
6088 case 0:
6089 i.seg[i.mem_operands] = &es;
6090 break;
6091 case 1:
6092 i.seg[i.mem_operands] = &cs;
6093 break;
6094 case 2:
6095 i.seg[i.mem_operands] = &ss;
6096 break;
6097 case 3:
6098 i.seg[i.mem_operands] = &ds;
6099 break;
6100 case 4:
6101 i.seg[i.mem_operands] = &fs;
6102 break;
6103 case 5:
6104 i.seg[i.mem_operands] = &gs;
6105 break;
6106 }
252b5132 6107
24eab124 6108 /* Skip the ':' and whitespace. */
252b5132
RH
6109 ++op_string;
6110 if (is_space_char (*op_string))
24eab124 6111 ++op_string;
252b5132 6112
24eab124
AM
6113 if (!is_digit_char (*op_string)
6114 && !is_identifier_char (*op_string)
6115 && *op_string != '('
6116 && *op_string != ABSOLUTE_PREFIX)
6117 {
6118 as_bad (_("bad memory operand `%s'"), op_string);
6119 return 0;
6120 }
47926f60 6121 /* Handle case of %es:*foo. */
24eab124
AM
6122 if (*op_string == ABSOLUTE_PREFIX)
6123 {
6124 ++op_string;
6125 if (is_space_char (*op_string))
6126 ++op_string;
40fb9820 6127 i.types[this_operand].bitfield.jumpabsolute = 1;
24eab124
AM
6128 }
6129 goto do_memory_reference;
6130 }
6131 if (*op_string)
6132 {
d0b47220 6133 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
6134 return 0;
6135 }
40fb9820
L
6136 temp = r->reg_type;
6137 temp.bitfield.baseindex = 0;
c6fb90c8
L
6138 i.types[this_operand] = operand_type_or (i.types[this_operand],
6139 temp);
520dc8e8 6140 i.op[this_operand].regs = r;
24eab124
AM
6141 i.reg_operands++;
6142 }
af6bdddf
AM
6143 else if (*op_string == REGISTER_PREFIX)
6144 {
6145 as_bad (_("bad register name `%s'"), op_string);
6146 return 0;
6147 }
24eab124 6148 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 6149 {
24eab124 6150 ++op_string;
40fb9820 6151 if (i.types[this_operand].bitfield.jumpabsolute)
24eab124 6152 {
d0b47220 6153 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
6154 return 0;
6155 }
6156 if (!i386_immediate (op_string))
6157 return 0;
6158 }
6159 else if (is_digit_char (*op_string)
6160 || is_identifier_char (*op_string)
e5cb08ac 6161 || *op_string == '(')
24eab124 6162 {
47926f60 6163 /* This is a memory reference of some sort. */
af6bdddf 6164 char *base_string;
252b5132 6165
47926f60 6166 /* Start and end of displacement string expression (if found). */
eecb386c
AM
6167 char *displacement_string_start;
6168 char *displacement_string_end;
252b5132 6169
24eab124 6170 do_memory_reference:
24eab124 6171 if ((i.mem_operands == 1
40fb9820 6172 && !current_templates->start->opcode_modifier.isstring)
24eab124
AM
6173 || i.mem_operands == 2)
6174 {
6175 as_bad (_("too many memory references for `%s'"),
6176 current_templates->start->name);
6177 return 0;
6178 }
252b5132 6179
24eab124
AM
6180 /* Check for base index form. We detect the base index form by
6181 looking for an ')' at the end of the operand, searching
6182 for the '(' matching it, and finding a REGISTER_PREFIX or ','
6183 after the '('. */
af6bdddf 6184 base_string = op_string + strlen (op_string);
c3332e24 6185
af6bdddf
AM
6186 --base_string;
6187 if (is_space_char (*base_string))
6188 --base_string;
252b5132 6189
47926f60 6190 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
6191 displacement_string_start = op_string;
6192 displacement_string_end = base_string + 1;
252b5132 6193
24eab124
AM
6194 if (*base_string == ')')
6195 {
af6bdddf 6196 char *temp_string;
24eab124
AM
6197 unsigned int parens_balanced = 1;
6198 /* We've already checked that the number of left & right ()'s are
47926f60 6199 equal, so this loop will not be infinite. */
24eab124
AM
6200 do
6201 {
6202 base_string--;
6203 if (*base_string == ')')
6204 parens_balanced++;
6205 if (*base_string == '(')
6206 parens_balanced--;
6207 }
6208 while (parens_balanced);
c3332e24 6209
af6bdddf 6210 temp_string = base_string;
c3332e24 6211
24eab124 6212 /* Skip past '(' and whitespace. */
252b5132
RH
6213 ++base_string;
6214 if (is_space_char (*base_string))
24eab124 6215 ++base_string;
252b5132 6216
af6bdddf 6217 if (*base_string == ','
4eed87de
AM
6218 || ((i.base_reg = parse_register (base_string, &end_op))
6219 != NULL))
252b5132 6220 {
af6bdddf 6221 displacement_string_end = temp_string;
252b5132 6222
40fb9820 6223 i.types[this_operand].bitfield.baseindex = 1;
252b5132 6224
af6bdddf 6225 if (i.base_reg)
24eab124 6226 {
24eab124
AM
6227 base_string = end_op;
6228 if (is_space_char (*base_string))
6229 ++base_string;
af6bdddf
AM
6230 }
6231
6232 /* There may be an index reg or scale factor here. */
6233 if (*base_string == ',')
6234 {
6235 ++base_string;
6236 if (is_space_char (*base_string))
6237 ++base_string;
6238
4eed87de
AM
6239 if ((i.index_reg = parse_register (base_string, &end_op))
6240 != NULL)
24eab124 6241 {
af6bdddf 6242 base_string = end_op;
24eab124
AM
6243 if (is_space_char (*base_string))
6244 ++base_string;
af6bdddf
AM
6245 if (*base_string == ',')
6246 {
6247 ++base_string;
6248 if (is_space_char (*base_string))
6249 ++base_string;
6250 }
e5cb08ac 6251 else if (*base_string != ')')
af6bdddf 6252 {
4eed87de
AM
6253 as_bad (_("expecting `,' or `)' "
6254 "after index register in `%s'"),
af6bdddf
AM
6255 operand_string);
6256 return 0;
6257 }
24eab124 6258 }
af6bdddf 6259 else if (*base_string == REGISTER_PREFIX)
24eab124 6260 {
af6bdddf 6261 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
6262 return 0;
6263 }
252b5132 6264
47926f60 6265 /* Check for scale factor. */
551c1ca1 6266 if (*base_string != ')')
af6bdddf 6267 {
551c1ca1
AM
6268 char *end_scale = i386_scale (base_string);
6269
6270 if (!end_scale)
af6bdddf 6271 return 0;
24eab124 6272
551c1ca1 6273 base_string = end_scale;
af6bdddf
AM
6274 if (is_space_char (*base_string))
6275 ++base_string;
6276 if (*base_string != ')')
6277 {
4eed87de
AM
6278 as_bad (_("expecting `)' "
6279 "after scale factor in `%s'"),
af6bdddf
AM
6280 operand_string);
6281 return 0;
6282 }
6283 }
6284 else if (!i.index_reg)
24eab124 6285 {
4eed87de
AM
6286 as_bad (_("expecting index register or scale factor "
6287 "after `,'; got '%c'"),
af6bdddf 6288 *base_string);
24eab124
AM
6289 return 0;
6290 }
6291 }
af6bdddf 6292 else if (*base_string != ')')
24eab124 6293 {
4eed87de
AM
6294 as_bad (_("expecting `,' or `)' "
6295 "after base register in `%s'"),
af6bdddf 6296 operand_string);
24eab124
AM
6297 return 0;
6298 }
c3332e24 6299 }
af6bdddf 6300 else if (*base_string == REGISTER_PREFIX)
c3332e24 6301 {
af6bdddf 6302 as_bad (_("bad register name `%s'"), base_string);
24eab124 6303 return 0;
c3332e24 6304 }
24eab124
AM
6305 }
6306
6307 /* If there's an expression beginning the operand, parse it,
6308 assuming displacement_string_start and
6309 displacement_string_end are meaningful. */
6310 if (displacement_string_start != displacement_string_end)
6311 {
6312 if (!i386_displacement (displacement_string_start,
6313 displacement_string_end))
6314 return 0;
6315 }
6316
6317 /* Special case for (%dx) while doing input/output op. */
6318 if (i.base_reg
c6fb90c8 6319 && UINTS_EQUAL (i.base_reg->reg_type, reg16_inoutportreg)
24eab124
AM
6320 && i.index_reg == 0
6321 && i.log2_scale_factor == 0
6322 && i.seg[i.mem_operands] == 0
40fb9820 6323 && !operand_type_check (i.types[this_operand], disp))
24eab124 6324 {
c6fb90c8 6325 UINTS_CLEAR (i.types[this_operand]);
40fb9820 6326 i.types[this_operand].bitfield.inoutportreg = 1;
24eab124
AM
6327 return 1;
6328 }
6329
eecb386c
AM
6330 if (i386_index_check (operand_string) == 0)
6331 return 0;
24eab124
AM
6332 i.mem_operands++;
6333 }
6334 else
ce8a8b2f
AM
6335 {
6336 /* It's not a memory operand; argh! */
24eab124
AM
6337 as_bad (_("invalid char %s beginning operand %d `%s'"),
6338 output_invalid (*op_string),
6339 this_operand + 1,
6340 op_string);
6341 return 0;
6342 }
47926f60 6343 return 1; /* Normal return. */
252b5132
RH
6344}
6345\f
ee7fcc42
AM
6346/* md_estimate_size_before_relax()
6347
6348 Called just before relax() for rs_machine_dependent frags. The x86
6349 assembler uses these frags to handle variable size jump
6350 instructions.
6351
6352 Any symbol that is now undefined will not become defined.
6353 Return the correct fr_subtype in the frag.
6354 Return the initial "guess for variable size of frag" to caller.
6355 The guess is actually the growth beyond the fixed part. Whatever
6356 we do to grow the fixed or variable part contributes to our
6357 returned value. */
6358
252b5132
RH
6359int
6360md_estimate_size_before_relax (fragP, segment)
29b0f896
AM
6361 fragS *fragP;
6362 segT segment;
252b5132 6363{
252b5132 6364 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
6365 check for un-relaxable symbols. On an ELF system, we can't relax
6366 an externally visible symbol, because it may be overridden by a
6367 shared library. */
6368 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 6369#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 6370 || (IS_ELF
31312f95
AM
6371 && (S_IS_EXTERNAL (fragP->fr_symbol)
6372 || S_IS_WEAK (fragP->fr_symbol)))
b98ef147
AM
6373#endif
6374 )
252b5132 6375 {
b98ef147
AM
6376 /* Symbol is undefined in this segment, or we need to keep a
6377 reloc so that weak symbols can be overridden. */
6378 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 6379 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
6380 unsigned char *opcode;
6381 int old_fr_fix;
f6af82bd 6382
ee7fcc42
AM
6383 if (fragP->fr_var != NO_RELOC)
6384 reloc_type = fragP->fr_var;
b98ef147 6385 else if (size == 2)
f6af82bd
AM
6386 reloc_type = BFD_RELOC_16_PCREL;
6387 else
6388 reloc_type = BFD_RELOC_32_PCREL;
252b5132 6389
ee7fcc42
AM
6390 old_fr_fix = fragP->fr_fix;
6391 opcode = (unsigned char *) fragP->fr_opcode;
6392
fddf5b5b 6393 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 6394 {
fddf5b5b
AM
6395 case UNCOND_JUMP:
6396 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 6397 opcode[0] = 0xe9;
252b5132 6398 fragP->fr_fix += size;
062cd5e7
AS
6399 fix_new (fragP, old_fr_fix, size,
6400 fragP->fr_symbol,
6401 fragP->fr_offset, 1,
6402 reloc_type);
252b5132
RH
6403 break;
6404
fddf5b5b 6405 case COND_JUMP86:
412167cb
AM
6406 if (size == 2
6407 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
6408 {
6409 /* Negate the condition, and branch past an
6410 unconditional jump. */
6411 opcode[0] ^= 1;
6412 opcode[1] = 3;
6413 /* Insert an unconditional jump. */
6414 opcode[2] = 0xe9;
6415 /* We added two extra opcode bytes, and have a two byte
6416 offset. */
6417 fragP->fr_fix += 2 + 2;
062cd5e7
AS
6418 fix_new (fragP, old_fr_fix + 2, 2,
6419 fragP->fr_symbol,
6420 fragP->fr_offset, 1,
6421 reloc_type);
fddf5b5b
AM
6422 break;
6423 }
6424 /* Fall through. */
6425
6426 case COND_JUMP:
412167cb
AM
6427 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
6428 {
3e02c1cc
AM
6429 fixS *fixP;
6430
412167cb 6431 fragP->fr_fix += 1;
3e02c1cc
AM
6432 fixP = fix_new (fragP, old_fr_fix, 1,
6433 fragP->fr_symbol,
6434 fragP->fr_offset, 1,
6435 BFD_RELOC_8_PCREL);
6436 fixP->fx_signed = 1;
412167cb
AM
6437 break;
6438 }
93c2a809 6439
24eab124 6440 /* This changes the byte-displacement jump 0x7N
fddf5b5b 6441 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 6442 opcode[1] = opcode[0] + 0x10;
f6af82bd 6443 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
6444 /* We've added an opcode byte. */
6445 fragP->fr_fix += 1 + size;
062cd5e7
AS
6446 fix_new (fragP, old_fr_fix + 1, size,
6447 fragP->fr_symbol,
6448 fragP->fr_offset, 1,
6449 reloc_type);
252b5132 6450 break;
fddf5b5b
AM
6451
6452 default:
6453 BAD_CASE (fragP->fr_subtype);
6454 break;
252b5132
RH
6455 }
6456 frag_wane (fragP);
ee7fcc42 6457 return fragP->fr_fix - old_fr_fix;
252b5132 6458 }
93c2a809 6459
93c2a809
AM
6460 /* Guess size depending on current relax state. Initially the relax
6461 state will correspond to a short jump and we return 1, because
6462 the variable part of the frag (the branch offset) is one byte
6463 long. However, we can relax a section more than once and in that
6464 case we must either set fr_subtype back to the unrelaxed state,
6465 or return the value for the appropriate branch. */
6466 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
6467}
6468
47926f60
KH
6469/* Called after relax() is finished.
6470
6471 In: Address of frag.
6472 fr_type == rs_machine_dependent.
6473 fr_subtype is what the address relaxed to.
6474
6475 Out: Any fixSs and constants are set up.
6476 Caller will turn frag into a ".space 0". */
6477
252b5132
RH
6478void
6479md_convert_frag (abfd, sec, fragP)
ab9da554
ILT
6480 bfd *abfd ATTRIBUTE_UNUSED;
6481 segT sec ATTRIBUTE_UNUSED;
29b0f896 6482 fragS *fragP;
252b5132 6483{
29b0f896 6484 unsigned char *opcode;
252b5132 6485 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
6486 offsetT target_address;
6487 offsetT opcode_address;
252b5132 6488 unsigned int extension = 0;
847f7ad4 6489 offsetT displacement_from_opcode_start;
252b5132
RH
6490
6491 opcode = (unsigned char *) fragP->fr_opcode;
6492
47926f60 6493 /* Address we want to reach in file space. */
252b5132 6494 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 6495
47926f60 6496 /* Address opcode resides at in file space. */
252b5132
RH
6497 opcode_address = fragP->fr_address + fragP->fr_fix;
6498
47926f60 6499 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
6500 displacement_from_opcode_start = target_address - opcode_address;
6501
fddf5b5b 6502 if ((fragP->fr_subtype & BIG) == 0)
252b5132 6503 {
47926f60
KH
6504 /* Don't have to change opcode. */
6505 extension = 1; /* 1 opcode + 1 displacement */
252b5132 6506 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
6507 }
6508 else
6509 {
6510 if (no_cond_jump_promotion
6511 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4eed87de
AM
6512 as_warn_where (fragP->fr_file, fragP->fr_line,
6513 _("long jump required"));
252b5132 6514
fddf5b5b
AM
6515 switch (fragP->fr_subtype)
6516 {
6517 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
6518 extension = 4; /* 1 opcode + 4 displacement */
6519 opcode[0] = 0xe9;
6520 where_to_put_displacement = &opcode[1];
6521 break;
252b5132 6522
fddf5b5b
AM
6523 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
6524 extension = 2; /* 1 opcode + 2 displacement */
6525 opcode[0] = 0xe9;
6526 where_to_put_displacement = &opcode[1];
6527 break;
252b5132 6528
fddf5b5b
AM
6529 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
6530 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
6531 extension = 5; /* 2 opcode + 4 displacement */
6532 opcode[1] = opcode[0] + 0x10;
6533 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
6534 where_to_put_displacement = &opcode[2];
6535 break;
252b5132 6536
fddf5b5b
AM
6537 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
6538 extension = 3; /* 2 opcode + 2 displacement */
6539 opcode[1] = opcode[0] + 0x10;
6540 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
6541 where_to_put_displacement = &opcode[2];
6542 break;
252b5132 6543
fddf5b5b
AM
6544 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
6545 extension = 4;
6546 opcode[0] ^= 1;
6547 opcode[1] = 3;
6548 opcode[2] = 0xe9;
6549 where_to_put_displacement = &opcode[3];
6550 break;
6551
6552 default:
6553 BAD_CASE (fragP->fr_subtype);
6554 break;
6555 }
252b5132 6556 }
fddf5b5b 6557
7b81dfbb
AJ
6558 /* If size if less then four we are sure that the operand fits,
6559 but if it's 4, then it could be that the displacement is larger
6560 then -/+ 2GB. */
6561 if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
6562 && object_64bit
6563 && ((addressT) (displacement_from_opcode_start - extension
4eed87de
AM
6564 + ((addressT) 1 << 31))
6565 > (((addressT) 2 << 31) - 1)))
7b81dfbb
AJ
6566 {
6567 as_bad_where (fragP->fr_file, fragP->fr_line,
6568 _("jump target out of range"));
6569 /* Make us emit 0. */
6570 displacement_from_opcode_start = extension;
6571 }
47926f60 6572 /* Now put displacement after opcode. */
252b5132
RH
6573 md_number_to_chars ((char *) where_to_put_displacement,
6574 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 6575 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
6576 fragP->fr_fix += extension;
6577}
6578\f
252b5132
RH
6579/* Apply a fixup (fixS) to segment data, once it has been determined
6580 by our caller that we have all the info we need to fix it up.
6581
6582 On the 386, immediates, displacements, and data pointers are all in
6583 the same (little-endian) format, so we don't need to care about which
6584 we are handling. */
6585
94f592af 6586void
55cf6793 6587md_apply_fix (fixP, valP, seg)
47926f60
KH
6588 /* The fix we're to put in. */
6589 fixS *fixP;
47926f60 6590 /* Pointer to the value of the bits. */
c6682705 6591 valueT *valP;
47926f60
KH
6592 /* Segment fix is from. */
6593 segT seg ATTRIBUTE_UNUSED;
252b5132 6594{
94f592af 6595 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 6596 valueT value = *valP;
252b5132 6597
f86103b7 6598#if !defined (TE_Mach)
93382f6d
AM
6599 if (fixP->fx_pcrel)
6600 {
6601 switch (fixP->fx_r_type)
6602 {
5865bb77
ILT
6603 default:
6604 break;
6605
d6ab8113
JB
6606 case BFD_RELOC_64:
6607 fixP->fx_r_type = BFD_RELOC_64_PCREL;
6608 break;
93382f6d 6609 case BFD_RELOC_32:
ae8887b5 6610 case BFD_RELOC_X86_64_32S:
93382f6d
AM
6611 fixP->fx_r_type = BFD_RELOC_32_PCREL;
6612 break;
6613 case BFD_RELOC_16:
6614 fixP->fx_r_type = BFD_RELOC_16_PCREL;
6615 break;
6616 case BFD_RELOC_8:
6617 fixP->fx_r_type = BFD_RELOC_8_PCREL;
6618 break;
6619 }
6620 }
252b5132 6621
a161fe53 6622 if (fixP->fx_addsy != NULL
31312f95 6623 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 6624 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95
AM
6625 || fixP->fx_r_type == BFD_RELOC_16_PCREL
6626 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
6627 && !use_rela_relocations)
252b5132 6628 {
31312f95
AM
6629 /* This is a hack. There should be a better way to handle this.
6630 This covers for the fact that bfd_install_relocation will
6631 subtract the current location (for partial_inplace, PC relative
6632 relocations); see more below. */
252b5132 6633#ifndef OBJ_AOUT
718ddfc0 6634 if (IS_ELF
252b5132
RH
6635#ifdef TE_PE
6636 || OUTPUT_FLAVOR == bfd_target_coff_flavour
6637#endif
6638 )
6639 value += fixP->fx_where + fixP->fx_frag->fr_address;
6640#endif
6641#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 6642 if (IS_ELF)
252b5132 6643 {
6539b54b 6644 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 6645
6539b54b 6646 if ((sym_seg == seg
2f66722d 6647 || (symbol_section_p (fixP->fx_addsy)
6539b54b 6648 && sym_seg != absolute_section))
ae6063d4 6649 && !generic_force_reloc (fixP))
2f66722d
AM
6650 {
6651 /* Yes, we add the values in twice. This is because
6539b54b
AM
6652 bfd_install_relocation subtracts them out again. I think
6653 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
6654 it. FIXME. */
6655 value += fixP->fx_where + fixP->fx_frag->fr_address;
6656 }
252b5132
RH
6657 }
6658#endif
6659#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
6660 /* For some reason, the PE format does not store a
6661 section address offset for a PC relative symbol. */
6662 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
7be1c489 6663 || S_IS_WEAK (fixP->fx_addsy))
252b5132
RH
6664 value += md_pcrel_from (fixP);
6665#endif
6666 }
6667
6668 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 6669 and we must not disappoint it. */
252b5132 6670#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
718ddfc0 6671 if (IS_ELF && fixP->fx_addsy)
47926f60
KH
6672 switch (fixP->fx_r_type)
6673 {
6674 case BFD_RELOC_386_PLT32:
3e73aa7c 6675 case BFD_RELOC_X86_64_PLT32:
47926f60
KH
6676 /* Make the jump instruction point to the address of the operand. At
6677 runtime we merely add the offset to the actual PLT entry. */
6678 value = -4;
6679 break;
31312f95 6680
13ae64f3
JJ
6681 case BFD_RELOC_386_TLS_GD:
6682 case BFD_RELOC_386_TLS_LDM:
13ae64f3 6683 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
6684 case BFD_RELOC_386_TLS_IE:
6685 case BFD_RELOC_386_TLS_GOTIE:
67a4f2b7 6686 case BFD_RELOC_386_TLS_GOTDESC:
bffbf940
JJ
6687 case BFD_RELOC_X86_64_TLSGD:
6688 case BFD_RELOC_X86_64_TLSLD:
6689 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7 6690 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
00f7efb6
JJ
6691 value = 0; /* Fully resolved at runtime. No addend. */
6692 /* Fallthrough */
6693 case BFD_RELOC_386_TLS_LE:
6694 case BFD_RELOC_386_TLS_LDO_32:
6695 case BFD_RELOC_386_TLS_LE_32:
6696 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 6697 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 6698 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 6699 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
6700 S_SET_THREAD_LOCAL (fixP->fx_addsy);
6701 break;
6702
67a4f2b7
AO
6703 case BFD_RELOC_386_TLS_DESC_CALL:
6704 case BFD_RELOC_X86_64_TLSDESC_CALL:
6705 value = 0; /* Fully resolved at runtime. No addend. */
6706 S_SET_THREAD_LOCAL (fixP->fx_addsy);
6707 fixP->fx_done = 0;
6708 return;
6709
00f7efb6
JJ
6710 case BFD_RELOC_386_GOT32:
6711 case BFD_RELOC_X86_64_GOT32:
47926f60
KH
6712 value = 0; /* Fully resolved at runtime. No addend. */
6713 break;
47926f60
KH
6714
6715 case BFD_RELOC_VTABLE_INHERIT:
6716 case BFD_RELOC_VTABLE_ENTRY:
6717 fixP->fx_done = 0;
94f592af 6718 return;
47926f60
KH
6719
6720 default:
6721 break;
6722 }
6723#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 6724 *valP = value;
f86103b7 6725#endif /* !defined (TE_Mach) */
3e73aa7c 6726
3e73aa7c 6727 /* Are we finished with this relocation now? */
c6682705 6728 if (fixP->fx_addsy == NULL)
3e73aa7c
JH
6729 fixP->fx_done = 1;
6730 else if (use_rela_relocations)
6731 {
6732 fixP->fx_no_overflow = 1;
062cd5e7
AS
6733 /* Remember value for tc_gen_reloc. */
6734 fixP->fx_addnumber = value;
3e73aa7c
JH
6735 value = 0;
6736 }
f86103b7 6737
94f592af 6738 md_number_to_chars (p, value, fixP->fx_size);
252b5132 6739}
252b5132 6740\f
252b5132 6741char *
499ac353 6742md_atof (int type, char *litP, int *sizeP)
252b5132 6743{
499ac353
NC
6744 /* This outputs the LITTLENUMs in REVERSE order;
6745 in accord with the bigendian 386. */
6746 return ieee_md_atof (type, litP, sizeP, FALSE);
252b5132
RH
6747}
6748\f
2d545b82 6749static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
252b5132 6750
252b5132 6751static char *
e3bb37b5 6752output_invalid (int c)
252b5132 6753{
3882b010 6754 if (ISPRINT (c))
f9f21a03
L
6755 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
6756 "'%c'", c);
252b5132 6757 else
f9f21a03 6758 snprintf (output_invalid_buf, sizeof (output_invalid_buf),
2d545b82 6759 "(0x%x)", (unsigned char) c);
252b5132
RH
6760 return output_invalid_buf;
6761}
6762
af6bdddf 6763/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
6764
6765static const reg_entry *
4d1bb795 6766parse_real_register (char *reg_string, char **end_op)
252b5132 6767{
af6bdddf
AM
6768 char *s = reg_string;
6769 char *p;
252b5132
RH
6770 char reg_name_given[MAX_REG_NAME_SIZE + 1];
6771 const reg_entry *r;
6772
6773 /* Skip possible REGISTER_PREFIX and possible whitespace. */
6774 if (*s == REGISTER_PREFIX)
6775 ++s;
6776
6777 if (is_space_char (*s))
6778 ++s;
6779
6780 p = reg_name_given;
af6bdddf 6781 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
6782 {
6783 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
6784 return (const reg_entry *) NULL;
6785 s++;
252b5132
RH
6786 }
6787
6588847e
DN
6788 /* For naked regs, make sure that we are not dealing with an identifier.
6789 This prevents confusing an identifier like `eax_var' with register
6790 `eax'. */
6791 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
6792 return (const reg_entry *) NULL;
6793
af6bdddf 6794 *end_op = s;
252b5132
RH
6795
6796 r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
6797
5f47d35b 6798 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 6799 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 6800 {
5f47d35b
AM
6801 if (is_space_char (*s))
6802 ++s;
6803 if (*s == '(')
6804 {
af6bdddf 6805 ++s;
5f47d35b
AM
6806 if (is_space_char (*s))
6807 ++s;
6808 if (*s >= '0' && *s <= '7')
6809 {
db557034 6810 int fpr = *s - '0';
af6bdddf 6811 ++s;
5f47d35b
AM
6812 if (is_space_char (*s))
6813 ++s;
6814 if (*s == ')')
6815 {
6816 *end_op = s + 1;
db557034
AM
6817 r = hash_find (reg_hash, "st(0)");
6818 know (r);
6819 return r + fpr;
5f47d35b 6820 }
5f47d35b 6821 }
47926f60 6822 /* We have "%st(" then garbage. */
5f47d35b
AM
6823 return (const reg_entry *) NULL;
6824 }
6825 }
6826
db51cc60
L
6827 /* Don't allow fake index register unless allow_index_reg isn't 0. */
6828 if (r != NULL
6829 && !allow_index_reg
6830 && (r->reg_num == RegEiz || r->reg_num == RegRiz))
6831 return (const reg_entry *) NULL;
6832
1ae00879 6833 if (r != NULL
d946b91f 6834 && ((r->reg_flags & (RegRex64 | RegRex))
40fb9820
L
6835 || r->reg_type.bitfield.reg64)
6836 && (!cpu_arch_flags.bitfield.cpulm
c6fb90c8 6837 || !UINTS_EQUAL (r->reg_type, control))
1ae00879 6838 && flag_code != CODE_64BIT)
20f0a1fc 6839 return (const reg_entry *) NULL;
1ae00879 6840
252b5132
RH
6841 return r;
6842}
4d1bb795
JB
6843
6844/* REG_STRING starts *before* REGISTER_PREFIX. */
6845
6846static const reg_entry *
6847parse_register (char *reg_string, char **end_op)
6848{
6849 const reg_entry *r;
6850
6851 if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
6852 r = parse_real_register (reg_string, end_op);
6853 else
6854 r = NULL;
6855 if (!r)
6856 {
6857 char *save = input_line_pointer;
6858 char c;
6859 symbolS *symbolP;
6860
6861 input_line_pointer = reg_string;
6862 c = get_symbol_end ();
6863 symbolP = symbol_find (reg_string);
6864 if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
6865 {
6866 const expressionS *e = symbol_get_value_expression (symbolP);
6867
6868 know (e->X_op == O_register);
4eed87de 6869 know (e->X_add_number >= 0
c3fe08fa 6870 && (valueT) e->X_add_number < i386_regtab_size);
4d1bb795
JB
6871 r = i386_regtab + e->X_add_number;
6872 *end_op = input_line_pointer;
6873 }
6874 *input_line_pointer = c;
6875 input_line_pointer = save;
6876 }
6877 return r;
6878}
6879
6880int
6881i386_parse_name (char *name, expressionS *e, char *nextcharP)
6882{
6883 const reg_entry *r;
6884 char *end = input_line_pointer;
6885
6886 *end = *nextcharP;
6887 r = parse_register (name, &input_line_pointer);
6888 if (r && end <= input_line_pointer)
6889 {
6890 *nextcharP = *input_line_pointer;
6891 *input_line_pointer = 0;
6892 e->X_op = O_register;
6893 e->X_add_number = r - i386_regtab;
6894 return 1;
6895 }
6896 input_line_pointer = end;
6897 *end = 0;
6898 return 0;
6899}
6900
6901void
6902md_operand (expressionS *e)
6903{
6904 if (*input_line_pointer == REGISTER_PREFIX)
6905 {
6906 char *end;
6907 const reg_entry *r = parse_real_register (input_line_pointer, &end);
6908
6909 if (r)
6910 {
6911 e->X_op = O_register;
6912 e->X_add_number = r - i386_regtab;
6913 input_line_pointer = end;
6914 }
6915 }
6916}
6917
252b5132 6918\f
4cc782b5 6919#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12b55ccc 6920const char *md_shortopts = "kVQ:sqn";
252b5132 6921#else
12b55ccc 6922const char *md_shortopts = "qn";
252b5132 6923#endif
6e0b89ee 6924
3e73aa7c 6925#define OPTION_32 (OPTION_MD_BASE + 0)
b3b91714
AM
6926#define OPTION_64 (OPTION_MD_BASE + 1)
6927#define OPTION_DIVIDE (OPTION_MD_BASE + 2)
9103f4f4
L
6928#define OPTION_MARCH (OPTION_MD_BASE + 3)
6929#define OPTION_MTUNE (OPTION_MD_BASE + 4)
1efbbeb4
L
6930#define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
6931#define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
6932#define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
6933#define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
6934#define OPTION_MOLD_GCC (OPTION_MD_BASE + 9)
b3b91714 6935
99ad8390
NC
6936struct option md_longopts[] =
6937{
3e73aa7c 6938 {"32", no_argument, NULL, OPTION_32},
99ad8390 6939#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined(TE_PEP)
3e73aa7c 6940 {"64", no_argument, NULL, OPTION_64},
6e0b89ee 6941#endif
b3b91714 6942 {"divide", no_argument, NULL, OPTION_DIVIDE},
9103f4f4
L
6943 {"march", required_argument, NULL, OPTION_MARCH},
6944 {"mtune", required_argument, NULL, OPTION_MTUNE},
1efbbeb4
L
6945 {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
6946 {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
6947 {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
6948 {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
6949 {"mold-gcc", no_argument, NULL, OPTION_MOLD_GCC},
252b5132
RH
6950 {NULL, no_argument, NULL, 0}
6951};
6952size_t md_longopts_size = sizeof (md_longopts);
6953
6954int
9103f4f4 6955md_parse_option (int c, char *arg)
252b5132 6956{
9103f4f4
L
6957 unsigned int i;
6958
252b5132
RH
6959 switch (c)
6960 {
12b55ccc
L
6961 case 'n':
6962 optimize_align_code = 0;
6963 break;
6964
a38cf1db
AM
6965 case 'q':
6966 quiet_warnings = 1;
252b5132
RH
6967 break;
6968
6969#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
6970 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
6971 should be emitted or not. FIXME: Not implemented. */
6972 case 'Q':
252b5132
RH
6973 break;
6974
6975 /* -V: SVR4 argument to print version ID. */
6976 case 'V':
6977 print_version_id ();
6978 break;
6979
a38cf1db
AM
6980 /* -k: Ignore for FreeBSD compatibility. */
6981 case 'k':
252b5132 6982 break;
4cc782b5
ILT
6983
6984 case 's':
6985 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 6986 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 6987 break;
99ad8390
NC
6988#endif
6989#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined(TE_PEP)
3e73aa7c
JH
6990 case OPTION_64:
6991 {
6992 const char **list, **l;
6993
3e73aa7c
JH
6994 list = bfd_target_list ();
6995 for (l = list; *l != NULL; l++)
8620418b 6996 if (CONST_STRNEQ (*l, "elf64-x86-64")
99ad8390
NC
6997 || strcmp (*l, "coff-x86-64") == 0
6998 || strcmp (*l, "pe-x86-64") == 0
6999 || strcmp (*l, "pei-x86-64") == 0)
6e0b89ee
AM
7000 {
7001 default_arch = "x86_64";
7002 break;
7003 }
3e73aa7c 7004 if (*l == NULL)
6e0b89ee 7005 as_fatal (_("No compiled in support for x86_64"));
3e73aa7c
JH
7006 free (list);
7007 }
7008 break;
7009#endif
252b5132 7010
6e0b89ee
AM
7011 case OPTION_32:
7012 default_arch = "i386";
7013 break;
7014
b3b91714
AM
7015 case OPTION_DIVIDE:
7016#ifdef SVR4_COMMENT_CHARS
7017 {
7018 char *n, *t;
7019 const char *s;
7020
7021 n = (char *) xmalloc (strlen (i386_comment_chars) + 1);
7022 t = n;
7023 for (s = i386_comment_chars; *s != '\0'; s++)
7024 if (*s != '/')
7025 *t++ = *s;
7026 *t = '\0';
7027 i386_comment_chars = n;
7028 }
7029#endif
7030 break;
7031
9103f4f4
L
7032 case OPTION_MARCH:
7033 if (*arg == '.')
7034 as_fatal (_("Invalid -march= option: `%s'"), arg);
7035 for (i = 0; i < ARRAY_SIZE (cpu_arch); i++)
7036 {
7037 if (strcmp (arg, cpu_arch [i].name) == 0)
7038 {
ccc9c027 7039 cpu_arch_isa = cpu_arch[i].type;
9103f4f4 7040 cpu_arch_isa_flags = cpu_arch[i].flags;
ccc9c027
L
7041 if (!cpu_arch_tune_set)
7042 {
7043 cpu_arch_tune = cpu_arch_isa;
7044 cpu_arch_tune_flags = cpu_arch_isa_flags;
7045 }
9103f4f4
L
7046 break;
7047 }
7048 }
7049 if (i >= ARRAY_SIZE (cpu_arch))
7050 as_fatal (_("Invalid -march= option: `%s'"), arg);
7051 break;
7052
7053 case OPTION_MTUNE:
7054 if (*arg == '.')
7055 as_fatal (_("Invalid -mtune= option: `%s'"), arg);
7056 for (i = 0; i < ARRAY_SIZE (cpu_arch); i++)
7057 {
7058 if (strcmp (arg, cpu_arch [i].name) == 0)
7059 {
ccc9c027 7060 cpu_arch_tune_set = 1;
9103f4f4
L
7061 cpu_arch_tune = cpu_arch [i].type;
7062 cpu_arch_tune_flags = cpu_arch[i].flags;
7063 break;
7064 }
7065 }
7066 if (i >= ARRAY_SIZE (cpu_arch))
7067 as_fatal (_("Invalid -mtune= option: `%s'"), arg);
7068 break;
7069
1efbbeb4
L
7070 case OPTION_MMNEMONIC:
7071 if (strcasecmp (arg, "att") == 0)
7072 intel_mnemonic = 0;
7073 else if (strcasecmp (arg, "intel") == 0)
7074 intel_mnemonic = 1;
7075 else
7076 as_fatal (_("Invalid -mmnemonic= option: `%s'"), arg);
7077 break;
7078
7079 case OPTION_MSYNTAX:
7080 if (strcasecmp (arg, "att") == 0)
7081 intel_syntax = 0;
7082 else if (strcasecmp (arg, "intel") == 0)
7083 intel_syntax = 1;
7084 else
7085 as_fatal (_("Invalid -msyntax= option: `%s'"), arg);
7086 break;
7087
7088 case OPTION_MINDEX_REG:
7089 allow_index_reg = 1;
7090 break;
7091
7092 case OPTION_MNAKED_REG:
7093 allow_naked_reg = 1;
7094 break;
7095
7096 case OPTION_MOLD_GCC:
7097 old_gcc = 1;
1efbbeb4
L
7098 break;
7099
252b5132
RH
7100 default:
7101 return 0;
7102 }
7103 return 1;
7104}
7105
7106void
7107md_show_usage (stream)
7108 FILE *stream;
7109{
4cc782b5
ILT
7110#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7111 fprintf (stream, _("\
a38cf1db
AM
7112 -Q ignored\n\
7113 -V print assembler version number\n\
b3b91714
AM
7114 -k ignored\n"));
7115#endif
7116 fprintf (stream, _("\
12b55ccc 7117 -n Do not optimize code alignment\n\
b3b91714
AM
7118 -q quieten some warnings\n"));
7119#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7120 fprintf (stream, _("\
a38cf1db 7121 -s ignored\n"));
b3b91714 7122#endif
751d281c
L
7123#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined(TE_PEP)
7124 fprintf (stream, _("\
7125 --32/--64 generate 32bit/64bit code\n"));
7126#endif
b3b91714
AM
7127#ifdef SVR4_COMMENT_CHARS
7128 fprintf (stream, _("\
7129 --divide do not treat `/' as a comment character\n"));
a38cf1db
AM
7130#else
7131 fprintf (stream, _("\
b3b91714 7132 --divide ignored\n"));
4cc782b5 7133#endif
9103f4f4
L
7134 fprintf (stream, _("\
7135 -march=CPU/-mtune=CPU generate code/optimize for CPU, where CPU is one of:\n\
7136 i386, i486, pentium, pentiumpro, pentium4, nocona,\n\
4eed87de 7137 core, core2, k6, athlon, k8, generic32, generic64\n"));
ba104c83
L
7138 fprintf (stream, _("\
7139 -mmnemonic=[att|intel] use AT&T/Intel mnemonic\n"));
7140 fprintf (stream, _("\
7141 -msyntax=[att|intel] use AT&T/Intel syntax\n"));
7142 fprintf (stream, _("\
7143 -mindex-reg support pseudo index registers\n"));
7144 fprintf (stream, _("\
7145 -mnaked-reg don't require `%%' prefix for registers\n"));
7146 fprintf (stream, _("\
7147 -mold-gcc support old (<= 2.8.1) versions of gcc\n"));
252b5132
RH
7148}
7149
3e73aa7c 7150#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
872ce6ff 7151 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (TE_PEP))
252b5132
RH
7152
7153/* Pick the target format to use. */
7154
47926f60 7155const char *
e3bb37b5 7156i386_target_format (void)
252b5132 7157{
3e73aa7c 7158 if (!strcmp (default_arch, "x86_64"))
9103f4f4
L
7159 {
7160 set_code_flag (CODE_64BIT);
c6fb90c8 7161 if (UINTS_ALL_ZERO (cpu_arch_isa_flags))
40fb9820
L
7162 {
7163 cpu_arch_isa_flags.bitfield.cpui186 = 1;
7164 cpu_arch_isa_flags.bitfield.cpui286 = 1;
7165 cpu_arch_isa_flags.bitfield.cpui386 = 1;
7166 cpu_arch_isa_flags.bitfield.cpui486 = 1;
7167 cpu_arch_isa_flags.bitfield.cpui586 = 1;
7168 cpu_arch_isa_flags.bitfield.cpui686 = 1;
7169 cpu_arch_isa_flags.bitfield.cpup4 = 1;
7170 cpu_arch_isa_flags.bitfield.cpummx= 1;
7171 cpu_arch_isa_flags.bitfield.cpummx2 = 1;
7172 cpu_arch_isa_flags.bitfield.cpusse = 1;
7173 cpu_arch_isa_flags.bitfield.cpusse2 = 1;
7174 }
c6fb90c8 7175 if (UINTS_ALL_ZERO (cpu_arch_tune_flags))
40fb9820
L
7176 {
7177 cpu_arch_tune_flags.bitfield.cpui186 = 1;
7178 cpu_arch_tune_flags.bitfield.cpui286 = 1;
7179 cpu_arch_tune_flags.bitfield.cpui386 = 1;
7180 cpu_arch_tune_flags.bitfield.cpui486 = 1;
7181 cpu_arch_tune_flags.bitfield.cpui586 = 1;
7182 cpu_arch_tune_flags.bitfield.cpui686 = 1;
7183 cpu_arch_tune_flags.bitfield.cpup4 = 1;
7184 cpu_arch_tune_flags.bitfield.cpummx= 1;
7185 cpu_arch_tune_flags.bitfield.cpummx2 = 1;
7186 cpu_arch_tune_flags.bitfield.cpusse = 1;
7187 cpu_arch_tune_flags.bitfield.cpusse2 = 1;
7188 }
9103f4f4 7189 }
3e73aa7c 7190 else if (!strcmp (default_arch, "i386"))
9103f4f4
L
7191 {
7192 set_code_flag (CODE_32BIT);
c6fb90c8 7193 if (UINTS_ALL_ZERO (cpu_arch_isa_flags))
40fb9820
L
7194 {
7195 cpu_arch_isa_flags.bitfield.cpui186 = 1;
7196 cpu_arch_isa_flags.bitfield.cpui286 = 1;
7197 cpu_arch_isa_flags.bitfield.cpui386 = 1;
7198 }
c6fb90c8 7199 if (UINTS_ALL_ZERO (cpu_arch_tune_flags))
40fb9820
L
7200 {
7201 cpu_arch_tune_flags.bitfield.cpui186 = 1;
7202 cpu_arch_tune_flags.bitfield.cpui286 = 1;
7203 cpu_arch_tune_flags.bitfield.cpui386 = 1;
7204 }
9103f4f4 7205 }
3e73aa7c
JH
7206 else
7207 as_fatal (_("Unknown architecture"));
252b5132
RH
7208 switch (OUTPUT_FLAVOR)
7209 {
872ce6ff
L
7210#ifdef TE_PEP
7211 case bfd_target_coff_flavour:
7212 return flag_code == CODE_64BIT ? COFF_TARGET_FORMAT : "coff-i386";
7213 break;
7214#endif
4c63da97
AM
7215#ifdef OBJ_MAYBE_AOUT
7216 case bfd_target_aout_flavour:
47926f60 7217 return AOUT_TARGET_FORMAT;
4c63da97
AM
7218#endif
7219#ifdef OBJ_MAYBE_COFF
252b5132
RH
7220 case bfd_target_coff_flavour:
7221 return "coff-i386";
4c63da97 7222#endif
3e73aa7c 7223#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 7224 case bfd_target_elf_flavour:
3e73aa7c 7225 {
e5cb08ac 7226 if (flag_code == CODE_64BIT)
4fa24527
JB
7227 {
7228 object_64bit = 1;
7229 use_rela_relocations = 1;
7230 }
9d7cbccd 7231 return flag_code == CODE_64BIT ? ELF_TARGET_FORMAT64 : ELF_TARGET_FORMAT;
3e73aa7c 7232 }
4c63da97 7233#endif
252b5132
RH
7234 default:
7235 abort ();
7236 return NULL;
7237 }
7238}
7239
47926f60 7240#endif /* OBJ_MAYBE_ more than one */
a847613f
AM
7241
7242#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
e3bb37b5
L
7243void
7244i386_elf_emit_arch_note (void)
a847613f 7245{
718ddfc0 7246 if (IS_ELF && cpu_arch_name != NULL)
a847613f
AM
7247 {
7248 char *p;
7249 asection *seg = now_seg;
7250 subsegT subseg = now_subseg;
7251 Elf_Internal_Note i_note;
7252 Elf_External_Note e_note;
7253 asection *note_secp;
7254 int len;
7255
7256 /* Create the .note section. */
7257 note_secp = subseg_new (".note", 0);
7258 bfd_set_section_flags (stdoutput,
7259 note_secp,
7260 SEC_HAS_CONTENTS | SEC_READONLY);
7261
7262 /* Process the arch string. */
7263 len = strlen (cpu_arch_name);
7264
7265 i_note.namesz = len + 1;
7266 i_note.descsz = 0;
7267 i_note.type = NT_ARCH;
7268 p = frag_more (sizeof (e_note.namesz));
7269 md_number_to_chars (p, (valueT) i_note.namesz, sizeof (e_note.namesz));
7270 p = frag_more (sizeof (e_note.descsz));
7271 md_number_to_chars (p, (valueT) i_note.descsz, sizeof (e_note.descsz));
7272 p = frag_more (sizeof (e_note.type));
7273 md_number_to_chars (p, (valueT) i_note.type, sizeof (e_note.type));
7274 p = frag_more (len + 1);
7275 strcpy (p, cpu_arch_name);
7276
7277 frag_align (2, 0, 0);
7278
7279 subseg_set (seg, subseg);
7280 }
7281}
7282#endif
252b5132 7283\f
252b5132
RH
7284symbolS *
7285md_undefined_symbol (name)
7286 char *name;
7287{
18dc2407
ILT
7288 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
7289 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
7290 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
7291 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
7292 {
7293 if (!GOT_symbol)
7294 {
7295 if (symbol_find (name))
7296 as_bad (_("GOT already in symbol table"));
7297 GOT_symbol = symbol_new (name, undefined_section,
7298 (valueT) 0, &zero_address_frag);
7299 };
7300 return GOT_symbol;
7301 }
252b5132
RH
7302 return 0;
7303}
7304
7305/* Round up a section size to the appropriate boundary. */
47926f60 7306
252b5132
RH
7307valueT
7308md_section_align (segment, size)
ab9da554 7309 segT segment ATTRIBUTE_UNUSED;
252b5132
RH
7310 valueT size;
7311{
4c63da97
AM
7312#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
7313 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
7314 {
7315 /* For a.out, force the section size to be aligned. If we don't do
7316 this, BFD will align it for us, but it will not write out the
7317 final bytes of the section. This may be a bug in BFD, but it is
7318 easier to fix it here since that is how the other a.out targets
7319 work. */
7320 int align;
7321
7322 align = bfd_get_section_alignment (stdoutput, segment);
7323 size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
7324 }
252b5132
RH
7325#endif
7326
7327 return size;
7328}
7329
7330/* On the i386, PC-relative offsets are relative to the start of the
7331 next instruction. That is, the address of the offset, plus its
7332 size, since the offset is always the last part of the insn. */
7333
7334long
e3bb37b5 7335md_pcrel_from (fixS *fixP)
252b5132
RH
7336{
7337 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
7338}
7339
7340#ifndef I386COFF
7341
7342static void
e3bb37b5 7343s_bss (int ignore ATTRIBUTE_UNUSED)
252b5132 7344{
29b0f896 7345 int temp;
252b5132 7346
8a75718c
JB
7347#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7348 if (IS_ELF)
7349 obj_elf_section_change_hook ();
7350#endif
252b5132
RH
7351 temp = get_absolute_expression ();
7352 subseg_set (bss_section, (subsegT) temp);
7353 demand_empty_rest_of_line ();
7354}
7355
7356#endif
7357
252b5132 7358void
e3bb37b5 7359i386_validate_fix (fixS *fixp)
252b5132
RH
7360{
7361 if (fixp->fx_subsy && fixp->fx_subsy == GOT_symbol)
7362 {
23df1078
JH
7363 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
7364 {
4fa24527 7365 if (!object_64bit)
23df1078
JH
7366 abort ();
7367 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
7368 }
7369 else
7370 {
4fa24527 7371 if (!object_64bit)
d6ab8113
JB
7372 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
7373 else
7374 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
23df1078 7375 }
252b5132
RH
7376 fixp->fx_subsy = 0;
7377 }
7378}
7379
252b5132
RH
7380arelent *
7381tc_gen_reloc (section, fixp)
ab9da554 7382 asection *section ATTRIBUTE_UNUSED;
252b5132
RH
7383 fixS *fixp;
7384{
7385 arelent *rel;
7386 bfd_reloc_code_real_type code;
7387
7388 switch (fixp->fx_r_type)
7389 {
3e73aa7c
JH
7390 case BFD_RELOC_X86_64_PLT32:
7391 case BFD_RELOC_X86_64_GOT32:
7392 case BFD_RELOC_X86_64_GOTPCREL:
252b5132
RH
7393 case BFD_RELOC_386_PLT32:
7394 case BFD_RELOC_386_GOT32:
7395 case BFD_RELOC_386_GOTOFF:
7396 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
7397 case BFD_RELOC_386_TLS_GD:
7398 case BFD_RELOC_386_TLS_LDM:
7399 case BFD_RELOC_386_TLS_LDO_32:
7400 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
7401 case BFD_RELOC_386_TLS_IE:
7402 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
7403 case BFD_RELOC_386_TLS_LE_32:
7404 case BFD_RELOC_386_TLS_LE:
67a4f2b7
AO
7405 case BFD_RELOC_386_TLS_GOTDESC:
7406 case BFD_RELOC_386_TLS_DESC_CALL:
bffbf940
JJ
7407 case BFD_RELOC_X86_64_TLSGD:
7408 case BFD_RELOC_X86_64_TLSLD:
7409 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 7410 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
7411 case BFD_RELOC_X86_64_GOTTPOFF:
7412 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
7413 case BFD_RELOC_X86_64_TPOFF64:
7414 case BFD_RELOC_X86_64_GOTOFF64:
7415 case BFD_RELOC_X86_64_GOTPC32:
7b81dfbb
AJ
7416 case BFD_RELOC_X86_64_GOT64:
7417 case BFD_RELOC_X86_64_GOTPCREL64:
7418 case BFD_RELOC_X86_64_GOTPC64:
7419 case BFD_RELOC_X86_64_GOTPLT64:
7420 case BFD_RELOC_X86_64_PLTOFF64:
67a4f2b7
AO
7421 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
7422 case BFD_RELOC_X86_64_TLSDESC_CALL:
252b5132
RH
7423 case BFD_RELOC_RVA:
7424 case BFD_RELOC_VTABLE_ENTRY:
7425 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
7426#ifdef TE_PE
7427 case BFD_RELOC_32_SECREL:
7428#endif
252b5132
RH
7429 code = fixp->fx_r_type;
7430 break;
dbbaec26
L
7431 case BFD_RELOC_X86_64_32S:
7432 if (!fixp->fx_pcrel)
7433 {
7434 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
7435 code = fixp->fx_r_type;
7436 break;
7437 }
252b5132 7438 default:
93382f6d 7439 if (fixp->fx_pcrel)
252b5132 7440 {
93382f6d
AM
7441 switch (fixp->fx_size)
7442 {
7443 default:
b091f402
AM
7444 as_bad_where (fixp->fx_file, fixp->fx_line,
7445 _("can not do %d byte pc-relative relocation"),
7446 fixp->fx_size);
93382f6d
AM
7447 code = BFD_RELOC_32_PCREL;
7448 break;
7449 case 1: code = BFD_RELOC_8_PCREL; break;
7450 case 2: code = BFD_RELOC_16_PCREL; break;
7451 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
7452#ifdef BFD64
7453 case 8: code = BFD_RELOC_64_PCREL; break;
7454#endif
93382f6d
AM
7455 }
7456 }
7457 else
7458 {
7459 switch (fixp->fx_size)
7460 {
7461 default:
b091f402
AM
7462 as_bad_where (fixp->fx_file, fixp->fx_line,
7463 _("can not do %d byte relocation"),
7464 fixp->fx_size);
93382f6d
AM
7465 code = BFD_RELOC_32;
7466 break;
7467 case 1: code = BFD_RELOC_8; break;
7468 case 2: code = BFD_RELOC_16; break;
7469 case 4: code = BFD_RELOC_32; break;
937149dd 7470#ifdef BFD64
3e73aa7c 7471 case 8: code = BFD_RELOC_64; break;
937149dd 7472#endif
93382f6d 7473 }
252b5132
RH
7474 }
7475 break;
7476 }
252b5132 7477
d182319b
JB
7478 if ((code == BFD_RELOC_32
7479 || code == BFD_RELOC_32_PCREL
7480 || code == BFD_RELOC_X86_64_32S)
252b5132
RH
7481 && GOT_symbol
7482 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 7483 {
4fa24527 7484 if (!object_64bit)
d6ab8113
JB
7485 code = BFD_RELOC_386_GOTPC;
7486 else
7487 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 7488 }
7b81dfbb
AJ
7489 if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
7490 && GOT_symbol
7491 && fixp->fx_addsy == GOT_symbol)
7492 {
7493 code = BFD_RELOC_X86_64_GOTPC64;
7494 }
252b5132
RH
7495
7496 rel = (arelent *) xmalloc (sizeof (arelent));
49309057
ILT
7497 rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
7498 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
7499
7500 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 7501
3e73aa7c
JH
7502 if (!use_rela_relocations)
7503 {
7504 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
7505 vtable entry to be used in the relocation's section offset. */
7506 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
7507 rel->address = fixp->fx_offset;
252b5132 7508
c6682705 7509 rel->addend = 0;
3e73aa7c
JH
7510 }
7511 /* Use the rela in 64bit mode. */
252b5132 7512 else
3e73aa7c 7513 {
062cd5e7
AS
7514 if (!fixp->fx_pcrel)
7515 rel->addend = fixp->fx_offset;
7516 else
7517 switch (code)
7518 {
7519 case BFD_RELOC_X86_64_PLT32:
7520 case BFD_RELOC_X86_64_GOT32:
7521 case BFD_RELOC_X86_64_GOTPCREL:
bffbf940
JJ
7522 case BFD_RELOC_X86_64_TLSGD:
7523 case BFD_RELOC_X86_64_TLSLD:
7524 case BFD_RELOC_X86_64_GOTTPOFF:
67a4f2b7
AO
7525 case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
7526 case BFD_RELOC_X86_64_TLSDESC_CALL:
062cd5e7
AS
7527 rel->addend = fixp->fx_offset - fixp->fx_size;
7528 break;
7529 default:
7530 rel->addend = (section->vma
7531 - fixp->fx_size
7532 + fixp->fx_addnumber
7533 + md_pcrel_from (fixp));
7534 break;
7535 }
3e73aa7c
JH
7536 }
7537
252b5132
RH
7538 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
7539 if (rel->howto == NULL)
7540 {
7541 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 7542 _("cannot represent relocation type %s"),
252b5132
RH
7543 bfd_get_reloc_code_name (code));
7544 /* Set howto to a garbage value so that we can keep going. */
7545 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
7546 assert (rel->howto != NULL);
7547 }
7548
7549 return rel;
7550}
7551
64a0c779
DN
7552\f
7553/* Parse operands using Intel syntax. This implements a recursive descent
7554 parser based on the BNF grammar published in Appendix B of the MASM 6.1
7555 Programmer's Guide.
7556
7557 FIXME: We do not recognize the full operand grammar defined in the MASM
7558 documentation. In particular, all the structure/union and
7559 high-level macro operands are missing.
7560
7561 Uppercase words are terminals, lower case words are non-terminals.
7562 Objects surrounded by double brackets '[[' ']]' are optional. Vertical
7563 bars '|' denote choices. Most grammar productions are implemented in
7564 functions called 'intel_<production>'.
7565
7566 Initial production is 'expr'.
7567
9306ca4a 7568 addOp + | -
64a0c779
DN
7569
7570 alpha [a-zA-Z]
7571
9306ca4a
JB
7572 binOp & | AND | \| | OR | ^ | XOR
7573
64a0c779
DN
7574 byteRegister AL | AH | BL | BH | CL | CH | DL | DH
7575
7576 constant digits [[ radixOverride ]]
7577
9306ca4a 7578 dataType BYTE | WORD | DWORD | FWORD | QWORD | TBYTE | OWORD | XMMWORD
64a0c779
DN
7579
7580 digits decdigit
b77a7acd
AJ
7581 | digits decdigit
7582 | digits hexdigit
64a0c779
DN
7583
7584 decdigit [0-9]
7585
9306ca4a
JB
7586 e04 e04 addOp e05
7587 | e05
7588
7589 e05 e05 binOp e06
b77a7acd 7590 | e06
64a0c779
DN
7591
7592 e06 e06 mulOp e09
b77a7acd 7593 | e09
64a0c779
DN
7594
7595 e09 OFFSET e10
a724f0f4
JB
7596 | SHORT e10
7597 | + e10
7598 | - e10
9306ca4a
JB
7599 | ~ e10
7600 | NOT e10
64a0c779
DN
7601 | e09 PTR e10
7602 | e09 : e10
7603 | e10
7604
7605 e10 e10 [ expr ]
b77a7acd 7606 | e11
64a0c779
DN
7607
7608 e11 ( expr )
b77a7acd 7609 | [ expr ]
64a0c779
DN
7610 | constant
7611 | dataType
7612 | id
7613 | $
7614 | register
7615
a724f0f4 7616 => expr expr cmpOp e04
9306ca4a 7617 | e04
64a0c779
DN
7618
7619 gpRegister AX | EAX | BX | EBX | CX | ECX | DX | EDX
b77a7acd 7620 | BP | EBP | SP | ESP | DI | EDI | SI | ESI
64a0c779
DN
7621
7622 hexdigit a | b | c | d | e | f
b77a7acd 7623 | A | B | C | D | E | F
64a0c779
DN
7624
7625 id alpha
b77a7acd 7626 | id alpha
64a0c779
DN
7627 | id decdigit
7628
9306ca4a 7629 mulOp * | / | % | MOD | << | SHL | >> | SHR
64a0c779
DN
7630
7631 quote " | '
7632
7633 register specialRegister
b77a7acd 7634 | gpRegister
64a0c779
DN
7635 | byteRegister
7636
7637 segmentRegister CS | DS | ES | FS | GS | SS
7638
9306ca4a 7639 specialRegister CR0 | CR2 | CR3 | CR4
b77a7acd 7640 | DR0 | DR1 | DR2 | DR3 | DR6 | DR7
64a0c779
DN
7641 | TR3 | TR4 | TR5 | TR6 | TR7
7642
64a0c779
DN
7643 We simplify the grammar in obvious places (e.g., register parsing is
7644 done by calling parse_register) and eliminate immediate left recursion
7645 to implement a recursive-descent parser.
7646
a724f0f4
JB
7647 expr e04 expr'
7648
7649 expr' cmpOp e04 expr'
7650 | Empty
9306ca4a
JB
7651
7652 e04 e05 e04'
7653
7654 e04' addOp e05 e04'
7655 | Empty
64a0c779
DN
7656
7657 e05 e06 e05'
7658
9306ca4a 7659 e05' binOp e06 e05'
b77a7acd 7660 | Empty
64a0c779
DN
7661
7662 e06 e09 e06'
7663
7664 e06' mulOp e09 e06'
b77a7acd 7665 | Empty
64a0c779
DN
7666
7667 e09 OFFSET e10 e09'
a724f0f4
JB
7668 | SHORT e10'
7669 | + e10'
7670 | - e10'
7671 | ~ e10'
7672 | NOT e10'
b77a7acd 7673 | e10 e09'
64a0c779
DN
7674
7675 e09' PTR e10 e09'
b77a7acd 7676 | : e10 e09'
64a0c779
DN
7677 | Empty
7678
7679 e10 e11 e10'
7680
7681 e10' [ expr ] e10'
b77a7acd 7682 | Empty
64a0c779
DN
7683
7684 e11 ( expr )
b77a7acd 7685 | [ expr ]
64a0c779
DN
7686 | BYTE
7687 | WORD
7688 | DWORD
9306ca4a 7689 | FWORD
64a0c779 7690 | QWORD
9306ca4a
JB
7691 | TBYTE
7692 | OWORD
7693 | XMMWORD
64a0c779
DN
7694 | .
7695 | $
7696 | register
7697 | id
7698 | constant */
7699
7700/* Parsing structure for the intel syntax parser. Used to implement the
7701 semantic actions for the operand grammar. */
7702struct intel_parser_s
7703 {
7704 char *op_string; /* The string being parsed. */
7705 int got_a_float; /* Whether the operand is a float. */
4a1805b1 7706 int op_modifier; /* Operand modifier. */
64a0c779 7707 int is_mem; /* 1 if operand is memory reference. */
4eed87de
AM
7708 int in_offset; /* >=1 if parsing operand of offset. */
7709 int in_bracket; /* >=1 if parsing operand in brackets. */
64a0c779
DN
7710 const reg_entry *reg; /* Last register reference found. */
7711 char *disp; /* Displacement string being built. */
a724f0f4 7712 char *next_operand; /* Resume point when splitting operands. */
64a0c779
DN
7713 };
7714
7715static struct intel_parser_s intel_parser;
7716
7717/* Token structure for parsing intel syntax. */
7718struct intel_token
7719 {
7720 int code; /* Token code. */
7721 const reg_entry *reg; /* Register entry for register tokens. */
7722 char *str; /* String representation. */
7723 };
7724
7725static struct intel_token cur_token, prev_token;
7726
50705ef4
AM
7727/* Token codes for the intel parser. Since T_SHORT is already used
7728 by COFF, undefine it first to prevent a warning. */
64a0c779
DN
7729#define T_NIL -1
7730#define T_CONST 1
7731#define T_REG 2
7732#define T_BYTE 3
7733#define T_WORD 4
9306ca4a
JB
7734#define T_DWORD 5
7735#define T_FWORD 6
7736#define T_QWORD 7
7737#define T_TBYTE 8
7738#define T_XMMWORD 9
50705ef4 7739#undef T_SHORT
9306ca4a
JB
7740#define T_SHORT 10
7741#define T_OFFSET 11
7742#define T_PTR 12
7743#define T_ID 13
7744#define T_SHL 14
7745#define T_SHR 15
64a0c779
DN
7746
7747/* Prototypes for intel parser functions. */
e3bb37b5
L
7748static int intel_match_token (int);
7749static void intel_putback_token (void);
7750static void intel_get_token (void);
7751static int intel_expr (void);
7752static int intel_e04 (void);
7753static int intel_e05 (void);
7754static int intel_e06 (void);
7755static int intel_e09 (void);
7756static int intel_e10 (void);
7757static int intel_e11 (void);
64a0c779 7758
64a0c779 7759static int
e3bb37b5 7760i386_intel_operand (char *operand_string, int got_a_float)
64a0c779
DN
7761{
7762 int ret;
7763 char *p;
7764
a724f0f4
JB
7765 p = intel_parser.op_string = xstrdup (operand_string);
7766 intel_parser.disp = (char *) xmalloc (strlen (operand_string) + 1);
7767
7768 for (;;)
64a0c779 7769 {
a724f0f4
JB
7770 /* Initialize token holders. */
7771 cur_token.code = prev_token.code = T_NIL;
7772 cur_token.reg = prev_token.reg = NULL;
7773 cur_token.str = prev_token.str = NULL;
7774
7775 /* Initialize parser structure. */
7776 intel_parser.got_a_float = got_a_float;
7777 intel_parser.op_modifier = 0;
7778 intel_parser.is_mem = 0;
7779 intel_parser.in_offset = 0;
7780 intel_parser.in_bracket = 0;
7781 intel_parser.reg = NULL;
7782 intel_parser.disp[0] = '\0';
7783 intel_parser.next_operand = NULL;
7784
7785 /* Read the first token and start the parser. */
7786 intel_get_token ();
7787 ret = intel_expr ();
7788
7789 if (!ret)
7790 break;
7791
9306ca4a
JB
7792 if (cur_token.code != T_NIL)
7793 {
7794 as_bad (_("invalid operand for '%s' ('%s' unexpected)"),
7795 current_templates->start->name, cur_token.str);
7796 ret = 0;
7797 }
64a0c779
DN
7798 /* If we found a memory reference, hand it over to i386_displacement
7799 to fill in the rest of the operand fields. */
9306ca4a 7800 else if (intel_parser.is_mem)
64a0c779
DN
7801 {
7802 if ((i.mem_operands == 1
40fb9820 7803 && !current_templates->start->opcode_modifier.isstring)
64a0c779
DN
7804 || i.mem_operands == 2)
7805 {
7806 as_bad (_("too many memory references for '%s'"),
7807 current_templates->start->name);
7808 ret = 0;
7809 }
7810 else
7811 {
7812 char *s = intel_parser.disp;
7813 i.mem_operands++;
7814
a724f0f4
JB
7815 if (!quiet_warnings && intel_parser.is_mem < 0)
7816 /* See the comments in intel_bracket_expr. */
7817 as_warn (_("Treating `%s' as memory reference"), operand_string);
7818
64a0c779
DN
7819 /* Add the displacement expression. */
7820 if (*s != '\0')
a4622f40
AM
7821 ret = i386_displacement (s, s + strlen (s));
7822 if (ret)
a724f0f4
JB
7823 {
7824 /* Swap base and index in 16-bit memory operands like
7825 [si+bx]. Since i386_index_check is also used in AT&T
7826 mode we have to do that here. */
7827 if (i.base_reg
7828 && i.index_reg
40fb9820
L
7829 && i.base_reg->reg_type.bitfield.reg16
7830 && i.index_reg->reg_type.bitfield.reg16
a724f0f4
JB
7831 && i.base_reg->reg_num >= 6
7832 && i.index_reg->reg_num < 6)
7833 {
7834 const reg_entry *base = i.index_reg;
7835
7836 i.index_reg = i.base_reg;
7837 i.base_reg = base;
7838 }
7839 ret = i386_index_check (operand_string);
7840 }
64a0c779
DN
7841 }
7842 }
7843
7844 /* Constant and OFFSET expressions are handled by i386_immediate. */
a724f0f4 7845 else if ((intel_parser.op_modifier & (1 << T_OFFSET))
64a0c779
DN
7846 || intel_parser.reg == NULL)
7847 ret = i386_immediate (intel_parser.disp);
a724f0f4
JB
7848
7849 if (intel_parser.next_operand && this_operand >= MAX_OPERANDS - 1)
4eed87de 7850 ret = 0;
a724f0f4
JB
7851 if (!ret || !intel_parser.next_operand)
7852 break;
7853 intel_parser.op_string = intel_parser.next_operand;
7854 this_operand = i.operands++;
64a0c779
DN
7855 }
7856
7857 free (p);
7858 free (intel_parser.disp);
7859
7860 return ret;
7861}
7862
a724f0f4
JB
7863#define NUM_ADDRESS_REGS (!!i.base_reg + !!i.index_reg)
7864
7865/* expr e04 expr'
7866
7867 expr' cmpOp e04 expr'
7868 | Empty */
64a0c779 7869static int
e3bb37b5 7870intel_expr (void)
64a0c779 7871{
a724f0f4
JB
7872 /* XXX Implement the comparison operators. */
7873 return intel_e04 ();
9306ca4a
JB
7874}
7875
a724f0f4 7876/* e04 e05 e04'
9306ca4a 7877
a724f0f4 7878 e04' addOp e05 e04'
9306ca4a
JB
7879 | Empty */
7880static int
e3bb37b5 7881intel_e04 (void)
9306ca4a 7882{
a724f0f4 7883 int nregs = -1;
9306ca4a 7884
a724f0f4 7885 for (;;)
9306ca4a 7886 {
a724f0f4
JB
7887 if (!intel_e05())
7888 return 0;
9306ca4a 7889
a724f0f4
JB
7890 if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
7891 i.base_reg = i386_regtab + REGNAM_AL; /* al is invalid as base */
9306ca4a 7892
a724f0f4
JB
7893 if (cur_token.code == '+')
7894 nregs = -1;
7895 else if (cur_token.code == '-')
7896 nregs = NUM_ADDRESS_REGS;
7897 else
7898 return 1;
64a0c779 7899
a724f0f4
JB
7900 strcat (intel_parser.disp, cur_token.str);
7901 intel_match_token (cur_token.code);
7902 }
64a0c779
DN
7903}
7904
64a0c779
DN
7905/* e05 e06 e05'
7906
9306ca4a 7907 e05' binOp e06 e05'
64a0c779
DN
7908 | Empty */
7909static int
e3bb37b5 7910intel_e05 (void)
64a0c779 7911{
a724f0f4 7912 int nregs = ~NUM_ADDRESS_REGS;
64a0c779 7913
a724f0f4 7914 for (;;)
64a0c779 7915 {
a724f0f4
JB
7916 if (!intel_e06())
7917 return 0;
7918
4eed87de
AM
7919 if (cur_token.code == '&'
7920 || cur_token.code == '|'
7921 || cur_token.code == '^')
a724f0f4
JB
7922 {
7923 char str[2];
7924
7925 str[0] = cur_token.code;
7926 str[1] = 0;
7927 strcat (intel_parser.disp, str);
7928 }
7929 else
7930 break;
9306ca4a 7931
64a0c779
DN
7932 intel_match_token (cur_token.code);
7933
a724f0f4
JB
7934 if (nregs < 0)
7935 nregs = ~nregs;
64a0c779 7936 }
a724f0f4
JB
7937 if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
7938 i.base_reg = i386_regtab + REGNAM_AL + 1; /* cl is invalid as base */
7939 return 1;
4a1805b1 7940}
64a0c779
DN
7941
7942/* e06 e09 e06'
7943
7944 e06' mulOp e09 e06'
b77a7acd 7945 | Empty */
64a0c779 7946static int
e3bb37b5 7947intel_e06 (void)
64a0c779 7948{
a724f0f4 7949 int nregs = ~NUM_ADDRESS_REGS;
64a0c779 7950
a724f0f4 7951 for (;;)
64a0c779 7952 {
a724f0f4
JB
7953 if (!intel_e09())
7954 return 0;
9306ca4a 7955
4eed87de
AM
7956 if (cur_token.code == '*'
7957 || cur_token.code == '/'
7958 || cur_token.code == '%')
a724f0f4
JB
7959 {
7960 char str[2];
9306ca4a 7961
a724f0f4
JB
7962 str[0] = cur_token.code;
7963 str[1] = 0;
7964 strcat (intel_parser.disp, str);
7965 }
7966 else if (cur_token.code == T_SHL)
7967 strcat (intel_parser.disp, "<<");
7968 else if (cur_token.code == T_SHR)
7969 strcat (intel_parser.disp, ">>");
7970 else
7971 break;
9306ca4a 7972
64e74474 7973 intel_match_token (cur_token.code);
64a0c779 7974
a724f0f4
JB
7975 if (nregs < 0)
7976 nregs = ~nregs;
64a0c779 7977 }
a724f0f4
JB
7978 if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
7979 i.base_reg = i386_regtab + REGNAM_AL + 2; /* dl is invalid as base */
7980 return 1;
64a0c779
DN
7981}
7982
a724f0f4
JB
7983/* e09 OFFSET e09
7984 | SHORT e09
7985 | + e09
7986 | - e09
7987 | ~ e09
7988 | NOT e09
9306ca4a
JB
7989 | e10 e09'
7990
64a0c779 7991 e09' PTR e10 e09'
b77a7acd 7992 | : e10 e09'
64a0c779
DN
7993 | Empty */
7994static int
e3bb37b5 7995intel_e09 (void)
64a0c779 7996{
a724f0f4
JB
7997 int nregs = ~NUM_ADDRESS_REGS;
7998 int in_offset = 0;
7999
8000 for (;;)
64a0c779 8001 {
a724f0f4
JB
8002 /* Don't consume constants here. */
8003 if (cur_token.code == '+' || cur_token.code == '-')
8004 {
8005 /* Need to look one token ahead - if the next token
8006 is a constant, the current token is its sign. */
8007 int next_code;
8008
8009 intel_match_token (cur_token.code);
8010 next_code = cur_token.code;
8011 intel_putback_token ();
8012 if (next_code == T_CONST)
8013 break;
8014 }
8015
8016 /* e09 OFFSET e09 */
8017 if (cur_token.code == T_OFFSET)
8018 {
8019 if (!in_offset++)
8020 ++intel_parser.in_offset;
8021 }
8022
8023 /* e09 SHORT e09 */
8024 else if (cur_token.code == T_SHORT)
8025 intel_parser.op_modifier |= 1 << T_SHORT;
8026
8027 /* e09 + e09 */
8028 else if (cur_token.code == '+')
8029 strcat (intel_parser.disp, "+");
8030
8031 /* e09 - e09
8032 | ~ e09
8033 | NOT e09 */
8034 else if (cur_token.code == '-' || cur_token.code == '~')
8035 {
8036 char str[2];
64a0c779 8037
a724f0f4
JB
8038 if (nregs < 0)
8039 nregs = ~nregs;
8040 str[0] = cur_token.code;
8041 str[1] = 0;
8042 strcat (intel_parser.disp, str);
8043 }
8044
8045 /* e09 e10 e09' */
8046 else
8047 break;
8048
8049 intel_match_token (cur_token.code);
64a0c779
DN
8050 }
8051
a724f0f4 8052 for (;;)
9306ca4a 8053 {
a724f0f4
JB
8054 if (!intel_e10 ())
8055 return 0;
9306ca4a 8056
a724f0f4
JB
8057 /* e09' PTR e10 e09' */
8058 if (cur_token.code == T_PTR)
8059 {
8060 char suffix;
9306ca4a 8061
a724f0f4
JB
8062 if (prev_token.code == T_BYTE)
8063 suffix = BYTE_MNEM_SUFFIX;
9306ca4a 8064
a724f0f4
JB
8065 else if (prev_token.code == T_WORD)
8066 {
8067 if (current_templates->start->name[0] == 'l'
8068 && current_templates->start->name[2] == 's'
8069 && current_templates->start->name[3] == 0)
8070 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
8071 else if (intel_parser.got_a_float == 2) /* "fi..." */
8072 suffix = SHORT_MNEM_SUFFIX;
8073 else
8074 suffix = WORD_MNEM_SUFFIX;
8075 }
64a0c779 8076
a724f0f4
JB
8077 else if (prev_token.code == T_DWORD)
8078 {
8079 if (current_templates->start->name[0] == 'l'
8080 && current_templates->start->name[2] == 's'
8081 && current_templates->start->name[3] == 0)
8082 suffix = WORD_MNEM_SUFFIX;
8083 else if (flag_code == CODE_16BIT
40fb9820
L
8084 && (current_templates->start->opcode_modifier.jump
8085 || current_templates->start->opcode_modifier.jumpdword))
a724f0f4
JB
8086 suffix = LONG_DOUBLE_MNEM_SUFFIX;
8087 else if (intel_parser.got_a_float == 1) /* "f..." */
8088 suffix = SHORT_MNEM_SUFFIX;
8089 else
8090 suffix = LONG_MNEM_SUFFIX;
8091 }
9306ca4a 8092
a724f0f4
JB
8093 else if (prev_token.code == T_FWORD)
8094 {
8095 if (current_templates->start->name[0] == 'l'
8096 && current_templates->start->name[2] == 's'
8097 && current_templates->start->name[3] == 0)
8098 suffix = LONG_MNEM_SUFFIX;
8099 else if (!intel_parser.got_a_float)
8100 {
8101 if (flag_code == CODE_16BIT)
8102 add_prefix (DATA_PREFIX_OPCODE);
8103 suffix = LONG_DOUBLE_MNEM_SUFFIX;
8104 }
8105 else
8106 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
8107 }
64a0c779 8108
a724f0f4
JB
8109 else if (prev_token.code == T_QWORD)
8110 {
8111 if (intel_parser.got_a_float == 1) /* "f..." */
8112 suffix = LONG_MNEM_SUFFIX;
8113 else
8114 suffix = QWORD_MNEM_SUFFIX;
8115 }
64a0c779 8116
a724f0f4
JB
8117 else if (prev_token.code == T_TBYTE)
8118 {
8119 if (intel_parser.got_a_float == 1)
8120 suffix = LONG_DOUBLE_MNEM_SUFFIX;
8121 else
8122 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
8123 }
9306ca4a 8124
a724f0f4 8125 else if (prev_token.code == T_XMMWORD)
9306ca4a 8126 {
582d5edd 8127 suffix = XMMWORD_MNEM_SUFFIX;
9306ca4a 8128 }
64a0c779 8129
f16b83df 8130 else
a724f0f4
JB
8131 {
8132 as_bad (_("Unknown operand modifier `%s'"), prev_token.str);
8133 return 0;
8134 }
8135
435acd52
JB
8136 /* Operands for jump/call using 'ptr' notation denote absolute
8137 addresses. */
40fb9820
L
8138 if (current_templates->start->opcode_modifier.jump
8139 || current_templates->start->opcode_modifier.jumpdword)
8140 i.types[this_operand].bitfield.jumpabsolute = 1;
435acd52 8141
a724f0f4
JB
8142 if (current_templates->start->base_opcode == 0x8d /* lea */)
8143 ;
8144 else if (!i.suffix)
8145 i.suffix = suffix;
8146 else if (i.suffix != suffix)
8147 {
8148 as_bad (_("Conflicting operand modifiers"));
8149 return 0;
8150 }
64a0c779 8151
9306ca4a
JB
8152 }
8153
a724f0f4
JB
8154 /* e09' : e10 e09' */
8155 else if (cur_token.code == ':')
9306ca4a 8156 {
a724f0f4
JB
8157 if (prev_token.code != T_REG)
8158 {
8159 /* While {call,jmp} SSSS:OOOO is MASM syntax only when SSSS is a
8160 segment/group identifier (which we don't have), using comma
8161 as the operand separator there is even less consistent, since
8162 there all branches only have a single operand. */
8163 if (this_operand != 0
8164 || intel_parser.in_offset
8165 || intel_parser.in_bracket
40fb9820
L
8166 || (!current_templates->start->opcode_modifier.jump
8167 && !current_templates->start->opcode_modifier.jumpdword
8168 && !current_templates->start->opcode_modifier.jumpintersegment
8169 && !current_templates->start->operand_types[0].bitfield.jumpabsolute))
a724f0f4
JB
8170 return intel_match_token (T_NIL);
8171 /* Remember the start of the 2nd operand and terminate 1st
8172 operand here.
8173 XXX This isn't right, yet (when SSSS:OOOO is right operand of
8174 another expression), but it gets at least the simplest case
8175 (a plain number or symbol on the left side) right. */
8176 intel_parser.next_operand = intel_parser.op_string;
8177 *--intel_parser.op_string = '\0';
8178 return intel_match_token (':');
8179 }
9306ca4a 8180 }
64a0c779 8181
a724f0f4 8182 /* e09' Empty */
64a0c779 8183 else
a724f0f4 8184 break;
64a0c779 8185
a724f0f4
JB
8186 intel_match_token (cur_token.code);
8187
8188 }
8189
8190 if (in_offset)
8191 {
8192 --intel_parser.in_offset;
8193 if (nregs < 0)
8194 nregs = ~nregs;
8195 if (NUM_ADDRESS_REGS > nregs)
9306ca4a 8196 {
a724f0f4 8197 as_bad (_("Invalid operand to `OFFSET'"));
9306ca4a
JB
8198 return 0;
8199 }
a724f0f4
JB
8200 intel_parser.op_modifier |= 1 << T_OFFSET;
8201 }
9306ca4a 8202
a724f0f4
JB
8203 if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
8204 i.base_reg = i386_regtab + REGNAM_AL + 3; /* bl is invalid as base */
8205 return 1;
8206}
64a0c779 8207
a724f0f4 8208static int
e3bb37b5 8209intel_bracket_expr (void)
a724f0f4
JB
8210{
8211 int was_offset = intel_parser.op_modifier & (1 << T_OFFSET);
8212 const char *start = intel_parser.op_string;
8213 int len;
8214
8215 if (i.op[this_operand].regs)
8216 return intel_match_token (T_NIL);
8217
8218 intel_match_token ('[');
8219
8220 /* Mark as a memory operand only if it's not already known to be an
8221 offset expression. If it's an offset expression, we need to keep
8222 the brace in. */
8223 if (!intel_parser.in_offset)
8224 {
8225 ++intel_parser.in_bracket;
435acd52
JB
8226
8227 /* Operands for jump/call inside brackets denote absolute addresses. */
40fb9820
L
8228 if (current_templates->start->opcode_modifier.jump
8229 || current_templates->start->opcode_modifier.jumpdword)
8230 i.types[this_operand].bitfield.jumpabsolute = 1;
435acd52 8231
a724f0f4
JB
8232 /* Unfortunately gas always diverged from MASM in a respect that can't
8233 be easily fixed without risking to break code sequences likely to be
8234 encountered (the testsuite even check for this): MASM doesn't consider
8235 an expression inside brackets unconditionally as a memory reference.
8236 When that is e.g. a constant, an offset expression, or the sum of the
8237 two, this is still taken as a constant load. gas, however, always
8238 treated these as memory references. As a compromise, we'll try to make
8239 offset expressions inside brackets work the MASM way (since that's
8240 less likely to be found in real world code), but make constants alone
8241 continue to work the traditional gas way. In either case, issue a
8242 warning. */
8243 intel_parser.op_modifier &= ~was_offset;
64a0c779 8244 }
a724f0f4 8245 else
64e74474 8246 strcat (intel_parser.disp, "[");
a724f0f4
JB
8247
8248 /* Add a '+' to the displacement string if necessary. */
8249 if (*intel_parser.disp != '\0'
8250 && *(intel_parser.disp + strlen (intel_parser.disp) - 1) != '+')
8251 strcat (intel_parser.disp, "+");
64a0c779 8252
a724f0f4
JB
8253 if (intel_expr ()
8254 && (len = intel_parser.op_string - start - 1,
8255 intel_match_token (']')))
64a0c779 8256 {
a724f0f4
JB
8257 /* Preserve brackets when the operand is an offset expression. */
8258 if (intel_parser.in_offset)
8259 strcat (intel_parser.disp, "]");
8260 else
8261 {
8262 --intel_parser.in_bracket;
8263 if (i.base_reg || i.index_reg)
8264 intel_parser.is_mem = 1;
8265 if (!intel_parser.is_mem)
8266 {
8267 if (!(intel_parser.op_modifier & (1 << T_OFFSET)))
8268 /* Defer the warning until all of the operand was parsed. */
8269 intel_parser.is_mem = -1;
8270 else if (!quiet_warnings)
4eed87de
AM
8271 as_warn (_("`[%.*s]' taken to mean just `%.*s'"),
8272 len, start, len, start);
a724f0f4
JB
8273 }
8274 }
8275 intel_parser.op_modifier |= was_offset;
64a0c779 8276
a724f0f4 8277 return 1;
64a0c779 8278 }
a724f0f4 8279 return 0;
64a0c779
DN
8280}
8281
8282/* e10 e11 e10'
8283
8284 e10' [ expr ] e10'
b77a7acd 8285 | Empty */
64a0c779 8286static int
e3bb37b5 8287intel_e10 (void)
64a0c779 8288{
a724f0f4
JB
8289 if (!intel_e11 ())
8290 return 0;
64a0c779 8291
a724f0f4 8292 while (cur_token.code == '[')
64a0c779 8293 {
a724f0f4 8294 if (!intel_bracket_expr ())
21d6c4af 8295 return 0;
64a0c779
DN
8296 }
8297
a724f0f4 8298 return 1;
64a0c779
DN
8299}
8300
64a0c779 8301/* e11 ( expr )
b77a7acd 8302 | [ expr ]
64a0c779
DN
8303 | BYTE
8304 | WORD
8305 | DWORD
9306ca4a 8306 | FWORD
64a0c779 8307 | QWORD
9306ca4a
JB
8308 | TBYTE
8309 | OWORD
8310 | XMMWORD
4a1805b1 8311 | $
64a0c779
DN
8312 | .
8313 | register
8314 | id
8315 | constant */
8316static int
e3bb37b5 8317intel_e11 (void)
64a0c779 8318{
a724f0f4 8319 switch (cur_token.code)
64a0c779 8320 {
a724f0f4
JB
8321 /* e11 ( expr ) */
8322 case '(':
64a0c779
DN
8323 intel_match_token ('(');
8324 strcat (intel_parser.disp, "(");
8325
8326 if (intel_expr () && intel_match_token (')'))
e5cb08ac
KH
8327 {
8328 strcat (intel_parser.disp, ")");
8329 return 1;
8330 }
a724f0f4 8331 return 0;
4a1805b1 8332
a724f0f4
JB
8333 /* e11 [ expr ] */
8334 case '[':
a724f0f4 8335 return intel_bracket_expr ();
64a0c779 8336
a724f0f4
JB
8337 /* e11 $
8338 | . */
8339 case '.':
64a0c779
DN
8340 strcat (intel_parser.disp, cur_token.str);
8341 intel_match_token (cur_token.code);
21d6c4af
DN
8342
8343 /* Mark as a memory operand only if it's not already known to be an
8344 offset expression. */
a724f0f4 8345 if (!intel_parser.in_offset)
21d6c4af 8346 intel_parser.is_mem = 1;
64a0c779
DN
8347
8348 return 1;
64a0c779 8349
a724f0f4
JB
8350 /* e11 register */
8351 case T_REG:
8352 {
8353 const reg_entry *reg = intel_parser.reg = cur_token.reg;
64a0c779 8354
a724f0f4 8355 intel_match_token (T_REG);
64a0c779 8356
a724f0f4
JB
8357 /* Check for segment change. */
8358 if (cur_token.code == ':')
8359 {
40fb9820
L
8360 if (!reg->reg_type.bitfield.sreg2
8361 && !reg->reg_type.bitfield.sreg3)
a724f0f4 8362 {
4eed87de
AM
8363 as_bad (_("`%s' is not a valid segment register"),
8364 reg->reg_name);
a724f0f4
JB
8365 return 0;
8366 }
8367 else if (i.seg[i.mem_operands])
8368 as_warn (_("Extra segment override ignored"));
8369 else
8370 {
8371 if (!intel_parser.in_offset)
8372 intel_parser.is_mem = 1;
8373 switch (reg->reg_num)
8374 {
8375 case 0:
8376 i.seg[i.mem_operands] = &es;
8377 break;
8378 case 1:
8379 i.seg[i.mem_operands] = &cs;
8380 break;
8381 case 2:
8382 i.seg[i.mem_operands] = &ss;
8383 break;
8384 case 3:
8385 i.seg[i.mem_operands] = &ds;
8386 break;
8387 case 4:
8388 i.seg[i.mem_operands] = &fs;
8389 break;
8390 case 5:
8391 i.seg[i.mem_operands] = &gs;
8392 break;
8393 }
8394 }
8395 }
64a0c779 8396
a724f0f4
JB
8397 /* Not a segment register. Check for register scaling. */
8398 else if (cur_token.code == '*')
8399 {
8400 if (!intel_parser.in_bracket)
8401 {
8402 as_bad (_("Register scaling only allowed in memory operands"));
8403 return 0;
8404 }
64a0c779 8405
40fb9820 8406 if (reg->reg_type.bitfield.reg16) /* Disallow things like [si*1]. */
a724f0f4
JB
8407 reg = i386_regtab + REGNAM_AX + 4; /* sp is invalid as index */
8408 else if (i.index_reg)
8409 reg = i386_regtab + REGNAM_EAX + 4; /* esp is invalid as index */
64a0c779 8410
a724f0f4
JB
8411 /* What follows must be a valid scale. */
8412 intel_match_token ('*');
8413 i.index_reg = reg;
40fb9820 8414 i.types[this_operand].bitfield.baseindex = 1;
64a0c779 8415
a724f0f4
JB
8416 /* Set the scale after setting the register (otherwise,
8417 i386_scale will complain) */
8418 if (cur_token.code == '+' || cur_token.code == '-')
8419 {
8420 char *str, sign = cur_token.code;
8421 intel_match_token (cur_token.code);
8422 if (cur_token.code != T_CONST)
8423 {
8424 as_bad (_("Syntax error: Expecting a constant, got `%s'"),
8425 cur_token.str);
8426 return 0;
8427 }
8428 str = (char *) xmalloc (strlen (cur_token.str) + 2);
8429 strcpy (str + 1, cur_token.str);
8430 *str = sign;
8431 if (!i386_scale (str))
8432 return 0;
8433 free (str);
8434 }
8435 else if (!i386_scale (cur_token.str))
64a0c779 8436 return 0;
a724f0f4
JB
8437 intel_match_token (cur_token.code);
8438 }
64a0c779 8439
a724f0f4
JB
8440 /* No scaling. If this is a memory operand, the register is either a
8441 base register (first occurrence) or an index register (second
8442 occurrence). */
7b0441f6 8443 else if (intel_parser.in_bracket)
a724f0f4 8444 {
64a0c779 8445
a724f0f4
JB
8446 if (!i.base_reg)
8447 i.base_reg = reg;
8448 else if (!i.index_reg)
8449 i.index_reg = reg;
8450 else
8451 {
8452 as_bad (_("Too many register references in memory operand"));
8453 return 0;
8454 }
64a0c779 8455
40fb9820 8456 i.types[this_operand].bitfield.baseindex = 1;
a724f0f4 8457 }
4a1805b1 8458
4d1bb795
JB
8459 /* It's neither base nor index. */
8460 else if (!intel_parser.in_offset && !intel_parser.is_mem)
a724f0f4 8461 {
40fb9820
L
8462 i386_operand_type temp = reg->reg_type;
8463 temp.bitfield.baseindex = 0;
c6fb90c8
L
8464 i.types[this_operand] = operand_type_or (i.types[this_operand],
8465 temp);
a724f0f4
JB
8466 i.op[this_operand].regs = reg;
8467 i.reg_operands++;
8468 }
8469 else
8470 {
8471 as_bad (_("Invalid use of register"));
8472 return 0;
8473 }
64a0c779 8474
a724f0f4
JB
8475 /* Since registers are not part of the displacement string (except
8476 when we're parsing offset operands), we may need to remove any
8477 preceding '+' from the displacement string. */
8478 if (*intel_parser.disp != '\0'
8479 && !intel_parser.in_offset)
8480 {
8481 char *s = intel_parser.disp;
8482 s += strlen (s) - 1;
8483 if (*s == '+')
8484 *s = '\0';
8485 }
4a1805b1 8486
a724f0f4
JB
8487 return 1;
8488 }
8489
8490 /* e11 BYTE
8491 | WORD
8492 | DWORD
8493 | FWORD
8494 | QWORD
8495 | TBYTE
8496 | OWORD
8497 | XMMWORD */
8498 case T_BYTE:
8499 case T_WORD:
8500 case T_DWORD:
8501 case T_FWORD:
8502 case T_QWORD:
8503 case T_TBYTE:
8504 case T_XMMWORD:
8505 intel_match_token (cur_token.code);
64a0c779 8506
a724f0f4
JB
8507 if (cur_token.code == T_PTR)
8508 return 1;
8509
8510 /* It must have been an identifier. */
8511 intel_putback_token ();
8512 cur_token.code = T_ID;
8513 /* FALLTHRU */
8514
8515 /* e11 id
8516 | constant */
8517 case T_ID:
8518 if (!intel_parser.in_offset && intel_parser.is_mem <= 0)
9306ca4a
JB
8519 {
8520 symbolS *symbolP;
8521
a724f0f4
JB
8522 /* The identifier represents a memory reference only if it's not
8523 preceded by an offset modifier and if it's not an equate. */
9306ca4a
JB
8524 symbolP = symbol_find(cur_token.str);
8525 if (!symbolP || S_GET_SEGMENT(symbolP) != absolute_section)
8526 intel_parser.is_mem = 1;
8527 }
a724f0f4 8528 /* FALLTHRU */
64a0c779 8529
a724f0f4
JB
8530 case T_CONST:
8531 case '-':
8532 case '+':
8533 {
8534 char *save_str, sign = 0;
64a0c779 8535
a724f0f4
JB
8536 /* Allow constants that start with `+' or `-'. */
8537 if (cur_token.code == '-' || cur_token.code == '+')
8538 {
8539 sign = cur_token.code;
8540 intel_match_token (cur_token.code);
8541 if (cur_token.code != T_CONST)
8542 {
8543 as_bad (_("Syntax error: Expecting a constant, got `%s'"),
8544 cur_token.str);
8545 return 0;
8546 }
8547 }
64a0c779 8548
a724f0f4
JB
8549 save_str = (char *) xmalloc (strlen (cur_token.str) + 2);
8550 strcpy (save_str + !!sign, cur_token.str);
8551 if (sign)
8552 *save_str = sign;
64a0c779 8553
a724f0f4
JB
8554 /* Get the next token to check for register scaling. */
8555 intel_match_token (cur_token.code);
64a0c779 8556
4eed87de
AM
8557 /* Check if this constant is a scaling factor for an
8558 index register. */
a724f0f4
JB
8559 if (cur_token.code == '*')
8560 {
8561 if (intel_match_token ('*') && cur_token.code == T_REG)
8562 {
8563 const reg_entry *reg = cur_token.reg;
8564
8565 if (!intel_parser.in_bracket)
8566 {
4eed87de
AM
8567 as_bad (_("Register scaling only allowed "
8568 "in memory operands"));
a724f0f4
JB
8569 return 0;
8570 }
8571
4eed87de
AM
8572 /* Disallow things like [1*si].
8573 sp and esp are invalid as index. */
40fb9820 8574 if (reg->reg_type.bitfield.reg16)
4eed87de 8575 reg = i386_regtab + REGNAM_AX + 4;
a724f0f4 8576 else if (i.index_reg)
4eed87de 8577 reg = i386_regtab + REGNAM_EAX + 4;
a724f0f4
JB
8578
8579 /* The constant is followed by `* reg', so it must be
8580 a valid scale. */
8581 i.index_reg = reg;
40fb9820 8582 i.types[this_operand].bitfield.baseindex = 1;
a724f0f4
JB
8583
8584 /* Set the scale after setting the register (otherwise,
8585 i386_scale will complain) */
8586 if (!i386_scale (save_str))
64a0c779 8587 return 0;
a724f0f4
JB
8588 intel_match_token (T_REG);
8589
8590 /* Since registers are not part of the displacement
8591 string, we may need to remove any preceding '+' from
8592 the displacement string. */
8593 if (*intel_parser.disp != '\0')
8594 {
8595 char *s = intel_parser.disp;
8596 s += strlen (s) - 1;
8597 if (*s == '+')
8598 *s = '\0';
8599 }
8600
8601 free (save_str);
8602
8603 return 1;
8604 }
64a0c779 8605
a724f0f4
JB
8606 /* The constant was not used for register scaling. Since we have
8607 already consumed the token following `*' we now need to put it
8608 back in the stream. */
64a0c779 8609 intel_putback_token ();
a724f0f4 8610 }
64a0c779 8611
a724f0f4
JB
8612 /* Add the constant to the displacement string. */
8613 strcat (intel_parser.disp, save_str);
8614 free (save_str);
64a0c779 8615
a724f0f4
JB
8616 return 1;
8617 }
64a0c779
DN
8618 }
8619
64a0c779
DN
8620 as_bad (_("Unrecognized token '%s'"), cur_token.str);
8621 return 0;
8622}
8623
64a0c779
DN
8624/* Match the given token against cur_token. If they match, read the next
8625 token from the operand string. */
8626static int
e3bb37b5 8627intel_match_token (int code)
64a0c779
DN
8628{
8629 if (cur_token.code == code)
8630 {
8631 intel_get_token ();
8632 return 1;
8633 }
8634 else
8635 {
0477af35 8636 as_bad (_("Unexpected token `%s'"), cur_token.str);
64a0c779
DN
8637 return 0;
8638 }
8639}
8640
64a0c779
DN
8641/* Read a new token from intel_parser.op_string and store it in cur_token. */
8642static void
e3bb37b5 8643intel_get_token (void)
64a0c779
DN
8644{
8645 char *end_op;
8646 const reg_entry *reg;
8647 struct intel_token new_token;
8648
8649 new_token.code = T_NIL;
8650 new_token.reg = NULL;
8651 new_token.str = NULL;
8652
4a1805b1 8653 /* Free the memory allocated to the previous token and move
64a0c779
DN
8654 cur_token to prev_token. */
8655 if (prev_token.str)
8656 free (prev_token.str);
8657
8658 prev_token = cur_token;
8659
8660 /* Skip whitespace. */
8661 while (is_space_char (*intel_parser.op_string))
8662 intel_parser.op_string++;
8663
8664 /* Return an empty token if we find nothing else on the line. */
8665 if (*intel_parser.op_string == '\0')
8666 {
8667 cur_token = new_token;
8668 return;
8669 }
8670
8671 /* The new token cannot be larger than the remainder of the operand
8672 string. */
a724f0f4 8673 new_token.str = (char *) xmalloc (strlen (intel_parser.op_string) + 1);
64a0c779
DN
8674 new_token.str[0] = '\0';
8675
8676 if (strchr ("0123456789", *intel_parser.op_string))
8677 {
8678 char *p = new_token.str;
8679 char *q = intel_parser.op_string;
8680 new_token.code = T_CONST;
8681
8682 /* Allow any kind of identifier char to encompass floating point and
8683 hexadecimal numbers. */
8684 while (is_identifier_char (*q))
8685 *p++ = *q++;
8686 *p = '\0';
8687
8688 /* Recognize special symbol names [0-9][bf]. */
8689 if (strlen (intel_parser.op_string) == 2
4a1805b1 8690 && (intel_parser.op_string[1] == 'b'
64a0c779
DN
8691 || intel_parser.op_string[1] == 'f'))
8692 new_token.code = T_ID;
8693 }
8694
4d1bb795 8695 else if ((reg = parse_register (intel_parser.op_string, &end_op)) != NULL)
64a0c779 8696 {
4d1bb795
JB
8697 size_t len = end_op - intel_parser.op_string;
8698
64a0c779
DN
8699 new_token.code = T_REG;
8700 new_token.reg = reg;
8701
4d1bb795
JB
8702 memcpy (new_token.str, intel_parser.op_string, len);
8703 new_token.str[len] = '\0';
64a0c779
DN
8704 }
8705
8706 else if (is_identifier_char (*intel_parser.op_string))
8707 {
8708 char *p = new_token.str;
8709 char *q = intel_parser.op_string;
8710
8711 /* A '.' or '$' followed by an identifier char is an identifier.
8712 Otherwise, it's operator '.' followed by an expression. */
8713 if ((*q == '.' || *q == '$') && !is_identifier_char (*(q + 1)))
8714 {
9306ca4a
JB
8715 new_token.code = '.';
8716 new_token.str[0] = '.';
64a0c779
DN
8717 new_token.str[1] = '\0';
8718 }
8719 else
8720 {
8721 while (is_identifier_char (*q) || *q == '@')
8722 *p++ = *q++;
8723 *p = '\0';
8724
9306ca4a
JB
8725 if (strcasecmp (new_token.str, "NOT") == 0)
8726 new_token.code = '~';
8727
8728 else if (strcasecmp (new_token.str, "MOD") == 0)
8729 new_token.code = '%';
8730
8731 else if (strcasecmp (new_token.str, "AND") == 0)
8732 new_token.code = '&';
8733
8734 else if (strcasecmp (new_token.str, "OR") == 0)
8735 new_token.code = '|';
8736
8737 else if (strcasecmp (new_token.str, "XOR") == 0)
8738 new_token.code = '^';
8739
8740 else if (strcasecmp (new_token.str, "SHL") == 0)
8741 new_token.code = T_SHL;
8742
8743 else if (strcasecmp (new_token.str, "SHR") == 0)
8744 new_token.code = T_SHR;
8745
8746 else if (strcasecmp (new_token.str, "BYTE") == 0)
64a0c779
DN
8747 new_token.code = T_BYTE;
8748
8749 else if (strcasecmp (new_token.str, "WORD") == 0)
8750 new_token.code = T_WORD;
8751
8752 else if (strcasecmp (new_token.str, "DWORD") == 0)
8753 new_token.code = T_DWORD;
8754
9306ca4a
JB
8755 else if (strcasecmp (new_token.str, "FWORD") == 0)
8756 new_token.code = T_FWORD;
8757
64a0c779
DN
8758 else if (strcasecmp (new_token.str, "QWORD") == 0)
8759 new_token.code = T_QWORD;
8760
9306ca4a
JB
8761 else if (strcasecmp (new_token.str, "TBYTE") == 0
8762 /* XXX remove (gcc still uses it) */
8763 || strcasecmp (new_token.str, "XWORD") == 0)
8764 new_token.code = T_TBYTE;
8765
8766 else if (strcasecmp (new_token.str, "XMMWORD") == 0
8767 || strcasecmp (new_token.str, "OWORD") == 0)
8768 new_token.code = T_XMMWORD;
64a0c779
DN
8769
8770 else if (strcasecmp (new_token.str, "PTR") == 0)
8771 new_token.code = T_PTR;
8772
8773 else if (strcasecmp (new_token.str, "SHORT") == 0)
8774 new_token.code = T_SHORT;
8775
8776 else if (strcasecmp (new_token.str, "OFFSET") == 0)
8777 {
8778 new_token.code = T_OFFSET;
8779
8780 /* ??? This is not mentioned in the MASM grammar but gcc
8781 makes use of it with -mintel-syntax. OFFSET may be
8782 followed by FLAT: */
8783 if (strncasecmp (q, " FLAT:", 6) == 0)
8784 strcat (new_token.str, " FLAT:");
8785 }
8786
8787 /* ??? This is not mentioned in the MASM grammar. */
8788 else if (strcasecmp (new_token.str, "FLAT") == 0)
a724f0f4
JB
8789 {
8790 new_token.code = T_OFFSET;
8791 if (*q == ':')
8792 strcat (new_token.str, ":");
8793 else
8794 as_bad (_("`:' expected"));
8795 }
64a0c779
DN
8796
8797 else
8798 new_token.code = T_ID;
8799 }
8800 }
8801
9306ca4a
JB
8802 else if (strchr ("+-/*%|&^:[]()~", *intel_parser.op_string))
8803 {
8804 new_token.code = *intel_parser.op_string;
8805 new_token.str[0] = *intel_parser.op_string;
8806 new_token.str[1] = '\0';
8807 }
8808
8809 else if (strchr ("<>", *intel_parser.op_string)
8810 && *intel_parser.op_string == *(intel_parser.op_string + 1))
8811 {
8812 new_token.code = *intel_parser.op_string == '<' ? T_SHL : T_SHR;
8813 new_token.str[0] = *intel_parser.op_string;
8814 new_token.str[1] = *intel_parser.op_string;
8815 new_token.str[2] = '\0';
8816 }
8817
64a0c779 8818 else
0477af35 8819 as_bad (_("Unrecognized token `%s'"), intel_parser.op_string);
64a0c779
DN
8820
8821 intel_parser.op_string += strlen (new_token.str);
8822 cur_token = new_token;
8823}
8824
64a0c779
DN
8825/* Put cur_token back into the token stream and make cur_token point to
8826 prev_token. */
8827static void
e3bb37b5 8828intel_putback_token (void)
64a0c779 8829{
a724f0f4
JB
8830 if (cur_token.code != T_NIL)
8831 {
8832 intel_parser.op_string -= strlen (cur_token.str);
8833 free (cur_token.str);
8834 }
64a0c779 8835 cur_token = prev_token;
4a1805b1 8836
64a0c779
DN
8837 /* Forget prev_token. */
8838 prev_token.code = T_NIL;
8839 prev_token.reg = NULL;
8840 prev_token.str = NULL;
8841}
54cfded0 8842
a4447b93 8843int
1df69f4f 8844tc_x86_regname_to_dw2regnum (char *regname)
54cfded0
AM
8845{
8846 unsigned int regnum;
8847 unsigned int regnames_count;
089dfecd 8848 static const char *const regnames_32[] =
54cfded0 8849 {
a4447b93
RH
8850 "eax", "ecx", "edx", "ebx",
8851 "esp", "ebp", "esi", "edi",
089dfecd
JB
8852 "eip", "eflags", NULL,
8853 "st0", "st1", "st2", "st3",
8854 "st4", "st5", "st6", "st7",
8855 NULL, NULL,
8856 "xmm0", "xmm1", "xmm2", "xmm3",
8857 "xmm4", "xmm5", "xmm6", "xmm7",
8858 "mm0", "mm1", "mm2", "mm3",
43fd16e4
JB
8859 "mm4", "mm5", "mm6", "mm7",
8860 "fcw", "fsw", "mxcsr",
8861 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
8862 "tr", "ldtr"
54cfded0 8863 };
089dfecd 8864 static const char *const regnames_64[] =
54cfded0 8865 {
089dfecd
JB
8866 "rax", "rdx", "rcx", "rbx",
8867 "rsi", "rdi", "rbp", "rsp",
8868 "r8", "r9", "r10", "r11",
54cfded0 8869 "r12", "r13", "r14", "r15",
089dfecd
JB
8870 "rip",
8871 "xmm0", "xmm1", "xmm2", "xmm3",
8872 "xmm4", "xmm5", "xmm6", "xmm7",
8873 "xmm8", "xmm9", "xmm10", "xmm11",
8874 "xmm12", "xmm13", "xmm14", "xmm15",
8875 "st0", "st1", "st2", "st3",
8876 "st4", "st5", "st6", "st7",
8877 "mm0", "mm1", "mm2", "mm3",
43fd16e4
JB
8878 "mm4", "mm5", "mm6", "mm7",
8879 "rflags",
8880 "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
8881 "fs.base", "gs.base", NULL, NULL,
8882 "tr", "ldtr",
8883 "mxcsr", "fcw", "fsw"
54cfded0 8884 };
089dfecd 8885 const char *const *regnames;
54cfded0
AM
8886
8887 if (flag_code == CODE_64BIT)
8888 {
8889 regnames = regnames_64;
0cea6190 8890 regnames_count = ARRAY_SIZE (regnames_64);
54cfded0
AM
8891 }
8892 else
8893 {
8894 regnames = regnames_32;
0cea6190 8895 regnames_count = ARRAY_SIZE (regnames_32);
54cfded0
AM
8896 }
8897
8898 for (regnum = 0; regnum < regnames_count; regnum++)
089dfecd
JB
8899 if (regnames[regnum] != NULL
8900 && strcmp (regname, regnames[regnum]) == 0)
54cfded0
AM
8901 return regnum;
8902
54cfded0
AM
8903 return -1;
8904}
8905
8906void
8907tc_x86_frame_initial_instructions (void)
8908{
a4447b93
RH
8909 static unsigned int sp_regno;
8910
8911 if (!sp_regno)
8912 sp_regno = tc_x86_regname_to_dw2regnum (flag_code == CODE_64BIT
8913 ? "rsp" : "esp");
8914
8915 cfi_add_CFA_def_cfa (sp_regno, -x86_cie_data_alignment);
8916 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 8917}
d2b2c203
DJ
8918
8919int
8920i386_elf_section_type (const char *str, size_t len)
8921{
8922 if (flag_code == CODE_64BIT
8923 && len == sizeof ("unwind") - 1
8924 && strncmp (str, "unwind", 6) == 0)
8925 return SHT_X86_64_UNWIND;
8926
8927 return -1;
8928}
bb41ade5
AM
8929
8930#ifdef TE_PE
8931void
8932tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
8933{
8934 expressionS expr;
8935
8936 expr.X_op = O_secrel;
8937 expr.X_add_symbol = symbol;
8938 expr.X_add_number = 0;
8939 emit_expr (&expr, size);
8940}
8941#endif
3b22753a
L
8942
8943#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8944/* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
8945
8946int
8947x86_64_section_letter (int letter, char **ptr_msg)
8948{
8949 if (flag_code == CODE_64BIT)
8950 {
8951 if (letter == 'l')
8952 return SHF_X86_64_LARGE;
8953
8954 *ptr_msg = _("Bad .section directive: want a,l,w,x,M,S,G,T in string");
64e74474 8955 }
3b22753a 8956 else
64e74474 8957 *ptr_msg = _("Bad .section directive: want a,w,x,M,S,G,T in string");
3b22753a
L
8958 return -1;
8959}
8960
8961int
8962x86_64_section_word (char *str, size_t len)
8963{
8620418b 8964 if (len == 5 && flag_code == CODE_64BIT && CONST_STRNEQ (str, "large"))
3b22753a
L
8965 return SHF_X86_64_LARGE;
8966
8967 return -1;
8968}
8969
8970static void
8971handle_large_common (int small ATTRIBUTE_UNUSED)
8972{
8973 if (flag_code != CODE_64BIT)
8974 {
8975 s_comm_internal (0, elf_common_parse);
8976 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
8977 }
8978 else
8979 {
8980 static segT lbss_section;
8981 asection *saved_com_section_ptr = elf_com_section_ptr;
8982 asection *saved_bss_section = bss_section;
8983
8984 if (lbss_section == NULL)
8985 {
8986 flagword applicable;
8987 segT seg = now_seg;
8988 subsegT subseg = now_subseg;
8989
8990 /* The .lbss section is for local .largecomm symbols. */
8991 lbss_section = subseg_new (".lbss", 0);
8992 applicable = bfd_applicable_section_flags (stdoutput);
8993 bfd_set_section_flags (stdoutput, lbss_section,
8994 applicable & SEC_ALLOC);
8995 seg_info (lbss_section)->bss = 1;
8996
8997 subseg_set (seg, subseg);
8998 }
8999
9000 elf_com_section_ptr = &_bfd_elf_large_com_section;
9001 bss_section = lbss_section;
9002
9003 s_comm_internal (0, elf_common_parse);
9004
9005 elf_com_section_ptr = saved_com_section_ptr;
9006 bss_section = saved_bss_section;
9007 }
9008}
9009#endif /* OBJ_ELF || OBJ_MAYBE_ELF */
This page took 1.240967 seconds and 4 git commands to generate.