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
4 Free Software Foundation, Inc.
6 This file is part of GAS, the GNU Assembler.
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)
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.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
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. */
31 #include "safe-ctype.h"
33 #include "dwarf2dbg.h"
34 #include "dw2gencfi.h"
35 #include "opcode/i386.h"
37 #ifndef REGISTER_WARNINGS
38 #define REGISTER_WARNINGS 1
41 #ifndef INFER_ADDR_PREFIX
42 #define INFER_ADDR_PREFIX 1
45 #ifndef SCALE1_WHEN_NO_INDEX
46 /* Specifying a scale factor besides 1 when there is no index is
47 futile. eg. `mov (%ebx,2),%al' does exactly the same as
48 `mov (%ebx),%al'. To slavishly follow what the programmer
49 specified, set SCALE1_WHEN_NO_INDEX to 0. */
50 #define SCALE1_WHEN_NO_INDEX 1
54 #define DEFAULT_ARCH "i386"
59 #define INLINE __inline__
65 static INLINE
unsigned int mode_from_disp_size
PARAMS ((unsigned int));
66 static INLINE
int fits_in_signed_byte
PARAMS ((offsetT
));
67 static INLINE
int fits_in_unsigned_byte
PARAMS ((offsetT
));
68 static INLINE
int fits_in_unsigned_word
PARAMS ((offsetT
));
69 static INLINE
int fits_in_signed_word
PARAMS ((offsetT
));
70 static INLINE
int fits_in_unsigned_long
PARAMS ((offsetT
));
71 static INLINE
int fits_in_signed_long
PARAMS ((offsetT
));
72 static int smallest_imm_type
PARAMS ((offsetT
));
73 static offsetT offset_in_range
PARAMS ((offsetT
, int));
74 static int add_prefix
PARAMS ((unsigned int));
75 static void set_code_flag
PARAMS ((int));
76 static void set_16bit_gcc_code_flag
PARAMS ((int));
77 static void set_intel_syntax
PARAMS ((int));
78 static void set_cpu_arch
PARAMS ((int));
79 static char *output_invalid
PARAMS ((int c
));
80 static int i386_operand
PARAMS ((char *operand_string
));
81 static int i386_intel_operand
PARAMS ((char *operand_string
, int got_a_float
));
82 static const reg_entry
*parse_register
PARAMS ((char *reg_string
,
84 static char *parse_insn
PARAMS ((char *, char *));
85 static char *parse_operands
PARAMS ((char *, const char *));
86 static void swap_operands
PARAMS ((void));
87 static void optimize_imm
PARAMS ((void));
88 static void optimize_disp
PARAMS ((void));
89 static int match_template
PARAMS ((void));
90 static int check_string
PARAMS ((void));
91 static int process_suffix
PARAMS ((void));
92 static int check_byte_reg
PARAMS ((void));
93 static int check_long_reg
PARAMS ((void));
94 static int check_qword_reg
PARAMS ((void));
95 static int check_word_reg
PARAMS ((void));
96 static int finalize_imm
PARAMS ((void));
97 static int process_operands
PARAMS ((void));
98 static const seg_entry
*build_modrm_byte
PARAMS ((void));
99 static void output_insn
PARAMS ((void));
100 static void output_branch
PARAMS ((void));
101 static void output_jump
PARAMS ((void));
102 static void output_interseg_jump
PARAMS ((void));
103 static void output_imm
PARAMS ((fragS
*insn_start_frag
,
104 offsetT insn_start_off
));
105 static void output_disp
PARAMS ((fragS
*insn_start_frag
,
106 offsetT insn_start_off
));
108 static void s_bss
PARAMS ((int));
111 static const char *default_arch
= DEFAULT_ARCH
;
113 /* 'md_assemble ()' gathers together information and puts it into a
120 const reg_entry
*regs
;
125 /* TM holds the template for the insn were currently assembling. */
128 /* SUFFIX holds the instruction mnemonic suffix if given.
129 (e.g. 'l' for 'movl') */
132 /* OPERANDS gives the number of given operands. */
133 unsigned int operands
;
135 /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
136 of given register, displacement, memory operands and immediate
138 unsigned int reg_operands
, disp_operands
, mem_operands
, imm_operands
;
140 /* TYPES [i] is the type (see above #defines) which tells us how to
141 use OP[i] for the corresponding operand. */
142 unsigned int types
[MAX_OPERANDS
];
144 /* Displacement expression, immediate expression, or register for each
146 union i386_op op
[MAX_OPERANDS
];
148 /* Flags for operands. */
149 unsigned int flags
[MAX_OPERANDS
];
150 #define Operand_PCrel 1
152 /* Relocation type for operand */
153 enum bfd_reloc_code_real reloc
[MAX_OPERANDS
];
155 /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
156 the base index byte below. */
157 const reg_entry
*base_reg
;
158 const reg_entry
*index_reg
;
159 unsigned int log2_scale_factor
;
161 /* SEG gives the seg_entries of this insn. They are zero unless
162 explicit segment overrides are given. */
163 const seg_entry
*seg
[2];
165 /* PREFIX holds all the given prefix opcodes (usually null).
166 PREFIXES is the number of prefix opcodes. */
167 unsigned int prefixes
;
168 unsigned char prefix
[MAX_PREFIXES
];
170 /* RM and SIB are the modrm byte and the sib byte where the
171 addressing modes of this insn are encoded. */
178 typedef struct _i386_insn i386_insn
;
180 /* List of chars besides those in app.c:symbol_chars that can start an
181 operand. Used to prevent the scrubber eating vital white-space. */
183 const char extra_symbol_chars
[] = "*%-(@[";
185 const char extra_symbol_chars
[] = "*%-([";
188 #if (defined (TE_I386AIX) \
189 || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
190 && !defined (TE_LINUX) \
191 && !defined (TE_FreeBSD) \
192 && !defined (TE_NetBSD)))
193 /* This array holds the chars that always start a comment. If the
194 pre-processor is disabled, these aren't very useful. */
195 const char comment_chars
[] = "#/";
196 #define PREFIX_SEPARATOR '\\'
198 /* This array holds the chars that only start a comment at the beginning of
199 a line. If the line seems to have the form '# 123 filename'
200 .line and .file directives will appear in the pre-processed output.
201 Note that input_file.c hand checks for '#' at the beginning of the
202 first line of the input file. This is because the compiler outputs
203 #NO_APP at the beginning of its output.
204 Also note that comments started like this one will always work if
205 '/' isn't otherwise defined. */
206 const char line_comment_chars
[] = "#";
209 /* Putting '/' here makes it impossible to use the divide operator.
210 However, we need it for compatibility with SVR4 systems. */
211 const char comment_chars
[] = "#";
212 #define PREFIX_SEPARATOR '/'
214 const char line_comment_chars
[] = "/#";
217 const char line_separator_chars
[] = ";";
219 /* Chars that can be used to separate mant from exp in floating point
221 const char EXP_CHARS
[] = "eE";
223 /* Chars that mean this number is a floating point constant
226 const char FLT_CHARS
[] = "fFdDxX";
228 /* Tables for lexical analysis. */
229 static char mnemonic_chars
[256];
230 static char register_chars
[256];
231 static char operand_chars
[256];
232 static char identifier_chars
[256];
233 static char digit_chars
[256];
235 /* Lexical macros. */
236 #define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
237 #define is_operand_char(x) (operand_chars[(unsigned char) x])
238 #define is_register_char(x) (register_chars[(unsigned char) x])
239 #define is_space_char(x) ((x) == ' ')
240 #define is_identifier_char(x) (identifier_chars[(unsigned char) x])
241 #define is_digit_char(x) (digit_chars[(unsigned char) x])
243 /* All non-digit non-letter characters that may occur in an operand. */
244 static char operand_special_chars
[] = "%$-+(,)*._~/<>|&^!:[@]";
246 /* md_assemble() always leaves the strings it's passed unaltered. To
247 effect this we maintain a stack of saved characters that we've smashed
248 with '\0's (indicating end of strings for various sub-fields of the
249 assembler instruction). */
250 static char save_stack
[32];
251 static char *save_stack_p
;
252 #define END_STRING_AND_SAVE(s) \
253 do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
254 #define RESTORE_END_STRING(s) \
255 do { *(s) = *--save_stack_p; } while (0)
257 /* The instruction we're assembling. */
260 /* Possible templates for current insn. */
261 static const templates
*current_templates
;
263 /* Per instruction expressionS buffers: 2 displacements & 2 immediate max. */
264 static expressionS disp_expressions
[2], im_expressions
[2];
266 /* Current operand we are working on. */
267 static int this_operand
;
269 /* We support four different modes. FLAG_CODE variable is used to distinguish
276 #define NUM_FLAG_CODE ((int) CODE_64BIT + 1)
278 static enum flag_code flag_code
;
279 static int use_rela_relocations
= 0;
281 /* The names used to print error messages. */
282 static const char *flag_code_names
[] =
289 /* 1 for intel syntax,
291 static int intel_syntax
= 0;
293 /* 1 if register prefix % not required. */
294 static int allow_naked_reg
= 0;
296 /* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
297 leave, push, and pop instructions so that gcc has the same stack
298 frame as in 32 bit mode. */
299 static char stackop_size
= '\0';
301 /* Non-zero to optimize code alignment. */
302 int optimize_align_code
= 1;
304 /* Non-zero to quieten some warnings. */
305 static int quiet_warnings
= 0;
308 static const char *cpu_arch_name
= NULL
;
310 /* CPU feature flags. */
311 static unsigned int cpu_arch_flags
= CpuUnknownFlags
| CpuNo64
;
313 /* If set, conditional jumps are not automatically promoted to handle
314 larger than a byte offset. */
315 static unsigned int no_cond_jump_promotion
= 0;
317 /* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
320 /* The dwarf2 return column, adjusted for 32 or 64 bit. */
321 unsigned int x86_dwarf2_return_column
;
323 /* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
324 int x86_cie_data_alignment
;
326 /* Interface to relax_segment.
327 There are 3 major relax states for 386 jump insns because the
328 different types of jumps add different sizes to frags when we're
329 figuring out what sort of jump to choose to reach a given label. */
332 #define UNCOND_JUMP 0
334 #define COND_JUMP86 2
339 #define SMALL16 (SMALL | CODE16)
341 #define BIG16 (BIG | CODE16)
345 #define INLINE __inline__
351 #define ENCODE_RELAX_STATE(type, size) \
352 ((relax_substateT) (((type) << 2) | (size)))
353 #define TYPE_FROM_RELAX_STATE(s) \
355 #define DISP_SIZE_FROM_RELAX_STATE(s) \
356 ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
358 /* This table is used by relax_frag to promote short jumps to long
359 ones where necessary. SMALL (short) jumps may be promoted to BIG
360 (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long). We
361 don't allow a short jump in a 32 bit code segment to be promoted to
362 a 16 bit offset jump because it's slower (requires data size
363 prefix), and doesn't work, unless the destination is in the bottom
364 64k of the code segment (The top 16 bits of eip are zeroed). */
366 const relax_typeS md_relax_table
[] =
369 1) most positive reach of this state,
370 2) most negative reach of this state,
371 3) how many bytes this mode will have in the variable part of the frag
372 4) which index into the table to try if we can't fit into this one. */
374 /* UNCOND_JUMP states. */
375 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP
, BIG
)},
376 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP
, BIG16
)},
377 /* dword jmp adds 4 bytes to frag:
378 0 extra opcode bytes, 4 displacement bytes. */
380 /* word jmp adds 2 byte2 to frag:
381 0 extra opcode bytes, 2 displacement bytes. */
384 /* COND_JUMP states. */
385 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP
, BIG
)},
386 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP
, BIG16
)},
387 /* dword conditionals adds 5 bytes to frag:
388 1 extra opcode byte, 4 displacement bytes. */
390 /* word conditionals add 3 bytes to frag:
391 1 extra opcode byte, 2 displacement bytes. */
394 /* COND_JUMP86 states. */
395 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86
, BIG
)},
396 {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86
, BIG16
)},
397 /* dword conditionals adds 5 bytes to frag:
398 1 extra opcode byte, 4 displacement bytes. */
400 /* word conditionals add 4 bytes to frag:
401 1 displacement byte and a 3 byte long branch insn. */
405 static const arch_entry cpu_arch
[] = {
407 {"i186", Cpu086
|Cpu186
},
408 {"i286", Cpu086
|Cpu186
|Cpu286
},
409 {"i386", Cpu086
|Cpu186
|Cpu286
|Cpu386
},
410 {"i486", Cpu086
|Cpu186
|Cpu286
|Cpu386
|Cpu486
},
411 {"i586", Cpu086
|Cpu186
|Cpu286
|Cpu386
|Cpu486
|Cpu586
|CpuMMX
},
412 {"i686", Cpu086
|Cpu186
|Cpu286
|Cpu386
|Cpu486
|Cpu586
|Cpu686
|CpuMMX
|CpuSSE
},
413 {"pentium", Cpu086
|Cpu186
|Cpu286
|Cpu386
|Cpu486
|Cpu586
|CpuMMX
},
414 {"pentiumpro",Cpu086
|Cpu186
|Cpu286
|Cpu386
|Cpu486
|Cpu586
|Cpu686
|CpuMMX
|CpuSSE
},
415 {"pentium4", Cpu086
|Cpu186
|Cpu286
|Cpu386
|Cpu486
|Cpu586
|Cpu686
|CpuP4
|CpuMMX
|CpuSSE
|CpuSSE2
},
416 {"k6", Cpu086
|Cpu186
|Cpu286
|Cpu386
|Cpu486
|Cpu586
|CpuK6
|CpuMMX
|Cpu3dnow
},
417 {"athlon", Cpu086
|Cpu186
|Cpu286
|Cpu386
|Cpu486
|Cpu586
|Cpu686
|CpuK6
|CpuAthlon
|CpuMMX
|Cpu3dnow
},
418 {"sledgehammer",Cpu086
|Cpu186
|Cpu286
|Cpu386
|Cpu486
|Cpu586
|Cpu686
|CpuK6
|CpuAthlon
|CpuSledgehammer
|CpuMMX
|Cpu3dnow
|CpuSSE
|CpuSSE2
},
422 const pseudo_typeS md_pseudo_table
[] =
424 #if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
425 {"align", s_align_bytes
, 0},
427 {"align", s_align_ptwo
, 0},
429 {"arch", set_cpu_arch
, 0},
433 {"ffloat", float_cons
, 'f'},
434 {"dfloat", float_cons
, 'd'},
435 {"tfloat", float_cons
, 'x'},
437 {"noopt", s_ignore
, 0},
438 {"optim", s_ignore
, 0},
439 {"code16gcc", set_16bit_gcc_code_flag
, CODE_16BIT
},
440 {"code16", set_code_flag
, CODE_16BIT
},
441 {"code32", set_code_flag
, CODE_32BIT
},
442 {"code64", set_code_flag
, CODE_64BIT
},
443 {"intel_syntax", set_intel_syntax
, 1},
444 {"att_syntax", set_intel_syntax
, 0},
445 {"file", (void (*) PARAMS ((int))) dwarf2_directive_file
, 0},
446 {"loc", dwarf2_directive_loc
, 0},
450 /* For interface with expression (). */
451 extern char *input_line_pointer
;
453 /* Hash table for instruction mnemonic lookup. */
454 static struct hash_control
*op_hash
;
456 /* Hash table for register lookup. */
457 static struct hash_control
*reg_hash
;
460 i386_align_code (fragP
, count
)
464 /* Various efficient no-op patterns for aligning code labels.
465 Note: Don't try to assemble the instructions in the comments.
466 0L and 0w are not legal. */
467 static const char f32_1
[] =
469 static const char f32_2
[] =
470 {0x89,0xf6}; /* movl %esi,%esi */
471 static const char f32_3
[] =
472 {0x8d,0x76,0x00}; /* leal 0(%esi),%esi */
473 static const char f32_4
[] =
474 {0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
475 static const char f32_5
[] =
477 0x8d,0x74,0x26,0x00}; /* leal 0(%esi,1),%esi */
478 static const char f32_6
[] =
479 {0x8d,0xb6,0x00,0x00,0x00,0x00}; /* leal 0L(%esi),%esi */
480 static const char f32_7
[] =
481 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
482 static const char f32_8
[] =
484 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00}; /* leal 0L(%esi,1),%esi */
485 static const char f32_9
[] =
486 {0x89,0xf6, /* movl %esi,%esi */
487 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
488 static const char f32_10
[] =
489 {0x8d,0x76,0x00, /* leal 0(%esi),%esi */
490 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
491 static const char f32_11
[] =
492 {0x8d,0x74,0x26,0x00, /* leal 0(%esi,1),%esi */
493 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
494 static const char f32_12
[] =
495 {0x8d,0xb6,0x00,0x00,0x00,0x00, /* leal 0L(%esi),%esi */
496 0x8d,0xbf,0x00,0x00,0x00,0x00}; /* leal 0L(%edi),%edi */
497 static const char f32_13
[] =
498 {0x8d,0xb6,0x00,0x00,0x00,0x00, /* leal 0L(%esi),%esi */
499 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
500 static const char f32_14
[] =
501 {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00, /* leal 0L(%esi,1),%esi */
502 0x8d,0xbc,0x27,0x00,0x00,0x00,0x00}; /* leal 0L(%edi,1),%edi */
503 static const char f32_15
[] =
504 {0xeb,0x0d,0x90,0x90,0x90,0x90,0x90, /* jmp .+15; lotsa nops */
505 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90};
506 static const char f16_3
[] =
507 {0x8d,0x74,0x00}; /* lea 0(%esi),%esi */
508 static const char f16_4
[] =
509 {0x8d,0xb4,0x00,0x00}; /* lea 0w(%si),%si */
510 static const char f16_5
[] =
512 0x8d,0xb4,0x00,0x00}; /* lea 0w(%si),%si */
513 static const char f16_6
[] =
514 {0x89,0xf6, /* mov %si,%si */
515 0x8d,0xbd,0x00,0x00}; /* lea 0w(%di),%di */
516 static const char f16_7
[] =
517 {0x8d,0x74,0x00, /* lea 0(%si),%si */
518 0x8d,0xbd,0x00,0x00}; /* lea 0w(%di),%di */
519 static const char f16_8
[] =
520 {0x8d,0xb4,0x00,0x00, /* lea 0w(%si),%si */
521 0x8d,0xbd,0x00,0x00}; /* lea 0w(%di),%di */
522 static const char *const f32_patt
[] = {
523 f32_1
, f32_2
, f32_3
, f32_4
, f32_5
, f32_6
, f32_7
, f32_8
,
524 f32_9
, f32_10
, f32_11
, f32_12
, f32_13
, f32_14
, f32_15
526 static const char *const f16_patt
[] = {
527 f32_1
, f32_2
, f16_3
, f16_4
, f16_5
, f16_6
, f16_7
, f16_8
,
528 f32_15
, f32_15
, f32_15
, f32_15
, f32_15
, f32_15
, f32_15
531 if (count
<= 0 || count
> 15)
534 /* The recommended way to pad 64bit code is to use NOPs preceded by
535 maximally four 0x66 prefixes. Balance the size of nops. */
536 if (flag_code
== CODE_64BIT
)
539 int nnops
= (count
+ 3) / 4;
540 int len
= count
/ nnops
;
541 int remains
= count
- nnops
* len
;
544 for (i
= 0; i
< remains
; i
++)
546 memset (fragP
->fr_literal
+ fragP
->fr_fix
+ pos
, 0x66, len
);
547 fragP
->fr_literal
[fragP
->fr_fix
+ pos
+ len
] = 0x90;
550 for (; i
< nnops
; i
++)
552 memset (fragP
->fr_literal
+ fragP
->fr_fix
+ pos
, 0x66, len
- 1);
553 fragP
->fr_literal
[fragP
->fr_fix
+ pos
+ len
- 1] = 0x90;
558 if (flag_code
== CODE_16BIT
)
560 memcpy (fragP
->fr_literal
+ fragP
->fr_fix
,
561 f16_patt
[count
- 1], count
);
563 /* Adjust jump offset. */
564 fragP
->fr_literal
[fragP
->fr_fix
+ 1] = count
- 2;
567 memcpy (fragP
->fr_literal
+ fragP
->fr_fix
,
568 f32_patt
[count
- 1], count
);
569 fragP
->fr_var
= count
;
572 static INLINE
unsigned int
573 mode_from_disp_size (t
)
576 return (t
& Disp8
) ? 1 : (t
& (Disp16
| Disp32
| Disp32S
)) ? 2 : 0;
580 fits_in_signed_byte (num
)
583 return (num
>= -128) && (num
<= 127);
587 fits_in_unsigned_byte (num
)
590 return (num
& 0xff) == num
;
594 fits_in_unsigned_word (num
)
597 return (num
& 0xffff) == num
;
601 fits_in_signed_word (num
)
604 return (-32768 <= num
) && (num
<= 32767);
607 fits_in_signed_long (num
)
608 offsetT num ATTRIBUTE_UNUSED
;
613 return (!(((offsetT
) -1 << 31) & num
)
614 || (((offsetT
) -1 << 31) & num
) == ((offsetT
) -1 << 31));
616 } /* fits_in_signed_long() */
618 fits_in_unsigned_long (num
)
619 offsetT num ATTRIBUTE_UNUSED
;
624 return (num
& (((offsetT
) 2 << 31) - 1)) == num
;
626 } /* fits_in_unsigned_long() */
629 smallest_imm_type (num
)
632 if (cpu_arch_flags
!= (Cpu086
| Cpu186
| Cpu286
| Cpu386
| Cpu486
| CpuNo64
))
634 /* This code is disabled on the 486 because all the Imm1 forms
635 in the opcode table are slower on the i486. They're the
636 versions with the implicitly specified single-position
637 displacement, which has another syntax if you really want to
640 return Imm1
| Imm8
| Imm8S
| Imm16
| Imm32
| Imm32S
| Imm64
;
642 return (fits_in_signed_byte (num
)
643 ? (Imm8S
| Imm8
| Imm16
| Imm32
| Imm32S
| Imm64
)
644 : fits_in_unsigned_byte (num
)
645 ? (Imm8
| Imm16
| Imm32
| Imm32S
| Imm64
)
646 : (fits_in_signed_word (num
) || fits_in_unsigned_word (num
))
647 ? (Imm16
| Imm32
| Imm32S
| Imm64
)
648 : fits_in_signed_long (num
)
649 ? (Imm32
| Imm32S
| Imm64
)
650 : fits_in_unsigned_long (num
)
656 offset_in_range (val
, size
)
664 case 1: mask
= ((addressT
) 1 << 8) - 1; break;
665 case 2: mask
= ((addressT
) 1 << 16) - 1; break;
666 case 4: mask
= ((addressT
) 2 << 31) - 1; break;
668 case 8: mask
= ((addressT
) 2 << 63) - 1; break;
673 /* If BFD64, sign extend val. */
674 if (!use_rela_relocations
)
675 if ((val
& ~(((addressT
) 2 << 31) - 1)) == 0)
676 val
= (val
^ ((addressT
) 1 << 31)) - ((addressT
) 1 << 31);
678 if ((val
& ~mask
) != 0 && (val
& ~mask
) != ~mask
)
680 char buf1
[40], buf2
[40];
682 sprint_value (buf1
, val
);
683 sprint_value (buf2
, val
& mask
);
684 as_warn (_("%s shortened to %s"), buf1
, buf2
);
689 /* Returns 0 if attempting to add a prefix where one from the same
690 class already exists, 1 if non rep/repne added, 2 if rep/repne
699 if (prefix
>= REX_OPCODE
&& prefix
< REX_OPCODE
+ 16
700 && flag_code
== CODE_64BIT
)
708 case CS_PREFIX_OPCODE
:
709 case DS_PREFIX_OPCODE
:
710 case ES_PREFIX_OPCODE
:
711 case FS_PREFIX_OPCODE
:
712 case GS_PREFIX_OPCODE
:
713 case SS_PREFIX_OPCODE
:
717 case REPNE_PREFIX_OPCODE
:
718 case REPE_PREFIX_OPCODE
:
721 case LOCK_PREFIX_OPCODE
:
729 case ADDR_PREFIX_OPCODE
:
733 case DATA_PREFIX_OPCODE
:
738 if (i
.prefix
[q
] != 0)
740 as_bad (_("same type of prefix used twice"));
745 i
.prefix
[q
] = prefix
;
750 set_code_flag (value
)
754 cpu_arch_flags
&= ~(Cpu64
| CpuNo64
);
755 cpu_arch_flags
|= (flag_code
== CODE_64BIT
? Cpu64
: CpuNo64
);
756 if (value
== CODE_64BIT
&& !(cpu_arch_flags
& CpuSledgehammer
))
758 as_bad (_("64bit mode not supported on this CPU."));
760 if (value
== CODE_32BIT
&& !(cpu_arch_flags
& Cpu386
))
762 as_bad (_("32bit mode not supported on this CPU."));
768 set_16bit_gcc_code_flag (new_code_flag
)
771 flag_code
= new_code_flag
;
772 cpu_arch_flags
&= ~(Cpu64
| CpuNo64
);
773 cpu_arch_flags
|= (flag_code
== CODE_64BIT
? Cpu64
: CpuNo64
);
778 set_intel_syntax (syntax_flag
)
781 /* Find out if register prefixing is specified. */
782 int ask_naked_reg
= 0;
785 if (!is_end_of_line
[(unsigned char) *input_line_pointer
])
787 char *string
= input_line_pointer
;
788 int e
= get_symbol_end ();
790 if (strcmp (string
, "prefix") == 0)
792 else if (strcmp (string
, "noprefix") == 0)
795 as_bad (_("bad argument to syntax directive."));
796 *input_line_pointer
= e
;
798 demand_empty_rest_of_line ();
800 intel_syntax
= syntax_flag
;
802 if (ask_naked_reg
== 0)
803 allow_naked_reg
= (intel_syntax
804 && (bfd_get_symbol_leading_char (stdoutput
) != '\0'));
806 allow_naked_reg
= (ask_naked_reg
< 0);
811 int dummy ATTRIBUTE_UNUSED
;
815 if (!is_end_of_line
[(unsigned char) *input_line_pointer
])
817 char *string
= input_line_pointer
;
818 int e
= get_symbol_end ();
821 for (i
= 0; cpu_arch
[i
].name
; i
++)
823 if (strcmp (string
, cpu_arch
[i
].name
) == 0)
825 cpu_arch_name
= cpu_arch
[i
].name
;
826 cpu_arch_flags
= (cpu_arch
[i
].flags
827 | (flag_code
== CODE_64BIT
? Cpu64
: CpuNo64
));
831 if (!cpu_arch
[i
].name
)
832 as_bad (_("no such architecture: `%s'"), string
);
834 *input_line_pointer
= e
;
837 as_bad (_("missing cpu architecture"));
839 no_cond_jump_promotion
= 0;
840 if (*input_line_pointer
== ','
841 && !is_end_of_line
[(unsigned char) input_line_pointer
[1]])
843 char *string
= ++input_line_pointer
;
844 int e
= get_symbol_end ();
846 if (strcmp (string
, "nojumps") == 0)
847 no_cond_jump_promotion
= 1;
848 else if (strcmp (string
, "jumps") == 0)
851 as_bad (_("no such architecture modifier: `%s'"), string
);
853 *input_line_pointer
= e
;
856 demand_empty_rest_of_line ();
862 if (!strcmp (default_arch
, "x86_64"))
863 return bfd_mach_x86_64
;
864 else if (!strcmp (default_arch
, "i386"))
865 return bfd_mach_i386_i386
;
867 as_fatal (_("Unknown architecture"));
873 const char *hash_err
;
875 /* Initialize op_hash hash table. */
876 op_hash
= hash_new ();
879 const template *optab
;
880 templates
*core_optab
;
882 /* Setup for loop. */
884 core_optab
= (templates
*) xmalloc (sizeof (templates
));
885 core_optab
->start
= optab
;
890 if (optab
->name
== NULL
891 || strcmp (optab
->name
, (optab
- 1)->name
) != 0)
893 /* different name --> ship out current template list;
894 add to hash table; & begin anew. */
895 core_optab
->end
= optab
;
896 hash_err
= hash_insert (op_hash
,
901 as_fatal (_("Internal Error: Can't hash %s: %s"),
905 if (optab
->name
== NULL
)
907 core_optab
= (templates
*) xmalloc (sizeof (templates
));
908 core_optab
->start
= optab
;
913 /* Initialize reg_hash hash table. */
914 reg_hash
= hash_new ();
916 const reg_entry
*regtab
;
918 for (regtab
= i386_regtab
;
919 regtab
< i386_regtab
+ sizeof (i386_regtab
) / sizeof (i386_regtab
[0]);
922 hash_err
= hash_insert (reg_hash
, regtab
->reg_name
, (PTR
) regtab
);
924 as_fatal (_("Internal Error: Can't hash %s: %s"),
930 /* Fill in lexical tables: mnemonic_chars, operand_chars. */
935 for (c
= 0; c
< 256; c
++)
940 mnemonic_chars
[c
] = c
;
941 register_chars
[c
] = c
;
942 operand_chars
[c
] = c
;
944 else if (ISLOWER (c
))
946 mnemonic_chars
[c
] = c
;
947 register_chars
[c
] = c
;
948 operand_chars
[c
] = c
;
950 else if (ISUPPER (c
))
952 mnemonic_chars
[c
] = TOLOWER (c
);
953 register_chars
[c
] = mnemonic_chars
[c
];
954 operand_chars
[c
] = c
;
957 if (ISALPHA (c
) || ISDIGIT (c
))
958 identifier_chars
[c
] = c
;
961 identifier_chars
[c
] = c
;
962 operand_chars
[c
] = c
;
967 identifier_chars
['@'] = '@';
969 digit_chars
['-'] = '-';
970 identifier_chars
['_'] = '_';
971 identifier_chars
['.'] = '.';
973 for (p
= operand_special_chars
; *p
!= '\0'; p
++)
974 operand_chars
[(unsigned char) *p
] = *p
;
977 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
978 if (OUTPUT_FLAVOR
== bfd_target_elf_flavour
)
980 record_alignment (text_section
, 2);
981 record_alignment (data_section
, 2);
982 record_alignment (bss_section
, 2);
986 if (flag_code
== CODE_64BIT
)
988 x86_dwarf2_return_column
= 16;
989 x86_cie_data_alignment
= -8;
993 x86_dwarf2_return_column
= 8;
994 x86_cie_data_alignment
= -4;
999 i386_print_statistics (file
)
1002 hash_print_statistics (file
, "i386 opcode", op_hash
);
1003 hash_print_statistics (file
, "i386 register", reg_hash
);
1008 /* Debugging routines for md_assemble. */
1009 static void pi
PARAMS ((char *, i386_insn
*));
1010 static void pte
PARAMS ((template *));
1011 static void pt
PARAMS ((unsigned int));
1012 static void pe
PARAMS ((expressionS
*));
1013 static void ps
PARAMS ((symbolS
*));
1022 fprintf (stdout
, "%s: template ", line
);
1024 fprintf (stdout
, " address: base %s index %s scale %x\n",
1025 x
->base_reg
? x
->base_reg
->reg_name
: "none",
1026 x
->index_reg
? x
->index_reg
->reg_name
: "none",
1027 x
->log2_scale_factor
);
1028 fprintf (stdout
, " modrm: mode %x reg %x reg/mem %x\n",
1029 x
->rm
.mode
, x
->rm
.reg
, x
->rm
.regmem
);
1030 fprintf (stdout
, " sib: base %x index %x scale %x\n",
1031 x
->sib
.base
, x
->sib
.index
, x
->sib
.scale
);
1032 fprintf (stdout
, " rex: 64bit %x extX %x extY %x extZ %x\n",
1033 (x
->rex
& REX_MODE64
) != 0,
1034 (x
->rex
& REX_EXTX
) != 0,
1035 (x
->rex
& REX_EXTY
) != 0,
1036 (x
->rex
& REX_EXTZ
) != 0);
1037 for (i
= 0; i
< x
->operands
; i
++)
1039 fprintf (stdout
, " #%d: ", i
+ 1);
1041 fprintf (stdout
, "\n");
1043 & (Reg
| SReg2
| SReg3
| Control
| Debug
| Test
| RegMMX
| RegXMM
))
1044 fprintf (stdout
, "%s\n", x
->op
[i
].regs
->reg_name
);
1045 if (x
->types
[i
] & Imm
)
1047 if (x
->types
[i
] & Disp
)
1048 pe (x
->op
[i
].disps
);
1057 fprintf (stdout
, " %d operands ", t
->operands
);
1058 fprintf (stdout
, "opcode %x ", t
->base_opcode
);
1059 if (t
->extension_opcode
!= None
)
1060 fprintf (stdout
, "ext %x ", t
->extension_opcode
);
1061 if (t
->opcode_modifier
& D
)
1062 fprintf (stdout
, "D");
1063 if (t
->opcode_modifier
& W
)
1064 fprintf (stdout
, "W");
1065 fprintf (stdout
, "\n");
1066 for (i
= 0; i
< t
->operands
; i
++)
1068 fprintf (stdout
, " #%d type ", i
+ 1);
1069 pt (t
->operand_types
[i
]);
1070 fprintf (stdout
, "\n");
1078 fprintf (stdout
, " operation %d\n", e
->X_op
);
1079 fprintf (stdout
, " add_number %ld (%lx)\n",
1080 (long) e
->X_add_number
, (long) e
->X_add_number
);
1081 if (e
->X_add_symbol
)
1083 fprintf (stdout
, " add_symbol ");
1084 ps (e
->X_add_symbol
);
1085 fprintf (stdout
, "\n");
1089 fprintf (stdout
, " op_symbol ");
1090 ps (e
->X_op_symbol
);
1091 fprintf (stdout
, "\n");
1099 fprintf (stdout
, "%s type %s%s",
1101 S_IS_EXTERNAL (s
) ? "EXTERNAL " : "",
1102 segment_name (S_GET_SEGMENT (s
)));
1111 static const type_names
[] =
1124 { BaseIndex
, "BaseIndex" },
1128 { Disp32S
, "d32s" },
1130 { InOutPortReg
, "InOutPortReg" },
1131 { ShiftCount
, "ShiftCount" },
1132 { Control
, "control reg" },
1133 { Test
, "test reg" },
1134 { Debug
, "debug reg" },
1135 { FloatReg
, "FReg" },
1136 { FloatAcc
, "FAcc" },
1140 { JumpAbsolute
, "Jump Absolute" },
1151 const struct type_name
*ty
;
1153 for (ty
= type_names
; ty
->mask
; ty
++)
1155 fprintf (stdout
, "%s, ", ty
->tname
);
1159 #endif /* DEBUG386 */
1161 static bfd_reloc_code_real_type reloc
1162 PARAMS ((int, int, int, bfd_reloc_code_real_type
));
1164 static bfd_reloc_code_real_type
1165 reloc (size
, pcrel
, sign
, other
)
1169 bfd_reloc_code_real_type other
;
1171 if (other
!= NO_RELOC
)
1177 as_bad (_("There are no unsigned pc-relative relocations"));
1180 case 1: return BFD_RELOC_8_PCREL
;
1181 case 2: return BFD_RELOC_16_PCREL
;
1182 case 4: return BFD_RELOC_32_PCREL
;
1184 as_bad (_("can not do %d byte pc-relative relocation"), size
);
1191 case 4: return BFD_RELOC_X86_64_32S
;
1196 case 1: return BFD_RELOC_8
;
1197 case 2: return BFD_RELOC_16
;
1198 case 4: return BFD_RELOC_32
;
1199 case 8: return BFD_RELOC_64
;
1201 as_bad (_("can not do %s %d byte relocation"),
1202 sign
? "signed" : "unsigned", size
);
1206 return BFD_RELOC_NONE
;
1209 /* Here we decide which fixups can be adjusted to make them relative to
1210 the beginning of the section instead of the symbol. Basically we need
1211 to make sure that the dynamic relocations are done correctly, so in
1212 some cases we force the original symbol to be used. */
1215 tc_i386_fix_adjustable (fixP
)
1216 fixS
*fixP ATTRIBUTE_UNUSED
;
1218 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1219 if (OUTPUT_FLAVOR
!= bfd_target_elf_flavour
)
1222 /* Don't adjust pc-relative references to merge sections in 64-bit
1224 if (use_rela_relocations
1225 && (S_GET_SEGMENT (fixP
->fx_addsy
)->flags
& SEC_MERGE
) != 0
1229 /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
1230 and changed later by validate_fix. */
1231 if (GOT_symbol
&& fixP
->fx_subsy
== GOT_symbol
1232 && fixP
->fx_r_type
== BFD_RELOC_32_PCREL
)
1235 /* adjust_reloc_syms doesn't know about the GOT. */
1236 if (fixP
->fx_r_type
== BFD_RELOC_386_GOTOFF
1237 || fixP
->fx_r_type
== BFD_RELOC_386_PLT32
1238 || fixP
->fx_r_type
== BFD_RELOC_386_GOT32
1239 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_GD
1240 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_LDM
1241 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_LDO_32
1242 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_IE_32
1243 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_IE
1244 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_GOTIE
1245 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_LE_32
1246 || fixP
->fx_r_type
== BFD_RELOC_386_TLS_LE
1247 || fixP
->fx_r_type
== BFD_RELOC_X86_64_PLT32
1248 || fixP
->fx_r_type
== BFD_RELOC_X86_64_GOT32
1249 || fixP
->fx_r_type
== BFD_RELOC_X86_64_GOTPCREL
1250 || fixP
->fx_r_type
== BFD_RELOC_X86_64_TLSGD
1251 || fixP
->fx_r_type
== BFD_RELOC_X86_64_TLSLD
1252 || fixP
->fx_r_type
== BFD_RELOC_X86_64_DTPOFF32
1253 || fixP
->fx_r_type
== BFD_RELOC_X86_64_GOTTPOFF
1254 || fixP
->fx_r_type
== BFD_RELOC_X86_64_TPOFF32
1255 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
1256 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
1262 static int intel_float_operand
PARAMS ((const char *mnemonic
));
1265 intel_float_operand (mnemonic
)
1266 const char *mnemonic
;
1268 if (mnemonic
[0] == 'f' && mnemonic
[1] == 'i')
1271 if (mnemonic
[0] == 'f')
1277 /* This is the guts of the machine-dependent assembler. LINE points to a
1278 machine dependent instruction. This function is supposed to emit
1279 the frags/bytes it assembles to. */
1286 char mnemonic
[MAX_MNEM_SIZE
];
1288 /* Initialize globals. */
1289 memset (&i
, '\0', sizeof (i
));
1290 for (j
= 0; j
< MAX_OPERANDS
; j
++)
1291 i
.reloc
[j
] = NO_RELOC
;
1292 memset (disp_expressions
, '\0', sizeof (disp_expressions
));
1293 memset (im_expressions
, '\0', sizeof (im_expressions
));
1294 save_stack_p
= save_stack
;
1296 /* First parse an instruction mnemonic & call i386_operand for the operands.
1297 We assume that the scrubber has arranged it so that line[0] is the valid
1298 start of a (possibly prefixed) mnemonic. */
1300 line
= parse_insn (line
, mnemonic
);
1304 line
= parse_operands (line
, mnemonic
);
1308 /* Now we've parsed the mnemonic into a set of templates, and have the
1309 operands at hand. */
1311 /* All intel opcodes have reversed operands except for "bound" and
1312 "enter". We also don't reverse intersegment "jmp" and "call"
1313 instructions with 2 immediate operands so that the immediate segment
1314 precedes the offset, as it does when in AT&T mode. "enter" and the
1315 intersegment "jmp" and "call" instructions are the only ones that
1316 have two immediate operands. */
1317 if (intel_syntax
&& i
.operands
> 1
1318 && (strcmp (mnemonic
, "bound") != 0)
1319 && !((i
.types
[0] & Imm
) && (i
.types
[1] & Imm
)))
1325 if (i
.disp_operands
)
1328 /* Next, we find a template that matches the given insn,
1329 making sure the overlap of the given operands types is consistent
1330 with the template operand types. */
1332 if (!match_template ())
1337 /* Undo SYSV386_COMPAT brokenness when in Intel mode. See i386.h */
1339 && (i
.tm
.base_opcode
& 0xfffffde0) == 0xdce0)
1340 i
.tm
.base_opcode
^= FloatR
;
1342 /* Zap movzx and movsx suffix. The suffix may have been set from
1343 "word ptr" or "byte ptr" on the source operand, but we'll use
1344 the suffix later to choose the destination register. */
1345 if ((i
.tm
.base_opcode
& ~9) == 0x0fb6)
1349 if (i
.tm
.opcode_modifier
& FWait
)
1350 if (!add_prefix (FWAIT_OPCODE
))
1353 /* Check string instruction segment overrides. */
1354 if ((i
.tm
.opcode_modifier
& IsString
) != 0 && i
.mem_operands
!= 0)
1356 if (!check_string ())
1360 if (!process_suffix ())
1363 /* Make still unresolved immediate matches conform to size of immediate
1364 given in i.suffix. */
1365 if (!finalize_imm ())
1368 if (i
.types
[0] & Imm1
)
1369 i
.imm_operands
= 0; /* kludge for shift insns. */
1370 if (i
.types
[0] & ImplicitRegister
)
1372 if (i
.types
[1] & ImplicitRegister
)
1374 if (i
.types
[2] & ImplicitRegister
)
1377 if (i
.tm
.opcode_modifier
& ImmExt
)
1381 if ((i
.tm
.cpu_flags
& CpuPNI
) && i
.operands
> 0)
1383 /* These Intel Prescott New Instructions have the fixed
1384 operands with an opcode suffix which is coded in the same
1385 place as an 8-bit immediate field would be. Here we check
1386 those operands and remove them afterwards. */
1389 for (x
= 0; x
< i
.operands
; x
++)
1390 if (i
.op
[x
].regs
->reg_num
!= x
)
1391 as_bad (_("can't use register '%%%s' as operand %d in '%s'."),
1392 i
.op
[x
].regs
->reg_name
, x
+ 1, i
.tm
.name
);
1396 /* These AMD 3DNow! and Intel Katmai New Instructions have an
1397 opcode suffix which is coded in the same place as an 8-bit
1398 immediate field would be. Here we fake an 8-bit immediate
1399 operand from the opcode suffix stored in tm.extension_opcode. */
1401 assert (i
.imm_operands
== 0 && i
.operands
<= 2 && 2 < MAX_OPERANDS
);
1403 exp
= &im_expressions
[i
.imm_operands
++];
1404 i
.op
[i
.operands
].imms
= exp
;
1405 i
.types
[i
.operands
++] = Imm8
;
1406 exp
->X_op
= O_constant
;
1407 exp
->X_add_number
= i
.tm
.extension_opcode
;
1408 i
.tm
.extension_opcode
= None
;
1411 /* For insns with operands there are more diddles to do to the opcode. */
1414 if (!process_operands ())
1417 else if (!quiet_warnings
&& (i
.tm
.opcode_modifier
& Ugh
) != 0)
1419 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
1420 as_warn (_("translating to `%sp'"), i
.tm
.name
);
1423 /* Handle conversion of 'int $3' --> special int3 insn. */
1424 if (i
.tm
.base_opcode
== INT_OPCODE
&& i
.op
[0].imms
->X_add_number
== 3)
1426 i
.tm
.base_opcode
= INT3_OPCODE
;
1430 if ((i
.tm
.opcode_modifier
& (Jump
| JumpByte
| JumpDword
))
1431 && i
.op
[0].disps
->X_op
== O_constant
)
1433 /* Convert "jmp constant" (and "call constant") to a jump (call) to
1434 the absolute address given by the constant. Since ix86 jumps and
1435 calls are pc relative, we need to generate a reloc. */
1436 i
.op
[0].disps
->X_add_symbol
= &abs_symbol
;
1437 i
.op
[0].disps
->X_op
= O_symbol
;
1440 if ((i
.tm
.opcode_modifier
& Rex64
) != 0)
1441 i
.rex
|= REX_MODE64
;
1443 /* For 8 bit registers we need an empty rex prefix. Also if the
1444 instruction already has a prefix, we need to convert old
1445 registers to new ones. */
1447 if (((i
.types
[0] & Reg8
) != 0
1448 && (i
.op
[0].regs
->reg_flags
& RegRex64
) != 0)
1449 || ((i
.types
[1] & Reg8
) != 0
1450 && (i
.op
[1].regs
->reg_flags
& RegRex64
) != 0)
1451 || (((i
.types
[0] & Reg8
) != 0 || (i
.types
[1] & Reg8
) != 0)
1456 i
.rex
|= REX_OPCODE
;
1457 for (x
= 0; x
< 2; x
++)
1459 /* Look for 8 bit operand that uses old registers. */
1460 if ((i
.types
[x
] & Reg8
) != 0
1461 && (i
.op
[x
].regs
->reg_flags
& RegRex64
) == 0)
1463 /* In case it is "hi" register, give up. */
1464 if (i
.op
[x
].regs
->reg_num
> 3)
1465 as_bad (_("can't encode register '%%%s' in an instruction requiring REX prefix.\n"),
1466 i
.op
[x
].regs
->reg_name
);
1468 /* Otherwise it is equivalent to the extended register.
1469 Since the encoding doesn't change this is merely
1470 cosmetic cleanup for debug output. */
1472 i
.op
[x
].regs
= i
.op
[x
].regs
+ 8;
1478 add_prefix (REX_OPCODE
| i
.rex
);
1480 /* We are ready to output the insn. */
1485 parse_insn (line
, mnemonic
)
1490 char *token_start
= l
;
1493 /* Non-zero if we found a prefix only acceptable with string insns. */
1494 const char *expecting_string_instruction
= NULL
;
1499 while ((*mnem_p
= mnemonic_chars
[(unsigned char) *l
]) != 0)
1502 if (mnem_p
>= mnemonic
+ MAX_MNEM_SIZE
)
1504 as_bad (_("no such instruction: `%s'"), token_start
);
1509 if (!is_space_char (*l
)
1510 && *l
!= END_OF_INSN
1511 && *l
!= PREFIX_SEPARATOR
1514 as_bad (_("invalid character %s in mnemonic"),
1515 output_invalid (*l
));
1518 if (token_start
== l
)
1520 if (*l
== PREFIX_SEPARATOR
)
1521 as_bad (_("expecting prefix; got nothing"));
1523 as_bad (_("expecting mnemonic; got nothing"));
1527 /* Look up instruction (or prefix) via hash table. */
1528 current_templates
= hash_find (op_hash
, mnemonic
);
1530 if (*l
!= END_OF_INSN
1531 && (!is_space_char (*l
) || l
[1] != END_OF_INSN
)
1532 && current_templates
1533 && (current_templates
->start
->opcode_modifier
& IsPrefix
))
1535 /* If we are in 16-bit mode, do not allow addr16 or data16.
1536 Similarly, in 32-bit mode, do not allow addr32 or data32. */
1537 if ((current_templates
->start
->opcode_modifier
& (Size16
| Size32
))
1538 && flag_code
!= CODE_64BIT
1539 && (((current_templates
->start
->opcode_modifier
& Size32
) != 0)
1540 ^ (flag_code
== CODE_16BIT
)))
1542 as_bad (_("redundant %s prefix"),
1543 current_templates
->start
->name
);
1546 /* Add prefix, checking for repeated prefixes. */
1547 switch (add_prefix (current_templates
->start
->base_opcode
))
1552 expecting_string_instruction
= current_templates
->start
->name
;
1555 /* Skip past PREFIX_SEPARATOR and reset token_start. */
1562 if (!current_templates
)
1564 /* See if we can get a match by trimming off a suffix. */
1567 case WORD_MNEM_SUFFIX
:
1568 case BYTE_MNEM_SUFFIX
:
1569 case QWORD_MNEM_SUFFIX
:
1570 i
.suffix
= mnem_p
[-1];
1572 current_templates
= hash_find (op_hash
, mnemonic
);
1574 case SHORT_MNEM_SUFFIX
:
1575 case LONG_MNEM_SUFFIX
:
1578 i
.suffix
= mnem_p
[-1];
1580 current_templates
= hash_find (op_hash
, mnemonic
);
1588 if (intel_float_operand (mnemonic
))
1589 i
.suffix
= SHORT_MNEM_SUFFIX
;
1591 i
.suffix
= LONG_MNEM_SUFFIX
;
1593 current_templates
= hash_find (op_hash
, mnemonic
);
1597 if (!current_templates
)
1599 as_bad (_("no such instruction: `%s'"), token_start
);
1604 if (current_templates
->start
->opcode_modifier
& (Jump
| JumpByte
))
1606 /* Check for a branch hint. We allow ",pt" and ",pn" for
1607 predict taken and predict not taken respectively.
1608 I'm not sure that branch hints actually do anything on loop
1609 and jcxz insns (JumpByte) for current Pentium4 chips. They
1610 may work in the future and it doesn't hurt to accept them
1612 if (l
[0] == ',' && l
[1] == 'p')
1616 if (!add_prefix (DS_PREFIX_OPCODE
))
1620 else if (l
[2] == 'n')
1622 if (!add_prefix (CS_PREFIX_OPCODE
))
1628 /* Any other comma loses. */
1631 as_bad (_("invalid character %s in mnemonic"),
1632 output_invalid (*l
));
1636 /* Check if instruction is supported on specified architecture. */
1637 if ((current_templates
->start
->cpu_flags
& ~(Cpu64
| CpuNo64
))
1638 & ~(cpu_arch_flags
& ~(Cpu64
| CpuNo64
)))
1640 as_warn (_("`%s' is not supported on `%s'"),
1641 current_templates
->start
->name
, cpu_arch_name
);
1643 else if ((Cpu386
& ~cpu_arch_flags
) && (flag_code
!= CODE_16BIT
))
1645 as_warn (_("use .code16 to ensure correct addressing mode"));
1648 /* Check for rep/repne without a string instruction. */
1649 if (expecting_string_instruction
1650 && !(current_templates
->start
->opcode_modifier
& IsString
))
1652 as_bad (_("expecting string instruction after `%s'"),
1653 expecting_string_instruction
);
1661 parse_operands (l
, mnemonic
)
1663 const char *mnemonic
;
1667 /* 1 if operand is pending after ','. */
1668 unsigned int expecting_operand
= 0;
1670 /* Non-zero if operand parens not balanced. */
1671 unsigned int paren_not_balanced
;
1673 while (*l
!= END_OF_INSN
)
1675 /* Skip optional white space before operand. */
1676 if (is_space_char (*l
))
1678 if (!is_operand_char (*l
) && *l
!= END_OF_INSN
)
1680 as_bad (_("invalid character %s before operand %d"),
1681 output_invalid (*l
),
1685 token_start
= l
; /* after white space */
1686 paren_not_balanced
= 0;
1687 while (paren_not_balanced
|| *l
!= ',')
1689 if (*l
== END_OF_INSN
)
1691 if (paren_not_balanced
)
1694 as_bad (_("unbalanced parenthesis in operand %d."),
1697 as_bad (_("unbalanced brackets in operand %d."),
1702 break; /* we are done */
1704 else if (!is_operand_char (*l
) && !is_space_char (*l
))
1706 as_bad (_("invalid character %s in operand %d"),
1707 output_invalid (*l
),
1714 ++paren_not_balanced
;
1716 --paren_not_balanced
;
1721 ++paren_not_balanced
;
1723 --paren_not_balanced
;
1727 if (l
!= token_start
)
1728 { /* Yes, we've read in another operand. */
1729 unsigned int operand_ok
;
1730 this_operand
= i
.operands
++;
1731 if (i
.operands
> MAX_OPERANDS
)
1733 as_bad (_("spurious operands; (%d operands/instruction max)"),
1737 /* Now parse operand adding info to 'i' as we go along. */
1738 END_STRING_AND_SAVE (l
);
1742 i386_intel_operand (token_start
,
1743 intel_float_operand (mnemonic
));
1745 operand_ok
= i386_operand (token_start
);
1747 RESTORE_END_STRING (l
);
1753 if (expecting_operand
)
1755 expecting_operand_after_comma
:
1756 as_bad (_("expecting operand after ','; got nothing"));
1761 as_bad (_("expecting operand before ','; got nothing"));
1766 /* Now *l must be either ',' or END_OF_INSN. */
1769 if (*++l
== END_OF_INSN
)
1771 /* Just skip it, if it's \n complain. */
1772 goto expecting_operand_after_comma
;
1774 expecting_operand
= 1;
1783 union i386_op temp_op
;
1784 unsigned int temp_type
;
1785 enum bfd_reloc_code_real temp_reloc
;
1789 if (i
.operands
== 2)
1794 else if (i
.operands
== 3)
1799 temp_type
= i
.types
[xchg2
];
1800 i
.types
[xchg2
] = i
.types
[xchg1
];
1801 i
.types
[xchg1
] = temp_type
;
1802 temp_op
= i
.op
[xchg2
];
1803 i
.op
[xchg2
] = i
.op
[xchg1
];
1804 i
.op
[xchg1
] = temp_op
;
1805 temp_reloc
= i
.reloc
[xchg2
];
1806 i
.reloc
[xchg2
] = i
.reloc
[xchg1
];
1807 i
.reloc
[xchg1
] = temp_reloc
;
1809 if (i
.mem_operands
== 2)
1811 const seg_entry
*temp_seg
;
1812 temp_seg
= i
.seg
[0];
1813 i
.seg
[0] = i
.seg
[1];
1814 i
.seg
[1] = temp_seg
;
1818 /* Try to ensure constant immediates are represented in the smallest
1823 char guess_suffix
= 0;
1827 guess_suffix
= i
.suffix
;
1828 else if (i
.reg_operands
)
1830 /* Figure out a suffix from the last register operand specified.
1831 We can't do this properly yet, ie. excluding InOutPortReg,
1832 but the following works for instructions with immediates.
1833 In any case, we can't set i.suffix yet. */
1834 for (op
= i
.operands
; --op
>= 0;)
1835 if (i
.types
[op
] & Reg
)
1837 if (i
.types
[op
] & Reg8
)
1838 guess_suffix
= BYTE_MNEM_SUFFIX
;
1839 else if (i
.types
[op
] & Reg16
)
1840 guess_suffix
= WORD_MNEM_SUFFIX
;
1841 else if (i
.types
[op
] & Reg32
)
1842 guess_suffix
= LONG_MNEM_SUFFIX
;
1843 else if (i
.types
[op
] & Reg64
)
1844 guess_suffix
= QWORD_MNEM_SUFFIX
;
1848 else if ((flag_code
== CODE_16BIT
) ^ (i
.prefix
[DATA_PREFIX
] != 0))
1849 guess_suffix
= WORD_MNEM_SUFFIX
;
1851 for (op
= i
.operands
; --op
>= 0;)
1852 if (i
.types
[op
] & Imm
)
1854 switch (i
.op
[op
].imms
->X_op
)
1857 /* If a suffix is given, this operand may be shortened. */
1858 switch (guess_suffix
)
1860 case LONG_MNEM_SUFFIX
:
1861 i
.types
[op
] |= Imm32
| Imm64
;
1863 case WORD_MNEM_SUFFIX
:
1864 i
.types
[op
] |= Imm16
| Imm32S
| Imm32
| Imm64
;
1866 case BYTE_MNEM_SUFFIX
:
1867 i
.types
[op
] |= Imm16
| Imm8
| Imm8S
| Imm32S
| Imm32
| Imm64
;
1871 /* If this operand is at most 16 bits, convert it
1872 to a signed 16 bit number before trying to see
1873 whether it will fit in an even smaller size.
1874 This allows a 16-bit operand such as $0xffe0 to
1875 be recognised as within Imm8S range. */
1876 if ((i
.types
[op
] & Imm16
)
1877 && (i
.op
[op
].imms
->X_add_number
& ~(offsetT
) 0xffff) == 0)
1879 i
.op
[op
].imms
->X_add_number
=
1880 (((i
.op
[op
].imms
->X_add_number
& 0xffff) ^ 0x8000) - 0x8000);
1882 if ((i
.types
[op
] & Imm32
)
1883 && ((i
.op
[op
].imms
->X_add_number
& ~(((offsetT
) 2 << 31) - 1))
1886 i
.op
[op
].imms
->X_add_number
= ((i
.op
[op
].imms
->X_add_number
1887 ^ ((offsetT
) 1 << 31))
1888 - ((offsetT
) 1 << 31));
1890 i
.types
[op
] |= smallest_imm_type (i
.op
[op
].imms
->X_add_number
);
1892 /* We must avoid matching of Imm32 templates when 64bit
1893 only immediate is available. */
1894 if (guess_suffix
== QWORD_MNEM_SUFFIX
)
1895 i
.types
[op
] &= ~Imm32
;
1902 /* Symbols and expressions. */
1904 /* Convert symbolic operand to proper sizes for matching. */
1905 switch (guess_suffix
)
1907 case QWORD_MNEM_SUFFIX
:
1908 i
.types
[op
] = Imm64
| Imm32S
;
1910 case LONG_MNEM_SUFFIX
:
1911 i
.types
[op
] = Imm32
| Imm64
;
1913 case WORD_MNEM_SUFFIX
:
1914 i
.types
[op
] = Imm16
| Imm32
| Imm64
;
1917 case BYTE_MNEM_SUFFIX
:
1918 i
.types
[op
] = Imm8
| Imm8S
| Imm16
| Imm32S
| Imm32
;
1927 /* Try to use the smallest displacement type too. */
1933 for (op
= i
.operands
; --op
>= 0;)
1934 if ((i
.types
[op
] & Disp
) && i
.op
[op
].disps
->X_op
== O_constant
)
1936 offsetT disp
= i
.op
[op
].disps
->X_add_number
;
1938 if (i
.types
[op
] & Disp16
)
1940 /* We know this operand is at most 16 bits, so
1941 convert to a signed 16 bit number before trying
1942 to see whether it will fit in an even smaller
1945 disp
= (((disp
& 0xffff) ^ 0x8000) - 0x8000);
1947 else if (i
.types
[op
] & Disp32
)
1949 /* We know this operand is at most 32 bits, so convert to a
1950 signed 32 bit number before trying to see whether it will
1951 fit in an even smaller size. */
1952 disp
&= (((offsetT
) 2 << 31) - 1);
1953 disp
= (disp
^ ((offsetT
) 1 << 31)) - ((addressT
) 1 << 31);
1955 if (flag_code
== CODE_64BIT
)
1957 if (fits_in_signed_long (disp
))
1958 i
.types
[op
] |= Disp32S
;
1959 if (fits_in_unsigned_long (disp
))
1960 i
.types
[op
] |= Disp32
;
1962 if ((i
.types
[op
] & (Disp32
| Disp32S
| Disp16
))
1963 && fits_in_signed_byte (disp
))
1964 i
.types
[op
] |= Disp8
;
1971 /* Points to template once we've found it. */
1973 unsigned int overlap0
, overlap1
, overlap2
;
1974 unsigned int found_reverse_match
;
1977 #define MATCH(overlap, given, template) \
1978 ((overlap & ~JumpAbsolute) \
1979 && (((given) & (BaseIndex | JumpAbsolute)) \
1980 == ((overlap) & (BaseIndex | JumpAbsolute))))
1982 /* If given types r0 and r1 are registers they must be of the same type
1983 unless the expected operand type register overlap is null.
1984 Note that Acc in a template matches every size of reg. */
1985 #define CONSISTENT_REGISTER_MATCH(m0, g0, t0, m1, g1, t1) \
1986 (((g0) & Reg) == 0 || ((g1) & Reg) == 0 \
1987 || ((g0) & Reg) == ((g1) & Reg) \
1988 || ((((m0) & Acc) ? Reg : (t0)) & (((m1) & Acc) ? Reg : (t1)) & Reg) == 0 )
1993 found_reverse_match
= 0;
1994 suffix_check
= (i
.suffix
== BYTE_MNEM_SUFFIX
1996 : (i
.suffix
== WORD_MNEM_SUFFIX
1998 : (i
.suffix
== SHORT_MNEM_SUFFIX
2000 : (i
.suffix
== LONG_MNEM_SUFFIX
2002 : (i
.suffix
== QWORD_MNEM_SUFFIX
2004 : (i
.suffix
== LONG_DOUBLE_MNEM_SUFFIX
2005 ? No_xSuf
: 0))))));
2007 for (t
= current_templates
->start
;
2008 t
< current_templates
->end
;
2011 /* Must have right number of operands. */
2012 if (i
.operands
!= t
->operands
)
2015 /* Check the suffix, except for some instructions in intel mode. */
2016 if ((t
->opcode_modifier
& suffix_check
)
2018 && (t
->opcode_modifier
& IgnoreSize
))
2020 && t
->base_opcode
== 0xd9
2021 && (t
->extension_opcode
== 5 /* 0xd9,5 "fldcw" */
2022 || t
->extension_opcode
== 7))) /* 0xd9,7 "f{n}stcw" */
2025 /* Do not verify operands when there are none. */
2026 else if (!t
->operands
)
2028 if (t
->cpu_flags
& ~cpu_arch_flags
)
2030 /* We've found a match; break out of loop. */
2034 overlap0
= i
.types
[0] & t
->operand_types
[0];
2035 switch (t
->operands
)
2038 if (!MATCH (overlap0
, i
.types
[0], t
->operand_types
[0]))
2043 overlap1
= i
.types
[1] & t
->operand_types
[1];
2044 if (!MATCH (overlap0
, i
.types
[0], t
->operand_types
[0])
2045 || !MATCH (overlap1
, i
.types
[1], t
->operand_types
[1])
2046 || !CONSISTENT_REGISTER_MATCH (overlap0
, i
.types
[0],
2047 t
->operand_types
[0],
2048 overlap1
, i
.types
[1],
2049 t
->operand_types
[1]))
2051 /* Check if other direction is valid ... */
2052 if ((t
->opcode_modifier
& (D
| FloatD
)) == 0)
2055 /* Try reversing direction of operands. */
2056 overlap0
= i
.types
[0] & t
->operand_types
[1];
2057 overlap1
= i
.types
[1] & t
->operand_types
[0];
2058 if (!MATCH (overlap0
, i
.types
[0], t
->operand_types
[1])
2059 || !MATCH (overlap1
, i
.types
[1], t
->operand_types
[0])
2060 || !CONSISTENT_REGISTER_MATCH (overlap0
, i
.types
[0],
2061 t
->operand_types
[1],
2062 overlap1
, i
.types
[1],
2063 t
->operand_types
[0]))
2065 /* Does not match either direction. */
2068 /* found_reverse_match holds which of D or FloatDR
2070 found_reverse_match
= t
->opcode_modifier
& (D
| FloatDR
);
2072 /* Found a forward 2 operand match here. */
2073 else if (t
->operands
== 3)
2075 /* Here we make use of the fact that there are no
2076 reverse match 3 operand instructions, and all 3
2077 operand instructions only need to be checked for
2078 register consistency between operands 2 and 3. */
2079 overlap2
= i
.types
[2] & t
->operand_types
[2];
2080 if (!MATCH (overlap2
, i
.types
[2], t
->operand_types
[2])
2081 || !CONSISTENT_REGISTER_MATCH (overlap1
, i
.types
[1],
2082 t
->operand_types
[1],
2083 overlap2
, i
.types
[2],
2084 t
->operand_types
[2]))
2088 /* Found either forward/reverse 2 or 3 operand match here:
2089 slip through to break. */
2091 if (t
->cpu_flags
& ~cpu_arch_flags
)
2093 found_reverse_match
= 0;
2096 /* We've found a match; break out of loop. */
2100 if (t
== current_templates
->end
)
2102 /* We found no match. */
2103 as_bad (_("suffix or operands invalid for `%s'"),
2104 current_templates
->start
->name
);
2108 if (!quiet_warnings
)
2111 && ((i
.types
[0] & JumpAbsolute
)
2112 != (t
->operand_types
[0] & JumpAbsolute
)))
2114 as_warn (_("indirect %s without `*'"), t
->name
);
2117 if ((t
->opcode_modifier
& (IsPrefix
| IgnoreSize
))
2118 == (IsPrefix
| IgnoreSize
))
2120 /* Warn them that a data or address size prefix doesn't
2121 affect assembly of the next line of code. */
2122 as_warn (_("stand-alone `%s' prefix"), t
->name
);
2126 /* Copy the template we found. */
2128 if (found_reverse_match
)
2130 /* If we found a reverse match we must alter the opcode
2131 direction bit. found_reverse_match holds bits to change
2132 (different for int & float insns). */
2134 i
.tm
.base_opcode
^= found_reverse_match
;
2136 i
.tm
.operand_types
[0] = t
->operand_types
[1];
2137 i
.tm
.operand_types
[1] = t
->operand_types
[0];
2146 int mem_op
= (i
.types
[0] & AnyMem
) ? 0 : 1;
2147 if ((i
.tm
.operand_types
[mem_op
] & EsSeg
) != 0)
2149 if (i
.seg
[0] != NULL
&& i
.seg
[0] != &es
)
2151 as_bad (_("`%s' operand %d must use `%%es' segment"),
2156 /* There's only ever one segment override allowed per instruction.
2157 This instruction possibly has a legal segment override on the
2158 second operand, so copy the segment to where non-string
2159 instructions store it, allowing common code. */
2160 i
.seg
[0] = i
.seg
[1];
2162 else if ((i
.tm
.operand_types
[mem_op
+ 1] & EsSeg
) != 0)
2164 if (i
.seg
[1] != NULL
&& i
.seg
[1] != &es
)
2166 as_bad (_("`%s' operand %d must use `%%es' segment"),
2178 /* If matched instruction specifies an explicit instruction mnemonic
2180 if (i
.tm
.opcode_modifier
& (Size16
| Size32
| Size64
))
2182 if (i
.tm
.opcode_modifier
& Size16
)
2183 i
.suffix
= WORD_MNEM_SUFFIX
;
2184 else if (i
.tm
.opcode_modifier
& Size64
)
2185 i
.suffix
= QWORD_MNEM_SUFFIX
;
2187 i
.suffix
= LONG_MNEM_SUFFIX
;
2189 else if (i
.reg_operands
)
2191 /* If there's no instruction mnemonic suffix we try to invent one
2192 based on register operands. */
2195 /* We take i.suffix from the last register operand specified,
2196 Destination register type is more significant than source
2199 for (op
= i
.operands
; --op
>= 0;)
2200 if ((i
.types
[op
] & Reg
)
2201 && !(i
.tm
.operand_types
[op
] & InOutPortReg
))
2203 i
.suffix
= ((i
.types
[op
] & Reg8
) ? BYTE_MNEM_SUFFIX
:
2204 (i
.types
[op
] & Reg16
) ? WORD_MNEM_SUFFIX
:
2205 (i
.types
[op
] & Reg64
) ? QWORD_MNEM_SUFFIX
:
2210 else if (i
.suffix
== BYTE_MNEM_SUFFIX
)
2212 if (!check_byte_reg ())
2215 else if (i
.suffix
== LONG_MNEM_SUFFIX
)
2217 if (!check_long_reg ())
2220 else if (i
.suffix
== QWORD_MNEM_SUFFIX
)
2222 if (!check_qword_reg ())
2225 else if (i
.suffix
== WORD_MNEM_SUFFIX
)
2227 if (!check_word_reg ())
2230 else if (intel_syntax
&& (i
.tm
.opcode_modifier
& IgnoreSize
))
2231 /* Do nothing if the instruction is going to ignore the prefix. */
2236 else if ((i
.tm
.opcode_modifier
& DefaultSize
) && !i
.suffix
)
2238 i
.suffix
= stackop_size
;
2241 /* Change the opcode based on the operand size given by i.suffix;
2242 We need not change things for byte insns. */
2244 if (!i
.suffix
&& (i
.tm
.opcode_modifier
& W
))
2246 as_bad (_("no instruction mnemonic suffix given and no register operands; can't size instruction"));
2250 if (i
.suffix
&& i
.suffix
!= BYTE_MNEM_SUFFIX
)
2252 /* It's not a byte, select word/dword operation. */
2253 if (i
.tm
.opcode_modifier
& W
)
2255 if (i
.tm
.opcode_modifier
& ShortForm
)
2256 i
.tm
.base_opcode
|= 8;
2258 i
.tm
.base_opcode
|= 1;
2261 /* Now select between word & dword operations via the operand
2262 size prefix, except for instructions that will ignore this
2264 if (i
.suffix
!= QWORD_MNEM_SUFFIX
2265 && !(i
.tm
.opcode_modifier
& IgnoreSize
)
2266 && ((i
.suffix
== LONG_MNEM_SUFFIX
) == (flag_code
== CODE_16BIT
)
2267 || (flag_code
== CODE_64BIT
2268 && (i
.tm
.opcode_modifier
& JumpByte
))))
2270 unsigned int prefix
= DATA_PREFIX_OPCODE
;
2271 if (i
.tm
.opcode_modifier
& JumpByte
) /* jcxz, loop */
2272 prefix
= ADDR_PREFIX_OPCODE
;
2274 if (!add_prefix (prefix
))
2278 /* Set mode64 for an operand. */
2279 if (i
.suffix
== QWORD_MNEM_SUFFIX
2280 && flag_code
== CODE_64BIT
2281 && (i
.tm
.opcode_modifier
& NoRex64
) == 0)
2282 i
.rex
|= REX_MODE64
;
2284 /* Size floating point instruction. */
2285 if (i
.suffix
== LONG_MNEM_SUFFIX
)
2287 if (i
.tm
.opcode_modifier
& FloatMF
)
2288 i
.tm
.base_opcode
^= 4;
2299 for (op
= i
.operands
; --op
>= 0;)
2301 /* If this is an eight bit register, it's OK. If it's the 16 or
2302 32 bit version of an eight bit register, we will just use the
2303 low portion, and that's OK too. */
2304 if (i
.types
[op
] & Reg8
)
2307 /* movzx and movsx should not generate this warning. */
2309 && (i
.tm
.base_opcode
== 0xfb7
2310 || i
.tm
.base_opcode
== 0xfb6
2311 || i
.tm
.base_opcode
== 0x63
2312 || i
.tm
.base_opcode
== 0xfbe
2313 || i
.tm
.base_opcode
== 0xfbf))
2316 if ((i
.types
[op
] & WordReg
) && i
.op
[op
].regs
->reg_num
< 4
2318 /* Check that the template allows eight bit regs. This
2319 kills insns such as `orb $1,%edx', which maybe should be
2321 && (i
.tm
.operand_types
[op
] & (Reg8
| InOutPortReg
))
2325 /* Prohibit these changes in the 64bit mode, since the
2326 lowering is more complicated. */
2327 if (flag_code
== CODE_64BIT
2328 && (i
.tm
.operand_types
[op
] & InOutPortReg
) == 0)
2330 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2331 i
.op
[op
].regs
->reg_name
,
2335 #if REGISTER_WARNINGS
2337 && (i
.tm
.operand_types
[op
] & InOutPortReg
) == 0)
2338 as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
2339 (i
.op
[op
].regs
+ (i
.types
[op
] & Reg16
2340 ? REGNAM_AL
- REGNAM_AX
2341 : REGNAM_AL
- REGNAM_EAX
))->reg_name
,
2342 i
.op
[op
].regs
->reg_name
,
2347 /* Any other register is bad. */
2348 if (i
.types
[op
] & (Reg
| RegMMX
| RegXMM
2350 | Control
| Debug
| Test
2351 | FloatReg
| FloatAcc
))
2353 as_bad (_("`%%%s' not allowed with `%s%c'"),
2354 i
.op
[op
].regs
->reg_name
,
2368 for (op
= i
.operands
; --op
>= 0;)
2369 /* Reject eight bit registers, except where the template requires
2370 them. (eg. movzb) */
2371 if ((i
.types
[op
] & Reg8
) != 0
2372 && (i
.tm
.operand_types
[op
] & (Reg16
| Reg32
| Acc
)) != 0)
2374 as_bad (_("`%%%s' not allowed with `%s%c'"),
2375 i
.op
[op
].regs
->reg_name
,
2380 /* Warn if the e prefix on a general reg is missing. */
2381 else if ((!quiet_warnings
|| flag_code
== CODE_64BIT
)
2382 && (i
.types
[op
] & Reg16
) != 0
2383 && (i
.tm
.operand_types
[op
] & (Reg32
| Acc
)) != 0)
2385 /* Prohibit these changes in the 64bit mode, since the
2386 lowering is more complicated. */
2387 if (flag_code
== CODE_64BIT
)
2389 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2390 i
.op
[op
].regs
->reg_name
,
2394 #if REGISTER_WARNINGS
2396 as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
2397 (i
.op
[op
].regs
+ REGNAM_EAX
- REGNAM_AX
)->reg_name
,
2398 i
.op
[op
].regs
->reg_name
,
2402 /* Warn if the r prefix on a general reg is missing. */
2403 else if ((i
.types
[op
] & Reg64
) != 0
2404 && (i
.tm
.operand_types
[op
] & (Reg32
| Acc
)) != 0)
2406 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2407 i
.op
[op
].regs
->reg_name
,
2419 for (op
= i
.operands
; --op
>= 0; )
2420 /* Reject eight bit registers, except where the template requires
2421 them. (eg. movzb) */
2422 if ((i
.types
[op
] & Reg8
) != 0
2423 && (i
.tm
.operand_types
[op
] & (Reg16
| Reg32
| Acc
)) != 0)
2425 as_bad (_("`%%%s' not allowed with `%s%c'"),
2426 i
.op
[op
].regs
->reg_name
,
2431 /* Warn if the e prefix on a general reg is missing. */
2432 else if (((i
.types
[op
] & Reg16
) != 0
2433 || (i
.types
[op
] & Reg32
) != 0)
2434 && (i
.tm
.operand_types
[op
] & (Reg32
| Acc
)) != 0)
2436 /* Prohibit these changes in the 64bit mode, since the
2437 lowering is more complicated. */
2438 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2439 i
.op
[op
].regs
->reg_name
,
2450 for (op
= i
.operands
; --op
>= 0;)
2451 /* Reject eight bit registers, except where the template requires
2452 them. (eg. movzb) */
2453 if ((i
.types
[op
] & Reg8
) != 0
2454 && (i
.tm
.operand_types
[op
] & (Reg16
| Reg32
| Acc
)) != 0)
2456 as_bad (_("`%%%s' not allowed with `%s%c'"),
2457 i
.op
[op
].regs
->reg_name
,
2462 /* Warn if the e prefix on a general reg is present. */
2463 else if ((!quiet_warnings
|| flag_code
== CODE_64BIT
)
2464 && (i
.types
[op
] & Reg32
) != 0
2465 && (i
.tm
.operand_types
[op
] & (Reg16
| Acc
)) != 0)
2467 /* Prohibit these changes in the 64bit mode, since the
2468 lowering is more complicated. */
2469 if (flag_code
== CODE_64BIT
)
2471 as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2472 i
.op
[op
].regs
->reg_name
,
2477 #if REGISTER_WARNINGS
2478 as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
2479 (i
.op
[op
].regs
+ REGNAM_AX
- REGNAM_EAX
)->reg_name
,
2480 i
.op
[op
].regs
->reg_name
,
2490 unsigned int overlap0
, overlap1
, overlap2
;
2492 overlap0
= i
.types
[0] & i
.tm
.operand_types
[0];
2493 if ((overlap0
& (Imm8
| Imm8S
| Imm16
| Imm32
| Imm32S
))
2494 && overlap0
!= Imm8
&& overlap0
!= Imm8S
2495 && overlap0
!= Imm16
&& overlap0
!= Imm32S
2496 && overlap0
!= Imm32
&& overlap0
!= Imm64
)
2500 overlap0
&= (i
.suffix
== BYTE_MNEM_SUFFIX
2502 : (i
.suffix
== WORD_MNEM_SUFFIX
2504 : (i
.suffix
== QWORD_MNEM_SUFFIX
2508 else if (overlap0
== (Imm16
| Imm32S
| Imm32
)
2509 || overlap0
== (Imm16
| Imm32
)
2510 || overlap0
== (Imm16
| Imm32S
))
2512 overlap0
= ((flag_code
== CODE_16BIT
) ^ (i
.prefix
[DATA_PREFIX
] != 0)
2515 if (overlap0
!= Imm8
&& overlap0
!= Imm8S
2516 && overlap0
!= Imm16
&& overlap0
!= Imm32S
2517 && overlap0
!= Imm32
&& overlap0
!= Imm64
)
2519 as_bad (_("no instruction mnemonic suffix given; can't determine immediate size"));
2523 i
.types
[0] = overlap0
;
2525 overlap1
= i
.types
[1] & i
.tm
.operand_types
[1];
2526 if ((overlap1
& (Imm8
| Imm8S
| Imm16
| Imm32S
| Imm32
))
2527 && overlap1
!= Imm8
&& overlap1
!= Imm8S
2528 && overlap1
!= Imm16
&& overlap1
!= Imm32S
2529 && overlap1
!= Imm32
&& overlap1
!= Imm64
)
2533 overlap1
&= (i
.suffix
== BYTE_MNEM_SUFFIX
2535 : (i
.suffix
== WORD_MNEM_SUFFIX
2537 : (i
.suffix
== QWORD_MNEM_SUFFIX
2541 else if (overlap1
== (Imm16
| Imm32
| Imm32S
)
2542 || overlap1
== (Imm16
| Imm32
)
2543 || overlap1
== (Imm16
| Imm32S
))
2545 overlap1
= ((flag_code
== CODE_16BIT
) ^ (i
.prefix
[DATA_PREFIX
] != 0)
2548 if (overlap1
!= Imm8
&& overlap1
!= Imm8S
2549 && overlap1
!= Imm16
&& overlap1
!= Imm32S
2550 && overlap1
!= Imm32
&& overlap1
!= Imm64
)
2552 as_bad (_("no instruction mnemonic suffix given; can't determine immediate size %x %c"),overlap1
, i
.suffix
);
2556 i
.types
[1] = overlap1
;
2558 overlap2
= i
.types
[2] & i
.tm
.operand_types
[2];
2559 assert ((overlap2
& Imm
) == 0);
2560 i
.types
[2] = overlap2
;
2568 /* Default segment register this instruction will use for memory
2569 accesses. 0 means unknown. This is only for optimizing out
2570 unnecessary segment overrides. */
2571 const seg_entry
*default_seg
= 0;
2573 /* The imul $imm, %reg instruction is converted into
2574 imul $imm, %reg, %reg, and the clr %reg instruction
2575 is converted into xor %reg, %reg. */
2576 if (i
.tm
.opcode_modifier
& regKludge
)
2578 unsigned int first_reg_op
= (i
.types
[0] & Reg
) ? 0 : 1;
2579 /* Pretend we saw the extra register operand. */
2580 assert (i
.op
[first_reg_op
+ 1].regs
== 0);
2581 i
.op
[first_reg_op
+ 1].regs
= i
.op
[first_reg_op
].regs
;
2582 i
.types
[first_reg_op
+ 1] = i
.types
[first_reg_op
];
2586 if (i
.tm
.opcode_modifier
& ShortForm
)
2588 /* The register or float register operand is in operand 0 or 1. */
2589 unsigned int op
= (i
.types
[0] & (Reg
| FloatReg
)) ? 0 : 1;
2590 /* Register goes in low 3 bits of opcode. */
2591 i
.tm
.base_opcode
|= i
.op
[op
].regs
->reg_num
;
2592 if ((i
.op
[op
].regs
->reg_flags
& RegRex
) != 0)
2594 if (!quiet_warnings
&& (i
.tm
.opcode_modifier
& Ugh
) != 0)
2596 /* Warn about some common errors, but press on regardless.
2597 The first case can be generated by gcc (<= 2.8.1). */
2598 if (i
.operands
== 2)
2600 /* Reversed arguments on faddp, fsubp, etc. */
2601 as_warn (_("translating to `%s %%%s,%%%s'"), i
.tm
.name
,
2602 i
.op
[1].regs
->reg_name
,
2603 i
.op
[0].regs
->reg_name
);
2607 /* Extraneous `l' suffix on fp insn. */
2608 as_warn (_("translating to `%s %%%s'"), i
.tm
.name
,
2609 i
.op
[0].regs
->reg_name
);
2613 else if (i
.tm
.opcode_modifier
& Modrm
)
2615 /* The opcode is completed (modulo i.tm.extension_opcode which
2616 must be put into the modrm byte). Now, we make the modrm and
2617 index base bytes based on all the info we've collected. */
2619 default_seg
= build_modrm_byte ();
2621 else if (i
.tm
.opcode_modifier
& (Seg2ShortForm
| Seg3ShortForm
))
2623 if (i
.tm
.base_opcode
== POP_SEG_SHORT
2624 && i
.op
[0].regs
->reg_num
== 1)
2626 as_bad (_("you can't `pop %%cs'"));
2629 i
.tm
.base_opcode
|= (i
.op
[0].regs
->reg_num
<< 3);
2630 if ((i
.op
[0].regs
->reg_flags
& RegRex
) != 0)
2633 else if ((i
.tm
.base_opcode
& ~(D
| W
)) == MOV_AX_DISP32
)
2637 else if ((i
.tm
.opcode_modifier
& IsString
) != 0)
2639 /* For the string instructions that allow a segment override
2640 on one of their operands, the default segment is ds. */
2644 if (i
.tm
.base_opcode
== 0x8d /* lea */ && i
.seg
[0] && !quiet_warnings
)
2645 as_warn (_("segment override on `lea' is ineffectual"));
2647 /* If a segment was explicitly specified, and the specified segment
2648 is not the default, use an opcode prefix to select it. If we
2649 never figured out what the default segment is, then default_seg
2650 will be zero at this point, and the specified segment prefix will
2652 if ((i
.seg
[0]) && (i
.seg
[0] != default_seg
))
2654 if (!add_prefix (i
.seg
[0]->seg_prefix
))
2660 static const seg_entry
*
2663 const seg_entry
*default_seg
= 0;
2665 /* i.reg_operands MUST be the number of real register operands;
2666 implicit registers do not count. */
2667 if (i
.reg_operands
== 2)
2669 unsigned int source
, dest
;
2670 source
= ((i
.types
[0]
2671 & (Reg
| RegMMX
| RegXMM
2673 | Control
| Debug
| Test
))
2678 /* One of the register operands will be encoded in the i.tm.reg
2679 field, the other in the combined i.tm.mode and i.tm.regmem
2680 fields. If no form of this instruction supports a memory
2681 destination operand, then we assume the source operand may
2682 sometimes be a memory operand and so we need to store the
2683 destination in the i.rm.reg field. */
2684 if ((i
.tm
.operand_types
[dest
] & AnyMem
) == 0)
2686 i
.rm
.reg
= i
.op
[dest
].regs
->reg_num
;
2687 i
.rm
.regmem
= i
.op
[source
].regs
->reg_num
;
2688 if ((i
.op
[dest
].regs
->reg_flags
& RegRex
) != 0)
2690 if ((i
.op
[source
].regs
->reg_flags
& RegRex
) != 0)
2695 i
.rm
.reg
= i
.op
[source
].regs
->reg_num
;
2696 i
.rm
.regmem
= i
.op
[dest
].regs
->reg_num
;
2697 if ((i
.op
[dest
].regs
->reg_flags
& RegRex
) != 0)
2699 if ((i
.op
[source
].regs
->reg_flags
& RegRex
) != 0)
2704 { /* If it's not 2 reg operands... */
2707 unsigned int fake_zero_displacement
= 0;
2708 unsigned int op
= ((i
.types
[0] & AnyMem
)
2710 : (i
.types
[1] & AnyMem
) ? 1 : 2);
2714 if (i
.base_reg
== 0)
2717 if (!i
.disp_operands
)
2718 fake_zero_displacement
= 1;
2719 if (i
.index_reg
== 0)
2721 /* Operand is just <disp> */
2722 if ((flag_code
== CODE_16BIT
) ^ (i
.prefix
[ADDR_PREFIX
] != 0)
2723 && (flag_code
!= CODE_64BIT
))
2725 i
.rm
.regmem
= NO_BASE_REGISTER_16
;
2726 i
.types
[op
] &= ~Disp
;
2727 i
.types
[op
] |= Disp16
;
2729 else if (flag_code
!= CODE_64BIT
2730 || (i
.prefix
[ADDR_PREFIX
] != 0))
2732 i
.rm
.regmem
= NO_BASE_REGISTER
;
2733 i
.types
[op
] &= ~Disp
;
2734 i
.types
[op
] |= Disp32
;
2738 /* 64bit mode overwrites the 32bit absolute
2739 addressing by RIP relative addressing and
2740 absolute addressing is encoded by one of the
2741 redundant SIB forms. */
2742 i
.rm
.regmem
= ESCAPE_TO_TWO_BYTE_ADDRESSING
;
2743 i
.sib
.base
= NO_BASE_REGISTER
;
2744 i
.sib
.index
= NO_INDEX_REGISTER
;
2745 i
.types
[op
] &= ~Disp
;
2746 i
.types
[op
] |= Disp32S
;
2749 else /* !i.base_reg && i.index_reg */
2751 i
.sib
.index
= i
.index_reg
->reg_num
;
2752 i
.sib
.base
= NO_BASE_REGISTER
;
2753 i
.sib
.scale
= i
.log2_scale_factor
;
2754 i
.rm
.regmem
= ESCAPE_TO_TWO_BYTE_ADDRESSING
;
2755 i
.types
[op
] &= ~Disp
;
2756 if (flag_code
!= CODE_64BIT
)
2757 i
.types
[op
] |= Disp32
; /* Must be 32 bit */
2759 i
.types
[op
] |= Disp32S
;
2760 if ((i
.index_reg
->reg_flags
& RegRex
) != 0)
2764 /* RIP addressing for 64bit mode. */
2765 else if (i
.base_reg
->reg_type
== BaseIndex
)
2767 i
.rm
.regmem
= NO_BASE_REGISTER
;
2768 i
.types
[op
] &= ~Disp
;
2769 i
.types
[op
] |= Disp32S
;
2770 i
.flags
[op
] = Operand_PCrel
;
2772 else if (i
.base_reg
->reg_type
& Reg16
)
2774 switch (i
.base_reg
->reg_num
)
2777 if (i
.index_reg
== 0)
2779 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
2780 i
.rm
.regmem
= i
.index_reg
->reg_num
- 6;
2784 if (i
.index_reg
== 0)
2787 if ((i
.types
[op
] & Disp
) == 0)
2789 /* fake (%bp) into 0(%bp) */
2790 i
.types
[op
] |= Disp8
;
2791 fake_zero_displacement
= 1;
2794 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
2795 i
.rm
.regmem
= i
.index_reg
->reg_num
- 6 + 2;
2797 default: /* (%si) -> 4 or (%di) -> 5 */
2798 i
.rm
.regmem
= i
.base_reg
->reg_num
- 6 + 4;
2800 i
.rm
.mode
= mode_from_disp_size (i
.types
[op
]);
2802 else /* i.base_reg and 32/64 bit mode */
2804 if (flag_code
== CODE_64BIT
2805 && (i
.types
[op
] & Disp
))
2807 if (i
.types
[op
] & Disp8
)
2808 i
.types
[op
] = Disp8
| Disp32S
;
2810 i
.types
[op
] = Disp32S
;
2812 i
.rm
.regmem
= i
.base_reg
->reg_num
;
2813 if ((i
.base_reg
->reg_flags
& RegRex
) != 0)
2815 i
.sib
.base
= i
.base_reg
->reg_num
;
2816 /* x86-64 ignores REX prefix bit here to avoid decoder
2818 if ((i
.base_reg
->reg_num
& 7) == EBP_REG_NUM
)
2821 if (i
.disp_operands
== 0)
2823 fake_zero_displacement
= 1;
2824 i
.types
[op
] |= Disp8
;
2827 else if (i
.base_reg
->reg_num
== ESP_REG_NUM
)
2831 i
.sib
.scale
= i
.log2_scale_factor
;
2832 if (i
.index_reg
== 0)
2834 /* <disp>(%esp) becomes two byte modrm with no index
2835 register. We've already stored the code for esp
2836 in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
2837 Any base register besides %esp will not use the
2838 extra modrm byte. */
2839 i
.sib
.index
= NO_INDEX_REGISTER
;
2840 #if !SCALE1_WHEN_NO_INDEX
2841 /* Another case where we force the second modrm byte. */
2842 if (i
.log2_scale_factor
)
2843 i
.rm
.regmem
= ESCAPE_TO_TWO_BYTE_ADDRESSING
;
2848 i
.sib
.index
= i
.index_reg
->reg_num
;
2849 i
.rm
.regmem
= ESCAPE_TO_TWO_BYTE_ADDRESSING
;
2850 if ((i
.index_reg
->reg_flags
& RegRex
) != 0)
2853 i
.rm
.mode
= mode_from_disp_size (i
.types
[op
]);
2856 if (fake_zero_displacement
)
2858 /* Fakes a zero displacement assuming that i.types[op]
2859 holds the correct displacement size. */
2862 assert (i
.op
[op
].disps
== 0);
2863 exp
= &disp_expressions
[i
.disp_operands
++];
2864 i
.op
[op
].disps
= exp
;
2865 exp
->X_op
= O_constant
;
2866 exp
->X_add_number
= 0;
2867 exp
->X_add_symbol
= (symbolS
*) 0;
2868 exp
->X_op_symbol
= (symbolS
*) 0;
2872 /* Fill in i.rm.reg or i.rm.regmem field with register operand
2873 (if any) based on i.tm.extension_opcode. Again, we must be
2874 careful to make sure that segment/control/debug/test/MMX
2875 registers are coded into the i.rm.reg field. */
2880 & (Reg
| RegMMX
| RegXMM
2882 | Control
| Debug
| Test
))
2885 & (Reg
| RegMMX
| RegXMM
2887 | Control
| Debug
| Test
))
2890 /* If there is an extension opcode to put here, the register
2891 number must be put into the regmem field. */
2892 if (i
.tm
.extension_opcode
!= None
)
2894 i
.rm
.regmem
= i
.op
[op
].regs
->reg_num
;
2895 if ((i
.op
[op
].regs
->reg_flags
& RegRex
) != 0)
2900 i
.rm
.reg
= i
.op
[op
].regs
->reg_num
;
2901 if ((i
.op
[op
].regs
->reg_flags
& RegRex
) != 0)
2905 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
2906 must set it to 3 to indicate this is a register operand
2907 in the regmem field. */
2908 if (!i
.mem_operands
)
2912 /* Fill in i.rm.reg field with extension opcode (if any). */
2913 if (i
.tm
.extension_opcode
!= None
)
2914 i
.rm
.reg
= i
.tm
.extension_opcode
;
2925 relax_substateT subtype
;
2930 if (flag_code
== CODE_16BIT
)
2934 if (i
.prefix
[DATA_PREFIX
] != 0)
2940 /* Pentium4 branch hints. */
2941 if (i
.prefix
[SEG_PREFIX
] == CS_PREFIX_OPCODE
/* not taken */
2942 || i
.prefix
[SEG_PREFIX
] == DS_PREFIX_OPCODE
/* taken */)
2947 if (i
.prefix
[REX_PREFIX
] != 0)
2953 if (i
.prefixes
!= 0 && !intel_syntax
)
2954 as_warn (_("skipping prefixes on this instruction"));
2956 /* It's always a symbol; End frag & setup for relax.
2957 Make sure there is enough room in this frag for the largest
2958 instruction we may generate in md_convert_frag. This is 2
2959 bytes for the opcode and room for the prefix and largest
2961 frag_grow (prefix
+ 2 + 4);
2962 /* Prefix and 1 opcode byte go in fr_fix. */
2963 p
= frag_more (prefix
+ 1);
2964 if (i
.prefix
[DATA_PREFIX
] != 0)
2965 *p
++ = DATA_PREFIX_OPCODE
;
2966 if (i
.prefix
[SEG_PREFIX
] == CS_PREFIX_OPCODE
2967 || i
.prefix
[SEG_PREFIX
] == DS_PREFIX_OPCODE
)
2968 *p
++ = i
.prefix
[SEG_PREFIX
];
2969 if (i
.prefix
[REX_PREFIX
] != 0)
2970 *p
++ = i
.prefix
[REX_PREFIX
];
2971 *p
= i
.tm
.base_opcode
;
2973 if ((unsigned char) *p
== JUMP_PC_RELATIVE
)
2974 subtype
= ENCODE_RELAX_STATE (UNCOND_JUMP
, SMALL
);
2975 else if ((cpu_arch_flags
& Cpu386
) != 0)
2976 subtype
= ENCODE_RELAX_STATE (COND_JUMP
, SMALL
);
2978 subtype
= ENCODE_RELAX_STATE (COND_JUMP86
, SMALL
);
2981 sym
= i
.op
[0].disps
->X_add_symbol
;
2982 off
= i
.op
[0].disps
->X_add_number
;
2984 if (i
.op
[0].disps
->X_op
!= O_constant
2985 && i
.op
[0].disps
->X_op
!= O_symbol
)
2987 /* Handle complex expressions. */
2988 sym
= make_expr_symbol (i
.op
[0].disps
);
2992 /* 1 possible extra opcode + 4 byte displacement go in var part.
2993 Pass reloc in fr_var. */
2994 frag_var (rs_machine_dependent
, 5, i
.reloc
[0], subtype
, sym
, off
, p
);
3004 if (i
.tm
.opcode_modifier
& JumpByte
)
3006 /* This is a loop or jecxz type instruction. */
3008 if (i
.prefix
[ADDR_PREFIX
] != 0)
3010 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE
);
3013 /* Pentium4 branch hints. */
3014 if (i
.prefix
[SEG_PREFIX
] == CS_PREFIX_OPCODE
/* not taken */
3015 || i
.prefix
[SEG_PREFIX
] == DS_PREFIX_OPCODE
/* taken */)
3017 FRAG_APPEND_1_CHAR (i
.prefix
[SEG_PREFIX
]);
3026 if (flag_code
== CODE_16BIT
)
3029 if (i
.prefix
[DATA_PREFIX
] != 0)
3031 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE
);
3041 if (i
.prefix
[REX_PREFIX
] != 0)
3043 FRAG_APPEND_1_CHAR (i
.prefix
[REX_PREFIX
]);
3047 if (i
.prefixes
!= 0 && !intel_syntax
)
3048 as_warn (_("skipping prefixes on this instruction"));
3050 p
= frag_more (1 + size
);
3051 *p
++ = i
.tm
.base_opcode
;
3053 fixP
= fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, size
,
3054 i
.op
[0].disps
, 1, reloc (size
, 1, 1, i
.reloc
[0]));
3056 /* All jumps handled here are signed, but don't use a signed limit
3057 check for 32 and 16 bit jumps as we want to allow wrap around at
3058 4G and 64k respectively. */
3060 fixP
->fx_signed
= 1;
3064 output_interseg_jump ()
3072 if (flag_code
== CODE_16BIT
)
3076 if (i
.prefix
[DATA_PREFIX
] != 0)
3082 if (i
.prefix
[REX_PREFIX
] != 0)
3092 if (i
.prefixes
!= 0 && !intel_syntax
)
3093 as_warn (_("skipping prefixes on this instruction"));
3095 /* 1 opcode; 2 segment; offset */
3096 p
= frag_more (prefix
+ 1 + 2 + size
);
3098 if (i
.prefix
[DATA_PREFIX
] != 0)
3099 *p
++ = DATA_PREFIX_OPCODE
;
3101 if (i
.prefix
[REX_PREFIX
] != 0)
3102 *p
++ = i
.prefix
[REX_PREFIX
];
3104 *p
++ = i
.tm
.base_opcode
;
3105 if (i
.op
[1].imms
->X_op
== O_constant
)
3107 offsetT n
= i
.op
[1].imms
->X_add_number
;
3110 && !fits_in_unsigned_word (n
)
3111 && !fits_in_signed_word (n
))
3113 as_bad (_("16-bit jump out of range"));
3116 md_number_to_chars (p
, n
, size
);
3119 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, size
,
3120 i
.op
[1].imms
, 0, reloc (size
, 0, 0, i
.reloc
[1]));
3121 if (i
.op
[0].imms
->X_op
!= O_constant
)
3122 as_bad (_("can't handle non absolute segment in `%s'"),
3124 md_number_to_chars (p
+ size
, (valueT
) i
.op
[0].imms
->X_add_number
, 2);
3130 fragS
*insn_start_frag
;
3131 offsetT insn_start_off
;
3133 /* Tie dwarf2 debug info to the address at the start of the insn.
3134 We can't do this after the insn has been output as the current
3135 frag may have been closed off. eg. by frag_var. */
3136 dwarf2_emit_insn (0);
3138 insn_start_frag
= frag_now
;
3139 insn_start_off
= frag_now_fix ();
3142 if (i
.tm
.opcode_modifier
& Jump
)
3144 else if (i
.tm
.opcode_modifier
& (JumpByte
| JumpDword
))
3146 else if (i
.tm
.opcode_modifier
& JumpInterSegment
)
3147 output_interseg_jump ();
3150 /* Output normal instructions here. */
3154 /* All opcodes on i386 have either 1 or 2 bytes, PadLock instructions
3155 have 3 bytes. We may use one more higher byte to specify a prefix
3156 the instruction requires. */
3157 if ((i
.tm
.cpu_flags
& CpuPadLock
) != 0
3158 && (i
.tm
.base_opcode
& 0xff000000) != 0)
3160 unsigned int prefix
;
3161 prefix
= (i
.tm
.base_opcode
>> 24) & 0xff;
3163 if (prefix
!= REPE_PREFIX_OPCODE
3164 || i
.prefix
[LOCKREP_PREFIX
] != REPE_PREFIX_OPCODE
)
3165 add_prefix (prefix
);
3168 if ((i
.tm
.cpu_flags
& CpuPadLock
) == 0
3169 && (i
.tm
.base_opcode
& 0xff0000) != 0)
3170 add_prefix ((i
.tm
.base_opcode
>> 16) & 0xff);
3172 /* The prefix bytes. */
3174 q
< i
.prefix
+ sizeof (i
.prefix
) / sizeof (i
.prefix
[0]);
3180 md_number_to_chars (p
, (valueT
) *q
, 1);
3184 /* Now the opcode; be careful about word order here! */
3185 if (fits_in_unsigned_byte (i
.tm
.base_opcode
))
3187 FRAG_APPEND_1_CHAR (i
.tm
.base_opcode
);
3191 if ((i
.tm
.cpu_flags
& CpuPadLock
) != 0)
3194 *p
++ = (i
.tm
.base_opcode
>> 16) & 0xff;
3199 /* Put out high byte first: can't use md_number_to_chars! */
3200 *p
++ = (i
.tm
.base_opcode
>> 8) & 0xff;
3201 *p
= i
.tm
.base_opcode
& 0xff;
3204 /* Now the modrm byte and sib byte (if present). */
3205 if (i
.tm
.opcode_modifier
& Modrm
)
3208 md_number_to_chars (p
,
3209 (valueT
) (i
.rm
.regmem
<< 0
3213 /* If i.rm.regmem == ESP (4)
3214 && i.rm.mode != (Register mode)
3216 ==> need second modrm byte. */
3217 if (i
.rm
.regmem
== ESCAPE_TO_TWO_BYTE_ADDRESSING
3219 && !(i
.base_reg
&& (i
.base_reg
->reg_type
& Reg16
) != 0))
3222 md_number_to_chars (p
,
3223 (valueT
) (i
.sib
.base
<< 0
3225 | i
.sib
.scale
<< 6),
3230 if (i
.disp_operands
)
3231 output_disp (insn_start_frag
, insn_start_off
);
3234 output_imm (insn_start_frag
, insn_start_off
);
3242 #endif /* DEBUG386 */
3246 output_disp (insn_start_frag
, insn_start_off
)
3247 fragS
*insn_start_frag
;
3248 offsetT insn_start_off
;
3253 for (n
= 0; n
< i
.operands
; n
++)
3255 if (i
.types
[n
] & Disp
)
3257 if (i
.op
[n
].disps
->X_op
== O_constant
)
3263 if (i
.types
[n
] & (Disp8
| Disp16
| Disp64
))
3266 if (i
.types
[n
] & Disp8
)
3268 if (i
.types
[n
] & Disp64
)
3271 val
= offset_in_range (i
.op
[n
].disps
->X_add_number
,
3273 p
= frag_more (size
);
3274 md_number_to_chars (p
, val
, size
);
3278 enum bfd_reloc_code_real reloc_type
;
3281 int pcrel
= (i
.flags
[n
] & Operand_PCrel
) != 0;
3283 /* The PC relative address is computed relative
3284 to the instruction boundary, so in case immediate
3285 fields follows, we need to adjust the value. */
3286 if (pcrel
&& i
.imm_operands
)
3291 for (n1
= 0; n1
< i
.operands
; n1
++)
3292 if (i
.types
[n1
] & Imm
)
3294 if (i
.types
[n1
] & (Imm8
| Imm8S
| Imm16
| Imm64
))
3297 if (i
.types
[n1
] & (Imm8
| Imm8S
))
3299 if (i
.types
[n1
] & Imm64
)
3304 /* We should find the immediate. */
3305 if (n1
== i
.operands
)
3307 i
.op
[n
].disps
->X_add_number
-= imm_size
;
3310 if (i
.types
[n
] & Disp32S
)
3313 if (i
.types
[n
] & (Disp16
| Disp64
))
3316 if (i
.types
[n
] & Disp64
)
3320 p
= frag_more (size
);
3321 reloc_type
= reloc (size
, pcrel
, sign
, i
.reloc
[n
]);
3322 if (reloc_type
== BFD_RELOC_32
3324 && GOT_symbol
== i
.op
[n
].disps
->X_add_symbol
3325 && (i
.op
[n
].disps
->X_op
== O_symbol
3326 || (i
.op
[n
].disps
->X_op
== O_add
3327 && ((symbol_get_value_expression
3328 (i
.op
[n
].disps
->X_op_symbol
)->X_op
)
3333 if (insn_start_frag
== frag_now
)
3334 add
= (p
- frag_now
->fr_literal
) - insn_start_off
;
3339 add
= insn_start_frag
->fr_fix
- insn_start_off
;
3340 for (fr
= insn_start_frag
->fr_next
;
3341 fr
&& fr
!= frag_now
; fr
= fr
->fr_next
)
3343 add
+= p
- frag_now
->fr_literal
;
3346 /* We don't support dynamic linking on x86-64 yet. */
3347 if (flag_code
== CODE_64BIT
)
3349 reloc_type
= BFD_RELOC_386_GOTPC
;
3350 i
.op
[n
].disps
->X_add_number
+= add
;
3352 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, size
,
3353 i
.op
[n
].disps
, pcrel
, reloc_type
);
3360 output_imm (insn_start_frag
, insn_start_off
)
3361 fragS
*insn_start_frag
;
3362 offsetT insn_start_off
;
3367 for (n
= 0; n
< i
.operands
; n
++)
3369 if (i
.types
[n
] & Imm
)
3371 if (i
.op
[n
].imms
->X_op
== O_constant
)
3377 if (i
.types
[n
] & (Imm8
| Imm8S
| Imm16
| Imm64
))
3380 if (i
.types
[n
] & (Imm8
| Imm8S
))
3382 else if (i
.types
[n
] & Imm64
)
3385 val
= offset_in_range (i
.op
[n
].imms
->X_add_number
,
3387 p
= frag_more (size
);
3388 md_number_to_chars (p
, val
, size
);
3392 /* Not absolute_section.
3393 Need a 32-bit fixup (don't support 8bit
3394 non-absolute imms). Try to support other
3396 enum bfd_reloc_code_real reloc_type
;
3400 if ((i
.types
[n
] & (Imm32S
))
3401 && i
.suffix
== QWORD_MNEM_SUFFIX
)
3403 if (i
.types
[n
] & (Imm8
| Imm8S
| Imm16
| Imm64
))
3406 if (i
.types
[n
] & (Imm8
| Imm8S
))
3408 if (i
.types
[n
] & Imm64
)
3412 p
= frag_more (size
);
3413 reloc_type
= reloc (size
, 0, sign
, i
.reloc
[n
]);
3415 /* This is tough to explain. We end up with this one if we
3416 * have operands that look like
3417 * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to
3418 * obtain the absolute address of the GOT, and it is strongly
3419 * preferable from a performance point of view to avoid using
3420 * a runtime relocation for this. The actual sequence of
3421 * instructions often look something like:
3426 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
3428 * The call and pop essentially return the absolute address
3429 * of the label .L66 and store it in %ebx. The linker itself
3430 * will ultimately change the first operand of the addl so
3431 * that %ebx points to the GOT, but to keep things simple, the
3432 * .o file must have this operand set so that it generates not
3433 * the absolute address of .L66, but the absolute address of
3434 * itself. This allows the linker itself simply treat a GOTPC
3435 * relocation as asking for a pcrel offset to the GOT to be
3436 * added in, and the addend of the relocation is stored in the
3437 * operand field for the instruction itself.
3439 * Our job here is to fix the operand so that it would add
3440 * the correct offset so that %ebx would point to itself. The
3441 * thing that is tricky is that .-.L66 will point to the
3442 * beginning of the instruction, so we need to further modify
3443 * the operand so that it will point to itself. There are
3444 * other cases where you have something like:
3446 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
3448 * and here no correction would be required. Internally in
3449 * the assembler we treat operands of this form as not being
3450 * pcrel since the '.' is explicitly mentioned, and I wonder
3451 * whether it would simplify matters to do it this way. Who
3452 * knows. In earlier versions of the PIC patches, the
3453 * pcrel_adjust field was used to store the correction, but
3454 * since the expression is not pcrel, I felt it would be
3455 * confusing to do it this way. */
3457 if (reloc_type
== BFD_RELOC_32
3459 && GOT_symbol
== i
.op
[n
].imms
->X_add_symbol
3460 && (i
.op
[n
].imms
->X_op
== O_symbol
3461 || (i
.op
[n
].imms
->X_op
== O_add
3462 && ((symbol_get_value_expression
3463 (i
.op
[n
].imms
->X_op_symbol
)->X_op
)
3468 if (insn_start_frag
== frag_now
)
3469 add
= (p
- frag_now
->fr_literal
) - insn_start_off
;
3474 add
= insn_start_frag
->fr_fix
- insn_start_off
;
3475 for (fr
= insn_start_frag
->fr_next
;
3476 fr
&& fr
!= frag_now
; fr
= fr
->fr_next
)
3478 add
+= p
- frag_now
->fr_literal
;
3481 /* We don't support dynamic linking on x86-64 yet. */
3482 if (flag_code
== CODE_64BIT
)
3484 reloc_type
= BFD_RELOC_386_GOTPC
;
3485 i
.op
[n
].imms
->X_add_number
+= add
;
3487 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, size
,
3488 i
.op
[n
].imms
, 0, reloc_type
);
3495 static char *lex_got
PARAMS ((enum bfd_reloc_code_real
*, int *));
3497 /* Parse operands of the form
3498 <symbol>@GOTOFF+<nnn>
3499 and similar .plt or .got references.
3501 If we find one, set up the correct relocation in RELOC and copy the
3502 input string, minus the `@GOTOFF' into a malloc'd buffer for
3503 parsing by the calling routine. Return this buffer, and if ADJUST
3504 is non-null set it to the length of the string we removed from the
3505 input line. Otherwise return NULL. */
3507 lex_got (reloc
, adjust
)
3508 enum bfd_reloc_code_real
*reloc
;
3511 static const char * const mode_name
[NUM_FLAG_CODE
] = { "32", "16", "64" };
3512 static const struct {
3514 const enum bfd_reloc_code_real rel
[NUM_FLAG_CODE
];
3516 { "PLT", { BFD_RELOC_386_PLT32
, 0, BFD_RELOC_X86_64_PLT32
} },
3517 { "GOTOFF", { BFD_RELOC_386_GOTOFF
, 0, 0 } },
3518 { "GOTPCREL", { 0, 0, BFD_RELOC_X86_64_GOTPCREL
} },
3519 { "TLSGD", { BFD_RELOC_386_TLS_GD
, 0, BFD_RELOC_X86_64_TLSGD
} },
3520 { "TLSLDM", { BFD_RELOC_386_TLS_LDM
, 0, 0 } },
3521 { "TLSLD", { 0, 0, BFD_RELOC_X86_64_TLSLD
} },
3522 { "GOTTPOFF", { BFD_RELOC_386_TLS_IE_32
, 0, BFD_RELOC_X86_64_GOTTPOFF
} },
3523 { "TPOFF", { BFD_RELOC_386_TLS_LE_32
, 0, BFD_RELOC_X86_64_TPOFF32
} },
3524 { "NTPOFF", { BFD_RELOC_386_TLS_LE
, 0, 0 } },
3525 { "DTPOFF", { BFD_RELOC_386_TLS_LDO_32
, 0, BFD_RELOC_X86_64_DTPOFF32
} },
3526 { "GOTNTPOFF",{ BFD_RELOC_386_TLS_GOTIE
, 0, 0 } },
3527 { "INDNTPOFF",{ BFD_RELOC_386_TLS_IE
, 0, 0 } },
3528 { "GOT", { BFD_RELOC_386_GOT32
, 0, BFD_RELOC_X86_64_GOT32
} }
3533 for (cp
= input_line_pointer
; *cp
!= '@'; cp
++)
3534 if (is_end_of_line
[(unsigned char) *cp
])
3537 for (j
= 0; j
< sizeof (gotrel
) / sizeof (gotrel
[0]); j
++)
3541 len
= strlen (gotrel
[j
].str
);
3542 if (strncasecmp (cp
+ 1, gotrel
[j
].str
, len
) == 0)
3544 if (gotrel
[j
].rel
[(unsigned int) flag_code
] != 0)
3547 char *tmpbuf
, *past_reloc
;
3549 *reloc
= gotrel
[j
].rel
[(unsigned int) flag_code
];
3553 if (GOT_symbol
== NULL
)
3554 GOT_symbol
= symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME
);
3556 /* Replace the relocation token with ' ', so that
3557 errors like foo@GOTOFF1 will be detected. */
3559 /* The length of the first part of our input line. */
3560 first
= cp
- input_line_pointer
;
3562 /* The second part goes from after the reloc token until
3563 (and including) an end_of_line char. Don't use strlen
3564 here as the end_of_line char may not be a NUL. */
3565 past_reloc
= cp
+ 1 + len
;
3566 for (cp
= past_reloc
; !is_end_of_line
[(unsigned char) *cp
++]; )
3568 second
= cp
- past_reloc
;
3570 /* Allocate and copy string. The trailing NUL shouldn't
3571 be necessary, but be safe. */
3572 tmpbuf
= xmalloc (first
+ second
+ 2);
3573 memcpy (tmpbuf
, input_line_pointer
, first
);
3574 tmpbuf
[first
] = ' ';
3575 memcpy (tmpbuf
+ first
+ 1, past_reloc
, second
);
3576 tmpbuf
[first
+ second
+ 1] = '\0';
3580 as_bad (_("@%s reloc is not supported in %s bit mode"),
3581 gotrel
[j
].str
, mode_name
[(unsigned int) flag_code
]);
3586 /* Might be a symbol version string. Don't as_bad here. */
3590 /* x86_cons_fix_new is called via the expression parsing code when a
3591 reloc is needed. We use this hook to get the correct .got reloc. */
3592 static enum bfd_reloc_code_real got_reloc
= NO_RELOC
;
3595 x86_cons_fix_new (frag
, off
, len
, exp
)
3601 enum bfd_reloc_code_real r
= reloc (len
, 0, 0, got_reloc
);
3602 got_reloc
= NO_RELOC
;
3603 fix_new_exp (frag
, off
, len
, exp
, 0, r
);
3607 x86_cons (exp
, size
)
3613 /* Handle @GOTOFF and the like in an expression. */
3615 char *gotfree_input_line
;
3618 save
= input_line_pointer
;
3619 gotfree_input_line
= lex_got (&got_reloc
, &adjust
);
3620 if (gotfree_input_line
)
3621 input_line_pointer
= gotfree_input_line
;
3625 if (gotfree_input_line
)
3627 /* expression () has merrily parsed up to the end of line,
3628 or a comma - in the wrong buffer. Transfer how far
3629 input_line_pointer has moved to the right buffer. */
3630 input_line_pointer
= (save
3631 + (input_line_pointer
- gotfree_input_line
)
3633 free (gotfree_input_line
);
3641 static int i386_immediate
PARAMS ((char *));
3644 i386_immediate (imm_start
)
3647 char *save_input_line_pointer
;
3649 char *gotfree_input_line
;
3654 if (i
.imm_operands
== MAX_IMMEDIATE_OPERANDS
)
3656 as_bad (_("only 1 or 2 immediate operands are allowed"));
3660 exp
= &im_expressions
[i
.imm_operands
++];
3661 i
.op
[this_operand
].imms
= exp
;
3663 if (is_space_char (*imm_start
))
3666 save_input_line_pointer
= input_line_pointer
;
3667 input_line_pointer
= imm_start
;
3670 gotfree_input_line
= lex_got (&i
.reloc
[this_operand
], NULL
);
3671 if (gotfree_input_line
)
3672 input_line_pointer
= gotfree_input_line
;
3675 exp_seg
= expression (exp
);
3678 if (*input_line_pointer
)
3679 as_bad (_("junk `%s' after expression"), input_line_pointer
);
3681 input_line_pointer
= save_input_line_pointer
;
3683 if (gotfree_input_line
)
3684 free (gotfree_input_line
);
3687 if (exp
->X_op
== O_absent
|| exp
->X_op
== O_big
)
3689 /* Missing or bad expr becomes absolute 0. */
3690 as_bad (_("missing or invalid immediate expression `%s' taken as 0"),
3692 exp
->X_op
= O_constant
;
3693 exp
->X_add_number
= 0;
3694 exp
->X_add_symbol
= (symbolS
*) 0;
3695 exp
->X_op_symbol
= (symbolS
*) 0;
3697 else if (exp
->X_op
== O_constant
)
3699 /* Size it properly later. */
3700 i
.types
[this_operand
] |= Imm64
;
3701 /* If BFD64, sign extend val. */
3702 if (!use_rela_relocations
)
3703 if ((exp
->X_add_number
& ~(((addressT
) 2 << 31) - 1)) == 0)
3704 exp
->X_add_number
= (exp
->X_add_number
^ ((addressT
) 1 << 31)) - ((addressT
) 1 << 31);
3706 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3707 else if (OUTPUT_FLAVOR
== bfd_target_aout_flavour
3708 && exp_seg
!= absolute_section
3709 && exp_seg
!= text_section
3710 && exp_seg
!= data_section
3711 && exp_seg
!= bss_section
3712 && exp_seg
!= undefined_section
3713 && !bfd_is_com_section (exp_seg
))
3715 as_bad (_("unimplemented segment %s in operand"), exp_seg
->name
);
3721 /* This is an address. The size of the address will be
3722 determined later, depending on destination register,
3723 suffix, or the default for the section. */
3724 i
.types
[this_operand
] |= Imm8
| Imm16
| Imm32
| Imm32S
| Imm64
;
3730 static char *i386_scale
PARAMS ((char *));
3737 char *save
= input_line_pointer
;
3739 input_line_pointer
= scale
;
3740 val
= get_absolute_expression ();
3746 i
.log2_scale_factor
= 0;
3749 i
.log2_scale_factor
= 1;
3752 i
.log2_scale_factor
= 2;
3755 i
.log2_scale_factor
= 3;
3758 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
3760 input_line_pointer
= save
;
3763 if (i
.log2_scale_factor
!= 0 && i
.index_reg
== 0)
3765 as_warn (_("scale factor of %d without an index register"),
3766 1 << i
.log2_scale_factor
);
3767 #if SCALE1_WHEN_NO_INDEX
3768 i
.log2_scale_factor
= 0;
3771 scale
= input_line_pointer
;
3772 input_line_pointer
= save
;
3776 static int i386_displacement
PARAMS ((char *, char *));
3779 i386_displacement (disp_start
, disp_end
)
3785 char *save_input_line_pointer
;
3787 char *gotfree_input_line
;
3789 int bigdisp
= Disp32
;
3791 if (flag_code
== CODE_64BIT
)
3793 if (i
.prefix
[ADDR_PREFIX
] == 0)
3796 else if ((flag_code
== CODE_16BIT
) ^ (i
.prefix
[ADDR_PREFIX
] != 0))
3798 i
.types
[this_operand
] |= bigdisp
;
3800 exp
= &disp_expressions
[i
.disp_operands
];
3801 i
.op
[this_operand
].disps
= exp
;
3803 save_input_line_pointer
= input_line_pointer
;
3804 input_line_pointer
= disp_start
;
3805 END_STRING_AND_SAVE (disp_end
);
3807 #ifndef GCC_ASM_O_HACK
3808 #define GCC_ASM_O_HACK 0
3811 END_STRING_AND_SAVE (disp_end
+ 1);
3812 if ((i
.types
[this_operand
] & BaseIndex
) != 0
3813 && displacement_string_end
[-1] == '+')
3815 /* This hack is to avoid a warning when using the "o"
3816 constraint within gcc asm statements.
3819 #define _set_tssldt_desc(n,addr,limit,type) \
3820 __asm__ __volatile__ ( \
3822 "movw %w1,2+%0\n\t" \
3824 "movb %b1,4+%0\n\t" \
3825 "movb %4,5+%0\n\t" \
3826 "movb $0,6+%0\n\t" \
3827 "movb %h1,7+%0\n\t" \
3829 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
3831 This works great except that the output assembler ends
3832 up looking a bit weird if it turns out that there is
3833 no offset. You end up producing code that looks like:
3846 So here we provide the missing zero. */
3848 *displacement_string_end
= '0';
3852 gotfree_input_line
= lex_got (&i
.reloc
[this_operand
], NULL
);
3853 if (gotfree_input_line
)
3854 input_line_pointer
= gotfree_input_line
;
3857 exp_seg
= expression (exp
);
3860 if (*input_line_pointer
)
3861 as_bad (_("junk `%s' after expression"), input_line_pointer
);
3863 RESTORE_END_STRING (disp_end
+ 1);
3865 RESTORE_END_STRING (disp_end
);
3866 input_line_pointer
= save_input_line_pointer
;
3868 if (gotfree_input_line
)
3869 free (gotfree_input_line
);
3872 /* We do this to make sure that the section symbol is in
3873 the symbol table. We will ultimately change the relocation
3874 to be relative to the beginning of the section. */
3875 if (i
.reloc
[this_operand
] == BFD_RELOC_386_GOTOFF
3876 || i
.reloc
[this_operand
] == BFD_RELOC_X86_64_GOTPCREL
)
3878 if (exp
->X_op
!= O_symbol
)
3880 as_bad (_("bad expression used with @%s"),
3881 (i
.reloc
[this_operand
] == BFD_RELOC_X86_64_GOTPCREL
3887 if (S_IS_LOCAL (exp
->X_add_symbol
)
3888 && S_GET_SEGMENT (exp
->X_add_symbol
) != undefined_section
)
3889 section_symbol (S_GET_SEGMENT (exp
->X_add_symbol
));
3890 exp
->X_op
= O_subtract
;
3891 exp
->X_op_symbol
= GOT_symbol
;
3892 if (i
.reloc
[this_operand
] == BFD_RELOC_X86_64_GOTPCREL
)
3893 i
.reloc
[this_operand
] = BFD_RELOC_32_PCREL
;
3895 i
.reloc
[this_operand
] = BFD_RELOC_32
;
3898 if (exp
->X_op
== O_absent
|| exp
->X_op
== O_big
)
3900 /* Missing or bad expr becomes absolute 0. */
3901 as_bad (_("missing or invalid displacement expression `%s' taken as 0"),
3903 exp
->X_op
= O_constant
;
3904 exp
->X_add_number
= 0;
3905 exp
->X_add_symbol
= (symbolS
*) 0;
3906 exp
->X_op_symbol
= (symbolS
*) 0;
3909 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
3910 if (exp
->X_op
!= O_constant
3911 && OUTPUT_FLAVOR
== bfd_target_aout_flavour
3912 && exp_seg
!= absolute_section
3913 && exp_seg
!= text_section
3914 && exp_seg
!= data_section
3915 && exp_seg
!= bss_section
3916 && exp_seg
!= undefined_section
3917 && !bfd_is_com_section (exp_seg
))
3919 as_bad (_("unimplemented segment %s in operand"), exp_seg
->name
);
3923 else if (flag_code
== CODE_64BIT
)
3924 i
.types
[this_operand
] |= Disp32S
| Disp32
;
3928 static int i386_index_check
PARAMS ((const char *));
3930 /* Make sure the memory operand we've been dealt is valid.
3931 Return 1 on success, 0 on a failure. */
3934 i386_index_check (operand_string
)
3935 const char *operand_string
;
3938 #if INFER_ADDR_PREFIX
3944 if (flag_code
== CODE_64BIT
)
3946 if (i
.prefix
[ADDR_PREFIX
] == 0)
3950 && ((i
.base_reg
->reg_type
& Reg64
) == 0)
3951 && (i
.base_reg
->reg_type
!= BaseIndex
3954 && ((i
.index_reg
->reg_type
& (Reg64
| BaseIndex
))
3955 != (Reg64
| BaseIndex
))))
3962 && (i
.base_reg
->reg_type
& (Reg32
| RegRex
)) != Reg32
)
3964 && ((i
.index_reg
->reg_type
& (Reg32
| BaseIndex
| RegRex
))
3965 != (Reg32
| BaseIndex
))))
3971 if ((flag_code
== CODE_16BIT
) ^ (i
.prefix
[ADDR_PREFIX
] != 0))
3975 && ((i
.base_reg
->reg_type
& (Reg16
| BaseIndex
| RegRex
))
3976 != (Reg16
| BaseIndex
)))
3978 && (((i
.index_reg
->reg_type
& (Reg16
| BaseIndex
))
3979 != (Reg16
| BaseIndex
))
3981 && i
.base_reg
->reg_num
< 6
3982 && i
.index_reg
->reg_num
>= 6
3983 && i
.log2_scale_factor
== 0))))
3990 && (i
.base_reg
->reg_type
& (Reg32
| RegRex
)) != Reg32
)
3992 && ((i
.index_reg
->reg_type
& (Reg32
| BaseIndex
| RegRex
))
3993 != (Reg32
| BaseIndex
))))
3999 #if INFER_ADDR_PREFIX
4000 if (flag_code
!= CODE_64BIT
4001 && i
.prefix
[ADDR_PREFIX
] == 0 && stackop_size
!= '\0')
4003 i
.prefix
[ADDR_PREFIX
] = ADDR_PREFIX_OPCODE
;
4005 /* Change the size of any displacement too. At most one of
4006 Disp16 or Disp32 is set.
4007 FIXME. There doesn't seem to be any real need for separate
4008 Disp16 and Disp32 flags. The same goes for Imm16 and Imm32.
4009 Removing them would probably clean up the code quite a lot. */
4010 if (i
.types
[this_operand
] & (Disp16
| Disp32
))
4011 i
.types
[this_operand
] ^= (Disp16
| Disp32
);
4016 as_bad (_("`%s' is not a valid base/index expression"),
4020 as_bad (_("`%s' is not a valid %s bit base/index expression"),
4022 flag_code_names
[flag_code
]);
4028 /* Parse OPERAND_STRING into the i386_insn structure I. Returns non-zero
4032 i386_operand (operand_string
)
4033 char *operand_string
;
4037 char *op_string
= operand_string
;
4039 if (is_space_char (*op_string
))
4042 /* We check for an absolute prefix (differentiating,
4043 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
4044 if (*op_string
== ABSOLUTE_PREFIX
)
4047 if (is_space_char (*op_string
))
4049 i
.types
[this_operand
] |= JumpAbsolute
;
4052 /* Check if operand is a register. */
4053 if ((*op_string
== REGISTER_PREFIX
|| allow_naked_reg
)
4054 && (r
= parse_register (op_string
, &end_op
)) != NULL
)
4056 /* Check for a segment override by searching for ':' after a
4057 segment register. */
4059 if (is_space_char (*op_string
))
4061 if (*op_string
== ':' && (r
->reg_type
& (SReg2
| SReg3
)))
4066 i
.seg
[i
.mem_operands
] = &es
;
4069 i
.seg
[i
.mem_operands
] = &cs
;
4072 i
.seg
[i
.mem_operands
] = &ss
;
4075 i
.seg
[i
.mem_operands
] = &ds
;
4078 i
.seg
[i
.mem_operands
] = &fs
;
4081 i
.seg
[i
.mem_operands
] = &gs
;
4085 /* Skip the ':' and whitespace. */
4087 if (is_space_char (*op_string
))
4090 if (!is_digit_char (*op_string
)
4091 && !is_identifier_char (*op_string
)
4092 && *op_string
!= '('
4093 && *op_string
!= ABSOLUTE_PREFIX
)
4095 as_bad (_("bad memory operand `%s'"), op_string
);
4098 /* Handle case of %es:*foo. */
4099 if (*op_string
== ABSOLUTE_PREFIX
)
4102 if (is_space_char (*op_string
))
4104 i
.types
[this_operand
] |= JumpAbsolute
;
4106 goto do_memory_reference
;
4110 as_bad (_("junk `%s' after register"), op_string
);
4113 i
.types
[this_operand
] |= r
->reg_type
& ~BaseIndex
;
4114 i
.op
[this_operand
].regs
= r
;
4117 else if (*op_string
== REGISTER_PREFIX
)
4119 as_bad (_("bad register name `%s'"), op_string
);
4122 else if (*op_string
== IMMEDIATE_PREFIX
)
4125 if (i
.types
[this_operand
] & JumpAbsolute
)
4127 as_bad (_("immediate operand illegal with absolute jump"));
4130 if (!i386_immediate (op_string
))
4133 else if (is_digit_char (*op_string
)
4134 || is_identifier_char (*op_string
)
4135 || *op_string
== '(')
4137 /* This is a memory reference of some sort. */
4140 /* Start and end of displacement string expression (if found). */
4141 char *displacement_string_start
;
4142 char *displacement_string_end
;
4144 do_memory_reference
:
4145 if ((i
.mem_operands
== 1
4146 && (current_templates
->start
->opcode_modifier
& IsString
) == 0)
4147 || i
.mem_operands
== 2)
4149 as_bad (_("too many memory references for `%s'"),
4150 current_templates
->start
->name
);
4154 /* Check for base index form. We detect the base index form by
4155 looking for an ')' at the end of the operand, searching
4156 for the '(' matching it, and finding a REGISTER_PREFIX or ','
4158 base_string
= op_string
+ strlen (op_string
);
4161 if (is_space_char (*base_string
))
4164 /* If we only have a displacement, set-up for it to be parsed later. */
4165 displacement_string_start
= op_string
;
4166 displacement_string_end
= base_string
+ 1;
4168 if (*base_string
== ')')
4171 unsigned int parens_balanced
= 1;
4172 /* We've already checked that the number of left & right ()'s are
4173 equal, so this loop will not be infinite. */
4177 if (*base_string
== ')')
4179 if (*base_string
== '(')
4182 while (parens_balanced
);
4184 temp_string
= base_string
;
4186 /* Skip past '(' and whitespace. */
4188 if (is_space_char (*base_string
))
4191 if (*base_string
== ','
4192 || ((*base_string
== REGISTER_PREFIX
|| allow_naked_reg
)
4193 && (i
.base_reg
= parse_register (base_string
, &end_op
)) != NULL
))
4195 displacement_string_end
= temp_string
;
4197 i
.types
[this_operand
] |= BaseIndex
;
4201 base_string
= end_op
;
4202 if (is_space_char (*base_string
))
4206 /* There may be an index reg or scale factor here. */
4207 if (*base_string
== ',')
4210 if (is_space_char (*base_string
))
4213 if ((*base_string
== REGISTER_PREFIX
|| allow_naked_reg
)
4214 && (i
.index_reg
= parse_register (base_string
, &end_op
)) != NULL
)
4216 base_string
= end_op
;
4217 if (is_space_char (*base_string
))
4219 if (*base_string
== ',')
4222 if (is_space_char (*base_string
))
4225 else if (*base_string
!= ')')
4227 as_bad (_("expecting `,' or `)' after index register in `%s'"),
4232 else if (*base_string
== REGISTER_PREFIX
)
4234 as_bad (_("bad register name `%s'"), base_string
);
4238 /* Check for scale factor. */
4239 if (*base_string
!= ')')
4241 char *end_scale
= i386_scale (base_string
);
4246 base_string
= end_scale
;
4247 if (is_space_char (*base_string
))
4249 if (*base_string
!= ')')
4251 as_bad (_("expecting `)' after scale factor in `%s'"),
4256 else if (!i
.index_reg
)
4258 as_bad (_("expecting index register or scale factor after `,'; got '%c'"),
4263 else if (*base_string
!= ')')
4265 as_bad (_("expecting `,' or `)' after base register in `%s'"),
4270 else if (*base_string
== REGISTER_PREFIX
)
4272 as_bad (_("bad register name `%s'"), base_string
);
4277 /* If there's an expression beginning the operand, parse it,
4278 assuming displacement_string_start and
4279 displacement_string_end are meaningful. */
4280 if (displacement_string_start
!= displacement_string_end
)
4282 if (!i386_displacement (displacement_string_start
,
4283 displacement_string_end
))
4287 /* Special case for (%dx) while doing input/output op. */
4289 && i
.base_reg
->reg_type
== (Reg16
| InOutPortReg
)
4291 && i
.log2_scale_factor
== 0
4292 && i
.seg
[i
.mem_operands
] == 0
4293 && (i
.types
[this_operand
] & Disp
) == 0)
4295 i
.types
[this_operand
] = InOutPortReg
;
4299 if (i386_index_check (operand_string
) == 0)
4305 /* It's not a memory operand; argh! */
4306 as_bad (_("invalid char %s beginning operand %d `%s'"),
4307 output_invalid (*op_string
),
4312 return 1; /* Normal return. */
4315 /* md_estimate_size_before_relax()
4317 Called just before relax() for rs_machine_dependent frags. The x86
4318 assembler uses these frags to handle variable size jump
4321 Any symbol that is now undefined will not become defined.
4322 Return the correct fr_subtype in the frag.
4323 Return the initial "guess for variable size of frag" to caller.
4324 The guess is actually the growth beyond the fixed part. Whatever
4325 we do to grow the fixed or variable part contributes to our
4329 md_estimate_size_before_relax (fragP
, segment
)
4333 /* We've already got fragP->fr_subtype right; all we have to do is
4334 check for un-relaxable symbols. On an ELF system, we can't relax
4335 an externally visible symbol, because it may be overridden by a
4337 if (S_GET_SEGMENT (fragP
->fr_symbol
) != segment
4338 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4339 || (OUTPUT_FLAVOR
== bfd_target_elf_flavour
4340 && (S_IS_EXTERNAL (fragP
->fr_symbol
)
4341 || S_IS_WEAK (fragP
->fr_symbol
)))
4345 /* Symbol is undefined in this segment, or we need to keep a
4346 reloc so that weak symbols can be overridden. */
4347 int size
= (fragP
->fr_subtype
& CODE16
) ? 2 : 4;
4348 enum bfd_reloc_code_real reloc_type
;
4349 unsigned char *opcode
;
4352 if (fragP
->fr_var
!= NO_RELOC
)
4353 reloc_type
= fragP
->fr_var
;
4355 reloc_type
= BFD_RELOC_16_PCREL
;
4357 reloc_type
= BFD_RELOC_32_PCREL
;
4359 old_fr_fix
= fragP
->fr_fix
;
4360 opcode
= (unsigned char *) fragP
->fr_opcode
;
4362 switch (TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
))
4365 /* Make jmp (0xeb) a (d)word displacement jump. */
4367 fragP
->fr_fix
+= size
;
4368 fix_new (fragP
, old_fr_fix
, size
,
4370 fragP
->fr_offset
, 1,
4376 && (!no_cond_jump_promotion
|| fragP
->fr_var
!= NO_RELOC
))
4378 /* Negate the condition, and branch past an
4379 unconditional jump. */
4382 /* Insert an unconditional jump. */
4384 /* We added two extra opcode bytes, and have a two byte
4386 fragP
->fr_fix
+= 2 + 2;
4387 fix_new (fragP
, old_fr_fix
+ 2, 2,
4389 fragP
->fr_offset
, 1,
4396 if (no_cond_jump_promotion
&& fragP
->fr_var
== NO_RELOC
)
4401 fixP
= fix_new (fragP
, old_fr_fix
, 1,
4403 fragP
->fr_offset
, 1,
4405 fixP
->fx_signed
= 1;
4409 /* This changes the byte-displacement jump 0x7N
4410 to the (d)word-displacement jump 0x0f,0x8N. */
4411 opcode
[1] = opcode
[0] + 0x10;
4412 opcode
[0] = TWO_BYTE_OPCODE_ESCAPE
;
4413 /* We've added an opcode byte. */
4414 fragP
->fr_fix
+= 1 + size
;
4415 fix_new (fragP
, old_fr_fix
+ 1, size
,
4417 fragP
->fr_offset
, 1,
4422 BAD_CASE (fragP
->fr_subtype
);
4426 return fragP
->fr_fix
- old_fr_fix
;
4429 /* Guess size depending on current relax state. Initially the relax
4430 state will correspond to a short jump and we return 1, because
4431 the variable part of the frag (the branch offset) is one byte
4432 long. However, we can relax a section more than once and in that
4433 case we must either set fr_subtype back to the unrelaxed state,
4434 or return the value for the appropriate branch. */
4435 return md_relax_table
[fragP
->fr_subtype
].rlx_length
;
4438 /* Called after relax() is finished.
4440 In: Address of frag.
4441 fr_type == rs_machine_dependent.
4442 fr_subtype is what the address relaxed to.
4444 Out: Any fixSs and constants are set up.
4445 Caller will turn frag into a ".space 0". */
4448 md_convert_frag (abfd
, sec
, fragP
)
4449 bfd
*abfd ATTRIBUTE_UNUSED
;
4450 segT sec ATTRIBUTE_UNUSED
;
4453 unsigned char *opcode
;
4454 unsigned char *where_to_put_displacement
= NULL
;
4455 offsetT target_address
;
4456 offsetT opcode_address
;
4457 unsigned int extension
= 0;
4458 offsetT displacement_from_opcode_start
;
4460 opcode
= (unsigned char *) fragP
->fr_opcode
;
4462 /* Address we want to reach in file space. */
4463 target_address
= S_GET_VALUE (fragP
->fr_symbol
) + fragP
->fr_offset
;
4465 /* Address opcode resides at in file space. */
4466 opcode_address
= fragP
->fr_address
+ fragP
->fr_fix
;
4468 /* Displacement from opcode start to fill into instruction. */
4469 displacement_from_opcode_start
= target_address
- opcode_address
;
4471 if ((fragP
->fr_subtype
& BIG
) == 0)
4473 /* Don't have to change opcode. */
4474 extension
= 1; /* 1 opcode + 1 displacement */
4475 where_to_put_displacement
= &opcode
[1];
4479 if (no_cond_jump_promotion
4480 && TYPE_FROM_RELAX_STATE (fragP
->fr_subtype
) != UNCOND_JUMP
)
4481 as_warn_where (fragP
->fr_file
, fragP
->fr_line
, _("long jump required"));
4483 switch (fragP
->fr_subtype
)
4485 case ENCODE_RELAX_STATE (UNCOND_JUMP
, BIG
):
4486 extension
= 4; /* 1 opcode + 4 displacement */
4488 where_to_put_displacement
= &opcode
[1];
4491 case ENCODE_RELAX_STATE (UNCOND_JUMP
, BIG16
):
4492 extension
= 2; /* 1 opcode + 2 displacement */
4494 where_to_put_displacement
= &opcode
[1];
4497 case ENCODE_RELAX_STATE (COND_JUMP
, BIG
):
4498 case ENCODE_RELAX_STATE (COND_JUMP86
, BIG
):
4499 extension
= 5; /* 2 opcode + 4 displacement */
4500 opcode
[1] = opcode
[0] + 0x10;
4501 opcode
[0] = TWO_BYTE_OPCODE_ESCAPE
;
4502 where_to_put_displacement
= &opcode
[2];
4505 case ENCODE_RELAX_STATE (COND_JUMP
, BIG16
):
4506 extension
= 3; /* 2 opcode + 2 displacement */
4507 opcode
[1] = opcode
[0] + 0x10;
4508 opcode
[0] = TWO_BYTE_OPCODE_ESCAPE
;
4509 where_to_put_displacement
= &opcode
[2];
4512 case ENCODE_RELAX_STATE (COND_JUMP86
, BIG16
):
4517 where_to_put_displacement
= &opcode
[3];
4521 BAD_CASE (fragP
->fr_subtype
);
4526 /* Now put displacement after opcode. */
4527 md_number_to_chars ((char *) where_to_put_displacement
,
4528 (valueT
) (displacement_from_opcode_start
- extension
),
4529 DISP_SIZE_FROM_RELAX_STATE (fragP
->fr_subtype
));
4530 fragP
->fr_fix
+= extension
;
4533 /* Size of byte displacement jmp. */
4534 int md_short_jump_size
= 2;
4536 /* Size of dword displacement jmp. */
4537 int md_long_jump_size
= 5;
4539 /* Size of relocation record. */
4540 const int md_reloc_size
= 8;
4543 md_create_short_jump (ptr
, from_addr
, to_addr
, frag
, to_symbol
)
4545 addressT from_addr
, to_addr
;
4546 fragS
*frag ATTRIBUTE_UNUSED
;
4547 symbolS
*to_symbol ATTRIBUTE_UNUSED
;
4551 offset
= to_addr
- (from_addr
+ 2);
4552 /* Opcode for byte-disp jump. */
4553 md_number_to_chars (ptr
, (valueT
) 0xeb, 1);
4554 md_number_to_chars (ptr
+ 1, (valueT
) offset
, 1);
4558 md_create_long_jump (ptr
, from_addr
, to_addr
, frag
, to_symbol
)
4560 addressT from_addr
, to_addr
;
4561 fragS
*frag ATTRIBUTE_UNUSED
;
4562 symbolS
*to_symbol ATTRIBUTE_UNUSED
;
4566 offset
= to_addr
- (from_addr
+ 5);
4567 md_number_to_chars (ptr
, (valueT
) 0xe9, 1);
4568 md_number_to_chars (ptr
+ 1, (valueT
) offset
, 4);
4571 /* Apply a fixup (fixS) to segment data, once it has been determined
4572 by our caller that we have all the info we need to fix it up.
4574 On the 386, immediates, displacements, and data pointers are all in
4575 the same (little-endian) format, so we don't need to care about which
4579 md_apply_fix3 (fixP
, valP
, seg
)
4580 /* The fix we're to put in. */
4582 /* Pointer to the value of the bits. */
4584 /* Segment fix is from. */
4585 segT seg ATTRIBUTE_UNUSED
;
4587 char *p
= fixP
->fx_where
+ fixP
->fx_frag
->fr_literal
;
4588 valueT value
= *valP
;
4590 #if !defined (TE_Mach)
4593 switch (fixP
->fx_r_type
)
4599 fixP
->fx_r_type
= BFD_RELOC_32_PCREL
;
4602 fixP
->fx_r_type
= BFD_RELOC_16_PCREL
;
4605 fixP
->fx_r_type
= BFD_RELOC_8_PCREL
;
4610 if (fixP
->fx_addsy
!= NULL
4611 && (fixP
->fx_r_type
== BFD_RELOC_32_PCREL
4612 || fixP
->fx_r_type
== BFD_RELOC_16_PCREL
4613 || fixP
->fx_r_type
== BFD_RELOC_8_PCREL
)
4614 && !use_rela_relocations
)
4616 /* This is a hack. There should be a better way to handle this.
4617 This covers for the fact that bfd_install_relocation will
4618 subtract the current location (for partial_inplace, PC relative
4619 relocations); see more below. */
4621 if (OUTPUT_FLAVOR
== bfd_target_elf_flavour
4623 || OUTPUT_FLAVOR
== bfd_target_coff_flavour
4626 value
+= fixP
->fx_where
+ fixP
->fx_frag
->fr_address
;
4628 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4629 if (OUTPUT_FLAVOR
== bfd_target_elf_flavour
)
4631 segT sym_seg
= S_GET_SEGMENT (fixP
->fx_addsy
);
4634 || (symbol_section_p (fixP
->fx_addsy
)
4635 && sym_seg
!= absolute_section
))
4636 && !generic_force_reloc (fixP
))
4638 /* Yes, we add the values in twice. This is because
4639 bfd_install_relocation subtracts them out again. I think
4640 bfd_install_relocation is broken, but I don't dare change
4642 value
+= fixP
->fx_where
+ fixP
->fx_frag
->fr_address
;
4646 #if defined (OBJ_COFF) && defined (TE_PE)
4647 /* For some reason, the PE format does not store a section
4648 address offset for a PC relative symbol. */
4649 if (S_GET_SEGMENT (fixP
->fx_addsy
) != seg
)
4650 value
+= md_pcrel_from (fixP
);
4654 /* Fix a few things - the dynamic linker expects certain values here,
4655 and we must not disappoint it. */
4656 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4657 if (OUTPUT_FLAVOR
== bfd_target_elf_flavour
4659 switch (fixP
->fx_r_type
)
4661 case BFD_RELOC_386_PLT32
:
4662 case BFD_RELOC_X86_64_PLT32
:
4663 /* Make the jump instruction point to the address of the operand. At
4664 runtime we merely add the offset to the actual PLT entry. */
4668 case BFD_RELOC_386_TLS_GD
:
4669 case BFD_RELOC_386_TLS_LDM
:
4670 case BFD_RELOC_386_TLS_IE_32
:
4671 case BFD_RELOC_386_TLS_IE
:
4672 case BFD_RELOC_386_TLS_GOTIE
:
4673 case BFD_RELOC_X86_64_TLSGD
:
4674 case BFD_RELOC_X86_64_TLSLD
:
4675 case BFD_RELOC_X86_64_GOTTPOFF
:
4676 value
= 0; /* Fully resolved at runtime. No addend. */
4678 case BFD_RELOC_386_TLS_LE
:
4679 case BFD_RELOC_386_TLS_LDO_32
:
4680 case BFD_RELOC_386_TLS_LE_32
:
4681 case BFD_RELOC_X86_64_DTPOFF32
:
4682 case BFD_RELOC_X86_64_TPOFF32
:
4683 S_SET_THREAD_LOCAL (fixP
->fx_addsy
);
4686 case BFD_RELOC_386_GOT32
:
4687 case BFD_RELOC_X86_64_GOT32
:
4688 value
= 0; /* Fully resolved at runtime. No addend. */
4691 case BFD_RELOC_VTABLE_INHERIT
:
4692 case BFD_RELOC_VTABLE_ENTRY
:
4699 #endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
4701 #endif /* !defined (TE_Mach) */
4703 /* Are we finished with this relocation now? */
4704 if (fixP
->fx_addsy
== NULL
)
4706 else if (use_rela_relocations
)
4708 fixP
->fx_no_overflow
= 1;
4709 /* Remember value for tc_gen_reloc. */
4710 fixP
->fx_addnumber
= value
;
4714 md_number_to_chars (p
, value
, fixP
->fx_size
);
4717 #define MAX_LITTLENUMS 6
4719 /* Turn the string pointed to by litP into a floating point constant
4720 of type TYPE, and emit the appropriate bytes. The number of
4721 LITTLENUMS emitted is stored in *SIZEP. An error message is
4722 returned, or NULL on OK. */
4725 md_atof (type
, litP
, sizeP
)
4731 LITTLENUM_TYPE words
[MAX_LITTLENUMS
];
4732 LITTLENUM_TYPE
*wordP
;
4754 return _("Bad call to md_atof ()");
4756 t
= atof_ieee (input_line_pointer
, type
, words
);
4758 input_line_pointer
= t
;
4760 *sizeP
= prec
* sizeof (LITTLENUM_TYPE
);
4761 /* This loops outputs the LITTLENUMs in REVERSE order; in accord with
4762 the bigendian 386. */
4763 for (wordP
= words
+ prec
- 1; prec
--;)
4765 md_number_to_chars (litP
, (valueT
) (*wordP
--), sizeof (LITTLENUM_TYPE
));
4766 litP
+= sizeof (LITTLENUM_TYPE
);
4771 char output_invalid_buf
[8];
4778 sprintf (output_invalid_buf
, "'%c'", c
);
4780 sprintf (output_invalid_buf
, "(0x%x)", (unsigned) c
);
4781 return output_invalid_buf
;
4784 /* REG_STRING starts *before* REGISTER_PREFIX. */
4786 static const reg_entry
*
4787 parse_register (reg_string
, end_op
)
4791 char *s
= reg_string
;
4793 char reg_name_given
[MAX_REG_NAME_SIZE
+ 1];
4796 /* Skip possible REGISTER_PREFIX and possible whitespace. */
4797 if (*s
== REGISTER_PREFIX
)
4800 if (is_space_char (*s
))
4804 while ((*p
++ = register_chars
[(unsigned char) *s
]) != '\0')
4806 if (p
>= reg_name_given
+ MAX_REG_NAME_SIZE
)
4807 return (const reg_entry
*) NULL
;
4811 /* For naked regs, make sure that we are not dealing with an identifier.
4812 This prevents confusing an identifier like `eax_var' with register
4814 if (allow_naked_reg
&& identifier_chars
[(unsigned char) *s
])
4815 return (const reg_entry
*) NULL
;
4819 r
= (const reg_entry
*) hash_find (reg_hash
, reg_name_given
);
4821 /* Handle floating point regs, allowing spaces in the (i) part. */
4822 if (r
== i386_regtab
/* %st is first entry of table */)
4824 if (is_space_char (*s
))
4829 if (is_space_char (*s
))
4831 if (*s
>= '0' && *s
<= '7')
4833 r
= &i386_float_regtab
[*s
- '0'];
4835 if (is_space_char (*s
))
4843 /* We have "%st(" then garbage. */
4844 return (const reg_entry
*) NULL
;
4849 && (r
->reg_flags
& (RegRex64
| RegRex
)) != 0
4850 && flag_code
!= CODE_64BIT
)
4852 return (const reg_entry
*) NULL
;
4858 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4859 const char *md_shortopts
= "kVQ:sqn";
4861 const char *md_shortopts
= "qn";
4864 struct option md_longopts
[] = {
4865 #define OPTION_32 (OPTION_MD_BASE + 0)
4866 {"32", no_argument
, NULL
, OPTION_32
},
4867 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4868 #define OPTION_64 (OPTION_MD_BASE + 1)
4869 {"64", no_argument
, NULL
, OPTION_64
},
4871 {NULL
, no_argument
, NULL
, 0}
4873 size_t md_longopts_size
= sizeof (md_longopts
);
4876 md_parse_option (c
, arg
)
4878 char *arg ATTRIBUTE_UNUSED
;
4883 optimize_align_code
= 0;
4890 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4891 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
4892 should be emitted or not. FIXME: Not implemented. */
4896 /* -V: SVR4 argument to print version ID. */
4898 print_version_id ();
4901 /* -k: Ignore for FreeBSD compatibility. */
4906 /* -s: On i386 Solaris, this tells the native assembler to use
4907 .stab instead of .stab.excl. We always use .stab anyhow. */
4912 const char **list
, **l
;
4914 list
= bfd_target_list ();
4915 for (l
= list
; *l
!= NULL
; l
++)
4916 if (strcmp (*l
, "elf64-x86-64") == 0)
4918 default_arch
= "x86_64";
4922 as_fatal (_("No compiled in support for x86_64"));
4929 default_arch
= "i386";
4939 md_show_usage (stream
)
4942 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4943 fprintf (stream
, _("\
4945 -V print assembler version number\n\
4947 -n Do not optimize code alignment\n\
4948 -q quieten some warnings\n\
4951 fprintf (stream
, _("\
4952 -n Do not optimize code alignment\n\
4953 -q quieten some warnings\n"));
4957 #if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
4958 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
4960 /* Pick the target format to use. */
4963 i386_target_format ()
4965 if (!strcmp (default_arch
, "x86_64"))
4966 set_code_flag (CODE_64BIT
);
4967 else if (!strcmp (default_arch
, "i386"))
4968 set_code_flag (CODE_32BIT
);
4970 as_fatal (_("Unknown architecture"));
4971 switch (OUTPUT_FLAVOR
)
4973 #ifdef OBJ_MAYBE_AOUT
4974 case bfd_target_aout_flavour
:
4975 return AOUT_TARGET_FORMAT
;
4977 #ifdef OBJ_MAYBE_COFF
4978 case bfd_target_coff_flavour
:
4981 #if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
4982 case bfd_target_elf_flavour
:
4984 if (flag_code
== CODE_64BIT
)
4985 use_rela_relocations
= 1;
4986 return flag_code
== CODE_64BIT
? "elf64-x86-64" : ELF_TARGET_FORMAT
;
4995 #endif /* OBJ_MAYBE_ more than one */
4997 #if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
4998 void i386_elf_emit_arch_note ()
5000 if (OUTPUT_FLAVOR
== bfd_target_elf_flavour
5001 && cpu_arch_name
!= NULL
)
5004 asection
*seg
= now_seg
;
5005 subsegT subseg
= now_subseg
;
5006 Elf_Internal_Note i_note
;
5007 Elf_External_Note e_note
;
5008 asection
*note_secp
;
5011 /* Create the .note section. */
5012 note_secp
= subseg_new (".note", 0);
5013 bfd_set_section_flags (stdoutput
,
5015 SEC_HAS_CONTENTS
| SEC_READONLY
);
5017 /* Process the arch string. */
5018 len
= strlen (cpu_arch_name
);
5020 i_note
.namesz
= len
+ 1;
5022 i_note
.type
= NT_ARCH
;
5023 p
= frag_more (sizeof (e_note
.namesz
));
5024 md_number_to_chars (p
, (valueT
) i_note
.namesz
, sizeof (e_note
.namesz
));
5025 p
= frag_more (sizeof (e_note
.descsz
));
5026 md_number_to_chars (p
, (valueT
) i_note
.descsz
, sizeof (e_note
.descsz
));
5027 p
= frag_more (sizeof (e_note
.type
));
5028 md_number_to_chars (p
, (valueT
) i_note
.type
, sizeof (e_note
.type
));
5029 p
= frag_more (len
+ 1);
5030 strcpy (p
, cpu_arch_name
);
5032 frag_align (2, 0, 0);
5034 subseg_set (seg
, subseg
);
5040 md_undefined_symbol (name
)
5043 if (name
[0] == GLOBAL_OFFSET_TABLE_NAME
[0]
5044 && name
[1] == GLOBAL_OFFSET_TABLE_NAME
[1]
5045 && name
[2] == GLOBAL_OFFSET_TABLE_NAME
[2]
5046 && strcmp (name
, GLOBAL_OFFSET_TABLE_NAME
) == 0)
5050 if (symbol_find (name
))
5051 as_bad (_("GOT already in symbol table"));
5052 GOT_symbol
= symbol_new (name
, undefined_section
,
5053 (valueT
) 0, &zero_address_frag
);
5060 /* Round up a section size to the appropriate boundary. */
5063 md_section_align (segment
, size
)
5064 segT segment ATTRIBUTE_UNUSED
;
5067 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
5068 if (OUTPUT_FLAVOR
== bfd_target_aout_flavour
)
5070 /* For a.out, force the section size to be aligned. If we don't do
5071 this, BFD will align it for us, but it will not write out the
5072 final bytes of the section. This may be a bug in BFD, but it is
5073 easier to fix it here since that is how the other a.out targets
5077 align
= bfd_get_section_alignment (stdoutput
, segment
);
5078 size
= ((size
+ (1 << align
) - 1) & ((valueT
) -1 << align
));
5085 /* On the i386, PC-relative offsets are relative to the start of the
5086 next instruction. That is, the address of the offset, plus its
5087 size, since the offset is always the last part of the insn. */
5090 md_pcrel_from (fixP
)
5093 return fixP
->fx_size
+ fixP
->fx_where
+ fixP
->fx_frag
->fr_address
;
5100 int ignore ATTRIBUTE_UNUSED
;
5104 temp
= get_absolute_expression ();
5105 subseg_set (bss_section
, (subsegT
) temp
);
5106 demand_empty_rest_of_line ();
5112 i386_validate_fix (fixp
)
5115 if (fixp
->fx_subsy
&& fixp
->fx_subsy
== GOT_symbol
)
5117 /* GOTOFF relocation are nonsense in 64bit mode. */
5118 if (fixp
->fx_r_type
== BFD_RELOC_32_PCREL
)
5120 if (flag_code
!= CODE_64BIT
)
5122 fixp
->fx_r_type
= BFD_RELOC_X86_64_GOTPCREL
;
5126 if (flag_code
== CODE_64BIT
)
5128 fixp
->fx_r_type
= BFD_RELOC_386_GOTOFF
;
5135 tc_gen_reloc (section
, fixp
)
5136 asection
*section ATTRIBUTE_UNUSED
;
5140 bfd_reloc_code_real_type code
;
5142 switch (fixp
->fx_r_type
)
5144 case BFD_RELOC_X86_64_PLT32
:
5145 case BFD_RELOC_X86_64_GOT32
:
5146 case BFD_RELOC_X86_64_GOTPCREL
:
5147 case BFD_RELOC_386_PLT32
:
5148 case BFD_RELOC_386_GOT32
:
5149 case BFD_RELOC_386_GOTOFF
:
5150 case BFD_RELOC_386_GOTPC
:
5151 case BFD_RELOC_386_TLS_GD
:
5152 case BFD_RELOC_386_TLS_LDM
:
5153 case BFD_RELOC_386_TLS_LDO_32
:
5154 case BFD_RELOC_386_TLS_IE_32
:
5155 case BFD_RELOC_386_TLS_IE
:
5156 case BFD_RELOC_386_TLS_GOTIE
:
5157 case BFD_RELOC_386_TLS_LE_32
:
5158 case BFD_RELOC_386_TLS_LE
:
5159 case BFD_RELOC_X86_64_32S
:
5160 case BFD_RELOC_X86_64_TLSGD
:
5161 case BFD_RELOC_X86_64_TLSLD
:
5162 case BFD_RELOC_X86_64_DTPOFF32
:
5163 case BFD_RELOC_X86_64_GOTTPOFF
:
5164 case BFD_RELOC_X86_64_TPOFF32
:
5166 case BFD_RELOC_VTABLE_ENTRY
:
5167 case BFD_RELOC_VTABLE_INHERIT
:
5168 code
= fixp
->fx_r_type
;
5173 switch (fixp
->fx_size
)
5176 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
5177 _("can not do %d byte pc-relative relocation"),
5179 code
= BFD_RELOC_32_PCREL
;
5181 case 1: code
= BFD_RELOC_8_PCREL
; break;
5182 case 2: code
= BFD_RELOC_16_PCREL
; break;
5183 case 4: code
= BFD_RELOC_32_PCREL
; break;
5188 switch (fixp
->fx_size
)
5191 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
5192 _("can not do %d byte relocation"),
5194 code
= BFD_RELOC_32
;
5196 case 1: code
= BFD_RELOC_8
; break;
5197 case 2: code
= BFD_RELOC_16
; break;
5198 case 4: code
= BFD_RELOC_32
; break;
5200 case 8: code
= BFD_RELOC_64
; break;
5207 if (code
== BFD_RELOC_32
5209 && fixp
->fx_addsy
== GOT_symbol
)
5211 /* We don't support GOTPC on 64bit targets. */
5212 if (flag_code
== CODE_64BIT
)
5214 code
= BFD_RELOC_386_GOTPC
;
5217 rel
= (arelent
*) xmalloc (sizeof (arelent
));
5218 rel
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
5219 *rel
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
5221 rel
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
5222 if (!use_rela_relocations
)
5224 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
5225 vtable entry to be used in the relocation's section offset. */
5226 if (fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
5227 rel
->address
= fixp
->fx_offset
;
5231 /* Use the rela in 64bit mode. */
5234 if (!fixp
->fx_pcrel
)
5235 rel
->addend
= fixp
->fx_offset
;
5239 case BFD_RELOC_X86_64_PLT32
:
5240 case BFD_RELOC_X86_64_GOT32
:
5241 case BFD_RELOC_X86_64_GOTPCREL
:
5242 case BFD_RELOC_X86_64_TLSGD
:
5243 case BFD_RELOC_X86_64_TLSLD
:
5244 case BFD_RELOC_X86_64_GOTTPOFF
:
5245 rel
->addend
= fixp
->fx_offset
- fixp
->fx_size
;
5248 rel
->addend
= (section
->vma
5250 + fixp
->fx_addnumber
5251 + md_pcrel_from (fixp
));
5256 rel
->howto
= bfd_reloc_type_lookup (stdoutput
, code
);
5257 if (rel
->howto
== NULL
)
5259 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
5260 _("cannot represent relocation type %s"),
5261 bfd_get_reloc_code_name (code
));
5262 /* Set howto to a garbage value so that we can keep going. */
5263 rel
->howto
= bfd_reloc_type_lookup (stdoutput
, BFD_RELOC_32
);
5264 assert (rel
->howto
!= NULL
);
5271 /* Parse operands using Intel syntax. This implements a recursive descent
5272 parser based on the BNF grammar published in Appendix B of the MASM 6.1
5275 FIXME: We do not recognize the full operand grammar defined in the MASM
5276 documentation. In particular, all the structure/union and
5277 high-level macro operands are missing.
5279 Uppercase words are terminals, lower case words are non-terminals.
5280 Objects surrounded by double brackets '[[' ']]' are optional. Vertical
5281 bars '|' denote choices. Most grammar productions are implemented in
5282 functions called 'intel_<production>'.
5284 Initial production is 'expr'.
5290 byteRegister AL | AH | BL | BH | CL | CH | DL | DH
5292 constant digits [[ radixOverride ]]
5294 dataType BYTE | WORD | DWORD | QWORD | XWORD
5327 gpRegister AX | EAX | BX | EBX | CX | ECX | DX | EDX
5328 | BP | EBP | SP | ESP | DI | EDI | SI | ESI
5330 hexdigit a | b | c | d | e | f
5331 | A | B | C | D | E | F
5341 register specialRegister
5345 segmentRegister CS | DS | ES | FS | GS | SS
5347 specialRegister CR0 | CR2 | CR3
5348 | DR0 | DR1 | DR2 | DR3 | DR6 | DR7
5349 | TR3 | TR4 | TR5 | TR6 | TR7
5351 We simplify the grammar in obvious places (e.g., register parsing is
5352 done by calling parse_register) and eliminate immediate left recursion
5353 to implement a recursive-descent parser.
5393 /* Parsing structure for the intel syntax parser. Used to implement the
5394 semantic actions for the operand grammar. */
5395 struct intel_parser_s
5397 char *op_string
; /* The string being parsed. */
5398 int got_a_float
; /* Whether the operand is a float. */
5399 int op_modifier
; /* Operand modifier. */
5400 int is_mem
; /* 1 if operand is memory reference. */
5401 const reg_entry
*reg
; /* Last register reference found. */
5402 char *disp
; /* Displacement string being built. */
5405 static struct intel_parser_s intel_parser
;
5407 /* Token structure for parsing intel syntax. */
5410 int code
; /* Token code. */
5411 const reg_entry
*reg
; /* Register entry for register tokens. */
5412 char *str
; /* String representation. */
5415 static struct intel_token cur_token
, prev_token
;
5417 /* Token codes for the intel parser. Since T_SHORT is already used
5418 by COFF, undefine it first to prevent a warning. */
5433 /* Prototypes for intel parser functions. */
5434 static int intel_match_token
PARAMS ((int code
));
5435 static void intel_get_token
PARAMS ((void));
5436 static void intel_putback_token
PARAMS ((void));
5437 static int intel_expr
PARAMS ((void));
5438 static int intel_e05
PARAMS ((void));
5439 static int intel_e05_1
PARAMS ((void));
5440 static int intel_e06
PARAMS ((void));
5441 static int intel_e06_1
PARAMS ((void));
5442 static int intel_e09
PARAMS ((void));
5443 static int intel_e09_1
PARAMS ((void));
5444 static int intel_e10
PARAMS ((void));
5445 static int intel_e10_1
PARAMS ((void));
5446 static int intel_e11
PARAMS ((void));
5449 i386_intel_operand (operand_string
, got_a_float
)
5450 char *operand_string
;
5456 /* Initialize token holders. */
5457 cur_token
.code
= prev_token
.code
= T_NIL
;
5458 cur_token
.reg
= prev_token
.reg
= NULL
;
5459 cur_token
.str
= prev_token
.str
= NULL
;
5461 /* Initialize parser structure. */
5462 p
= intel_parser
.op_string
= (char *) malloc (strlen (operand_string
) + 1);
5465 strcpy (intel_parser
.op_string
, operand_string
);
5466 intel_parser
.got_a_float
= got_a_float
;
5467 intel_parser
.op_modifier
= -1;
5468 intel_parser
.is_mem
= 0;
5469 intel_parser
.reg
= NULL
;
5470 intel_parser
.disp
= (char *) malloc (strlen (operand_string
) + 1);
5471 if (intel_parser
.disp
== NULL
)
5473 intel_parser
.disp
[0] = '\0';
5475 /* Read the first token and start the parser. */
5477 ret
= intel_expr ();
5481 /* If we found a memory reference, hand it over to i386_displacement
5482 to fill in the rest of the operand fields. */
5483 if (intel_parser
.is_mem
)
5485 if ((i
.mem_operands
== 1
5486 && (current_templates
->start
->opcode_modifier
& IsString
) == 0)
5487 || i
.mem_operands
== 2)
5489 as_bad (_("too many memory references for '%s'"),
5490 current_templates
->start
->name
);
5495 char *s
= intel_parser
.disp
;
5498 /* Add the displacement expression. */
5500 ret
= i386_displacement (s
, s
+ strlen (s
));
5502 ret
= i386_index_check (operand_string
);
5506 /* Constant and OFFSET expressions are handled by i386_immediate. */
5507 else if (intel_parser
.op_modifier
== OFFSET_FLAT
5508 || intel_parser
.reg
== NULL
)
5509 ret
= i386_immediate (intel_parser
.disp
);
5513 free (intel_parser
.disp
);
5523 /* expr SHORT e05 */
5524 if (cur_token
.code
== T_SHORT
)
5526 intel_parser
.op_modifier
= SHORT
;
5527 intel_match_token (T_SHORT
);
5529 return (intel_e05 ());
5534 return intel_e05 ();
5544 return (intel_e06 () && intel_e05_1 ());
5550 /* e05' addOp e06 e05' */
5551 if (cur_token
.code
== '+' || cur_token
.code
== '-')
5553 strcat (intel_parser
.disp
, cur_token
.str
);
5554 intel_match_token (cur_token
.code
);
5556 return (intel_e06 () && intel_e05_1 ());
5571 return (intel_e09 () && intel_e06_1 ());
5577 /* e06' mulOp e09 e06' */
5578 if (cur_token
.code
== '*' || cur_token
.code
== '/')
5580 strcat (intel_parser
.disp
, cur_token
.str
);
5581 intel_match_token (cur_token
.code
);
5583 return (intel_e09 () && intel_e06_1 ());
5591 /* e09 OFFSET e10 e09'
5600 /* e09 OFFSET e10 e09' */
5601 if (cur_token
.code
== T_OFFSET
)
5603 intel_parser
.is_mem
= 0;
5604 intel_parser
.op_modifier
= OFFSET_FLAT
;
5605 intel_match_token (T_OFFSET
);
5607 return (intel_e10 () && intel_e09_1 ());
5612 return (intel_e10 () && intel_e09_1 ());
5618 /* e09' PTR e10 e09' */
5619 if (cur_token
.code
== T_PTR
)
5621 if (prev_token
.code
== T_BYTE
)
5622 i
.suffix
= BYTE_MNEM_SUFFIX
;
5624 else if (prev_token
.code
== T_WORD
)
5626 if (intel_parser
.got_a_float
== 2) /* "fi..." */
5627 i
.suffix
= SHORT_MNEM_SUFFIX
;
5629 i
.suffix
= WORD_MNEM_SUFFIX
;
5632 else if (prev_token
.code
== T_DWORD
)
5634 if (intel_parser
.got_a_float
== 1) /* "f..." */
5635 i
.suffix
= SHORT_MNEM_SUFFIX
;
5637 i
.suffix
= LONG_MNEM_SUFFIX
;
5640 else if (prev_token
.code
== T_QWORD
)
5642 if (intel_parser
.got_a_float
== 1) /* "f..." */
5643 i
.suffix
= LONG_MNEM_SUFFIX
;
5645 i
.suffix
= QWORD_MNEM_SUFFIX
;
5648 else if (prev_token
.code
== T_XWORD
)
5649 i
.suffix
= LONG_DOUBLE_MNEM_SUFFIX
;
5653 as_bad (_("Unknown operand modifier `%s'\n"), prev_token
.str
);
5657 intel_match_token (T_PTR
);
5659 return (intel_e10 () && intel_e09_1 ());
5662 /* e09 : e10 e09' */
5663 else if (cur_token
.code
== ':')
5665 /* Mark as a memory operand only if it's not already known to be an
5666 offset expression. */
5667 if (intel_parser
.op_modifier
!= OFFSET_FLAT
)
5668 intel_parser
.is_mem
= 1;
5670 return (intel_match_token (':') && intel_e10 () && intel_e09_1 ());
5685 return (intel_e11 () && intel_e10_1 ());
5691 /* e10' [ expr ] e10' */
5692 if (cur_token
.code
== '[')
5694 intel_match_token ('[');
5696 /* Mark as a memory operand only if it's not already known to be an
5697 offset expression. If it's an offset expression, we need to keep
5699 if (intel_parser
.op_modifier
!= OFFSET_FLAT
)
5700 intel_parser
.is_mem
= 1;
5702 strcat (intel_parser
.disp
, "[");
5704 /* Add a '+' to the displacement string if necessary. */
5705 if (*intel_parser
.disp
!= '\0'
5706 && *(intel_parser
.disp
+ strlen (intel_parser
.disp
) - 1) != '+')
5707 strcat (intel_parser
.disp
, "+");
5709 if (intel_expr () && intel_match_token (']'))
5711 /* Preserve brackets when the operand is an offset expression. */
5712 if (intel_parser
.op_modifier
== OFFSET_FLAT
)
5713 strcat (intel_parser
.disp
, "]");
5715 return intel_e10_1 ();
5742 if (cur_token
.code
== '(')
5744 intel_match_token ('(');
5745 strcat (intel_parser
.disp
, "(");
5747 if (intel_expr () && intel_match_token (')'))
5749 strcat (intel_parser
.disp
, ")");
5757 else if (cur_token
.code
== '[')
5759 intel_match_token ('[');
5761 /* Mark as a memory operand only if it's not already known to be an
5762 offset expression. If it's an offset expression, we need to keep
5764 if (intel_parser
.op_modifier
!= OFFSET_FLAT
)
5765 intel_parser
.is_mem
= 1;
5767 strcat (intel_parser
.disp
, "[");
5769 /* Operands for jump/call inside brackets denote absolute addresses. */
5770 if (current_templates
->start
->opcode_modifier
& Jump
5771 || current_templates
->start
->opcode_modifier
& JumpDword
5772 || current_templates
->start
->opcode_modifier
& JumpByte
5773 || current_templates
->start
->opcode_modifier
& JumpInterSegment
)
5774 i
.types
[this_operand
] |= JumpAbsolute
;
5776 /* Add a '+' to the displacement string if necessary. */
5777 if (*intel_parser
.disp
!= '\0'
5778 && *(intel_parser
.disp
+ strlen (intel_parser
.disp
) - 1) != '+')
5779 strcat (intel_parser
.disp
, "+");
5781 if (intel_expr () && intel_match_token (']'))
5783 /* Preserve brackets when the operand is an offset expression. */
5784 if (intel_parser
.op_modifier
== OFFSET_FLAT
)
5785 strcat (intel_parser
.disp
, "]");
5798 else if (cur_token
.code
== T_BYTE
5799 || cur_token
.code
== T_WORD
5800 || cur_token
.code
== T_DWORD
5801 || cur_token
.code
== T_QWORD
5802 || cur_token
.code
== T_XWORD
)
5804 intel_match_token (cur_token
.code
);
5811 else if (cur_token
.code
== '$' || cur_token
.code
== '.')
5813 strcat (intel_parser
.disp
, cur_token
.str
);
5814 intel_match_token (cur_token
.code
);
5816 /* Mark as a memory operand only if it's not already known to be an
5817 offset expression. */
5818 if (intel_parser
.op_modifier
!= OFFSET_FLAT
)
5819 intel_parser
.is_mem
= 1;
5825 else if (cur_token
.code
== T_REG
)
5827 const reg_entry
*reg
= intel_parser
.reg
= cur_token
.reg
;
5829 intel_match_token (T_REG
);
5831 /* Check for segment change. */
5832 if (cur_token
.code
== ':')
5834 if (reg
->reg_type
& (SReg2
| SReg3
))
5836 switch (reg
->reg_num
)
5839 i
.seg
[i
.mem_operands
] = &es
;
5842 i
.seg
[i
.mem_operands
] = &cs
;
5845 i
.seg
[i
.mem_operands
] = &ss
;
5848 i
.seg
[i
.mem_operands
] = &ds
;
5851 i
.seg
[i
.mem_operands
] = &fs
;
5854 i
.seg
[i
.mem_operands
] = &gs
;
5860 as_bad (_("`%s' is not a valid segment register"), reg
->reg_name
);
5865 /* Not a segment register. Check for register scaling. */
5866 else if (cur_token
.code
== '*')
5868 if (!intel_parser
.is_mem
)
5870 as_bad (_("Register scaling only allowed in memory operands."));
5874 /* What follows must be a valid scale. */
5875 if (intel_match_token ('*')
5876 && strchr ("01248", *cur_token
.str
))
5879 i
.types
[this_operand
] |= BaseIndex
;
5881 /* Set the scale after setting the register (otherwise,
5882 i386_scale will complain) */
5883 i386_scale (cur_token
.str
);
5884 intel_match_token (T_CONST
);
5888 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
5894 /* No scaling. If this is a memory operand, the register is either a
5895 base register (first occurrence) or an index register (second
5897 else if (intel_parser
.is_mem
&& !(reg
->reg_type
& (SReg2
| SReg3
)))
5899 if (i
.base_reg
&& i
.index_reg
)
5901 as_bad (_("Too many register references in memory operand.\n"));
5905 if (i
.base_reg
== NULL
)
5910 i
.types
[this_operand
] |= BaseIndex
;
5913 /* Offset modifier. Add the register to the displacement string to be
5914 parsed as an immediate expression after we're done. */
5915 else if (intel_parser
.op_modifier
== OFFSET_FLAT
)
5916 strcat (intel_parser
.disp
, reg
->reg_name
);
5918 /* It's neither base nor index nor offset. */
5921 i
.types
[this_operand
] |= reg
->reg_type
& ~BaseIndex
;
5922 i
.op
[this_operand
].regs
= reg
;
5926 /* Since registers are not part of the displacement string (except
5927 when we're parsing offset operands), we may need to remove any
5928 preceding '+' from the displacement string. */
5929 if (*intel_parser
.disp
!= '\0'
5930 && intel_parser
.op_modifier
!= OFFSET_FLAT
)
5932 char *s
= intel_parser
.disp
;
5933 s
+= strlen (s
) - 1;
5942 else if (cur_token
.code
== T_ID
)
5944 /* Add the identifier to the displacement string. */
5945 strcat (intel_parser
.disp
, cur_token
.str
);
5946 intel_match_token (T_ID
);
5948 /* The identifier represents a memory reference only if it's not
5949 preceded by an offset modifier. */
5950 if (intel_parser
.op_modifier
!= OFFSET_FLAT
)
5951 intel_parser
.is_mem
= 1;
5957 else if (cur_token
.code
== T_CONST
5958 || cur_token
.code
== '-'
5959 || cur_token
.code
== '+')
5963 /* Allow constants that start with `+' or `-'. */
5964 if (cur_token
.code
== '-' || cur_token
.code
== '+')
5966 strcat (intel_parser
.disp
, cur_token
.str
);
5967 intel_match_token (cur_token
.code
);
5968 if (cur_token
.code
!= T_CONST
)
5970 as_bad (_("Syntax error. Expecting a constant. Got `%s'.\n"),
5976 save_str
= (char *) malloc (strlen (cur_token
.str
) + 1);
5977 if (save_str
== NULL
)
5979 strcpy (save_str
, cur_token
.str
);
5981 /* Get the next token to check for register scaling. */
5982 intel_match_token (cur_token
.code
);
5984 /* Check if this constant is a scaling factor for an index register. */
5985 if (cur_token
.code
== '*')
5987 if (intel_match_token ('*') && cur_token
.code
== T_REG
)
5989 if (!intel_parser
.is_mem
)
5991 as_bad (_("Register scaling only allowed in memory operands."));
5995 /* The constant is followed by `* reg', so it must be
5997 if (strchr ("01248", *save_str
))
5999 i
.index_reg
= cur_token
.reg
;
6000 i
.types
[this_operand
] |= BaseIndex
;
6002 /* Set the scale after setting the register (otherwise,
6003 i386_scale will complain) */
6004 i386_scale (save_str
);
6005 intel_match_token (T_REG
);
6007 /* Since registers are not part of the displacement
6008 string, we may need to remove any preceding '+' from
6009 the displacement string. */
6010 if (*intel_parser
.disp
!= '\0')
6012 char *s
= intel_parser
.disp
;
6013 s
+= strlen (s
) - 1;
6026 /* The constant was not used for register scaling. Since we have
6027 already consumed the token following `*' we now need to put it
6028 back in the stream. */
6030 intel_putback_token ();
6033 /* Add the constant to the displacement string. */
6034 strcat (intel_parser
.disp
, save_str
);
6040 as_bad (_("Unrecognized token '%s'"), cur_token
.str
);
6044 /* Match the given token against cur_token. If they match, read the next
6045 token from the operand string. */
6047 intel_match_token (code
)
6050 if (cur_token
.code
== code
)
6057 as_bad (_("Unexpected token `%s'\n"), cur_token
.str
);
6062 /* Read a new token from intel_parser.op_string and store it in cur_token. */
6067 const reg_entry
*reg
;
6068 struct intel_token new_token
;
6070 new_token
.code
= T_NIL
;
6071 new_token
.reg
= NULL
;
6072 new_token
.str
= NULL
;
6074 /* Free the memory allocated to the previous token and move
6075 cur_token to prev_token. */
6077 free (prev_token
.str
);
6079 prev_token
= cur_token
;
6081 /* Skip whitespace. */
6082 while (is_space_char (*intel_parser
.op_string
))
6083 intel_parser
.op_string
++;
6085 /* Return an empty token if we find nothing else on the line. */
6086 if (*intel_parser
.op_string
== '\0')
6088 cur_token
= new_token
;
6092 /* The new token cannot be larger than the remainder of the operand
6094 new_token
.str
= (char *) malloc (strlen (intel_parser
.op_string
) + 1);
6095 if (new_token
.str
== NULL
)
6097 new_token
.str
[0] = '\0';
6099 if (strchr ("0123456789", *intel_parser
.op_string
))
6101 char *p
= new_token
.str
;
6102 char *q
= intel_parser
.op_string
;
6103 new_token
.code
= T_CONST
;
6105 /* Allow any kind of identifier char to encompass floating point and
6106 hexadecimal numbers. */
6107 while (is_identifier_char (*q
))
6111 /* Recognize special symbol names [0-9][bf]. */
6112 if (strlen (intel_parser
.op_string
) == 2
6113 && (intel_parser
.op_string
[1] == 'b'
6114 || intel_parser
.op_string
[1] == 'f'))
6115 new_token
.code
= T_ID
;
6118 else if (strchr ("+-/*:[]()", *intel_parser
.op_string
))
6120 new_token
.code
= *intel_parser
.op_string
;
6121 new_token
.str
[0] = *intel_parser
.op_string
;
6122 new_token
.str
[1] = '\0';
6125 else if ((*intel_parser
.op_string
== REGISTER_PREFIX
|| allow_naked_reg
)
6126 && ((reg
= parse_register (intel_parser
.op_string
, &end_op
)) != NULL
))
6128 new_token
.code
= T_REG
;
6129 new_token
.reg
= reg
;
6131 if (*intel_parser
.op_string
== REGISTER_PREFIX
)
6133 new_token
.str
[0] = REGISTER_PREFIX
;
6134 new_token
.str
[1] = '\0';
6137 strcat (new_token
.str
, reg
->reg_name
);
6140 else if (is_identifier_char (*intel_parser
.op_string
))
6142 char *p
= new_token
.str
;
6143 char *q
= intel_parser
.op_string
;
6145 /* A '.' or '$' followed by an identifier char is an identifier.
6146 Otherwise, it's operator '.' followed by an expression. */
6147 if ((*q
== '.' || *q
== '$') && !is_identifier_char (*(q
+ 1)))
6149 new_token
.code
= *q
;
6150 new_token
.str
[0] = *q
;
6151 new_token
.str
[1] = '\0';
6155 while (is_identifier_char (*q
) || *q
== '@')
6159 if (strcasecmp (new_token
.str
, "BYTE") == 0)
6160 new_token
.code
= T_BYTE
;
6162 else if (strcasecmp (new_token
.str
, "WORD") == 0)
6163 new_token
.code
= T_WORD
;
6165 else if (strcasecmp (new_token
.str
, "DWORD") == 0)
6166 new_token
.code
= T_DWORD
;
6168 else if (strcasecmp (new_token
.str
, "QWORD") == 0)
6169 new_token
.code
= T_QWORD
;
6171 else if (strcasecmp (new_token
.str
, "XWORD") == 0)
6172 new_token
.code
= T_XWORD
;
6174 else if (strcasecmp (new_token
.str
, "PTR") == 0)
6175 new_token
.code
= T_PTR
;
6177 else if (strcasecmp (new_token
.str
, "SHORT") == 0)
6178 new_token
.code
= T_SHORT
;
6180 else if (strcasecmp (new_token
.str
, "OFFSET") == 0)
6182 new_token
.code
= T_OFFSET
;
6184 /* ??? This is not mentioned in the MASM grammar but gcc
6185 makes use of it with -mintel-syntax. OFFSET may be
6186 followed by FLAT: */
6187 if (strncasecmp (q
, " FLAT:", 6) == 0)
6188 strcat (new_token
.str
, " FLAT:");
6191 /* ??? This is not mentioned in the MASM grammar. */
6192 else if (strcasecmp (new_token
.str
, "FLAT") == 0)
6193 new_token
.code
= T_OFFSET
;
6196 new_token
.code
= T_ID
;
6201 as_bad (_("Unrecognized token `%s'\n"), intel_parser
.op_string
);
6203 intel_parser
.op_string
+= strlen (new_token
.str
);
6204 cur_token
= new_token
;
6207 /* Put cur_token back into the token stream and make cur_token point to
6210 intel_putback_token ()
6212 intel_parser
.op_string
-= strlen (cur_token
.str
);
6213 free (cur_token
.str
);
6214 cur_token
= prev_token
;
6216 /* Forget prev_token. */
6217 prev_token
.code
= T_NIL
;
6218 prev_token
.reg
= NULL
;
6219 prev_token
.str
= NULL
;
6223 tc_x86_regname_to_dw2regnum (const char *regname
)
6225 unsigned int regnum
;
6226 unsigned int regnames_count
;
6227 char *regnames_32
[] =
6229 "eax", "ecx", "edx", "ebx",
6230 "esp", "ebp", "esi", "edi",
6233 char *regnames_64
[] =
6235 "rax", "rbx", "rcx", "rdx",
6236 "rdi", "rsi", "rbp", "rsp",
6237 "r8", "r9", "r10", "r11",
6238 "r12", "r13", "r14", "r15",
6243 if (flag_code
== CODE_64BIT
)
6245 regnames
= regnames_64
;
6246 regnames_count
= ARRAY_SIZE (regnames_64
);
6250 regnames
= regnames_32
;
6251 regnames_count
= ARRAY_SIZE (regnames_32
);
6254 for (regnum
= 0; regnum
< regnames_count
; regnum
++)
6255 if (strcmp (regname
, regnames
[regnum
]) == 0)
6262 tc_x86_frame_initial_instructions (void)
6264 static unsigned int sp_regno
;
6267 sp_regno
= tc_x86_regname_to_dw2regnum (flag_code
== CODE_64BIT
6270 cfi_add_CFA_def_cfa (sp_regno
, -x86_cie_data_alignment
);
6271 cfi_add_CFA_offset (x86_dwarf2_return_column
, x86_cie_data_alignment
);