* i386.h (i386_optab): SSE integer converison instructions have
[deliverable/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 646set_code_flag (value)
e5cb08ac 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 1100 if (!sign)
e5cb08ac 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 1112 if (sign)
e5cb08ac 1113 switch (size)
3e73aa7c
JH
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
bfb32b52 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 1582 switch (i.op[op].imms->X_op)
e5cb08ac 1583 {
3e73aa7c
JH
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
e5cb08ac
KH
1599 /* If this operand is at most 16 bits, convert it
1600 to a signed 16 bit number before trying to see
1601 whether it will fit in an even smaller size.
1602 This allows a 16-bit operand such as $0xffe0 to
1603 be recognised as within Imm8S range. */
3e73aa7c 1604 if ((i.types[op] & Imm16)
e5cb08ac 1605 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
3e73aa7c
JH
1606 {
1607 i.op[op].imms->X_add_number =
1608 (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
1609 }
1610 if ((i.types[op] & Imm32)
1611 && (i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1)) == 0)
1612 {
1613 i.op[op].imms->X_add_number =
1614 (i.op[op].imms->X_add_number ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
1615 }
1616 i.types[op] |= smallest_imm_type (i.op[op].imms->X_add_number);
1617 /* We must avoid matching of Imm32 templates when 64bit only immediate is available. */
1618 if (guess_suffix == QWORD_MNEM_SUFFIX)
1619 i.types[op] &= ~Imm32;
1620 break;
1621 case O_absent:
1622 case O_register:
bfb32b52 1623 abort ();
3e73aa7c
JH
1624 /* Symbols and expressions. */
1625 default:
1626 /* Convert symbolic operand to proper sizes for matching. */
1627 switch (guess_suffix)
1628 {
1629 case QWORD_MNEM_SUFFIX:
1630 i.types[op] = Imm64 | Imm32S;
1631 break;
1632 case LONG_MNEM_SUFFIX:
1633 i.types[op] = Imm32 | Imm64;
1634 break;
1635 case WORD_MNEM_SUFFIX:
1636 i.types[op] = Imm16 | Imm32 | Imm64;
1637 break;
1638 break;
1639 case BYTE_MNEM_SUFFIX:
1640 i.types[op] = Imm8 | Imm8S | Imm16 | Imm32S | Imm32;
1641 break;
1642 break;
1643 }
1644 break;
773f551c 1645 }
773f551c
AM
1646 }
1647 }
1648
45288df1
AM
1649 if (i.disp_operands)
1650 {
1651 /* Try to use the smallest displacement type too. */
1652 int op;
1653
47926f60 1654 for (op = i.operands; --op >= 0;)
45288df1
AM
1655 if ((i.types[op] & Disp)
1656 && i.op[op].imms->X_op == O_constant)
1657 {
1658 offsetT disp = i.op[op].disps->X_add_number;
1659
1660 if (i.types[op] & Disp16)
1661 {
1662 /* We know this operand is at most 16 bits, so
1663 convert to a signed 16 bit number before trying
1664 to see whether it will fit in an even smaller
1665 size. */
47926f60 1666
45288df1
AM
1667 disp = (((disp & 0xffff) ^ 0x8000) - 0x8000);
1668 }
3e73aa7c
JH
1669 else if (i.types[op] & Disp32)
1670 {
1671 /* We know this operand is at most 32 bits, so convert to a
1672 signed 32 bit number before trying to see whether it will
1673 fit in an even smaller size. */
1674 disp &= (((offsetT) 2 << 31) - 1);
1675 disp = (disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
1676 }
1677 if (flag_code == CODE_64BIT)
1678 {
1679 if (fits_in_signed_long (disp))
1680 i.types[op] |= Disp32S;
1681 if (fits_in_unsigned_long (disp))
1682 i.types[op] |= Disp32;
1683 }
1684 if ((i.types[op] & (Disp32 | Disp32S | Disp16))
1685 && fits_in_signed_byte (disp))
45288df1
AM
1686 i.types[op] |= Disp8;
1687 }
1688 }
1689
252b5132
RH
1690 overlap0 = 0;
1691 overlap1 = 0;
1692 overlap2 = 0;
1693 found_reverse_match = 0;
1694 suffix_check = (i.suffix == BYTE_MNEM_SUFFIX
1695 ? No_bSuf
1696 : (i.suffix == WORD_MNEM_SUFFIX
1697 ? No_wSuf
1698 : (i.suffix == SHORT_MNEM_SUFFIX
1699 ? No_sSuf
1700 : (i.suffix == LONG_MNEM_SUFFIX
24eab124 1701 ? No_lSuf
3e73aa7c
JH
1702 : (i.suffix == QWORD_MNEM_SUFFIX
1703 ? No_qSuf
1704 : (i.suffix == LONG_DOUBLE_MNEM_SUFFIX ? No_xSuf : 0))))));
252b5132
RH
1705
1706 for (t = current_templates->start;
1707 t < current_templates->end;
1708 t++)
1709 {
47926f60 1710 /* Must have right number of operands. */
252b5132
RH
1711 if (i.operands != t->operands)
1712 continue;
1713
7f3f1ea2
AM
1714 /* Check the suffix, except for some instructions in intel mode. */
1715 if ((t->opcode_modifier & suffix_check)
fa2255cb
DN
1716 && !(intel_syntax
1717 && (t->opcode_modifier & IgnoreSize))
7f3f1ea2
AM
1718 && !(intel_syntax
1719 && t->base_opcode == 0xd9
ce8a8b2f
AM
1720 && (t->extension_opcode == 5 /* 0xd9,5 "fldcw" */
1721 || t->extension_opcode == 7))) /* 0xd9,7 "f{n}stcw" */
24eab124 1722 continue;
252b5132 1723
e2914f48 1724 /* Do not verify operands when there are none. */
252b5132 1725 else if (!t->operands)
e2914f48
JH
1726 {
1727 if (t->cpu_flags & ~cpu_arch_flags)
1728 continue;
1729 /* We've found a match; break out of loop. */
1730 break;
e5cb08ac 1731 }
252b5132
RH
1732
1733 overlap0 = i.types[0] & t->operand_types[0];
1734 switch (t->operands)
1735 {
1736 case 1:
1737 if (!MATCH (overlap0, i.types[0], t->operand_types[0]))
1738 continue;
1739 break;
1740 case 2:
1741 case 3:
1742 overlap1 = i.types[1] & t->operand_types[1];
1743 if (!MATCH (overlap0, i.types[0], t->operand_types[0])
1744 || !MATCH (overlap1, i.types[1], t->operand_types[1])
1745 || !CONSISTENT_REGISTER_MATCH (overlap0, i.types[0],
1746 t->operand_types[0],
1747 overlap1, i.types[1],
1748 t->operand_types[1]))
1749 {
47926f60 1750 /* Check if other direction is valid ... */
252b5132
RH
1751 if ((t->opcode_modifier & (D|FloatD)) == 0)
1752 continue;
1753
47926f60 1754 /* Try reversing direction of operands. */
252b5132
RH
1755 overlap0 = i.types[0] & t->operand_types[1];
1756 overlap1 = i.types[1] & t->operand_types[0];
1757 if (!MATCH (overlap0, i.types[0], t->operand_types[1])
1758 || !MATCH (overlap1, i.types[1], t->operand_types[0])
1759 || !CONSISTENT_REGISTER_MATCH (overlap0, i.types[0],
1760 t->operand_types[1],
1761 overlap1, i.types[1],
1762 t->operand_types[0]))
1763 {
47926f60 1764 /* Does not match either direction. */
252b5132
RH
1765 continue;
1766 }
1767 /* found_reverse_match holds which of D or FloatDR
1768 we've found. */
1769 found_reverse_match = t->opcode_modifier & (D|FloatDR);
252b5132 1770 }
47926f60 1771 /* Found a forward 2 operand match here. */
3e73aa7c 1772 else if (t->operands == 3)
252b5132
RH
1773 {
1774 /* Here we make use of the fact that there are no
1775 reverse match 3 operand instructions, and all 3
1776 operand instructions only need to be checked for
1777 register consistency between operands 2 and 3. */
1778 overlap2 = i.types[2] & t->operand_types[2];
1779 if (!MATCH (overlap2, i.types[2], t->operand_types[2])
1780 || !CONSISTENT_REGISTER_MATCH (overlap1, i.types[1],
1781 t->operand_types[1],
1782 overlap2, i.types[2],
24eab124 1783 t->operand_types[2]))
252b5132 1784
24eab124 1785 continue;
252b5132 1786 }
47926f60 1787 /* Found either forward/reverse 2 or 3 operand match here:
ce8a8b2f 1788 slip through to break. */
252b5132 1789 }
3e73aa7c
JH
1790 if (t->cpu_flags & ~cpu_arch_flags)
1791 {
1792 found_reverse_match = 0;
1793 continue;
1794 }
47926f60
KH
1795 /* We've found a match; break out of loop. */
1796 break;
ce8a8b2f 1797 }
252b5132 1798 if (t == current_templates->end)
47926f60
KH
1799 {
1800 /* We found no match. */
252b5132
RH
1801 as_bad (_("suffix or operands invalid for `%s'"),
1802 current_templates->start->name);
1803 return;
1804 }
1805
a38cf1db 1806 if (!quiet_warnings)
3138f287 1807 {
a38cf1db
AM
1808 if (!intel_syntax
1809 && ((i.types[0] & JumpAbsolute)
1810 != (t->operand_types[0] & JumpAbsolute)))
1811 {
1812 as_warn (_("indirect %s without `*'"), t->name);
1813 }
3138f287 1814
a38cf1db
AM
1815 if ((t->opcode_modifier & (IsPrefix|IgnoreSize))
1816 == (IsPrefix|IgnoreSize))
1817 {
1818 /* Warn them that a data or address size prefix doesn't
1819 affect assembly of the next line of code. */
1820 as_warn (_("stand-alone `%s' prefix"), t->name);
1821 }
252b5132
RH
1822 }
1823
1824 /* Copy the template we found. */
1825 i.tm = *t;
1826 if (found_reverse_match)
1827 {
7f3f1ea2
AM
1828 /* If we found a reverse match we must alter the opcode
1829 direction bit. found_reverse_match holds bits to change
1830 (different for int & float insns). */
1831
1832 i.tm.base_opcode ^= found_reverse_match;
1833
252b5132
RH
1834 i.tm.operand_types[0] = t->operand_types[1];
1835 i.tm.operand_types[1] = t->operand_types[0];
1836 }
1837
d0b47220 1838 /* Undo SYSV386_COMPAT brokenness when in Intel mode. See i386.h */
e5cb08ac
KH
1839 if (SYSV386_COMPAT
1840 && intel_syntax
1841 && (i.tm.base_opcode & 0xfffffde0) == 0xdce0)
1842 i.tm.base_opcode ^= FloatR;
252b5132
RH
1843
1844 if (i.tm.opcode_modifier & FWait)
1845 if (! add_prefix (FWAIT_OPCODE))
1846 return;
1847
ce8a8b2f 1848 /* Check string instruction segment overrides. */
252b5132
RH
1849 if ((i.tm.opcode_modifier & IsString) != 0 && i.mem_operands != 0)
1850 {
1851 int mem_op = (i.types[0] & AnyMem) ? 0 : 1;
1852 if ((i.tm.operand_types[mem_op] & EsSeg) != 0)
1853 {
1854 if (i.seg[0] != NULL && i.seg[0] != &es)
1855 {
1856 as_bad (_("`%s' operand %d must use `%%es' segment"),
1857 i.tm.name,
1858 mem_op + 1);
1859 return;
1860 }
1861 /* There's only ever one segment override allowed per instruction.
1862 This instruction possibly has a legal segment override on the
1863 second operand, so copy the segment to where non-string
1864 instructions store it, allowing common code. */
1865 i.seg[0] = i.seg[1];
1866 }
1867 else if ((i.tm.operand_types[mem_op + 1] & EsSeg) != 0)
1868 {
1869 if (i.seg[1] != NULL && i.seg[1] != &es)
1870 {
1871 as_bad (_("`%s' operand %d must use `%%es' segment"),
1872 i.tm.name,
1873 mem_op + 2);
1874 return;
1875 }
1876 }
1877 }
1878
3e73aa7c
JH
1879 if (i.reg_operands && flag_code < CODE_64BIT)
1880 {
1881 int op;
e5cb08ac 1882 for (op = i.operands; --op >= 0;)
3e73aa7c
JH
1883 if ((i.types[op] & Reg)
1884 && (i.op[op].regs->reg_flags & (RegRex64|RegRex)))
b96d3a20
JH
1885 {
1886 as_bad (_("Extended register `%%%s' available only in 64bit mode."),
1887 i.op[op].regs->reg_name);
1888 return;
1889 }
3e73aa7c
JH
1890 }
1891
252b5132
RH
1892 /* If matched instruction specifies an explicit instruction mnemonic
1893 suffix, use it. */
3e73aa7c 1894 if (i.tm.opcode_modifier & (Size16 | Size32 | Size64))
252b5132
RH
1895 {
1896 if (i.tm.opcode_modifier & Size16)
1897 i.suffix = WORD_MNEM_SUFFIX;
3e73aa7c
JH
1898 else if (i.tm.opcode_modifier & Size64)
1899 i.suffix = QWORD_MNEM_SUFFIX;
252b5132 1900 else
add0c677 1901 i.suffix = LONG_MNEM_SUFFIX;
252b5132
RH
1902 }
1903 else if (i.reg_operands)
1904 {
1905 /* If there's no instruction mnemonic suffix we try to invent one
47926f60 1906 based on register operands. */
252b5132
RH
1907 if (!i.suffix)
1908 {
1909 /* We take i.suffix from the last register operand specified,
1910 Destination register type is more significant than source
1911 register type. */
1912 int op;
47926f60 1913 for (op = i.operands; --op >= 0;)
cc5ca5ce
AM
1914 if ((i.types[op] & Reg)
1915 && !(i.tm.operand_types[op] & InOutPortReg))
252b5132
RH
1916 {
1917 i.suffix = ((i.types[op] & Reg8) ? BYTE_MNEM_SUFFIX :
1918 (i.types[op] & Reg16) ? WORD_MNEM_SUFFIX :
3e73aa7c 1919 (i.types[op] & Reg64) ? QWORD_MNEM_SUFFIX :
add0c677 1920 LONG_MNEM_SUFFIX);
252b5132
RH
1921 break;
1922 }
1923 }
1924 else if (i.suffix == BYTE_MNEM_SUFFIX)
1925 {
1926 int op;
47926f60 1927 for (op = i.operands; --op >= 0;)
252b5132
RH
1928 {
1929 /* If this is an eight bit register, it's OK. If it's
1930 the 16 or 32 bit version of an eight bit register,
47926f60 1931 we will just use the low portion, and that's OK too. */
252b5132
RH
1932 if (i.types[op] & Reg8)
1933 continue;
1934
47926f60 1935 /* movzx and movsx should not generate this warning. */
24eab124
AM
1936 if (intel_syntax
1937 && (i.tm.base_opcode == 0xfb7
1938 || i.tm.base_opcode == 0xfb6
3e73aa7c 1939 || i.tm.base_opcode == 0x63
24eab124
AM
1940 || i.tm.base_opcode == 0xfbe
1941 || i.tm.base_opcode == 0xfbf))
1942 continue;
252b5132 1943
520dc8e8 1944 if ((i.types[op] & WordReg) && i.op[op].regs->reg_num < 4
252b5132
RH
1945#if 0
1946 /* Check that the template allows eight bit regs
1947 This kills insns such as `orb $1,%edx', which
1948 maybe should be allowed. */
1949 && (i.tm.operand_types[op] & (Reg8|InOutPortReg))
1950#endif
1951 )
1952 {
3e73aa7c
JH
1953 /* Prohibit these changes in the 64bit mode, since
1954 the lowering is more complicated. */
1955 if (flag_code == CODE_64BIT
1956 && (i.tm.operand_types[op] & InOutPortReg) == 0)
1957 as_bad (_("Incorrect register `%%%s' used with`%c' suffix"),
1958 i.op[op].regs->reg_name,
1959 i.suffix);
252b5132 1960#if REGISTER_WARNINGS
a38cf1db
AM
1961 if (!quiet_warnings
1962 && (i.tm.operand_types[op] & InOutPortReg) == 0)
252b5132 1963 as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
520dc8e8
AM
1964 (i.op[op].regs - (i.types[op] & Reg16 ? 8 : 16))->reg_name,
1965 i.op[op].regs->reg_name,
252b5132
RH
1966 i.suffix);
1967#endif
1968 continue;
1969 }
ce8a8b2f 1970 /* Any other register is bad. */
3f4438ab
AM
1971 if (i.types[op] & (Reg | RegMMX | RegXMM
1972 | SReg2 | SReg3
1973 | Control | Debug | Test
1974 | FloatReg | FloatAcc))
252b5132
RH
1975 {
1976 as_bad (_("`%%%s' not allowed with `%s%c'"),
520dc8e8 1977 i.op[op].regs->reg_name,
252b5132
RH
1978 i.tm.name,
1979 i.suffix);
1980 return;
1981 }
1982 }
1983 }
add0c677 1984 else if (i.suffix == LONG_MNEM_SUFFIX)
252b5132
RH
1985 {
1986 int op;
47926f60
KH
1987
1988 for (op = i.operands; --op >= 0;)
252b5132
RH
1989 /* Reject eight bit registers, except where the template
1990 requires them. (eg. movzb) */
1991 if ((i.types[op] & Reg8) != 0
47926f60 1992 && (i.tm.operand_types[op] & (Reg16 | Reg32 | Acc)) != 0)
252b5132
RH
1993 {
1994 as_bad (_("`%%%s' not allowed with `%s%c'"),
520dc8e8 1995 i.op[op].regs->reg_name,
252b5132
RH
1996 i.tm.name,
1997 i.suffix);
1998 return;
1999 }
252b5132 2000 /* Warn if the e prefix on a general reg is missing. */
3e73aa7c 2001 else if ((!quiet_warnings || flag_code == CODE_64BIT)
a38cf1db 2002 && (i.types[op] & Reg16) != 0
252b5132
RH
2003 && (i.tm.operand_types[op] & (Reg32|Acc)) != 0)
2004 {
3e73aa7c
JH
2005 /* Prohibit these changes in the 64bit mode, since
2006 the lowering is more complicated. */
2007 if (flag_code == CODE_64BIT)
2008 as_bad (_("Incorrect register `%%%s' used with`%c' suffix"),
2009 i.op[op].regs->reg_name,
2010 i.suffix);
2011#if REGISTER_WARNINGS
2012 else
2013 as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
2014 (i.op[op].regs + 8)->reg_name,
2015 i.op[op].regs->reg_name,
2016 i.suffix);
252b5132 2017#endif
3e73aa7c
JH
2018 }
2019 /* Warn if the r prefix on a general reg is missing. */
2020 else if ((i.types[op] & Reg64) != 0
2021 && (i.tm.operand_types[op] & (Reg32|Acc)) != 0)
2022 {
2023 as_bad (_("Incorrect register `%%%s' used with`%c' suffix"),
2024 i.op[op].regs->reg_name,
2025 i.suffix);
2026 }
2027 }
2028 else if (i.suffix == QWORD_MNEM_SUFFIX)
2029 {
2030 int op;
3e73aa7c
JH
2031
2032 for (op = i.operands; --op >= 0; )
2033 /* Reject eight bit registers, except where the template
2034 requires them. (eg. movzb) */
2035 if ((i.types[op] & Reg8) != 0
2036 && (i.tm.operand_types[op] & (Reg16|Reg32|Acc)) != 0)
2037 {
2038 as_bad (_("`%%%s' not allowed with `%s%c'"),
2039 i.op[op].regs->reg_name,
2040 i.tm.name,
2041 i.suffix);
2042 return;
2043 }
2044 /* Warn if the e prefix on a general reg is missing. */
2045 else if (((i.types[op] & Reg16) != 0
2046 || (i.types[op] & Reg32) != 0)
2047 && (i.tm.operand_types[op] & (Reg32|Acc)) != 0)
2048 {
2049 /* Prohibit these changes in the 64bit mode, since
2050 the lowering is more complicated. */
2051 as_bad (_("Incorrect register `%%%s' used with`%c' suffix"),
2052 i.op[op].regs->reg_name,
2053 i.suffix);
2054 }
252b5132
RH
2055 }
2056 else if (i.suffix == WORD_MNEM_SUFFIX)
2057 {
2058 int op;
47926f60 2059 for (op = i.operands; --op >= 0;)
252b5132
RH
2060 /* Reject eight bit registers, except where the template
2061 requires them. (eg. movzb) */
2062 if ((i.types[op] & Reg8) != 0
2063 && (i.tm.operand_types[op] & (Reg16|Reg32|Acc)) != 0)
2064 {
2065 as_bad (_("`%%%s' not allowed with `%s%c'"),
520dc8e8 2066 i.op[op].regs->reg_name,
252b5132
RH
2067 i.tm.name,
2068 i.suffix);
2069 return;
2070 }
252b5132 2071 /* Warn if the e prefix on a general reg is present. */
3e73aa7c 2072 else if ((!quiet_warnings || flag_code == CODE_64BIT)
a38cf1db 2073 && (i.types[op] & Reg32) != 0
252b5132
RH
2074 && (i.tm.operand_types[op] & (Reg16|Acc)) != 0)
2075 {
3e73aa7c
JH
2076 /* Prohibit these changes in the 64bit mode, since
2077 the lowering is more complicated. */
2078 if (flag_code == CODE_64BIT)
2079 as_bad (_("Incorrect register `%%%s' used with`%c' suffix"),
2080 i.op[op].regs->reg_name,
2081 i.suffix);
2082 else
2083#if REGISTER_WARNINGS
2084 as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
2085 (i.op[op].regs - 8)->reg_name,
2086 i.op[op].regs->reg_name,
2087 i.suffix);
252b5132 2088#endif
3e73aa7c 2089 }
252b5132 2090 }
fa2255cb
DN
2091 else if (intel_syntax && (i.tm.opcode_modifier & IgnoreSize))
2092 /* Do nothing if the instruction is going to ignore the prefix. */
2093 ;
252b5132 2094 else
47926f60 2095 abort ();
252b5132 2096 }
eecb386c
AM
2097 else if ((i.tm.opcode_modifier & DefaultSize) && !i.suffix)
2098 {
2099 i.suffix = stackop_size;
2100 }
252b5132
RH
2101 /* Make still unresolved immediate matches conform to size of immediate
2102 given in i.suffix. Note: overlap2 cannot be an immediate! */
3e73aa7c 2103 if ((overlap0 & (Imm8 | Imm8S | Imm16 | Imm32 | Imm32S))
252b5132 2104 && overlap0 != Imm8 && overlap0 != Imm8S
e5cb08ac 2105 && overlap0 != Imm16 && overlap0 != Imm32S
b77a7acd 2106 && overlap0 != Imm32 && overlap0 != Imm64)
252b5132
RH
2107 {
2108 if (i.suffix)
2109 {
24eab124 2110 overlap0 &= (i.suffix == BYTE_MNEM_SUFFIX ? (Imm8 | Imm8S) :
b77a7acd 2111 (i.suffix == WORD_MNEM_SUFFIX ? Imm16 :
3e73aa7c 2112 (i.suffix == QWORD_MNEM_SUFFIX ? Imm64 | Imm32S : Imm32)));
252b5132 2113 }
3e73aa7c
JH
2114 else if (overlap0 == (Imm16 | Imm32S | Imm32)
2115 || overlap0 == (Imm16 | Imm32)
2116 || overlap0 == (Imm16 | Imm32S))
252b5132 2117 {
24eab124 2118 overlap0 =
3e73aa7c 2119 ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0)) ? Imm16 : Imm32S;
252b5132 2120 }
3e73aa7c
JH
2121 if (overlap0 != Imm8 && overlap0 != Imm8S
2122 && overlap0 != Imm16 && overlap0 != Imm32S
2123 && overlap0 != Imm32 && overlap0 != Imm64)
252b5132
RH
2124 {
2125 as_bad (_("no instruction mnemonic suffix given; can't determine immediate size"));
2126 return;
2127 }
2128 }
3e73aa7c 2129 if ((overlap1 & (Imm8 | Imm8S | Imm16 | Imm32S | Imm32))
252b5132 2130 && overlap1 != Imm8 && overlap1 != Imm8S
e5cb08ac 2131 && overlap1 != Imm16 && overlap1 != Imm32S
b77a7acd 2132 && overlap1 != Imm32 && overlap1 != Imm64)
252b5132
RH
2133 {
2134 if (i.suffix)
2135 {
24eab124 2136 overlap1 &= (i.suffix == BYTE_MNEM_SUFFIX ? (Imm8 | Imm8S) :
b77a7acd
AJ
2137 (i.suffix == WORD_MNEM_SUFFIX ? Imm16 :
2138 (i.suffix == QWORD_MNEM_SUFFIX ? Imm64 | Imm32S : Imm32)));
252b5132 2139 }
3e73aa7c
JH
2140 else if (overlap1 == (Imm16 | Imm32 | Imm32S)
2141 || overlap1 == (Imm16 | Imm32)
2142 || overlap1 == (Imm16 | Imm32S))
252b5132 2143 {
24eab124 2144 overlap1 =
3e73aa7c 2145 ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0)) ? Imm16 : Imm32S;
252b5132 2146 }
3e73aa7c
JH
2147 if (overlap1 != Imm8 && overlap1 != Imm8S
2148 && overlap1 != Imm16 && overlap1 != Imm32S
2149 && overlap1 != Imm32 && overlap1 != Imm64)
252b5132 2150 {
3e73aa7c 2151 as_bad (_("no instruction mnemonic suffix given; can't determine immediate size %x %c"),overlap1, i.suffix);
252b5132
RH
2152 return;
2153 }
2154 }
2155 assert ((overlap2 & Imm) == 0);
2156
2157 i.types[0] = overlap0;
2158 if (overlap0 & ImplicitRegister)
2159 i.reg_operands--;
2160 if (overlap0 & Imm1)
ce8a8b2f 2161 i.imm_operands = 0; /* kludge for shift insns. */
252b5132
RH
2162
2163 i.types[1] = overlap1;
2164 if (overlap1 & ImplicitRegister)
2165 i.reg_operands--;
2166
2167 i.types[2] = overlap2;
2168 if (overlap2 & ImplicitRegister)
2169 i.reg_operands--;
2170
2171 /* Finalize opcode. First, we change the opcode based on the operand
2172 size given by i.suffix: We need not change things for byte insns. */
2173
2174 if (!i.suffix && (i.tm.opcode_modifier & W))
2175 {
2176 as_bad (_("no instruction mnemonic suffix given and no register operands; can't size instruction"));
2177 return;
2178 }
2179
ce8a8b2f 2180 /* For movzx and movsx, need to check the register type. */
252b5132 2181 if (intel_syntax
24eab124 2182 && (i.tm.base_opcode == 0xfb6 || i.tm.base_opcode == 0xfbe))
252b5132 2183 if (i.suffix && i.suffix == BYTE_MNEM_SUFFIX)
24eab124
AM
2184 {
2185 unsigned int prefix = DATA_PREFIX_OPCODE;
252b5132 2186
520dc8e8 2187 if ((i.op[1].regs->reg_type & Reg16) != 0)
24eab124
AM
2188 if (!add_prefix (prefix))
2189 return;
2190 }
252b5132
RH
2191
2192 if (i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
2193 {
2194 /* It's not a byte, select word/dword operation. */
2195 if (i.tm.opcode_modifier & W)
2196 {
2197 if (i.tm.opcode_modifier & ShortForm)
2198 i.tm.base_opcode |= 8;
2199 else
2200 i.tm.base_opcode |= 1;
2201 }
2202 /* Now select between word & dword operations via the operand
2203 size prefix, except for instructions that will ignore this
2204 prefix anyway. */
3e73aa7c
JH
2205 if (i.suffix != QWORD_MNEM_SUFFIX
2206 && (i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
252b5132
RH
2207 && !(i.tm.opcode_modifier & IgnoreSize))
2208 {
2209 unsigned int prefix = DATA_PREFIX_OPCODE;
2210 if (i.tm.opcode_modifier & JumpByte) /* jcxz, loop */
2211 prefix = ADDR_PREFIX_OPCODE;
2212
2213 if (! add_prefix (prefix))
2214 return;
2215 }
3e73aa7c
JH
2216
2217 /* Set mode64 for an operand. */
2218 if (i.suffix == QWORD_MNEM_SUFFIX
2219 && !(i.tm.opcode_modifier & NoRex64))
b96d3a20 2220 {
3e73aa7c 2221 i.rex.mode64 = 1;
b96d3a20
JH
2222 if (flag_code < CODE_64BIT)
2223 {
e5cb08ac
KH
2224 as_bad (_("64bit operations available only in 64bit modes."));
2225 return;
b96d3a20
JH
2226 }
2227 }
3e73aa7c 2228
252b5132 2229 /* Size floating point instruction. */
f16b83df 2230 if (i.suffix == LONG_MNEM_SUFFIX)
252b5132
RH
2231 {
2232 if (i.tm.opcode_modifier & FloatMF)
2233 i.tm.base_opcode ^= 4;
2234 }
252b5132
RH
2235 }
2236
3f4438ab 2237 if (i.tm.opcode_modifier & ImmExt)
252b5132 2238 {
3f4438ab
AM
2239 /* These AMD 3DNow! and Intel Katmai New Instructions have an
2240 opcode suffix which is coded in the same place as an 8-bit
2241 immediate field would be. Here we fake an 8-bit immediate
2242 operand from the opcode suffix stored in tm.extension_opcode. */
252b5132
RH
2243
2244 expressionS *exp;
2245
47926f60 2246 assert (i.imm_operands == 0 && i.operands <= 2 && 2 < MAX_OPERANDS);
252b5132
RH
2247
2248 exp = &im_expressions[i.imm_operands++];
520dc8e8 2249 i.op[i.operands].imms = exp;
252b5132
RH
2250 i.types[i.operands++] = Imm8;
2251 exp->X_op = O_constant;
2252 exp->X_add_number = i.tm.extension_opcode;
2253 i.tm.extension_opcode = None;
2254 }
2255
47926f60 2256 /* For insns with operands there are more diddles to do to the opcode. */
252b5132
RH
2257 if (i.operands)
2258 {
24eab124 2259 /* Default segment register this instruction will use
252b5132
RH
2260 for memory accesses. 0 means unknown.
2261 This is only for optimizing out unnecessary segment overrides. */
2262 const seg_entry *default_seg = 0;
2263
252b5132
RH
2264 /* The imul $imm, %reg instruction is converted into
2265 imul $imm, %reg, %reg, and the clr %reg instruction
2266 is converted into xor %reg, %reg. */
2267 if (i.tm.opcode_modifier & regKludge)
2268 {
2269 unsigned int first_reg_op = (i.types[0] & Reg) ? 0 : 1;
47926f60
KH
2270 /* Pretend we saw the extra register operand. */
2271 assert (i.op[first_reg_op + 1].regs == 0);
2272 i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
2273 i.types[first_reg_op + 1] = i.types[first_reg_op];
252b5132
RH
2274 i.reg_operands = 2;
2275 }
2276
2277 if (i.tm.opcode_modifier & ShortForm)
2278 {
47926f60 2279 /* The register or float register operand is in operand 0 or 1. */
252b5132 2280 unsigned int op = (i.types[0] & (Reg | FloatReg)) ? 0 : 1;
47926f60 2281 /* Register goes in low 3 bits of opcode. */
520dc8e8 2282 i.tm.base_opcode |= i.op[op].regs->reg_num;
3e73aa7c 2283 if (i.op[op].regs->reg_flags & RegRex)
e5cb08ac 2284 i.rex.extZ = 1;
a38cf1db 2285 if (!quiet_warnings && (i.tm.opcode_modifier & Ugh) != 0)
252b5132
RH
2286 {
2287 /* Warn about some common errors, but press on regardless.
2288 The first case can be generated by gcc (<= 2.8.1). */
2289 if (i.operands == 2)
2290 {
47926f60 2291 /* Reversed arguments on faddp, fsubp, etc. */
252b5132 2292 as_warn (_("translating to `%s %%%s,%%%s'"), i.tm.name,
520dc8e8
AM
2293 i.op[1].regs->reg_name,
2294 i.op[0].regs->reg_name);
252b5132
RH
2295 }
2296 else
2297 {
47926f60 2298 /* Extraneous `l' suffix on fp insn. */
252b5132 2299 as_warn (_("translating to `%s %%%s'"), i.tm.name,
520dc8e8 2300 i.op[0].regs->reg_name);
252b5132
RH
2301 }
2302 }
2303 }
2304 else if (i.tm.opcode_modifier & Modrm)
2305 {
2306 /* The opcode is completed (modulo i.tm.extension_opcode which
2307 must be put into the modrm byte).
2308 Now, we make the modrm & index base bytes based on all the
47926f60 2309 info we've collected. */
252b5132
RH
2310
2311 /* i.reg_operands MUST be the number of real register operands;
47926f60 2312 implicit registers do not count. */
252b5132
RH
2313 if (i.reg_operands == 2)
2314 {
2315 unsigned int source, dest;
2316 source = ((i.types[0]
3f4438ab
AM
2317 & (Reg | RegMMX | RegXMM
2318 | SReg2 | SReg3
2319 | Control | Debug | Test))
252b5132
RH
2320 ? 0 : 1);
2321 dest = source + 1;
2322
252b5132 2323 i.rm.mode = 3;
3f4438ab
AM
2324 /* One of the register operands will be encoded in the
2325 i.tm.reg field, the other in the combined i.tm.mode
2326 and i.tm.regmem fields. If no form of this
2327 instruction supports a memory destination operand,
2328 then we assume the source operand may sometimes be
2329 a memory operand and so we need to store the
2330 destination in the i.rm.reg field. */
2331 if ((i.tm.operand_types[dest] & AnyMem) == 0)
252b5132 2332 {
520dc8e8
AM
2333 i.rm.reg = i.op[dest].regs->reg_num;
2334 i.rm.regmem = i.op[source].regs->reg_num;
3e73aa7c 2335 if (i.op[dest].regs->reg_flags & RegRex)
e5cb08ac 2336 i.rex.extX = 1;
3e73aa7c 2337 if (i.op[source].regs->reg_flags & RegRex)
e5cb08ac 2338 i.rex.extZ = 1;
252b5132
RH
2339 }
2340 else
2341 {
520dc8e8
AM
2342 i.rm.reg = i.op[source].regs->reg_num;
2343 i.rm.regmem = i.op[dest].regs->reg_num;
3e73aa7c 2344 if (i.op[dest].regs->reg_flags & RegRex)
e5cb08ac 2345 i.rex.extZ = 1;
3e73aa7c 2346 if (i.op[source].regs->reg_flags & RegRex)
e5cb08ac 2347 i.rex.extX = 1;
252b5132
RH
2348 }
2349 }
2350 else
47926f60 2351 { /* If it's not 2 reg operands... */
252b5132
RH
2352 if (i.mem_operands)
2353 {
2354 unsigned int fake_zero_displacement = 0;
2355 unsigned int op = ((i.types[0] & AnyMem)
2356 ? 0
2357 : (i.types[1] & AnyMem) ? 1 : 2);
2358
2359 default_seg = &ds;
2360
2361 if (! i.base_reg)
2362 {
2363 i.rm.mode = 0;
2364 if (! i.disp_operands)
2365 fake_zero_displacement = 1;
2366 if (! i.index_reg)
2367 {
47926f60 2368 /* Operand is just <disp> */
3e73aa7c 2369 if ((flag_code == CODE_16BIT) ^ (i.prefix[ADDR_PREFIX] != 0))
252b5132
RH
2370 {
2371 i.rm.regmem = NO_BASE_REGISTER_16;
2372 i.types[op] &= ~Disp;
2373 i.types[op] |= Disp16;
2374 }
3e73aa7c 2375 else if (flag_code != CODE_64BIT)
252b5132
RH
2376 {
2377 i.rm.regmem = NO_BASE_REGISTER;
2378 i.types[op] &= ~Disp;
2379 i.types[op] |= Disp32;
2380 }
3e73aa7c
JH
2381 else
2382 {
e5cb08ac
KH
2383 /* 64bit mode overwrites the 32bit
2384 absolute addressing by RIP relative
2385 addressing and absolute addressing
2386 is encoded by one of the redundant
2387 SIB forms. */
3e73aa7c
JH
2388
2389 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
2390 i.sib.base = NO_BASE_REGISTER;
2391 i.sib.index = NO_INDEX_REGISTER;
2392 i.types[op] &= ~Disp;
2393 i.types[op] |= Disp32S;
2394 }
252b5132 2395 }
47926f60 2396 else /* ! i.base_reg && i.index_reg */
252b5132
RH
2397 {
2398 i.sib.index = i.index_reg->reg_num;
2399 i.sib.base = NO_BASE_REGISTER;
2400 i.sib.scale = i.log2_scale_factor;
2401 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
2402 i.types[op] &= ~Disp;
3e73aa7c
JH
2403 if (flag_code != CODE_64BIT)
2404 i.types[op] |= Disp32; /* Must be 32 bit */
2405 else
2406 i.types[op] |= Disp32S;
2407 if (i.index_reg->reg_flags & RegRex)
e5cb08ac 2408 i.rex.extY = 1;
252b5132
RH
2409 }
2410 }
3e73aa7c
JH
2411 /* RIP addressing for 64bit mode. */
2412 else if (i.base_reg->reg_type == BaseIndex)
2413 {
2414 i.rm.regmem = NO_BASE_REGISTER;
2415 i.types[op] &= ~Disp;
2416 i.types[op] |= Disp32S;
2417 i.flags[op] = Operand_PCrel;
2418 }
252b5132
RH
2419 else if (i.base_reg->reg_type & Reg16)
2420 {
2421 switch (i.base_reg->reg_num)
2422 {
47926f60 2423 case 3: /* (%bx) */
252b5132
RH
2424 if (! i.index_reg)
2425 i.rm.regmem = 7;
47926f60 2426 else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
252b5132
RH
2427 i.rm.regmem = i.index_reg->reg_num - 6;
2428 break;
47926f60 2429 case 5: /* (%bp) */
252b5132
RH
2430 default_seg = &ss;
2431 if (! i.index_reg)
2432 {
2433 i.rm.regmem = 6;
2434 if ((i.types[op] & Disp) == 0)
2435 {
47926f60 2436 /* fake (%bp) into 0(%bp) */
252b5132
RH
2437 i.types[op] |= Disp8;
2438 fake_zero_displacement = 1;
2439 }
2440 }
47926f60 2441 else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
252b5132
RH
2442 i.rm.regmem = i.index_reg->reg_num - 6 + 2;
2443 break;
47926f60 2444 default: /* (%si) -> 4 or (%di) -> 5 */
252b5132
RH
2445 i.rm.regmem = i.base_reg->reg_num - 6 + 4;
2446 }
2447 i.rm.mode = mode_from_disp_size (i.types[op]);
2448 }
3e73aa7c 2449 else /* i.base_reg and 32/64 bit mode */
252b5132 2450 {
3e73aa7c
JH
2451 if (flag_code == CODE_64BIT
2452 && (i.types[op] & Disp))
2453 {
2454 if (i.types[op] & Disp8)
2455 i.types[op] = Disp8 | Disp32S;
2456 else
2457 i.types[op] = Disp32S;
2458 }
252b5132 2459 i.rm.regmem = i.base_reg->reg_num;
3e73aa7c 2460 if (i.base_reg->reg_flags & RegRex)
e5cb08ac 2461 i.rex.extZ = 1;
252b5132 2462 i.sib.base = i.base_reg->reg_num;
3e73aa7c
JH
2463 /* x86-64 ignores REX prefix bit here to avoid
2464 decoder complications. */
2465 if ((i.base_reg->reg_num & 7) == EBP_REG_NUM)
252b5132
RH
2466 {
2467 default_seg = &ss;
2468 if (i.disp_operands == 0)
2469 {
2470 fake_zero_displacement = 1;
2471 i.types[op] |= Disp8;
2472 }
2473 }
2474 else if (i.base_reg->reg_num == ESP_REG_NUM)
2475 {
2476 default_seg = &ss;
2477 }
2478 i.sib.scale = i.log2_scale_factor;
2479 if (! i.index_reg)
2480 {
2481 /* <disp>(%esp) becomes two byte modrm
2482 with no index register. We've already
2483 stored the code for esp in i.rm.regmem
2484 ie. ESCAPE_TO_TWO_BYTE_ADDRESSING. Any
2485 base register besides %esp will not use
2486 the extra modrm byte. */
2487 i.sib.index = NO_INDEX_REGISTER;
2488#if ! SCALE1_WHEN_NO_INDEX
2489 /* Another case where we force the second
2490 modrm byte. */
2491 if (i.log2_scale_factor)
2492 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
2493#endif
2494 }
2495 else
2496 {
2497 i.sib.index = i.index_reg->reg_num;
2498 i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
3e73aa7c 2499 if (i.index_reg->reg_flags & RegRex)
e5cb08ac 2500 i.rex.extY = 1;
252b5132
RH
2501 }
2502 i.rm.mode = mode_from_disp_size (i.types[op]);
2503 }
2504
2505 if (fake_zero_displacement)
2506 {
2507 /* Fakes a zero displacement assuming that i.types[op]
47926f60 2508 holds the correct displacement size. */
b4cac588
AM
2509 expressionS *exp;
2510
520dc8e8 2511 assert (i.op[op].disps == 0);
252b5132 2512 exp = &disp_expressions[i.disp_operands++];
520dc8e8 2513 i.op[op].disps = exp;
252b5132
RH
2514 exp->X_op = O_constant;
2515 exp->X_add_number = 0;
2516 exp->X_add_symbol = (symbolS *) 0;
2517 exp->X_op_symbol = (symbolS *) 0;
2518 }
2519 }
2520
2521 /* Fill in i.rm.reg or i.rm.regmem field with register
2522 operand (if any) based on i.tm.extension_opcode.
2523 Again, we must be careful to make sure that
2524 segment/control/debug/test/MMX registers are coded
47926f60 2525 into the i.rm.reg field. */
252b5132
RH
2526 if (i.reg_operands)
2527 {
2528 unsigned int op =
2529 ((i.types[0]
3f4438ab
AM
2530 & (Reg | RegMMX | RegXMM
2531 | SReg2 | SReg3
2532 | Control | Debug | Test))
252b5132
RH
2533 ? 0
2534 : ((i.types[1]
3f4438ab
AM
2535 & (Reg | RegMMX | RegXMM
2536 | SReg2 | SReg3
2537 | Control | Debug | Test))
252b5132
RH
2538 ? 1
2539 : 2));
2540 /* If there is an extension opcode to put here, the
47926f60 2541 register number must be put into the regmem field. */
252b5132 2542 if (i.tm.extension_opcode != None)
3e73aa7c
JH
2543 {
2544 i.rm.regmem = i.op[op].regs->reg_num;
2545 if (i.op[op].regs->reg_flags & RegRex)
e5cb08ac 2546 i.rex.extZ = 1;
3e73aa7c 2547 }
252b5132 2548 else
3e73aa7c
JH
2549 {
2550 i.rm.reg = i.op[op].regs->reg_num;
2551 if (i.op[op].regs->reg_flags & RegRex)
e5cb08ac 2552 i.rex.extX = 1;
3e73aa7c 2553 }
252b5132
RH
2554
2555 /* Now, if no memory operand has set i.rm.mode = 0, 1, 2
2556 we must set it to 3 to indicate this is a register
2557 operand in the regmem field. */
2558 if (!i.mem_operands)
2559 i.rm.mode = 3;
2560 }
2561
47926f60 2562 /* Fill in i.rm.reg field with extension opcode (if any). */
252b5132
RH
2563 if (i.tm.extension_opcode != None)
2564 i.rm.reg = i.tm.extension_opcode;
2565 }
2566 }
2567 else if (i.tm.opcode_modifier & (Seg2ShortForm | Seg3ShortForm))
2568 {
47926f60
KH
2569 if (i.tm.base_opcode == POP_SEG_SHORT
2570 && i.op[0].regs->reg_num == 1)
252b5132
RH
2571 {
2572 as_bad (_("you can't `pop %%cs'"));
2573 return;
2574 }
520dc8e8 2575 i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
3e73aa7c
JH
2576 if (i.op[0].regs->reg_flags & RegRex)
2577 i.rex.extZ = 1;
252b5132
RH
2578 }
2579 else if ((i.tm.base_opcode & ~(D|W)) == MOV_AX_DISP32)
2580 {
2581 default_seg = &ds;
2582 }
2583 else if ((i.tm.opcode_modifier & IsString) != 0)
2584 {
2585 /* For the string instructions that allow a segment override
2586 on one of their operands, the default segment is ds. */
2587 default_seg = &ds;
2588 }
2589
2590 /* If a segment was explicitly specified,
2591 and the specified segment is not the default,
2592 use an opcode prefix to select it.
2593 If we never figured out what the default segment is,
2594 then default_seg will be zero at this point,
2595 and the specified segment prefix will always be used. */
2596 if ((i.seg[0]) && (i.seg[0] != default_seg))
2597 {
2598 if (! add_prefix (i.seg[0]->seg_prefix))
2599 return;
2600 }
2601 }
a38cf1db 2602 else if (!quiet_warnings && (i.tm.opcode_modifier & Ugh) != 0)
252b5132 2603 {
24eab124
AM
2604 /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc. */
2605 as_warn (_("translating to `%sp'"), i.tm.name);
252b5132
RH
2606 }
2607 }
2608
47926f60 2609 /* Handle conversion of 'int $3' --> special int3 insn. */
520dc8e8 2610 if (i.tm.base_opcode == INT_OPCODE && i.op[0].imms->X_add_number == 3)
252b5132
RH
2611 {
2612 i.tm.base_opcode = INT3_OPCODE;
2613 i.imm_operands = 0;
2614 }
2615
2f66722d 2616 if ((i.tm.opcode_modifier & (Jump | JumpByte | JumpDword))
520dc8e8 2617 && i.op[0].disps->X_op == O_constant)
2f66722d
AM
2618 {
2619 /* Convert "jmp constant" (and "call constant") to a jump (call) to
2620 the absolute address given by the constant. Since ix86 jumps and
2621 calls are pc relative, we need to generate a reloc. */
520dc8e8
AM
2622 i.op[0].disps->X_add_symbol = &abs_symbol;
2623 i.op[0].disps->X_op = O_symbol;
2f66722d
AM
2624 }
2625
3e73aa7c
JH
2626 if (i.tm.opcode_modifier & Rex64)
2627 i.rex.mode64 = 1;
2628
2629 /* For 8bit registers we would need an empty rex prefix.
2630 Also in the case instruction is already having prefix,
2631 we need to convert old registers to new ones. */
2632
2633 if (((i.types[0] & Reg8) && (i.op[0].regs->reg_flags & RegRex64))
2634 || ((i.types[1] & Reg8) && (i.op[1].regs->reg_flags & RegRex64))
2635 || ((i.rex.mode64 || i.rex.extX || i.rex.extY || i.rex.extZ || i.rex.empty)
2636 && ((i.types[0] & Reg8) || (i.types[1] & Reg8))))
2637 {
2638 int x;
e5cb08ac 2639 i.rex.empty = 1;
3e73aa7c
JH
2640 for (x = 0; x < 2; x++)
2641 {
2642 /* Look for 8bit operand that does use old registers. */
2643 if (i.types[x] & Reg8
2644 && !(i.op[x].regs->reg_flags & RegRex64))
2645 {
2646 /* In case it is "hi" register, give up. */
2647 if (i.op[x].regs->reg_num > 3)
2648 as_bad (_("Can't encode registers '%%%s' in the instruction requiring REX prefix.\n"),
2649 i.op[x].regs->reg_name);
2650
2651 /* Otherwise it is equivalent to the extended register.
2652 Since the encoding don't change this is merely cosmetical
2653 cleanup for debug output. */
2654
2655 i.op[x].regs = i.op[x].regs + 8;
2656 }
2657 }
2658 }
2659
2660 if (i.rex.mode64 || i.rex.extX || i.rex.extY || i.rex.extZ || i.rex.empty)
2661 add_prefix (0x40
2662 | (i.rex.mode64 ? 8 : 0)
2663 | (i.rex.extX ? 4 : 0)
2664 | (i.rex.extY ? 2 : 0)
2665 | (i.rex.extZ ? 1 : 0));
2666
47926f60 2667 /* We are ready to output the insn. */
252b5132
RH
2668 {
2669 register char *p;
2670
47926f60 2671 /* Output jumps. */
252b5132
RH
2672 if (i.tm.opcode_modifier & Jump)
2673 {
a217f122
AM
2674 int size;
2675 int code16;
2676 int prefix;
252b5132 2677
a217f122 2678 code16 = 0;
3e73aa7c 2679 if (flag_code == CODE_16BIT)
a217f122
AM
2680 code16 = CODE16;
2681
2682 prefix = 0;
2683 if (i.prefix[DATA_PREFIX])
252b5132 2684 {
a217f122 2685 prefix = 1;
252b5132 2686 i.prefixes -= 1;
a217f122 2687 code16 ^= CODE16;
252b5132 2688 }
3e73aa7c
JH
2689 if (i.prefix[REX_PREFIX])
2690 {
2691 prefix++;
e5cb08ac 2692 i.prefixes--;
3e73aa7c 2693 }
252b5132 2694
a217f122
AM
2695 size = 4;
2696 if (code16)
2697 size = 2;
2698
2699 if (i.prefixes != 0 && !intel_syntax)
252b5132
RH
2700 as_warn (_("skipping prefixes on this instruction"));
2701
2f66722d
AM
2702 /* It's always a symbol; End frag & setup for relax.
2703 Make sure there is enough room in this frag for the largest
2704 instruction we may generate in md_convert_frag. This is 2
2705 bytes for the opcode and room for the prefix and largest
2706 displacement. */
2707 frag_grow (prefix + 2 + size);
2708 insn_size += prefix + 1;
2709 /* Prefix and 1 opcode byte go in fr_fix. */
2710 p = frag_more (prefix + 1);
3e73aa7c 2711 if (i.prefix[DATA_PREFIX])
2f66722d 2712 *p++ = DATA_PREFIX_OPCODE;
3e73aa7c
JH
2713 if (i.prefix[REX_PREFIX])
2714 *p++ = i.prefix[REX_PREFIX];
2f66722d 2715 *p = i.tm.base_opcode;
ee7fcc42
AM
2716 /* 1 possible extra opcode + displacement go in var part.
2717 Pass reloc in fr_var. */
2f66722d
AM
2718 frag_var (rs_machine_dependent,
2719 1 + size,
ee7fcc42 2720 i.disp_reloc[0],
2f66722d
AM
2721 ((unsigned char) *p == JUMP_PC_RELATIVE
2722 ? ENCODE_RELAX_STATE (UNCOND_JUMP, SMALL) | code16
2723 : ENCODE_RELAX_STATE (COND_JUMP, SMALL) | code16),
520dc8e8
AM
2724 i.op[0].disps->X_add_symbol,
2725 i.op[0].disps->X_add_number,
2f66722d 2726 p);
252b5132
RH
2727 }
2728 else if (i.tm.opcode_modifier & (JumpByte | JumpDword))
2729 {
a217f122 2730 int size;
252b5132 2731
a217f122 2732 if (i.tm.opcode_modifier & JumpByte)
252b5132 2733 {
a217f122
AM
2734 /* This is a loop or jecxz type instruction. */
2735 size = 1;
252b5132
RH
2736 if (i.prefix[ADDR_PREFIX])
2737 {
2738 insn_size += 1;
2739 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
2740 i.prefixes -= 1;
2741 }
2742 }
2743 else
2744 {
a217f122
AM
2745 int code16;
2746
2747 code16 = 0;
3e73aa7c 2748 if (flag_code == CODE_16BIT)
a217f122 2749 code16 = CODE16;
252b5132
RH
2750
2751 if (i.prefix[DATA_PREFIX])
2752 {
2753 insn_size += 1;
2754 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
2755 i.prefixes -= 1;
a217f122 2756 code16 ^= CODE16;
252b5132 2757 }
252b5132 2758
a217f122 2759 size = 4;
252b5132
RH
2760 if (code16)
2761 size = 2;
2762 }
2763
3e73aa7c
JH
2764 if (i.prefix[REX_PREFIX])
2765 {
2766 FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
2767 insn_size++;
2768 i.prefixes -= 1;
2769 }
2770
a217f122 2771 if (i.prefixes != 0 && !intel_syntax)
252b5132
RH
2772 as_warn (_("skipping prefixes on this instruction"));
2773
2774 if (fits_in_unsigned_byte (i.tm.base_opcode))
2775 {
2776 insn_size += 1 + size;
2777 p = frag_more (1 + size);
2778 }
2779 else
2780 {
47926f60 2781 /* Opcode can be at most two bytes. */
a217f122 2782 insn_size += 2 + size;
252b5132
RH
2783 p = frag_more (2 + size);
2784 *p++ = (i.tm.base_opcode >> 8) & 0xff;
2785 }
2786 *p++ = i.tm.base_opcode & 0xff;
2787
2f66722d 2788 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
3e73aa7c 2789 i.op[0].disps, 1, reloc (size, 1, 1, i.disp_reloc[0]));
252b5132
RH
2790 }
2791 else if (i.tm.opcode_modifier & JumpInterSegment)
2792 {
2793 int size;
a217f122
AM
2794 int prefix;
2795 int code16;
252b5132 2796
a217f122 2797 code16 = 0;
3e73aa7c 2798 if (flag_code == CODE_16BIT)
a217f122
AM
2799 code16 = CODE16;
2800
2801 prefix = 0;
2802 if (i.prefix[DATA_PREFIX])
252b5132 2803 {
a217f122 2804 prefix = 1;
252b5132 2805 i.prefixes -= 1;
a217f122 2806 code16 ^= CODE16;
252b5132 2807 }
3e73aa7c
JH
2808 if (i.prefix[REX_PREFIX])
2809 {
2810 prefix++;
2811 i.prefixes -= 1;
2812 }
252b5132
RH
2813
2814 size = 4;
252b5132 2815 if (code16)
f6af82bd 2816 size = 2;
252b5132 2817
a217f122 2818 if (i.prefixes != 0 && !intel_syntax)
252b5132
RH
2819 as_warn (_("skipping prefixes on this instruction"));
2820
47926f60
KH
2821 /* 1 opcode; 2 segment; offset */
2822 insn_size += prefix + 1 + 2 + size;
252b5132 2823 p = frag_more (prefix + 1 + 2 + size);
3e73aa7c
JH
2824
2825 if (i.prefix[DATA_PREFIX])
252b5132 2826 *p++ = DATA_PREFIX_OPCODE;
3e73aa7c
JH
2827
2828 if (i.prefix[REX_PREFIX])
2829 *p++ = i.prefix[REX_PREFIX];
2830
252b5132 2831 *p++ = i.tm.base_opcode;
520dc8e8 2832 if (i.op[1].imms->X_op == O_constant)
252b5132 2833 {
847f7ad4 2834 offsetT n = i.op[1].imms->X_add_number;
252b5132 2835
773f551c
AM
2836 if (size == 2
2837 && !fits_in_unsigned_word (n)
2838 && !fits_in_signed_word (n))
252b5132
RH
2839 {
2840 as_bad (_("16-bit jump out of range"));
2841 return;
2842 }
847f7ad4 2843 md_number_to_chars (p, n, size);
252b5132
RH
2844 }
2845 else
2846 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
3e73aa7c 2847 i.op[1].imms, 0, reloc (size, 0, 0, i.disp_reloc[0]));
520dc8e8 2848 if (i.op[0].imms->X_op != O_constant)
252b5132
RH
2849 as_bad (_("can't handle non absolute segment in `%s'"),
2850 i.tm.name);
520dc8e8 2851 md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
252b5132
RH
2852 }
2853 else
2854 {
47926f60 2855 /* Output normal instructions here. */
252b5132
RH
2856 unsigned char *q;
2857
7bc70a8e
JH
2858 /* All opcodes on i386 have eighter 1 or 2 bytes. We may use third
2859 byte for the SSE instructions to specify prefix they require. */
2860 if (i.tm.base_opcode & 0xff0000)
2861 add_prefix ((i.tm.base_opcode >> 16) & 0xff);
2862
47926f60 2863 /* The prefix bytes. */
252b5132
RH
2864 for (q = i.prefix;
2865 q < i.prefix + sizeof (i.prefix) / sizeof (i.prefix[0]);
2866 q++)
2867 {
2868 if (*q)
2869 {
2870 insn_size += 1;
2871 p = frag_more (1);
2872 md_number_to_chars (p, (valueT) *q, 1);
2873 }
2874 }
2875
47926f60 2876 /* Now the opcode; be careful about word order here! */
252b5132
RH
2877 if (fits_in_unsigned_byte (i.tm.base_opcode))
2878 {
2879 insn_size += 1;
2880 FRAG_APPEND_1_CHAR (i.tm.base_opcode);
2881 }
7bc70a8e 2882 else
252b5132
RH
2883 {
2884 insn_size += 2;
2885 p = frag_more (2);
47926f60 2886 /* Put out high byte first: can't use md_number_to_chars! */
252b5132
RH
2887 *p++ = (i.tm.base_opcode >> 8) & 0xff;
2888 *p = i.tm.base_opcode & 0xff;
2889 }
252b5132
RH
2890
2891 /* Now the modrm byte and sib byte (if present). */
2892 if (i.tm.opcode_modifier & Modrm)
2893 {
2894 insn_size += 1;
2895 p = frag_more (1);
2896 md_number_to_chars (p,
2897 (valueT) (i.rm.regmem << 0
2898 | i.rm.reg << 3
2899 | i.rm.mode << 6),
2900 1);
2901 /* If i.rm.regmem == ESP (4)
2902 && i.rm.mode != (Register mode)
2903 && not 16 bit
2904 ==> need second modrm byte. */
2905 if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
2906 && i.rm.mode != 3
2907 && !(i.base_reg && (i.base_reg->reg_type & Reg16) != 0))
2908 {
2909 insn_size += 1;
2910 p = frag_more (1);
2911 md_number_to_chars (p,
2912 (valueT) (i.sib.base << 0
2913 | i.sib.index << 3
2914 | i.sib.scale << 6),
2915 1);
2916 }
2917 }
2918
2919 if (i.disp_operands)
2920 {
2921 register unsigned int n;
2922
2923 for (n = 0; n < i.operands; n++)
2924 {
520dc8e8 2925 if (i.types[n] & Disp)
252b5132 2926 {
520dc8e8 2927 if (i.op[n].disps->X_op == O_constant)
252b5132 2928 {
847f7ad4
AM
2929 int size;
2930 offsetT val;
b4cac588 2931
847f7ad4 2932 size = 4;
3e73aa7c 2933 if (i.types[n] & (Disp8 | Disp16 | Disp64))
252b5132 2934 {
b4cac588 2935 size = 2;
b4cac588 2936 if (i.types[n] & Disp8)
847f7ad4 2937 size = 1;
3e73aa7c
JH
2938 if (i.types[n] & Disp64)
2939 size = 8;
252b5132 2940 }
847f7ad4
AM
2941 val = offset_in_range (i.op[n].disps->X_add_number,
2942 size);
b4cac588
AM
2943 insn_size += size;
2944 p = frag_more (size);
847f7ad4 2945 md_number_to_chars (p, val, size);
252b5132 2946 }
252b5132 2947 else
520dc8e8
AM
2948 {
2949 int size = 4;
3e73aa7c
JH
2950 int sign = 0;
2951 int pcrel = (i.flags[n] & Operand_PCrel) != 0;
2952
2953 /* The PC relative address is computed relative
2954 to the instruction boundary, so in case immediate
2955 fields follows, we need to adjust the value. */
2956 if (pcrel && i.imm_operands)
2957 {
2958 int imm_size = 4;
2959 register unsigned int n1;
2960
2961 for (n1 = 0; n1 < i.operands; n1++)
2962 if (i.types[n1] & Imm)
2963 {
2964 if (i.types[n1] & (Imm8 | Imm8S | Imm16 | Imm64))
2965 {
2966 imm_size = 2;
2967 if (i.types[n1] & (Imm8 | Imm8S))
2968 imm_size = 1;
2969 if (i.types[n1] & Imm64)
2970 imm_size = 8;
2971 }
2972 break;
2973 }
2974 /* We should find the immediate. */
2975 if (n1 == i.operands)
bfb32b52 2976 abort ();
3e73aa7c
JH
2977 i.op[n].disps->X_add_number -= imm_size;
2978 }
520dc8e8 2979
3e73aa7c
JH
2980 if (i.types[n] & Disp32S)
2981 sign = 1;
2982
e5cb08ac 2983 if (i.types[n] & (Disp16 | Disp64))
3e73aa7c
JH
2984 {
2985 size = 2;
2986 if (i.types[n] & Disp64)
2987 size = 8;
2988 }
520dc8e8
AM
2989
2990 insn_size += size;
2991 p = frag_more (size);
2992 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
3e73aa7c
JH
2993 i.op[n].disps, pcrel,
2994 reloc (size, pcrel, sign, i.disp_reloc[n]));
252b5132
RH
2995 }
2996 }
2997 }
ce8a8b2f 2998 }
252b5132 2999
47926f60 3000 /* Output immediate. */
252b5132
RH
3001 if (i.imm_operands)
3002 {
3003 register unsigned int n;
3004
3005 for (n = 0; n < i.operands; n++)
3006 {
520dc8e8 3007 if (i.types[n] & Imm)
252b5132 3008 {
520dc8e8 3009 if (i.op[n].imms->X_op == O_constant)
252b5132 3010 {
847f7ad4
AM
3011 int size;
3012 offsetT val;
b4cac588 3013
847f7ad4 3014 size = 4;
3e73aa7c 3015 if (i.types[n] & (Imm8 | Imm8S | Imm16 | Imm64))
252b5132 3016 {
b4cac588 3017 size = 2;
b4cac588 3018 if (i.types[n] & (Imm8 | Imm8S))
847f7ad4 3019 size = 1;
3e73aa7c
JH
3020 else if (i.types[n] & Imm64)
3021 size = 8;
252b5132 3022 }
847f7ad4
AM
3023 val = offset_in_range (i.op[n].imms->X_add_number,
3024 size);
b4cac588
AM
3025 insn_size += size;
3026 p = frag_more (size);
847f7ad4 3027 md_number_to_chars (p, val, size);
252b5132
RH
3028 }
3029 else
ce8a8b2f
AM
3030 {
3031 /* Not absolute_section.
3032 Need a 32-bit fixup (don't support 8bit
520dc8e8 3033 non-absolute imms). Try to support other
47926f60 3034 sizes ... */
f6af82bd
AM
3035#ifdef BFD_ASSEMBLER
3036 enum bfd_reloc_code_real reloc_type;
3037#else
3038 int reloc_type;
3039#endif
520dc8e8 3040 int size = 4;
3e73aa7c 3041 int sign = 0;
252b5132 3042
3e73aa7c
JH
3043 if ((i.types[n] & (Imm32S))
3044 && i.suffix == QWORD_MNEM_SUFFIX)
3045 sign = 1;
3046 if (i.types[n] & (Imm8 | Imm8S | Imm16 | Imm64))
3047 {
3048 size = 2;
3049 if (i.types[n] & (Imm8 | Imm8S))
3050 size = 1;
3051 if (i.types[n] & Imm64)
3052 size = 8;
3053 }
520dc8e8 3054
252b5132
RH
3055 insn_size += size;
3056 p = frag_more (size);
3e73aa7c 3057 reloc_type = reloc (size, 0, sign, i.disp_reloc[0]);
252b5132 3058#ifdef BFD_ASSEMBLER
f6af82bd 3059 if (reloc_type == BFD_RELOC_32
252b5132 3060 && GOT_symbol
520dc8e8
AM
3061 && GOT_symbol == i.op[n].imms->X_add_symbol
3062 && (i.op[n].imms->X_op == O_symbol
3063 || (i.op[n].imms->X_op == O_add
49309057 3064 && ((symbol_get_value_expression
520dc8e8 3065 (i.op[n].imms->X_op_symbol)->X_op)
252b5132
RH
3066 == O_subtract))))
3067 {
3e73aa7c
JH
3068 /* We don't support dynamic linking on x86-64 yet. */
3069 if (flag_code == CODE_64BIT)
bfb32b52 3070 abort ();
f6af82bd 3071 reloc_type = BFD_RELOC_386_GOTPC;
520dc8e8 3072 i.op[n].imms->X_add_number += 3;
252b5132
RH
3073 }
3074#endif
3075 fix_new_exp (frag_now, p - frag_now->fr_literal, size,
520dc8e8 3076 i.op[n].imms, 0, reloc_type);
252b5132
RH
3077 }
3078 }
3079 }
ce8a8b2f 3080 }
252b5132
RH
3081 }
3082
e346e481
RH
3083 dwarf2_emit_insn (insn_size);
3084
252b5132
RH
3085#ifdef DEBUG386
3086 if (flag_debug)
3087 {
3088 pi (line, &i);
3089 }
47926f60 3090#endif /* DEBUG386 */
252b5132
RH
3091 }
3092}
3093\f
252b5132
RH
3094static int i386_immediate PARAMS ((char *));
3095
3096static int
3097i386_immediate (imm_start)
3098 char *imm_start;
3099{
3100 char *save_input_line_pointer;
3101 segT exp_seg = 0;
47926f60 3102 expressionS *exp;
252b5132
RH
3103
3104 if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
3105 {
d0b47220 3106 as_bad (_("only 1 or 2 immediate operands are allowed"));
252b5132
RH
3107 return 0;
3108 }
3109
3110 exp = &im_expressions[i.imm_operands++];
520dc8e8 3111 i.op[this_operand].imms = exp;
252b5132
RH
3112
3113 if (is_space_char (*imm_start))
3114 ++imm_start;
3115
3116 save_input_line_pointer = input_line_pointer;
3117 input_line_pointer = imm_start;
3118
3119#ifndef LEX_AT
24eab124 3120 {
47926f60
KH
3121 /* We can have operands of the form
3122 <symbol>@GOTOFF+<nnn>
3123 Take the easy way out here and copy everything
3124 into a temporary buffer... */
24eab124
AM
3125 register char *cp;
3126
3127 cp = strchr (input_line_pointer, '@');
3128 if (cp != NULL)
3129 {
3130 char *tmpbuf;
3131 int len = 0;
3132 int first;
3133
47926f60 3134 /* GOT relocations are not supported in 16 bit mode. */
3e73aa7c 3135 if (flag_code == CODE_16BIT)
24eab124
AM
3136 as_bad (_("GOT relocations not supported in 16 bit mode"));
3137
3138 if (GOT_symbol == NULL)
3139 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
3140
3141 if (strncmp (cp + 1, "PLT", 3) == 0)
3142 {
3e73aa7c
JH
3143 if (flag_code == CODE_64BIT)
3144 i.disp_reloc[this_operand] = BFD_RELOC_X86_64_PLT32;
3145 else
3146 i.disp_reloc[this_operand] = BFD_RELOC_386_PLT32;
24eab124
AM
3147 len = 3;
3148 }
3149 else if (strncmp (cp + 1, "GOTOFF", 6) == 0)
3150 {
3e73aa7c
JH
3151 if (flag_code == CODE_64BIT)
3152 as_bad ("GOTOFF relocations are unsupported in 64bit mode.");
24eab124
AM
3153 i.disp_reloc[this_operand] = BFD_RELOC_386_GOTOFF;
3154 len = 6;
3155 }
b77a7acd 3156 else if (strncmp (cp + 1, "GOTPCREL", 8) == 0)
24eab124 3157 {
3e73aa7c 3158 if (flag_code == CODE_64BIT)
b77a7acd 3159 i.disp_reloc[this_operand] = BFD_RELOC_X86_64_GOTPCREL;
3e73aa7c 3160 else
b77a7acd
AJ
3161 as_bad ("GOTPCREL relocations are supported only in 64bit mode.");
3162 len = 8;
3e73aa7c 3163 }
b77a7acd 3164 else if (strncmp (cp + 1, "GOT", 3) == 0)
3e73aa7c
JH
3165 {
3166 if (flag_code == CODE_64BIT)
b77a7acd 3167 i.disp_reloc[this_operand] = BFD_RELOC_X86_64_GOT32;
3e73aa7c 3168 else
b77a7acd 3169 i.disp_reloc[this_operand] = BFD_RELOC_386_GOT32;
24eab124
AM
3170 len = 3;
3171 }
3172 else
d0b47220 3173 as_bad (_("bad reloc specifier in expression"));
24eab124
AM
3174
3175 /* Replace the relocation token with ' ', so that errors like
3176 foo@GOTOFF1 will be detected. */
3177 first = cp - input_line_pointer;
47926f60 3178 tmpbuf = (char *) alloca (strlen (input_line_pointer));
24eab124
AM
3179 memcpy (tmpbuf, input_line_pointer, first);
3180 tmpbuf[first] = ' ';
3181 strcpy (tmpbuf + first + 1, cp + 1 + len);
3182 input_line_pointer = tmpbuf;
3183 }
3184 }
252b5132
RH
3185#endif
3186
3187 exp_seg = expression (exp);
3188
83183c0c 3189 SKIP_WHITESPACE ();
252b5132 3190 if (*input_line_pointer)
d0b47220 3191 as_bad (_("ignoring junk `%s' after expression"), input_line_pointer);
252b5132
RH
3192
3193 input_line_pointer = save_input_line_pointer;
3194
2daf4fd8 3195 if (exp->X_op == O_absent || exp->X_op == O_big)
252b5132 3196 {
47926f60 3197 /* Missing or bad expr becomes absolute 0. */
d0b47220 3198 as_bad (_("missing or invalid immediate expression `%s' taken as 0"),
24eab124 3199 imm_start);
252b5132
RH
3200 exp->X_op = O_constant;
3201 exp->X_add_number = 0;
3202 exp->X_add_symbol = (symbolS *) 0;
3203 exp->X_op_symbol = (symbolS *) 0;
252b5132 3204 }
3e73aa7c 3205 else if (exp->X_op == O_constant)
252b5132 3206 {
47926f60 3207 /* Size it properly later. */
3e73aa7c
JH
3208 i.types[this_operand] |= Imm64;
3209 /* If BFD64, sign extend val. */
3210 if (!use_rela_relocations)
3211 if ((exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
3212 exp->X_add_number = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
252b5132 3213 }
4c63da97 3214#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
47926f60 3215 else if (1
4c63da97 3216#ifdef BFD_ASSEMBLER
47926f60 3217 && OUTPUT_FLAVOR == bfd_target_aout_flavour
4c63da97 3218#endif
47926f60 3219 && exp_seg != text_section
24eab124
AM
3220 && exp_seg != data_section
3221 && exp_seg != bss_section
3222 && exp_seg != undefined_section
252b5132 3223#ifdef BFD_ASSEMBLER
24eab124 3224 && !bfd_is_com_section (exp_seg)
252b5132 3225#endif
24eab124 3226 )
252b5132 3227 {
4c63da97 3228#ifdef BFD_ASSEMBLER
d0b47220 3229 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
4c63da97 3230#else
d0b47220 3231 as_bad (_("unimplemented segment type %d in operand"), exp_seg);
4c63da97 3232#endif
252b5132
RH
3233 return 0;
3234 }
3235#endif
3236 else
3237 {
3238 /* This is an address. The size of the address will be
24eab124 3239 determined later, depending on destination register,
3e73aa7c
JH
3240 suffix, or the default for the section. */
3241 i.types[this_operand] |= Imm8 | Imm16 | Imm32 | Imm32S | Imm64;
252b5132
RH
3242 }
3243
3244 return 1;
3245}
3246
3247static int i386_scale PARAMS ((char *));
3248
3249static int
3250i386_scale (scale)
3251 char *scale;
3252{
3253 if (!isdigit (*scale))
3254 goto bad_scale;
3255
3256 switch (*scale)
3257 {
3258 case '0':
3259 case '1':
3260 i.log2_scale_factor = 0;
3261 break;
3262 case '2':
3263 i.log2_scale_factor = 1;
3264 break;
3265 case '4':
3266 i.log2_scale_factor = 2;
3267 break;
3268 case '8':
3269 i.log2_scale_factor = 3;
3270 break;
3271 default:
3272 bad_scale:
3273 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
24eab124 3274 scale);
252b5132
RH
3275 return 0;
3276 }
3277 if (i.log2_scale_factor != 0 && ! i.index_reg)
3278 {
3279 as_warn (_("scale factor of %d without an index register"),
24eab124 3280 1 << i.log2_scale_factor);
252b5132
RH
3281#if SCALE1_WHEN_NO_INDEX
3282 i.log2_scale_factor = 0;
3283#endif
3284 }
3285 return 1;
3286}
3287
3288static int i386_displacement PARAMS ((char *, char *));
3289
3290static int
3291i386_displacement (disp_start, disp_end)
3292 char *disp_start;
3293 char *disp_end;
3294{
3295 register expressionS *exp;
3296 segT exp_seg = 0;
3297 char *save_input_line_pointer;
3298 int bigdisp = Disp32;
3299
3e73aa7c 3300 if ((flag_code == CODE_16BIT) ^ (i.prefix[ADDR_PREFIX] != 0))
252b5132 3301 bigdisp = Disp16;
3e73aa7c
JH
3302 if (flag_code == CODE_64BIT)
3303 bigdisp = Disp64;
252b5132
RH
3304 i.types[this_operand] |= bigdisp;
3305
3306 exp = &disp_expressions[i.disp_operands];
520dc8e8 3307 i.op[this_operand].disps = exp;
252b5132
RH
3308 i.disp_operands++;
3309 save_input_line_pointer = input_line_pointer;
3310 input_line_pointer = disp_start;
3311 END_STRING_AND_SAVE (disp_end);
3312
3313#ifndef GCC_ASM_O_HACK
3314#define GCC_ASM_O_HACK 0
3315#endif
3316#if GCC_ASM_O_HACK
3317 END_STRING_AND_SAVE (disp_end + 1);
3318 if ((i.types[this_operand] & BaseIndex) != 0
24eab124 3319 && displacement_string_end[-1] == '+')
252b5132
RH
3320 {
3321 /* This hack is to avoid a warning when using the "o"
24eab124
AM
3322 constraint within gcc asm statements.
3323 For instance:
3324
3325 #define _set_tssldt_desc(n,addr,limit,type) \
3326 __asm__ __volatile__ ( \
3327 "movw %w2,%0\n\t" \
3328 "movw %w1,2+%0\n\t" \
3329 "rorl $16,%1\n\t" \
3330 "movb %b1,4+%0\n\t" \
3331 "movb %4,5+%0\n\t" \
3332 "movb $0,6+%0\n\t" \
3333 "movb %h1,7+%0\n\t" \
3334 "rorl $16,%1" \
3335 : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
3336
3337 This works great except that the output assembler ends
3338 up looking a bit weird if it turns out that there is
3339 no offset. You end up producing code that looks like:
3340
3341 #APP
3342 movw $235,(%eax)
3343 movw %dx,2+(%eax)
3344 rorl $16,%edx
3345 movb %dl,4+(%eax)
3346 movb $137,5+(%eax)
3347 movb $0,6+(%eax)
3348 movb %dh,7+(%eax)
3349 rorl $16,%edx
3350 #NO_APP
3351
47926f60 3352 So here we provide the missing zero. */
24eab124
AM
3353
3354 *displacement_string_end = '0';
252b5132
RH
3355 }
3356#endif
3357#ifndef LEX_AT
24eab124 3358 {
47926f60
KH
3359 /* We can have operands of the form
3360 <symbol>@GOTOFF+<nnn>
3361 Take the easy way out here and copy everything
3362 into a temporary buffer... */
24eab124
AM
3363 register char *cp;
3364
3365 cp = strchr (input_line_pointer, '@');
3366 if (cp != NULL)
3367 {
3368 char *tmpbuf;
3369 int len = 0;
3370 int first;
3371
47926f60 3372 /* GOT relocations are not supported in 16 bit mode. */
3e73aa7c 3373 if (flag_code == CODE_16BIT)
24eab124
AM
3374 as_bad (_("GOT relocations not supported in 16 bit mode"));
3375
3376 if (GOT_symbol == NULL)
3377 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
3378
3379 if (strncmp (cp + 1, "PLT", 3) == 0)
3380 {
3e73aa7c
JH
3381 if (flag_code == CODE_64BIT)
3382 i.disp_reloc[this_operand] = BFD_RELOC_X86_64_PLT32;
3383 else
3384 i.disp_reloc[this_operand] = BFD_RELOC_386_PLT32;
24eab124
AM
3385 len = 3;
3386 }
3387 else if (strncmp (cp + 1, "GOTOFF", 6) == 0)
3388 {
3e73aa7c
JH
3389 if (flag_code == CODE_64BIT)
3390 as_bad ("GOTOFF relocation is not supported in 64bit mode.");
24eab124
AM
3391 i.disp_reloc[this_operand] = BFD_RELOC_386_GOTOFF;
3392 len = 6;
3393 }
b77a7acd
AJ
3394 else if (strncmp (cp + 1, "GOTPCREL", 8) == 0)
3395 {
3396 if (flag_code != CODE_64BIT)
3397 as_bad ("GOTPCREL relocation is supported only in 64bit mode.");
3398 i.disp_reloc[this_operand] = BFD_RELOC_X86_64_GOTPCREL;
3399 len = 8;
3400 }
24eab124
AM
3401 else if (strncmp (cp + 1, "GOT", 3) == 0)
3402 {
3e73aa7c
JH
3403 if (flag_code == CODE_64BIT)
3404 i.disp_reloc[this_operand] = BFD_RELOC_X86_64_GOT32;
3405 else
3406 i.disp_reloc[this_operand] = BFD_RELOC_386_GOT32;
3407 len = 3;
3408 }
24eab124 3409 else
d0b47220 3410 as_bad (_("bad reloc specifier in expression"));
24eab124
AM
3411
3412 /* Replace the relocation token with ' ', so that errors like
3413 foo@GOTOFF1 will be detected. */
3414 first = cp - input_line_pointer;
47926f60 3415 tmpbuf = (char *) alloca (strlen (input_line_pointer));
24eab124
AM
3416 memcpy (tmpbuf, input_line_pointer, first);
3417 tmpbuf[first] = ' ';
3418 strcpy (tmpbuf + first + 1, cp + 1 + len);
3419 input_line_pointer = tmpbuf;
3420 }
3421 }
252b5132
RH
3422#endif
3423
24eab124 3424 exp_seg = expression (exp);
252b5132
RH
3425
3426#ifdef BFD_ASSEMBLER
24eab124
AM
3427 /* We do this to make sure that the section symbol is in
3428 the symbol table. We will ultimately change the relocation
47926f60 3429 to be relative to the beginning of the section. */
3e73aa7c
JH
3430 if (i.disp_reloc[this_operand] == BFD_RELOC_386_GOTOFF
3431 || i.disp_reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
24eab124 3432 {
e5cb08ac 3433 if (S_IS_LOCAL (exp->X_add_symbol)
24eab124
AM
3434 && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section)
3435 section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
3436 assert (exp->X_op == O_symbol);
3437 exp->X_op = O_subtract;
3438 exp->X_op_symbol = GOT_symbol;
3439 i.disp_reloc[this_operand] = BFD_RELOC_32;
3440 }
252b5132
RH
3441#endif
3442
24eab124
AM
3443 SKIP_WHITESPACE ();
3444 if (*input_line_pointer)
d0b47220 3445 as_bad (_("ignoring junk `%s' after expression"),
24eab124 3446 input_line_pointer);
252b5132 3447#if GCC_ASM_O_HACK
24eab124 3448 RESTORE_END_STRING (disp_end + 1);
252b5132 3449#endif
24eab124
AM
3450 RESTORE_END_STRING (disp_end);
3451 input_line_pointer = save_input_line_pointer;
3452
2daf4fd8
AM
3453 if (exp->X_op == O_absent || exp->X_op == O_big)
3454 {
47926f60 3455 /* Missing or bad expr becomes absolute 0. */
d0b47220 3456 as_bad (_("missing or invalid displacement expression `%s' taken as 0"),
2daf4fd8
AM
3457 disp_start);
3458 exp->X_op = O_constant;
3459 exp->X_add_number = 0;
3460 exp->X_add_symbol = (symbolS *) 0;
3461 exp->X_op_symbol = (symbolS *) 0;
3462 }
3463
4c63da97 3464#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
45288df1 3465 if (exp->X_op != O_constant
4c63da97 3466#ifdef BFD_ASSEMBLER
45288df1 3467 && OUTPUT_FLAVOR == bfd_target_aout_flavour
4c63da97 3468#endif
45288df1
AM
3469 && exp_seg != text_section
3470 && exp_seg != data_section
3471 && exp_seg != bss_section
3472 && exp_seg != undefined_section)
24eab124 3473 {
4c63da97 3474#ifdef BFD_ASSEMBLER
d0b47220 3475 as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
4c63da97 3476#else
d0b47220 3477 as_bad (_("unimplemented segment type %d in operand"), exp_seg);
4c63da97 3478#endif
24eab124
AM
3479 return 0;
3480 }
252b5132 3481#endif
3e73aa7c
JH
3482 else if (flag_code == CODE_64BIT)
3483 i.types[this_operand] |= Disp32S | Disp32;
252b5132
RH
3484 return 1;
3485}
3486
e5cb08ac 3487static int i386_index_check PARAMS ((const char *));
252b5132 3488
eecb386c 3489/* Make sure the memory operand we've been dealt is valid.
47926f60
KH
3490 Return 1 on success, 0 on a failure. */
3491
252b5132 3492static int
eecb386c
AM
3493i386_index_check (operand_string)
3494 const char *operand_string;
252b5132 3495{
3e73aa7c 3496 int ok;
24eab124 3497#if INFER_ADDR_PREFIX
eecb386c
AM
3498 int fudged = 0;
3499
24eab124
AM
3500 tryprefix:
3501#endif
3e73aa7c
JH
3502 ok = 1;
3503 if (flag_code == CODE_64BIT)
3504 {
3505 /* 64bit checks. */
3506 if ((i.base_reg
3507 && ((i.base_reg->reg_type & Reg64) == 0)
3508 && (i.base_reg->reg_type != BaseIndex
3509 || i.index_reg))
3510 || (i.index_reg
3511 && ((i.index_reg->reg_type & (Reg64|BaseIndex))
3512 != (Reg64|BaseIndex))))
3513 ok = 0;
3514 }
3515 else
3516 {
3517 if ((flag_code == CODE_16BIT) ^ (i.prefix[ADDR_PREFIX] != 0))
3518 {
3519 /* 16bit checks. */
3520 if ((i.base_reg
3521 && ((i.base_reg->reg_type & (Reg16|BaseIndex|RegRex))
3522 != (Reg16|BaseIndex)))
3523 || (i.index_reg
3524 && (((i.index_reg->reg_type & (Reg16|BaseIndex))
3525 != (Reg16|BaseIndex))
3526 || ! (i.base_reg
3527 && i.base_reg->reg_num < 6
3528 && i.index_reg->reg_num >= 6
3529 && i.log2_scale_factor == 0))))
3530 ok = 0;
3531 }
3532 else
e5cb08ac 3533 {
3e73aa7c
JH
3534 /* 32bit checks. */
3535 if ((i.base_reg
3536 && (i.base_reg->reg_type & (Reg32 | RegRex)) != Reg32)
3537 || (i.index_reg
3538 && ((i.index_reg->reg_type & (Reg32|BaseIndex|RegRex))
3539 != (Reg32|BaseIndex))))
e5cb08ac 3540 ok = 0;
3e73aa7c
JH
3541 }
3542 }
3543 if (!ok)
24eab124
AM
3544 {
3545#if INFER_ADDR_PREFIX
3e73aa7c
JH
3546 if (flag_code != CODE_64BIT
3547 && i.prefix[ADDR_PREFIX] == 0 && stackop_size != '\0')
24eab124
AM
3548 {
3549 i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
3550 i.prefixes += 1;
b23bac36
AM
3551 /* Change the size of any displacement too. At most one of
3552 Disp16 or Disp32 is set.
3553 FIXME. There doesn't seem to be any real need for separate
3554 Disp16 and Disp32 flags. The same goes for Imm16 and Imm32.
47926f60 3555 Removing them would probably clean up the code quite a lot. */
b23bac36
AM
3556 if (i.types[this_operand] & (Disp16|Disp32))
3557 i.types[this_operand] ^= (Disp16|Disp32);
eecb386c 3558 fudged = 1;
24eab124
AM
3559 goto tryprefix;
3560 }
eecb386c
AM
3561 if (fudged)
3562 as_bad (_("`%s' is not a valid base/index expression"),
3563 operand_string);
3564 else
c388dee8 3565#endif
eecb386c
AM
3566 as_bad (_("`%s' is not a valid %s bit base/index expression"),
3567 operand_string,
3e73aa7c 3568 flag_code_names[flag_code]);
eecb386c 3569 return 0;
24eab124
AM
3570 }
3571 return 1;
3572}
252b5132 3573
252b5132 3574/* Parse OPERAND_STRING into the i386_insn structure I. Returns non-zero
47926f60 3575 on error. */
252b5132 3576
252b5132
RH
3577static int
3578i386_operand (operand_string)
3579 char *operand_string;
3580{
af6bdddf
AM
3581 const reg_entry *r;
3582 char *end_op;
24eab124 3583 char *op_string = operand_string;
252b5132 3584
24eab124 3585 if (is_space_char (*op_string))
252b5132
RH
3586 ++op_string;
3587
24eab124 3588 /* We check for an absolute prefix (differentiating,
47926f60 3589 for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
24eab124
AM
3590 if (*op_string == ABSOLUTE_PREFIX)
3591 {
3592 ++op_string;
3593 if (is_space_char (*op_string))
3594 ++op_string;
3595 i.types[this_operand] |= JumpAbsolute;
3596 }
252b5132 3597
47926f60 3598 /* Check if operand is a register. */
af6bdddf
AM
3599 if ((*op_string == REGISTER_PREFIX || allow_naked_reg)
3600 && (r = parse_register (op_string, &end_op)) != NULL)
24eab124 3601 {
24eab124
AM
3602 /* Check for a segment override by searching for ':' after a
3603 segment register. */
3604 op_string = end_op;
3605 if (is_space_char (*op_string))
3606 ++op_string;
3607 if (*op_string == ':' && (r->reg_type & (SReg2 | SReg3)))
3608 {
3609 switch (r->reg_num)
3610 {
3611 case 0:
3612 i.seg[i.mem_operands] = &es;
3613 break;
3614 case 1:
3615 i.seg[i.mem_operands] = &cs;
3616 break;
3617 case 2:
3618 i.seg[i.mem_operands] = &ss;
3619 break;
3620 case 3:
3621 i.seg[i.mem_operands] = &ds;
3622 break;
3623 case 4:
3624 i.seg[i.mem_operands] = &fs;
3625 break;
3626 case 5:
3627 i.seg[i.mem_operands] = &gs;
3628 break;
3629 }
252b5132 3630
24eab124 3631 /* Skip the ':' and whitespace. */
252b5132
RH
3632 ++op_string;
3633 if (is_space_char (*op_string))
24eab124 3634 ++op_string;
252b5132 3635
24eab124
AM
3636 if (!is_digit_char (*op_string)
3637 && !is_identifier_char (*op_string)
3638 && *op_string != '('
3639 && *op_string != ABSOLUTE_PREFIX)
3640 {
3641 as_bad (_("bad memory operand `%s'"), op_string);
3642 return 0;
3643 }
47926f60 3644 /* Handle case of %es:*foo. */
24eab124
AM
3645 if (*op_string == ABSOLUTE_PREFIX)
3646 {
3647 ++op_string;
3648 if (is_space_char (*op_string))
3649 ++op_string;
3650 i.types[this_operand] |= JumpAbsolute;
3651 }
3652 goto do_memory_reference;
3653 }
3654 if (*op_string)
3655 {
d0b47220 3656 as_bad (_("junk `%s' after register"), op_string);
24eab124
AM
3657 return 0;
3658 }
3659 i.types[this_operand] |= r->reg_type & ~BaseIndex;
520dc8e8 3660 i.op[this_operand].regs = r;
24eab124
AM
3661 i.reg_operands++;
3662 }
af6bdddf
AM
3663 else if (*op_string == REGISTER_PREFIX)
3664 {
3665 as_bad (_("bad register name `%s'"), op_string);
3666 return 0;
3667 }
24eab124 3668 else if (*op_string == IMMEDIATE_PREFIX)
ce8a8b2f 3669 {
24eab124
AM
3670 ++op_string;
3671 if (i.types[this_operand] & JumpAbsolute)
3672 {
d0b47220 3673 as_bad (_("immediate operand illegal with absolute jump"));
24eab124
AM
3674 return 0;
3675 }
3676 if (!i386_immediate (op_string))
3677 return 0;
3678 }
3679 else if (is_digit_char (*op_string)
3680 || is_identifier_char (*op_string)
e5cb08ac 3681 || *op_string == '(')
24eab124 3682 {
47926f60 3683 /* This is a memory reference of some sort. */
af6bdddf 3684 char *base_string;
252b5132 3685
47926f60 3686 /* Start and end of displacement string expression (if found). */
eecb386c
AM
3687 char *displacement_string_start;
3688 char *displacement_string_end;
252b5132 3689
24eab124 3690 do_memory_reference:
24eab124
AM
3691 if ((i.mem_operands == 1
3692 && (current_templates->start->opcode_modifier & IsString) == 0)
3693 || i.mem_operands == 2)
3694 {
3695 as_bad (_("too many memory references for `%s'"),
3696 current_templates->start->name);
3697 return 0;
3698 }
252b5132 3699
24eab124
AM
3700 /* Check for base index form. We detect the base index form by
3701 looking for an ')' at the end of the operand, searching
3702 for the '(' matching it, and finding a REGISTER_PREFIX or ','
3703 after the '('. */
af6bdddf 3704 base_string = op_string + strlen (op_string);
c3332e24 3705
af6bdddf
AM
3706 --base_string;
3707 if (is_space_char (*base_string))
3708 --base_string;
252b5132 3709
47926f60 3710 /* If we only have a displacement, set-up for it to be parsed later. */
af6bdddf
AM
3711 displacement_string_start = op_string;
3712 displacement_string_end = base_string + 1;
252b5132 3713
24eab124
AM
3714 if (*base_string == ')')
3715 {
af6bdddf 3716 char *temp_string;
24eab124
AM
3717 unsigned int parens_balanced = 1;
3718 /* We've already checked that the number of left & right ()'s are
47926f60 3719 equal, so this loop will not be infinite. */
24eab124
AM
3720 do
3721 {
3722 base_string--;
3723 if (*base_string == ')')
3724 parens_balanced++;
3725 if (*base_string == '(')
3726 parens_balanced--;
3727 }
3728 while (parens_balanced);
c3332e24 3729
af6bdddf 3730 temp_string = base_string;
c3332e24 3731
24eab124 3732 /* Skip past '(' and whitespace. */
252b5132
RH
3733 ++base_string;
3734 if (is_space_char (*base_string))
24eab124 3735 ++base_string;
252b5132 3736
af6bdddf
AM
3737 if (*base_string == ','
3738 || ((*base_string == REGISTER_PREFIX || allow_naked_reg)
3739 && (i.base_reg = parse_register (base_string, &end_op)) != NULL))
252b5132 3740 {
af6bdddf 3741 displacement_string_end = temp_string;
252b5132 3742
af6bdddf 3743 i.types[this_operand] |= BaseIndex;
252b5132 3744
af6bdddf 3745 if (i.base_reg)
24eab124 3746 {
24eab124
AM
3747 base_string = end_op;
3748 if (is_space_char (*base_string))
3749 ++base_string;
af6bdddf
AM
3750 }
3751
3752 /* There may be an index reg or scale factor here. */
3753 if (*base_string == ',')
3754 {
3755 ++base_string;
3756 if (is_space_char (*base_string))
3757 ++base_string;
3758
3759 if ((*base_string == REGISTER_PREFIX || allow_naked_reg)
3760 && (i.index_reg = parse_register (base_string, &end_op)) != NULL)
24eab124 3761 {
af6bdddf 3762 base_string = end_op;
24eab124
AM
3763 if (is_space_char (*base_string))
3764 ++base_string;
af6bdddf
AM
3765 if (*base_string == ',')
3766 {
3767 ++base_string;
3768 if (is_space_char (*base_string))
3769 ++base_string;
3770 }
e5cb08ac 3771 else if (*base_string != ')')
af6bdddf
AM
3772 {
3773 as_bad (_("expecting `,' or `)' after index register in `%s'"),
3774 operand_string);
3775 return 0;
3776 }
24eab124 3777 }
af6bdddf 3778 else if (*base_string == REGISTER_PREFIX)
24eab124 3779 {
af6bdddf 3780 as_bad (_("bad register name `%s'"), base_string);
24eab124
AM
3781 return 0;
3782 }
252b5132 3783
47926f60 3784 /* Check for scale factor. */
af6bdddf
AM
3785 if (isdigit ((unsigned char) *base_string))
3786 {
3787 if (!i386_scale (base_string))
3788 return 0;
24eab124 3789
af6bdddf
AM
3790 ++base_string;
3791 if (is_space_char (*base_string))
3792 ++base_string;
3793 if (*base_string != ')')
3794 {
3795 as_bad (_("expecting `)' after scale factor in `%s'"),
3796 operand_string);
3797 return 0;
3798 }
3799 }
3800 else if (!i.index_reg)
24eab124 3801 {
af6bdddf
AM
3802 as_bad (_("expecting index register or scale factor after `,'; got '%c'"),
3803 *base_string);
24eab124
AM
3804 return 0;
3805 }
3806 }
af6bdddf 3807 else if (*base_string != ')')
24eab124 3808 {
af6bdddf
AM
3809 as_bad (_("expecting `,' or `)' after base register in `%s'"),
3810 operand_string);
24eab124
AM
3811 return 0;
3812 }
c3332e24 3813 }
af6bdddf 3814 else if (*base_string == REGISTER_PREFIX)
c3332e24 3815 {
af6bdddf 3816 as_bad (_("bad register name `%s'"), base_string);
24eab124 3817 return 0;
c3332e24 3818 }
24eab124
AM
3819 }
3820
3821 /* If there's an expression beginning the operand, parse it,
3822 assuming displacement_string_start and
3823 displacement_string_end are meaningful. */
3824 if (displacement_string_start != displacement_string_end)
3825 {
3826 if (!i386_displacement (displacement_string_start,
3827 displacement_string_end))
3828 return 0;
3829 }
3830
3831 /* Special case for (%dx) while doing input/output op. */
3832 if (i.base_reg
3833 && i.base_reg->reg_type == (Reg16 | InOutPortReg)
3834 && i.index_reg == 0
3835 && i.log2_scale_factor == 0
3836 && i.seg[i.mem_operands] == 0
3837 && (i.types[this_operand] & Disp) == 0)
3838 {
3839 i.types[this_operand] = InOutPortReg;
3840 return 1;
3841 }
3842
eecb386c
AM
3843 if (i386_index_check (operand_string) == 0)
3844 return 0;
24eab124
AM
3845 i.mem_operands++;
3846 }
3847 else
ce8a8b2f
AM
3848 {
3849 /* It's not a memory operand; argh! */
24eab124
AM
3850 as_bad (_("invalid char %s beginning operand %d `%s'"),
3851 output_invalid (*op_string),
3852 this_operand + 1,
3853 op_string);
3854 return 0;
3855 }
47926f60 3856 return 1; /* Normal return. */
252b5132
RH
3857}
3858\f
ee7fcc42
AM
3859/* md_estimate_size_before_relax()
3860
3861 Called just before relax() for rs_machine_dependent frags. The x86
3862 assembler uses these frags to handle variable size jump
3863 instructions.
3864
3865 Any symbol that is now undefined will not become defined.
3866 Return the correct fr_subtype in the frag.
3867 Return the initial "guess for variable size of frag" to caller.
3868 The guess is actually the growth beyond the fixed part. Whatever
3869 we do to grow the fixed or variable part contributes to our
3870 returned value. */
3871
252b5132
RH
3872int
3873md_estimate_size_before_relax (fragP, segment)
3874 register fragS *fragP;
3875 register segT segment;
3876{
252b5132 3877 /* We've already got fragP->fr_subtype right; all we have to do is
b98ef147
AM
3878 check for un-relaxable symbols. On an ELF system, we can't relax
3879 an externally visible symbol, because it may be overridden by a
3880 shared library. */
3881 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6d249963 3882#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
b98ef147
AM
3883 || S_IS_EXTERNAL (fragP->fr_symbol)
3884 || S_IS_WEAK (fragP->fr_symbol)
3885#endif
3886 )
252b5132 3887 {
b98ef147
AM
3888 /* Symbol is undefined in this segment, or we need to keep a
3889 reloc so that weak symbols can be overridden. */
3890 int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
f6af82bd
AM
3891#ifdef BFD_ASSEMBLER
3892 enum bfd_reloc_code_real reloc_type;
3893#else
3894 int reloc_type;
3895#endif
ee7fcc42
AM
3896 unsigned char *opcode;
3897 int old_fr_fix;
f6af82bd 3898
ee7fcc42
AM
3899 if (fragP->fr_var != NO_RELOC)
3900 reloc_type = fragP->fr_var;
b98ef147 3901 else if (size == 2)
f6af82bd
AM
3902 reloc_type = BFD_RELOC_16_PCREL;
3903 else
3904 reloc_type = BFD_RELOC_32_PCREL;
252b5132 3905
ee7fcc42
AM
3906 old_fr_fix = fragP->fr_fix;
3907 opcode = (unsigned char *) fragP->fr_opcode;
3908
252b5132
RH
3909 switch (opcode[0])
3910 {
47926f60
KH
3911 case JUMP_PC_RELATIVE:
3912 /* Make jmp (0xeb) a dword displacement jump. */
47926f60 3913 opcode[0] = 0xe9;
252b5132
RH
3914 fragP->fr_fix += size;
3915 fix_new (fragP, old_fr_fix, size,
3916 fragP->fr_symbol,
3917 fragP->fr_offset, 1,
f6af82bd 3918 reloc_type);
252b5132
RH
3919 break;
3920
3921 default:
24eab124 3922 /* This changes the byte-displacement jump 0x7N
f6af82bd 3923 to the dword-displacement jump 0x0f,0x8N. */
252b5132 3924 opcode[1] = opcode[0] + 0x10;
f6af82bd 3925 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
47926f60
KH
3926 /* We've added an opcode byte. */
3927 fragP->fr_fix += 1 + size;
252b5132
RH
3928 fix_new (fragP, old_fr_fix + 1, size,
3929 fragP->fr_symbol,
3930 fragP->fr_offset, 1,
f6af82bd 3931 reloc_type);
252b5132
RH
3932 break;
3933 }
3934 frag_wane (fragP);
ee7fcc42 3935 return fragP->fr_fix - old_fr_fix;
252b5132 3936 }
47926f60
KH
3937 /* Guess a short jump. */
3938 return 1;
ee7fcc42
AM
3939}
3940
47926f60
KH
3941/* Called after relax() is finished.
3942
3943 In: Address of frag.
3944 fr_type == rs_machine_dependent.
3945 fr_subtype is what the address relaxed to.
3946
3947 Out: Any fixSs and constants are set up.
3948 Caller will turn frag into a ".space 0". */
3949
252b5132
RH
3950#ifndef BFD_ASSEMBLER
3951void
3952md_convert_frag (headers, sec, fragP)
a04b544b
ILT
3953 object_headers *headers ATTRIBUTE_UNUSED;
3954 segT sec ATTRIBUTE_UNUSED;
252b5132
RH
3955 register fragS *fragP;
3956#else
3957void
3958md_convert_frag (abfd, sec, fragP)
ab9da554
ILT
3959 bfd *abfd ATTRIBUTE_UNUSED;
3960 segT sec ATTRIBUTE_UNUSED;
252b5132
RH
3961 register fragS *fragP;
3962#endif
3963{
3964 register unsigned char *opcode;
3965 unsigned char *where_to_put_displacement = NULL;
847f7ad4
AM
3966 offsetT target_address;
3967 offsetT opcode_address;
252b5132 3968 unsigned int extension = 0;
847f7ad4 3969 offsetT displacement_from_opcode_start;
252b5132
RH
3970
3971 opcode = (unsigned char *) fragP->fr_opcode;
3972
47926f60 3973 /* Address we want to reach in file space. */
252b5132 3974 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
47926f60
KH
3975#ifdef BFD_ASSEMBLER
3976 /* Not needed otherwise? */
49309057 3977 target_address += symbol_get_frag (fragP->fr_symbol)->fr_address;
252b5132
RH
3978#endif
3979
47926f60 3980 /* Address opcode resides at in file space. */
252b5132
RH
3981 opcode_address = fragP->fr_address + fragP->fr_fix;
3982
47926f60 3983 /* Displacement from opcode start to fill into instruction. */
252b5132
RH
3984 displacement_from_opcode_start = target_address - opcode_address;
3985
3986 switch (fragP->fr_subtype)
3987 {
3988 case ENCODE_RELAX_STATE (COND_JUMP, SMALL):
3989 case ENCODE_RELAX_STATE (COND_JUMP, SMALL16):
3990 case ENCODE_RELAX_STATE (UNCOND_JUMP, SMALL):
3991 case ENCODE_RELAX_STATE (UNCOND_JUMP, SMALL16):
47926f60
KH
3992 /* Don't have to change opcode. */
3993 extension = 1; /* 1 opcode + 1 displacement */
252b5132
RH
3994 where_to_put_displacement = &opcode[1];
3995 break;
3996
3997 case ENCODE_RELAX_STATE (COND_JUMP, BIG):
47926f60 3998 extension = 5; /* 2 opcode + 4 displacement */
252b5132
RH
3999 opcode[1] = opcode[0] + 0x10;
4000 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
4001 where_to_put_displacement = &opcode[2];
4002 break;
4003
4004 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
47926f60 4005 extension = 4; /* 1 opcode + 4 displacement */
252b5132
RH
4006 opcode[0] = 0xe9;
4007 where_to_put_displacement = &opcode[1];
4008 break;
4009
4010 case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
47926f60 4011 extension = 3; /* 2 opcode + 2 displacement */
252b5132
RH
4012 opcode[1] = opcode[0] + 0x10;
4013 opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
4014 where_to_put_displacement = &opcode[2];
4015 break;
4016
4017 case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
47926f60 4018 extension = 2; /* 1 opcode + 2 displacement */
252b5132
RH
4019 opcode[0] = 0xe9;
4020 where_to_put_displacement = &opcode[1];
4021 break;
4022
4023 default:
4024 BAD_CASE (fragP->fr_subtype);
4025 break;
4026 }
47926f60 4027 /* Now put displacement after opcode. */
252b5132
RH
4028 md_number_to_chars ((char *) where_to_put_displacement,
4029 (valueT) (displacement_from_opcode_start - extension),
4030 SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
4031 fragP->fr_fix += extension;
4032}
4033\f
47926f60
KH
4034/* Size of byte displacement jmp. */
4035int md_short_jump_size = 2;
4036
4037/* Size of dword displacement jmp. */
4038int md_long_jump_size = 5;
252b5132 4039
47926f60
KH
4040/* Size of relocation record. */
4041const int md_reloc_size = 8;
252b5132
RH
4042
4043void
4044md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
4045 char *ptr;
4046 addressT from_addr, to_addr;
ab9da554
ILT
4047 fragS *frag ATTRIBUTE_UNUSED;
4048 symbolS *to_symbol ATTRIBUTE_UNUSED;
252b5132 4049{
847f7ad4 4050 offsetT offset;
252b5132
RH
4051
4052 offset = to_addr - (from_addr + 2);
47926f60
KH
4053 /* Opcode for byte-disp jump. */
4054 md_number_to_chars (ptr, (valueT) 0xeb, 1);
252b5132
RH
4055 md_number_to_chars (ptr + 1, (valueT) offset, 1);
4056}
4057
4058void
4059md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
4060 char *ptr;
4061 addressT from_addr, to_addr;
a38cf1db
AM
4062 fragS *frag ATTRIBUTE_UNUSED;
4063 symbolS *to_symbol ATTRIBUTE_UNUSED;
252b5132 4064{
847f7ad4 4065 offsetT offset;
252b5132 4066
a38cf1db
AM
4067 offset = to_addr - (from_addr + 5);
4068 md_number_to_chars (ptr, (valueT) 0xe9, 1);
4069 md_number_to_chars (ptr + 1, (valueT) offset, 4);
252b5132
RH
4070}
4071\f
4072/* Apply a fixup (fixS) to segment data, once it has been determined
4073 by our caller that we have all the info we need to fix it up.
4074
4075 On the 386, immediates, displacements, and data pointers are all in
4076 the same (little-endian) format, so we don't need to care about which
4077 we are handling. */
4078
4079int
4080md_apply_fix3 (fixP, valp, seg)
47926f60
KH
4081 /* The fix we're to put in. */
4082 fixS *fixP;
4083
4084 /* Pointer to the value of the bits. */
4085 valueT *valp;
4086
4087 /* Segment fix is from. */
4088 segT seg ATTRIBUTE_UNUSED;
252b5132
RH
4089{
4090 register char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
4091 valueT value = *valp;
4092
e1b283bb 4093#if defined (BFD_ASSEMBLER) && !defined (TE_Mach)
93382f6d
AM
4094 if (fixP->fx_pcrel)
4095 {
4096 switch (fixP->fx_r_type)
4097 {
5865bb77
ILT
4098 default:
4099 break;
4100
93382f6d
AM
4101 case BFD_RELOC_32:
4102 fixP->fx_r_type = BFD_RELOC_32_PCREL;
4103 break;
4104 case BFD_RELOC_16:
4105 fixP->fx_r_type = BFD_RELOC_16_PCREL;
4106 break;
4107 case BFD_RELOC_8:
4108 fixP->fx_r_type = BFD_RELOC_8_PCREL;
4109 break;
4110 }
4111 }
252b5132 4112
0723899b
ILT
4113 /* This is a hack. There should be a better way to handle this.
4114 This covers for the fact that bfd_install_relocation will
4115 subtract the current location (for partial_inplace, PC relative
4116 relocations); see more below. */
93382f6d
AM
4117 if ((fixP->fx_r_type == BFD_RELOC_32_PCREL
4118 || fixP->fx_r_type == BFD_RELOC_16_PCREL
4119 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
4120 && fixP->fx_addsy)
252b5132
RH
4121 {
4122#ifndef OBJ_AOUT
4123 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
4124#ifdef TE_PE
4125 || OUTPUT_FLAVOR == bfd_target_coff_flavour
4126#endif
4127 )
4128 value += fixP->fx_where + fixP->fx_frag->fr_address;
4129#endif
4130#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2f66722d 4131 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
252b5132 4132 {
2f66722d
AM
4133 segT fseg = S_GET_SEGMENT (fixP->fx_addsy);
4134
4135 if ((fseg == seg
4136 || (symbol_section_p (fixP->fx_addsy)
4137 && fseg != absolute_section))
4138 && ! S_IS_EXTERNAL (fixP->fx_addsy)
4139 && ! S_IS_WEAK (fixP->fx_addsy)
4140 && S_IS_DEFINED (fixP->fx_addsy)
4141 && ! S_IS_COMMON (fixP->fx_addsy))
4142 {
4143 /* Yes, we add the values in twice. This is because
4144 bfd_perform_relocation subtracts them out again. I think
4145 bfd_perform_relocation is broken, but I don't dare change
4146 it. FIXME. */
4147 value += fixP->fx_where + fixP->fx_frag->fr_address;
4148 }
252b5132
RH
4149 }
4150#endif
4151#if defined (OBJ_COFF) && defined (TE_PE)
4152 /* For some reason, the PE format does not store a section
24eab124 4153 address offset for a PC relative symbol. */
252b5132
RH
4154 if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
4155 value += md_pcrel_from (fixP);
4156#endif
4157 }
4158
4159 /* Fix a few things - the dynamic linker expects certain values here,
47926f60 4160 and we must not dissappoint it. */
252b5132
RH
4161#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4162 if (OUTPUT_FLAVOR == bfd_target_elf_flavour
4163 && fixP->fx_addsy)
47926f60
KH
4164 switch (fixP->fx_r_type)
4165 {
4166 case BFD_RELOC_386_PLT32:
3e73aa7c 4167 case BFD_RELOC_X86_64_PLT32:
47926f60
KH
4168 /* Make the jump instruction point to the address of the operand. At
4169 runtime we merely add the offset to the actual PLT entry. */
4170 value = -4;
4171 break;
4172 case BFD_RELOC_386_GOTPC:
4173
4174/* This is tough to explain. We end up with this one if we have
252b5132
RH
4175 * operands that look like "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal
4176 * here is to obtain the absolute address of the GOT, and it is strongly
4177 * preferable from a performance point of view to avoid using a runtime
c3332e24 4178 * relocation for this. The actual sequence of instructions often look
252b5132 4179 * something like:
c3332e24 4180 *
24eab124 4181 * call .L66
252b5132 4182 * .L66:
24eab124
AM
4183 * popl %ebx
4184 * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
c3332e24 4185 *
24eab124 4186 * The call and pop essentially return the absolute address of
252b5132
RH
4187 * the label .L66 and store it in %ebx. The linker itself will
4188 * ultimately change the first operand of the addl so that %ebx points to
4189 * the GOT, but to keep things simple, the .o file must have this operand
4190 * set so that it generates not the absolute address of .L66, but the
4191 * absolute address of itself. This allows the linker itself simply
4192 * treat a GOTPC relocation as asking for a pcrel offset to the GOT to be
4193 * added in, and the addend of the relocation is stored in the operand
4194 * field for the instruction itself.
c3332e24 4195 *
24eab124 4196 * Our job here is to fix the operand so that it would add the correct
252b5132
RH
4197 * offset so that %ebx would point to itself. The thing that is tricky is
4198 * that .-.L66 will point to the beginning of the instruction, so we need
4199 * to further modify the operand so that it will point to itself.
4200 * There are other cases where you have something like:
c3332e24 4201 *
24eab124 4202 * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66]
c3332e24 4203 *
252b5132 4204 * and here no correction would be required. Internally in the assembler
c3332e24 4205 * we treat operands of this form as not being pcrel since the '.' is
252b5132
RH
4206 * explicitly mentioned, and I wonder whether it would simplify matters
4207 * to do it this way. Who knows. In earlier versions of the PIC patches,
4208 * the pcrel_adjust field was used to store the correction, but since the
47926f60
KH
4209 * expression is not pcrel, I felt it would be confusing to do it this
4210 * way. */
4211
4212 value -= 1;
4213 break;
4214 case BFD_RELOC_386_GOT32:
3e73aa7c 4215 case BFD_RELOC_X86_64_GOT32:
47926f60
KH
4216 value = 0; /* Fully resolved at runtime. No addend. */
4217 break;
4218 case BFD_RELOC_386_GOTOFF:
3e73aa7c 4219 case BFD_RELOC_X86_64_GOTPCREL:
47926f60
KH
4220 break;
4221
4222 case BFD_RELOC_VTABLE_INHERIT:
4223 case BFD_RELOC_VTABLE_ENTRY:
4224 fixP->fx_done = 0;
4225 return 1;
4226
4227 default:
4228 break;
4229 }
4230#endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
93382f6d 4231 *valp = value;
47926f60 4232#endif /* defined (BFD_ASSEMBLER) && !defined (TE_Mach) */
3e73aa7c
JH
4233
4234#ifndef BFD_ASSEMBLER
252b5132 4235 md_number_to_chars (p, value, fixP->fx_size);
3e73aa7c
JH
4236#else
4237 /* Are we finished with this relocation now? */
4238 if (fixP->fx_addsy == 0 && fixP->fx_pcrel == 0)
4239 fixP->fx_done = 1;
4240 else if (use_rela_relocations)
4241 {
4242 fixP->fx_no_overflow = 1;
4243 value = 0;
4244 }
4245 md_number_to_chars (p, value, fixP->fx_size);
4246#endif
252b5132
RH
4247
4248 return 1;
4249}
252b5132 4250\f
252b5132
RH
4251#define MAX_LITTLENUMS 6
4252
47926f60
KH
4253/* Turn the string pointed to by litP into a floating point constant
4254 of type TYPE, and emit the appropriate bytes. The number of
4255 LITTLENUMS emitted is stored in *SIZEP. An error message is
4256 returned, or NULL on OK. */
4257
252b5132
RH
4258char *
4259md_atof (type, litP, sizeP)
2ab9b79e 4260 int type;
252b5132
RH
4261 char *litP;
4262 int *sizeP;
4263{
4264 int prec;
4265 LITTLENUM_TYPE words[MAX_LITTLENUMS];
4266 LITTLENUM_TYPE *wordP;
4267 char *t;
4268
4269 switch (type)
4270 {
4271 case 'f':
4272 case 'F':
4273 prec = 2;
4274 break;
4275
4276 case 'd':
4277 case 'D':
4278 prec = 4;
4279 break;
4280
4281 case 'x':
4282 case 'X':
4283 prec = 5;
4284 break;
4285
4286 default:
4287 *sizeP = 0;
4288 return _("Bad call to md_atof ()");
4289 }
4290 t = atof_ieee (input_line_pointer, type, words);
4291 if (t)
4292 input_line_pointer = t;
4293
4294 *sizeP = prec * sizeof (LITTLENUM_TYPE);
4295 /* This loops outputs the LITTLENUMs in REVERSE order; in accord with
4296 the bigendian 386. */
4297 for (wordP = words + prec - 1; prec--;)
4298 {
4299 md_number_to_chars (litP, (valueT) (*wordP--), sizeof (LITTLENUM_TYPE));
4300 litP += sizeof (LITTLENUM_TYPE);
4301 }
4302 return 0;
4303}
4304\f
4305char output_invalid_buf[8];
4306
252b5132
RH
4307static char *
4308output_invalid (c)
4309 int c;
4310{
4311 if (isprint (c))
4312 sprintf (output_invalid_buf, "'%c'", c);
4313 else
4314 sprintf (output_invalid_buf, "(0x%x)", (unsigned) c);
4315 return output_invalid_buf;
4316}
4317
af6bdddf 4318/* REG_STRING starts *before* REGISTER_PREFIX. */
252b5132
RH
4319
4320static const reg_entry *
4321parse_register (reg_string, end_op)
4322 char *reg_string;
4323 char **end_op;
4324{
af6bdddf
AM
4325 char *s = reg_string;
4326 char *p;
252b5132
RH
4327 char reg_name_given[MAX_REG_NAME_SIZE + 1];
4328 const reg_entry *r;
4329
4330 /* Skip possible REGISTER_PREFIX and possible whitespace. */
4331 if (*s == REGISTER_PREFIX)
4332 ++s;
4333
4334 if (is_space_char (*s))
4335 ++s;
4336
4337 p = reg_name_given;
af6bdddf 4338 while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
252b5132
RH
4339 {
4340 if (p >= reg_name_given + MAX_REG_NAME_SIZE)
af6bdddf
AM
4341 return (const reg_entry *) NULL;
4342 s++;
252b5132
RH
4343 }
4344
6588847e
DN
4345 /* For naked regs, make sure that we are not dealing with an identifier.
4346 This prevents confusing an identifier like `eax_var' with register
4347 `eax'. */
4348 if (allow_naked_reg && identifier_chars[(unsigned char) *s])
4349 return (const reg_entry *) NULL;
4350
af6bdddf 4351 *end_op = s;
252b5132
RH
4352
4353 r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
4354
5f47d35b 4355 /* Handle floating point regs, allowing spaces in the (i) part. */
47926f60 4356 if (r == i386_regtab /* %st is first entry of table */)
5f47d35b 4357 {
5f47d35b
AM
4358 if (is_space_char (*s))
4359 ++s;
4360 if (*s == '(')
4361 {
af6bdddf 4362 ++s;
5f47d35b
AM
4363 if (is_space_char (*s))
4364 ++s;
4365 if (*s >= '0' && *s <= '7')
4366 {
4367 r = &i386_float_regtab[*s - '0'];
af6bdddf 4368 ++s;
5f47d35b
AM
4369 if (is_space_char (*s))
4370 ++s;
4371 if (*s == ')')
4372 {
4373 *end_op = s + 1;
4374 return r;
4375 }
5f47d35b 4376 }
47926f60 4377 /* We have "%st(" then garbage. */
5f47d35b
AM
4378 return (const reg_entry *) NULL;
4379 }
4380 }
4381
252b5132
RH
4382 return r;
4383}
4384\f
4cc782b5 4385#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
65172ab8 4386const char *md_shortopts = "kVQ:sq";
252b5132 4387#else
65172ab8 4388const char *md_shortopts = "q";
252b5132 4389#endif
6e0b89ee 4390
252b5132 4391struct option md_longopts[] = {
3e73aa7c
JH
4392#define OPTION_32 (OPTION_MD_BASE + 0)
4393 {"32", no_argument, NULL, OPTION_32},
6e0b89ee 4394#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
3e73aa7c
JH
4395#define OPTION_64 (OPTION_MD_BASE + 1)
4396 {"64", no_argument, NULL, OPTION_64},
6e0b89ee 4397#endif
252b5132
RH
4398 {NULL, no_argument, NULL, 0}
4399};
4400size_t md_longopts_size = sizeof (md_longopts);
4401
4402int
4403md_parse_option (c, arg)
4404 int c;
ab9da554 4405 char *arg ATTRIBUTE_UNUSED;
252b5132
RH
4406{
4407 switch (c)
4408 {
a38cf1db
AM
4409 case 'q':
4410 quiet_warnings = 1;
252b5132
RH
4411 break;
4412
4413#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
a38cf1db
AM
4414 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
4415 should be emitted or not. FIXME: Not implemented. */
4416 case 'Q':
252b5132
RH
4417 break;
4418
4419 /* -V: SVR4 argument to print version ID. */
4420 case 'V':
4421 print_version_id ();
4422 break;
4423
a38cf1db
AM
4424 /* -k: Ignore for FreeBSD compatibility. */
4425 case 'k':
252b5132 4426 break;
4cc782b5
ILT
4427
4428 case 's':
4429 /* -s: On i386 Solaris, this tells the native assembler to use
4430 .stab instead of .stab.excl. We always use .stab anyhow. */
4431 break;
6e0b89ee 4432
3e73aa7c
JH
4433 case OPTION_64:
4434 {
4435 const char **list, **l;
4436
3e73aa7c
JH
4437 list = bfd_target_list ();
4438 for (l = list; *l != NULL; l++)
6e0b89ee
AM
4439 if (strcmp (*l, "elf64-x86-64") == 0)
4440 {
4441 default_arch = "x86_64";
4442 break;
4443 }
3e73aa7c 4444 if (*l == NULL)
6e0b89ee 4445 as_fatal (_("No compiled in support for x86_64"));
3e73aa7c
JH
4446 free (list);
4447 }
4448 break;
4449#endif
252b5132 4450
6e0b89ee
AM
4451 case OPTION_32:
4452 default_arch = "i386";
4453 break;
4454
252b5132
RH
4455 default:
4456 return 0;
4457 }
4458 return 1;
4459}
4460
4461void
4462md_show_usage (stream)
4463 FILE *stream;
4464{
4cc782b5
ILT
4465#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4466 fprintf (stream, _("\
a38cf1db
AM
4467 -Q ignored\n\
4468 -V print assembler version number\n\
4469 -k ignored\n\
4470 -q quieten some warnings\n\
4471 -s ignored\n"));
4472#else
4473 fprintf (stream, _("\
4474 -q quieten some warnings\n"));
4cc782b5 4475#endif
252b5132
RH
4476}
4477
4478#ifdef BFD_ASSEMBLER
3e73aa7c
JH
4479#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
4480 || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
252b5132
RH
4481
4482/* Pick the target format to use. */
4483
47926f60 4484const char *
252b5132
RH
4485i386_target_format ()
4486{
3e73aa7c
JH
4487 if (!strcmp (default_arch, "x86_64"))
4488 set_code_flag (CODE_64BIT);
4489 else if (!strcmp (default_arch, "i386"))
4490 set_code_flag (CODE_32BIT);
4491 else
4492 as_fatal (_("Unknown architecture"));
252b5132
RH
4493 switch (OUTPUT_FLAVOR)
4494 {
4c63da97
AM
4495#ifdef OBJ_MAYBE_AOUT
4496 case bfd_target_aout_flavour:
47926f60 4497 return AOUT_TARGET_FORMAT;
4c63da97
AM
4498#endif
4499#ifdef OBJ_MAYBE_COFF
252b5132
RH
4500 case bfd_target_coff_flavour:
4501 return "coff-i386";
4c63da97 4502#endif
3e73aa7c 4503#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
252b5132 4504 case bfd_target_elf_flavour:
3e73aa7c 4505 {
e5cb08ac
KH
4506 if (flag_code == CODE_64BIT)
4507 use_rela_relocations = 1;
4508 return flag_code == CODE_64BIT ? "elf64-x86-64" : "elf32-i386";
3e73aa7c 4509 }
4c63da97 4510#endif
252b5132
RH
4511 default:
4512 abort ();
4513 return NULL;
4514 }
4515}
4516
47926f60
KH
4517#endif /* OBJ_MAYBE_ more than one */
4518#endif /* BFD_ASSEMBLER */
252b5132 4519\f
252b5132
RH
4520symbolS *
4521md_undefined_symbol (name)
4522 char *name;
4523{
18dc2407
ILT
4524 if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
4525 && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
4526 && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
4527 && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
24eab124
AM
4528 {
4529 if (!GOT_symbol)
4530 {
4531 if (symbol_find (name))
4532 as_bad (_("GOT already in symbol table"));
4533 GOT_symbol = symbol_new (name, undefined_section,
4534 (valueT) 0, &zero_address_frag);
4535 };
4536 return GOT_symbol;
4537 }
252b5132
RH
4538 return 0;
4539}
4540
4541/* Round up a section size to the appropriate boundary. */
47926f60 4542
252b5132
RH
4543valueT
4544md_section_align (segment, size)
ab9da554 4545 segT segment ATTRIBUTE_UNUSED;
252b5132
RH
4546 valueT size;
4547{
252b5132 4548#ifdef BFD_ASSEMBLER
4c63da97
AM
4549#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
4550 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
4551 {
4552 /* For a.out, force the section size to be aligned. If we don't do
4553 this, BFD will align it for us, but it will not write out the
4554 final bytes of the section. This may be a bug in BFD, but it is
4555 easier to fix it here since that is how the other a.out targets
4556 work. */
4557 int align;
4558
4559 align = bfd_get_section_alignment (stdoutput, segment);
4560 size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
4561 }
252b5132
RH
4562#endif
4563#endif
4564
4565 return size;
4566}
4567
4568/* On the i386, PC-relative offsets are relative to the start of the
4569 next instruction. That is, the address of the offset, plus its
4570 size, since the offset is always the last part of the insn. */
4571
4572long
4573md_pcrel_from (fixP)
4574 fixS *fixP;
4575{
4576 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
4577}
4578
4579#ifndef I386COFF
4580
4581static void
4582s_bss (ignore)
ab9da554 4583 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
4584{
4585 register int temp;
4586
4587 temp = get_absolute_expression ();
4588 subseg_set (bss_section, (subsegT) temp);
4589 demand_empty_rest_of_line ();
4590}
4591
4592#endif
4593
252b5132
RH
4594#ifdef BFD_ASSEMBLER
4595
4596void
4597i386_validate_fix (fixp)
4598 fixS *fixp;
4599{
4600 if (fixp->fx_subsy && fixp->fx_subsy == GOT_symbol)
4601 {
3e73aa7c
JH
4602 /* GOTOFF relocation are nonsense in 64bit mode. */
4603 if (flag_code == CODE_64BIT)
bfb32b52 4604 abort ();
252b5132
RH
4605 fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
4606 fixp->fx_subsy = 0;
4607 }
4608}
4609
252b5132
RH
4610arelent *
4611tc_gen_reloc (section, fixp)
ab9da554 4612 asection *section ATTRIBUTE_UNUSED;
252b5132
RH
4613 fixS *fixp;
4614{
4615 arelent *rel;
4616 bfd_reloc_code_real_type code;
4617
4618 switch (fixp->fx_r_type)
4619 {
3e73aa7c
JH
4620 case BFD_RELOC_X86_64_PLT32:
4621 case BFD_RELOC_X86_64_GOT32:
4622 case BFD_RELOC_X86_64_GOTPCREL:
252b5132
RH
4623 case BFD_RELOC_386_PLT32:
4624 case BFD_RELOC_386_GOT32:
4625 case BFD_RELOC_386_GOTOFF:
4626 case BFD_RELOC_386_GOTPC:
3e73aa7c 4627 case BFD_RELOC_X86_64_32S:
252b5132
RH
4628 case BFD_RELOC_RVA:
4629 case BFD_RELOC_VTABLE_ENTRY:
4630 case BFD_RELOC_VTABLE_INHERIT:
4631 code = fixp->fx_r_type;
4632 break;
4633 default:
93382f6d 4634 if (fixp->fx_pcrel)
252b5132 4635 {
93382f6d
AM
4636 switch (fixp->fx_size)
4637 {
4638 default:
d0b47220 4639 as_bad (_("can not do %d byte pc-relative relocation"),
93382f6d
AM
4640 fixp->fx_size);
4641 code = BFD_RELOC_32_PCREL;
4642 break;
4643 case 1: code = BFD_RELOC_8_PCREL; break;
4644 case 2: code = BFD_RELOC_16_PCREL; break;
4645 case 4: code = BFD_RELOC_32_PCREL; break;
4646 }
4647 }
4648 else
4649 {
4650 switch (fixp->fx_size)
4651 {
4652 default:
d0b47220 4653 as_bad (_("can not do %d byte relocation"), fixp->fx_size);
93382f6d
AM
4654 code = BFD_RELOC_32;
4655 break;
4656 case 1: code = BFD_RELOC_8; break;
4657 case 2: code = BFD_RELOC_16; break;
4658 case 4: code = BFD_RELOC_32; break;
3e73aa7c 4659 case 8: code = BFD_RELOC_64; break;
93382f6d 4660 }
252b5132
RH
4661 }
4662 break;
4663 }
252b5132
RH
4664
4665 if (code == BFD_RELOC_32
4666 && GOT_symbol
4667 && fixp->fx_addsy == GOT_symbol)
3e73aa7c
JH
4668 {
4669 /* We don't support GOTPC on 64bit targets. */
4670 if (flag_code == CODE_64BIT)
bfb32b52 4671 abort ();
3e73aa7c
JH
4672 code = BFD_RELOC_386_GOTPC;
4673 }
252b5132
RH
4674
4675 rel = (arelent *) xmalloc (sizeof (arelent));
49309057
ILT
4676 rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
4677 *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
4678
4679 rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
3e73aa7c
JH
4680 if (!use_rela_relocations)
4681 {
4682 /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
4683 vtable entry to be used in the relocation's section offset. */
4684 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
4685 rel->address = fixp->fx_offset;
252b5132 4686
3e73aa7c
JH
4687 if (fixp->fx_pcrel)
4688 rel->addend = fixp->fx_addnumber;
4689 else
4690 rel->addend = 0;
4691 }
4692 /* Use the rela in 64bit mode. */
252b5132 4693 else
3e73aa7c
JH
4694 {
4695 rel->addend = fixp->fx_offset;
4696#ifdef OBJ_ELF
4697 /* Ohhh, this is ugly. The problem is that if this is a local global
4698 symbol, the relocation will entirely be performed at link time, not
4699 at assembly time. bfd_perform_reloc doesn't know about this sort
4700 of thing, and as a result we need to fake it out here. */
4701 if ((S_IS_EXTERN (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy))
e5cb08ac 4702 && !S_IS_COMMON (fixp->fx_addsy))
3e73aa7c
JH
4703 rel->addend -= symbol_get_bfdsym (fixp->fx_addsy)->value;
4704#endif
4705 if (fixp->fx_pcrel)
4706 rel->addend -= fixp->fx_size;
4707 }
4708
252b5132
RH
4709 rel->howto = bfd_reloc_type_lookup (stdoutput, code);
4710 if (rel->howto == NULL)
4711 {
4712 as_bad_where (fixp->fx_file, fixp->fx_line,
d0b47220 4713 _("cannot represent relocation type %s"),
252b5132
RH
4714 bfd_get_reloc_code_name (code));
4715 /* Set howto to a garbage value so that we can keep going. */
4716 rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
4717 assert (rel->howto != NULL);
4718 }
4719
4720 return rel;
4721}
4722
47926f60 4723#else /* ! BFD_ASSEMBLER */
252b5132
RH
4724
4725#if (defined(OBJ_AOUT) | defined(OBJ_BOUT))
4726void
4727tc_aout_fix_to_chars (where, fixP, segment_address_in_file)
4728 char *where;
4729 fixS *fixP;
4730 relax_addressT segment_address_in_file;
4731{
47926f60
KH
4732 /* In: length of relocation (or of address) in chars: 1, 2 or 4.
4733 Out: GNU LD relocation length code: 0, 1, or 2. */
252b5132 4734
47926f60 4735 static const unsigned char nbytes_r_length[] = { 42, 0, 1, 42, 2 };
252b5132
RH
4736 long r_symbolnum;
4737
4738 know (fixP->fx_addsy != NULL);
4739
4740 md_number_to_chars (where,
4741 (valueT) (fixP->fx_frag->fr_address
4742 + fixP->fx_where - segment_address_in_file),
4743 4);
4744
4745 r_symbolnum = (S_IS_DEFINED (fixP->fx_addsy)
4746 ? S_GET_TYPE (fixP->fx_addsy)
4747 : fixP->fx_addsy->sy_number);
4748
4749 where[6] = (r_symbolnum >> 16) & 0x0ff;
4750 where[5] = (r_symbolnum >> 8) & 0x0ff;
4751 where[4] = r_symbolnum & 0x0ff;
4752 where[7] = ((((!S_IS_DEFINED (fixP->fx_addsy)) << 3) & 0x08)
4753 | ((nbytes_r_length[fixP->fx_size] << 1) & 0x06)
4754 | (((fixP->fx_pcrel << 0) & 0x01) & 0x0f));
4755}
4756
47926f60 4757#endif /* OBJ_AOUT or OBJ_BOUT. */
252b5132
RH
4758
4759#if defined (I386COFF)
4760
4761short
4762tc_coff_fix2rtype (fixP)
4763 fixS *fixP;
4764{
4765 if (fixP->fx_r_type == R_IMAGEBASE)
4766 return R_IMAGEBASE;
4767
4768 return (fixP->fx_pcrel ?
4769 (fixP->fx_size == 1 ? R_PCRBYTE :
4770 fixP->fx_size == 2 ? R_PCRWORD :
4771 R_PCRLONG) :
4772 (fixP->fx_size == 1 ? R_RELBYTE :
4773 fixP->fx_size == 2 ? R_RELWORD :
4774 R_DIR32));
4775}
4776
4777int
4778tc_coff_sizemachdep (frag)
4779 fragS *frag;
4780{
4781 if (frag->fr_next)
4782 return (frag->fr_next->fr_address - frag->fr_address);
4783 else
4784 return 0;
4785}
4786
47926f60 4787#endif /* I386COFF */
252b5132 4788
47926f60 4789#endif /* ! BFD_ASSEMBLER */
64a0c779
DN
4790\f
4791/* Parse operands using Intel syntax. This implements a recursive descent
4792 parser based on the BNF grammar published in Appendix B of the MASM 6.1
4793 Programmer's Guide.
4794
4795 FIXME: We do not recognize the full operand grammar defined in the MASM
4796 documentation. In particular, all the structure/union and
4797 high-level macro operands are missing.
4798
4799 Uppercase words are terminals, lower case words are non-terminals.
4800 Objects surrounded by double brackets '[[' ']]' are optional. Vertical
4801 bars '|' denote choices. Most grammar productions are implemented in
4802 functions called 'intel_<production>'.
4803
4804 Initial production is 'expr'.
4805
64a0c779
DN
4806 addOp + | -
4807
4808 alpha [a-zA-Z]
4809
4810 byteRegister AL | AH | BL | BH | CL | CH | DL | DH
4811
4812 constant digits [[ radixOverride ]]
4813
4814 dataType BYTE | WORD | DWORD | QWORD | XWORD
4815
4816 digits decdigit
b77a7acd
AJ
4817 | digits decdigit
4818 | digits hexdigit
64a0c779
DN
4819
4820 decdigit [0-9]
4821
4822 e05 e05 addOp e06
b77a7acd 4823 | e06
64a0c779
DN
4824
4825 e06 e06 mulOp e09
b77a7acd 4826 | e09
64a0c779
DN
4827
4828 e09 OFFSET e10
4829 | e09 PTR e10
4830 | e09 : e10
4831 | e10
4832
4833 e10 e10 [ expr ]
b77a7acd 4834 | e11
64a0c779
DN
4835
4836 e11 ( expr )
b77a7acd 4837 | [ expr ]
64a0c779
DN
4838 | constant
4839 | dataType
4840 | id
4841 | $
4842 | register
4843
4844 => expr SHORT e05
b77a7acd 4845 | e05
64a0c779
DN
4846
4847 gpRegister AX | EAX | BX | EBX | CX | ECX | DX | EDX
b77a7acd 4848 | BP | EBP | SP | ESP | DI | EDI | SI | ESI
64a0c779
DN
4849
4850 hexdigit a | b | c | d | e | f
b77a7acd 4851 | A | B | C | D | E | F
64a0c779
DN
4852
4853 id alpha
b77a7acd 4854 | id alpha
64a0c779
DN
4855 | id decdigit
4856
4857 mulOp * | / | MOD
4858
4859 quote " | '
4860
4861 register specialRegister
b77a7acd 4862 | gpRegister
64a0c779
DN
4863 | byteRegister
4864
4865 segmentRegister CS | DS | ES | FS | GS | SS
4866
4867 specialRegister CR0 | CR2 | CR3
b77a7acd 4868 | DR0 | DR1 | DR2 | DR3 | DR6 | DR7
64a0c779
DN
4869 | TR3 | TR4 | TR5 | TR6 | TR7
4870
64a0c779
DN
4871 We simplify the grammar in obvious places (e.g., register parsing is
4872 done by calling parse_register) and eliminate immediate left recursion
4873 to implement a recursive-descent parser.
4874
4875 expr SHORT e05
b77a7acd 4876 | e05
64a0c779
DN
4877
4878 e05 e06 e05'
4879
4880 e05' addOp e06 e05'
b77a7acd 4881 | Empty
64a0c779
DN
4882
4883 e06 e09 e06'
4884
4885 e06' mulOp e09 e06'
b77a7acd 4886 | Empty
64a0c779
DN
4887
4888 e09 OFFSET e10 e09'
b77a7acd 4889 | e10 e09'
64a0c779
DN
4890
4891 e09' PTR e10 e09'
b77a7acd 4892 | : e10 e09'
64a0c779
DN
4893 | Empty
4894
4895 e10 e11 e10'
4896
4897 e10' [ expr ] e10'
b77a7acd 4898 | Empty
64a0c779
DN
4899
4900 e11 ( expr )
b77a7acd 4901 | [ expr ]
64a0c779
DN
4902 | BYTE
4903 | WORD
4904 | DWORD
4905 | QWORD
4906 | XWORD
4907 | .
4908 | $
4909 | register
4910 | id
4911 | constant */
4912
4913/* Parsing structure for the intel syntax parser. Used to implement the
4914 semantic actions for the operand grammar. */
4915struct intel_parser_s
4916 {
4917 char *op_string; /* The string being parsed. */
4918 int got_a_float; /* Whether the operand is a float. */
4a1805b1 4919 int op_modifier; /* Operand modifier. */
64a0c779
DN
4920 int is_mem; /* 1 if operand is memory reference. */
4921 const reg_entry *reg; /* Last register reference found. */
4922 char *disp; /* Displacement string being built. */
4923 };
4924
4925static struct intel_parser_s intel_parser;
4926
4927/* Token structure for parsing intel syntax. */
4928struct intel_token
4929 {
4930 int code; /* Token code. */
4931 const reg_entry *reg; /* Register entry for register tokens. */
4932 char *str; /* String representation. */
4933 };
4934
4935static struct intel_token cur_token, prev_token;
4936
50705ef4
AM
4937/* Token codes for the intel parser. Since T_SHORT is already used
4938 by COFF, undefine it first to prevent a warning. */
64a0c779
DN
4939#define T_NIL -1
4940#define T_CONST 1
4941#define T_REG 2
4942#define T_BYTE 3
4943#define T_WORD 4
4944#define T_DWORD 5
4945#define T_QWORD 6
4946#define T_XWORD 7
50705ef4 4947#undef T_SHORT
64a0c779
DN
4948#define T_SHORT 8
4949#define T_OFFSET 9
4950#define T_PTR 10
4951#define T_ID 11
4952
4953/* Prototypes for intel parser functions. */
4954static int intel_match_token PARAMS ((int code));
cce0cbdc
DN
4955static void intel_get_token PARAMS ((void));
4956static void intel_putback_token PARAMS ((void));
4957static int intel_expr PARAMS ((void));
4958static int intel_e05 PARAMS ((void));
4959static int intel_e05_1 PARAMS ((void));
4960static int intel_e06 PARAMS ((void));
4961static int intel_e06_1 PARAMS ((void));
4962static int intel_e09 PARAMS ((void));
4963static int intel_e09_1 PARAMS ((void));
4964static int intel_e10 PARAMS ((void));
4965static int intel_e10_1 PARAMS ((void));
4966static int intel_e11 PARAMS ((void));
64a0c779 4967
64a0c779
DN
4968static int
4969i386_intel_operand (operand_string, got_a_float)
4970 char *operand_string;
4971 int got_a_float;
4972{
4973 int ret;
4974 char *p;
4975
4976 /* Initialize token holders. */
4977 cur_token.code = prev_token.code = T_NIL;
4978 cur_token.reg = prev_token.reg = NULL;
4979 cur_token.str = prev_token.str = NULL;
4980
4981 /* Initialize parser structure. */
e5cb08ac 4982 p = intel_parser.op_string = (char *) malloc (strlen (operand_string) + 1);
64a0c779
DN
4983 if (p == NULL)
4984 abort ();
4985 strcpy (intel_parser.op_string, operand_string);
4986 intel_parser.got_a_float = got_a_float;
4987 intel_parser.op_modifier = -1;
4988 intel_parser.is_mem = 0;
4989 intel_parser.reg = NULL;
e5cb08ac 4990 intel_parser.disp = (char *) malloc (strlen (operand_string) + 1);
64a0c779
DN
4991 if (intel_parser.disp == NULL)
4992 abort ();
4993 intel_parser.disp[0] = '\0';
4994
4995 /* Read the first token and start the parser. */
4996 intel_get_token ();
4997 ret = intel_expr ();
4998
4999 if (ret)
5000 {
5001 /* If we found a memory reference, hand it over to i386_displacement
5002 to fill in the rest of the operand fields. */
5003 if (intel_parser.is_mem)
5004 {
5005 if ((i.mem_operands == 1
5006 && (current_templates->start->opcode_modifier & IsString) == 0)
5007 || i.mem_operands == 2)
5008 {
5009 as_bad (_("too many memory references for '%s'"),
5010 current_templates->start->name);
5011 ret = 0;
5012 }
5013 else
5014 {
5015 char *s = intel_parser.disp;
5016 i.mem_operands++;
5017
5018 /* Add the displacement expression. */
5019 if (*s != '\0')
5020 ret = i386_displacement (s, s + strlen (s))
5021 && i386_index_check (s);
5022 }
5023 }
5024
5025 /* Constant and OFFSET expressions are handled by i386_immediate. */
5026 else if (intel_parser.op_modifier == OFFSET_FLAT
5027 || intel_parser.reg == NULL)
5028 ret = i386_immediate (intel_parser.disp);
5029 }
5030
5031 free (p);
5032 free (intel_parser.disp);
5033
5034 return ret;
5035}
5036
64a0c779 5037/* expr SHORT e05
b77a7acd 5038 | e05 */
64a0c779
DN
5039static int
5040intel_expr ()
5041{
5042 /* expr SHORT e05 */
5043 if (cur_token.code == T_SHORT)
5044 {
5045 intel_parser.op_modifier = SHORT;
5046 intel_match_token (T_SHORT);
5047
5048 return (intel_e05 ());
5049 }
5050
5051 /* expr e05 */
5052 else
5053 return intel_e05 ();
5054}
5055
64a0c779
DN
5056/* e05 e06 e05'
5057
4a1805b1 5058 e05' addOp e06 e05'
64a0c779
DN
5059 | Empty */
5060static int
5061intel_e05 ()
5062{
5063 return (intel_e06 () && intel_e05_1 ());
5064}
5065
5066static int
5067intel_e05_1 ()
5068{
5069 /* e05' addOp e06 e05' */
5070 if (cur_token.code == '+' || cur_token.code == '-')
5071 {
5072 strcat (intel_parser.disp, cur_token.str);
5073 intel_match_token (cur_token.code);
5074
5075 return (intel_e06 () && intel_e05_1 ());
5076 }
5077
5078 /* e05' Empty */
5079 else
5080 return 1;
4a1805b1 5081}
64a0c779
DN
5082
5083/* e06 e09 e06'
5084
5085 e06' mulOp e09 e06'
b77a7acd 5086 | Empty */
64a0c779
DN
5087static int
5088intel_e06 ()
5089{
5090 return (intel_e09 () && intel_e06_1 ());
5091}
5092
5093static int
5094intel_e06_1 ()
5095{
5096 /* e06' mulOp e09 e06' */
5097 if (cur_token.code == '*' || cur_token.code == '/')
5098 {
5099 strcat (intel_parser.disp, cur_token.str);
5100 intel_match_token (cur_token.code);
5101
5102 return (intel_e09 () && intel_e06_1 ());
5103 }
4a1805b1 5104
64a0c779 5105 /* e06' Empty */
4a1805b1 5106 else
64a0c779
DN
5107 return 1;
5108}
5109
64a0c779 5110/* e09 OFFSET e10 e09'
b77a7acd 5111 | e10 e09'
64a0c779
DN
5112
5113 e09' PTR e10 e09'
b77a7acd 5114 | : e10 e09'
64a0c779
DN
5115 | Empty */
5116static int
5117intel_e09 ()
5118{
5119 /* e09 OFFSET e10 e09' */
5120 if (cur_token.code == T_OFFSET)
5121 {
5122 intel_parser.is_mem = 0;
5123 intel_parser.op_modifier = OFFSET_FLAT;
5124 intel_match_token (T_OFFSET);
5125
5126 return (intel_e10 () && intel_e09_1 ());
5127 }
5128
5129 /* e09 e10 e09' */
5130 else
5131 return (intel_e10 () && intel_e09_1 ());
5132}
5133
5134static int
5135intel_e09_1 ()
5136{
5137 /* e09' PTR e10 e09' */
5138 if (cur_token.code == T_PTR)
5139 {
5140 if (prev_token.code == T_BYTE)
5141 i.suffix = BYTE_MNEM_SUFFIX;
5142
5143 else if (prev_token.code == T_WORD)
5144 {
5145 if (intel_parser.got_a_float == 2) /* "fi..." */
5146 i.suffix = SHORT_MNEM_SUFFIX;
5147 else
5148 i.suffix = WORD_MNEM_SUFFIX;
5149 }
5150
5151 else if (prev_token.code == T_DWORD)
5152 {
5153 if (intel_parser.got_a_float == 1) /* "f..." */
5154 i.suffix = SHORT_MNEM_SUFFIX;
5155 else
5156 i.suffix = LONG_MNEM_SUFFIX;
5157 }
5158
5159 else if (prev_token.code == T_QWORD)
f16b83df
JH
5160 {
5161 if (intel_parser.got_a_float == 1) /* "f..." */
5162 i.suffix = LONG_MNEM_SUFFIX;
5163 else
3e73aa7c 5164 i.suffix = QWORD_MNEM_SUFFIX;
f16b83df 5165 }
64a0c779
DN
5166
5167 else if (prev_token.code == T_XWORD)
5168 i.suffix = LONG_DOUBLE_MNEM_SUFFIX;
5169
5170 else
5171 {
5172 as_bad (_("Unknown operand modifier `%s'\n"), prev_token.str);
5173 return 0;
5174 }
5175
5176 intel_match_token (T_PTR);
5177
5178 return (intel_e10 () && intel_e09_1 ());
5179 }
5180
5181 /* e09 : e10 e09' */
5182 else if (cur_token.code == ':')
5183 {
21d6c4af
DN
5184 /* Mark as a memory operand only if it's not already known to be an
5185 offset expression. */
5186 if (intel_parser.op_modifier != OFFSET_FLAT)
5187 intel_parser.is_mem = 1;
64a0c779
DN
5188
5189 return (intel_match_token (':') && intel_e10 () && intel_e09_1 ());
5190 }
5191
5192 /* e09' Empty */
5193 else
5194 return 1;
5195}
5196
5197/* e10 e11 e10'
5198
5199 e10' [ expr ] e10'
b77a7acd 5200 | Empty */
64a0c779
DN
5201static int
5202intel_e10 ()
5203{
5204 return (intel_e11 () && intel_e10_1 ());
5205}
5206
5207static int
5208intel_e10_1 ()
5209{
5210 /* e10' [ expr ] e10' */
5211 if (cur_token.code == '[')
5212 {
5213 intel_match_token ('[');
21d6c4af
DN
5214
5215 /* Mark as a memory operand only if it's not already known to be an
5216 offset expression. If it's an offset expression, we need to keep
5217 the brace in. */
5218 if (intel_parser.op_modifier != OFFSET_FLAT)
5219 intel_parser.is_mem = 1;
5220 else
5221 strcat (intel_parser.disp, "[");
4a1805b1 5222
64a0c779 5223 /* Add a '+' to the displacement string if necessary. */
21d6c4af
DN
5224 if (*intel_parser.disp != '\0'
5225 && *(intel_parser.disp + strlen (intel_parser.disp) - 1) != '+')
64a0c779
DN
5226 strcat (intel_parser.disp, "+");
5227
21d6c4af
DN
5228 if (intel_expr () && intel_match_token (']'))
5229 {
5230 /* Preserve brackets when the operand is an offset expression. */
5231 if (intel_parser.op_modifier == OFFSET_FLAT)
5232 strcat (intel_parser.disp, "]");
5233
5234 return intel_e10_1 ();
5235 }
5236 else
5237 return 0;
64a0c779
DN
5238 }
5239
5240 /* e10' Empty */
5241 else
5242 return 1;
5243}
5244
64a0c779 5245/* e11 ( expr )
b77a7acd 5246 | [ expr ]
64a0c779
DN
5247 | BYTE
5248 | WORD
5249 | DWORD
5250 | QWORD
5251 | XWORD
4a1805b1 5252 | $
64a0c779
DN
5253 | .
5254 | register
5255 | id
5256 | constant */
5257static int
5258intel_e11 ()
5259{
5260 /* e11 ( expr ) */
5261 if (cur_token.code == '(')
5262 {
5263 intel_match_token ('(');
5264 strcat (intel_parser.disp, "(");
5265
5266 if (intel_expr () && intel_match_token (')'))
e5cb08ac
KH
5267 {
5268 strcat (intel_parser.disp, ")");
5269 return 1;
5270 }
64a0c779
DN
5271 else
5272 return 0;
5273 }
5274
5275 /* e11 [ expr ] */
5276 else if (cur_token.code == '[')
5277 {
5278 intel_match_token ('[');
21d6c4af
DN
5279
5280 /* Mark as a memory operand only if it's not already known to be an
5281 offset expression. If it's an offset expression, we need to keep
5282 the brace in. */
5283 if (intel_parser.op_modifier != OFFSET_FLAT)
5284 intel_parser.is_mem = 1;
5285 else
5286 strcat (intel_parser.disp, "[");
4a1805b1 5287
64a0c779
DN
5288 /* Operands for jump/call inside brackets denote absolute addresses. */
5289 if (current_templates->start->opcode_modifier & Jump
5290 || current_templates->start->opcode_modifier & JumpDword
5291 || current_templates->start->opcode_modifier & JumpByte
5292 || current_templates->start->opcode_modifier & JumpInterSegment)
5293 i.types[this_operand] |= JumpAbsolute;
5294
5295 /* Add a '+' to the displacement string if necessary. */
21d6c4af
DN
5296 if (*intel_parser.disp != '\0'
5297 && *(intel_parser.disp + strlen (intel_parser.disp) - 1) != '+')
64a0c779
DN
5298 strcat (intel_parser.disp, "+");
5299
21d6c4af
DN
5300 if (intel_expr () && intel_match_token (']'))
5301 {
5302 /* Preserve brackets when the operand is an offset expression. */
5303 if (intel_parser.op_modifier == OFFSET_FLAT)
5304 strcat (intel_parser.disp, "]");
5305
5306 return 1;
5307 }
5308 else
5309 return 0;
64a0c779
DN
5310 }
5311
4a1805b1 5312 /* e11 BYTE
64a0c779
DN
5313 | WORD
5314 | DWORD
5315 | QWORD
5316 | XWORD */
5317 else if (cur_token.code == T_BYTE
5318 || cur_token.code == T_WORD
5319 || cur_token.code == T_DWORD
5320 || cur_token.code == T_QWORD
5321 || cur_token.code == T_XWORD)
5322 {
5323 intel_match_token (cur_token.code);
5324
5325 return 1;
5326 }
5327
5328 /* e11 $
5329 | . */
5330 else if (cur_token.code == '$' || cur_token.code == '.')
5331 {
5332 strcat (intel_parser.disp, cur_token.str);
5333 intel_match_token (cur_token.code);
21d6c4af
DN
5334
5335 /* Mark as a memory operand only if it's not already known to be an
5336 offset expression. */
5337 if (intel_parser.op_modifier != OFFSET_FLAT)
5338 intel_parser.is_mem = 1;
64a0c779
DN
5339
5340 return 1;
5341 }
5342
5343 /* e11 register */
5344 else if (cur_token.code == T_REG)
5345 {
5346 const reg_entry *reg = intel_parser.reg = cur_token.reg;
5347
5348 intel_match_token (T_REG);
5349
5350 /* Check for segment change. */
5351 if (cur_token.code == ':')
5352 {
5353 if (reg->reg_type & (SReg2 | SReg3))
5354 {
5355 switch (reg->reg_num)
5356 {
5357 case 0:
5358 i.seg[i.mem_operands] = &es;
5359 break;
5360 case 1:
5361 i.seg[i.mem_operands] = &cs;
5362 break;
5363 case 2:
5364 i.seg[i.mem_operands] = &ss;
5365 break;
5366 case 3:
5367 i.seg[i.mem_operands] = &ds;
5368 break;
5369 case 4:
5370 i.seg[i.mem_operands] = &fs;
5371 break;
5372 case 5:
5373 i.seg[i.mem_operands] = &gs;
5374 break;
5375 }
5376 }
5377 else
5378 {
5379 as_bad (_("`%s' is not a valid segment register"), reg->reg_name);
5380 return 0;
5381 }
5382 }
5383
5384 /* Not a segment register. Check for register scaling. */
5385 else if (cur_token.code == '*')
5386 {
5387 if (!intel_parser.is_mem)
5388 {
5389 as_bad (_("Register scaling only allowed in memory operands."));
5390 return 0;
5391 }
5392
4a1805b1 5393 /* What follows must be a valid scale. */
64a0c779
DN
5394 if (intel_match_token ('*')
5395 && strchr ("01248", *cur_token.str))
5396 {
5397 i.index_reg = reg;
5398 i.types[this_operand] |= BaseIndex;
5399
5400 /* Set the scale after setting the register (otherwise,
5401 i386_scale will complain) */
5402 i386_scale (cur_token.str);
5403 intel_match_token (T_CONST);
5404 }
5405 else
5406 {
5407 as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
5408 cur_token.str);
5409 return 0;
5410 }
5411 }
5412
5413 /* No scaling. If this is a memory operand, the register is either a
5414 base register (first occurrence) or an index register (second
5415 occurrence). */
5416 else if (intel_parser.is_mem && !(reg->reg_type & (SReg2 | SReg3)))
5417 {
5418 if (i.base_reg && i.index_reg)
5419 {
5420 as_bad (_("Too many register references in memory operand.\n"));
5421 return 0;
5422 }
5423
5424 if (i.base_reg == NULL)
5425 i.base_reg = reg;
5426 else
5427 i.index_reg = reg;
5428
5429 i.types[this_operand] |= BaseIndex;
5430 }
5431
5432 /* Offset modifier. Add the register to the displacement string to be
5433 parsed as an immediate expression after we're done. */
5434 else if (intel_parser.op_modifier == OFFSET_FLAT)
5435 strcat (intel_parser.disp, reg->reg_name);
4a1805b1 5436
64a0c779
DN
5437 /* It's neither base nor index nor offset. */
5438 else
5439 {
5440 i.types[this_operand] |= reg->reg_type & ~BaseIndex;
5441 i.op[this_operand].regs = reg;
5442 i.reg_operands++;
5443 }
5444
5445 /* Since registers are not part of the displacement string (except
5446 when we're parsing offset operands), we may need to remove any
5447 preceding '+' from the displacement string. */
5448 if (*intel_parser.disp != '\0'
5449 && intel_parser.op_modifier != OFFSET_FLAT)
5450 {
5451 char *s = intel_parser.disp;
5452 s += strlen (s) - 1;
5453 if (*s == '+')
5454 *s = '\0';
5455 }
5456
5457 return 1;
5458 }
4a1805b1 5459
64a0c779
DN
5460 /* e11 id */
5461 else if (cur_token.code == T_ID)
5462 {
5463 /* Add the identifier to the displacement string. */
5464 strcat (intel_parser.disp, cur_token.str);
5465 intel_match_token (T_ID);
5466
5467 /* The identifier represents a memory reference only if it's not
5468 preceded by an offset modifier. */
21d6c4af 5469 if (intel_parser.op_modifier != OFFSET_FLAT)
64a0c779
DN
5470 intel_parser.is_mem = 1;
5471
5472 return 1;
5473 }
5474
5475 /* e11 constant */
5476 else if (cur_token.code == T_CONST
e5cb08ac 5477 || cur_token.code == '-'
64a0c779
DN
5478 || cur_token.code == '+')
5479 {
5480 char *save_str;
5481
5482 /* Allow constants that start with `+' or `-'. */
5483 if (cur_token.code == '-' || cur_token.code == '+')
5484 {
5485 strcat (intel_parser.disp, cur_token.str);
5486 intel_match_token (cur_token.code);
5487 if (cur_token.code != T_CONST)
5488 {
5489 as_bad (_("Syntax error. Expecting a constant. Got `%s'.\n"),
5490 cur_token.str);
5491 return 0;
5492 }
5493 }
5494
e5cb08ac 5495 save_str = (char *) malloc (strlen (cur_token.str) + 1);
64a0c779 5496 if (save_str == NULL)
bc805888 5497 abort ();
64a0c779
DN
5498 strcpy (save_str, cur_token.str);
5499
5500 /* Get the next token to check for register scaling. */
5501 intel_match_token (cur_token.code);
5502
5503 /* Check if this constant is a scaling factor for an index register. */
5504 if (cur_token.code == '*')
5505 {
5506 if (intel_match_token ('*') && cur_token.code == T_REG)
5507 {
5508 if (!intel_parser.is_mem)
5509 {
5510 as_bad (_("Register scaling only allowed in memory operands."));
5511 return 0;
5512 }
5513
4a1805b1 5514 /* The constant is followed by `* reg', so it must be
64a0c779
DN
5515 a valid scale. */
5516 if (strchr ("01248", *save_str))
5517 {
5518 i.index_reg = cur_token.reg;
5519 i.types[this_operand] |= BaseIndex;
5520
5521 /* Set the scale after setting the register (otherwise,
5522 i386_scale will complain) */
5523 i386_scale (save_str);
5524 intel_match_token (T_REG);
5525
5526 /* Since registers are not part of the displacement
5527 string, we may need to remove any preceding '+' from
5528 the displacement string. */
5529 if (*intel_parser.disp != '\0')
5530 {
5531 char *s = intel_parser.disp;
5532 s += strlen (s) - 1;
5533 if (*s == '+')
5534 *s = '\0';
5535 }
5536
5537 free (save_str);
5538
5539 return 1;
5540 }
5541 else
5542 return 0;
5543 }
5544
5545 /* The constant was not used for register scaling. Since we have
5546 already consumed the token following `*' we now need to put it
5547 back in the stream. */
5548 else
5549 intel_putback_token ();
5550 }
5551
5552 /* Add the constant to the displacement string. */
5553 strcat (intel_parser.disp, save_str);
5554 free (save_str);
5555
5556 return 1;
5557 }
5558
64a0c779
DN
5559 as_bad (_("Unrecognized token '%s'"), cur_token.str);
5560 return 0;
5561}
5562
64a0c779
DN
5563/* Match the given token against cur_token. If they match, read the next
5564 token from the operand string. */
5565static int
5566intel_match_token (code)
e5cb08ac 5567 int code;
64a0c779
DN
5568{
5569 if (cur_token.code == code)
5570 {
5571 intel_get_token ();
5572 return 1;
5573 }
5574 else
5575 {
5576 as_bad (_("Unexpected token `%s'\n"), cur_token.str);
5577 return 0;
5578 }
5579}
5580
64a0c779
DN
5581/* Read a new token from intel_parser.op_string and store it in cur_token. */
5582static void
5583intel_get_token ()
5584{
5585 char *end_op;
5586 const reg_entry *reg;
5587 struct intel_token new_token;
5588
5589 new_token.code = T_NIL;
5590 new_token.reg = NULL;
5591 new_token.str = NULL;
5592
4a1805b1 5593 /* Free the memory allocated to the previous token and move
64a0c779
DN
5594 cur_token to prev_token. */
5595 if (prev_token.str)
5596 free (prev_token.str);
5597
5598 prev_token = cur_token;
5599
5600 /* Skip whitespace. */
5601 while (is_space_char (*intel_parser.op_string))
5602 intel_parser.op_string++;
5603
5604 /* Return an empty token if we find nothing else on the line. */
5605 if (*intel_parser.op_string == '\0')
5606 {
5607 cur_token = new_token;
5608 return;
5609 }
5610
5611 /* The new token cannot be larger than the remainder of the operand
5612 string. */
e5cb08ac 5613 new_token.str = (char *) malloc (strlen (intel_parser.op_string) + 1);
64a0c779 5614 if (new_token.str == NULL)
bc805888 5615 abort ();
64a0c779
DN
5616 new_token.str[0] = '\0';
5617
5618 if (strchr ("0123456789", *intel_parser.op_string))
5619 {
5620 char *p = new_token.str;
5621 char *q = intel_parser.op_string;
5622 new_token.code = T_CONST;
5623
5624 /* Allow any kind of identifier char to encompass floating point and
5625 hexadecimal numbers. */
5626 while (is_identifier_char (*q))
5627 *p++ = *q++;
5628 *p = '\0';
5629
5630 /* Recognize special symbol names [0-9][bf]. */
5631 if (strlen (intel_parser.op_string) == 2
4a1805b1 5632 && (intel_parser.op_string[1] == 'b'
64a0c779
DN
5633 || intel_parser.op_string[1] == 'f'))
5634 new_token.code = T_ID;
5635 }
5636
5637 else if (strchr ("+-/*:[]()", *intel_parser.op_string))
5638 {
5639 new_token.code = *intel_parser.op_string;
5640 new_token.str[0] = *intel_parser.op_string;
5641 new_token.str[1] = '\0';
5642 }
5643
5644 else if ((*intel_parser.op_string == REGISTER_PREFIX || allow_naked_reg)
5645 && ((reg = parse_register (intel_parser.op_string, &end_op)) != NULL))
5646 {
5647 new_token.code = T_REG;
5648 new_token.reg = reg;
5649
5650 if (*intel_parser.op_string == REGISTER_PREFIX)
5651 {
5652 new_token.str[0] = REGISTER_PREFIX;
5653 new_token.str[1] = '\0';
5654 }
5655
5656 strcat (new_token.str, reg->reg_name);
5657 }
5658
5659 else if (is_identifier_char (*intel_parser.op_string))
5660 {
5661 char *p = new_token.str;
5662 char *q = intel_parser.op_string;
5663
5664 /* A '.' or '$' followed by an identifier char is an identifier.
5665 Otherwise, it's operator '.' followed by an expression. */
5666 if ((*q == '.' || *q == '$') && !is_identifier_char (*(q + 1)))
5667 {
5668 new_token.code = *q;
5669 new_token.str[0] = *q;
5670 new_token.str[1] = '\0';
5671 }
5672 else
5673 {
5674 while (is_identifier_char (*q) || *q == '@')
5675 *p++ = *q++;
5676 *p = '\0';
5677
5678 if (strcasecmp (new_token.str, "BYTE") == 0)
5679 new_token.code = T_BYTE;
5680
5681 else if (strcasecmp (new_token.str, "WORD") == 0)
5682 new_token.code = T_WORD;
5683
5684 else if (strcasecmp (new_token.str, "DWORD") == 0)
5685 new_token.code = T_DWORD;
5686
5687 else if (strcasecmp (new_token.str, "QWORD") == 0)
5688 new_token.code = T_QWORD;
5689
5690 else if (strcasecmp (new_token.str, "XWORD") == 0)
5691 new_token.code = T_XWORD;
5692
5693 else if (strcasecmp (new_token.str, "PTR") == 0)
5694 new_token.code = T_PTR;
5695
5696 else if (strcasecmp (new_token.str, "SHORT") == 0)
5697 new_token.code = T_SHORT;
5698
5699 else if (strcasecmp (new_token.str, "OFFSET") == 0)
5700 {
5701 new_token.code = T_OFFSET;
5702
5703 /* ??? This is not mentioned in the MASM grammar but gcc
5704 makes use of it with -mintel-syntax. OFFSET may be
5705 followed by FLAT: */
5706 if (strncasecmp (q, " FLAT:", 6) == 0)
5707 strcat (new_token.str, " FLAT:");
5708 }
5709
5710 /* ??? This is not mentioned in the MASM grammar. */
5711 else if (strcasecmp (new_token.str, "FLAT") == 0)
5712 new_token.code = T_OFFSET;
5713
5714 else
5715 new_token.code = T_ID;
5716 }
5717 }
5718
5719 else
5720 as_bad (_("Unrecognized token `%s'\n"), intel_parser.op_string);
5721
5722 intel_parser.op_string += strlen (new_token.str);
5723 cur_token = new_token;
5724}
5725
64a0c779
DN
5726/* Put cur_token back into the token stream and make cur_token point to
5727 prev_token. */
5728static void
5729intel_putback_token ()
5730{
5731 intel_parser.op_string -= strlen (cur_token.str);
5732 free (cur_token.str);
5733 cur_token = prev_token;
4a1805b1 5734
64a0c779
DN
5735 /* Forget prev_token. */
5736 prev_token.code = T_NIL;
5737 prev_token.reg = NULL;
5738 prev_token.str = NULL;
5739}
This page took 0.374893 seconds and 4 git commands to generate.