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