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