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