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