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