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