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