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