* README-vms: Delete.
[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 int use_rela_relocations = 0;
291
292 /* The names used to print error messages. */
293 static const char *flag_code_names[] =
294 {
295 "32",
296 "16",
297 "64"
298 };
299
300 /* 1 for intel syntax,
301 0 if att syntax. */
302 static int intel_syntax = 0;
303
304 /* 1 if register prefix % not required. */
305 static int allow_naked_reg = 0;
306
307 /* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
308 leave, push, and pop instructions so that gcc has the same stack
309 frame as in 32 bit mode. */
310 static char stackop_size = '\0';
311
312 /* Non-zero to optimize code alignment. */
313 int optimize_align_code = 1;
314
315 /* Non-zero to quieten some warnings. */
316 static int quiet_warnings = 0;
317
318 /* CPU name. */
319 static const char *cpu_arch_name = NULL;
320 static const char *cpu_sub_arch_name = NULL;
321
322 /* CPU feature flags. */
323 static unsigned int cpu_arch_flags = CpuUnknownFlags | CpuNo64;
324
325 /* If set, conditional jumps are not automatically promoted to handle
326 larger than a byte offset. */
327 static unsigned int no_cond_jump_promotion = 0;
328
329 /* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
330 static symbolS *GOT_symbol;
331
332 /* The dwarf2 return column, adjusted for 32 or 64 bit. */
333 unsigned int x86_dwarf2_return_column;
334
335 /* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
336 int x86_cie_data_alignment;
337
338 /* Interface to relax_segment.
339 There are 3 major relax states for 386 jump insns because the
340 different types of jumps add different sizes to frags when we're
341 figuring out what sort of jump to choose to reach a given label. */
342
343 /* Types. */
344 #define UNCOND_JUMP 0
345 #define COND_JUMP 1
346 #define COND_JUMP86 2
347
348 /* Sizes. */
349 #define CODE16 1
350 #define SMALL 0
351 #define SMALL16 (SMALL | CODE16)
352 #define BIG 2
353 #define BIG16 (BIG | CODE16)
354
355 #ifndef INLINE
356 #ifdef __GNUC__
357 #define INLINE __inline__
358 #else
359 #define INLINE
360 #endif
361 #endif
362
363 #define ENCODE_RELAX_STATE(type, size) \
364 ((relax_substateT) (((type) << 2) | (size)))
365 #define TYPE_FROM_RELAX_STATE(s) \
366 ((s) >> 2)
367 #define DISP_SIZE_FROM_RELAX_STATE(s) \
368 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
369
370 /* This table is used by relax_frag to promote short jumps to long
371 ones where necessary. SMALL (short) jumps may be promoted to BIG
372 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
373 don't allow a short jump in a 32 bit code segment to be promoted to
374 a 16 bit offset jump because it's slower (requires data size
375 prefix), and doesn't work, unless the destination is in the bottom
376 64k of the code segment (The top 16 bits of eip are zeroed). */
377
378 const relax_typeS md_relax_table[] =
379 {
380 /* The fields are:
381 1) most positive reach of this state,
382 2) most negative reach of this state,
383 3) how many bytes this mode will have in the variable part of the frag
384 4) which index into the table to try if we can't fit into this one. */
385
386 /* UNCOND_JUMP states. */
387 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
388 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
389 /* dword jmp adds 4 bytes to frag:
390 0 extra opcode bytes, 4 displacement bytes. */
391 {0, 0, 4, 0},
392 /* word jmp adds 2 byte2 to frag:
393 0 extra opcode bytes, 2 displacement bytes. */
394 {0, 0, 2, 0},
395
396 /* COND_JUMP states. */
397 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
398 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
399 /* dword conditionals adds 5 bytes to frag:
400 1 extra opcode byte, 4 displacement bytes. */
401 {0, 0, 5, 0},
402 /* word conditionals add 3 bytes to frag:
403 1 extra opcode byte, 2 displacement bytes. */
404 {0, 0, 3, 0},
405
406 /* COND_JUMP86 states. */
407 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
408 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
409 /* dword conditionals adds 5 bytes to frag:
410 1 extra opcode byte, 4 displacement bytes. */
411 {0, 0, 5, 0},
412 /* word conditionals add 4 bytes to frag:
413 1 displacement byte and a 3 byte long branch insn. */
414 {0, 0, 4, 0}
415 };
416
417 static const arch_entry cpu_arch[] = {
418 {"i8086", Cpu086 },
419 {"i186", Cpu086|Cpu186 },
420 {"i286", Cpu086|Cpu186|Cpu286 },
421 {"i386", Cpu086|Cpu186|Cpu286|Cpu386 },
422 {"i486", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486 },
423 {"i586", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586 },
424 {"i686", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686 },
425 {"pentium", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586 },
426 {"pentiumpro",Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686 },
427 {"pentiumii", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuMMX },
428 {"pentiumiii",Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuMMX|CpuMMX2|CpuSSE },
429 {"pentium4", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuP4|CpuMMX|CpuMMX2|CpuSSE|CpuSSE2 },
430 {"prescott", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuP4|CpuMMX|CpuMMX2|CpuSSE|CpuSSE2|CpuPNI },
431 {"k6", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|CpuK6|CpuMMX },
432 {"k6_2", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|CpuK6|CpuMMX|Cpu3dnow },
433 {"athlon", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuK6|CpuAthlon|CpuMMX|CpuMMX2|Cpu3dnow|Cpu3dnowA },
434 {"sledgehammer",Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuK6|CpuAthlon|CpuSledgehammer|CpuMMX|CpuMMX2|Cpu3dnow|Cpu3dnowA|CpuSSE|CpuSSE2 },
435 {"opteron", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuK6|CpuAthlon|CpuSledgehammer|CpuMMX|CpuMMX2|Cpu3dnow|Cpu3dnowA|CpuSSE|CpuSSE2 },
436 {".mmx", CpuMMX },
437 {".sse", CpuMMX|CpuMMX2|CpuSSE },
438 {".sse2", CpuMMX|CpuMMX2|CpuSSE|CpuSSE2 },
439 {".sse3", CpuMMX|CpuMMX2|CpuSSE|CpuSSE2|CpuSSE3 },
440 {".3dnow", CpuMMX|Cpu3dnow },
441 {".3dnowa", CpuMMX|CpuMMX2|Cpu3dnow|Cpu3dnowA },
442 {".padlock", CpuPadLock },
443 {".pacifica", CpuSVME },
444 {".svme", CpuSVME },
445 {NULL, 0 }
446 };
447
448 const pseudo_typeS md_pseudo_table[] =
449 {
450 #if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
451 {"align", s_align_bytes, 0},
452 #else
453 {"align", s_align_ptwo, 0},
454 #endif
455 {"arch", set_cpu_arch, 0},
456 #ifndef I386COFF
457 {"bss", s_bss, 0},
458 #endif
459 {"ffloat", float_cons, 'f'},
460 {"dfloat", float_cons, 'd'},
461 {"tfloat", float_cons, 'x'},
462 {"value", cons, 2},
463 {"noopt", s_ignore, 0},
464 {"optim", s_ignore, 0},
465 {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
466 {"code16", set_code_flag, CODE_16BIT},
467 {"code32", set_code_flag, CODE_32BIT},
468 {"code64", set_code_flag, CODE_64BIT},
469 {"intel_syntax", set_intel_syntax, 1},
470 {"att_syntax", set_intel_syntax, 0},
471 {"file", (void (*) PARAMS ((int))) dwarf2_directive_file, 0},
472 {"loc", dwarf2_directive_loc, 0},
473 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
474 {"largecomm", handle_large_common, 0},
475 #endif
476 #ifdef TE_PE
477 {"secrel32", pe_directive_secrel, 0},
478 #endif
479 {0, 0, 0}
480 };
481
482 /* For interface with expression (). */
483 extern char *input_line_pointer;
484
485 /* Hash table for instruction mnemonic lookup. */
486 static struct hash_control *op_hash;
487
488 /* Hash table for register lookup. */
489 static struct hash_control *reg_hash;
490 \f
491 void
492 i386_align_code (fragP, count)
493 fragS *fragP;
494 int count;
495 {
496 /* Various efficient no-op patterns for aligning code labels.
497 Note: Don't try to assemble the instructions in the comments.
498 0L and 0w are not legal. */
499 static const char f32_1[] =
500 {0x90}; /* nop */
501 static const char f32_2[] =
502 {0x89,0xf6}; /* movl %esi,%esi */
503 static const char f32_3[] =
504 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
505 static const char f32_4[] =
506 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
507 static const char f32_5[] =
508 {0x90, /* nop */
509 0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
510 static const char f32_6[] =
511 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
512 static const char f32_7[] =
513 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
514 static const char f32_8[] =
515 {0x90, /* nop */
516 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
517 static const char f32_9[] =
518 {0x89,0xf6, /* movl %esi,%esi */
519 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
520 static const char f32_10[] =
521 {0x8d,0x76,0x00, /* leal 0(%esi),%esi */
522 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
523 static const char f32_11[] =
524 {0x8d,0x74,0x26,0x00, /* leal 0(%esi,1),%esi */
525 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
526 static const char f32_12[] =
527 {0x8d,0xb6,0x00,0x00,0x00,0x00, /* leal 0L(%esi),%esi */
528 0x8d,0xbf,0x00,0x00,0x00,0x00}; /* leal 0L(%edi),%edi */
529 static const char f32_13[] =
530 {0x8d,0xb6,0x00,0x00,0x00,0x00, /* leal 0L(%esi),%esi */
531 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
532 static const char f32_14[] =
533 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00, /* leal 0L(%esi,1),%esi */
534 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
535 static const char f32_15[] =
536 {0xeb,0x0d,0x90,0x90,0x90,0x90,0x90, /* jmp .+15; lotsa nops */
537 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90};
538 static const char f16_3[] =
539 {0x8d,0x74,0x00}; /* lea 0(%esi),%esi */
540 static const char f16_4[] =
541 {0x8d,0xb4,0x00,0x00}; /* lea 0w(%si),%si */
542 static const char f16_5[] =
543 {0x90, /* nop */
544 0x8d,0xb4,0x00,0x00}; /* lea 0w(%si),%si */
545 static const char f16_6[] =
546 {0x89,0xf6, /* mov %si,%si */
547 0x8d,0xbd,0x00,0x00}; /* lea 0w(%di),%di */
548 static const char f16_7[] =
549 {0x8d,0x74,0x00, /* lea 0(%si),%si */
550 0x8d,0xbd,0x00,0x00}; /* lea 0w(%di),%di */
551 static const char f16_8[] =
552 {0x8d,0xb4,0x00,0x00, /* lea 0w(%si),%si */
553 0x8d,0xbd,0x00,0x00}; /* lea 0w(%di),%di */
554 static const char *const f32_patt[] = {
555 f32_1, f32_2, f32_3, f32_4, f32_5, f32_6, f32_7, f32_8,
556 f32_9, f32_10, f32_11, f32_12, f32_13, f32_14, f32_15
557 };
558 static const char *const f16_patt[] = {
559 f32_1, f32_2, f16_3, f16_4, f16_5, f16_6, f16_7, f16_8,
560 f32_15, f32_15, f32_15, f32_15, f32_15, f32_15, f32_15
561 };
562
563 if (count <= 0 || count > 15)
564 return;
565
566 /* The recommended way to pad 64bit code is to use NOPs preceded by
567 maximally four 0x66 prefixes. Balance the size of nops. */
568 if (flag_code == CODE_64BIT)
569 {
570 int i;
571 int nnops = (count + 3) / 4;
572 int len = count / nnops;
573 int remains = count - nnops * len;
574 int pos = 0;
575
576 for (i = 0; i < remains; i++)
577 {
578 memset (fragP->fr_literal + fragP->fr_fix + pos, 0x66, len);
579 fragP->fr_literal[fragP->fr_fix + pos + len] = 0x90;
580 pos += len + 1;
581 }
582 for (; i < nnops; i++)
583 {
584 memset (fragP->fr_literal + fragP->fr_fix + pos, 0x66, len - 1);
585 fragP->fr_literal[fragP->fr_fix + pos + len - 1] = 0x90;
586 pos += len;
587 }
588 }
589 else
590 if (flag_code == CODE_16BIT)
591 {
592 memcpy (fragP->fr_literal + fragP->fr_fix,
593 f16_patt[count - 1], count);
594 if (count > 8)
595 /* Adjust jump offset. */
596 fragP->fr_literal[fragP->fr_fix + 1] = count - 2;
597 }
598 else
599 memcpy (fragP->fr_literal + fragP->fr_fix,
600 f32_patt[count - 1], count);
601 fragP->fr_var = count;
602 }
603
604 static INLINE unsigned int
605 mode_from_disp_size (t)
606 unsigned int t;
607 {
608 return (t & Disp8) ? 1 : (t & (Disp16 | Disp32 | Disp32S)) ? 2 : 0;
609 }
610
611 static INLINE int
612 fits_in_signed_byte (num)
613 offsetT num;
614 {
615 return (num >= -128) && (num <= 127);
616 }
617
618 static INLINE int
619 fits_in_unsigned_byte (num)
620 offsetT num;
621 {
622 return (num & 0xff) == num;
623 }
624
625 static INLINE int
626 fits_in_unsigned_word (num)
627 offsetT num;
628 {
629 return (num & 0xffff) == num;
630 }
631
632 static INLINE int
633 fits_in_signed_word (num)
634 offsetT num;
635 {
636 return (-32768 <= num) && (num <= 32767);
637 }
638 static INLINE int
639 fits_in_signed_long (num)
640 offsetT num ATTRIBUTE_UNUSED;
641 {
642 #ifndef BFD64
643 return 1;
644 #else
645 return (!(((offsetT) -1 << 31) & num)
646 || (((offsetT) -1 << 31) & num) == ((offsetT) -1 << 31));
647 #endif
648 } /* fits_in_signed_long() */
649 static INLINE int
650 fits_in_unsigned_long (num)
651 offsetT num ATTRIBUTE_UNUSED;
652 {
653 #ifndef BFD64
654 return 1;
655 #else
656 return (num & (((offsetT) 2 << 31) - 1)) == num;
657 #endif
658 } /* fits_in_unsigned_long() */
659
660 static int
661 smallest_imm_type (num)
662 offsetT num;
663 {
664 if (cpu_arch_flags != (Cpu086 | Cpu186 | Cpu286 | Cpu386 | Cpu486 | CpuNo64))
665 {
666 /* This code is disabled on the 486 because all the Imm1 forms
667 in the opcode table are slower on the i486. They're the
668 versions with the implicitly specified single-position
669 displacement, which has another syntax if you really want to
670 use that form. */
671 if (num == 1)
672 return Imm1 | Imm8 | Imm8S | Imm16 | Imm32 | Imm32S | Imm64;
673 }
674 return (fits_in_signed_byte (num)
675 ? (Imm8S | Imm8 | Imm16 | Imm32 | Imm32S | Imm64)
676 : fits_in_unsigned_byte (num)
677 ? (Imm8 | Imm16 | Imm32 | Imm32S | Imm64)
678 : (fits_in_signed_word (num) || fits_in_unsigned_word (num))
679 ? (Imm16 | Imm32 | Imm32S | Imm64)
680 : fits_in_signed_long (num)
681 ? (Imm32 | Imm32S | Imm64)
682 : fits_in_unsigned_long (num)
683 ? (Imm32 | Imm64)
684 : Imm64);
685 }
686
687 static offsetT
688 offset_in_range (val, size)
689 offsetT val;
690 int size;
691 {
692 addressT mask;
693
694 switch (size)
695 {
696 case 1: mask = ((addressT) 1 << 8) - 1; break;
697 case 2: mask = ((addressT) 1 << 16) - 1; break;
698 case 4: mask = ((addressT) 2 << 31) - 1; break;
699 #ifdef BFD64
700 case 8: mask = ((addressT) 2 << 63) - 1; break;
701 #endif
702 default: abort ();
703 }
704
705 /* If BFD64, sign extend val. */
706 if (!use_rela_relocations)
707 if ((val & ~(((addressT) 2 << 31) - 1)) == 0)
708 val = (val ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
709
710 if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
711 {
712 char buf1[40], buf2[40];
713
714 sprint_value (buf1, val);
715 sprint_value (buf2, val & mask);
716 as_warn (_("%s shortened to %s"), buf1, buf2);
717 }
718 return val & mask;
719 }
720
721 /* Returns 0 if attempting to add a prefix where one from the same
722 class already exists, 1 if non rep/repne added, 2 if rep/repne
723 added. */
724 static int
725 add_prefix (prefix)
726 unsigned int prefix;
727 {
728 int ret = 1;
729 int q;
730
731 if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
732 && flag_code == CODE_64BIT)
733 q = REX_PREFIX;
734 else
735 switch (prefix)
736 {
737 default:
738 abort ();
739
740 case CS_PREFIX_OPCODE:
741 case DS_PREFIX_OPCODE:
742 case ES_PREFIX_OPCODE:
743 case FS_PREFIX_OPCODE:
744 case GS_PREFIX_OPCODE:
745 case SS_PREFIX_OPCODE:
746 q = SEG_PREFIX;
747 break;
748
749 case REPNE_PREFIX_OPCODE:
750 case REPE_PREFIX_OPCODE:
751 ret = 2;
752 /* fall thru */
753 case LOCK_PREFIX_OPCODE:
754 q = LOCKREP_PREFIX;
755 break;
756
757 case FWAIT_OPCODE:
758 q = WAIT_PREFIX;
759 break;
760
761 case ADDR_PREFIX_OPCODE:
762 q = ADDR_PREFIX;
763 break;
764
765 case DATA_PREFIX_OPCODE:
766 q = DATA_PREFIX;
767 break;
768 }
769
770 if (i.prefix[q] != 0)
771 {
772 as_bad (_("same type of prefix used twice"));
773 return 0;
774 }
775
776 i.prefixes += 1;
777 i.prefix[q] = prefix;
778 return ret;
779 }
780
781 static void
782 set_code_flag (value)
783 int value;
784 {
785 flag_code = value;
786 cpu_arch_flags &= ~(Cpu64 | CpuNo64);
787 cpu_arch_flags |= (flag_code == CODE_64BIT ? Cpu64 : CpuNo64);
788 if (value == CODE_64BIT && !(cpu_arch_flags & CpuSledgehammer))
789 {
790 as_bad (_("64bit mode not supported on this CPU."));
791 }
792 if (value == CODE_32BIT && !(cpu_arch_flags & Cpu386))
793 {
794 as_bad (_("32bit mode not supported on this CPU."));
795 }
796 stackop_size = '\0';
797 }
798
799 static void
800 set_16bit_gcc_code_flag (new_code_flag)
801 int new_code_flag;
802 {
803 flag_code = new_code_flag;
804 cpu_arch_flags &= ~(Cpu64 | CpuNo64);
805 cpu_arch_flags |= (flag_code == CODE_64BIT ? Cpu64 : CpuNo64);
806 stackop_size = LONG_MNEM_SUFFIX;
807 }
808
809 static void
810 set_intel_syntax (syntax_flag)
811 int syntax_flag;
812 {
813 /* Find out if register prefixing is specified. */
814 int ask_naked_reg = 0;
815
816 SKIP_WHITESPACE ();
817 if (!is_end_of_line[(unsigned char) *input_line_pointer])
818 {
819 char *string = input_line_pointer;
820 int e = get_symbol_end ();
821
822 if (strcmp (string, "prefix") == 0)
823 ask_naked_reg = 1;
824 else if (strcmp (string, "noprefix") == 0)
825 ask_naked_reg = -1;
826 else
827 as_bad (_("bad argument to syntax directive."));
828 *input_line_pointer = e;
829 }
830 demand_empty_rest_of_line ();
831
832 intel_syntax = syntax_flag;
833
834 if (ask_naked_reg == 0)
835 allow_naked_reg = (intel_syntax
836 && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
837 else
838 allow_naked_reg = (ask_naked_reg < 0);
839
840 identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
841 identifier_chars['$'] = intel_syntax ? '$' : 0;
842 }
843
844 static void
845 set_cpu_arch (dummy)
846 int dummy ATTRIBUTE_UNUSED;
847 {
848 SKIP_WHITESPACE ();
849
850 if (!is_end_of_line[(unsigned char) *input_line_pointer])
851 {
852 char *string = input_line_pointer;
853 int e = get_symbol_end ();
854 int i;
855
856 for (i = 0; cpu_arch[i].name; i++)
857 {
858 if (strcmp (string, cpu_arch[i].name) == 0)
859 {
860 if (*string != '.')
861 {
862 cpu_arch_name = cpu_arch[i].name;
863 cpu_sub_arch_name = NULL;
864 cpu_arch_flags = (cpu_arch[i].flags
865 | (flag_code == CODE_64BIT ? Cpu64 : CpuNo64));
866 break;
867 }
868 if ((cpu_arch_flags | cpu_arch[i].flags) != cpu_arch_flags)
869 {
870 cpu_sub_arch_name = cpu_arch[i].name;
871 cpu_arch_flags |= cpu_arch[i].flags;
872 }
873 *input_line_pointer = e;
874 demand_empty_rest_of_line ();
875 return;
876 }
877 }
878 if (!cpu_arch[i].name)
879 as_bad (_("no such architecture: `%s'"), string);
880
881 *input_line_pointer = e;
882 }
883 else
884 as_bad (_("missing cpu architecture"));
885
886 no_cond_jump_promotion = 0;
887 if (*input_line_pointer == ','
888 && !is_end_of_line[(unsigned char) input_line_pointer[1]])
889 {
890 char *string = ++input_line_pointer;
891 int e = get_symbol_end ();
892
893 if (strcmp (string, "nojumps") == 0)
894 no_cond_jump_promotion = 1;
895 else if (strcmp (string, "jumps") == 0)
896 ;
897 else
898 as_bad (_("no such architecture modifier: `%s'"), string);
899
900 *input_line_pointer = e;
901 }
902
903 demand_empty_rest_of_line ();
904 }
905
906 unsigned long
907 i386_mach ()
908 {
909 if (!strcmp (default_arch, "x86_64"))
910 return bfd_mach_x86_64;
911 else if (!strcmp (default_arch, "i386"))
912 return bfd_mach_i386_i386;
913 else
914 as_fatal (_("Unknown architecture"));
915 }
916 \f
917 void
918 md_begin ()
919 {
920 const char *hash_err;
921
922 /* Initialize op_hash hash table. */
923 op_hash = hash_new ();
924
925 {
926 const template *optab;
927 templates *core_optab;
928
929 /* Setup for loop. */
930 optab = i386_optab;
931 core_optab = (templates *) xmalloc (sizeof (templates));
932 core_optab->start = optab;
933
934 while (1)
935 {
936 ++optab;
937 if (optab->name == NULL
938 || strcmp (optab->name, (optab - 1)->name) != 0)
939 {
940 /* different name --> ship out current template list;
941 add to hash table; & begin anew. */
942 core_optab->end = optab;
943 hash_err = hash_insert (op_hash,
944 (optab - 1)->name,
945 (PTR) core_optab);
946 if (hash_err)
947 {
948 as_fatal (_("Internal Error: Can't hash %s: %s"),
949 (optab - 1)->name,
950 hash_err);
951 }
952 if (optab->name == NULL)
953 break;
954 core_optab = (templates *) xmalloc (sizeof (templates));
955 core_optab->start = optab;
956 }
957 }
958 }
959
960 /* Initialize reg_hash hash table. */
961 reg_hash = hash_new ();
962 {
963 const reg_entry *regtab;
964
965 for (regtab = i386_regtab;
966 regtab < i386_regtab + sizeof (i386_regtab) / sizeof (i386_regtab[0]);
967 regtab++)
968 {
969 hash_err = hash_insert (reg_hash, regtab->reg_name, (PTR) regtab);
970 if (hash_err)
971 as_fatal (_("Internal Error: Can't hash %s: %s"),
972 regtab->reg_name,
973 hash_err);
974 }
975 }
976
977 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
978 {
979 int c;
980 char *p;
981
982 for (c = 0; c < 256; c++)
983 {
984 if (ISDIGIT (c))
985 {
986 digit_chars[c] = c;
987 mnemonic_chars[c] = c;
988 register_chars[c] = c;
989 operand_chars[c] = c;
990 }
991 else if (ISLOWER (c))
992 {
993 mnemonic_chars[c] = c;
994 register_chars[c] = c;
995 operand_chars[c] = c;
996 }
997 else if (ISUPPER (c))
998 {
999 mnemonic_chars[c] = TOLOWER (c);
1000 register_chars[c] = mnemonic_chars[c];
1001 operand_chars[c] = c;
1002 }
1003
1004 if (ISALPHA (c) || ISDIGIT (c))
1005 identifier_chars[c] = c;
1006 else if (c >= 128)
1007 {
1008 identifier_chars[c] = c;
1009 operand_chars[c] = c;
1010 }
1011 }
1012
1013 #ifdef LEX_AT
1014 identifier_chars['@'] = '@';
1015 #endif
1016 #ifdef LEX_QM
1017 identifier_chars['?'] = '?';
1018 operand_chars['?'] = '?';
1019 #endif
1020 digit_chars['-'] = '-';
1021 mnemonic_chars['-'] = '-';
1022 identifier_chars['_'] = '_';
1023 identifier_chars['.'] = '.';
1024
1025 for (p = operand_special_chars; *p != '\0'; p++)
1026 operand_chars[(unsigned char) *p] = *p;
1027 }
1028
1029 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1030 if (IS_ELF)
1031 {
1032 record_alignment (text_section, 2);
1033 record_alignment (data_section, 2);
1034 record_alignment (bss_section, 2);
1035 }
1036 #endif
1037
1038 if (flag_code == CODE_64BIT)
1039 {
1040 x86_dwarf2_return_column = 16;
1041 x86_cie_data_alignment = -8;
1042 }
1043 else
1044 {
1045 x86_dwarf2_return_column = 8;
1046 x86_cie_data_alignment = -4;
1047 }
1048 }
1049
1050 void
1051 i386_print_statistics (file)
1052 FILE *file;
1053 {
1054 hash_print_statistics (file, "i386 opcode", op_hash);
1055 hash_print_statistics (file, "i386 register", reg_hash);
1056 }
1057 \f
1058 #ifdef DEBUG386
1059
1060 /* Debugging routines for md_assemble. */
1061 static void pi PARAMS ((char *, i386_insn *));
1062 static void pte PARAMS ((template *));
1063 static void pt PARAMS ((unsigned int));
1064 static void pe PARAMS ((expressionS *));
1065 static void ps PARAMS ((symbolS *));
1066
1067 static void
1068 pi (line, x)
1069 char *line;
1070 i386_insn *x;
1071 {
1072 unsigned int i;
1073
1074 fprintf (stdout, "%s: template ", line);
1075 pte (&x->tm);
1076 fprintf (stdout, " address: base %s index %s scale %x\n",
1077 x->base_reg ? x->base_reg->reg_name : "none",
1078 x->index_reg ? x->index_reg->reg_name : "none",
1079 x->log2_scale_factor);
1080 fprintf (stdout, " modrm: mode %x reg %x reg/mem %x\n",
1081 x->rm.mode, x->rm.reg, x->rm.regmem);
1082 fprintf (stdout, " sib: base %x index %x scale %x\n",
1083 x->sib.base, x->sib.index, x->sib.scale);
1084 fprintf (stdout, " rex: 64bit %x extX %x extY %x extZ %x\n",
1085 (x->rex & REX_MODE64) != 0,
1086 (x->rex & REX_EXTX) != 0,
1087 (x->rex & REX_EXTY) != 0,
1088 (x->rex & REX_EXTZ) != 0);
1089 for (i = 0; i < x->operands; i++)
1090 {
1091 fprintf (stdout, " #%d: ", i + 1);
1092 pt (x->types[i]);
1093 fprintf (stdout, "\n");
1094 if (x->types[i]
1095 & (Reg | SReg2 | SReg3 | Control | Debug | Test | RegMMX | RegXMM))
1096 fprintf (stdout, "%s\n", x->op[i].regs->reg_name);
1097 if (x->types[i] & Imm)
1098 pe (x->op[i].imms);
1099 if (x->types[i] & Disp)
1100 pe (x->op[i].disps);
1101 }
1102 }
1103
1104 static void
1105 pte (t)
1106 template *t;
1107 {
1108 unsigned int i;
1109 fprintf (stdout, " %d operands ", t->operands);
1110 fprintf (stdout, "opcode %x ", t->base_opcode);
1111 if (t->extension_opcode != None)
1112 fprintf (stdout, "ext %x ", t->extension_opcode);
1113 if (t->opcode_modifier & D)
1114 fprintf (stdout, "D");
1115 if (t->opcode_modifier & W)
1116 fprintf (stdout, "W");
1117 fprintf (stdout, "\n");
1118 for (i = 0; i < t->operands; i++)
1119 {
1120 fprintf (stdout, " #%d type ", i + 1);
1121 pt (t->operand_types[i]);
1122 fprintf (stdout, "\n");
1123 }
1124 }
1125
1126 static void
1127 pe (e)
1128 expressionS *e;
1129 {
1130 fprintf (stdout, " operation %d\n", e->X_op);
1131 fprintf (stdout, " add_number %ld (%lx)\n",
1132 (long) e->X_add_number, (long) e->X_add_number);
1133 if (e->X_add_symbol)
1134 {
1135 fprintf (stdout, " add_symbol ");
1136 ps (e->X_add_symbol);
1137 fprintf (stdout, "\n");
1138 }
1139 if (e->X_op_symbol)
1140 {
1141 fprintf (stdout, " op_symbol ");
1142 ps (e->X_op_symbol);
1143 fprintf (stdout, "\n");
1144 }
1145 }
1146
1147 static void
1148 ps (s)
1149 symbolS *s;
1150 {
1151 fprintf (stdout, "%s type %s%s",
1152 S_GET_NAME (s),
1153 S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
1154 segment_name (S_GET_SEGMENT (s)));
1155 }
1156
1157 struct type_name
1158 {
1159 unsigned int mask;
1160 char *tname;
1161 }
1162
1163 static const type_names[] =
1164 {
1165 { Reg8, "r8" },
1166 { Reg16, "r16" },
1167 { Reg32, "r32" },
1168 { Reg64, "r64" },
1169 { Imm8, "i8" },
1170 { Imm8S, "i8s" },
1171 { Imm16, "i16" },
1172 { Imm32, "i32" },
1173 { Imm32S, "i32s" },
1174 { Imm64, "i64" },
1175 { Imm1, "i1" },
1176 { BaseIndex, "BaseIndex" },
1177 { Disp8, "d8" },
1178 { Disp16, "d16" },
1179 { Disp32, "d32" },
1180 { Disp32S, "d32s" },
1181 { Disp64, "d64" },
1182 { InOutPortReg, "InOutPortReg" },
1183 { ShiftCount, "ShiftCount" },
1184 { Control, "control reg" },
1185 { Test, "test reg" },
1186 { Debug, "debug reg" },
1187 { FloatReg, "FReg" },
1188 { FloatAcc, "FAcc" },
1189 { SReg2, "SReg2" },
1190 { SReg3, "SReg3" },
1191 { Acc, "Acc" },
1192 { JumpAbsolute, "Jump Absolute" },
1193 { RegMMX, "rMMX" },
1194 { RegXMM, "rXMM" },
1195 { EsSeg, "es" },
1196 { 0, "" }
1197 };
1198
1199 static void
1200 pt (t)
1201 unsigned int t;
1202 {
1203 const struct type_name *ty;
1204
1205 for (ty = type_names; ty->mask; ty++)
1206 if (t & ty->mask)
1207 fprintf (stdout, "%s, ", ty->tname);
1208 fflush (stdout);
1209 }
1210
1211 #endif /* DEBUG386 */
1212 \f
1213 static bfd_reloc_code_real_type
1214 reloc (unsigned int size,
1215 int pcrel,
1216 int sign,
1217 bfd_reloc_code_real_type other)
1218 {
1219 if (other != NO_RELOC)
1220 {
1221 reloc_howto_type *reloc;
1222
1223 if (size == 8)
1224 switch (other)
1225 {
1226 case BFD_RELOC_X86_64_TPOFF32:
1227 other = BFD_RELOC_X86_64_TPOFF64;
1228 break;
1229 case BFD_RELOC_X86_64_DTPOFF32:
1230 other = BFD_RELOC_X86_64_DTPOFF64;
1231 break;
1232 default:
1233 break;
1234 }
1235 reloc = bfd_reloc_type_lookup (stdoutput, other);
1236 if (!reloc)
1237 as_bad (_("unknown relocation (%u)"), other);
1238 else if (size != bfd_get_reloc_size (reloc))
1239 as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
1240 bfd_get_reloc_size (reloc),
1241 size);
1242 else if (pcrel && !reloc->pc_relative)
1243 as_bad (_("non-pc-relative relocation for pc-relative field"));
1244 else if ((reloc->complain_on_overflow == complain_overflow_signed
1245 && !sign)
1246 || (reloc->complain_on_overflow == complain_overflow_unsigned
1247 && sign > 0))
1248 as_bad (_("relocated field and relocation type differ in signedness"));
1249 else
1250 return other;
1251 return NO_RELOC;
1252 }
1253
1254 if (pcrel)
1255 {
1256 if (!sign)
1257 as_bad (_("there are no unsigned pc-relative relocations"));
1258 switch (size)
1259 {
1260 case 1: return BFD_RELOC_8_PCREL;
1261 case 2: return BFD_RELOC_16_PCREL;
1262 case 4: return BFD_RELOC_32_PCREL;
1263 case 8: return BFD_RELOC_64_PCREL;
1264 }
1265 as_bad (_("cannot do %u byte pc-relative relocation"), size);
1266 }
1267 else
1268 {
1269 if (sign > 0)
1270 switch (size)
1271 {
1272 case 4: return BFD_RELOC_X86_64_32S;
1273 }
1274 else
1275 switch (size)
1276 {
1277 case 1: return BFD_RELOC_8;
1278 case 2: return BFD_RELOC_16;
1279 case 4: return BFD_RELOC_32;
1280 case 8: return BFD_RELOC_64;
1281 }
1282 as_bad (_("cannot do %s %u byte relocation"),
1283 sign > 0 ? "signed" : "unsigned", size);
1284 }
1285
1286 abort ();
1287 return BFD_RELOC_NONE;
1288 }
1289
1290 /* Here we decide which fixups can be adjusted to make them relative to
1291 the beginning of the section instead of the symbol. Basically we need
1292 to make sure that the dynamic relocations are done correctly, so in
1293 some cases we force the original symbol to be used. */
1294
1295 int
1296 tc_i386_fix_adjustable (fixP)
1297 fixS *fixP ATTRIBUTE_UNUSED;
1298 {
1299 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1300 if (!IS_ELF)
1301 return 1;
1302
1303 /* Don't adjust pc-relative references to merge sections in 64-bit
1304 mode. */
1305 if (use_rela_relocations
1306 && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
1307 && fixP->fx_pcrel)
1308 return 0;
1309
1310 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
1311 and changed later by validate_fix. */
1312 if (GOT_symbol && fixP->fx_subsy == GOT_symbol
1313 && fixP->fx_r_type == BFD_RELOC_32_PCREL)
1314 return 0;
1315
1316 /* adjust_reloc_syms doesn't know about the GOT. */
1317 if (fixP->fx_r_type == BFD_RELOC_386_GOTOFF
1318 || fixP->fx_r_type == BFD_RELOC_386_PLT32
1319 || fixP->fx_r_type == BFD_RELOC_386_GOT32
1320 || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
1321 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
1322 || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
1323 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
1324 || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
1325 || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
1326 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
1327 || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
1328 || fixP->fx_r_type == BFD_RELOC_X86_64_PLT32
1329 || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
1330 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
1331 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
1332 || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
1333 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
1334 || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
1335 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
1336 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
1337 || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
1338 || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
1339 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1340 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1341 return 0;
1342 #endif
1343 return 1;
1344 }
1345
1346 static int intel_float_operand PARAMS ((const char *mnemonic));
1347
1348 static int
1349 intel_float_operand (mnemonic)
1350 const char *mnemonic;
1351 {
1352 /* Note that the value returned is meaningful only for opcodes with (memory)
1353 operands, hence the code here is free to improperly handle opcodes that
1354 have no operands (for better performance and smaller code). */
1355
1356 if (mnemonic[0] != 'f')
1357 return 0; /* non-math */
1358
1359 switch (mnemonic[1])
1360 {
1361 /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
1362 the fs segment override prefix not currently handled because no
1363 call path can make opcodes without operands get here */
1364 case 'i':
1365 return 2 /* integer op */;
1366 case 'l':
1367 if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
1368 return 3; /* fldcw/fldenv */
1369 break;
1370 case 'n':
1371 if (mnemonic[2] != 'o' /* fnop */)
1372 return 3; /* non-waiting control op */
1373 break;
1374 case 'r':
1375 if (mnemonic[2] == 's')
1376 return 3; /* frstor/frstpm */
1377 break;
1378 case 's':
1379 if (mnemonic[2] == 'a')
1380 return 3; /* fsave */
1381 if (mnemonic[2] == 't')
1382 {
1383 switch (mnemonic[3])
1384 {
1385 case 'c': /* fstcw */
1386 case 'd': /* fstdw */
1387 case 'e': /* fstenv */
1388 case 's': /* fsts[gw] */
1389 return 3;
1390 }
1391 }
1392 break;
1393 case 'x':
1394 if (mnemonic[2] == 'r' || mnemonic[2] == 's')
1395 return 0; /* fxsave/fxrstor are not really math ops */
1396 break;
1397 }
1398
1399 return 1;
1400 }
1401
1402 /* This is the guts of the machine-dependent assembler. LINE points to a
1403 machine dependent instruction. This function is supposed to emit
1404 the frags/bytes it assembles to. */
1405
1406 void
1407 md_assemble (line)
1408 char *line;
1409 {
1410 int j;
1411 char mnemonic[MAX_MNEM_SIZE];
1412
1413 /* Initialize globals. */
1414 memset (&i, '\0', sizeof (i));
1415 for (j = 0; j < MAX_OPERANDS; j++)
1416 i.reloc[j] = NO_RELOC;
1417 memset (disp_expressions, '\0', sizeof (disp_expressions));
1418 memset (im_expressions, '\0', sizeof (im_expressions));
1419 save_stack_p = save_stack;
1420
1421 /* First parse an instruction mnemonic & call i386_operand for the operands.
1422 We assume that the scrubber has arranged it so that line[0] is the valid
1423 start of a (possibly prefixed) mnemonic. */
1424
1425 line = parse_insn (line, mnemonic);
1426 if (line == NULL)
1427 return;
1428
1429 line = parse_operands (line, mnemonic);
1430 if (line == NULL)
1431 return;
1432
1433 /* Now we've parsed the mnemonic into a set of templates, and have the
1434 operands at hand. */
1435
1436 /* All intel opcodes have reversed operands except for "bound" and
1437 "enter". We also don't reverse intersegment "jmp" and "call"
1438 instructions with 2 immediate operands so that the immediate segment
1439 precedes the offset, as it does when in AT&T mode. "enter" and the
1440 intersegment "jmp" and "call" instructions are the only ones that
1441 have two immediate operands. */
1442 if (intel_syntax && i.operands > 1
1443 && (strcmp (mnemonic, "bound") != 0)
1444 && (strcmp (mnemonic, "invlpga") != 0)
1445 && !((i.types[0] & Imm) && (i.types[1] & Imm)))
1446 swap_operands ();
1447
1448 if (i.imm_operands)
1449 optimize_imm ();
1450
1451 /* Don't optimize displacement for movabs since it only takes 64bit
1452 displacement. */
1453 if (i.disp_operands
1454 && (flag_code != CODE_64BIT
1455 || strcmp (mnemonic, "movabs") != 0))
1456 optimize_disp ();
1457
1458 /* Next, we find a template that matches the given insn,
1459 making sure the overlap of the given operands types is consistent
1460 with the template operand types. */
1461
1462 if (!match_template ())
1463 return;
1464
1465 if (intel_syntax)
1466 {
1467 /* Undo SYSV386_COMPAT brokenness when in Intel mode. See i386.h */
1468 if (SYSV386_COMPAT
1469 && (i.tm.base_opcode & 0xfffffde0) == 0xdce0)
1470 i.tm.base_opcode ^= FloatR;
1471
1472 /* Zap movzx and movsx suffix. The suffix may have been set from
1473 "word ptr" or "byte ptr" on the source operand, but we'll use
1474 the suffix later to choose the destination register. */
1475 if ((i.tm.base_opcode & ~9) == 0x0fb6)
1476 {
1477 if (i.reg_operands < 2
1478 && !i.suffix
1479 && (~i.tm.opcode_modifier
1480 & (No_bSuf
1481 | No_wSuf
1482 | No_lSuf
1483 | No_sSuf
1484 | No_xSuf
1485 | No_qSuf)))
1486 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
1487
1488 i.suffix = 0;
1489 }
1490 }
1491
1492 if (i.tm.opcode_modifier & FWait)
1493 if (!add_prefix (FWAIT_OPCODE))
1494 return;
1495
1496 /* Check string instruction segment overrides. */
1497 if ((i.tm.opcode_modifier & IsString) != 0 && i.mem_operands != 0)
1498 {
1499 if (!check_string ())
1500 return;
1501 }
1502
1503 if (!process_suffix ())
1504 return;
1505
1506 /* Make still unresolved immediate matches conform to size of immediate
1507 given in i.suffix. */
1508 if (!finalize_imm ())
1509 return;
1510
1511 if (i.types[0] & Imm1)
1512 i.imm_operands = 0; /* kludge for shift insns. */
1513 if (i.types[0] & ImplicitRegister)
1514 i.reg_operands--;
1515 if (i.types[1] & ImplicitRegister)
1516 i.reg_operands--;
1517 if (i.types[2] & ImplicitRegister)
1518 i.reg_operands--;
1519
1520 if (i.tm.opcode_modifier & ImmExt)
1521 {
1522 expressionS *exp;
1523
1524 if ((i.tm.cpu_flags & CpuPNI) && i.operands > 0)
1525 {
1526 /* These Intel Prescott New Instructions have the fixed
1527 operands with an opcode suffix which is coded in the same
1528 place as an 8-bit immediate field would be. Here we check
1529 those operands and remove them afterwards. */
1530 unsigned int x;
1531
1532 for (x = 0; x < i.operands; x++)
1533 if (i.op[x].regs->reg_num != x)
1534 as_bad (_("can't use register '%%%s' as operand %d in '%s'."),
1535 i.op[x].regs->reg_name, x + 1, i.tm.name);
1536 i.operands = 0;
1537 }
1538
1539 /* These AMD 3DNow! and Intel Katmai New Instructions have an
1540 opcode suffix which is coded in the same place as an 8-bit
1541 immediate field would be. Here we fake an 8-bit immediate
1542 operand from the opcode suffix stored in tm.extension_opcode. */
1543
1544 assert (i.imm_operands == 0 && i.operands <= 2 && 2 < MAX_OPERANDS);
1545
1546 exp = &im_expressions[i.imm_operands++];
1547 i.op[i.operands].imms = exp;
1548 i.types[i.operands++] = Imm8;
1549 exp->X_op = O_constant;
1550 exp->X_add_number = i.tm.extension_opcode;
1551 i.tm.extension_opcode = None;
1552 }
1553
1554 /* For insns with operands there are more diddles to do to the opcode. */
1555 if (i.operands)
1556 {
1557 if (!process_operands ())
1558 return;
1559 }
1560 else if (!quiet_warnings && (i.tm.opcode_modifier & Ugh) != 0)
1561 {
1562 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
1563 as_warn (_("translating to `%sp'"), i.tm.name);
1564 }
1565
1566 /* Handle conversion of 'int $3' --> special int3 insn. */
1567 if (i.tm.base_opcode == INT_OPCODE && i.op[0].imms->X_add_number == 3)
1568 {
1569 i.tm.base_opcode = INT3_OPCODE;
1570 i.imm_operands = 0;
1571 }
1572
1573 if ((i.tm.opcode_modifier & (Jump | JumpByte | JumpDword))
1574 && i.op[0].disps->X_op == O_constant)
1575 {
1576 /* Convert "jmp constant" (and "call constant") to a jump (call) to
1577 the absolute address given by the constant. Since ix86 jumps and
1578 calls are pc relative, we need to generate a reloc. */
1579 i.op[0].disps->X_add_symbol = &abs_symbol;
1580 i.op[0].disps->X_op = O_symbol;
1581 }
1582
1583 if ((i.tm.opcode_modifier & Rex64) != 0)
1584 i.rex |= REX_MODE64;
1585
1586 /* For 8 bit registers we need an empty rex prefix. Also if the
1587 instruction already has a prefix, we need to convert old
1588 registers to new ones. */
1589
1590 if (((i.types[0] & Reg8) != 0
1591 && (i.op[0].regs->reg_flags & RegRex64) != 0)
1592 || ((i.types[1] & Reg8) != 0
1593 && (i.op[1].regs->reg_flags & RegRex64) != 0)
1594 || (((i.types[0] & Reg8) != 0 || (i.types[1] & Reg8) != 0)
1595 && i.rex != 0))
1596 {
1597 int x;
1598
1599 i.rex |= REX_OPCODE;
1600 for (x = 0; x < 2; x++)
1601 {
1602 /* Look for 8 bit operand that uses old registers. */
1603 if ((i.types[x] & Reg8) != 0
1604 && (i.op[x].regs->reg_flags & RegRex64) == 0)
1605 {
1606 /* In case it is "hi" register, give up. */
1607 if (i.op[x].regs->reg_num > 3)
1608 as_bad (_("can't encode register '%%%s' in an instruction requiring REX prefix."),
1609 i.op[x].regs->reg_name);
1610
1611 /* Otherwise it is equivalent to the extended register.
1612 Since the encoding doesn't change this is merely
1613 cosmetic cleanup for debug output. */
1614
1615 i.op[x].regs = i.op[x].regs + 8;
1616 }
1617 }
1618 }
1619
1620 if (i.rex != 0)
1621 add_prefix (REX_OPCODE | i.rex);
1622
1623 /* We are ready to output the insn. */
1624 output_insn ();
1625 }
1626
1627 static char *
1628 parse_insn (line, mnemonic)
1629 char *line;
1630 char *mnemonic;
1631 {
1632 char *l = line;
1633 char *token_start = l;
1634 char *mnem_p;
1635 int supported;
1636 const template *t;
1637
1638 /* Non-zero if we found a prefix only acceptable with string insns. */
1639 const char *expecting_string_instruction = NULL;
1640
1641 while (1)
1642 {
1643 mnem_p = mnemonic;
1644 while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
1645 {
1646 mnem_p++;
1647 if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
1648 {
1649 as_bad (_("no such instruction: `%s'"), token_start);
1650 return NULL;
1651 }
1652 l++;
1653 }
1654 if (!is_space_char (*l)
1655 && *l != END_OF_INSN
1656 && (intel_syntax
1657 || (*l != PREFIX_SEPARATOR
1658 && *l != ',')))
1659 {
1660 as_bad (_("invalid character %s in mnemonic"),
1661 output_invalid (*l));
1662 return NULL;
1663 }
1664 if (token_start == l)
1665 {
1666 if (!intel_syntax && *l == PREFIX_SEPARATOR)
1667 as_bad (_("expecting prefix; got nothing"));
1668 else
1669 as_bad (_("expecting mnemonic; got nothing"));
1670 return NULL;
1671 }
1672
1673 /* Look up instruction (or prefix) via hash table. */
1674 current_templates = hash_find (op_hash, mnemonic);
1675
1676 if (*l != END_OF_INSN
1677 && (!is_space_char (*l) || l[1] != END_OF_INSN)
1678 && current_templates
1679 && (current_templates->start->opcode_modifier & IsPrefix))
1680 {
1681 if (current_templates->start->cpu_flags
1682 & (flag_code != CODE_64BIT ? Cpu64 : CpuNo64))
1683 {
1684 as_bad ((flag_code != CODE_64BIT
1685 ? _("`%s' is only supported in 64-bit mode")
1686 : _("`%s' is not supported in 64-bit mode")),
1687 current_templates->start->name);
1688 return NULL;
1689 }
1690 /* If we are in 16-bit mode, do not allow addr16 or data16.
1691 Similarly, in 32-bit mode, do not allow addr32 or data32. */
1692 if ((current_templates->start->opcode_modifier & (Size16 | Size32))
1693 && flag_code != CODE_64BIT
1694 && (((current_templates->start->opcode_modifier & Size32) != 0)
1695 ^ (flag_code == CODE_16BIT)))
1696 {
1697 as_bad (_("redundant %s prefix"),
1698 current_templates->start->name);
1699 return NULL;
1700 }
1701 /* Add prefix, checking for repeated prefixes. */
1702 switch (add_prefix (current_templates->start->base_opcode))
1703 {
1704 case 0:
1705 return NULL;
1706 case 2:
1707 expecting_string_instruction = current_templates->start->name;
1708 break;
1709 }
1710 /* Skip past PREFIX_SEPARATOR and reset token_start. */
1711 token_start = ++l;
1712 }
1713 else
1714 break;
1715 }
1716
1717 if (!current_templates)
1718 {
1719 /* See if we can get a match by trimming off a suffix. */
1720 switch (mnem_p[-1])
1721 {
1722 case WORD_MNEM_SUFFIX:
1723 if (intel_syntax && (intel_float_operand (mnemonic) & 2))
1724 i.suffix = SHORT_MNEM_SUFFIX;
1725 else
1726 case BYTE_MNEM_SUFFIX:
1727 case QWORD_MNEM_SUFFIX:
1728 i.suffix = mnem_p[-1];
1729 mnem_p[-1] = '\0';
1730 current_templates = hash_find (op_hash, mnemonic);
1731 break;
1732 case SHORT_MNEM_SUFFIX:
1733 case LONG_MNEM_SUFFIX:
1734 if (!intel_syntax)
1735 {
1736 i.suffix = mnem_p[-1];
1737 mnem_p[-1] = '\0';
1738 current_templates = hash_find (op_hash, mnemonic);
1739 }
1740 break;
1741
1742 /* Intel Syntax. */
1743 case 'd':
1744 if (intel_syntax)
1745 {
1746 if (intel_float_operand (mnemonic) == 1)
1747 i.suffix = SHORT_MNEM_SUFFIX;
1748 else
1749 i.suffix = LONG_MNEM_SUFFIX;
1750 mnem_p[-1] = '\0';
1751 current_templates = hash_find (op_hash, mnemonic);
1752 }
1753 break;
1754 }
1755 if (!current_templates)
1756 {
1757 as_bad (_("no such instruction: `%s'"), token_start);
1758 return NULL;
1759 }
1760 }
1761
1762 if (current_templates->start->opcode_modifier & (Jump | JumpByte))
1763 {
1764 /* Check for a branch hint. We allow ",pt" and ",pn" for
1765 predict taken and predict not taken respectively.
1766 I'm not sure that branch hints actually do anything on loop
1767 and jcxz insns (JumpByte) for current Pentium4 chips. They
1768 may work in the future and it doesn't hurt to accept them
1769 now. */
1770 if (l[0] == ',' && l[1] == 'p')
1771 {
1772 if (l[2] == 't')
1773 {
1774 if (!add_prefix (DS_PREFIX_OPCODE))
1775 return NULL;
1776 l += 3;
1777 }
1778 else if (l[2] == 'n')
1779 {
1780 if (!add_prefix (CS_PREFIX_OPCODE))
1781 return NULL;
1782 l += 3;
1783 }
1784 }
1785 }
1786 /* Any other comma loses. */
1787 if (*l == ',')
1788 {
1789 as_bad (_("invalid character %s in mnemonic"),
1790 output_invalid (*l));
1791 return NULL;
1792 }
1793
1794 /* Check if instruction is supported on specified architecture. */
1795 supported = 0;
1796 for (t = current_templates->start; t < current_templates->end; ++t)
1797 {
1798 if (!((t->cpu_flags & ~(Cpu64 | CpuNo64))
1799 & ~(cpu_arch_flags & ~(Cpu64 | CpuNo64))))
1800 supported |= 1;
1801 if (!(t->cpu_flags & (flag_code == CODE_64BIT ? CpuNo64 : Cpu64)))
1802 supported |= 2;
1803 }
1804 if (!(supported & 2))
1805 {
1806 as_bad (flag_code == CODE_64BIT
1807 ? _("`%s' is not supported in 64-bit mode")
1808 : _("`%s' is only supported in 64-bit mode"),
1809 current_templates->start->name);
1810 return NULL;
1811 }
1812 if (!(supported & 1))
1813 {
1814 as_warn (_("`%s' is not supported on `%s%s'"),
1815 current_templates->start->name,
1816 cpu_arch_name,
1817 cpu_sub_arch_name ? cpu_sub_arch_name : "");
1818 }
1819 else if ((Cpu386 & ~cpu_arch_flags) && (flag_code != CODE_16BIT))
1820 {
1821 as_warn (_("use .code16 to ensure correct addressing mode"));
1822 }
1823
1824 /* Check for rep/repne without a string instruction. */
1825 if (expecting_string_instruction)
1826 {
1827 static templates override;
1828
1829 for (t = current_templates->start; t < current_templates->end; ++t)
1830 if (t->opcode_modifier & IsString)
1831 break;
1832 if (t >= current_templates->end)
1833 {
1834 as_bad (_("expecting string instruction after `%s'"),
1835 expecting_string_instruction);
1836 return NULL;
1837 }
1838 for (override.start = t; t < current_templates->end; ++t)
1839 if (!(t->opcode_modifier & IsString))
1840 break;
1841 override.end = t;
1842 current_templates = &override;
1843 }
1844
1845 return l;
1846 }
1847
1848 static char *
1849 parse_operands (l, mnemonic)
1850 char *l;
1851 const char *mnemonic;
1852 {
1853 char *token_start;
1854
1855 /* 1 if operand is pending after ','. */
1856 unsigned int expecting_operand = 0;
1857
1858 /* Non-zero if operand parens not balanced. */
1859 unsigned int paren_not_balanced;
1860
1861 while (*l != END_OF_INSN)
1862 {
1863 /* Skip optional white space before operand. */
1864 if (is_space_char (*l))
1865 ++l;
1866 if (!is_operand_char (*l) && *l != END_OF_INSN)
1867 {
1868 as_bad (_("invalid character %s before operand %d"),
1869 output_invalid (*l),
1870 i.operands + 1);
1871 return NULL;
1872 }
1873 token_start = l; /* after white space */
1874 paren_not_balanced = 0;
1875 while (paren_not_balanced || *l != ',')
1876 {
1877 if (*l == END_OF_INSN)
1878 {
1879 if (paren_not_balanced)
1880 {
1881 if (!intel_syntax)
1882 as_bad (_("unbalanced parenthesis in operand %d."),
1883 i.operands + 1);
1884 else
1885 as_bad (_("unbalanced brackets in operand %d."),
1886 i.operands + 1);
1887 return NULL;
1888 }
1889 else
1890 break; /* we are done */
1891 }
1892 else if (!is_operand_char (*l) && !is_space_char (*l))
1893 {
1894 as_bad (_("invalid character %s in operand %d"),
1895 output_invalid (*l),
1896 i.operands + 1);
1897 return NULL;
1898 }
1899 if (!intel_syntax)
1900 {
1901 if (*l == '(')
1902 ++paren_not_balanced;
1903 if (*l == ')')
1904 --paren_not_balanced;
1905 }
1906 else
1907 {
1908 if (*l == '[')
1909 ++paren_not_balanced;
1910 if (*l == ']')
1911 --paren_not_balanced;
1912 }
1913 l++;
1914 }
1915 if (l != token_start)
1916 { /* Yes, we've read in another operand. */
1917 unsigned int operand_ok;
1918 this_operand = i.operands++;
1919 if (i.operands > MAX_OPERANDS)
1920 {
1921 as_bad (_("spurious operands; (%d operands/instruction max)"),
1922 MAX_OPERANDS);
1923 return NULL;
1924 }
1925 /* Now parse operand adding info to 'i' as we go along. */
1926 END_STRING_AND_SAVE (l);
1927
1928 if (intel_syntax)
1929 operand_ok =
1930 i386_intel_operand (token_start,
1931 intel_float_operand (mnemonic));
1932 else
1933 operand_ok = i386_operand (token_start);
1934
1935 RESTORE_END_STRING (l);
1936 if (!operand_ok)
1937 return NULL;
1938 }
1939 else
1940 {
1941 if (expecting_operand)
1942 {
1943 expecting_operand_after_comma:
1944 as_bad (_("expecting operand after ','; got nothing"));
1945 return NULL;
1946 }
1947 if (*l == ',')
1948 {
1949 as_bad (_("expecting operand before ','; got nothing"));
1950 return NULL;
1951 }
1952 }
1953
1954 /* Now *l must be either ',' or END_OF_INSN. */
1955 if (*l == ',')
1956 {
1957 if (*++l == END_OF_INSN)
1958 {
1959 /* Just skip it, if it's \n complain. */
1960 goto expecting_operand_after_comma;
1961 }
1962 expecting_operand = 1;
1963 }
1964 }
1965 return l;
1966 }
1967
1968 static void
1969 swap_operands ()
1970 {
1971 union i386_op temp_op;
1972 unsigned int temp_type;
1973 enum bfd_reloc_code_real temp_reloc;
1974 int xchg1 = 0;
1975 int xchg2 = 0;
1976
1977 if (i.operands == 2)
1978 {
1979 xchg1 = 0;
1980 xchg2 = 1;
1981 }
1982 else if (i.operands == 3)
1983 {
1984 xchg1 = 0;
1985 xchg2 = 2;
1986 }
1987 temp_type = i.types[xchg2];
1988 i.types[xchg2] = i.types[xchg1];
1989 i.types[xchg1] = temp_type;
1990 temp_op = i.op[xchg2];
1991 i.op[xchg2] = i.op[xchg1];
1992 i.op[xchg1] = temp_op;
1993 temp_reloc = i.reloc[xchg2];
1994 i.reloc[xchg2] = i.reloc[xchg1];
1995 i.reloc[xchg1] = temp_reloc;
1996
1997 if (i.mem_operands == 2)
1998 {
1999 const seg_entry *temp_seg;
2000 temp_seg = i.seg[0];
2001 i.seg[0] = i.seg[1];
2002 i.seg[1] = temp_seg;
2003 }
2004 }
2005
2006 /* Try to ensure constant immediates are represented in the smallest
2007 opcode possible. */
2008 static void
2009 optimize_imm ()
2010 {
2011 char guess_suffix = 0;
2012 int op;
2013
2014 if (i.suffix)
2015 guess_suffix = i.suffix;
2016 else if (i.reg_operands)
2017 {
2018 /* Figure out a suffix from the last register operand specified.
2019 We can't do this properly yet, ie. excluding InOutPortReg,
2020 but the following works for instructions with immediates.
2021 In any case, we can't set i.suffix yet. */
2022 for (op = i.operands; --op >= 0;)
2023 if (i.types[op] & Reg)
2024 {
2025 if (i.types[op] & Reg8)
2026 guess_suffix = BYTE_MNEM_SUFFIX;
2027 else if (i.types[op] & Reg16)
2028 guess_suffix = WORD_MNEM_SUFFIX;
2029 else if (i.types[op] & Reg32)
2030 guess_suffix = LONG_MNEM_SUFFIX;
2031 else if (i.types[op] & Reg64)
2032 guess_suffix = QWORD_MNEM_SUFFIX;
2033 break;
2034 }
2035 }
2036 else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
2037 guess_suffix = WORD_MNEM_SUFFIX;
2038
2039 for (op = i.operands; --op >= 0;)
2040 if (i.types[op] & Imm)
2041 {
2042 switch (i.op[op].imms->X_op)
2043 {
2044 case O_constant:
2045 /* If a suffix is given, this operand may be shortened. */
2046 switch (guess_suffix)
2047 {
2048 case LONG_MNEM_SUFFIX:
2049 i.types[op] |= Imm32 | Imm64;
2050 break;
2051 case WORD_MNEM_SUFFIX:
2052 i.types[op] |= Imm16 | Imm32S | Imm32 | Imm64;
2053 break;
2054 case BYTE_MNEM_SUFFIX:
2055 i.types[op] |= Imm16 | Imm8 | Imm8S | Imm32S | Imm32 | Imm64;
2056 break;
2057 }
2058
2059 /* If this operand is at most 16 bits, convert it
2060 to a signed 16 bit number before trying to see
2061 whether it will fit in an even smaller size.
2062 This allows a 16-bit operand such as $0xffe0 to
2063 be recognised as within Imm8S range. */
2064 if ((i.types[op] & Imm16)
2065 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
2066 {
2067 i.op[op].imms->X_add_number =
2068 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
2069 }
2070 if ((i.types[op] & Imm32)
2071 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
2072 == 0))
2073 {
2074 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
2075 ^ ((offsetT) 1 << 31))
2076 - ((offsetT) 1 << 31));
2077 }
2078 i.types[op] |= smallest_imm_type (i.op[op].imms->X_add_number);
2079
2080 /* We must avoid matching of Imm32 templates when 64bit
2081 only immediate is available. */
2082 if (guess_suffix == QWORD_MNEM_SUFFIX)
2083 i.types[op] &= ~Imm32;
2084 break;
2085
2086 case O_absent:
2087 case O_register:
2088 abort ();
2089
2090 /* Symbols and expressions. */
2091 default:
2092 /* Convert symbolic operand to proper sizes for matching, but don't
2093 prevent matching a set of insns that only supports sizes other
2094 than those matching the insn suffix. */
2095 {
2096 unsigned int mask, allowed = 0;
2097 const template *t;
2098
2099 for (t = current_templates->start; t < current_templates->end; ++t)
2100 allowed |= t->operand_types[op];
2101 switch (guess_suffix)
2102 {
2103 case QWORD_MNEM_SUFFIX:
2104 mask = Imm64 | Imm32S;
2105 break;
2106 case LONG_MNEM_SUFFIX:
2107 mask = Imm32;
2108 break;
2109 case WORD_MNEM_SUFFIX:
2110 mask = Imm16;
2111 break;
2112 case BYTE_MNEM_SUFFIX:
2113 mask = Imm8;
2114 break;
2115 default:
2116 mask = 0;
2117 break;
2118 }
2119 if (mask & allowed)
2120 i.types[op] &= mask;
2121 }
2122 break;
2123 }
2124 }
2125 }
2126
2127 /* Try to use the smallest displacement type too. */
2128 static void
2129 optimize_disp ()
2130 {
2131 int op;
2132
2133 for (op = i.operands; --op >= 0;)
2134 if (i.types[op] & Disp)
2135 {
2136 if (i.op[op].disps->X_op == O_constant)
2137 {
2138 offsetT disp = i.op[op].disps->X_add_number;
2139
2140 if ((i.types[op] & Disp16)
2141 && (disp & ~(offsetT) 0xffff) == 0)
2142 {
2143 /* If this operand is at most 16 bits, convert
2144 to a signed 16 bit number and don't use 64bit
2145 displacement. */
2146 disp = (((disp & 0xffff) ^ 0x8000) - 0x8000);
2147 i.types[op] &= ~Disp64;
2148 }
2149 if ((i.types[op] & Disp32)
2150 && (disp & ~(((offsetT) 2 << 31) - 1)) == 0)
2151 {
2152 /* If this operand is at most 32 bits, convert
2153 to a signed 32 bit number and don't use 64bit
2154 displacement. */
2155 disp &= (((offsetT) 2 << 31) - 1);
2156 disp = (disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
2157 i.types[op] &= ~Disp64;
2158 }
2159 if (!disp && (i.types[op] & BaseIndex))
2160 {
2161 i.types[op] &= ~Disp;
2162 i.op[op].disps = 0;
2163 i.disp_operands--;
2164 }
2165 else if (flag_code == CODE_64BIT)
2166 {
2167 if (fits_in_signed_long (disp))
2168 {
2169 i.types[op] &= ~Disp64;
2170 i.types[op] |= Disp32S;
2171 }
2172 if (fits_in_unsigned_long (disp))
2173 i.types[op] |= Disp32;
2174 }
2175 if ((i.types[op] & (Disp32 | Disp32S | Disp16))
2176 && fits_in_signed_byte (disp))
2177 i.types[op] |= Disp8;
2178 }
2179 else
2180 /* We only support 64bit displacement on constants. */
2181 i.types[op] &= ~Disp64;
2182 }
2183 }
2184
2185 static int
2186 match_template ()
2187 {
2188 /* Points to template once we've found it. */
2189 const template *t;
2190 unsigned int overlap0, overlap1, overlap2;
2191 unsigned int found_reverse_match;
2192 int suffix_check;
2193
2194 #define MATCH(overlap, given, template) \
2195 ((overlap & ~JumpAbsolute) \
2196 && (((given) & (BaseIndex | JumpAbsolute)) \
2197 == ((overlap) & (BaseIndex | JumpAbsolute))))
2198
2199 /* If given types r0 and r1 are registers they must be of the same type
2200 unless the expected operand type register overlap is null.
2201 Note that Acc in a template matches every size of reg. */
2202 #define CONSISTENT_REGISTER_MATCH(m0, g0, t0, m1, g1, t1) \
2203 (((g0) & Reg) == 0 || ((g1) & Reg) == 0 \
2204 || ((g0) & Reg) == ((g1) & Reg) \
2205 || ((((m0) & Acc) ? Reg : (t0)) & (((m1) & Acc) ? Reg : (t1)) & Reg) == 0 )
2206
2207 overlap0 = 0;
2208 overlap1 = 0;
2209 overlap2 = 0;
2210 found_reverse_match = 0;
2211 suffix_check = (i.suffix == BYTE_MNEM_SUFFIX
2212 ? No_bSuf
2213 : (i.suffix == WORD_MNEM_SUFFIX
2214 ? No_wSuf
2215 : (i.suffix == SHORT_MNEM_SUFFIX
2216 ? No_sSuf
2217 : (i.suffix == LONG_MNEM_SUFFIX
2218 ? No_lSuf
2219 : (i.suffix == QWORD_MNEM_SUFFIX
2220 ? No_qSuf
2221 : (i.suffix == LONG_DOUBLE_MNEM_SUFFIX
2222 ? No_xSuf : 0))))));
2223
2224 t = current_templates->start;
2225 if (i.suffix == QWORD_MNEM_SUFFIX
2226 && flag_code != CODE_64BIT
2227 && (intel_syntax
2228 ? !(t->opcode_modifier & IgnoreSize)
2229 && !intel_float_operand (t->name)
2230 : intel_float_operand (t->name) != 2)
2231 && (!(t->operand_types[0] & (RegMMX | RegXMM))
2232 || !(t->operand_types[t->operands > 1] & (RegMMX | RegXMM)))
2233 && (t->base_opcode != 0x0fc7
2234 || t->extension_opcode != 1 /* cmpxchg8b */))
2235 t = current_templates->end;
2236 for (; t < current_templates->end; t++)
2237 {
2238 /* Must have right number of operands. */
2239 if (i.operands != t->operands)
2240 continue;
2241
2242 /* Check the suffix, except for some instructions in intel mode. */
2243 if ((t->opcode_modifier & suffix_check)
2244 && !(intel_syntax
2245 && (t->opcode_modifier & IgnoreSize)))
2246 continue;
2247
2248 /* Do not verify operands when there are none. */
2249 else if (!t->operands)
2250 {
2251 if (t->cpu_flags & ~cpu_arch_flags)
2252 continue;
2253 /* We've found a match; break out of loop. */
2254 break;
2255 }
2256
2257 overlap0 = i.types[0] & t->operand_types[0];
2258 switch (t->operands)
2259 {
2260 case 1:
2261 if (!MATCH (overlap0, i.types[0], t->operand_types[0]))
2262 continue;
2263 break;
2264 case 2:
2265 case 3:
2266 overlap1 = i.types[1] & t->operand_types[1];
2267 if (!MATCH (overlap0, i.types[0], t->operand_types[0])
2268 || !MATCH (overlap1, i.types[1], t->operand_types[1])
2269 || !CONSISTENT_REGISTER_MATCH (overlap0, i.types[0],
2270 t->operand_types[0],
2271 overlap1, i.types[1],
2272 t->operand_types[1]))
2273 {
2274 /* Check if other direction is valid ... */
2275 if ((t->opcode_modifier & (D | FloatD)) == 0)
2276 continue;
2277
2278 /* Try reversing direction of operands. */
2279 overlap0 = i.types[0] & t->operand_types[1];
2280 overlap1 = i.types[1] & t->operand_types[0];
2281 if (!MATCH (overlap0, i.types[0], t->operand_types[1])
2282 || !MATCH (overlap1, i.types[1], t->operand_types[0])
2283 || !CONSISTENT_REGISTER_MATCH (overlap0, i.types[0],
2284 t->operand_types[1],
2285 overlap1, i.types[1],
2286 t->operand_types[0]))
2287 {
2288 /* Does not match either direction. */
2289 continue;
2290 }
2291 /* found_reverse_match holds which of D or FloatDR
2292 we've found. */
2293 found_reverse_match = t->opcode_modifier & (D | FloatDR);
2294 }
2295 /* Found a forward 2 operand match here. */
2296 else if (t->operands == 3)
2297 {
2298 /* Here we make use of the fact that there are no
2299 reverse match 3 operand instructions, and all 3
2300 operand instructions only need to be checked for
2301 register consistency between operands 2 and 3. */
2302 overlap2 = i.types[2] & t->operand_types[2];
2303 if (!MATCH (overlap2, i.types[2], t->operand_types[2])
2304 || !CONSISTENT_REGISTER_MATCH (overlap1, i.types[1],
2305 t->operand_types[1],
2306 overlap2, i.types[2],
2307 t->operand_types[2]))
2308
2309 continue;
2310 }
2311 /* Found either forward/reverse 2 or 3 operand match here:
2312 slip through to break. */
2313 }
2314 if (t->cpu_flags & ~cpu_arch_flags)
2315 {
2316 found_reverse_match = 0;
2317 continue;
2318 }
2319 /* We've found a match; break out of loop. */
2320 break;
2321 }
2322
2323 if (t == current_templates->end)
2324 {
2325 /* We found no match. */
2326 as_bad (_("suffix or operands invalid for `%s'"),
2327 current_templates->start->name);
2328 return 0;
2329 }
2330
2331 if (!quiet_warnings)
2332 {
2333 if (!intel_syntax
2334 && ((i.types[0] & JumpAbsolute)
2335 != (t->operand_types[0] & JumpAbsolute)))
2336 {
2337 as_warn (_("indirect %s without `*'"), t->name);
2338 }
2339
2340 if ((t->opcode_modifier & (IsPrefix | IgnoreSize))
2341 == (IsPrefix | IgnoreSize))
2342 {
2343 /* Warn them that a data or address size prefix doesn't
2344 affect assembly of the next line of code. */
2345 as_warn (_("stand-alone `%s' prefix"), t->name);
2346 }
2347 }
2348
2349 /* Copy the template we found. */
2350 i.tm = *t;
2351 if (found_reverse_match)
2352 {
2353 /* If we found a reverse match we must alter the opcode
2354 direction bit. found_reverse_match holds bits to change
2355 (different for int & float insns). */
2356
2357 i.tm.base_opcode ^= found_reverse_match;
2358
2359 i.tm.operand_types[0] = t->operand_types[1];
2360 i.tm.operand_types[1] = t->operand_types[0];
2361 }
2362
2363 return 1;
2364 }
2365
2366 static int
2367 check_string ()
2368 {
2369 int mem_op = (i.types[0] & AnyMem) ? 0 : 1;
2370 if ((i.tm.operand_types[mem_op] & EsSeg) != 0)
2371 {
2372 if (i.seg[0] != NULL && i.seg[0] != &es)
2373 {
2374 as_bad (_("`%s' operand %d must use `%%es' segment"),
2375 i.tm.name,
2376 mem_op + 1);
2377 return 0;
2378 }
2379 /* There's only ever one segment override allowed per instruction.
2380 This instruction possibly has a legal segment override on the
2381 second operand, so copy the segment to where non-string
2382 instructions store it, allowing common code. */
2383 i.seg[0] = i.seg[1];
2384 }
2385 else if ((i.tm.operand_types[mem_op + 1] & EsSeg) != 0)
2386 {
2387 if (i.seg[1] != NULL && i.seg[1] != &es)
2388 {
2389 as_bad (_("`%s' operand %d must use `%%es' segment"),
2390 i.tm.name,
2391 mem_op + 2);
2392 return 0;
2393 }
2394 }
2395 return 1;
2396 }
2397
2398 static int
2399 process_suffix (void)
2400 {
2401 /* If matched instruction specifies an explicit instruction mnemonic
2402 suffix, use it. */
2403 if (i.tm.opcode_modifier & (Size16 | Size32 | Size64))
2404 {
2405 if (i.tm.opcode_modifier & Size16)
2406 i.suffix = WORD_MNEM_SUFFIX;
2407 else if (i.tm.opcode_modifier & Size64)
2408 i.suffix = QWORD_MNEM_SUFFIX;
2409 else
2410 i.suffix = LONG_MNEM_SUFFIX;
2411 }
2412 else if (i.reg_operands)
2413 {
2414 /* If there's no instruction mnemonic suffix we try to invent one
2415 based on register operands. */
2416 if (!i.suffix)
2417 {
2418 /* We take i.suffix from the last register operand specified,
2419 Destination register type is more significant than source
2420 register type. */
2421 int op;
2422
2423 for (op = i.operands; --op >= 0;)
2424 if ((i.types[op] & Reg)
2425 && !(i.tm.operand_types[op] & InOutPortReg))
2426 {
2427 i.suffix = ((i.types[op] & Reg8) ? BYTE_MNEM_SUFFIX :
2428 (i.types[op] & Reg16) ? WORD_MNEM_SUFFIX :
2429 (i.types[op] & Reg64) ? QWORD_MNEM_SUFFIX :
2430 LONG_MNEM_SUFFIX);
2431 break;
2432 }
2433 }
2434 else if (i.suffix == BYTE_MNEM_SUFFIX)
2435 {
2436 if (!check_byte_reg ())
2437 return 0;
2438 }
2439 else if (i.suffix == LONG_MNEM_SUFFIX)
2440 {
2441 if (!check_long_reg ())
2442 return 0;
2443 }
2444 else if (i.suffix == QWORD_MNEM_SUFFIX)
2445 {
2446 if (!check_qword_reg ())
2447 return 0;
2448 }
2449 else if (i.suffix == WORD_MNEM_SUFFIX)
2450 {
2451 if (!check_word_reg ())
2452 return 0;
2453 }
2454 else if (intel_syntax && (i.tm.opcode_modifier & IgnoreSize))
2455 /* Do nothing if the instruction is going to ignore the prefix. */
2456 ;
2457 else
2458 abort ();
2459 }
2460 else if ((i.tm.opcode_modifier & DefaultSize)
2461 && !i.suffix
2462 /* exclude fldenv/frstor/fsave/fstenv */
2463 && (i.tm.opcode_modifier & No_sSuf))
2464 {
2465 i.suffix = stackop_size;
2466 }
2467 else if (intel_syntax
2468 && !i.suffix
2469 && ((i.tm.operand_types[0] & JumpAbsolute)
2470 || (i.tm.opcode_modifier & (JumpByte|JumpInterSegment))
2471 || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
2472 && i.tm.extension_opcode <= 3)))
2473 {
2474 switch (flag_code)
2475 {
2476 case CODE_64BIT:
2477 if (!(i.tm.opcode_modifier & No_qSuf))
2478 {
2479 i.suffix = QWORD_MNEM_SUFFIX;
2480 break;
2481 }
2482 case CODE_32BIT:
2483 if (!(i.tm.opcode_modifier & No_lSuf))
2484 i.suffix = LONG_MNEM_SUFFIX;
2485 break;
2486 case CODE_16BIT:
2487 if (!(i.tm.opcode_modifier & No_wSuf))
2488 i.suffix = WORD_MNEM_SUFFIX;
2489 break;
2490 }
2491 }
2492
2493 if (!i.suffix)
2494 {
2495 if (!intel_syntax)
2496 {
2497 if (i.tm.opcode_modifier & W)
2498 {
2499 as_bad (_("no instruction mnemonic suffix given and no register operands; can't size instruction"));
2500 return 0;
2501 }
2502 }
2503 else
2504 {
2505 unsigned int suffixes = ~i.tm.opcode_modifier
2506 & (No_bSuf
2507 | No_wSuf
2508 | No_lSuf
2509 | No_sSuf
2510 | No_xSuf
2511 | No_qSuf);
2512
2513 if ((i.tm.opcode_modifier & W)
2514 || ((suffixes & (suffixes - 1))
2515 && !(i.tm.opcode_modifier & (DefaultSize | IgnoreSize))))
2516 {
2517 as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
2518 return 0;
2519 }
2520 }
2521 }
2522
2523 /* Change the opcode based on the operand size given by i.suffix;
2524 We don't need to change things for byte insns. */
2525
2526 if (i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
2527 {
2528 /* It's not a byte, select word/dword operation. */
2529 if (i.tm.opcode_modifier & W)
2530 {
2531 if (i.tm.opcode_modifier & ShortForm)
2532 i.tm.base_opcode |= 8;
2533 else
2534 i.tm.base_opcode |= 1;
2535 }
2536
2537 /* Now select between word & dword operations via the operand
2538 size prefix, except for instructions that will ignore this
2539 prefix anyway. */
2540 if (i.suffix != QWORD_MNEM_SUFFIX
2541 && i.suffix != LONG_DOUBLE_MNEM_SUFFIX
2542 && !(i.tm.opcode_modifier & (IgnoreSize | FloatMF))
2543 && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
2544 || (flag_code == CODE_64BIT
2545 && (i.tm.opcode_modifier & JumpByte))))
2546 {
2547 unsigned int prefix = DATA_PREFIX_OPCODE;
2548
2549 if (i.tm.opcode_modifier & JumpByte) /* jcxz, loop */
2550 prefix = ADDR_PREFIX_OPCODE;
2551
2552 if (!add_prefix (prefix))
2553 return 0;
2554 }
2555
2556 /* Set mode64 for an operand. */
2557 if (i.suffix == QWORD_MNEM_SUFFIX
2558 && flag_code == CODE_64BIT
2559 && (i.tm.opcode_modifier & NoRex64) == 0)
2560 i.rex |= REX_MODE64;
2561
2562 /* Size floating point instruction. */
2563 if (i.suffix == LONG_MNEM_SUFFIX)
2564 if (i.tm.opcode_modifier & FloatMF)
2565 i.tm.base_opcode ^= 4;
2566 }
2567
2568 return 1;
2569 }
2570
2571 static int
2572 check_byte_reg (void)
2573 {
2574 int op;
2575
2576 for (op = i.operands; --op >= 0;)
2577 {
2578 /* If this is an eight bit register, it's OK. If it's the 16 or
2579 32 bit version of an eight bit register, we will just use the
2580 low portion, and that's OK too. */
2581 if (i.types[op] & Reg8)
2582 continue;
2583
2584 /* movzx and movsx should not generate this warning. */
2585 if (intel_syntax
2586 && (i.tm.base_opcode == 0xfb7
2587 || i.tm.base_opcode == 0xfb6
2588 || i.tm.base_opcode == 0x63
2589 || i.tm.base_opcode == 0xfbe
2590 || i.tm.base_opcode == 0xfbf))
2591 continue;
2592
2593 if ((i.types[op] & WordReg) && i.op[op].regs->reg_num < 4)
2594 {
2595 /* Prohibit these changes in the 64bit mode, since the
2596 lowering is more complicated. */
2597 if (flag_code == CODE_64BIT
2598 && (i.tm.operand_types[op] & InOutPortReg) == 0)
2599 {
2600 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2601 i.op[op].regs->reg_name,
2602 i.suffix);
2603 return 0;
2604 }
2605 #if REGISTER_WARNINGS
2606 if (!quiet_warnings
2607 && (i.tm.operand_types[op] & InOutPortReg) == 0)
2608 as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
2609 (i.op[op].regs + (i.types[op] & Reg16
2610 ? REGNAM_AL - REGNAM_AX
2611 : REGNAM_AL - REGNAM_EAX))->reg_name,
2612 i.op[op].regs->reg_name,
2613 i.suffix);
2614 #endif
2615 continue;
2616 }
2617 /* Any other register is bad. */
2618 if (i.types[op] & (Reg | RegMMX | RegXMM
2619 | SReg2 | SReg3
2620 | Control | Debug | Test
2621 | FloatReg | FloatAcc))
2622 {
2623 as_bad (_("`%%%s' not allowed with `%s%c'"),
2624 i.op[op].regs->reg_name,
2625 i.tm.name,
2626 i.suffix);
2627 return 0;
2628 }
2629 }
2630 return 1;
2631 }
2632
2633 static int
2634 check_long_reg ()
2635 {
2636 int op;
2637
2638 for (op = i.operands; --op >= 0;)
2639 /* Reject eight bit registers, except where the template requires
2640 them. (eg. movzb) */
2641 if ((i.types[op] & Reg8) != 0
2642 && (i.tm.operand_types[op] & (Reg16 | Reg32 | Acc)) != 0)
2643 {
2644 as_bad (_("`%%%s' not allowed with `%s%c'"),
2645 i.op[op].regs->reg_name,
2646 i.tm.name,
2647 i.suffix);
2648 return 0;
2649 }
2650 /* Warn if the e prefix on a general reg is missing. */
2651 else if ((!quiet_warnings || flag_code == CODE_64BIT)
2652 && (i.types[op] & Reg16) != 0
2653 && (i.tm.operand_types[op] & (Reg32 | Acc)) != 0)
2654 {
2655 /* Prohibit these changes in the 64bit mode, since the
2656 lowering is more complicated. */
2657 if (flag_code == CODE_64BIT)
2658 {
2659 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2660 i.op[op].regs->reg_name,
2661 i.suffix);
2662 return 0;
2663 }
2664 #if REGISTER_WARNINGS
2665 else
2666 as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
2667 (i.op[op].regs + REGNAM_EAX - REGNAM_AX)->reg_name,
2668 i.op[op].regs->reg_name,
2669 i.suffix);
2670 #endif
2671 }
2672 /* Warn if the r prefix on a general reg is missing. */
2673 else if ((i.types[op] & Reg64) != 0
2674 && (i.tm.operand_types[op] & (Reg32 | Acc)) != 0)
2675 {
2676 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2677 i.op[op].regs->reg_name,
2678 i.suffix);
2679 return 0;
2680 }
2681 return 1;
2682 }
2683
2684 static int
2685 check_qword_reg ()
2686 {
2687 int op;
2688
2689 for (op = i.operands; --op >= 0; )
2690 /* Reject eight bit registers, except where the template requires
2691 them. (eg. movzb) */
2692 if ((i.types[op] & Reg8) != 0
2693 && (i.tm.operand_types[op] & (Reg16 | Reg32 | Acc)) != 0)
2694 {
2695 as_bad (_("`%%%s' not allowed with `%s%c'"),
2696 i.op[op].regs->reg_name,
2697 i.tm.name,
2698 i.suffix);
2699 return 0;
2700 }
2701 /* Warn if the e prefix on a general reg is missing. */
2702 else if (((i.types[op] & Reg16) != 0
2703 || (i.types[op] & Reg32) != 0)
2704 && (i.tm.operand_types[op] & (Reg32 | Acc)) != 0)
2705 {
2706 /* Prohibit these changes in the 64bit mode, since the
2707 lowering is more complicated. */
2708 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2709 i.op[op].regs->reg_name,
2710 i.suffix);
2711 return 0;
2712 }
2713 return 1;
2714 }
2715
2716 static int
2717 check_word_reg ()
2718 {
2719 int op;
2720 for (op = i.operands; --op >= 0;)
2721 /* Reject eight bit registers, except where the template requires
2722 them. (eg. movzb) */
2723 if ((i.types[op] & Reg8) != 0
2724 && (i.tm.operand_types[op] & (Reg16 | Reg32 | Acc)) != 0)
2725 {
2726 as_bad (_("`%%%s' not allowed with `%s%c'"),
2727 i.op[op].regs->reg_name,
2728 i.tm.name,
2729 i.suffix);
2730 return 0;
2731 }
2732 /* Warn if the e prefix on a general reg is present. */
2733 else if ((!quiet_warnings || flag_code == CODE_64BIT)
2734 && (i.types[op] & Reg32) != 0
2735 && (i.tm.operand_types[op] & (Reg16 | Acc)) != 0)
2736 {
2737 /* Prohibit these changes in the 64bit mode, since the
2738 lowering is more complicated. */
2739 if (flag_code == CODE_64BIT)
2740 {
2741 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2742 i.op[op].regs->reg_name,
2743 i.suffix);
2744 return 0;
2745 }
2746 else
2747 #if REGISTER_WARNINGS
2748 as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
2749 (i.op[op].regs + REGNAM_AX - REGNAM_EAX)->reg_name,
2750 i.op[op].regs->reg_name,
2751 i.suffix);
2752 #endif
2753 }
2754 return 1;
2755 }
2756
2757 static int
2758 finalize_imm ()
2759 {
2760 unsigned int overlap0, overlap1, overlap2;
2761
2762 overlap0 = i.types[0] & i.tm.operand_types[0];
2763 if ((overlap0 & (Imm8 | Imm8S | Imm16 | Imm32 | Imm32S | Imm64))
2764 && overlap0 != Imm8 && overlap0 != Imm8S
2765 && overlap0 != Imm16 && overlap0 != Imm32S
2766 && overlap0 != Imm32 && overlap0 != Imm64)
2767 {
2768 if (i.suffix)
2769 {
2770 overlap0 &= (i.suffix == BYTE_MNEM_SUFFIX
2771 ? Imm8 | Imm8S
2772 : (i.suffix == WORD_MNEM_SUFFIX
2773 ? Imm16
2774 : (i.suffix == QWORD_MNEM_SUFFIX
2775 ? Imm64 | Imm32S
2776 : Imm32)));
2777 }
2778 else if (overlap0 == (Imm16 | Imm32S | Imm32)
2779 || overlap0 == (Imm16 | Imm32)
2780 || overlap0 == (Imm16 | Imm32S))
2781 {
2782 overlap0 = ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0)
2783 ? Imm16 : Imm32S);
2784 }
2785 if (overlap0 != Imm8 && overlap0 != Imm8S
2786 && overlap0 != Imm16 && overlap0 != Imm32S
2787 && overlap0 != Imm32 && overlap0 != Imm64)
2788 {
2789 as_bad (_("no instruction mnemonic suffix given; can't determine immediate size"));
2790 return 0;
2791 }
2792 }
2793 i.types[0] = overlap0;
2794
2795 overlap1 = i.types[1] & i.tm.operand_types[1];
2796 if ((overlap1 & (Imm8 | Imm8S | Imm16 | Imm32S | Imm32 | Imm64))
2797 && overlap1 != Imm8 && overlap1 != Imm8S
2798 && overlap1 != Imm16 && overlap1 != Imm32S
2799 && overlap1 != Imm32 && overlap1 != Imm64)
2800 {
2801 if (i.suffix)
2802 {
2803 overlap1 &= (i.suffix == BYTE_MNEM_SUFFIX
2804 ? Imm8 | Imm8S
2805 : (i.suffix == WORD_MNEM_SUFFIX
2806 ? Imm16
2807 : (i.suffix == QWORD_MNEM_SUFFIX
2808 ? Imm64 | Imm32S
2809 : Imm32)));
2810 }
2811 else if (overlap1 == (Imm16 | Imm32 | Imm32S)
2812 || overlap1 == (Imm16 | Imm32)
2813 || overlap1 == (Imm16 | Imm32S))
2814 {
2815 overlap1 = ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0)
2816 ? Imm16 : Imm32S);
2817 }
2818 if (overlap1 != Imm8 && overlap1 != Imm8S
2819 && overlap1 != Imm16 && overlap1 != Imm32S
2820 && overlap1 != Imm32 && overlap1 != Imm64)
2821 {
2822 as_bad (_("no instruction mnemonic suffix given; can't determine immediate size %x %c"),overlap1, i.suffix);
2823 return 0;
2824 }
2825 }
2826 i.types[1] = overlap1;
2827
2828 overlap2 = i.types[2] & i.tm.operand_types[2];
2829 assert ((overlap2 & Imm) == 0);
2830 i.types[2] = overlap2;
2831
2832 return 1;
2833 }
2834
2835 static int
2836 process_operands ()
2837 {
2838 /* Default segment register this instruction will use for memory
2839 accesses. 0 means unknown. This is only for optimizing out
2840 unnecessary segment overrides. */
2841 const seg_entry *default_seg = 0;
2842
2843 /* The imul $imm, %reg instruction is converted into
2844 imul $imm, %reg, %reg, and the clr %reg instruction
2845 is converted into xor %reg, %reg. */
2846 if (i.tm.opcode_modifier & regKludge)
2847 {
2848 unsigned int first_reg_op = (i.types[0] & Reg) ? 0 : 1;
2849 /* Pretend we saw the extra register operand. */
2850 assert (i.op[first_reg_op + 1].regs == 0);
2851 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
2852 i.types[first_reg_op + 1] = i.types[first_reg_op];
2853 i.reg_operands = 2;
2854 }
2855
2856 if (i.tm.opcode_modifier & ShortForm)
2857 {
2858 /* The register or float register operand is in operand 0 or 1. */
2859 unsigned int op = (i.types[0] & (Reg | FloatReg)) ? 0 : 1;
2860 /* Register goes in low 3 bits of opcode. */
2861 i.tm.base_opcode |= i.op[op].regs->reg_num;
2862 if ((i.op[op].regs->reg_flags & RegRex) != 0)
2863 i.rex |= REX_EXTZ;
2864 if (!quiet_warnings && (i.tm.opcode_modifier & Ugh) != 0)
2865 {
2866 /* Warn about some common errors, but press on regardless.
2867 The first case can be generated by gcc (<= 2.8.1). */
2868 if (i.operands == 2)
2869 {
2870 /* Reversed arguments on faddp, fsubp, etc. */
2871 as_warn (_("translating to `%s %%%s,%%%s'"), i.tm.name,
2872 i.op[1].regs->reg_name,
2873 i.op[0].regs->reg_name);
2874 }
2875 else
2876 {
2877 /* Extraneous `l' suffix on fp insn. */
2878 as_warn (_("translating to `%s %%%s'"), i.tm.name,
2879 i.op[0].regs->reg_name);
2880 }
2881 }
2882 }
2883 else if (i.tm.opcode_modifier & Modrm)
2884 {
2885 /* The opcode is completed (modulo i.tm.extension_opcode which
2886 must be put into the modrm byte). Now, we make the modrm and
2887 index base bytes based on all the info we've collected. */
2888
2889 default_seg = build_modrm_byte ();
2890 }
2891 else if (i.tm.opcode_modifier & (Seg2ShortForm | Seg3ShortForm))
2892 {
2893 if (i.tm.base_opcode == POP_SEG_SHORT
2894 && i.op[0].regs->reg_num == 1)
2895 {
2896 as_bad (_("you can't `pop %%cs'"));
2897 return 0;
2898 }
2899 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
2900 if ((i.op[0].regs->reg_flags & RegRex) != 0)
2901 i.rex |= REX_EXTZ;
2902 }
2903 else if ((i.tm.base_opcode & ~(D | W)) == MOV_AX_DISP32)
2904 {
2905 default_seg = &ds;
2906 }
2907 else if ((i.tm.opcode_modifier & IsString) != 0)
2908 {
2909 /* For the string instructions that allow a segment override
2910 on one of their operands, the default segment is ds. */
2911 default_seg = &ds;
2912 }
2913
2914 if ((i.tm.base_opcode == 0x8d /* lea */
2915 || (i.tm.cpu_flags & CpuSVME))
2916 && i.seg[0] && !quiet_warnings)
2917 as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
2918
2919 /* If a segment was explicitly specified, and the specified segment
2920 is not the default, use an opcode prefix to select it. If we
2921 never figured out what the default segment is, then default_seg
2922 will be zero at this point, and the specified segment prefix will
2923 always be used. */
2924 if ((i.seg[0]) && (i.seg[0] != default_seg))
2925 {
2926 if (!add_prefix (i.seg[0]->seg_prefix))
2927 return 0;
2928 }
2929 return 1;
2930 }
2931
2932 static const seg_entry *
2933 build_modrm_byte ()
2934 {
2935 const seg_entry *default_seg = 0;
2936
2937 /* i.reg_operands MUST be the number of real register operands;
2938 implicit registers do not count. */
2939 if (i.reg_operands == 2)
2940 {
2941 unsigned int source, dest;
2942 source = ((i.types[0]
2943 & (Reg | RegMMX | RegXMM
2944 | SReg2 | SReg3
2945 | Control | Debug | Test))
2946 ? 0 : 1);
2947 dest = source + 1;
2948
2949 i.rm.mode = 3;
2950 /* One of the register operands will be encoded in the i.tm.reg
2951 field, the other in the combined i.tm.mode and i.tm.regmem
2952 fields. If no form of this instruction supports a memory
2953 destination operand, then we assume the source operand may
2954 sometimes be a memory operand and so we need to store the
2955 destination in the i.rm.reg field. */
2956 if ((i.tm.operand_types[dest] & AnyMem) == 0)
2957 {
2958 i.rm.reg = i.op[dest].regs->reg_num;
2959 i.rm.regmem = i.op[source].regs->reg_num;
2960 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
2961 i.rex |= REX_EXTX;
2962 if ((i.op[source].regs->reg_flags & RegRex) != 0)
2963 i.rex |= REX_EXTZ;
2964 }
2965 else
2966 {
2967 i.rm.reg = i.op[source].regs->reg_num;
2968 i.rm.regmem = i.op[dest].regs->reg_num;
2969 if ((i.op[dest].regs->reg_flags & RegRex) != 0)
2970 i.rex |= REX_EXTZ;
2971 if ((i.op[source].regs->reg_flags & RegRex) != 0)
2972 i.rex |= REX_EXTX;
2973 }
2974 if (flag_code != CODE_64BIT && (i.rex & (REX_EXTX | REX_EXTZ)))
2975 {
2976 if (!((i.types[0] | i.types[1]) & Control))
2977 abort ();
2978 i.rex &= ~(REX_EXTX | REX_EXTZ);
2979 add_prefix (LOCK_PREFIX_OPCODE);
2980 }
2981 }
2982 else
2983 { /* If it's not 2 reg operands... */
2984 if (i.mem_operands)
2985 {
2986 unsigned int fake_zero_displacement = 0;
2987 unsigned int op = ((i.types[0] & AnyMem)
2988 ? 0
2989 : (i.types[1] & AnyMem) ? 1 : 2);
2990
2991 default_seg = &ds;
2992
2993 if (i.base_reg == 0)
2994 {
2995 i.rm.mode = 0;
2996 if (!i.disp_operands)
2997 fake_zero_displacement = 1;
2998 if (i.index_reg == 0)
2999 {
3000 /* Operand is just <disp> */
3001 if (flag_code == CODE_64BIT)
3002 {
3003 /* 64bit mode overwrites the 32bit absolute
3004 addressing by RIP relative addressing and
3005 absolute addressing is encoded by one of the
3006 redundant SIB forms. */
3007 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
3008 i.sib.base = NO_BASE_REGISTER;
3009 i.sib.index = NO_INDEX_REGISTER;
3010 i.types[op] = ((i.prefix[ADDR_PREFIX] == 0) ? Disp32S : Disp32);
3011 }
3012 else if ((flag_code == CODE_16BIT) ^ (i.prefix[ADDR_PREFIX] != 0))
3013 {
3014 i.rm.regmem = NO_BASE_REGISTER_16;
3015 i.types[op] = Disp16;
3016 }
3017 else
3018 {
3019 i.rm.regmem = NO_BASE_REGISTER;
3020 i.types[op] = Disp32;
3021 }
3022 }
3023 else /* !i.base_reg && i.index_reg */
3024 {
3025 i.sib.index = i.index_reg->reg_num;
3026 i.sib.base = NO_BASE_REGISTER;
3027 i.sib.scale = i.log2_scale_factor;
3028 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
3029 i.types[op] &= ~Disp;
3030 if (flag_code != CODE_64BIT)
3031 i.types[op] |= Disp32; /* Must be 32 bit */
3032 else
3033 i.types[op] |= Disp32S;
3034 if ((i.index_reg->reg_flags & RegRex) != 0)
3035 i.rex |= REX_EXTY;
3036 }
3037 }
3038 /* RIP addressing for 64bit mode. */
3039 else if (i.base_reg->reg_type == BaseIndex)
3040 {
3041 i.rm.regmem = NO_BASE_REGISTER;
3042 i.types[op] &= ~ Disp;
3043 i.types[op] |= Disp32S;
3044 i.flags[op] = Operand_PCrel;
3045 if (! i.disp_operands)
3046 fake_zero_displacement = 1;
3047 }
3048 else if (i.base_reg->reg_type & Reg16)
3049 {
3050 switch (i.base_reg->reg_num)
3051 {
3052 case 3: /* (%bx) */
3053 if (i.index_reg == 0)
3054 i.rm.regmem = 7;
3055 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
3056 i.rm.regmem = i.index_reg->reg_num - 6;
3057 break;
3058 case 5: /* (%bp) */
3059 default_seg = &ss;
3060 if (i.index_reg == 0)
3061 {
3062 i.rm.regmem = 6;
3063 if ((i.types[op] & Disp) == 0)
3064 {
3065 /* fake (%bp) into 0(%bp) */
3066 i.types[op] |= Disp8;
3067 fake_zero_displacement = 1;
3068 }
3069 }
3070 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
3071 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
3072 break;
3073 default: /* (%si) -> 4 or (%di) -> 5 */
3074 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
3075 }
3076 i.rm.mode = mode_from_disp_size (i.types[op]);
3077 }
3078 else /* i.base_reg and 32/64 bit mode */
3079 {
3080 if (flag_code == CODE_64BIT
3081 && (i.types[op] & Disp))
3082 i.types[op] = (i.types[op] & Disp8) | (i.prefix[ADDR_PREFIX] == 0 ? Disp32S : Disp32);
3083
3084 i.rm.regmem = i.base_reg->reg_num;
3085 if ((i.base_reg->reg_flags & RegRex) != 0)
3086 i.rex |= REX_EXTZ;
3087 i.sib.base = i.base_reg->reg_num;
3088 /* x86-64 ignores REX prefix bit here to avoid decoder
3089 complications. */
3090 if ((i.base_reg->reg_num & 7) == EBP_REG_NUM)
3091 {
3092 default_seg = &ss;
3093 if (i.disp_operands == 0)
3094 {
3095 fake_zero_displacement = 1;
3096 i.types[op] |= Disp8;
3097 }
3098 }
3099 else if (i.base_reg->reg_num == ESP_REG_NUM)
3100 {
3101 default_seg = &ss;
3102 }
3103 i.sib.scale = i.log2_scale_factor;
3104 if (i.index_reg == 0)
3105 {
3106 /* <disp>(%esp) becomes two byte modrm with no index
3107 register. We've already stored the code for esp
3108 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
3109 Any base register besides %esp will not use the
3110 extra modrm byte. */
3111 i.sib.index = NO_INDEX_REGISTER;
3112 #if !SCALE1_WHEN_NO_INDEX
3113 /* Another case where we force the second modrm byte. */
3114 if (i.log2_scale_factor)
3115 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
3116 #endif
3117 }
3118 else
3119 {
3120 i.sib.index = i.index_reg->reg_num;
3121 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
3122 if ((i.index_reg->reg_flags & RegRex) != 0)
3123 i.rex |= REX_EXTY;
3124 }
3125 i.rm.mode = mode_from_disp_size (i.types[op]);
3126 }
3127
3128 if (fake_zero_displacement)
3129 {
3130 /* Fakes a zero displacement assuming that i.types[op]
3131 holds the correct displacement size. */
3132 expressionS *exp;
3133
3134 assert (i.op[op].disps == 0);
3135 exp = &disp_expressions[i.disp_operands++];
3136 i.op[op].disps = exp;
3137 exp->X_op = O_constant;
3138 exp->X_add_number = 0;
3139 exp->X_add_symbol = (symbolS *) 0;
3140 exp->X_op_symbol = (symbolS *) 0;
3141 }
3142 }
3143
3144 /* Fill in i.rm.reg or i.rm.regmem field with register operand
3145 (if any) based on i.tm.extension_opcode. Again, we must be
3146 careful to make sure that segment/control/debug/test/MMX
3147 registers are coded into the i.rm.reg field. */
3148 if (i.reg_operands)
3149 {
3150 unsigned int op =
3151 ((i.types[0]
3152 & (Reg | RegMMX | RegXMM
3153 | SReg2 | SReg3
3154 | Control | Debug | Test))
3155 ? 0
3156 : ((i.types[1]
3157 & (Reg | RegMMX | RegXMM
3158 | SReg2 | SReg3
3159 | Control | Debug | Test))
3160 ? 1
3161 : 2));
3162 /* If there is an extension opcode to put here, the register
3163 number must be put into the regmem field. */
3164 if (i.tm.extension_opcode != None)
3165 {
3166 i.rm.regmem = i.op[op].regs->reg_num;
3167 if ((i.op[op].regs->reg_flags & RegRex) != 0)
3168 i.rex |= REX_EXTZ;
3169 }
3170 else
3171 {
3172 i.rm.reg = i.op[op].regs->reg_num;
3173 if ((i.op[op].regs->reg_flags & RegRex) != 0)
3174 i.rex |= REX_EXTX;
3175 }
3176
3177 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
3178 must set it to 3 to indicate this is a register operand
3179 in the regmem field. */
3180 if (!i.mem_operands)
3181 i.rm.mode = 3;
3182 }
3183
3184 /* Fill in i.rm.reg field with extension opcode (if any). */
3185 if (i.tm.extension_opcode != None)
3186 i.rm.reg = i.tm.extension_opcode;
3187 }
3188 return default_seg;
3189 }
3190
3191 static void
3192 output_branch ()
3193 {
3194 char *p;
3195 int code16;
3196 int prefix;
3197 relax_substateT subtype;
3198 symbolS *sym;
3199 offsetT off;
3200
3201 code16 = 0;
3202 if (flag_code == CODE_16BIT)
3203 code16 = CODE16;
3204
3205 prefix = 0;
3206 if (i.prefix[DATA_PREFIX] != 0)
3207 {
3208 prefix = 1;
3209 i.prefixes -= 1;
3210 code16 ^= CODE16;
3211 }
3212 /* Pentium4 branch hints. */
3213 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
3214 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
3215 {
3216 prefix++;
3217 i.prefixes--;
3218 }
3219 if (i.prefix[REX_PREFIX] != 0)
3220 {
3221 prefix++;
3222 i.prefixes--;
3223 }
3224
3225 if (i.prefixes != 0 && !intel_syntax)
3226 as_warn (_("skipping prefixes on this instruction"));
3227
3228 /* It's always a symbol; End frag & setup for relax.
3229 Make sure there is enough room in this frag for the largest
3230 instruction we may generate in md_convert_frag. This is 2
3231 bytes for the opcode and room for the prefix and largest
3232 displacement. */
3233 frag_grow (prefix + 2 + 4);
3234 /* Prefix and 1 opcode byte go in fr_fix. */
3235 p = frag_more (prefix + 1);
3236 if (i.prefix[DATA_PREFIX] != 0)
3237 *p++ = DATA_PREFIX_OPCODE;
3238 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
3239 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
3240 *p++ = i.prefix[SEG_PREFIX];
3241 if (i.prefix[REX_PREFIX] != 0)
3242 *p++ = i.prefix[REX_PREFIX];
3243 *p = i.tm.base_opcode;
3244
3245 if ((unsigned char) *p == JUMP_PC_RELATIVE)
3246 subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, SMALL);
3247 else if ((cpu_arch_flags & Cpu386) != 0)
3248 subtype = ENCODE_RELAX_STATE (COND_JUMP, SMALL);
3249 else
3250 subtype = ENCODE_RELAX_STATE (COND_JUMP86, SMALL);
3251 subtype |= code16;
3252
3253 sym = i.op[0].disps->X_add_symbol;
3254 off = i.op[0].disps->X_add_number;
3255
3256 if (i.op[0].disps->X_op != O_constant
3257 && i.op[0].disps->X_op != O_symbol)
3258 {
3259 /* Handle complex expressions. */
3260 sym = make_expr_symbol (i.op[0].disps);
3261 off = 0;
3262 }
3263
3264 /* 1 possible extra opcode + 4 byte displacement go in var part.
3265 Pass reloc in fr_var. */
3266 frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
3267 }
3268
3269 static void
3270 output_jump ()
3271 {
3272 char *p;
3273 int size;
3274 fixS *fixP;
3275
3276 if (i.tm.opcode_modifier & JumpByte)
3277 {
3278 /* This is a loop or jecxz type instruction. */
3279 size = 1;
3280 if (i.prefix[ADDR_PREFIX] != 0)
3281 {
3282 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
3283 i.prefixes -= 1;
3284 }
3285 /* Pentium4 branch hints. */
3286 if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
3287 || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
3288 {
3289 FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
3290 i.prefixes--;
3291 }
3292 }
3293 else
3294 {
3295 int code16;
3296
3297 code16 = 0;
3298 if (flag_code == CODE_16BIT)
3299 code16 = CODE16;
3300
3301 if (i.prefix[DATA_PREFIX] != 0)
3302 {
3303 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
3304 i.prefixes -= 1;
3305 code16 ^= CODE16;
3306 }
3307
3308 size = 4;
3309 if (code16)
3310 size = 2;
3311 }
3312
3313 if (i.prefix[REX_PREFIX] != 0)
3314 {
3315 FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
3316 i.prefixes -= 1;
3317 }
3318
3319 if (i.prefixes != 0 && !intel_syntax)
3320 as_warn (_("skipping prefixes on this instruction"));
3321
3322 p = frag_more (1 + size);
3323 *p++ = i.tm.base_opcode;
3324
3325 fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
3326 i.op[0].disps, 1, reloc (size, 1, 1, i.reloc[0]));
3327
3328 /* All jumps handled here are signed, but don't use a signed limit
3329 check for 32 and 16 bit jumps as we want to allow wrap around at
3330 4G and 64k respectively. */
3331 if (size == 1)
3332 fixP->fx_signed = 1;
3333 }
3334
3335 static void
3336 output_interseg_jump ()
3337 {
3338 char *p;
3339 int size;
3340 int prefix;
3341 int code16;
3342
3343 code16 = 0;
3344 if (flag_code == CODE_16BIT)
3345 code16 = CODE16;
3346
3347 prefix = 0;
3348 if (i.prefix[DATA_PREFIX] != 0)
3349 {
3350 prefix = 1;
3351 i.prefixes -= 1;
3352 code16 ^= CODE16;
3353 }
3354 if (i.prefix[REX_PREFIX] != 0)
3355 {
3356 prefix++;
3357 i.prefixes -= 1;
3358 }
3359
3360 size = 4;
3361 if (code16)
3362 size = 2;
3363
3364 if (i.prefixes != 0 && !intel_syntax)
3365 as_warn (_("skipping prefixes on this instruction"));
3366
3367 /* 1 opcode; 2 segment; offset */
3368 p = frag_more (prefix + 1 + 2 + size);
3369
3370 if (i.prefix[DATA_PREFIX] != 0)
3371 *p++ = DATA_PREFIX_OPCODE;
3372
3373 if (i.prefix[REX_PREFIX] != 0)
3374 *p++ = i.prefix[REX_PREFIX];
3375
3376 *p++ = i.tm.base_opcode;
3377 if (i.op[1].imms->X_op == O_constant)
3378 {
3379 offsetT n = i.op[1].imms->X_add_number;
3380
3381 if (size == 2
3382 && !fits_in_unsigned_word (n)
3383 && !fits_in_signed_word (n))
3384 {
3385 as_bad (_("16-bit jump out of range"));
3386 return;
3387 }
3388 md_number_to_chars (p, n, size);
3389 }
3390 else
3391 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
3392 i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
3393 if (i.op[0].imms->X_op != O_constant)
3394 as_bad (_("can't handle non absolute segment in `%s'"),
3395 i.tm.name);
3396 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
3397 }
3398
3399 static void
3400 output_insn ()
3401 {
3402 fragS *insn_start_frag;
3403 offsetT insn_start_off;
3404
3405 /* Tie dwarf2 debug info to the address at the start of the insn.
3406 We can't do this after the insn has been output as the current
3407 frag may have been closed off. eg. by frag_var. */
3408 dwarf2_emit_insn (0);
3409
3410 insn_start_frag = frag_now;
3411 insn_start_off = frag_now_fix ();
3412
3413 /* Output jumps. */
3414 if (i.tm.opcode_modifier & Jump)
3415 output_branch ();
3416 else if (i.tm.opcode_modifier & (JumpByte | JumpDword))
3417 output_jump ();
3418 else if (i.tm.opcode_modifier & JumpInterSegment)
3419 output_interseg_jump ();
3420 else
3421 {
3422 /* Output normal instructions here. */
3423 char *p;
3424 unsigned char *q;
3425
3426 /* All opcodes on i386 have either 1 or 2 bytes. We may use one
3427 more higher byte to specify a prefix the instruction
3428 requires. */
3429 if ((i.tm.base_opcode & 0xff0000) != 0)
3430 {
3431 if ((i.tm.cpu_flags & CpuPadLock) != 0)
3432 {
3433 unsigned int prefix;
3434 prefix = (i.tm.base_opcode >> 16) & 0xff;
3435
3436 if (prefix != REPE_PREFIX_OPCODE
3437 || i.prefix[LOCKREP_PREFIX] != REPE_PREFIX_OPCODE)
3438 add_prefix (prefix);
3439 }
3440 else
3441 add_prefix ((i.tm.base_opcode >> 16) & 0xff);
3442 }
3443
3444 /* The prefix bytes. */
3445 for (q = i.prefix;
3446 q < i.prefix + sizeof (i.prefix) / sizeof (i.prefix[0]);
3447 q++)
3448 {
3449 if (*q)
3450 {
3451 p = frag_more (1);
3452 md_number_to_chars (p, (valueT) *q, 1);
3453 }
3454 }
3455
3456 /* Now the opcode; be careful about word order here! */
3457 if (fits_in_unsigned_byte (i.tm.base_opcode))
3458 {
3459 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
3460 }
3461 else
3462 {
3463 p = frag_more (2);
3464
3465 /* Put out high byte first: can't use md_number_to_chars! */
3466 *p++ = (i.tm.base_opcode >> 8) & 0xff;
3467 *p = i.tm.base_opcode & 0xff;
3468 }
3469
3470 /* Now the modrm byte and sib byte (if present). */
3471 if (i.tm.opcode_modifier & Modrm)
3472 {
3473 p = frag_more (1);
3474 md_number_to_chars (p,
3475 (valueT) (i.rm.regmem << 0
3476 | i.rm.reg << 3
3477 | i.rm.mode << 6),
3478 1);
3479 /* If i.rm.regmem == ESP (4)
3480 && i.rm.mode != (Register mode)
3481 && not 16 bit
3482 ==> need second modrm byte. */
3483 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
3484 && i.rm.mode != 3
3485 && !(i.base_reg && (i.base_reg->reg_type & Reg16) != 0))
3486 {
3487 p = frag_more (1);
3488 md_number_to_chars (p,
3489 (valueT) (i.sib.base << 0
3490 | i.sib.index << 3
3491 | i.sib.scale << 6),
3492 1);
3493 }
3494 }
3495
3496 if (i.disp_operands)
3497 output_disp (insn_start_frag, insn_start_off);
3498
3499 if (i.imm_operands)
3500 output_imm (insn_start_frag, insn_start_off);
3501 }
3502
3503 #ifdef DEBUG386
3504 if (flag_debug)
3505 {
3506 pi (line, &i);
3507 }
3508 #endif /* DEBUG386 */
3509 }
3510
3511 static void
3512 output_disp (insn_start_frag, insn_start_off)
3513 fragS *insn_start_frag;
3514 offsetT insn_start_off;
3515 {
3516 char *p;
3517 unsigned int n;
3518
3519 for (n = 0; n < i.operands; n++)
3520 {
3521 if (i.types[n] & Disp)
3522 {
3523 if (i.op[n].disps->X_op == O_constant)
3524 {
3525 int size;
3526 offsetT val;
3527
3528 size = 4;
3529 if (i.types[n] & (Disp8 | Disp16 | Disp64))
3530 {
3531 size = 2;
3532 if (i.types[n] & Disp8)
3533 size = 1;
3534 if (i.types[n] & Disp64)
3535 size = 8;
3536 }
3537 val = offset_in_range (i.op[n].disps->X_add_number,
3538 size);
3539 p = frag_more (size);
3540 md_number_to_chars (p, val, size);
3541 }
3542 else
3543 {
3544 enum bfd_reloc_code_real reloc_type;
3545 int size = 4;
3546 int sign = 0;
3547 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
3548
3549 /* The PC relative address is computed relative
3550 to the instruction boundary, so in case immediate
3551 fields follows, we need to adjust the value. */
3552 if (pcrel && i.imm_operands)
3553 {
3554 int imm_size = 4;
3555 unsigned int n1;
3556
3557 for (n1 = 0; n1 < i.operands; n1++)
3558 if (i.types[n1] & Imm)
3559 {
3560 if (i.types[n1] & (Imm8 | Imm8S | Imm16 | Imm64))
3561 {
3562 imm_size = 2;
3563 if (i.types[n1] & (Imm8 | Imm8S))
3564 imm_size = 1;
3565 if (i.types[n1] & Imm64)
3566 imm_size = 8;
3567 }
3568 break;
3569 }
3570 /* We should find the immediate. */
3571 if (n1 == i.operands)
3572 abort ();
3573 i.op[n].disps->X_add_number -= imm_size;
3574 }
3575
3576 if (i.types[n] & Disp32S)
3577 sign = 1;
3578
3579 if (i.types[n] & (Disp16 | Disp64))
3580 {
3581 size = 2;
3582 if (i.types[n] & Disp64)
3583 size = 8;
3584 }
3585
3586 p = frag_more (size);
3587 reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
3588 if (GOT_symbol
3589 && GOT_symbol == i.op[n].disps->X_add_symbol
3590 && (((reloc_type == BFD_RELOC_32
3591 || reloc_type == BFD_RELOC_X86_64_32S)
3592 && (i.op[n].disps->X_op == O_symbol
3593 || (i.op[n].disps->X_op == O_add
3594 && ((symbol_get_value_expression
3595 (i.op[n].disps->X_op_symbol)->X_op)
3596 == O_subtract))))
3597 || reloc_type == BFD_RELOC_32_PCREL))
3598 {
3599 offsetT add;
3600
3601 if (insn_start_frag == frag_now)
3602 add = (p - frag_now->fr_literal) - insn_start_off;
3603 else
3604 {
3605 fragS *fr;
3606
3607 add = insn_start_frag->fr_fix - insn_start_off;
3608 for (fr = insn_start_frag->fr_next;
3609 fr && fr != frag_now; fr = fr->fr_next)
3610 add += fr->fr_fix;
3611 add += p - frag_now->fr_literal;
3612 }
3613
3614 if (flag_code != CODE_64BIT)
3615 reloc_type = BFD_RELOC_386_GOTPC;
3616 else
3617 reloc_type = BFD_RELOC_X86_64_GOTPC32;
3618 i.op[n].disps->X_add_number += add;
3619 }
3620 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
3621 i.op[n].disps, pcrel, reloc_type);
3622 }
3623 }
3624 }
3625 }
3626
3627 static void
3628 output_imm (insn_start_frag, insn_start_off)
3629 fragS *insn_start_frag;
3630 offsetT insn_start_off;
3631 {
3632 char *p;
3633 unsigned int n;
3634
3635 for (n = 0; n < i.operands; n++)
3636 {
3637 if (i.types[n] & Imm)
3638 {
3639 if (i.op[n].imms->X_op == O_constant)
3640 {
3641 int size;
3642 offsetT val;
3643
3644 size = 4;
3645 if (i.types[n] & (Imm8 | Imm8S | Imm16 | Imm64))
3646 {
3647 size = 2;
3648 if (i.types[n] & (Imm8 | Imm8S))
3649 size = 1;
3650 else if (i.types[n] & Imm64)
3651 size = 8;
3652 }
3653 val = offset_in_range (i.op[n].imms->X_add_number,
3654 size);
3655 p = frag_more (size);
3656 md_number_to_chars (p, val, size);
3657 }
3658 else
3659 {
3660 /* Not absolute_section.
3661 Need a 32-bit fixup (don't support 8bit
3662 non-absolute imms). Try to support other
3663 sizes ... */
3664 enum bfd_reloc_code_real reloc_type;
3665 int size = 4;
3666 int sign = 0;
3667
3668 if ((i.types[n] & (Imm32S))
3669 && (i.suffix == QWORD_MNEM_SUFFIX
3670 || (!i.suffix && (i.tm.opcode_modifier & No_lSuf))))
3671 sign = 1;
3672 if (i.types[n] & (Imm8 | Imm8S | Imm16 | Imm64))
3673 {
3674 size = 2;
3675 if (i.types[n] & (Imm8 | Imm8S))
3676 size = 1;
3677 if (i.types[n] & Imm64)
3678 size = 8;
3679 }
3680
3681 p = frag_more (size);
3682 reloc_type = reloc (size, 0, sign, i.reloc[n]);
3683
3684 /* This is tough to explain. We end up with this one if we
3685 * have operands that look like
3686 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
3687 * obtain the absolute address of the GOT, and it is strongly
3688 * preferable from a performance point of view to avoid using
3689 * a runtime relocation for this. The actual sequence of
3690 * instructions often look something like:
3691 *
3692 * call .L66
3693 * .L66:
3694 * popl %ebx
3695 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
3696 *
3697 * The call and pop essentially return the absolute address
3698 * of the label .L66 and store it in %ebx. The linker itself
3699 * will ultimately change the first operand of the addl so
3700 * that %ebx points to the GOT, but to keep things simple, the
3701 * .o file must have this operand set so that it generates not
3702 * the absolute address of .L66, but the absolute address of
3703 * itself. This allows the linker itself simply treat a GOTPC
3704 * relocation as asking for a pcrel offset to the GOT to be
3705 * added in, and the addend of the relocation is stored in the
3706 * operand field for the instruction itself.
3707 *
3708 * Our job here is to fix the operand so that it would add
3709 * the correct offset so that %ebx would point to itself. The
3710 * thing that is tricky is that .-.L66 will point to the
3711 * beginning of the instruction, so we need to further modify
3712 * the operand so that it will point to itself. There are
3713 * other cases where you have something like:
3714 *
3715 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
3716 *
3717 * and here no correction would be required. Internally in
3718 * the assembler we treat operands of this form as not being
3719 * pcrel since the '.' is explicitly mentioned, and I wonder
3720 * whether it would simplify matters to do it this way. Who
3721 * knows. In earlier versions of the PIC patches, the
3722 * pcrel_adjust field was used to store the correction, but
3723 * since the expression is not pcrel, I felt it would be
3724 * confusing to do it this way. */
3725
3726 if ((reloc_type == BFD_RELOC_32
3727 || reloc_type == BFD_RELOC_X86_64_32S)
3728 && GOT_symbol
3729 && GOT_symbol == i.op[n].imms->X_add_symbol
3730 && (i.op[n].imms->X_op == O_symbol
3731 || (i.op[n].imms->X_op == O_add
3732 && ((symbol_get_value_expression
3733 (i.op[n].imms->X_op_symbol)->X_op)
3734 == O_subtract))))
3735 {
3736 offsetT add;
3737
3738 if (insn_start_frag == frag_now)
3739 add = (p - frag_now->fr_literal) - insn_start_off;
3740 else
3741 {
3742 fragS *fr;
3743
3744 add = insn_start_frag->fr_fix - insn_start_off;
3745 for (fr = insn_start_frag->fr_next;
3746 fr && fr != frag_now; fr = fr->fr_next)
3747 add += fr->fr_fix;
3748 add += p - frag_now->fr_literal;
3749 }
3750
3751 if (flag_code != CODE_64BIT)
3752 reloc_type = BFD_RELOC_386_GOTPC;
3753 else
3754 reloc_type = BFD_RELOC_X86_64_GOTPC32;
3755 i.op[n].imms->X_add_number += add;
3756 }
3757 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
3758 i.op[n].imms, 0, reloc_type);
3759 }
3760 }
3761 }
3762 }
3763 \f
3764 #if (!defined (OBJ_ELF) && !defined (OBJ_MAYBE_ELF)) || defined (LEX_AT)
3765 # define lex_got(reloc, adjust, types) NULL
3766 #else
3767 /* Parse operands of the form
3768 <symbol>@GOTOFF+<nnn>
3769 and similar .plt or .got references.
3770
3771 If we find one, set up the correct relocation in RELOC and copy the
3772 input string, minus the `@GOTOFF' into a malloc'd buffer for
3773 parsing by the calling routine. Return this buffer, and if ADJUST
3774 is non-null set it to the length of the string we removed from the
3775 input line. Otherwise return NULL. */
3776 static char *
3777 lex_got (enum bfd_reloc_code_real *reloc,
3778 int *adjust,
3779 unsigned int *types)
3780 {
3781 static const char * const mode_name[NUM_FLAG_CODE] = { "32", "16", "64" };
3782 static const struct {
3783 const char *str;
3784 const enum bfd_reloc_code_real rel[NUM_FLAG_CODE];
3785 const unsigned int types64;
3786 } gotrel[] = {
3787 { "PLT", { BFD_RELOC_386_PLT32, 0, BFD_RELOC_X86_64_PLT32 }, Imm32|Imm32S|Disp32 },
3788 { "GOTOFF", { BFD_RELOC_386_GOTOFF, 0, BFD_RELOC_X86_64_GOTOFF64 }, Imm64|Disp64 },
3789 { "GOTPCREL", { 0, 0, BFD_RELOC_X86_64_GOTPCREL }, Imm32|Imm32S|Disp32 },
3790 { "TLSGD", { BFD_RELOC_386_TLS_GD, 0, BFD_RELOC_X86_64_TLSGD }, Imm32|Imm32S|Disp32 },
3791 { "TLSLDM", { BFD_RELOC_386_TLS_LDM, 0, 0 }, 0 },
3792 { "TLSLD", { 0, 0, BFD_RELOC_X86_64_TLSLD }, Imm32|Imm32S|Disp32 },
3793 { "GOTTPOFF", { BFD_RELOC_386_TLS_IE_32, 0, BFD_RELOC_X86_64_GOTTPOFF }, Imm32|Imm32S|Disp32 },
3794 { "TPOFF", { BFD_RELOC_386_TLS_LE_32, 0, BFD_RELOC_X86_64_TPOFF32 }, Imm32|Imm32S|Imm64|Disp32|Disp64 },
3795 { "NTPOFF", { BFD_RELOC_386_TLS_LE, 0, 0 }, 0 },
3796 { "DTPOFF", { BFD_RELOC_386_TLS_LDO_32, 0, BFD_RELOC_X86_64_DTPOFF32 }, Imm32|Imm32S|Imm64|Disp32|Disp64 },
3797 { "GOTNTPOFF",{ BFD_RELOC_386_TLS_GOTIE, 0, 0 }, 0 },
3798 { "INDNTPOFF",{ BFD_RELOC_386_TLS_IE, 0, 0 }, 0 },
3799 { "GOT", { BFD_RELOC_386_GOT32, 0, 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[(unsigned int) flag_code] != 0)
3819 {
3820 int first, second;
3821 char *tmpbuf, *past_reloc;
3822
3823 *reloc = gotrel[j].rel[(unsigned int) flag_code];
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 in %s bit mode"),
3863 gotrel[j].str, mode_name[(unsigned int) flag_code]);
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 || (flag_code == CODE_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 use_rela_relocations = 1;
5323 return flag_code == CODE_64BIT ? "elf64-x86-64" : ELF_TARGET_FORMAT;
5324 }
5325 #endif
5326 default:
5327 abort ();
5328 return NULL;
5329 }
5330 }
5331
5332 #endif /* OBJ_MAYBE_ more than one */
5333
5334 #if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
5335 void i386_elf_emit_arch_note ()
5336 {
5337 if (IS_ELF && cpu_arch_name != NULL)
5338 {
5339 char *p;
5340 asection *seg = now_seg;
5341 subsegT subseg = now_subseg;
5342 Elf_Internal_Note i_note;
5343 Elf_External_Note e_note;
5344 asection *note_secp;
5345 int len;
5346
5347 /* Create the .note section. */
5348 note_secp = subseg_new (".note", 0);
5349 bfd_set_section_flags (stdoutput,
5350 note_secp,
5351 SEC_HAS_CONTENTS | SEC_READONLY);
5352
5353 /* Process the arch string. */
5354 len = strlen (cpu_arch_name);
5355
5356 i_note.namesz = len + 1;
5357 i_note.descsz = 0;
5358 i_note.type = NT_ARCH;
5359 p = frag_more (sizeof (e_note.namesz));
5360 md_number_to_chars (p, (valueT) i_note.namesz, sizeof (e_note.namesz));
5361 p = frag_more (sizeof (e_note.descsz));
5362 md_number_to_chars (p, (valueT) i_note.descsz, sizeof (e_note.descsz));
5363 p = frag_more (sizeof (e_note.type));
5364 md_number_to_chars (p, (valueT) i_note.type, sizeof (e_note.type));
5365 p = frag_more (len + 1);
5366 strcpy (p, cpu_arch_name);
5367
5368 frag_align (2, 0, 0);
5369
5370 subseg_set (seg, subseg);
5371 }
5372 }
5373 #endif
5374 \f
5375 symbolS *
5376 md_undefined_symbol (name)
5377 char *name;
5378 {
5379 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
5380 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
5381 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
5382 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
5383 {
5384 if (!GOT_symbol)
5385 {
5386 if (symbol_find (name))
5387 as_bad (_("GOT already in symbol table"));
5388 GOT_symbol = symbol_new (name, undefined_section,
5389 (valueT) 0, &zero_address_frag);
5390 };
5391 return GOT_symbol;
5392 }
5393 return 0;
5394 }
5395
5396 /* Round up a section size to the appropriate boundary. */
5397
5398 valueT
5399 md_section_align (segment, size)
5400 segT segment ATTRIBUTE_UNUSED;
5401 valueT size;
5402 {
5403 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
5404 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
5405 {
5406 /* For a.out, force the section size to be aligned. If we don't do
5407 this, BFD will align it for us, but it will not write out the
5408 final bytes of the section. This may be a bug in BFD, but it is
5409 easier to fix it here since that is how the other a.out targets
5410 work. */
5411 int align;
5412
5413 align = bfd_get_section_alignment (stdoutput, segment);
5414 size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
5415 }
5416 #endif
5417
5418 return size;
5419 }
5420
5421 /* On the i386, PC-relative offsets are relative to the start of the
5422 next instruction. That is, the address of the offset, plus its
5423 size, since the offset is always the last part of the insn. */
5424
5425 long
5426 md_pcrel_from (fixP)
5427 fixS *fixP;
5428 {
5429 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
5430 }
5431
5432 #ifndef I386COFF
5433
5434 static void
5435 s_bss (ignore)
5436 int ignore ATTRIBUTE_UNUSED;
5437 {
5438 int temp;
5439
5440 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
5441 if (IS_ELF)
5442 obj_elf_section_change_hook ();
5443 #endif
5444 temp = get_absolute_expression ();
5445 subseg_set (bss_section, (subsegT) temp);
5446 demand_empty_rest_of_line ();
5447 }
5448
5449 #endif
5450
5451 void
5452 i386_validate_fix (fixp)
5453 fixS *fixp;
5454 {
5455 if (fixp->fx_subsy && fixp->fx_subsy == GOT_symbol)
5456 {
5457 if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
5458 {
5459 if (flag_code != CODE_64BIT)
5460 abort ();
5461 fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
5462 }
5463 else
5464 {
5465 if (flag_code != CODE_64BIT)
5466 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
5467 else
5468 fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
5469 }
5470 fixp->fx_subsy = 0;
5471 }
5472 }
5473
5474 arelent *
5475 tc_gen_reloc (section, fixp)
5476 asection *section ATTRIBUTE_UNUSED;
5477 fixS *fixp;
5478 {
5479 arelent *rel;
5480 bfd_reloc_code_real_type code;
5481
5482 switch (fixp->fx_r_type)
5483 {
5484 case BFD_RELOC_X86_64_PLT32:
5485 case BFD_RELOC_X86_64_GOT32:
5486 case BFD_RELOC_X86_64_GOTPCREL:
5487 case BFD_RELOC_386_PLT32:
5488 case BFD_RELOC_386_GOT32:
5489 case BFD_RELOC_386_GOTOFF:
5490 case BFD_RELOC_386_GOTPC:
5491 case BFD_RELOC_386_TLS_GD:
5492 case BFD_RELOC_386_TLS_LDM:
5493 case BFD_RELOC_386_TLS_LDO_32:
5494 case BFD_RELOC_386_TLS_IE_32:
5495 case BFD_RELOC_386_TLS_IE:
5496 case BFD_RELOC_386_TLS_GOTIE:
5497 case BFD_RELOC_386_TLS_LE_32:
5498 case BFD_RELOC_386_TLS_LE:
5499 case BFD_RELOC_X86_64_TLSGD:
5500 case BFD_RELOC_X86_64_TLSLD:
5501 case BFD_RELOC_X86_64_DTPOFF32:
5502 case BFD_RELOC_X86_64_DTPOFF64:
5503 case BFD_RELOC_X86_64_GOTTPOFF:
5504 case BFD_RELOC_X86_64_TPOFF32:
5505 case BFD_RELOC_X86_64_TPOFF64:
5506 case BFD_RELOC_X86_64_GOTOFF64:
5507 case BFD_RELOC_X86_64_GOTPC32:
5508 case BFD_RELOC_RVA:
5509 case BFD_RELOC_VTABLE_ENTRY:
5510 case BFD_RELOC_VTABLE_INHERIT:
5511 #ifdef TE_PE
5512 case BFD_RELOC_32_SECREL:
5513 #endif
5514 code = fixp->fx_r_type;
5515 break;
5516 case BFD_RELOC_X86_64_32S:
5517 if (!fixp->fx_pcrel)
5518 {
5519 /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32. */
5520 code = fixp->fx_r_type;
5521 break;
5522 }
5523 default:
5524 if (fixp->fx_pcrel)
5525 {
5526 switch (fixp->fx_size)
5527 {
5528 default:
5529 as_bad_where (fixp->fx_file, fixp->fx_line,
5530 _("can not do %d byte pc-relative relocation"),
5531 fixp->fx_size);
5532 code = BFD_RELOC_32_PCREL;
5533 break;
5534 case 1: code = BFD_RELOC_8_PCREL; break;
5535 case 2: code = BFD_RELOC_16_PCREL; break;
5536 case 4: code = BFD_RELOC_32_PCREL; break;
5537 #ifdef BFD64
5538 case 8: code = BFD_RELOC_64_PCREL; break;
5539 #endif
5540 }
5541 }
5542 else
5543 {
5544 switch (fixp->fx_size)
5545 {
5546 default:
5547 as_bad_where (fixp->fx_file, fixp->fx_line,
5548 _("can not do %d byte relocation"),
5549 fixp->fx_size);
5550 code = BFD_RELOC_32;
5551 break;
5552 case 1: code = BFD_RELOC_8; break;
5553 case 2: code = BFD_RELOC_16; break;
5554 case 4: code = BFD_RELOC_32; break;
5555 #ifdef BFD64
5556 case 8: code = BFD_RELOC_64; break;
5557 #endif
5558 }
5559 }
5560 break;
5561 }
5562
5563 if ((code == BFD_RELOC_32 || code == BFD_RELOC_32_PCREL)
5564 && GOT_symbol
5565 && fixp->fx_addsy == GOT_symbol)
5566 {
5567 if (flag_code != CODE_64BIT)
5568 code = BFD_RELOC_386_GOTPC;
5569 else
5570 code = BFD_RELOC_X86_64_GOTPC32;
5571 }
5572
5573 rel = (arelent *) xmalloc (sizeof (arelent));
5574 rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
5575 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
5576
5577 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
5578
5579 if (!use_rela_relocations)
5580 {
5581 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
5582 vtable entry to be used in the relocation's section offset. */
5583 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
5584 rel->address = fixp->fx_offset;
5585
5586 rel->addend = 0;
5587 }
5588 /* Use the rela in 64bit mode. */
5589 else
5590 {
5591 if (!fixp->fx_pcrel)
5592 rel->addend = fixp->fx_offset;
5593 else
5594 switch (code)
5595 {
5596 case BFD_RELOC_X86_64_PLT32:
5597 case BFD_RELOC_X86_64_GOT32:
5598 case BFD_RELOC_X86_64_GOTPCREL:
5599 case BFD_RELOC_X86_64_TLSGD:
5600 case BFD_RELOC_X86_64_TLSLD:
5601 case BFD_RELOC_X86_64_GOTTPOFF:
5602 rel->addend = fixp->fx_offset - fixp->fx_size;
5603 break;
5604 default:
5605 rel->addend = (section->vma
5606 - fixp->fx_size
5607 + fixp->fx_addnumber
5608 + md_pcrel_from (fixp));
5609 break;
5610 }
5611 }
5612
5613 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
5614 if (rel->howto == NULL)
5615 {
5616 as_bad_where (fixp->fx_file, fixp->fx_line,
5617 _("cannot represent relocation type %s"),
5618 bfd_get_reloc_code_name (code));
5619 /* Set howto to a garbage value so that we can keep going. */
5620 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
5621 assert (rel->howto != NULL);
5622 }
5623
5624 return rel;
5625 }
5626
5627 \f
5628 /* Parse operands using Intel syntax. This implements a recursive descent
5629 parser based on the BNF grammar published in Appendix B of the MASM 6.1
5630 Programmer's Guide.
5631
5632 FIXME: We do not recognize the full operand grammar defined in the MASM
5633 documentation. In particular, all the structure/union and
5634 high-level macro operands are missing.
5635
5636 Uppercase words are terminals, lower case words are non-terminals.
5637 Objects surrounded by double brackets '[[' ']]' are optional. Vertical
5638 bars '|' denote choices. Most grammar productions are implemented in
5639 functions called 'intel_<production>'.
5640
5641 Initial production is 'expr'.
5642
5643 addOp + | -
5644
5645 alpha [a-zA-Z]
5646
5647 binOp & | AND | \| | OR | ^ | XOR
5648
5649 byteRegister AL | AH | BL | BH | CL | CH | DL | DH
5650
5651 constant digits [[ radixOverride ]]
5652
5653 dataType BYTE | WORD | DWORD | FWORD | QWORD | TBYTE | OWORD | XMMWORD
5654
5655 digits decdigit
5656 | digits decdigit
5657 | digits hexdigit
5658
5659 decdigit [0-9]
5660
5661 e04 e04 addOp e05
5662 | e05
5663
5664 e05 e05 binOp e06
5665 | e06
5666
5667 e06 e06 mulOp e09
5668 | e09
5669
5670 e09 OFFSET e10
5671 | SHORT e10
5672 | + e10
5673 | - e10
5674 | ~ e10
5675 | NOT e10
5676 | e09 PTR e10
5677 | e09 : e10
5678 | e10
5679
5680 e10 e10 [ expr ]
5681 | e11
5682
5683 e11 ( expr )
5684 | [ expr ]
5685 | constant
5686 | dataType
5687 | id
5688 | $
5689 | register
5690
5691 => expr expr cmpOp e04
5692 | e04
5693
5694 gpRegister AX | EAX | BX | EBX | CX | ECX | DX | EDX
5695 | BP | EBP | SP | ESP | DI | EDI | SI | ESI
5696
5697 hexdigit a | b | c | d | e | f
5698 | A | B | C | D | E | F
5699
5700 id alpha
5701 | id alpha
5702 | id decdigit
5703
5704 mulOp * | / | % | MOD | << | SHL | >> | SHR
5705
5706 quote " | '
5707
5708 register specialRegister
5709 | gpRegister
5710 | byteRegister
5711
5712 segmentRegister CS | DS | ES | FS | GS | SS
5713
5714 specialRegister CR0 | CR2 | CR3 | CR4
5715 | DR0 | DR1 | DR2 | DR3 | DR6 | DR7
5716 | TR3 | TR4 | TR5 | TR6 | TR7
5717
5718 We simplify the grammar in obvious places (e.g., register parsing is
5719 done by calling parse_register) and eliminate immediate left recursion
5720 to implement a recursive-descent parser.
5721
5722 expr e04 expr'
5723
5724 expr' cmpOp e04 expr'
5725 | Empty
5726
5727 e04 e05 e04'
5728
5729 e04' addOp e05 e04'
5730 | Empty
5731
5732 e05 e06 e05'
5733
5734 e05' binOp e06 e05'
5735 | Empty
5736
5737 e06 e09 e06'
5738
5739 e06' mulOp e09 e06'
5740 | Empty
5741
5742 e09 OFFSET e10 e09'
5743 | SHORT e10'
5744 | + e10'
5745 | - e10'
5746 | ~ e10'
5747 | NOT e10'
5748 | e10 e09'
5749
5750 e09' PTR e10 e09'
5751 | : e10 e09'
5752 | Empty
5753
5754 e10 e11 e10'
5755
5756 e10' [ expr ] e10'
5757 | Empty
5758
5759 e11 ( expr )
5760 | [ expr ]
5761 | BYTE
5762 | WORD
5763 | DWORD
5764 | FWORD
5765 | QWORD
5766 | TBYTE
5767 | OWORD
5768 | XMMWORD
5769 | .
5770 | $
5771 | register
5772 | id
5773 | constant */
5774
5775 /* Parsing structure for the intel syntax parser. Used to implement the
5776 semantic actions for the operand grammar. */
5777 struct intel_parser_s
5778 {
5779 char *op_string; /* The string being parsed. */
5780 int got_a_float; /* Whether the operand is a float. */
5781 int op_modifier; /* Operand modifier. */
5782 int is_mem; /* 1 if operand is memory reference. */
5783 int in_offset; /* >=1 if parsing operand of offset. */
5784 int in_bracket; /* >=1 if parsing operand in brackets. */
5785 const reg_entry *reg; /* Last register reference found. */
5786 char *disp; /* Displacement string being built. */
5787 char *next_operand; /* Resume point when splitting operands. */
5788 };
5789
5790 static struct intel_parser_s intel_parser;
5791
5792 /* Token structure for parsing intel syntax. */
5793 struct intel_token
5794 {
5795 int code; /* Token code. */
5796 const reg_entry *reg; /* Register entry for register tokens. */
5797 char *str; /* String representation. */
5798 };
5799
5800 static struct intel_token cur_token, prev_token;
5801
5802 /* Token codes for the intel parser. Since T_SHORT is already used
5803 by COFF, undefine it first to prevent a warning. */
5804 #define T_NIL -1
5805 #define T_CONST 1
5806 #define T_REG 2
5807 #define T_BYTE 3
5808 #define T_WORD 4
5809 #define T_DWORD 5
5810 #define T_FWORD 6
5811 #define T_QWORD 7
5812 #define T_TBYTE 8
5813 #define T_XMMWORD 9
5814 #undef T_SHORT
5815 #define T_SHORT 10
5816 #define T_OFFSET 11
5817 #define T_PTR 12
5818 #define T_ID 13
5819 #define T_SHL 14
5820 #define T_SHR 15
5821
5822 /* Prototypes for intel parser functions. */
5823 static int intel_match_token PARAMS ((int code));
5824 static void intel_get_token PARAMS ((void));
5825 static void intel_putback_token PARAMS ((void));
5826 static int intel_expr PARAMS ((void));
5827 static int intel_e04 PARAMS ((void));
5828 static int intel_e05 PARAMS ((void));
5829 static int intel_e06 PARAMS ((void));
5830 static int intel_e09 PARAMS ((void));
5831 static int intel_bracket_expr PARAMS ((void));
5832 static int intel_e10 PARAMS ((void));
5833 static int intel_e11 PARAMS ((void));
5834
5835 static int
5836 i386_intel_operand (operand_string, got_a_float)
5837 char *operand_string;
5838 int got_a_float;
5839 {
5840 int ret;
5841 char *p;
5842
5843 p = intel_parser.op_string = xstrdup (operand_string);
5844 intel_parser.disp = (char *) xmalloc (strlen (operand_string) + 1);
5845
5846 for (;;)
5847 {
5848 /* Initialize token holders. */
5849 cur_token.code = prev_token.code = T_NIL;
5850 cur_token.reg = prev_token.reg = NULL;
5851 cur_token.str = prev_token.str = NULL;
5852
5853 /* Initialize parser structure. */
5854 intel_parser.got_a_float = got_a_float;
5855 intel_parser.op_modifier = 0;
5856 intel_parser.is_mem = 0;
5857 intel_parser.in_offset = 0;
5858 intel_parser.in_bracket = 0;
5859 intel_parser.reg = NULL;
5860 intel_parser.disp[0] = '\0';
5861 intel_parser.next_operand = NULL;
5862
5863 /* Read the first token and start the parser. */
5864 intel_get_token ();
5865 ret = intel_expr ();
5866
5867 if (!ret)
5868 break;
5869
5870 if (cur_token.code != T_NIL)
5871 {
5872 as_bad (_("invalid operand for '%s' ('%s' unexpected)"),
5873 current_templates->start->name, cur_token.str);
5874 ret = 0;
5875 }
5876 /* If we found a memory reference, hand it over to i386_displacement
5877 to fill in the rest of the operand fields. */
5878 else if (intel_parser.is_mem)
5879 {
5880 if ((i.mem_operands == 1
5881 && (current_templates->start->opcode_modifier & IsString) == 0)
5882 || i.mem_operands == 2)
5883 {
5884 as_bad (_("too many memory references for '%s'"),
5885 current_templates->start->name);
5886 ret = 0;
5887 }
5888 else
5889 {
5890 char *s = intel_parser.disp;
5891 i.mem_operands++;
5892
5893 if (!quiet_warnings && intel_parser.is_mem < 0)
5894 /* See the comments in intel_bracket_expr. */
5895 as_warn (_("Treating `%s' as memory reference"), operand_string);
5896
5897 /* Add the displacement expression. */
5898 if (*s != '\0')
5899 ret = i386_displacement (s, s + strlen (s));
5900 if (ret)
5901 {
5902 /* Swap base and index in 16-bit memory operands like
5903 [si+bx]. Since i386_index_check is also used in AT&T
5904 mode we have to do that here. */
5905 if (i.base_reg
5906 && i.index_reg
5907 && (i.base_reg->reg_type & Reg16)
5908 && (i.index_reg->reg_type & Reg16)
5909 && i.base_reg->reg_num >= 6
5910 && i.index_reg->reg_num < 6)
5911 {
5912 const reg_entry *base = i.index_reg;
5913
5914 i.index_reg = i.base_reg;
5915 i.base_reg = base;
5916 }
5917 ret = i386_index_check (operand_string);
5918 }
5919 }
5920 }
5921
5922 /* Constant and OFFSET expressions are handled by i386_immediate. */
5923 else if ((intel_parser.op_modifier & (1 << T_OFFSET))
5924 || intel_parser.reg == NULL)
5925 ret = i386_immediate (intel_parser.disp);
5926
5927 if (intel_parser.next_operand && this_operand >= MAX_OPERANDS - 1)
5928 ret = 0;
5929 if (!ret || !intel_parser.next_operand)
5930 break;
5931 intel_parser.op_string = intel_parser.next_operand;
5932 this_operand = i.operands++;
5933 }
5934
5935 free (p);
5936 free (intel_parser.disp);
5937
5938 return ret;
5939 }
5940
5941 #define NUM_ADDRESS_REGS (!!i.base_reg + !!i.index_reg)
5942
5943 /* expr e04 expr'
5944
5945 expr' cmpOp e04 expr'
5946 | Empty */
5947 static int
5948 intel_expr ()
5949 {
5950 /* XXX Implement the comparison operators. */
5951 return intel_e04 ();
5952 }
5953
5954 /* e04 e05 e04'
5955
5956 e04' addOp e05 e04'
5957 | Empty */
5958 static int
5959 intel_e04 ()
5960 {
5961 int nregs = -1;
5962
5963 for (;;)
5964 {
5965 if (!intel_e05())
5966 return 0;
5967
5968 if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
5969 i.base_reg = i386_regtab + REGNAM_AL; /* al is invalid as base */
5970
5971 if (cur_token.code == '+')
5972 nregs = -1;
5973 else if (cur_token.code == '-')
5974 nregs = NUM_ADDRESS_REGS;
5975 else
5976 return 1;
5977
5978 strcat (intel_parser.disp, cur_token.str);
5979 intel_match_token (cur_token.code);
5980 }
5981 }
5982
5983 /* e05 e06 e05'
5984
5985 e05' binOp e06 e05'
5986 | Empty */
5987 static int
5988 intel_e05 ()
5989 {
5990 int nregs = ~NUM_ADDRESS_REGS;
5991
5992 for (;;)
5993 {
5994 if (!intel_e06())
5995 return 0;
5996
5997 if (cur_token.code == '&' || cur_token.code == '|' || cur_token.code == '^')
5998 {
5999 char str[2];
6000
6001 str[0] = cur_token.code;
6002 str[1] = 0;
6003 strcat (intel_parser.disp, str);
6004 }
6005 else
6006 break;
6007
6008 intel_match_token (cur_token.code);
6009
6010 if (nregs < 0)
6011 nregs = ~nregs;
6012 }
6013 if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
6014 i.base_reg = i386_regtab + REGNAM_AL + 1; /* cl is invalid as base */
6015 return 1;
6016 }
6017
6018 /* e06 e09 e06'
6019
6020 e06' mulOp e09 e06'
6021 | Empty */
6022 static int
6023 intel_e06 ()
6024 {
6025 int nregs = ~NUM_ADDRESS_REGS;
6026
6027 for (;;)
6028 {
6029 if (!intel_e09())
6030 return 0;
6031
6032 if (cur_token.code == '*' || cur_token.code == '/' || cur_token.code == '%')
6033 {
6034 char str[2];
6035
6036 str[0] = cur_token.code;
6037 str[1] = 0;
6038 strcat (intel_parser.disp, str);
6039 }
6040 else if (cur_token.code == T_SHL)
6041 strcat (intel_parser.disp, "<<");
6042 else if (cur_token.code == T_SHR)
6043 strcat (intel_parser.disp, ">>");
6044 else
6045 break;
6046
6047 intel_match_token (cur_token.code);
6048
6049 if (nregs < 0)
6050 nregs = ~nregs;
6051 }
6052 if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
6053 i.base_reg = i386_regtab + REGNAM_AL + 2; /* dl is invalid as base */
6054 return 1;
6055 }
6056
6057 /* e09 OFFSET e09
6058 | SHORT e09
6059 | + e09
6060 | - e09
6061 | ~ e09
6062 | NOT e09
6063 | e10 e09'
6064
6065 e09' PTR e10 e09'
6066 | : e10 e09'
6067 | Empty */
6068 static int
6069 intel_e09 ()
6070 {
6071 int nregs = ~NUM_ADDRESS_REGS;
6072 int in_offset = 0;
6073
6074 for (;;)
6075 {
6076 /* Don't consume constants here. */
6077 if (cur_token.code == '+' || cur_token.code == '-')
6078 {
6079 /* Need to look one token ahead - if the next token
6080 is a constant, the current token is its sign. */
6081 int next_code;
6082
6083 intel_match_token (cur_token.code);
6084 next_code = cur_token.code;
6085 intel_putback_token ();
6086 if (next_code == T_CONST)
6087 break;
6088 }
6089
6090 /* e09 OFFSET e09 */
6091 if (cur_token.code == T_OFFSET)
6092 {
6093 if (!in_offset++)
6094 ++intel_parser.in_offset;
6095 }
6096
6097 /* e09 SHORT e09 */
6098 else if (cur_token.code == T_SHORT)
6099 intel_parser.op_modifier |= 1 << T_SHORT;
6100
6101 /* e09 + e09 */
6102 else if (cur_token.code == '+')
6103 strcat (intel_parser.disp, "+");
6104
6105 /* e09 - e09
6106 | ~ e09
6107 | NOT e09 */
6108 else if (cur_token.code == '-' || cur_token.code == '~')
6109 {
6110 char str[2];
6111
6112 if (nregs < 0)
6113 nregs = ~nregs;
6114 str[0] = cur_token.code;
6115 str[1] = 0;
6116 strcat (intel_parser.disp, str);
6117 }
6118
6119 /* e09 e10 e09' */
6120 else
6121 break;
6122
6123 intel_match_token (cur_token.code);
6124 }
6125
6126 for (;;)
6127 {
6128 if (!intel_e10 ())
6129 return 0;
6130
6131 /* e09' PTR e10 e09' */
6132 if (cur_token.code == T_PTR)
6133 {
6134 char suffix;
6135
6136 if (prev_token.code == T_BYTE)
6137 suffix = BYTE_MNEM_SUFFIX;
6138
6139 else if (prev_token.code == T_WORD)
6140 {
6141 if (current_templates->start->name[0] == 'l'
6142 && current_templates->start->name[2] == 's'
6143 && current_templates->start->name[3] == 0)
6144 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
6145 else if (intel_parser.got_a_float == 2) /* "fi..." */
6146 suffix = SHORT_MNEM_SUFFIX;
6147 else
6148 suffix = WORD_MNEM_SUFFIX;
6149 }
6150
6151 else if (prev_token.code == T_DWORD)
6152 {
6153 if (current_templates->start->name[0] == 'l'
6154 && current_templates->start->name[2] == 's'
6155 && current_templates->start->name[3] == 0)
6156 suffix = WORD_MNEM_SUFFIX;
6157 else if (flag_code == CODE_16BIT
6158 && (current_templates->start->opcode_modifier
6159 & (Jump|JumpDword|JumpInterSegment)))
6160 suffix = LONG_DOUBLE_MNEM_SUFFIX;
6161 else if (intel_parser.got_a_float == 1) /* "f..." */
6162 suffix = SHORT_MNEM_SUFFIX;
6163 else
6164 suffix = LONG_MNEM_SUFFIX;
6165 }
6166
6167 else if (prev_token.code == T_FWORD)
6168 {
6169 if (current_templates->start->name[0] == 'l'
6170 && current_templates->start->name[2] == 's'
6171 && current_templates->start->name[3] == 0)
6172 suffix = LONG_MNEM_SUFFIX;
6173 else if (!intel_parser.got_a_float)
6174 {
6175 if (flag_code == CODE_16BIT)
6176 add_prefix (DATA_PREFIX_OPCODE);
6177 suffix = LONG_DOUBLE_MNEM_SUFFIX;
6178 }
6179 else
6180 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
6181 }
6182
6183 else if (prev_token.code == T_QWORD)
6184 {
6185 if (intel_parser.got_a_float == 1) /* "f..." */
6186 suffix = LONG_MNEM_SUFFIX;
6187 else
6188 suffix = QWORD_MNEM_SUFFIX;
6189 }
6190
6191 else if (prev_token.code == T_TBYTE)
6192 {
6193 if (intel_parser.got_a_float == 1)
6194 suffix = LONG_DOUBLE_MNEM_SUFFIX;
6195 else
6196 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
6197 }
6198
6199 else if (prev_token.code == T_XMMWORD)
6200 {
6201 /* XXX ignored for now, but accepted since gcc uses it */
6202 suffix = 0;
6203 }
6204
6205 else
6206 {
6207 as_bad (_("Unknown operand modifier `%s'"), prev_token.str);
6208 return 0;
6209 }
6210
6211 if (current_templates->start->base_opcode == 0x8d /* lea */)
6212 ;
6213 else if (!i.suffix)
6214 i.suffix = suffix;
6215 else if (i.suffix != suffix)
6216 {
6217 as_bad (_("Conflicting operand modifiers"));
6218 return 0;
6219 }
6220
6221 }
6222
6223 /* e09' : e10 e09' */
6224 else if (cur_token.code == ':')
6225 {
6226 if (prev_token.code != T_REG)
6227 {
6228 /* While {call,jmp} SSSS:OOOO is MASM syntax only when SSSS is a
6229 segment/group identifier (which we don't have), using comma
6230 as the operand separator there is even less consistent, since
6231 there all branches only have a single operand. */
6232 if (this_operand != 0
6233 || intel_parser.in_offset
6234 || intel_parser.in_bracket
6235 || (!(current_templates->start->opcode_modifier
6236 & (Jump|JumpDword|JumpInterSegment))
6237 && !(current_templates->start->operand_types[0]
6238 & JumpAbsolute)))
6239 return intel_match_token (T_NIL);
6240 /* Remember the start of the 2nd operand and terminate 1st
6241 operand here.
6242 XXX This isn't right, yet (when SSSS:OOOO is right operand of
6243 another expression), but it gets at least the simplest case
6244 (a plain number or symbol on the left side) right. */
6245 intel_parser.next_operand = intel_parser.op_string;
6246 *--intel_parser.op_string = '\0';
6247 return intel_match_token (':');
6248 }
6249 }
6250
6251 /* e09' Empty */
6252 else
6253 break;
6254
6255 intel_match_token (cur_token.code);
6256
6257 }
6258
6259 if (in_offset)
6260 {
6261 --intel_parser.in_offset;
6262 if (nregs < 0)
6263 nregs = ~nregs;
6264 if (NUM_ADDRESS_REGS > nregs)
6265 {
6266 as_bad (_("Invalid operand to `OFFSET'"));
6267 return 0;
6268 }
6269 intel_parser.op_modifier |= 1 << T_OFFSET;
6270 }
6271
6272 if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
6273 i.base_reg = i386_regtab + REGNAM_AL + 3; /* bl is invalid as base */
6274 return 1;
6275 }
6276
6277 static int
6278 intel_bracket_expr ()
6279 {
6280 int was_offset = intel_parser.op_modifier & (1 << T_OFFSET);
6281 const char *start = intel_parser.op_string;
6282 int len;
6283
6284 if (i.op[this_operand].regs)
6285 return intel_match_token (T_NIL);
6286
6287 intel_match_token ('[');
6288
6289 /* Mark as a memory operand only if it's not already known to be an
6290 offset expression. If it's an offset expression, we need to keep
6291 the brace in. */
6292 if (!intel_parser.in_offset)
6293 {
6294 ++intel_parser.in_bracket;
6295 /* Unfortunately gas always diverged from MASM in a respect that can't
6296 be easily fixed without risking to break code sequences likely to be
6297 encountered (the testsuite even check for this): MASM doesn't consider
6298 an expression inside brackets unconditionally as a memory reference.
6299 When that is e.g. a constant, an offset expression, or the sum of the
6300 two, this is still taken as a constant load. gas, however, always
6301 treated these as memory references. As a compromise, we'll try to make
6302 offset expressions inside brackets work the MASM way (since that's
6303 less likely to be found in real world code), but make constants alone
6304 continue to work the traditional gas way. In either case, issue a
6305 warning. */
6306 intel_parser.op_modifier &= ~was_offset;
6307 }
6308 else
6309 strcat (intel_parser.disp, "[");
6310
6311 /* Add a '+' to the displacement string if necessary. */
6312 if (*intel_parser.disp != '\0'
6313 && *(intel_parser.disp + strlen (intel_parser.disp) - 1) != '+')
6314 strcat (intel_parser.disp, "+");
6315
6316 if (intel_expr ()
6317 && (len = intel_parser.op_string - start - 1,
6318 intel_match_token (']')))
6319 {
6320 /* Preserve brackets when the operand is an offset expression. */
6321 if (intel_parser.in_offset)
6322 strcat (intel_parser.disp, "]");
6323 else
6324 {
6325 --intel_parser.in_bracket;
6326 if (i.base_reg || i.index_reg)
6327 intel_parser.is_mem = 1;
6328 if (!intel_parser.is_mem)
6329 {
6330 if (!(intel_parser.op_modifier & (1 << T_OFFSET)))
6331 /* Defer the warning until all of the operand was parsed. */
6332 intel_parser.is_mem = -1;
6333 else if (!quiet_warnings)
6334 as_warn (_("`[%.*s]' taken to mean just `%.*s'"), len, start, len, start);
6335 }
6336 }
6337 intel_parser.op_modifier |= was_offset;
6338
6339 return 1;
6340 }
6341 return 0;
6342 }
6343
6344 /* e10 e11 e10'
6345
6346 e10' [ expr ] e10'
6347 | Empty */
6348 static int
6349 intel_e10 ()
6350 {
6351 if (!intel_e11 ())
6352 return 0;
6353
6354 while (cur_token.code == '[')
6355 {
6356 if (!intel_bracket_expr ())
6357 return 0;
6358 }
6359
6360 return 1;
6361 }
6362
6363 /* e11 ( expr )
6364 | [ expr ]
6365 | BYTE
6366 | WORD
6367 | DWORD
6368 | FWORD
6369 | QWORD
6370 | TBYTE
6371 | OWORD
6372 | XMMWORD
6373 | $
6374 | .
6375 | register
6376 | id
6377 | constant */
6378 static int
6379 intel_e11 ()
6380 {
6381 switch (cur_token.code)
6382 {
6383 /* e11 ( expr ) */
6384 case '(':
6385 intel_match_token ('(');
6386 strcat (intel_parser.disp, "(");
6387
6388 if (intel_expr () && intel_match_token (')'))
6389 {
6390 strcat (intel_parser.disp, ")");
6391 return 1;
6392 }
6393 return 0;
6394
6395 /* e11 [ expr ] */
6396 case '[':
6397 /* Operands for jump/call inside brackets denote absolute addresses.
6398 XXX This shouldn't be needed anymore (or if it should rather live
6399 in intel_bracket_expr). */
6400 if (current_templates->start->opcode_modifier
6401 & (Jump|JumpDword|JumpByte|JumpInterSegment))
6402 i.types[this_operand] |= JumpAbsolute;
6403
6404 return intel_bracket_expr ();
6405
6406 /* e11 $
6407 | . */
6408 case '.':
6409 strcat (intel_parser.disp, cur_token.str);
6410 intel_match_token (cur_token.code);
6411
6412 /* Mark as a memory operand only if it's not already known to be an
6413 offset expression. */
6414 if (!intel_parser.in_offset)
6415 intel_parser.is_mem = 1;
6416
6417 return 1;
6418
6419 /* e11 register */
6420 case T_REG:
6421 {
6422 const reg_entry *reg = intel_parser.reg = cur_token.reg;
6423
6424 intel_match_token (T_REG);
6425
6426 /* Check for segment change. */
6427 if (cur_token.code == ':')
6428 {
6429 if (!(reg->reg_type & (SReg2 | SReg3)))
6430 {
6431 as_bad (_("`%s' is not a valid segment register"), reg->reg_name);
6432 return 0;
6433 }
6434 else if (i.seg[i.mem_operands])
6435 as_warn (_("Extra segment override ignored"));
6436 else
6437 {
6438 if (!intel_parser.in_offset)
6439 intel_parser.is_mem = 1;
6440 switch (reg->reg_num)
6441 {
6442 case 0:
6443 i.seg[i.mem_operands] = &es;
6444 break;
6445 case 1:
6446 i.seg[i.mem_operands] = &cs;
6447 break;
6448 case 2:
6449 i.seg[i.mem_operands] = &ss;
6450 break;
6451 case 3:
6452 i.seg[i.mem_operands] = &ds;
6453 break;
6454 case 4:
6455 i.seg[i.mem_operands] = &fs;
6456 break;
6457 case 5:
6458 i.seg[i.mem_operands] = &gs;
6459 break;
6460 }
6461 }
6462 }
6463
6464 /* Not a segment register. Check for register scaling. */
6465 else if (cur_token.code == '*')
6466 {
6467 if (!intel_parser.in_bracket)
6468 {
6469 as_bad (_("Register scaling only allowed in memory operands"));
6470 return 0;
6471 }
6472
6473 if (reg->reg_type & Reg16) /* Disallow things like [si*1]. */
6474 reg = i386_regtab + REGNAM_AX + 4; /* sp is invalid as index */
6475 else if (i.index_reg)
6476 reg = i386_regtab + REGNAM_EAX + 4; /* esp is invalid as index */
6477
6478 /* What follows must be a valid scale. */
6479 intel_match_token ('*');
6480 i.index_reg = reg;
6481 i.types[this_operand] |= BaseIndex;
6482
6483 /* Set the scale after setting the register (otherwise,
6484 i386_scale will complain) */
6485 if (cur_token.code == '+' || cur_token.code == '-')
6486 {
6487 char *str, sign = cur_token.code;
6488 intel_match_token (cur_token.code);
6489 if (cur_token.code != T_CONST)
6490 {
6491 as_bad (_("Syntax error: Expecting a constant, got `%s'"),
6492 cur_token.str);
6493 return 0;
6494 }
6495 str = (char *) xmalloc (strlen (cur_token.str) + 2);
6496 strcpy (str + 1, cur_token.str);
6497 *str = sign;
6498 if (!i386_scale (str))
6499 return 0;
6500 free (str);
6501 }
6502 else if (!i386_scale (cur_token.str))
6503 return 0;
6504 intel_match_token (cur_token.code);
6505 }
6506
6507 /* No scaling. If this is a memory operand, the register is either a
6508 base register (first occurrence) or an index register (second
6509 occurrence). */
6510 else if (intel_parser.in_bracket && !(reg->reg_type & (SReg2 | SReg3)))
6511 {
6512
6513 if (!i.base_reg)
6514 i.base_reg = reg;
6515 else if (!i.index_reg)
6516 i.index_reg = reg;
6517 else
6518 {
6519 as_bad (_("Too many register references in memory operand"));
6520 return 0;
6521 }
6522
6523 i.types[this_operand] |= BaseIndex;
6524 }
6525
6526 /* Offset modifier. Add the register to the displacement string to be
6527 parsed as an immediate expression after we're done. */
6528 else if (intel_parser.in_offset)
6529 {
6530 as_warn (_("Using register names in OFFSET expressions is deprecated"));
6531 strcat (intel_parser.disp, reg->reg_name);
6532 }
6533
6534 /* It's neither base nor index nor offset. */
6535 else if (!intel_parser.is_mem)
6536 {
6537 i.types[this_operand] |= reg->reg_type & ~BaseIndex;
6538 i.op[this_operand].regs = reg;
6539 i.reg_operands++;
6540 }
6541 else
6542 {
6543 as_bad (_("Invalid use of register"));
6544 return 0;
6545 }
6546
6547 /* Since registers are not part of the displacement string (except
6548 when we're parsing offset operands), we may need to remove any
6549 preceding '+' from the displacement string. */
6550 if (*intel_parser.disp != '\0'
6551 && !intel_parser.in_offset)
6552 {
6553 char *s = intel_parser.disp;
6554 s += strlen (s) - 1;
6555 if (*s == '+')
6556 *s = '\0';
6557 }
6558
6559 return 1;
6560 }
6561
6562 /* e11 BYTE
6563 | WORD
6564 | DWORD
6565 | FWORD
6566 | QWORD
6567 | TBYTE
6568 | OWORD
6569 | XMMWORD */
6570 case T_BYTE:
6571 case T_WORD:
6572 case T_DWORD:
6573 case T_FWORD:
6574 case T_QWORD:
6575 case T_TBYTE:
6576 case T_XMMWORD:
6577 intel_match_token (cur_token.code);
6578
6579 if (cur_token.code == T_PTR)
6580 return 1;
6581
6582 /* It must have been an identifier. */
6583 intel_putback_token ();
6584 cur_token.code = T_ID;
6585 /* FALLTHRU */
6586
6587 /* e11 id
6588 | constant */
6589 case T_ID:
6590 if (!intel_parser.in_offset && intel_parser.is_mem <= 0)
6591 {
6592 symbolS *symbolP;
6593
6594 /* The identifier represents a memory reference only if it's not
6595 preceded by an offset modifier and if it's not an equate. */
6596 symbolP = symbol_find(cur_token.str);
6597 if (!symbolP || S_GET_SEGMENT(symbolP) != absolute_section)
6598 intel_parser.is_mem = 1;
6599 }
6600 /* FALLTHRU */
6601
6602 case T_CONST:
6603 case '-':
6604 case '+':
6605 {
6606 char *save_str, sign = 0;
6607
6608 /* Allow constants that start with `+' or `-'. */
6609 if (cur_token.code == '-' || cur_token.code == '+')
6610 {
6611 sign = cur_token.code;
6612 intel_match_token (cur_token.code);
6613 if (cur_token.code != T_CONST)
6614 {
6615 as_bad (_("Syntax error: Expecting a constant, got `%s'"),
6616 cur_token.str);
6617 return 0;
6618 }
6619 }
6620
6621 save_str = (char *) xmalloc (strlen (cur_token.str) + 2);
6622 strcpy (save_str + !!sign, cur_token.str);
6623 if (sign)
6624 *save_str = sign;
6625
6626 /* Get the next token to check for register scaling. */
6627 intel_match_token (cur_token.code);
6628
6629 /* Check if this constant is a scaling factor for an index register. */
6630 if (cur_token.code == '*')
6631 {
6632 if (intel_match_token ('*') && cur_token.code == T_REG)
6633 {
6634 const reg_entry *reg = cur_token.reg;
6635
6636 if (!intel_parser.in_bracket)
6637 {
6638 as_bad (_("Register scaling only allowed in memory operands"));
6639 return 0;
6640 }
6641
6642 if (reg->reg_type & Reg16) /* Disallow things like [1*si]. */
6643 reg = i386_regtab + REGNAM_AX + 4; /* sp is invalid as index */
6644 else if (i.index_reg)
6645 reg = i386_regtab + REGNAM_EAX + 4; /* esp is invalid as index */
6646
6647 /* The constant is followed by `* reg', so it must be
6648 a valid scale. */
6649 i.index_reg = reg;
6650 i.types[this_operand] |= BaseIndex;
6651
6652 /* Set the scale after setting the register (otherwise,
6653 i386_scale will complain) */
6654 if (!i386_scale (save_str))
6655 return 0;
6656 intel_match_token (T_REG);
6657
6658 /* Since registers are not part of the displacement
6659 string, we may need to remove any preceding '+' from
6660 the displacement string. */
6661 if (*intel_parser.disp != '\0')
6662 {
6663 char *s = intel_parser.disp;
6664 s += strlen (s) - 1;
6665 if (*s == '+')
6666 *s = '\0';
6667 }
6668
6669 free (save_str);
6670
6671 return 1;
6672 }
6673
6674 /* The constant was not used for register scaling. Since we have
6675 already consumed the token following `*' we now need to put it
6676 back in the stream. */
6677 intel_putback_token ();
6678 }
6679
6680 /* Add the constant to the displacement string. */
6681 strcat (intel_parser.disp, save_str);
6682 free (save_str);
6683
6684 return 1;
6685 }
6686 }
6687
6688 as_bad (_("Unrecognized token '%s'"), cur_token.str);
6689 return 0;
6690 }
6691
6692 /* Match the given token against cur_token. If they match, read the next
6693 token from the operand string. */
6694 static int
6695 intel_match_token (code)
6696 int code;
6697 {
6698 if (cur_token.code == code)
6699 {
6700 intel_get_token ();
6701 return 1;
6702 }
6703 else
6704 {
6705 as_bad (_("Unexpected token `%s'"), cur_token.str);
6706 return 0;
6707 }
6708 }
6709
6710 /* Read a new token from intel_parser.op_string and store it in cur_token. */
6711 static void
6712 intel_get_token ()
6713 {
6714 char *end_op;
6715 const reg_entry *reg;
6716 struct intel_token new_token;
6717
6718 new_token.code = T_NIL;
6719 new_token.reg = NULL;
6720 new_token.str = NULL;
6721
6722 /* Free the memory allocated to the previous token and move
6723 cur_token to prev_token. */
6724 if (prev_token.str)
6725 free (prev_token.str);
6726
6727 prev_token = cur_token;
6728
6729 /* Skip whitespace. */
6730 while (is_space_char (*intel_parser.op_string))
6731 intel_parser.op_string++;
6732
6733 /* Return an empty token if we find nothing else on the line. */
6734 if (*intel_parser.op_string == '\0')
6735 {
6736 cur_token = new_token;
6737 return;
6738 }
6739
6740 /* The new token cannot be larger than the remainder of the operand
6741 string. */
6742 new_token.str = (char *) xmalloc (strlen (intel_parser.op_string) + 1);
6743 new_token.str[0] = '\0';
6744
6745 if (strchr ("0123456789", *intel_parser.op_string))
6746 {
6747 char *p = new_token.str;
6748 char *q = intel_parser.op_string;
6749 new_token.code = T_CONST;
6750
6751 /* Allow any kind of identifier char to encompass floating point and
6752 hexadecimal numbers. */
6753 while (is_identifier_char (*q))
6754 *p++ = *q++;
6755 *p = '\0';
6756
6757 /* Recognize special symbol names [0-9][bf]. */
6758 if (strlen (intel_parser.op_string) == 2
6759 && (intel_parser.op_string[1] == 'b'
6760 || intel_parser.op_string[1] == 'f'))
6761 new_token.code = T_ID;
6762 }
6763
6764 else if ((*intel_parser.op_string == REGISTER_PREFIX || allow_naked_reg)
6765 && ((reg = parse_register (intel_parser.op_string, &end_op)) != NULL))
6766 {
6767 new_token.code = T_REG;
6768 new_token.reg = reg;
6769
6770 if (*intel_parser.op_string == REGISTER_PREFIX)
6771 {
6772 new_token.str[0] = REGISTER_PREFIX;
6773 new_token.str[1] = '\0';
6774 }
6775
6776 strcat (new_token.str, reg->reg_name);
6777 }
6778
6779 else if (is_identifier_char (*intel_parser.op_string))
6780 {
6781 char *p = new_token.str;
6782 char *q = intel_parser.op_string;
6783
6784 /* A '.' or '$' followed by an identifier char is an identifier.
6785 Otherwise, it's operator '.' followed by an expression. */
6786 if ((*q == '.' || *q == '$') && !is_identifier_char (*(q + 1)))
6787 {
6788 new_token.code = '.';
6789 new_token.str[0] = '.';
6790 new_token.str[1] = '\0';
6791 }
6792 else
6793 {
6794 while (is_identifier_char (*q) || *q == '@')
6795 *p++ = *q++;
6796 *p = '\0';
6797
6798 if (strcasecmp (new_token.str, "NOT") == 0)
6799 new_token.code = '~';
6800
6801 else if (strcasecmp (new_token.str, "MOD") == 0)
6802 new_token.code = '%';
6803
6804 else if (strcasecmp (new_token.str, "AND") == 0)
6805 new_token.code = '&';
6806
6807 else if (strcasecmp (new_token.str, "OR") == 0)
6808 new_token.code = '|';
6809
6810 else if (strcasecmp (new_token.str, "XOR") == 0)
6811 new_token.code = '^';
6812
6813 else if (strcasecmp (new_token.str, "SHL") == 0)
6814 new_token.code = T_SHL;
6815
6816 else if (strcasecmp (new_token.str, "SHR") == 0)
6817 new_token.code = T_SHR;
6818
6819 else if (strcasecmp (new_token.str, "BYTE") == 0)
6820 new_token.code = T_BYTE;
6821
6822 else if (strcasecmp (new_token.str, "WORD") == 0)
6823 new_token.code = T_WORD;
6824
6825 else if (strcasecmp (new_token.str, "DWORD") == 0)
6826 new_token.code = T_DWORD;
6827
6828 else if (strcasecmp (new_token.str, "FWORD") == 0)
6829 new_token.code = T_FWORD;
6830
6831 else if (strcasecmp (new_token.str, "QWORD") == 0)
6832 new_token.code = T_QWORD;
6833
6834 else if (strcasecmp (new_token.str, "TBYTE") == 0
6835 /* XXX remove (gcc still uses it) */
6836 || strcasecmp (new_token.str, "XWORD") == 0)
6837 new_token.code = T_TBYTE;
6838
6839 else if (strcasecmp (new_token.str, "XMMWORD") == 0
6840 || strcasecmp (new_token.str, "OWORD") == 0)
6841 new_token.code = T_XMMWORD;
6842
6843 else if (strcasecmp (new_token.str, "PTR") == 0)
6844 new_token.code = T_PTR;
6845
6846 else if (strcasecmp (new_token.str, "SHORT") == 0)
6847 new_token.code = T_SHORT;
6848
6849 else if (strcasecmp (new_token.str, "OFFSET") == 0)
6850 {
6851 new_token.code = T_OFFSET;
6852
6853 /* ??? This is not mentioned in the MASM grammar but gcc
6854 makes use of it with -mintel-syntax. OFFSET may be
6855 followed by FLAT: */
6856 if (strncasecmp (q, " FLAT:", 6) == 0)
6857 strcat (new_token.str, " FLAT:");
6858 }
6859
6860 /* ??? This is not mentioned in the MASM grammar. */
6861 else if (strcasecmp (new_token.str, "FLAT") == 0)
6862 {
6863 new_token.code = T_OFFSET;
6864 if (*q == ':')
6865 strcat (new_token.str, ":");
6866 else
6867 as_bad (_("`:' expected"));
6868 }
6869
6870 else
6871 new_token.code = T_ID;
6872 }
6873 }
6874
6875 else if (strchr ("+-/*%|&^:[]()~", *intel_parser.op_string))
6876 {
6877 new_token.code = *intel_parser.op_string;
6878 new_token.str[0] = *intel_parser.op_string;
6879 new_token.str[1] = '\0';
6880 }
6881
6882 else if (strchr ("<>", *intel_parser.op_string)
6883 && *intel_parser.op_string == *(intel_parser.op_string + 1))
6884 {
6885 new_token.code = *intel_parser.op_string == '<' ? T_SHL : T_SHR;
6886 new_token.str[0] = *intel_parser.op_string;
6887 new_token.str[1] = *intel_parser.op_string;
6888 new_token.str[2] = '\0';
6889 }
6890
6891 else
6892 as_bad (_("Unrecognized token `%s'"), intel_parser.op_string);
6893
6894 intel_parser.op_string += strlen (new_token.str);
6895 cur_token = new_token;
6896 }
6897
6898 /* Put cur_token back into the token stream and make cur_token point to
6899 prev_token. */
6900 static void
6901 intel_putback_token ()
6902 {
6903 if (cur_token.code != T_NIL)
6904 {
6905 intel_parser.op_string -= strlen (cur_token.str);
6906 free (cur_token.str);
6907 }
6908 cur_token = prev_token;
6909
6910 /* Forget prev_token. */
6911 prev_token.code = T_NIL;
6912 prev_token.reg = NULL;
6913 prev_token.str = NULL;
6914 }
6915
6916 int
6917 tc_x86_regname_to_dw2regnum (const char *regname)
6918 {
6919 unsigned int regnum;
6920 unsigned int regnames_count;
6921 static const char *const regnames_32[] =
6922 {
6923 "eax", "ecx", "edx", "ebx",
6924 "esp", "ebp", "esi", "edi",
6925 "eip", "eflags", NULL,
6926 "st0", "st1", "st2", "st3",
6927 "st4", "st5", "st6", "st7",
6928 NULL, NULL,
6929 "xmm0", "xmm1", "xmm2", "xmm3",
6930 "xmm4", "xmm5", "xmm6", "xmm7",
6931 "mm0", "mm1", "mm2", "mm3",
6932 "mm4", "mm5", "mm6", "mm7"
6933 };
6934 static const char *const regnames_64[] =
6935 {
6936 "rax", "rdx", "rcx", "rbx",
6937 "rsi", "rdi", "rbp", "rsp",
6938 "r8", "r9", "r10", "r11",
6939 "r12", "r13", "r14", "r15",
6940 "rip",
6941 "xmm0", "xmm1", "xmm2", "xmm3",
6942 "xmm4", "xmm5", "xmm6", "xmm7",
6943 "xmm8", "xmm9", "xmm10", "xmm11",
6944 "xmm12", "xmm13", "xmm14", "xmm15",
6945 "st0", "st1", "st2", "st3",
6946 "st4", "st5", "st6", "st7",
6947 "mm0", "mm1", "mm2", "mm3",
6948 "mm4", "mm5", "mm6", "mm7"
6949 };
6950 const char *const *regnames;
6951
6952 if (flag_code == CODE_64BIT)
6953 {
6954 regnames = regnames_64;
6955 regnames_count = ARRAY_SIZE (regnames_64);
6956 }
6957 else
6958 {
6959 regnames = regnames_32;
6960 regnames_count = ARRAY_SIZE (regnames_32);
6961 }
6962
6963 for (regnum = 0; regnum < regnames_count; regnum++)
6964 if (regnames[regnum] != NULL
6965 && strcmp (regname, regnames[regnum]) == 0)
6966 return regnum;
6967
6968 return -1;
6969 }
6970
6971 void
6972 tc_x86_frame_initial_instructions (void)
6973 {
6974 static unsigned int sp_regno;
6975
6976 if (!sp_regno)
6977 sp_regno = tc_x86_regname_to_dw2regnum (flag_code == CODE_64BIT
6978 ? "rsp" : "esp");
6979
6980 cfi_add_CFA_def_cfa (sp_regno, -x86_cie_data_alignment);
6981 cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
6982 }
6983
6984 int
6985 i386_elf_section_type (const char *str, size_t len)
6986 {
6987 if (flag_code == CODE_64BIT
6988 && len == sizeof ("unwind") - 1
6989 && strncmp (str, "unwind", 6) == 0)
6990 return SHT_X86_64_UNWIND;
6991
6992 return -1;
6993 }
6994
6995 #ifdef TE_PE
6996 void
6997 tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
6998 {
6999 expressionS expr;
7000
7001 expr.X_op = O_secrel;
7002 expr.X_add_symbol = symbol;
7003 expr.X_add_number = 0;
7004 emit_expr (&expr, size);
7005 }
7006 #endif
7007
7008 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7009 /* For ELF on x86-64, add support for SHF_X86_64_LARGE. */
7010
7011 int
7012 x86_64_section_letter (int letter, char **ptr_msg)
7013 {
7014 if (flag_code == CODE_64BIT)
7015 {
7016 if (letter == 'l')
7017 return SHF_X86_64_LARGE;
7018
7019 *ptr_msg = _("Bad .section directive: want a,l,w,x,M,S,G,T in string");
7020 }
7021 else
7022 *ptr_msg = _("Bad .section directive: want a,w,x,M,S,G,T in string");
7023 return -1;
7024 }
7025
7026 int
7027 x86_64_section_word (char *str, size_t len)
7028 {
7029 if (len == 5 && flag_code == CODE_64BIT && strncmp (str, "large", 5) == 0)
7030 return SHF_X86_64_LARGE;
7031
7032 return -1;
7033 }
7034
7035 static void
7036 handle_large_common (int small ATTRIBUTE_UNUSED)
7037 {
7038 if (flag_code != CODE_64BIT)
7039 {
7040 s_comm_internal (0, elf_common_parse);
7041 as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
7042 }
7043 else
7044 {
7045 static segT lbss_section;
7046 asection *saved_com_section_ptr = elf_com_section_ptr;
7047 asection *saved_bss_section = bss_section;
7048
7049 if (lbss_section == NULL)
7050 {
7051 flagword applicable;
7052 segT seg = now_seg;
7053 subsegT subseg = now_subseg;
7054
7055 /* The .lbss section is for local .largecomm symbols. */
7056 lbss_section = subseg_new (".lbss", 0);
7057 applicable = bfd_applicable_section_flags (stdoutput);
7058 bfd_set_section_flags (stdoutput, lbss_section,
7059 applicable & SEC_ALLOC);
7060 seg_info (lbss_section)->bss = 1;
7061
7062 subseg_set (seg, subseg);
7063 }
7064
7065 elf_com_section_ptr = &_bfd_elf_large_com_section;
7066 bss_section = lbss_section;
7067
7068 s_comm_internal (0, elf_common_parse);
7069
7070 elf_com_section_ptr = saved_com_section_ptr;
7071 bss_section = saved_bss_section;
7072 }
7073 }
7074 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
This page took 0.257431 seconds and 5 git commands to generate.