gas/
[external/binutils.git] / gas / config / tc-i386.c
1 /* i386.c -- Assemble code for the Intel 80386
2    Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005
4    Free Software Foundation, Inc.
5
6    This file is part of GAS, the GNU Assembler.
7
8    GAS is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2, or (at your option)
11    any later version.
12
13    GAS is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GAS; see the file COPYING.  If not, write to the Free
20    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21    02110-1301, USA.  */
22
23 /* Intel 80386 machine specific gas.
24    Written by Eliot Dresselhaus (eliot@mgm.mit.edu).
25    x86_64 support by Jan Hubicka (jh@suse.cz)
26    VIA PadLock support by Michal Ludvig (mludvig@suse.cz)
27    Bugs & suggestions are completely welcome.  This is free software.
28    Please help us make it better.  */
29
30 #include "as.h"
31 #include "safe-ctype.h"
32 #include "subsegs.h"
33 #include "dwarf2dbg.h"
34 #include "dw2gencfi.h"
35 #include "opcode/i386.h"
36 #include "elf/x86-64.h"
37
38 #ifndef REGISTER_WARNINGS
39 #define REGISTER_WARNINGS 1
40 #endif
41
42 #ifndef INFER_ADDR_PREFIX
43 #define INFER_ADDR_PREFIX 1
44 #endif
45
46 #ifndef SCALE1_WHEN_NO_INDEX
47 /* Specifying a scale factor besides 1 when there is no index is
48    futile.  eg. `mov (%ebx,2),%al' does exactly the same as
49    `mov (%ebx),%al'.  To slavishly follow what the programmer
50    specified, set SCALE1_WHEN_NO_INDEX to 0.  */
51 #define SCALE1_WHEN_NO_INDEX 1
52 #endif
53
54 #ifndef DEFAULT_ARCH
55 #define DEFAULT_ARCH "i386"
56 #endif
57
58 #ifndef INLINE
59 #if __GNUC__ >= 2
60 #define INLINE __inline__
61 #else
62 #define INLINE
63 #endif
64 #endif
65
66 static INLINE unsigned int mode_from_disp_size PARAMS ((unsigned int));
67 static INLINE int fits_in_signed_byte PARAMS ((offsetT));
68 static INLINE int fits_in_unsigned_byte PARAMS ((offsetT));
69 static INLINE int fits_in_unsigned_word PARAMS ((offsetT));
70 static INLINE int fits_in_signed_word PARAMS ((offsetT));
71 static INLINE int fits_in_unsigned_long PARAMS ((offsetT));
72 static INLINE int fits_in_signed_long PARAMS ((offsetT));
73 static int smallest_imm_type PARAMS ((offsetT));
74 static offsetT offset_in_range PARAMS ((offsetT, int));
75 static int add_prefix PARAMS ((unsigned int));
76 static void set_code_flag PARAMS ((int));
77 static void set_16bit_gcc_code_flag PARAMS ((int));
78 static void set_intel_syntax PARAMS ((int));
79 static void set_cpu_arch PARAMS ((int));
80 #ifdef TE_PE
81 static void pe_directive_secrel PARAMS ((int));
82 #endif
83 static void signed_cons PARAMS ((int));
84 static char *output_invalid PARAMS ((int c));
85 static int i386_operand PARAMS ((char *operand_string));
86 static int i386_intel_operand PARAMS ((char *operand_string, int got_a_float));
87 static const reg_entry *parse_register PARAMS ((char *reg_string,
88                                                 char **end_op));
89 static char *parse_insn PARAMS ((char *, char *));
90 static char *parse_operands PARAMS ((char *, const char *));
91 static void swap_operands PARAMS ((void));
92 static void optimize_imm PARAMS ((void));
93 static void optimize_disp PARAMS ((void));
94 static int match_template PARAMS ((void));
95 static int check_string PARAMS ((void));
96 static int process_suffix PARAMS ((void));
97 static int check_byte_reg PARAMS ((void));
98 static int check_long_reg PARAMS ((void));
99 static int check_qword_reg PARAMS ((void));
100 static int check_word_reg PARAMS ((void));
101 static int finalize_imm PARAMS ((void));
102 static int process_operands PARAMS ((void));
103 static const seg_entry *build_modrm_byte PARAMS ((void));
104 static void output_insn PARAMS ((void));
105 static void output_branch PARAMS ((void));
106 static void output_jump PARAMS ((void));
107 static void output_interseg_jump PARAMS ((void));
108 static void output_imm PARAMS ((fragS *insn_start_frag,
109                                 offsetT insn_start_off));
110 static void output_disp PARAMS ((fragS *insn_start_frag,
111                                  offsetT insn_start_off));
112 #ifndef I386COFF
113 static void s_bss PARAMS ((int));
114 #endif
115 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
116 static void handle_large_common (int small ATTRIBUTE_UNUSED);
117 #endif
118
119 static const char *default_arch = DEFAULT_ARCH;
120
121 /* 'md_assemble ()' gathers together information and puts it into a
122    i386_insn.  */
123
124 union i386_op
125   {
126     expressionS *disps;
127     expressionS *imms;
128     const reg_entry *regs;
129   };
130
131 struct _i386_insn
132   {
133     /* TM holds the template for the insn were currently assembling.  */
134     template tm;
135
136     /* SUFFIX holds the instruction mnemonic suffix if given.
137        (e.g. 'l' for 'movl')  */
138     char suffix;
139
140     /* OPERANDS gives the number of given operands.  */
141     unsigned int operands;
142
143     /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
144        of given register, displacement, memory operands and immediate
145        operands.  */
146     unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
147
148     /* TYPES [i] is the type (see above #defines) which tells us how to
149        use OP[i] for the corresponding operand.  */
150     unsigned int types[MAX_OPERANDS];
151
152     /* Displacement expression, immediate expression, or register for each
153        operand.  */
154     union i386_op op[MAX_OPERANDS];
155
156     /* Flags for operands.  */
157     unsigned int flags[MAX_OPERANDS];
158 #define Operand_PCrel 1
159
160     /* Relocation type for operand */
161     enum bfd_reloc_code_real reloc[MAX_OPERANDS];
162
163     /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
164        the base index byte below.  */
165     const reg_entry *base_reg;
166     const reg_entry *index_reg;
167     unsigned int log2_scale_factor;
168
169     /* SEG gives the seg_entries of this insn.  They are zero unless
170        explicit segment overrides are given.  */
171     const seg_entry *seg[2];
172
173     /* PREFIX holds all the given prefix opcodes (usually null).
174        PREFIXES is the number of prefix opcodes.  */
175     unsigned int prefixes;
176     unsigned char prefix[MAX_PREFIXES];
177
178     /* RM and SIB are the modrm byte and the sib byte where the
179        addressing modes of this insn are encoded.  */
180
181     modrm_byte rm;
182     rex_byte rex;
183     sib_byte sib;
184   };
185
186 typedef struct _i386_insn i386_insn;
187
188 /* List of chars besides those in app.c:symbol_chars that can start an
189    operand.  Used to prevent the scrubber eating vital white-space.  */
190 const char extra_symbol_chars[] = "*%-(["
191 #ifdef LEX_AT
192         "@"
193 #endif
194 #ifdef LEX_QM
195         "?"
196 #endif
197         ;
198
199 #if (defined (TE_I386AIX)                               \
200      || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
201          && !defined (TE_LINUX)                         \
202          && !defined (TE_NETWARE)                       \
203          && !defined (TE_FreeBSD)                       \
204          && !defined (TE_NetBSD)))
205 /* This array holds the chars that always start a comment.  If the
206    pre-processor is disabled, these aren't very useful.  */
207 const char comment_chars[] = "#/";
208 #define PREFIX_SEPARATOR '\\'
209
210 /* This array holds the chars that only start a comment at the beginning of
211    a line.  If the line seems to have the form '# 123 filename'
212    .line and .file directives will appear in the pre-processed output.
213    Note that input_file.c hand checks for '#' at the beginning of the
214    first line of the input file.  This is because the compiler outputs
215    #NO_APP at the beginning of its output.
216    Also note that comments started like this one will always work if
217    '/' isn't otherwise defined.  */
218 const char line_comment_chars[] = "#";
219
220 #else
221 /* Putting '/' here makes it impossible to use the divide operator.
222    However, we need it for compatibility with SVR4 systems.  */
223 const char comment_chars[] = "#";
224 #define PREFIX_SEPARATOR '/'
225
226 const char line_comment_chars[] = "/#";
227 #endif
228
229 const char line_separator_chars[] = ";";
230
231 /* Chars that can be used to separate mant from exp in floating point
232    nums.  */
233 const char EXP_CHARS[] = "eE";
234
235 /* Chars that mean this number is a floating point constant
236    As in 0f12.456
237    or    0d1.2345e12.  */
238 const char FLT_CHARS[] = "fFdDxX";
239
240 /* Tables for lexical analysis.  */
241 static char mnemonic_chars[256];
242 static char register_chars[256];
243 static char operand_chars[256];
244 static char identifier_chars[256];
245 static char digit_chars[256];
246
247 /* Lexical macros.  */
248 #define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
249 #define is_operand_char(x) (operand_chars[(unsigned char) x])
250 #define is_register_char(x) (register_chars[(unsigned char) x])
251 #define is_space_char(x) ((x) == ' ')
252 #define is_identifier_char(x) (identifier_chars[(unsigned char) x])
253 #define is_digit_char(x) (digit_chars[(unsigned char) x])
254
255 /* All non-digit non-letter characters that may occur in an operand.  */
256 static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
257
258 /* md_assemble() always leaves the strings it's passed unaltered.  To
259    effect this we maintain a stack of saved characters that we've smashed
260    with '\0's (indicating end of strings for various sub-fields of the
261    assembler instruction).  */
262 static char save_stack[32];
263 static char *save_stack_p;
264 #define END_STRING_AND_SAVE(s) \
265         do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
266 #define RESTORE_END_STRING(s) \
267         do { *(s) = *--save_stack_p; } while (0)
268
269 /* The instruction we're assembling.  */
270 static i386_insn i;
271
272 /* Possible templates for current insn.  */
273 static const templates *current_templates;
274
275 /* Per instruction expressionS buffers: 2 displacements & 2 immediate max.  */
276 static expressionS disp_expressions[2], im_expressions[2];
277
278 /* Current operand we are working on.  */
279 static int this_operand;
280
281 /* We support four different modes.  FLAG_CODE variable is used to distinguish
282    these.  */
283
284 enum flag_code {
285         CODE_32BIT,
286         CODE_16BIT,
287         CODE_64BIT };
288 #define NUM_FLAG_CODE ((int) CODE_64BIT + 1)
289
290 static enum flag_code flag_code;
291 static unsigned int object_64bit;
292 static int use_rela_relocations = 0;
293
294 /* The names used to print error messages.  */
295 static const char *flag_code_names[] =
296   {
297     "32",
298     "16",
299     "64"
300   };
301
302 /* 1 for intel syntax,
303    0 if att syntax.  */
304 static int intel_syntax = 0;
305
306 /* 1 if register prefix % not required.  */
307 static int allow_naked_reg = 0;
308
309 /* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
310    leave, push, and pop instructions so that gcc has the same stack
311    frame as in 32 bit mode.  */
312 static char stackop_size = '\0';
313
314 /* Non-zero to optimize code alignment.  */
315 int optimize_align_code = 1;
316
317 /* Non-zero to quieten some warnings.  */
318 static int quiet_warnings = 0;
319
320 /* CPU name.  */
321 static const char *cpu_arch_name = NULL;
322 static const char *cpu_sub_arch_name = NULL;
323
324 /* CPU feature flags.  */
325 static unsigned int cpu_arch_flags = CpuUnknownFlags | CpuNo64;
326
327 /* If set, conditional jumps are not automatically promoted to handle
328    larger than a byte offset.  */
329 static unsigned int no_cond_jump_promotion = 0;
330
331 /* Pre-defined "_GLOBAL_OFFSET_TABLE_".  */
332 static symbolS *GOT_symbol;
333
334 /* The dwarf2 return column, adjusted for 32 or 64 bit.  */
335 unsigned int x86_dwarf2_return_column;
336
337 /* The dwarf2 data alignment, adjusted for 32 or 64 bit.  */
338 int x86_cie_data_alignment;
339
340 /* Interface to relax_segment.
341    There are 3 major relax states for 386 jump insns because the
342    different types of jumps add different sizes to frags when we're
343    figuring out what sort of jump to choose to reach a given label.  */
344
345 /* Types.  */
346 #define UNCOND_JUMP 0
347 #define COND_JUMP 1
348 #define COND_JUMP86 2
349
350 /* Sizes.  */
351 #define CODE16  1
352 #define SMALL   0
353 #define SMALL16 (SMALL | CODE16)
354 #define BIG     2
355 #define BIG16   (BIG | CODE16)
356
357 #ifndef INLINE
358 #ifdef __GNUC__
359 #define INLINE __inline__
360 #else
361 #define INLINE
362 #endif
363 #endif
364
365 #define ENCODE_RELAX_STATE(type, size) \
366   ((relax_substateT) (((type) << 2) | (size)))
367 #define TYPE_FROM_RELAX_STATE(s) \
368   ((s) >> 2)
369 #define DISP_SIZE_FROM_RELAX_STATE(s) \
370     ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
371
372 /* This table is used by relax_frag to promote short jumps to long
373    ones where necessary.  SMALL (short) jumps may be promoted to BIG
374    (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long).  We
375    don't allow a short jump in a 32 bit code segment to be promoted to
376    a 16 bit offset jump because it's slower (requires data size
377    prefix), and doesn't work, unless the destination is in the bottom
378    64k of the code segment (The top 16 bits of eip are zeroed).  */
379
380 const relax_typeS md_relax_table[] =
381 {
382   /* The fields are:
383      1) most positive reach of this state,
384      2) most negative reach of this state,
385      3) how many bytes this mode will have in the variable part of the frag
386      4) which index into the table to try if we can't fit into this one.  */
387
388   /* UNCOND_JUMP states.  */
389   {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
390   {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
391   /* dword jmp adds 4 bytes to frag:
392      0 extra opcode bytes, 4 displacement bytes.  */
393   {0, 0, 4, 0},
394   /* word jmp adds 2 byte2 to frag:
395      0 extra opcode bytes, 2 displacement bytes.  */
396   {0, 0, 2, 0},
397
398   /* COND_JUMP states.  */
399   {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
400   {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
401   /* dword conditionals adds 5 bytes to frag:
402      1 extra opcode byte, 4 displacement bytes.  */
403   {0, 0, 5, 0},
404   /* word conditionals add 3 bytes to frag:
405      1 extra opcode byte, 2 displacement bytes.  */
406   {0, 0, 3, 0},
407
408   /* COND_JUMP86 states.  */
409   {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
410   {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
411   /* dword conditionals adds 5 bytes to frag:
412      1 extra opcode byte, 4 displacement bytes.  */
413   {0, 0, 5, 0},
414   /* word conditionals add 4 bytes to frag:
415      1 displacement byte and a 3 byte long branch insn.  */
416   {0, 0, 4, 0}
417 };
418
419 static const arch_entry cpu_arch[] = {
420   {"i8086",     Cpu086 },
421   {"i186",      Cpu086|Cpu186 },
422   {"i286",      Cpu086|Cpu186|Cpu286 },
423   {"i386",      Cpu086|Cpu186|Cpu286|Cpu386 },
424   {"i486",      Cpu086|Cpu186|Cpu286|Cpu386|Cpu486 },
425   {"i586",      Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586 },
426   {"i686",      Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686 },
427   {"pentium",   Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586 },
428   {"pentiumpro",Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686 },
429   {"pentiumii", Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuMMX },
430   {"pentiumiii",Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuMMX|CpuMMX2|CpuSSE },
431   {"pentium4",  Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuP4|CpuMMX|CpuMMX2|CpuSSE|CpuSSE2 },
432   {"prescott",  Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuP4|CpuMMX|CpuMMX2|CpuSSE|CpuSSE2|CpuPNI },
433   {"k6",        Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|CpuK6|CpuMMX },
434   {"k6_2",      Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|CpuK6|CpuMMX|Cpu3dnow },
435   {"athlon",    Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuK6|CpuAthlon|CpuMMX|CpuMMX2|Cpu3dnow|Cpu3dnowA },
436   {"sledgehammer",Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuK6|CpuAthlon|CpuSledgehammer|CpuMMX|CpuMMX2|Cpu3dnow|Cpu3dnowA|CpuSSE|CpuSSE2 },
437   {"opteron",   Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuK6|CpuAthlon|CpuSledgehammer|CpuMMX|CpuMMX2|Cpu3dnow|Cpu3dnowA|CpuSSE|CpuSSE2 },
438   {".mmx",      CpuMMX },
439   {".sse",      CpuMMX|CpuMMX2|CpuSSE },
440   {".sse2",     CpuMMX|CpuMMX2|CpuSSE|CpuSSE2 },
441   {".sse3",     CpuMMX|CpuMMX2|CpuSSE|CpuSSE2|CpuSSE3 },
442   {".3dnow",    CpuMMX|Cpu3dnow },
443   {".3dnowa",   CpuMMX|CpuMMX2|Cpu3dnow|Cpu3dnowA },
444   {".padlock",  CpuPadLock },
445   {".pacifica", CpuSVME },
446   {".svme",     CpuSVME },
447   {NULL, 0 }
448 };
449
450 const pseudo_typeS md_pseudo_table[] =
451 {
452 #if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
453   {"align", s_align_bytes, 0},
454 #else
455   {"align", s_align_ptwo, 0},
456 #endif
457   {"arch", set_cpu_arch, 0},
458 #ifndef I386COFF
459   {"bss", s_bss, 0},
460 #endif
461   {"ffloat", float_cons, 'f'},
462   {"dfloat", float_cons, 'd'},
463   {"tfloat", float_cons, 'x'},
464   {"value", cons, 2},
465   {"slong", signed_cons, 4},
466   {"noopt", s_ignore, 0},
467   {"optim", s_ignore, 0},
468   {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
469   {"code16", set_code_flag, CODE_16BIT},
470   {"code32", set_code_flag, CODE_32BIT},
471   {"code64", set_code_flag, CODE_64BIT},
472   {"intel_syntax", set_intel_syntax, 1},
473   {"att_syntax", set_intel_syntax, 0},
474 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
475   {"largecomm", handle_large_common, 0},
476 #else
477   {"file", (void (*) PARAMS ((int))) dwarf2_directive_file, 0},
478   {"loc", dwarf2_directive_loc, 0},
479   {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
480 #endif
481 #ifdef TE_PE
482   {"secrel32", pe_directive_secrel, 0},
483 #endif
484   {0, 0, 0}
485 };
486
487 /* For interface with expression ().  */
488 extern char *input_line_pointer;
489
490 /* Hash table for instruction mnemonic lookup.  */
491 static struct hash_control *op_hash;
492
493 /* Hash table for register lookup.  */
494 static struct hash_control *reg_hash;
495 \f
496 void
497 i386_align_code (fragP, count)
498      fragS *fragP;
499      int count;
500 {
501   /* Various efficient no-op patterns for aligning code labels.
502      Note: Don't try to assemble the instructions in the comments.
503      0L and 0w are not legal.  */
504   static const char f32_1[] =
505     {0x90};                                     /* nop                  */
506   static const char f32_2[] =
507     {0x89,0xf6};                                /* movl %esi,%esi       */
508   static const char f32_3[] =
509     {0x8d,0x76,0x00};                           /* leal 0(%esi),%esi    */
510   static const char f32_4[] =
511     {0x8d,0x74,0x26,0x00};                      /* leal 0(%esi,1),%esi  */
512   static const char f32_5[] =
513     {0x90,                                      /* nop                  */
514      0x8d,0x74,0x26,0x00};                      /* leal 0(%esi,1),%esi  */
515   static const char f32_6[] =
516     {0x8d,0xb6,0x00,0x00,0x00,0x00};            /* leal 0L(%esi),%esi   */
517   static const char f32_7[] =
518     {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00};       /* leal 0L(%esi,1),%esi */
519   static const char f32_8[] =
520     {0x90,                                      /* nop                  */
521      0x8d,0xb4,0x26,0x00,0x00,0x00,0x00};       /* leal 0L(%esi,1),%esi */
522   static const char f32_9[] =
523     {0x89,0xf6,                                 /* movl %esi,%esi       */
524      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
525   static const char f32_10[] =
526     {0x8d,0x76,0x00,                            /* leal 0(%esi),%esi    */
527      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
528   static const char f32_11[] =
529     {0x8d,0x74,0x26,0x00,                       /* leal 0(%esi,1),%esi  */
530      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
531   static const char f32_12[] =
532     {0x8d,0xb6,0x00,0x00,0x00,0x00,             /* leal 0L(%esi),%esi   */
533      0x8d,0xbf,0x00,0x00,0x00,0x00};            /* leal 0L(%edi),%edi   */
534   static const char f32_13[] =
535     {0x8d,0xb6,0x00,0x00,0x00,0x00,             /* leal 0L(%esi),%esi   */
536      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
537   static const char f32_14[] =
538     {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00,        /* leal 0L(%esi,1),%esi */
539      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
540   static const char f32_15[] =
541     {0xeb,0x0d,0x90,0x90,0x90,0x90,0x90,        /* jmp .+15; lotsa nops */
542      0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90};
543   static const char f16_3[] =
544     {0x8d,0x74,0x00};                           /* lea 0(%esi),%esi     */
545   static const char f16_4[] =
546     {0x8d,0xb4,0x00,0x00};                      /* lea 0w(%si),%si      */
547   static const char f16_5[] =
548     {0x90,                                      /* nop                  */
549      0x8d,0xb4,0x00,0x00};                      /* lea 0w(%si),%si      */
550   static const char f16_6[] =
551     {0x89,0xf6,                                 /* mov %si,%si          */
552      0x8d,0xbd,0x00,0x00};                      /* lea 0w(%di),%di      */
553   static const char f16_7[] =
554     {0x8d,0x74,0x00,                            /* lea 0(%si),%si       */
555      0x8d,0xbd,0x00,0x00};                      /* lea 0w(%di),%di      */
556   static const char f16_8[] =
557     {0x8d,0xb4,0x00,0x00,                       /* lea 0w(%si),%si      */
558      0x8d,0xbd,0x00,0x00};                      /* lea 0w(%di),%di      */
559   static const char *const f32_patt[] = {
560     f32_1, f32_2, f32_3, f32_4, f32_5, f32_6, f32_7, f32_8,
561     f32_9, f32_10, f32_11, f32_12, f32_13, f32_14, f32_15
562   };
563   static const char *const f16_patt[] = {
564     f32_1, f32_2, f16_3, f16_4, f16_5, f16_6, f16_7, f16_8,
565     f32_15, f32_15, f32_15, f32_15, f32_15, f32_15, f32_15
566   };
567
568   if (count <= 0 || count > 15)
569     return;
570
571   /* The recommended way to pad 64bit code is to use NOPs preceded by
572      maximally four 0x66 prefixes.  Balance the size of nops.  */
573   if (flag_code == CODE_64BIT)
574     {
575       int i;
576       int nnops = (count + 3) / 4;
577       int len = count / nnops;
578       int remains = count - nnops * len;
579       int pos = 0;
580
581       for (i = 0; i < remains; i++)
582         {
583           memset (fragP->fr_literal + fragP->fr_fix + pos, 0x66, len);
584           fragP->fr_literal[fragP->fr_fix + pos + len] = 0x90;
585           pos += len + 1;
586         }
587       for (; i < nnops; i++)
588         {
589           memset (fragP->fr_literal + fragP->fr_fix + pos, 0x66, len - 1);
590           fragP->fr_literal[fragP->fr_fix + pos + len - 1] = 0x90;
591           pos += len;
592         }
593     }
594   else
595     if (flag_code == CODE_16BIT)
596       {
597         memcpy (fragP->fr_literal + fragP->fr_fix,
598                 f16_patt[count - 1], count);
599         if (count > 8)
600           /* Adjust jump offset.  */
601           fragP->fr_literal[fragP->fr_fix + 1] = count - 2;
602       }
603     else
604       memcpy (fragP->fr_literal + fragP->fr_fix,
605               f32_patt[count - 1], count);
606   fragP->fr_var = count;
607 }
608
609 static INLINE unsigned int
610 mode_from_disp_size (t)
611      unsigned int t;
612 {
613   return (t & Disp8) ? 1 : (t & (Disp16 | Disp32 | Disp32S)) ? 2 : 0;
614 }
615
616 static INLINE int
617 fits_in_signed_byte (num)
618      offsetT num;
619 {
620   return (num >= -128) && (num <= 127);
621 }
622
623 static INLINE int
624 fits_in_unsigned_byte (num)
625      offsetT num;
626 {
627   return (num & 0xff) == num;
628 }
629
630 static INLINE int
631 fits_in_unsigned_word (num)
632      offsetT num;
633 {
634   return (num & 0xffff) == num;
635 }
636
637 static INLINE int
638 fits_in_signed_word (num)
639      offsetT num;
640 {
641   return (-32768 <= num) && (num <= 32767);
642 }
643 static INLINE int
644 fits_in_signed_long (num)
645      offsetT num ATTRIBUTE_UNUSED;
646 {
647 #ifndef BFD64
648   return 1;
649 #else
650   return (!(((offsetT) -1 << 31) & num)
651           || (((offsetT) -1 << 31) & num) == ((offsetT) -1 << 31));
652 #endif
653 }                               /* fits_in_signed_long() */
654 static INLINE int
655 fits_in_unsigned_long (num)
656      offsetT num ATTRIBUTE_UNUSED;
657 {
658 #ifndef BFD64
659   return 1;
660 #else
661   return (num & (((offsetT) 2 << 31) - 1)) == num;
662 #endif
663 }                               /* fits_in_unsigned_long() */
664
665 static int
666 smallest_imm_type (num)
667      offsetT num;
668 {
669   if (cpu_arch_flags != (Cpu086 | Cpu186 | Cpu286 | Cpu386 | Cpu486 | CpuNo64))
670     {
671       /* This code is disabled on the 486 because all the Imm1 forms
672          in the opcode table are slower on the i486.  They're the
673          versions with the implicitly specified single-position
674          displacement, which has another syntax if you really want to
675          use that form.  */
676       if (num == 1)
677         return Imm1 | Imm8 | Imm8S | Imm16 | Imm32 | Imm32S | Imm64;
678     }
679   return (fits_in_signed_byte (num)
680           ? (Imm8S | Imm8 | Imm16 | Imm32 | Imm32S | Imm64)
681           : fits_in_unsigned_byte (num)
682           ? (Imm8 | Imm16 | Imm32 | Imm32S | Imm64)
683           : (fits_in_signed_word (num) || fits_in_unsigned_word (num))
684           ? (Imm16 | Imm32 | Imm32S | Imm64)
685           : fits_in_signed_long (num)
686           ? (Imm32 | Imm32S | Imm64)
687           : fits_in_unsigned_long (num)
688           ? (Imm32 | Imm64)
689           : Imm64);
690 }
691
692 static offsetT
693 offset_in_range (val, size)
694      offsetT val;
695      int size;
696 {
697   addressT mask;
698
699   switch (size)
700     {
701     case 1: mask = ((addressT) 1 <<  8) - 1; break;
702     case 2: mask = ((addressT) 1 << 16) - 1; break;
703     case 4: mask = ((addressT) 2 << 31) - 1; break;
704 #ifdef BFD64
705     case 8: mask = ((addressT) 2 << 63) - 1; break;
706 #endif
707     default: abort ();
708     }
709
710   /* If BFD64, sign extend val.  */
711   if (!use_rela_relocations)
712     if ((val & ~(((addressT) 2 << 31) - 1)) == 0)
713       val = (val ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
714
715   if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
716     {
717       char buf1[40], buf2[40];
718
719       sprint_value (buf1, val);
720       sprint_value (buf2, val & mask);
721       as_warn (_("%s shortened to %s"), buf1, buf2);
722     }
723   return val & mask;
724 }
725
726 /* Returns 0 if attempting to add a prefix where one from the same
727    class already exists, 1 if non rep/repne added, 2 if rep/repne
728    added.  */
729 static int
730 add_prefix (prefix)
731      unsigned int prefix;
732 {
733   int ret = 1;
734   int q;
735
736   if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
737       && flag_code == CODE_64BIT)
738     q = REX_PREFIX;
739   else
740     switch (prefix)
741       {
742       default:
743         abort ();
744
745       case CS_PREFIX_OPCODE:
746       case DS_PREFIX_OPCODE:
747       case ES_PREFIX_OPCODE:
748       case FS_PREFIX_OPCODE:
749       case GS_PREFIX_OPCODE:
750       case SS_PREFIX_OPCODE:
751         q = SEG_PREFIX;
752         break;
753
754       case REPNE_PREFIX_OPCODE:
755       case REPE_PREFIX_OPCODE:
756         ret = 2;
757         /* fall thru */
758       case LOCK_PREFIX_OPCODE:
759         q = LOCKREP_PREFIX;
760         break;
761
762       case FWAIT_OPCODE:
763         q = WAIT_PREFIX;
764         break;
765
766       case ADDR_PREFIX_OPCODE:
767         q = ADDR_PREFIX;
768         break;
769
770       case DATA_PREFIX_OPCODE:
771         q = DATA_PREFIX;
772         break;
773       }
774
775   if (i.prefix[q] != 0)
776     {
777       as_bad (_("same type of prefix used twice"));
778       return 0;
779     }
780
781   i.prefixes += 1;
782   i.prefix[q] = prefix;
783   return ret;
784 }
785
786 static void
787 set_code_flag (value)
788      int value;
789 {
790   flag_code = value;
791   cpu_arch_flags &= ~(Cpu64 | CpuNo64);
792   cpu_arch_flags |= (flag_code == CODE_64BIT ? Cpu64 : CpuNo64);
793   if (value == CODE_64BIT && !(cpu_arch_flags & CpuSledgehammer))
794     {
795       as_bad (_("64bit mode not supported on this CPU."));
796     }
797   if (value == CODE_32BIT && !(cpu_arch_flags & Cpu386))
798     {
799       as_bad (_("32bit mode not supported on this CPU."));
800     }
801   stackop_size = '\0';
802 }
803
804 static void
805 set_16bit_gcc_code_flag (new_code_flag)
806      int new_code_flag;
807 {
808   flag_code = new_code_flag;
809   cpu_arch_flags &= ~(Cpu64 | CpuNo64);
810   cpu_arch_flags |= (flag_code == CODE_64BIT ? Cpu64 : CpuNo64);
811   stackop_size = LONG_MNEM_SUFFIX;
812 }
813
814 static void
815 set_intel_syntax (syntax_flag)
816      int syntax_flag;
817 {
818   /* Find out if register prefixing is specified.  */
819   int ask_naked_reg = 0;
820
821   SKIP_WHITESPACE ();
822   if (!is_end_of_line[(unsigned char) *input_line_pointer])
823     {
824       char *string = input_line_pointer;
825       int e = get_symbol_end ();
826
827       if (strcmp (string, "prefix") == 0)
828         ask_naked_reg = 1;
829       else if (strcmp (string, "noprefix") == 0)
830         ask_naked_reg = -1;
831       else
832         as_bad (_("bad argument to syntax directive."));
833       *input_line_pointer = e;
834     }
835   demand_empty_rest_of_line ();
836
837   intel_syntax = syntax_flag;
838
839   if (ask_naked_reg == 0)
840     allow_naked_reg = (intel_syntax
841                        && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
842   else
843     allow_naked_reg = (ask_naked_reg < 0);
844
845   identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
846   identifier_chars['$'] = intel_syntax ? '$' : 0;
847 }
848
849 static void
850 set_cpu_arch (dummy)
851      int dummy ATTRIBUTE_UNUSED;
852 {
853   SKIP_WHITESPACE ();
854
855   if (!is_end_of_line[(unsigned char) *input_line_pointer])
856     {
857       char *string = input_line_pointer;
858       int e = get_symbol_end ();
859       int i;
860
861       for (i = 0; cpu_arch[i].name; i++)
862         {
863           if (strcmp (string, cpu_arch[i].name) == 0)
864             {
865               if (*string != '.')
866                 {
867                   cpu_arch_name = cpu_arch[i].name;
868                   cpu_sub_arch_name = NULL;
869                   cpu_arch_flags = (cpu_arch[i].flags
870                                     | (flag_code == CODE_64BIT ? Cpu64 : CpuNo64));
871                   break;
872                 }
873               if ((cpu_arch_flags | cpu_arch[i].flags) != cpu_arch_flags)
874                 {
875                   cpu_sub_arch_name = cpu_arch[i].name;
876                   cpu_arch_flags |= cpu_arch[i].flags;
877                 }
878               *input_line_pointer = e;
879               demand_empty_rest_of_line ();
880               return;
881             }
882         }
883       if (!cpu_arch[i].name)
884         as_bad (_("no such architecture: `%s'"), string);
885
886       *input_line_pointer = e;
887     }
888   else
889     as_bad (_("missing cpu architecture"));
890
891   no_cond_jump_promotion = 0;
892   if (*input_line_pointer == ','
893       && !is_end_of_line[(unsigned char) input_line_pointer[1]])
894     {
895       char *string = ++input_line_pointer;
896       int e = get_symbol_end ();
897
898       if (strcmp (string, "nojumps") == 0)
899         no_cond_jump_promotion = 1;
900       else if (strcmp (string, "jumps") == 0)
901         ;
902       else
903         as_bad (_("no such architecture modifier: `%s'"), string);
904
905       *input_line_pointer = e;
906     }
907
908   demand_empty_rest_of_line ();
909 }
910
911 unsigned long
912 i386_mach ()
913 {
914   if (!strcmp (default_arch, "x86_64"))
915     return bfd_mach_x86_64;
916   else if (!strcmp (default_arch, "i386"))
917     return bfd_mach_i386_i386;
918   else
919     as_fatal (_("Unknown architecture"));
920 }
921 \f
922 void
923 md_begin ()
924 {
925   const char *hash_err;
926
927   /* Initialize op_hash hash table.  */
928   op_hash = hash_new ();
929
930   {
931     const template *optab;
932     templates *core_optab;
933
934     /* Setup for loop.  */
935     optab = i386_optab;
936     core_optab = (templates *) xmalloc (sizeof (templates));
937     core_optab->start = optab;
938
939     while (1)
940       {
941         ++optab;
942         if (optab->name == NULL
943             || strcmp (optab->name, (optab - 1)->name) != 0)
944           {
945             /* different name --> ship out current template list;
946                add to hash table; & begin anew.  */
947             core_optab->end = optab;
948             hash_err = hash_insert (op_hash,
949                                     (optab - 1)->name,
950                                     (PTR) core_optab);
951             if (hash_err)
952               {
953                 as_fatal (_("Internal Error:  Can't hash %s: %s"),
954                           (optab - 1)->name,
955                           hash_err);
956               }
957             if (optab->name == NULL)
958               break;
959             core_optab = (templates *) xmalloc (sizeof (templates));
960             core_optab->start = optab;
961           }
962       }
963   }
964
965   /* Initialize reg_hash hash table.  */
966   reg_hash = hash_new ();
967   {
968     const reg_entry *regtab;
969
970     for (regtab = i386_regtab;
971          regtab < i386_regtab + sizeof (i386_regtab) / sizeof (i386_regtab[0]);
972          regtab++)
973       {
974         hash_err = hash_insert (reg_hash, regtab->reg_name, (PTR) regtab);
975         if (hash_err)
976           as_fatal (_("Internal Error:  Can't hash %s: %s"),
977                     regtab->reg_name,
978                     hash_err);
979       }
980   }
981
982   /* Fill in lexical tables:  mnemonic_chars, operand_chars.  */
983   {
984     int c;
985     char *p;
986
987     for (c = 0; c < 256; c++)
988       {
989         if (ISDIGIT (c))
990           {
991             digit_chars[c] = c;
992             mnemonic_chars[c] = c;
993             register_chars[c] = c;
994             operand_chars[c] = c;
995           }
996         else if (ISLOWER (c))
997           {
998             mnemonic_chars[c] = c;
999             register_chars[c] = c;
1000             operand_chars[c] = c;
1001           }
1002         else if (ISUPPER (c))
1003           {
1004             mnemonic_chars[c] = TOLOWER (c);
1005             register_chars[c] = mnemonic_chars[c];
1006             operand_chars[c] = c;
1007           }
1008
1009         if (ISALPHA (c) || ISDIGIT (c))
1010           identifier_chars[c] = c;
1011         else if (c >= 128)
1012           {
1013             identifier_chars[c] = c;
1014             operand_chars[c] = c;
1015           }
1016       }
1017
1018 #ifdef LEX_AT
1019     identifier_chars['@'] = '@';
1020 #endif
1021 #ifdef LEX_QM
1022     identifier_chars['?'] = '?';
1023     operand_chars['?'] = '?';
1024 #endif
1025     digit_chars['-'] = '-';
1026     mnemonic_chars['-'] = '-';
1027     identifier_chars['_'] = '_';
1028     identifier_chars['.'] = '.';
1029
1030     for (p = operand_special_chars; *p != '\0'; p++)
1031       operand_chars[(unsigned char) *p] = *p;
1032   }
1033
1034 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1035   if (IS_ELF)
1036     {
1037       record_alignment (text_section, 2);
1038       record_alignment (data_section, 2);
1039       record_alignment (bss_section, 2);
1040     }
1041 #endif
1042
1043   if (flag_code == CODE_64BIT)
1044     {
1045       x86_dwarf2_return_column = 16;
1046       x86_cie_data_alignment = -8;
1047     }
1048   else
1049     {
1050       x86_dwarf2_return_column = 8;
1051       x86_cie_data_alignment = -4;
1052     }
1053 }
1054
1055 void
1056 i386_print_statistics (file)
1057      FILE *file;
1058 {
1059   hash_print_statistics (file, "i386 opcode", op_hash);
1060   hash_print_statistics (file, "i386 register", reg_hash);
1061 }
1062 \f
1063 #ifdef DEBUG386
1064
1065 /* Debugging routines for md_assemble.  */
1066 static void pi PARAMS ((char *, i386_insn *));
1067 static void pte PARAMS ((template *));
1068 static void pt PARAMS ((unsigned int));
1069 static void pe PARAMS ((expressionS *));
1070 static void ps PARAMS ((symbolS *));
1071
1072 static void
1073 pi (line, x)
1074      char *line;
1075      i386_insn *x;
1076 {
1077   unsigned int i;
1078
1079   fprintf (stdout, "%s: template ", line);
1080   pte (&x->tm);
1081   fprintf (stdout, "  address: base %s  index %s  scale %x\n",
1082            x->base_reg ? x->base_reg->reg_name : "none",
1083            x->index_reg ? x->index_reg->reg_name : "none",
1084            x->log2_scale_factor);
1085   fprintf (stdout, "  modrm:  mode %x  reg %x  reg/mem %x\n",
1086            x->rm.mode, x->rm.reg, x->rm.regmem);
1087   fprintf (stdout, "  sib:  base %x  index %x  scale %x\n",
1088            x->sib.base, x->sib.index, x->sib.scale);
1089   fprintf (stdout, "  rex: 64bit %x  extX %x  extY %x  extZ %x\n",
1090            (x->rex & REX_MODE64) != 0,
1091            (x->rex & REX_EXTX) != 0,
1092            (x->rex & REX_EXTY) != 0,
1093            (x->rex & REX_EXTZ) != 0);
1094   for (i = 0; i < x->operands; i++)
1095     {
1096       fprintf (stdout, "    #%d:  ", i + 1);
1097       pt (x->types[i]);
1098       fprintf (stdout, "\n");
1099       if (x->types[i]
1100           & (Reg | SReg2 | SReg3 | Control | Debug | Test | RegMMX | RegXMM))
1101         fprintf (stdout, "%s\n", x->op[i].regs->reg_name);
1102       if (x->types[i] & Imm)
1103         pe (x->op[i].imms);
1104       if (x->types[i] & Disp)
1105         pe (x->op[i].disps);
1106     }
1107 }
1108
1109 static void
1110 pte (t)
1111      template *t;
1112 {
1113   unsigned int i;
1114   fprintf (stdout, " %d operands ", t->operands);
1115   fprintf (stdout, "opcode %x ", t->base_opcode);
1116   if (t->extension_opcode != None)
1117     fprintf (stdout, "ext %x ", t->extension_opcode);
1118   if (t->opcode_modifier & D)
1119     fprintf (stdout, "D");
1120   if (t->opcode_modifier & W)
1121     fprintf (stdout, "W");
1122   fprintf (stdout, "\n");
1123   for (i = 0; i < t->operands; i++)
1124     {
1125       fprintf (stdout, "    #%d type ", i + 1);
1126       pt (t->operand_types[i]);
1127       fprintf (stdout, "\n");
1128     }
1129 }
1130
1131 static void
1132 pe (e)
1133      expressionS *e;
1134 {
1135   fprintf (stdout, "    operation     %d\n", e->X_op);
1136   fprintf (stdout, "    add_number    %ld (%lx)\n",
1137            (long) e->X_add_number, (long) e->X_add_number);
1138   if (e->X_add_symbol)
1139     {
1140       fprintf (stdout, "    add_symbol    ");
1141       ps (e->X_add_symbol);
1142       fprintf (stdout, "\n");
1143     }
1144   if (e->X_op_symbol)
1145     {
1146       fprintf (stdout, "    op_symbol    ");
1147       ps (e->X_op_symbol);
1148       fprintf (stdout, "\n");
1149     }
1150 }
1151
1152 static void
1153 ps (s)
1154      symbolS *s;
1155 {
1156   fprintf (stdout, "%s type %s%s",
1157            S_GET_NAME (s),
1158            S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
1159            segment_name (S_GET_SEGMENT (s)));
1160 }
1161
1162 struct type_name
1163   {
1164     unsigned int mask;
1165     char *tname;
1166   }
1167
1168 static const type_names[] =
1169 {
1170   { Reg8, "r8" },
1171   { Reg16, "r16" },
1172   { Reg32, "r32" },
1173   { Reg64, "r64" },
1174   { Imm8, "i8" },
1175   { Imm8S, "i8s" },
1176   { Imm16, "i16" },
1177   { Imm32, "i32" },
1178   { Imm32S, "i32s" },
1179   { Imm64, "i64" },
1180   { Imm1, "i1" },
1181   { BaseIndex, "BaseIndex" },
1182   { Disp8, "d8" },
1183   { Disp16, "d16" },
1184   { Disp32, "d32" },
1185   { Disp32S, "d32s" },
1186   { Disp64, "d64" },
1187   { InOutPortReg, "InOutPortReg" },
1188   { ShiftCount, "ShiftCount" },
1189   { Control, "control reg" },
1190   { Test, "test reg" },
1191   { Debug, "debug reg" },
1192   { FloatReg, "FReg" },
1193   { FloatAcc, "FAcc" },
1194   { SReg2, "SReg2" },
1195   { SReg3, "SReg3" },
1196   { Acc, "Acc" },
1197   { JumpAbsolute, "Jump Absolute" },
1198   { RegMMX, "rMMX" },
1199   { RegXMM, "rXMM" },
1200   { EsSeg, "es" },
1201   { 0, "" }
1202 };
1203
1204 static void
1205 pt (t)
1206      unsigned int t;
1207 {
1208   const struct type_name *ty;
1209
1210   for (ty = type_names; ty->mask; ty++)
1211     if (t & ty->mask)
1212       fprintf (stdout, "%s, ", ty->tname);
1213   fflush (stdout);
1214 }
1215
1216 #endif /* DEBUG386 */
1217 \f
1218 static bfd_reloc_code_real_type
1219 reloc (unsigned int size,
1220      int pcrel,
1221      int sign,
1222      bfd_reloc_code_real_type other)
1223 {
1224   if (other != NO_RELOC)
1225     {
1226       reloc_howto_type *reloc;
1227
1228       if (size == 8)
1229         switch (other)
1230           {
1231             case BFD_RELOC_X86_64_TPOFF32:
1232               other = BFD_RELOC_X86_64_TPOFF64;
1233               break;
1234             case BFD_RELOC_X86_64_DTPOFF32:
1235               other = BFD_RELOC_X86_64_DTPOFF64;
1236               break;
1237             default:
1238               break;
1239           }
1240
1241       /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless.  */
1242       if (size == 4 && flag_code != CODE_64BIT)
1243         sign = -1;
1244
1245       reloc = bfd_reloc_type_lookup (stdoutput, other);
1246       if (!reloc)
1247         as_bad (_("unknown relocation (%u)"), other);
1248       else if (size != bfd_get_reloc_size (reloc))
1249         as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
1250                 bfd_get_reloc_size (reloc),
1251                 size);
1252       else if (pcrel && !reloc->pc_relative)
1253         as_bad (_("non-pc-relative relocation for pc-relative field"));
1254       else if ((reloc->complain_on_overflow == complain_overflow_signed
1255                 && !sign)
1256                || (reloc->complain_on_overflow == complain_overflow_unsigned
1257                 && sign > 0))
1258         as_bad (_("relocated field and relocation type differ in signedness"));
1259       else
1260         return other;
1261       return NO_RELOC;
1262     }
1263
1264   if (pcrel)
1265     {
1266       if (!sign)
1267         as_bad (_("there are no unsigned pc-relative relocations"));
1268       switch (size)
1269         {
1270         case 1: return BFD_RELOC_8_PCREL;
1271         case 2: return BFD_RELOC_16_PCREL;
1272         case 4: return BFD_RELOC_32_PCREL;
1273         case 8: return BFD_RELOC_64_PCREL;
1274         }
1275       as_bad (_("cannot do %u byte pc-relative relocation"), size);
1276     }
1277   else
1278     {
1279       if (sign > 0)
1280         switch (size)
1281           {
1282           case 4: return BFD_RELOC_X86_64_32S;
1283           }
1284       else
1285         switch (size)
1286           {
1287           case 1: return BFD_RELOC_8;
1288           case 2: return BFD_RELOC_16;
1289           case 4: return BFD_RELOC_32;
1290           case 8: return BFD_RELOC_64;
1291           }
1292       as_bad (_("cannot do %s %u byte relocation"),
1293               sign > 0 ? "signed" : "unsigned", size);
1294     }
1295
1296   abort ();
1297   return BFD_RELOC_NONE;
1298 }
1299
1300 /* Here we decide which fixups can be adjusted to make them relative to
1301    the beginning of the section instead of the symbol.  Basically we need
1302    to make sure that the dynamic relocations are done correctly, so in
1303    some cases we force the original symbol to be used.  */
1304
1305 int
1306 tc_i386_fix_adjustable (fixP)
1307      fixS *fixP ATTRIBUTE_UNUSED;
1308 {
1309 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1310   if (!IS_ELF)
1311     return 1;
1312
1313   /* Don't adjust pc-relative references to merge sections in 64-bit
1314      mode.  */
1315   if (use_rela_relocations
1316       && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
1317       && fixP->fx_pcrel)
1318     return 0;
1319
1320   /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
1321      and changed later by validate_fix.  */
1322   if (GOT_symbol && fixP->fx_subsy == GOT_symbol
1323       && fixP->fx_r_type == BFD_RELOC_32_PCREL)
1324     return 0;
1325
1326   /* adjust_reloc_syms doesn't know about the GOT.  */
1327   if (fixP->fx_r_type == BFD_RELOC_386_GOTOFF
1328       || fixP->fx_r_type == BFD_RELOC_386_PLT32
1329       || fixP->fx_r_type == BFD_RELOC_386_GOT32
1330       || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
1331       || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
1332       || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
1333       || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
1334       || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
1335       || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
1336       || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
1337       || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
1338       || fixP->fx_r_type == BFD_RELOC_X86_64_PLT32
1339       || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
1340       || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
1341       || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
1342       || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
1343       || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
1344       || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
1345       || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
1346       || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
1347       || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
1348       || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
1349       || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1350       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1351     return 0;
1352 #endif
1353   return 1;
1354 }
1355
1356 static int intel_float_operand PARAMS ((const char *mnemonic));
1357
1358 static int
1359 intel_float_operand (mnemonic)
1360      const char *mnemonic;
1361 {
1362   /* Note that the value returned is meaningful only for opcodes with (memory)
1363      operands, hence the code here is free to improperly handle opcodes that
1364      have no operands (for better performance and smaller code). */
1365
1366   if (mnemonic[0] != 'f')
1367     return 0; /* non-math */
1368
1369   switch (mnemonic[1])
1370     {
1371     /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
1372        the fs segment override prefix not currently handled because no
1373        call path can make opcodes without operands get here */
1374     case 'i':
1375       return 2 /* integer op */;
1376     case 'l':
1377       if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
1378         return 3; /* fldcw/fldenv */
1379       break;
1380     case 'n':
1381       if (mnemonic[2] != 'o' /* fnop */)
1382         return 3; /* non-waiting control op */
1383       break;
1384     case 'r':
1385       if (mnemonic[2] == 's')
1386         return 3; /* frstor/frstpm */
1387       break;
1388     case 's':
1389       if (mnemonic[2] == 'a')
1390         return 3; /* fsave */
1391       if (mnemonic[2] == 't')
1392         {
1393           switch (mnemonic[3])
1394             {
1395             case 'c': /* fstcw */
1396             case 'd': /* fstdw */
1397             case 'e': /* fstenv */
1398             case 's': /* fsts[gw] */
1399               return 3;
1400             }
1401         }
1402       break;
1403     case 'x':
1404       if (mnemonic[2] == 'r' || mnemonic[2] == 's')
1405         return 0; /* fxsave/fxrstor are not really math ops */
1406       break;
1407     }
1408
1409   return 1;
1410 }
1411
1412 /* This is the guts of the machine-dependent assembler.  LINE points to a
1413    machine dependent instruction.  This function is supposed to emit
1414    the frags/bytes it assembles to.  */
1415
1416 void
1417 md_assemble (line)
1418      char *line;
1419 {
1420   int j;
1421   char mnemonic[MAX_MNEM_SIZE];
1422
1423   /* Initialize globals.  */
1424   memset (&i, '\0', sizeof (i));
1425   for (j = 0; j < MAX_OPERANDS; j++)
1426     i.reloc[j] = NO_RELOC;
1427   memset (disp_expressions, '\0', sizeof (disp_expressions));
1428   memset (im_expressions, '\0', sizeof (im_expressions));
1429   save_stack_p = save_stack;
1430
1431   /* First parse an instruction mnemonic & call i386_operand for the operands.
1432      We assume that the scrubber has arranged it so that line[0] is the valid
1433      start of a (possibly prefixed) mnemonic.  */
1434
1435   line = parse_insn (line, mnemonic);
1436   if (line == NULL)
1437     return;
1438
1439   line = parse_operands (line, mnemonic);
1440   if (line == NULL)
1441     return;
1442
1443   /* Now we've parsed the mnemonic into a set of templates, and have the
1444      operands at hand.  */
1445
1446   /* All intel opcodes have reversed operands except for "bound" and
1447      "enter".  We also don't reverse intersegment "jmp" and "call"
1448      instructions with 2 immediate operands so that the immediate segment
1449      precedes the offset, as it does when in AT&T mode.  "enter" and the
1450      intersegment "jmp" and "call" instructions are the only ones that
1451      have two immediate operands.  */
1452   if (intel_syntax && i.operands > 1
1453       && (strcmp (mnemonic, "bound") != 0)
1454       && (strcmp (mnemonic, "invlpga") != 0)
1455       && !((i.types[0] & Imm) && (i.types[1] & Imm)))
1456     swap_operands ();
1457
1458   if (i.imm_operands)
1459     optimize_imm ();
1460
1461   /* Don't optimize displacement for movabs since it only takes 64bit
1462      displacement.  */
1463   if (i.disp_operands
1464       && (flag_code != CODE_64BIT
1465           || strcmp (mnemonic, "movabs") != 0))
1466     optimize_disp ();
1467
1468   /* Next, we find a template that matches the given insn,
1469      making sure the overlap of the given operands types is consistent
1470      with the template operand types.  */
1471
1472   if (!match_template ())
1473     return;
1474
1475   if (intel_syntax)
1476     {
1477       /* Undo SYSV386_COMPAT brokenness when in Intel mode.  See i386.h  */
1478       if (SYSV386_COMPAT
1479           && (i.tm.base_opcode & 0xfffffde0) == 0xdce0)
1480         i.tm.base_opcode ^= FloatR;
1481
1482       /* Zap movzx and movsx suffix.  The suffix may have been set from
1483          "word ptr" or "byte ptr" on the source operand, but we'll use
1484          the suffix later to choose the destination register.  */
1485       if ((i.tm.base_opcode & ~9) == 0x0fb6)
1486         {
1487           if (i.reg_operands < 2
1488               && !i.suffix
1489               && (~i.tm.opcode_modifier
1490                   & (No_bSuf
1491                      | No_wSuf
1492                      | No_lSuf
1493                      | No_sSuf
1494                      | No_xSuf
1495                      | No_qSuf)))
1496             as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
1497
1498           i.suffix = 0;
1499         }
1500     }
1501
1502   if (i.tm.opcode_modifier & FWait)
1503     if (!add_prefix (FWAIT_OPCODE))
1504       return;
1505
1506   /* Check string instruction segment overrides.  */
1507   if ((i.tm.opcode_modifier & IsString) != 0 && i.mem_operands != 0)
1508     {
1509       if (!check_string ())
1510         return;
1511     }
1512
1513   if (!process_suffix ())
1514     return;
1515
1516   /* Make still unresolved immediate matches conform to size of immediate
1517      given in i.suffix.  */
1518   if (!finalize_imm ())
1519     return;
1520
1521   if (i.types[0] & Imm1)
1522     i.imm_operands = 0; /* kludge for shift insns.  */
1523   if (i.types[0] & ImplicitRegister)
1524     i.reg_operands--;
1525   if (i.types[1] & ImplicitRegister)
1526     i.reg_operands--;
1527   if (i.types[2] & ImplicitRegister)
1528     i.reg_operands--;
1529
1530   if (i.tm.opcode_modifier & ImmExt)
1531     {
1532       expressionS *exp;
1533
1534       if ((i.tm.cpu_flags & CpuPNI) && i.operands > 0)
1535         {
1536           /* These Intel Prescott New Instructions have the fixed
1537              operands with an opcode suffix which is coded in the same
1538              place as an 8-bit immediate field would be. Here we check
1539              those operands and remove them afterwards.  */
1540           unsigned int x;
1541
1542           for (x = 0; x < i.operands; x++)
1543             if (i.op[x].regs->reg_num != x)
1544               as_bad (_("can't use register '%%%s' as operand %d in '%s'."),
1545                         i.op[x].regs->reg_name, x + 1, i.tm.name);
1546           i.operands = 0;
1547         }
1548
1549       /* These AMD 3DNow! and Intel Katmai New Instructions have an
1550          opcode suffix which is coded in the same place as an 8-bit
1551          immediate field would be.  Here we fake an 8-bit immediate
1552          operand from the opcode suffix stored in tm.extension_opcode.  */
1553
1554       assert (i.imm_operands == 0 && i.operands <= 2 && 2 < MAX_OPERANDS);
1555
1556       exp = &im_expressions[i.imm_operands++];
1557       i.op[i.operands].imms = exp;
1558       i.types[i.operands++] = Imm8;
1559       exp->X_op = O_constant;
1560       exp->X_add_number = i.tm.extension_opcode;
1561       i.tm.extension_opcode = None;
1562     }
1563
1564   /* For insns with operands there are more diddles to do to the opcode.  */
1565   if (i.operands)
1566     {
1567       if (!process_operands ())
1568         return;
1569     }
1570   else if (!quiet_warnings && (i.tm.opcode_modifier & Ugh) != 0)
1571     {
1572       /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc.  */
1573       as_warn (_("translating to `%sp'"), i.tm.name);
1574     }
1575
1576   /* Handle conversion of 'int $3' --> special int3 insn.  */
1577   if (i.tm.base_opcode == INT_OPCODE && i.op[0].imms->X_add_number == 3)
1578     {
1579       i.tm.base_opcode = INT3_OPCODE;
1580       i.imm_operands = 0;
1581     }
1582
1583   if ((i.tm.opcode_modifier & (Jump | JumpByte | JumpDword))
1584       && i.op[0].disps->X_op == O_constant)
1585     {
1586       /* Convert "jmp constant" (and "call constant") to a jump (call) to
1587          the absolute address given by the constant.  Since ix86 jumps and
1588          calls are pc relative, we need to generate a reloc.  */
1589       i.op[0].disps->X_add_symbol = &abs_symbol;
1590       i.op[0].disps->X_op = O_symbol;
1591     }
1592
1593   if ((i.tm.opcode_modifier & Rex64) != 0)
1594     i.rex |= REX_MODE64;
1595
1596   /* For 8 bit registers we need an empty rex prefix.  Also if the
1597      instruction already has a prefix, we need to convert old
1598      registers to new ones.  */
1599
1600   if (((i.types[0] & Reg8) != 0
1601        && (i.op[0].regs->reg_flags & RegRex64) != 0)
1602       || ((i.types[1] & Reg8) != 0
1603           && (i.op[1].regs->reg_flags & RegRex64) != 0)
1604       || (((i.types[0] & Reg8) != 0 || (i.types[1] & Reg8) != 0)
1605           && i.rex != 0))
1606     {
1607       int x;
1608
1609       i.rex |= REX_OPCODE;
1610       for (x = 0; x < 2; x++)
1611         {
1612           /* Look for 8 bit operand that uses old registers.  */
1613           if ((i.types[x] & Reg8) != 0
1614               && (i.op[x].regs->reg_flags & RegRex64) == 0)
1615             {
1616               /* In case it is "hi" register, give up.  */
1617               if (i.op[x].regs->reg_num > 3)
1618                 as_bad (_("can't encode register '%%%s' in an instruction requiring REX prefix."),
1619                         i.op[x].regs->reg_name);
1620
1621               /* Otherwise it is equivalent to the extended register.
1622                  Since the encoding doesn't change this is merely
1623                  cosmetic cleanup for debug output.  */
1624
1625               i.op[x].regs = i.op[x].regs + 8;
1626             }
1627         }
1628     }
1629
1630   if (i.rex != 0)
1631     add_prefix (REX_OPCODE | i.rex);
1632
1633   /* We are ready to output the insn.  */
1634   output_insn ();
1635 }
1636
1637 static char *
1638 parse_insn (line, mnemonic)
1639      char *line;
1640      char *mnemonic;
1641 {
1642   char *l = line;
1643   char *token_start = l;
1644   char *mnem_p;
1645   int supported;
1646   const template *t;
1647
1648   /* Non-zero if we found a prefix only acceptable with string insns.  */
1649   const char *expecting_string_instruction = NULL;
1650
1651   while (1)
1652     {
1653       mnem_p = mnemonic;
1654       while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
1655         {
1656           mnem_p++;
1657           if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
1658             {
1659               as_bad (_("no such instruction: `%s'"), token_start);
1660               return NULL;
1661             }
1662           l++;
1663         }
1664       if (!is_space_char (*l)
1665           && *l != END_OF_INSN
1666           && (intel_syntax
1667               || (*l != PREFIX_SEPARATOR
1668                   && *l != ',')))
1669         {
1670           as_bad (_("invalid character %s in mnemonic"),
1671                   output_invalid (*l));
1672           return NULL;
1673         }
1674       if (token_start == l)
1675         {
1676           if (!intel_syntax && *l == PREFIX_SEPARATOR)
1677             as_bad (_("expecting prefix; got nothing"));
1678           else
1679             as_bad (_("expecting mnemonic; got nothing"));
1680           return NULL;
1681         }
1682
1683       /* Look up instruction (or prefix) via hash table.  */
1684       current_templates = hash_find (op_hash, mnemonic);
1685
1686       if (*l != END_OF_INSN
1687           && (!is_space_char (*l) || l[1] != END_OF_INSN)
1688           && current_templates
1689           && (current_templates->start->opcode_modifier & IsPrefix))
1690         {
1691           if (current_templates->start->cpu_flags
1692               & (flag_code != CODE_64BIT ? Cpu64 : CpuNo64))
1693             {
1694               as_bad ((flag_code != CODE_64BIT
1695                        ? _("`%s' is only supported in 64-bit mode")
1696                        : _("`%s' is not supported in 64-bit mode")),
1697                       current_templates->start->name);
1698               return NULL;
1699             }
1700           /* If we are in 16-bit mode, do not allow addr16 or data16.
1701              Similarly, in 32-bit mode, do not allow addr32 or data32.  */
1702           if ((current_templates->start->opcode_modifier & (Size16 | Size32))
1703               && flag_code != CODE_64BIT
1704               && (((current_templates->start->opcode_modifier & Size32) != 0)
1705                   ^ (flag_code == CODE_16BIT)))
1706             {
1707               as_bad (_("redundant %s prefix"),
1708                       current_templates->start->name);
1709               return NULL;
1710             }
1711           /* Add prefix, checking for repeated prefixes.  */
1712           switch (add_prefix (current_templates->start->base_opcode))
1713             {
1714             case 0:
1715               return NULL;
1716             case 2:
1717               expecting_string_instruction = current_templates->start->name;
1718               break;
1719             }
1720           /* Skip past PREFIX_SEPARATOR and reset token_start.  */
1721           token_start = ++l;
1722         }
1723       else
1724         break;
1725     }
1726
1727   if (!current_templates)
1728     {
1729       /* See if we can get a match by trimming off a suffix.  */
1730       switch (mnem_p[-1])
1731         {
1732         case WORD_MNEM_SUFFIX:
1733           if (intel_syntax && (intel_float_operand (mnemonic) & 2))
1734             i.suffix = SHORT_MNEM_SUFFIX;
1735           else
1736         case BYTE_MNEM_SUFFIX:
1737         case QWORD_MNEM_SUFFIX:
1738           i.suffix = mnem_p[-1];
1739           mnem_p[-1] = '\0';
1740           current_templates = hash_find (op_hash, mnemonic);
1741           break;
1742         case SHORT_MNEM_SUFFIX:
1743         case LONG_MNEM_SUFFIX:
1744           if (!intel_syntax)
1745             {
1746               i.suffix = mnem_p[-1];
1747               mnem_p[-1] = '\0';
1748               current_templates = hash_find (op_hash, mnemonic);
1749             }
1750           break;
1751
1752           /* Intel Syntax.  */
1753         case 'd':
1754           if (intel_syntax)
1755             {
1756               if (intel_float_operand (mnemonic) == 1)
1757                 i.suffix = SHORT_MNEM_SUFFIX;
1758               else
1759                 i.suffix = LONG_MNEM_SUFFIX;
1760               mnem_p[-1] = '\0';
1761               current_templates = hash_find (op_hash, mnemonic);
1762             }
1763           break;
1764         }
1765       if (!current_templates)
1766         {
1767           as_bad (_("no such instruction: `%s'"), token_start);
1768           return NULL;
1769         }
1770     }
1771
1772   if (current_templates->start->opcode_modifier & (Jump | JumpByte))
1773     {
1774       /* Check for a branch hint.  We allow ",pt" and ",pn" for
1775          predict taken and predict not taken respectively.
1776          I'm not sure that branch hints actually do anything on loop
1777          and jcxz insns (JumpByte) for current Pentium4 chips.  They
1778          may work in the future and it doesn't hurt to accept them
1779          now.  */
1780       if (l[0] == ',' && l[1] == 'p')
1781         {
1782           if (l[2] == 't')
1783             {
1784               if (!add_prefix (DS_PREFIX_OPCODE))
1785                 return NULL;
1786               l += 3;
1787             }
1788           else if (l[2] == 'n')
1789             {
1790               if (!add_prefix (CS_PREFIX_OPCODE))
1791                 return NULL;
1792               l += 3;
1793             }
1794         }
1795     }
1796   /* Any other comma loses.  */
1797   if (*l == ',')
1798     {
1799       as_bad (_("invalid character %s in mnemonic"),
1800               output_invalid (*l));
1801       return NULL;
1802     }
1803
1804   /* Check if instruction is supported on specified architecture.  */
1805   supported = 0;
1806   for (t = current_templates->start; t < current_templates->end; ++t)
1807     {
1808       if (!((t->cpu_flags & ~(Cpu64 | CpuNo64))
1809             & ~(cpu_arch_flags & ~(Cpu64 | CpuNo64))))
1810           supported |= 1;
1811       if (!(t->cpu_flags & (flag_code == CODE_64BIT ? CpuNo64 : Cpu64)))
1812           supported |= 2;
1813     }
1814   if (!(supported & 2))
1815     {
1816       as_bad (flag_code == CODE_64BIT
1817               ? _("`%s' is not supported in 64-bit mode")
1818               : _("`%s' is only supported in 64-bit mode"),
1819               current_templates->start->name);
1820       return NULL;
1821     }
1822   if (!(supported & 1))
1823     {
1824       as_warn (_("`%s' is not supported on `%s%s'"),
1825                current_templates->start->name,
1826                cpu_arch_name,
1827                cpu_sub_arch_name ? cpu_sub_arch_name : "");
1828     }
1829   else if ((Cpu386 & ~cpu_arch_flags) && (flag_code != CODE_16BIT))
1830     {
1831       as_warn (_("use .code16 to ensure correct addressing mode"));
1832     }
1833
1834   /* Check for rep/repne without a string instruction.  */
1835   if (expecting_string_instruction)
1836     {
1837       static templates override;
1838
1839       for (t = current_templates->start; t < current_templates->end; ++t)
1840         if (t->opcode_modifier & IsString)
1841           break;
1842       if (t >= current_templates->end)
1843         {
1844           as_bad (_("expecting string instruction after `%s'"),
1845                 expecting_string_instruction);
1846           return NULL;
1847         }
1848       for (override.start = t; t < current_templates->end; ++t)
1849         if (!(t->opcode_modifier & IsString))
1850           break;
1851       override.end = t;
1852       current_templates = &override;
1853     }
1854
1855   return l;
1856 }
1857
1858 static char *
1859 parse_operands (l, mnemonic)
1860      char *l;
1861      const char *mnemonic;
1862 {
1863   char *token_start;
1864
1865   /* 1 if operand is pending after ','.  */
1866   unsigned int expecting_operand = 0;
1867
1868   /* Non-zero if operand parens not balanced.  */
1869   unsigned int paren_not_balanced;
1870
1871   while (*l != END_OF_INSN)
1872     {
1873       /* Skip optional white space before operand.  */
1874       if (is_space_char (*l))
1875         ++l;
1876       if (!is_operand_char (*l) && *l != END_OF_INSN)
1877         {
1878           as_bad (_("invalid character %s before operand %d"),
1879                   output_invalid (*l),
1880                   i.operands + 1);
1881           return NULL;
1882         }
1883       token_start = l;  /* after white space */
1884       paren_not_balanced = 0;
1885       while (paren_not_balanced || *l != ',')
1886         {
1887           if (*l == END_OF_INSN)
1888             {
1889               if (paren_not_balanced)
1890                 {
1891                   if (!intel_syntax)
1892                     as_bad (_("unbalanced parenthesis in operand %d."),
1893                             i.operands + 1);
1894                   else
1895                     as_bad (_("unbalanced brackets in operand %d."),
1896                             i.operands + 1);
1897                   return NULL;
1898                 }
1899               else
1900                 break;  /* we are done */
1901             }
1902           else if (!is_operand_char (*l) && !is_space_char (*l))
1903             {
1904               as_bad (_("invalid character %s in operand %d"),
1905                       output_invalid (*l),
1906                       i.operands + 1);
1907               return NULL;
1908             }
1909           if (!intel_syntax)
1910             {
1911               if (*l == '(')
1912                 ++paren_not_balanced;
1913               if (*l == ')')
1914                 --paren_not_balanced;
1915             }
1916           else
1917             {
1918               if (*l == '[')
1919                 ++paren_not_balanced;
1920               if (*l == ']')
1921                 --paren_not_balanced;
1922             }
1923           l++;
1924         }
1925       if (l != token_start)
1926         {                       /* Yes, we've read in another operand.  */
1927           unsigned int operand_ok;
1928           this_operand = i.operands++;
1929           if (i.operands > MAX_OPERANDS)
1930             {
1931               as_bad (_("spurious operands; (%d operands/instruction max)"),
1932                       MAX_OPERANDS);
1933               return NULL;
1934             }
1935           /* Now parse operand adding info to 'i' as we go along.  */
1936           END_STRING_AND_SAVE (l);
1937
1938           if (intel_syntax)
1939             operand_ok =
1940               i386_intel_operand (token_start,
1941                                   intel_float_operand (mnemonic));
1942           else
1943             operand_ok = i386_operand (token_start);
1944
1945           RESTORE_END_STRING (l);
1946           if (!operand_ok)
1947             return NULL;
1948         }
1949       else
1950         {
1951           if (expecting_operand)
1952             {
1953             expecting_operand_after_comma:
1954               as_bad (_("expecting operand after ','; got nothing"));
1955               return NULL;
1956             }
1957           if (*l == ',')
1958             {
1959               as_bad (_("expecting operand before ','; got nothing"));
1960               return NULL;
1961             }
1962         }
1963
1964       /* Now *l must be either ',' or END_OF_INSN.  */
1965       if (*l == ',')
1966         {
1967           if (*++l == END_OF_INSN)
1968             {
1969               /* Just skip it, if it's \n complain.  */
1970               goto expecting_operand_after_comma;
1971             }
1972           expecting_operand = 1;
1973         }
1974     }
1975   return l;
1976 }
1977
1978 static void
1979 swap_operands ()
1980 {
1981   union i386_op temp_op;
1982   unsigned int temp_type;
1983   enum bfd_reloc_code_real temp_reloc;
1984   int xchg1 = 0;
1985   int xchg2 = 0;
1986
1987   if (i.operands == 2)
1988     {
1989       xchg1 = 0;
1990       xchg2 = 1;
1991     }
1992   else if (i.operands == 3)
1993     {
1994       xchg1 = 0;
1995       xchg2 = 2;
1996     }
1997   temp_type = i.types[xchg2];
1998   i.types[xchg2] = i.types[xchg1];
1999   i.types[xchg1] = temp_type;
2000   temp_op = i.op[xchg2];
2001   i.op[xchg2] = i.op[xchg1];
2002   i.op[xchg1] = temp_op;
2003   temp_reloc = i.reloc[xchg2];
2004   i.reloc[xchg2] = i.reloc[xchg1];
2005   i.reloc[xchg1] = temp_reloc;
2006
2007   if (i.mem_operands == 2)
2008     {
2009       const seg_entry *temp_seg;
2010       temp_seg = i.seg[0];
2011       i.seg[0] = i.seg[1];
2012       i.seg[1] = temp_seg;
2013     }
2014 }
2015
2016 /* Try to ensure constant immediates are represented in the smallest
2017    opcode possible.  */
2018 static void
2019 optimize_imm ()
2020 {
2021   char guess_suffix = 0;
2022   int op;
2023
2024   if (i.suffix)
2025     guess_suffix = i.suffix;
2026   else if (i.reg_operands)
2027     {
2028       /* Figure out a suffix from the last register operand specified.
2029          We can't do this properly yet, ie. excluding InOutPortReg,
2030          but the following works for instructions with immediates.
2031          In any case, we can't set i.suffix yet.  */
2032       for (op = i.operands; --op >= 0;)
2033         if (i.types[op] & Reg)
2034           {
2035             if (i.types[op] & Reg8)
2036               guess_suffix = BYTE_MNEM_SUFFIX;
2037             else if (i.types[op] & Reg16)
2038               guess_suffix = WORD_MNEM_SUFFIX;
2039             else if (i.types[op] & Reg32)
2040               guess_suffix = LONG_MNEM_SUFFIX;
2041             else if (i.types[op] & Reg64)
2042               guess_suffix = QWORD_MNEM_SUFFIX;
2043             break;
2044           }
2045     }
2046   else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
2047     guess_suffix = WORD_MNEM_SUFFIX;
2048
2049   for (op = i.operands; --op >= 0;)
2050     if (i.types[op] & Imm)
2051       {
2052         switch (i.op[op].imms->X_op)
2053           {
2054           case O_constant:
2055             /* If a suffix is given, this operand may be shortened.  */
2056             switch (guess_suffix)
2057               {
2058               case LONG_MNEM_SUFFIX:
2059                 i.types[op] |= Imm32 | Imm64;
2060                 break;
2061               case WORD_MNEM_SUFFIX:
2062                 i.types[op] |= Imm16 | Imm32S | Imm32 | Imm64;
2063                 break;
2064               case BYTE_MNEM_SUFFIX:
2065                 i.types[op] |= Imm16 | Imm8 | Imm8S | Imm32S | Imm32 | Imm64;
2066                 break;
2067               }
2068
2069             /* If this operand is at most 16 bits, convert it
2070                to a signed 16 bit number before trying to see
2071                whether it will fit in an even smaller size.
2072                This allows a 16-bit operand such as $0xffe0 to
2073                be recognised as within Imm8S range.  */
2074             if ((i.types[op] & Imm16)
2075                 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
2076               {
2077                 i.op[op].imms->X_add_number =
2078                   (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
2079               }
2080             if ((i.types[op] & Imm32)
2081                 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
2082                     == 0))
2083               {
2084                 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
2085                                                 ^ ((offsetT) 1 << 31))
2086                                                - ((offsetT) 1 << 31));
2087               }
2088             i.types[op] |= smallest_imm_type (i.op[op].imms->X_add_number);
2089
2090             /* We must avoid matching of Imm32 templates when 64bit
2091                only immediate is available.  */
2092             if (guess_suffix == QWORD_MNEM_SUFFIX)
2093               i.types[op] &= ~Imm32;
2094             break;
2095
2096           case O_absent:
2097           case O_register:
2098             abort ();
2099
2100             /* Symbols and expressions.  */
2101           default:
2102             /* Convert symbolic operand to proper sizes for matching, but don't
2103                prevent matching a set of insns that only supports sizes other
2104                than those matching the insn suffix.  */
2105             {
2106               unsigned int mask, allowed = 0;
2107               const template *t;
2108
2109               for (t = current_templates->start; t < current_templates->end; ++t)
2110                 allowed |= t->operand_types[op];
2111               switch (guess_suffix)
2112                 {
2113                 case QWORD_MNEM_SUFFIX:
2114                   mask = Imm64 | Imm32S;
2115                   break;
2116                 case LONG_MNEM_SUFFIX:
2117                   mask = Imm32;
2118                   break;
2119                 case WORD_MNEM_SUFFIX:
2120                   mask = Imm16;
2121                   break;
2122                 case BYTE_MNEM_SUFFIX:
2123                   mask = Imm8;
2124                   break;
2125                 default:
2126                   mask = 0;
2127                   break;
2128                 }
2129                 if (mask & allowed)
2130                   i.types[op] &= mask;
2131             }
2132             break;
2133           }
2134       }
2135 }
2136
2137 /* Try to use the smallest displacement type too.  */
2138 static void
2139 optimize_disp ()
2140 {
2141   int op;
2142
2143   for (op = i.operands; --op >= 0;)
2144     if (i.types[op] & Disp)
2145       {
2146         if (i.op[op].disps->X_op == O_constant)
2147           {
2148             offsetT disp = i.op[op].disps->X_add_number;
2149
2150             if ((i.types[op] & Disp16)
2151                 && (disp & ~(offsetT) 0xffff) == 0)
2152               {
2153                 /* If this operand is at most 16 bits, convert
2154                    to a signed 16 bit number and don't use 64bit
2155                    displacement.  */
2156                 disp = (((disp & 0xffff) ^ 0x8000) - 0x8000);
2157                 i.types[op] &= ~Disp64;
2158               }
2159             if ((i.types[op] & Disp32)
2160                 && (disp & ~(((offsetT) 2 << 31) - 1)) == 0)
2161               {
2162                 /* If this operand is at most 32 bits, convert
2163                    to a signed 32 bit number and don't use 64bit
2164                    displacement.  */
2165                 disp &= (((offsetT) 2 << 31) - 1);
2166                 disp = (disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
2167                 i.types[op] &= ~Disp64;
2168               }
2169             if (!disp && (i.types[op] & BaseIndex))
2170               {
2171                 i.types[op] &= ~Disp;
2172                 i.op[op].disps = 0;
2173                 i.disp_operands--;
2174               }
2175             else if (flag_code == CODE_64BIT)
2176               {
2177                 if (fits_in_signed_long (disp))
2178                   {
2179                     i.types[op] &= ~Disp64;
2180                     i.types[op] |= Disp32S;
2181                   }
2182                 if (fits_in_unsigned_long (disp))
2183                   i.types[op] |= Disp32;
2184               }
2185             if ((i.types[op] & (Disp32 | Disp32S | Disp16))
2186                 && fits_in_signed_byte (disp))
2187               i.types[op] |= Disp8;
2188           }
2189         else
2190           /* We only support 64bit displacement on constants.  */
2191           i.types[op] &= ~Disp64;
2192       }
2193 }
2194
2195 static int
2196 match_template ()
2197 {
2198   /* Points to template once we've found it.  */
2199   const template *t;
2200   unsigned int overlap0, overlap1, overlap2;
2201   unsigned int found_reverse_match;
2202   int suffix_check;
2203
2204 #define MATCH(overlap, given, template)                         \
2205   ((overlap & ~JumpAbsolute)                                    \
2206    && (((given) & (BaseIndex | JumpAbsolute))                   \
2207        == ((overlap) & (BaseIndex | JumpAbsolute))))
2208
2209   /* If given types r0 and r1 are registers they must be of the same type
2210      unless the expected operand type register overlap is null.
2211      Note that Acc in a template matches every size of reg.  */
2212 #define CONSISTENT_REGISTER_MATCH(m0, g0, t0, m1, g1, t1)       \
2213   (((g0) & Reg) == 0 || ((g1) & Reg) == 0                       \
2214    || ((g0) & Reg) == ((g1) & Reg)                              \
2215    || ((((m0) & Acc) ? Reg : (t0)) & (((m1) & Acc) ? Reg : (t1)) & Reg) == 0 )
2216
2217   overlap0 = 0;
2218   overlap1 = 0;
2219   overlap2 = 0;
2220   found_reverse_match = 0;
2221   suffix_check = (i.suffix == BYTE_MNEM_SUFFIX
2222                   ? No_bSuf
2223                   : (i.suffix == WORD_MNEM_SUFFIX
2224                      ? No_wSuf
2225                      : (i.suffix == SHORT_MNEM_SUFFIX
2226                         ? No_sSuf
2227                         : (i.suffix == LONG_MNEM_SUFFIX
2228                            ? No_lSuf
2229                            : (i.suffix == QWORD_MNEM_SUFFIX
2230                               ? No_qSuf
2231                               : (i.suffix == LONG_DOUBLE_MNEM_SUFFIX
2232                                  ? No_xSuf : 0))))));
2233
2234   t = current_templates->start;
2235   if (i.suffix == QWORD_MNEM_SUFFIX
2236       && flag_code != CODE_64BIT
2237       && (intel_syntax
2238           ? !(t->opcode_modifier & IgnoreSize)
2239             && !intel_float_operand (t->name)
2240           : intel_float_operand (t->name) != 2)
2241       && (!(t->operand_types[0] & (RegMMX | RegXMM))
2242           || !(t->operand_types[t->operands > 1] & (RegMMX | RegXMM)))
2243       && (t->base_opcode != 0x0fc7
2244           || t->extension_opcode != 1 /* cmpxchg8b */))
2245     t = current_templates->end;
2246   for (; t < current_templates->end; t++)
2247     {
2248       /* Must have right number of operands.  */
2249       if (i.operands != t->operands)
2250         continue;
2251
2252       /* Check the suffix, except for some instructions in intel mode.  */
2253       if ((t->opcode_modifier & suffix_check)
2254           && !(intel_syntax
2255                && (t->opcode_modifier & IgnoreSize)))
2256         continue;
2257
2258       /* Do not verify operands when there are none.  */
2259       else if (!t->operands)
2260         {
2261           if (t->cpu_flags & ~cpu_arch_flags)
2262             continue;
2263           /* We've found a match; break out of loop.  */
2264           break;
2265         }
2266
2267       overlap0 = i.types[0] & t->operand_types[0];
2268       switch (t->operands)
2269         {
2270         case 1:
2271           if (!MATCH (overlap0, i.types[0], t->operand_types[0]))
2272             continue;
2273           break;
2274         case 2:
2275         case 3:
2276           overlap1 = i.types[1] & t->operand_types[1];
2277           if (!MATCH (overlap0, i.types[0], t->operand_types[0])
2278               || !MATCH (overlap1, i.types[1], t->operand_types[1])
2279               || !CONSISTENT_REGISTER_MATCH (overlap0, i.types[0],
2280                                              t->operand_types[0],
2281                                              overlap1, i.types[1],
2282                                              t->operand_types[1]))
2283             {
2284               /* Check if other direction is valid ...  */
2285               if ((t->opcode_modifier & (D | FloatD)) == 0)
2286                 continue;
2287
2288               /* Try reversing direction of operands.  */
2289               overlap0 = i.types[0] & t->operand_types[1];
2290               overlap1 = i.types[1] & t->operand_types[0];
2291               if (!MATCH (overlap0, i.types[0], t->operand_types[1])
2292                   || !MATCH (overlap1, i.types[1], t->operand_types[0])
2293                   || !CONSISTENT_REGISTER_MATCH (overlap0, i.types[0],
2294                                                  t->operand_types[1],
2295                                                  overlap1, i.types[1],
2296                                                  t->operand_types[0]))
2297                 {
2298                   /* Does not match either direction.  */
2299                   continue;
2300                 }
2301               /* found_reverse_match holds which of D or FloatDR
2302                  we've found.  */
2303               found_reverse_match = t->opcode_modifier & (D | FloatDR);
2304             }
2305           /* Found a forward 2 operand match here.  */
2306           else if (t->operands == 3)
2307             {
2308               /* Here we make use of the fact that there are no
2309                  reverse match 3 operand instructions, and all 3
2310                  operand instructions only need to be checked for
2311                  register consistency between operands 2 and 3.  */
2312               overlap2 = i.types[2] & t->operand_types[2];
2313               if (!MATCH (overlap2, i.types[2], t->operand_types[2])
2314                   || !CONSISTENT_REGISTER_MATCH (overlap1, i.types[1],
2315                                                  t->operand_types[1],
2316                                                  overlap2, i.types[2],
2317                                                  t->operand_types[2]))
2318
2319                 continue;
2320             }
2321           /* Found either forward/reverse 2 or 3 operand match here:
2322              slip through to break.  */
2323         }
2324       if (t->cpu_flags & ~cpu_arch_flags)
2325         {
2326           found_reverse_match = 0;
2327           continue;
2328         }
2329       /* We've found a match; break out of loop.  */
2330       break;
2331     }
2332
2333   if (t == current_templates->end)
2334     {
2335       /* We found no match.  */
2336       as_bad (_("suffix or operands invalid for `%s'"),
2337               current_templates->start->name);
2338       return 0;
2339     }
2340
2341   if (!quiet_warnings)
2342     {
2343       if (!intel_syntax
2344           && ((i.types[0] & JumpAbsolute)
2345               != (t->operand_types[0] & JumpAbsolute)))
2346         {
2347           as_warn (_("indirect %s without `*'"), t->name);
2348         }
2349
2350       if ((t->opcode_modifier & (IsPrefix | IgnoreSize))
2351           == (IsPrefix | IgnoreSize))
2352         {
2353           /* Warn them that a data or address size prefix doesn't
2354              affect assembly of the next line of code.  */
2355           as_warn (_("stand-alone `%s' prefix"), t->name);
2356         }
2357     }
2358
2359   /* Copy the template we found.  */
2360   i.tm = *t;
2361   if (found_reverse_match)
2362     {
2363       /* If we found a reverse match we must alter the opcode
2364          direction bit.  found_reverse_match holds bits to change
2365          (different for int & float insns).  */
2366
2367       i.tm.base_opcode ^= found_reverse_match;
2368
2369       i.tm.operand_types[0] = t->operand_types[1];
2370       i.tm.operand_types[1] = t->operand_types[0];
2371     }
2372
2373   return 1;
2374 }
2375
2376 static int
2377 check_string ()
2378 {
2379   int mem_op = (i.types[0] & AnyMem) ? 0 : 1;
2380   if ((i.tm.operand_types[mem_op] & EsSeg) != 0)
2381     {
2382       if (i.seg[0] != NULL && i.seg[0] != &es)
2383         {
2384           as_bad (_("`%s' operand %d must use `%%es' segment"),
2385                   i.tm.name,
2386                   mem_op + 1);
2387           return 0;
2388         }
2389       /* There's only ever one segment override allowed per instruction.
2390          This instruction possibly has a legal segment override on the
2391          second operand, so copy the segment to where non-string
2392          instructions store it, allowing common code.  */
2393       i.seg[0] = i.seg[1];
2394     }
2395   else if ((i.tm.operand_types[mem_op + 1] & EsSeg) != 0)
2396     {
2397       if (i.seg[1] != NULL && i.seg[1] != &es)
2398         {
2399           as_bad (_("`%s' operand %d must use `%%es' segment"),
2400                   i.tm.name,
2401                   mem_op + 2);
2402           return 0;
2403         }
2404     }
2405   return 1;
2406 }
2407
2408 static int
2409 process_suffix (void)
2410 {
2411   /* If matched instruction specifies an explicit instruction mnemonic
2412      suffix, use it.  */
2413   if (i.tm.opcode_modifier & (Size16 | Size32 | Size64))
2414     {
2415       if (i.tm.opcode_modifier & Size16)
2416         i.suffix = WORD_MNEM_SUFFIX;
2417       else if (i.tm.opcode_modifier & Size64)
2418         i.suffix = QWORD_MNEM_SUFFIX;
2419       else
2420         i.suffix = LONG_MNEM_SUFFIX;
2421     }
2422   else if (i.reg_operands)
2423     {
2424       /* If there's no instruction mnemonic suffix we try to invent one
2425          based on register operands.  */
2426       if (!i.suffix)
2427         {
2428           /* We take i.suffix from the last register operand specified,
2429              Destination register type is more significant than source
2430              register type.  */
2431           int op;
2432
2433           for (op = i.operands; --op >= 0;)
2434             if ((i.types[op] & Reg)
2435                 && !(i.tm.operand_types[op] & InOutPortReg))
2436               {
2437                 i.suffix = ((i.types[op] & Reg8) ? BYTE_MNEM_SUFFIX :
2438                             (i.types[op] & Reg16) ? WORD_MNEM_SUFFIX :
2439                             (i.types[op] & Reg64) ? QWORD_MNEM_SUFFIX :
2440                             LONG_MNEM_SUFFIX);
2441                 break;
2442               }
2443         }
2444       else if (i.suffix == BYTE_MNEM_SUFFIX)
2445         {
2446           if (!check_byte_reg ())
2447             return 0;
2448         }
2449       else if (i.suffix == LONG_MNEM_SUFFIX)
2450         {
2451           if (!check_long_reg ())
2452             return 0;
2453         }
2454       else if (i.suffix == QWORD_MNEM_SUFFIX)
2455         {
2456           if (!check_qword_reg ())
2457             return 0;
2458         }
2459       else if (i.suffix == WORD_MNEM_SUFFIX)
2460         {
2461           if (!check_word_reg ())
2462             return 0;
2463         }
2464       else if (intel_syntax && (i.tm.opcode_modifier & IgnoreSize))
2465         /* Do nothing if the instruction is going to ignore the prefix.  */
2466         ;
2467       else
2468         abort ();
2469     }
2470   else if ((i.tm.opcode_modifier & DefaultSize)
2471            && !i.suffix
2472            /* exclude fldenv/frstor/fsave/fstenv */
2473            && (i.tm.opcode_modifier & No_sSuf))
2474     {
2475       i.suffix = stackop_size;
2476     }
2477   else if (intel_syntax
2478            && !i.suffix
2479            && ((i.tm.operand_types[0] & JumpAbsolute)
2480             || (i.tm.opcode_modifier & (JumpByte|JumpInterSegment))
2481             || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
2482                 && i.tm.extension_opcode <= 3)))
2483     {
2484       switch (flag_code)
2485         {
2486         case CODE_64BIT:
2487           if (!(i.tm.opcode_modifier & No_qSuf))
2488             {
2489               i.suffix = QWORD_MNEM_SUFFIX;
2490               break;
2491             }
2492         case CODE_32BIT:
2493           if (!(i.tm.opcode_modifier & No_lSuf))
2494             i.suffix = LONG_MNEM_SUFFIX;
2495           break;
2496         case CODE_16BIT:
2497           if (!(i.tm.opcode_modifier & No_wSuf))
2498             i.suffix = WORD_MNEM_SUFFIX;
2499           break;
2500         }
2501     }
2502
2503   if (!i.suffix)
2504     {
2505       if (!intel_syntax)
2506         {
2507           if (i.tm.opcode_modifier & W)
2508             {
2509               as_bad (_("no instruction mnemonic suffix given and no register operands; can't size instruction"));
2510               return 0;
2511             }
2512         }
2513       else
2514         {
2515           unsigned int suffixes = ~i.tm.opcode_modifier
2516                                   & (No_bSuf
2517                                      | No_wSuf
2518                                      | No_lSuf
2519                                      | No_sSuf
2520                                      | No_xSuf
2521                                      | No_qSuf);
2522
2523           if ((i.tm.opcode_modifier & W)
2524               || ((suffixes & (suffixes - 1))
2525                   && !(i.tm.opcode_modifier & (DefaultSize | IgnoreSize))))
2526             {
2527               as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
2528               return 0;
2529             }
2530         }
2531     }
2532
2533   /* Change the opcode based on the operand size given by i.suffix;
2534      We don't need to change things for byte insns.  */
2535
2536   if (i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
2537     {
2538       /* It's not a byte, select word/dword operation.  */
2539       if (i.tm.opcode_modifier & W)
2540         {
2541           if (i.tm.opcode_modifier & ShortForm)
2542             i.tm.base_opcode |= 8;
2543           else
2544             i.tm.base_opcode |= 1;
2545         }
2546
2547       /* Now select between word & dword operations via the operand
2548          size prefix, except for instructions that will ignore this
2549          prefix anyway.  */
2550       if (i.suffix != QWORD_MNEM_SUFFIX
2551           && i.suffix != LONG_DOUBLE_MNEM_SUFFIX
2552           && !(i.tm.opcode_modifier & (IgnoreSize | FloatMF))
2553           && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
2554               || (flag_code == CODE_64BIT
2555                   && (i.tm.opcode_modifier & JumpByte))))
2556         {
2557           unsigned int prefix = DATA_PREFIX_OPCODE;
2558
2559           if (i.tm.opcode_modifier & JumpByte) /* jcxz, loop */
2560             prefix = ADDR_PREFIX_OPCODE;
2561
2562           if (!add_prefix (prefix))
2563             return 0;
2564         }
2565
2566       /* Set mode64 for an operand.  */
2567       if (i.suffix == QWORD_MNEM_SUFFIX
2568           && flag_code == CODE_64BIT
2569           && (i.tm.opcode_modifier & NoRex64) == 0)
2570         i.rex |= REX_MODE64;
2571
2572       /* Size floating point instruction.  */
2573       if (i.suffix == LONG_MNEM_SUFFIX)
2574         if (i.tm.opcode_modifier & FloatMF)
2575           i.tm.base_opcode ^= 4;
2576     }
2577
2578   return 1;
2579 }
2580
2581 static int
2582 check_byte_reg (void)
2583 {
2584   int op;
2585
2586   for (op = i.operands; --op >= 0;)
2587     {
2588       /* If this is an eight bit register, it's OK.  If it's the 16 or
2589          32 bit version of an eight bit register, we will just use the
2590          low portion, and that's OK too.  */
2591       if (i.types[op] & Reg8)
2592         continue;
2593
2594       /* movzx and movsx should not generate this warning.  */
2595       if (intel_syntax
2596           && (i.tm.base_opcode == 0xfb7
2597               || i.tm.base_opcode == 0xfb6
2598               || i.tm.base_opcode == 0x63
2599               || i.tm.base_opcode == 0xfbe
2600               || i.tm.base_opcode == 0xfbf))
2601         continue;
2602
2603       if ((i.types[op] & WordReg) && i.op[op].regs->reg_num < 4)
2604         {
2605           /* Prohibit these changes in the 64bit mode, since the
2606              lowering is more complicated.  */
2607           if (flag_code == CODE_64BIT
2608               && (i.tm.operand_types[op] & InOutPortReg) == 0)
2609             {
2610               as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2611                       i.op[op].regs->reg_name,
2612                       i.suffix);
2613               return 0;
2614             }
2615 #if REGISTER_WARNINGS
2616           if (!quiet_warnings
2617               && (i.tm.operand_types[op] & InOutPortReg) == 0)
2618             as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
2619                      (i.op[op].regs + (i.types[op] & Reg16
2620                                        ? REGNAM_AL - REGNAM_AX
2621                                        : REGNAM_AL - REGNAM_EAX))->reg_name,
2622                      i.op[op].regs->reg_name,
2623                      i.suffix);
2624 #endif
2625           continue;
2626         }
2627       /* Any other register is bad.  */
2628       if (i.types[op] & (Reg | RegMMX | RegXMM
2629                          | SReg2 | SReg3
2630                          | Control | Debug | Test
2631                          | FloatReg | FloatAcc))
2632         {
2633           as_bad (_("`%%%s' not allowed with `%s%c'"),
2634                   i.op[op].regs->reg_name,
2635                   i.tm.name,
2636                   i.suffix);
2637           return 0;
2638         }
2639     }
2640   return 1;
2641 }
2642
2643 static int
2644 check_long_reg ()
2645 {
2646   int op;
2647
2648   for (op = i.operands; --op >= 0;)
2649     /* Reject eight bit registers, except where the template requires
2650        them. (eg. movzb)  */
2651     if ((i.types[op] & Reg8) != 0
2652         && (i.tm.operand_types[op] & (Reg16 | Reg32 | Acc)) != 0)
2653       {
2654         as_bad (_("`%%%s' not allowed with `%s%c'"),
2655                 i.op[op].regs->reg_name,
2656                 i.tm.name,
2657                 i.suffix);
2658         return 0;
2659       }
2660   /* Warn if the e prefix on a general reg is missing.  */
2661     else if ((!quiet_warnings || flag_code == CODE_64BIT)
2662              && (i.types[op] & Reg16) != 0
2663              && (i.tm.operand_types[op] & (Reg32 | Acc)) != 0)
2664       {
2665         /* Prohibit these changes in the 64bit mode, since the
2666            lowering is more complicated.  */
2667         if (flag_code == CODE_64BIT)
2668           {
2669             as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2670                     i.op[op].regs->reg_name,
2671                     i.suffix);
2672             return 0;
2673           }
2674 #if REGISTER_WARNINGS
2675         else
2676           as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
2677                    (i.op[op].regs + REGNAM_EAX - REGNAM_AX)->reg_name,
2678                    i.op[op].regs->reg_name,
2679                    i.suffix);
2680 #endif
2681       }
2682   /* Warn if the r prefix on a general reg is missing.  */
2683     else if ((i.types[op] & Reg64) != 0
2684              && (i.tm.operand_types[op] & (Reg32 | Acc)) != 0)
2685       {
2686         as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2687                 i.op[op].regs->reg_name,
2688                 i.suffix);
2689         return 0;
2690       }
2691   return 1;
2692 }
2693
2694 static int
2695 check_qword_reg ()
2696 {
2697   int op;
2698
2699   for (op = i.operands; --op >= 0; )
2700     /* Reject eight bit registers, except where the template requires
2701        them. (eg. movzb)  */
2702     if ((i.types[op] & Reg8) != 0
2703         && (i.tm.operand_types[op] & (Reg16 | Reg32 | Acc)) != 0)
2704       {
2705         as_bad (_("`%%%s' not allowed with `%s%c'"),
2706                 i.op[op].regs->reg_name,
2707                 i.tm.name,
2708                 i.suffix);
2709         return 0;
2710       }
2711   /* Warn if the e prefix on a general reg is missing.  */
2712     else if (((i.types[op] & Reg16) != 0
2713               || (i.types[op] & Reg32) != 0)
2714              && (i.tm.operand_types[op] & (Reg32 | Acc)) != 0)
2715       {
2716         /* Prohibit these changes in the 64bit mode, since the
2717            lowering is more complicated.  */
2718         as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2719                 i.op[op].regs->reg_name,
2720                 i.suffix);
2721         return 0;
2722       }
2723   return 1;
2724 }
2725
2726 static int
2727 check_word_reg ()
2728 {
2729   int op;
2730   for (op = i.operands; --op >= 0;)
2731     /* Reject eight bit registers, except where the template requires
2732        them. (eg. movzb)  */
2733     if ((i.types[op] & Reg8) != 0
2734         && (i.tm.operand_types[op] & (Reg16 | Reg32 | Acc)) != 0)
2735       {
2736         as_bad (_("`%%%s' not allowed with `%s%c'"),
2737                 i.op[op].regs->reg_name,
2738                 i.tm.name,
2739                 i.suffix);
2740         return 0;
2741       }
2742   /* Warn if the e prefix on a general reg is present.  */
2743     else if ((!quiet_warnings || flag_code == CODE_64BIT)
2744              && (i.types[op] & Reg32) != 0
2745              && (i.tm.operand_types[op] & (Reg16 | Acc)) != 0)
2746       {
2747         /* Prohibit these changes in the 64bit mode, since the
2748            lowering is more complicated.  */
2749         if (flag_code == CODE_64BIT)
2750           {
2751             as_bad (_("Incorrect register `%%%s' used with `%c' suffix"),
2752                     i.op[op].regs->reg_name,
2753                     i.suffix);
2754             return 0;
2755           }
2756         else
2757 #if REGISTER_WARNINGS
2758           as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
2759                    (i.op[op].regs + REGNAM_AX - REGNAM_EAX)->reg_name,
2760                    i.op[op].regs->reg_name,
2761                    i.suffix);
2762 #endif
2763       }
2764   return 1;
2765 }
2766
2767 static int
2768 finalize_imm ()
2769 {
2770   unsigned int overlap0, overlap1, overlap2;
2771
2772   overlap0 = i.types[0] & i.tm.operand_types[0];
2773   if ((overlap0 & (Imm8 | Imm8S | Imm16 | Imm32 | Imm32S | Imm64))
2774       && overlap0 != Imm8 && overlap0 != Imm8S
2775       && overlap0 != Imm16 && overlap0 != Imm32S
2776       && overlap0 != Imm32 && overlap0 != Imm64)
2777     {
2778       if (i.suffix)
2779         {
2780           overlap0 &= (i.suffix == BYTE_MNEM_SUFFIX
2781                        ? Imm8 | Imm8S
2782                        : (i.suffix == WORD_MNEM_SUFFIX
2783                           ? Imm16
2784                           : (i.suffix == QWORD_MNEM_SUFFIX
2785                              ? Imm64 | Imm32S
2786                              : Imm32)));
2787         }
2788       else if (overlap0 == (Imm16 | Imm32S | Imm32)
2789                || overlap0 == (Imm16 | Imm32)
2790                || overlap0 == (Imm16 | Imm32S))
2791         {
2792           overlap0 = ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0)
2793                       ? Imm16 : Imm32S);
2794         }
2795       if (overlap0 != Imm8 && overlap0 != Imm8S
2796           && overlap0 != Imm16 && overlap0 != Imm32S
2797           && overlap0 != Imm32 && overlap0 != Imm64)
2798         {
2799           as_bad (_("no instruction mnemonic suffix given; can't determine immediate size"));
2800           return 0;
2801         }
2802     }
2803   i.types[0] = overlap0;
2804
2805   overlap1 = i.types[1] & i.tm.operand_types[1];
2806   if ((overlap1 & (Imm8 | Imm8S | Imm16 | Imm32S | Imm32 | Imm64))
2807       && overlap1 != Imm8 && overlap1 != Imm8S
2808       && overlap1 != Imm16 && overlap1 != Imm32S
2809       && overlap1 != Imm32 && overlap1 != Imm64)
2810     {
2811       if (i.suffix)
2812         {
2813           overlap1 &= (i.suffix == BYTE_MNEM_SUFFIX
2814                        ? Imm8 | Imm8S
2815                        : (i.suffix == WORD_MNEM_SUFFIX
2816                           ? Imm16
2817                           : (i.suffix == QWORD_MNEM_SUFFIX
2818                              ? Imm64 | Imm32S
2819                              : Imm32)));
2820         }
2821       else if (overlap1 == (Imm16 | Imm32 | Imm32S)
2822                || overlap1 == (Imm16 | Imm32)
2823                || overlap1 == (Imm16 | Imm32S))
2824         {
2825           overlap1 = ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0)
2826                       ? Imm16 : Imm32S);
2827         }
2828       if (overlap1 != Imm8 && overlap1 != Imm8S
2829           && overlap1 != Imm16 && overlap1 != Imm32S
2830           && overlap1 != Imm32 && overlap1 != Imm64)
2831         {
2832           as_bad (_("no instruction mnemonic suffix given; can't determine immediate size %x %c"),overlap1, i.suffix);
2833           return 0;
2834         }
2835     }
2836   i.types[1] = overlap1;
2837
2838   overlap2 = i.types[2] & i.tm.operand_types[2];
2839   assert ((overlap2 & Imm) == 0);
2840   i.types[2] = overlap2;
2841
2842   return 1;
2843 }
2844
2845 static int
2846 process_operands ()
2847 {
2848   /* Default segment register this instruction will use for memory
2849      accesses.  0 means unknown.  This is only for optimizing out
2850      unnecessary segment overrides.  */
2851   const seg_entry *default_seg = 0;
2852
2853   /* The imul $imm, %reg instruction is converted into
2854      imul $imm, %reg, %reg, and the clr %reg instruction
2855      is converted into xor %reg, %reg.  */
2856   if (i.tm.opcode_modifier & regKludge)
2857     {
2858       unsigned int first_reg_op = (i.types[0] & Reg) ? 0 : 1;
2859       /* Pretend we saw the extra register operand.  */
2860       assert (i.op[first_reg_op + 1].regs == 0);
2861       i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
2862       i.types[first_reg_op + 1] = i.types[first_reg_op];
2863       i.reg_operands = 2;
2864     }
2865
2866   if (i.tm.opcode_modifier & ShortForm)
2867     {
2868       /* The register or float register operand is in operand 0 or 1.  */
2869       unsigned int op = (i.types[0] & (Reg | FloatReg)) ? 0 : 1;
2870       /* Register goes in low 3 bits of opcode.  */
2871       i.tm.base_opcode |= i.op[op].regs->reg_num;
2872       if ((i.op[op].regs->reg_flags & RegRex) != 0)
2873         i.rex |= REX_EXTZ;
2874       if (!quiet_warnings && (i.tm.opcode_modifier & Ugh) != 0)
2875         {
2876           /* Warn about some common errors, but press on regardless.
2877              The first case can be generated by gcc (<= 2.8.1).  */
2878           if (i.operands == 2)
2879             {
2880               /* Reversed arguments on faddp, fsubp, etc.  */
2881               as_warn (_("translating to `%s %%%s,%%%s'"), i.tm.name,
2882                        i.op[1].regs->reg_name,
2883                        i.op[0].regs->reg_name);
2884             }
2885           else
2886             {
2887               /* Extraneous `l' suffix on fp insn.  */
2888               as_warn (_("translating to `%s %%%s'"), i.tm.name,
2889                        i.op[0].regs->reg_name);
2890             }
2891         }
2892     }
2893   else if (i.tm.opcode_modifier & Modrm)
2894     {
2895       /* The opcode is completed (modulo i.tm.extension_opcode which
2896          must be put into the modrm byte).  Now, we make the modrm and
2897          index base bytes based on all the info we've collected.  */
2898
2899       default_seg = build_modrm_byte ();
2900     }
2901   else if (i.tm.opcode_modifier & (Seg2ShortForm | Seg3ShortForm))
2902     {
2903       if (i.tm.base_opcode == POP_SEG_SHORT
2904           && i.op[0].regs->reg_num == 1)
2905         {
2906           as_bad (_("you can't `pop %%cs'"));
2907           return 0;
2908         }
2909       i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
2910       if ((i.op[0].regs->reg_flags & RegRex) != 0)
2911         i.rex |= REX_EXTZ;
2912     }
2913   else if ((i.tm.base_opcode & ~(D | W)) == MOV_AX_DISP32)
2914     {
2915       default_seg = &ds;
2916     }
2917   else if ((i.tm.opcode_modifier & IsString) != 0)
2918     {
2919       /* For the string instructions that allow a segment override
2920          on one of their operands, the default segment is ds.  */
2921       default_seg = &ds;
2922     }
2923
2924   if ((i.tm.base_opcode == 0x8d /* lea */
2925        || (i.tm.cpu_flags & CpuSVME))
2926       && i.seg[0] && !quiet_warnings)
2927     as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
2928
2929   /* If a segment was explicitly specified, and the specified segment
2930      is not the default, use an opcode prefix to select it.  If we
2931      never figured out what the default segment is, then default_seg
2932      will be zero at this point, and the specified segment prefix will
2933      always be used.  */
2934   if ((i.seg[0]) && (i.seg[0] != default_seg))
2935     {
2936       if (!add_prefix (i.seg[0]->seg_prefix))
2937         return 0;
2938     }
2939   return 1;
2940 }
2941
2942 static const seg_entry *
2943 build_modrm_byte ()
2944 {
2945   const seg_entry *default_seg = 0;
2946
2947   /* i.reg_operands MUST be the number of real register operands;
2948      implicit registers do not count.  */
2949   if (i.reg_operands == 2)
2950     {
2951       unsigned int source, dest;
2952       source = ((i.types[0]
2953                  & (Reg | RegMMX | RegXMM
2954                     | SReg2 | SReg3
2955                     | Control | Debug | Test))
2956                 ? 0 : 1);
2957       dest = source + 1;
2958
2959       i.rm.mode = 3;
2960       /* One of the register operands will be encoded in the i.tm.reg
2961          field, the other in the combined i.tm.mode and i.tm.regmem
2962          fields.  If no form of this instruction supports a memory
2963          destination operand, then we assume the source operand may
2964          sometimes be a memory operand and so we need to store the
2965          destination in the i.rm.reg field.  */
2966       if ((i.tm.operand_types[dest] & AnyMem) == 0)
2967         {
2968           i.rm.reg = i.op[dest].regs->reg_num;
2969           i.rm.regmem = i.op[source].regs->reg_num;
2970           if ((i.op[dest].regs->reg_flags & RegRex) != 0)
2971             i.rex |= REX_EXTX;
2972           if ((i.op[source].regs->reg_flags & RegRex) != 0)
2973             i.rex |= REX_EXTZ;
2974         }
2975       else
2976         {
2977           i.rm.reg = i.op[source].regs->reg_num;
2978           i.rm.regmem = i.op[dest].regs->reg_num;
2979           if ((i.op[dest].regs->reg_flags & RegRex) != 0)
2980             i.rex |= REX_EXTZ;
2981           if ((i.op[source].regs->reg_flags & RegRex) != 0)
2982             i.rex |= REX_EXTX;
2983         }
2984       if (flag_code != CODE_64BIT && (i.rex & (REX_EXTX | REX_EXTZ)))
2985         {
2986           if (!((i.types[0] | i.types[1]) & Control))
2987             abort ();
2988           i.rex &= ~(REX_EXTX | REX_EXTZ);
2989           add_prefix (LOCK_PREFIX_OPCODE);
2990         }
2991     }
2992   else
2993     {                   /* If it's not 2 reg operands...  */
2994       if (i.mem_operands)
2995         {
2996           unsigned int fake_zero_displacement = 0;
2997           unsigned int op = ((i.types[0] & AnyMem)
2998                              ? 0
2999                              : (i.types[1] & AnyMem) ? 1 : 2);
3000
3001           default_seg = &ds;
3002
3003           if (i.base_reg == 0)
3004             {
3005               i.rm.mode = 0;
3006               if (!i.disp_operands)
3007                 fake_zero_displacement = 1;
3008               if (i.index_reg == 0)
3009                 {
3010                   /* Operand is just <disp>  */
3011                   if (flag_code == CODE_64BIT)
3012                     {
3013                       /* 64bit mode overwrites the 32bit absolute
3014                          addressing by RIP relative addressing and
3015                          absolute addressing is encoded by one of the
3016                          redundant SIB forms.  */
3017                       i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
3018                       i.sib.base = NO_BASE_REGISTER;
3019                       i.sib.index = NO_INDEX_REGISTER;
3020                       i.types[op] = ((i.prefix[ADDR_PREFIX] == 0) ? Disp32S : Disp32);
3021                     }
3022                   else if ((flag_code == CODE_16BIT) ^ (i.prefix[ADDR_PREFIX] != 0))
3023                     {
3024                       i.rm.regmem = NO_BASE_REGISTER_16;
3025                       i.types[op] = Disp16;
3026                     }
3027                   else
3028                     {
3029                       i.rm.regmem = NO_BASE_REGISTER;
3030                       i.types[op] = Disp32;
3031                     }
3032                 }
3033               else /* !i.base_reg && i.index_reg  */
3034                 {
3035                   i.sib.index = i.index_reg->reg_num;
3036                   i.sib.base = NO_BASE_REGISTER;
3037                   i.sib.scale = i.log2_scale_factor;
3038                   i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
3039                   i.types[op] &= ~Disp;
3040                   if (flag_code != CODE_64BIT)
3041                     i.types[op] |= Disp32;      /* Must be 32 bit */
3042                   else
3043                     i.types[op] |= Disp32S;
3044                   if ((i.index_reg->reg_flags & RegRex) != 0)
3045                     i.rex |= REX_EXTY;
3046                 }
3047             }
3048           /* RIP addressing for 64bit mode.  */
3049           else if (i.base_reg->reg_type == BaseIndex)
3050             {
3051               i.rm.regmem = NO_BASE_REGISTER;
3052               i.types[op] &= ~ Disp;
3053               i.types[op] |= Disp32S;
3054               i.flags[op] = Operand_PCrel;
3055               if (! i.disp_operands)
3056                 fake_zero_displacement = 1;
3057             }
3058           else if (i.base_reg->reg_type & Reg16)
3059             {
3060               switch (i.base_reg->reg_num)
3061                 {
3062                 case 3: /* (%bx)  */
3063                   if (i.index_reg == 0)
3064                     i.rm.regmem = 7;
3065                   else /* (%bx,%si) -> 0, or (%bx,%di) -> 1  */
3066                     i.rm.regmem = i.index_reg->reg_num - 6;
3067                   break;
3068                 case 5: /* (%bp)  */
3069                   default_seg = &ss;
3070                   if (i.index_reg == 0)
3071                     {
3072                       i.rm.regmem = 6;
3073                       if ((i.types[op] & Disp) == 0)
3074                         {
3075                           /* fake (%bp) into 0(%bp)  */
3076                           i.types[op] |= Disp8;
3077                           fake_zero_displacement = 1;
3078                         }
3079                     }
3080                   else /* (%bp,%si) -> 2, or (%bp,%di) -> 3  */
3081                     i.rm.regmem = i.index_reg->reg_num - 6 + 2;
3082                   break;
3083                 default: /* (%si) -> 4 or (%di) -> 5  */
3084                   i.rm.regmem = i.base_reg->reg_num - 6 + 4;
3085                 }
3086               i.rm.mode = mode_from_disp_size (i.types[op]);
3087             }
3088           else /* i.base_reg and 32/64 bit mode  */
3089             {
3090               if (flag_code == CODE_64BIT
3091                   && (i.types[op] & Disp))
3092                 i.types[op] = (i.types[op] & Disp8) | (i.prefix[ADDR_PREFIX] == 0 ? Disp32S : Disp32);
3093
3094               i.rm.regmem = i.base_reg->reg_num;
3095               if ((i.base_reg->reg_flags & RegRex) != 0)
3096                 i.rex |= REX_EXTZ;
3097               i.sib.base = i.base_reg->reg_num;
3098               /* x86-64 ignores REX prefix bit here to avoid decoder
3099                  complications.  */
3100               if ((i.base_reg->reg_num & 7) == EBP_REG_NUM)
3101                 {
3102                   default_seg = &ss;
3103                   if (i.disp_operands == 0)
3104                     {
3105                       fake_zero_displacement = 1;
3106                       i.types[op] |= Disp8;
3107                     }
3108                 }
3109               else if (i.base_reg->reg_num == ESP_REG_NUM)
3110                 {
3111                   default_seg = &ss;
3112                 }
3113               i.sib.scale = i.log2_scale_factor;
3114               if (i.index_reg == 0)
3115                 {
3116                   /* <disp>(%esp) becomes two byte modrm with no index
3117                      register.  We've already stored the code for esp
3118                      in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
3119                      Any base register besides %esp will not use the
3120                      extra modrm byte.  */
3121                   i.sib.index = NO_INDEX_REGISTER;
3122 #if !SCALE1_WHEN_NO_INDEX
3123                   /* Another case where we force the second modrm byte.  */
3124                   if (i.log2_scale_factor)
3125                     i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
3126 #endif
3127                 }
3128               else
3129                 {
3130                   i.sib.index = i.index_reg->reg_num;
3131                   i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
3132                   if ((i.index_reg->reg_flags & RegRex) != 0)
3133                     i.rex |= REX_EXTY;
3134                 }
3135               i.rm.mode = mode_from_disp_size (i.types[op]);
3136             }
3137
3138           if (fake_zero_displacement)
3139             {
3140               /* Fakes a zero displacement assuming that i.types[op]
3141                  holds the correct displacement size.  */
3142               expressionS *exp;
3143
3144               assert (i.op[op].disps == 0);
3145               exp = &disp_expressions[i.disp_operands++];
3146               i.op[op].disps = exp;
3147               exp->X_op = O_constant;
3148               exp->X_add_number = 0;
3149               exp->X_add_symbol = (symbolS *) 0;
3150               exp->X_op_symbol = (symbolS *) 0;
3151             }
3152         }
3153
3154       /* Fill in i.rm.reg or i.rm.regmem field with register operand
3155          (if any) based on i.tm.extension_opcode.  Again, we must be
3156          careful to make sure that segment/control/debug/test/MMX
3157          registers are coded into the i.rm.reg field.  */
3158       if (i.reg_operands)
3159         {
3160           unsigned int op =
3161             ((i.types[0]
3162               & (Reg | RegMMX | RegXMM
3163                  | SReg2 | SReg3
3164                  | Control | Debug | Test))
3165              ? 0
3166              : ((i.types[1]
3167                  & (Reg | RegMMX | RegXMM
3168                     | SReg2 | SReg3
3169                     | Control | Debug | Test))
3170                 ? 1
3171                 : 2));
3172           /* If there is an extension opcode to put here, the register
3173              number must be put into the regmem field.  */
3174           if (i.tm.extension_opcode != None)
3175             {
3176               i.rm.regmem = i.op[op].regs->reg_num;
3177               if ((i.op[op].regs->reg_flags & RegRex) != 0)
3178                 i.rex |= REX_EXTZ;
3179             }
3180           else
3181             {
3182               i.rm.reg = i.op[op].regs->reg_num;
3183               if ((i.op[op].regs->reg_flags & RegRex) != 0)
3184                 i.rex |= REX_EXTX;
3185             }
3186
3187           /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
3188              must set it to 3 to indicate this is a register operand
3189              in the regmem field.  */
3190           if (!i.mem_operands)
3191             i.rm.mode = 3;
3192         }
3193
3194       /* Fill in i.rm.reg field with extension opcode (if any).  */
3195       if (i.tm.extension_opcode != None)
3196         i.rm.reg = i.tm.extension_opcode;
3197     }
3198   return default_seg;
3199 }
3200
3201 static void
3202 output_branch ()
3203 {
3204   char *p;
3205   int code16;
3206   int prefix;
3207   relax_substateT subtype;
3208   symbolS *sym;
3209   offsetT off;
3210
3211   code16 = 0;
3212   if (flag_code == CODE_16BIT)
3213     code16 = CODE16;
3214
3215   prefix = 0;
3216   if (i.prefix[DATA_PREFIX] != 0)
3217     {
3218       prefix = 1;
3219       i.prefixes -= 1;
3220       code16 ^= CODE16;
3221     }
3222   /* Pentium4 branch hints.  */
3223   if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
3224       || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
3225     {
3226       prefix++;
3227       i.prefixes--;
3228     }
3229   if (i.prefix[REX_PREFIX] != 0)
3230     {
3231       prefix++;
3232       i.prefixes--;
3233     }
3234
3235   if (i.prefixes != 0 && !intel_syntax)
3236     as_warn (_("skipping prefixes on this instruction"));
3237
3238   /* It's always a symbol;  End frag & setup for relax.
3239      Make sure there is enough room in this frag for the largest
3240      instruction we may generate in md_convert_frag.  This is 2
3241      bytes for the opcode and room for the prefix and largest
3242      displacement.  */
3243   frag_grow (prefix + 2 + 4);
3244   /* Prefix and 1 opcode byte go in fr_fix.  */
3245   p = frag_more (prefix + 1);
3246   if (i.prefix[DATA_PREFIX] != 0)
3247     *p++ = DATA_PREFIX_OPCODE;
3248   if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
3249       || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
3250     *p++ = i.prefix[SEG_PREFIX];
3251   if (i.prefix[REX_PREFIX] != 0)
3252     *p++ = i.prefix[REX_PREFIX];
3253   *p = i.tm.base_opcode;
3254
3255   if ((unsigned char) *p == JUMP_PC_RELATIVE)
3256     subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, SMALL);
3257   else if ((cpu_arch_flags & Cpu386) != 0)
3258     subtype = ENCODE_RELAX_STATE (COND_JUMP, SMALL);
3259   else
3260     subtype = ENCODE_RELAX_STATE (COND_JUMP86, SMALL);
3261   subtype |= code16;
3262
3263   sym = i.op[0].disps->X_add_symbol;
3264   off = i.op[0].disps->X_add_number;
3265
3266   if (i.op[0].disps->X_op != O_constant
3267       && i.op[0].disps->X_op != O_symbol)
3268     {
3269       /* Handle complex expressions.  */
3270       sym = make_expr_symbol (i.op[0].disps);
3271       off = 0;
3272     }
3273
3274   /* 1 possible extra opcode + 4 byte displacement go in var part.
3275      Pass reloc in fr_var.  */
3276   frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
3277 }
3278
3279 static void
3280 output_jump ()
3281 {
3282   char *p;
3283   int size;
3284   fixS *fixP;
3285
3286   if (i.tm.opcode_modifier & JumpByte)
3287     {
3288       /* This is a loop or jecxz type instruction.  */
3289       size = 1;
3290       if (i.prefix[ADDR_PREFIX] != 0)
3291         {
3292           FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
3293           i.prefixes -= 1;
3294         }
3295       /* Pentium4 branch hints.  */
3296       if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
3297           || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
3298         {
3299           FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
3300           i.prefixes--;
3301         }
3302     }
3303   else
3304     {
3305       int code16;
3306
3307       code16 = 0;
3308       if (flag_code == CODE_16BIT)
3309         code16 = CODE16;
3310
3311       if (i.prefix[DATA_PREFIX] != 0)
3312         {
3313           FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
3314           i.prefixes -= 1;
3315           code16 ^= CODE16;
3316         }
3317
3318       size = 4;
3319       if (code16)
3320         size = 2;
3321     }
3322
3323   if (i.prefix[REX_PREFIX] != 0)
3324     {
3325       FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
3326       i.prefixes -= 1;
3327     }
3328
3329   if (i.prefixes != 0 && !intel_syntax)
3330     as_warn (_("skipping prefixes on this instruction"));
3331
3332   p = frag_more (1 + size);
3333   *p++ = i.tm.base_opcode;
3334
3335   fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
3336                       i.op[0].disps, 1, reloc (size, 1, 1, i.reloc[0]));
3337
3338   /* All jumps handled here are signed, but don't use a signed limit
3339      check for 32 and 16 bit jumps as we want to allow wrap around at
3340      4G and 64k respectively.  */
3341   if (size == 1)
3342     fixP->fx_signed = 1;
3343 }
3344
3345 static void
3346 output_interseg_jump ()
3347 {
3348   char *p;
3349   int size;
3350   int prefix;
3351   int code16;
3352
3353   code16 = 0;
3354   if (flag_code == CODE_16BIT)
3355     code16 = CODE16;
3356
3357   prefix = 0;
3358   if (i.prefix[DATA_PREFIX] != 0)
3359     {
3360       prefix = 1;
3361       i.prefixes -= 1;
3362       code16 ^= CODE16;
3363     }
3364   if (i.prefix[REX_PREFIX] != 0)
3365     {
3366       prefix++;
3367       i.prefixes -= 1;
3368     }
3369
3370   size = 4;
3371   if (code16)
3372     size = 2;
3373
3374   if (i.prefixes != 0 && !intel_syntax)
3375     as_warn (_("skipping prefixes on this instruction"));
3376
3377   /* 1 opcode; 2 segment; offset  */
3378   p = frag_more (prefix + 1 + 2 + size);
3379
3380   if (i.prefix[DATA_PREFIX] != 0)
3381     *p++ = DATA_PREFIX_OPCODE;
3382
3383   if (i.prefix[REX_PREFIX] != 0)
3384     *p++ = i.prefix[REX_PREFIX];
3385
3386   *p++ = i.tm.base_opcode;
3387   if (i.op[1].imms->X_op == O_constant)
3388     {
3389       offsetT n = i.op[1].imms->X_add_number;
3390
3391       if (size == 2
3392           && !fits_in_unsigned_word (n)
3393           && !fits_in_signed_word (n))
3394         {
3395           as_bad (_("16-bit jump out of range"));
3396           return;
3397         }
3398       md_number_to_chars (p, n, size);
3399     }
3400   else
3401     fix_new_exp (frag_now, p - frag_now->fr_literal, size,
3402                  i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
3403   if (i.op[0].imms->X_op != O_constant)
3404     as_bad (_("can't handle non absolute segment in `%s'"),
3405             i.tm.name);
3406   md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
3407 }
3408
3409 static void
3410 output_insn ()
3411 {
3412   fragS *insn_start_frag;
3413   offsetT insn_start_off;
3414
3415   /* Tie dwarf2 debug info to the address at the start of the insn.
3416      We can't do this after the insn has been output as the current
3417      frag may have been closed off.  eg. by frag_var.  */
3418   dwarf2_emit_insn (0);
3419
3420   insn_start_frag = frag_now;
3421   insn_start_off = frag_now_fix ();
3422
3423   /* Output jumps.  */
3424   if (i.tm.opcode_modifier & Jump)
3425     output_branch ();
3426   else if (i.tm.opcode_modifier & (JumpByte | JumpDword))
3427     output_jump ();
3428   else if (i.tm.opcode_modifier & JumpInterSegment)
3429     output_interseg_jump ();
3430   else
3431     {
3432       /* Output normal instructions here.  */
3433       char *p;
3434       unsigned char *q;
3435
3436       /* All opcodes on i386 have either 1 or 2 bytes.  We may use one
3437          more higher byte to specify a prefix the instruction
3438          requires.  */
3439       if ((i.tm.base_opcode & 0xff0000) != 0)
3440         {
3441           if ((i.tm.cpu_flags & CpuPadLock) != 0)
3442             {
3443               unsigned int prefix;
3444               prefix = (i.tm.base_opcode >> 16) & 0xff;
3445
3446               if (prefix != REPE_PREFIX_OPCODE
3447                   || i.prefix[LOCKREP_PREFIX] != REPE_PREFIX_OPCODE)
3448                 add_prefix (prefix);
3449             }
3450           else
3451             add_prefix ((i.tm.base_opcode >> 16) & 0xff);
3452         }
3453
3454       /* The prefix bytes.  */
3455       for (q = i.prefix;
3456            q < i.prefix + sizeof (i.prefix) / sizeof (i.prefix[0]);
3457            q++)
3458         {
3459           if (*q)
3460             {
3461               p = frag_more (1);
3462               md_number_to_chars (p, (valueT) *q, 1);
3463             }
3464         }
3465
3466       /* Now the opcode; be careful about word order here!  */
3467       if (fits_in_unsigned_byte (i.tm.base_opcode))
3468         {
3469           FRAG_APPEND_1_CHAR (i.tm.base_opcode);
3470         }
3471       else
3472         {
3473           p = frag_more (2);
3474
3475           /* Put out high byte first: can't use md_number_to_chars!  */
3476           *p++ = (i.tm.base_opcode >> 8) & 0xff;
3477           *p = i.tm.base_opcode & 0xff;
3478         }
3479
3480       /* Now the modrm byte and sib byte (if present).  */
3481       if (i.tm.opcode_modifier & Modrm)
3482         {
3483           p = frag_more (1);
3484           md_number_to_chars (p,
3485                               (valueT) (i.rm.regmem << 0
3486                                         | i.rm.reg << 3
3487                                         | i.rm.mode << 6),
3488                               1);
3489           /* If i.rm.regmem == ESP (4)
3490              && i.rm.mode != (Register mode)
3491              && not 16 bit
3492              ==> need second modrm byte.  */
3493           if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
3494               && i.rm.mode != 3
3495               && !(i.base_reg && (i.base_reg->reg_type & Reg16) != 0))
3496             {
3497               p = frag_more (1);
3498               md_number_to_chars (p,
3499                                   (valueT) (i.sib.base << 0
3500                                             | i.sib.index << 3
3501                                             | i.sib.scale << 6),
3502                                   1);
3503             }
3504         }
3505
3506       if (i.disp_operands)
3507         output_disp (insn_start_frag, insn_start_off);
3508
3509       if (i.imm_operands)
3510         output_imm (insn_start_frag, insn_start_off);
3511     }
3512
3513 #ifdef DEBUG386
3514   if (flag_debug)
3515     {
3516       pi (line, &i);
3517     }
3518 #endif /* DEBUG386  */
3519 }
3520
3521 static void
3522 output_disp (insn_start_frag, insn_start_off)
3523     fragS *insn_start_frag;
3524     offsetT insn_start_off;
3525 {
3526   char *p;
3527   unsigned int n;
3528
3529   for (n = 0; n < i.operands; n++)
3530     {
3531       if (i.types[n] & Disp)
3532         {
3533           if (i.op[n].disps->X_op == O_constant)
3534             {
3535               int size;
3536               offsetT val;
3537
3538               size = 4;
3539               if (i.types[n] & (Disp8 | Disp16 | Disp64))
3540                 {
3541                   size = 2;
3542                   if (i.types[n] & Disp8)
3543                     size = 1;
3544                   if (i.types[n] & Disp64)
3545                     size = 8;
3546                 }
3547               val = offset_in_range (i.op[n].disps->X_add_number,
3548                                      size);
3549               p = frag_more (size);
3550               md_number_to_chars (p, val, size);
3551             }
3552           else
3553             {
3554               enum bfd_reloc_code_real reloc_type;
3555               int size = 4;
3556               int sign = 0;
3557               int pcrel = (i.flags[n] & Operand_PCrel) != 0;
3558
3559               /* The PC relative address is computed relative
3560                  to the instruction boundary, so in case immediate
3561                  fields follows, we need to adjust the value.  */
3562               if (pcrel && i.imm_operands)
3563                 {
3564                   int imm_size = 4;
3565                   unsigned int n1;
3566
3567                   for (n1 = 0; n1 < i.operands; n1++)
3568                     if (i.types[n1] & Imm)
3569                       {
3570                         if (i.types[n1] & (Imm8 | Imm8S | Imm16 | Imm64))
3571                           {
3572                             imm_size = 2;
3573                             if (i.types[n1] & (Imm8 | Imm8S))
3574                               imm_size = 1;
3575                             if (i.types[n1] & Imm64)
3576                               imm_size = 8;
3577                           }
3578                         break;
3579                       }
3580                   /* We should find the immediate.  */
3581                   if (n1 == i.operands)
3582                     abort ();
3583                   i.op[n].disps->X_add_number -= imm_size;
3584                 }
3585
3586               if (i.types[n] & Disp32S)
3587                 sign = 1;
3588
3589               if (i.types[n] & (Disp16 | Disp64))
3590                 {
3591                   size = 2;
3592                   if (i.types[n] & Disp64)
3593                     size = 8;
3594                 }
3595
3596               p = frag_more (size);
3597               reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
3598               if (GOT_symbol
3599                   && GOT_symbol == i.op[n].disps->X_add_symbol
3600                   && (((reloc_type == BFD_RELOC_32
3601                         || reloc_type == BFD_RELOC_X86_64_32S)
3602                        && (i.op[n].disps->X_op == O_symbol
3603                            || (i.op[n].disps->X_op == O_add
3604                                && ((symbol_get_value_expression
3605                                     (i.op[n].disps->X_op_symbol)->X_op)
3606                                    == O_subtract))))
3607                       || reloc_type == BFD_RELOC_32_PCREL))
3608                 {
3609                   offsetT add;
3610
3611                   if (insn_start_frag == frag_now)
3612                     add = (p - frag_now->fr_literal) - insn_start_off;
3613                   else
3614                     {
3615                       fragS *fr;
3616
3617                       add = insn_start_frag->fr_fix - insn_start_off;
3618                       for (fr = insn_start_frag->fr_next;
3619                            fr && fr != frag_now; fr = fr->fr_next)
3620                         add += fr->fr_fix;
3621                       add += p - frag_now->fr_literal;
3622                     }
3623
3624                   if (!object_64bit)
3625                     reloc_type = BFD_RELOC_386_GOTPC;
3626                   else
3627                     reloc_type = BFD_RELOC_X86_64_GOTPC32;
3628                   i.op[n].disps->X_add_number += add;
3629                 }
3630               fix_new_exp (frag_now, p - frag_now->fr_literal, size,
3631                            i.op[n].disps, pcrel, reloc_type);
3632             }
3633         }
3634     }
3635 }
3636
3637 static void
3638 output_imm (insn_start_frag, insn_start_off)
3639     fragS *insn_start_frag;
3640     offsetT insn_start_off;
3641 {
3642   char *p;
3643   unsigned int n;
3644
3645   for (n = 0; n < i.operands; n++)
3646     {
3647       if (i.types[n] & Imm)
3648         {
3649           if (i.op[n].imms->X_op == O_constant)
3650             {
3651               int size;
3652               offsetT val;
3653
3654               size = 4;
3655               if (i.types[n] & (Imm8 | Imm8S | Imm16 | Imm64))
3656                 {
3657                   size = 2;
3658                   if (i.types[n] & (Imm8 | Imm8S))
3659                     size = 1;
3660                   else if (i.types[n] & Imm64)
3661                     size = 8;
3662                 }
3663               val = offset_in_range (i.op[n].imms->X_add_number,
3664                                      size);
3665               p = frag_more (size);
3666               md_number_to_chars (p, val, size);
3667             }
3668           else
3669             {
3670               /* Not absolute_section.
3671                  Need a 32-bit fixup (don't support 8bit
3672                  non-absolute imms).  Try to support other
3673                  sizes ...  */
3674               enum bfd_reloc_code_real reloc_type;
3675               int size = 4;
3676               int sign = 0;
3677
3678               if ((i.types[n] & (Imm32S))
3679                   && (i.suffix == QWORD_MNEM_SUFFIX
3680                       || (!i.suffix && (i.tm.opcode_modifier & No_lSuf))))
3681                 sign = 1;
3682               if (i.types[n] & (Imm8 | Imm8S | Imm16 | Imm64))
3683                 {
3684                   size = 2;
3685                   if (i.types[n] & (Imm8 | Imm8S))
3686                     size = 1;
3687                   if (i.types[n] & Imm64)
3688                     size = 8;
3689                 }
3690
3691               p = frag_more (size);
3692               reloc_type = reloc (size, 0, sign, i.reloc[n]);
3693
3694               /*   This is tough to explain.  We end up with this one if we
3695                * have operands that look like
3696                * "_GLOBAL_OFFSET_TABLE_+[.-.L284]".  The goal here is to
3697                * obtain the absolute address of the GOT, and it is strongly
3698                * preferable from a performance point of view to avoid using
3699                * a runtime relocation for this.  The actual sequence of
3700                * instructions often look something like:
3701                *
3702                *        call    .L66
3703                * .L66:
3704                *        popl    %ebx
3705                *        addl    $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
3706                *
3707                *   The call and pop essentially return the absolute address
3708                * of the label .L66 and store it in %ebx.  The linker itself
3709                * will ultimately change the first operand of the addl so
3710                * that %ebx points to the GOT, but to keep things simple, the
3711                * .o file must have this operand set so that it generates not
3712                * the absolute address of .L66, but the absolute address of
3713                * itself.  This allows the linker itself simply treat a GOTPC
3714                * relocation as asking for a pcrel offset to the GOT to be
3715                * added in, and the addend of the relocation is stored in the
3716                * operand field for the instruction itself.
3717                *
3718                *   Our job here is to fix the operand so that it would add
3719                * the correct offset so that %ebx would point to itself.  The
3720                * thing that is tricky is that .-.L66 will point to the
3721                * beginning of the instruction, so we need to further modify
3722                * the operand so that it will point to itself.  There are
3723                * other cases where you have something like:
3724                *
3725                *        .long   $_GLOBAL_OFFSET_TABLE_+[.-.L66]
3726                *
3727                * and here no correction would be required.  Internally in
3728                * the assembler we treat operands of this form as not being
3729                * pcrel since the '.' is explicitly mentioned, and I wonder
3730                * whether it would simplify matters to do it this way.  Who
3731                * knows.  In earlier versions of the PIC patches, the
3732                * pcrel_adjust field was used to store the correction, but
3733                * since the expression is not pcrel, I felt it would be
3734                * confusing to do it this way.  */
3735
3736               if ((reloc_type == BFD_RELOC_32
3737                    || reloc_type == BFD_RELOC_X86_64_32S)
3738                   && GOT_symbol
3739                   && GOT_symbol == i.op[n].imms->X_add_symbol
3740                   && (i.op[n].imms->X_op == O_symbol
3741                       || (i.op[n].imms->X_op == O_add
3742                           && ((symbol_get_value_expression
3743                                (i.op[n].imms->X_op_symbol)->X_op)
3744                               == O_subtract))))
3745                 {
3746                   offsetT add;
3747
3748                   if (insn_start_frag == frag_now)
3749                     add = (p - frag_now->fr_literal) - insn_start_off;
3750                   else
3751                     {
3752                       fragS *fr;
3753
3754                       add = insn_start_frag->fr_fix - insn_start_off;
3755                       for (fr = insn_start_frag->fr_next;
3756                            fr && fr != frag_now; fr = fr->fr_next)
3757                         add += fr->fr_fix;
3758                       add += p - frag_now->fr_literal;
3759                     }
3760
3761                   if (!object_64bit)
3762                     reloc_type = BFD_RELOC_386_GOTPC;
3763                   else
3764                     reloc_type = BFD_RELOC_X86_64_GOTPC32;
3765                   i.op[n].imms->X_add_number += add;
3766                 }
3767               fix_new_exp (frag_now, p - frag_now->fr_literal, size,
3768                            i.op[n].imms, 0, reloc_type);
3769             }
3770         }
3771     }
3772 }
3773 \f
3774 /* x86_cons_fix_new is called via the expression parsing code when a
3775    reloc is needed.  We use this hook to get the correct .got reloc.  */
3776 static enum bfd_reloc_code_real got_reloc = NO_RELOC;
3777 static int cons_sign = -1;
3778
3779 void
3780 x86_cons_fix_new (fragS *frag,
3781      unsigned int off,
3782      unsigned int len,
3783      expressionS *exp)
3784 {
3785   enum bfd_reloc_code_real r = reloc (len, 0, cons_sign, got_reloc);
3786
3787   got_reloc = NO_RELOC;
3788
3789 #ifdef TE_PE
3790   if (exp->X_op == O_secrel)
3791     {
3792       exp->X_op = O_symbol;
3793       r = BFD_RELOC_32_SECREL;
3794     }
3795 #endif
3796
3797   fix_new_exp (frag, off, len, exp, 0, r);
3798 }
3799
3800 #if (!defined (OBJ_ELF) && !defined (OBJ_MAYBE_ELF)) || defined (LEX_AT)
3801 # define lex_got(reloc, adjust, types) NULL
3802 #else
3803 /* Parse operands of the form
3804    <symbol>@GOTOFF+<nnn>
3805    and similar .plt or .got references.
3806
3807    If we find one, set up the correct relocation in RELOC and copy the
3808    input string, minus the `@GOTOFF' into a malloc'd buffer for
3809    parsing by the calling routine.  Return this buffer, and if ADJUST
3810    is non-null set it to the length of the string we removed from the
3811    input line.  Otherwise return NULL.  */
3812 static char *
3813 lex_got (enum bfd_reloc_code_real *reloc,
3814      int *adjust,
3815      unsigned int *types)
3816 {
3817   static const struct {
3818     const char *str;
3819     const enum bfd_reloc_code_real rel[2];
3820     const unsigned int types64;
3821   } gotrel[] = {
3822     { "PLT",      { BFD_RELOC_386_PLT32,      BFD_RELOC_X86_64_PLT32    }, Imm32|Imm32S|Disp32 },
3823     { "GOTOFF",   { BFD_RELOC_386_GOTOFF,     BFD_RELOC_X86_64_GOTOFF64 }, Imm64|Disp64 },
3824     { "GOTPCREL", { 0,                        BFD_RELOC_X86_64_GOTPCREL }, Imm32|Imm32S|Disp32 },
3825     { "TLSGD",    { BFD_RELOC_386_TLS_GD,     BFD_RELOC_X86_64_TLSGD    }, Imm32|Imm32S|Disp32 },
3826     { "TLSLDM",   { BFD_RELOC_386_TLS_LDM,    0                         }, 0 },
3827     { "TLSLD",    { 0,                        BFD_RELOC_X86_64_TLSLD    }, Imm32|Imm32S|Disp32 },
3828     { "GOTTPOFF", { BFD_RELOC_386_TLS_IE_32,  BFD_RELOC_X86_64_GOTTPOFF }, Imm32|Imm32S|Disp32 },
3829     { "TPOFF",    { BFD_RELOC_386_TLS_LE_32,  BFD_RELOC_X86_64_TPOFF32  }, Imm32|Imm32S|Imm64|Disp32|Disp64 },
3830     { "NTPOFF",   { BFD_RELOC_386_TLS_LE,     0                         }, 0 },
3831     { "DTPOFF",   { BFD_RELOC_386_TLS_LDO_32, BFD_RELOC_X86_64_DTPOFF32 }, Imm32|Imm32S|Imm64|Disp32|Disp64 },
3832     { "GOTNTPOFF",{ BFD_RELOC_386_TLS_GOTIE,  0                         }, 0 },
3833     { "INDNTPOFF",{ BFD_RELOC_386_TLS_IE,     0                         }, 0 },
3834     { "GOT",      { BFD_RELOC_386_GOT32,      BFD_RELOC_X86_64_GOT32    }, Imm32|Imm32S|Disp32 }
3835   };
3836   char *cp;
3837   unsigned int j;
3838
3839   if (!IS_ELF)
3840     return NULL;
3841
3842   for (cp = input_line_pointer; *cp != '@'; cp++)
3843     if (is_end_of_line[(unsigned char) *cp])
3844       return NULL;
3845
3846   for (j = 0; j < sizeof (gotrel) / sizeof (gotrel[0]); j++)
3847     {
3848       int len;
3849
3850       len = strlen (gotrel[j].str);
3851       if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
3852         {
3853           if (gotrel[j].rel[object_64bit] != 0)
3854             {
3855               int first, second;
3856               char *tmpbuf, *past_reloc;
3857
3858               *reloc = gotrel[j].rel[object_64bit];
3859               if (adjust)
3860                 *adjust = len;
3861
3862               if (types)
3863                 {
3864                   if (flag_code != CODE_64BIT)
3865                     *types = Imm32|Disp32;
3866                   else
3867                     *types = gotrel[j].types64;
3868                 }
3869
3870               if (GOT_symbol == NULL)
3871                 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
3872
3873               /* Replace the relocation token with ' ', so that
3874                  errors like foo@GOTOFF1 will be detected.  */
3875
3876               /* The length of the first part of our input line.  */
3877               first = cp - input_line_pointer;
3878
3879               /* The second part goes from after the reloc token until
3880                  (and including) an end_of_line char.  Don't use strlen
3881                  here as the end_of_line char may not be a NUL.  */
3882               past_reloc = cp + 1 + len;
3883               for (cp = past_reloc; !is_end_of_line[(unsigned char) *cp++]; )
3884                 ;
3885               second = cp - past_reloc;
3886
3887               /* Allocate and copy string.  The trailing NUL shouldn't
3888                  be necessary, but be safe.  */
3889               tmpbuf = xmalloc (first + second + 2);
3890               memcpy (tmpbuf, input_line_pointer, first);
3891               tmpbuf[first] = ' ';
3892               memcpy (tmpbuf + first + 1, past_reloc, second);
3893               tmpbuf[first + second + 1] = '\0';
3894               return tmpbuf;
3895             }
3896
3897           as_bad (_("@%s reloc is not supported with %d-bit output format"),
3898                   gotrel[j].str, 1 << (5 + object_64bit));
3899           return NULL;
3900         }
3901     }
3902
3903   /* Might be a symbol version string.  Don't as_bad here.  */
3904   return NULL;
3905 }
3906
3907 void
3908 x86_cons (exp, size)
3909      expressionS *exp;
3910      int size;
3911 {
3912   if (size == 4 || (object_64bit && size == 8))
3913     {
3914       /* Handle @GOTOFF and the like in an expression.  */
3915       char *save;
3916       char *gotfree_input_line;
3917       int adjust;
3918
3919       save = input_line_pointer;
3920       gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
3921       if (gotfree_input_line)
3922         input_line_pointer = gotfree_input_line;
3923
3924       expression (exp);
3925
3926       if (gotfree_input_line)
3927         {
3928           /* expression () has merrily parsed up to the end of line,
3929              or a comma - in the wrong buffer.  Transfer how far
3930              input_line_pointer has moved to the right buffer.  */
3931           input_line_pointer = (save
3932                                 + (input_line_pointer - gotfree_input_line)
3933                                 + adjust);
3934           free (gotfree_input_line);
3935         }
3936     }
3937   else
3938     expression (exp);
3939 }
3940 #endif
3941
3942 static void signed_cons (int size)
3943 {
3944   if (flag_code == CODE_64BIT)
3945     cons_sign = 1;
3946   cons (size);
3947   cons_sign = -1;
3948 }
3949
3950 #ifdef TE_PE
3951 static void
3952 pe_directive_secrel (dummy)
3953      int dummy ATTRIBUTE_UNUSED;
3954 {
3955   expressionS exp;
3956
3957   do
3958     {
3959       expression (&exp);
3960       if (exp.X_op == O_symbol)
3961         exp.X_op = O_secrel;
3962
3963       emit_expr (&exp, 4);
3964     }
3965   while (*input_line_pointer++ == ',');
3966
3967   input_line_pointer--;
3968   demand_empty_rest_of_line ();
3969 }
3970 #endif
3971
3972 static int i386_immediate PARAMS ((char *));
3973
3974 static int
3975 i386_immediate (imm_start)
3976      char *imm_start;
3977 {
3978   char *save_input_line_pointer;
3979   char *gotfree_input_line;
3980   segT exp_seg = 0;
3981   expressionS *exp;
3982   unsigned int types = ~0U;
3983
3984   if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
3985     {
3986       as_bad (_("only 1 or 2 immediate operands are allowed"));
3987       return 0;
3988     }
3989
3990   exp = &im_expressions[i.imm_operands++];
3991   i.op[this_operand].imms = exp;
3992
3993   if (is_space_char (*imm_start))
3994     ++imm_start;
3995
3996   save_input_line_pointer = input_line_pointer;
3997   input_line_pointer = imm_start;
3998
3999   gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
4000   if (gotfree_input_line)
4001     input_line_pointer = gotfree_input_line;
4002
4003   exp_seg = expression (exp);
4004
4005   SKIP_WHITESPACE ();
4006   if (*input_line_pointer)
4007     as_bad (_("junk `%s' after expression"), input_line_pointer);
4008
4009   input_line_pointer = save_input_line_pointer;
4010   if (gotfree_input_line)
4011     free (gotfree_input_line);
4012
4013   if (exp->X_op == O_absent || exp->X_op == O_big)
4014     {
4015       /* Missing or bad expr becomes absolute 0.  */
4016       as_bad (_("missing or invalid immediate expression `%s' taken as 0"),
4017               imm_start);
4018       exp->X_op = O_constant;
4019       exp->X_add_number = 0;
4020       exp->X_add_symbol = (symbolS *) 0;
4021       exp->X_op_symbol = (symbolS *) 0;
4022     }
4023   else if (exp->X_op == O_constant)
4024     {
4025       /* Size it properly later.  */
4026       i.types[this_operand] |= Imm64;
4027       /* If BFD64, sign extend val.  */
4028       if (!use_rela_relocations)
4029         if ((exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
4030           exp->X_add_number = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
4031     }
4032 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
4033   else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
4034            && exp_seg != absolute_section
4035            && exp_seg != text_section
4036            && exp_seg != data_section
4037            && exp_seg != bss_section
4038            && exp_seg != undefined_section
4039            && !bfd_is_com_section (exp_seg))
4040     {
4041       as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
4042       return 0;
4043     }
4044 #endif
4045   else
4046     {
4047       /* This is an address.  The size of the address will be
4048          determined later, depending on destination register,
4049          suffix, or the default for the section.  */
4050       i.types[this_operand] |= Imm8 | Imm16 | Imm32 | Imm32S | Imm64;
4051       i.types[this_operand] &= types;
4052     }
4053
4054   return 1;
4055 }
4056
4057 static char *i386_scale PARAMS ((char *));
4058
4059 static char *
4060 i386_scale (scale)
4061      char *scale;
4062 {
4063   offsetT val;
4064   char *save = input_line_pointer;
4065
4066   input_line_pointer = scale;
4067   val = get_absolute_expression ();
4068
4069   switch (val)
4070     {
4071     case 1:
4072       i.log2_scale_factor = 0;
4073       break;
4074     case 2:
4075       i.log2_scale_factor = 1;
4076       break;
4077     case 4:
4078       i.log2_scale_factor = 2;
4079       break;
4080     case 8:
4081       i.log2_scale_factor = 3;
4082       break;
4083     default:
4084       {
4085         char sep = *input_line_pointer;
4086
4087         *input_line_pointer = '\0';
4088         as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
4089                 scale);
4090         *input_line_pointer = sep;
4091         input_line_pointer = save;
4092         return NULL;
4093       }
4094     }
4095   if (i.log2_scale_factor != 0 && i.index_reg == 0)
4096     {
4097       as_warn (_("scale factor of %d without an index register"),
4098                1 << i.log2_scale_factor);
4099 #if SCALE1_WHEN_NO_INDEX
4100       i.log2_scale_factor = 0;
4101 #endif
4102     }
4103   scale = input_line_pointer;
4104   input_line_pointer = save;
4105   return scale;
4106 }
4107
4108 static int i386_displacement PARAMS ((char *, char *));
4109
4110 static int
4111 i386_displacement (disp_start, disp_end)
4112      char *disp_start;
4113      char *disp_end;
4114 {
4115   expressionS *exp;
4116   segT exp_seg = 0;
4117   char *save_input_line_pointer;
4118   char *gotfree_input_line;
4119   int bigdisp, override;
4120   unsigned int types = Disp;
4121
4122   if ((i.types[this_operand] & JumpAbsolute)
4123       || !(current_templates->start->opcode_modifier & (Jump | JumpDword)))
4124     {
4125       bigdisp = Disp32;
4126       override = (i.prefix[ADDR_PREFIX] != 0);
4127     }
4128   else
4129     {
4130       /* For PC-relative branches, the width of the displacement
4131          is dependent upon data size, not address size.  */
4132       bigdisp = 0;
4133       override = (i.prefix[DATA_PREFIX] != 0);
4134     }
4135   if (flag_code == CODE_64BIT)
4136     {
4137       if (!bigdisp)
4138         bigdisp = (override || i.suffix == WORD_MNEM_SUFFIX)
4139                   ? Disp16
4140                   : Disp32S | Disp32;
4141       else if (!override)
4142         bigdisp = Disp64 | Disp32S | Disp32;
4143     }
4144   else
4145     {
4146       if (!bigdisp)
4147         {
4148           if (!override)
4149             override = (i.suffix == (flag_code != CODE_16BIT
4150                                      ? WORD_MNEM_SUFFIX
4151                                      : LONG_MNEM_SUFFIX));
4152           bigdisp = Disp32;
4153         }
4154       if ((flag_code == CODE_16BIT) ^ override)
4155         bigdisp = Disp16;
4156     }
4157   i.types[this_operand] |= bigdisp;
4158
4159   exp = &disp_expressions[i.disp_operands];
4160   i.op[this_operand].disps = exp;
4161   i.disp_operands++;
4162   save_input_line_pointer = input_line_pointer;
4163   input_line_pointer = disp_start;
4164   END_STRING_AND_SAVE (disp_end);
4165
4166 #ifndef GCC_ASM_O_HACK
4167 #define GCC_ASM_O_HACK 0
4168 #endif
4169 #if GCC_ASM_O_HACK
4170   END_STRING_AND_SAVE (disp_end + 1);
4171   if ((i.types[this_operand] & BaseIndex) != 0
4172       && displacement_string_end[-1] == '+')
4173     {
4174       /* This hack is to avoid a warning when using the "o"
4175          constraint within gcc asm statements.
4176          For instance:
4177
4178          #define _set_tssldt_desc(n,addr,limit,type) \
4179          __asm__ __volatile__ ( \
4180          "movw %w2,%0\n\t" \
4181          "movw %w1,2+%0\n\t" \
4182          "rorl $16,%1\n\t" \
4183          "movb %b1,4+%0\n\t" \
4184          "movb %4,5+%0\n\t" \
4185          "movb $0,6+%0\n\t" \
4186          "movb %h1,7+%0\n\t" \
4187          "rorl $16,%1" \
4188          : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
4189
4190          This works great except that the output assembler ends
4191          up looking a bit weird if it turns out that there is
4192          no offset.  You end up producing code that looks like:
4193
4194          #APP
4195          movw $235,(%eax)
4196          movw %dx,2+(%eax)
4197          rorl $16,%edx
4198          movb %dl,4+(%eax)
4199          movb $137,5+(%eax)
4200          movb $0,6+(%eax)
4201          movb %dh,7+(%eax)
4202          rorl $16,%edx
4203          #NO_APP
4204
4205          So here we provide the missing zero.  */
4206
4207       *displacement_string_end = '0';
4208     }
4209 #endif
4210   gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
4211   if (gotfree_input_line)
4212     input_line_pointer = gotfree_input_line;
4213
4214   exp_seg = expression (exp);
4215
4216   SKIP_WHITESPACE ();
4217   if (*input_line_pointer)
4218     as_bad (_("junk `%s' after expression"), input_line_pointer);
4219 #if GCC_ASM_O_HACK
4220   RESTORE_END_STRING (disp_end + 1);
4221 #endif
4222   RESTORE_END_STRING (disp_end);
4223   input_line_pointer = save_input_line_pointer;
4224   if (gotfree_input_line)
4225     free (gotfree_input_line);
4226
4227   /* We do this to make sure that the section symbol is in
4228      the symbol table.  We will ultimately change the relocation
4229      to be relative to the beginning of the section.  */
4230   if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
4231       || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
4232       || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
4233     {
4234       if (exp->X_op != O_symbol)
4235         {
4236           as_bad (_("bad expression used with @%s"),
4237                   (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
4238                    ? "GOTPCREL"
4239                    : "GOTOFF"));
4240           return 0;
4241         }
4242
4243       if (S_IS_LOCAL (exp->X_add_symbol)
4244           && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section)
4245         section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
4246       exp->X_op = O_subtract;
4247       exp->X_op_symbol = GOT_symbol;
4248       if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
4249         i.reloc[this_operand] = BFD_RELOC_32_PCREL;
4250       else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
4251         i.reloc[this_operand] = BFD_RELOC_64;
4252       else
4253         i.reloc[this_operand] = BFD_RELOC_32;
4254     }
4255
4256   if (exp->X_op == O_absent || exp->X_op == O_big)
4257     {
4258       /* Missing or bad expr becomes absolute 0.  */
4259       as_bad (_("missing or invalid displacement expression `%s' taken as 0"),
4260               disp_start);
4261       exp->X_op = O_constant;
4262       exp->X_add_number = 0;
4263       exp->X_add_symbol = (symbolS *) 0;
4264       exp->X_op_symbol = (symbolS *) 0;
4265     }
4266
4267 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
4268   if (exp->X_op != O_constant
4269       && OUTPUT_FLAVOR == bfd_target_aout_flavour
4270       && exp_seg != absolute_section
4271       && exp_seg != text_section
4272       && exp_seg != data_section
4273       && exp_seg != bss_section
4274       && exp_seg != undefined_section
4275       && !bfd_is_com_section (exp_seg))
4276     {
4277       as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
4278       return 0;
4279     }
4280 #endif
4281
4282   if (!(i.types[this_operand] & ~Disp))
4283     i.types[this_operand] &= types;
4284
4285   return 1;
4286 }
4287
4288 static int i386_index_check PARAMS ((const char *));
4289
4290 /* Make sure the memory operand we've been dealt is valid.
4291    Return 1 on success, 0 on a failure.  */
4292
4293 static int
4294 i386_index_check (operand_string)
4295      const char *operand_string;
4296 {
4297   int ok;
4298 #if INFER_ADDR_PREFIX
4299   int fudged = 0;
4300
4301  tryprefix:
4302 #endif
4303   ok = 1;
4304   if ((current_templates->start->cpu_flags & CpuSVME)
4305       && current_templates->end[-1].operand_types[0] == AnyMem)
4306     {
4307       /* Memory operands of SVME insns are special in that they only allow
4308          rAX as their memory address and ignore any segment override.  */
4309       unsigned RegXX;
4310
4311       /* SKINIT is even more restrictive: it always requires EAX.  */
4312       if (strcmp (current_templates->start->name, "skinit") == 0)
4313         RegXX = Reg32;
4314       else if (flag_code == CODE_64BIT)
4315         RegXX = i.prefix[ADDR_PREFIX] == 0 ? Reg64 : Reg32;
4316       else
4317         RegXX = (flag_code == CODE_16BIT) ^ (i.prefix[ADDR_PREFIX] != 0)
4318                 ? Reg16
4319                 : Reg32;
4320       if (!i.base_reg
4321           || !(i.base_reg->reg_type & Acc)
4322           || !(i.base_reg->reg_type & RegXX)
4323           || i.index_reg
4324           || (i.types[0] & Disp))
4325         ok = 0;
4326     }
4327   else if (flag_code == CODE_64BIT)
4328      {
4329        unsigned RegXX = (i.prefix[ADDR_PREFIX] == 0 ? Reg64 : Reg32);
4330
4331        if ((i.base_reg
4332             && ((i.base_reg->reg_type & RegXX) == 0)
4333             && (i.base_reg->reg_type != BaseIndex
4334                 || i.index_reg))
4335            || (i.index_reg
4336                && ((i.index_reg->reg_type & (RegXX | BaseIndex))
4337                    != (RegXX | BaseIndex))))
4338          ok = 0;
4339     }
4340   else
4341     {
4342       if ((flag_code == CODE_16BIT) ^ (i.prefix[ADDR_PREFIX] != 0))
4343         {
4344           /* 16bit checks.  */
4345           if ((i.base_reg
4346                && ((i.base_reg->reg_type & (Reg16 | BaseIndex | RegRex))
4347                    != (Reg16 | BaseIndex)))
4348               || (i.index_reg
4349                   && (((i.index_reg->reg_type & (Reg16 | BaseIndex))
4350                        != (Reg16 | BaseIndex))
4351                       || !(i.base_reg
4352                            && i.base_reg->reg_num < 6
4353                            && i.index_reg->reg_num >= 6
4354                            && i.log2_scale_factor == 0))))
4355             ok = 0;
4356         }
4357       else
4358         {
4359           /* 32bit checks.  */
4360           if ((i.base_reg
4361                && (i.base_reg->reg_type & (Reg32 | RegRex)) != Reg32)
4362               || (i.index_reg
4363                   && ((i.index_reg->reg_type & (Reg32 | BaseIndex | RegRex))
4364                       != (Reg32 | BaseIndex))))
4365             ok = 0;
4366         }
4367     }
4368   if (!ok)
4369     {
4370 #if INFER_ADDR_PREFIX
4371       if (i.prefix[ADDR_PREFIX] == 0)
4372         {
4373           i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
4374           i.prefixes += 1;
4375           /* Change the size of any displacement too.  At most one of
4376              Disp16 or Disp32 is set.
4377              FIXME.  There doesn't seem to be any real need for separate
4378              Disp16 and Disp32 flags.  The same goes for Imm16 and Imm32.
4379              Removing them would probably clean up the code quite a lot.  */
4380           if (flag_code != CODE_64BIT && (i.types[this_operand] & (Disp16 | Disp32)))
4381              i.types[this_operand] ^= (Disp16 | Disp32);
4382           fudged = 1;
4383           goto tryprefix;
4384         }
4385       if (fudged)
4386         as_bad (_("`%s' is not a valid base/index expression"),
4387                 operand_string);
4388       else
4389 #endif
4390         as_bad (_("`%s' is not a valid %s bit base/index expression"),
4391                 operand_string,
4392                 flag_code_names[flag_code]);
4393     }
4394   return ok;
4395 }
4396
4397 /* Parse OPERAND_STRING into the i386_insn structure I.  Returns non-zero
4398    on error.  */
4399
4400 static int
4401 i386_operand (operand_string)
4402      char *operand_string;
4403 {
4404   const reg_entry *r;
4405   char *end_op;
4406   char *op_string = operand_string;
4407
4408   if (is_space_char (*op_string))
4409     ++op_string;
4410
4411   /* We check for an absolute prefix (differentiating,
4412      for example, 'jmp pc_relative_label' from 'jmp *absolute_label'.  */
4413   if (*op_string == ABSOLUTE_PREFIX)
4414     {
4415       ++op_string;
4416       if (is_space_char (*op_string))
4417         ++op_string;
4418       i.types[this_operand] |= JumpAbsolute;
4419     }
4420
4421   /* Check if operand is a register.  */
4422   if ((r = parse_register (op_string, &end_op)) != NULL)
4423     {
4424       /* Check for a segment override by searching for ':' after a
4425          segment register.  */
4426       op_string = end_op;
4427       if (is_space_char (*op_string))
4428         ++op_string;
4429       if (*op_string == ':' && (r->reg_type & (SReg2 | SReg3)))
4430         {
4431           switch (r->reg_num)
4432             {
4433             case 0:
4434               i.seg[i.mem_operands] = &es;
4435               break;
4436             case 1:
4437               i.seg[i.mem_operands] = &cs;
4438               break;
4439             case 2:
4440               i.seg[i.mem_operands] = &ss;
4441               break;
4442             case 3:
4443               i.seg[i.mem_operands] = &ds;
4444               break;
4445             case 4:
4446               i.seg[i.mem_operands] = &fs;
4447               break;
4448             case 5:
4449               i.seg[i.mem_operands] = &gs;
4450               break;
4451             }
4452
4453           /* Skip the ':' and whitespace.  */
4454           ++op_string;
4455           if (is_space_char (*op_string))
4456             ++op_string;
4457
4458           if (!is_digit_char (*op_string)
4459               && !is_identifier_char (*op_string)
4460               && *op_string != '('
4461               && *op_string != ABSOLUTE_PREFIX)
4462             {
4463               as_bad (_("bad memory operand `%s'"), op_string);
4464               return 0;
4465             }
4466           /* Handle case of %es:*foo.  */
4467           if (*op_string == ABSOLUTE_PREFIX)
4468             {
4469               ++op_string;
4470               if (is_space_char (*op_string))
4471                 ++op_string;
4472               i.types[this_operand] |= JumpAbsolute;
4473             }
4474           goto do_memory_reference;
4475         }
4476       if (*op_string)
4477         {
4478           as_bad (_("junk `%s' after register"), op_string);
4479           return 0;
4480         }
4481       i.types[this_operand] |= r->reg_type & ~BaseIndex;
4482       i.op[this_operand].regs = r;
4483       i.reg_operands++;
4484     }
4485   else if (*op_string == REGISTER_PREFIX)
4486     {
4487       as_bad (_("bad register name `%s'"), op_string);
4488       return 0;
4489     }
4490   else if (*op_string == IMMEDIATE_PREFIX)
4491     {
4492       ++op_string;
4493       if (i.types[this_operand] & JumpAbsolute)
4494         {
4495           as_bad (_("immediate operand illegal with absolute jump"));
4496           return 0;
4497         }
4498       if (!i386_immediate (op_string))
4499         return 0;
4500     }
4501   else if (is_digit_char (*op_string)
4502            || is_identifier_char (*op_string)
4503            || *op_string == '(')
4504     {
4505       /* This is a memory reference of some sort.  */
4506       char *base_string;
4507
4508       /* Start and end of displacement string expression (if found).  */
4509       char *displacement_string_start;
4510       char *displacement_string_end;
4511
4512     do_memory_reference:
4513       if ((i.mem_operands == 1
4514            && (current_templates->start->opcode_modifier & IsString) == 0)
4515           || i.mem_operands == 2)
4516         {
4517           as_bad (_("too many memory references for `%s'"),
4518                   current_templates->start->name);
4519           return 0;
4520         }
4521
4522       /* Check for base index form.  We detect the base index form by
4523          looking for an ')' at the end of the operand, searching
4524          for the '(' matching it, and finding a REGISTER_PREFIX or ','
4525          after the '('.  */
4526       base_string = op_string + strlen (op_string);
4527
4528       --base_string;
4529       if (is_space_char (*base_string))
4530         --base_string;
4531
4532       /* If we only have a displacement, set-up for it to be parsed later.  */
4533       displacement_string_start = op_string;
4534       displacement_string_end = base_string + 1;
4535
4536       if (*base_string == ')')
4537         {
4538           char *temp_string;
4539           unsigned int parens_balanced = 1;
4540           /* We've already checked that the number of left & right ()'s are
4541              equal, so this loop will not be infinite.  */
4542           do
4543             {
4544               base_string--;
4545               if (*base_string == ')')
4546                 parens_balanced++;
4547               if (*base_string == '(')
4548                 parens_balanced--;
4549             }
4550           while (parens_balanced);
4551
4552           temp_string = base_string;
4553
4554           /* Skip past '(' and whitespace.  */
4555           ++base_string;
4556           if (is_space_char (*base_string))
4557             ++base_string;
4558
4559           if (*base_string == ','
4560               || ((i.base_reg = parse_register (base_string, &end_op)) != NULL))
4561             {
4562               displacement_string_end = temp_string;
4563
4564               i.types[this_operand] |= BaseIndex;
4565
4566               if (i.base_reg)
4567                 {
4568                   base_string = end_op;
4569                   if (is_space_char (*base_string))
4570                     ++base_string;
4571                 }
4572
4573               /* There may be an index reg or scale factor here.  */
4574               if (*base_string == ',')
4575                 {
4576                   ++base_string;
4577                   if (is_space_char (*base_string))
4578                     ++base_string;
4579
4580                   if ((i.index_reg = parse_register (base_string, &end_op)) != NULL)
4581                     {
4582                       base_string = end_op;
4583                       if (is_space_char (*base_string))
4584                         ++base_string;
4585                       if (*base_string == ',')
4586                         {
4587                           ++base_string;
4588                           if (is_space_char (*base_string))
4589                             ++base_string;
4590                         }
4591                       else if (*base_string != ')')
4592                         {
4593                           as_bad (_("expecting `,' or `)' after index register in `%s'"),
4594                                   operand_string);
4595                           return 0;
4596                         }
4597                     }
4598                   else if (*base_string == REGISTER_PREFIX)
4599                     {
4600                       as_bad (_("bad register name `%s'"), base_string);
4601                       return 0;
4602                     }
4603
4604                   /* Check for scale factor.  */
4605                   if (*base_string != ')')
4606                     {
4607                       char *end_scale = i386_scale (base_string);
4608
4609                       if (!end_scale)
4610                         return 0;
4611
4612                       base_string = end_scale;
4613                       if (is_space_char (*base_string))
4614                         ++base_string;
4615                       if (*base_string != ')')
4616                         {
4617                           as_bad (_("expecting `)' after scale factor in `%s'"),
4618                                   operand_string);
4619                           return 0;
4620                         }
4621                     }
4622                   else if (!i.index_reg)
4623                     {
4624                       as_bad (_("expecting index register or scale factor after `,'; got '%c'"),
4625                               *base_string);
4626                       return 0;
4627                     }
4628                 }
4629               else if (*base_string != ')')
4630                 {
4631                   as_bad (_("expecting `,' or `)' after base register in `%s'"),
4632                           operand_string);
4633                   return 0;
4634                 }
4635             }
4636           else if (*base_string == REGISTER_PREFIX)
4637             {
4638               as_bad (_("bad register name `%s'"), base_string);
4639               return 0;
4640             }
4641         }
4642
4643       /* If there's an expression beginning the operand, parse it,
4644          assuming displacement_string_start and
4645          displacement_string_end are meaningful.  */
4646       if (displacement_string_start != displacement_string_end)
4647         {
4648           if (!i386_displacement (displacement_string_start,
4649                                   displacement_string_end))
4650             return 0;
4651         }
4652
4653       /* Special case for (%dx) while doing input/output op.  */
4654       if (i.base_reg
4655           && i.base_reg->reg_type == (Reg16 | InOutPortReg)
4656           && i.index_reg == 0
4657           && i.log2_scale_factor == 0
4658           && i.seg[i.mem_operands] == 0
4659           && (i.types[this_operand] & Disp) == 0)
4660         {
4661           i.types[this_operand] = InOutPortReg;
4662           return 1;
4663         }
4664
4665       if (i386_index_check (operand_string) == 0)
4666         return 0;
4667       i.mem_operands++;
4668     }
4669   else
4670     {
4671       /* It's not a memory operand; argh!  */
4672       as_bad (_("invalid char %s beginning operand %d `%s'"),
4673               output_invalid (*op_string),
4674               this_operand + 1,
4675               op_string);
4676       return 0;
4677     }
4678   return 1;                     /* Normal return.  */
4679 }
4680 \f
4681 /* md_estimate_size_before_relax()
4682
4683    Called just before relax() for rs_machine_dependent frags.  The x86
4684    assembler uses these frags to handle variable size jump
4685    instructions.
4686
4687    Any symbol that is now undefined will not become defined.
4688    Return the correct fr_subtype in the frag.
4689    Return the initial "guess for variable size of frag" to caller.
4690    The guess is actually the growth beyond the fixed part.  Whatever
4691    we do to grow the fixed or variable part contributes to our
4692    returned value.  */
4693
4694 int
4695 md_estimate_size_before_relax (fragP, segment)
4696      fragS *fragP;
4697      segT segment;
4698 {
4699   /* We've already got fragP->fr_subtype right;  all we have to do is
4700      check for un-relaxable symbols.  On an ELF system, we can't relax
4701      an externally visible symbol, because it may be overridden by a
4702      shared library.  */
4703   if (S_GET_SEGMENT (fragP->fr_symbol) != segment
4704 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4705       || (IS_ELF
4706           && (S_IS_EXTERNAL (fragP->fr_symbol)
4707               || S_IS_WEAK (fragP->fr_symbol)))
4708 #endif
4709       )
4710     {
4711       /* Symbol is undefined in this segment, or we need to keep a
4712          reloc so that weak symbols can be overridden.  */
4713       int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
4714       enum bfd_reloc_code_real reloc_type;
4715       unsigned char *opcode;
4716       int old_fr_fix;
4717
4718       if (fragP->fr_var != NO_RELOC)
4719         reloc_type = fragP->fr_var;
4720       else if (size == 2)
4721         reloc_type = BFD_RELOC_16_PCREL;
4722       else
4723         reloc_type = BFD_RELOC_32_PCREL;
4724
4725       old_fr_fix = fragP->fr_fix;
4726       opcode = (unsigned char *) fragP->fr_opcode;
4727
4728       switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
4729         {
4730         case UNCOND_JUMP:
4731           /* Make jmp (0xeb) a (d)word displacement jump.  */
4732           opcode[0] = 0xe9;
4733           fragP->fr_fix += size;
4734           fix_new (fragP, old_fr_fix, size,
4735                    fragP->fr_symbol,
4736                    fragP->fr_offset, 1,
4737                    reloc_type);
4738           break;
4739
4740         case COND_JUMP86:
4741           if (size == 2
4742               && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
4743             {
4744               /* Negate the condition, and branch past an
4745                  unconditional jump.  */
4746               opcode[0] ^= 1;
4747               opcode[1] = 3;
4748               /* Insert an unconditional jump.  */
4749               opcode[2] = 0xe9;
4750               /* We added two extra opcode bytes, and have a two byte
4751                  offset.  */
4752               fragP->fr_fix += 2 + 2;
4753               fix_new (fragP, old_fr_fix + 2, 2,
4754                        fragP->fr_symbol,
4755                        fragP->fr_offset, 1,
4756                        reloc_type);
4757               break;
4758             }
4759           /* Fall through.  */
4760
4761         case COND_JUMP:
4762           if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
4763             {
4764               fixS *fixP;
4765
4766               fragP->fr_fix += 1;
4767               fixP = fix_new (fragP, old_fr_fix, 1,
4768                               fragP->fr_symbol,
4769                               fragP->fr_offset, 1,
4770                               BFD_RELOC_8_PCREL);
4771               fixP->fx_signed = 1;
4772               break;
4773             }
4774
4775           /* This changes the byte-displacement jump 0x7N
4776              to the (d)word-displacement jump 0x0f,0x8N.  */
4777           opcode[1] = opcode[0] + 0x10;
4778           opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
4779           /* We've added an opcode byte.  */
4780           fragP->fr_fix += 1 + size;
4781           fix_new (fragP, old_fr_fix + 1, size,
4782                    fragP->fr_symbol,
4783                    fragP->fr_offset, 1,
4784                    reloc_type);
4785           break;
4786
4787         default:
4788           BAD_CASE (fragP->fr_subtype);
4789           break;
4790         }
4791       frag_wane (fragP);
4792       return fragP->fr_fix - old_fr_fix;
4793     }
4794
4795   /* Guess size depending on current relax state.  Initially the relax
4796      state will correspond to a short jump and we return 1, because
4797      the variable part of the frag (the branch offset) is one byte
4798      long.  However, we can relax a section more than once and in that
4799      case we must either set fr_subtype back to the unrelaxed state,
4800      or return the value for the appropriate branch.  */
4801   return md_relax_table[fragP->fr_subtype].rlx_length;
4802 }
4803
4804 /* Called after relax() is finished.
4805
4806    In:  Address of frag.
4807         fr_type == rs_machine_dependent.
4808         fr_subtype is what the address relaxed to.
4809
4810    Out: Any fixSs and constants are set up.
4811         Caller will turn frag into a ".space 0".  */
4812
4813 void
4814 md_convert_frag (abfd, sec, fragP)
4815      bfd *abfd ATTRIBUTE_UNUSED;
4816      segT sec ATTRIBUTE_UNUSED;
4817      fragS *fragP;
4818 {
4819   unsigned char *opcode;
4820   unsigned char *where_to_put_displacement = NULL;
4821   offsetT target_address;
4822   offsetT opcode_address;
4823   unsigned int extension = 0;
4824   offsetT displacement_from_opcode_start;
4825
4826   opcode = (unsigned char *) fragP->fr_opcode;
4827
4828   /* Address we want to reach in file space.  */
4829   target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
4830
4831   /* Address opcode resides at in file space.  */
4832   opcode_address = fragP->fr_address + fragP->fr_fix;
4833
4834   /* Displacement from opcode start to fill into instruction.  */
4835   displacement_from_opcode_start = target_address - opcode_address;
4836
4837   if ((fragP->fr_subtype & BIG) == 0)
4838     {
4839       /* Don't have to change opcode.  */
4840       extension = 1;            /* 1 opcode + 1 displacement  */
4841       where_to_put_displacement = &opcode[1];
4842     }
4843   else
4844     {
4845       if (no_cond_jump_promotion
4846           && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
4847         as_warn_where (fragP->fr_file, fragP->fr_line, _("long jump required"));
4848
4849       switch (fragP->fr_subtype)
4850         {
4851         case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
4852           extension = 4;                /* 1 opcode + 4 displacement  */
4853           opcode[0] = 0xe9;
4854           where_to_put_displacement = &opcode[1];
4855           break;
4856
4857         case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
4858           extension = 2;                /* 1 opcode + 2 displacement  */
4859           opcode[0] = 0xe9;
4860           where_to_put_displacement = &opcode[1];
4861           break;
4862
4863         case ENCODE_RELAX_STATE (COND_JUMP, BIG):
4864         case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
4865           extension = 5;                /* 2 opcode + 4 displacement  */
4866           opcode[1] = opcode[0] + 0x10;
4867           opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
4868           where_to_put_displacement = &opcode[2];
4869           break;
4870
4871         case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
4872           extension = 3;                /* 2 opcode + 2 displacement  */
4873           opcode[1] = opcode[0] + 0x10;
4874           opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
4875           where_to_put_displacement = &opcode[2];
4876           break;
4877
4878         case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
4879           extension = 4;
4880           opcode[0] ^= 1;
4881           opcode[1] = 3;
4882           opcode[2] = 0xe9;
4883           where_to_put_displacement = &opcode[3];
4884           break;
4885
4886         default:
4887           BAD_CASE (fragP->fr_subtype);
4888           break;
4889         }
4890     }
4891
4892   /* Now put displacement after opcode.  */
4893   md_number_to_chars ((char *) where_to_put_displacement,
4894                       (valueT) (displacement_from_opcode_start - extension),
4895                       DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
4896   fragP->fr_fix += extension;
4897 }
4898 \f
4899 /* Size of byte displacement jmp.  */
4900 int md_short_jump_size = 2;
4901
4902 /* Size of dword displacement jmp.  */
4903 int md_long_jump_size = 5;
4904
4905 void
4906 md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
4907      char *ptr;
4908      addressT from_addr, to_addr;
4909      fragS *frag ATTRIBUTE_UNUSED;
4910      symbolS *to_symbol ATTRIBUTE_UNUSED;
4911 {
4912   offsetT offset;
4913
4914   offset = to_addr - (from_addr + 2);
4915   /* Opcode for byte-disp jump.  */
4916   md_number_to_chars (ptr, (valueT) 0xeb, 1);
4917   md_number_to_chars (ptr + 1, (valueT) offset, 1);
4918 }
4919
4920 void
4921 md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
4922      char *ptr;
4923      addressT from_addr, to_addr;
4924      fragS *frag ATTRIBUTE_UNUSED;
4925      symbolS *to_symbol ATTRIBUTE_UNUSED;
4926 {
4927   offsetT offset;
4928
4929   offset = to_addr - (from_addr + 5);
4930   md_number_to_chars (ptr, (valueT) 0xe9, 1);
4931   md_number_to_chars (ptr + 1, (valueT) offset, 4);
4932 }
4933 \f
4934 /* Apply a fixup (fixS) to segment data, once it has been determined
4935    by our caller that we have all the info we need to fix it up.
4936
4937    On the 386, immediates, displacements, and data pointers are all in
4938    the same (little-endian) format, so we don't need to care about which
4939    we are handling.  */
4940
4941 void
4942 md_apply_fix (fixP, valP, seg)
4943      /* The fix we're to put in.  */
4944      fixS *fixP;
4945      /* Pointer to the value of the bits.  */
4946      valueT *valP;
4947      /* Segment fix is from.  */
4948      segT seg ATTRIBUTE_UNUSED;
4949 {
4950   char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
4951   valueT value = *valP;
4952
4953 #if !defined (TE_Mach)
4954   if (fixP->fx_pcrel)
4955     {
4956       switch (fixP->fx_r_type)
4957         {
4958         default:
4959           break;
4960
4961         case BFD_RELOC_64:
4962           fixP->fx_r_type = BFD_RELOC_64_PCREL;
4963           break;
4964         case BFD_RELOC_32:
4965         case BFD_RELOC_X86_64_32S:
4966           fixP->fx_r_type = BFD_RELOC_32_PCREL;
4967           break;
4968         case BFD_RELOC_16:
4969           fixP->fx_r_type = BFD_RELOC_16_PCREL;
4970           break;
4971         case BFD_RELOC_8:
4972           fixP->fx_r_type = BFD_RELOC_8_PCREL;
4973           break;
4974         }
4975     }
4976
4977   if (fixP->fx_addsy != NULL
4978       && (fixP->fx_r_type == BFD_RELOC_32_PCREL
4979           || fixP->fx_r_type == BFD_RELOC_64_PCREL
4980           || fixP->fx_r_type == BFD_RELOC_16_PCREL
4981           || fixP->fx_r_type == BFD_RELOC_8_PCREL)
4982       && !use_rela_relocations)
4983     {
4984       /* This is a hack.  There should be a better way to handle this.
4985          This covers for the fact that bfd_install_relocation will
4986          subtract the current location (for partial_inplace, PC relative
4987          relocations); see more below.  */
4988 #ifndef OBJ_AOUT
4989       if (IS_ELF
4990 #ifdef TE_PE
4991           || OUTPUT_FLAVOR == bfd_target_coff_flavour
4992 #endif
4993           )
4994         value += fixP->fx_where + fixP->fx_frag->fr_address;
4995 #endif
4996 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4997       if (IS_ELF)
4998         {
4999           segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
5000
5001           if ((sym_seg == seg
5002                || (symbol_section_p (fixP->fx_addsy)
5003                    && sym_seg != absolute_section))
5004               && !generic_force_reloc (fixP))
5005             {
5006               /* Yes, we add the values in twice.  This is because
5007                  bfd_install_relocation subtracts them out again.  I think
5008                  bfd_install_relocation is broken, but I don't dare change
5009                  it.  FIXME.  */
5010               value += fixP->fx_where + fixP->fx_frag->fr_address;
5011             }
5012         }
5013 #endif
5014 #if defined (OBJ_COFF) && defined (TE_PE)
5015       /* For some reason, the PE format does not store a
5016          section address offset for a PC relative symbol.  */
5017       if (S_GET_SEGMENT (fixP->fx_addsy) != seg
5018           || S_IS_WEAK (fixP->fx_addsy))
5019         value += md_pcrel_from (fixP);
5020 #endif
5021     }
5022
5023   /* Fix a few things - the dynamic linker expects certain values here,
5024      and we must not disappoint it.  */
5025 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
5026   if (IS_ELF && fixP->fx_addsy)
5027     switch (fixP->fx_r_type)
5028       {
5029       case BFD_RELOC_386_PLT32:
5030       case BFD_RELOC_X86_64_PLT32:
5031         /* Make the jump instruction point to the address of the operand.  At
5032            runtime we merely add the offset to the actual PLT entry.  */
5033         value = -4;
5034         break;
5035
5036       case BFD_RELOC_386_TLS_GD:
5037       case BFD_RELOC_386_TLS_LDM:
5038       case BFD_RELOC_386_TLS_IE_32:
5039       case BFD_RELOC_386_TLS_IE:
5040       case BFD_RELOC_386_TLS_GOTIE:
5041       case BFD_RELOC_X86_64_TLSGD:
5042       case BFD_RELOC_X86_64_TLSLD:
5043       case BFD_RELOC_X86_64_GOTTPOFF:
5044         value = 0; /* Fully resolved at runtime.  No addend.  */
5045         /* Fallthrough */
5046       case BFD_RELOC_386_TLS_LE:
5047       case BFD_RELOC_386_TLS_LDO_32:
5048       case BFD_RELOC_386_TLS_LE_32:
5049       case BFD_RELOC_X86_64_DTPOFF32:
5050       case BFD_RELOC_X86_64_DTPOFF64:
5051       case BFD_RELOC_X86_64_TPOFF32:
5052       case BFD_RELOC_X86_64_TPOFF64:
5053         S_SET_THREAD_LOCAL (fixP->fx_addsy);
5054         break;
5055
5056       case BFD_RELOC_386_GOT32:
5057       case BFD_RELOC_X86_64_GOT32:
5058         value = 0; /* Fully resolved at runtime.  No addend.  */
5059         break;
5060
5061       case BFD_RELOC_VTABLE_INHERIT:
5062       case BFD_RELOC_VTABLE_ENTRY:
5063         fixP->fx_done = 0;
5064         return;
5065
5066       default:
5067         break;
5068       }
5069 #endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)  */
5070   *valP = value;
5071 #endif /* !defined (TE_Mach)  */
5072
5073   /* Are we finished with this relocation now?  */
5074   if (fixP->fx_addsy == NULL)
5075     fixP->fx_done = 1;
5076   else if (use_rela_relocations)
5077     {
5078       fixP->fx_no_overflow = 1;
5079       /* Remember value for tc_gen_reloc.  */
5080       fixP->fx_addnumber = value;
5081       value = 0;
5082     }
5083
5084   md_number_to_chars (p, value, fixP->fx_size);
5085 }
5086 \f
5087 #define MAX_LITTLENUMS 6
5088
5089 /* Turn the string pointed to by litP into a floating point constant
5090    of type TYPE, and emit the appropriate bytes.  The number of
5091    LITTLENUMS emitted is stored in *SIZEP.  An error message is
5092    returned, or NULL on OK.  */
5093
5094 char *
5095 md_atof (type, litP, sizeP)
5096      int type;
5097      char *litP;
5098      int *sizeP;
5099 {
5100   int prec;
5101   LITTLENUM_TYPE words[MAX_LITTLENUMS];
5102   LITTLENUM_TYPE *wordP;
5103   char *t;
5104
5105   switch (type)
5106     {
5107     case 'f':
5108     case 'F':
5109       prec = 2;
5110       break;
5111
5112     case 'd':
5113     case 'D':
5114       prec = 4;
5115       break;
5116
5117     case 'x':
5118     case 'X':
5119       prec = 5;
5120       break;
5121
5122     default:
5123       *sizeP = 0;
5124       return _("Bad call to md_atof ()");
5125     }
5126   t = atof_ieee (input_line_pointer, type, words);
5127   if (t)
5128     input_line_pointer = t;
5129
5130   *sizeP = prec * sizeof (LITTLENUM_TYPE);
5131   /* This loops outputs the LITTLENUMs in REVERSE order; in accord with
5132      the bigendian 386.  */
5133   for (wordP = words + prec - 1; prec--;)
5134     {
5135       md_number_to_chars (litP, (valueT) (*wordP--), sizeof (LITTLENUM_TYPE));
5136       litP += sizeof (LITTLENUM_TYPE);
5137     }
5138   return 0;
5139 }
5140 \f
5141 static char output_invalid_buf[8];
5142
5143 static char *
5144 output_invalid (c)
5145      int c;
5146 {
5147   if (ISPRINT (c))
5148     sprintf (output_invalid_buf, "'%c'", c);
5149   else
5150     sprintf (output_invalid_buf, "(0x%x)", (unsigned) c);
5151   return output_invalid_buf;
5152 }
5153
5154 /* REG_STRING starts *before* REGISTER_PREFIX.  */
5155
5156 static const reg_entry *
5157 parse_real_register (char *reg_string, char **end_op)
5158 {
5159   char *s = reg_string;
5160   char *p;
5161   char reg_name_given[MAX_REG_NAME_SIZE + 1];
5162   const reg_entry *r;
5163
5164   /* Skip possible REGISTER_PREFIX and possible whitespace.  */
5165   if (*s == REGISTER_PREFIX)
5166     ++s;
5167
5168   if (is_space_char (*s))
5169     ++s;
5170
5171   p = reg_name_given;
5172   while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
5173     {
5174       if (p >= reg_name_given + MAX_REG_NAME_SIZE)
5175         return (const reg_entry *) NULL;
5176       s++;
5177     }
5178
5179   /* For naked regs, make sure that we are not dealing with an identifier.
5180      This prevents confusing an identifier like `eax_var' with register
5181      `eax'.  */
5182   if (allow_naked_reg && identifier_chars[(unsigned char) *s])
5183     return (const reg_entry *) NULL;
5184
5185   *end_op = s;
5186
5187   r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
5188
5189   /* Handle floating point regs, allowing spaces in the (i) part.  */
5190   if (r == i386_regtab /* %st is first entry of table  */)
5191     {
5192       if (is_space_char (*s))
5193         ++s;
5194       if (*s == '(')
5195         {
5196           ++s;
5197           if (is_space_char (*s))
5198             ++s;
5199           if (*s >= '0' && *s <= '7')
5200             {
5201               r = &i386_float_regtab[*s - '0'];
5202               ++s;
5203               if (is_space_char (*s))
5204                 ++s;
5205               if (*s == ')')
5206                 {
5207                   *end_op = s + 1;
5208                   return r;
5209                 }
5210             }
5211           /* We have "%st(" then garbage.  */
5212           return (const reg_entry *) NULL;
5213         }
5214     }
5215
5216   if (r != NULL
5217       && ((r->reg_flags & (RegRex64 | RegRex)) | (r->reg_type & Reg64)) != 0
5218       && (r->reg_type != Control || !(cpu_arch_flags & CpuSledgehammer))
5219       && flag_code != CODE_64BIT)
5220     return (const reg_entry *) NULL;
5221
5222   return r;
5223 }
5224
5225 /* REG_STRING starts *before* REGISTER_PREFIX.  */
5226
5227 static const reg_entry *
5228 parse_register (char *reg_string, char **end_op)
5229 {
5230   const reg_entry *r;
5231
5232   if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
5233     r = parse_real_register (reg_string, end_op);
5234   else
5235     r = NULL;
5236   if (!r)
5237     {
5238       char *save = input_line_pointer;
5239       char c;
5240       symbolS *symbolP;
5241
5242       input_line_pointer = reg_string;
5243       c = get_symbol_end ();
5244       symbolP = symbol_find (reg_string);
5245       if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
5246         {
5247           const expressionS *e = symbol_get_value_expression (symbolP);
5248
5249           know (e->X_op == O_register);
5250           know (e->X_add_number >= 0 && (valueT) e->X_add_number < ARRAY_SIZE (i386_regtab));
5251           r = i386_regtab + e->X_add_number;
5252           *end_op = input_line_pointer;
5253         }
5254       *input_line_pointer = c;
5255       input_line_pointer = save;
5256     }
5257   return r;
5258 }
5259
5260 int
5261 i386_parse_name (char *name, expressionS *e, char *nextcharP)
5262 {
5263   const reg_entry *r;
5264   char *end = input_line_pointer;
5265
5266   *end = *nextcharP;
5267   r = parse_register (name, &input_line_pointer);
5268   if (r && end <= input_line_pointer)
5269     {
5270       *nextcharP = *input_line_pointer;
5271       *input_line_pointer = 0;
5272       e->X_op = O_register;
5273       e->X_add_number = r - i386_regtab;
5274       return 1;
5275     }
5276   input_line_pointer = end;
5277   *end = 0;
5278   return 0;
5279 }
5280
5281 void
5282 md_operand (expressionS *e)
5283 {
5284   if (*input_line_pointer == REGISTER_PREFIX)
5285     {
5286       char *end;
5287       const reg_entry *r = parse_real_register (input_line_pointer, &end);
5288
5289       if (r)
5290         {
5291           e->X_op = O_register;
5292           e->X_add_number = r - i386_regtab;
5293           input_line_pointer = end;
5294         }
5295     }
5296 }
5297
5298 \f
5299 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
5300 const char *md_shortopts = "kVQ:sqn";
5301 #else
5302 const char *md_shortopts = "qn";
5303 #endif
5304
5305 struct option md_longopts[] = {
5306 #define OPTION_32 (OPTION_MD_BASE + 0)
5307   {"32", no_argument, NULL, OPTION_32},
5308 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
5309 #define OPTION_64 (OPTION_MD_BASE + 1)
5310   {"64", no_argument, NULL, OPTION_64},
5311 #endif
5312   {NULL, no_argument, NULL, 0}
5313 };
5314 size_t md_longopts_size = sizeof (md_longopts);
5315
5316 int
5317 md_parse_option (c, arg)
5318      int c;
5319      char *arg ATTRIBUTE_UNUSED;
5320 {
5321   switch (c)
5322     {
5323     case 'n':
5324       optimize_align_code = 0;
5325       break;
5326
5327     case 'q':
5328       quiet_warnings = 1;
5329       break;
5330
5331 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
5332       /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
5333          should be emitted or not.  FIXME: Not implemented.  */
5334     case 'Q':
5335       break;
5336
5337       /* -V: SVR4 argument to print version ID.  */
5338     case 'V':
5339       print_version_id ();
5340       break;
5341
5342       /* -k: Ignore for FreeBSD compatibility.  */
5343     case 'k':
5344       break;
5345
5346     case 's':
5347       /* -s: On i386 Solaris, this tells the native assembler to use
5348          .stab instead of .stab.excl.  We always use .stab anyhow.  */
5349       break;
5350
5351     case OPTION_64:
5352       {
5353         const char **list, **l;
5354
5355         list = bfd_target_list ();
5356         for (l = list; *l != NULL; l++)
5357           if (strcmp (*l, "elf64-x86-64") == 0)
5358             {
5359               default_arch = "x86_64";
5360               break;
5361             }
5362         if (*l == NULL)
5363           as_fatal (_("No compiled in support for x86_64"));
5364         free (list);
5365       }
5366       break;
5367 #endif
5368
5369     case OPTION_32:
5370       default_arch = "i386";
5371       break;
5372
5373     default:
5374       return 0;
5375     }
5376   return 1;
5377 }
5378
5379 void
5380 md_show_usage (stream)
5381      FILE *stream;
5382 {
5383 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
5384   fprintf (stream, _("\
5385   -Q                      ignored\n\
5386   -V                      print assembler version number\n\
5387   -k                      ignored\n\
5388   -n                      Do not optimize code alignment\n\
5389   -q                      quieten some warnings\n\
5390   -s                      ignored\n"));
5391 #else
5392   fprintf (stream, _("\
5393   -n                      Do not optimize code alignment\n\
5394   -q                      quieten some warnings\n"));
5395 #endif
5396 }
5397
5398 #if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
5399      || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
5400
5401 /* Pick the target format to use.  */
5402
5403 const char *
5404 i386_target_format ()
5405 {
5406   if (!strcmp (default_arch, "x86_64"))
5407     set_code_flag (CODE_64BIT);
5408   else if (!strcmp (default_arch, "i386"))
5409     set_code_flag (CODE_32BIT);
5410   else
5411     as_fatal (_("Unknown architecture"));
5412   switch (OUTPUT_FLAVOR)
5413     {
5414 #ifdef OBJ_MAYBE_AOUT
5415     case bfd_target_aout_flavour:
5416       return AOUT_TARGET_FORMAT;
5417 #endif
5418 #ifdef OBJ_MAYBE_COFF
5419     case bfd_target_coff_flavour:
5420       return "coff-i386";
5421 #endif
5422 #if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
5423     case bfd_target_elf_flavour:
5424       {
5425         if (flag_code == CODE_64BIT)
5426           {
5427             object_64bit = 1;
5428             use_rela_relocations = 1;
5429           }
5430         return flag_code == CODE_64BIT ? "elf64-x86-64" : ELF_TARGET_FORMAT;
5431       }
5432 #endif
5433     default:
5434       abort ();
5435       return NULL;
5436     }
5437 }
5438
5439 #endif /* OBJ_MAYBE_ more than one  */
5440
5441 #if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
5442 void i386_elf_emit_arch_note ()
5443 {
5444   if (IS_ELF && cpu_arch_name != NULL)
5445     {
5446       char *p;
5447       asection *seg = now_seg;
5448       subsegT subseg = now_subseg;
5449       Elf_Internal_Note i_note;
5450       Elf_External_Note e_note;
5451       asection *note_secp;
5452       int len;
5453
5454       /* Create the .note section.  */
5455       note_secp = subseg_new (".note", 0);
5456       bfd_set_section_flags (stdoutput,
5457                              note_secp,
5458                              SEC_HAS_CONTENTS | SEC_READONLY);
5459
5460       /* Process the arch string.  */
5461       len = strlen (cpu_arch_name);
5462
5463       i_note.namesz = len + 1;
5464       i_note.descsz = 0;
5465       i_note.type = NT_ARCH;
5466       p = frag_more (sizeof (e_note.namesz));
5467       md_number_to_chars (p, (valueT) i_note.namesz, sizeof (e_note.namesz));
5468       p = frag_more (sizeof (e_note.descsz));
5469       md_number_to_chars (p, (valueT) i_note.descsz, sizeof (e_note.descsz));
5470       p = frag_more (sizeof (e_note.type));
5471       md_number_to_chars (p, (valueT) i_note.type, sizeof (e_note.type));
5472       p = frag_more (len + 1);
5473       strcpy (p, cpu_arch_name);
5474
5475       frag_align (2, 0, 0);
5476
5477       subseg_set (seg, subseg);
5478     }
5479 }
5480 #endif
5481 \f
5482 symbolS *
5483 md_undefined_symbol (name)
5484      char *name;
5485 {
5486   if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
5487       && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
5488       && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
5489       && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
5490     {
5491       if (!GOT_symbol)
5492         {
5493           if (symbol_find (name))
5494             as_bad (_("GOT already in symbol table"));
5495           GOT_symbol = symbol_new (name, undefined_section,
5496                                    (valueT) 0, &zero_address_frag);
5497         };
5498       return GOT_symbol;
5499     }
5500   return 0;
5501 }
5502
5503 /* Round up a section size to the appropriate boundary.  */
5504
5505 valueT
5506 md_section_align (segment, size)
5507      segT segment ATTRIBUTE_UNUSED;
5508      valueT size;
5509 {
5510 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
5511   if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
5512     {
5513       /* For a.out, force the section size to be aligned.  If we don't do
5514          this, BFD will align it for us, but it will not write out the
5515          final bytes of the section.  This may be a bug in BFD, but it is
5516          easier to fix it here since that is how the other a.out targets
5517          work.  */
5518       int align;
5519
5520       align = bfd_get_section_alignment (stdoutput, segment);
5521       size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
5522     }
5523 #endif
5524
5525   return size;
5526 }
5527
5528 /* On the i386, PC-relative offsets are relative to the start of the
5529    next instruction.  That is, the address of the offset, plus its
5530    size, since the offset is always the last part of the insn.  */
5531
5532 long
5533 md_pcrel_from (fixP)
5534      fixS *fixP;
5535 {
5536   return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
5537 }
5538
5539 #ifndef I386COFF
5540
5541 static void
5542 s_bss (ignore)
5543      int ignore ATTRIBUTE_UNUSED;
5544 {
5545   int temp;
5546
5547 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
5548   if (IS_ELF)
5549     obj_elf_section_change_hook ();
5550 #endif
5551   temp = get_absolute_expression ();
5552   subseg_set (bss_section, (subsegT) temp);
5553   demand_empty_rest_of_line ();
5554 }
5555
5556 #endif
5557
5558 void
5559 i386_validate_fix (fixp)
5560      fixS *fixp;
5561 {
5562   if (fixp->fx_subsy && fixp->fx_subsy == GOT_symbol)
5563     {
5564       if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
5565         {
5566           if (!object_64bit)
5567             abort ();
5568           fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
5569         }
5570       else
5571         {
5572           if (!object_64bit)
5573             fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
5574           else
5575             fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
5576         }
5577       fixp->fx_subsy = 0;
5578     }
5579 }
5580
5581 arelent *
5582 tc_gen_reloc (section, fixp)
5583      asection *section ATTRIBUTE_UNUSED;
5584      fixS *fixp;
5585 {
5586   arelent *rel;
5587   bfd_reloc_code_real_type code;
5588
5589   switch (fixp->fx_r_type)
5590     {
5591     case BFD_RELOC_X86_64_PLT32:
5592     case BFD_RELOC_X86_64_GOT32:
5593     case BFD_RELOC_X86_64_GOTPCREL:
5594     case BFD_RELOC_386_PLT32:
5595     case BFD_RELOC_386_GOT32:
5596     case BFD_RELOC_386_GOTOFF:
5597     case BFD_RELOC_386_GOTPC:
5598     case BFD_RELOC_386_TLS_GD:
5599     case BFD_RELOC_386_TLS_LDM:
5600     case BFD_RELOC_386_TLS_LDO_32:
5601     case BFD_RELOC_386_TLS_IE_32:
5602     case BFD_RELOC_386_TLS_IE:
5603     case BFD_RELOC_386_TLS_GOTIE:
5604     case BFD_RELOC_386_TLS_LE_32:
5605     case BFD_RELOC_386_TLS_LE:
5606     case BFD_RELOC_X86_64_TLSGD:
5607     case BFD_RELOC_X86_64_TLSLD:
5608     case BFD_RELOC_X86_64_DTPOFF32:
5609     case BFD_RELOC_X86_64_DTPOFF64:
5610     case BFD_RELOC_X86_64_GOTTPOFF:
5611     case BFD_RELOC_X86_64_TPOFF32:
5612     case BFD_RELOC_X86_64_TPOFF64:
5613     case BFD_RELOC_X86_64_GOTOFF64:
5614     case BFD_RELOC_X86_64_GOTPC32:
5615     case BFD_RELOC_RVA:
5616     case BFD_RELOC_VTABLE_ENTRY:
5617     case BFD_RELOC_VTABLE_INHERIT:
5618 #ifdef TE_PE
5619     case BFD_RELOC_32_SECREL:
5620 #endif
5621       code = fixp->fx_r_type;
5622       break;
5623     case BFD_RELOC_X86_64_32S:
5624       if (!fixp->fx_pcrel)
5625         {
5626           /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32.  */
5627           code = fixp->fx_r_type;
5628           break;
5629         }
5630     default:
5631       if (fixp->fx_pcrel)
5632         {
5633           switch (fixp->fx_size)
5634             {
5635             default:
5636               as_bad_where (fixp->fx_file, fixp->fx_line,
5637                             _("can not do %d byte pc-relative relocation"),
5638                             fixp->fx_size);
5639               code = BFD_RELOC_32_PCREL;
5640               break;
5641             case 1: code = BFD_RELOC_8_PCREL;  break;
5642             case 2: code = BFD_RELOC_16_PCREL; break;
5643             case 4: code = BFD_RELOC_32_PCREL; break;
5644 #ifdef BFD64
5645             case 8: code = BFD_RELOC_64_PCREL; break;
5646 #endif
5647             }
5648         }
5649       else
5650         {
5651           switch (fixp->fx_size)
5652             {
5653             default:
5654               as_bad_where (fixp->fx_file, fixp->fx_line,
5655                             _("can not do %d byte relocation"),
5656                             fixp->fx_size);
5657               code = BFD_RELOC_32;
5658               break;
5659             case 1: code = BFD_RELOC_8;  break;
5660             case 2: code = BFD_RELOC_16; break;
5661             case 4: code = BFD_RELOC_32; break;
5662 #ifdef BFD64
5663             case 8: code = BFD_RELOC_64; break;
5664 #endif
5665             }
5666         }
5667       break;
5668     }
5669
5670   if ((code == BFD_RELOC_32
5671        || code == BFD_RELOC_32_PCREL
5672        || code == BFD_RELOC_X86_64_32S)
5673       && GOT_symbol
5674       && fixp->fx_addsy == GOT_symbol)
5675     {
5676       if (!object_64bit)
5677         code = BFD_RELOC_386_GOTPC;
5678       else
5679         code = BFD_RELOC_X86_64_GOTPC32;
5680     }
5681
5682   rel = (arelent *) xmalloc (sizeof (arelent));
5683   rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
5684   *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
5685
5686   rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
5687
5688   if (!use_rela_relocations)
5689     {
5690       /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
5691          vtable entry to be used in the relocation's section offset.  */
5692       if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
5693         rel->address = fixp->fx_offset;
5694
5695       rel->addend = 0;
5696     }
5697   /* Use the rela in 64bit mode.  */
5698   else
5699     {
5700       if (!fixp->fx_pcrel)
5701         rel->addend = fixp->fx_offset;
5702       else
5703         switch (code)
5704           {
5705           case BFD_RELOC_X86_64_PLT32:
5706           case BFD_RELOC_X86_64_GOT32:
5707           case BFD_RELOC_X86_64_GOTPCREL:
5708           case BFD_RELOC_X86_64_TLSGD:
5709           case BFD_RELOC_X86_64_TLSLD:
5710           case BFD_RELOC_X86_64_GOTTPOFF:
5711             rel->addend = fixp->fx_offset - fixp->fx_size;
5712             break;
5713           default:
5714             rel->addend = (section->vma
5715                            - fixp->fx_size
5716                            + fixp->fx_addnumber
5717                            + md_pcrel_from (fixp));
5718             break;
5719           }
5720     }
5721
5722   rel->howto = bfd_reloc_type_lookup (stdoutput, code);
5723   if (rel->howto == NULL)
5724     {
5725       as_bad_where (fixp->fx_file, fixp->fx_line,
5726                     _("cannot represent relocation type %s"),
5727                     bfd_get_reloc_code_name (code));
5728       /* Set howto to a garbage value so that we can keep going.  */
5729       rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
5730       assert (rel->howto != NULL);
5731     }
5732
5733   return rel;
5734 }
5735
5736 \f
5737 /* Parse operands using Intel syntax. This implements a recursive descent
5738    parser based on the BNF grammar published in Appendix B of the MASM 6.1
5739    Programmer's Guide.
5740
5741    FIXME: We do not recognize the full operand grammar defined in the MASM
5742           documentation.  In particular, all the structure/union and
5743           high-level macro operands are missing.
5744
5745    Uppercase words are terminals, lower case words are non-terminals.
5746    Objects surrounded by double brackets '[[' ']]' are optional. Vertical
5747    bars '|' denote choices. Most grammar productions are implemented in
5748    functions called 'intel_<production>'.
5749
5750    Initial production is 'expr'.
5751
5752     addOp               + | -
5753
5754     alpha               [a-zA-Z]
5755
5756     binOp               & | AND | \| | OR | ^ | XOR
5757
5758     byteRegister        AL | AH | BL | BH | CL | CH | DL | DH
5759
5760     constant            digits [[ radixOverride ]]
5761
5762     dataType            BYTE | WORD | DWORD | FWORD | QWORD | TBYTE | OWORD | XMMWORD
5763
5764     digits              decdigit
5765                         | digits decdigit
5766                         | digits hexdigit
5767
5768     decdigit            [0-9]
5769
5770     e04                 e04 addOp e05
5771                         | e05
5772
5773     e05                 e05 binOp e06
5774                         | e06
5775
5776     e06                 e06 mulOp e09
5777                         | e09
5778
5779     e09                 OFFSET e10
5780                         | SHORT e10
5781                         | + e10
5782                         | - e10
5783                         | ~ e10
5784                         | NOT e10
5785                         | e09 PTR e10
5786                         | e09 : e10
5787                         | e10
5788
5789     e10                 e10 [ expr ]
5790                         | e11
5791
5792     e11                 ( expr )
5793                         | [ expr ]
5794                         | constant
5795                         | dataType
5796                         | id
5797                         | $
5798                         | register
5799
5800  => expr                expr cmpOp e04
5801                         | e04
5802
5803     gpRegister          AX | EAX | BX | EBX | CX | ECX | DX | EDX
5804                         | BP | EBP | SP | ESP | DI | EDI | SI | ESI
5805
5806     hexdigit            a | b | c | d | e | f
5807                         | A | B | C | D | E | F
5808
5809     id                  alpha
5810                         | id alpha
5811                         | id decdigit
5812
5813     mulOp               * | / | % | MOD | << | SHL | >> | SHR
5814
5815     quote               " | '
5816
5817     register            specialRegister
5818                         | gpRegister
5819                         | byteRegister
5820
5821     segmentRegister     CS | DS | ES | FS | GS | SS
5822
5823     specialRegister     CR0 | CR2 | CR3 | CR4
5824                         | DR0 | DR1 | DR2 | DR3 | DR6 | DR7
5825                         | TR3 | TR4 | TR5 | TR6 | TR7
5826
5827     We simplify the grammar in obvious places (e.g., register parsing is
5828     done by calling parse_register) and eliminate immediate left recursion
5829     to implement a recursive-descent parser.
5830
5831     expr        e04 expr'
5832
5833     expr'       cmpOp e04 expr'
5834                 | Empty
5835
5836     e04         e05 e04'
5837
5838     e04'        addOp e05 e04'
5839                 | Empty
5840
5841     e05         e06 e05'
5842
5843     e05'        binOp e06 e05'
5844                 | Empty
5845
5846     e06         e09 e06'
5847
5848     e06'        mulOp e09 e06'
5849                 | Empty
5850
5851     e09         OFFSET e10 e09'
5852                 | SHORT e10'
5853                 | + e10'
5854                 | - e10'
5855                 | ~ e10'
5856                 | NOT e10'
5857                 | e10 e09'
5858
5859     e09'        PTR e10 e09'
5860                 | : e10 e09'
5861                 | Empty
5862
5863     e10         e11 e10'
5864
5865     e10'        [ expr ] e10'
5866                 | Empty
5867
5868     e11         ( expr )
5869                 | [ expr ]
5870                 | BYTE
5871                 | WORD
5872                 | DWORD
5873                 | FWORD
5874                 | QWORD
5875                 | TBYTE
5876                 | OWORD
5877                 | XMMWORD
5878                 | .
5879                 | $
5880                 | register
5881                 | id
5882                 | constant  */
5883
5884 /* Parsing structure for the intel syntax parser. Used to implement the
5885    semantic actions for the operand grammar.  */
5886 struct intel_parser_s
5887   {
5888     char *op_string;            /* The string being parsed.  */
5889     int got_a_float;            /* Whether the operand is a float.  */
5890     int op_modifier;            /* Operand modifier.  */
5891     int is_mem;                 /* 1 if operand is memory reference.  */
5892     int in_offset;                      /* >=1 if parsing operand of offset.  */
5893     int in_bracket;                     /* >=1 if parsing operand in brackets.  */
5894     const reg_entry *reg;       /* Last register reference found.  */
5895     char *disp;                 /* Displacement string being built.  */
5896     char *next_operand;         /* Resume point when splitting operands.  */
5897   };
5898
5899 static struct intel_parser_s intel_parser;
5900
5901 /* Token structure for parsing intel syntax.  */
5902 struct intel_token
5903   {
5904     int code;                   /* Token code.  */
5905     const reg_entry *reg;       /* Register entry for register tokens.  */
5906     char *str;                  /* String representation.  */
5907   };
5908
5909 static struct intel_token cur_token, prev_token;
5910
5911 /* Token codes for the intel parser. Since T_SHORT is already used
5912    by COFF, undefine it first to prevent a warning.  */
5913 #define T_NIL           -1
5914 #define T_CONST         1
5915 #define T_REG           2
5916 #define T_BYTE          3
5917 #define T_WORD          4
5918 #define T_DWORD         5
5919 #define T_FWORD         6
5920 #define T_QWORD         7
5921 #define T_TBYTE         8
5922 #define T_XMMWORD       9
5923 #undef  T_SHORT
5924 #define T_SHORT         10
5925 #define T_OFFSET        11
5926 #define T_PTR           12
5927 #define T_ID            13
5928 #define T_SHL           14
5929 #define T_SHR           15
5930
5931 /* Prototypes for intel parser functions.  */
5932 static int intel_match_token    PARAMS ((int code));
5933 static void intel_get_token     PARAMS ((void));
5934 static void intel_putback_token PARAMS ((void));
5935 static int intel_expr           PARAMS ((void));
5936 static int intel_e04            PARAMS ((void));
5937 static int intel_e05            PARAMS ((void));
5938 static int intel_e06            PARAMS ((void));
5939 static int intel_e09            PARAMS ((void));
5940 static int intel_bracket_expr   PARAMS ((void));
5941 static int intel_e10            PARAMS ((void));
5942 static int intel_e11            PARAMS ((void));
5943
5944 static int
5945 i386_intel_operand (operand_string, got_a_float)
5946      char *operand_string;
5947      int got_a_float;
5948 {
5949   int ret;
5950   char *p;
5951
5952   p = intel_parser.op_string = xstrdup (operand_string);
5953   intel_parser.disp = (char *) xmalloc (strlen (operand_string) + 1);
5954
5955   for (;;)
5956     {
5957       /* Initialize token holders.  */
5958       cur_token.code = prev_token.code = T_NIL;
5959       cur_token.reg = prev_token.reg = NULL;
5960       cur_token.str = prev_token.str = NULL;
5961
5962       /* Initialize parser structure.  */
5963       intel_parser.got_a_float = got_a_float;
5964       intel_parser.op_modifier = 0;
5965       intel_parser.is_mem = 0;
5966       intel_parser.in_offset = 0;
5967       intel_parser.in_bracket = 0;
5968       intel_parser.reg = NULL;
5969       intel_parser.disp[0] = '\0';
5970       intel_parser.next_operand = NULL;
5971
5972       /* Read the first token and start the parser.  */
5973       intel_get_token ();
5974       ret = intel_expr ();
5975
5976       if (!ret)
5977         break;
5978
5979       if (cur_token.code != T_NIL)
5980         {
5981           as_bad (_("invalid operand for '%s' ('%s' unexpected)"),
5982                   current_templates->start->name, cur_token.str);
5983           ret = 0;
5984         }
5985       /* If we found a memory reference, hand it over to i386_displacement
5986          to fill in the rest of the operand fields.  */
5987       else if (intel_parser.is_mem)
5988         {
5989           if ((i.mem_operands == 1
5990                && (current_templates->start->opcode_modifier & IsString) == 0)
5991               || i.mem_operands == 2)
5992             {
5993               as_bad (_("too many memory references for '%s'"),
5994                       current_templates->start->name);
5995               ret = 0;
5996             }
5997           else
5998             {
5999               char *s = intel_parser.disp;
6000               i.mem_operands++;
6001
6002               if (!quiet_warnings && intel_parser.is_mem < 0)
6003                 /* See the comments in intel_bracket_expr.  */
6004                 as_warn (_("Treating `%s' as memory reference"), operand_string);
6005
6006               /* Add the displacement expression.  */
6007               if (*s != '\0')
6008                 ret = i386_displacement (s, s + strlen (s));
6009               if (ret)
6010                 {
6011                   /* Swap base and index in 16-bit memory operands like
6012                      [si+bx]. Since i386_index_check is also used in AT&T
6013                      mode we have to do that here.  */
6014                   if (i.base_reg
6015                       && i.index_reg
6016                       && (i.base_reg->reg_type & Reg16)
6017                       && (i.index_reg->reg_type & Reg16)
6018                       && i.base_reg->reg_num >= 6
6019                       && i.index_reg->reg_num < 6)
6020                     {
6021                       const reg_entry *base = i.index_reg;
6022
6023                       i.index_reg = i.base_reg;
6024                       i.base_reg = base;
6025                     }
6026                   ret = i386_index_check (operand_string);
6027                 }
6028             }
6029         }
6030
6031       /* Constant and OFFSET expressions are handled by i386_immediate.  */
6032       else if ((intel_parser.op_modifier & (1 << T_OFFSET))
6033                || intel_parser.reg == NULL)
6034         ret = i386_immediate (intel_parser.disp);
6035
6036       if (intel_parser.next_operand && this_operand >= MAX_OPERANDS - 1)
6037         ret = 0;
6038       if (!ret || !intel_parser.next_operand)
6039         break;
6040       intel_parser.op_string = intel_parser.next_operand;
6041       this_operand = i.operands++;
6042     }
6043
6044   free (p);
6045   free (intel_parser.disp);
6046
6047   return ret;
6048 }
6049
6050 #define NUM_ADDRESS_REGS (!!i.base_reg + !!i.index_reg)
6051
6052 /* expr e04 expr'
6053
6054    expr'  cmpOp e04 expr'
6055         | Empty  */
6056 static int
6057 intel_expr ()
6058 {
6059   /* XXX Implement the comparison operators.  */
6060   return intel_e04 ();
6061 }
6062
6063 /* e04  e05 e04'
6064
6065    e04' addOp e05 e04'
6066         | Empty  */
6067 static int
6068 intel_e04 ()
6069 {
6070   int nregs = -1;
6071
6072   for (;;)
6073     {
6074       if (!intel_e05())
6075         return 0;
6076
6077       if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
6078         i.base_reg = i386_regtab + REGNAM_AL; /* al is invalid as base */
6079
6080       if (cur_token.code == '+')
6081         nregs = -1;
6082       else if (cur_token.code == '-')
6083         nregs = NUM_ADDRESS_REGS;
6084       else
6085         return 1;
6086
6087       strcat (intel_parser.disp, cur_token.str);
6088       intel_match_token (cur_token.code);
6089     }
6090 }
6091
6092 /* e05  e06 e05'
6093
6094    e05' binOp e06 e05'
6095         | Empty  */
6096 static int
6097 intel_e05 ()
6098 {
6099   int nregs = ~NUM_ADDRESS_REGS;
6100
6101   for (;;)
6102     {
6103       if (!intel_e06())
6104         return 0;
6105
6106       if (cur_token.code == '&' || cur_token.code == '|' || cur_token.code == '^')
6107         {
6108           char str[2];
6109
6110           str[0] = cur_token.code;
6111           str[1] = 0;
6112           strcat (intel_parser.disp, str);
6113         }
6114       else
6115         break;
6116
6117       intel_match_token (cur_token.code);
6118
6119       if (nregs < 0)
6120         nregs = ~nregs;
6121     }
6122   if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
6123     i.base_reg = i386_regtab + REGNAM_AL + 1; /* cl is invalid as base */
6124   return 1;
6125 }
6126
6127 /* e06  e09 e06'
6128
6129    e06' mulOp e09 e06'
6130         | Empty  */
6131 static int
6132 intel_e06 ()
6133 {
6134   int nregs = ~NUM_ADDRESS_REGS;
6135
6136   for (;;)
6137     {
6138       if (!intel_e09())
6139         return 0;
6140
6141       if (cur_token.code == '*' || cur_token.code == '/' || cur_token.code == '%')
6142         {
6143           char str[2];
6144
6145           str[0] = cur_token.code;
6146           str[1] = 0;
6147           strcat (intel_parser.disp, str);
6148         }
6149       else if (cur_token.code == T_SHL)
6150         strcat (intel_parser.disp, "<<");
6151       else if (cur_token.code == T_SHR)
6152         strcat (intel_parser.disp, ">>");
6153       else
6154         break;
6155
6156      intel_match_token (cur_token.code);
6157
6158       if (nregs < 0)
6159         nregs = ~nregs;
6160     }
6161   if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
6162     i.base_reg = i386_regtab + REGNAM_AL + 2; /* dl is invalid as base */
6163   return 1;
6164 }
6165
6166 /* e09  OFFSET e09
6167         | SHORT e09
6168         | + e09
6169         | - e09
6170         | ~ e09
6171         | NOT e09
6172         | e10 e09'
6173
6174    e09' PTR e10 e09'
6175         | : e10 e09'
6176         | Empty */
6177 static int
6178 intel_e09 ()
6179 {
6180   int nregs = ~NUM_ADDRESS_REGS;
6181   int in_offset = 0;
6182
6183   for (;;)
6184     {
6185       /* Don't consume constants here.  */
6186       if (cur_token.code == '+' || cur_token.code == '-')
6187         {
6188           /* Need to look one token ahead - if the next token
6189              is a constant, the current token is its sign.  */
6190           int next_code;
6191
6192           intel_match_token (cur_token.code);
6193           next_code = cur_token.code;
6194           intel_putback_token ();
6195           if (next_code == T_CONST)
6196             break;
6197         }
6198
6199       /* e09  OFFSET e09  */
6200       if (cur_token.code == T_OFFSET)
6201         {
6202           if (!in_offset++)
6203             ++intel_parser.in_offset;
6204         }
6205
6206       /* e09  SHORT e09  */
6207       else if (cur_token.code == T_SHORT)
6208         intel_parser.op_modifier |= 1 << T_SHORT;
6209
6210       /* e09  + e09  */
6211       else if (cur_token.code == '+')
6212         strcat (intel_parser.disp, "+");
6213
6214       /* e09  - e09
6215               | ~ e09
6216               | NOT e09  */
6217       else if (cur_token.code == '-' || cur_token.code == '~')
6218         {
6219           char str[2];
6220
6221           if (nregs < 0)
6222             nregs = ~nregs;
6223           str[0] = cur_token.code;
6224           str[1] = 0;
6225           strcat (intel_parser.disp, str);
6226         }
6227
6228       /* e09  e10 e09'  */
6229       else
6230         break;
6231
6232       intel_match_token (cur_token.code);
6233     }
6234
6235   for (;;)
6236     {
6237       if (!intel_e10 ())
6238         return 0;
6239
6240       /* e09'  PTR e10 e09' */
6241       if (cur_token.code == T_PTR)
6242         {
6243           char suffix;
6244
6245           if (prev_token.code == T_BYTE)
6246             suffix = BYTE_MNEM_SUFFIX;
6247
6248           else if (prev_token.code == T_WORD)
6249             {
6250               if (current_templates->start->name[0] == 'l'
6251                   && current_templates->start->name[2] == 's'
6252                   && current_templates->start->name[3] == 0)
6253                 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
6254               else if (intel_parser.got_a_float == 2)   /* "fi..." */
6255                 suffix = SHORT_MNEM_SUFFIX;
6256               else
6257                 suffix = WORD_MNEM_SUFFIX;
6258             }
6259
6260           else if (prev_token.code == T_DWORD)
6261             {
6262               if (current_templates->start->name[0] == 'l'
6263                   && current_templates->start->name[2] == 's'
6264                   && current_templates->start->name[3] == 0)
6265                 suffix = WORD_MNEM_SUFFIX;
6266               else if (flag_code == CODE_16BIT
6267                        && (current_templates->start->opcode_modifier
6268                            & (Jump | JumpDword)))
6269                 suffix = LONG_DOUBLE_MNEM_SUFFIX;
6270               else if (intel_parser.got_a_float == 1)   /* "f..." */
6271                 suffix = SHORT_MNEM_SUFFIX;
6272               else
6273                 suffix = LONG_MNEM_SUFFIX;
6274             }
6275
6276           else if (prev_token.code == T_FWORD)
6277             {
6278               if (current_templates->start->name[0] == 'l'
6279                   && current_templates->start->name[2] == 's'
6280                   && current_templates->start->name[3] == 0)
6281                 suffix = LONG_MNEM_SUFFIX;
6282               else if (!intel_parser.got_a_float)
6283                 {
6284                   if (flag_code == CODE_16BIT)
6285                     add_prefix (DATA_PREFIX_OPCODE);
6286                   suffix = LONG_DOUBLE_MNEM_SUFFIX;
6287                 }
6288               else
6289                 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
6290             }
6291
6292           else if (prev_token.code == T_QWORD)
6293             {
6294               if (intel_parser.got_a_float == 1)        /* "f..." */
6295                 suffix = LONG_MNEM_SUFFIX;
6296               else
6297                 suffix = QWORD_MNEM_SUFFIX;
6298             }
6299
6300           else if (prev_token.code == T_TBYTE)
6301             {
6302               if (intel_parser.got_a_float == 1)
6303                 suffix = LONG_DOUBLE_MNEM_SUFFIX;
6304               else
6305                 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
6306             }
6307
6308           else if (prev_token.code == T_XMMWORD)
6309             {
6310               /* XXX ignored for now, but accepted since gcc uses it */
6311               suffix = 0;
6312             }
6313
6314           else
6315             {
6316               as_bad (_("Unknown operand modifier `%s'"), prev_token.str);
6317               return 0;
6318             }
6319
6320           /* Operands for jump/call using 'ptr' notation denote absolute
6321              addresses.  */
6322           if (current_templates->start->opcode_modifier & (Jump | JumpDword))
6323             i.types[this_operand] |= JumpAbsolute;
6324
6325           if (current_templates->start->base_opcode == 0x8d /* lea */)
6326             ;
6327           else if (!i.suffix)
6328             i.suffix = suffix;
6329           else if (i.suffix != suffix)
6330             {
6331               as_bad (_("Conflicting operand modifiers"));
6332               return 0;
6333             }
6334
6335         }
6336
6337       /* e09'  : e10 e09'  */
6338       else if (cur_token.code == ':')
6339         {
6340           if (prev_token.code != T_REG)
6341             {
6342               /* While {call,jmp} SSSS:OOOO is MASM syntax only when SSSS is a
6343                  segment/group identifier (which we don't have), using comma
6344                  as the operand separator there is even less consistent, since
6345                  there all branches only have a single operand.  */
6346               if (this_operand != 0
6347                   || intel_parser.in_offset
6348                   || intel_parser.in_bracket
6349                   || (!(current_templates->start->opcode_modifier
6350                         & (Jump|JumpDword|JumpInterSegment))
6351                       && !(current_templates->start->operand_types[0]
6352                            & JumpAbsolute)))
6353                 return intel_match_token (T_NIL);
6354               /* Remember the start of the 2nd operand and terminate 1st
6355                  operand here.
6356                  XXX This isn't right, yet (when SSSS:OOOO is right operand of
6357                  another expression), but it gets at least the simplest case
6358                  (a plain number or symbol on the left side) right.  */
6359               intel_parser.next_operand = intel_parser.op_string;
6360               *--intel_parser.op_string = '\0';
6361               return intel_match_token (':');
6362             }
6363         }
6364
6365       /* e09'  Empty  */
6366       else
6367         break;
6368
6369       intel_match_token (cur_token.code);
6370
6371     }
6372
6373   if (in_offset)
6374     {
6375       --intel_parser.in_offset;
6376       if (nregs < 0)
6377         nregs = ~nregs;
6378       if (NUM_ADDRESS_REGS > nregs)
6379         {
6380           as_bad (_("Invalid operand to `OFFSET'"));
6381           return 0;
6382         }
6383       intel_parser.op_modifier |= 1 << T_OFFSET;
6384     }
6385
6386   if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
6387     i.base_reg = i386_regtab + REGNAM_AL + 3; /* bl is invalid as base */
6388   return 1;
6389 }
6390
6391 static int
6392 intel_bracket_expr ()
6393 {
6394   int was_offset = intel_parser.op_modifier & (1 << T_OFFSET);
6395   const char *start = intel_parser.op_string;
6396   int len;
6397
6398   if (i.op[this_operand].regs)
6399     return intel_match_token (T_NIL);
6400
6401   intel_match_token ('[');
6402
6403   /* Mark as a memory operand only if it's not already known to be an
6404      offset expression.  If it's an offset expression, we need to keep
6405      the brace in.  */
6406   if (!intel_parser.in_offset)
6407     {
6408       ++intel_parser.in_bracket;
6409
6410       /* Operands for jump/call inside brackets denote absolute addresses.  */
6411       if (current_templates->start->opcode_modifier & (Jump | JumpDword))
6412         i.types[this_operand] |= JumpAbsolute;
6413
6414       /* Unfortunately gas always diverged from MASM in a respect that can't
6415          be easily fixed without risking to break code sequences likely to be
6416          encountered (the testsuite even check for this): MASM doesn't consider
6417          an expression inside brackets unconditionally as a memory reference.
6418          When that is e.g. a constant, an offset expression, or the sum of the
6419          two, this is still taken as a constant load. gas, however, always
6420          treated these as memory references. As a compromise, we'll try to make
6421          offset expressions inside brackets work the MASM way (since that's
6422          less likely to be found in real world code), but make constants alone
6423          continue to work the traditional gas way. In either case, issue a
6424          warning.  */
6425       intel_parser.op_modifier &= ~was_offset;
6426     }
6427   else
6428       strcat (intel_parser.disp, "[");
6429
6430   /* Add a '+' to the displacement string if necessary.  */
6431   if (*intel_parser.disp != '\0'
6432       && *(intel_parser.disp + strlen (intel_parser.disp) - 1) != '+')
6433     strcat (intel_parser.disp, "+");
6434
6435   if (intel_expr ()
6436       && (len = intel_parser.op_string - start - 1,
6437           intel_match_token (']')))
6438     {
6439       /* Preserve brackets when the operand is an offset expression.  */
6440       if (intel_parser.in_offset)
6441         strcat (intel_parser.disp, "]");
6442       else
6443         {
6444           --intel_parser.in_bracket;
6445           if (i.base_reg || i.index_reg)
6446             intel_parser.is_mem = 1;
6447           if (!intel_parser.is_mem)
6448             {
6449               if (!(intel_parser.op_modifier & (1 << T_OFFSET)))
6450                 /* Defer the warning until all of the operand was parsed.  */
6451                 intel_parser.is_mem = -1;
6452               else if (!quiet_warnings)
6453                 as_warn (_("`[%.*s]' taken to mean just `%.*s'"), len, start, len, start);
6454             }
6455         }
6456       intel_parser.op_modifier |= was_offset;
6457
6458       return 1;
6459     }
6460   return 0;
6461 }
6462
6463 /* e10  e11 e10'
6464
6465    e10' [ expr ] e10'
6466         | Empty  */
6467 static int
6468 intel_e10 ()
6469 {
6470   if (!intel_e11 ())
6471     return 0;
6472
6473   while (cur_token.code == '[')
6474     {
6475       if (!intel_bracket_expr ())
6476         return 0;
6477     }
6478
6479   return 1;
6480 }
6481
6482 /* e11  ( expr )
6483         | [ expr ]
6484         | BYTE
6485         | WORD
6486         | DWORD
6487         | FWORD
6488         | QWORD
6489         | TBYTE
6490         | OWORD
6491         | XMMWORD
6492         | $
6493         | .
6494         | register
6495         | id
6496         | constant  */
6497 static int
6498 intel_e11 ()
6499 {
6500   switch (cur_token.code)
6501     {
6502     /* e11  ( expr ) */
6503     case '(':
6504       intel_match_token ('(');
6505       strcat (intel_parser.disp, "(");
6506
6507       if (intel_expr () && intel_match_token (')'))
6508         {
6509           strcat (intel_parser.disp, ")");
6510           return 1;
6511         }
6512       return 0;
6513
6514     /* e11  [ expr ] */
6515     case '[':
6516       return intel_bracket_expr ();
6517
6518     /* e11  $
6519             | .  */
6520     case '.':
6521       strcat (intel_parser.disp, cur_token.str);
6522       intel_match_token (cur_token.code);
6523
6524       /* Mark as a memory operand only if it's not already known to be an
6525          offset expression.  */
6526       if (!intel_parser.in_offset)
6527         intel_parser.is_mem = 1;
6528
6529       return 1;
6530
6531     /* e11  register  */
6532     case T_REG:
6533       {
6534         const reg_entry *reg = intel_parser.reg = cur_token.reg;
6535
6536         intel_match_token (T_REG);
6537
6538         /* Check for segment change.  */
6539         if (cur_token.code == ':')
6540           {
6541             if (!(reg->reg_type & (SReg2 | SReg3)))
6542               {
6543                 as_bad (_("`%s' is not a valid segment register"), reg->reg_name);
6544                 return 0;
6545               }
6546             else if (i.seg[i.mem_operands])
6547               as_warn (_("Extra segment override ignored"));
6548             else
6549               {
6550                 if (!intel_parser.in_offset)
6551                   intel_parser.is_mem = 1;
6552                 switch (reg->reg_num)
6553                   {
6554                   case 0:
6555                     i.seg[i.mem_operands] = &es;
6556                     break;
6557                   case 1:
6558                     i.seg[i.mem_operands] = &cs;
6559                     break;
6560                   case 2:
6561                     i.seg[i.mem_operands] = &ss;
6562                     break;
6563                   case 3:
6564                     i.seg[i.mem_operands] = &ds;
6565                     break;
6566                   case 4:
6567                     i.seg[i.mem_operands] = &fs;
6568                     break;
6569                   case 5:
6570                     i.seg[i.mem_operands] = &gs;
6571                     break;
6572                   }
6573               }
6574           }
6575
6576         /* Not a segment register. Check for register scaling.  */
6577         else if (cur_token.code == '*')
6578           {
6579             if (!intel_parser.in_bracket)
6580               {
6581                 as_bad (_("Register scaling only allowed in memory operands"));
6582                 return 0;
6583               }
6584
6585             if (reg->reg_type & Reg16) /* Disallow things like [si*1]. */
6586               reg = i386_regtab + REGNAM_AX + 4; /* sp is invalid as index */
6587             else if (i.index_reg)
6588               reg = i386_regtab + REGNAM_EAX + 4; /* esp is invalid as index */
6589
6590             /* What follows must be a valid scale.  */
6591             intel_match_token ('*');
6592             i.index_reg = reg;
6593             i.types[this_operand] |= BaseIndex;
6594
6595             /* Set the scale after setting the register (otherwise,
6596                i386_scale will complain)  */
6597             if (cur_token.code == '+' || cur_token.code == '-')
6598               {
6599                 char *str, sign = cur_token.code;
6600                 intel_match_token (cur_token.code);
6601                 if (cur_token.code != T_CONST)
6602                   {
6603                     as_bad (_("Syntax error: Expecting a constant, got `%s'"),
6604                             cur_token.str);
6605                     return 0;
6606                   }
6607                 str = (char *) xmalloc (strlen (cur_token.str) + 2);
6608                 strcpy (str + 1, cur_token.str);
6609                 *str = sign;
6610                 if (!i386_scale (str))
6611                   return 0;
6612                 free (str);
6613               }
6614             else if (!i386_scale (cur_token.str))
6615               return 0;
6616             intel_match_token (cur_token.code);
6617           }
6618
6619         /* No scaling. If this is a memory operand, the register is either a
6620            base register (first occurrence) or an index register (second
6621            occurrence).  */
6622         else if (intel_parser.in_bracket && !(reg->reg_type & (SReg2 | SReg3)))
6623           {
6624
6625             if (!i.base_reg)
6626               i.base_reg = reg;
6627             else if (!i.index_reg)
6628               i.index_reg = reg;
6629             else
6630               {
6631                 as_bad (_("Too many register references in memory operand"));
6632                 return 0;
6633               }
6634
6635             i.types[this_operand] |= BaseIndex;
6636           }
6637
6638         /* It's neither base nor index.  */
6639         else if (!intel_parser.in_offset && !intel_parser.is_mem)
6640           {
6641             i.types[this_operand] |= reg->reg_type & ~BaseIndex;
6642             i.op[this_operand].regs = reg;
6643             i.reg_operands++;
6644           }
6645         else
6646           {
6647             as_bad (_("Invalid use of register"));
6648             return 0;
6649           }
6650
6651         /* Since registers are not part of the displacement string (except
6652            when we're parsing offset operands), we may need to remove any
6653            preceding '+' from the displacement string.  */
6654         if (*intel_parser.disp != '\0'
6655             && !intel_parser.in_offset)
6656           {
6657             char *s = intel_parser.disp;
6658             s += strlen (s) - 1;
6659             if (*s == '+')
6660               *s = '\0';
6661           }
6662
6663         return 1;
6664       }
6665
6666     /* e11  BYTE
6667             | WORD
6668             | DWORD
6669             | FWORD
6670             | QWORD
6671             | TBYTE
6672             | OWORD
6673             | XMMWORD  */
6674     case T_BYTE:
6675     case T_WORD:
6676     case T_DWORD:
6677     case T_FWORD:
6678     case T_QWORD:
6679     case T_TBYTE:
6680     case T_XMMWORD:
6681       intel_match_token (cur_token.code);
6682
6683       if (cur_token.code == T_PTR)
6684         return 1;
6685
6686       /* It must have been an identifier.  */
6687       intel_putback_token ();
6688       cur_token.code = T_ID;
6689       /* FALLTHRU */
6690
6691     /* e11  id
6692             | constant  */
6693     case T_ID:
6694       if (!intel_parser.in_offset && intel_parser.is_mem <= 0)
6695         {
6696           symbolS *symbolP;
6697
6698           /* The identifier represents a memory reference only if it's not
6699              preceded by an offset modifier and if it's not an equate.  */
6700           symbolP = symbol_find(cur_token.str);
6701           if (!symbolP || S_GET_SEGMENT(symbolP) != absolute_section)
6702             intel_parser.is_mem = 1;
6703         }
6704         /* FALLTHRU */
6705
6706     case T_CONST:
6707     case '-':
6708     case '+':
6709       {
6710         char *save_str, sign = 0;
6711
6712         /* Allow constants that start with `+' or `-'.  */
6713         if (cur_token.code == '-' || cur_token.code == '+')
6714           {
6715             sign = cur_token.code;
6716             intel_match_token (cur_token.code);
6717             if (cur_token.code != T_CONST)
6718               {
6719                 as_bad (_("Syntax error: Expecting a constant, got `%s'"),
6720                         cur_token.str);
6721                 return 0;
6722               }
6723           }
6724
6725         save_str = (char *) xmalloc (strlen (cur_token.str) + 2);
6726         strcpy (save_str + !!sign, cur_token.str);
6727         if (sign)
6728           *save_str = sign;
6729
6730         /* Get the next token to check for register scaling.  */
6731         intel_match_token (cur_token.code);
6732
6733         /* Check if this constant is a scaling factor for an index register.  */
6734         if (cur_token.code == '*')
6735           {
6736             if (intel_match_token ('*') && cur_token.code == T_REG)
6737               {
6738                 const reg_entry *reg = cur_token.reg;
6739
6740                 if (!intel_parser.in_bracket)
6741                   {
6742                     as_bad (_("Register scaling only allowed in memory operands"));
6743                     return 0;
6744                   }
6745
6746                 if (reg->reg_type & Reg16) /* Disallow things like [1*si]. */
6747                   reg = i386_regtab + REGNAM_AX + 4; /* sp is invalid as index */
6748                 else if (i.index_reg)
6749                   reg = i386_regtab + REGNAM_EAX + 4; /* esp is invalid as index */
6750
6751                 /* The constant is followed by `* reg', so it must be
6752                    a valid scale.  */
6753                 i.index_reg = reg;
6754                 i.types[this_operand] |= BaseIndex;
6755
6756                 /* Set the scale after setting the register (otherwise,
6757                    i386_scale will complain)  */
6758                 if (!i386_scale (save_str))
6759                   return 0;
6760                 intel_match_token (T_REG);
6761
6762                 /* Since registers are not part of the displacement
6763                    string, we may need to remove any preceding '+' from
6764                    the displacement string.  */
6765                 if (*intel_parser.disp != '\0')
6766                   {
6767                     char *s = intel_parser.disp;
6768                     s += strlen (s) - 1;
6769                     if (*s == '+')
6770                       *s = '\0';
6771                   }
6772
6773                 free (save_str);
6774
6775                 return 1;
6776               }
6777
6778             /* The constant was not used for register scaling. Since we have
6779                already consumed the token following `*' we now need to put it
6780                back in the stream.  */
6781             intel_putback_token ();
6782           }
6783
6784         /* Add the constant to the displacement string.  */
6785         strcat (intel_parser.disp, save_str);
6786         free (save_str);
6787
6788         return 1;
6789       }
6790     }
6791
6792   as_bad (_("Unrecognized token '%s'"), cur_token.str);
6793   return 0;
6794 }
6795
6796 /* Match the given token against cur_token. If they match, read the next
6797    token from the operand string.  */
6798 static int
6799 intel_match_token (code)
6800      int code;
6801 {
6802   if (cur_token.code == code)
6803     {
6804       intel_get_token ();
6805       return 1;
6806     }
6807   else
6808     {
6809       as_bad (_("Unexpected token `%s'"), cur_token.str);
6810       return 0;
6811     }
6812 }
6813
6814 /* Read a new token from intel_parser.op_string and store it in cur_token.  */
6815 static void
6816 intel_get_token ()
6817 {
6818   char *end_op;
6819   const reg_entry *reg;
6820   struct intel_token new_token;
6821
6822   new_token.code = T_NIL;
6823   new_token.reg = NULL;
6824   new_token.str = NULL;
6825
6826   /* Free the memory allocated to the previous token and move
6827      cur_token to prev_token.  */
6828   if (prev_token.str)
6829     free (prev_token.str);
6830
6831   prev_token = cur_token;
6832
6833   /* Skip whitespace.  */
6834   while (is_space_char (*intel_parser.op_string))
6835     intel_parser.op_string++;
6836
6837   /* Return an empty token if we find nothing else on the line.  */
6838   if (*intel_parser.op_string == '\0')
6839     {
6840       cur_token = new_token;
6841       return;
6842     }
6843
6844   /* The new token cannot be larger than the remainder of the operand
6845      string.  */
6846   new_token.str = (char *) xmalloc (strlen (intel_parser.op_string) + 1);
6847   new_token.str[0] = '\0';
6848
6849   if (strchr ("0123456789", *intel_parser.op_string))
6850     {
6851       char *p = new_token.str;
6852       char *q = intel_parser.op_string;
6853       new_token.code = T_CONST;
6854
6855       /* Allow any kind of identifier char to encompass floating point and
6856          hexadecimal numbers.  */
6857       while (is_identifier_char (*q))
6858         *p++ = *q++;
6859       *p = '\0';
6860
6861       /* Recognize special symbol names [0-9][bf].  */
6862       if (strlen (intel_parser.op_string) == 2
6863           && (intel_parser.op_string[1] == 'b'
6864               || intel_parser.op_string[1] == 'f'))
6865         new_token.code = T_ID;
6866     }
6867
6868   else if ((reg = parse_register (intel_parser.op_string, &end_op)) != NULL)
6869     {
6870       size_t len = end_op - intel_parser.op_string;
6871
6872       new_token.code = T_REG;
6873       new_token.reg = reg;
6874
6875       memcpy (new_token.str, intel_parser.op_string, len);
6876       new_token.str[len] = '\0';
6877     }
6878
6879   else if (is_identifier_char (*intel_parser.op_string))
6880     {
6881       char *p = new_token.str;
6882       char *q = intel_parser.op_string;
6883
6884       /* A '.' or '$' followed by an identifier char is an identifier.
6885          Otherwise, it's operator '.' followed by an expression.  */
6886       if ((*q == '.' || *q == '$') && !is_identifier_char (*(q + 1)))
6887         {
6888           new_token.code = '.';
6889           new_token.str[0] = '.';
6890           new_token.str[1] = '\0';
6891         }
6892       else
6893         {
6894           while (is_identifier_char (*q) || *q == '@')
6895             *p++ = *q++;
6896           *p = '\0';
6897
6898           if (strcasecmp (new_token.str, "NOT") == 0)
6899             new_token.code = '~';
6900
6901           else if (strcasecmp (new_token.str, "MOD") == 0)
6902             new_token.code = '%';
6903
6904           else if (strcasecmp (new_token.str, "AND") == 0)
6905             new_token.code = '&';
6906
6907           else if (strcasecmp (new_token.str, "OR") == 0)
6908             new_token.code = '|';
6909
6910           else if (strcasecmp (new_token.str, "XOR") == 0)
6911             new_token.code = '^';
6912
6913           else if (strcasecmp (new_token.str, "SHL") == 0)
6914             new_token.code = T_SHL;
6915
6916           else if (strcasecmp (new_token.str, "SHR") == 0)
6917             new_token.code = T_SHR;
6918
6919           else if (strcasecmp (new_token.str, "BYTE") == 0)
6920             new_token.code = T_BYTE;
6921
6922           else if (strcasecmp (new_token.str, "WORD") == 0)
6923             new_token.code = T_WORD;
6924
6925           else if (strcasecmp (new_token.str, "DWORD") == 0)
6926             new_token.code = T_DWORD;
6927
6928           else if (strcasecmp (new_token.str, "FWORD") == 0)
6929             new_token.code = T_FWORD;
6930
6931           else if (strcasecmp (new_token.str, "QWORD") == 0)
6932             new_token.code = T_QWORD;
6933
6934           else if (strcasecmp (new_token.str, "TBYTE") == 0
6935                    /* XXX remove (gcc still uses it) */
6936                    || strcasecmp (new_token.str, "XWORD") == 0)
6937             new_token.code = T_TBYTE;
6938
6939           else if (strcasecmp (new_token.str, "XMMWORD") == 0
6940                    || strcasecmp (new_token.str, "OWORD") == 0)
6941             new_token.code = T_XMMWORD;
6942
6943           else if (strcasecmp (new_token.str, "PTR") == 0)
6944             new_token.code = T_PTR;
6945
6946           else if (strcasecmp (new_token.str, "SHORT") == 0)
6947             new_token.code = T_SHORT;
6948
6949           else if (strcasecmp (new_token.str, "OFFSET") == 0)
6950             {
6951               new_token.code = T_OFFSET;
6952
6953               /* ??? This is not mentioned in the MASM grammar but gcc
6954                      makes use of it with -mintel-syntax.  OFFSET may be
6955                      followed by FLAT:  */
6956               if (strncasecmp (q, " FLAT:", 6) == 0)
6957                 strcat (new_token.str, " FLAT:");
6958             }
6959
6960           /* ??? This is not mentioned in the MASM grammar.  */
6961           else if (strcasecmp (new_token.str, "FLAT") == 0)
6962             {
6963               new_token.code = T_OFFSET;
6964               if (*q == ':')
6965                 strcat (new_token.str, ":");
6966               else
6967                 as_bad (_("`:' expected"));
6968             }
6969
6970           else
6971             new_token.code = T_ID;
6972         }
6973     }
6974
6975   else if (strchr ("+-/*%|&^:[]()~", *intel_parser.op_string))
6976     {
6977       new_token.code = *intel_parser.op_string;
6978       new_token.str[0] = *intel_parser.op_string;
6979       new_token.str[1] = '\0';
6980     }
6981
6982   else if (strchr ("<>", *intel_parser.op_string)
6983            && *intel_parser.op_string == *(intel_parser.op_string + 1))
6984     {
6985       new_token.code = *intel_parser.op_string == '<' ? T_SHL : T_SHR;
6986       new_token.str[0] = *intel_parser.op_string;
6987       new_token.str[1] = *intel_parser.op_string;
6988       new_token.str[2] = '\0';
6989     }
6990
6991   else
6992     as_bad (_("Unrecognized token `%s'"), intel_parser.op_string);
6993
6994   intel_parser.op_string += strlen (new_token.str);
6995   cur_token = new_token;
6996 }
6997
6998 /* Put cur_token back into the token stream and make cur_token point to
6999    prev_token.  */
7000 static void
7001 intel_putback_token ()
7002 {
7003   if (cur_token.code != T_NIL)
7004     {
7005       intel_parser.op_string -= strlen (cur_token.str);
7006       free (cur_token.str);
7007     }
7008   cur_token = prev_token;
7009
7010   /* Forget prev_token.  */
7011   prev_token.code = T_NIL;
7012   prev_token.reg = NULL;
7013   prev_token.str = NULL;
7014 }
7015
7016 int
7017 tc_x86_regname_to_dw2regnum (const char *regname)
7018 {
7019   unsigned int regnum;
7020   unsigned int regnames_count;
7021   static const char *const regnames_32[] =
7022     {
7023       "eax", "ecx", "edx", "ebx",
7024       "esp", "ebp", "esi", "edi",
7025       "eip", "eflags", NULL,
7026       "st0", "st1", "st2", "st3",
7027       "st4", "st5", "st6", "st7",
7028       NULL, NULL,
7029       "xmm0", "xmm1", "xmm2", "xmm3",
7030       "xmm4", "xmm5", "xmm6", "xmm7",
7031       "mm0", "mm1", "mm2", "mm3",
7032       "mm4", "mm5", "mm6", "mm7",
7033       "fcw", "fsw", "mxcsr",
7034       "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
7035       "tr", "ldtr"
7036     };
7037   static const char *const regnames_64[] =
7038     {
7039       "rax", "rdx", "rcx", "rbx",
7040       "rsi", "rdi", "rbp", "rsp",
7041       "r8",  "r9",  "r10", "r11",
7042       "r12", "r13", "r14", "r15",
7043       "rip",
7044       "xmm0",  "xmm1",  "xmm2",  "xmm3",
7045       "xmm4",  "xmm5",  "xmm6",  "xmm7",
7046       "xmm8",  "xmm9",  "xmm10", "xmm11",
7047       "xmm12", "xmm13", "xmm14", "xmm15",
7048       "st0", "st1", "st2", "st3",
7049       "st4", "st5", "st6", "st7",
7050       "mm0", "mm1", "mm2", "mm3",
7051       "mm4", "mm5", "mm6", "mm7",
7052       "rflags",
7053       "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
7054       "fs.base", "gs.base", NULL, NULL,
7055       "tr", "ldtr",
7056       "mxcsr", "fcw", "fsw"
7057     };
7058   const char *const *regnames;
7059
7060   if (flag_code == CODE_64BIT)
7061     {
7062       regnames = regnames_64;
7063       regnames_count = ARRAY_SIZE (regnames_64);
7064     }
7065   else
7066     {
7067       regnames = regnames_32;
7068       regnames_count = ARRAY_SIZE (regnames_32);
7069     }
7070
7071   for (regnum = 0; regnum < regnames_count; regnum++)
7072     if (regnames[regnum] != NULL
7073         && strcmp (regname, regnames[regnum]) == 0)
7074       return regnum;
7075
7076   return -1;
7077 }
7078
7079 void
7080 tc_x86_frame_initial_instructions (void)
7081 {
7082   static unsigned int sp_regno;
7083
7084   if (!sp_regno)
7085     sp_regno = tc_x86_regname_to_dw2regnum (flag_code == CODE_64BIT
7086                                             ? "rsp" : "esp");
7087
7088   cfi_add_CFA_def_cfa (sp_regno, -x86_cie_data_alignment);
7089   cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
7090 }
7091
7092 int
7093 i386_elf_section_type (const char *str, size_t len)
7094 {
7095   if (flag_code == CODE_64BIT
7096       && len == sizeof ("unwind") - 1
7097       && strncmp (str, "unwind", 6) == 0)
7098     return SHT_X86_64_UNWIND;
7099
7100   return -1;
7101 }
7102
7103 #ifdef TE_PE
7104 void
7105 tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
7106 {
7107   expressionS expr;
7108
7109   expr.X_op = O_secrel;
7110   expr.X_add_symbol = symbol;
7111   expr.X_add_number = 0;
7112   emit_expr (&expr, size);
7113 }
7114 #endif
7115
7116 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7117 /* For ELF on x86-64, add support for SHF_X86_64_LARGE.  */
7118
7119 int
7120 x86_64_section_letter (int letter, char **ptr_msg)
7121 {
7122   if (flag_code == CODE_64BIT)
7123     {
7124       if (letter == 'l')
7125         return SHF_X86_64_LARGE;
7126
7127       *ptr_msg = _("Bad .section directive: want a,l,w,x,M,S,G,T in string");
7128      }
7129   else
7130    *ptr_msg = _("Bad .section directive: want a,w,x,M,S,G,T in string");
7131   return -1;
7132 }
7133
7134 int
7135 x86_64_section_word (char *str, size_t len)
7136 {
7137   if (len == 5 && flag_code == CODE_64BIT && strncmp (str, "large", 5) == 0)
7138     return SHF_X86_64_LARGE;
7139
7140   return -1;
7141 }
7142
7143 static void
7144 handle_large_common (int small ATTRIBUTE_UNUSED)
7145 {
7146   if (flag_code != CODE_64BIT)
7147     {
7148       s_comm_internal (0, elf_common_parse);
7149       as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
7150     }
7151   else
7152     {
7153       static segT lbss_section;
7154       asection *saved_com_section_ptr = elf_com_section_ptr;
7155       asection *saved_bss_section = bss_section;
7156
7157       if (lbss_section == NULL)
7158         {
7159           flagword applicable;
7160           segT seg = now_seg;
7161           subsegT subseg = now_subseg;
7162
7163           /* The .lbss section is for local .largecomm symbols.  */
7164           lbss_section = subseg_new (".lbss", 0);
7165           applicable = bfd_applicable_section_flags (stdoutput);
7166           bfd_set_section_flags (stdoutput, lbss_section,
7167                                  applicable & SEC_ALLOC);
7168           seg_info (lbss_section)->bss = 1;
7169
7170           subseg_set (seg, subseg);
7171         }
7172
7173       elf_com_section_ptr = &_bfd_elf_large_com_section;
7174       bss_section = lbss_section;
7175
7176       s_comm_internal (0, elf_common_parse);
7177
7178       elf_com_section_ptr = saved_com_section_ptr;
7179       bss_section = saved_bss_section;
7180     }
7181 }
7182 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */