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