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