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