include/opcode/
[deliverable/binutils-gdb.git] / gas / config / tc-i386.c
CommitLineData
252b5132 1/* i386.c -- Assemble code for the Intel 80386
f7e42eb4 2 Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
aef6203b 3 2000, 2001, 2002, 2003, 2004, 2005
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
10 the Free Software Foundation; either version 2, or (at your option)
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"
252b5132 35#include "opcode/i386.h"
d2b2c203 36#include "elf/x86-64.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
252b5132
RH
46#ifndef SCALE1_WHEN_NO_INDEX
47/* Specifying a scale factor besides 1 when there is no index is
48 futile. eg. `mov (%ebx,2),%al' does exactly the same as
49 `mov (%ebx),%al'. To slavishly follow what the programmer
50 specified, set SCALE1_WHEN_NO_INDEX to 0. */
51#define SCALE1_WHEN_NO_INDEX 1
52#endif
53
29b0f896
AM
54#ifndef DEFAULT_ARCH
55#define DEFAULT_ARCH "i386"
246fcdee 56#endif
252b5132 57
edde18a5
AM
58#ifndef INLINE
59#if __GNUC__ >= 2
60#define INLINE __inline__
61#else
62#define INLINE
63#endif
64#endif
65
29b0f896
AM
66static INLINE unsigned int mode_from_disp_size PARAMS ((unsigned int));
67static INLINE int fits_in_signed_byte PARAMS ((offsetT));
68static INLINE int fits_in_unsigned_byte PARAMS ((offsetT));
69static INLINE int fits_in_unsigned_word PARAMS ((offsetT));
70static INLINE int fits_in_signed_word PARAMS ((offsetT));
71static INLINE int fits_in_unsigned_long PARAMS ((offsetT));
72static INLINE int fits_in_signed_long PARAMS ((offsetT));
847f7ad4
AM
73static int smallest_imm_type PARAMS ((offsetT));
74static offsetT offset_in_range PARAMS ((offsetT, int));
252b5132 75static int add_prefix PARAMS ((unsigned int));
3e73aa7c 76static void set_code_flag PARAMS ((int));
47926f60 77static void set_16bit_gcc_code_flag PARAMS ((int));
252b5132 78static void set_intel_syntax PARAMS ((int));
e413e4e9 79static void set_cpu_arch PARAMS ((int));
6482c264
NC
80#ifdef TE_PE
81static void pe_directive_secrel PARAMS ((int));
82#endif
29b0f896
AM
83static char *output_invalid PARAMS ((int c));
84static int i386_operand PARAMS ((char *operand_string));
85static int i386_intel_operand PARAMS ((char *operand_string, int got_a_float));
86static const reg_entry *parse_register PARAMS ((char *reg_string,
87 char **end_op));
88static char *parse_insn PARAMS ((char *, char *));
89static char *parse_operands PARAMS ((char *, const char *));
90static void swap_operands PARAMS ((void));
91static void optimize_imm PARAMS ((void));
92static void optimize_disp PARAMS ((void));
93static int match_template PARAMS ((void));
94static int check_string PARAMS ((void));
95static int process_suffix PARAMS ((void));
96static int check_byte_reg PARAMS ((void));
97static int check_long_reg PARAMS ((void));
98static int check_qword_reg PARAMS ((void));
99static int check_word_reg PARAMS ((void));
100static int finalize_imm PARAMS ((void));
101static int process_operands PARAMS ((void));
102static const seg_entry *build_modrm_byte PARAMS ((void));
103static void output_insn PARAMS ((void));
104static void output_branch PARAMS ((void));
105static void output_jump PARAMS ((void));
106static void output_interseg_jump PARAMS ((void));
2bbd9c25
JJ
107static void output_imm PARAMS ((fragS *insn_start_frag,
108 offsetT insn_start_off));
109static void output_disp PARAMS ((fragS *insn_start_frag,
110 offsetT insn_start_off));
29b0f896
AM
111#ifndef I386COFF
112static void s_bss PARAMS ((int));
252b5132
RH
113#endif
114
a847613f 115static const char *default_arch = DEFAULT_ARCH;
3e73aa7c 116
252b5132 117/* 'md_assemble ()' gathers together information and puts it into a
47926f60 118 i386_insn. */
252b5132 119
520dc8e8
AM
120union i386_op
121 {
122 expressionS *disps;
123 expressionS *imms;
124 const reg_entry *regs;
125 };
126
252b5132
RH
127struct _i386_insn
128 {
47926f60 129 /* TM holds the template for the insn were currently assembling. */
252b5132
RH
130 template tm;
131
132 /* SUFFIX holds the instruction mnemonic suffix if given.
133 (e.g. 'l' for 'movl') */
134 char suffix;
135
47926f60 136 /* OPERANDS gives the number of given operands. */
252b5132
RH
137 unsigned int operands;
138
139 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
140 of given register, displacement, memory operands and immediate
47926f60 141 operands. */
252b5132
RH
142 unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
143
144 /* TYPES [i] is the type (see above #defines) which tells us how to
520dc8e8 145 use OP[i] for the corresponding operand. */
252b5132
RH
146 unsigned int types[MAX_OPERANDS];
147
520dc8e8
AM
148 /* Displacement expression, immediate expression, or register for each
149 operand. */
150 union i386_op op[MAX_OPERANDS];
252b5132 151
3e73aa7c
JH
152 /* Flags for operands. */
153 unsigned int flags[MAX_OPERANDS];
154#define Operand_PCrel 1
155
252b5132 156 /* Relocation type for operand */
f86103b7 157 enum bfd_reloc_code_real reloc[MAX_OPERANDS];
252b5132 158
252b5132
RH
159 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
160 the base index byte below. */
161 const reg_entry *base_reg;
162 const reg_entry *index_reg;
163 unsigned int log2_scale_factor;
164
165 /* SEG gives the seg_entries of this insn. They are zero unless
47926f60 166 explicit segment overrides are given. */
ce8a8b2f 167 const seg_entry *seg[2];
252b5132
RH
168
169 /* PREFIX holds all the given prefix opcodes (usually null).
170 PREFIXES is the number of prefix opcodes. */
171 unsigned int prefixes;
172 unsigned char prefix[MAX_PREFIXES];
173
174 /* RM and SIB are the modrm byte and the sib byte where the
175 addressing modes of this insn are encoded. */
176
177 modrm_byte rm;
3e73aa7c 178 rex_byte rex;
252b5132
RH
179 sib_byte sib;
180 };
181
182typedef struct _i386_insn i386_insn;
183
184/* List of chars besides those in app.c:symbol_chars that can start an
185 operand. Used to prevent the scrubber eating vital white-space. */
32137342 186const char extra_symbol_chars[] = "*%-(["
252b5132 187#ifdef LEX_AT
32137342
NC
188 "@"
189#endif
190#ifdef LEX_QM
191 "?"
252b5132 192#endif
32137342 193 ;
252b5132 194
29b0f896
AM
195#if (defined (TE_I386AIX) \
196 || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
197 && !defined (TE_LINUX) \
32137342 198 && !defined (TE_NETWARE) \
29b0f896
AM
199 && !defined (TE_FreeBSD) \
200 && !defined (TE_NetBSD)))
252b5132 201/* This array holds the chars that always start a comment. If the
ce8a8b2f 202 pre-processor is disabled, these aren't very useful. */
252b5132
RH
203const char comment_chars[] = "#/";
204#define PREFIX_SEPARATOR '\\'
252b5132
RH
205
206/* This array holds the chars that only start a comment at the beginning of
207 a line. If the line seems to have the form '# 123 filename'
ce8a8b2f
AM
208 .line and .file directives will appear in the pre-processed output.
209 Note that input_file.c hand checks for '#' at the beginning of the
252b5132 210 first line of the input file. This is because the compiler outputs
ce8a8b2f
AM
211 #NO_APP at the beginning of its output.
212 Also note that comments started like this one will always work if
252b5132 213 '/' isn't otherwise defined. */
0d9f6d04 214const char line_comment_chars[] = "#";
29b0f896 215
252b5132 216#else
29b0f896
AM
217/* Putting '/' here makes it impossible to use the divide operator.
218 However, we need it for compatibility with SVR4 systems. */
219const char comment_chars[] = "#";
220#define PREFIX_SEPARATOR '/'
221
0d9f6d04 222const char line_comment_chars[] = "/#";
252b5132
RH
223#endif
224
63a0b638 225const char line_separator_chars[] = ";";
252b5132 226
ce8a8b2f
AM
227/* Chars that can be used to separate mant from exp in floating point
228 nums. */
252b5132
RH
229const char EXP_CHARS[] = "eE";
230
ce8a8b2f
AM
231/* Chars that mean this number is a floating point constant
232 As in 0f12.456
233 or 0d1.2345e12. */
252b5132
RH
234const char FLT_CHARS[] = "fFdDxX";
235
ce8a8b2f 236/* Tables for lexical analysis. */
252b5132
RH
237static char mnemonic_chars[256];
238static char register_chars[256];
239static char operand_chars[256];
240static char identifier_chars[256];
241static char digit_chars[256];
242
ce8a8b2f 243/* Lexical macros. */
252b5132
RH
244#define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
245#define is_operand_char(x) (operand_chars[(unsigned char) x])
246#define is_register_char(x) (register_chars[(unsigned char) x])
247#define is_space_char(x) ((x) == ' ')
248#define is_identifier_char(x) (identifier_chars[(unsigned char) x])
249#define is_digit_char(x) (digit_chars[(unsigned char) x])
250
0234cb7c 251/* All non-digit non-letter characters that may occur in an operand. */
252b5132
RH
252static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
253
254/* md_assemble() always leaves the strings it's passed unaltered. To
255 effect this we maintain a stack of saved characters that we've smashed
256 with '\0's (indicating end of strings for various sub-fields of the
47926f60 257 assembler instruction). */
252b5132 258static char save_stack[32];
ce8a8b2f 259static char *save_stack_p;
252b5132
RH
260#define END_STRING_AND_SAVE(s) \
261 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
262#define RESTORE_END_STRING(s) \
263 do { *(s) = *--save_stack_p; } while (0)
264
47926f60 265/* The instruction we're assembling. */
252b5132
RH
266static i386_insn i;
267
268/* Possible templates for current insn. */
269static const templates *current_templates;
270
47926f60 271/* Per instruction expressionS buffers: 2 displacements & 2 immediate max. */
252b5132
RH
272static expressionS disp_expressions[2], im_expressions[2];
273
47926f60
KH
274/* Current operand we are working on. */
275static int this_operand;
252b5132 276
3e73aa7c
JH
277/* We support four different modes. FLAG_CODE variable is used to distinguish
278 these. */
279
280enum flag_code {
281 CODE_32BIT,
282 CODE_16BIT,
283 CODE_64BIT };
f3c180ae 284#define NUM_FLAG_CODE ((int) CODE_64BIT + 1)
3e73aa7c
JH
285
286static enum flag_code flag_code;
287static int use_rela_relocations = 0;
288
289/* The names used to print error messages. */
b77a7acd 290static const char *flag_code_names[] =
3e73aa7c
JH
291 {
292 "32",
293 "16",
294 "64"
295 };
252b5132 296
47926f60
KH
297/* 1 for intel syntax,
298 0 if att syntax. */
299static int intel_syntax = 0;
252b5132 300
47926f60
KH
301/* 1 if register prefix % not required. */
302static int allow_naked_reg = 0;
252b5132 303
47926f60
KH
304/* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
305 leave, push, and pop instructions so that gcc has the same stack
306 frame as in 32 bit mode. */
307static char stackop_size = '\0';
eecb386c 308
12b55ccc
L
309/* Non-zero to optimize code alignment. */
310int optimize_align_code = 1;
311
47926f60
KH
312/* Non-zero to quieten some warnings. */
313static int quiet_warnings = 0;
a38cf1db 314
47926f60
KH
315/* CPU name. */
316static const char *cpu_arch_name = NULL;
5c6af06e 317static const char *cpu_sub_arch_name = NULL;
a38cf1db 318
47926f60 319/* CPU feature flags. */
29b0f896 320static unsigned int cpu_arch_flags = CpuUnknownFlags | CpuNo64;
a38cf1db 321
fddf5b5b
AM
322/* If set, conditional jumps are not automatically promoted to handle
323 larger than a byte offset. */
324static unsigned int no_cond_jump_promotion = 0;
325
29b0f896 326/* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
87c245cc 327static symbolS *GOT_symbol;
29b0f896 328
a4447b93
RH
329/* The dwarf2 return column, adjusted for 32 or 64 bit. */
330unsigned int x86_dwarf2_return_column;
331
332/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
333int x86_cie_data_alignment;
334
252b5132 335/* Interface to relax_segment.
fddf5b5b
AM
336 There are 3 major relax states for 386 jump insns because the
337 different types of jumps add different sizes to frags when we're
338 figuring out what sort of jump to choose to reach a given label. */
252b5132 339
47926f60 340/* Types. */
93c2a809
AM
341#define UNCOND_JUMP 0
342#define COND_JUMP 1
343#define COND_JUMP86 2
fddf5b5b 344
47926f60 345/* Sizes. */
252b5132
RH
346#define CODE16 1
347#define SMALL 0
29b0f896 348#define SMALL16 (SMALL | CODE16)
252b5132 349#define BIG 2
29b0f896 350#define BIG16 (BIG | CODE16)
252b5132
RH
351
352#ifndef INLINE
353#ifdef __GNUC__
354#define INLINE __inline__
355#else
356#define INLINE
357#endif
358#endif
359
fddf5b5b
AM
360#define ENCODE_RELAX_STATE(type, size) \
361 ((relax_substateT) (((type) << 2) | (size)))
362#define TYPE_FROM_RELAX_STATE(s) \
363 ((s) >> 2)
364#define DISP_SIZE_FROM_RELAX_STATE(s) \
365 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
252b5132
RH
366
367/* This table is used by relax_frag to promote short jumps to long
368 ones where necessary. SMALL (short) jumps may be promoted to BIG
369 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
370 don't allow a short jump in a 32 bit code segment to be promoted to
371 a 16 bit offset jump because it's slower (requires data size
372 prefix), and doesn't work, unless the destination is in the bottom
373 64k of the code segment (The top 16 bits of eip are zeroed). */
374
375const relax_typeS md_relax_table[] =
376{
24eab124
AM
377 /* The fields are:
378 1) most positive reach of this state,
379 2) most negative reach of this state,
93c2a809 380 3) how many bytes this mode will have in the variable part of the frag
ce8a8b2f 381 4) which index into the table to try if we can't fit into this one. */
252b5132 382
fddf5b5b 383 /* UNCOND_JUMP states. */
93c2a809
AM
384 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
385 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
386 /* dword jmp adds 4 bytes to frag:
387 0 extra opcode bytes, 4 displacement bytes. */
252b5132 388 {0, 0, 4, 0},
93c2a809
AM
389 /* word jmp adds 2 byte2 to frag:
390 0 extra opcode bytes, 2 displacement bytes. */
252b5132
RH
391 {0, 0, 2, 0},
392
93c2a809
AM
393 /* COND_JUMP states. */
394 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
395 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
396 /* dword conditionals adds 5 bytes to frag:
397 1 extra opcode byte, 4 displacement bytes. */
398 {0, 0, 5, 0},
fddf5b5b 399 /* word conditionals add 3 bytes to frag:
93c2a809
AM
400 1 extra opcode byte, 2 displacement bytes. */
401 {0, 0, 3, 0},
402
403 /* COND_JUMP86 states. */
404 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
405 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
406 /* dword conditionals adds 5 bytes to frag:
407 1 extra opcode byte, 4 displacement bytes. */
408 {0, 0, 5, 0},
409 /* word conditionals add 4 bytes to frag:
410 1 displacement byte and a 3 byte long branch insn. */
411 {0, 0, 4, 0}
252b5132
RH
412};
413
e413e4e9
AM
414static const arch_entry cpu_arch[] = {
415 {"i8086", Cpu086 },
416 {"i186", Cpu086|Cpu186 },
417 {"i286", Cpu086|Cpu186|Cpu286 },
418 {"i386", Cpu086|Cpu186|Cpu286|Cpu386 },
419 {"i486", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486 },
5c6af06e
JB
420 {"i586", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586 },
421 {"i686", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686 },
422 {"pentium", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586 },
423 {"pentiumpro",Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686 },
424 {"pentiumii", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuMMX },
425 {"pentiumiii",Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuMMX|CpuMMX2|CpuSSE },
426 {"pentium4", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuP4|CpuMMX|CpuMMX2|CpuSSE|CpuSSE2 },
427 {"prescott", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuP4|CpuMMX|CpuMMX2|CpuSSE|CpuSSE2|CpuPNI },
428 {"k6", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|CpuK6|CpuMMX },
429 {"k6_2", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|CpuK6|CpuMMX|Cpu3dnow },
430 {"athlon", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuK6|CpuAthlon|CpuMMX|CpuMMX2|Cpu3dnow|Cpu3dnowA },
431 {"sledgehammer",Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuK6|CpuAthlon|CpuSledgehammer|CpuMMX|CpuMMX2|Cpu3dnow|Cpu3dnowA|CpuSSE|CpuSSE2 },
30123838 432 {"opteron", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuK6|CpuAthlon|CpuSledgehammer|CpuMMX|CpuMMX2|Cpu3dnow|Cpu3dnowA|CpuSSE|CpuSSE2 },
5c6af06e
JB
433 {".mmx", CpuMMX },
434 {".sse", CpuMMX|CpuMMX2|CpuSSE },
435 {".sse2", CpuMMX|CpuMMX2|CpuSSE|CpuSSE2 },
bf50992e 436 {".sse3", CpuMMX|CpuMMX2|CpuSSE|CpuSSE2|CpuSSE3 },
5c6af06e
JB
437 {".3dnow", CpuMMX|Cpu3dnow },
438 {".3dnowa", CpuMMX|CpuMMX2|Cpu3dnow|Cpu3dnowA },
439 {".padlock", CpuPadLock },
30123838
JB
440 {".pacifica", CpuSVME },
441 {".svme", CpuSVME },
e413e4e9
AM
442 {NULL, 0 }
443};
444
29b0f896
AM
445const pseudo_typeS md_pseudo_table[] =
446{
447#if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
448 {"align", s_align_bytes, 0},
449#else
450 {"align", s_align_ptwo, 0},
451#endif
452 {"arch", set_cpu_arch, 0},
453#ifndef I386COFF
454 {"bss", s_bss, 0},
455#endif
456 {"ffloat", float_cons, 'f'},
457 {"dfloat", float_cons, 'd'},
458 {"tfloat", float_cons, 'x'},
459 {"value", cons, 2},
460 {"noopt", s_ignore, 0},
461 {"optim", s_ignore, 0},
462 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
463 {"code16", set_code_flag, CODE_16BIT},
464 {"code32", set_code_flag, CODE_32BIT},
465 {"code64", set_code_flag, CODE_64BIT},
466 {"intel_syntax", set_intel_syntax, 1},
467 {"att_syntax", set_intel_syntax, 0},
c6682705 468 {"file", (void (*) PARAMS ((int))) dwarf2_directive_file, 0},
29b0f896 469 {"loc", dwarf2_directive_loc, 0},
6482c264
NC
470#ifdef TE_PE
471 {"secrel32", pe_directive_secrel, 0},
472#endif
29b0f896
AM
473 {0, 0, 0}
474};
475
476/* For interface with expression (). */
477extern char *input_line_pointer;
478
479/* Hash table for instruction mnemonic lookup. */
480static struct hash_control *op_hash;
481
482/* Hash table for register lookup. */
483static struct hash_control *reg_hash;
484\f
252b5132
RH
485void
486i386_align_code (fragP, count)
487 fragS *fragP;
488 int count;
489{
ce8a8b2f
AM
490 /* Various efficient no-op patterns for aligning code labels.
491 Note: Don't try to assemble the instructions in the comments.
492 0L and 0w are not legal. */
252b5132
RH
493 static const char f32_1[] =
494 {0x90}; /* nop */
495 static const char f32_2[] =
496 {0x89,0xf6}; /* movl %esi,%esi */
497 static const char f32_3[] =
498 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
499 static const char f32_4[] =
500 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
501 static const char f32_5[] =
502 {0x90, /* nop */
503 0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
504 static const char f32_6[] =
505 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
506 static const char f32_7[] =
507 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
508 static const char f32_8[] =
509 {0x90, /* nop */
510 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
511 static const char f32_9[] =
512 {0x89,0xf6, /* movl %esi,%esi */
513 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
514 static const char f32_10[] =
515 {0x8d,0x76,0x00, /* leal 0(%esi),%esi */
516 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
517 static const char f32_11[] =
518 {0x8d,0x74,0x26,0x00, /* leal 0(%esi,1),%esi */
519 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
520 static const char f32_12[] =
521 {0x8d,0xb6,0x00,0x00,0x00,0x00, /* leal 0L(%esi),%esi */
522 0x8d,0xbf,0x00,0x00,0x00,0x00}; /* leal 0L(%edi),%edi */
523 static const char f32_13[] =
524 {0x8d,0xb6,0x00,0x00,0x00,0x00, /* leal 0L(%esi),%esi */
525 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
526 static const char f32_14[] =
527 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00, /* leal 0L(%esi,1),%esi */
528 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
529 static const char f32_15[] =
530 {0xeb,0x0d,0x90,0x90,0x90,0x90,0x90, /* jmp .+15; lotsa nops */
531 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90};
c3332e24
AM
532 static const char f16_3[] =
533 {0x8d,0x74,0x00}; /* lea 0(%esi),%esi */
252b5132
RH
534 static const char f16_4[] =
535 {0x8d,0xb4,0x00,0x00}; /* lea 0w(%si),%si */
536 static const char f16_5[] =
537 {0x90, /* nop */
538 0x8d,0xb4,0x00,0x00}; /* lea 0w(%si),%si */
539 static const char f16_6[] =
540 {0x89,0xf6, /* mov %si,%si */
541 0x8d,0xbd,0x00,0x00}; /* lea 0w(%di),%di */
542 static const char f16_7[] =
543 {0x8d,0x74,0x00, /* lea 0(%si),%si */
544 0x8d,0xbd,0x00,0x00}; /* lea 0w(%di),%di */
545 static const char f16_8[] =
546 {0x8d,0xb4,0x00,0x00, /* lea 0w(%si),%si */
547 0x8d,0xbd,0x00,0x00}; /* lea 0w(%di),%di */
548 static const char *const f32_patt[] = {
549 f32_1, f32_2, f32_3, f32_4, f32_5, f32_6, f32_7, f32_8,
550 f32_9, f32_10, f32_11, f32_12, f32_13, f32_14, f32_15
551 };
552 static const char *const f16_patt[] = {
c3332e24 553 f32_1, f32_2, f16_3, f16_4, f16_5, f16_6, f16_7, f16_8,
252b5132
RH
554 f32_15, f32_15, f32_15, f32_15, f32_15, f32_15, f32_15
555 };
556
33fef721
JH
557 if (count <= 0 || count > 15)
558 return;
3e73aa7c 559
33fef721
JH
560 /* The recommended way to pad 64bit code is to use NOPs preceded by
561 maximally four 0x66 prefixes. Balance the size of nops. */
562 if (flag_code == CODE_64BIT)
252b5132 563 {
33fef721
JH
564 int i;
565 int nnops = (count + 3) / 4;
566 int len = count / nnops;
567 int remains = count - nnops * len;
568 int pos = 0;
569
570 for (i = 0; i < remains; i++)
252b5132 571 {
33fef721
JH
572 memset (fragP->fr_literal + fragP->fr_fix + pos, 0x66, len);
573 fragP->fr_literal[fragP->fr_fix + pos + len] = 0x90;
574 pos += len + 1;
575 }
576 for (; i < nnops; i++)
577 {
578 memset (fragP->fr_literal + fragP->fr_fix + pos, 0x66, len - 1);
579 fragP->fr_literal[fragP->fr_fix + pos + len - 1] = 0x90;
580 pos += len;
252b5132 581 }
252b5132 582 }
33fef721
JH
583 else
584 if (flag_code == CODE_16BIT)
585 {
586 memcpy (fragP->fr_literal + fragP->fr_fix,
587 f16_patt[count - 1], count);
588 if (count > 8)
589 /* Adjust jump offset. */
590 fragP->fr_literal[fragP->fr_fix + 1] = count - 2;
591 }
592 else
593 memcpy (fragP->fr_literal + fragP->fr_fix,
594 f32_patt[count - 1], count);
595 fragP->fr_var = count;
252b5132
RH
596}
597
252b5132
RH
598static INLINE unsigned int
599mode_from_disp_size (t)
600 unsigned int t;
601{
3e73aa7c 602 return (t & Disp8) ? 1 : (t & (Disp16 | Disp32 | Disp32S)) ? 2 : 0;
252b5132
RH
603}
604
605static INLINE int
606fits_in_signed_byte (num)
847f7ad4 607 offsetT num;
252b5132
RH
608{
609 return (num >= -128) && (num <= 127);
47926f60 610}
252b5132
RH
611
612static INLINE int
613fits_in_unsigned_byte (num)
847f7ad4 614 offsetT num;
252b5132
RH
615{
616 return (num & 0xff) == num;
47926f60 617}
252b5132
RH
618
619static INLINE int
620fits_in_unsigned_word (num)
847f7ad4 621 offsetT num;
252b5132
RH
622{
623 return (num & 0xffff) == num;
47926f60 624}
252b5132
RH
625
626static INLINE int
627fits_in_signed_word (num)
847f7ad4 628 offsetT num;
252b5132
RH
629{
630 return (-32768 <= num) && (num <= 32767);
47926f60 631}
3e73aa7c
JH
632static INLINE int
633fits_in_signed_long (num)
634 offsetT num ATTRIBUTE_UNUSED;
635{
636#ifndef BFD64
637 return 1;
638#else
639 return (!(((offsetT) -1 << 31) & num)
640 || (((offsetT) -1 << 31) & num) == ((offsetT) -1 << 31));
641#endif
642} /* fits_in_signed_long() */
643static INLINE int
644fits_in_unsigned_long (num)
645 offsetT num ATTRIBUTE_UNUSED;
646{
647#ifndef BFD64
648 return 1;
649#else
650 return (num & (((offsetT) 2 << 31) - 1)) == num;
651#endif
652} /* fits_in_unsigned_long() */
252b5132
RH
653
654static int
655smallest_imm_type (num)
847f7ad4 656 offsetT num;
252b5132 657{
a847613f 658 if (cpu_arch_flags != (Cpu086 | Cpu186 | Cpu286 | Cpu386 | Cpu486 | CpuNo64))
e413e4e9
AM
659 {
660 /* This code is disabled on the 486 because all the Imm1 forms
661 in the opcode table are slower on the i486. They're the
662 versions with the implicitly specified single-position
663 displacement, which has another syntax if you really want to
664 use that form. */
665 if (num == 1)
3e73aa7c 666 return Imm1 | Imm8 | Imm8S | Imm16 | Imm32 | Imm32S | Imm64;
e413e4e9 667 }
252b5132 668 return (fits_in_signed_byte (num)
3e73aa7c 669 ? (Imm8S | Imm8 | Imm16 | Imm32 | Imm32S | Imm64)
252b5132 670 : fits_in_unsigned_byte (num)
3e73aa7c 671 ? (Imm8 | Imm16 | Imm32 | Imm32S | Imm64)
252b5132 672 : (fits_in_signed_word (num) || fits_in_unsigned_word (num))
3e73aa7c
JH
673 ? (Imm16 | Imm32 | Imm32S | Imm64)
674 : fits_in_signed_long (num)
675 ? (Imm32 | Imm32S | Imm64)
676 : fits_in_unsigned_long (num)
677 ? (Imm32 | Imm64)
678 : Imm64);
47926f60 679}
252b5132 680
847f7ad4
AM
681static offsetT
682offset_in_range (val, size)
683 offsetT val;
684 int size;
685{
508866be 686 addressT mask;
ba2adb93 687
847f7ad4
AM
688 switch (size)
689 {
508866be
L
690 case 1: mask = ((addressT) 1 << 8) - 1; break;
691 case 2: mask = ((addressT) 1 << 16) - 1; break;
3b0ec529 692 case 4: mask = ((addressT) 2 << 31) - 1; break;
3e73aa7c
JH
693#ifdef BFD64
694 case 8: mask = ((addressT) 2 << 63) - 1; break;
695#endif
47926f60 696 default: abort ();
847f7ad4
AM
697 }
698
ba2adb93 699 /* If BFD64, sign extend val. */
3e73aa7c
JH
700 if (!use_rela_relocations)
701 if ((val & ~(((addressT) 2 << 31) - 1)) == 0)
702 val = (val ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
ba2adb93 703
47926f60 704 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
847f7ad4
AM
705 {
706 char buf1[40], buf2[40];
707
708 sprint_value (buf1, val);
709 sprint_value (buf2, val & mask);
710 as_warn (_("%s shortened to %s"), buf1, buf2);
711 }
712 return val & mask;
713}
714
252b5132
RH
715/* Returns 0 if attempting to add a prefix where one from the same
716 class already exists, 1 if non rep/repne added, 2 if rep/repne
717 added. */
718static int
719add_prefix (prefix)
720 unsigned int prefix;
721{
722 int ret = 1;
723 int q;
724
29b0f896
AM
725 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
726 && flag_code == CODE_64BIT)
3e73aa7c
JH
727 q = REX_PREFIX;
728 else
729 switch (prefix)
730 {
731 default:
732 abort ();
733
734 case CS_PREFIX_OPCODE:
735 case DS_PREFIX_OPCODE:
736 case ES_PREFIX_OPCODE:
737 case FS_PREFIX_OPCODE:
738 case GS_PREFIX_OPCODE:
739 case SS_PREFIX_OPCODE:
740 q = SEG_PREFIX;
741 break;
252b5132 742
3e73aa7c
JH
743 case REPNE_PREFIX_OPCODE:
744 case REPE_PREFIX_OPCODE:
745 ret = 2;
746 /* fall thru */
747 case LOCK_PREFIX_OPCODE:
748 q = LOCKREP_PREFIX;
749 break;
252b5132 750
3e73aa7c
JH
751 case FWAIT_OPCODE:
752 q = WAIT_PREFIX;
753 break;
252b5132 754
3e73aa7c
JH
755 case ADDR_PREFIX_OPCODE:
756 q = ADDR_PREFIX;
757 break;
252b5132 758
3e73aa7c
JH
759 case DATA_PREFIX_OPCODE:
760 q = DATA_PREFIX;
761 break;
762 }
252b5132 763
29b0f896 764 if (i.prefix[q] != 0)
252b5132
RH
765 {
766 as_bad (_("same type of prefix used twice"));
767 return 0;
768 }
769
770 i.prefixes += 1;
771 i.prefix[q] = prefix;
772 return ret;
773}
774
775static void
3e73aa7c 776set_code_flag (value)
e5cb08ac 777 int value;
eecb386c 778{
3e73aa7c
JH
779 flag_code = value;
780 cpu_arch_flags &= ~(Cpu64 | CpuNo64);
781 cpu_arch_flags |= (flag_code == CODE_64BIT ? Cpu64 : CpuNo64);
782 if (value == CODE_64BIT && !(cpu_arch_flags & CpuSledgehammer))
783 {
784 as_bad (_("64bit mode not supported on this CPU."));
785 }
786 if (value == CODE_32BIT && !(cpu_arch_flags & Cpu386))
787 {
788 as_bad (_("32bit mode not supported on this CPU."));
789 }
eecb386c
AM
790 stackop_size = '\0';
791}
792
793static void
3e73aa7c
JH
794set_16bit_gcc_code_flag (new_code_flag)
795 int new_code_flag;
252b5132 796{
3e73aa7c
JH
797 flag_code = new_code_flag;
798 cpu_arch_flags &= ~(Cpu64 | CpuNo64);
799 cpu_arch_flags |= (flag_code == CODE_64BIT ? Cpu64 : CpuNo64);
9306ca4a 800 stackop_size = LONG_MNEM_SUFFIX;
252b5132
RH
801}
802
803static void
804set_intel_syntax (syntax_flag)
eecb386c 805 int syntax_flag;
252b5132
RH
806{
807 /* Find out if register prefixing is specified. */
808 int ask_naked_reg = 0;
809
810 SKIP_WHITESPACE ();
29b0f896 811 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132
RH
812 {
813 char *string = input_line_pointer;
814 int e = get_symbol_end ();
815
47926f60 816 if (strcmp (string, "prefix") == 0)
252b5132 817 ask_naked_reg = 1;
47926f60 818 else if (strcmp (string, "noprefix") == 0)
252b5132
RH
819 ask_naked_reg = -1;
820 else
d0b47220 821 as_bad (_("bad argument to syntax directive."));
252b5132
RH
822 *input_line_pointer = e;
823 }
824 demand_empty_rest_of_line ();
c3332e24 825
252b5132
RH
826 intel_syntax = syntax_flag;
827
828 if (ask_naked_reg == 0)
f86103b7
AM
829 allow_naked_reg = (intel_syntax
830 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
252b5132
RH
831 else
832 allow_naked_reg = (ask_naked_reg < 0);
9306ca4a
JB
833
834 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
835 identifier_chars['$'] = intel_syntax ? '$' : 0;
252b5132
RH
836}
837
e413e4e9
AM
838static void
839set_cpu_arch (dummy)
47926f60 840 int dummy ATTRIBUTE_UNUSED;
e413e4e9 841{
47926f60 842 SKIP_WHITESPACE ();
e413e4e9 843
29b0f896 844 if (!is_end_of_line[(unsigned char) *input_line_pointer])
e413e4e9
AM
845 {
846 char *string = input_line_pointer;
847 int e = get_symbol_end ();
848 int i;
849
850 for (i = 0; cpu_arch[i].name; i++)
851 {
852 if (strcmp (string, cpu_arch[i].name) == 0)
853 {
5c6af06e
JB
854 if (*string != '.')
855 {
856 cpu_arch_name = cpu_arch[i].name;
857 cpu_sub_arch_name = NULL;
858 cpu_arch_flags = (cpu_arch[i].flags
859 | (flag_code == CODE_64BIT ? Cpu64 : CpuNo64));
860 break;
861 }
862 if ((cpu_arch_flags | cpu_arch[i].flags) != cpu_arch_flags)
863 {
864 cpu_sub_arch_name = cpu_arch[i].name;
865 cpu_arch_flags |= cpu_arch[i].flags;
866 }
867 *input_line_pointer = e;
868 demand_empty_rest_of_line ();
869 return;
e413e4e9
AM
870 }
871 }
872 if (!cpu_arch[i].name)
873 as_bad (_("no such architecture: `%s'"), string);
874
875 *input_line_pointer = e;
876 }
877 else
878 as_bad (_("missing cpu architecture"));
879
fddf5b5b
AM
880 no_cond_jump_promotion = 0;
881 if (*input_line_pointer == ','
29b0f896 882 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
fddf5b5b
AM
883 {
884 char *string = ++input_line_pointer;
885 int e = get_symbol_end ();
886
887 if (strcmp (string, "nojumps") == 0)
888 no_cond_jump_promotion = 1;
889 else if (strcmp (string, "jumps") == 0)
890 ;
891 else
892 as_bad (_("no such architecture modifier: `%s'"), string);
893
894 *input_line_pointer = e;
895 }
896
e413e4e9
AM
897 demand_empty_rest_of_line ();
898}
899
b9d79e03
JH
900unsigned long
901i386_mach ()
902{
903 if (!strcmp (default_arch, "x86_64"))
904 return bfd_mach_x86_64;
905 else if (!strcmp (default_arch, "i386"))
906 return bfd_mach_i386_i386;
907 else
908 as_fatal (_("Unknown architecture"));
909}
b9d79e03 910\f
252b5132
RH
911void
912md_begin ()
913{
914 const char *hash_err;
915
47926f60 916 /* Initialize op_hash hash table. */
252b5132
RH
917 op_hash = hash_new ();
918
919 {
29b0f896
AM
920 const template *optab;
921 templates *core_optab;
252b5132 922
47926f60
KH
923 /* Setup for loop. */
924 optab = i386_optab;
252b5132
RH
925 core_optab = (templates *) xmalloc (sizeof (templates));
926 core_optab->start = optab;
927
928 while (1)
929 {
930 ++optab;
931 if (optab->name == NULL
932 || strcmp (optab->name, (optab - 1)->name) != 0)
933 {
934 /* different name --> ship out current template list;
47926f60 935 add to hash table; & begin anew. */
252b5132
RH
936 core_optab->end = optab;
937 hash_err = hash_insert (op_hash,
938 (optab - 1)->name,
939 (PTR) core_optab);
940 if (hash_err)
941 {
252b5132
RH
942 as_fatal (_("Internal Error: Can't hash %s: %s"),
943 (optab - 1)->name,
944 hash_err);
945 }
946 if (optab->name == NULL)
947 break;
948 core_optab = (templates *) xmalloc (sizeof (templates));
949 core_optab->start = optab;
950 }
951 }
952 }
953
47926f60 954 /* Initialize reg_hash hash table. */
252b5132
RH
955 reg_hash = hash_new ();
956 {
29b0f896 957 const reg_entry *regtab;
252b5132
RH
958
959 for (regtab = i386_regtab;
960 regtab < i386_regtab + sizeof (i386_regtab) / sizeof (i386_regtab[0]);
961 regtab++)
962 {
963 hash_err = hash_insert (reg_hash, regtab->reg_name, (PTR) regtab);
964 if (hash_err)
3e73aa7c
JH
965 as_fatal (_("Internal Error: Can't hash %s: %s"),
966 regtab->reg_name,
967 hash_err);
252b5132
RH
968 }
969 }
970
47926f60 971 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
252b5132 972 {
29b0f896
AM
973 int c;
974 char *p;
252b5132
RH
975
976 for (c = 0; c < 256; c++)
977 {
3882b010 978 if (ISDIGIT (c))
252b5132
RH
979 {
980 digit_chars[c] = c;
981 mnemonic_chars[c] = c;
982 register_chars[c] = c;
983 operand_chars[c] = c;
984 }
3882b010 985 else if (ISLOWER (c))
252b5132
RH
986 {
987 mnemonic_chars[c] = c;
988 register_chars[c] = c;
989 operand_chars[c] = c;
990 }
3882b010 991 else if (ISUPPER (c))
252b5132 992 {
3882b010 993 mnemonic_chars[c] = TOLOWER (c);
252b5132
RH
994 register_chars[c] = mnemonic_chars[c];
995 operand_chars[c] = c;
996 }
997
3882b010 998 if (ISALPHA (c) || ISDIGIT (c))
252b5132
RH
999 identifier_chars[c] = c;
1000 else if (c >= 128)
1001 {
1002 identifier_chars[c] = c;
1003 operand_chars[c] = c;
1004 }
1005 }
1006
1007#ifdef LEX_AT
1008 identifier_chars['@'] = '@';
32137342
NC
1009#endif
1010#ifdef LEX_QM
1011 identifier_chars['?'] = '?';
1012 operand_chars['?'] = '?';
252b5132 1013#endif
252b5132 1014 digit_chars['-'] = '-';
791fe849 1015 mnemonic_chars['-'] = '-';
252b5132
RH
1016 identifier_chars['_'] = '_';
1017 identifier_chars['.'] = '.';
1018
1019 for (p = operand_special_chars; *p != '\0'; p++)
1020 operand_chars[(unsigned char) *p] = *p;
1021 }
1022
1023#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1024 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1025 {
1026 record_alignment (text_section, 2);
1027 record_alignment (data_section, 2);
1028 record_alignment (bss_section, 2);
1029 }
1030#endif
a4447b93
RH
1031
1032 if (flag_code == CODE_64BIT)
1033 {
1034 x86_dwarf2_return_column = 16;
1035 x86_cie_data_alignment = -8;
1036 }
1037 else
1038 {
1039 x86_dwarf2_return_column = 8;
1040 x86_cie_data_alignment = -4;
1041 }
252b5132
RH
1042}
1043
1044void
1045i386_print_statistics (file)
1046 FILE *file;
1047{
1048 hash_print_statistics (file, "i386 opcode", op_hash);
1049 hash_print_statistics (file, "i386 register", reg_hash);
1050}
1051\f
252b5132
RH
1052#ifdef DEBUG386
1053
ce8a8b2f 1054/* Debugging routines for md_assemble. */
252b5132
RH
1055static void pi PARAMS ((char *, i386_insn *));
1056static void pte PARAMS ((template *));
1057static void pt PARAMS ((unsigned int));
1058static void pe PARAMS ((expressionS *));
1059static void ps PARAMS ((symbolS *));
1060
1061static void
1062pi (line, x)
1063 char *line;
1064 i386_insn *x;
1065{
09f131f2 1066 unsigned int i;
252b5132
RH
1067
1068 fprintf (stdout, "%s: template ", line);
1069 pte (&x->tm);
09f131f2
JH
1070 fprintf (stdout, " address: base %s index %s scale %x\n",
1071 x->base_reg ? x->base_reg->reg_name : "none",
1072 x->index_reg ? x->index_reg->reg_name : "none",
1073 x->log2_scale_factor);
1074 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
252b5132 1075 x->rm.mode, x->rm.reg, x->rm.regmem);
09f131f2
JH
1076 fprintf (stdout, " sib: base %x index %x scale %x\n",
1077 x->sib.base, x->sib.index, x->sib.scale);
1078 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
29b0f896
AM
1079 (x->rex & REX_MODE64) != 0,
1080 (x->rex & REX_EXTX) != 0,
1081 (x->rex & REX_EXTY) != 0,
1082 (x->rex & REX_EXTZ) != 0);
252b5132
RH
1083 for (i = 0; i < x->operands; i++)
1084 {
1085 fprintf (stdout, " #%d: ", i + 1);
1086 pt (x->types[i]);
1087 fprintf (stdout, "\n");
1088 if (x->types[i]
3f4438ab 1089 & (Reg | SReg2 | SReg3 | Control | Debug | Test | RegMMX | RegXMM))
520dc8e8 1090 fprintf (stdout, "%s\n", x->op[i].regs->reg_name);
252b5132 1091 if (x->types[i] & Imm)
520dc8e8 1092 pe (x->op[i].imms);
252b5132 1093 if (x->types[i] & Disp)
520dc8e8 1094 pe (x->op[i].disps);
252b5132
RH
1095 }
1096}
1097
1098static void
1099pte (t)
1100 template *t;
1101{
09f131f2 1102 unsigned int i;
252b5132 1103 fprintf (stdout, " %d operands ", t->operands);
47926f60 1104 fprintf (stdout, "opcode %x ", t->base_opcode);
252b5132
RH
1105 if (t->extension_opcode != None)
1106 fprintf (stdout, "ext %x ", t->extension_opcode);
1107 if (t->opcode_modifier & D)
1108 fprintf (stdout, "D");
1109 if (t->opcode_modifier & W)
1110 fprintf (stdout, "W");
1111 fprintf (stdout, "\n");
1112 for (i = 0; i < t->operands; i++)
1113 {
1114 fprintf (stdout, " #%d type ", i + 1);
1115 pt (t->operand_types[i]);
1116 fprintf (stdout, "\n");
1117 }
1118}
1119
1120static void
1121pe (e)
1122 expressionS *e;
1123{
24eab124 1124 fprintf (stdout, " operation %d\n", e->X_op);
b77ad1d4
AM
1125 fprintf (stdout, " add_number %ld (%lx)\n",
1126 (long) e->X_add_number, (long) e->X_add_number);
252b5132
RH
1127 if (e->X_add_symbol)
1128 {
1129 fprintf (stdout, " add_symbol ");
1130 ps (e->X_add_symbol);
1131 fprintf (stdout, "\n");
1132 }
1133 if (e->X_op_symbol)
1134 {
1135 fprintf (stdout, " op_symbol ");
1136 ps (e->X_op_symbol);
1137 fprintf (stdout, "\n");
1138 }
1139}
1140
1141static void
1142ps (s)
1143 symbolS *s;
1144{
1145 fprintf (stdout, "%s type %s%s",
1146 S_GET_NAME (s),
1147 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
1148 segment_name (S_GET_SEGMENT (s)));
1149}
1150
1151struct type_name
1152 {
1153 unsigned int mask;
1154 char *tname;
1155 }
1156
29b0f896 1157static const type_names[] =
252b5132
RH
1158{
1159 { Reg8, "r8" },
1160 { Reg16, "r16" },
1161 { Reg32, "r32" },
09f131f2 1162 { Reg64, "r64" },
252b5132
RH
1163 { Imm8, "i8" },
1164 { Imm8S, "i8s" },
1165 { Imm16, "i16" },
1166 { Imm32, "i32" },
09f131f2
JH
1167 { Imm32S, "i32s" },
1168 { Imm64, "i64" },
252b5132
RH
1169 { Imm1, "i1" },
1170 { BaseIndex, "BaseIndex" },
1171 { Disp8, "d8" },
1172 { Disp16, "d16" },
1173 { Disp32, "d32" },
09f131f2
JH
1174 { Disp32S, "d32s" },
1175 { Disp64, "d64" },
252b5132
RH
1176 { InOutPortReg, "InOutPortReg" },
1177 { ShiftCount, "ShiftCount" },
1178 { Control, "control reg" },
1179 { Test, "test reg" },
1180 { Debug, "debug reg" },
1181 { FloatReg, "FReg" },
1182 { FloatAcc, "FAcc" },
1183 { SReg2, "SReg2" },
1184 { SReg3, "SReg3" },
1185 { Acc, "Acc" },
1186 { JumpAbsolute, "Jump Absolute" },
1187 { RegMMX, "rMMX" },
3f4438ab 1188 { RegXMM, "rXMM" },
252b5132
RH
1189 { EsSeg, "es" },
1190 { 0, "" }
1191};
1192
1193static void
1194pt (t)
1195 unsigned int t;
1196{
29b0f896 1197 const struct type_name *ty;
252b5132 1198
09f131f2
JH
1199 for (ty = type_names; ty->mask; ty++)
1200 if (t & ty->mask)
1201 fprintf (stdout, "%s, ", ty->tname);
252b5132
RH
1202 fflush (stdout);
1203}
1204
1205#endif /* DEBUG386 */
1206\f
29b0f896
AM
1207static bfd_reloc_code_real_type reloc
1208 PARAMS ((int, int, int, bfd_reloc_code_real_type));
252b5132
RH
1209
1210static bfd_reloc_code_real_type
3e73aa7c 1211reloc (size, pcrel, sign, other)
252b5132
RH
1212 int size;
1213 int pcrel;
3e73aa7c 1214 int sign;
252b5132
RH
1215 bfd_reloc_code_real_type other;
1216{
47926f60
KH
1217 if (other != NO_RELOC)
1218 return other;
252b5132
RH
1219
1220 if (pcrel)
1221 {
3e73aa7c 1222 if (!sign)
e5cb08ac 1223 as_bad (_("There are no unsigned pc-relative relocations"));
252b5132
RH
1224 switch (size)
1225 {
1226 case 1: return BFD_RELOC_8_PCREL;
1227 case 2: return BFD_RELOC_16_PCREL;
1228 case 4: return BFD_RELOC_32_PCREL;
d6ab8113 1229 case 8: return BFD_RELOC_64_PCREL;
252b5132 1230 }
d0b47220 1231 as_bad (_("can not do %d byte pc-relative relocation"), size);
252b5132
RH
1232 }
1233 else
1234 {
3e73aa7c 1235 if (sign)
e5cb08ac 1236 switch (size)
3e73aa7c
JH
1237 {
1238 case 4: return BFD_RELOC_X86_64_32S;
1239 }
1240 else
1241 switch (size)
1242 {
1243 case 1: return BFD_RELOC_8;
1244 case 2: return BFD_RELOC_16;
1245 case 4: return BFD_RELOC_32;
1246 case 8: return BFD_RELOC_64;
1247 }
1248 as_bad (_("can not do %s %d byte relocation"),
1249 sign ? "signed" : "unsigned", size);
252b5132
RH
1250 }
1251
bfb32b52 1252 abort ();
252b5132
RH
1253 return BFD_RELOC_NONE;
1254}
1255
47926f60
KH
1256/* Here we decide which fixups can be adjusted to make them relative to
1257 the beginning of the section instead of the symbol. Basically we need
1258 to make sure that the dynamic relocations are done correctly, so in
1259 some cases we force the original symbol to be used. */
1260
252b5132 1261int
c0c949c7 1262tc_i386_fix_adjustable (fixP)
31312f95 1263 fixS *fixP ATTRIBUTE_UNUSED;
252b5132 1264{
6d249963 1265#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
31312f95
AM
1266 if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
1267 return 1;
1268
a161fe53
AM
1269 /* Don't adjust pc-relative references to merge sections in 64-bit
1270 mode. */
1271 if (use_rela_relocations
1272 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
1273 && fixP->fx_pcrel)
252b5132 1274 return 0;
31312f95 1275
8d01d9a9
AJ
1276 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
1277 and changed later by validate_fix. */
1278 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
1279 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
1280 return 0;
1281
ce8a8b2f 1282 /* adjust_reloc_syms doesn't know about the GOT. */
252b5132
RH
1283 if (fixP->fx_r_type == BFD_RELOC_386_GOTOFF
1284 || fixP->fx_r_type == BFD_RELOC_386_PLT32
1285 || fixP->fx_r_type == BFD_RELOC_386_GOT32
13ae64f3
JJ
1286 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
1287 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
1288 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
1289 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
37e55690
JJ
1290 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
1291 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
13ae64f3
JJ
1292 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
1293 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
3e73aa7c
JH
1294 || fixP->fx_r_type == BFD_RELOC_X86_64_PLT32
1295 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
80b3ee89 1296 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
bffbf940
JJ
1297 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
1298 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
1299 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
d6ab8113 1300 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
bffbf940
JJ
1301 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
1302 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
d6ab8113
JB
1303 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
1304 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
252b5132
RH
1305 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1306 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1307 return 0;
31312f95 1308#endif
252b5132
RH
1309 return 1;
1310}
252b5132 1311
29b0f896 1312static int intel_float_operand PARAMS ((const char *mnemonic));
b4cac588
AM
1313
1314static int
252b5132 1315intel_float_operand (mnemonic)
29b0f896 1316 const char *mnemonic;
252b5132 1317{
9306ca4a
JB
1318 /* Note that the value returned is meaningful only for opcodes with (memory)
1319 operands, hence the code here is free to improperly handle opcodes that
1320 have no operands (for better performance and smaller code). */
1321
1322 if (mnemonic[0] != 'f')
1323 return 0; /* non-math */
1324
1325 switch (mnemonic[1])
1326 {
1327 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
1328 the fs segment override prefix not currently handled because no
1329 call path can make opcodes without operands get here */
1330 case 'i':
1331 return 2 /* integer op */;
1332 case 'l':
1333 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
1334 return 3; /* fldcw/fldenv */
1335 break;
1336 case 'n':
1337 if (mnemonic[2] != 'o' /* fnop */)
1338 return 3; /* non-waiting control op */
1339 break;
1340 case 'r':
1341 if (mnemonic[2] == 's')
1342 return 3; /* frstor/frstpm */
1343 break;
1344 case 's':
1345 if (mnemonic[2] == 'a')
1346 return 3; /* fsave */
1347 if (mnemonic[2] == 't')
1348 {
1349 switch (mnemonic[3])
1350 {
1351 case 'c': /* fstcw */
1352 case 'd': /* fstdw */
1353 case 'e': /* fstenv */
1354 case 's': /* fsts[gw] */
1355 return 3;
1356 }
1357 }
1358 break;
1359 case 'x':
1360 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
1361 return 0; /* fxsave/fxrstor are not really math ops */
1362 break;
1363 }
252b5132 1364
9306ca4a 1365 return 1;
252b5132
RH
1366}
1367
1368/* This is the guts of the machine-dependent assembler. LINE points to a
1369 machine dependent instruction. This function is supposed to emit
1370 the frags/bytes it assembles to. */
1371
1372void
1373md_assemble (line)
1374 char *line;
1375{
252b5132 1376 int j;
252b5132
RH
1377 char mnemonic[MAX_MNEM_SIZE];
1378
47926f60 1379 /* Initialize globals. */
252b5132
RH
1380 memset (&i, '\0', sizeof (i));
1381 for (j = 0; j < MAX_OPERANDS; j++)
1ae12ab7 1382 i.reloc[j] = NO_RELOC;
252b5132
RH
1383 memset (disp_expressions, '\0', sizeof (disp_expressions));
1384 memset (im_expressions, '\0', sizeof (im_expressions));
ce8a8b2f 1385 save_stack_p = save_stack;
252b5132
RH
1386
1387 /* First parse an instruction mnemonic & call i386_operand for the operands.
1388 We assume that the scrubber has arranged it so that line[0] is the valid
47926f60 1389 start of a (possibly prefixed) mnemonic. */
252b5132 1390
29b0f896
AM
1391 line = parse_insn (line, mnemonic);
1392 if (line == NULL)
1393 return;
252b5132 1394
29b0f896
AM
1395 line = parse_operands (line, mnemonic);
1396 if (line == NULL)
1397 return;
252b5132 1398
29b0f896
AM
1399 /* Now we've parsed the mnemonic into a set of templates, and have the
1400 operands at hand. */
1401
1402 /* All intel opcodes have reversed operands except for "bound" and
1403 "enter". We also don't reverse intersegment "jmp" and "call"
1404 instructions with 2 immediate operands so that the immediate segment
1405 precedes the offset, as it does when in AT&T mode. "enter" and the
1406 intersegment "jmp" and "call" instructions are the only ones that
1407 have two immediate operands. */
1408 if (intel_syntax && i.operands > 1
1409 && (strcmp (mnemonic, "bound") != 0)
30123838 1410 && (strcmp (mnemonic, "invlpga") != 0)
29b0f896
AM
1411 && !((i.types[0] & Imm) && (i.types[1] & Imm)))
1412 swap_operands ();
1413
1414 if (i.imm_operands)
1415 optimize_imm ();
1416
b300c311
L
1417 /* Don't optimize displacement for movabs since it only takes 64bit
1418 displacement. */
1419 if (i.disp_operands
1420 && (flag_code != CODE_64BIT
1421 || strcmp (mnemonic, "movabs") != 0))
29b0f896
AM
1422 optimize_disp ();
1423
1424 /* Next, we find a template that matches the given insn,
1425 making sure the overlap of the given operands types is consistent
1426 with the template operand types. */
252b5132 1427
29b0f896
AM
1428 if (!match_template ())
1429 return;
252b5132 1430
cd61ebfe
AM
1431 if (intel_syntax)
1432 {
1433 /* Undo SYSV386_COMPAT brokenness when in Intel mode. See i386.h */
1434 if (SYSV386_COMPAT
1435 && (i.tm.base_opcode & 0xfffffde0) == 0xdce0)
1436 i.tm.base_opcode ^= FloatR;
1437
1438 /* Zap movzx and movsx suffix. The suffix may have been set from
1439 "word ptr" or "byte ptr" on the source operand, but we'll use
1440 the suffix later to choose the destination register. */
1441 if ((i.tm.base_opcode & ~9) == 0x0fb6)
9306ca4a
JB
1442 {
1443 if (i.reg_operands < 2
1444 && !i.suffix
1445 && (~i.tm.opcode_modifier
1446 & (No_bSuf
1447 | No_wSuf
1448 | No_lSuf
1449 | No_sSuf
1450 | No_xSuf
1451 | No_qSuf)))
1452 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
1453
1454 i.suffix = 0;
1455 }
cd61ebfe 1456 }
24eab124 1457
29b0f896
AM
1458 if (i.tm.opcode_modifier & FWait)
1459 if (!add_prefix (FWAIT_OPCODE))
1460 return;
252b5132 1461
29b0f896
AM
1462 /* Check string instruction segment overrides. */
1463 if ((i.tm.opcode_modifier & IsString) != 0 && i.mem_operands != 0)
1464 {
1465 if (!check_string ())
5dd0794d 1466 return;
29b0f896 1467 }
5dd0794d 1468
29b0f896
AM
1469 if (!process_suffix ())
1470 return;
e413e4e9 1471
29b0f896
AM
1472 /* Make still unresolved immediate matches conform to size of immediate
1473 given in i.suffix. */
1474 if (!finalize_imm ())
1475 return;
252b5132 1476
29b0f896
AM
1477 if (i.types[0] & Imm1)
1478 i.imm_operands = 0; /* kludge for shift insns. */
1479 if (i.types[0] & ImplicitRegister)
1480 i.reg_operands--;
1481 if (i.types[1] & ImplicitRegister)
1482 i.reg_operands--;
1483 if (i.types[2] & ImplicitRegister)
1484 i.reg_operands--;
252b5132 1485
29b0f896
AM
1486 if (i.tm.opcode_modifier & ImmExt)
1487 {
02fc3089
L
1488 expressionS *exp;
1489
ca164297
L
1490 if ((i.tm.cpu_flags & CpuPNI) && i.operands > 0)
1491 {
67c1ffbe 1492 /* These Intel Prescott New Instructions have the fixed
ca164297
L
1493 operands with an opcode suffix which is coded in the same
1494 place as an 8-bit immediate field would be. Here we check
1495 those operands and remove them afterwards. */
1496 unsigned int x;
1497
a4622f40 1498 for (x = 0; x < i.operands; x++)
ca164297
L
1499 if (i.op[x].regs->reg_num != x)
1500 as_bad (_("can't use register '%%%s' as operand %d in '%s'."),
1501 i.op[x].regs->reg_name, x + 1, i.tm.name);
1502 i.operands = 0;
1503 }
1504
29b0f896
AM
1505 /* These AMD 3DNow! and Intel Katmai New Instructions have an
1506 opcode suffix which is coded in the same place as an 8-bit
1507 immediate field would be. Here we fake an 8-bit immediate
1508 operand from the opcode suffix stored in tm.extension_opcode. */
252b5132 1509
29b0f896 1510 assert (i.imm_operands == 0 && i.operands <= 2 && 2 < MAX_OPERANDS);
252b5132 1511
29b0f896
AM
1512 exp = &im_expressions[i.imm_operands++];
1513 i.op[i.operands].imms = exp;
1514 i.types[i.operands++] = Imm8;
1515 exp->X_op = O_constant;
1516 exp->X_add_number = i.tm.extension_opcode;
1517 i.tm.extension_opcode = None;
1518 }
252b5132 1519
29b0f896
AM
1520 /* For insns with operands there are more diddles to do to the opcode. */
1521 if (i.operands)
1522 {
1523 if (!process_operands ())
1524 return;
1525 }
1526 else if (!quiet_warnings && (i.tm.opcode_modifier & Ugh) != 0)
1527 {
1528 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
1529 as_warn (_("translating to `%sp'"), i.tm.name);
1530 }
252b5132 1531
29b0f896
AM
1532 /* Handle conversion of 'int $3' --> special int3 insn. */
1533 if (i.tm.base_opcode == INT_OPCODE && i.op[0].imms->X_add_number == 3)
1534 {
1535 i.tm.base_opcode = INT3_OPCODE;
1536 i.imm_operands = 0;
1537 }
252b5132 1538
29b0f896
AM
1539 if ((i.tm.opcode_modifier & (Jump | JumpByte | JumpDword))
1540 && i.op[0].disps->X_op == O_constant)
1541 {
1542 /* Convert "jmp constant" (and "call constant") to a jump (call) to
1543 the absolute address given by the constant. Since ix86 jumps and
1544 calls are pc relative, we need to generate a reloc. */
1545 i.op[0].disps->X_add_symbol = &abs_symbol;
1546 i.op[0].disps->X_op = O_symbol;
1547 }
252b5132 1548
29b0f896
AM
1549 if ((i.tm.opcode_modifier & Rex64) != 0)
1550 i.rex |= REX_MODE64;
252b5132 1551
29b0f896
AM
1552 /* For 8 bit registers we need an empty rex prefix. Also if the
1553 instruction already has a prefix, we need to convert old
1554 registers to new ones. */
773f551c 1555
29b0f896
AM
1556 if (((i.types[0] & Reg8) != 0
1557 && (i.op[0].regs->reg_flags & RegRex64) != 0)
1558 || ((i.types[1] & Reg8) != 0
1559 && (i.op[1].regs->reg_flags & RegRex64) != 0)
1560 || (((i.types[0] & Reg8) != 0 || (i.types[1] & Reg8) != 0)
1561 && i.rex != 0))
1562 {
1563 int x;
726c5dcd 1564
29b0f896
AM
1565 i.rex |= REX_OPCODE;
1566 for (x = 0; x < 2; x++)
1567 {
1568 /* Look for 8 bit operand that uses old registers. */
1569 if ((i.types[x] & Reg8) != 0
1570 && (i.op[x].regs->reg_flags & RegRex64) == 0)
773f551c 1571 {
29b0f896
AM
1572 /* In case it is "hi" register, give up. */
1573 if (i.op[x].regs->reg_num > 3)
0477af35 1574 as_bad (_("can't encode register '%%%s' in an instruction requiring REX prefix."),
29b0f896 1575 i.op[x].regs->reg_name);
773f551c 1576
29b0f896
AM
1577 /* Otherwise it is equivalent to the extended register.
1578 Since the encoding doesn't change this is merely
1579 cosmetic cleanup for debug output. */
1580
1581 i.op[x].regs = i.op[x].regs + 8;
773f551c 1582 }
29b0f896
AM
1583 }
1584 }
773f551c 1585
29b0f896
AM
1586 if (i.rex != 0)
1587 add_prefix (REX_OPCODE | i.rex);
1588
1589 /* We are ready to output the insn. */
1590 output_insn ();
1591}
1592
1593static char *
1594parse_insn (line, mnemonic)
1595 char *line;
1596 char *mnemonic;
1597{
1598 char *l = line;
1599 char *token_start = l;
1600 char *mnem_p;
5c6af06e
JB
1601 int supported;
1602 const template *t;
29b0f896
AM
1603
1604 /* Non-zero if we found a prefix only acceptable with string insns. */
1605 const char *expecting_string_instruction = NULL;
45288df1 1606
29b0f896
AM
1607 while (1)
1608 {
1609 mnem_p = mnemonic;
1610 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
1611 {
1612 mnem_p++;
1613 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
45288df1 1614 {
29b0f896
AM
1615 as_bad (_("no such instruction: `%s'"), token_start);
1616 return NULL;
1617 }
1618 l++;
1619 }
1620 if (!is_space_char (*l)
1621 && *l != END_OF_INSN
e44823cf
JB
1622 && (intel_syntax
1623 || (*l != PREFIX_SEPARATOR
1624 && *l != ',')))
29b0f896
AM
1625 {
1626 as_bad (_("invalid character %s in mnemonic"),
1627 output_invalid (*l));
1628 return NULL;
1629 }
1630 if (token_start == l)
1631 {
e44823cf 1632 if (!intel_syntax && *l == PREFIX_SEPARATOR)
29b0f896
AM
1633 as_bad (_("expecting prefix; got nothing"));
1634 else
1635 as_bad (_("expecting mnemonic; got nothing"));
1636 return NULL;
1637 }
45288df1 1638
29b0f896
AM
1639 /* Look up instruction (or prefix) via hash table. */
1640 current_templates = hash_find (op_hash, mnemonic);
47926f60 1641
29b0f896
AM
1642 if (*l != END_OF_INSN
1643 && (!is_space_char (*l) || l[1] != END_OF_INSN)
1644 && current_templates
1645 && (current_templates->start->opcode_modifier & IsPrefix))
1646 {
1647 /* If we are in 16-bit mode, do not allow addr16 or data16.
1648 Similarly, in 32-bit mode, do not allow addr32 or data32. */
1649 if ((current_templates->start->opcode_modifier & (Size16 | Size32))
1650 && flag_code != CODE_64BIT
1651 && (((current_templates->start->opcode_modifier & Size32) != 0)
1652 ^ (flag_code == CODE_16BIT)))
1653 {
1654 as_bad (_("redundant %s prefix"),
1655 current_templates->start->name);
1656 return NULL;
45288df1 1657 }
29b0f896
AM
1658 /* Add prefix, checking for repeated prefixes. */
1659 switch (add_prefix (current_templates->start->base_opcode))
1660 {
1661 case 0:
1662 return NULL;
1663 case 2:
1664 expecting_string_instruction = current_templates->start->name;
1665 break;
1666 }
1667 /* Skip past PREFIX_SEPARATOR and reset token_start. */
1668 token_start = ++l;
1669 }
1670 else
1671 break;
1672 }
45288df1 1673
29b0f896
AM
1674 if (!current_templates)
1675 {
1676 /* See if we can get a match by trimming off a suffix. */
1677 switch (mnem_p[-1])
1678 {
1679 case WORD_MNEM_SUFFIX:
9306ca4a
JB
1680 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
1681 i.suffix = SHORT_MNEM_SUFFIX;
1682 else
29b0f896
AM
1683 case BYTE_MNEM_SUFFIX:
1684 case QWORD_MNEM_SUFFIX:
1685 i.suffix = mnem_p[-1];
1686 mnem_p[-1] = '\0';
1687 current_templates = hash_find (op_hash, mnemonic);
1688 break;
1689 case SHORT_MNEM_SUFFIX:
1690 case LONG_MNEM_SUFFIX:
1691 if (!intel_syntax)
1692 {
1693 i.suffix = mnem_p[-1];
1694 mnem_p[-1] = '\0';
1695 current_templates = hash_find (op_hash, mnemonic);
1696 }
1697 break;
252b5132 1698
29b0f896
AM
1699 /* Intel Syntax. */
1700 case 'd':
1701 if (intel_syntax)
1702 {
9306ca4a 1703 if (intel_float_operand (mnemonic) == 1)
29b0f896
AM
1704 i.suffix = SHORT_MNEM_SUFFIX;
1705 else
1706 i.suffix = LONG_MNEM_SUFFIX;
1707 mnem_p[-1] = '\0';
1708 current_templates = hash_find (op_hash, mnemonic);
1709 }
1710 break;
1711 }
1712 if (!current_templates)
1713 {
1714 as_bad (_("no such instruction: `%s'"), token_start);
1715 return NULL;
1716 }
1717 }
252b5132 1718
29b0f896
AM
1719 if (current_templates->start->opcode_modifier & (Jump | JumpByte))
1720 {
1721 /* Check for a branch hint. We allow ",pt" and ",pn" for
1722 predict taken and predict not taken respectively.
1723 I'm not sure that branch hints actually do anything on loop
1724 and jcxz insns (JumpByte) for current Pentium4 chips. They
1725 may work in the future and it doesn't hurt to accept them
1726 now. */
1727 if (l[0] == ',' && l[1] == 'p')
1728 {
1729 if (l[2] == 't')
1730 {
1731 if (!add_prefix (DS_PREFIX_OPCODE))
1732 return NULL;
1733 l += 3;
1734 }
1735 else if (l[2] == 'n')
1736 {
1737 if (!add_prefix (CS_PREFIX_OPCODE))
1738 return NULL;
1739 l += 3;
1740 }
1741 }
1742 }
1743 /* Any other comma loses. */
1744 if (*l == ',')
1745 {
1746 as_bad (_("invalid character %s in mnemonic"),
1747 output_invalid (*l));
1748 return NULL;
1749 }
252b5132 1750
29b0f896 1751 /* Check if instruction is supported on specified architecture. */
5c6af06e
JB
1752 supported = 0;
1753 for (t = current_templates->start; t < current_templates->end; ++t)
1754 {
1755 if (!((t->cpu_flags & ~(Cpu64 | CpuNo64))
1756 & ~(cpu_arch_flags & ~(Cpu64 | CpuNo64))))
1757 supported |= 1;
1758 if (!(t->cpu_flags & (flag_code == CODE_64BIT ? CpuNo64 : Cpu64)))
1759 supported |= 2;
1760 }
1761 if (!(supported & 2))
1762 {
1763 as_bad (flag_code == CODE_64BIT
1764 ? _("`%s' is not supported in 64-bit mode")
1765 : _("`%s' is only supported in 64-bit mode"),
1766 current_templates->start->name);
1767 return NULL;
1768 }
1769 if (!(supported & 1))
29b0f896 1770 {
5c6af06e
JB
1771 as_warn (_("`%s' is not supported on `%s%s'"),
1772 current_templates->start->name,
1773 cpu_arch_name,
1774 cpu_sub_arch_name ? cpu_sub_arch_name : "");
29b0f896
AM
1775 }
1776 else if ((Cpu386 & ~cpu_arch_flags) && (flag_code != CODE_16BIT))
1777 {
1778 as_warn (_("use .code16 to ensure correct addressing mode"));
1779 }
252b5132 1780
29b0f896 1781 /* Check for rep/repne without a string instruction. */
f41bbced 1782 if (expecting_string_instruction)
29b0f896 1783 {
f41bbced
JB
1784 static templates override;
1785
1786 for (t = current_templates->start; t < current_templates->end; ++t)
1787 if (t->opcode_modifier & IsString)
1788 break;
1789 if (t >= current_templates->end)
1790 {
1791 as_bad (_("expecting string instruction after `%s'"),
1792 expecting_string_instruction);
1793 return NULL;
1794 }
1795 for (override.start = t; t < current_templates->end; ++t)
1796 if (!(t->opcode_modifier & IsString))
1797 break;
1798 override.end = t;
1799 current_templates = &override;
29b0f896 1800 }
252b5132 1801
29b0f896
AM
1802 return l;
1803}
252b5132 1804
29b0f896
AM
1805static char *
1806parse_operands (l, mnemonic)
1807 char *l;
1808 const char *mnemonic;
1809{
1810 char *token_start;
3138f287 1811
29b0f896
AM
1812 /* 1 if operand is pending after ','. */
1813 unsigned int expecting_operand = 0;
252b5132 1814
29b0f896
AM
1815 /* Non-zero if operand parens not balanced. */
1816 unsigned int paren_not_balanced;
1817
1818 while (*l != END_OF_INSN)
1819 {
1820 /* Skip optional white space before operand. */
1821 if (is_space_char (*l))
1822 ++l;
1823 if (!is_operand_char (*l) && *l != END_OF_INSN)
1824 {
1825 as_bad (_("invalid character %s before operand %d"),
1826 output_invalid (*l),
1827 i.operands + 1);
1828 return NULL;
1829 }
1830 token_start = l; /* after white space */
1831 paren_not_balanced = 0;
1832 while (paren_not_balanced || *l != ',')
1833 {
1834 if (*l == END_OF_INSN)
1835 {
1836 if (paren_not_balanced)
1837 {
1838 if (!intel_syntax)
1839 as_bad (_("unbalanced parenthesis in operand %d."),
1840 i.operands + 1);
1841 else
1842 as_bad (_("unbalanced brackets in operand %d."),
1843 i.operands + 1);
1844 return NULL;
1845 }
1846 else
1847 break; /* we are done */
1848 }
1849 else if (!is_operand_char (*l) && !is_space_char (*l))
1850 {
1851 as_bad (_("invalid character %s in operand %d"),
1852 output_invalid (*l),
1853 i.operands + 1);
1854 return NULL;
1855 }
1856 if (!intel_syntax)
1857 {
1858 if (*l == '(')
1859 ++paren_not_balanced;
1860 if (*l == ')')
1861 --paren_not_balanced;
1862 }
1863 else
1864 {
1865 if (*l == '[')
1866 ++paren_not_balanced;
1867 if (*l == ']')
1868 --paren_not_balanced;
1869 }
1870 l++;
1871 }
1872 if (l != token_start)
1873 { /* Yes, we've read in another operand. */
1874 unsigned int operand_ok;
1875 this_operand = i.operands++;
1876 if (i.operands > MAX_OPERANDS)
1877 {
1878 as_bad (_("spurious operands; (%d operands/instruction max)"),
1879 MAX_OPERANDS);
1880 return NULL;
1881 }
1882 /* Now parse operand adding info to 'i' as we go along. */
1883 END_STRING_AND_SAVE (l);
1884
1885 if (intel_syntax)
1886 operand_ok =
1887 i386_intel_operand (token_start,
1888 intel_float_operand (mnemonic));
1889 else
1890 operand_ok = i386_operand (token_start);
1891
1892 RESTORE_END_STRING (l);
1893 if (!operand_ok)
1894 return NULL;
1895 }
1896 else
1897 {
1898 if (expecting_operand)
1899 {
1900 expecting_operand_after_comma:
1901 as_bad (_("expecting operand after ','; got nothing"));
1902 return NULL;
1903 }
1904 if (*l == ',')
1905 {
1906 as_bad (_("expecting operand before ','; got nothing"));
1907 return NULL;
1908 }
1909 }
7f3f1ea2 1910
29b0f896
AM
1911 /* Now *l must be either ',' or END_OF_INSN. */
1912 if (*l == ',')
1913 {
1914 if (*++l == END_OF_INSN)
1915 {
1916 /* Just skip it, if it's \n complain. */
1917 goto expecting_operand_after_comma;
1918 }
1919 expecting_operand = 1;
1920 }
1921 }
1922 return l;
1923}
7f3f1ea2 1924
29b0f896
AM
1925static void
1926swap_operands ()
1927{
1928 union i386_op temp_op;
1929 unsigned int temp_type;
f86103b7 1930 enum bfd_reloc_code_real temp_reloc;
29b0f896
AM
1931 int xchg1 = 0;
1932 int xchg2 = 0;
252b5132 1933
29b0f896
AM
1934 if (i.operands == 2)
1935 {
1936 xchg1 = 0;
1937 xchg2 = 1;
1938 }
1939 else if (i.operands == 3)
1940 {
1941 xchg1 = 0;
1942 xchg2 = 2;
1943 }
1944 temp_type = i.types[xchg2];
1945 i.types[xchg2] = i.types[xchg1];
1946 i.types[xchg1] = temp_type;
1947 temp_op = i.op[xchg2];
1948 i.op[xchg2] = i.op[xchg1];
1949 i.op[xchg1] = temp_op;
1950 temp_reloc = i.reloc[xchg2];
1951 i.reloc[xchg2] = i.reloc[xchg1];
1952 i.reloc[xchg1] = temp_reloc;
1953
1954 if (i.mem_operands == 2)
1955 {
1956 const seg_entry *temp_seg;
1957 temp_seg = i.seg[0];
1958 i.seg[0] = i.seg[1];
1959 i.seg[1] = temp_seg;
1960 }
1961}
252b5132 1962
29b0f896
AM
1963/* Try to ensure constant immediates are represented in the smallest
1964 opcode possible. */
1965static void
1966optimize_imm ()
1967{
1968 char guess_suffix = 0;
1969 int op;
252b5132 1970
29b0f896
AM
1971 if (i.suffix)
1972 guess_suffix = i.suffix;
1973 else if (i.reg_operands)
1974 {
1975 /* Figure out a suffix from the last register operand specified.
1976 We can't do this properly yet, ie. excluding InOutPortReg,
1977 but the following works for instructions with immediates.
1978 In any case, we can't set i.suffix yet. */
1979 for (op = i.operands; --op >= 0;)
1980 if (i.types[op] & Reg)
252b5132 1981 {
29b0f896
AM
1982 if (i.types[op] & Reg8)
1983 guess_suffix = BYTE_MNEM_SUFFIX;
1984 else if (i.types[op] & Reg16)
1985 guess_suffix = WORD_MNEM_SUFFIX;
1986 else if (i.types[op] & Reg32)
1987 guess_suffix = LONG_MNEM_SUFFIX;
1988 else if (i.types[op] & Reg64)
1989 guess_suffix = QWORD_MNEM_SUFFIX;
1990 break;
252b5132 1991 }
29b0f896
AM
1992 }
1993 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
1994 guess_suffix = WORD_MNEM_SUFFIX;
1995
1996 for (op = i.operands; --op >= 0;)
1997 if (i.types[op] & Imm)
1998 {
1999 switch (i.op[op].imms->X_op)
252b5132 2000 {
29b0f896
AM
2001 case O_constant:
2002 /* If a suffix is given, this operand may be shortened. */
2003 switch (guess_suffix)
252b5132 2004 {
29b0f896
AM
2005 case LONG_MNEM_SUFFIX:
2006 i.types[op] |= Imm32 | Imm64;
2007 break;
2008 case WORD_MNEM_SUFFIX:
2009 i.types[op] |= Imm16 | Imm32S | Imm32 | Imm64;
2010 break;
2011 case BYTE_MNEM_SUFFIX:
2012 i.types[op] |= Imm16 | Imm8 | Imm8S | Imm32S | Imm32 | Imm64;
2013 break;
252b5132 2014 }
252b5132 2015
29b0f896
AM
2016 /* If this operand is at most 16 bits, convert it
2017 to a signed 16 bit number before trying to see
2018 whether it will fit in an even smaller size.
2019 This allows a 16-bit operand such as $0xffe0 to
2020 be recognised as within Imm8S range. */
2021 if ((i.types[op] & Imm16)
2022 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
252b5132 2023 {
29b0f896
AM
2024 i.op[op].imms->X_add_number =
2025 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
2026 }
2027 if ((i.types[op] & Imm32)
2028 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
2029 == 0))
2030 {
2031 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
2032 ^ ((offsetT) 1 << 31))
2033 - ((offsetT) 1 << 31));
2034 }
2035 i.types[op] |= smallest_imm_type (i.op[op].imms->X_add_number);
252b5132 2036
29b0f896
AM
2037 /* We must avoid matching of Imm32 templates when 64bit
2038 only immediate is available. */
2039 if (guess_suffix == QWORD_MNEM_SUFFIX)
2040 i.types[op] &= ~Imm32;
2041 break;
252b5132 2042
29b0f896
AM
2043 case O_absent:
2044 case O_register:
2045 abort ();
2046
2047 /* Symbols and expressions. */
2048 default:
2049 /* Convert symbolic operand to proper sizes for matching. */
2050 switch (guess_suffix)
2051 {
2052 case QWORD_MNEM_SUFFIX:
2053 i.types[op] = Imm64 | Imm32S;
2054 break;
2055 case LONG_MNEM_SUFFIX:
20f0a1fc 2056 i.types[op] = Imm32;
29b0f896
AM
2057 break;
2058 case WORD_MNEM_SUFFIX:
20f0a1fc 2059 i.types[op] = Imm16;
29b0f896
AM
2060 break;
2061 case BYTE_MNEM_SUFFIX:
20f0a1fc 2062 i.types[op] = Imm8 | Imm8S;
29b0f896 2063 break;
252b5132 2064 }
29b0f896 2065 break;
252b5132 2066 }
29b0f896
AM
2067 }
2068}
47926f60 2069
29b0f896
AM
2070/* Try to use the smallest displacement type too. */
2071static void
2072optimize_disp ()
2073{
2074 int op;
3e73aa7c 2075
29b0f896 2076 for (op = i.operands; --op >= 0;)
b300c311 2077 if (i.types[op] & Disp)
252b5132 2078 {
b300c311 2079 if (i.op[op].disps->X_op == O_constant)
252b5132 2080 {
b300c311 2081 offsetT disp = i.op[op].disps->X_add_number;
29b0f896 2082
b300c311
L
2083 if ((i.types[op] & Disp16)
2084 && (disp & ~(offsetT) 0xffff) == 0)
2085 {
2086 /* If this operand is at most 16 bits, convert
2087 to a signed 16 bit number and don't use 64bit
2088 displacement. */
2089 disp = (((disp & 0xffff) ^ 0x8000) - 0x8000);
2090 i.types[op] &= ~Disp64;
2091 }
2092 if ((i.types[op] & Disp32)
2093 && (disp & ~(((offsetT) 2 << 31) - 1)) == 0)
2094 {
2095 /* If this operand is at most 32 bits, convert
2096 to a signed 32 bit number and don't use 64bit
2097 displacement. */
2098 disp &= (((offsetT) 2 << 31) - 1);
2099 disp = (disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
2100 i.types[op] &= ~Disp64;
2101 }
2102 if (!disp && (i.types[op] & BaseIndex))
2103 {
2104 i.types[op] &= ~Disp;
2105 i.op[op].disps = 0;
2106 i.disp_operands--;
2107 }
2108 else if (flag_code == CODE_64BIT)
2109 {
2110 if (fits_in_signed_long (disp))
28a9d8f5
L
2111 {
2112 i.types[op] &= ~Disp64;
2113 i.types[op] |= Disp32S;
2114 }
b300c311
L
2115 if (fits_in_unsigned_long (disp))
2116 i.types[op] |= Disp32;
2117 }
2118 if ((i.types[op] & (Disp32 | Disp32S | Disp16))
2119 && fits_in_signed_byte (disp))
2120 i.types[op] |= Disp8;
252b5132 2121 }
b300c311
L
2122 else
2123 /* We only support 64bit displacement on constants. */
2124 i.types[op] &= ~Disp64;
252b5132 2125 }
29b0f896
AM
2126}
2127
2128static int
2129match_template ()
2130{
2131 /* Points to template once we've found it. */
2132 const template *t;
2133 unsigned int overlap0, overlap1, overlap2;
2134 unsigned int found_reverse_match;
2135 int suffix_check;
2136
2137#define MATCH(overlap, given, template) \
2138 ((overlap & ~JumpAbsolute) \
2139 && (((given) & (BaseIndex | JumpAbsolute)) \
2140 == ((overlap) & (BaseIndex | JumpAbsolute))))
2141
2142 /* If given types r0 and r1 are registers they must be of the same type
2143 unless the expected operand type register overlap is null.
2144 Note that Acc in a template matches every size of reg. */
2145#define CONSISTENT_REGISTER_MATCH(m0, g0, t0, m1, g1, t1) \
2146 (((g0) & Reg) == 0 || ((g1) & Reg) == 0 \
2147 || ((g0) & Reg) == ((g1) & Reg) \
2148 || ((((m0) & Acc) ? Reg : (t0)) & (((m1) & Acc) ? Reg : (t1)) & Reg) == 0 )
2149
2150 overlap0 = 0;
2151 overlap1 = 0;
2152 overlap2 = 0;
2153 found_reverse_match = 0;
2154 suffix_check = (i.suffix == BYTE_MNEM_SUFFIX
2155 ? No_bSuf
2156 : (i.suffix == WORD_MNEM_SUFFIX
2157 ? No_wSuf
2158 : (i.suffix == SHORT_MNEM_SUFFIX
2159 ? No_sSuf
2160 : (i.suffix == LONG_MNEM_SUFFIX
2161 ? No_lSuf
2162 : (i.suffix == QWORD_MNEM_SUFFIX
2163 ? No_qSuf
2164 : (i.suffix == LONG_DOUBLE_MNEM_SUFFIX
2165 ? No_xSuf : 0))))));
2166
20f0a1fc
NC
2167 t = current_templates->start;
2168 if (i.suffix == QWORD_MNEM_SUFFIX
2169 && flag_code != CODE_64BIT
9306ca4a
JB
2170 && (intel_syntax
2171 ? !(t->opcode_modifier & IgnoreSize)
2172 && !intel_float_operand (t->name)
2173 : intel_float_operand (t->name) != 2)
20f0a1fc
NC
2174 && (!(t->operand_types[0] & (RegMMX | RegXMM))
2175 || !(t->operand_types[t->operands > 1] & (RegMMX | RegXMM)))
2176 && (t->base_opcode != 0x0fc7
2177 || t->extension_opcode != 1 /* cmpxchg8b */))
2178 t = current_templates->end;
2179 for (; t < current_templates->end; t++)
29b0f896
AM
2180 {
2181 /* Must have right number of operands. */
2182 if (i.operands != t->operands)
2183 continue;
2184
2185 /* Check the suffix, except for some instructions in intel mode. */
2186 if ((t->opcode_modifier & suffix_check)
2187 && !(intel_syntax
9306ca4a 2188 && (t->opcode_modifier & IgnoreSize)))
29b0f896
AM
2189 continue;
2190
2191 /* Do not verify operands when there are none. */
2192 else if (!t->operands)
2193 {
2194 if (t->cpu_flags & ~cpu_arch_flags)
2195 continue;
2196 /* We've found a match; break out of loop. */
2197 break;
2198 }
252b5132 2199
29b0f896
AM
2200 overlap0 = i.types[0] & t->operand_types[0];
2201 switch (t->operands)
2202 {
2203 case 1:
2204 if (!MATCH (overlap0, i.types[0], t->operand_types[0]))
2205 continue;
2206 break;
2207 case 2:
2208 case 3:
2209 overlap1 = i.types[1] & t->operand_types[1];
2210 if (!MATCH (overlap0, i.types[0], t->operand_types[0])
2211 || !MATCH (overlap1, i.types[1], t->operand_types[1])
2212 || !CONSISTENT_REGISTER_MATCH (overlap0, i.types[0],
2213 t->operand_types[0],
2214 overlap1, i.types[1],
2215 t->operand_types[1]))
2216 {
2217 /* Check if other direction is valid ... */
2218 if ((t->opcode_modifier & (D | FloatD)) == 0)
2219 continue;
2220
2221 /* Try reversing direction of operands. */
2222 overlap0 = i.types[0] & t->operand_types[1];
2223 overlap1 = i.types[1] & t->operand_types[0];
2224 if (!MATCH (overlap0, i.types[0], t->operand_types[1])
2225 || !MATCH (overlap1, i.types[1], t->operand_types[0])
2226 || !CONSISTENT_REGISTER_MATCH (overlap0, i.types[0],
2227 t->operand_types[1],
2228 overlap1, i.types[1],
2229 t->operand_types[0]))
2230 {
2231 /* Does not match either direction. */
2232 continue;
2233 }
2234 /* found_reverse_match holds which of D or FloatDR
2235 we've found. */
2236 found_reverse_match = t->opcode_modifier & (D | FloatDR);
2237 }
2238 /* Found a forward 2 operand match here. */
2239 else if (t->operands == 3)
2240 {
2241 /* Here we make use of the fact that there are no
2242 reverse match 3 operand instructions, and all 3
2243 operand instructions only need to be checked for
2244 register consistency between operands 2 and 3. */
2245 overlap2 = i.types[2] & t->operand_types[2];
2246 if (!MATCH (overlap2, i.types[2], t->operand_types[2])
2247 || !CONSISTENT_REGISTER_MATCH (overlap1, i.types[1],
2248 t->operand_types[1],
2249 overlap2, i.types[2],
2250 t->operand_types[2]))
2251
2252 continue;
2253 }
2254 /* Found either forward/reverse 2 or 3 operand match here:
2255 slip through to break. */
2256 }
2257 if (t->cpu_flags & ~cpu_arch_flags)
2258 {
2259 found_reverse_match = 0;
2260 continue;
2261 }
2262 /* We've found a match; break out of loop. */
2263 break;
2264 }
2265
2266 if (t == current_templates->end)
2267 {
2268 /* We found no match. */
2269 as_bad (_("suffix or operands invalid for `%s'"),
2270 current_templates->start->name);
2271 return 0;
2272 }
252b5132 2273
29b0f896
AM
2274 if (!quiet_warnings)
2275 {
2276 if (!intel_syntax
2277 && ((i.types[0] & JumpAbsolute)
2278 != (t->operand_types[0] & JumpAbsolute)))
2279 {
2280 as_warn (_("indirect %s without `*'"), t->name);
2281 }
2282
2283 if ((t->opcode_modifier & (IsPrefix | IgnoreSize))
2284 == (IsPrefix | IgnoreSize))
2285 {
2286 /* Warn them that a data or address size prefix doesn't
2287 affect assembly of the next line of code. */
2288 as_warn (_("stand-alone `%s' prefix"), t->name);
2289 }
2290 }
2291
2292 /* Copy the template we found. */
2293 i.tm = *t;
2294 if (found_reverse_match)
2295 {
2296 /* If we found a reverse match we must alter the opcode
2297 direction bit. found_reverse_match holds bits to change
2298 (different for int & float insns). */
2299
2300 i.tm.base_opcode ^= found_reverse_match;
2301
2302 i.tm.operand_types[0] = t->operand_types[1];
2303 i.tm.operand_types[1] = t->operand_types[0];
2304 }
2305
2306 return 1;
2307}
2308
2309static int
2310check_string ()
2311{
2312 int mem_op = (i.types[0] & AnyMem) ? 0 : 1;
2313 if ((i.tm.operand_types[mem_op] & EsSeg) != 0)
2314 {
2315 if (i.seg[0] != NULL && i.seg[0] != &es)
2316 {
2317 as_bad (_("`%s' operand %d must use `%%es' segment"),
2318 i.tm.name,
2319 mem_op + 1);
2320 return 0;
2321 }
2322 /* There's only ever one segment override allowed per instruction.
2323 This instruction possibly has a legal segment override on the
2324 second operand, so copy the segment to where non-string
2325 instructions store it, allowing common code. */
2326 i.seg[0] = i.seg[1];
2327 }
2328 else if ((i.tm.operand_types[mem_op + 1] & EsSeg) != 0)
2329 {
2330 if (i.seg[1] != NULL && i.seg[1] != &es)
2331 {
2332 as_bad (_("`%s' operand %d must use `%%es' segment"),
2333 i.tm.name,
2334 mem_op + 2);
2335 return 0;
2336 }
2337 }
2338 return 1;
2339}
2340
2341static int
543613e9 2342process_suffix (void)
29b0f896
AM
2343{
2344 /* If matched instruction specifies an explicit instruction mnemonic
2345 suffix, use it. */
2346 if (i.tm.opcode_modifier & (Size16 | Size32 | Size64))
2347 {
2348 if (i.tm.opcode_modifier & Size16)
2349 i.suffix = WORD_MNEM_SUFFIX;
2350 else if (i.tm.opcode_modifier & Size64)
2351 i.suffix = QWORD_MNEM_SUFFIX;
2352 else
2353 i.suffix = LONG_MNEM_SUFFIX;
2354 }
2355 else if (i.reg_operands)
2356 {
2357 /* If there's no instruction mnemonic suffix we try to invent one
2358 based on register operands. */
2359 if (!i.suffix)
2360 {
2361 /* We take i.suffix from the last register operand specified,
2362 Destination register type is more significant than source
2363 register type. */
2364 int op;
543613e9 2365
29b0f896
AM
2366 for (op = i.operands; --op >= 0;)
2367 if ((i.types[op] & Reg)
2368 && !(i.tm.operand_types[op] & InOutPortReg))
2369 {
2370 i.suffix = ((i.types[op] & Reg8) ? BYTE_MNEM_SUFFIX :
2371 (i.types[op] & Reg16) ? WORD_MNEM_SUFFIX :
2372 (i.types[op] & Reg64) ? QWORD_MNEM_SUFFIX :
2373 LONG_MNEM_SUFFIX);
2374 break;
2375 }
2376 }
2377 else if (i.suffix == BYTE_MNEM_SUFFIX)
2378 {
2379 if (!check_byte_reg ())
2380 return 0;
2381 }
2382 else if (i.suffix == LONG_MNEM_SUFFIX)
2383 {
2384 if (!check_long_reg ())
2385 return 0;
2386 }
2387 else if (i.suffix == QWORD_MNEM_SUFFIX)
2388 {
2389 if (!check_qword_reg ())
2390 return 0;
2391 }
2392 else if (i.suffix == WORD_MNEM_SUFFIX)
2393 {
2394 if (!check_word_reg ())
2395 return 0;
2396 }
2397 else if (intel_syntax && (i.tm.opcode_modifier & IgnoreSize))
2398 /* Do nothing if the instruction is going to ignore the prefix. */
2399 ;
2400 else
2401 abort ();
2402 }
9306ca4a
JB
2403 else if ((i.tm.opcode_modifier & DefaultSize)
2404 && !i.suffix
2405 /* exclude fldenv/frstor/fsave/fstenv */
2406 && (i.tm.opcode_modifier & No_sSuf))
29b0f896
AM
2407 {
2408 i.suffix = stackop_size;
2409 }
9306ca4a
JB
2410 else if (intel_syntax
2411 && !i.suffix
2412 && ((i.tm.operand_types[0] & JumpAbsolute)
2413 || (i.tm.opcode_modifier & (JumpByte|JumpInterSegment))
2414 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
2415 && i.tm.extension_opcode <= 3)))
2416 {
2417 switch (flag_code)
2418 {
2419 case CODE_64BIT:
2420 if (!(i.tm.opcode_modifier & No_qSuf))
2421 {
2422 i.suffix = QWORD_MNEM_SUFFIX;
2423 break;
2424 }
2425 case CODE_32BIT:
2426 if (!(i.tm.opcode_modifier & No_lSuf))
2427 i.suffix = LONG_MNEM_SUFFIX;
2428 break;
2429 case CODE_16BIT:
2430 if (!(i.tm.opcode_modifier & No_wSuf))
2431 i.suffix = WORD_MNEM_SUFFIX;
2432 break;
2433 }
2434 }
252b5132 2435
9306ca4a 2436 if (!i.suffix)
29b0f896 2437 {
9306ca4a
JB
2438 if (!intel_syntax)
2439 {
2440 if (i.tm.opcode_modifier & W)
2441 {
2442 as_bad (_("no instruction mnemonic suffix given and no register operands; can't size instruction"));
2443 return 0;
2444 }
2445 }
2446 else
2447 {
2448 unsigned int suffixes = ~i.tm.opcode_modifier
2449 & (No_bSuf
2450 | No_wSuf
2451 | No_lSuf
2452 | No_sSuf
2453 | No_xSuf
2454 | No_qSuf);
2455
2456 if ((i.tm.opcode_modifier & W)
2457 || ((suffixes & (suffixes - 1))
2458 && !(i.tm.opcode_modifier & (DefaultSize | IgnoreSize))))
2459 {
2460 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
2461 return 0;
2462 }
2463 }
29b0f896 2464 }
252b5132 2465
9306ca4a
JB
2466 /* Change the opcode based on the operand size given by i.suffix;
2467 We don't need to change things for byte insns. */
2468
29b0f896
AM
2469 if (i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
2470 {
2471 /* It's not a byte, select word/dword operation. */
2472 if (i.tm.opcode_modifier & W)
2473 {
2474 if (i.tm.opcode_modifier & ShortForm)
2475 i.tm.base_opcode |= 8;
2476 else
2477 i.tm.base_opcode |= 1;
2478 }
0f3f3d8b 2479
29b0f896
AM
2480 /* Now select between word & dword operations via the operand
2481 size prefix, except for instructions that will ignore this
2482 prefix anyway. */
2483 if (i.suffix != QWORD_MNEM_SUFFIX
9306ca4a
JB
2484 && i.suffix != LONG_DOUBLE_MNEM_SUFFIX
2485 && !(i.tm.opcode_modifier & (IgnoreSize | FloatMF))
9146926a
AM
2486 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
2487 || (flag_code == CODE_64BIT
2488 && (i.tm.opcode_modifier & JumpByte))))
24eab124
AM
2489 {
2490 unsigned int prefix = DATA_PREFIX_OPCODE;
543613e9 2491
29b0f896
AM
2492 if (i.tm.opcode_modifier & JumpByte) /* jcxz, loop */
2493 prefix = ADDR_PREFIX_OPCODE;
252b5132 2494
29b0f896
AM
2495 if (!add_prefix (prefix))
2496 return 0;
24eab124 2497 }
252b5132 2498
29b0f896
AM
2499 /* Set mode64 for an operand. */
2500 if (i.suffix == QWORD_MNEM_SUFFIX
9146926a 2501 && flag_code == CODE_64BIT
29b0f896 2502 && (i.tm.opcode_modifier & NoRex64) == 0)
9146926a 2503 i.rex |= REX_MODE64;
3e73aa7c 2504
29b0f896
AM
2505 /* Size floating point instruction. */
2506 if (i.suffix == LONG_MNEM_SUFFIX)
543613e9
NC
2507 if (i.tm.opcode_modifier & FloatMF)
2508 i.tm.base_opcode ^= 4;
29b0f896 2509 }
7ecd2f8b 2510
29b0f896
AM
2511 return 1;
2512}
3e73aa7c 2513
29b0f896 2514static int
543613e9 2515check_byte_reg (void)
29b0f896
AM
2516{
2517 int op;
543613e9 2518
29b0f896
AM
2519 for (op = i.operands; --op >= 0;)
2520 {
2521 /* If this is an eight bit register, it's OK. If it's the 16 or
2522 32 bit version of an eight bit register, we will just use the
2523 low portion, and that's OK too. */
2524 if (i.types[op] & Reg8)
2525 continue;
2526
2527 /* movzx and movsx should not generate this warning. */
2528 if (intel_syntax
2529 && (i.tm.base_opcode == 0xfb7
2530 || i.tm.base_opcode == 0xfb6
2531 || i.tm.base_opcode == 0x63
2532 || i.tm.base_opcode == 0xfbe
2533 || i.tm.base_opcode == 0xfbf))
2534 continue;
2535
65ec77d2 2536 if ((i.types[op] & WordReg) && i.op[op].regs->reg_num < 4)
29b0f896
AM
2537 {
2538 /* Prohibit these changes in the 64bit mode, since the
2539 lowering is more complicated. */
2540 if (flag_code == CODE_64BIT
2541 && (i.tm.operand_types[op] & InOutPortReg) == 0)
2542 {
0f3f3d8b 2543 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
29b0f896
AM
2544 i.op[op].regs->reg_name,
2545 i.suffix);
2546 return 0;
2547 }
2548#if REGISTER_WARNINGS
2549 if (!quiet_warnings
2550 && (i.tm.operand_types[op] & InOutPortReg) == 0)
2551 as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
2552 (i.op[op].regs + (i.types[op] & Reg16
2553 ? REGNAM_AL - REGNAM_AX
2554 : REGNAM_AL - REGNAM_EAX))->reg_name,
2555 i.op[op].regs->reg_name,
2556 i.suffix);
2557#endif
2558 continue;
2559 }
2560 /* Any other register is bad. */
2561 if (i.types[op] & (Reg | RegMMX | RegXMM
2562 | SReg2 | SReg3
2563 | Control | Debug | Test
2564 | FloatReg | FloatAcc))
2565 {
2566 as_bad (_("`%%%s' not allowed with `%s%c'"),
2567 i.op[op].regs->reg_name,
2568 i.tm.name,
2569 i.suffix);
2570 return 0;
2571 }
2572 }
2573 return 1;
2574}
2575
2576static int
2577check_long_reg ()
2578{
2579 int op;
2580
2581 for (op = i.operands; --op >= 0;)
2582 /* Reject eight bit registers, except where the template requires
2583 them. (eg. movzb) */
2584 if ((i.types[op] & Reg8) != 0
2585 && (i.tm.operand_types[op] & (Reg16 | Reg32 | Acc)) != 0)
2586 {
2587 as_bad (_("`%%%s' not allowed with `%s%c'"),
2588 i.op[op].regs->reg_name,
2589 i.tm.name,
2590 i.suffix);
2591 return 0;
2592 }
2593 /* Warn if the e prefix on a general reg is missing. */
2594 else if ((!quiet_warnings || flag_code == CODE_64BIT)
2595 && (i.types[op] & Reg16) != 0
2596 && (i.tm.operand_types[op] & (Reg32 | Acc)) != 0)
2597 {
2598 /* Prohibit these changes in the 64bit mode, since the
2599 lowering is more complicated. */
2600 if (flag_code == CODE_64BIT)
252b5132 2601 {
0f3f3d8b 2602 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
29b0f896
AM
2603 i.op[op].regs->reg_name,
2604 i.suffix);
2605 return 0;
252b5132 2606 }
29b0f896
AM
2607#if REGISTER_WARNINGS
2608 else
2609 as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
2610 (i.op[op].regs + REGNAM_EAX - REGNAM_AX)->reg_name,
2611 i.op[op].regs->reg_name,
2612 i.suffix);
2613#endif
252b5132 2614 }
29b0f896
AM
2615 /* Warn if the r prefix on a general reg is missing. */
2616 else if ((i.types[op] & Reg64) != 0
2617 && (i.tm.operand_types[op] & (Reg32 | Acc)) != 0)
252b5132 2618 {
0f3f3d8b 2619 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
29b0f896
AM
2620 i.op[op].regs->reg_name,
2621 i.suffix);
2622 return 0;
2623 }
2624 return 1;
2625}
252b5132 2626
29b0f896
AM
2627static int
2628check_qword_reg ()
2629{
2630 int op;
252b5132 2631
29b0f896
AM
2632 for (op = i.operands; --op >= 0; )
2633 /* Reject eight bit registers, except where the template requires
2634 them. (eg. movzb) */
2635 if ((i.types[op] & Reg8) != 0
2636 && (i.tm.operand_types[op] & (Reg16 | Reg32 | Acc)) != 0)
2637 {
2638 as_bad (_("`%%%s' not allowed with `%s%c'"),
2639 i.op[op].regs->reg_name,
2640 i.tm.name,
2641 i.suffix);
2642 return 0;
2643 }
2644 /* Warn if the e prefix on a general reg is missing. */
2645 else if (((i.types[op] & Reg16) != 0
2646 || (i.types[op] & Reg32) != 0)
2647 && (i.tm.operand_types[op] & (Reg32 | Acc)) != 0)
2648 {
2649 /* Prohibit these changes in the 64bit mode, since the
2650 lowering is more complicated. */
0f3f3d8b 2651 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
29b0f896
AM
2652 i.op[op].regs->reg_name,
2653 i.suffix);
2654 return 0;
252b5132 2655 }
29b0f896
AM
2656 return 1;
2657}
252b5132 2658
29b0f896
AM
2659static int
2660check_word_reg ()
2661{
2662 int op;
2663 for (op = i.operands; --op >= 0;)
2664 /* Reject eight bit registers, except where the template requires
2665 them. (eg. movzb) */
2666 if ((i.types[op] & Reg8) != 0
2667 && (i.tm.operand_types[op] & (Reg16 | Reg32 | Acc)) != 0)
2668 {
2669 as_bad (_("`%%%s' not allowed with `%s%c'"),
2670 i.op[op].regs->reg_name,
2671 i.tm.name,
2672 i.suffix);
2673 return 0;
2674 }
2675 /* Warn if the e prefix on a general reg is present. */
2676 else if ((!quiet_warnings || flag_code == CODE_64BIT)
2677 && (i.types[op] & Reg32) != 0
2678 && (i.tm.operand_types[op] & (Reg16 | Acc)) != 0)
252b5132 2679 {
29b0f896
AM
2680 /* Prohibit these changes in the 64bit mode, since the
2681 lowering is more complicated. */
2682 if (flag_code == CODE_64BIT)
252b5132 2683 {
0f3f3d8b 2684 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
29b0f896
AM
2685 i.op[op].regs->reg_name,
2686 i.suffix);
2687 return 0;
252b5132 2688 }
29b0f896
AM
2689 else
2690#if REGISTER_WARNINGS
2691 as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
2692 (i.op[op].regs + REGNAM_AX - REGNAM_EAX)->reg_name,
2693 i.op[op].regs->reg_name,
2694 i.suffix);
2695#endif
2696 }
2697 return 1;
2698}
252b5132 2699
29b0f896
AM
2700static int
2701finalize_imm ()
2702{
2703 unsigned int overlap0, overlap1, overlap2;
2704
2705 overlap0 = i.types[0] & i.tm.operand_types[0];
20f0a1fc 2706 if ((overlap0 & (Imm8 | Imm8S | Imm16 | Imm32 | Imm32S | Imm64))
29b0f896
AM
2707 && overlap0 != Imm8 && overlap0 != Imm8S
2708 && overlap0 != Imm16 && overlap0 != Imm32S
2709 && overlap0 != Imm32 && overlap0 != Imm64)
2710 {
2711 if (i.suffix)
2712 {
2713 overlap0 &= (i.suffix == BYTE_MNEM_SUFFIX
2714 ? Imm8 | Imm8S
2715 : (i.suffix == WORD_MNEM_SUFFIX
2716 ? Imm16
2717 : (i.suffix == QWORD_MNEM_SUFFIX
2718 ? Imm64 | Imm32S
2719 : Imm32)));
2720 }
2721 else if (overlap0 == (Imm16 | Imm32S | Imm32)
2722 || overlap0 == (Imm16 | Imm32)
2723 || overlap0 == (Imm16 | Imm32S))
2724 {
2725 overlap0 = ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0)
2726 ? Imm16 : Imm32S);
2727 }
2728 if (overlap0 != Imm8 && overlap0 != Imm8S
2729 && overlap0 != Imm16 && overlap0 != Imm32S
2730 && overlap0 != Imm32 && overlap0 != Imm64)
2731 {
2732 as_bad (_("no instruction mnemonic suffix given; can't determine immediate size"));
2733 return 0;
2734 }
2735 }
2736 i.types[0] = overlap0;
2737
2738 overlap1 = i.types[1] & i.tm.operand_types[1];
37edbb65 2739 if ((overlap1 & (Imm8 | Imm8S | Imm16 | Imm32S | Imm32 | Imm64))
29b0f896
AM
2740 && overlap1 != Imm8 && overlap1 != Imm8S
2741 && overlap1 != Imm16 && overlap1 != Imm32S
2742 && overlap1 != Imm32 && overlap1 != Imm64)
2743 {
2744 if (i.suffix)
2745 {
2746 overlap1 &= (i.suffix == BYTE_MNEM_SUFFIX
2747 ? Imm8 | Imm8S
2748 : (i.suffix == WORD_MNEM_SUFFIX
2749 ? Imm16
2750 : (i.suffix == QWORD_MNEM_SUFFIX
2751 ? Imm64 | Imm32S
2752 : Imm32)));
2753 }
2754 else if (overlap1 == (Imm16 | Imm32 | Imm32S)
2755 || overlap1 == (Imm16 | Imm32)
2756 || overlap1 == (Imm16 | Imm32S))
2757 {
2758 overlap1 = ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0)
2759 ? Imm16 : Imm32S);
2760 }
2761 if (overlap1 != Imm8 && overlap1 != Imm8S
2762 && overlap1 != Imm16 && overlap1 != Imm32S
2763 && overlap1 != Imm32 && overlap1 != Imm64)
2764 {
2765 as_bad (_("no instruction mnemonic suffix given; can't determine immediate size %x %c"),overlap1, i.suffix);
2766 return 0;
2767 }
2768 }
2769 i.types[1] = overlap1;
2770
2771 overlap2 = i.types[2] & i.tm.operand_types[2];
2772 assert ((overlap2 & Imm) == 0);
2773 i.types[2] = overlap2;
2774
2775 return 1;
2776}
2777
2778static int
2779process_operands ()
2780{
2781 /* Default segment register this instruction will use for memory
2782 accesses. 0 means unknown. This is only for optimizing out
2783 unnecessary segment overrides. */
2784 const seg_entry *default_seg = 0;
2785
2786 /* The imul $imm, %reg instruction is converted into
2787 imul $imm, %reg, %reg, and the clr %reg instruction
2788 is converted into xor %reg, %reg. */
2789 if (i.tm.opcode_modifier & regKludge)
2790 {
2791 unsigned int first_reg_op = (i.types[0] & Reg) ? 0 : 1;
2792 /* Pretend we saw the extra register operand. */
2793 assert (i.op[first_reg_op + 1].regs == 0);
2794 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
2795 i.types[first_reg_op + 1] = i.types[first_reg_op];
2796 i.reg_operands = 2;
2797 }
2798
2799 if (i.tm.opcode_modifier & ShortForm)
2800 {
2801 /* The register or float register operand is in operand 0 or 1. */
2802 unsigned int op = (i.types[0] & (Reg | FloatReg)) ? 0 : 1;
2803 /* Register goes in low 3 bits of opcode. */
2804 i.tm.base_opcode |= i.op[op].regs->reg_num;
2805 if ((i.op[op].regs->reg_flags & RegRex) != 0)
2806 i.rex |= REX_EXTZ;
2807 if (!quiet_warnings && (i.tm.opcode_modifier & Ugh) != 0)
2808 {
2809 /* Warn about some common errors, but press on regardless.
2810 The first case can be generated by gcc (<= 2.8.1). */
2811 if (i.operands == 2)
2812 {
2813 /* Reversed arguments on faddp, fsubp, etc. */
2814 as_warn (_("translating to `%s %%%s,%%%s'"), i.tm.name,
2815 i.op[1].regs->reg_name,
2816 i.op[0].regs->reg_name);
2817 }
2818 else
2819 {
2820 /* Extraneous `l' suffix on fp insn. */
2821 as_warn (_("translating to `%s %%%s'"), i.tm.name,
2822 i.op[0].regs->reg_name);
2823 }
2824 }
2825 }
2826 else if (i.tm.opcode_modifier & Modrm)
2827 {
2828 /* The opcode is completed (modulo i.tm.extension_opcode which
52271982
AM
2829 must be put into the modrm byte). Now, we make the modrm and
2830 index base bytes based on all the info we've collected. */
29b0f896
AM
2831
2832 default_seg = build_modrm_byte ();
2833 }
2834 else if (i.tm.opcode_modifier & (Seg2ShortForm | Seg3ShortForm))
2835 {
2836 if (i.tm.base_opcode == POP_SEG_SHORT
2837 && i.op[0].regs->reg_num == 1)
2838 {
2839 as_bad (_("you can't `pop %%cs'"));
2840 return 0;
2841 }
2842 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
2843 if ((i.op[0].regs->reg_flags & RegRex) != 0)
2844 i.rex |= REX_EXTZ;
2845 }
2846 else if ((i.tm.base_opcode & ~(D | W)) == MOV_AX_DISP32)
2847 {
2848 default_seg = &ds;
2849 }
2850 else if ((i.tm.opcode_modifier & IsString) != 0)
2851 {
2852 /* For the string instructions that allow a segment override
2853 on one of their operands, the default segment is ds. */
2854 default_seg = &ds;
2855 }
2856
30123838
JB
2857 if ((i.tm.base_opcode == 0x8d /* lea */
2858 || (i.tm.cpu_flags & CpuSVME))
2859 && i.seg[0] && !quiet_warnings)
2860 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
52271982
AM
2861
2862 /* If a segment was explicitly specified, and the specified segment
2863 is not the default, use an opcode prefix to select it. If we
2864 never figured out what the default segment is, then default_seg
2865 will be zero at this point, and the specified segment prefix will
2866 always be used. */
29b0f896
AM
2867 if ((i.seg[0]) && (i.seg[0] != default_seg))
2868 {
2869 if (!add_prefix (i.seg[0]->seg_prefix))
2870 return 0;
2871 }
2872 return 1;
2873}
2874
2875static const seg_entry *
2876build_modrm_byte ()
2877{
2878 const seg_entry *default_seg = 0;
2879
2880 /* i.reg_operands MUST be the number of real register operands;
2881 implicit registers do not count. */
2882 if (i.reg_operands == 2)
2883 {
2884 unsigned int source, dest;
2885 source = ((i.types[0]
2886 & (Reg | RegMMX | RegXMM
2887 | SReg2 | SReg3
2888 | Control | Debug | Test))
2889 ? 0 : 1);
2890 dest = source + 1;
2891
2892 i.rm.mode = 3;
2893 /* One of the register operands will be encoded in the i.tm.reg
2894 field, the other in the combined i.tm.mode and i.tm.regmem
2895 fields. If no form of this instruction supports a memory
2896 destination operand, then we assume the source operand may
2897 sometimes be a memory operand and so we need to store the
2898 destination in the i.rm.reg field. */
2899 if ((i.tm.operand_types[dest] & AnyMem) == 0)
2900 {
2901 i.rm.reg = i.op[dest].regs->reg_num;
2902 i.rm.regmem = i.op[source].regs->reg_num;
2903 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
2904 i.rex |= REX_EXTX;
2905 if ((i.op[source].regs->reg_flags & RegRex) != 0)
2906 i.rex |= REX_EXTZ;
2907 }
2908 else
2909 {
2910 i.rm.reg = i.op[source].regs->reg_num;
2911 i.rm.regmem = i.op[dest].regs->reg_num;
2912 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
2913 i.rex |= REX_EXTZ;
2914 if ((i.op[source].regs->reg_flags & RegRex) != 0)
2915 i.rex |= REX_EXTX;
2916 }
c4a530c5
JB
2917 if (flag_code != CODE_64BIT && (i.rex & (REX_EXTX | REX_EXTZ)))
2918 {
2919 if (!((i.types[0] | i.types[1]) & Control))
2920 abort ();
2921 i.rex &= ~(REX_EXTX | REX_EXTZ);
2922 add_prefix (LOCK_PREFIX_OPCODE);
2923 }
29b0f896
AM
2924 }
2925 else
2926 { /* If it's not 2 reg operands... */
2927 if (i.mem_operands)
2928 {
2929 unsigned int fake_zero_displacement = 0;
2930 unsigned int op = ((i.types[0] & AnyMem)
2931 ? 0
2932 : (i.types[1] & AnyMem) ? 1 : 2);
2933
2934 default_seg = &ds;
2935
2936 if (i.base_reg == 0)
2937 {
2938 i.rm.mode = 0;
2939 if (!i.disp_operands)
2940 fake_zero_displacement = 1;
2941 if (i.index_reg == 0)
2942 {
2943 /* Operand is just <disp> */
20f0a1fc 2944 if (flag_code == CODE_64BIT)
29b0f896
AM
2945 {
2946 /* 64bit mode overwrites the 32bit absolute
2947 addressing by RIP relative addressing and
2948 absolute addressing is encoded by one of the
2949 redundant SIB forms. */
2950 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
2951 i.sib.base = NO_BASE_REGISTER;
2952 i.sib.index = NO_INDEX_REGISTER;
20f0a1fc
NC
2953 i.types[op] = ((i.prefix[ADDR_PREFIX] == 0) ? Disp32S : Disp32);
2954 }
2955 else if ((flag_code == CODE_16BIT) ^ (i.prefix[ADDR_PREFIX] != 0))
2956 {
2957 i.rm.regmem = NO_BASE_REGISTER_16;
2958 i.types[op] = Disp16;
2959 }
2960 else
2961 {
2962 i.rm.regmem = NO_BASE_REGISTER;
2963 i.types[op] = Disp32;
29b0f896
AM
2964 }
2965 }
2966 else /* !i.base_reg && i.index_reg */
2967 {
2968 i.sib.index = i.index_reg->reg_num;
2969 i.sib.base = NO_BASE_REGISTER;
2970 i.sib.scale = i.log2_scale_factor;
2971 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
2972 i.types[op] &= ~Disp;
2973 if (flag_code != CODE_64BIT)
2974 i.types[op] |= Disp32; /* Must be 32 bit */
2975 else
2976 i.types[op] |= Disp32S;
2977 if ((i.index_reg->reg_flags & RegRex) != 0)
2978 i.rex |= REX_EXTY;
2979 }
2980 }
2981 /* RIP addressing for 64bit mode. */
2982 else if (i.base_reg->reg_type == BaseIndex)
2983 {
2984 i.rm.regmem = NO_BASE_REGISTER;
20f0a1fc 2985 i.types[op] &= ~ Disp;
29b0f896
AM
2986 i.types[op] |= Disp32S;
2987 i.flags[op] = Operand_PCrel;
20f0a1fc
NC
2988 if (! i.disp_operands)
2989 fake_zero_displacement = 1;
29b0f896
AM
2990 }
2991 else if (i.base_reg->reg_type & Reg16)
2992 {
2993 switch (i.base_reg->reg_num)
2994 {
2995 case 3: /* (%bx) */
2996 if (i.index_reg == 0)
2997 i.rm.regmem = 7;
2998 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
2999 i.rm.regmem = i.index_reg->reg_num - 6;
3000 break;
3001 case 5: /* (%bp) */
3002 default_seg = &ss;
3003 if (i.index_reg == 0)
3004 {
3005 i.rm.regmem = 6;
3006 if ((i.types[op] & Disp) == 0)
3007 {
3008 /* fake (%bp) into 0(%bp) */
3009 i.types[op] |= Disp8;
252b5132 3010 fake_zero_displacement = 1;
29b0f896
AM
3011 }
3012 }
3013 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
3014 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
3015 break;
3016 default: /* (%si) -> 4 or (%di) -> 5 */
3017 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
3018 }
3019 i.rm.mode = mode_from_disp_size (i.types[op]);
3020 }
3021 else /* i.base_reg and 32/64 bit mode */
3022 {
3023 if (flag_code == CODE_64BIT
3024 && (i.types[op] & Disp))
20f0a1fc
NC
3025 i.types[op] = (i.types[op] & Disp8) | (i.prefix[ADDR_PREFIX] == 0 ? Disp32S : Disp32);
3026
29b0f896
AM
3027 i.rm.regmem = i.base_reg->reg_num;
3028 if ((i.base_reg->reg_flags & RegRex) != 0)
3029 i.rex |= REX_EXTZ;
3030 i.sib.base = i.base_reg->reg_num;
3031 /* x86-64 ignores REX prefix bit here to avoid decoder
3032 complications. */
3033 if ((i.base_reg->reg_num & 7) == EBP_REG_NUM)
3034 {
3035 default_seg = &ss;
3036 if (i.disp_operands == 0)
3037 {
3038 fake_zero_displacement = 1;
3039 i.types[op] |= Disp8;
3040 }
3041 }
3042 else if (i.base_reg->reg_num == ESP_REG_NUM)
3043 {
3044 default_seg = &ss;
3045 }
3046 i.sib.scale = i.log2_scale_factor;
3047 if (i.index_reg == 0)
3048 {
3049 /* <disp>(%esp) becomes two byte modrm with no index
3050 register. We've already stored the code for esp
3051 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
3052 Any base register besides %esp will not use the
3053 extra modrm byte. */
3054 i.sib.index = NO_INDEX_REGISTER;
3055#if !SCALE1_WHEN_NO_INDEX
3056 /* Another case where we force the second modrm byte. */
3057 if (i.log2_scale_factor)
3058 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
252b5132 3059#endif
29b0f896
AM
3060 }
3061 else
3062 {
3063 i.sib.index = i.index_reg->reg_num;
3064 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
3065 if ((i.index_reg->reg_flags & RegRex) != 0)
3066 i.rex |= REX_EXTY;
3067 }
3068 i.rm.mode = mode_from_disp_size (i.types[op]);
3069 }
252b5132 3070
29b0f896
AM
3071 if (fake_zero_displacement)
3072 {
3073 /* Fakes a zero displacement assuming that i.types[op]
3074 holds the correct displacement size. */
3075 expressionS *exp;
3076
3077 assert (i.op[op].disps == 0);
3078 exp = &disp_expressions[i.disp_operands++];
3079 i.op[op].disps = exp;
3080 exp->X_op = O_constant;
3081 exp->X_add_number = 0;
3082 exp->X_add_symbol = (symbolS *) 0;
3083 exp->X_op_symbol = (symbolS *) 0;
3084 }
3085 }
252b5132 3086
29b0f896
AM
3087 /* Fill in i.rm.reg or i.rm.regmem field with register operand
3088 (if any) based on i.tm.extension_opcode. Again, we must be
3089 careful to make sure that segment/control/debug/test/MMX
3090 registers are coded into the i.rm.reg field. */
3091 if (i.reg_operands)
3092 {
3093 unsigned int op =
3094 ((i.types[0]
3095 & (Reg | RegMMX | RegXMM
3096 | SReg2 | SReg3
3097 | Control | Debug | Test))
3098 ? 0
3099 : ((i.types[1]
3100 & (Reg | RegMMX | RegXMM
3101 | SReg2 | SReg3
3102 | Control | Debug | Test))
3103 ? 1
3104 : 2));
3105 /* If there is an extension opcode to put here, the register
3106 number must be put into the regmem field. */
3107 if (i.tm.extension_opcode != None)
3108 {
3109 i.rm.regmem = i.op[op].regs->reg_num;
3110 if ((i.op[op].regs->reg_flags & RegRex) != 0)
3111 i.rex |= REX_EXTZ;
3112 }
3113 else
3114 {
3115 i.rm.reg = i.op[op].regs->reg_num;
3116 if ((i.op[op].regs->reg_flags & RegRex) != 0)
3117 i.rex |= REX_EXTX;
3118 }
252b5132 3119
29b0f896
AM
3120 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
3121 must set it to 3 to indicate this is a register operand
3122 in the regmem field. */
3123 if (!i.mem_operands)
3124 i.rm.mode = 3;
3125 }
252b5132 3126
29b0f896
AM
3127 /* Fill in i.rm.reg field with extension opcode (if any). */
3128 if (i.tm.extension_opcode != None)
3129 i.rm.reg = i.tm.extension_opcode;
3130 }
3131 return default_seg;
3132}
252b5132 3133
29b0f896
AM
3134static void
3135output_branch ()
3136{
3137 char *p;
3138 int code16;
3139 int prefix;
3140 relax_substateT subtype;
3141 symbolS *sym;
3142 offsetT off;
3143
3144 code16 = 0;
3145 if (flag_code == CODE_16BIT)
3146 code16 = CODE16;
3147
3148 prefix = 0;
3149 if (i.prefix[DATA_PREFIX] != 0)
252b5132 3150 {
29b0f896
AM
3151 prefix = 1;
3152 i.prefixes -= 1;
3153 code16 ^= CODE16;
252b5132 3154 }
29b0f896
AM
3155 /* Pentium4 branch hints. */
3156 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
3157 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
2f66722d 3158 {
29b0f896
AM
3159 prefix++;
3160 i.prefixes--;
3161 }
3162 if (i.prefix[REX_PREFIX] != 0)
3163 {
3164 prefix++;
3165 i.prefixes--;
2f66722d
AM
3166 }
3167
29b0f896
AM
3168 if (i.prefixes != 0 && !intel_syntax)
3169 as_warn (_("skipping prefixes on this instruction"));
3170
3171 /* It's always a symbol; End frag & setup for relax.
3172 Make sure there is enough room in this frag for the largest
3173 instruction we may generate in md_convert_frag. This is 2
3174 bytes for the opcode and room for the prefix and largest
3175 displacement. */
3176 frag_grow (prefix + 2 + 4);
3177 /* Prefix and 1 opcode byte go in fr_fix. */
3178 p = frag_more (prefix + 1);
3179 if (i.prefix[DATA_PREFIX] != 0)
3180 *p++ = DATA_PREFIX_OPCODE;
3181 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
3182 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
3183 *p++ = i.prefix[SEG_PREFIX];
3184 if (i.prefix[REX_PREFIX] != 0)
3185 *p++ = i.prefix[REX_PREFIX];
3186 *p = i.tm.base_opcode;
3187
3188 if ((unsigned char) *p == JUMP_PC_RELATIVE)
3189 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, SMALL);
3190 else if ((cpu_arch_flags & Cpu386) != 0)
3191 subtype = ENCODE_RELAX_STATE (COND_JUMP, SMALL);
3192 else
3193 subtype = ENCODE_RELAX_STATE (COND_JUMP86, SMALL);
3194 subtype |= code16;
3e73aa7c 3195
29b0f896
AM
3196 sym = i.op[0].disps->X_add_symbol;
3197 off = i.op[0].disps->X_add_number;
3e73aa7c 3198
29b0f896
AM
3199 if (i.op[0].disps->X_op != O_constant
3200 && i.op[0].disps->X_op != O_symbol)
3e73aa7c 3201 {
29b0f896
AM
3202 /* Handle complex expressions. */
3203 sym = make_expr_symbol (i.op[0].disps);
3204 off = 0;
3205 }
3e73aa7c 3206
29b0f896
AM
3207 /* 1 possible extra opcode + 4 byte displacement go in var part.
3208 Pass reloc in fr_var. */
3209 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
3210}
3e73aa7c 3211
29b0f896
AM
3212static void
3213output_jump ()
3214{
3215 char *p;
3216 int size;
3e02c1cc 3217 fixS *fixP;
29b0f896
AM
3218
3219 if (i.tm.opcode_modifier & JumpByte)
3220 {
3221 /* This is a loop or jecxz type instruction. */
3222 size = 1;
3223 if (i.prefix[ADDR_PREFIX] != 0)
3224 {
3225 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
3226 i.prefixes -= 1;
3227 }
3228 /* Pentium4 branch hints. */
3229 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
3230 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
3231 {
3232 FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
3233 i.prefixes--;
3e73aa7c
JH
3234 }
3235 }
29b0f896
AM
3236 else
3237 {
3238 int code16;
3e73aa7c 3239
29b0f896
AM
3240 code16 = 0;
3241 if (flag_code == CODE_16BIT)
3242 code16 = CODE16;
3e73aa7c 3243
29b0f896
AM
3244 if (i.prefix[DATA_PREFIX] != 0)
3245 {
3246 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
3247 i.prefixes -= 1;
3248 code16 ^= CODE16;
3249 }
252b5132 3250
29b0f896
AM
3251 size = 4;
3252 if (code16)
3253 size = 2;
3254 }
9fcc94b6 3255
29b0f896
AM
3256 if (i.prefix[REX_PREFIX] != 0)
3257 {
3258 FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
3259 i.prefixes -= 1;
3260 }
252b5132 3261
29b0f896
AM
3262 if (i.prefixes != 0 && !intel_syntax)
3263 as_warn (_("skipping prefixes on this instruction"));
e0890092 3264
29b0f896
AM
3265 p = frag_more (1 + size);
3266 *p++ = i.tm.base_opcode;
e0890092 3267
3e02c1cc
AM
3268 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
3269 i.op[0].disps, 1, reloc (size, 1, 1, i.reloc[0]));
3270
3271 /* All jumps handled here are signed, but don't use a signed limit
3272 check for 32 and 16 bit jumps as we want to allow wrap around at
3273 4G and 64k respectively. */
3274 if (size == 1)
3275 fixP->fx_signed = 1;
29b0f896 3276}
e0890092 3277
29b0f896
AM
3278static void
3279output_interseg_jump ()
3280{
3281 char *p;
3282 int size;
3283 int prefix;
3284 int code16;
252b5132 3285
29b0f896
AM
3286 code16 = 0;
3287 if (flag_code == CODE_16BIT)
3288 code16 = CODE16;
a217f122 3289
29b0f896
AM
3290 prefix = 0;
3291 if (i.prefix[DATA_PREFIX] != 0)
3292 {
3293 prefix = 1;
3294 i.prefixes -= 1;
3295 code16 ^= CODE16;
3296 }
3297 if (i.prefix[REX_PREFIX] != 0)
3298 {
3299 prefix++;
3300 i.prefixes -= 1;
3301 }
252b5132 3302
29b0f896
AM
3303 size = 4;
3304 if (code16)
3305 size = 2;
252b5132 3306
29b0f896
AM
3307 if (i.prefixes != 0 && !intel_syntax)
3308 as_warn (_("skipping prefixes on this instruction"));
252b5132 3309
29b0f896
AM
3310 /* 1 opcode; 2 segment; offset */
3311 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c 3312
29b0f896
AM
3313 if (i.prefix[DATA_PREFIX] != 0)
3314 *p++ = DATA_PREFIX_OPCODE;
252b5132 3315
29b0f896
AM
3316 if (i.prefix[REX_PREFIX] != 0)
3317 *p++ = i.prefix[REX_PREFIX];
252b5132 3318
29b0f896
AM
3319 *p++ = i.tm.base_opcode;
3320 if (i.op[1].imms->X_op == O_constant)
3321 {
3322 offsetT n = i.op[1].imms->X_add_number;
252b5132 3323
29b0f896
AM
3324 if (size == 2
3325 && !fits_in_unsigned_word (n)
3326 && !fits_in_signed_word (n))
3327 {
3328 as_bad (_("16-bit jump out of range"));
3329 return;
3330 }
3331 md_number_to_chars (p, n, size);
3332 }
3333 else
3334 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
3335 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
3336 if (i.op[0].imms->X_op != O_constant)
3337 as_bad (_("can't handle non absolute segment in `%s'"),
3338 i.tm.name);
3339 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
3340}
a217f122 3341
29b0f896
AM
3342static void
3343output_insn ()
3344{
2bbd9c25
JJ
3345 fragS *insn_start_frag;
3346 offsetT insn_start_off;
3347
29b0f896
AM
3348 /* Tie dwarf2 debug info to the address at the start of the insn.
3349 We can't do this after the insn has been output as the current
3350 frag may have been closed off. eg. by frag_var. */
3351 dwarf2_emit_insn (0);
3352
2bbd9c25
JJ
3353 insn_start_frag = frag_now;
3354 insn_start_off = frag_now_fix ();
3355
29b0f896
AM
3356 /* Output jumps. */
3357 if (i.tm.opcode_modifier & Jump)
3358 output_branch ();
3359 else if (i.tm.opcode_modifier & (JumpByte | JumpDword))
3360 output_jump ();
3361 else if (i.tm.opcode_modifier & JumpInterSegment)
3362 output_interseg_jump ();
3363 else
3364 {
3365 /* Output normal instructions here. */
3366 char *p;
3367 unsigned char *q;
252b5132 3368
bc4bd9ab
MK
3369 /* All opcodes on i386 have either 1 or 2 bytes. We may use one
3370 more higher byte to specify a prefix the instruction
3371 requires. */
3372 if ((i.tm.base_opcode & 0xff0000) != 0)
3373 {
3374 if ((i.tm.cpu_flags & CpuPadLock) != 0)
3375 {
3376 unsigned int prefix;
3377 prefix = (i.tm.base_opcode >> 16) & 0xff;
3378
3379 if (prefix != REPE_PREFIX_OPCODE
3380 || i.prefix[LOCKREP_PREFIX] != REPE_PREFIX_OPCODE)
3381 add_prefix (prefix);
3382 }
3383 else
3384 add_prefix ((i.tm.base_opcode >> 16) & 0xff);
0f10071e 3385 }
252b5132 3386
29b0f896
AM
3387 /* The prefix bytes. */
3388 for (q = i.prefix;
3389 q < i.prefix + sizeof (i.prefix) / sizeof (i.prefix[0]);
3390 q++)
3391 {
3392 if (*q)
3393 {
3394 p = frag_more (1);
3395 md_number_to_chars (p, (valueT) *q, 1);
3396 }
3397 }
252b5132 3398
29b0f896
AM
3399 /* Now the opcode; be careful about word order here! */
3400 if (fits_in_unsigned_byte (i.tm.base_opcode))
3401 {
3402 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
3403 }
3404 else
3405 {
bc4bd9ab 3406 p = frag_more (2);
0f10071e 3407
29b0f896
AM
3408 /* Put out high byte first: can't use md_number_to_chars! */
3409 *p++ = (i.tm.base_opcode >> 8) & 0xff;
3410 *p = i.tm.base_opcode & 0xff;
3411 }
3e73aa7c 3412
29b0f896
AM
3413 /* Now the modrm byte and sib byte (if present). */
3414 if (i.tm.opcode_modifier & Modrm)
3415 {
3416 p = frag_more (1);
3417 md_number_to_chars (p,
3418 (valueT) (i.rm.regmem << 0
3419 | i.rm.reg << 3
3420 | i.rm.mode << 6),
3421 1);
3422 /* If i.rm.regmem == ESP (4)
3423 && i.rm.mode != (Register mode)
3424 && not 16 bit
3425 ==> need second modrm byte. */
3426 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
3427 && i.rm.mode != 3
3428 && !(i.base_reg && (i.base_reg->reg_type & Reg16) != 0))
3429 {
3430 p = frag_more (1);
3431 md_number_to_chars (p,
3432 (valueT) (i.sib.base << 0
3433 | i.sib.index << 3
3434 | i.sib.scale << 6),
3435 1);
3436 }
3437 }
3e73aa7c 3438
29b0f896 3439 if (i.disp_operands)
2bbd9c25 3440 output_disp (insn_start_frag, insn_start_off);
3e73aa7c 3441
29b0f896 3442 if (i.imm_operands)
2bbd9c25 3443 output_imm (insn_start_frag, insn_start_off);
29b0f896 3444 }
252b5132 3445
29b0f896
AM
3446#ifdef DEBUG386
3447 if (flag_debug)
3448 {
3449 pi (line, &i);
3450 }
3451#endif /* DEBUG386 */
3452}
252b5132 3453
29b0f896 3454static void
2bbd9c25
JJ
3455output_disp (insn_start_frag, insn_start_off)
3456 fragS *insn_start_frag;
3457 offsetT insn_start_off;
29b0f896
AM
3458{
3459 char *p;
3460 unsigned int n;
252b5132 3461
29b0f896
AM
3462 for (n = 0; n < i.operands; n++)
3463 {
3464 if (i.types[n] & Disp)
3465 {
3466 if (i.op[n].disps->X_op == O_constant)
3467 {
3468 int size;
3469 offsetT val;
252b5132 3470
29b0f896
AM
3471 size = 4;
3472 if (i.types[n] & (Disp8 | Disp16 | Disp64))
3473 {
3474 size = 2;
3475 if (i.types[n] & Disp8)
3476 size = 1;
3477 if (i.types[n] & Disp64)
3478 size = 8;
3479 }
3480 val = offset_in_range (i.op[n].disps->X_add_number,
3481 size);
3482 p = frag_more (size);
3483 md_number_to_chars (p, val, size);
3484 }
3485 else
3486 {
f86103b7 3487 enum bfd_reloc_code_real reloc_type;
29b0f896
AM
3488 int size = 4;
3489 int sign = 0;
3490 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
3491
3492 /* The PC relative address is computed relative
3493 to the instruction boundary, so in case immediate
3494 fields follows, we need to adjust the value. */
3495 if (pcrel && i.imm_operands)
3496 {
3497 int imm_size = 4;
3498 unsigned int n1;
252b5132 3499
29b0f896
AM
3500 for (n1 = 0; n1 < i.operands; n1++)
3501 if (i.types[n1] & Imm)
252b5132 3502 {
29b0f896 3503 if (i.types[n1] & (Imm8 | Imm8S | Imm16 | Imm64))
252b5132 3504 {
29b0f896
AM
3505 imm_size = 2;
3506 if (i.types[n1] & (Imm8 | Imm8S))
3507 imm_size = 1;
3508 if (i.types[n1] & Imm64)
3509 imm_size = 8;
252b5132 3510 }
29b0f896 3511 break;
252b5132 3512 }
29b0f896
AM
3513 /* We should find the immediate. */
3514 if (n1 == i.operands)
3515 abort ();
3516 i.op[n].disps->X_add_number -= imm_size;
3517 }
520dc8e8 3518
29b0f896
AM
3519 if (i.types[n] & Disp32S)
3520 sign = 1;
3e73aa7c 3521
29b0f896
AM
3522 if (i.types[n] & (Disp16 | Disp64))
3523 {
3524 size = 2;
3525 if (i.types[n] & Disp64)
3526 size = 8;
3527 }
520dc8e8 3528
29b0f896 3529 p = frag_more (size);
2bbd9c25 3530 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
d6ab8113 3531 if (GOT_symbol
2bbd9c25 3532 && GOT_symbol == i.op[n].disps->X_add_symbol
d6ab8113
JB
3533 && (((reloc_type == BFD_RELOC_32
3534 || reloc_type == BFD_RELOC_X86_64_32S)
3535 && (i.op[n].disps->X_op == O_symbol
3536 || (i.op[n].disps->X_op == O_add
3537 && ((symbol_get_value_expression
3538 (i.op[n].disps->X_op_symbol)->X_op)
3539 == O_subtract))))
3540 || reloc_type == BFD_RELOC_32_PCREL))
2bbd9c25
JJ
3541 {
3542 offsetT add;
3543
3544 if (insn_start_frag == frag_now)
3545 add = (p - frag_now->fr_literal) - insn_start_off;
3546 else
3547 {
3548 fragS *fr;
3549
3550 add = insn_start_frag->fr_fix - insn_start_off;
3551 for (fr = insn_start_frag->fr_next;
3552 fr && fr != frag_now; fr = fr->fr_next)
3553 add += fr->fr_fix;
3554 add += p - frag_now->fr_literal;
3555 }
3556
d6ab8113
JB
3557 if (flag_code != CODE_64BIT)
3558 reloc_type = BFD_RELOC_386_GOTPC;
3559 else
3560 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25
JJ
3561 i.op[n].disps->X_add_number += add;
3562 }
062cd5e7 3563 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
2bbd9c25 3564 i.op[n].disps, pcrel, reloc_type);
29b0f896
AM
3565 }
3566 }
3567 }
3568}
252b5132 3569
29b0f896 3570static void
2bbd9c25
JJ
3571output_imm (insn_start_frag, insn_start_off)
3572 fragS *insn_start_frag;
3573 offsetT insn_start_off;
29b0f896
AM
3574{
3575 char *p;
3576 unsigned int n;
252b5132 3577
29b0f896
AM
3578 for (n = 0; n < i.operands; n++)
3579 {
3580 if (i.types[n] & Imm)
3581 {
3582 if (i.op[n].imms->X_op == O_constant)
3583 {
3584 int size;
3585 offsetT val;
b4cac588 3586
29b0f896
AM
3587 size = 4;
3588 if (i.types[n] & (Imm8 | Imm8S | Imm16 | Imm64))
3589 {
3590 size = 2;
3591 if (i.types[n] & (Imm8 | Imm8S))
3592 size = 1;
3593 else if (i.types[n] & Imm64)
3594 size = 8;
3595 }
3596 val = offset_in_range (i.op[n].imms->X_add_number,
3597 size);
3598 p = frag_more (size);
3599 md_number_to_chars (p, val, size);
3600 }
3601 else
3602 {
3603 /* Not absolute_section.
3604 Need a 32-bit fixup (don't support 8bit
3605 non-absolute imms). Try to support other
3606 sizes ... */
f86103b7 3607 enum bfd_reloc_code_real reloc_type;
29b0f896
AM
3608 int size = 4;
3609 int sign = 0;
3610
3611 if ((i.types[n] & (Imm32S))
a7d61044
JB
3612 && (i.suffix == QWORD_MNEM_SUFFIX
3613 || (!i.suffix && (i.tm.opcode_modifier & No_lSuf))))
29b0f896
AM
3614 sign = 1;
3615 if (i.types[n] & (Imm8 | Imm8S | Imm16 | Imm64))
3616 {
3617 size = 2;
3618 if (i.types[n] & (Imm8 | Imm8S))
3619 size = 1;
3620 if (i.types[n] & Imm64)
3621 size = 8;
3622 }
520dc8e8 3623
29b0f896
AM
3624 p = frag_more (size);
3625 reloc_type = reloc (size, 0, sign, i.reloc[n]);
f86103b7 3626
2bbd9c25
JJ
3627 /* This is tough to explain. We end up with this one if we
3628 * have operands that look like
3629 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
3630 * obtain the absolute address of the GOT, and it is strongly
3631 * preferable from a performance point of view to avoid using
3632 * a runtime relocation for this. The actual sequence of
3633 * instructions often look something like:
3634 *
3635 * call .L66
3636 * .L66:
3637 * popl %ebx
3638 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
3639 *
3640 * The call and pop essentially return the absolute address
3641 * of the label .L66 and store it in %ebx. The linker itself
3642 * will ultimately change the first operand of the addl so
3643 * that %ebx points to the GOT, but to keep things simple, the
3644 * .o file must have this operand set so that it generates not
3645 * the absolute address of .L66, but the absolute address of
3646 * itself. This allows the linker itself simply treat a GOTPC
3647 * relocation as asking for a pcrel offset to the GOT to be
3648 * added in, and the addend of the relocation is stored in the
3649 * operand field for the instruction itself.
3650 *
3651 * Our job here is to fix the operand so that it would add
3652 * the correct offset so that %ebx would point to itself. The
3653 * thing that is tricky is that .-.L66 will point to the
3654 * beginning of the instruction, so we need to further modify
3655 * the operand so that it will point to itself. There are
3656 * other cases where you have something like:
3657 *
3658 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
3659 *
3660 * and here no correction would be required. Internally in
3661 * the assembler we treat operands of this form as not being
3662 * pcrel since the '.' is explicitly mentioned, and I wonder
3663 * whether it would simplify matters to do it this way. Who
3664 * knows. In earlier versions of the PIC patches, the
3665 * pcrel_adjust field was used to store the correction, but
3666 * since the expression is not pcrel, I felt it would be
3667 * confusing to do it this way. */
3668
d6ab8113
JB
3669 if ((reloc_type == BFD_RELOC_32
3670 || reloc_type == BFD_RELOC_X86_64_32S)
29b0f896
AM
3671 && GOT_symbol
3672 && GOT_symbol == i.op[n].imms->X_add_symbol
3673 && (i.op[n].imms->X_op == O_symbol
3674 || (i.op[n].imms->X_op == O_add
3675 && ((symbol_get_value_expression
3676 (i.op[n].imms->X_op_symbol)->X_op)
3677 == O_subtract))))
3678 {
2bbd9c25
JJ
3679 offsetT add;
3680
3681 if (insn_start_frag == frag_now)
3682 add = (p - frag_now->fr_literal) - insn_start_off;
3683 else
3684 {
3685 fragS *fr;
3686
3687 add = insn_start_frag->fr_fix - insn_start_off;
3688 for (fr = insn_start_frag->fr_next;
3689 fr && fr != frag_now; fr = fr->fr_next)
3690 add += fr->fr_fix;
3691 add += p - frag_now->fr_literal;
3692 }
3693
d6ab8113
JB
3694 if (flag_code != CODE_64BIT)
3695 reloc_type = BFD_RELOC_386_GOTPC;
3696 else
3697 reloc_type = BFD_RELOC_X86_64_GOTPC32;
2bbd9c25 3698 i.op[n].imms->X_add_number += add;
29b0f896 3699 }
29b0f896
AM
3700 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
3701 i.op[n].imms, 0, reloc_type);
3702 }
3703 }
3704 }
252b5132
RH
3705}
3706\f
f3c180ae 3707#ifndef LEX_AT
f86103b7 3708static char *lex_got PARAMS ((enum bfd_reloc_code_real *, int *));
f3c180ae
AM
3709
3710/* Parse operands of the form
3711 <symbol>@GOTOFF+<nnn>
3712 and similar .plt or .got references.
3713
3714 If we find one, set up the correct relocation in RELOC and copy the
3715 input string, minus the `@GOTOFF' into a malloc'd buffer for
3716 parsing by the calling routine. Return this buffer, and if ADJUST
3717 is non-null set it to the length of the string we removed from the
3718 input line. Otherwise return NULL. */
3719static char *
3720lex_got (reloc, adjust)
f86103b7 3721 enum bfd_reloc_code_real *reloc;
f3c180ae
AM
3722 int *adjust;
3723{
3724 static const char * const mode_name[NUM_FLAG_CODE] = { "32", "16", "64" };
3725 static const struct {
3726 const char *str;
f86103b7 3727 const enum bfd_reloc_code_real rel[NUM_FLAG_CODE];
f3c180ae 3728 } gotrel[] = {
13ae64f3 3729 { "PLT", { BFD_RELOC_386_PLT32, 0, BFD_RELOC_X86_64_PLT32 } },
d6ab8113 3730 { "GOTOFF", { BFD_RELOC_386_GOTOFF, 0, BFD_RELOC_X86_64_GOTOFF64 } },
13ae64f3 3731 { "GOTPCREL", { 0, 0, BFD_RELOC_X86_64_GOTPCREL } },
bffbf940 3732 { "TLSGD", { BFD_RELOC_386_TLS_GD, 0, BFD_RELOC_X86_64_TLSGD } },
13ae64f3 3733 { "TLSLDM", { BFD_RELOC_386_TLS_LDM, 0, 0 } },
bffbf940
JJ
3734 { "TLSLD", { 0, 0, BFD_RELOC_X86_64_TLSLD } },
3735 { "GOTTPOFF", { BFD_RELOC_386_TLS_IE_32, 0, BFD_RELOC_X86_64_GOTTPOFF } },
3736 { "TPOFF", { BFD_RELOC_386_TLS_LE_32, 0, BFD_RELOC_X86_64_TPOFF32 } },
13ae64f3 3737 { "NTPOFF", { BFD_RELOC_386_TLS_LE, 0, 0 } },
bffbf940 3738 { "DTPOFF", { BFD_RELOC_386_TLS_LDO_32, 0, BFD_RELOC_X86_64_DTPOFF32 } },
37e55690
JJ
3739 { "GOTNTPOFF",{ BFD_RELOC_386_TLS_GOTIE, 0, 0 } },
3740 { "INDNTPOFF",{ BFD_RELOC_386_TLS_IE, 0, 0 } },
13ae64f3 3741 { "GOT", { BFD_RELOC_386_GOT32, 0, BFD_RELOC_X86_64_GOT32 } }
f3c180ae
AM
3742 };
3743 char *cp;
3744 unsigned int j;
3745
3746 for (cp = input_line_pointer; *cp != '@'; cp++)
3747 if (is_end_of_line[(unsigned char) *cp])
3748 return NULL;
3749
3750 for (j = 0; j < sizeof (gotrel) / sizeof (gotrel[0]); j++)
3751 {
3752 int len;
3753
3754 len = strlen (gotrel[j].str);
28f81592 3755 if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
f3c180ae
AM
3756 {
3757 if (gotrel[j].rel[(unsigned int) flag_code] != 0)
3758 {
28f81592
AM
3759 int first, second;
3760 char *tmpbuf, *past_reloc;
f3c180ae
AM
3761
3762 *reloc = gotrel[j].rel[(unsigned int) flag_code];
28f81592
AM
3763 if (adjust)
3764 *adjust = len;
f3c180ae
AM
3765
3766 if (GOT_symbol == NULL)
3767 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
3768
3769 /* Replace the relocation token with ' ', so that
3770 errors like foo@GOTOFF1 will be detected. */
28f81592
AM
3771
3772 /* The length of the first part of our input line. */
f3c180ae 3773 first = cp - input_line_pointer;
28f81592
AM
3774
3775 /* The second part goes from after the reloc token until
3776 (and including) an end_of_line char. Don't use strlen
3777 here as the end_of_line char may not be a NUL. */
3778 past_reloc = cp + 1 + len;
3779 for (cp = past_reloc; !is_end_of_line[(unsigned char) *cp++]; )
3780 ;
3781 second = cp - past_reloc;
3782
3783 /* Allocate and copy string. The trailing NUL shouldn't
3784 be necessary, but be safe. */
3785 tmpbuf = xmalloc (first + second + 2);
f3c180ae
AM
3786 memcpy (tmpbuf, input_line_pointer, first);
3787 tmpbuf[first] = ' ';
28f81592
AM
3788 memcpy (tmpbuf + first + 1, past_reloc, second);
3789 tmpbuf[first + second + 1] = '\0';
f3c180ae
AM
3790 return tmpbuf;
3791 }
3792
3793 as_bad (_("@%s reloc is not supported in %s bit mode"),
3794 gotrel[j].str, mode_name[(unsigned int) flag_code]);
3795 return NULL;
3796 }
3797 }
3798
3799 /* Might be a symbol version string. Don't as_bad here. */
3800 return NULL;
3801}
3802
3803/* x86_cons_fix_new is called via the expression parsing code when a
3804 reloc is needed. We use this hook to get the correct .got reloc. */
f86103b7 3805static enum bfd_reloc_code_real got_reloc = NO_RELOC;
f3c180ae
AM
3806
3807void
3808x86_cons_fix_new (frag, off, len, exp)
3809 fragS *frag;
3810 unsigned int off;
3811 unsigned int len;
3812 expressionS *exp;
3813{
f86103b7 3814 enum bfd_reloc_code_real r = reloc (len, 0, 0, got_reloc);
f3c180ae
AM
3815 got_reloc = NO_RELOC;
3816 fix_new_exp (frag, off, len, exp, 0, r);
3817}
3818
3819void
3820x86_cons (exp, size)
3821 expressionS *exp;
3822 int size;
3823{
d6ab8113 3824 if (size == 4 || (flag_code == CODE_64BIT && size == 8))
f3c180ae
AM
3825 {
3826 /* Handle @GOTOFF and the like in an expression. */
3827 char *save;
3828 char *gotfree_input_line;
3829 int adjust;
3830
3831 save = input_line_pointer;
3832 gotfree_input_line = lex_got (&got_reloc, &adjust);
3833 if (gotfree_input_line)
3834 input_line_pointer = gotfree_input_line;
3835
3836 expression (exp);
3837
3838 if (gotfree_input_line)
3839 {
3840 /* expression () has merrily parsed up to the end of line,
3841 or a comma - in the wrong buffer. Transfer how far
3842 input_line_pointer has moved to the right buffer. */
3843 input_line_pointer = (save
3844 + (input_line_pointer - gotfree_input_line)
3845 + adjust);
3846 free (gotfree_input_line);
3847 }
3848 }
3849 else
3850 expression (exp);
3851}
3852#endif
3853
6482c264
NC
3854#ifdef TE_PE
3855
6482c264
NC
3856void
3857x86_pe_cons_fix_new (frag, off, len, exp)
3858 fragS *frag;
3859 unsigned int off;
3860 unsigned int len;
3861 expressionS *exp;
3862{
3863 enum bfd_reloc_code_real r = reloc (len, 0, 0, NO_RELOC);
3864
3865 if (exp->X_op == O_secrel)
3866 {
3867 exp->X_op = O_symbol;
3868 r = BFD_RELOC_32_SECREL;
3869 }
3870
3871 fix_new_exp (frag, off, len, exp, 0, r);
3872}
3873
3874static void
3875pe_directive_secrel (dummy)
3876 int dummy ATTRIBUTE_UNUSED;
3877{
3878 expressionS exp;
3879
3880 do
3881 {
3882 expression (&exp);
3883 if (exp.X_op == O_symbol)
3884 exp.X_op = O_secrel;
3885
3886 emit_expr (&exp, 4);
3887 }
3888 while (*input_line_pointer++ == ',');
3889
3890 input_line_pointer--;
3891 demand_empty_rest_of_line ();
3892}
3893
3894#endif
3895
252b5132
RH
3896static int i386_immediate PARAMS ((char *));
3897
3898static int
3899i386_immediate (imm_start)
3900 char *imm_start;
3901{
3902 char *save_input_line_pointer;
f3c180ae
AM
3903#ifndef LEX_AT
3904 char *gotfree_input_line;
3905#endif
252b5132 3906 segT exp_seg = 0;
47926f60 3907 expressionS *exp;
252b5132
RH
3908
3909 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
3910 {
d0b47220 3911 as_bad (_("only 1 or 2 immediate operands are allowed"));
252b5132
RH
3912 return 0;
3913 }
3914
3915 exp = &im_expressions[i.imm_operands++];
520dc8e8 3916 i.op[this_operand].imms = exp;
252b5132
RH
3917
3918 if (is_space_char (*imm_start))
3919 ++imm_start;
3920
3921 save_input_line_pointer = input_line_pointer;
3922 input_line_pointer = imm_start;
3923
3924#ifndef LEX_AT
f3c180ae
AM
3925 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL);
3926 if (gotfree_input_line)
3927 input_line_pointer = gotfree_input_line;
252b5132
RH
3928#endif
3929
3930 exp_seg = expression (exp);
3931
83183c0c 3932 SKIP_WHITESPACE ();
252b5132 3933 if (*input_line_pointer)
f3c180ae 3934 as_bad (_("junk `%s' after expression"), input_line_pointer);
252b5132
RH
3935
3936 input_line_pointer = save_input_line_pointer;
f3c180ae
AM
3937#ifndef LEX_AT
3938 if (gotfree_input_line)
3939 free (gotfree_input_line);
3940#endif
252b5132 3941
2daf4fd8 3942 if (exp->X_op == O_absent || exp->X_op == O_big)
252b5132 3943 {
47926f60 3944 /* Missing or bad expr becomes absolute 0. */
d0b47220 3945 as_bad (_("missing or invalid immediate expression `%s' taken as 0"),
24eab124 3946 imm_start);
252b5132
RH
3947 exp->X_op = O_constant;
3948 exp->X_add_number = 0;
3949 exp->X_add_symbol = (symbolS *) 0;
3950 exp->X_op_symbol = (symbolS *) 0;
252b5132 3951 }
3e73aa7c 3952 else if (exp->X_op == O_constant)
252b5132 3953 {
47926f60 3954 /* Size it properly later. */
3e73aa7c
JH
3955 i.types[this_operand] |= Imm64;
3956 /* If BFD64, sign extend val. */
3957 if (!use_rela_relocations)
3958 if ((exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
3959 exp->X_add_number = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 3960 }
4c63da97 3961#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
f86103b7 3962 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 3963 && exp_seg != absolute_section
47926f60 3964 && exp_seg != text_section
24eab124
AM
3965 && exp_seg != data_section
3966 && exp_seg != bss_section
3967 && exp_seg != undefined_section
f86103b7 3968 && !bfd_is_com_section (exp_seg))
252b5132 3969 {
d0b47220 3970 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
252b5132
RH
3971 return 0;
3972 }
3973#endif
3974 else
3975 {
3976 /* This is an address. The size of the address will be
24eab124 3977 determined later, depending on destination register,
3e73aa7c
JH
3978 suffix, or the default for the section. */
3979 i.types[this_operand] |= Imm8 | Imm16 | Imm32 | Imm32S | Imm64;
252b5132
RH
3980 }
3981
3982 return 1;
3983}
3984
551c1ca1 3985static char *i386_scale PARAMS ((char *));
252b5132 3986
551c1ca1 3987static char *
252b5132
RH
3988i386_scale (scale)
3989 char *scale;
3990{
551c1ca1
AM
3991 offsetT val;
3992 char *save = input_line_pointer;
252b5132 3993
551c1ca1
AM
3994 input_line_pointer = scale;
3995 val = get_absolute_expression ();
3996
3997 switch (val)
252b5132 3998 {
551c1ca1 3999 case 1:
252b5132
RH
4000 i.log2_scale_factor = 0;
4001 break;
551c1ca1 4002 case 2:
252b5132
RH
4003 i.log2_scale_factor = 1;
4004 break;
551c1ca1 4005 case 4:
252b5132
RH
4006 i.log2_scale_factor = 2;
4007 break;
551c1ca1 4008 case 8:
252b5132
RH
4009 i.log2_scale_factor = 3;
4010 break;
4011 default:
a724f0f4
JB
4012 {
4013 char sep = *input_line_pointer;
4014
4015 *input_line_pointer = '\0';
4016 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
4017 scale);
4018 *input_line_pointer = sep;
4019 input_line_pointer = save;
4020 return NULL;
4021 }
252b5132 4022 }
29b0f896 4023 if (i.log2_scale_factor != 0 && i.index_reg == 0)
252b5132
RH
4024 {
4025 as_warn (_("scale factor of %d without an index register"),
24eab124 4026 1 << i.log2_scale_factor);
252b5132
RH
4027#if SCALE1_WHEN_NO_INDEX
4028 i.log2_scale_factor = 0;
4029#endif
4030 }
551c1ca1
AM
4031 scale = input_line_pointer;
4032 input_line_pointer = save;
4033 return scale;
252b5132
RH
4034}
4035
4036static int i386_displacement PARAMS ((char *, char *));
4037
4038static int
4039i386_displacement (disp_start, disp_end)
4040 char *disp_start;
4041 char *disp_end;
4042{
29b0f896 4043 expressionS *exp;
252b5132
RH
4044 segT exp_seg = 0;
4045 char *save_input_line_pointer;
f3c180ae
AM
4046#ifndef LEX_AT
4047 char *gotfree_input_line;
4048#endif
252b5132
RH
4049 int bigdisp = Disp32;
4050
3e73aa7c 4051 if (flag_code == CODE_64BIT)
7ecd2f8b 4052 {
29b0f896
AM
4053 if (i.prefix[ADDR_PREFIX] == 0)
4054 bigdisp = Disp64;
7ecd2f8b
JH
4055 }
4056 else if ((flag_code == CODE_16BIT) ^ (i.prefix[ADDR_PREFIX] != 0))
4057 bigdisp = Disp16;
252b5132
RH
4058 i.types[this_operand] |= bigdisp;
4059
4060 exp = &disp_expressions[i.disp_operands];
520dc8e8 4061 i.op[this_operand].disps = exp;
252b5132
RH
4062 i.disp_operands++;
4063 save_input_line_pointer = input_line_pointer;
4064 input_line_pointer = disp_start;
4065 END_STRING_AND_SAVE (disp_end);
4066
4067#ifndef GCC_ASM_O_HACK
4068#define GCC_ASM_O_HACK 0
4069#endif
4070#if GCC_ASM_O_HACK
4071 END_STRING_AND_SAVE (disp_end + 1);
4072 if ((i.types[this_operand] & BaseIndex) != 0
24eab124 4073 && displacement_string_end[-1] == '+')
252b5132
RH
4074 {
4075 /* This hack is to avoid a warning when using the "o"
24eab124
AM
4076 constraint within gcc asm statements.
4077 For instance:
4078
4079 #define _set_tssldt_desc(n,addr,limit,type) \
4080 __asm__ __volatile__ ( \
4081 "movw %w2,%0\n\t" \
4082 "movw %w1,2+%0\n\t" \
4083 "rorl $16,%1\n\t" \
4084 "movb %b1,4+%0\n\t" \
4085 "movb %4,5+%0\n\t" \
4086 "movb $0,6+%0\n\t" \
4087 "movb %h1,7+%0\n\t" \
4088 "rorl $16,%1" \
4089 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
4090
4091 This works great except that the output assembler ends
4092 up looking a bit weird if it turns out that there is
4093 no offset. You end up producing code that looks like:
4094
4095 #APP
4096 movw $235,(%eax)
4097 movw %dx,2+(%eax)
4098 rorl $16,%edx
4099 movb %dl,4+(%eax)
4100 movb $137,5+(%eax)
4101 movb $0,6+(%eax)
4102 movb %dh,7+(%eax)
4103 rorl $16,%edx
4104 #NO_APP
4105
47926f60 4106 So here we provide the missing zero. */
24eab124
AM
4107
4108 *displacement_string_end = '0';
252b5132
RH
4109 }
4110#endif
4111#ifndef LEX_AT
f3c180ae
AM
4112 gotfree_input_line = lex_got (&i.reloc[this_operand], NULL);
4113 if (gotfree_input_line)
4114 input_line_pointer = gotfree_input_line;
252b5132
RH
4115#endif
4116
24eab124 4117 exp_seg = expression (exp);
252b5132 4118
636c26b0
AM
4119 SKIP_WHITESPACE ();
4120 if (*input_line_pointer)
4121 as_bad (_("junk `%s' after expression"), input_line_pointer);
4122#if GCC_ASM_O_HACK
4123 RESTORE_END_STRING (disp_end + 1);
4124#endif
4125 RESTORE_END_STRING (disp_end);
4126 input_line_pointer = save_input_line_pointer;
4127#ifndef LEX_AT
4128 if (gotfree_input_line)
4129 free (gotfree_input_line);
4130#endif
4131
24eab124
AM
4132 /* We do this to make sure that the section symbol is in
4133 the symbol table. We will ultimately change the relocation
47926f60 4134 to be relative to the beginning of the section. */
1ae12ab7 4135 if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
d6ab8113
JB
4136 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
4137 || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
24eab124 4138 {
636c26b0
AM
4139 if (exp->X_op != O_symbol)
4140 {
4141 as_bad (_("bad expression used with @%s"),
4142 (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
4143 ? "GOTPCREL"
4144 : "GOTOFF"));
4145 return 0;
4146 }
4147
e5cb08ac 4148 if (S_IS_LOCAL (exp->X_add_symbol)
24eab124
AM
4149 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section)
4150 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
24eab124
AM
4151 exp->X_op = O_subtract;
4152 exp->X_op_symbol = GOT_symbol;
1ae12ab7 4153 if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
29b0f896 4154 i.reloc[this_operand] = BFD_RELOC_32_PCREL;
d6ab8113
JB
4155 else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
4156 i.reloc[this_operand] = BFD_RELOC_64;
23df1078 4157 else
29b0f896 4158 i.reloc[this_operand] = BFD_RELOC_32;
24eab124 4159 }
252b5132 4160
2daf4fd8
AM
4161 if (exp->X_op == O_absent || exp->X_op == O_big)
4162 {
47926f60 4163 /* Missing or bad expr becomes absolute 0. */
d0b47220 4164 as_bad (_("missing or invalid displacement expression `%s' taken as 0"),
2daf4fd8
AM
4165 disp_start);
4166 exp->X_op = O_constant;
4167 exp->X_add_number = 0;
4168 exp->X_add_symbol = (symbolS *) 0;
4169 exp->X_op_symbol = (symbolS *) 0;
4170 }
4171
4c63da97 4172#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
45288df1 4173 if (exp->X_op != O_constant
45288df1 4174 && OUTPUT_FLAVOR == bfd_target_aout_flavour
31312f95 4175 && exp_seg != absolute_section
45288df1
AM
4176 && exp_seg != text_section
4177 && exp_seg != data_section
4178 && exp_seg != bss_section
31312f95 4179 && exp_seg != undefined_section
f86103b7 4180 && !bfd_is_com_section (exp_seg))
24eab124 4181 {
d0b47220 4182 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
24eab124
AM
4183 return 0;
4184 }
252b5132 4185#endif
3e73aa7c
JH
4186 else if (flag_code == CODE_64BIT)
4187 i.types[this_operand] |= Disp32S | Disp32;
252b5132
RH
4188 return 1;
4189}
4190
e5cb08ac 4191static int i386_index_check PARAMS ((const char *));
252b5132 4192
eecb386c 4193/* Make sure the memory operand we've been dealt is valid.
47926f60
KH
4194 Return 1 on success, 0 on a failure. */
4195
252b5132 4196static int
eecb386c
AM
4197i386_index_check (operand_string)
4198 const char *operand_string;
252b5132 4199{
3e73aa7c 4200 int ok;
24eab124 4201#if INFER_ADDR_PREFIX
eecb386c
AM
4202 int fudged = 0;
4203
24eab124
AM
4204 tryprefix:
4205#endif
3e73aa7c 4206 ok = 1;
30123838
JB
4207 if ((current_templates->start->cpu_flags & CpuSVME)
4208 && current_templates->end[-1].operand_types[0] == AnyMem)
4209 {
4210 /* Memory operands of SVME insns are special in that they only allow
4211 rAX as their memory address and ignore any segment override. */
4212 unsigned RegXX;
4213
4214 /* SKINIT is even more restrictive: it always requires EAX. */
4215 if (strcmp (current_templates->start->name, "skinit") == 0)
4216 RegXX = Reg32;
4217 else if (flag_code == CODE_64BIT)
4218 RegXX = i.prefix[ADDR_PREFIX] == 0 ? Reg64 : Reg32;
4219 else
4220 RegXX = (flag_code == CODE_16BIT) ^ (i.prefix[ADDR_PREFIX] != 0)
4221 ? Reg16
4222 : Reg32;
4223 if (!i.base_reg
4224 || !(i.base_reg->reg_type & Acc)
4225 || !(i.base_reg->reg_type & RegXX)
4226 || i.index_reg
4227 || (i.types[0] & Disp))
4228 ok = 0;
4229 }
4230 else if (flag_code == CODE_64BIT)
20f0a1fc
NC
4231 {
4232 unsigned RegXX = (i.prefix[ADDR_PREFIX] == 0 ? Reg64 : Reg32);
4233
4234 if ((i.base_reg
4235 && ((i.base_reg->reg_type & RegXX) == 0)
4236 && (i.base_reg->reg_type != BaseIndex
4237 || i.index_reg))
4238 || (i.index_reg
4239 && ((i.index_reg->reg_type & (RegXX | BaseIndex))
4240 != (RegXX | BaseIndex))))
4241 ok = 0;
3e73aa7c
JH
4242 }
4243 else
4244 {
4245 if ((flag_code == CODE_16BIT) ^ (i.prefix[ADDR_PREFIX] != 0))
4246 {
4247 /* 16bit checks. */
4248 if ((i.base_reg
29b0f896
AM
4249 && ((i.base_reg->reg_type & (Reg16 | BaseIndex | RegRex))
4250 != (Reg16 | BaseIndex)))
3e73aa7c 4251 || (i.index_reg
29b0f896
AM
4252 && (((i.index_reg->reg_type & (Reg16 | BaseIndex))
4253 != (Reg16 | BaseIndex))
4254 || !(i.base_reg
4255 && i.base_reg->reg_num < 6
4256 && i.index_reg->reg_num >= 6
4257 && i.log2_scale_factor == 0))))
3e73aa7c
JH
4258 ok = 0;
4259 }
4260 else
e5cb08ac 4261 {
3e73aa7c
JH
4262 /* 32bit checks. */
4263 if ((i.base_reg
4264 && (i.base_reg->reg_type & (Reg32 | RegRex)) != Reg32)
4265 || (i.index_reg
29b0f896
AM
4266 && ((i.index_reg->reg_type & (Reg32 | BaseIndex | RegRex))
4267 != (Reg32 | BaseIndex))))
e5cb08ac 4268 ok = 0;
3e73aa7c
JH
4269 }
4270 }
4271 if (!ok)
24eab124
AM
4272 {
4273#if INFER_ADDR_PREFIX
20f0a1fc 4274 if (i.prefix[ADDR_PREFIX] == 0)
24eab124
AM
4275 {
4276 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
4277 i.prefixes += 1;
b23bac36
AM
4278 /* Change the size of any displacement too. At most one of
4279 Disp16 or Disp32 is set.
4280 FIXME. There doesn't seem to be any real need for separate
4281 Disp16 and Disp32 flags. The same goes for Imm16 and Imm32.
47926f60 4282 Removing them would probably clean up the code quite a lot. */
20f0a1fc 4283 if (flag_code != CODE_64BIT && (i.types[this_operand] & (Disp16 | Disp32)))
29b0f896 4284 i.types[this_operand] ^= (Disp16 | Disp32);
eecb386c 4285 fudged = 1;
24eab124
AM
4286 goto tryprefix;
4287 }
eecb386c
AM
4288 if (fudged)
4289 as_bad (_("`%s' is not a valid base/index expression"),
4290 operand_string);
4291 else
c388dee8 4292#endif
eecb386c
AM
4293 as_bad (_("`%s' is not a valid %s bit base/index expression"),
4294 operand_string,
3e73aa7c 4295 flag_code_names[flag_code]);
24eab124 4296 }
20f0a1fc 4297 return ok;
24eab124 4298}
252b5132 4299
252b5132 4300/* Parse OPERAND_STRING into the i386_insn structure I. Returns non-zero
47926f60 4301 on error. */
252b5132 4302
252b5132
RH
4303static int
4304i386_operand (operand_string)
4305 char *operand_string;
4306{
af6bdddf
AM
4307 const reg_entry *r;
4308 char *end_op;
24eab124 4309 char *op_string = operand_string;
252b5132 4310
24eab124 4311 if (is_space_char (*op_string))
252b5132
RH
4312 ++op_string;
4313
24eab124 4314 /* We check for an absolute prefix (differentiating,
47926f60 4315 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
4316 if (*op_string == ABSOLUTE_PREFIX)
4317 {
4318 ++op_string;
4319 if (is_space_char (*op_string))
4320 ++op_string;
4321 i.types[this_operand] |= JumpAbsolute;
4322 }
252b5132 4323
47926f60 4324 /* Check if operand is a register. */
af6bdddf
AM
4325 if ((*op_string == REGISTER_PREFIX || allow_naked_reg)
4326 && (r = parse_register (op_string, &end_op)) != NULL)
24eab124 4327 {
24eab124
AM
4328 /* Check for a segment override by searching for ':' after a
4329 segment register. */
4330 op_string = end_op;
4331 if (is_space_char (*op_string))
4332 ++op_string;
4333 if (*op_string == ':' && (r->reg_type & (SReg2 | SReg3)))
4334 {
4335 switch (r->reg_num)
4336 {
4337 case 0:
4338 i.seg[i.mem_operands] = &es;
4339 break;
4340 case 1:
4341 i.seg[i.mem_operands] = &cs;
4342 break;
4343 case 2:
4344 i.seg[i.mem_operands] = &ss;
4345 break;
4346 case 3:
4347 i.seg[i.mem_operands] = &ds;
4348 break;
4349 case 4:
4350 i.seg[i.mem_operands] = &fs;
4351 break;
4352 case 5:
4353 i.seg[i.mem_operands] = &gs;
4354 break;
4355 }
252b5132 4356
24eab124 4357 /* Skip the ':' and whitespace. */
252b5132
RH
4358 ++op_string;
4359 if (is_space_char (*op_string))
24eab124 4360 ++op_string;
252b5132 4361
24eab124
AM
4362 if (!is_digit_char (*op_string)
4363 && !is_identifier_char (*op_string)
4364 && *op_string != '('
4365 && *op_string != ABSOLUTE_PREFIX)
4366 {
4367 as_bad (_("bad memory operand `%s'"), op_string);
4368 return 0;
4369 }
47926f60 4370 /* Handle case of %es:*foo. */
24eab124
AM
4371 if (*op_string == ABSOLUTE_PREFIX)
4372 {
4373 ++op_string;
4374 if (is_space_char (*op_string))
4375 ++op_string;
4376 i.types[this_operand] |= JumpAbsolute;
4377 }
4378 goto do_memory_reference;
4379 }
4380 if (*op_string)
4381 {
d0b47220 4382 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
4383 return 0;
4384 }
4385 i.types[this_operand] |= r->reg_type & ~BaseIndex;
520dc8e8 4386 i.op[this_operand].regs = r;
24eab124
AM
4387 i.reg_operands++;
4388 }
af6bdddf
AM
4389 else if (*op_string == REGISTER_PREFIX)
4390 {
4391 as_bad (_("bad register name `%s'"), op_string);
4392 return 0;
4393 }
24eab124 4394 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 4395 {
24eab124
AM
4396 ++op_string;
4397 if (i.types[this_operand] & JumpAbsolute)
4398 {
d0b47220 4399 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
4400 return 0;
4401 }
4402 if (!i386_immediate (op_string))
4403 return 0;
4404 }
4405 else if (is_digit_char (*op_string)
4406 || is_identifier_char (*op_string)
e5cb08ac 4407 || *op_string == '(')
24eab124 4408 {
47926f60 4409 /* This is a memory reference of some sort. */
af6bdddf 4410 char *base_string;
252b5132 4411
47926f60 4412 /* Start and end of displacement string expression (if found). */
eecb386c
AM
4413 char *displacement_string_start;
4414 char *displacement_string_end;
252b5132 4415
24eab124 4416 do_memory_reference:
24eab124
AM
4417 if ((i.mem_operands == 1
4418 && (current_templates->start->opcode_modifier & IsString) == 0)
4419 || i.mem_operands == 2)
4420 {
4421 as_bad (_("too many memory references for `%s'"),
4422 current_templates->start->name);
4423 return 0;
4424 }
252b5132 4425
24eab124
AM
4426 /* Check for base index form. We detect the base index form by
4427 looking for an ')' at the end of the operand, searching
4428 for the '(' matching it, and finding a REGISTER_PREFIX or ','
4429 after the '('. */
af6bdddf 4430 base_string = op_string + strlen (op_string);
c3332e24 4431
af6bdddf
AM
4432 --base_string;
4433 if (is_space_char (*base_string))
4434 --base_string;
252b5132 4435
47926f60 4436 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
4437 displacement_string_start = op_string;
4438 displacement_string_end = base_string + 1;
252b5132 4439
24eab124
AM
4440 if (*base_string == ')')
4441 {
af6bdddf 4442 char *temp_string;
24eab124
AM
4443 unsigned int parens_balanced = 1;
4444 /* We've already checked that the number of left & right ()'s are
47926f60 4445 equal, so this loop will not be infinite. */
24eab124
AM
4446 do
4447 {
4448 base_string--;
4449 if (*base_string == ')')
4450 parens_balanced++;
4451 if (*base_string == '(')
4452 parens_balanced--;
4453 }
4454 while (parens_balanced);
c3332e24 4455
af6bdddf 4456 temp_string = base_string;
c3332e24 4457
24eab124 4458 /* Skip past '(' and whitespace. */
252b5132
RH
4459 ++base_string;
4460 if (is_space_char (*base_string))
24eab124 4461 ++base_string;
252b5132 4462
af6bdddf
AM
4463 if (*base_string == ','
4464 || ((*base_string == REGISTER_PREFIX || allow_naked_reg)
4465 && (i.base_reg = parse_register (base_string, &end_op)) != NULL))
252b5132 4466 {
af6bdddf 4467 displacement_string_end = temp_string;
252b5132 4468
af6bdddf 4469 i.types[this_operand] |= BaseIndex;
252b5132 4470
af6bdddf 4471 if (i.base_reg)
24eab124 4472 {
24eab124
AM
4473 base_string = end_op;
4474 if (is_space_char (*base_string))
4475 ++base_string;
af6bdddf
AM
4476 }
4477
4478 /* There may be an index reg or scale factor here. */
4479 if (*base_string == ',')
4480 {
4481 ++base_string;
4482 if (is_space_char (*base_string))
4483 ++base_string;
4484
4485 if ((*base_string == REGISTER_PREFIX || allow_naked_reg)
4486 && (i.index_reg = parse_register (base_string, &end_op)) != NULL)
24eab124 4487 {
af6bdddf 4488 base_string = end_op;
24eab124
AM
4489 if (is_space_char (*base_string))
4490 ++base_string;
af6bdddf
AM
4491 if (*base_string == ',')
4492 {
4493 ++base_string;
4494 if (is_space_char (*base_string))
4495 ++base_string;
4496 }
e5cb08ac 4497 else if (*base_string != ')')
af6bdddf
AM
4498 {
4499 as_bad (_("expecting `,' or `)' after index register in `%s'"),
4500 operand_string);
4501 return 0;
4502 }
24eab124 4503 }
af6bdddf 4504 else if (*base_string == REGISTER_PREFIX)
24eab124 4505 {
af6bdddf 4506 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
4507 return 0;
4508 }
252b5132 4509
47926f60 4510 /* Check for scale factor. */
551c1ca1 4511 if (*base_string != ')')
af6bdddf 4512 {
551c1ca1
AM
4513 char *end_scale = i386_scale (base_string);
4514
4515 if (!end_scale)
af6bdddf 4516 return 0;
24eab124 4517
551c1ca1 4518 base_string = end_scale;
af6bdddf
AM
4519 if (is_space_char (*base_string))
4520 ++base_string;
4521 if (*base_string != ')')
4522 {
4523 as_bad (_("expecting `)' after scale factor in `%s'"),
4524 operand_string);
4525 return 0;
4526 }
4527 }
4528 else if (!i.index_reg)
24eab124 4529 {
af6bdddf
AM
4530 as_bad (_("expecting index register or scale factor after `,'; got '%c'"),
4531 *base_string);
24eab124
AM
4532 return 0;
4533 }
4534 }
af6bdddf 4535 else if (*base_string != ')')
24eab124 4536 {
af6bdddf
AM
4537 as_bad (_("expecting `,' or `)' after base register in `%s'"),
4538 operand_string);
24eab124
AM
4539 return 0;
4540 }
c3332e24 4541 }
af6bdddf 4542 else if (*base_string == REGISTER_PREFIX)
c3332e24 4543 {
af6bdddf 4544 as_bad (_("bad register name `%s'"), base_string);
24eab124 4545 return 0;
c3332e24 4546 }
24eab124
AM
4547 }
4548
4549 /* If there's an expression beginning the operand, parse it,
4550 assuming displacement_string_start and
4551 displacement_string_end are meaningful. */
4552 if (displacement_string_start != displacement_string_end)
4553 {
4554 if (!i386_displacement (displacement_string_start,
4555 displacement_string_end))
4556 return 0;
4557 }
4558
4559 /* Special case for (%dx) while doing input/output op. */
4560 if (i.base_reg
4561 && i.base_reg->reg_type == (Reg16 | InOutPortReg)
4562 && i.index_reg == 0
4563 && i.log2_scale_factor == 0
4564 && i.seg[i.mem_operands] == 0
4565 && (i.types[this_operand] & Disp) == 0)
4566 {
4567 i.types[this_operand] = InOutPortReg;
4568 return 1;
4569 }
4570
eecb386c
AM
4571 if (i386_index_check (operand_string) == 0)
4572 return 0;
24eab124
AM
4573 i.mem_operands++;
4574 }
4575 else
ce8a8b2f
AM
4576 {
4577 /* It's not a memory operand; argh! */
24eab124
AM
4578 as_bad (_("invalid char %s beginning operand %d `%s'"),
4579 output_invalid (*op_string),
4580 this_operand + 1,
4581 op_string);
4582 return 0;
4583 }
47926f60 4584 return 1; /* Normal return. */
252b5132
RH
4585}
4586\f
ee7fcc42
AM
4587/* md_estimate_size_before_relax()
4588
4589 Called just before relax() for rs_machine_dependent frags. The x86
4590 assembler uses these frags to handle variable size jump
4591 instructions.
4592
4593 Any symbol that is now undefined will not become defined.
4594 Return the correct fr_subtype in the frag.
4595 Return the initial "guess for variable size of frag" to caller.
4596 The guess is actually the growth beyond the fixed part. Whatever
4597 we do to grow the fixed or variable part contributes to our
4598 returned value. */
4599
252b5132
RH
4600int
4601md_estimate_size_before_relax (fragP, segment)
29b0f896
AM
4602 fragS *fragP;
4603 segT segment;
252b5132 4604{
252b5132 4605 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
4606 check for un-relaxable symbols. On an ELF system, we can't relax
4607 an externally visible symbol, because it may be overridden by a
4608 shared library. */
4609 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 4610#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
31312f95
AM
4611 || (OUTPUT_FLAVOR == bfd_target_elf_flavour
4612 && (S_IS_EXTERNAL (fragP->fr_symbol)
4613 || S_IS_WEAK (fragP->fr_symbol)))
b98ef147
AM
4614#endif
4615 )
252b5132 4616 {
b98ef147
AM
4617 /* Symbol is undefined in this segment, or we need to keep a
4618 reloc so that weak symbols can be overridden. */
4619 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f86103b7 4620 enum bfd_reloc_code_real reloc_type;
ee7fcc42
AM
4621 unsigned char *opcode;
4622 int old_fr_fix;
f6af82bd 4623
ee7fcc42
AM
4624 if (fragP->fr_var != NO_RELOC)
4625 reloc_type = fragP->fr_var;
b98ef147 4626 else if (size == 2)
f6af82bd
AM
4627 reloc_type = BFD_RELOC_16_PCREL;
4628 else
4629 reloc_type = BFD_RELOC_32_PCREL;
252b5132 4630
ee7fcc42
AM
4631 old_fr_fix = fragP->fr_fix;
4632 opcode = (unsigned char *) fragP->fr_opcode;
4633
fddf5b5b 4634 switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
252b5132 4635 {
fddf5b5b
AM
4636 case UNCOND_JUMP:
4637 /* Make jmp (0xeb) a (d)word displacement jump. */
47926f60 4638 opcode[0] = 0xe9;
252b5132 4639 fragP->fr_fix += size;
062cd5e7
AS
4640 fix_new (fragP, old_fr_fix, size,
4641 fragP->fr_symbol,
4642 fragP->fr_offset, 1,
4643 reloc_type);
252b5132
RH
4644 break;
4645
fddf5b5b 4646 case COND_JUMP86:
412167cb
AM
4647 if (size == 2
4648 && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
fddf5b5b
AM
4649 {
4650 /* Negate the condition, and branch past an
4651 unconditional jump. */
4652 opcode[0] ^= 1;
4653 opcode[1] = 3;
4654 /* Insert an unconditional jump. */
4655 opcode[2] = 0xe9;
4656 /* We added two extra opcode bytes, and have a two byte
4657 offset. */
4658 fragP->fr_fix += 2 + 2;
062cd5e7
AS
4659 fix_new (fragP, old_fr_fix + 2, 2,
4660 fragP->fr_symbol,
4661 fragP->fr_offset, 1,
4662 reloc_type);
fddf5b5b
AM
4663 break;
4664 }
4665 /* Fall through. */
4666
4667 case COND_JUMP:
412167cb
AM
4668 if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
4669 {
3e02c1cc
AM
4670 fixS *fixP;
4671
412167cb 4672 fragP->fr_fix += 1;
3e02c1cc
AM
4673 fixP = fix_new (fragP, old_fr_fix, 1,
4674 fragP->fr_symbol,
4675 fragP->fr_offset, 1,
4676 BFD_RELOC_8_PCREL);
4677 fixP->fx_signed = 1;
412167cb
AM
4678 break;
4679 }
93c2a809 4680
24eab124 4681 /* This changes the byte-displacement jump 0x7N
fddf5b5b 4682 to the (d)word-displacement jump 0x0f,0x8N. */
252b5132 4683 opcode[1] = opcode[0] + 0x10;
f6af82bd 4684 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
4685 /* We've added an opcode byte. */
4686 fragP->fr_fix += 1 + size;
062cd5e7
AS
4687 fix_new (fragP, old_fr_fix + 1, size,
4688 fragP->fr_symbol,
4689 fragP->fr_offset, 1,
4690 reloc_type);
252b5132 4691 break;
fddf5b5b
AM
4692
4693 default:
4694 BAD_CASE (fragP->fr_subtype);
4695 break;
252b5132
RH
4696 }
4697 frag_wane (fragP);
ee7fcc42 4698 return fragP->fr_fix - old_fr_fix;
252b5132 4699 }
93c2a809 4700
93c2a809
AM
4701 /* Guess size depending on current relax state. Initially the relax
4702 state will correspond to a short jump and we return 1, because
4703 the variable part of the frag (the branch offset) is one byte
4704 long. However, we can relax a section more than once and in that
4705 case we must either set fr_subtype back to the unrelaxed state,
4706 or return the value for the appropriate branch. */
4707 return md_relax_table[fragP->fr_subtype].rlx_length;
ee7fcc42
AM
4708}
4709
47926f60
KH
4710/* Called after relax() is finished.
4711
4712 In: Address of frag.
4713 fr_type == rs_machine_dependent.
4714 fr_subtype is what the address relaxed to.
4715
4716 Out: Any fixSs and constants are set up.
4717 Caller will turn frag into a ".space 0". */
4718
252b5132
RH
4719void
4720md_convert_frag (abfd, sec, fragP)
ab9da554
ILT
4721 bfd *abfd ATTRIBUTE_UNUSED;
4722 segT sec ATTRIBUTE_UNUSED;
29b0f896 4723 fragS *fragP;
252b5132 4724{
29b0f896 4725 unsigned char *opcode;
252b5132 4726 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
4727 offsetT target_address;
4728 offsetT opcode_address;
252b5132 4729 unsigned int extension = 0;
847f7ad4 4730 offsetT displacement_from_opcode_start;
252b5132
RH
4731
4732 opcode = (unsigned char *) fragP->fr_opcode;
4733
47926f60 4734 /* Address we want to reach in file space. */
252b5132 4735 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
252b5132 4736
47926f60 4737 /* Address opcode resides at in file space. */
252b5132
RH
4738 opcode_address = fragP->fr_address + fragP->fr_fix;
4739
47926f60 4740 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
4741 displacement_from_opcode_start = target_address - opcode_address;
4742
fddf5b5b 4743 if ((fragP->fr_subtype & BIG) == 0)
252b5132 4744 {
47926f60
KH
4745 /* Don't have to change opcode. */
4746 extension = 1; /* 1 opcode + 1 displacement */
252b5132 4747 where_to_put_displacement = &opcode[1];
fddf5b5b
AM
4748 }
4749 else
4750 {
4751 if (no_cond_jump_promotion
4752 && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4753 as_warn_where (fragP->fr_file, fragP->fr_line, _("long jump required"));
252b5132 4754
fddf5b5b
AM
4755 switch (fragP->fr_subtype)
4756 {
4757 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
4758 extension = 4; /* 1 opcode + 4 displacement */
4759 opcode[0] = 0xe9;
4760 where_to_put_displacement = &opcode[1];
4761 break;
252b5132 4762
fddf5b5b
AM
4763 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
4764 extension = 2; /* 1 opcode + 2 displacement */
4765 opcode[0] = 0xe9;
4766 where_to_put_displacement = &opcode[1];
4767 break;
252b5132 4768
fddf5b5b
AM
4769 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
4770 case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
4771 extension = 5; /* 2 opcode + 4 displacement */
4772 opcode[1] = opcode[0] + 0x10;
4773 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
4774 where_to_put_displacement = &opcode[2];
4775 break;
252b5132 4776
fddf5b5b
AM
4777 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
4778 extension = 3; /* 2 opcode + 2 displacement */
4779 opcode[1] = opcode[0] + 0x10;
4780 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
4781 where_to_put_displacement = &opcode[2];
4782 break;
252b5132 4783
fddf5b5b
AM
4784 case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
4785 extension = 4;
4786 opcode[0] ^= 1;
4787 opcode[1] = 3;
4788 opcode[2] = 0xe9;
4789 where_to_put_displacement = &opcode[3];
4790 break;
4791
4792 default:
4793 BAD_CASE (fragP->fr_subtype);
4794 break;
4795 }
252b5132 4796 }
fddf5b5b 4797
47926f60 4798 /* Now put displacement after opcode. */
252b5132
RH
4799 md_number_to_chars ((char *) where_to_put_displacement,
4800 (valueT) (displacement_from_opcode_start - extension),
fddf5b5b 4801 DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
252b5132
RH
4802 fragP->fr_fix += extension;
4803}
4804\f
47926f60
KH
4805/* Size of byte displacement jmp. */
4806int md_short_jump_size = 2;
4807
4808/* Size of dword displacement jmp. */
4809int md_long_jump_size = 5;
252b5132 4810
47926f60
KH
4811/* Size of relocation record. */
4812const int md_reloc_size = 8;
252b5132
RH
4813
4814void
4815md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
4816 char *ptr;
4817 addressT from_addr, to_addr;
ab9da554
ILT
4818 fragS *frag ATTRIBUTE_UNUSED;
4819 symbolS *to_symbol ATTRIBUTE_UNUSED;
252b5132 4820{
847f7ad4 4821 offsetT offset;
252b5132
RH
4822
4823 offset = to_addr - (from_addr + 2);
47926f60
KH
4824 /* Opcode for byte-disp jump. */
4825 md_number_to_chars (ptr, (valueT) 0xeb, 1);
252b5132
RH
4826 md_number_to_chars (ptr + 1, (valueT) offset, 1);
4827}
4828
4829void
4830md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
4831 char *ptr;
4832 addressT from_addr, to_addr;
a38cf1db
AM
4833 fragS *frag ATTRIBUTE_UNUSED;
4834 symbolS *to_symbol ATTRIBUTE_UNUSED;
252b5132 4835{
847f7ad4 4836 offsetT offset;
252b5132 4837
a38cf1db
AM
4838 offset = to_addr - (from_addr + 5);
4839 md_number_to_chars (ptr, (valueT) 0xe9, 1);
4840 md_number_to_chars (ptr + 1, (valueT) offset, 4);
252b5132
RH
4841}
4842\f
4843/* Apply a fixup (fixS) to segment data, once it has been determined
4844 by our caller that we have all the info we need to fix it up.
4845
4846 On the 386, immediates, displacements, and data pointers are all in
4847 the same (little-endian) format, so we don't need to care about which
4848 we are handling. */
4849
94f592af 4850void
55cf6793 4851md_apply_fix (fixP, valP, seg)
47926f60
KH
4852 /* The fix we're to put in. */
4853 fixS *fixP;
47926f60 4854 /* Pointer to the value of the bits. */
c6682705 4855 valueT *valP;
47926f60
KH
4856 /* Segment fix is from. */
4857 segT seg ATTRIBUTE_UNUSED;
252b5132 4858{
94f592af 4859 char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
c6682705 4860 valueT value = *valP;
252b5132 4861
f86103b7 4862#if !defined (TE_Mach)
93382f6d
AM
4863 if (fixP->fx_pcrel)
4864 {
4865 switch (fixP->fx_r_type)
4866 {
5865bb77
ILT
4867 default:
4868 break;
4869
d6ab8113
JB
4870 case BFD_RELOC_64:
4871 fixP->fx_r_type = BFD_RELOC_64_PCREL;
4872 break;
93382f6d 4873 case BFD_RELOC_32:
ae8887b5 4874 case BFD_RELOC_X86_64_32S:
93382f6d
AM
4875 fixP->fx_r_type = BFD_RELOC_32_PCREL;
4876 break;
4877 case BFD_RELOC_16:
4878 fixP->fx_r_type = BFD_RELOC_16_PCREL;
4879 break;
4880 case BFD_RELOC_8:
4881 fixP->fx_r_type = BFD_RELOC_8_PCREL;
4882 break;
4883 }
4884 }
252b5132 4885
a161fe53 4886 if (fixP->fx_addsy != NULL
31312f95 4887 && (fixP->fx_r_type == BFD_RELOC_32_PCREL
d6ab8113 4888 || fixP->fx_r_type == BFD_RELOC_64_PCREL
31312f95
AM
4889 || fixP->fx_r_type == BFD_RELOC_16_PCREL
4890 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
4891 && !use_rela_relocations)
252b5132 4892 {
31312f95
AM
4893 /* This is a hack. There should be a better way to handle this.
4894 This covers for the fact that bfd_install_relocation will
4895 subtract the current location (for partial_inplace, PC relative
4896 relocations); see more below. */
252b5132
RH
4897#ifndef OBJ_AOUT
4898 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
4899#ifdef TE_PE
4900 || OUTPUT_FLAVOR == bfd_target_coff_flavour
4901#endif
4902 )
4903 value += fixP->fx_where + fixP->fx_frag->fr_address;
4904#endif
4905#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2f66722d 4906 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
252b5132 4907 {
6539b54b 4908 segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
2f66722d 4909
6539b54b 4910 if ((sym_seg == seg
2f66722d 4911 || (symbol_section_p (fixP->fx_addsy)
6539b54b 4912 && sym_seg != absolute_section))
ae6063d4 4913 && !generic_force_reloc (fixP))
2f66722d
AM
4914 {
4915 /* Yes, we add the values in twice. This is because
6539b54b
AM
4916 bfd_install_relocation subtracts them out again. I think
4917 bfd_install_relocation is broken, but I don't dare change
2f66722d
AM
4918 it. FIXME. */
4919 value += fixP->fx_where + fixP->fx_frag->fr_address;
4920 }
252b5132
RH
4921 }
4922#endif
4923#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
4924 /* For some reason, the PE format does not store a
4925 section address offset for a PC relative symbol. */
4926 if (S_GET_SEGMENT (fixP->fx_addsy) != seg
4927#if defined(BFD_ASSEMBLER) || defined(S_IS_WEAK)
4928 || S_IS_WEAK (fixP->fx_addsy)
4929#endif
4930 )
252b5132
RH
4931 value += md_pcrel_from (fixP);
4932#endif
4933 }
4934
4935 /* Fix a few things - the dynamic linker expects certain values here,
0234cb7c 4936 and we must not disappoint it. */
252b5132
RH
4937#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4938 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
4939 && fixP->fx_addsy)
47926f60
KH
4940 switch (fixP->fx_r_type)
4941 {
4942 case BFD_RELOC_386_PLT32:
3e73aa7c 4943 case BFD_RELOC_X86_64_PLT32:
47926f60
KH
4944 /* Make the jump instruction point to the address of the operand. At
4945 runtime we merely add the offset to the actual PLT entry. */
4946 value = -4;
4947 break;
31312f95 4948
13ae64f3
JJ
4949 case BFD_RELOC_386_TLS_GD:
4950 case BFD_RELOC_386_TLS_LDM:
13ae64f3 4951 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
4952 case BFD_RELOC_386_TLS_IE:
4953 case BFD_RELOC_386_TLS_GOTIE:
bffbf940
JJ
4954 case BFD_RELOC_X86_64_TLSGD:
4955 case BFD_RELOC_X86_64_TLSLD:
4956 case BFD_RELOC_X86_64_GOTTPOFF:
00f7efb6
JJ
4957 value = 0; /* Fully resolved at runtime. No addend. */
4958 /* Fallthrough */
4959 case BFD_RELOC_386_TLS_LE:
4960 case BFD_RELOC_386_TLS_LDO_32:
4961 case BFD_RELOC_386_TLS_LE_32:
4962 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 4963 case BFD_RELOC_X86_64_DTPOFF64:
00f7efb6 4964 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113 4965 case BFD_RELOC_X86_64_TPOFF64:
00f7efb6
JJ
4966 S_SET_THREAD_LOCAL (fixP->fx_addsy);
4967 break;
4968
4969 case BFD_RELOC_386_GOT32:
4970 case BFD_RELOC_X86_64_GOT32:
47926f60
KH
4971 value = 0; /* Fully resolved at runtime. No addend. */
4972 break;
47926f60
KH
4973
4974 case BFD_RELOC_VTABLE_INHERIT:
4975 case BFD_RELOC_VTABLE_ENTRY:
4976 fixP->fx_done = 0;
94f592af 4977 return;
47926f60
KH
4978
4979 default:
4980 break;
4981 }
4982#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
c6682705 4983 *valP = value;
f86103b7 4984#endif /* !defined (TE_Mach) */
3e73aa7c 4985
3e73aa7c 4986 /* Are we finished with this relocation now? */
c6682705 4987 if (fixP->fx_addsy == NULL)
3e73aa7c
JH
4988 fixP->fx_done = 1;
4989 else if (use_rela_relocations)
4990 {
4991 fixP->fx_no_overflow = 1;
062cd5e7
AS
4992 /* Remember value for tc_gen_reloc. */
4993 fixP->fx_addnumber = value;
3e73aa7c
JH
4994 value = 0;
4995 }
f86103b7 4996
94f592af 4997 md_number_to_chars (p, value, fixP->fx_size);
252b5132 4998}
252b5132 4999\f
252b5132
RH
5000#define MAX_LITTLENUMS 6
5001
47926f60
KH
5002/* Turn the string pointed to by litP into a floating point constant
5003 of type TYPE, and emit the appropriate bytes. The number of
5004 LITTLENUMS emitted is stored in *SIZEP. An error message is
5005 returned, or NULL on OK. */
5006
252b5132
RH
5007char *
5008md_atof (type, litP, sizeP)
2ab9b79e 5009 int type;
252b5132
RH
5010 char *litP;
5011 int *sizeP;
5012{
5013 int prec;
5014 LITTLENUM_TYPE words[MAX_LITTLENUMS];
5015 LITTLENUM_TYPE *wordP;
5016 char *t;
5017
5018 switch (type)
5019 {
5020 case 'f':
5021 case 'F':
5022 prec = 2;
5023 break;
5024
5025 case 'd':
5026 case 'D':
5027 prec = 4;
5028 break;
5029
5030 case 'x':
5031 case 'X':
5032 prec = 5;
5033 break;
5034
5035 default:
5036 *sizeP = 0;
5037 return _("Bad call to md_atof ()");
5038 }
5039 t = atof_ieee (input_line_pointer, type, words);
5040 if (t)
5041 input_line_pointer = t;
5042
5043 *sizeP = prec * sizeof (LITTLENUM_TYPE);
5044 /* This loops outputs the LITTLENUMs in REVERSE order; in accord with
5045 the bigendian 386. */
5046 for (wordP = words + prec - 1; prec--;)
5047 {
5048 md_number_to_chars (litP, (valueT) (*wordP--), sizeof (LITTLENUM_TYPE));
5049 litP += sizeof (LITTLENUM_TYPE);
5050 }
5051 return 0;
5052}
5053\f
87c245cc 5054static char output_invalid_buf[8];
252b5132 5055
252b5132
RH
5056static char *
5057output_invalid (c)
5058 int c;
5059{
3882b010 5060 if (ISPRINT (c))
252b5132
RH
5061 sprintf (output_invalid_buf, "'%c'", c);
5062 else
5063 sprintf (output_invalid_buf, "(0x%x)", (unsigned) c);
5064 return output_invalid_buf;
5065}
5066
af6bdddf 5067/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
5068
5069static const reg_entry *
5070parse_register (reg_string, end_op)
5071 char *reg_string;
5072 char **end_op;
5073{
af6bdddf
AM
5074 char *s = reg_string;
5075 char *p;
252b5132
RH
5076 char reg_name_given[MAX_REG_NAME_SIZE + 1];
5077 const reg_entry *r;
5078
5079 /* Skip possible REGISTER_PREFIX and possible whitespace. */
5080 if (*s == REGISTER_PREFIX)
5081 ++s;
5082
5083 if (is_space_char (*s))
5084 ++s;
5085
5086 p = reg_name_given;
af6bdddf 5087 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
5088 {
5089 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
5090 return (const reg_entry *) NULL;
5091 s++;
252b5132
RH
5092 }
5093
6588847e
DN
5094 /* For naked regs, make sure that we are not dealing with an identifier.
5095 This prevents confusing an identifier like `eax_var' with register
5096 `eax'. */
5097 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
5098 return (const reg_entry *) NULL;
5099
af6bdddf 5100 *end_op = s;
252b5132
RH
5101
5102 r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
5103
5f47d35b 5104 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 5105 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 5106 {
5f47d35b
AM
5107 if (is_space_char (*s))
5108 ++s;
5109 if (*s == '(')
5110 {
af6bdddf 5111 ++s;
5f47d35b
AM
5112 if (is_space_char (*s))
5113 ++s;
5114 if (*s >= '0' && *s <= '7')
5115 {
5116 r = &i386_float_regtab[*s - '0'];
af6bdddf 5117 ++s;
5f47d35b
AM
5118 if (is_space_char (*s))
5119 ++s;
5120 if (*s == ')')
5121 {
5122 *end_op = s + 1;
5123 return r;
5124 }
5f47d35b 5125 }
47926f60 5126 /* We have "%st(" then garbage. */
5f47d35b
AM
5127 return (const reg_entry *) NULL;
5128 }
5129 }
5130
1ae00879 5131 if (r != NULL
20f0a1fc 5132 && ((r->reg_flags & (RegRex64 | RegRex)) | (r->reg_type & Reg64)) != 0
c4a530c5 5133 && (r->reg_type != Control || !(cpu_arch_flags & CpuSledgehammer))
1ae00879 5134 && flag_code != CODE_64BIT)
20f0a1fc 5135 return (const reg_entry *) NULL;
1ae00879 5136
252b5132
RH
5137 return r;
5138}
5139\f
4cc782b5 5140#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12b55ccc 5141const char *md_shortopts = "kVQ:sqn";
252b5132 5142#else
12b55ccc 5143const char *md_shortopts = "qn";
252b5132 5144#endif
6e0b89ee 5145
252b5132 5146struct option md_longopts[] = {
3e73aa7c
JH
5147#define OPTION_32 (OPTION_MD_BASE + 0)
5148 {"32", no_argument, NULL, OPTION_32},
6e0b89ee 5149#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
3e73aa7c
JH
5150#define OPTION_64 (OPTION_MD_BASE + 1)
5151 {"64", no_argument, NULL, OPTION_64},
6e0b89ee 5152#endif
252b5132
RH
5153 {NULL, no_argument, NULL, 0}
5154};
5155size_t md_longopts_size = sizeof (md_longopts);
5156
5157int
5158md_parse_option (c, arg)
5159 int c;
ab9da554 5160 char *arg ATTRIBUTE_UNUSED;
252b5132
RH
5161{
5162 switch (c)
5163 {
12b55ccc
L
5164 case 'n':
5165 optimize_align_code = 0;
5166 break;
5167
a38cf1db
AM
5168 case 'q':
5169 quiet_warnings = 1;
252b5132
RH
5170 break;
5171
5172#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
5173 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
5174 should be emitted or not. FIXME: Not implemented. */
5175 case 'Q':
252b5132
RH
5176 break;
5177
5178 /* -V: SVR4 argument to print version ID. */
5179 case 'V':
5180 print_version_id ();
5181 break;
5182
a38cf1db
AM
5183 /* -k: Ignore for FreeBSD compatibility. */
5184 case 'k':
252b5132 5185 break;
4cc782b5
ILT
5186
5187 case 's':
5188 /* -s: On i386 Solaris, this tells the native assembler to use
29b0f896 5189 .stab instead of .stab.excl. We always use .stab anyhow. */
4cc782b5 5190 break;
6e0b89ee 5191
3e73aa7c
JH
5192 case OPTION_64:
5193 {
5194 const char **list, **l;
5195
3e73aa7c
JH
5196 list = bfd_target_list ();
5197 for (l = list; *l != NULL; l++)
6e0b89ee
AM
5198 if (strcmp (*l, "elf64-x86-64") == 0)
5199 {
5200 default_arch = "x86_64";
5201 break;
5202 }
3e73aa7c 5203 if (*l == NULL)
6e0b89ee 5204 as_fatal (_("No compiled in support for x86_64"));
3e73aa7c
JH
5205 free (list);
5206 }
5207 break;
5208#endif
252b5132 5209
6e0b89ee
AM
5210 case OPTION_32:
5211 default_arch = "i386";
5212 break;
5213
252b5132
RH
5214 default:
5215 return 0;
5216 }
5217 return 1;
5218}
5219
5220void
5221md_show_usage (stream)
5222 FILE *stream;
5223{
4cc782b5
ILT
5224#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
5225 fprintf (stream, _("\
a38cf1db
AM
5226 -Q ignored\n\
5227 -V print assembler version number\n\
5228 -k ignored\n\
12b55ccc 5229 -n Do not optimize code alignment\n\
a38cf1db
AM
5230 -q quieten some warnings\n\
5231 -s ignored\n"));
5232#else
5233 fprintf (stream, _("\
12b55ccc 5234 -n Do not optimize code alignment\n\
a38cf1db 5235 -q quieten some warnings\n"));
4cc782b5 5236#endif
252b5132
RH
5237}
5238
3e73aa7c
JH
5239#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
5240 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
252b5132
RH
5241
5242/* Pick the target format to use. */
5243
47926f60 5244const char *
252b5132
RH
5245i386_target_format ()
5246{
3e73aa7c
JH
5247 if (!strcmp (default_arch, "x86_64"))
5248 set_code_flag (CODE_64BIT);
5249 else if (!strcmp (default_arch, "i386"))
5250 set_code_flag (CODE_32BIT);
5251 else
5252 as_fatal (_("Unknown architecture"));
252b5132
RH
5253 switch (OUTPUT_FLAVOR)
5254 {
4c63da97
AM
5255#ifdef OBJ_MAYBE_AOUT
5256 case bfd_target_aout_flavour:
47926f60 5257 return AOUT_TARGET_FORMAT;
4c63da97
AM
5258#endif
5259#ifdef OBJ_MAYBE_COFF
252b5132
RH
5260 case bfd_target_coff_flavour:
5261 return "coff-i386";
4c63da97 5262#endif
3e73aa7c 5263#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 5264 case bfd_target_elf_flavour:
3e73aa7c 5265 {
e5cb08ac
KH
5266 if (flag_code == CODE_64BIT)
5267 use_rela_relocations = 1;
4ada7262 5268 return flag_code == CODE_64BIT ? "elf64-x86-64" : ELF_TARGET_FORMAT;
3e73aa7c 5269 }
4c63da97 5270#endif
252b5132
RH
5271 default:
5272 abort ();
5273 return NULL;
5274 }
5275}
5276
47926f60 5277#endif /* OBJ_MAYBE_ more than one */
a847613f
AM
5278
5279#if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
5280void i386_elf_emit_arch_note ()
5281{
5282 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
5283 && cpu_arch_name != NULL)
5284 {
5285 char *p;
5286 asection *seg = now_seg;
5287 subsegT subseg = now_subseg;
5288 Elf_Internal_Note i_note;
5289 Elf_External_Note e_note;
5290 asection *note_secp;
5291 int len;
5292
5293 /* Create the .note section. */
5294 note_secp = subseg_new (".note", 0);
5295 bfd_set_section_flags (stdoutput,
5296 note_secp,
5297 SEC_HAS_CONTENTS | SEC_READONLY);
5298
5299 /* Process the arch string. */
5300 len = strlen (cpu_arch_name);
5301
5302 i_note.namesz = len + 1;
5303 i_note.descsz = 0;
5304 i_note.type = NT_ARCH;
5305 p = frag_more (sizeof (e_note.namesz));
5306 md_number_to_chars (p, (valueT) i_note.namesz, sizeof (e_note.namesz));
5307 p = frag_more (sizeof (e_note.descsz));
5308 md_number_to_chars (p, (valueT) i_note.descsz, sizeof (e_note.descsz));
5309 p = frag_more (sizeof (e_note.type));
5310 md_number_to_chars (p, (valueT) i_note.type, sizeof (e_note.type));
5311 p = frag_more (len + 1);
5312 strcpy (p, cpu_arch_name);
5313
5314 frag_align (2, 0, 0);
5315
5316 subseg_set (seg, subseg);
5317 }
5318}
5319#endif
252b5132 5320\f
252b5132
RH
5321symbolS *
5322md_undefined_symbol (name)
5323 char *name;
5324{
18dc2407
ILT
5325 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
5326 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
5327 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
5328 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
5329 {
5330 if (!GOT_symbol)
5331 {
5332 if (symbol_find (name))
5333 as_bad (_("GOT already in symbol table"));
5334 GOT_symbol = symbol_new (name, undefined_section,
5335 (valueT) 0, &zero_address_frag);
5336 };
5337 return GOT_symbol;
5338 }
252b5132
RH
5339 return 0;
5340}
5341
5342/* Round up a section size to the appropriate boundary. */
47926f60 5343
252b5132
RH
5344valueT
5345md_section_align (segment, size)
ab9da554 5346 segT segment ATTRIBUTE_UNUSED;
252b5132
RH
5347 valueT size;
5348{
4c63da97
AM
5349#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
5350 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
5351 {
5352 /* For a.out, force the section size to be aligned. If we don't do
5353 this, BFD will align it for us, but it will not write out the
5354 final bytes of the section. This may be a bug in BFD, but it is
5355 easier to fix it here since that is how the other a.out targets
5356 work. */
5357 int align;
5358
5359 align = bfd_get_section_alignment (stdoutput, segment);
5360 size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
5361 }
252b5132
RH
5362#endif
5363
5364 return size;
5365}
5366
5367/* On the i386, PC-relative offsets are relative to the start of the
5368 next instruction. That is, the address of the offset, plus its
5369 size, since the offset is always the last part of the insn. */
5370
5371long
5372md_pcrel_from (fixP)
5373 fixS *fixP;
5374{
5375 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
5376}
5377
5378#ifndef I386COFF
5379
5380static void
5381s_bss (ignore)
ab9da554 5382 int ignore ATTRIBUTE_UNUSED;
252b5132 5383{
29b0f896 5384 int temp;
252b5132 5385
8a75718c
JB
5386#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
5387 if (IS_ELF)
5388 obj_elf_section_change_hook ();
5389#endif
252b5132
RH
5390 temp = get_absolute_expression ();
5391 subseg_set (bss_section, (subsegT) temp);
5392 demand_empty_rest_of_line ();
5393}
5394
5395#endif
5396
252b5132
RH
5397void
5398i386_validate_fix (fixp)
5399 fixS *fixp;
5400{
5401 if (fixp->fx_subsy && fixp->fx_subsy == GOT_symbol)
5402 {
23df1078
JH
5403 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
5404 {
5405 if (flag_code != CODE_64BIT)
5406 abort ();
5407 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
5408 }
5409 else
5410 {
d6ab8113
JB
5411 if (flag_code != CODE_64BIT)
5412 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
5413 else
5414 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
23df1078 5415 }
252b5132
RH
5416 fixp->fx_subsy = 0;
5417 }
5418}
5419
252b5132
RH
5420arelent *
5421tc_gen_reloc (section, fixp)
ab9da554 5422 asection *section ATTRIBUTE_UNUSED;
252b5132
RH
5423 fixS *fixp;
5424{
5425 arelent *rel;
5426 bfd_reloc_code_real_type code;
5427
5428 switch (fixp->fx_r_type)
5429 {
3e73aa7c
JH
5430 case BFD_RELOC_X86_64_PLT32:
5431 case BFD_RELOC_X86_64_GOT32:
5432 case BFD_RELOC_X86_64_GOTPCREL:
252b5132
RH
5433 case BFD_RELOC_386_PLT32:
5434 case BFD_RELOC_386_GOT32:
5435 case BFD_RELOC_386_GOTOFF:
5436 case BFD_RELOC_386_GOTPC:
13ae64f3
JJ
5437 case BFD_RELOC_386_TLS_GD:
5438 case BFD_RELOC_386_TLS_LDM:
5439 case BFD_RELOC_386_TLS_LDO_32:
5440 case BFD_RELOC_386_TLS_IE_32:
37e55690
JJ
5441 case BFD_RELOC_386_TLS_IE:
5442 case BFD_RELOC_386_TLS_GOTIE:
13ae64f3
JJ
5443 case BFD_RELOC_386_TLS_LE_32:
5444 case BFD_RELOC_386_TLS_LE:
bffbf940
JJ
5445 case BFD_RELOC_X86_64_TLSGD:
5446 case BFD_RELOC_X86_64_TLSLD:
5447 case BFD_RELOC_X86_64_DTPOFF32:
d6ab8113 5448 case BFD_RELOC_X86_64_DTPOFF64:
bffbf940
JJ
5449 case BFD_RELOC_X86_64_GOTTPOFF:
5450 case BFD_RELOC_X86_64_TPOFF32:
d6ab8113
JB
5451 case BFD_RELOC_X86_64_TPOFF64:
5452 case BFD_RELOC_X86_64_GOTOFF64:
5453 case BFD_RELOC_X86_64_GOTPC32:
252b5132
RH
5454 case BFD_RELOC_RVA:
5455 case BFD_RELOC_VTABLE_ENTRY:
5456 case BFD_RELOC_VTABLE_INHERIT:
6482c264
NC
5457#ifdef TE_PE
5458 case BFD_RELOC_32_SECREL:
5459#endif
252b5132
RH
5460 code = fixp->fx_r_type;
5461 break;
dbbaec26
L
5462 case BFD_RELOC_X86_64_32S:
5463 if (!fixp->fx_pcrel)
5464 {
5465 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
5466 code = fixp->fx_r_type;
5467 break;
5468 }
252b5132 5469 default:
93382f6d 5470 if (fixp->fx_pcrel)
252b5132 5471 {
93382f6d
AM
5472 switch (fixp->fx_size)
5473 {
5474 default:
b091f402
AM
5475 as_bad_where (fixp->fx_file, fixp->fx_line,
5476 _("can not do %d byte pc-relative relocation"),
5477 fixp->fx_size);
93382f6d
AM
5478 code = BFD_RELOC_32_PCREL;
5479 break;
5480 case 1: code = BFD_RELOC_8_PCREL; break;
5481 case 2: code = BFD_RELOC_16_PCREL; break;
5482 case 4: code = BFD_RELOC_32_PCREL; break;
d6ab8113
JB
5483#ifdef BFD64
5484 case 8: code = BFD_RELOC_64_PCREL; break;
5485#endif
93382f6d
AM
5486 }
5487 }
5488 else
5489 {
5490 switch (fixp->fx_size)
5491 {
5492 default:
b091f402
AM
5493 as_bad_where (fixp->fx_file, fixp->fx_line,
5494 _("can not do %d byte relocation"),
5495 fixp->fx_size);
93382f6d
AM
5496 code = BFD_RELOC_32;
5497 break;
5498 case 1: code = BFD_RELOC_8; break;
5499 case 2: code = BFD_RELOC_16; break;
5500 case 4: code = BFD_RELOC_32; break;
937149dd 5501#ifdef BFD64
3e73aa7c 5502 case 8: code = BFD_RELOC_64; break;
937149dd 5503#endif
93382f6d 5504 }
252b5132
RH
5505 }
5506 break;
5507 }
252b5132 5508
d6ab8113 5509 if ((code == BFD_RELOC_32 || code == BFD_RELOC_32_PCREL)
252b5132
RH
5510 && GOT_symbol
5511 && fixp->fx_addsy == GOT_symbol)
3e73aa7c 5512 {
d6ab8113
JB
5513 if (flag_code != CODE_64BIT)
5514 code = BFD_RELOC_386_GOTPC;
5515 else
5516 code = BFD_RELOC_X86_64_GOTPC32;
3e73aa7c 5517 }
252b5132
RH
5518
5519 rel = (arelent *) xmalloc (sizeof (arelent));
49309057
ILT
5520 rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
5521 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
5522
5523 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
c87db184 5524
3e73aa7c
JH
5525 if (!use_rela_relocations)
5526 {
5527 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
5528 vtable entry to be used in the relocation's section offset. */
5529 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
5530 rel->address = fixp->fx_offset;
252b5132 5531
c6682705 5532 rel->addend = 0;
3e73aa7c
JH
5533 }
5534 /* Use the rela in 64bit mode. */
252b5132 5535 else
3e73aa7c 5536 {
062cd5e7
AS
5537 if (!fixp->fx_pcrel)
5538 rel->addend = fixp->fx_offset;
5539 else
5540 switch (code)
5541 {
5542 case BFD_RELOC_X86_64_PLT32:
5543 case BFD_RELOC_X86_64_GOT32:
5544 case BFD_RELOC_X86_64_GOTPCREL:
bffbf940
JJ
5545 case BFD_RELOC_X86_64_TLSGD:
5546 case BFD_RELOC_X86_64_TLSLD:
5547 case BFD_RELOC_X86_64_GOTTPOFF:
062cd5e7
AS
5548 rel->addend = fixp->fx_offset - fixp->fx_size;
5549 break;
5550 default:
5551 rel->addend = (section->vma
5552 - fixp->fx_size
5553 + fixp->fx_addnumber
5554 + md_pcrel_from (fixp));
5555 break;
5556 }
3e73aa7c
JH
5557 }
5558
252b5132
RH
5559 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
5560 if (rel->howto == NULL)
5561 {
5562 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 5563 _("cannot represent relocation type %s"),
252b5132
RH
5564 bfd_get_reloc_code_name (code));
5565 /* Set howto to a garbage value so that we can keep going. */
5566 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
5567 assert (rel->howto != NULL);
5568 }
5569
5570 return rel;
5571}
5572
64a0c779
DN
5573\f
5574/* Parse operands using Intel syntax. This implements a recursive descent
5575 parser based on the BNF grammar published in Appendix B of the MASM 6.1
5576 Programmer's Guide.
5577
5578 FIXME: We do not recognize the full operand grammar defined in the MASM
5579 documentation. In particular, all the structure/union and
5580 high-level macro operands are missing.
5581
5582 Uppercase words are terminals, lower case words are non-terminals.
5583 Objects surrounded by double brackets '[[' ']]' are optional. Vertical
5584 bars '|' denote choices. Most grammar productions are implemented in
5585 functions called 'intel_<production>'.
5586
5587 Initial production is 'expr'.
5588
9306ca4a 5589 addOp + | -
64a0c779
DN
5590
5591 alpha [a-zA-Z]
5592
9306ca4a
JB
5593 binOp & | AND | \| | OR | ^ | XOR
5594
64a0c779
DN
5595 byteRegister AL | AH | BL | BH | CL | CH | DL | DH
5596
5597 constant digits [[ radixOverride ]]
5598
9306ca4a 5599 dataType BYTE | WORD | DWORD | FWORD | QWORD | TBYTE | OWORD | XMMWORD
64a0c779
DN
5600
5601 digits decdigit
b77a7acd
AJ
5602 | digits decdigit
5603 | digits hexdigit
64a0c779
DN
5604
5605 decdigit [0-9]
5606
9306ca4a
JB
5607 e04 e04 addOp e05
5608 | e05
5609
5610 e05 e05 binOp e06
b77a7acd 5611 | e06
64a0c779
DN
5612
5613 e06 e06 mulOp e09
b77a7acd 5614 | e09
64a0c779
DN
5615
5616 e09 OFFSET e10
a724f0f4
JB
5617 | SHORT e10
5618 | + e10
5619 | - e10
9306ca4a
JB
5620 | ~ e10
5621 | NOT e10
64a0c779
DN
5622 | e09 PTR e10
5623 | e09 : e10
5624 | e10
5625
5626 e10 e10 [ expr ]
b77a7acd 5627 | e11
64a0c779
DN
5628
5629 e11 ( expr )
b77a7acd 5630 | [ expr ]
64a0c779
DN
5631 | constant
5632 | dataType
5633 | id
5634 | $
5635 | register
5636
a724f0f4 5637 => expr expr cmpOp e04
9306ca4a 5638 | e04
64a0c779
DN
5639
5640 gpRegister AX | EAX | BX | EBX | CX | ECX | DX | EDX
b77a7acd 5641 | BP | EBP | SP | ESP | DI | EDI | SI | ESI
64a0c779
DN
5642
5643 hexdigit a | b | c | d | e | f
b77a7acd 5644 | A | B | C | D | E | F
64a0c779
DN
5645
5646 id alpha
b77a7acd 5647 | id alpha
64a0c779
DN
5648 | id decdigit
5649
9306ca4a 5650 mulOp * | / | % | MOD | << | SHL | >> | SHR
64a0c779
DN
5651
5652 quote " | '
5653
5654 register specialRegister
b77a7acd 5655 | gpRegister
64a0c779
DN
5656 | byteRegister
5657
5658 segmentRegister CS | DS | ES | FS | GS | SS
5659
9306ca4a 5660 specialRegister CR0 | CR2 | CR3 | CR4
b77a7acd 5661 | DR0 | DR1 | DR2 | DR3 | DR6 | DR7
64a0c779
DN
5662 | TR3 | TR4 | TR5 | TR6 | TR7
5663
64a0c779
DN
5664 We simplify the grammar in obvious places (e.g., register parsing is
5665 done by calling parse_register) and eliminate immediate left recursion
5666 to implement a recursive-descent parser.
5667
a724f0f4
JB
5668 expr e04 expr'
5669
5670 expr' cmpOp e04 expr'
5671 | Empty
9306ca4a
JB
5672
5673 e04 e05 e04'
5674
5675 e04' addOp e05 e04'
5676 | Empty
64a0c779
DN
5677
5678 e05 e06 e05'
5679
9306ca4a 5680 e05' binOp e06 e05'
b77a7acd 5681 | Empty
64a0c779
DN
5682
5683 e06 e09 e06'
5684
5685 e06' mulOp e09 e06'
b77a7acd 5686 | Empty
64a0c779
DN
5687
5688 e09 OFFSET e10 e09'
a724f0f4
JB
5689 | SHORT e10'
5690 | + e10'
5691 | - e10'
5692 | ~ e10'
5693 | NOT e10'
b77a7acd 5694 | e10 e09'
64a0c779
DN
5695
5696 e09' PTR e10 e09'
b77a7acd 5697 | : e10 e09'
64a0c779
DN
5698 | Empty
5699
5700 e10 e11 e10'
5701
5702 e10' [ expr ] e10'
b77a7acd 5703 | Empty
64a0c779
DN
5704
5705 e11 ( expr )
b77a7acd 5706 | [ expr ]
64a0c779
DN
5707 | BYTE
5708 | WORD
5709 | DWORD
9306ca4a 5710 | FWORD
64a0c779 5711 | QWORD
9306ca4a
JB
5712 | TBYTE
5713 | OWORD
5714 | XMMWORD
64a0c779
DN
5715 | .
5716 | $
5717 | register
5718 | id
5719 | constant */
5720
5721/* Parsing structure for the intel syntax parser. Used to implement the
5722 semantic actions for the operand grammar. */
5723struct intel_parser_s
5724 {
5725 char *op_string; /* The string being parsed. */
5726 int got_a_float; /* Whether the operand is a float. */
4a1805b1 5727 int op_modifier; /* Operand modifier. */
64a0c779 5728 int is_mem; /* 1 if operand is memory reference. */
a724f0f4
JB
5729 int in_offset; /* >=1 if parsing operand of offset. */
5730 int in_bracket; /* >=1 if parsing operand in brackets. */
64a0c779
DN
5731 const reg_entry *reg; /* Last register reference found. */
5732 char *disp; /* Displacement string being built. */
a724f0f4 5733 char *next_operand; /* Resume point when splitting operands. */
64a0c779
DN
5734 };
5735
5736static struct intel_parser_s intel_parser;
5737
5738/* Token structure for parsing intel syntax. */
5739struct intel_token
5740 {
5741 int code; /* Token code. */
5742 const reg_entry *reg; /* Register entry for register tokens. */
5743 char *str; /* String representation. */
5744 };
5745
5746static struct intel_token cur_token, prev_token;
5747
50705ef4
AM
5748/* Token codes for the intel parser. Since T_SHORT is already used
5749 by COFF, undefine it first to prevent a warning. */
64a0c779
DN
5750#define T_NIL -1
5751#define T_CONST 1
5752#define T_REG 2
5753#define T_BYTE 3
5754#define T_WORD 4
9306ca4a
JB
5755#define T_DWORD 5
5756#define T_FWORD 6
5757#define T_QWORD 7
5758#define T_TBYTE 8
5759#define T_XMMWORD 9
50705ef4 5760#undef T_SHORT
9306ca4a
JB
5761#define T_SHORT 10
5762#define T_OFFSET 11
5763#define T_PTR 12
5764#define T_ID 13
5765#define T_SHL 14
5766#define T_SHR 15
64a0c779
DN
5767
5768/* Prototypes for intel parser functions. */
5769static int intel_match_token PARAMS ((int code));
cce0cbdc
DN
5770static void intel_get_token PARAMS ((void));
5771static void intel_putback_token PARAMS ((void));
5772static int intel_expr PARAMS ((void));
9306ca4a 5773static int intel_e04 PARAMS ((void));
cce0cbdc 5774static int intel_e05 PARAMS ((void));
cce0cbdc 5775static int intel_e06 PARAMS ((void));
cce0cbdc 5776static int intel_e09 PARAMS ((void));
a724f0f4 5777static int intel_bracket_expr PARAMS ((void));
cce0cbdc 5778static int intel_e10 PARAMS ((void));
cce0cbdc 5779static int intel_e11 PARAMS ((void));
64a0c779 5780
64a0c779
DN
5781static int
5782i386_intel_operand (operand_string, got_a_float)
5783 char *operand_string;
5784 int got_a_float;
5785{
5786 int ret;
5787 char *p;
5788
a724f0f4
JB
5789 p = intel_parser.op_string = xstrdup (operand_string);
5790 intel_parser.disp = (char *) xmalloc (strlen (operand_string) + 1);
5791
5792 for (;;)
64a0c779 5793 {
a724f0f4
JB
5794 /* Initialize token holders. */
5795 cur_token.code = prev_token.code = T_NIL;
5796 cur_token.reg = prev_token.reg = NULL;
5797 cur_token.str = prev_token.str = NULL;
5798
5799 /* Initialize parser structure. */
5800 intel_parser.got_a_float = got_a_float;
5801 intel_parser.op_modifier = 0;
5802 intel_parser.is_mem = 0;
5803 intel_parser.in_offset = 0;
5804 intel_parser.in_bracket = 0;
5805 intel_parser.reg = NULL;
5806 intel_parser.disp[0] = '\0';
5807 intel_parser.next_operand = NULL;
5808
5809 /* Read the first token and start the parser. */
5810 intel_get_token ();
5811 ret = intel_expr ();
5812
5813 if (!ret)
5814 break;
5815
9306ca4a
JB
5816 if (cur_token.code != T_NIL)
5817 {
5818 as_bad (_("invalid operand for '%s' ('%s' unexpected)"),
5819 current_templates->start->name, cur_token.str);
5820 ret = 0;
5821 }
64a0c779
DN
5822 /* If we found a memory reference, hand it over to i386_displacement
5823 to fill in the rest of the operand fields. */
9306ca4a 5824 else if (intel_parser.is_mem)
64a0c779
DN
5825 {
5826 if ((i.mem_operands == 1
5827 && (current_templates->start->opcode_modifier & IsString) == 0)
5828 || i.mem_operands == 2)
5829 {
5830 as_bad (_("too many memory references for '%s'"),
5831 current_templates->start->name);
5832 ret = 0;
5833 }
5834 else
5835 {
5836 char *s = intel_parser.disp;
5837 i.mem_operands++;
5838
a724f0f4
JB
5839 if (!quiet_warnings && intel_parser.is_mem < 0)
5840 /* See the comments in intel_bracket_expr. */
5841 as_warn (_("Treating `%s' as memory reference"), operand_string);
5842
64a0c779
DN
5843 /* Add the displacement expression. */
5844 if (*s != '\0')
a4622f40
AM
5845 ret = i386_displacement (s, s + strlen (s));
5846 if (ret)
a724f0f4
JB
5847 {
5848 /* Swap base and index in 16-bit memory operands like
5849 [si+bx]. Since i386_index_check is also used in AT&T
5850 mode we have to do that here. */
5851 if (i.base_reg
5852 && i.index_reg
5853 && (i.base_reg->reg_type & Reg16)
5854 && (i.index_reg->reg_type & Reg16)
5855 && i.base_reg->reg_num >= 6
5856 && i.index_reg->reg_num < 6)
5857 {
5858 const reg_entry *base = i.index_reg;
5859
5860 i.index_reg = i.base_reg;
5861 i.base_reg = base;
5862 }
5863 ret = i386_index_check (operand_string);
5864 }
64a0c779
DN
5865 }
5866 }
5867
5868 /* Constant and OFFSET expressions are handled by i386_immediate. */
a724f0f4 5869 else if ((intel_parser.op_modifier & (1 << T_OFFSET))
64a0c779
DN
5870 || intel_parser.reg == NULL)
5871 ret = i386_immediate (intel_parser.disp);
a724f0f4
JB
5872
5873 if (intel_parser.next_operand && this_operand >= MAX_OPERANDS - 1)
5874 ret = 0;
5875 if (!ret || !intel_parser.next_operand)
5876 break;
5877 intel_parser.op_string = intel_parser.next_operand;
5878 this_operand = i.operands++;
64a0c779
DN
5879 }
5880
5881 free (p);
5882 free (intel_parser.disp);
5883
5884 return ret;
5885}
5886
a724f0f4
JB
5887#define NUM_ADDRESS_REGS (!!i.base_reg + !!i.index_reg)
5888
5889/* expr e04 expr'
5890
5891 expr' cmpOp e04 expr'
5892 | Empty */
64a0c779
DN
5893static int
5894intel_expr ()
5895{
a724f0f4
JB
5896 /* XXX Implement the comparison operators. */
5897 return intel_e04 ();
9306ca4a
JB
5898}
5899
a724f0f4 5900/* e04 e05 e04'
9306ca4a 5901
a724f0f4 5902 e04' addOp e05 e04'
9306ca4a
JB
5903 | Empty */
5904static int
5905intel_e04 ()
5906{
a724f0f4 5907 int nregs = -1;
9306ca4a 5908
a724f0f4 5909 for (;;)
9306ca4a 5910 {
a724f0f4
JB
5911 if (!intel_e05())
5912 return 0;
9306ca4a 5913
a724f0f4
JB
5914 if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
5915 i.base_reg = i386_regtab + REGNAM_AL; /* al is invalid as base */
9306ca4a 5916
a724f0f4
JB
5917 if (cur_token.code == '+')
5918 nregs = -1;
5919 else if (cur_token.code == '-')
5920 nregs = NUM_ADDRESS_REGS;
5921 else
5922 return 1;
64a0c779 5923
a724f0f4
JB
5924 strcat (intel_parser.disp, cur_token.str);
5925 intel_match_token (cur_token.code);
5926 }
64a0c779
DN
5927}
5928
64a0c779
DN
5929/* e05 e06 e05'
5930
9306ca4a 5931 e05' binOp e06 e05'
64a0c779
DN
5932 | Empty */
5933static int
5934intel_e05 ()
5935{
a724f0f4 5936 int nregs = ~NUM_ADDRESS_REGS;
64a0c779 5937
a724f0f4 5938 for (;;)
64a0c779 5939 {
a724f0f4
JB
5940 if (!intel_e06())
5941 return 0;
5942
5943 if (cur_token.code == '&' || cur_token.code == '|' || cur_token.code == '^')
5944 {
5945 char str[2];
5946
5947 str[0] = cur_token.code;
5948 str[1] = 0;
5949 strcat (intel_parser.disp, str);
5950 }
5951 else
5952 break;
9306ca4a 5953
64a0c779
DN
5954 intel_match_token (cur_token.code);
5955
a724f0f4
JB
5956 if (nregs < 0)
5957 nregs = ~nregs;
64a0c779 5958 }
a724f0f4
JB
5959 if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
5960 i.base_reg = i386_regtab + REGNAM_AL + 1; /* cl is invalid as base */
5961 return 1;
4a1805b1 5962}
64a0c779
DN
5963
5964/* e06 e09 e06'
5965
5966 e06' mulOp e09 e06'
b77a7acd 5967 | Empty */
64a0c779
DN
5968static int
5969intel_e06 ()
5970{
a724f0f4 5971 int nregs = ~NUM_ADDRESS_REGS;
64a0c779 5972
a724f0f4 5973 for (;;)
64a0c779 5974 {
a724f0f4
JB
5975 if (!intel_e09())
5976 return 0;
9306ca4a 5977
a724f0f4
JB
5978 if (cur_token.code == '*' || cur_token.code == '/' || cur_token.code == '%')
5979 {
5980 char str[2];
9306ca4a 5981
a724f0f4
JB
5982 str[0] = cur_token.code;
5983 str[1] = 0;
5984 strcat (intel_parser.disp, str);
5985 }
5986 else if (cur_token.code == T_SHL)
5987 strcat (intel_parser.disp, "<<");
5988 else if (cur_token.code == T_SHR)
5989 strcat (intel_parser.disp, ">>");
5990 else
5991 break;
9306ca4a 5992
a724f0f4 5993 intel_match_token (cur_token.code);
64a0c779 5994
a724f0f4
JB
5995 if (nregs < 0)
5996 nregs = ~nregs;
64a0c779 5997 }
a724f0f4
JB
5998 if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
5999 i.base_reg = i386_regtab + REGNAM_AL + 2; /* dl is invalid as base */
6000 return 1;
64a0c779
DN
6001}
6002
a724f0f4
JB
6003/* e09 OFFSET e09
6004 | SHORT e09
6005 | + e09
6006 | - e09
6007 | ~ e09
6008 | NOT e09
9306ca4a
JB
6009 | e10 e09'
6010
64a0c779 6011 e09' PTR e10 e09'
b77a7acd 6012 | : e10 e09'
64a0c779
DN
6013 | Empty */
6014static int
6015intel_e09 ()
6016{
a724f0f4
JB
6017 int nregs = ~NUM_ADDRESS_REGS;
6018 int in_offset = 0;
6019
6020 for (;;)
64a0c779 6021 {
a724f0f4
JB
6022 /* Don't consume constants here. */
6023 if (cur_token.code == '+' || cur_token.code == '-')
6024 {
6025 /* Need to look one token ahead - if the next token
6026 is a constant, the current token is its sign. */
6027 int next_code;
6028
6029 intel_match_token (cur_token.code);
6030 next_code = cur_token.code;
6031 intel_putback_token ();
6032 if (next_code == T_CONST)
6033 break;
6034 }
6035
6036 /* e09 OFFSET e09 */
6037 if (cur_token.code == T_OFFSET)
6038 {
6039 if (!in_offset++)
6040 ++intel_parser.in_offset;
6041 }
6042
6043 /* e09 SHORT e09 */
6044 else if (cur_token.code == T_SHORT)
6045 intel_parser.op_modifier |= 1 << T_SHORT;
6046
6047 /* e09 + e09 */
6048 else if (cur_token.code == '+')
6049 strcat (intel_parser.disp, "+");
6050
6051 /* e09 - e09
6052 | ~ e09
6053 | NOT e09 */
6054 else if (cur_token.code == '-' || cur_token.code == '~')
6055 {
6056 char str[2];
64a0c779 6057
a724f0f4
JB
6058 if (nregs < 0)
6059 nregs = ~nregs;
6060 str[0] = cur_token.code;
6061 str[1] = 0;
6062 strcat (intel_parser.disp, str);
6063 }
6064
6065 /* e09 e10 e09' */
6066 else
6067 break;
6068
6069 intel_match_token (cur_token.code);
64a0c779
DN
6070 }
6071
a724f0f4 6072 for (;;)
9306ca4a 6073 {
a724f0f4
JB
6074 if (!intel_e10 ())
6075 return 0;
9306ca4a 6076
a724f0f4
JB
6077 /* e09' PTR e10 e09' */
6078 if (cur_token.code == T_PTR)
6079 {
6080 char suffix;
9306ca4a 6081
a724f0f4
JB
6082 if (prev_token.code == T_BYTE)
6083 suffix = BYTE_MNEM_SUFFIX;
9306ca4a 6084
a724f0f4
JB
6085 else if (prev_token.code == T_WORD)
6086 {
6087 if (current_templates->start->name[0] == 'l'
6088 && current_templates->start->name[2] == 's'
6089 && current_templates->start->name[3] == 0)
6090 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
6091 else if (intel_parser.got_a_float == 2) /* "fi..." */
6092 suffix = SHORT_MNEM_SUFFIX;
6093 else
6094 suffix = WORD_MNEM_SUFFIX;
6095 }
64a0c779 6096
a724f0f4
JB
6097 else if (prev_token.code == T_DWORD)
6098 {
6099 if (current_templates->start->name[0] == 'l'
6100 && current_templates->start->name[2] == 's'
6101 && current_templates->start->name[3] == 0)
6102 suffix = WORD_MNEM_SUFFIX;
6103 else if (flag_code == CODE_16BIT
6104 && (current_templates->start->opcode_modifier
6105 & (Jump|JumpDword|JumpInterSegment)))
6106 suffix = LONG_DOUBLE_MNEM_SUFFIX;
6107 else if (intel_parser.got_a_float == 1) /* "f..." */
6108 suffix = SHORT_MNEM_SUFFIX;
6109 else
6110 suffix = LONG_MNEM_SUFFIX;
6111 }
9306ca4a 6112
a724f0f4
JB
6113 else if (prev_token.code == T_FWORD)
6114 {
6115 if (current_templates->start->name[0] == 'l'
6116 && current_templates->start->name[2] == 's'
6117 && current_templates->start->name[3] == 0)
6118 suffix = LONG_MNEM_SUFFIX;
6119 else if (!intel_parser.got_a_float)
6120 {
6121 if (flag_code == CODE_16BIT)
6122 add_prefix (DATA_PREFIX_OPCODE);
6123 suffix = LONG_DOUBLE_MNEM_SUFFIX;
6124 }
6125 else
6126 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
6127 }
64a0c779 6128
a724f0f4
JB
6129 else if (prev_token.code == T_QWORD)
6130 {
6131 if (intel_parser.got_a_float == 1) /* "f..." */
6132 suffix = LONG_MNEM_SUFFIX;
6133 else
6134 suffix = QWORD_MNEM_SUFFIX;
6135 }
64a0c779 6136
a724f0f4
JB
6137 else if (prev_token.code == T_TBYTE)
6138 {
6139 if (intel_parser.got_a_float == 1)
6140 suffix = LONG_DOUBLE_MNEM_SUFFIX;
6141 else
6142 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
6143 }
9306ca4a 6144
a724f0f4 6145 else if (prev_token.code == T_XMMWORD)
9306ca4a 6146 {
a724f0f4
JB
6147 /* XXX ignored for now, but accepted since gcc uses it */
6148 suffix = 0;
9306ca4a 6149 }
64a0c779 6150
f16b83df 6151 else
a724f0f4
JB
6152 {
6153 as_bad (_("Unknown operand modifier `%s'"), prev_token.str);
6154 return 0;
6155 }
6156
6157 if (current_templates->start->base_opcode == 0x8d /* lea */)
6158 ;
6159 else if (!i.suffix)
6160 i.suffix = suffix;
6161 else if (i.suffix != suffix)
6162 {
6163 as_bad (_("Conflicting operand modifiers"));
6164 return 0;
6165 }
64a0c779 6166
9306ca4a
JB
6167 }
6168
a724f0f4
JB
6169 /* e09' : e10 e09' */
6170 else if (cur_token.code == ':')
9306ca4a 6171 {
a724f0f4
JB
6172 if (prev_token.code != T_REG)
6173 {
6174 /* While {call,jmp} SSSS:OOOO is MASM syntax only when SSSS is a
6175 segment/group identifier (which we don't have), using comma
6176 as the operand separator there is even less consistent, since
6177 there all branches only have a single operand. */
6178 if (this_operand != 0
6179 || intel_parser.in_offset
6180 || intel_parser.in_bracket
6181 || (!(current_templates->start->opcode_modifier
6182 & (Jump|JumpDword|JumpInterSegment))
6183 && !(current_templates->start->operand_types[0]
6184 & JumpAbsolute)))
6185 return intel_match_token (T_NIL);
6186 /* Remember the start of the 2nd operand and terminate 1st
6187 operand here.
6188 XXX This isn't right, yet (when SSSS:OOOO is right operand of
6189 another expression), but it gets at least the simplest case
6190 (a plain number or symbol on the left side) right. */
6191 intel_parser.next_operand = intel_parser.op_string;
6192 *--intel_parser.op_string = '\0';
6193 return intel_match_token (':');
6194 }
9306ca4a 6195 }
64a0c779 6196
a724f0f4 6197 /* e09' Empty */
64a0c779 6198 else
a724f0f4 6199 break;
64a0c779 6200
a724f0f4
JB
6201 intel_match_token (cur_token.code);
6202
6203 }
6204
6205 if (in_offset)
6206 {
6207 --intel_parser.in_offset;
6208 if (nregs < 0)
6209 nregs = ~nregs;
6210 if (NUM_ADDRESS_REGS > nregs)
9306ca4a 6211 {
a724f0f4 6212 as_bad (_("Invalid operand to `OFFSET'"));
9306ca4a
JB
6213 return 0;
6214 }
a724f0f4
JB
6215 intel_parser.op_modifier |= 1 << T_OFFSET;
6216 }
9306ca4a 6217
a724f0f4
JB
6218 if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
6219 i.base_reg = i386_regtab + REGNAM_AL + 3; /* bl is invalid as base */
6220 return 1;
6221}
64a0c779 6222
a724f0f4
JB
6223static int
6224intel_bracket_expr ()
6225{
6226 int was_offset = intel_parser.op_modifier & (1 << T_OFFSET);
6227 const char *start = intel_parser.op_string;
6228 int len;
6229
6230 if (i.op[this_operand].regs)
6231 return intel_match_token (T_NIL);
6232
6233 intel_match_token ('[');
6234
6235 /* Mark as a memory operand only if it's not already known to be an
6236 offset expression. If it's an offset expression, we need to keep
6237 the brace in. */
6238 if (!intel_parser.in_offset)
6239 {
6240 ++intel_parser.in_bracket;
6241 /* Unfortunately gas always diverged from MASM in a respect that can't
6242 be easily fixed without risking to break code sequences likely to be
6243 encountered (the testsuite even check for this): MASM doesn't consider
6244 an expression inside brackets unconditionally as a memory reference.
6245 When that is e.g. a constant, an offset expression, or the sum of the
6246 two, this is still taken as a constant load. gas, however, always
6247 treated these as memory references. As a compromise, we'll try to make
6248 offset expressions inside brackets work the MASM way (since that's
6249 less likely to be found in real world code), but make constants alone
6250 continue to work the traditional gas way. In either case, issue a
6251 warning. */
6252 intel_parser.op_modifier &= ~was_offset;
64a0c779 6253 }
a724f0f4
JB
6254 else
6255 strcat (intel_parser.disp, "[");
6256
6257 /* Add a '+' to the displacement string if necessary. */
6258 if (*intel_parser.disp != '\0'
6259 && *(intel_parser.disp + strlen (intel_parser.disp) - 1) != '+')
6260 strcat (intel_parser.disp, "+");
64a0c779 6261
a724f0f4
JB
6262 if (intel_expr ()
6263 && (len = intel_parser.op_string - start - 1,
6264 intel_match_token (']')))
64a0c779 6265 {
a724f0f4
JB
6266 /* Preserve brackets when the operand is an offset expression. */
6267 if (intel_parser.in_offset)
6268 strcat (intel_parser.disp, "]");
6269 else
6270 {
6271 --intel_parser.in_bracket;
6272 if (i.base_reg || i.index_reg)
6273 intel_parser.is_mem = 1;
6274 if (!intel_parser.is_mem)
6275 {
6276 if (!(intel_parser.op_modifier & (1 << T_OFFSET)))
6277 /* Defer the warning until all of the operand was parsed. */
6278 intel_parser.is_mem = -1;
6279 else if (!quiet_warnings)
6280 as_warn (_("`[%.*s]' taken to mean just `%.*s'"), len, start, len, start);
6281 }
6282 }
6283 intel_parser.op_modifier |= was_offset;
64a0c779 6284
a724f0f4 6285 return 1;
64a0c779 6286 }
a724f0f4 6287 return 0;
64a0c779
DN
6288}
6289
6290/* e10 e11 e10'
6291
6292 e10' [ expr ] e10'
b77a7acd 6293 | Empty */
64a0c779
DN
6294static int
6295intel_e10 ()
6296{
a724f0f4
JB
6297 if (!intel_e11 ())
6298 return 0;
64a0c779 6299
a724f0f4 6300 while (cur_token.code == '[')
64a0c779 6301 {
a724f0f4 6302 if (!intel_bracket_expr ())
21d6c4af 6303 return 0;
64a0c779
DN
6304 }
6305
a724f0f4 6306 return 1;
64a0c779
DN
6307}
6308
64a0c779 6309/* e11 ( expr )
b77a7acd 6310 | [ expr ]
64a0c779
DN
6311 | BYTE
6312 | WORD
6313 | DWORD
9306ca4a 6314 | FWORD
64a0c779 6315 | QWORD
9306ca4a
JB
6316 | TBYTE
6317 | OWORD
6318 | XMMWORD
4a1805b1 6319 | $
64a0c779
DN
6320 | .
6321 | register
6322 | id
6323 | constant */
6324static int
6325intel_e11 ()
6326{
a724f0f4 6327 switch (cur_token.code)
64a0c779 6328 {
a724f0f4
JB
6329 /* e11 ( expr ) */
6330 case '(':
64a0c779
DN
6331 intel_match_token ('(');
6332 strcat (intel_parser.disp, "(");
6333
6334 if (intel_expr () && intel_match_token (')'))
e5cb08ac
KH
6335 {
6336 strcat (intel_parser.disp, ")");
6337 return 1;
6338 }
a724f0f4 6339 return 0;
4a1805b1 6340
a724f0f4
JB
6341 /* e11 [ expr ] */
6342 case '[':
6343 /* Operands for jump/call inside brackets denote absolute addresses.
6344 XXX This shouldn't be needed anymore (or if it should rather live
6345 in intel_bracket_expr). */
9306ca4a
JB
6346 if (current_templates->start->opcode_modifier
6347 & (Jump|JumpDword|JumpByte|JumpInterSegment))
64a0c779
DN
6348 i.types[this_operand] |= JumpAbsolute;
6349
a724f0f4 6350 return intel_bracket_expr ();
64a0c779 6351
a724f0f4
JB
6352 /* e11 $
6353 | . */
6354 case '.':
64a0c779
DN
6355 strcat (intel_parser.disp, cur_token.str);
6356 intel_match_token (cur_token.code);
21d6c4af
DN
6357
6358 /* Mark as a memory operand only if it's not already known to be an
6359 offset expression. */
a724f0f4 6360 if (!intel_parser.in_offset)
21d6c4af 6361 intel_parser.is_mem = 1;
64a0c779
DN
6362
6363 return 1;
64a0c779 6364
a724f0f4
JB
6365 /* e11 register */
6366 case T_REG:
6367 {
6368 const reg_entry *reg = intel_parser.reg = cur_token.reg;
64a0c779 6369
a724f0f4 6370 intel_match_token (T_REG);
64a0c779 6371
a724f0f4
JB
6372 /* Check for segment change. */
6373 if (cur_token.code == ':')
6374 {
6375 if (!(reg->reg_type & (SReg2 | SReg3)))
6376 {
6377 as_bad (_("`%s' is not a valid segment register"), reg->reg_name);
6378 return 0;
6379 }
6380 else if (i.seg[i.mem_operands])
6381 as_warn (_("Extra segment override ignored"));
6382 else
6383 {
6384 if (!intel_parser.in_offset)
6385 intel_parser.is_mem = 1;
6386 switch (reg->reg_num)
6387 {
6388 case 0:
6389 i.seg[i.mem_operands] = &es;
6390 break;
6391 case 1:
6392 i.seg[i.mem_operands] = &cs;
6393 break;
6394 case 2:
6395 i.seg[i.mem_operands] = &ss;
6396 break;
6397 case 3:
6398 i.seg[i.mem_operands] = &ds;
6399 break;
6400 case 4:
6401 i.seg[i.mem_operands] = &fs;
6402 break;
6403 case 5:
6404 i.seg[i.mem_operands] = &gs;
6405 break;
6406 }
6407 }
6408 }
64a0c779 6409
a724f0f4
JB
6410 /* Not a segment register. Check for register scaling. */
6411 else if (cur_token.code == '*')
6412 {
6413 if (!intel_parser.in_bracket)
6414 {
6415 as_bad (_("Register scaling only allowed in memory operands"));
6416 return 0;
6417 }
64a0c779 6418
a724f0f4
JB
6419 if (reg->reg_type & Reg16) /* Disallow things like [si*1]. */
6420 reg = i386_regtab + REGNAM_AX + 4; /* sp is invalid as index */
6421 else if (i.index_reg)
6422 reg = i386_regtab + REGNAM_EAX + 4; /* esp is invalid as index */
64a0c779 6423
a724f0f4
JB
6424 /* What follows must be a valid scale. */
6425 intel_match_token ('*');
6426 i.index_reg = reg;
6427 i.types[this_operand] |= BaseIndex;
64a0c779 6428
a724f0f4
JB
6429 /* Set the scale after setting the register (otherwise,
6430 i386_scale will complain) */
6431 if (cur_token.code == '+' || cur_token.code == '-')
6432 {
6433 char *str, sign = cur_token.code;
6434 intel_match_token (cur_token.code);
6435 if (cur_token.code != T_CONST)
6436 {
6437 as_bad (_("Syntax error: Expecting a constant, got `%s'"),
6438 cur_token.str);
6439 return 0;
6440 }
6441 str = (char *) xmalloc (strlen (cur_token.str) + 2);
6442 strcpy (str + 1, cur_token.str);
6443 *str = sign;
6444 if (!i386_scale (str))
6445 return 0;
6446 free (str);
6447 }
6448 else if (!i386_scale (cur_token.str))
64a0c779 6449 return 0;
a724f0f4
JB
6450 intel_match_token (cur_token.code);
6451 }
64a0c779 6452
a724f0f4
JB
6453 /* No scaling. If this is a memory operand, the register is either a
6454 base register (first occurrence) or an index register (second
6455 occurrence). */
6456 else if (intel_parser.in_bracket && !(reg->reg_type & (SReg2 | SReg3)))
6457 {
64a0c779 6458
a724f0f4
JB
6459 if (!i.base_reg)
6460 i.base_reg = reg;
6461 else if (!i.index_reg)
6462 i.index_reg = reg;
6463 else
6464 {
6465 as_bad (_("Too many register references in memory operand"));
6466 return 0;
6467 }
64a0c779 6468
a724f0f4
JB
6469 i.types[this_operand] |= BaseIndex;
6470 }
4a1805b1 6471
a724f0f4
JB
6472 /* Offset modifier. Add the register to the displacement string to be
6473 parsed as an immediate expression after we're done. */
6474 else if (intel_parser.in_offset)
6475 {
6476 as_warn (_("Using register names in OFFSET expressions is deprecated"));
6477 strcat (intel_parser.disp, reg->reg_name);
6478 }
64a0c779 6479
a724f0f4
JB
6480 /* It's neither base nor index nor offset. */
6481 else if (!intel_parser.is_mem)
6482 {
6483 i.types[this_operand] |= reg->reg_type & ~BaseIndex;
6484 i.op[this_operand].regs = reg;
6485 i.reg_operands++;
6486 }
6487 else
6488 {
6489 as_bad (_("Invalid use of register"));
6490 return 0;
6491 }
64a0c779 6492
a724f0f4
JB
6493 /* Since registers are not part of the displacement string (except
6494 when we're parsing offset operands), we may need to remove any
6495 preceding '+' from the displacement string. */
6496 if (*intel_parser.disp != '\0'
6497 && !intel_parser.in_offset)
6498 {
6499 char *s = intel_parser.disp;
6500 s += strlen (s) - 1;
6501 if (*s == '+')
6502 *s = '\0';
6503 }
4a1805b1 6504
a724f0f4
JB
6505 return 1;
6506 }
6507
6508 /* e11 BYTE
6509 | WORD
6510 | DWORD
6511 | FWORD
6512 | QWORD
6513 | TBYTE
6514 | OWORD
6515 | XMMWORD */
6516 case T_BYTE:
6517 case T_WORD:
6518 case T_DWORD:
6519 case T_FWORD:
6520 case T_QWORD:
6521 case T_TBYTE:
6522 case T_XMMWORD:
6523 intel_match_token (cur_token.code);
64a0c779 6524
a724f0f4
JB
6525 if (cur_token.code == T_PTR)
6526 return 1;
6527
6528 /* It must have been an identifier. */
6529 intel_putback_token ();
6530 cur_token.code = T_ID;
6531 /* FALLTHRU */
6532
6533 /* e11 id
6534 | constant */
6535 case T_ID:
6536 if (!intel_parser.in_offset && intel_parser.is_mem <= 0)
9306ca4a
JB
6537 {
6538 symbolS *symbolP;
6539
a724f0f4
JB
6540 /* The identifier represents a memory reference only if it's not
6541 preceded by an offset modifier and if it's not an equate. */
9306ca4a
JB
6542 symbolP = symbol_find(cur_token.str);
6543 if (!symbolP || S_GET_SEGMENT(symbolP) != absolute_section)
6544 intel_parser.is_mem = 1;
6545 }
a724f0f4 6546 /* FALLTHRU */
64a0c779 6547
a724f0f4
JB
6548 case T_CONST:
6549 case '-':
6550 case '+':
6551 {
6552 char *save_str, sign = 0;
64a0c779 6553
a724f0f4
JB
6554 /* Allow constants that start with `+' or `-'. */
6555 if (cur_token.code == '-' || cur_token.code == '+')
6556 {
6557 sign = cur_token.code;
6558 intel_match_token (cur_token.code);
6559 if (cur_token.code != T_CONST)
6560 {
6561 as_bad (_("Syntax error: Expecting a constant, got `%s'"),
6562 cur_token.str);
6563 return 0;
6564 }
6565 }
64a0c779 6566
a724f0f4
JB
6567 save_str = (char *) xmalloc (strlen (cur_token.str) + 2);
6568 strcpy (save_str + !!sign, cur_token.str);
6569 if (sign)
6570 *save_str = sign;
64a0c779 6571
a724f0f4
JB
6572 /* Get the next token to check for register scaling. */
6573 intel_match_token (cur_token.code);
64a0c779 6574
a724f0f4
JB
6575 /* Check if this constant is a scaling factor for an index register. */
6576 if (cur_token.code == '*')
6577 {
6578 if (intel_match_token ('*') && cur_token.code == T_REG)
6579 {
6580 const reg_entry *reg = cur_token.reg;
6581
6582 if (!intel_parser.in_bracket)
6583 {
6584 as_bad (_("Register scaling only allowed in memory operands"));
6585 return 0;
6586 }
6587
6588 if (reg->reg_type & Reg16) /* Disallow things like [1*si]. */
6589 reg = i386_regtab + REGNAM_AX + 4; /* sp is invalid as index */
6590 else if (i.index_reg)
6591 reg = i386_regtab + REGNAM_EAX + 4; /* esp is invalid as index */
6592
6593 /* The constant is followed by `* reg', so it must be
6594 a valid scale. */
6595 i.index_reg = reg;
6596 i.types[this_operand] |= BaseIndex;
6597
6598 /* Set the scale after setting the register (otherwise,
6599 i386_scale will complain) */
6600 if (!i386_scale (save_str))
64a0c779 6601 return 0;
a724f0f4
JB
6602 intel_match_token (T_REG);
6603
6604 /* Since registers are not part of the displacement
6605 string, we may need to remove any preceding '+' from
6606 the displacement string. */
6607 if (*intel_parser.disp != '\0')
6608 {
6609 char *s = intel_parser.disp;
6610 s += strlen (s) - 1;
6611 if (*s == '+')
6612 *s = '\0';
6613 }
6614
6615 free (save_str);
6616
6617 return 1;
6618 }
64a0c779 6619
a724f0f4
JB
6620 /* The constant was not used for register scaling. Since we have
6621 already consumed the token following `*' we now need to put it
6622 back in the stream. */
64a0c779 6623 intel_putback_token ();
a724f0f4 6624 }
64a0c779 6625
a724f0f4
JB
6626 /* Add the constant to the displacement string. */
6627 strcat (intel_parser.disp, save_str);
6628 free (save_str);
64a0c779 6629
a724f0f4
JB
6630 return 1;
6631 }
64a0c779
DN
6632 }
6633
64a0c779
DN
6634 as_bad (_("Unrecognized token '%s'"), cur_token.str);
6635 return 0;
6636}
6637
64a0c779
DN
6638/* Match the given token against cur_token. If they match, read the next
6639 token from the operand string. */
6640static int
6641intel_match_token (code)
e5cb08ac 6642 int code;
64a0c779
DN
6643{
6644 if (cur_token.code == code)
6645 {
6646 intel_get_token ();
6647 return 1;
6648 }
6649 else
6650 {
0477af35 6651 as_bad (_("Unexpected token `%s'"), cur_token.str);
64a0c779
DN
6652 return 0;
6653 }
6654}
6655
64a0c779
DN
6656/* Read a new token from intel_parser.op_string and store it in cur_token. */
6657static void
6658intel_get_token ()
6659{
6660 char *end_op;
6661 const reg_entry *reg;
6662 struct intel_token new_token;
6663
6664 new_token.code = T_NIL;
6665 new_token.reg = NULL;
6666 new_token.str = NULL;
6667
4a1805b1 6668 /* Free the memory allocated to the previous token and move
64a0c779
DN
6669 cur_token to prev_token. */
6670 if (prev_token.str)
6671 free (prev_token.str);
6672
6673 prev_token = cur_token;
6674
6675 /* Skip whitespace. */
6676 while (is_space_char (*intel_parser.op_string))
6677 intel_parser.op_string++;
6678
6679 /* Return an empty token if we find nothing else on the line. */
6680 if (*intel_parser.op_string == '\0')
6681 {
6682 cur_token = new_token;
6683 return;
6684 }
6685
6686 /* The new token cannot be larger than the remainder of the operand
6687 string. */
a724f0f4 6688 new_token.str = (char *) xmalloc (strlen (intel_parser.op_string) + 1);
64a0c779
DN
6689 new_token.str[0] = '\0';
6690
6691 if (strchr ("0123456789", *intel_parser.op_string))
6692 {
6693 char *p = new_token.str;
6694 char *q = intel_parser.op_string;
6695 new_token.code = T_CONST;
6696
6697 /* Allow any kind of identifier char to encompass floating point and
6698 hexadecimal numbers. */
6699 while (is_identifier_char (*q))
6700 *p++ = *q++;
6701 *p = '\0';
6702
6703 /* Recognize special symbol names [0-9][bf]. */
6704 if (strlen (intel_parser.op_string) == 2
4a1805b1 6705 && (intel_parser.op_string[1] == 'b'
64a0c779
DN
6706 || intel_parser.op_string[1] == 'f'))
6707 new_token.code = T_ID;
6708 }
6709
64a0c779
DN
6710 else if ((*intel_parser.op_string == REGISTER_PREFIX || allow_naked_reg)
6711 && ((reg = parse_register (intel_parser.op_string, &end_op)) != NULL))
6712 {
6713 new_token.code = T_REG;
6714 new_token.reg = reg;
6715
6716 if (*intel_parser.op_string == REGISTER_PREFIX)
6717 {
6718 new_token.str[0] = REGISTER_PREFIX;
6719 new_token.str[1] = '\0';
6720 }
6721
6722 strcat (new_token.str, reg->reg_name);
6723 }
6724
6725 else if (is_identifier_char (*intel_parser.op_string))
6726 {
6727 char *p = new_token.str;
6728 char *q = intel_parser.op_string;
6729
6730 /* A '.' or '$' followed by an identifier char is an identifier.
6731 Otherwise, it's operator '.' followed by an expression. */
6732 if ((*q == '.' || *q == '$') && !is_identifier_char (*(q + 1)))
6733 {
9306ca4a
JB
6734 new_token.code = '.';
6735 new_token.str[0] = '.';
64a0c779
DN
6736 new_token.str[1] = '\0';
6737 }
6738 else
6739 {
6740 while (is_identifier_char (*q) || *q == '@')
6741 *p++ = *q++;
6742 *p = '\0';
6743
9306ca4a
JB
6744 if (strcasecmp (new_token.str, "NOT") == 0)
6745 new_token.code = '~';
6746
6747 else if (strcasecmp (new_token.str, "MOD") == 0)
6748 new_token.code = '%';
6749
6750 else if (strcasecmp (new_token.str, "AND") == 0)
6751 new_token.code = '&';
6752
6753 else if (strcasecmp (new_token.str, "OR") == 0)
6754 new_token.code = '|';
6755
6756 else if (strcasecmp (new_token.str, "XOR") == 0)
6757 new_token.code = '^';
6758
6759 else if (strcasecmp (new_token.str, "SHL") == 0)
6760 new_token.code = T_SHL;
6761
6762 else if (strcasecmp (new_token.str, "SHR") == 0)
6763 new_token.code = T_SHR;
6764
6765 else if (strcasecmp (new_token.str, "BYTE") == 0)
64a0c779
DN
6766 new_token.code = T_BYTE;
6767
6768 else if (strcasecmp (new_token.str, "WORD") == 0)
6769 new_token.code = T_WORD;
6770
6771 else if (strcasecmp (new_token.str, "DWORD") == 0)
6772 new_token.code = T_DWORD;
6773
9306ca4a
JB
6774 else if (strcasecmp (new_token.str, "FWORD") == 0)
6775 new_token.code = T_FWORD;
6776
64a0c779
DN
6777 else if (strcasecmp (new_token.str, "QWORD") == 0)
6778 new_token.code = T_QWORD;
6779
9306ca4a
JB
6780 else if (strcasecmp (new_token.str, "TBYTE") == 0
6781 /* XXX remove (gcc still uses it) */
6782 || strcasecmp (new_token.str, "XWORD") == 0)
6783 new_token.code = T_TBYTE;
6784
6785 else if (strcasecmp (new_token.str, "XMMWORD") == 0
6786 || strcasecmp (new_token.str, "OWORD") == 0)
6787 new_token.code = T_XMMWORD;
64a0c779
DN
6788
6789 else if (strcasecmp (new_token.str, "PTR") == 0)
6790 new_token.code = T_PTR;
6791
6792 else if (strcasecmp (new_token.str, "SHORT") == 0)
6793 new_token.code = T_SHORT;
6794
6795 else if (strcasecmp (new_token.str, "OFFSET") == 0)
6796 {
6797 new_token.code = T_OFFSET;
6798
6799 /* ??? This is not mentioned in the MASM grammar but gcc
6800 makes use of it with -mintel-syntax. OFFSET may be
6801 followed by FLAT: */
6802 if (strncasecmp (q, " FLAT:", 6) == 0)
6803 strcat (new_token.str, " FLAT:");
6804 }
6805
6806 /* ??? This is not mentioned in the MASM grammar. */
6807 else if (strcasecmp (new_token.str, "FLAT") == 0)
a724f0f4
JB
6808 {
6809 new_token.code = T_OFFSET;
6810 if (*q == ':')
6811 strcat (new_token.str, ":");
6812 else
6813 as_bad (_("`:' expected"));
6814 }
64a0c779
DN
6815
6816 else
6817 new_token.code = T_ID;
6818 }
6819 }
6820
9306ca4a
JB
6821 else if (strchr ("+-/*%|&^:[]()~", *intel_parser.op_string))
6822 {
6823 new_token.code = *intel_parser.op_string;
6824 new_token.str[0] = *intel_parser.op_string;
6825 new_token.str[1] = '\0';
6826 }
6827
6828 else if (strchr ("<>", *intel_parser.op_string)
6829 && *intel_parser.op_string == *(intel_parser.op_string + 1))
6830 {
6831 new_token.code = *intel_parser.op_string == '<' ? T_SHL : T_SHR;
6832 new_token.str[0] = *intel_parser.op_string;
6833 new_token.str[1] = *intel_parser.op_string;
6834 new_token.str[2] = '\0';
6835 }
6836
64a0c779 6837 else
0477af35 6838 as_bad (_("Unrecognized token `%s'"), intel_parser.op_string);
64a0c779
DN
6839
6840 intel_parser.op_string += strlen (new_token.str);
6841 cur_token = new_token;
6842}
6843
64a0c779
DN
6844/* Put cur_token back into the token stream and make cur_token point to
6845 prev_token. */
6846static void
6847intel_putback_token ()
6848{
a724f0f4
JB
6849 if (cur_token.code != T_NIL)
6850 {
6851 intel_parser.op_string -= strlen (cur_token.str);
6852 free (cur_token.str);
6853 }
64a0c779 6854 cur_token = prev_token;
4a1805b1 6855
64a0c779
DN
6856 /* Forget prev_token. */
6857 prev_token.code = T_NIL;
6858 prev_token.reg = NULL;
6859 prev_token.str = NULL;
6860}
54cfded0 6861
a4447b93 6862int
54cfded0
AM
6863tc_x86_regname_to_dw2regnum (const char *regname)
6864{
6865 unsigned int regnum;
6866 unsigned int regnames_count;
089dfecd 6867 static const char *const regnames_32[] =
54cfded0 6868 {
a4447b93
RH
6869 "eax", "ecx", "edx", "ebx",
6870 "esp", "ebp", "esi", "edi",
089dfecd
JB
6871 "eip", "eflags", NULL,
6872 "st0", "st1", "st2", "st3",
6873 "st4", "st5", "st6", "st7",
6874 NULL, NULL,
6875 "xmm0", "xmm1", "xmm2", "xmm3",
6876 "xmm4", "xmm5", "xmm6", "xmm7",
6877 "mm0", "mm1", "mm2", "mm3",
6878 "mm4", "mm5", "mm6", "mm7"
54cfded0 6879 };
089dfecd 6880 static const char *const regnames_64[] =
54cfded0 6881 {
089dfecd
JB
6882 "rax", "rdx", "rcx", "rbx",
6883 "rsi", "rdi", "rbp", "rsp",
6884 "r8", "r9", "r10", "r11",
54cfded0 6885 "r12", "r13", "r14", "r15",
089dfecd
JB
6886 "rip",
6887 "xmm0", "xmm1", "xmm2", "xmm3",
6888 "xmm4", "xmm5", "xmm6", "xmm7",
6889 "xmm8", "xmm9", "xmm10", "xmm11",
6890 "xmm12", "xmm13", "xmm14", "xmm15",
6891 "st0", "st1", "st2", "st3",
6892 "st4", "st5", "st6", "st7",
6893 "mm0", "mm1", "mm2", "mm3",
6894 "mm4", "mm5", "mm6", "mm7"
54cfded0 6895 };
089dfecd 6896 const char *const *regnames;
54cfded0
AM
6897
6898 if (flag_code == CODE_64BIT)
6899 {
6900 regnames = regnames_64;
0cea6190 6901 regnames_count = ARRAY_SIZE (regnames_64);
54cfded0
AM
6902 }
6903 else
6904 {
6905 regnames = regnames_32;
0cea6190 6906 regnames_count = ARRAY_SIZE (regnames_32);
54cfded0
AM
6907 }
6908
6909 for (regnum = 0; regnum < regnames_count; regnum++)
089dfecd
JB
6910 if (regnames[regnum] != NULL
6911 && strcmp (regname, regnames[regnum]) == 0)
54cfded0
AM
6912 return regnum;
6913
54cfded0
AM
6914 return -1;
6915}
6916
6917void
6918tc_x86_frame_initial_instructions (void)
6919{
a4447b93
RH
6920 static unsigned int sp_regno;
6921
6922 if (!sp_regno)
6923 sp_regno = tc_x86_regname_to_dw2regnum (flag_code == CODE_64BIT
6924 ? "rsp" : "esp");
6925
6926 cfi_add_CFA_def_cfa (sp_regno, -x86_cie_data_alignment);
6927 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
54cfded0 6928}
d2b2c203
DJ
6929
6930int
6931i386_elf_section_type (const char *str, size_t len)
6932{
6933 if (flag_code == CODE_64BIT
6934 && len == sizeof ("unwind") - 1
6935 && strncmp (str, "unwind", 6) == 0)
6936 return SHT_X86_64_UNWIND;
6937
6938 return -1;
6939}
bb41ade5
AM
6940
6941#ifdef TE_PE
6942void
6943tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
6944{
6945 expressionS expr;
6946
6947 expr.X_op = O_secrel;
6948 expr.X_add_symbol = symbol;
6949 expr.X_add_number = 0;
6950 emit_expr (&expr, size);
6951}
6952#endif
This page took 0.716046 seconds and 4 git commands to generate.