2008-01-10 H.J. Lu <hongjiu.lu@intel.com>
[platform/upstream/binutils.git] / gas / config / tc-i386.c
1 /* tc-i386.c -- Assemble code for the Intel 80386
2    Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
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 3, or (at your option)
11    any later version.
12
13    GAS is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GAS; see the file COPYING.  If not, write to the Free
20    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21    02110-1301, USA.  */
22
23 /* Intel 80386 machine specific gas.
24    Written by Eliot Dresselhaus (eliot@mgm.mit.edu).
25    x86_64 support by Jan Hubicka (jh@suse.cz)
26    VIA PadLock support by Michal Ludvig (mludvig@suse.cz)
27    Bugs & suggestions are completely welcome.  This is free software.
28    Please help us make it better.  */
29
30 #include "as.h"
31 #include "safe-ctype.h"
32 #include "subsegs.h"
33 #include "dwarf2dbg.h"
34 #include "dw2gencfi.h"
35 #include "elf/x86-64.h"
36 #include "opcodes/i386-init.h"
37
38 #ifndef REGISTER_WARNINGS
39 #define REGISTER_WARNINGS 1
40 #endif
41
42 #ifndef INFER_ADDR_PREFIX
43 #define INFER_ADDR_PREFIX 1
44 #endif
45
46 #ifndef DEFAULT_ARCH
47 #define DEFAULT_ARCH "i386"
48 #endif
49
50 #ifndef INLINE
51 #if __GNUC__ >= 2
52 #define INLINE __inline__
53 #else
54 #define INLINE
55 #endif
56 #endif
57
58 static void set_code_flag (int);
59 static void set_16bit_gcc_code_flag (int);
60 static void set_intel_syntax (int);
61 static void set_intel_mnemonic (int);
62 static void set_allow_index_reg (int);
63 static void set_cpu_arch (int);
64 #ifdef TE_PE
65 static void pe_directive_secrel (int);
66 #endif
67 static void signed_cons (int);
68 static char *output_invalid (int c);
69 static int i386_att_operand (char *);
70 static int i386_intel_operand (char *, int);
71 static const reg_entry *parse_register (char *, char **);
72 static char *parse_insn (char *, char *);
73 static char *parse_operands (char *, const char *);
74 static void swap_operands (void);
75 static void swap_2_operands (int, int);
76 static void optimize_imm (void);
77 static void optimize_disp (void);
78 static int match_template (void);
79 static int check_string (void);
80 static int process_suffix (void);
81 static int check_byte_reg (void);
82 static int check_long_reg (void);
83 static int check_qword_reg (void);
84 static int check_word_reg (void);
85 static int finalize_imm (void);
86 static void process_drex (void);
87 static int process_operands (void);
88 static const seg_entry *build_modrm_byte (void);
89 static void output_insn (void);
90 static void output_imm (fragS *, offsetT);
91 static void output_disp (fragS *, offsetT);
92 #ifndef I386COFF
93 static void s_bss (int);
94 #endif
95 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
96 static void handle_large_common (int small ATTRIBUTE_UNUSED);
97 #endif
98
99 static const char *default_arch = DEFAULT_ARCH;
100
101 /* 'md_assemble ()' gathers together information and puts it into a
102    i386_insn.  */
103
104 union i386_op
105   {
106     expressionS *disps;
107     expressionS *imms;
108     const reg_entry *regs;
109   };
110
111 struct _i386_insn
112   {
113     /* TM holds the template for the insn were currently assembling.  */
114     template tm;
115
116     /* SUFFIX holds the instruction mnemonic suffix if given.
117        (e.g. 'l' for 'movl')  */
118     char suffix;
119
120     /* OPERANDS gives the number of given operands.  */
121     unsigned int operands;
122
123     /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
124        of given register, displacement, memory operands and immediate
125        operands.  */
126     unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
127
128     /* TYPES [i] is the type (see above #defines) which tells us how to
129        use OP[i] for the corresponding operand.  */
130     i386_operand_type types[MAX_OPERANDS];
131
132     /* Displacement expression, immediate expression, or register for each
133        operand.  */
134     union i386_op op[MAX_OPERANDS];
135
136     /* Flags for operands.  */
137     unsigned int flags[MAX_OPERANDS];
138 #define Operand_PCrel 1
139
140     /* Relocation type for operand */
141     enum bfd_reloc_code_real reloc[MAX_OPERANDS];
142
143     /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
144        the base index byte below.  */
145     const reg_entry *base_reg;
146     const reg_entry *index_reg;
147     unsigned int log2_scale_factor;
148
149     /* SEG gives the seg_entries of this insn.  They are zero unless
150        explicit segment overrides are given.  */
151     const seg_entry *seg[2];
152
153     /* PREFIX holds all the given prefix opcodes (usually null).
154        PREFIXES is the number of prefix opcodes.  */
155     unsigned int prefixes;
156     unsigned char prefix[MAX_PREFIXES];
157
158     /* RM and SIB are the modrm byte and the sib byte where the
159        addressing modes of this insn are encoded.  DREX is the byte
160        added by the SSE5 instructions.  */
161
162     modrm_byte rm;
163     rex_byte rex;
164     sib_byte sib;
165     drex_byte drex;
166   };
167
168 typedef struct _i386_insn i386_insn;
169
170 /* List of chars besides those in app.c:symbol_chars that can start an
171    operand.  Used to prevent the scrubber eating vital white-space.  */
172 const char extra_symbol_chars[] = "*%-(["
173 #ifdef LEX_AT
174         "@"
175 #endif
176 #ifdef LEX_QM
177         "?"
178 #endif
179         ;
180
181 #if (defined (TE_I386AIX)                               \
182      || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
183          && !defined (TE_GNU)                           \
184          && !defined (TE_LINUX)                         \
185          && !defined (TE_NETWARE)                       \
186          && !defined (TE_FreeBSD)                       \
187          && !defined (TE_NetBSD)))
188 /* This array holds the chars that always start a comment.  If the
189    pre-processor is disabled, these aren't very useful.  The option
190    --divide will remove '/' from this list.  */
191 const char *i386_comment_chars = "#/";
192 #define SVR4_COMMENT_CHARS 1
193 #define PREFIX_SEPARATOR '\\'
194
195 #else
196 const char *i386_comment_chars = "#";
197 #define PREFIX_SEPARATOR '/'
198 #endif
199
200 /* This array holds the chars that only start a comment at the beginning of
201    a line.  If the line seems to have the form '# 123 filename'
202    .line and .file directives will appear in the pre-processed output.
203    Note that input_file.c hand checks for '#' at the beginning of the
204    first line of the input file.  This is because the compiler outputs
205    #NO_APP at the beginning of its output.
206    Also note that comments started like this one will always work if
207    '/' isn't otherwise defined.  */
208 const char line_comment_chars[] = "#/";
209
210 const char line_separator_chars[] = ";";
211
212 /* Chars that can be used to separate mant from exp in floating point
213    nums.  */
214 const char EXP_CHARS[] = "eE";
215
216 /* Chars that mean this number is a floating point constant
217    As in 0f12.456
218    or    0d1.2345e12.  */
219 const char FLT_CHARS[] = "fFdDxX";
220
221 /* Tables for lexical analysis.  */
222 static char mnemonic_chars[256];
223 static char register_chars[256];
224 static char operand_chars[256];
225 static char identifier_chars[256];
226 static char digit_chars[256];
227
228 /* Lexical macros.  */
229 #define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
230 #define is_operand_char(x) (operand_chars[(unsigned char) x])
231 #define is_register_char(x) (register_chars[(unsigned char) x])
232 #define is_space_char(x) ((x) == ' ')
233 #define is_identifier_char(x) (identifier_chars[(unsigned char) x])
234 #define is_digit_char(x) (digit_chars[(unsigned char) x])
235
236 /* All non-digit non-letter characters that may occur in an operand.  */
237 static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
238
239 /* md_assemble() always leaves the strings it's passed unaltered.  To
240    effect this we maintain a stack of saved characters that we've smashed
241    with '\0's (indicating end of strings for various sub-fields of the
242    assembler instruction).  */
243 static char save_stack[32];
244 static char *save_stack_p;
245 #define END_STRING_AND_SAVE(s) \
246         do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
247 #define RESTORE_END_STRING(s) \
248         do { *(s) = *--save_stack_p; } while (0)
249
250 /* The instruction we're assembling.  */
251 static i386_insn i;
252
253 /* Possible templates for current insn.  */
254 static const templates *current_templates;
255
256 /* Per instruction expressionS buffers: max displacements & immediates.  */
257 static expressionS disp_expressions[MAX_MEMORY_OPERANDS];
258 static expressionS im_expressions[MAX_IMMEDIATE_OPERANDS];
259
260 /* Current operand we are working on.  */
261 static int this_operand;
262
263 /* We support four different modes.  FLAG_CODE variable is used to distinguish
264    these.  */
265
266 enum flag_code {
267         CODE_32BIT,
268         CODE_16BIT,
269         CODE_64BIT };
270
271 static enum flag_code flag_code;
272 static unsigned int object_64bit;
273 static int use_rela_relocations = 0;
274
275 /* The names used to print error messages.  */
276 static const char *flag_code_names[] =
277   {
278     "32",
279     "16",
280     "64"
281   };
282
283 /* 1 for intel syntax,
284    0 if att syntax.  */
285 static int intel_syntax = 0;
286
287 /* 1 for intel mnemonic,
288    0 if att mnemonic.  */
289 static int intel_mnemonic = !SYSV386_COMPAT;
290
291 /* 1 if support old (<= 2.8.1) versions of gcc.  */
292 static int old_gcc = OLDGCC_COMPAT;
293
294 /* 1 if register prefix % not required.  */
295 static int allow_naked_reg = 0;
296
297 /* 1 if pseudo index register, eiz/riz, is allowed .  */
298 static int allow_index_reg = 0;
299
300 /* Register prefix used for error message.  */
301 static const char *register_prefix = "%";
302
303 /* Used in 16 bit gcc mode to add an l suffix to call, ret, enter,
304    leave, push, and pop instructions so that gcc has the same stack
305    frame as in 32 bit mode.  */
306 static char stackop_size = '\0';
307
308 /* Non-zero to optimize code alignment.  */
309 int optimize_align_code = 1;
310
311 /* Non-zero to quieten some warnings.  */
312 static int quiet_warnings = 0;
313
314 /* CPU name.  */
315 static const char *cpu_arch_name = NULL;
316 static const char *cpu_sub_arch_name = NULL;
317
318 /* CPU feature flags.  */
319 static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
320
321 /* If we have selected a cpu we are generating instructions for.  */
322 static int cpu_arch_tune_set = 0;
323
324 /* Cpu we are generating instructions for.  */
325 static enum processor_type cpu_arch_tune = PROCESSOR_UNKNOWN;
326
327 /* CPU feature flags of cpu we are generating instructions for.  */
328 static i386_cpu_flags cpu_arch_tune_flags;
329
330 /* CPU instruction set architecture used.  */
331 static enum processor_type cpu_arch_isa = PROCESSOR_UNKNOWN;
332
333 /* CPU feature flags of instruction set architecture used.  */
334 static i386_cpu_flags cpu_arch_isa_flags;
335
336 /* If set, conditional jumps are not automatically promoted to handle
337    larger than a byte offset.  */
338 static unsigned int no_cond_jump_promotion = 0;
339
340 /* Pre-defined "_GLOBAL_OFFSET_TABLE_".  */
341 static symbolS *GOT_symbol;
342
343 /* The dwarf2 return column, adjusted for 32 or 64 bit.  */
344 unsigned int x86_dwarf2_return_column;
345
346 /* The dwarf2 data alignment, adjusted for 32 or 64 bit.  */
347 int x86_cie_data_alignment;
348
349 /* Interface to relax_segment.
350    There are 3 major relax states for 386 jump insns because the
351    different types of jumps add different sizes to frags when we're
352    figuring out what sort of jump to choose to reach a given label.  */
353
354 /* Types.  */
355 #define UNCOND_JUMP 0
356 #define COND_JUMP 1
357 #define COND_JUMP86 2
358
359 /* Sizes.  */
360 #define CODE16  1
361 #define SMALL   0
362 #define SMALL16 (SMALL | CODE16)
363 #define BIG     2
364 #define BIG16   (BIG | CODE16)
365
366 #ifndef INLINE
367 #ifdef __GNUC__
368 #define INLINE __inline__
369 #else
370 #define INLINE
371 #endif
372 #endif
373
374 #define ENCODE_RELAX_STATE(type, size) \
375   ((relax_substateT) (((type) << 2) | (size)))
376 #define TYPE_FROM_RELAX_STATE(s) \
377   ((s) >> 2)
378 #define DISP_SIZE_FROM_RELAX_STATE(s) \
379     ((((s) & 3) == BIG ? 4 : (((s) & 3) == BIG16 ? 2 : 1)))
380
381 /* This table is used by relax_frag to promote short jumps to long
382    ones where necessary.  SMALL (short) jumps may be promoted to BIG
383    (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long).  We
384    don't allow a short jump in a 32 bit code segment to be promoted to
385    a 16 bit offset jump because it's slower (requires data size
386    prefix), and doesn't work, unless the destination is in the bottom
387    64k of the code segment (The top 16 bits of eip are zeroed).  */
388
389 const relax_typeS md_relax_table[] =
390 {
391   /* The fields are:
392      1) most positive reach of this state,
393      2) most negative reach of this state,
394      3) how many bytes this mode will have in the variable part of the frag
395      4) which index into the table to try if we can't fit into this one.  */
396
397   /* UNCOND_JUMP states.  */
398   {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
399   {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
400   /* dword jmp adds 4 bytes to frag:
401      0 extra opcode bytes, 4 displacement bytes.  */
402   {0, 0, 4, 0},
403   /* word jmp adds 2 byte2 to frag:
404      0 extra opcode bytes, 2 displacement bytes.  */
405   {0, 0, 2, 0},
406
407   /* COND_JUMP states.  */
408   {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
409   {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
410   /* dword conditionals adds 5 bytes to frag:
411      1 extra opcode byte, 4 displacement bytes.  */
412   {0, 0, 5, 0},
413   /* word conditionals add 3 bytes to frag:
414      1 extra opcode byte, 2 displacement bytes.  */
415   {0, 0, 3, 0},
416
417   /* COND_JUMP86 states.  */
418   {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
419   {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
420   /* dword conditionals adds 5 bytes to frag:
421      1 extra opcode byte, 4 displacement bytes.  */
422   {0, 0, 5, 0},
423   /* word conditionals add 4 bytes to frag:
424      1 displacement byte and a 3 byte long branch insn.  */
425   {0, 0, 4, 0}
426 };
427
428 static const arch_entry cpu_arch[] =
429 {
430   {"generic32", PROCESSOR_GENERIC32,
431    CPU_GENERIC32_FLAGS },
432   {"generic64", PROCESSOR_GENERIC64,
433    CPU_GENERIC64_FLAGS },
434   {"i8086", PROCESSOR_UNKNOWN,
435    CPU_NONE_FLAGS },
436   {"i186", PROCESSOR_UNKNOWN,
437    CPU_I186_FLAGS },
438   {"i286", PROCESSOR_UNKNOWN,
439    CPU_I286_FLAGS },
440   {"i386", PROCESSOR_I386,
441    CPU_I386_FLAGS },
442   {"i486", PROCESSOR_I486,
443    CPU_I486_FLAGS },
444   {"i586", PROCESSOR_PENTIUM,
445    CPU_I586_FLAGS },
446   {"i686", PROCESSOR_PENTIUMPRO,
447    CPU_I686_FLAGS },
448   {"pentium", PROCESSOR_PENTIUM,
449    CPU_I586_FLAGS },
450   {"pentiumpro",PROCESSOR_PENTIUMPRO,
451    CPU_I686_FLAGS },
452   {"pentiumii", PROCESSOR_PENTIUMPRO,
453    CPU_P2_FLAGS },
454   {"pentiumiii",PROCESSOR_PENTIUMPRO,
455    CPU_P3_FLAGS },
456   {"pentium4", PROCESSOR_PENTIUM4,
457    CPU_P4_FLAGS },
458   {"prescott", PROCESSOR_NOCONA,
459    CPU_CORE_FLAGS },
460   {"nocona", PROCESSOR_NOCONA,
461    CPU_NOCONA_FLAGS },
462   {"yonah", PROCESSOR_CORE,
463    CPU_CORE_FLAGS },
464   {"core", PROCESSOR_CORE,
465    CPU_CORE_FLAGS },
466   {"merom", PROCESSOR_CORE2,
467    CPU_CORE2_FLAGS },
468   {"core2", PROCESSOR_CORE2,
469    CPU_CORE2_FLAGS },
470   {"k6", PROCESSOR_K6,
471    CPU_K6_FLAGS },
472   {"k6_2", PROCESSOR_K6,
473    CPU_K6_2_FLAGS },
474   {"athlon", PROCESSOR_ATHLON,
475    CPU_ATHLON_FLAGS },
476   {"sledgehammer", PROCESSOR_K8,
477    CPU_K8_FLAGS },
478   {"opteron", PROCESSOR_K8,
479    CPU_K8_FLAGS },
480   {"k8", PROCESSOR_K8,
481    CPU_K8_FLAGS },
482   {"amdfam10", PROCESSOR_AMDFAM10,
483    CPU_AMDFAM10_FLAGS },
484   {".mmx", PROCESSOR_UNKNOWN,
485    CPU_MMX_FLAGS },
486   {".sse", PROCESSOR_UNKNOWN,
487    CPU_SSE_FLAGS },
488   {".sse2", PROCESSOR_UNKNOWN,
489    CPU_SSE2_FLAGS },
490   {".sse3", PROCESSOR_UNKNOWN,
491    CPU_SSE3_FLAGS },
492   {".ssse3", PROCESSOR_UNKNOWN,
493    CPU_SSSE3_FLAGS },
494   {".sse4.1", PROCESSOR_UNKNOWN,
495    CPU_SSE4_1_FLAGS },
496   {".sse4.2", PROCESSOR_UNKNOWN,
497    CPU_SSE4_2_FLAGS },
498   {".sse4", PROCESSOR_UNKNOWN,
499    CPU_SSE4_2_FLAGS },
500   {".3dnow", PROCESSOR_UNKNOWN,
501    CPU_3DNOW_FLAGS },
502   {".3dnowa", PROCESSOR_UNKNOWN,
503    CPU_3DNOWA_FLAGS },
504   {".padlock", PROCESSOR_UNKNOWN,
505    CPU_PADLOCK_FLAGS },
506   {".pacifica", PROCESSOR_UNKNOWN,
507    CPU_SVME_FLAGS },
508   {".svme", PROCESSOR_UNKNOWN,
509    CPU_SVME_FLAGS },
510   {".sse4a", PROCESSOR_UNKNOWN,
511    CPU_SSE4A_FLAGS },
512   {".abm", PROCESSOR_UNKNOWN,
513    CPU_ABM_FLAGS },
514   {".sse5", PROCESSOR_UNKNOWN,
515    CPU_SSE5_FLAGS },
516 };
517
518 const pseudo_typeS md_pseudo_table[] =
519 {
520 #if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
521   {"align", s_align_bytes, 0},
522 #else
523   {"align", s_align_ptwo, 0},
524 #endif
525   {"arch", set_cpu_arch, 0},
526 #ifndef I386COFF
527   {"bss", s_bss, 0},
528 #endif
529   {"ffloat", float_cons, 'f'},
530   {"dfloat", float_cons, 'd'},
531   {"tfloat", float_cons, 'x'},
532   {"value", cons, 2},
533   {"slong", signed_cons, 4},
534   {"noopt", s_ignore, 0},
535   {"optim", s_ignore, 0},
536   {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
537   {"code16", set_code_flag, CODE_16BIT},
538   {"code32", set_code_flag, CODE_32BIT},
539   {"code64", set_code_flag, CODE_64BIT},
540   {"intel_syntax", set_intel_syntax, 1},
541   {"att_syntax", set_intel_syntax, 0},
542   {"intel_mnemonic", set_intel_mnemonic, 1},
543   {"att_mnemonic", set_intel_mnemonic, 0},
544   {"allow_index_reg", set_allow_index_reg, 1},
545   {"disallow_index_reg", set_allow_index_reg, 0},
546 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
547   {"largecomm", handle_large_common, 0},
548 #else
549   {"file", (void (*) (int)) dwarf2_directive_file, 0},
550   {"loc", dwarf2_directive_loc, 0},
551   {"loc_mark_labels", dwarf2_directive_loc_mark_labels, 0},
552 #endif
553 #ifdef TE_PE
554   {"secrel32", pe_directive_secrel, 0},
555 #endif
556   {0, 0, 0}
557 };
558
559 /* For interface with expression ().  */
560 extern char *input_line_pointer;
561
562 /* Hash table for instruction mnemonic lookup.  */
563 static struct hash_control *op_hash;
564
565 /* Hash table for register lookup.  */
566 static struct hash_control *reg_hash;
567 \f
568 void
569 i386_align_code (fragS *fragP, int count)
570 {
571   /* Various efficient no-op patterns for aligning code labels.
572      Note: Don't try to assemble the instructions in the comments.
573      0L and 0w are not legal.  */
574   static const char f32_1[] =
575     {0x90};                                     /* nop                  */
576   static const char f32_2[] =
577     {0x66,0x90};                                /* xchg %ax,%ax */
578   static const char f32_3[] =
579     {0x8d,0x76,0x00};                           /* leal 0(%esi),%esi    */
580   static const char f32_4[] =
581     {0x8d,0x74,0x26,0x00};                      /* leal 0(%esi,1),%esi  */
582   static const char f32_5[] =
583     {0x90,                                      /* nop                  */
584      0x8d,0x74,0x26,0x00};                      /* leal 0(%esi,1),%esi  */
585   static const char f32_6[] =
586     {0x8d,0xb6,0x00,0x00,0x00,0x00};            /* leal 0L(%esi),%esi   */
587   static const char f32_7[] =
588     {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00};       /* leal 0L(%esi,1),%esi */
589   static const char f32_8[] =
590     {0x90,                                      /* nop                  */
591      0x8d,0xb4,0x26,0x00,0x00,0x00,0x00};       /* leal 0L(%esi,1),%esi */
592   static const char f32_9[] =
593     {0x89,0xf6,                                 /* movl %esi,%esi       */
594      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
595   static const char f32_10[] =
596     {0x8d,0x76,0x00,                            /* leal 0(%esi),%esi    */
597      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
598   static const char f32_11[] =
599     {0x8d,0x74,0x26,0x00,                       /* leal 0(%esi,1),%esi  */
600      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
601   static const char f32_12[] =
602     {0x8d,0xb6,0x00,0x00,0x00,0x00,             /* leal 0L(%esi),%esi   */
603      0x8d,0xbf,0x00,0x00,0x00,0x00};            /* leal 0L(%edi),%edi   */
604   static const char f32_13[] =
605     {0x8d,0xb6,0x00,0x00,0x00,0x00,             /* leal 0L(%esi),%esi   */
606      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
607   static const char f32_14[] =
608     {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00,        /* leal 0L(%esi,1),%esi */
609      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
610   static const char f16_3[] =
611     {0x8d,0x74,0x00};                           /* lea 0(%esi),%esi     */
612   static const char f16_4[] =
613     {0x8d,0xb4,0x00,0x00};                      /* lea 0w(%si),%si      */
614   static const char f16_5[] =
615     {0x90,                                      /* nop                  */
616      0x8d,0xb4,0x00,0x00};                      /* lea 0w(%si),%si      */
617   static const char f16_6[] =
618     {0x89,0xf6,                                 /* mov %si,%si          */
619      0x8d,0xbd,0x00,0x00};                      /* lea 0w(%di),%di      */
620   static const char f16_7[] =
621     {0x8d,0x74,0x00,                            /* lea 0(%si),%si       */
622      0x8d,0xbd,0x00,0x00};                      /* lea 0w(%di),%di      */
623   static const char f16_8[] =
624     {0x8d,0xb4,0x00,0x00,                       /* lea 0w(%si),%si      */
625      0x8d,0xbd,0x00,0x00};                      /* lea 0w(%di),%di      */
626   static const char jump_31[] =
627     {0xeb,0x1d,0x90,0x90,0x90,0x90,0x90,        /* jmp .+31; lotsa nops */
628      0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,
629      0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,
630      0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90};
631   static const char *const f32_patt[] = {
632     f32_1, f32_2, f32_3, f32_4, f32_5, f32_6, f32_7, f32_8,
633     f32_9, f32_10, f32_11, f32_12, f32_13, f32_14
634   };
635   static const char *const f16_patt[] = {
636     f32_1, f32_2, f16_3, f16_4, f16_5, f16_6, f16_7, f16_8
637   };
638   /* nopl (%[re]ax) */
639   static const char alt_3[] =
640     {0x0f,0x1f,0x00};
641   /* nopl 0(%[re]ax) */
642   static const char alt_4[] =
643     {0x0f,0x1f,0x40,0x00};
644   /* nopl 0(%[re]ax,%[re]ax,1) */
645   static const char alt_5[] =
646     {0x0f,0x1f,0x44,0x00,0x00};
647   /* nopw 0(%[re]ax,%[re]ax,1) */
648   static const char alt_6[] =
649     {0x66,0x0f,0x1f,0x44,0x00,0x00};
650   /* nopl 0L(%[re]ax) */
651   static const char alt_7[] =
652     {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
653   /* nopl 0L(%[re]ax,%[re]ax,1) */
654   static const char alt_8[] =
655     {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
656   /* nopw 0L(%[re]ax,%[re]ax,1) */
657   static const char alt_9[] =
658     {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
659   /* nopw %cs:0L(%[re]ax,%[re]ax,1) */
660   static const char alt_10[] =
661     {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
662   /* data16
663      nopw %cs:0L(%[re]ax,%[re]ax,1) */
664   static const char alt_long_11[] =
665     {0x66,
666      0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
667   /* data16
668      data16
669      nopw %cs:0L(%[re]ax,%[re]ax,1) */
670   static const char alt_long_12[] =
671     {0x66,
672      0x66,
673      0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
674   /* data16
675      data16
676      data16
677      nopw %cs:0L(%[re]ax,%[re]ax,1) */
678   static const char alt_long_13[] =
679     {0x66,
680      0x66,
681      0x66,
682      0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
683   /* data16
684      data16
685      data16
686      data16
687      nopw %cs:0L(%[re]ax,%[re]ax,1) */
688   static const char alt_long_14[] =
689     {0x66,
690      0x66,
691      0x66,
692      0x66,
693      0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
694   /* data16
695      data16
696      data16
697      data16
698      data16
699      nopw %cs:0L(%[re]ax,%[re]ax,1) */
700   static const char alt_long_15[] =
701     {0x66,
702      0x66,
703      0x66,
704      0x66,
705      0x66,
706      0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
707   /* nopl 0(%[re]ax,%[re]ax,1)
708      nopw 0(%[re]ax,%[re]ax,1) */
709   static const char alt_short_11[] =
710     {0x0f,0x1f,0x44,0x00,0x00,
711      0x66,0x0f,0x1f,0x44,0x00,0x00};
712   /* nopw 0(%[re]ax,%[re]ax,1)
713      nopw 0(%[re]ax,%[re]ax,1) */
714   static const char alt_short_12[] =
715     {0x66,0x0f,0x1f,0x44,0x00,0x00,
716      0x66,0x0f,0x1f,0x44,0x00,0x00};
717   /* nopw 0(%[re]ax,%[re]ax,1)
718      nopl 0L(%[re]ax) */
719   static const char alt_short_13[] =
720     {0x66,0x0f,0x1f,0x44,0x00,0x00,
721      0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
722   /* nopl 0L(%[re]ax)
723      nopl 0L(%[re]ax) */
724   static const char alt_short_14[] =
725     {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00,
726      0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
727   /* nopl 0L(%[re]ax)
728      nopl 0L(%[re]ax,%[re]ax,1) */
729   static const char alt_short_15[] =
730     {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00,
731      0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
732   static const char *const alt_short_patt[] = {
733     f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
734     alt_9, alt_10, alt_short_11, alt_short_12, alt_short_13,
735     alt_short_14, alt_short_15
736   };
737   static const char *const alt_long_patt[] = {
738     f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
739     alt_9, alt_10, alt_long_11, alt_long_12, alt_long_13,
740     alt_long_14, alt_long_15
741   };
742
743   /* Only align for at least a positive non-zero boundary. */
744   if (count <= 0 || count > MAX_MEM_FOR_RS_ALIGN_CODE)
745     return;
746
747   /* We need to decide which NOP sequence to use for 32bit and
748      64bit. When -mtune= is used:
749
750      1. For PROCESSOR_I386, PROCESSOR_I486, PROCESSOR_PENTIUM and
751      PROCESSOR_GENERIC32, f32_patt will be used.
752      2. For PROCESSOR_PENTIUMPRO, PROCESSOR_PENTIUM4, PROCESSOR_NOCONA,
753      PROCESSOR_CORE, PROCESSOR_CORE2, and PROCESSOR_GENERIC64,
754      alt_long_patt will be used.
755      3. For PROCESSOR_ATHLON, PROCESSOR_K6, PROCESSOR_K8 and
756      PROCESSOR_AMDFAM10, alt_short_patt will be used.
757
758      When -mtune= isn't used, alt_long_patt will be used if
759      cpu_arch_isa_flags has Cpu686. Otherwise, f32_patt will
760      be used.
761
762      When -march= or .arch is used, we can't use anything beyond
763      cpu_arch_isa_flags.   */
764
765   if (flag_code == CODE_16BIT)
766     {
767       if (count > 8)
768         {
769           memcpy (fragP->fr_literal + fragP->fr_fix,
770                   jump_31, count);
771           /* Adjust jump offset.  */
772           fragP->fr_literal[fragP->fr_fix + 1] = count - 2;
773         }
774       else
775         memcpy (fragP->fr_literal + fragP->fr_fix,
776                 f16_patt[count - 1], count);
777     }
778   else
779     {
780       const char *const *patt = NULL;
781
782       if (cpu_arch_isa == PROCESSOR_UNKNOWN)
783         {
784           /* PROCESSOR_UNKNOWN means that all ISAs may be used.  */
785           switch (cpu_arch_tune)
786             {
787             case PROCESSOR_UNKNOWN:
788               /* We use cpu_arch_isa_flags to check if we SHOULD
789                  optimize for Cpu686.  */
790               if (cpu_arch_isa_flags.bitfield.cpui686)
791                 patt = alt_long_patt;
792               else
793                 patt = f32_patt;
794               break;
795             case PROCESSOR_PENTIUMPRO:
796             case PROCESSOR_PENTIUM4:
797             case PROCESSOR_NOCONA:
798             case PROCESSOR_CORE:
799             case PROCESSOR_CORE2:
800             case PROCESSOR_GENERIC64:
801               patt = alt_long_patt;
802               break;
803             case PROCESSOR_K6:
804             case PROCESSOR_ATHLON:
805             case PROCESSOR_K8:
806             case PROCESSOR_AMDFAM10:
807               patt = alt_short_patt;
808               break;
809             case PROCESSOR_I386:
810             case PROCESSOR_I486:
811             case PROCESSOR_PENTIUM:
812             case PROCESSOR_GENERIC32:
813               patt = f32_patt;
814               break;
815             }
816         }
817       else
818         {
819           switch (cpu_arch_tune)
820             {
821             case PROCESSOR_UNKNOWN:
822               /* When cpu_arch_isa is net, cpu_arch_tune shouldn't be
823                  PROCESSOR_UNKNOWN.  */
824               abort ();
825               break;
826
827             case PROCESSOR_I386:
828             case PROCESSOR_I486:
829             case PROCESSOR_PENTIUM:
830             case PROCESSOR_K6:
831             case PROCESSOR_ATHLON:
832             case PROCESSOR_K8:
833             case PROCESSOR_AMDFAM10:
834             case PROCESSOR_GENERIC32:
835               /* We use cpu_arch_isa_flags to check if we CAN optimize
836                  for Cpu686.  */
837               if (cpu_arch_isa_flags.bitfield.cpui686)
838                 patt = alt_short_patt;
839               else
840                 patt = f32_patt;
841               break;
842             case PROCESSOR_PENTIUMPRO:
843             case PROCESSOR_PENTIUM4:
844             case PROCESSOR_NOCONA:
845             case PROCESSOR_CORE:
846             case PROCESSOR_CORE2:
847               if (cpu_arch_isa_flags.bitfield.cpui686)
848                 patt = alt_long_patt;
849               else
850                 patt = f32_patt;
851               break;
852             case PROCESSOR_GENERIC64:
853               patt = alt_long_patt;
854               break;
855             }
856         }
857
858       if (patt == f32_patt)
859         {
860           /* If the padding is less than 15 bytes, we use the normal
861              ones.  Otherwise, we use a jump instruction and adjust
862              its offset.  */
863           if (count < 15)
864             memcpy (fragP->fr_literal + fragP->fr_fix,
865                     patt[count - 1], count);
866           else
867             {
868               memcpy (fragP->fr_literal + fragP->fr_fix,
869                       jump_31, count);
870               /* Adjust jump offset.  */
871               fragP->fr_literal[fragP->fr_fix + 1] = count - 2;
872             }
873         }
874       else
875         {
876           /* Maximum length of an instruction is 15 byte.  If the
877              padding is greater than 15 bytes and we don't use jump,
878              we have to break it into smaller pieces.  */
879           int padding = count;
880           while (padding > 15)
881             {
882               padding -= 15;
883               memcpy (fragP->fr_literal + fragP->fr_fix + padding,
884                       patt [14], 15);
885             }
886
887           if (padding)
888             memcpy (fragP->fr_literal + fragP->fr_fix,
889                     patt [padding - 1], padding);
890         }
891     }
892   fragP->fr_var = count;
893 }
894
895 static INLINE int
896 uints_all_zero (const unsigned int *x, unsigned int size)
897 {
898   switch (size)
899     {
900     case 3:
901       if (x[2])
902         return 0;
903     case 2:
904       if (x[1])
905         return 0;
906     case 1:
907       return !x[0];
908     default:
909       abort ();
910     }
911 }
912
913 static INLINE void
914 uints_set (unsigned int *x, unsigned int v, unsigned int size)
915 {
916   switch (size)
917     {
918     case 3:
919       x[2] = v;
920     case 2:
921       x[1] = v;
922     case 1:
923       x[0] = v;
924       break;
925     default:
926       abort ();
927     }
928 }
929
930 static INLINE int
931 uints_equal (const unsigned int *x, const unsigned int *y,
932              unsigned int size)
933 {
934   switch (size)
935     {
936     case 3:
937       if (x[2] != y [2])
938         return 0;
939     case 2:
940       if (x[1] != y [1])
941         return 0;
942     case 1:
943       return x[0] == y [0];
944       break;
945     default:
946       abort ();
947     }
948 }
949
950 #define UINTS_ALL_ZERO(x) \
951   uints_all_zero ((x).array, ARRAY_SIZE ((x).array))
952 #define UINTS_SET(x, v) \
953   uints_set ((x).array, v, ARRAY_SIZE ((x).array))
954 #define UINTS_CLEAR(x) \
955   uints_set ((x).array, 0, ARRAY_SIZE ((x).array))
956 #define UINTS_EQUAL(x, y) \
957   uints_equal ((x).array, (y).array, ARRAY_SIZE ((x).array))
958
959 static INLINE int
960 cpu_flags_check_cpu64 (i386_cpu_flags f)
961 {
962   return !((flag_code == CODE_64BIT && f.bitfield.cpuno64)
963            || (flag_code != CODE_64BIT && f.bitfield.cpu64));
964 }
965
966 static INLINE i386_cpu_flags
967 cpu_flags_and (i386_cpu_flags x, i386_cpu_flags y)
968 {
969   switch (ARRAY_SIZE (x.array))
970     {
971     case 3:
972       x.array [2] &= y.array [2];
973     case 2:
974       x.array [1] &= y.array [1];
975     case 1:
976       x.array [0] &= y.array [0];
977       break;
978     default:
979       abort ();
980     }
981   return x;
982 }
983
984 static INLINE i386_cpu_flags
985 cpu_flags_or (i386_cpu_flags x, i386_cpu_flags y)
986 {
987   switch (ARRAY_SIZE (x.array))
988     {
989     case 3:
990       x.array [2] |= y.array [2];
991     case 2:
992       x.array [1] |= y.array [1];
993     case 1:
994       x.array [0] |= y.array [0];
995       break;
996     default:
997       abort ();
998     }
999   return x;
1000 }
1001
1002 /* Return 3 if there is a perfect match, 2 if compatible with 64bit,
1003    1 if compatible with arch, 0 if there is no match.  */
1004
1005 static int
1006 cpu_flags_match (i386_cpu_flags x)
1007 {
1008   int overlap = cpu_flags_check_cpu64 (x) ? 2 : 0;
1009
1010   x.bitfield.cpu64 = 0;
1011   x.bitfield.cpuno64 = 0;
1012
1013   if (UINTS_ALL_ZERO (x))
1014     overlap |= 1;
1015   else
1016     {
1017       i386_cpu_flags cpu = cpu_arch_flags;
1018
1019       cpu.bitfield.cpu64 = 0;
1020       cpu.bitfield.cpuno64 = 0;
1021       cpu = cpu_flags_and (x, cpu);
1022       overlap |= UINTS_ALL_ZERO (cpu) ? 0 : 1;
1023     }
1024   return overlap;
1025 }
1026
1027 static INLINE i386_operand_type
1028 operand_type_and (i386_operand_type x, i386_operand_type y)
1029 {
1030   switch (ARRAY_SIZE (x.array))
1031     {
1032     case 3:
1033       x.array [2] &= y.array [2];
1034     case 2:
1035       x.array [1] &= y.array [1];
1036     case 1:
1037       x.array [0] &= y.array [0];
1038       break;
1039     default:
1040       abort ();
1041     }
1042   return x;
1043 }
1044
1045 static INLINE i386_operand_type
1046 operand_type_or (i386_operand_type x, i386_operand_type y)
1047 {
1048   switch (ARRAY_SIZE (x.array))
1049     {
1050     case 3:
1051       x.array [2] |= y.array [2];
1052     case 2:
1053       x.array [1] |= y.array [1];
1054     case 1:
1055       x.array [0] |= y.array [0];
1056       break;
1057     default:
1058       abort ();
1059     }
1060   return x;
1061 }
1062
1063 static INLINE i386_operand_type
1064 operand_type_xor (i386_operand_type x, i386_operand_type y)
1065 {
1066   switch (ARRAY_SIZE (x.array))
1067     {
1068     case 3:
1069       x.array [2] ^= y.array [2];
1070     case 2:
1071       x.array [1] ^= y.array [1];
1072     case 1:
1073       x.array [0] ^= y.array [0];
1074       break;
1075     default:
1076       abort ();
1077     }
1078   return x;
1079 }
1080
1081 static const i386_operand_type acc32 = OPERAND_TYPE_ACC32;
1082 static const i386_operand_type acc64 = OPERAND_TYPE_ACC64;
1083 static const i386_operand_type control = OPERAND_TYPE_CONTROL;
1084 static const i386_operand_type reg16_inoutportreg
1085   = OPERAND_TYPE_REG16_INOUTPORTREG;
1086 static const i386_operand_type disp16 = OPERAND_TYPE_DISP16;
1087 static const i386_operand_type disp32 = OPERAND_TYPE_DISP32;
1088 static const i386_operand_type disp32s = OPERAND_TYPE_DISP32S;
1089 static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
1090 static const i386_operand_type anydisp
1091   = OPERAND_TYPE_ANYDISP;
1092 static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
1093 static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
1094 static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
1095 static const i386_operand_type imm16 = OPERAND_TYPE_IMM16;
1096 static const i386_operand_type imm32 = OPERAND_TYPE_IMM32;
1097 static const i386_operand_type imm32s = OPERAND_TYPE_IMM32S;
1098 static const i386_operand_type imm64 = OPERAND_TYPE_IMM64;
1099 static const i386_operand_type imm16_32 = OPERAND_TYPE_IMM16_32;
1100 static const i386_operand_type imm16_32s = OPERAND_TYPE_IMM16_32S;
1101 static const i386_operand_type imm16_32_32s = OPERAND_TYPE_IMM16_32_32S;
1102
1103 enum operand_type
1104 {
1105   reg,
1106   imm,
1107   disp,
1108   anymem
1109 };
1110
1111 static INLINE int
1112 operand_type_check (i386_operand_type t, enum operand_type c)
1113 {
1114   switch (c)
1115     {
1116     case reg:
1117       return (t.bitfield.reg8
1118               || t.bitfield.reg16
1119               || t.bitfield.reg32
1120               || t.bitfield.reg64);
1121
1122     case imm:
1123       return (t.bitfield.imm8
1124               || t.bitfield.imm8s
1125               || t.bitfield.imm16
1126               || t.bitfield.imm32
1127               || t.bitfield.imm32s
1128               || t.bitfield.imm64);
1129
1130     case disp:
1131       return (t.bitfield.disp8
1132               || t.bitfield.disp16
1133               || t.bitfield.disp32
1134               || t.bitfield.disp32s
1135               || t.bitfield.disp64);
1136
1137     case anymem:
1138       return (t.bitfield.disp8
1139               || t.bitfield.disp16
1140               || t.bitfield.disp32
1141               || t.bitfield.disp32s
1142               || t.bitfield.disp64
1143               || t.bitfield.baseindex);
1144
1145     default:
1146       abort ();
1147     }
1148 }
1149
1150 static INLINE int
1151 operand_type_match (i386_operand_type overlap,
1152                     i386_operand_type given)
1153 {
1154   i386_operand_type temp = overlap;
1155
1156   temp.bitfield.jumpabsolute = 0;
1157   if (UINTS_ALL_ZERO (temp))
1158     return 0;
1159
1160   return (given.bitfield.baseindex == overlap.bitfield.baseindex
1161           && given.bitfield.jumpabsolute == overlap.bitfield.jumpabsolute);
1162 }
1163
1164 /* If given types r0 and r1 are registers they must be of the same type
1165    unless the expected operand type register overlap is null.
1166    Note that Acc in a template matches every size of reg.  */
1167
1168 static INLINE int
1169 operand_type_register_match (i386_operand_type m0,
1170                              i386_operand_type g0,
1171                              i386_operand_type t0,
1172                              i386_operand_type m1,
1173                              i386_operand_type g1,
1174                              i386_operand_type t1)
1175 {
1176   if (!operand_type_check (g0, reg))
1177     return 1;
1178
1179   if (!operand_type_check (g1, reg))
1180     return 1;
1181
1182   if (g0.bitfield.reg8 == g1.bitfield.reg8
1183       && g0.bitfield.reg16 == g1.bitfield.reg16
1184       && g0.bitfield.reg32 == g1.bitfield.reg32
1185       && g0.bitfield.reg64 == g1.bitfield.reg64)
1186     return 1;
1187
1188   if (m0.bitfield.acc)
1189     {
1190       t0.bitfield.reg8 = 1;
1191       t0.bitfield.reg16 = 1;
1192       t0.bitfield.reg32 = 1;
1193       t0.bitfield.reg64 = 1;
1194     }
1195
1196   if (m1.bitfield.acc)
1197     {
1198       t1.bitfield.reg8 = 1;
1199       t1.bitfield.reg16 = 1;
1200       t1.bitfield.reg32 = 1;
1201       t1.bitfield.reg64 = 1;
1202     }
1203
1204   return (!(t0.bitfield.reg8 & t1.bitfield.reg8)
1205           && !(t0.bitfield.reg16 & t1.bitfield.reg16)
1206           && !(t0.bitfield.reg32 & t1.bitfield.reg32)
1207           && !(t0.bitfield.reg64 & t1.bitfield.reg64));
1208 }
1209
1210 static INLINE unsigned int
1211 mode_from_disp_size (i386_operand_type t)
1212 {
1213   if (t.bitfield.disp8)
1214     return 1;
1215   else if (t.bitfield.disp16
1216            || t.bitfield.disp32
1217            || t.bitfield.disp32s)
1218     return 2;
1219   else
1220     return 0;
1221 }
1222
1223 static INLINE int
1224 fits_in_signed_byte (offsetT num)
1225 {
1226   return (num >= -128) && (num <= 127);
1227 }
1228
1229 static INLINE int
1230 fits_in_unsigned_byte (offsetT num)
1231 {
1232   return (num & 0xff) == num;
1233 }
1234
1235 static INLINE int
1236 fits_in_unsigned_word (offsetT num)
1237 {
1238   return (num & 0xffff) == num;
1239 }
1240
1241 static INLINE int
1242 fits_in_signed_word (offsetT num)
1243 {
1244   return (-32768 <= num) && (num <= 32767);
1245 }
1246
1247 static INLINE int
1248 fits_in_signed_long (offsetT num ATTRIBUTE_UNUSED)
1249 {
1250 #ifndef BFD64
1251   return 1;
1252 #else
1253   return (!(((offsetT) -1 << 31) & num)
1254           || (((offsetT) -1 << 31) & num) == ((offsetT) -1 << 31));
1255 #endif
1256 }                               /* fits_in_signed_long() */
1257
1258 static INLINE int
1259 fits_in_unsigned_long (offsetT num ATTRIBUTE_UNUSED)
1260 {
1261 #ifndef BFD64
1262   return 1;
1263 #else
1264   return (num & (((offsetT) 2 << 31) - 1)) == num;
1265 #endif
1266 }                               /* fits_in_unsigned_long() */
1267
1268 static i386_operand_type
1269 smallest_imm_type (offsetT num)
1270 {
1271   i386_operand_type t;
1272  
1273   UINTS_CLEAR (t);
1274   t.bitfield.imm64 = 1;
1275
1276   if (cpu_arch_tune != PROCESSOR_I486 && num == 1)
1277     {
1278       /* This code is disabled on the 486 because all the Imm1 forms
1279          in the opcode table are slower on the i486.  They're the
1280          versions with the implicitly specified single-position
1281          displacement, which has another syntax if you really want to
1282          use that form.  */
1283       t.bitfield.imm1 = 1;
1284       t.bitfield.imm8 = 1;
1285       t.bitfield.imm8s = 1;
1286       t.bitfield.imm16 = 1;
1287       t.bitfield.imm32 = 1;
1288       t.bitfield.imm32s = 1;
1289     }
1290   else if (fits_in_signed_byte (num))
1291     {
1292       t.bitfield.imm8 = 1;
1293       t.bitfield.imm8s = 1;
1294       t.bitfield.imm16 = 1;
1295       t.bitfield.imm32 = 1;
1296       t.bitfield.imm32s = 1;
1297     }
1298   else if (fits_in_unsigned_byte (num))
1299     {
1300       t.bitfield.imm8 = 1;
1301       t.bitfield.imm16 = 1;
1302       t.bitfield.imm32 = 1;
1303       t.bitfield.imm32s = 1;
1304     }
1305   else if (fits_in_signed_word (num) || fits_in_unsigned_word (num))
1306     {
1307       t.bitfield.imm16 = 1;
1308       t.bitfield.imm32 = 1;
1309       t.bitfield.imm32s = 1;
1310     }
1311   else if (fits_in_signed_long (num))
1312     {
1313       t.bitfield.imm32 = 1;
1314       t.bitfield.imm32s = 1;
1315     }
1316   else if (fits_in_unsigned_long (num))
1317     t.bitfield.imm32 = 1;
1318
1319   return t;
1320 }
1321
1322 static offsetT
1323 offset_in_range (offsetT val, int size)
1324 {
1325   addressT mask;
1326
1327   switch (size)
1328     {
1329     case 1: mask = ((addressT) 1 <<  8) - 1; break;
1330     case 2: mask = ((addressT) 1 << 16) - 1; break;
1331     case 4: mask = ((addressT) 2 << 31) - 1; break;
1332 #ifdef BFD64
1333     case 8: mask = ((addressT) 2 << 63) - 1; break;
1334 #endif
1335     default: abort ();
1336     }
1337
1338   /* If BFD64, sign extend val.  */
1339   if (!use_rela_relocations)
1340     if ((val & ~(((addressT) 2 << 31) - 1)) == 0)
1341       val = (val ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
1342
1343   if ((val & ~mask) != 0 && (val & ~mask) != ~mask)
1344     {
1345       char buf1[40], buf2[40];
1346
1347       sprint_value (buf1, val);
1348       sprint_value (buf2, val & mask);
1349       as_warn (_("%s shortened to %s"), buf1, buf2);
1350     }
1351   return val & mask;
1352 }
1353
1354 /* Returns 0 if attempting to add a prefix where one from the same
1355    class already exists, 1 if non rep/repne added, 2 if rep/repne
1356    added.  */
1357 static int
1358 add_prefix (unsigned int prefix)
1359 {
1360   int ret = 1;
1361   unsigned int q;
1362
1363   if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
1364       && flag_code == CODE_64BIT)
1365     {
1366       if ((i.prefix[REX_PREFIX] & prefix & REX_W)
1367           || ((i.prefix[REX_PREFIX] & (REX_R | REX_X | REX_B))
1368               && (prefix & (REX_R | REX_X | REX_B))))
1369         ret = 0;
1370       q = REX_PREFIX;
1371     }
1372   else
1373     {
1374       switch (prefix)
1375         {
1376         default:
1377           abort ();
1378
1379         case CS_PREFIX_OPCODE:
1380         case DS_PREFIX_OPCODE:
1381         case ES_PREFIX_OPCODE:
1382         case FS_PREFIX_OPCODE:
1383         case GS_PREFIX_OPCODE:
1384         case SS_PREFIX_OPCODE:
1385           q = SEG_PREFIX;
1386           break;
1387
1388         case REPNE_PREFIX_OPCODE:
1389         case REPE_PREFIX_OPCODE:
1390           ret = 2;
1391           /* fall thru */
1392         case LOCK_PREFIX_OPCODE:
1393           q = LOCKREP_PREFIX;
1394           break;
1395
1396         case FWAIT_OPCODE:
1397           q = WAIT_PREFIX;
1398           break;
1399
1400         case ADDR_PREFIX_OPCODE:
1401           q = ADDR_PREFIX;
1402           break;
1403
1404         case DATA_PREFIX_OPCODE:
1405           q = DATA_PREFIX;
1406           break;
1407         }
1408       if (i.prefix[q] != 0)
1409         ret = 0;
1410     }
1411
1412   if (ret)
1413     {
1414       if (!i.prefix[q])
1415         ++i.prefixes;
1416       i.prefix[q] |= prefix;
1417     }
1418   else
1419     as_bad (_("same type of prefix used twice"));
1420
1421   return ret;
1422 }
1423
1424 static void
1425 set_code_flag (int value)
1426 {
1427   flag_code = value;
1428   if (flag_code == CODE_64BIT)
1429     {
1430       cpu_arch_flags.bitfield.cpu64 = 1;
1431       cpu_arch_flags.bitfield.cpuno64 = 0;
1432     }
1433   else
1434     {
1435       cpu_arch_flags.bitfield.cpu64 = 0;
1436       cpu_arch_flags.bitfield.cpuno64 = 1;
1437     }
1438   if (value == CODE_64BIT && !cpu_arch_flags.bitfield.cpulm )
1439     {
1440       as_bad (_("64bit mode not supported on this CPU."));
1441     }
1442   if (value == CODE_32BIT && !cpu_arch_flags.bitfield.cpui386)
1443     {
1444       as_bad (_("32bit mode not supported on this CPU."));
1445     }
1446   stackop_size = '\0';
1447 }
1448
1449 static void
1450 set_16bit_gcc_code_flag (int new_code_flag)
1451 {
1452   flag_code = new_code_flag;
1453   if (flag_code != CODE_16BIT)
1454     abort ();
1455   cpu_arch_flags.bitfield.cpu64 = 0;
1456   cpu_arch_flags.bitfield.cpuno64 = 1;
1457   stackop_size = LONG_MNEM_SUFFIX;
1458 }
1459
1460 static void
1461 set_intel_syntax (int syntax_flag)
1462 {
1463   /* Find out if register prefixing is specified.  */
1464   int ask_naked_reg = 0;
1465
1466   SKIP_WHITESPACE ();
1467   if (!is_end_of_line[(unsigned char) *input_line_pointer])
1468     {
1469       char *string = input_line_pointer;
1470       int e = get_symbol_end ();
1471
1472       if (strcmp (string, "prefix") == 0)
1473         ask_naked_reg = 1;
1474       else if (strcmp (string, "noprefix") == 0)
1475         ask_naked_reg = -1;
1476       else
1477         as_bad (_("bad argument to syntax directive."));
1478       *input_line_pointer = e;
1479     }
1480   demand_empty_rest_of_line ();
1481
1482   intel_syntax = syntax_flag;
1483
1484   if (ask_naked_reg == 0)
1485     allow_naked_reg = (intel_syntax
1486                        && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
1487   else
1488     allow_naked_reg = (ask_naked_reg < 0);
1489
1490   identifier_chars['%'] = intel_syntax && allow_naked_reg ? '%' : 0;
1491   identifier_chars['$'] = intel_syntax ? '$' : 0;
1492   register_prefix = allow_naked_reg ? "" : "%";
1493 }
1494
1495 static void
1496 set_intel_mnemonic (int mnemonic_flag)
1497 {
1498   intel_mnemonic = mnemonic_flag;
1499 }
1500
1501 static void
1502 set_allow_index_reg (int flag)
1503 {
1504   allow_index_reg = flag;
1505 }
1506
1507 static void
1508 set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
1509 {
1510   SKIP_WHITESPACE ();
1511
1512   if (!is_end_of_line[(unsigned char) *input_line_pointer])
1513     {
1514       char *string = input_line_pointer;
1515       int e = get_symbol_end ();
1516       unsigned int i;
1517       i386_cpu_flags flags;
1518
1519       for (i = 0; i < ARRAY_SIZE (cpu_arch); i++)
1520         {
1521           if (strcmp (string, cpu_arch[i].name) == 0)
1522             {
1523               if (*string != '.')
1524                 {
1525                   cpu_arch_name = cpu_arch[i].name;
1526                   cpu_sub_arch_name = NULL;
1527                   cpu_arch_flags = cpu_arch[i].flags;
1528                   if (flag_code == CODE_64BIT)
1529                     {
1530                       cpu_arch_flags.bitfield.cpu64 = 1;
1531                       cpu_arch_flags.bitfield.cpuno64 = 0;
1532                     }
1533                   else
1534                     {
1535                       cpu_arch_flags.bitfield.cpu64 = 0;
1536                       cpu_arch_flags.bitfield.cpuno64 = 1;
1537                     }
1538                   cpu_arch_isa = cpu_arch[i].type;
1539                   cpu_arch_isa_flags = cpu_arch[i].flags;
1540                   if (!cpu_arch_tune_set)
1541                     {
1542                       cpu_arch_tune = cpu_arch_isa;
1543                       cpu_arch_tune_flags = cpu_arch_isa_flags;
1544                     }
1545                   break;
1546                 }
1547
1548               flags = cpu_flags_or (cpu_arch_flags,
1549                                     cpu_arch[i].flags);
1550               if (!UINTS_EQUAL (flags, cpu_arch_flags))
1551                 {
1552                   cpu_sub_arch_name = cpu_arch[i].name;
1553                   cpu_arch_flags = flags;
1554                 }
1555               *input_line_pointer = e;
1556               demand_empty_rest_of_line ();
1557               return;
1558             }
1559         }
1560       if (i >= ARRAY_SIZE (cpu_arch))
1561         as_bad (_("no such architecture: `%s'"), string);
1562
1563       *input_line_pointer = e;
1564     }
1565   else
1566     as_bad (_("missing cpu architecture"));
1567
1568   no_cond_jump_promotion = 0;
1569   if (*input_line_pointer == ','
1570       && !is_end_of_line[(unsigned char) input_line_pointer[1]])
1571     {
1572       char *string = ++input_line_pointer;
1573       int e = get_symbol_end ();
1574
1575       if (strcmp (string, "nojumps") == 0)
1576         no_cond_jump_promotion = 1;
1577       else if (strcmp (string, "jumps") == 0)
1578         ;
1579       else
1580         as_bad (_("no such architecture modifier: `%s'"), string);
1581
1582       *input_line_pointer = e;
1583     }
1584
1585   demand_empty_rest_of_line ();
1586 }
1587
1588 unsigned long
1589 i386_mach ()
1590 {
1591   if (!strcmp (default_arch, "x86_64"))
1592     return bfd_mach_x86_64;
1593   else if (!strcmp (default_arch, "i386"))
1594     return bfd_mach_i386_i386;
1595   else
1596     as_fatal (_("Unknown architecture"));
1597 }
1598 \f
1599 void
1600 md_begin ()
1601 {
1602   const char *hash_err;
1603
1604   /* Initialize op_hash hash table.  */
1605   op_hash = hash_new ();
1606
1607   {
1608     const template *optab;
1609     templates *core_optab;
1610
1611     /* Setup for loop.  */
1612     optab = i386_optab;
1613     core_optab = (templates *) xmalloc (sizeof (templates));
1614     core_optab->start = optab;
1615
1616     while (1)
1617       {
1618         ++optab;
1619         if (optab->name == NULL
1620             || strcmp (optab->name, (optab - 1)->name) != 0)
1621           {
1622             /* different name --> ship out current template list;
1623                add to hash table; & begin anew.  */
1624             core_optab->end = optab;
1625             hash_err = hash_insert (op_hash,
1626                                     (optab - 1)->name,
1627                                     (PTR) core_optab);
1628             if (hash_err)
1629               {
1630                 as_fatal (_("Internal Error:  Can't hash %s: %s"),
1631                           (optab - 1)->name,
1632                           hash_err);
1633               }
1634             if (optab->name == NULL)
1635               break;
1636             core_optab = (templates *) xmalloc (sizeof (templates));
1637             core_optab->start = optab;
1638           }
1639       }
1640   }
1641
1642   /* Initialize reg_hash hash table.  */
1643   reg_hash = hash_new ();
1644   {
1645     const reg_entry *regtab;
1646     unsigned int regtab_size = i386_regtab_size;
1647
1648     for (regtab = i386_regtab; regtab_size--; regtab++)
1649       {
1650         hash_err = hash_insert (reg_hash, regtab->reg_name, (PTR) regtab);
1651         if (hash_err)
1652           as_fatal (_("Internal Error:  Can't hash %s: %s"),
1653                     regtab->reg_name,
1654                     hash_err);
1655       }
1656   }
1657
1658   /* Fill in lexical tables:  mnemonic_chars, operand_chars.  */
1659   {
1660     int c;
1661     char *p;
1662
1663     for (c = 0; c < 256; c++)
1664       {
1665         if (ISDIGIT (c))
1666           {
1667             digit_chars[c] = c;
1668             mnemonic_chars[c] = c;
1669             register_chars[c] = c;
1670             operand_chars[c] = c;
1671           }
1672         else if (ISLOWER (c))
1673           {
1674             mnemonic_chars[c] = c;
1675             register_chars[c] = c;
1676             operand_chars[c] = c;
1677           }
1678         else if (ISUPPER (c))
1679           {
1680             mnemonic_chars[c] = TOLOWER (c);
1681             register_chars[c] = mnemonic_chars[c];
1682             operand_chars[c] = c;
1683           }
1684
1685         if (ISALPHA (c) || ISDIGIT (c))
1686           identifier_chars[c] = c;
1687         else if (c >= 128)
1688           {
1689             identifier_chars[c] = c;
1690             operand_chars[c] = c;
1691           }
1692       }
1693
1694 #ifdef LEX_AT
1695     identifier_chars['@'] = '@';
1696 #endif
1697 #ifdef LEX_QM
1698     identifier_chars['?'] = '?';
1699     operand_chars['?'] = '?';
1700 #endif
1701     digit_chars['-'] = '-';
1702     mnemonic_chars['-'] = '-';
1703     mnemonic_chars['.'] = '.';
1704     identifier_chars['_'] = '_';
1705     identifier_chars['.'] = '.';
1706
1707     for (p = operand_special_chars; *p != '\0'; p++)
1708       operand_chars[(unsigned char) *p] = *p;
1709   }
1710
1711 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
1712   if (IS_ELF)
1713     {
1714       record_alignment (text_section, 2);
1715       record_alignment (data_section, 2);
1716       record_alignment (bss_section, 2);
1717     }
1718 #endif
1719
1720   if (flag_code == CODE_64BIT)
1721     {
1722       x86_dwarf2_return_column = 16;
1723       x86_cie_data_alignment = -8;
1724     }
1725   else
1726     {
1727       x86_dwarf2_return_column = 8;
1728       x86_cie_data_alignment = -4;
1729     }
1730 }
1731
1732 void
1733 i386_print_statistics (FILE *file)
1734 {
1735   hash_print_statistics (file, "i386 opcode", op_hash);
1736   hash_print_statistics (file, "i386 register", reg_hash);
1737 }
1738 \f
1739 #ifdef DEBUG386
1740
1741 /* Debugging routines for md_assemble.  */
1742 static void pte (template *);
1743 static void pt (i386_operand_type);
1744 static void pe (expressionS *);
1745 static void ps (symbolS *);
1746
1747 static void
1748 pi (char *line, i386_insn *x)
1749 {
1750   unsigned int i;
1751
1752   fprintf (stdout, "%s: template ", line);
1753   pte (&x->tm);
1754   fprintf (stdout, "  address: base %s  index %s  scale %x\n",
1755            x->base_reg ? x->base_reg->reg_name : "none",
1756            x->index_reg ? x->index_reg->reg_name : "none",
1757            x->log2_scale_factor);
1758   fprintf (stdout, "  modrm:  mode %x  reg %x  reg/mem %x\n",
1759            x->rm.mode, x->rm.reg, x->rm.regmem);
1760   fprintf (stdout, "  sib:  base %x  index %x  scale %x\n",
1761            x->sib.base, x->sib.index, x->sib.scale);
1762   fprintf (stdout, "  rex: 64bit %x  extX %x  extY %x  extZ %x\n",
1763            (x->rex & REX_W) != 0,
1764            (x->rex & REX_R) != 0,
1765            (x->rex & REX_X) != 0,
1766            (x->rex & REX_B) != 0);
1767   fprintf (stdout, "  drex:  reg %d rex 0x%x\n", 
1768            x->drex.reg, x->drex.rex);
1769   for (i = 0; i < x->operands; i++)
1770     {
1771       fprintf (stdout, "    #%d:  ", i + 1);
1772       pt (x->types[i]);
1773       fprintf (stdout, "\n");
1774       if (x->types[i].bitfield.reg8
1775           || x->types[i].bitfield.reg16
1776           || x->types[i].bitfield.reg32
1777           || x->types[i].bitfield.reg64
1778           || x->types[i].bitfield.regmmx
1779           || x->types[i].bitfield.regxmm
1780           || x->types[i].bitfield.sreg2
1781           || x->types[i].bitfield.sreg3
1782           || x->types[i].bitfield.control
1783           || x->types[i].bitfield.debug
1784           || x->types[i].bitfield.test)
1785         fprintf (stdout, "%s\n", x->op[i].regs->reg_name);
1786       if (operand_type_check (x->types[i], imm))
1787         pe (x->op[i].imms);
1788       if (operand_type_check (x->types[i], disp))
1789         pe (x->op[i].disps);
1790     }
1791 }
1792
1793 static void
1794 pte (template *t)
1795 {
1796   unsigned int i;
1797   fprintf (stdout, " %d operands ", t->operands);
1798   fprintf (stdout, "opcode %x ", t->base_opcode);
1799   if (t->extension_opcode != None)
1800     fprintf (stdout, "ext %x ", t->extension_opcode);
1801   if (t->opcode_modifier.d)
1802     fprintf (stdout, "D");
1803   if (t->opcode_modifier.w)
1804     fprintf (stdout, "W");
1805   fprintf (stdout, "\n");
1806   for (i = 0; i < t->operands; i++)
1807     {
1808       fprintf (stdout, "    #%d type ", i + 1);
1809       pt (t->operand_types[i]);
1810       fprintf (stdout, "\n");
1811     }
1812 }
1813
1814 static void
1815 pe (expressionS *e)
1816 {
1817   fprintf (stdout, "    operation     %d\n", e->X_op);
1818   fprintf (stdout, "    add_number    %ld (%lx)\n",
1819            (long) e->X_add_number, (long) e->X_add_number);
1820   if (e->X_add_symbol)
1821     {
1822       fprintf (stdout, "    add_symbol    ");
1823       ps (e->X_add_symbol);
1824       fprintf (stdout, "\n");
1825     }
1826   if (e->X_op_symbol)
1827     {
1828       fprintf (stdout, "    op_symbol    ");
1829       ps (e->X_op_symbol);
1830       fprintf (stdout, "\n");
1831     }
1832 }
1833
1834 static void
1835 ps (symbolS *s)
1836 {
1837   fprintf (stdout, "%s type %s%s",
1838            S_GET_NAME (s),
1839            S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
1840            segment_name (S_GET_SEGMENT (s)));
1841 }
1842
1843 static struct type_name
1844   {
1845     i386_operand_type mask;
1846     const char *name;
1847   }
1848 const type_names[] =
1849 {
1850   { OPERAND_TYPE_REG8, "r8" },
1851   { OPERAND_TYPE_REG16, "r16" },
1852   { OPERAND_TYPE_REG32, "r32" },
1853   { OPERAND_TYPE_REG64, "r64" },
1854   { OPERAND_TYPE_IMM8, "i8" },
1855   { OPERAND_TYPE_IMM8, "i8s" },
1856   { OPERAND_TYPE_IMM16, "i16" },
1857   { OPERAND_TYPE_IMM32, "i32" },
1858   { OPERAND_TYPE_IMM32S, "i32s" },
1859   { OPERAND_TYPE_IMM64, "i64" },
1860   { OPERAND_TYPE_IMM1, "i1" },
1861   { OPERAND_TYPE_BASEINDEX, "BaseIndex" },
1862   { OPERAND_TYPE_DISP8, "d8" },
1863   { OPERAND_TYPE_DISP16, "d16" },
1864   { OPERAND_TYPE_DISP32, "d32" },
1865   { OPERAND_TYPE_DISP32S, "d32s" },
1866   { OPERAND_TYPE_DISP64, "d64" },
1867   { OPERAND_TYPE_INOUTPORTREG, "InOutPortReg" },
1868   { OPERAND_TYPE_SHIFTCOUNT, "ShiftCount" },
1869   { OPERAND_TYPE_CONTROL, "control reg" },
1870   { OPERAND_TYPE_TEST, "test reg" },
1871   { OPERAND_TYPE_DEBUG, "debug reg" },
1872   { OPERAND_TYPE_FLOATREG, "FReg" },
1873   { OPERAND_TYPE_FLOATACC, "FAcc" },
1874   { OPERAND_TYPE_SREG2, "SReg2" },
1875   { OPERAND_TYPE_SREG3, "SReg3" },
1876   { OPERAND_TYPE_ACC, "Acc" },
1877   { OPERAND_TYPE_JUMPABSOLUTE, "Jump Absolute" },
1878   { OPERAND_TYPE_REGMMX, "rMMX" },
1879   { OPERAND_TYPE_REGXMM, "rXMM" },
1880   { OPERAND_TYPE_ESSEG, "es" },
1881 };
1882
1883 static void
1884 pt (i386_operand_type t)
1885 {
1886   unsigned int j;
1887   i386_operand_type a;
1888
1889   for (j = 0; j < ARRAY_SIZE (type_names); j++)
1890     {
1891       a = operand_type_and (t, type_names[j].mask);
1892       if (!UINTS_ALL_ZERO (a))
1893         fprintf (stdout, "%s, ",  type_names[j].name);
1894     }
1895   fflush (stdout);
1896 }
1897
1898 #endif /* DEBUG386 */
1899 \f
1900 static bfd_reloc_code_real_type
1901 reloc (unsigned int size,
1902        int pcrel,
1903        int sign,
1904        bfd_reloc_code_real_type other)
1905 {
1906   if (other != NO_RELOC)
1907     {
1908       reloc_howto_type *reloc;
1909
1910       if (size == 8)
1911         switch (other)
1912           {
1913           case BFD_RELOC_X86_64_GOT32:
1914             return BFD_RELOC_X86_64_GOT64;
1915             break;
1916           case BFD_RELOC_X86_64_PLTOFF64:
1917             return BFD_RELOC_X86_64_PLTOFF64;
1918             break;
1919           case BFD_RELOC_X86_64_GOTPC32:
1920             other = BFD_RELOC_X86_64_GOTPC64;
1921             break;
1922           case BFD_RELOC_X86_64_GOTPCREL:
1923             other = BFD_RELOC_X86_64_GOTPCREL64;
1924             break;
1925           case BFD_RELOC_X86_64_TPOFF32:
1926             other = BFD_RELOC_X86_64_TPOFF64;
1927             break;
1928           case BFD_RELOC_X86_64_DTPOFF32:
1929             other = BFD_RELOC_X86_64_DTPOFF64;
1930             break;
1931           default:
1932             break;
1933           }
1934
1935       /* Sign-checking 4-byte relocations in 16-/32-bit code is pointless.  */
1936       if (size == 4 && flag_code != CODE_64BIT)
1937         sign = -1;
1938
1939       reloc = bfd_reloc_type_lookup (stdoutput, other);
1940       if (!reloc)
1941         as_bad (_("unknown relocation (%u)"), other);
1942       else if (size != bfd_get_reloc_size (reloc))
1943         as_bad (_("%u-byte relocation cannot be applied to %u-byte field"),
1944                 bfd_get_reloc_size (reloc),
1945                 size);
1946       else if (pcrel && !reloc->pc_relative)
1947         as_bad (_("non-pc-relative relocation for pc-relative field"));
1948       else if ((reloc->complain_on_overflow == complain_overflow_signed
1949                 && !sign)
1950                || (reloc->complain_on_overflow == complain_overflow_unsigned
1951                    && sign > 0))
1952         as_bad (_("relocated field and relocation type differ in signedness"));
1953       else
1954         return other;
1955       return NO_RELOC;
1956     }
1957
1958   if (pcrel)
1959     {
1960       if (!sign)
1961         as_bad (_("there are no unsigned pc-relative relocations"));
1962       switch (size)
1963         {
1964         case 1: return BFD_RELOC_8_PCREL;
1965         case 2: return BFD_RELOC_16_PCREL;
1966         case 4: return BFD_RELOC_32_PCREL;
1967         case 8: return BFD_RELOC_64_PCREL;
1968         }
1969       as_bad (_("cannot do %u byte pc-relative relocation"), size);
1970     }
1971   else
1972     {
1973       if (sign > 0)
1974         switch (size)
1975           {
1976           case 4: return BFD_RELOC_X86_64_32S;
1977           }
1978       else
1979         switch (size)
1980           {
1981           case 1: return BFD_RELOC_8;
1982           case 2: return BFD_RELOC_16;
1983           case 4: return BFD_RELOC_32;
1984           case 8: return BFD_RELOC_64;
1985           }
1986       as_bad (_("cannot do %s %u byte relocation"),
1987               sign > 0 ? "signed" : "unsigned", size);
1988     }
1989
1990   abort ();
1991   return BFD_RELOC_NONE;
1992 }
1993
1994 /* Here we decide which fixups can be adjusted to make them relative to
1995    the beginning of the section instead of the symbol.  Basically we need
1996    to make sure that the dynamic relocations are done correctly, so in
1997    some cases we force the original symbol to be used.  */
1998
1999 int
2000 tc_i386_fix_adjustable (fixS *fixP ATTRIBUTE_UNUSED)
2001 {
2002 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
2003   if (!IS_ELF)
2004     return 1;
2005
2006   /* Don't adjust pc-relative references to merge sections in 64-bit
2007      mode.  */
2008   if (use_rela_relocations
2009       && (S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0
2010       && fixP->fx_pcrel)
2011     return 0;
2012
2013   /* The x86_64 GOTPCREL are represented as 32bit PCrel relocations
2014      and changed later by validate_fix.  */
2015   if (GOT_symbol && fixP->fx_subsy == GOT_symbol
2016       && fixP->fx_r_type == BFD_RELOC_32_PCREL)
2017     return 0;
2018
2019   /* adjust_reloc_syms doesn't know about the GOT.  */
2020   if (fixP->fx_r_type == BFD_RELOC_386_GOTOFF
2021       || fixP->fx_r_type == BFD_RELOC_386_PLT32
2022       || fixP->fx_r_type == BFD_RELOC_386_GOT32
2023       || fixP->fx_r_type == BFD_RELOC_386_TLS_GD
2024       || fixP->fx_r_type == BFD_RELOC_386_TLS_LDM
2025       || fixP->fx_r_type == BFD_RELOC_386_TLS_LDO_32
2026       || fixP->fx_r_type == BFD_RELOC_386_TLS_IE_32
2027       || fixP->fx_r_type == BFD_RELOC_386_TLS_IE
2028       || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTIE
2029       || fixP->fx_r_type == BFD_RELOC_386_TLS_LE_32
2030       || fixP->fx_r_type == BFD_RELOC_386_TLS_LE
2031       || fixP->fx_r_type == BFD_RELOC_386_TLS_GOTDESC
2032       || fixP->fx_r_type == BFD_RELOC_386_TLS_DESC_CALL
2033       || fixP->fx_r_type == BFD_RELOC_X86_64_PLT32
2034       || fixP->fx_r_type == BFD_RELOC_X86_64_GOT32
2035       || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPCREL
2036       || fixP->fx_r_type == BFD_RELOC_X86_64_TLSGD
2037       || fixP->fx_r_type == BFD_RELOC_X86_64_TLSLD
2038       || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF32
2039       || fixP->fx_r_type == BFD_RELOC_X86_64_DTPOFF64
2040       || fixP->fx_r_type == BFD_RELOC_X86_64_GOTTPOFF
2041       || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF32
2042       || fixP->fx_r_type == BFD_RELOC_X86_64_TPOFF64
2043       || fixP->fx_r_type == BFD_RELOC_X86_64_GOTOFF64
2044       || fixP->fx_r_type == BFD_RELOC_X86_64_GOTPC32_TLSDESC
2045       || fixP->fx_r_type == BFD_RELOC_X86_64_TLSDESC_CALL
2046       || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2047       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2048     return 0;
2049 #endif
2050   return 1;
2051 }
2052
2053 static int
2054 intel_float_operand (const char *mnemonic)
2055 {
2056   /* Note that the value returned is meaningful only for opcodes with (memory)
2057      operands, hence the code here is free to improperly handle opcodes that
2058      have no operands (for better performance and smaller code). */
2059
2060   if (mnemonic[0] != 'f')
2061     return 0; /* non-math */
2062
2063   switch (mnemonic[1])
2064     {
2065     /* fclex, fdecstp, fdisi, femms, feni, fincstp, finit, fsetpm, and
2066        the fs segment override prefix not currently handled because no
2067        call path can make opcodes without operands get here */
2068     case 'i':
2069       return 2 /* integer op */;
2070     case 'l':
2071       if (mnemonic[2] == 'd' && (mnemonic[3] == 'c' || mnemonic[3] == 'e'))
2072         return 3; /* fldcw/fldenv */
2073       break;
2074     case 'n':
2075       if (mnemonic[2] != 'o' /* fnop */)
2076         return 3; /* non-waiting control op */
2077       break;
2078     case 'r':
2079       if (mnemonic[2] == 's')
2080         return 3; /* frstor/frstpm */
2081       break;
2082     case 's':
2083       if (mnemonic[2] == 'a')
2084         return 3; /* fsave */
2085       if (mnemonic[2] == 't')
2086         {
2087           switch (mnemonic[3])
2088             {
2089             case 'c': /* fstcw */
2090             case 'd': /* fstdw */
2091             case 'e': /* fstenv */
2092             case 's': /* fsts[gw] */
2093               return 3;
2094             }
2095         }
2096       break;
2097     case 'x':
2098       if (mnemonic[2] == 'r' || mnemonic[2] == 's')
2099         return 0; /* fxsave/fxrstor are not really math ops */
2100       break;
2101     }
2102
2103   return 1;
2104 }
2105
2106 /* This is the guts of the machine-dependent assembler.  LINE points to a
2107    machine dependent instruction.  This function is supposed to emit
2108    the frags/bytes it assembles to.  */
2109
2110 void
2111 md_assemble (line)
2112      char *line;
2113 {
2114   unsigned int j;
2115   char mnemonic[MAX_MNEM_SIZE];
2116
2117   /* Initialize globals.  */
2118   memset (&i, '\0', sizeof (i));
2119   for (j = 0; j < MAX_OPERANDS; j++)
2120     i.reloc[j] = NO_RELOC;
2121   memset (disp_expressions, '\0', sizeof (disp_expressions));
2122   memset (im_expressions, '\0', sizeof (im_expressions));
2123   save_stack_p = save_stack;
2124
2125   /* First parse an instruction mnemonic & call i386_operand for the operands.
2126      We assume that the scrubber has arranged it so that line[0] is the valid
2127      start of a (possibly prefixed) mnemonic.  */
2128
2129   line = parse_insn (line, mnemonic);
2130   if (line == NULL)
2131     return;
2132
2133   line = parse_operands (line, mnemonic);
2134   if (line == NULL)
2135     return;
2136
2137   /* Now we've parsed the mnemonic into a set of templates, and have the
2138      operands at hand.  */
2139
2140   /* All intel opcodes have reversed operands except for "bound" and
2141      "enter".  We also don't reverse intersegment "jmp" and "call"
2142      instructions with 2 immediate operands so that the immediate segment
2143      precedes the offset, as it does when in AT&T mode. */
2144   if (intel_syntax
2145       && i.operands > 1
2146       && (strcmp (mnemonic, "bound") != 0)
2147       && (strcmp (mnemonic, "invlpga") != 0)
2148       && !(operand_type_check (i.types[0], imm)
2149            && operand_type_check (i.types[1], imm)))
2150     swap_operands ();
2151
2152   /* The order of the immediates should be reversed
2153      for 2 immediates extrq and insertq instructions */
2154   if (i.imm_operands == 2
2155       && (strcmp (mnemonic, "extrq") == 0
2156           || strcmp (mnemonic, "insertq") == 0))
2157       swap_2_operands (0, 1);
2158
2159   if (i.imm_operands)
2160     optimize_imm ();
2161
2162   /* Don't optimize displacement for movabs since it only takes 64bit
2163      displacement.  */
2164   if (i.disp_operands
2165       && (flag_code != CODE_64BIT
2166           || strcmp (mnemonic, "movabs") != 0))
2167     optimize_disp ();
2168
2169   /* Next, we find a template that matches the given insn,
2170      making sure the overlap of the given operands types is consistent
2171      with the template operand types.  */
2172
2173   if (!match_template ())
2174     return;
2175
2176   if (intel_syntax)
2177     {
2178       /* Zap movzx and movsx suffix.  The suffix may have been set from
2179          "word ptr" or "byte ptr" on the source operand, but we'll use
2180          the suffix later to choose the destination register.  */
2181       if ((i.tm.base_opcode & ~9) == 0x0fb6)
2182         {
2183           if (i.reg_operands < 2
2184               && !i.suffix
2185               && (!i.tm.opcode_modifier.no_bsuf
2186                   || !i.tm.opcode_modifier.no_wsuf
2187                   || !i.tm.opcode_modifier.no_lsuf
2188                   || !i.tm.opcode_modifier.no_ssuf
2189                   || !i.tm.opcode_modifier.no_ldsuf
2190                   || !i.tm.opcode_modifier.no_qsuf))
2191             as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
2192
2193           i.suffix = 0;
2194         }
2195     }
2196
2197   if (i.tm.opcode_modifier.fwait)
2198     if (!add_prefix (FWAIT_OPCODE))
2199       return;
2200
2201   /* Check string instruction segment overrides.  */
2202   if (i.tm.opcode_modifier.isstring && i.mem_operands != 0)
2203     {
2204       if (!check_string ())
2205         return;
2206     }
2207
2208   if (!process_suffix ())
2209     return;
2210
2211   /* Make still unresolved immediate matches conform to size of immediate
2212      given in i.suffix.  */
2213   if (!finalize_imm ())
2214     return;
2215
2216   if (i.types[0].bitfield.imm1)
2217     i.imm_operands = 0; /* kludge for shift insns.  */
2218
2219   for (j = 0; j < 3; j++)
2220     if (i.types[j].bitfield.inoutportreg
2221         || i.types[j].bitfield.shiftcount
2222         || i.types[j].bitfield.acc
2223         || i.types[j].bitfield.floatacc)
2224       i.reg_operands--;
2225
2226   if (i.tm.opcode_modifier.immext)
2227     {
2228       expressionS *exp;
2229
2230       if (i.tm.cpu_flags.bitfield.cpusse3 && i.operands > 0)
2231         {
2232           /* Streaming SIMD extensions 3 Instructions have the fixed
2233              operands with an opcode suffix which is coded in the same
2234              place as an 8-bit immediate field would be. Here we check
2235              those operands and remove them afterwards.  */
2236           unsigned int x;
2237
2238           for (x = 0; x < i.operands; x++)
2239             if (i.op[x].regs->reg_num != x)
2240               as_bad (_("can't use register '%s%s' as operand %d in '%s'."),
2241                       register_prefix,
2242                       i.op[x].regs->reg_name,
2243                       x + 1,
2244                       i.tm.name);
2245           i.operands = 0;
2246         }
2247
2248       /* These AMD 3DNow! and Intel Katmai New Instructions have an
2249          opcode suffix which is coded in the same place as an 8-bit
2250          immediate field would be.  Here we fake an 8-bit immediate
2251          operand from the opcode suffix stored in tm.extension_opcode.
2252          SSE5 also uses this encoding, for some of its 3 argument
2253          instructions.  */
2254
2255       assert (i.imm_operands == 0
2256               && (i.operands <= 2
2257                   || (i.tm.cpu_flags.bitfield.cpusse5
2258                       && i.operands <= 3)));
2259
2260       exp = &im_expressions[i.imm_operands++];
2261       i.op[i.operands].imms = exp;
2262       UINTS_CLEAR (i.types[i.operands]);
2263       i.types[i.operands].bitfield.imm8 = 1;
2264       i.operands++;
2265       exp->X_op = O_constant;
2266       exp->X_add_number = i.tm.extension_opcode;
2267       i.tm.extension_opcode = None;
2268     }
2269
2270   /* For insns with operands there are more diddles to do to the opcode.  */
2271   if (i.operands)
2272     {
2273       if (!process_operands ())
2274         return;
2275     }
2276   else if (!quiet_warnings && i.tm.opcode_modifier.ugh)
2277     {
2278       /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc.  */
2279       as_warn (_("translating to `%sp'"), i.tm.name);
2280     }
2281
2282   /* Handle conversion of 'int $3' --> special int3 insn.  */
2283   if (i.tm.base_opcode == INT_OPCODE && i.op[0].imms->X_add_number == 3)
2284     {
2285       i.tm.base_opcode = INT3_OPCODE;
2286       i.imm_operands = 0;
2287     }
2288
2289   if ((i.tm.opcode_modifier.jump
2290        || i.tm.opcode_modifier.jumpbyte
2291        || i.tm.opcode_modifier.jumpdword)
2292       && i.op[0].disps->X_op == O_constant)
2293     {
2294       /* Convert "jmp constant" (and "call constant") to a jump (call) to
2295          the absolute address given by the constant.  Since ix86 jumps and
2296          calls are pc relative, we need to generate a reloc.  */
2297       i.op[0].disps->X_add_symbol = &abs_symbol;
2298       i.op[0].disps->X_op = O_symbol;
2299     }
2300
2301   if (i.tm.opcode_modifier.rex64)
2302     i.rex |= REX_W;
2303
2304   /* For 8 bit registers we need an empty rex prefix.  Also if the
2305      instruction already has a prefix, we need to convert old
2306      registers to new ones.  */
2307
2308   if ((i.types[0].bitfield.reg8
2309        && (i.op[0].regs->reg_flags & RegRex64) != 0)
2310       || (i.types[1].bitfield.reg8
2311           && (i.op[1].regs->reg_flags & RegRex64) != 0)
2312       || ((i.types[0].bitfield.reg8
2313            || i.types[1].bitfield.reg8)
2314           && i.rex != 0))
2315     {
2316       int x;
2317
2318       i.rex |= REX_OPCODE;
2319       for (x = 0; x < 2; x++)
2320         {
2321           /* Look for 8 bit operand that uses old registers.  */
2322           if (i.types[x].bitfield.reg8
2323               && (i.op[x].regs->reg_flags & RegRex64) == 0)
2324             {
2325               /* In case it is "hi" register, give up.  */
2326               if (i.op[x].regs->reg_num > 3)
2327                 as_bad (_("can't encode register '%s%s' in an "
2328                           "instruction requiring REX prefix."),
2329                         register_prefix, i.op[x].regs->reg_name);
2330
2331               /* Otherwise it is equivalent to the extended register.
2332                  Since the encoding doesn't change this is merely
2333                  cosmetic cleanup for debug output.  */
2334
2335               i.op[x].regs = i.op[x].regs + 8;
2336             }
2337         }
2338     }
2339
2340   /* If the instruction has the DREX attribute (aka SSE5), don't emit a
2341      REX prefix.  */
2342   if (i.tm.opcode_modifier.drex || i.tm.opcode_modifier.drexc)
2343     {
2344       i.drex.rex = i.rex;
2345       i.rex = 0;
2346     }
2347   else if (i.rex != 0)
2348     add_prefix (REX_OPCODE | i.rex);
2349
2350   /* We are ready to output the insn.  */
2351   output_insn ();
2352 }
2353
2354 static char *
2355 parse_insn (char *line, char *mnemonic)
2356 {
2357   char *l = line;
2358   char *token_start = l;
2359   char *mnem_p;
2360   int supported;
2361   const template *t;
2362
2363   /* Non-zero if we found a prefix only acceptable with string insns.  */
2364   const char *expecting_string_instruction = NULL;
2365
2366   while (1)
2367     {
2368       mnem_p = mnemonic;
2369       while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
2370         {
2371           mnem_p++;
2372           if (mnem_p >= mnemonic + MAX_MNEM_SIZE)
2373             {
2374               as_bad (_("no such instruction: `%s'"), token_start);
2375               return NULL;
2376             }
2377           l++;
2378         }
2379       if (!is_space_char (*l)
2380           && *l != END_OF_INSN
2381           && (intel_syntax
2382               || (*l != PREFIX_SEPARATOR
2383                   && *l != ',')))
2384         {
2385           as_bad (_("invalid character %s in mnemonic"),
2386                   output_invalid (*l));
2387           return NULL;
2388         }
2389       if (token_start == l)
2390         {
2391           if (!intel_syntax && *l == PREFIX_SEPARATOR)
2392             as_bad (_("expecting prefix; got nothing"));
2393           else
2394             as_bad (_("expecting mnemonic; got nothing"));
2395           return NULL;
2396         }
2397
2398       /* Look up instruction (or prefix) via hash table.  */
2399       current_templates = hash_find (op_hash, mnemonic);
2400
2401       if (*l != END_OF_INSN
2402           && (!is_space_char (*l) || l[1] != END_OF_INSN)
2403           && current_templates
2404           && current_templates->start->opcode_modifier.isprefix)
2405         {
2406           if (!cpu_flags_check_cpu64 (current_templates->start->cpu_flags))
2407             {
2408               as_bad ((flag_code != CODE_64BIT
2409                        ? _("`%s' is only supported in 64-bit mode")
2410                        : _("`%s' is not supported in 64-bit mode")),
2411                       current_templates->start->name);
2412               return NULL;
2413             }
2414           /* If we are in 16-bit mode, do not allow addr16 or data16.
2415              Similarly, in 32-bit mode, do not allow addr32 or data32.  */
2416           if ((current_templates->start->opcode_modifier.size16
2417                || current_templates->start->opcode_modifier.size32)
2418               && flag_code != CODE_64BIT
2419               && (current_templates->start->opcode_modifier.size32
2420                   ^ (flag_code == CODE_16BIT)))
2421             {
2422               as_bad (_("redundant %s prefix"),
2423                       current_templates->start->name);
2424               return NULL;
2425             }
2426           /* Add prefix, checking for repeated prefixes.  */
2427           switch (add_prefix (current_templates->start->base_opcode))
2428             {
2429             case 0:
2430               return NULL;
2431             case 2:
2432               expecting_string_instruction = current_templates->start->name;
2433               break;
2434             }
2435           /* Skip past PREFIX_SEPARATOR and reset token_start.  */
2436           token_start = ++l;
2437         }
2438       else
2439         break;
2440     }
2441
2442   if (!current_templates)
2443     {
2444       /* See if we can get a match by trimming off a suffix.  */
2445       switch (mnem_p[-1])
2446         {
2447         case WORD_MNEM_SUFFIX:
2448           if (intel_syntax && (intel_float_operand (mnemonic) & 2))
2449             i.suffix = SHORT_MNEM_SUFFIX;
2450           else
2451         case BYTE_MNEM_SUFFIX:
2452         case QWORD_MNEM_SUFFIX:
2453           i.suffix = mnem_p[-1];
2454           mnem_p[-1] = '\0';
2455           current_templates = hash_find (op_hash, mnemonic);
2456           break;
2457         case SHORT_MNEM_SUFFIX:
2458         case LONG_MNEM_SUFFIX:
2459           if (!intel_syntax)
2460             {
2461               i.suffix = mnem_p[-1];
2462               mnem_p[-1] = '\0';
2463               current_templates = hash_find (op_hash, mnemonic);
2464             }
2465           break;
2466
2467           /* Intel Syntax.  */
2468         case 'd':
2469           if (intel_syntax)
2470             {
2471               if (intel_float_operand (mnemonic) == 1)
2472                 i.suffix = SHORT_MNEM_SUFFIX;
2473               else
2474                 i.suffix = LONG_MNEM_SUFFIX;
2475               mnem_p[-1] = '\0';
2476               current_templates = hash_find (op_hash, mnemonic);
2477             }
2478           break;
2479         }
2480       if (!current_templates)
2481         {
2482           as_bad (_("no such instruction: `%s'"), token_start);
2483           return NULL;
2484         }
2485     }
2486
2487   if (current_templates->start->opcode_modifier.jump
2488       || current_templates->start->opcode_modifier.jumpbyte)
2489     {
2490       /* Check for a branch hint.  We allow ",pt" and ",pn" for
2491          predict taken and predict not taken respectively.
2492          I'm not sure that branch hints actually do anything on loop
2493          and jcxz insns (JumpByte) for current Pentium4 chips.  They
2494          may work in the future and it doesn't hurt to accept them
2495          now.  */
2496       if (l[0] == ',' && l[1] == 'p')
2497         {
2498           if (l[2] == 't')
2499             {
2500               if (!add_prefix (DS_PREFIX_OPCODE))
2501                 return NULL;
2502               l += 3;
2503             }
2504           else if (l[2] == 'n')
2505             {
2506               if (!add_prefix (CS_PREFIX_OPCODE))
2507                 return NULL;
2508               l += 3;
2509             }
2510         }
2511     }
2512   /* Any other comma loses.  */
2513   if (*l == ',')
2514     {
2515       as_bad (_("invalid character %s in mnemonic"),
2516               output_invalid (*l));
2517       return NULL;
2518     }
2519
2520   /* Check if instruction is supported on specified architecture.  */
2521   supported = 0;
2522   for (t = current_templates->start; t < current_templates->end; ++t)
2523     {
2524       supported |= cpu_flags_match (t->cpu_flags);
2525       if (supported == 3)
2526         goto skip;
2527     }
2528
2529   if (!(supported & 2))
2530     {
2531       as_bad (flag_code == CODE_64BIT
2532               ? _("`%s' is not supported in 64-bit mode")
2533               : _("`%s' is only supported in 64-bit mode"),
2534               current_templates->start->name);
2535       return NULL;
2536     }
2537   if (!(supported & 1))
2538     {
2539       as_bad (_("`%s' is not supported on `%s%s'"),
2540               current_templates->start->name, cpu_arch_name,
2541               cpu_sub_arch_name ? cpu_sub_arch_name : "");
2542       return NULL;
2543     }
2544
2545 skip:
2546   if (!cpu_arch_flags.bitfield.cpui386
2547            && (flag_code != CODE_16BIT))
2548     {
2549       as_warn (_("use .code16 to ensure correct addressing mode"));
2550     }
2551
2552   /* Check for rep/repne without a string instruction.  */
2553   if (expecting_string_instruction)
2554     {
2555       static templates override;
2556
2557       for (t = current_templates->start; t < current_templates->end; ++t)
2558         if (t->opcode_modifier.isstring)
2559           break;
2560       if (t >= current_templates->end)
2561         {
2562           as_bad (_("expecting string instruction after `%s'"),
2563                   expecting_string_instruction);
2564           return NULL;
2565         }
2566       for (override.start = t; t < current_templates->end; ++t)
2567         if (!t->opcode_modifier.isstring)
2568           break;
2569       override.end = t;
2570       current_templates = &override;
2571     }
2572
2573   return l;
2574 }
2575
2576 static char *
2577 parse_operands (char *l, const char *mnemonic)
2578 {
2579   char *token_start;
2580
2581   /* 1 if operand is pending after ','.  */
2582   unsigned int expecting_operand = 0;
2583
2584   /* Non-zero if operand parens not balanced.  */
2585   unsigned int paren_not_balanced;
2586
2587   while (*l != END_OF_INSN)
2588     {
2589       /* Skip optional white space before operand.  */
2590       if (is_space_char (*l))
2591         ++l;
2592       if (!is_operand_char (*l) && *l != END_OF_INSN)
2593         {
2594           as_bad (_("invalid character %s before operand %d"),
2595                   output_invalid (*l),
2596                   i.operands + 1);
2597           return NULL;
2598         }
2599       token_start = l;  /* after white space */
2600       paren_not_balanced = 0;
2601       while (paren_not_balanced || *l != ',')
2602         {
2603           if (*l == END_OF_INSN)
2604             {
2605               if (paren_not_balanced)
2606                 {
2607                   if (!intel_syntax)
2608                     as_bad (_("unbalanced parenthesis in operand %d."),
2609                             i.operands + 1);
2610                   else
2611                     as_bad (_("unbalanced brackets in operand %d."),
2612                             i.operands + 1);
2613                   return NULL;
2614                 }
2615               else
2616                 break;  /* we are done */
2617             }
2618           else if (!is_operand_char (*l) && !is_space_char (*l))
2619             {
2620               as_bad (_("invalid character %s in operand %d"),
2621                       output_invalid (*l),
2622                       i.operands + 1);
2623               return NULL;
2624             }
2625           if (!intel_syntax)
2626             {
2627               if (*l == '(')
2628                 ++paren_not_balanced;
2629               if (*l == ')')
2630                 --paren_not_balanced;
2631             }
2632           else
2633             {
2634               if (*l == '[')
2635                 ++paren_not_balanced;
2636               if (*l == ']')
2637                 --paren_not_balanced;
2638             }
2639           l++;
2640         }
2641       if (l != token_start)
2642         {                       /* Yes, we've read in another operand.  */
2643           unsigned int operand_ok;
2644           this_operand = i.operands++;
2645           if (i.operands > MAX_OPERANDS)
2646             {
2647               as_bad (_("spurious operands; (%d operands/instruction max)"),
2648                       MAX_OPERANDS);
2649               return NULL;
2650             }
2651           /* Now parse operand adding info to 'i' as we go along.  */
2652           END_STRING_AND_SAVE (l);
2653
2654           if (intel_syntax)
2655             operand_ok =
2656               i386_intel_operand (token_start,
2657                                   intel_float_operand (mnemonic));
2658           else
2659             operand_ok = i386_att_operand (token_start);
2660
2661           RESTORE_END_STRING (l);
2662           if (!operand_ok)
2663             return NULL;
2664         }
2665       else
2666         {
2667           if (expecting_operand)
2668             {
2669             expecting_operand_after_comma:
2670               as_bad (_("expecting operand after ','; got nothing"));
2671               return NULL;
2672             }
2673           if (*l == ',')
2674             {
2675               as_bad (_("expecting operand before ','; got nothing"));
2676               return NULL;
2677             }
2678         }
2679
2680       /* Now *l must be either ',' or END_OF_INSN.  */
2681       if (*l == ',')
2682         {
2683           if (*++l == END_OF_INSN)
2684             {
2685               /* Just skip it, if it's \n complain.  */
2686               goto expecting_operand_after_comma;
2687             }
2688           expecting_operand = 1;
2689         }
2690     }
2691   return l;
2692 }
2693
2694 static void
2695 swap_2_operands (int xchg1, int xchg2)
2696 {
2697   union i386_op temp_op;
2698   i386_operand_type temp_type;
2699   enum bfd_reloc_code_real temp_reloc;
2700
2701   temp_type = i.types[xchg2];
2702   i.types[xchg2] = i.types[xchg1];
2703   i.types[xchg1] = temp_type;
2704   temp_op = i.op[xchg2];
2705   i.op[xchg2] = i.op[xchg1];
2706   i.op[xchg1] = temp_op;
2707   temp_reloc = i.reloc[xchg2];
2708   i.reloc[xchg2] = i.reloc[xchg1];
2709   i.reloc[xchg1] = temp_reloc;
2710 }
2711
2712 static void
2713 swap_operands (void)
2714 {
2715   switch (i.operands)
2716     {
2717     case 4:
2718       swap_2_operands (1, i.operands - 2);
2719     case 3:
2720     case 2:
2721       swap_2_operands (0, i.operands - 1);
2722       break;
2723     default:
2724       abort ();
2725     }
2726
2727   if (i.mem_operands == 2)
2728     {
2729       const seg_entry *temp_seg;
2730       temp_seg = i.seg[0];
2731       i.seg[0] = i.seg[1];
2732       i.seg[1] = temp_seg;
2733     }
2734 }
2735
2736 /* Try to ensure constant immediates are represented in the smallest
2737    opcode possible.  */
2738 static void
2739 optimize_imm (void)
2740 {
2741   char guess_suffix = 0;
2742   int op;
2743
2744   if (i.suffix)
2745     guess_suffix = i.suffix;
2746   else if (i.reg_operands)
2747     {
2748       /* Figure out a suffix from the last register operand specified.
2749          We can't do this properly yet, ie. excluding InOutPortReg,
2750          but the following works for instructions with immediates.
2751          In any case, we can't set i.suffix yet.  */
2752       for (op = i.operands; --op >= 0;)
2753         if (i.types[op].bitfield.reg8)
2754           { 
2755             guess_suffix = BYTE_MNEM_SUFFIX;
2756             break;
2757           }
2758         else if (i.types[op].bitfield.reg16)
2759           {
2760             guess_suffix = WORD_MNEM_SUFFIX;
2761             break;
2762           }
2763         else if (i.types[op].bitfield.reg32)
2764           {
2765             guess_suffix = LONG_MNEM_SUFFIX;
2766             break;
2767           }
2768         else if (i.types[op].bitfield.reg64)
2769           {
2770             guess_suffix = QWORD_MNEM_SUFFIX;
2771             break;
2772           }
2773     }
2774   else if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
2775     guess_suffix = WORD_MNEM_SUFFIX;
2776
2777   for (op = i.operands; --op >= 0;)
2778     if (operand_type_check (i.types[op], imm))
2779       {
2780         switch (i.op[op].imms->X_op)
2781           {
2782           case O_constant:
2783             /* If a suffix is given, this operand may be shortened.  */
2784             switch (guess_suffix)
2785               {
2786               case LONG_MNEM_SUFFIX:
2787                 i.types[op].bitfield.imm32 = 1;
2788                 i.types[op].bitfield.imm64 = 1;
2789                 break;
2790               case WORD_MNEM_SUFFIX:
2791                 i.types[op].bitfield.imm16 = 1;
2792                 i.types[op].bitfield.imm32 = 1;
2793                 i.types[op].bitfield.imm32s = 1;
2794                 i.types[op].bitfield.imm64 = 1;
2795                 break;
2796               case BYTE_MNEM_SUFFIX:
2797                 i.types[op].bitfield.imm8 = 1;
2798                 i.types[op].bitfield.imm8s = 1;
2799                 i.types[op].bitfield.imm16 = 1;
2800                 i.types[op].bitfield.imm32 = 1;
2801                 i.types[op].bitfield.imm32s = 1;
2802                 i.types[op].bitfield.imm64 = 1;
2803                 break;
2804               }
2805
2806             /* If this operand is at most 16 bits, convert it
2807                to a signed 16 bit number before trying to see
2808                whether it will fit in an even smaller size.
2809                This allows a 16-bit operand such as $0xffe0 to
2810                be recognised as within Imm8S range.  */
2811             if ((i.types[op].bitfield.imm16)
2812                 && (i.op[op].imms->X_add_number & ~(offsetT) 0xffff) == 0)
2813               {
2814                 i.op[op].imms->X_add_number =
2815                   (((i.op[op].imms->X_add_number & 0xffff) ^ 0x8000) - 0x8000);
2816               }
2817             if ((i.types[op].bitfield.imm32)
2818                 && ((i.op[op].imms->X_add_number & ~(((offsetT) 2 << 31) - 1))
2819                     == 0))
2820               {
2821                 i.op[op].imms->X_add_number = ((i.op[op].imms->X_add_number
2822                                                 ^ ((offsetT) 1 << 31))
2823                                                - ((offsetT) 1 << 31));
2824               }
2825             i.types[op]
2826               = operand_type_or (i.types[op],
2827                                  smallest_imm_type (i.op[op].imms->X_add_number));
2828
2829             /* We must avoid matching of Imm32 templates when 64bit
2830                only immediate is available.  */
2831             if (guess_suffix == QWORD_MNEM_SUFFIX)
2832               i.types[op].bitfield.imm32 = 0;
2833             break;
2834
2835           case O_absent:
2836           case O_register:
2837             abort ();
2838
2839             /* Symbols and expressions.  */
2840           default:
2841             /* Convert symbolic operand to proper sizes for matching, but don't
2842                prevent matching a set of insns that only supports sizes other
2843                than those matching the insn suffix.  */
2844             {
2845               i386_operand_type mask, allowed;
2846               const template *t;
2847
2848               UINTS_CLEAR (mask);
2849               UINTS_CLEAR (allowed);
2850
2851               for (t = current_templates->start;
2852                    t < current_templates->end;
2853                    ++t)
2854                 allowed = operand_type_or (allowed,
2855                                            t->operand_types[op]);
2856               switch (guess_suffix)
2857                 {
2858                 case QWORD_MNEM_SUFFIX:
2859                   mask.bitfield.imm64 = 1;
2860                   mask.bitfield.imm32s = 1;
2861                   break;
2862                 case LONG_MNEM_SUFFIX:
2863                   mask.bitfield.imm32 = 1;
2864                   break;
2865                 case WORD_MNEM_SUFFIX:
2866                   mask.bitfield.imm16 = 1;
2867                   break;
2868                 case BYTE_MNEM_SUFFIX:
2869                   mask.bitfield.imm8 = 1;
2870                   break;
2871                 default:
2872                   break;
2873                 }
2874               allowed = operand_type_and (mask, allowed);
2875               if (!UINTS_ALL_ZERO (allowed))
2876                 i.types[op] = operand_type_and (i.types[op], mask);
2877             }
2878             break;
2879           }
2880       }
2881 }
2882
2883 /* Try to use the smallest displacement type too.  */
2884 static void
2885 optimize_disp (void)
2886 {
2887   int op;
2888
2889   for (op = i.operands; --op >= 0;)
2890     if (operand_type_check (i.types[op], disp))
2891       {
2892         if (i.op[op].disps->X_op == O_constant)
2893           {
2894             offsetT disp = i.op[op].disps->X_add_number;
2895
2896             if (i.types[op].bitfield.disp16
2897                 && (disp & ~(offsetT) 0xffff) == 0)
2898               {
2899                 /* If this operand is at most 16 bits, convert
2900                    to a signed 16 bit number and don't use 64bit
2901                    displacement.  */
2902                 disp = (((disp & 0xffff) ^ 0x8000) - 0x8000);
2903                 i.types[op].bitfield.disp64 = 0;
2904               }
2905             if (i.types[op].bitfield.disp32
2906                 && (disp & ~(((offsetT) 2 << 31) - 1)) == 0)
2907               {
2908                 /* If this operand is at most 32 bits, convert
2909                    to a signed 32 bit number and don't use 64bit
2910                    displacement.  */
2911                 disp &= (((offsetT) 2 << 31) - 1);
2912                 disp = (disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
2913                 i.types[op].bitfield.disp64 = 0;
2914               }
2915             if (!disp && i.types[op].bitfield.baseindex)
2916               {
2917                 i.types[op].bitfield.disp8 = 0;
2918                 i.types[op].bitfield.disp16 = 0;
2919                 i.types[op].bitfield.disp32 = 0;
2920                 i.types[op].bitfield.disp32s = 0;
2921                 i.types[op].bitfield.disp64 = 0;
2922                 i.op[op].disps = 0;
2923                 i.disp_operands--;
2924               }
2925             else if (flag_code == CODE_64BIT)
2926               {
2927                 if (fits_in_signed_long (disp))
2928                   {
2929                     i.types[op].bitfield.disp64 = 0;
2930                     i.types[op].bitfield.disp32s = 1;
2931                   }
2932                 if (fits_in_unsigned_long (disp))
2933                   i.types[op].bitfield.disp32 = 1;
2934               }
2935             if ((i.types[op].bitfield.disp32
2936                  || i.types[op].bitfield.disp32s
2937                  || i.types[op].bitfield.disp16)
2938                 && fits_in_signed_byte (disp))
2939               i.types[op].bitfield.disp8 = 1;
2940           }
2941         else if (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
2942                  || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL)
2943           {
2944             fix_new_exp (frag_now, frag_more (0) - frag_now->fr_literal, 0,
2945                          i.op[op].disps, 0, i.reloc[op]);
2946             i.types[op].bitfield.disp8 = 0;
2947             i.types[op].bitfield.disp16 = 0;
2948             i.types[op].bitfield.disp32 = 0;
2949             i.types[op].bitfield.disp32s = 0;
2950             i.types[op].bitfield.disp64 = 0;
2951           }
2952         else
2953           /* We only support 64bit displacement on constants.  */
2954           i.types[op].bitfield.disp64 = 0;
2955       }
2956 }
2957
2958 static int
2959 match_template (void)
2960 {
2961   /* Points to template once we've found it.  */
2962   const template *t;
2963   i386_operand_type overlap0, overlap1, overlap2, overlap3;
2964   unsigned int found_reverse_match;
2965   i386_opcode_modifier suffix_check;
2966   i386_operand_type operand_types [MAX_OPERANDS];
2967   int addr_prefix_disp;
2968   unsigned int j;
2969   unsigned int found_cpu_match;
2970   unsigned int check_register;
2971
2972 #if MAX_OPERANDS != 4
2973 # error "MAX_OPERANDS must be 4."
2974 #endif
2975
2976   found_reverse_match = 0;
2977   addr_prefix_disp = -1;
2978
2979   memset (&suffix_check, 0, sizeof (suffix_check));
2980   if (i.suffix == BYTE_MNEM_SUFFIX)
2981     suffix_check.no_bsuf = 1;
2982   else if (i.suffix == WORD_MNEM_SUFFIX)
2983     suffix_check.no_wsuf = 1;
2984   else if (i.suffix == SHORT_MNEM_SUFFIX)
2985     suffix_check.no_ssuf = 1;
2986   else if (i.suffix == LONG_MNEM_SUFFIX)
2987     suffix_check.no_lsuf = 1;
2988   else if (i.suffix == QWORD_MNEM_SUFFIX)
2989     suffix_check.no_qsuf = 1;
2990   else if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
2991     suffix_check.no_ldsuf = 1;
2992   else if (i.suffix == XMMWORD_MNEM_SUFFIX)
2993     suffix_check.xmmword = 1;
2994
2995   for (t = current_templates->start; t < current_templates->end; t++)
2996     {
2997       addr_prefix_disp = -1;
2998
2999       /* Must have right number of operands.  */
3000       if (i.operands != t->operands)
3001         continue;
3002
3003       /* Check old gcc support. */
3004       if (!old_gcc && t->opcode_modifier.oldgcc)
3005         continue;
3006
3007       /* Check AT&T mnemonic.   */
3008       if (intel_mnemonic && t->opcode_modifier.attmnemonic)
3009         continue;
3010
3011       /* Check Intel syntax.   */
3012       if (intel_syntax && t->opcode_modifier.attsyntax)
3013         continue;
3014
3015       /* Check the suffix, except for some instructions in intel mode.  */
3016       if ((!intel_syntax || !t->opcode_modifier.ignoresize)
3017           && ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
3018               || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
3019               || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
3020               || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
3021               || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
3022               || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf)))
3023         continue;
3024
3025       /* Check the memory size in Intel mode when it is provided if
3026          needed.  */
3027       if (intel_syntax
3028           && i.suffix
3029           && t->opcode_modifier.checksize
3030           && (!t->opcode_modifier.byte || !suffix_check.no_bsuf)
3031           && (!t->opcode_modifier.word || !suffix_check.no_wsuf)
3032           && (!t->opcode_modifier.dword || !suffix_check.no_lsuf)
3033           && (!t->opcode_modifier.qword || !suffix_check.no_qsuf)
3034           && (!t->opcode_modifier.xmmword || !suffix_check.xmmword))
3035         continue;
3036
3037       for (j = 0; j < MAX_OPERANDS; j++)
3038         operand_types [j] = t->operand_types [j];
3039
3040       /* In general, don't allow 64-bit operands in 32-bit mode.  */
3041       if (i.suffix == QWORD_MNEM_SUFFIX
3042           && flag_code != CODE_64BIT
3043           && (intel_syntax
3044               ? (!t->opcode_modifier.ignoresize
3045                  && !intel_float_operand (t->name))
3046               : intel_float_operand (t->name) != 2)
3047           && ((!operand_types[0].bitfield.regmmx
3048                && !operand_types[0].bitfield.regxmm)
3049               || (!operand_types[t->operands > 1].bitfield.regmmx
3050                   && !!operand_types[t->operands > 1].bitfield.regxmm))
3051           && (t->base_opcode != 0x0fc7
3052               || t->extension_opcode != 1 /* cmpxchg8b */))
3053         continue;
3054
3055       /* Do not verify operands when there are none.  */
3056       else 
3057         {
3058           found_cpu_match = cpu_flags_match (t->cpu_flags) == 3;
3059           if (!found_cpu_match)
3060             continue;
3061           if (!t->operands)
3062             /* We've found a match; break out of loop.  */
3063             break;
3064         }
3065
3066       /* Address size prefix will turn Disp64/Disp32/Disp16 operand
3067          into Disp32/Disp16/Disp32 operand.  */
3068       if (i.prefix[ADDR_PREFIX] != 0)
3069           {
3070             /* There should be only one Disp operand.  */
3071             switch (flag_code)
3072             {
3073             case CODE_16BIT:
3074               for (j = 0; j < MAX_OPERANDS; j++)
3075                 {
3076                   if (operand_types[j].bitfield.disp16)
3077                     {
3078                       addr_prefix_disp = j;
3079                       operand_types[j].bitfield.disp32 = 1;
3080                       operand_types[j].bitfield.disp16 = 0;
3081                       break;
3082                     }
3083                 }
3084               break;
3085             case CODE_32BIT:
3086               for (j = 0; j < MAX_OPERANDS; j++)
3087                 {
3088                   if (operand_types[j].bitfield.disp32)
3089                     {
3090                       addr_prefix_disp = j;
3091                       operand_types[j].bitfield.disp32 = 0;
3092                       operand_types[j].bitfield.disp16 = 1;
3093                       break;
3094                     }
3095                 }
3096               break;
3097             case CODE_64BIT:
3098               for (j = 0; j < MAX_OPERANDS; j++)
3099                 {
3100                   if (operand_types[j].bitfield.disp64)
3101                     {
3102                       addr_prefix_disp = j;
3103                       operand_types[j].bitfield.disp64 = 0;
3104                       operand_types[j].bitfield.disp32 = 1;
3105                       break;
3106                     }
3107                 }
3108               break;
3109             }
3110           }
3111
3112       /* We check register size only if size of operands can be
3113          encoded the canonical way.  */
3114       check_register = t->opcode_modifier.w;
3115       overlap0 = operand_type_and (i.types[0], operand_types[0]);
3116       switch (t->operands)
3117         {
3118         case 1:
3119           if (!operand_type_match (overlap0, i.types[0]))
3120             continue;
3121           break;
3122         case 2:
3123           /* xchg %eax, %eax is a special case. It is an aliase for nop
3124              only in 32bit mode and we can use opcode 0x90.  In 64bit
3125              mode, we can't use 0x90 for xchg %eax, %eax since it should
3126              zero-extend %eax to %rax.  */
3127           if (flag_code == CODE_64BIT
3128               && t->base_opcode == 0x90
3129               && UINTS_EQUAL (i.types [0], acc32)
3130               && UINTS_EQUAL (i.types [1], acc32))
3131             continue;
3132         case 3:
3133         case 4:
3134           overlap1 = operand_type_and (i.types[1], operand_types[1]);
3135           if (!operand_type_match (overlap0, i.types[0])
3136               || !operand_type_match (overlap1, i.types[1])
3137               || (check_register
3138                   && !operand_type_register_match (overlap0, i.types[0],
3139                                                    operand_types[0],
3140                                                    overlap1, i.types[1],
3141                                                    operand_types[1])))
3142             {
3143               /* Check if other direction is valid ...  */
3144               if (!t->opcode_modifier.d && !t->opcode_modifier.floatd)
3145                 continue;
3146
3147               /* Try reversing direction of operands.  */
3148               overlap0 = operand_type_and (i.types[0], operand_types[1]);
3149               overlap1 = operand_type_and (i.types[1], operand_types[0]);
3150               if (!operand_type_match (overlap0, i.types[0])
3151                   || !operand_type_match (overlap1, i.types[1])
3152                   || (check_register
3153                       && !operand_type_register_match (overlap0,
3154                                                        i.types[0],
3155                                                        operand_types[1],
3156                                                        overlap1,
3157                                                        i.types[1],
3158                                                        operand_types[0])))
3159                 {
3160                   /* Does not match either direction.  */
3161                   continue;
3162                 }
3163               /* found_reverse_match holds which of D or FloatDR
3164                  we've found.  */
3165               if (t->opcode_modifier.d)
3166                 found_reverse_match = Opcode_D;
3167               else if (t->opcode_modifier.floatd)
3168                 found_reverse_match = Opcode_FloatD;
3169               else
3170                 found_reverse_match = 0;
3171               if (t->opcode_modifier.floatr)
3172                 found_reverse_match |= Opcode_FloatR;
3173             }
3174           else
3175             {
3176               /* Found a forward 2 operand match here.  */
3177               switch (t->operands)
3178                 {
3179                 case 4:
3180                   overlap3 = operand_type_and (i.types[3],
3181                                                operand_types[3]);
3182                 case 3:
3183                   overlap2 = operand_type_and (i.types[2],
3184                                                operand_types[2]);
3185                   break;
3186                 }
3187
3188               switch (t->operands)
3189                 {
3190                 case 4:
3191                   if (!operand_type_match (overlap3, i.types[3])
3192                       || (check_register
3193                           && !operand_type_register_match (overlap2,
3194                                                            i.types[2],
3195                                                            operand_types[2],
3196                                                            overlap3,
3197                                                            i.types[3],
3198                                                            operand_types[3])))
3199                     continue;
3200                 case 3:
3201                   /* Here we make use of the fact that there are no
3202                      reverse match 3 operand instructions, and all 3
3203                      operand instructions only need to be checked for
3204                      register consistency between operands 2 and 3.  */
3205                   if (!operand_type_match (overlap2, i.types[2])
3206                       || (check_register
3207                           && !operand_type_register_match (overlap1,
3208                                                            i.types[1],
3209                                                            operand_types[1],
3210                                                            overlap2,
3211                                                            i.types[2],
3212                                                            operand_types[2])))
3213                     continue;
3214                   break;
3215                 }
3216             }
3217           /* Found either forward/reverse 2, 3 or 4 operand match here:
3218              slip through to break.  */
3219         }
3220       if (!found_cpu_match)
3221         {
3222           found_reverse_match = 0;
3223           continue;
3224         }
3225       /* We've found a match; break out of loop.  */
3226       break;
3227     }
3228
3229   if (t == current_templates->end)
3230     {
3231       /* We found no match.  */
3232       as_bad (_("suffix or operands invalid for `%s'"),
3233               current_templates->start->name);
3234       return 0;
3235     }
3236
3237   if (!quiet_warnings)
3238     {
3239       if (!intel_syntax
3240           && (i.types[0].bitfield.jumpabsolute
3241               != operand_types[0].bitfield.jumpabsolute))
3242         {
3243           as_warn (_("indirect %s without `*'"), t->name);
3244         }
3245
3246       if (t->opcode_modifier.isprefix
3247           && t->opcode_modifier.ignoresize)
3248         {
3249           /* Warn them that a data or address size prefix doesn't
3250              affect assembly of the next line of code.  */
3251           as_warn (_("stand-alone `%s' prefix"), t->name);
3252         }
3253     }
3254
3255   /* Copy the template we found.  */
3256   i.tm = *t;
3257
3258   if (addr_prefix_disp != -1)
3259     i.tm.operand_types[addr_prefix_disp]
3260       = operand_types[addr_prefix_disp];
3261
3262   if (found_reverse_match)
3263     {
3264       /* If we found a reverse match we must alter the opcode
3265          direction bit.  found_reverse_match holds bits to change
3266          (different for int & float insns).  */
3267
3268       i.tm.base_opcode ^= found_reverse_match;
3269
3270       i.tm.operand_types[0] = operand_types[1];
3271       i.tm.operand_types[1] = operand_types[0];
3272     }
3273
3274   return 1;
3275 }
3276
3277 static int
3278 check_string (void)
3279 {
3280   int mem_op = operand_type_check (i.types[0], anymem) ? 0 : 1;
3281   if (i.tm.operand_types[mem_op].bitfield.esseg)
3282     {
3283       if (i.seg[0] != NULL && i.seg[0] != &es)
3284         {
3285           as_bad (_("`%s' operand %d must use `%%es' segment"),
3286                   i.tm.name,
3287                   mem_op + 1);
3288           return 0;
3289         }
3290       /* There's only ever one segment override allowed per instruction.
3291          This instruction possibly has a legal segment override on the
3292          second operand, so copy the segment to where non-string
3293          instructions store it, allowing common code.  */
3294       i.seg[0] = i.seg[1];
3295     }
3296   else if (i.tm.operand_types[mem_op + 1].bitfield.esseg)
3297     {
3298       if (i.seg[1] != NULL && i.seg[1] != &es)
3299         {
3300           as_bad (_("`%s' operand %d must use `%%es' segment"),
3301                   i.tm.name,
3302                   mem_op + 2);
3303           return 0;
3304         }
3305     }
3306   return 1;
3307 }
3308
3309 static int
3310 process_suffix (void)
3311 {
3312   /* If matched instruction specifies an explicit instruction mnemonic
3313      suffix, use it.  */
3314   if (i.tm.opcode_modifier.size16)
3315     i.suffix = WORD_MNEM_SUFFIX;
3316   else if (i.tm.opcode_modifier.size32)
3317     i.suffix = LONG_MNEM_SUFFIX;
3318   else if (i.tm.opcode_modifier.size64)
3319     i.suffix = QWORD_MNEM_SUFFIX;
3320   else if (i.reg_operands)
3321     {
3322       /* If there's no instruction mnemonic suffix we try to invent one
3323          based on register operands.  */
3324       if (!i.suffix)
3325         {
3326           /* We take i.suffix from the last register operand specified,
3327              Destination register type is more significant than source
3328              register type.  crc32 in SSE4.2 prefers source register
3329              type. */
3330           if (i.tm.base_opcode == 0xf20f38f1)
3331             {
3332               if (i.types[0].bitfield.reg16)
3333                 i.suffix = WORD_MNEM_SUFFIX;
3334               else if (i.types[0].bitfield.reg32)
3335                 i.suffix = LONG_MNEM_SUFFIX;
3336               else if (i.types[0].bitfield.reg64)
3337                 i.suffix = QWORD_MNEM_SUFFIX;
3338             }
3339           else if (i.tm.base_opcode == 0xf20f38f0)
3340             {
3341               if (i.types[0].bitfield.reg8)
3342                 i.suffix = BYTE_MNEM_SUFFIX;
3343             }
3344
3345           if (!i.suffix)
3346             {
3347               int op;
3348
3349               if (i.tm.base_opcode == 0xf20f38f1
3350                   || i.tm.base_opcode == 0xf20f38f0)
3351                 {
3352                   /* We have to know the operand size for crc32.  */
3353                   as_bad (_("ambiguous memory operand size for `%s`"),
3354                           i.tm.name);
3355                   return 0;
3356                 }
3357
3358               for (op = i.operands; --op >= 0;)
3359                 if (!i.tm.operand_types[op].bitfield.inoutportreg)
3360                   {
3361                     if (i.types[op].bitfield.reg8)
3362                       {
3363                         i.suffix = BYTE_MNEM_SUFFIX;
3364                         break;
3365                       }
3366                     else if (i.types[op].bitfield.reg16)
3367                       {
3368                         i.suffix = WORD_MNEM_SUFFIX;
3369                         break;
3370                       }
3371                     else if (i.types[op].bitfield.reg32)
3372                       {
3373                         i.suffix = LONG_MNEM_SUFFIX;
3374                         break;
3375                       }
3376                     else if (i.types[op].bitfield.reg64)
3377                       {
3378                         i.suffix = QWORD_MNEM_SUFFIX;
3379                         break;
3380                       }
3381                   }
3382             }
3383         }
3384       else if (i.suffix == BYTE_MNEM_SUFFIX)
3385         {
3386           if (!check_byte_reg ())
3387             return 0;
3388         }
3389       else if (i.suffix == LONG_MNEM_SUFFIX)
3390         {
3391           if (!check_long_reg ())
3392             return 0;
3393         }
3394       else if (i.suffix == QWORD_MNEM_SUFFIX)
3395         {
3396           if (intel_syntax
3397               && i.tm.opcode_modifier.ignoresize
3398               && i.tm.opcode_modifier.no_qsuf)
3399             i.suffix = 0;
3400           else if (!check_qword_reg ())
3401             return 0;
3402         }
3403       else if (i.suffix == WORD_MNEM_SUFFIX)
3404         {
3405           if (!check_word_reg ())
3406             return 0;
3407         }
3408       else if (i.suffix == XMMWORD_MNEM_SUFFIX)
3409         {
3410           /* Skip if the instruction has x suffix.  match_template
3411              should check if it is a valid suffix.  */
3412         }
3413       else if (intel_syntax && i.tm.opcode_modifier.ignoresize)
3414         /* Do nothing if the instruction is going to ignore the prefix.  */
3415         ;
3416       else
3417         abort ();
3418     }
3419   else if (i.tm.opcode_modifier.defaultsize
3420            && !i.suffix
3421            /* exclude fldenv/frstor/fsave/fstenv */
3422            && i.tm.opcode_modifier.no_ssuf)
3423     {
3424       i.suffix = stackop_size;
3425     }
3426   else if (intel_syntax
3427            && !i.suffix
3428            && (i.tm.operand_types[0].bitfield.jumpabsolute
3429                || i.tm.opcode_modifier.jumpbyte
3430                || i.tm.opcode_modifier.jumpintersegment
3431                || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
3432                    && i.tm.extension_opcode <= 3)))
3433     {
3434       switch (flag_code)
3435         {
3436         case CODE_64BIT:
3437           if (!i.tm.opcode_modifier.no_qsuf)
3438             {
3439               i.suffix = QWORD_MNEM_SUFFIX;
3440               break;
3441             }
3442         case CODE_32BIT:
3443           if (!i.tm.opcode_modifier.no_lsuf)
3444             i.suffix = LONG_MNEM_SUFFIX;
3445           break;
3446         case CODE_16BIT:
3447           if (!i.tm.opcode_modifier.no_wsuf)
3448             i.suffix = WORD_MNEM_SUFFIX;
3449           break;
3450         }
3451     }
3452
3453   if (!i.suffix)
3454     {
3455       if (!intel_syntax)
3456         {
3457           if (i.tm.opcode_modifier.w)
3458             {
3459               as_bad (_("no instruction mnemonic suffix given and "
3460                         "no register operands; can't size instruction"));
3461               return 0;
3462             }
3463         }
3464       else
3465         {
3466           unsigned int suffixes;
3467           
3468           suffixes = !i.tm.opcode_modifier.no_bsuf;
3469           if (!i.tm.opcode_modifier.no_wsuf)
3470             suffixes |= 1 << 1;
3471           if (!i.tm.opcode_modifier.no_lsuf)
3472             suffixes |= 1 << 2;
3473           if (!i.tm.opcode_modifier.no_ldsuf)
3474             suffixes |= 1 << 3;
3475           if (!i.tm.opcode_modifier.no_ssuf)
3476             suffixes |= 1 << 4;
3477           if (!i.tm.opcode_modifier.no_qsuf)
3478             suffixes |= 1 << 5;
3479
3480           /* There are more than suffix matches.  */
3481           if (i.tm.opcode_modifier.w
3482               || ((suffixes & (suffixes - 1))
3483                   && !i.tm.opcode_modifier.defaultsize
3484                   && !i.tm.opcode_modifier.ignoresize))
3485             {
3486               as_bad (_("ambiguous operand size for `%s'"), i.tm.name);
3487               return 0;
3488             }
3489         }
3490     }
3491
3492   /* Change the opcode based on the operand size given by i.suffix;
3493      We don't need to change things for byte insns.  */
3494
3495   if (i.suffix
3496       && i.suffix != BYTE_MNEM_SUFFIX
3497       && i.suffix != XMMWORD_MNEM_SUFFIX)
3498     {
3499       /* It's not a byte, select word/dword operation.  */
3500       if (i.tm.opcode_modifier.w)
3501         {
3502           if (i.tm.opcode_modifier.shortform)
3503             i.tm.base_opcode |= 8;
3504           else
3505             i.tm.base_opcode |= 1;
3506         }
3507
3508       /* Now select between word & dword operations via the operand
3509          size prefix, except for instructions that will ignore this
3510          prefix anyway.  */
3511       if (i.tm.opcode_modifier.addrprefixop0)
3512         {
3513           /* The address size override prefix changes the size of the
3514              first operand.  */
3515           if ((flag_code == CODE_32BIT
3516                && i.op->regs[0].reg_type.bitfield.reg16)
3517               || (flag_code != CODE_32BIT
3518                   && i.op->regs[0].reg_type.bitfield.reg32))
3519             if (!add_prefix (ADDR_PREFIX_OPCODE))
3520               return 0;
3521         }
3522       else if (i.suffix != QWORD_MNEM_SUFFIX
3523                && i.suffix != LONG_DOUBLE_MNEM_SUFFIX
3524                && !i.tm.opcode_modifier.ignoresize
3525                && !i.tm.opcode_modifier.floatmf
3526                && ((i.suffix == LONG_MNEM_SUFFIX) == (flag_code == CODE_16BIT)
3527                    || (flag_code == CODE_64BIT
3528                        && i.tm.opcode_modifier.jumpbyte)))
3529         {
3530           unsigned int prefix = DATA_PREFIX_OPCODE;
3531
3532           if (i.tm.opcode_modifier.jumpbyte) /* jcxz, loop */
3533             prefix = ADDR_PREFIX_OPCODE;
3534
3535           if (!add_prefix (prefix))
3536             return 0;
3537         }
3538
3539       /* Set mode64 for an operand.  */
3540       if (i.suffix == QWORD_MNEM_SUFFIX
3541           && flag_code == CODE_64BIT
3542           && !i.tm.opcode_modifier.norex64)
3543         {
3544           /* Special case for xchg %rax,%rax.  It is NOP and doesn't
3545              need rex64.  cmpxchg8b is also a special case. */
3546           if (! (i.operands == 2
3547                  && i.tm.base_opcode == 0x90
3548                  && i.tm.extension_opcode == None
3549                  && UINTS_EQUAL (i.types [0], acc64)
3550                  && UINTS_EQUAL (i.types [1], acc64))
3551               && ! (i.operands == 1
3552                     && i.tm.base_opcode == 0xfc7
3553                     && i.tm.extension_opcode == 1
3554                     && !operand_type_check (i.types [0], reg)
3555                     && operand_type_check (i.types [0], anymem)))
3556             i.rex |= REX_W;
3557         }
3558
3559       /* Size floating point instruction.  */
3560       if (i.suffix == LONG_MNEM_SUFFIX)
3561         if (i.tm.opcode_modifier.floatmf)
3562           i.tm.base_opcode ^= 4;
3563     }
3564
3565   return 1;
3566 }
3567
3568 static int
3569 check_byte_reg (void)
3570 {
3571   int op;
3572
3573   for (op = i.operands; --op >= 0;)
3574     {
3575       /* If this is an eight bit register, it's OK.  If it's the 16 or
3576          32 bit version of an eight bit register, we will just use the
3577          low portion, and that's OK too.  */
3578       if (i.types[op].bitfield.reg8)
3579         continue;
3580
3581       /* Don't generate this warning if not needed.  */
3582       if (intel_syntax && i.tm.opcode_modifier.byteokintel)
3583         continue;
3584
3585       /* crc32 doesn't generate this warning.  */
3586       if (i.tm.base_opcode == 0xf20f38f0)
3587         continue;
3588
3589       if ((i.types[op].bitfield.reg16
3590            || i.types[op].bitfield.reg32
3591            || i.types[op].bitfield.reg64)
3592           && i.op[op].regs->reg_num < 4)
3593         {
3594           /* Prohibit these changes in the 64bit mode, since the
3595              lowering is more complicated.  */
3596           if (flag_code == CODE_64BIT
3597               && !i.tm.operand_types[op].bitfield.inoutportreg)
3598             {
3599               as_bad (_("Incorrect register `%s%s' used with `%c' suffix"),
3600                       register_prefix, i.op[op].regs->reg_name,
3601                       i.suffix);
3602               return 0;
3603             }
3604 #if REGISTER_WARNINGS
3605           if (!quiet_warnings
3606               && !i.tm.operand_types[op].bitfield.inoutportreg)
3607             as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
3608                      register_prefix,
3609                      (i.op[op].regs + (i.types[op].bitfield.reg16
3610                                        ? REGNAM_AL - REGNAM_AX
3611                                        : REGNAM_AL - REGNAM_EAX))->reg_name,
3612                      register_prefix,
3613                      i.op[op].regs->reg_name,
3614                      i.suffix);
3615 #endif
3616           continue;
3617         }
3618       /* Any other register is bad.  */
3619       if (i.types[op].bitfield.reg16
3620           || i.types[op].bitfield.reg32
3621           || i.types[op].bitfield.reg64
3622           || i.types[op].bitfield.regmmx
3623           || i.types[op].bitfield.regxmm
3624           || i.types[op].bitfield.sreg2
3625           || i.types[op].bitfield.sreg3
3626           || i.types[op].bitfield.control
3627           || i.types[op].bitfield.debug
3628           || i.types[op].bitfield.test
3629           || i.types[op].bitfield.floatreg
3630           || i.types[op].bitfield.floatacc)
3631         {
3632           as_bad (_("`%s%s' not allowed with `%s%c'"),
3633                   register_prefix,
3634                   i.op[op].regs->reg_name,
3635                   i.tm.name,
3636                   i.suffix);
3637           return 0;
3638         }
3639     }
3640   return 1;
3641 }
3642
3643 static int
3644 check_long_reg (void)
3645 {
3646   int op;
3647
3648   for (op = i.operands; --op >= 0;)
3649     /* Reject eight bit registers, except where the template requires
3650        them. (eg. movzb)  */
3651     if (i.types[op].bitfield.reg8
3652         && (i.tm.operand_types[op].bitfield.reg16
3653             || i.tm.operand_types[op].bitfield.reg32
3654             || i.tm.operand_types[op].bitfield.acc))
3655       {
3656         as_bad (_("`%s%s' not allowed with `%s%c'"),
3657                 register_prefix,
3658                 i.op[op].regs->reg_name,
3659                 i.tm.name,
3660                 i.suffix);
3661         return 0;
3662       }
3663   /* Warn if the e prefix on a general reg is missing.  */
3664     else if ((!quiet_warnings || flag_code == CODE_64BIT)
3665              && i.types[op].bitfield.reg16
3666              && (i.tm.operand_types[op].bitfield.reg32
3667                  || i.tm.operand_types[op].bitfield.acc))
3668       {
3669         /* Prohibit these changes in the 64bit mode, since the
3670            lowering is more complicated.  */
3671         if (flag_code == CODE_64BIT)
3672           {
3673             as_bad (_("Incorrect register `%s%s' used with `%c' suffix"),
3674                     register_prefix, i.op[op].regs->reg_name,
3675                     i.suffix);
3676             return 0;
3677           }
3678 #if REGISTER_WARNINGS
3679         else
3680           as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
3681                    register_prefix,
3682                    (i.op[op].regs + REGNAM_EAX - REGNAM_AX)->reg_name,
3683                    register_prefix,
3684                    i.op[op].regs->reg_name,
3685                    i.suffix);
3686 #endif
3687       }
3688   /* Warn if the r prefix on a general reg is missing.  */
3689     else if (i.types[op].bitfield.reg64
3690              && (i.tm.operand_types[op].bitfield.reg32
3691                  || i.tm.operand_types[op].bitfield.acc))
3692       {
3693         if (intel_syntax
3694             && i.tm.opcode_modifier.toqword
3695             && !i.types[0].bitfield.regxmm)
3696           {
3697             /* Convert to QWORD.  We want REX byte. */
3698             i.suffix = QWORD_MNEM_SUFFIX;
3699           }
3700         else
3701           {
3702             as_bad (_("Incorrect register `%s%s' used with `%c' suffix"),
3703                     register_prefix, i.op[op].regs->reg_name,
3704                     i.suffix);
3705             return 0;
3706           }
3707       }
3708   return 1;
3709 }
3710
3711 static int
3712 check_qword_reg (void)
3713 {
3714   int op;
3715
3716   for (op = i.operands; --op >= 0; )
3717     /* Reject eight bit registers, except where the template requires
3718        them. (eg. movzb)  */
3719     if (i.types[op].bitfield.reg8
3720         && (i.tm.operand_types[op].bitfield.reg16
3721             || i.tm.operand_types[op].bitfield.reg32
3722             || i.tm.operand_types[op].bitfield.acc))
3723       {
3724         as_bad (_("`%s%s' not allowed with `%s%c'"),
3725                 register_prefix,
3726                 i.op[op].regs->reg_name,
3727                 i.tm.name,
3728                 i.suffix);
3729         return 0;
3730       }
3731   /* Warn if the e prefix on a general reg is missing.  */
3732     else if ((i.types[op].bitfield.reg16
3733               || i.types[op].bitfield.reg32)
3734              && (i.tm.operand_types[op].bitfield.reg32
3735                  || i.tm.operand_types[op].bitfield.acc))
3736       {
3737         /* Prohibit these changes in the 64bit mode, since the
3738            lowering is more complicated.  */
3739         if (intel_syntax
3740             && i.tm.opcode_modifier.todword
3741             && !i.types[0].bitfield.regxmm)
3742           {
3743             /* Convert to DWORD.  We don't want REX byte. */
3744             i.suffix = LONG_MNEM_SUFFIX;
3745           }
3746         else
3747           {
3748             as_bad (_("Incorrect register `%s%s' used with `%c' suffix"),
3749                     register_prefix, i.op[op].regs->reg_name,
3750                     i.suffix);
3751             return 0;
3752           }
3753       }
3754   return 1;
3755 }
3756
3757 static int
3758 check_word_reg (void)
3759 {
3760   int op;
3761   for (op = i.operands; --op >= 0;)
3762     /* Reject eight bit registers, except where the template requires
3763        them. (eg. movzb)  */
3764     if (i.types[op].bitfield.reg8
3765         && (i.tm.operand_types[op].bitfield.reg16
3766             || i.tm.operand_types[op].bitfield.reg32
3767             || i.tm.operand_types[op].bitfield.acc))
3768       {
3769         as_bad (_("`%s%s' not allowed with `%s%c'"),
3770                 register_prefix,
3771                 i.op[op].regs->reg_name,
3772                 i.tm.name,
3773                 i.suffix);
3774         return 0;
3775       }
3776   /* Warn if the e prefix on a general reg is present.  */
3777     else if ((!quiet_warnings || flag_code == CODE_64BIT)
3778              && i.types[op].bitfield.reg32
3779              && (i.tm.operand_types[op].bitfield.reg16
3780                  || i.tm.operand_types[op].bitfield.acc))
3781       {
3782         /* Prohibit these changes in the 64bit mode, since the
3783            lowering is more complicated.  */
3784         if (flag_code == CODE_64BIT)
3785           {
3786             as_bad (_("Incorrect register `%s%s' used with `%c' suffix"),
3787                     register_prefix, i.op[op].regs->reg_name,
3788                     i.suffix);
3789             return 0;
3790           }
3791         else
3792 #if REGISTER_WARNINGS
3793           as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
3794                    register_prefix,
3795                    (i.op[op].regs + REGNAM_AX - REGNAM_EAX)->reg_name,
3796                    register_prefix,
3797                    i.op[op].regs->reg_name,
3798                    i.suffix);
3799 #endif
3800       }
3801   return 1;
3802 }
3803
3804 static int
3805 update_imm (unsigned int j)
3806 {
3807   i386_operand_type overlap;
3808
3809   overlap = operand_type_and (i.types[j], i.tm.operand_types[j]);
3810   if ((overlap.bitfield.imm8
3811        || overlap.bitfield.imm8s
3812        || overlap.bitfield.imm16
3813        || overlap.bitfield.imm32
3814        || overlap.bitfield.imm32s
3815        || overlap.bitfield.imm64)
3816       && !UINTS_EQUAL (overlap, imm8)
3817       && !UINTS_EQUAL (overlap, imm8s)
3818       && !UINTS_EQUAL (overlap, imm16)
3819       && !UINTS_EQUAL (overlap, imm32)
3820       && !UINTS_EQUAL (overlap, imm32s)
3821       && !UINTS_EQUAL (overlap, imm64))
3822     {
3823       if (i.suffix)
3824         {
3825           i386_operand_type temp;
3826
3827           UINTS_CLEAR (temp);
3828           if (i.suffix == BYTE_MNEM_SUFFIX) 
3829             {
3830               temp.bitfield.imm8 = overlap.bitfield.imm8;
3831               temp.bitfield.imm8s = overlap.bitfield.imm8s;
3832             }
3833           else if (i.suffix == WORD_MNEM_SUFFIX)
3834             temp.bitfield.imm16 = overlap.bitfield.imm16;
3835           else if (i.suffix == QWORD_MNEM_SUFFIX)
3836             {
3837               temp.bitfield.imm64 = overlap.bitfield.imm64;
3838               temp.bitfield.imm32s = overlap.bitfield.imm32s;
3839             }
3840           else
3841             temp.bitfield.imm32 = overlap.bitfield.imm32;
3842           overlap = temp;
3843         }
3844       else if (UINTS_EQUAL (overlap, imm16_32_32s)
3845                || UINTS_EQUAL (overlap, imm16_32)
3846                || UINTS_EQUAL (overlap, imm16_32s))
3847         {
3848           UINTS_CLEAR (overlap);
3849           if ((flag_code == CODE_16BIT) ^ (i.prefix[DATA_PREFIX] != 0))
3850             overlap.bitfield.imm16 = 1;
3851           else
3852             overlap.bitfield.imm32s = 1;
3853         }
3854       if (!UINTS_EQUAL (overlap, imm8)
3855           && !UINTS_EQUAL (overlap, imm8s)
3856           && !UINTS_EQUAL (overlap, imm16)
3857           && !UINTS_EQUAL (overlap, imm32)
3858           && !UINTS_EQUAL (overlap, imm32s)
3859           && !UINTS_EQUAL (overlap, imm64))
3860         {
3861           as_bad (_("no instruction mnemonic suffix given; "
3862                     "can't determine immediate size"));
3863           return 0;
3864         }
3865     }
3866   i.types[j] = overlap;
3867
3868   return 1;
3869 }
3870
3871 static int
3872 finalize_imm (void)
3873 {
3874   unsigned int j;
3875
3876   for (j = 0; j < 2; j++)
3877     if (update_imm (j) == 0)
3878       return 0;
3879
3880   i.types[2] = operand_type_and (i.types[2], i.tm.operand_types[2]);
3881   assert (operand_type_check (i.types[2], imm) == 0);
3882
3883   return 1;
3884 }
3885
3886 static void
3887 process_drex (void)
3888 {
3889   i.drex.modrm_reg = 0;
3890   i.drex.modrm_regmem = 0;
3891
3892   /* SSE5 4 operand instructions must have the destination the same as 
3893      one of the inputs.  Figure out the destination register and cache
3894      it away in the drex field, and remember which fields to use for 
3895      the modrm byte.  */
3896   if (i.tm.opcode_modifier.drex 
3897       && i.tm.opcode_modifier.drexv 
3898       && i.operands == 4)
3899     {
3900       i.tm.extension_opcode = None;
3901
3902       /* Case 1: 4 operand insn, dest = src1, src3 = register.  */
3903       if (i.types[0].bitfield.regxmm != 0
3904           && i.types[1].bitfield.regxmm != 0
3905           && i.types[2].bitfield.regxmm != 0
3906           && i.types[3].bitfield.regxmm != 0
3907           && i.op[0].regs->reg_num == i.op[3].regs->reg_num
3908           && i.op[0].regs->reg_flags == i.op[3].regs->reg_flags)
3909         {
3910           /* Clear the arguments that are stored in drex.  */
3911           UINTS_CLEAR (i.types[0]); 
3912           UINTS_CLEAR (i.types[3]);
3913           i.reg_operands -= 2;
3914
3915           /* There are two different ways to encode a 4 operand 
3916              instruction with all registers that uses OC1 set to 
3917              0 or 1.  Favor setting OC1 to 0 since this mimics the 
3918              actions of other SSE5 assemblers.  Use modrm encoding 2 
3919              for register/register.  Include the high order bit that 
3920              is normally stored in the REX byte in the register
3921              field.  */
3922           i.tm.extension_opcode = DREX_X1_XMEM_X2_X1;
3923           i.drex.modrm_reg = 2;
3924           i.drex.modrm_regmem = 1;
3925           i.drex.reg = (i.op[3].regs->reg_num
3926                         + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
3927         }
3928
3929       /* Case 2: 4 operand insn, dest = src1, src3 = memory.  */
3930       else if (i.types[0].bitfield.regxmm != 0
3931                && i.types[1].bitfield.regxmm != 0
3932                && (i.types[2].bitfield.regxmm 
3933                    || operand_type_check (i.types[2], anymem))
3934                && i.types[3].bitfield.regxmm != 0
3935                && i.op[0].regs->reg_num == i.op[3].regs->reg_num
3936                && i.op[0].regs->reg_flags == i.op[3].regs->reg_flags)
3937         {
3938           /* clear the arguments that are stored in drex */
3939           UINTS_CLEAR (i.types[0]);
3940           UINTS_CLEAR (i.types[3]);
3941           i.reg_operands -= 2;
3942
3943           /* Specify the modrm encoding for memory addressing.  Include 
3944              the high order bit that is normally stored in the REX byte
3945              in the register field.  */
3946           i.tm.extension_opcode = DREX_X1_X2_XMEM_X1;
3947           i.drex.modrm_reg = 1;
3948           i.drex.modrm_regmem = 2;
3949           i.drex.reg = (i.op[3].regs->reg_num
3950                         + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
3951         }
3952
3953       /* Case 3: 4 operand insn, dest = src1, src2 = memory.  */
3954       else if (i.types[0].bitfield.regxmm != 0
3955                && operand_type_check (i.types[1], anymem) != 0
3956                && i.types[2].bitfield.regxmm != 0
3957                && i.types[3].bitfield.regxmm != 0
3958                && i.op[0].regs->reg_num == i.op[3].regs->reg_num
3959                && i.op[0].regs->reg_flags == i.op[3].regs->reg_flags)
3960         {
3961           /* Clear the arguments that are stored in drex.  */
3962           UINTS_CLEAR (i.types[0]);
3963           UINTS_CLEAR (i.types[3]);
3964           i.reg_operands -= 2;
3965
3966           /* Specify the modrm encoding for memory addressing.  Include
3967              the high order bit that is normally stored in the REX byte 
3968              in the register field.  */
3969           i.tm.extension_opcode = DREX_X1_XMEM_X2_X1;
3970           i.drex.modrm_reg = 2;
3971           i.drex.modrm_regmem = 1;
3972           i.drex.reg = (i.op[3].regs->reg_num
3973                         + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
3974         }
3975
3976       /* Case 4: 4 operand insn, dest = src3, src2 = register. */
3977       else if (i.types[0].bitfield.regxmm != 0
3978                && i.types[1].bitfield.regxmm != 0
3979                && i.types[2].bitfield.regxmm != 0
3980                && i.types[3].bitfield.regxmm != 0
3981                && i.op[2].regs->reg_num == i.op[3].regs->reg_num
3982                && i.op[2].regs->reg_flags == i.op[3].regs->reg_flags)
3983         {
3984           /* clear the arguments that are stored in drex */
3985           UINTS_CLEAR (i.types[2]);
3986           UINTS_CLEAR (i.types[3]);
3987           i.reg_operands -= 2;
3988
3989           /* There are two different ways to encode a 4 operand 
3990              instruction with all registers that uses OC1 set to 
3991              0 or 1.  Favor setting OC1 to 0 since this mimics the 
3992              actions of other SSE5 assemblers.  Use modrm encoding 
3993              2 for register/register.  Include the high order bit that 
3994              is normally stored in the REX byte in the register 
3995              field.  */
3996           i.tm.extension_opcode = DREX_XMEM_X1_X2_X2;
3997           i.drex.modrm_reg = 1;
3998           i.drex.modrm_regmem = 0;
3999
4000           /* Remember the register, including the upper bits */
4001           i.drex.reg = (i.op[3].regs->reg_num
4002                         + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
4003         }
4004
4005       /* Case 5: 4 operand insn, dest = src3, src2 = memory.  */
4006       else if (i.types[0].bitfield.regxmm != 0
4007                && (i.types[1].bitfield.regxmm 
4008                    || operand_type_check (i.types[1], anymem)) 
4009                && i.types[2].bitfield.regxmm != 0
4010                && i.types[3].bitfield.regxmm != 0
4011                && i.op[2].regs->reg_num == i.op[3].regs->reg_num
4012                && i.op[2].regs->reg_flags == i.op[3].regs->reg_flags)
4013         {
4014           /* Clear the arguments that are stored in drex.  */
4015           UINTS_CLEAR (i.types[2]);
4016           UINTS_CLEAR (i.types[3]);
4017           i.reg_operands -= 2;
4018
4019           /* Specify the modrm encoding and remember the register 
4020              including the bits normally stored in the REX byte. */
4021           i.tm.extension_opcode = DREX_X1_XMEM_X2_X2;
4022           i.drex.modrm_reg = 0;
4023           i.drex.modrm_regmem = 1;
4024           i.drex.reg = (i.op[3].regs->reg_num
4025                         + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
4026         }
4027
4028       /* Case 6: 4 operand insn, dest = src3, src1 = memory.  */
4029       else if (operand_type_check (i.types[0], anymem) != 0
4030                && i.types[1].bitfield.regxmm != 0
4031                && i.types[2].bitfield.regxmm != 0
4032                && i.types[3].bitfield.regxmm != 0
4033                && i.op[2].regs->reg_num == i.op[3].regs->reg_num
4034                && i.op[2].regs->reg_flags == i.op[3].regs->reg_flags)
4035         {
4036           /* clear the arguments that are stored in drex */
4037           UINTS_CLEAR (i.types[2]);
4038           UINTS_CLEAR (i.types[3]);
4039           i.reg_operands -= 2;
4040
4041           /* Specify the modrm encoding and remember the register 
4042              including the bits normally stored in the REX byte. */
4043           i.tm.extension_opcode = DREX_XMEM_X1_X2_X2;
4044           i.drex.modrm_reg = 1;
4045           i.drex.modrm_regmem = 0;
4046           i.drex.reg = (i.op[3].regs->reg_num
4047                         + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
4048         }
4049
4050       else
4051         as_bad (_("Incorrect operands for the '%s' instruction"), 
4052                 i.tm.name);
4053     }
4054
4055   /* SSE5 instructions with the DREX byte where the only memory operand 
4056      is in the 2nd argument, and the first and last xmm register must 
4057      match, and is encoded in the DREX byte. */
4058   else if (i.tm.opcode_modifier.drex 
4059            && !i.tm.opcode_modifier.drexv 
4060            && i.operands == 4)
4061     {
4062       /* Case 1: 4 operand insn, dest = src1, src3 = reg/mem.  */
4063       if (i.types[0].bitfield.regxmm != 0
4064           && (i.types[1].bitfield.regxmm 
4065               || operand_type_check(i.types[1], anymem)) 
4066           && i.types[2].bitfield.regxmm != 0
4067           && i.types[3].bitfield.regxmm != 0
4068           && i.op[0].regs->reg_num == i.op[3].regs->reg_num
4069           && i.op[0].regs->reg_flags == i.op[3].regs->reg_flags)
4070         {
4071           /* clear the arguments that are stored in drex */
4072           UINTS_CLEAR (i.types[0]);
4073           UINTS_CLEAR (i.types[3]);
4074           i.reg_operands -= 2;
4075
4076           /* Specify the modrm encoding and remember the register 
4077              including the high bit normally stored in the REX 
4078              byte.  */
4079           i.drex.modrm_reg = 2;
4080           i.drex.modrm_regmem = 1;
4081           i.drex.reg = (i.op[3].regs->reg_num
4082                         + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
4083         }
4084
4085       else
4086         as_bad (_("Incorrect operands for the '%s' instruction"), 
4087                 i.tm.name);
4088     }
4089
4090   /* SSE5 3 operand instructions that the result is a register, being 
4091      either operand can be a memory operand, using OC0 to note which 
4092      one is the memory.  */
4093   else if (i.tm.opcode_modifier.drex 
4094            && i.tm.opcode_modifier.drexv
4095            && i.operands == 3)
4096     {
4097       i.tm.extension_opcode = None;
4098
4099       /* Case 1: 3 operand insn, src1 = register.  */
4100       if (i.types[0].bitfield.regxmm != 0
4101           && i.types[1].bitfield.regxmm != 0
4102           && i.types[2].bitfield.regxmm != 0)
4103         {
4104           /* Clear the arguments that are stored in drex.  */
4105           UINTS_CLEAR (i.types[2]);
4106           i.reg_operands--;
4107
4108           /* Specify the modrm encoding and remember the register 
4109              including the high bit normally stored in the REX byte.  */
4110           i.tm.extension_opcode = DREX_XMEM_X1_X2;
4111           i.drex.modrm_reg = 1;
4112           i.drex.modrm_regmem = 0;
4113           i.drex.reg = (i.op[2].regs->reg_num
4114                         + ((i.op[2].regs->reg_flags & RegRex) ? 8 : 0));
4115         }
4116
4117       /* Case 2: 3 operand insn, src1 = memory.  */
4118       else if (operand_type_check (i.types[0], anymem) != 0
4119                && i.types[1].bitfield.regxmm != 0
4120                && i.types[2].bitfield.regxmm != 0)
4121         {
4122           /* Clear the arguments that are stored in drex.  */
4123           UINTS_CLEAR (i.types[2]);
4124           i.reg_operands--;
4125
4126           /* Specify the modrm encoding and remember the register 
4127              including the high bit normally stored in the REX 
4128              byte.  */
4129           i.tm.extension_opcode = DREX_XMEM_X1_X2;
4130           i.drex.modrm_reg = 1;
4131           i.drex.modrm_regmem = 0;
4132           i.drex.reg = (i.op[2].regs->reg_num
4133                         + ((i.op[2].regs->reg_flags & RegRex) ? 8 : 0));
4134         }
4135
4136       /* Case 3: 3 operand insn, src2 = memory.  */
4137       else if (i.types[0].bitfield.regxmm != 0
4138                && operand_type_check (i.types[1], anymem) != 0
4139                && i.types[2].bitfield.regxmm != 0)
4140         {
4141           /* Clear the arguments that are stored in drex.  */
4142           UINTS_CLEAR (i.types[2]);
4143           i.reg_operands--;
4144
4145           /* Specify the modrm encoding and remember the register 
4146              including the high bit normally stored in the REX byte.  */
4147           i.tm.extension_opcode = DREX_X1_XMEM_X2;
4148           i.drex.modrm_reg = 0;
4149           i.drex.modrm_regmem = 1;
4150           i.drex.reg = (i.op[2].regs->reg_num
4151                         + ((i.op[2].regs->reg_flags & RegRex) ? 8 : 0));
4152         }
4153
4154       else
4155         as_bad (_("Incorrect operands for the '%s' instruction"), 
4156                 i.tm.name);
4157     }
4158
4159   /* SSE5 4 operand instructions that are the comparison instructions 
4160      where the first operand is the immediate value of the comparison 
4161      to be done.  */
4162   else if (i.tm.opcode_modifier.drexc != 0 && i.operands == 4)
4163     {
4164       /* Case 1: 4 operand insn, src1 = reg/memory. */
4165       if (operand_type_check (i.types[0], imm) != 0
4166           && (i.types[1].bitfield.regxmm 
4167               || operand_type_check (i.types[1], anymem)) 
4168           && i.types[2].bitfield.regxmm != 0
4169           && i.types[3].bitfield.regxmm != 0)
4170         {
4171           /* clear the arguments that are stored in drex */
4172           UINTS_CLEAR (i.types[3]);
4173           i.reg_operands--;
4174
4175           /* Specify the modrm encoding and remember the register 
4176              including the high bit normally stored in the REX byte.  */
4177           i.drex.modrm_reg = 2;
4178           i.drex.modrm_regmem = 1;
4179           i.drex.reg = (i.op[3].regs->reg_num
4180                         + ((i.op[3].regs->reg_flags & RegRex) ? 8 : 0));
4181         }
4182
4183       /* Case 2: 3 operand insn with ImmExt that places the 
4184          opcode_extension as an immediate argument.  This is used for 
4185          all of the varients of comparison that supplies the appropriate
4186          value as part of the instruction.  */
4187       else if ((i.types[0].bitfield.regxmm
4188                 || operand_type_check (i.types[0], anymem)) 
4189                && i.types[1].bitfield.regxmm != 0
4190                && i.types[2].bitfield.regxmm != 0
4191                && operand_type_check (i.types[3], imm) != 0)
4192         {
4193           /* clear the arguments that are stored in drex */
4194           UINTS_CLEAR (i.types[2]);
4195           i.reg_operands--;
4196
4197           /* Specify the modrm encoding and remember the register 
4198              including the high bit normally stored in the REX byte.  */
4199           i.drex.modrm_reg = 1;
4200           i.drex.modrm_regmem = 0;
4201           i.drex.reg = (i.op[2].regs->reg_num
4202                         + ((i.op[2].regs->reg_flags & RegRex) ? 8 : 0));
4203         }
4204
4205       else
4206         as_bad (_("Incorrect operands for the '%s' instruction"), 
4207                 i.tm.name);
4208     }
4209
4210   else if (i.tm.opcode_modifier.drex 
4211            || i.tm.opcode_modifier.drexv 
4212            || i.tm.opcode_modifier.drexc)
4213     as_bad (_("Internal error for the '%s' instruction"), i.tm.name);
4214 }
4215
4216 static int
4217 process_operands (void)
4218 {
4219   /* Default segment register this instruction will use for memory
4220      accesses.  0 means unknown.  This is only for optimizing out
4221      unnecessary segment overrides.  */
4222   const seg_entry *default_seg = 0;
4223
4224   /* Handle all of the DREX munging that SSE5 needs.  */
4225   if (i.tm.opcode_modifier.drex 
4226       || i.tm.opcode_modifier.drexv 
4227       || i.tm.opcode_modifier.drexc)
4228     process_drex ();
4229
4230   if (i.tm.opcode_modifier.firstxmm0)
4231     {
4232       unsigned int j;
4233
4234       /* The first operand is implicit and must be xmm0.  */
4235       assert (i.reg_operands && UINTS_EQUAL (i.types[0], regxmm));
4236       if (i.op[0].regs->reg_num != 0)
4237         {
4238           if (intel_syntax)
4239             as_bad (_("the last operand of `%s' must be `%sxmm0'"),
4240                     i.tm.name, register_prefix);
4241           else
4242             as_bad (_("the first operand of `%s' must be `%sxmm0'"),
4243                     i.tm.name, register_prefix);
4244           return 0;
4245         }
4246
4247       for (j = 1; j < i.operands; j++)
4248         {
4249           i.op[j - 1] = i.op[j];
4250           i.types[j - 1] = i.types[j];
4251
4252           /* We need to adjust fields in i.tm since they are used by
4253              build_modrm_byte.  */
4254           i.tm.operand_types [j - 1] = i.tm.operand_types [j];
4255         }
4256
4257       i.operands--;
4258       i.reg_operands--;
4259       i.tm.operands--;
4260     }
4261   else if (i.tm.opcode_modifier.regkludge)
4262     {
4263       /* The imul $imm, %reg instruction is converted into
4264          imul $imm, %reg, %reg, and the clr %reg instruction
4265          is converted into xor %reg, %reg.  */
4266
4267       unsigned int first_reg_op;
4268
4269       if (operand_type_check (i.types[0], reg))
4270         first_reg_op = 0;
4271       else
4272         first_reg_op = 1;
4273       /* Pretend we saw the extra register operand.  */
4274       assert (i.reg_operands == 1
4275               && i.op[first_reg_op + 1].regs == 0);
4276       i.op[first_reg_op + 1].regs = i.op[first_reg_op].regs;
4277       i.types[first_reg_op + 1] = i.types[first_reg_op];
4278       i.operands++;
4279       i.reg_operands++;
4280     }
4281
4282   if (i.tm.opcode_modifier.shortform)
4283     {
4284       if (i.types[0].bitfield.sreg2
4285           || i.types[0].bitfield.sreg3)
4286         {
4287           if (i.tm.base_opcode == POP_SEG_SHORT
4288               && i.op[0].regs->reg_num == 1)
4289             {
4290               as_bad (_("you can't `pop %%cs'"));
4291               return 0;
4292             }
4293           i.tm.base_opcode |= (i.op[0].regs->reg_num << 3);
4294           if ((i.op[0].regs->reg_flags & RegRex) != 0)
4295             i.rex |= REX_B;
4296         }
4297       else
4298         {
4299           /* The register or float register operand is in operand 
4300              0 or 1.  */
4301           unsigned int op;
4302           
4303            if (i.types[0].bitfield.floatreg
4304                || operand_type_check (i.types[0], reg))
4305              op = 0;
4306            else
4307              op = 1;
4308           /* Register goes in low 3 bits of opcode.  */
4309           i.tm.base_opcode |= i.op[op].regs->reg_num;
4310           if ((i.op[op].regs->reg_flags & RegRex) != 0)
4311             i.rex |= REX_B;
4312           if (!quiet_warnings && i.tm.opcode_modifier.ugh)
4313             {
4314               /* Warn about some common errors, but press on regardless.
4315                  The first case can be generated by gcc (<= 2.8.1).  */
4316               if (i.operands == 2)
4317                 {
4318                   /* Reversed arguments on faddp, fsubp, etc.  */
4319                   as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
4320                            register_prefix, i.op[1].regs->reg_name,
4321                            register_prefix, i.op[0].regs->reg_name);
4322                 }
4323               else
4324                 {
4325                   /* Extraneous `l' suffix on fp insn.  */
4326                   as_warn (_("translating to `%s %s%s'"), i.tm.name,
4327                            register_prefix, i.op[0].regs->reg_name);
4328                 }
4329             }
4330         }
4331     }
4332   else if (i.tm.opcode_modifier.modrm)
4333     {
4334       /* The opcode is completed (modulo i.tm.extension_opcode which
4335          must be put into the modrm byte).  Now, we make the modrm and
4336          index base bytes based on all the info we've collected.  */
4337
4338       default_seg = build_modrm_byte ();
4339     }
4340   else if ((i.tm.base_opcode & ~0x3) == MOV_AX_DISP32)
4341     {
4342       default_seg = &ds;
4343     }
4344   else if (i.tm.opcode_modifier.isstring)
4345     {
4346       /* For the string instructions that allow a segment override
4347          on one of their operands, the default segment is ds.  */
4348       default_seg = &ds;
4349     }
4350
4351   if (i.tm.base_opcode == 0x8d /* lea */
4352       && i.seg[0]
4353       && !quiet_warnings)
4354     as_warn (_("segment override on `%s' is ineffectual"), i.tm.name);
4355
4356   /* If a segment was explicitly specified, and the specified segment
4357      is not the default, use an opcode prefix to select it.  If we
4358      never figured out what the default segment is, then default_seg
4359      will be zero at this point, and the specified segment prefix will
4360      always be used.  */
4361   if ((i.seg[0]) && (i.seg[0] != default_seg))
4362     {
4363       if (!add_prefix (i.seg[0]->seg_prefix))
4364         return 0;
4365     }
4366   return 1;
4367 }
4368
4369 static const seg_entry *
4370 build_modrm_byte (void)
4371 {
4372   const seg_entry *default_seg = 0;
4373
4374   /* SSE5 4 operand instructions are encoded in such a way that one of 
4375      the inputs must match the destination register.  Process_drex hides
4376      the 3rd argument in the drex field, so that by the time we get 
4377      here, it looks to GAS as if this is a 2 operand instruction.  */
4378   if ((i.tm.opcode_modifier.drex 
4379        || i.tm.opcode_modifier.drexv 
4380        || i.tm.opcode_modifier.drexc)
4381       && i.reg_operands == 2)
4382     {
4383       const reg_entry *reg = i.op[i.drex.modrm_reg].regs;
4384       const reg_entry *regmem = i.op[i.drex.modrm_regmem].regs;
4385
4386       i.rm.reg = reg->reg_num;
4387       i.rm.regmem = regmem->reg_num;
4388       i.rm.mode = 3;
4389       if ((reg->reg_flags & RegRex) != 0)
4390         i.rex |= REX_R;
4391       if ((regmem->reg_flags & RegRex) != 0)
4392         i.rex |= REX_B;
4393     }
4394
4395   /* i.reg_operands MUST be the number of real register operands;
4396      implicit registers do not count.  */
4397   else if (i.reg_operands == 2)
4398     {
4399       unsigned int source, dest;
4400
4401       switch (i.operands)
4402         {
4403         case 2:
4404           source = 0;
4405           break;
4406         case 3:
4407           /* When there are 3 operands, one of them may be immediate,
4408              which may be the first or the last operand.  Otherwise,
4409              the first operand must be shift count register (cl). */
4410           assert (i.imm_operands == 1
4411                   || (i.imm_operands == 0
4412                       && i.types[0].bitfield.shiftcount));
4413           if (operand_type_check (i.types[0], imm)
4414               || i.types[0].bitfield.shiftcount)
4415             source = 1;
4416           else
4417             source = 0;
4418           break;
4419         case 4:
4420           /* When there are 4 operands, the first two must be 8bit
4421              immediate operands. The source operand will be the 3rd
4422              one.  */
4423           assert (i.imm_operands == 2
4424                   && i.types[0].bitfield.imm8
4425                   && i.types[1].bitfield.imm8);
4426           source = 2;
4427           break;
4428         default:
4429           abort ();
4430         }
4431
4432       dest = source + 1;
4433
4434       i.rm.mode = 3;
4435       /* One of the register operands will be encoded in the i.tm.reg
4436          field, the other in the combined i.tm.mode and i.tm.regmem
4437          fields.  If no form of this instruction supports a memory
4438          destination operand, then we assume the source operand may
4439          sometimes be a memory operand and so we need to store the
4440          destination in the i.rm.reg field.  */
4441       if (!i.tm.operand_types[dest].bitfield.regmem
4442           && operand_type_check (i.tm.operand_types[dest], anymem) == 0)
4443         {
4444           i.rm.reg = i.op[dest].regs->reg_num;
4445           i.rm.regmem = i.op[source].regs->reg_num;
4446           if ((i.op[dest].regs->reg_flags & RegRex) != 0)
4447             i.rex |= REX_R;
4448           if ((i.op[source].regs->reg_flags & RegRex) != 0)
4449             i.rex |= REX_B;
4450         }
4451       else
4452         {
4453           i.rm.reg = i.op[source].regs->reg_num;
4454           i.rm.regmem = i.op[dest].regs->reg_num;
4455           if ((i.op[dest].regs->reg_flags & RegRex) != 0)
4456             i.rex |= REX_B;
4457           if ((i.op[source].regs->reg_flags & RegRex) != 0)
4458             i.rex |= REX_R;
4459         }
4460       if (flag_code != CODE_64BIT && (i.rex & (REX_R | REX_B)))
4461         {
4462           if (!i.types[0].bitfield.control
4463               && !i.types[1].bitfield.control)
4464             abort ();
4465           i.rex &= ~(REX_R | REX_B);
4466           add_prefix (LOCK_PREFIX_OPCODE);
4467         }
4468     }
4469   else
4470     {                   /* If it's not 2 reg operands...  */
4471       if (i.mem_operands)
4472         {
4473           unsigned int fake_zero_displacement = 0;
4474           unsigned int op;
4475
4476           /* This has been precalculated for SSE5 instructions 
4477              that have a DREX field earlier in process_drex.  */
4478           if (i.tm.opcode_modifier.drex 
4479               || i.tm.opcode_modifier.drexv 
4480               || i.tm.opcode_modifier.drexc)
4481             op = i.drex.modrm_regmem;
4482           else
4483             {
4484               for (op = 0; op < i.operands; op++)
4485                 if (operand_type_check (i.types[op], anymem))
4486                   break;
4487               assert (op < i.operands);
4488             }
4489
4490           default_seg = &ds;
4491
4492           if (i.base_reg == 0)
4493             {
4494               i.rm.mode = 0;
4495               if (!i.disp_operands)
4496                 fake_zero_displacement = 1;
4497               if (i.index_reg == 0)
4498                 {
4499                   /* Operand is just <disp>  */
4500                   if (flag_code == CODE_64BIT)
4501                     {
4502                       /* 64bit mode overwrites the 32bit absolute
4503                          addressing by RIP relative addressing and
4504                          absolute addressing is encoded by one of the
4505                          redundant SIB forms.  */
4506                       i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
4507                       i.sib.base = NO_BASE_REGISTER;
4508                       i.sib.index = NO_INDEX_REGISTER;
4509                       i.types[op] = ((i.prefix[ADDR_PREFIX] == 0)
4510                                      ? disp32s : disp32);
4511                     }
4512                   else if ((flag_code == CODE_16BIT)
4513                            ^ (i.prefix[ADDR_PREFIX] != 0))
4514                     {
4515                       i.rm.regmem = NO_BASE_REGISTER_16;
4516                       i.types[op] = disp16;
4517                     }
4518                   else
4519                     {
4520                       i.rm.regmem = NO_BASE_REGISTER;
4521                       i.types[op] = disp32;
4522                     }
4523                 }
4524               else /* !i.base_reg && i.index_reg  */
4525                 {
4526                   if (i.index_reg->reg_num == RegEiz
4527                       || i.index_reg->reg_num == RegRiz)
4528                     i.sib.index = NO_INDEX_REGISTER;
4529                   else
4530                     i.sib.index = i.index_reg->reg_num;
4531                   i.sib.base = NO_BASE_REGISTER;
4532                   i.sib.scale = i.log2_scale_factor;
4533                   i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
4534                   i.types[op].bitfield.disp8 = 0;
4535                   i.types[op].bitfield.disp16 = 0;
4536                   i.types[op].bitfield.disp64 = 0;
4537                   if (flag_code != CODE_64BIT)
4538                     {
4539                       /* Must be 32 bit */
4540                       i.types[op].bitfield.disp32 = 1;
4541                       i.types[op].bitfield.disp32s = 0;
4542                     }
4543                   else
4544                     {
4545                       i.types[op].bitfield.disp32 = 0;
4546                       i.types[op].bitfield.disp32s = 1;
4547                     }
4548                   if ((i.index_reg->reg_flags & RegRex) != 0)
4549                     i.rex |= REX_X;
4550                 }
4551             }
4552           /* RIP addressing for 64bit mode.  */
4553           else if (i.base_reg->reg_num == RegRip ||
4554                    i.base_reg->reg_num == RegEip)
4555             {
4556               i.rm.regmem = NO_BASE_REGISTER;
4557               i.types[op].bitfield.disp8 = 0;
4558               i.types[op].bitfield.disp16 = 0;
4559               i.types[op].bitfield.disp32 = 0;
4560               i.types[op].bitfield.disp32s = 1;
4561               i.types[op].bitfield.disp64 = 0;
4562               i.flags[op] |= Operand_PCrel;
4563               if (! i.disp_operands)
4564                 fake_zero_displacement = 1;
4565             }
4566           else if (i.base_reg->reg_type.bitfield.reg16)
4567             {
4568               switch (i.base_reg->reg_num)
4569                 {
4570                 case 3: /* (%bx)  */
4571                   if (i.index_reg == 0)
4572                     i.rm.regmem = 7;
4573                   else /* (%bx,%si) -> 0, or (%bx,%di) -> 1  */
4574                     i.rm.regmem = i.index_reg->reg_num - 6;
4575                   break;
4576                 case 5: /* (%bp)  */
4577                   default_seg = &ss;
4578                   if (i.index_reg == 0)
4579                     {
4580                       i.rm.regmem = 6;
4581                       if (operand_type_check (i.types[op], disp) == 0)
4582                         {
4583                           /* fake (%bp) into 0(%bp)  */
4584                           i.types[op].bitfield.disp8 = 1;
4585                           fake_zero_displacement = 1;
4586                         }
4587                     }
4588                   else /* (%bp,%si) -> 2, or (%bp,%di) -> 3  */
4589                     i.rm.regmem = i.index_reg->reg_num - 6 + 2;
4590                   break;
4591                 default: /* (%si) -> 4 or (%di) -> 5  */
4592                   i.rm.regmem = i.base_reg->reg_num - 6 + 4;
4593                 }
4594               i.rm.mode = mode_from_disp_size (i.types[op]);
4595             }
4596           else /* i.base_reg and 32/64 bit mode  */
4597             {
4598               if (flag_code == CODE_64BIT
4599                   && operand_type_check (i.types[op], disp))
4600                 {
4601                   i386_operand_type temp;
4602                   UINTS_CLEAR (temp);
4603                   temp.bitfield.disp8 = i.types[op].bitfield.disp8;
4604                   i.types[op] = temp;
4605                   if (i.prefix[ADDR_PREFIX] == 0)
4606                     i.types[op].bitfield.disp32s = 1;
4607                   else
4608                     i.types[op].bitfield.disp32 = 1;
4609                 }
4610
4611               i.rm.regmem = i.base_reg->reg_num;
4612               if ((i.base_reg->reg_flags & RegRex) != 0)
4613                 i.rex |= REX_B;
4614               i.sib.base = i.base_reg->reg_num;
4615               /* x86-64 ignores REX prefix bit here to avoid decoder
4616                  complications.  */
4617               if ((i.base_reg->reg_num & 7) == EBP_REG_NUM)
4618                 {
4619                   default_seg = &ss;
4620                   if (i.disp_operands == 0)
4621                     {
4622                       fake_zero_displacement = 1;
4623                       i.types[op].bitfield.disp8 = 1;
4624                     }
4625                 }
4626               else if (i.base_reg->reg_num == ESP_REG_NUM)
4627                 {
4628                   default_seg = &ss;
4629                 }
4630               i.sib.scale = i.log2_scale_factor;
4631               if (i.index_reg == 0)
4632                 {
4633                   /* <disp>(%esp) becomes two byte modrm with no index
4634                      register.  We've already stored the code for esp
4635                      in i.rm.regmem ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.
4636                      Any base register besides %esp will not use the
4637                      extra modrm byte.  */
4638                   i.sib.index = NO_INDEX_REGISTER;
4639                 }
4640               else
4641                 {
4642                   if (i.index_reg->reg_num == RegEiz
4643                       || i.index_reg->reg_num == RegRiz)
4644                     i.sib.index = NO_INDEX_REGISTER;
4645                   else
4646                     i.sib.index = i.index_reg->reg_num;
4647                   i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
4648                   if ((i.index_reg->reg_flags & RegRex) != 0)
4649                     i.rex |= REX_X;
4650                 }
4651
4652               if (i.disp_operands
4653                   && (i.reloc[op] == BFD_RELOC_386_TLS_DESC_CALL
4654                       || i.reloc[op] == BFD_RELOC_X86_64_TLSDESC_CALL))
4655                 i.rm.mode = 0;
4656               else
4657                 i.rm.mode = mode_from_disp_size (i.types[op]);
4658             }
4659
4660           if (fake_zero_displacement)
4661             {
4662               /* Fakes a zero displacement assuming that i.types[op]
4663                  holds the correct displacement size.  */
4664               expressionS *exp;
4665
4666               assert (i.op[op].disps == 0);
4667               exp = &disp_expressions[i.disp_operands++];
4668               i.op[op].disps = exp;
4669               exp->X_op = O_constant;
4670               exp->X_add_number = 0;
4671               exp->X_add_symbol = (symbolS *) 0;
4672               exp->X_op_symbol = (symbolS *) 0;
4673             }
4674         }
4675
4676       /* Fill in i.rm.reg or i.rm.regmem field with register operand
4677          (if any) based on i.tm.extension_opcode.  Again, we must be
4678          careful to make sure that segment/control/debug/test/MMX
4679          registers are coded into the i.rm.reg field.  */
4680       if (i.reg_operands)
4681         {
4682           unsigned int op;
4683
4684           /* This has been precalculated for SSE5 instructions 
4685              that have a DREX field earlier in process_drex.  */
4686           if (i.tm.opcode_modifier.drex 
4687               || i.tm.opcode_modifier.drexv 
4688               || i.tm.opcode_modifier.drexc)
4689             {
4690               op = i.drex.modrm_reg;
4691               i.rm.reg = i.op[op].regs->reg_num;
4692               if ((i.op[op].regs->reg_flags & RegRex) != 0)
4693                 i.rex |= REX_R;
4694             }
4695           else
4696             {
4697               for (op = 0; op < i.operands; op++)
4698                 if (i.types[op].bitfield.reg8
4699                     || i.types[op].bitfield.reg16
4700                     || i.types[op].bitfield.reg32
4701                     || i.types[op].bitfield.reg64
4702                     || i.types[op].bitfield.regmmx
4703                     || i.types[op].bitfield.regxmm
4704                     || i.types[op].bitfield.sreg2
4705                     || i.types[op].bitfield.sreg3
4706                     || i.types[op].bitfield.control
4707                     || i.types[op].bitfield.debug
4708                     || i.types[op].bitfield.test)
4709                   break;
4710
4711               assert (op < i.operands);
4712
4713               /* If there is an extension opcode to put here, the 
4714                  register number must be put into the regmem field.  */
4715               if (i.tm.extension_opcode != None)
4716                 {
4717                   i.rm.regmem = i.op[op].regs->reg_num;
4718                   if ((i.op[op].regs->reg_flags & RegRex) != 0)
4719                     i.rex |= REX_B;
4720                 }
4721               else
4722                 {
4723                   i.rm.reg = i.op[op].regs->reg_num;
4724                   if ((i.op[op].regs->reg_flags & RegRex) != 0)
4725                     i.rex |= REX_R;
4726                 }
4727             }
4728
4729           /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 we
4730              must set it to 3 to indicate this is a register operand
4731              in the regmem field.  */
4732           if (!i.mem_operands)
4733             i.rm.mode = 3;
4734         }
4735
4736       /* Fill in i.rm.reg field with extension opcode (if any).  */
4737       if (i.tm.extension_opcode != None
4738           && !(i.tm.opcode_modifier.drex 
4739               || i.tm.opcode_modifier.drexv 
4740               || i.tm.opcode_modifier.drexc))
4741         i.rm.reg = i.tm.extension_opcode;
4742     }
4743   return default_seg;
4744 }
4745
4746 static void
4747 output_branch (void)
4748 {
4749   char *p;
4750   int code16;
4751   int prefix;
4752   relax_substateT subtype;
4753   symbolS *sym;
4754   offsetT off;
4755
4756   code16 = 0;
4757   if (flag_code == CODE_16BIT)
4758     code16 = CODE16;
4759
4760   prefix = 0;
4761   if (i.prefix[DATA_PREFIX] != 0)
4762     {
4763       prefix = 1;
4764       i.prefixes -= 1;
4765       code16 ^= CODE16;
4766     }
4767   /* Pentium4 branch hints.  */
4768   if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
4769       || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
4770     {
4771       prefix++;
4772       i.prefixes--;
4773     }
4774   if (i.prefix[REX_PREFIX] != 0)
4775     {
4776       prefix++;
4777       i.prefixes--;
4778     }
4779
4780   if (i.prefixes != 0 && !intel_syntax)
4781     as_warn (_("skipping prefixes on this instruction"));
4782
4783   /* It's always a symbol;  End frag & setup for relax.
4784      Make sure there is enough room in this frag for the largest
4785      instruction we may generate in md_convert_frag.  This is 2
4786      bytes for the opcode and room for the prefix and largest
4787      displacement.  */
4788   frag_grow (prefix + 2 + 4);
4789   /* Prefix and 1 opcode byte go in fr_fix.  */
4790   p = frag_more (prefix + 1);
4791   if (i.prefix[DATA_PREFIX] != 0)
4792     *p++ = DATA_PREFIX_OPCODE;
4793   if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE
4794       || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE)
4795     *p++ = i.prefix[SEG_PREFIX];
4796   if (i.prefix[REX_PREFIX] != 0)
4797     *p++ = i.prefix[REX_PREFIX];
4798   *p = i.tm.base_opcode;
4799
4800   if ((unsigned char) *p == JUMP_PC_RELATIVE)
4801     subtype = ENCODE_RELAX_STATE (UNCOND_JUMP, SMALL);
4802   else if (cpu_arch_flags.bitfield.cpui386)
4803     subtype = ENCODE_RELAX_STATE (COND_JUMP, SMALL);
4804   else
4805     subtype = ENCODE_RELAX_STATE (COND_JUMP86, SMALL);
4806   subtype |= code16;
4807
4808   sym = i.op[0].disps->X_add_symbol;
4809   off = i.op[0].disps->X_add_number;
4810
4811   if (i.op[0].disps->X_op != O_constant
4812       && i.op[0].disps->X_op != O_symbol)
4813     {
4814       /* Handle complex expressions.  */
4815       sym = make_expr_symbol (i.op[0].disps);
4816       off = 0;
4817     }
4818
4819   /* 1 possible extra opcode + 4 byte displacement go in var part.
4820      Pass reloc in fr_var.  */
4821   frag_var (rs_machine_dependent, 5, i.reloc[0], subtype, sym, off, p);
4822 }
4823
4824 static void
4825 output_jump (void)
4826 {
4827   char *p;
4828   int size;
4829   fixS *fixP;
4830
4831   if (i.tm.opcode_modifier.jumpbyte)
4832     {
4833       /* This is a loop or jecxz type instruction.  */
4834       size = 1;
4835       if (i.prefix[ADDR_PREFIX] != 0)
4836         {
4837           FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
4838           i.prefixes -= 1;
4839         }
4840       /* Pentium4 branch hints.  */
4841       if (i.prefix[SEG_PREFIX] == CS_PREFIX_OPCODE /* not taken */
4842           || i.prefix[SEG_PREFIX] == DS_PREFIX_OPCODE /* taken */)
4843         {
4844           FRAG_APPEND_1_CHAR (i.prefix[SEG_PREFIX]);
4845           i.prefixes--;
4846         }
4847     }
4848   else
4849     {
4850       int code16;
4851
4852       code16 = 0;
4853       if (flag_code == CODE_16BIT)
4854         code16 = CODE16;
4855
4856       if (i.prefix[DATA_PREFIX] != 0)
4857         {
4858           FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
4859           i.prefixes -= 1;
4860           code16 ^= CODE16;
4861         }
4862
4863       size = 4;
4864       if (code16)
4865         size = 2;
4866     }
4867
4868   if (i.prefix[REX_PREFIX] != 0)
4869     {
4870       FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
4871       i.prefixes -= 1;
4872     }
4873
4874   if (i.prefixes != 0 && !intel_syntax)
4875     as_warn (_("skipping prefixes on this instruction"));
4876
4877   p = frag_more (1 + size);
4878   *p++ = i.tm.base_opcode;
4879
4880   fixP = fix_new_exp (frag_now, p - frag_now->fr_literal, size,
4881                       i.op[0].disps, 1, reloc (size, 1, 1, i.reloc[0]));
4882
4883   /* All jumps handled here are signed, but don't use a signed limit
4884      check for 32 and 16 bit jumps as we want to allow wrap around at
4885      4G and 64k respectively.  */
4886   if (size == 1)
4887     fixP->fx_signed = 1;
4888 }
4889
4890 static void
4891 output_interseg_jump (void)
4892 {
4893   char *p;
4894   int size;
4895   int prefix;
4896   int code16;
4897
4898   code16 = 0;
4899   if (flag_code == CODE_16BIT)
4900     code16 = CODE16;
4901
4902   prefix = 0;
4903   if (i.prefix[DATA_PREFIX] != 0)
4904     {
4905       prefix = 1;
4906       i.prefixes -= 1;
4907       code16 ^= CODE16;
4908     }
4909   if (i.prefix[REX_PREFIX] != 0)
4910     {
4911       prefix++;
4912       i.prefixes -= 1;
4913     }
4914
4915   size = 4;
4916   if (code16)
4917     size = 2;
4918
4919   if (i.prefixes != 0 && !intel_syntax)
4920     as_warn (_("skipping prefixes on this instruction"));
4921
4922   /* 1 opcode; 2 segment; offset  */
4923   p = frag_more (prefix + 1 + 2 + size);
4924
4925   if (i.prefix[DATA_PREFIX] != 0)
4926     *p++ = DATA_PREFIX_OPCODE;
4927
4928   if (i.prefix[REX_PREFIX] != 0)
4929     *p++ = i.prefix[REX_PREFIX];
4930
4931   *p++ = i.tm.base_opcode;
4932   if (i.op[1].imms->X_op == O_constant)
4933     {
4934       offsetT n = i.op[1].imms->X_add_number;
4935
4936       if (size == 2
4937           && !fits_in_unsigned_word (n)
4938           && !fits_in_signed_word (n))
4939         {
4940           as_bad (_("16-bit jump out of range"));
4941           return;
4942         }
4943       md_number_to_chars (p, n, size);
4944     }
4945   else
4946     fix_new_exp (frag_now, p - frag_now->fr_literal, size,
4947                  i.op[1].imms, 0, reloc (size, 0, 0, i.reloc[1]));
4948   if (i.op[0].imms->X_op != O_constant)
4949     as_bad (_("can't handle non absolute segment in `%s'"),
4950             i.tm.name);
4951   md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2);
4952 }
4953
4954 static void
4955 output_insn (void)
4956 {
4957   fragS *insn_start_frag;
4958   offsetT insn_start_off;
4959
4960   /* Tie dwarf2 debug info to the address at the start of the insn.
4961      We can't do this after the insn has been output as the current
4962      frag may have been closed off.  eg. by frag_var.  */
4963   dwarf2_emit_insn (0);
4964
4965   insn_start_frag = frag_now;
4966   insn_start_off = frag_now_fix ();
4967
4968   /* Output jumps.  */
4969   if (i.tm.opcode_modifier.jump)
4970     output_branch ();
4971   else if (i.tm.opcode_modifier.jumpbyte
4972            || i.tm.opcode_modifier.jumpdword)
4973     output_jump ();
4974   else if (i.tm.opcode_modifier.jumpintersegment)
4975     output_interseg_jump ();
4976   else
4977     {
4978       /* Output normal instructions here.  */
4979       char *p;
4980       unsigned char *q;
4981       unsigned int j;
4982       unsigned int prefix;
4983
4984       switch (i.tm.opcode_length)
4985         {
4986         case 3:
4987           if (i.tm.base_opcode & 0xff000000)
4988             {
4989               prefix = (i.tm.base_opcode >> 24) & 0xff;
4990               goto check_prefix;
4991             }
4992           break;
4993         case 2:
4994           if ((i.tm.base_opcode & 0xff0000) != 0)
4995             {
4996               prefix = (i.tm.base_opcode >> 16) & 0xff;
4997               if (i.tm.cpu_flags.bitfield.cpupadlock)
4998                 {
4999 check_prefix:
5000                   if (prefix != REPE_PREFIX_OPCODE
5001                       || i.prefix[LOCKREP_PREFIX] != REPE_PREFIX_OPCODE)
5002                     add_prefix (prefix);
5003                 }
5004               else
5005                 add_prefix (prefix);
5006             }
5007           break;
5008         case 1:
5009           break;
5010         default:
5011           abort ();
5012         }
5013
5014       /* The prefix bytes.  */
5015       for (j = ARRAY_SIZE (i.prefix), q = i.prefix; j > 0; j--, q++)
5016         if (*q)
5017           FRAG_APPEND_1_CHAR (*q);
5018
5019       /* Now the opcode; be careful about word order here!  */
5020       if (i.tm.opcode_length == 1)
5021         {
5022           FRAG_APPEND_1_CHAR (i.tm.base_opcode);
5023         }
5024       else
5025         {
5026           switch (i.tm.opcode_length)
5027             {
5028             case 3:
5029               p = frag_more (3);
5030               *p++ = (i.tm.base_opcode >> 16) & 0xff;
5031               break;
5032             case 2:
5033               p = frag_more (2);
5034               break;
5035             default:
5036               abort ();
5037               break;
5038             }
5039
5040           /* Put out high byte first: can't use md_number_to_chars!  */
5041           *p++ = (i.tm.base_opcode >> 8) & 0xff;
5042           *p = i.tm.base_opcode & 0xff;
5043
5044           /* On SSE5, encode the OC1 bit in the DREX field if this 
5045              encoding has multiple formats.  */
5046           if (i.tm.opcode_modifier.drex 
5047               && i.tm.opcode_modifier.drexv 
5048               && DREX_OC1 (i.tm.extension_opcode))
5049             *p |= DREX_OC1_MASK;
5050         }
5051
5052       /* Now the modrm byte and sib byte (if present).  */
5053       if (i.tm.opcode_modifier.modrm)
5054         {
5055           FRAG_APPEND_1_CHAR ((i.rm.regmem << 0
5056                                | i.rm.reg << 3
5057                                | i.rm.mode << 6));
5058           /* If i.rm.regmem == ESP (4)
5059              && i.rm.mode != (Register mode)
5060              && not 16 bit
5061              ==> need second modrm byte.  */
5062           if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
5063               && i.rm.mode != 3
5064               && !(i.base_reg && i.base_reg->reg_type.bitfield.reg16))
5065             FRAG_APPEND_1_CHAR ((i.sib.base << 0
5066                                  | i.sib.index << 3
5067                                  | i.sib.scale << 6));
5068         }
5069
5070       /* Write the DREX byte if needed.  */
5071       if (i.tm.opcode_modifier.drex || i.tm.opcode_modifier.drexc)
5072         {
5073           p = frag_more (1);
5074           *p = (((i.drex.reg & 0xf) << 4) | (i.drex.rex & 0x7));
5075
5076           /* Encode the OC0 bit if this encoding has multiple 
5077              formats.  */
5078           if ((i.tm.opcode_modifier.drex 
5079                || i.tm.opcode_modifier.drexv) 
5080               && DREX_OC0 (i.tm.extension_opcode))
5081             *p |= DREX_OC0_MASK;
5082         }
5083
5084       if (i.disp_operands)
5085         output_disp (insn_start_frag, insn_start_off);
5086
5087       if (i.imm_operands)
5088         output_imm (insn_start_frag, insn_start_off);
5089     }
5090
5091 #ifdef DEBUG386
5092   if (flag_debug)
5093     {
5094       pi ("" /*line*/, &i);
5095     }
5096 #endif /* DEBUG386  */
5097 }
5098
5099 /* Return the size of the displacement operand N.  */
5100
5101 static int
5102 disp_size (unsigned int n)
5103 {
5104   int size = 4;
5105   if (i.types[n].bitfield.disp64)
5106     size = 8;
5107   else if (i.types[n].bitfield.disp8)
5108     size = 1;
5109   else if (i.types[n].bitfield.disp16)
5110     size = 2;
5111   return size;
5112 }
5113
5114 /* Return the size of the immediate operand N.  */
5115
5116 static int
5117 imm_size (unsigned int n)
5118 {
5119   int size = 4;
5120   if (i.types[n].bitfield.imm64)
5121     size = 8;
5122   else if (i.types[n].bitfield.imm8 || i.types[n].bitfield.imm8s)
5123     size = 1;
5124   else if (i.types[n].bitfield.imm16)
5125     size = 2;
5126   return size;
5127 }
5128
5129 static void
5130 output_disp (fragS *insn_start_frag, offsetT insn_start_off)
5131 {
5132   char *p;
5133   unsigned int n;
5134
5135   for (n = 0; n < i.operands; n++)
5136     {
5137       if (operand_type_check (i.types[n], disp))
5138         {
5139           if (i.op[n].disps->X_op == O_constant)
5140             {
5141               int size = disp_size (n);
5142               offsetT val;
5143
5144               val = offset_in_range (i.op[n].disps->X_add_number,
5145                                      size);
5146               p = frag_more (size);
5147               md_number_to_chars (p, val, size);
5148             }
5149           else
5150             {
5151               enum bfd_reloc_code_real reloc_type;
5152               int size = disp_size (n);
5153               int sign = i.types[n].bitfield.disp32s;
5154               int pcrel = (i.flags[n] & Operand_PCrel) != 0;
5155
5156               /* We can't have 8 bit displacement here.  */
5157               assert (!i.types[n].bitfield.disp8);
5158
5159               /* The PC relative address is computed relative
5160                  to the instruction boundary, so in case immediate
5161                  fields follows, we need to adjust the value.  */
5162               if (pcrel && i.imm_operands)
5163                 {
5164                   unsigned int n1;
5165                   int sz = 0;
5166
5167                   for (n1 = 0; n1 < i.operands; n1++)
5168                     if (operand_type_check (i.types[n1], imm))
5169                       {
5170                         /* Only one immediate is allowed for PC
5171                            relative address.  */
5172                         assert (sz == 0);
5173                         sz = imm_size (n1);
5174                         i.op[n].disps->X_add_number -= sz;
5175                       }
5176                   /* We should find the immediate.  */
5177                   assert (sz != 0);
5178                 }
5179
5180               p = frag_more (size);
5181               reloc_type = reloc (size, pcrel, sign, i.reloc[n]);
5182               if (GOT_symbol
5183                   && GOT_symbol == i.op[n].disps->X_add_symbol
5184                   && (((reloc_type == BFD_RELOC_32
5185                         || reloc_type == BFD_RELOC_X86_64_32S
5186                         || (reloc_type == BFD_RELOC_64
5187                             && object_64bit))
5188                        && (i.op[n].disps->X_op == O_symbol
5189                            || (i.op[n].disps->X_op == O_add
5190                                && ((symbol_get_value_expression
5191                                     (i.op[n].disps->X_op_symbol)->X_op)
5192                                    == O_subtract))))
5193                       || reloc_type == BFD_RELOC_32_PCREL))
5194                 {
5195                   offsetT add;
5196
5197                   if (insn_start_frag == frag_now)
5198                     add = (p - frag_now->fr_literal) - insn_start_off;
5199                   else
5200                     {
5201                       fragS *fr;
5202
5203                       add = insn_start_frag->fr_fix - insn_start_off;
5204                       for (fr = insn_start_frag->fr_next;
5205                            fr && fr != frag_now; fr = fr->fr_next)
5206                         add += fr->fr_fix;
5207                       add += p - frag_now->fr_literal;
5208                     }
5209
5210                   if (!object_64bit)
5211                     {
5212                       reloc_type = BFD_RELOC_386_GOTPC;
5213                       i.op[n].imms->X_add_number += add;
5214                     }
5215                   else if (reloc_type == BFD_RELOC_64)
5216                     reloc_type = BFD_RELOC_X86_64_GOTPC64;
5217                   else
5218                     /* Don't do the adjustment for x86-64, as there
5219                        the pcrel addressing is relative to the _next_
5220                        insn, and that is taken care of in other code.  */
5221                     reloc_type = BFD_RELOC_X86_64_GOTPC32;
5222                 }
5223               fix_new_exp (frag_now, p - frag_now->fr_literal, size,
5224                            i.op[n].disps, pcrel, reloc_type);
5225             }
5226         }
5227     }
5228 }
5229
5230 static void
5231 output_imm (fragS *insn_start_frag, offsetT insn_start_off)
5232 {
5233   char *p;
5234   unsigned int n;
5235
5236   for (n = 0; n < i.operands; n++)
5237     {
5238       if (operand_type_check (i.types[n], imm))
5239         {
5240           if (i.op[n].imms->X_op == O_constant)
5241             {
5242               int size = imm_size (n);
5243               offsetT val;
5244
5245               val = offset_in_range (i.op[n].imms->X_add_number,
5246                                      size);
5247               p = frag_more (size);
5248               md_number_to_chars (p, val, size);
5249             }
5250           else
5251             {
5252               /* Not absolute_section.
5253                  Need a 32-bit fixup (don't support 8bit
5254                  non-absolute imms).  Try to support other
5255                  sizes ...  */
5256               enum bfd_reloc_code_real reloc_type;
5257               int size = imm_size (n);
5258               int sign;
5259
5260               if (i.types[n].bitfield.imm32s
5261                   && (i.suffix == QWORD_MNEM_SUFFIX
5262                       || (!i.suffix && i.tm.opcode_modifier.no_lsuf)))
5263                 sign = 1;
5264               else
5265                 sign = 0;
5266
5267               p = frag_more (size);
5268               reloc_type = reloc (size, 0, sign, i.reloc[n]);
5269
5270               /*   This is tough to explain.  We end up with this one if we
5271                * have operands that look like
5272                * "_GLOBAL_OFFSET_TABLE_+[.-.L284]".  The goal here is to
5273                * obtain the absolute address of the GOT, and it is strongly
5274                * preferable from a performance point of view to avoid using
5275                * a runtime relocation for this.  The actual sequence of
5276                * instructions often look something like:
5277                *
5278                *        call    .L66
5279                * .L66:
5280                *        popl    %ebx
5281                *        addl    $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
5282                *
5283                *   The call and pop essentially return the absolute address
5284                * of the label .L66 and store it in %ebx.  The linker itself
5285                * will ultimately change the first operand of the addl so
5286                * that %ebx points to the GOT, but to keep things simple, the
5287                * .o file must have this operand set so that it generates not
5288                * the absolute address of .L66, but the absolute address of
5289                * itself.  This allows the linker itself simply treat a GOTPC
5290                * relocation as asking for a pcrel offset to the GOT to be
5291                * added in, and the addend of the relocation is stored in the
5292                * operand field for the instruction itself.
5293                *
5294                *   Our job here is to fix the operand so that it would add
5295                * the correct offset so that %ebx would point to itself.  The
5296                * thing that is tricky is that .-.L66 will point to the
5297                * beginning of the instruction, so we need to further modify
5298                * the operand so that it will point to itself.  There are
5299                * other cases where you have something like:
5300                *
5301                *        .long   $_GLOBAL_OFFSET_TABLE_+[.-.L66]
5302                *
5303                * and here no correction would be required.  Internally in
5304                * the assembler we treat operands of this form as not being
5305                * pcrel since the '.' is explicitly mentioned, and I wonder
5306                * whether it would simplify matters to do it this way.  Who
5307                * knows.  In earlier versions of the PIC patches, the
5308                * pcrel_adjust field was used to store the correction, but
5309                * since the expression is not pcrel, I felt it would be
5310                * confusing to do it this way.  */
5311
5312               if ((reloc_type == BFD_RELOC_32
5313                    || reloc_type == BFD_RELOC_X86_64_32S
5314                    || reloc_type == BFD_RELOC_64)
5315                   && GOT_symbol
5316                   && GOT_symbol == i.op[n].imms->X_add_symbol
5317                   && (i.op[n].imms->X_op == O_symbol
5318                       || (i.op[n].imms->X_op == O_add
5319                           && ((symbol_get_value_expression
5320                                (i.op[n].imms->X_op_symbol)->X_op)
5321                               == O_subtract))))
5322                 {
5323                   offsetT add;
5324
5325                   if (insn_start_frag == frag_now)
5326                     add = (p - frag_now->fr_literal) - insn_start_off;
5327                   else
5328                     {
5329                       fragS *fr;
5330
5331                       add = insn_start_frag->fr_fix - insn_start_off;
5332                       for (fr = insn_start_frag->fr_next;
5333                            fr && fr != frag_now; fr = fr->fr_next)
5334                         add += fr->fr_fix;
5335                       add += p - frag_now->fr_literal;
5336                     }
5337
5338                   if (!object_64bit)
5339                     reloc_type = BFD_RELOC_386_GOTPC;
5340                   else if (size == 4)
5341                     reloc_type = BFD_RELOC_X86_64_GOTPC32;
5342                   else if (size == 8)
5343                     reloc_type = BFD_RELOC_X86_64_GOTPC64;
5344                   i.op[n].imms->X_add_number += add;
5345                 }
5346               fix_new_exp (frag_now, p - frag_now->fr_literal, size,
5347                            i.op[n].imms, 0, reloc_type);
5348             }
5349         }
5350     }
5351 }
5352 \f
5353 /* x86_cons_fix_new is called via the expression parsing code when a
5354    reloc is needed.  We use this hook to get the correct .got reloc.  */
5355 static enum bfd_reloc_code_real got_reloc = NO_RELOC;
5356 static int cons_sign = -1;
5357
5358 void
5359 x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
5360                   expressionS *exp)
5361 {
5362   enum bfd_reloc_code_real r = reloc (len, 0, cons_sign, got_reloc);
5363
5364   got_reloc = NO_RELOC;
5365
5366 #ifdef TE_PE
5367   if (exp->X_op == O_secrel)
5368     {
5369       exp->X_op = O_symbol;
5370       r = BFD_RELOC_32_SECREL;
5371     }
5372 #endif
5373
5374   fix_new_exp (frag, off, len, exp, 0, r);
5375 }
5376
5377 #if (!defined (OBJ_ELF) && !defined (OBJ_MAYBE_ELF)) || defined (LEX_AT)
5378 # define lex_got(reloc, adjust, types) NULL
5379 #else
5380 /* Parse operands of the form
5381    <symbol>@GOTOFF+<nnn>
5382    and similar .plt or .got references.
5383
5384    If we find one, set up the correct relocation in RELOC and copy the
5385    input string, minus the `@GOTOFF' into a malloc'd buffer for
5386    parsing by the calling routine.  Return this buffer, and if ADJUST
5387    is non-null set it to the length of the string we removed from the
5388    input line.  Otherwise return NULL.  */
5389 static char *
5390 lex_got (enum bfd_reloc_code_real *reloc,
5391          int *adjust,
5392          i386_operand_type *types)
5393 {
5394   /* Some of the relocations depend on the size of what field is to
5395      be relocated.  But in our callers i386_immediate and i386_displacement
5396      we don't yet know the operand size (this will be set by insn
5397      matching).  Hence we record the word32 relocation here,
5398      and adjust the reloc according to the real size in reloc().  */
5399   static const struct {
5400     const char *str;
5401     const enum bfd_reloc_code_real rel[2];
5402     const i386_operand_type types64;
5403   } gotrel[] = {
5404     { "PLTOFF",   { 0,
5405                     BFD_RELOC_X86_64_PLTOFF64 },
5406       OPERAND_TYPE_IMM64 },
5407     { "PLT",      { BFD_RELOC_386_PLT32,
5408                     BFD_RELOC_X86_64_PLT32    },
5409       OPERAND_TYPE_IMM32_32S_DISP32 },
5410     { "GOTPLT",   { 0,
5411                     BFD_RELOC_X86_64_GOTPLT64 },
5412       OPERAND_TYPE_IMM64_DISP64 },
5413     { "GOTOFF",   { BFD_RELOC_386_GOTOFF,
5414                     BFD_RELOC_X86_64_GOTOFF64 },
5415       OPERAND_TYPE_IMM64_DISP64 },
5416     { "GOTPCREL", { 0,
5417                     BFD_RELOC_X86_64_GOTPCREL },
5418       OPERAND_TYPE_IMM32_32S_DISP32 },
5419     { "TLSGD",    { BFD_RELOC_386_TLS_GD,
5420                     BFD_RELOC_X86_64_TLSGD    },
5421       OPERAND_TYPE_IMM32_32S_DISP32 },
5422     { "TLSLDM",   { BFD_RELOC_386_TLS_LDM,
5423                     0                         },
5424       OPERAND_TYPE_NONE },
5425     { "TLSLD",    { 0,
5426                     BFD_RELOC_X86_64_TLSLD    },
5427       OPERAND_TYPE_IMM32_32S_DISP32 },
5428     { "GOTTPOFF", { BFD_RELOC_386_TLS_IE_32,
5429                     BFD_RELOC_X86_64_GOTTPOFF },
5430       OPERAND_TYPE_IMM32_32S_DISP32 },
5431     { "TPOFF",    { BFD_RELOC_386_TLS_LE_32,
5432                     BFD_RELOC_X86_64_TPOFF32  },
5433       OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
5434     { "NTPOFF",   { BFD_RELOC_386_TLS_LE,
5435                     0                         },
5436       OPERAND_TYPE_NONE },
5437     { "DTPOFF",   { BFD_RELOC_386_TLS_LDO_32,
5438                     BFD_RELOC_X86_64_DTPOFF32 },
5439       
5440       OPERAND_TYPE_IMM32_32S_64_DISP32_64 },
5441     { "GOTNTPOFF",{ BFD_RELOC_386_TLS_GOTIE,
5442                     0                         },
5443       OPERAND_TYPE_NONE },
5444     { "INDNTPOFF",{ BFD_RELOC_386_TLS_IE,
5445                     0                         },
5446       OPERAND_TYPE_NONE },
5447     { "GOT",      { BFD_RELOC_386_GOT32,
5448                     BFD_RELOC_X86_64_GOT32    },
5449       OPERAND_TYPE_IMM32_32S_64_DISP32 },
5450     { "TLSDESC",  { BFD_RELOC_386_TLS_GOTDESC,
5451                     BFD_RELOC_X86_64_GOTPC32_TLSDESC },
5452       OPERAND_TYPE_IMM32_32S_DISP32 },
5453     { "TLSCALL",  { BFD_RELOC_386_TLS_DESC_CALL,
5454                     BFD_RELOC_X86_64_TLSDESC_CALL },
5455       OPERAND_TYPE_IMM32_32S_DISP32 },
5456   };
5457   char *cp;
5458   unsigned int j;
5459
5460   if (!IS_ELF)
5461     return NULL;
5462
5463   for (cp = input_line_pointer; *cp != '@'; cp++)
5464     if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
5465       return NULL;
5466
5467   for (j = 0; j < ARRAY_SIZE (gotrel); j++)
5468     {
5469       int len;
5470
5471       len = strlen (gotrel[j].str);
5472       if (strncasecmp (cp + 1, gotrel[j].str, len) == 0)
5473         {
5474           if (gotrel[j].rel[object_64bit] != 0)
5475             {
5476               int first, second;
5477               char *tmpbuf, *past_reloc;
5478
5479               *reloc = gotrel[j].rel[object_64bit];
5480               if (adjust)
5481                 *adjust = len;
5482
5483               if (types)
5484                 {
5485                   if (flag_code != CODE_64BIT)
5486                     {
5487                       types->bitfield.imm32 = 1;
5488                       types->bitfield.disp32 = 1;
5489                     }
5490                   else
5491                     *types = gotrel[j].types64;
5492                 }
5493
5494               if (GOT_symbol == NULL)
5495                 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
5496
5497               /* The length of the first part of our input line.  */
5498               first = cp - input_line_pointer;
5499
5500               /* The second part goes from after the reloc token until
5501                  (and including) an end_of_line char or comma.  */
5502               past_reloc = cp + 1 + len;
5503               cp = past_reloc;
5504               while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
5505                 ++cp;
5506               second = cp + 1 - past_reloc;
5507
5508               /* Allocate and copy string.  The trailing NUL shouldn't
5509                  be necessary, but be safe.  */
5510               tmpbuf = xmalloc (first + second + 2);
5511               memcpy (tmpbuf, input_line_pointer, first);
5512               if (second != 0 && *past_reloc != ' ')
5513                 /* Replace the relocation token with ' ', so that
5514                    errors like foo@GOTOFF1 will be detected.  */
5515                 tmpbuf[first++] = ' ';
5516               memcpy (tmpbuf + first, past_reloc, second);
5517               tmpbuf[first + second] = '\0';
5518               return tmpbuf;
5519             }
5520
5521           as_bad (_("@%s reloc is not supported with %d-bit output format"),
5522                   gotrel[j].str, 1 << (5 + object_64bit));
5523           return NULL;
5524         }
5525     }
5526
5527   /* Might be a symbol version string.  Don't as_bad here.  */
5528   return NULL;
5529 }
5530
5531 void
5532 x86_cons (expressionS *exp, int size)
5533 {
5534   if (size == 4 || (object_64bit && size == 8))
5535     {
5536       /* Handle @GOTOFF and the like in an expression.  */
5537       char *save;
5538       char *gotfree_input_line;
5539       int adjust;
5540
5541       save = input_line_pointer;
5542       gotfree_input_line = lex_got (&got_reloc, &adjust, NULL);
5543       if (gotfree_input_line)
5544         input_line_pointer = gotfree_input_line;
5545
5546       expression (exp);
5547
5548       if (gotfree_input_line)
5549         {
5550           /* expression () has merrily parsed up to the end of line,
5551              or a comma - in the wrong buffer.  Transfer how far
5552              input_line_pointer has moved to the right buffer.  */
5553           input_line_pointer = (save
5554                                 + (input_line_pointer - gotfree_input_line)
5555                                 + adjust);
5556           free (gotfree_input_line);
5557           if (exp->X_op == O_constant
5558               || exp->X_op == O_absent
5559               || exp->X_op == O_illegal
5560               || exp->X_op == O_register
5561               || exp->X_op == O_big)
5562             {
5563               char c = *input_line_pointer;
5564               *input_line_pointer = 0;
5565               as_bad (_("missing or invalid expression `%s'"), save);
5566               *input_line_pointer = c;
5567             }
5568         }
5569     }
5570   else
5571     expression (exp);
5572 }
5573 #endif
5574
5575 static void signed_cons (int size)
5576 {
5577   if (flag_code == CODE_64BIT)
5578     cons_sign = 1;
5579   cons (size);
5580   cons_sign = -1;
5581 }
5582
5583 #ifdef TE_PE
5584 static void
5585 pe_directive_secrel (dummy)
5586      int dummy ATTRIBUTE_UNUSED;
5587 {
5588   expressionS exp;
5589
5590   do
5591     {
5592       expression (&exp);
5593       if (exp.X_op == O_symbol)
5594         exp.X_op = O_secrel;
5595
5596       emit_expr (&exp, 4);
5597     }
5598   while (*input_line_pointer++ == ',');
5599
5600   input_line_pointer--;
5601   demand_empty_rest_of_line ();
5602 }
5603 #endif
5604
5605 static int
5606 i386_immediate (char *imm_start)
5607 {
5608   char *save_input_line_pointer;
5609   char *gotfree_input_line;
5610   segT exp_seg = 0;
5611   expressionS *exp;
5612   i386_operand_type types;
5613
5614   UINTS_SET (types, ~0);
5615
5616   if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
5617     {
5618       as_bad (_("at most %d immediate operands are allowed"),
5619               MAX_IMMEDIATE_OPERANDS);
5620       return 0;
5621     }
5622
5623   exp = &im_expressions[i.imm_operands++];
5624   i.op[this_operand].imms = exp;
5625
5626   if (is_space_char (*imm_start))
5627     ++imm_start;
5628
5629   save_input_line_pointer = input_line_pointer;
5630   input_line_pointer = imm_start;
5631
5632   gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
5633   if (gotfree_input_line)
5634     input_line_pointer = gotfree_input_line;
5635
5636   exp_seg = expression (exp);
5637
5638   SKIP_WHITESPACE ();
5639   if (*input_line_pointer)
5640     as_bad (_("junk `%s' after expression"), input_line_pointer);
5641
5642   input_line_pointer = save_input_line_pointer;
5643   if (gotfree_input_line)
5644     free (gotfree_input_line);
5645
5646   if (exp->X_op == O_absent
5647       || exp->X_op == O_illegal
5648       || exp->X_op == O_big
5649       || (gotfree_input_line
5650           && (exp->X_op == O_constant
5651               || exp->X_op == O_register)))
5652     {
5653       as_bad (_("missing or invalid immediate expression `%s'"),
5654               imm_start);
5655       return 0;
5656     }
5657   else if (exp->X_op == O_constant)
5658     {
5659       /* Size it properly later.  */
5660       i.types[this_operand].bitfield.imm64 = 1;
5661       /* If BFD64, sign extend val.  */
5662       if (!use_rela_relocations
5663           && (exp->X_add_number & ~(((addressT) 2 << 31) - 1)) == 0)
5664         exp->X_add_number
5665           = (exp->X_add_number ^ ((addressT) 1 << 31)) - ((addressT) 1 << 31);
5666     }
5667 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
5668   else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
5669            && exp_seg != absolute_section
5670            && exp_seg != text_section
5671            && exp_seg != data_section
5672            && exp_seg != bss_section
5673            && exp_seg != undefined_section
5674            && !bfd_is_com_section (exp_seg))
5675     {
5676       as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
5677       return 0;
5678     }
5679 #endif
5680   else if (!intel_syntax && exp->X_op == O_register)
5681     {
5682       as_bad (_("illegal immediate register operand %s"), imm_start);
5683       return 0;
5684     }
5685   else
5686     {
5687       /* This is an address.  The size of the address will be
5688          determined later, depending on destination register,
5689          suffix, or the default for the section.  */
5690       i.types[this_operand].bitfield.imm8 = 1;
5691       i.types[this_operand].bitfield.imm16 = 1;
5692       i.types[this_operand].bitfield.imm32 = 1;
5693       i.types[this_operand].bitfield.imm32s = 1;
5694       i.types[this_operand].bitfield.imm64 = 1;
5695       i.types[this_operand] = operand_type_and (i.types[this_operand],
5696                                                 types);
5697     }
5698
5699   return 1;
5700 }
5701
5702 static char *
5703 i386_scale (char *scale)
5704 {
5705   offsetT val;
5706   char *save = input_line_pointer;
5707
5708   input_line_pointer = scale;
5709   val = get_absolute_expression ();
5710
5711   switch (val)
5712     {
5713     case 1:
5714       i.log2_scale_factor = 0;
5715       break;
5716     case 2:
5717       i.log2_scale_factor = 1;
5718       break;
5719     case 4:
5720       i.log2_scale_factor = 2;
5721       break;
5722     case 8:
5723       i.log2_scale_factor = 3;
5724       break;
5725     default:
5726       {
5727         char sep = *input_line_pointer;
5728
5729         *input_line_pointer = '\0';
5730         as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
5731                 scale);
5732         *input_line_pointer = sep;
5733         input_line_pointer = save;
5734         return NULL;
5735       }
5736     }
5737   if (i.log2_scale_factor != 0 && i.index_reg == 0)
5738     {
5739       as_warn (_("scale factor of %d without an index register"),
5740                1 << i.log2_scale_factor);
5741       i.log2_scale_factor = 0;
5742     }
5743   scale = input_line_pointer;
5744   input_line_pointer = save;
5745   return scale;
5746 }
5747
5748 static int
5749 i386_displacement (char *disp_start, char *disp_end)
5750 {
5751   expressionS *exp;
5752   segT exp_seg = 0;
5753   char *save_input_line_pointer;
5754   char *gotfree_input_line;
5755   int override;
5756   i386_operand_type bigdisp, types = anydisp;
5757   int ret;
5758
5759   if (i.disp_operands == MAX_MEMORY_OPERANDS)
5760     {
5761       as_bad (_("at most %d displacement operands are allowed"),
5762               MAX_MEMORY_OPERANDS);
5763       return 0;
5764     }
5765
5766   UINTS_CLEAR (bigdisp);
5767   if ((i.types[this_operand].bitfield.jumpabsolute)
5768       || (!current_templates->start->opcode_modifier.jump
5769           && !current_templates->start->opcode_modifier.jumpdword))
5770     {
5771       bigdisp.bitfield.disp32 = 1;
5772       override = (i.prefix[ADDR_PREFIX] != 0);
5773       if (flag_code == CODE_64BIT)
5774         {
5775           if (!override)
5776             {
5777               bigdisp.bitfield.disp32s = 1;
5778               bigdisp.bitfield.disp64 = 1;
5779             }
5780         }
5781       else if ((flag_code == CODE_16BIT) ^ override)
5782         {
5783           bigdisp.bitfield.disp32 = 0;
5784           bigdisp.bitfield.disp16 = 1;
5785         }
5786     }
5787   else
5788     {
5789       /* For PC-relative branches, the width of the displacement
5790          is dependent upon data size, not address size.  */
5791       override = (i.prefix[DATA_PREFIX] != 0);
5792       if (flag_code == CODE_64BIT)
5793         {
5794           if (override || i.suffix == WORD_MNEM_SUFFIX)
5795             bigdisp.bitfield.disp16 = 1;
5796           else
5797             {
5798               bigdisp.bitfield.disp32 = 1;
5799               bigdisp.bitfield.disp32s = 1;
5800             }
5801         }
5802       else
5803         {
5804           if (!override)
5805             override = (i.suffix == (flag_code != CODE_16BIT
5806                                      ? WORD_MNEM_SUFFIX
5807                                      : LONG_MNEM_SUFFIX));
5808           bigdisp.bitfield.disp32 = 1;
5809           if ((flag_code == CODE_16BIT) ^ override)
5810             {
5811               bigdisp.bitfield.disp32 = 0;
5812               bigdisp.bitfield.disp16 = 1;
5813             }
5814         }
5815     }
5816   i.types[this_operand] = operand_type_or (i.types[this_operand],
5817                                            bigdisp);
5818
5819   exp = &disp_expressions[i.disp_operands];
5820   i.op[this_operand].disps = exp;
5821   i.disp_operands++;
5822   save_input_line_pointer = input_line_pointer;
5823   input_line_pointer = disp_start;
5824   END_STRING_AND_SAVE (disp_end);
5825
5826 #ifndef GCC_ASM_O_HACK
5827 #define GCC_ASM_O_HACK 0
5828 #endif
5829 #if GCC_ASM_O_HACK
5830   END_STRING_AND_SAVE (disp_end + 1);
5831   if (i.types[this_operand].bitfield.baseIndex
5832       && displacement_string_end[-1] == '+')
5833     {
5834       /* This hack is to avoid a warning when using the "o"
5835          constraint within gcc asm statements.
5836          For instance:
5837
5838          #define _set_tssldt_desc(n,addr,limit,type) \
5839          __asm__ __volatile__ ( \
5840          "movw %w2,%0\n\t" \
5841          "movw %w1,2+%0\n\t" \
5842          "rorl $16,%1\n\t" \
5843          "movb %b1,4+%0\n\t" \
5844          "movb %4,5+%0\n\t" \
5845          "movb $0,6+%0\n\t" \
5846          "movb %h1,7+%0\n\t" \
5847          "rorl $16,%1" \
5848          : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
5849
5850          This works great except that the output assembler ends
5851          up looking a bit weird if it turns out that there is
5852          no offset.  You end up producing code that looks like:
5853
5854          #APP
5855          movw $235,(%eax)
5856          movw %dx,2+(%eax)
5857          rorl $16,%edx
5858          movb %dl,4+(%eax)
5859          movb $137,5+(%eax)
5860          movb $0,6+(%eax)
5861          movb %dh,7+(%eax)
5862          rorl $16,%edx
5863          #NO_APP
5864
5865          So here we provide the missing zero.  */
5866
5867       *displacement_string_end = '0';
5868     }
5869 #endif
5870   gotfree_input_line = lex_got (&i.reloc[this_operand], NULL, &types);
5871   if (gotfree_input_line)
5872     input_line_pointer = gotfree_input_line;
5873
5874   exp_seg = expression (exp);
5875
5876   SKIP_WHITESPACE ();
5877   if (*input_line_pointer)
5878     as_bad (_("junk `%s' after expression"), input_line_pointer);
5879 #if GCC_ASM_O_HACK
5880   RESTORE_END_STRING (disp_end + 1);
5881 #endif
5882   input_line_pointer = save_input_line_pointer;
5883   if (gotfree_input_line)
5884     free (gotfree_input_line);
5885   ret = 1;
5886
5887   /* We do this to make sure that the section symbol is in
5888      the symbol table.  We will ultimately change the relocation
5889      to be relative to the beginning of the section.  */
5890   if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
5891       || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
5892       || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
5893     {
5894       if (exp->X_op != O_symbol)
5895         goto inv_disp;
5896
5897       if (S_IS_LOCAL (exp->X_add_symbol)
5898           && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section)
5899         section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
5900       exp->X_op = O_subtract;
5901       exp->X_op_symbol = GOT_symbol;
5902       if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
5903         i.reloc[this_operand] = BFD_RELOC_32_PCREL;
5904       else if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
5905         i.reloc[this_operand] = BFD_RELOC_64;
5906       else
5907         i.reloc[this_operand] = BFD_RELOC_32;
5908     }
5909
5910   else if (exp->X_op == O_absent
5911            || exp->X_op == O_illegal
5912            || exp->X_op == O_big
5913            || (gotfree_input_line
5914                && (exp->X_op == O_constant
5915                    || exp->X_op == O_register)))
5916     {
5917     inv_disp:
5918       as_bad (_("missing or invalid displacement expression `%s'"),
5919               disp_start);
5920       ret = 0;
5921     }
5922
5923 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
5924   else if (exp->X_op != O_constant
5925            && OUTPUT_FLAVOR == bfd_target_aout_flavour
5926            && exp_seg != absolute_section
5927            && exp_seg != text_section
5928            && exp_seg != data_section
5929            && exp_seg != bss_section
5930            && exp_seg != undefined_section
5931            && !bfd_is_com_section (exp_seg))
5932     {
5933       as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
5934       ret = 0;
5935     }
5936 #endif
5937
5938   RESTORE_END_STRING (disp_end);
5939
5940   /* Check if this is a displacement only operand.  */
5941   bigdisp = i.types[this_operand];
5942   bigdisp.bitfield.disp8 = 0;
5943   bigdisp.bitfield.disp16 = 0;
5944   bigdisp.bitfield.disp32 = 0;
5945   bigdisp.bitfield.disp32s = 0;
5946   bigdisp.bitfield.disp64 = 0;
5947   if (UINTS_ALL_ZERO (bigdisp))
5948     i.types[this_operand] = operand_type_and (i.types[this_operand],
5949                                               types);
5950
5951   return ret;
5952 }
5953
5954 /* Make sure the memory operand we've been dealt is valid.
5955    Return 1 on success, 0 on a failure.  */
5956
5957 static int
5958 i386_index_check (const char *operand_string)
5959 {
5960   int ok;
5961 #if INFER_ADDR_PREFIX
5962   int fudged = 0;
5963
5964  tryprefix:
5965 #endif
5966   ok = 1;
5967   if (flag_code == CODE_64BIT)
5968     {
5969       if ((i.base_reg
5970            && ((i.prefix[ADDR_PREFIX] == 0
5971                 && !i.base_reg->reg_type.bitfield.reg64)
5972                || (i.prefix[ADDR_PREFIX]
5973                    && !i.base_reg->reg_type.bitfield.reg32))
5974            && (i.index_reg
5975                || i.base_reg->reg_num !=
5976                   (i.prefix[ADDR_PREFIX] == 0 ? RegRip : RegEip)))
5977           || (i.index_reg
5978               && (!i.index_reg->reg_type.bitfield.baseindex
5979                   || (i.prefix[ADDR_PREFIX] == 0
5980                       && i.index_reg->reg_num != RegRiz
5981                       && !i.index_reg->reg_type.bitfield.reg64
5982                       )
5983                   || (i.prefix[ADDR_PREFIX]
5984                       && i.index_reg->reg_num != RegEiz
5985                       && !i.index_reg->reg_type.bitfield.reg32))))
5986         ok = 0;
5987     }
5988   else
5989     {
5990       if ((flag_code == CODE_16BIT) ^ (i.prefix[ADDR_PREFIX] != 0))
5991         {
5992           /* 16bit checks.  */
5993           if ((i.base_reg
5994                && (!i.base_reg->reg_type.bitfield.reg16
5995                    || !i.base_reg->reg_type.bitfield.baseindex))
5996               || (i.index_reg
5997                   && (!i.index_reg->reg_type.bitfield.reg16
5998                       || !i.index_reg->reg_type.bitfield.baseindex
5999                       || !(i.base_reg
6000                            && i.base_reg->reg_num < 6
6001                            && i.index_reg->reg_num >= 6
6002                            && i.log2_scale_factor == 0))))
6003             ok = 0;
6004         }
6005       else
6006         {
6007           /* 32bit checks.  */
6008           if ((i.base_reg
6009                && !i.base_reg->reg_type.bitfield.reg32)
6010               || (i.index_reg
6011                   && ((!i.index_reg->reg_type.bitfield.reg32
6012                        && i.index_reg->reg_num != RegEiz)
6013                       || !i.index_reg->reg_type.bitfield.baseindex)))
6014             ok = 0;
6015         }
6016     }
6017   if (!ok)
6018     {
6019 #if INFER_ADDR_PREFIX
6020       if (i.prefix[ADDR_PREFIX] == 0)
6021         {
6022           i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
6023           i.prefixes += 1;
6024           /* Change the size of any displacement too.  At most one of
6025              Disp16 or Disp32 is set.
6026              FIXME.  There doesn't seem to be any real need for separate
6027              Disp16 and Disp32 flags.  The same goes for Imm16 and Imm32.
6028              Removing them would probably clean up the code quite a lot.  */
6029           if (flag_code != CODE_64BIT
6030               && (i.types[this_operand].bitfield.disp16
6031                   || i.types[this_operand].bitfield.disp32))
6032             i.types[this_operand]
6033               = operand_type_xor (i.types[this_operand], disp16_32);
6034           fudged = 1;
6035           goto tryprefix;
6036         }
6037       if (fudged)
6038         as_bad (_("`%s' is not a valid base/index expression"),
6039                 operand_string);
6040       else
6041 #endif
6042         as_bad (_("`%s' is not a valid %s bit base/index expression"),
6043                 operand_string,
6044                 flag_code_names[flag_code]);
6045     }
6046   return ok;
6047 }
6048
6049 /* Parse OPERAND_STRING into the i386_insn structure I.  Returns non-zero
6050    on error.  */
6051
6052 static int
6053 i386_att_operand (char *operand_string)
6054 {
6055   const reg_entry *r;
6056   char *end_op;
6057   char *op_string = operand_string;
6058
6059   if (is_space_char (*op_string))
6060     ++op_string;
6061
6062   /* We check for an absolute prefix (differentiating,
6063      for example, 'jmp pc_relative_label' from 'jmp *absolute_label'.  */
6064   if (*op_string == ABSOLUTE_PREFIX)
6065     {
6066       ++op_string;
6067       if (is_space_char (*op_string))
6068         ++op_string;
6069       i.types[this_operand].bitfield.jumpabsolute = 1;
6070     }
6071
6072   /* Check if operand is a register.  */
6073   if ((r = parse_register (op_string, &end_op)) != NULL)
6074     {
6075       i386_operand_type temp;
6076
6077       /* Check for a segment override by searching for ':' after a
6078          segment register.  */
6079       op_string = end_op;
6080       if (is_space_char (*op_string))
6081         ++op_string;
6082       if (*op_string == ':'
6083           && (r->reg_type.bitfield.sreg2
6084               || r->reg_type.bitfield.sreg3))
6085         {
6086           switch (r->reg_num)
6087             {
6088             case 0:
6089               i.seg[i.mem_operands] = &es;
6090               break;
6091             case 1:
6092               i.seg[i.mem_operands] = &cs;
6093               break;
6094             case 2:
6095               i.seg[i.mem_operands] = &ss;
6096               break;
6097             case 3:
6098               i.seg[i.mem_operands] = &ds;
6099               break;
6100             case 4:
6101               i.seg[i.mem_operands] = &fs;
6102               break;
6103             case 5:
6104               i.seg[i.mem_operands] = &gs;
6105               break;
6106             }
6107
6108           /* Skip the ':' and whitespace.  */
6109           ++op_string;
6110           if (is_space_char (*op_string))
6111             ++op_string;
6112
6113           if (!is_digit_char (*op_string)
6114               && !is_identifier_char (*op_string)
6115               && *op_string != '('
6116               && *op_string != ABSOLUTE_PREFIX)
6117             {
6118               as_bad (_("bad memory operand `%s'"), op_string);
6119               return 0;
6120             }
6121           /* Handle case of %es:*foo.  */
6122           if (*op_string == ABSOLUTE_PREFIX)
6123             {
6124               ++op_string;
6125               if (is_space_char (*op_string))
6126                 ++op_string;
6127               i.types[this_operand].bitfield.jumpabsolute = 1;
6128             }
6129           goto do_memory_reference;
6130         }
6131       if (*op_string)
6132         {
6133           as_bad (_("junk `%s' after register"), op_string);
6134           return 0;
6135         }
6136       temp = r->reg_type;
6137       temp.bitfield.baseindex = 0;
6138       i.types[this_operand] = operand_type_or (i.types[this_operand],
6139                                                temp);
6140       i.op[this_operand].regs = r;
6141       i.reg_operands++;
6142     }
6143   else if (*op_string == REGISTER_PREFIX)
6144     {
6145       as_bad (_("bad register name `%s'"), op_string);
6146       return 0;
6147     }
6148   else if (*op_string == IMMEDIATE_PREFIX)
6149     {
6150       ++op_string;
6151       if (i.types[this_operand].bitfield.jumpabsolute)
6152         {
6153           as_bad (_("immediate operand illegal with absolute jump"));
6154           return 0;
6155         }
6156       if (!i386_immediate (op_string))
6157         return 0;
6158     }
6159   else if (is_digit_char (*op_string)
6160            || is_identifier_char (*op_string)
6161            || *op_string == '(')
6162     {
6163       /* This is a memory reference of some sort.  */
6164       char *base_string;
6165
6166       /* Start and end of displacement string expression (if found).  */
6167       char *displacement_string_start;
6168       char *displacement_string_end;
6169
6170     do_memory_reference:
6171       if ((i.mem_operands == 1
6172            && !current_templates->start->opcode_modifier.isstring)
6173           || i.mem_operands == 2)
6174         {
6175           as_bad (_("too many memory references for `%s'"),
6176                   current_templates->start->name);
6177           return 0;
6178         }
6179
6180       /* Check for base index form.  We detect the base index form by
6181          looking for an ')' at the end of the operand, searching
6182          for the '(' matching it, and finding a REGISTER_PREFIX or ','
6183          after the '('.  */
6184       base_string = op_string + strlen (op_string);
6185
6186       --base_string;
6187       if (is_space_char (*base_string))
6188         --base_string;
6189
6190       /* If we only have a displacement, set-up for it to be parsed later.  */
6191       displacement_string_start = op_string;
6192       displacement_string_end = base_string + 1;
6193
6194       if (*base_string == ')')
6195         {
6196           char *temp_string;
6197           unsigned int parens_balanced = 1;
6198           /* We've already checked that the number of left & right ()'s are
6199              equal, so this loop will not be infinite.  */
6200           do
6201             {
6202               base_string--;
6203               if (*base_string == ')')
6204                 parens_balanced++;
6205               if (*base_string == '(')
6206                 parens_balanced--;
6207             }
6208           while (parens_balanced);
6209
6210           temp_string = base_string;
6211
6212           /* Skip past '(' and whitespace.  */
6213           ++base_string;
6214           if (is_space_char (*base_string))
6215             ++base_string;
6216
6217           if (*base_string == ','
6218               || ((i.base_reg = parse_register (base_string, &end_op))
6219                   != NULL))
6220             {
6221               displacement_string_end = temp_string;
6222
6223               i.types[this_operand].bitfield.baseindex = 1;
6224
6225               if (i.base_reg)
6226                 {
6227                   base_string = end_op;
6228                   if (is_space_char (*base_string))
6229                     ++base_string;
6230                 }
6231
6232               /* There may be an index reg or scale factor here.  */
6233               if (*base_string == ',')
6234                 {
6235                   ++base_string;
6236                   if (is_space_char (*base_string))
6237                     ++base_string;
6238
6239                   if ((i.index_reg = parse_register (base_string, &end_op))
6240                       != NULL)
6241                     {
6242                       base_string = end_op;
6243                       if (is_space_char (*base_string))
6244                         ++base_string;
6245                       if (*base_string == ',')
6246                         {
6247                           ++base_string;
6248                           if (is_space_char (*base_string))
6249                             ++base_string;
6250                         }
6251                       else if (*base_string != ')')
6252                         {
6253                           as_bad (_("expecting `,' or `)' "
6254                                     "after index register in `%s'"),
6255                                   operand_string);
6256                           return 0;
6257                         }
6258                     }
6259                   else if (*base_string == REGISTER_PREFIX)
6260                     {
6261                       as_bad (_("bad register name `%s'"), base_string);
6262                       return 0;
6263                     }
6264
6265                   /* Check for scale factor.  */
6266                   if (*base_string != ')')
6267                     {
6268                       char *end_scale = i386_scale (base_string);
6269
6270                       if (!end_scale)
6271                         return 0;
6272
6273                       base_string = end_scale;
6274                       if (is_space_char (*base_string))
6275                         ++base_string;
6276                       if (*base_string != ')')
6277                         {
6278                           as_bad (_("expecting `)' "
6279                                     "after scale factor in `%s'"),
6280                                   operand_string);
6281                           return 0;
6282                         }
6283                     }
6284                   else if (!i.index_reg)
6285                     {
6286                       as_bad (_("expecting index register or scale factor "
6287                                 "after `,'; got '%c'"),
6288                               *base_string);
6289                       return 0;
6290                     }
6291                 }
6292               else if (*base_string != ')')
6293                 {
6294                   as_bad (_("expecting `,' or `)' "
6295                             "after base register in `%s'"),
6296                           operand_string);
6297                   return 0;
6298                 }
6299             }
6300           else if (*base_string == REGISTER_PREFIX)
6301             {
6302               as_bad (_("bad register name `%s'"), base_string);
6303               return 0;
6304             }
6305         }
6306
6307       /* If there's an expression beginning the operand, parse it,
6308          assuming displacement_string_start and
6309          displacement_string_end are meaningful.  */
6310       if (displacement_string_start != displacement_string_end)
6311         {
6312           if (!i386_displacement (displacement_string_start,
6313                                   displacement_string_end))
6314             return 0;
6315         }
6316
6317       /* Special case for (%dx) while doing input/output op.  */
6318       if (i.base_reg
6319           && UINTS_EQUAL (i.base_reg->reg_type, reg16_inoutportreg)
6320           && i.index_reg == 0
6321           && i.log2_scale_factor == 0
6322           && i.seg[i.mem_operands] == 0
6323           && !operand_type_check (i.types[this_operand], disp))
6324         {
6325           UINTS_CLEAR (i.types[this_operand]);
6326           i.types[this_operand].bitfield.inoutportreg = 1;
6327           return 1;
6328         }
6329
6330       if (i386_index_check (operand_string) == 0)
6331         return 0;
6332       i.mem_operands++;
6333     }
6334   else
6335     {
6336       /* It's not a memory operand; argh!  */
6337       as_bad (_("invalid char %s beginning operand %d `%s'"),
6338               output_invalid (*op_string),
6339               this_operand + 1,
6340               op_string);
6341       return 0;
6342     }
6343   return 1;                     /* Normal return.  */
6344 }
6345 \f
6346 /* md_estimate_size_before_relax()
6347
6348    Called just before relax() for rs_machine_dependent frags.  The x86
6349    assembler uses these frags to handle variable size jump
6350    instructions.
6351
6352    Any symbol that is now undefined will not become defined.
6353    Return the correct fr_subtype in the frag.
6354    Return the initial "guess for variable size of frag" to caller.
6355    The guess is actually the growth beyond the fixed part.  Whatever
6356    we do to grow the fixed or variable part contributes to our
6357    returned value.  */
6358
6359 int
6360 md_estimate_size_before_relax (fragP, segment)
6361      fragS *fragP;
6362      segT segment;
6363 {
6364   /* We've already got fragP->fr_subtype right;  all we have to do is
6365      check for un-relaxable symbols.  On an ELF system, we can't relax
6366      an externally visible symbol, because it may be overridden by a
6367      shared library.  */
6368   if (S_GET_SEGMENT (fragP->fr_symbol) != segment
6369 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
6370       || (IS_ELF
6371           && (S_IS_EXTERNAL (fragP->fr_symbol)
6372               || S_IS_WEAK (fragP->fr_symbol)))
6373 #endif
6374       )
6375     {
6376       /* Symbol is undefined in this segment, or we need to keep a
6377          reloc so that weak symbols can be overridden.  */
6378       int size = (fragP->fr_subtype & CODE16) ? 2 : 4;
6379       enum bfd_reloc_code_real reloc_type;
6380       unsigned char *opcode;
6381       int old_fr_fix;
6382
6383       if (fragP->fr_var != NO_RELOC)
6384         reloc_type = fragP->fr_var;
6385       else if (size == 2)
6386         reloc_type = BFD_RELOC_16_PCREL;
6387       else
6388         reloc_type = BFD_RELOC_32_PCREL;
6389
6390       old_fr_fix = fragP->fr_fix;
6391       opcode = (unsigned char *) fragP->fr_opcode;
6392
6393       switch (TYPE_FROM_RELAX_STATE (fragP->fr_subtype))
6394         {
6395         case UNCOND_JUMP:
6396           /* Make jmp (0xeb) a (d)word displacement jump.  */
6397           opcode[0] = 0xe9;
6398           fragP->fr_fix += size;
6399           fix_new (fragP, old_fr_fix, size,
6400                    fragP->fr_symbol,
6401                    fragP->fr_offset, 1,
6402                    reloc_type);
6403           break;
6404
6405         case COND_JUMP86:
6406           if (size == 2
6407               && (!no_cond_jump_promotion || fragP->fr_var != NO_RELOC))
6408             {
6409               /* Negate the condition, and branch past an
6410                  unconditional jump.  */
6411               opcode[0] ^= 1;
6412               opcode[1] = 3;
6413               /* Insert an unconditional jump.  */
6414               opcode[2] = 0xe9;
6415               /* We added two extra opcode bytes, and have a two byte
6416                  offset.  */
6417               fragP->fr_fix += 2 + 2;
6418               fix_new (fragP, old_fr_fix + 2, 2,
6419                        fragP->fr_symbol,
6420                        fragP->fr_offset, 1,
6421                        reloc_type);
6422               break;
6423             }
6424           /* Fall through.  */
6425
6426         case COND_JUMP:
6427           if (no_cond_jump_promotion && fragP->fr_var == NO_RELOC)
6428             {
6429               fixS *fixP;
6430
6431               fragP->fr_fix += 1;
6432               fixP = fix_new (fragP, old_fr_fix, 1,
6433                               fragP->fr_symbol,
6434                               fragP->fr_offset, 1,
6435                               BFD_RELOC_8_PCREL);
6436               fixP->fx_signed = 1;
6437               break;
6438             }
6439
6440           /* This changes the byte-displacement jump 0x7N
6441              to the (d)word-displacement jump 0x0f,0x8N.  */
6442           opcode[1] = opcode[0] + 0x10;
6443           opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
6444           /* We've added an opcode byte.  */
6445           fragP->fr_fix += 1 + size;
6446           fix_new (fragP, old_fr_fix + 1, size,
6447                    fragP->fr_symbol,
6448                    fragP->fr_offset, 1,
6449                    reloc_type);
6450           break;
6451
6452         default:
6453           BAD_CASE (fragP->fr_subtype);
6454           break;
6455         }
6456       frag_wane (fragP);
6457       return fragP->fr_fix - old_fr_fix;
6458     }
6459
6460   /* Guess size depending on current relax state.  Initially the relax
6461      state will correspond to a short jump and we return 1, because
6462      the variable part of the frag (the branch offset) is one byte
6463      long.  However, we can relax a section more than once and in that
6464      case we must either set fr_subtype back to the unrelaxed state,
6465      or return the value for the appropriate branch.  */
6466   return md_relax_table[fragP->fr_subtype].rlx_length;
6467 }
6468
6469 /* Called after relax() is finished.
6470
6471    In:  Address of frag.
6472         fr_type == rs_machine_dependent.
6473         fr_subtype is what the address relaxed to.
6474
6475    Out: Any fixSs and constants are set up.
6476         Caller will turn frag into a ".space 0".  */
6477
6478 void
6479 md_convert_frag (abfd, sec, fragP)
6480      bfd *abfd ATTRIBUTE_UNUSED;
6481      segT sec ATTRIBUTE_UNUSED;
6482      fragS *fragP;
6483 {
6484   unsigned char *opcode;
6485   unsigned char *where_to_put_displacement = NULL;
6486   offsetT target_address;
6487   offsetT opcode_address;
6488   unsigned int extension = 0;
6489   offsetT displacement_from_opcode_start;
6490
6491   opcode = (unsigned char *) fragP->fr_opcode;
6492
6493   /* Address we want to reach in file space.  */
6494   target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
6495
6496   /* Address opcode resides at in file space.  */
6497   opcode_address = fragP->fr_address + fragP->fr_fix;
6498
6499   /* Displacement from opcode start to fill into instruction.  */
6500   displacement_from_opcode_start = target_address - opcode_address;
6501
6502   if ((fragP->fr_subtype & BIG) == 0)
6503     {
6504       /* Don't have to change opcode.  */
6505       extension = 1;            /* 1 opcode + 1 displacement  */
6506       where_to_put_displacement = &opcode[1];
6507     }
6508   else
6509     {
6510       if (no_cond_jump_promotion
6511           && TYPE_FROM_RELAX_STATE (fragP->fr_subtype) != UNCOND_JUMP)
6512         as_warn_where (fragP->fr_file, fragP->fr_line,
6513                        _("long jump required"));
6514
6515       switch (fragP->fr_subtype)
6516         {
6517         case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
6518           extension = 4;                /* 1 opcode + 4 displacement  */
6519           opcode[0] = 0xe9;
6520           where_to_put_displacement = &opcode[1];
6521           break;
6522
6523         case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
6524           extension = 2;                /* 1 opcode + 2 displacement  */
6525           opcode[0] = 0xe9;
6526           where_to_put_displacement = &opcode[1];
6527           break;
6528
6529         case ENCODE_RELAX_STATE (COND_JUMP, BIG):
6530         case ENCODE_RELAX_STATE (COND_JUMP86, BIG):
6531           extension = 5;                /* 2 opcode + 4 displacement  */
6532           opcode[1] = opcode[0] + 0x10;
6533           opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
6534           where_to_put_displacement = &opcode[2];
6535           break;
6536
6537         case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
6538           extension = 3;                /* 2 opcode + 2 displacement  */
6539           opcode[1] = opcode[0] + 0x10;
6540           opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
6541           where_to_put_displacement = &opcode[2];
6542           break;
6543
6544         case ENCODE_RELAX_STATE (COND_JUMP86, BIG16):
6545           extension = 4;
6546           opcode[0] ^= 1;
6547           opcode[1] = 3;
6548           opcode[2] = 0xe9;
6549           where_to_put_displacement = &opcode[3];
6550           break;
6551
6552         default:
6553           BAD_CASE (fragP->fr_subtype);
6554           break;
6555         }
6556     }
6557
6558   /* If size if less then four we are sure that the operand fits,
6559      but if it's 4, then it could be that the displacement is larger
6560      then -/+ 2GB.  */
6561   if (DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype) == 4
6562       && object_64bit
6563       && ((addressT) (displacement_from_opcode_start - extension
6564                       + ((addressT) 1 << 31))
6565           > (((addressT) 2 << 31) - 1)))
6566     {
6567       as_bad_where (fragP->fr_file, fragP->fr_line,
6568                     _("jump target out of range"));
6569       /* Make us emit 0.  */
6570       displacement_from_opcode_start = extension;
6571     }
6572   /* Now put displacement after opcode.  */
6573   md_number_to_chars ((char *) where_to_put_displacement,
6574                       (valueT) (displacement_from_opcode_start - extension),
6575                       DISP_SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
6576   fragP->fr_fix += extension;
6577 }
6578 \f
6579 /* Apply a fixup (fixS) to segment data, once it has been determined
6580    by our caller that we have all the info we need to fix it up.
6581
6582    On the 386, immediates, displacements, and data pointers are all in
6583    the same (little-endian) format, so we don't need to care about which
6584    we are handling.  */
6585
6586 void
6587 md_apply_fix (fixP, valP, seg)
6588      /* The fix we're to put in.  */
6589      fixS *fixP;
6590      /* Pointer to the value of the bits.  */
6591      valueT *valP;
6592      /* Segment fix is from.  */
6593      segT seg ATTRIBUTE_UNUSED;
6594 {
6595   char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
6596   valueT value = *valP;
6597
6598 #if !defined (TE_Mach)
6599   if (fixP->fx_pcrel)
6600     {
6601       switch (fixP->fx_r_type)
6602         {
6603         default:
6604           break;
6605
6606         case BFD_RELOC_64:
6607           fixP->fx_r_type = BFD_RELOC_64_PCREL;
6608           break;
6609         case BFD_RELOC_32:
6610         case BFD_RELOC_X86_64_32S:
6611           fixP->fx_r_type = BFD_RELOC_32_PCREL;
6612           break;
6613         case BFD_RELOC_16:
6614           fixP->fx_r_type = BFD_RELOC_16_PCREL;
6615           break;
6616         case BFD_RELOC_8:
6617           fixP->fx_r_type = BFD_RELOC_8_PCREL;
6618           break;
6619         }
6620     }
6621
6622   if (fixP->fx_addsy != NULL
6623       && (fixP->fx_r_type == BFD_RELOC_32_PCREL
6624           || fixP->fx_r_type == BFD_RELOC_64_PCREL
6625           || fixP->fx_r_type == BFD_RELOC_16_PCREL
6626           || fixP->fx_r_type == BFD_RELOC_8_PCREL)
6627       && !use_rela_relocations)
6628     {
6629       /* This is a hack.  There should be a better way to handle this.
6630          This covers for the fact that bfd_install_relocation will
6631          subtract the current location (for partial_inplace, PC relative
6632          relocations); see more below.  */
6633 #ifndef OBJ_AOUT
6634       if (IS_ELF
6635 #ifdef TE_PE
6636           || OUTPUT_FLAVOR == bfd_target_coff_flavour
6637 #endif
6638           )
6639         value += fixP->fx_where + fixP->fx_frag->fr_address;
6640 #endif
6641 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
6642       if (IS_ELF)
6643         {
6644           segT sym_seg = S_GET_SEGMENT (fixP->fx_addsy);
6645
6646           if ((sym_seg == seg
6647                || (symbol_section_p (fixP->fx_addsy)
6648                    && sym_seg != absolute_section))
6649               && !generic_force_reloc (fixP))
6650             {
6651               /* Yes, we add the values in twice.  This is because
6652                  bfd_install_relocation subtracts them out again.  I think
6653                  bfd_install_relocation is broken, but I don't dare change
6654                  it.  FIXME.  */
6655               value += fixP->fx_where + fixP->fx_frag->fr_address;
6656             }
6657         }
6658 #endif
6659 #if defined (OBJ_COFF) && defined (TE_PE)
6660       /* For some reason, the PE format does not store a
6661          section address offset for a PC relative symbol.  */
6662       if (S_GET_SEGMENT (fixP->fx_addsy) != seg
6663           || S_IS_WEAK (fixP->fx_addsy))
6664         value += md_pcrel_from (fixP);
6665 #endif
6666     }
6667
6668   /* Fix a few things - the dynamic linker expects certain values here,
6669      and we must not disappoint it.  */
6670 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
6671   if (IS_ELF && fixP->fx_addsy)
6672     switch (fixP->fx_r_type)
6673       {
6674       case BFD_RELOC_386_PLT32:
6675       case BFD_RELOC_X86_64_PLT32:
6676         /* Make the jump instruction point to the address of the operand.  At
6677            runtime we merely add the offset to the actual PLT entry.  */
6678         value = -4;
6679         break;
6680
6681       case BFD_RELOC_386_TLS_GD:
6682       case BFD_RELOC_386_TLS_LDM:
6683       case BFD_RELOC_386_TLS_IE_32:
6684       case BFD_RELOC_386_TLS_IE:
6685       case BFD_RELOC_386_TLS_GOTIE:
6686       case BFD_RELOC_386_TLS_GOTDESC:
6687       case BFD_RELOC_X86_64_TLSGD:
6688       case BFD_RELOC_X86_64_TLSLD:
6689       case BFD_RELOC_X86_64_GOTTPOFF:
6690       case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
6691         value = 0; /* Fully resolved at runtime.  No addend.  */
6692         /* Fallthrough */
6693       case BFD_RELOC_386_TLS_LE:
6694       case BFD_RELOC_386_TLS_LDO_32:
6695       case BFD_RELOC_386_TLS_LE_32:
6696       case BFD_RELOC_X86_64_DTPOFF32:
6697       case BFD_RELOC_X86_64_DTPOFF64:
6698       case BFD_RELOC_X86_64_TPOFF32:
6699       case BFD_RELOC_X86_64_TPOFF64:
6700         S_SET_THREAD_LOCAL (fixP->fx_addsy);
6701         break;
6702
6703       case BFD_RELOC_386_TLS_DESC_CALL:
6704       case BFD_RELOC_X86_64_TLSDESC_CALL:
6705         value = 0; /* Fully resolved at runtime.  No addend.  */
6706         S_SET_THREAD_LOCAL (fixP->fx_addsy);
6707         fixP->fx_done = 0;
6708         return;
6709
6710       case BFD_RELOC_386_GOT32:
6711       case BFD_RELOC_X86_64_GOT32:
6712         value = 0; /* Fully resolved at runtime.  No addend.  */
6713         break;
6714
6715       case BFD_RELOC_VTABLE_INHERIT:
6716       case BFD_RELOC_VTABLE_ENTRY:
6717         fixP->fx_done = 0;
6718         return;
6719
6720       default:
6721         break;
6722       }
6723 #endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)  */
6724   *valP = value;
6725 #endif /* !defined (TE_Mach)  */
6726
6727   /* Are we finished with this relocation now?  */
6728   if (fixP->fx_addsy == NULL)
6729     fixP->fx_done = 1;
6730   else if (use_rela_relocations)
6731     {
6732       fixP->fx_no_overflow = 1;
6733       /* Remember value for tc_gen_reloc.  */
6734       fixP->fx_addnumber = value;
6735       value = 0;
6736     }
6737
6738   md_number_to_chars (p, value, fixP->fx_size);
6739 }
6740 \f
6741 char *
6742 md_atof (int type, char *litP, int *sizeP)
6743 {
6744   /* This outputs the LITTLENUMs in REVERSE order;
6745      in accord with the bigendian 386.  */
6746   return ieee_md_atof (type, litP, sizeP, FALSE);
6747 }
6748 \f
6749 static char output_invalid_buf[sizeof (unsigned char) * 2 + 6];
6750
6751 static char *
6752 output_invalid (int c)
6753 {
6754   if (ISPRINT (c))
6755     snprintf (output_invalid_buf, sizeof (output_invalid_buf),
6756               "'%c'", c);
6757   else
6758     snprintf (output_invalid_buf, sizeof (output_invalid_buf),
6759               "(0x%x)", (unsigned char) c);
6760   return output_invalid_buf;
6761 }
6762
6763 /* REG_STRING starts *before* REGISTER_PREFIX.  */
6764
6765 static const reg_entry *
6766 parse_real_register (char *reg_string, char **end_op)
6767 {
6768   char *s = reg_string;
6769   char *p;
6770   char reg_name_given[MAX_REG_NAME_SIZE + 1];
6771   const reg_entry *r;
6772
6773   /* Skip possible REGISTER_PREFIX and possible whitespace.  */
6774   if (*s == REGISTER_PREFIX)
6775     ++s;
6776
6777   if (is_space_char (*s))
6778     ++s;
6779
6780   p = reg_name_given;
6781   while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
6782     {
6783       if (p >= reg_name_given + MAX_REG_NAME_SIZE)
6784         return (const reg_entry *) NULL;
6785       s++;
6786     }
6787
6788   /* For naked regs, make sure that we are not dealing with an identifier.
6789      This prevents confusing an identifier like `eax_var' with register
6790      `eax'.  */
6791   if (allow_naked_reg && identifier_chars[(unsigned char) *s])
6792     return (const reg_entry *) NULL;
6793
6794   *end_op = s;
6795
6796   r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
6797
6798   /* Handle floating point regs, allowing spaces in the (i) part.  */
6799   if (r == i386_regtab /* %st is first entry of table  */)
6800     {
6801       if (is_space_char (*s))
6802         ++s;
6803       if (*s == '(')
6804         {
6805           ++s;
6806           if (is_space_char (*s))
6807             ++s;
6808           if (*s >= '0' && *s <= '7')
6809             {
6810               int fpr = *s - '0';
6811               ++s;
6812               if (is_space_char (*s))
6813                 ++s;
6814               if (*s == ')')
6815                 {
6816                   *end_op = s + 1;
6817                   r = hash_find (reg_hash, "st(0)");
6818                   know (r);
6819                   return r + fpr;
6820                 }
6821             }
6822           /* We have "%st(" then garbage.  */
6823           return (const reg_entry *) NULL;
6824         }
6825     }
6826
6827   /* Don't allow fake index register unless allow_index_reg isn't 0. */
6828   if (r != NULL
6829       && !allow_index_reg
6830       && (r->reg_num == RegEiz || r->reg_num == RegRiz))
6831     return (const reg_entry *) NULL;
6832
6833   if (r != NULL
6834       && ((r->reg_flags & (RegRex64 | RegRex))
6835           || r->reg_type.bitfield.reg64)
6836       && (!cpu_arch_flags.bitfield.cpulm
6837           || !UINTS_EQUAL (r->reg_type, control))
6838       && flag_code != CODE_64BIT)
6839     return (const reg_entry *) NULL;
6840
6841   return r;
6842 }
6843
6844 /* REG_STRING starts *before* REGISTER_PREFIX.  */
6845
6846 static const reg_entry *
6847 parse_register (char *reg_string, char **end_op)
6848 {
6849   const reg_entry *r;
6850
6851   if (*reg_string == REGISTER_PREFIX || allow_naked_reg)
6852     r = parse_real_register (reg_string, end_op);
6853   else
6854     r = NULL;
6855   if (!r)
6856     {
6857       char *save = input_line_pointer;
6858       char c;
6859       symbolS *symbolP;
6860
6861       input_line_pointer = reg_string;
6862       c = get_symbol_end ();
6863       symbolP = symbol_find (reg_string);
6864       if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
6865         {
6866           const expressionS *e = symbol_get_value_expression (symbolP);
6867
6868           know (e->X_op == O_register);
6869           know (e->X_add_number >= 0
6870                 && (valueT) e->X_add_number < i386_regtab_size);
6871           r = i386_regtab + e->X_add_number;
6872           *end_op = input_line_pointer;
6873         }
6874       *input_line_pointer = c;
6875       input_line_pointer = save;
6876     }
6877   return r;
6878 }
6879
6880 int
6881 i386_parse_name (char *name, expressionS *e, char *nextcharP)
6882 {
6883   const reg_entry *r;
6884   char *end = input_line_pointer;
6885
6886   *end = *nextcharP;
6887   r = parse_register (name, &input_line_pointer);
6888   if (r && end <= input_line_pointer)
6889     {
6890       *nextcharP = *input_line_pointer;
6891       *input_line_pointer = 0;
6892       e->X_op = O_register;
6893       e->X_add_number = r - i386_regtab;
6894       return 1;
6895     }
6896   input_line_pointer = end;
6897   *end = 0;
6898   return 0;
6899 }
6900
6901 void
6902 md_operand (expressionS *e)
6903 {
6904   if (*input_line_pointer == REGISTER_PREFIX)
6905     {
6906       char *end;
6907       const reg_entry *r = parse_real_register (input_line_pointer, &end);
6908
6909       if (r)
6910         {
6911           e->X_op = O_register;
6912           e->X_add_number = r - i386_regtab;
6913           input_line_pointer = end;
6914         }
6915     }
6916 }
6917
6918 \f
6919 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
6920 const char *md_shortopts = "kVQ:sqn";
6921 #else
6922 const char *md_shortopts = "qn";
6923 #endif
6924
6925 #define OPTION_32 (OPTION_MD_BASE + 0)
6926 #define OPTION_64 (OPTION_MD_BASE + 1)
6927 #define OPTION_DIVIDE (OPTION_MD_BASE + 2)
6928 #define OPTION_MARCH (OPTION_MD_BASE + 3)
6929 #define OPTION_MTUNE (OPTION_MD_BASE + 4)
6930 #define OPTION_MMNEMONIC (OPTION_MD_BASE + 5)
6931 #define OPTION_MSYNTAX (OPTION_MD_BASE + 6)
6932 #define OPTION_MINDEX_REG (OPTION_MD_BASE + 7)
6933 #define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
6934 #define OPTION_MOLD_GCC (OPTION_MD_BASE + 9)
6935
6936 struct option md_longopts[] =
6937 {
6938   {"32", no_argument, NULL, OPTION_32},
6939 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined(TE_PEP)
6940   {"64", no_argument, NULL, OPTION_64},
6941 #endif
6942   {"divide", no_argument, NULL, OPTION_DIVIDE},
6943   {"march", required_argument, NULL, OPTION_MARCH},
6944   {"mtune", required_argument, NULL, OPTION_MTUNE},
6945   {"mmnemonic", required_argument, NULL, OPTION_MMNEMONIC},
6946   {"msyntax", required_argument, NULL, OPTION_MSYNTAX},
6947   {"mindex-reg", no_argument, NULL, OPTION_MINDEX_REG},
6948   {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
6949   {"mold-gcc", no_argument, NULL, OPTION_MOLD_GCC},
6950   {NULL, no_argument, NULL, 0}
6951 };
6952 size_t md_longopts_size = sizeof (md_longopts);
6953
6954 int
6955 md_parse_option (int c, char *arg)
6956 {
6957   unsigned int i;
6958
6959   switch (c)
6960     {
6961     case 'n':
6962       optimize_align_code = 0;
6963       break;
6964
6965     case 'q':
6966       quiet_warnings = 1;
6967       break;
6968
6969 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
6970       /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
6971          should be emitted or not.  FIXME: Not implemented.  */
6972     case 'Q':
6973       break;
6974
6975       /* -V: SVR4 argument to print version ID.  */
6976     case 'V':
6977       print_version_id ();
6978       break;
6979
6980       /* -k: Ignore for FreeBSD compatibility.  */
6981     case 'k':
6982       break;
6983
6984     case 's':
6985       /* -s: On i386 Solaris, this tells the native assembler to use
6986          .stab instead of .stab.excl.  We always use .stab anyhow.  */
6987       break;
6988 #endif
6989 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined(TE_PEP)
6990     case OPTION_64:
6991       {
6992         const char **list, **l;
6993
6994         list = bfd_target_list ();
6995         for (l = list; *l != NULL; l++)
6996           if (CONST_STRNEQ (*l, "elf64-x86-64")
6997               || strcmp (*l, "coff-x86-64") == 0
6998               || strcmp (*l, "pe-x86-64") == 0
6999               || strcmp (*l, "pei-x86-64") == 0)
7000             {
7001               default_arch = "x86_64";
7002               break;
7003             }
7004         if (*l == NULL)
7005           as_fatal (_("No compiled in support for x86_64"));
7006         free (list);
7007       }
7008       break;
7009 #endif
7010
7011     case OPTION_32:
7012       default_arch = "i386";
7013       break;
7014
7015     case OPTION_DIVIDE:
7016 #ifdef SVR4_COMMENT_CHARS
7017       {
7018         char *n, *t;
7019         const char *s;
7020
7021         n = (char *) xmalloc (strlen (i386_comment_chars) + 1);
7022         t = n;
7023         for (s = i386_comment_chars; *s != '\0'; s++)
7024           if (*s != '/')
7025             *t++ = *s;
7026         *t = '\0';
7027         i386_comment_chars = n;
7028       }
7029 #endif
7030       break;
7031
7032     case OPTION_MARCH:
7033       if (*arg == '.')
7034         as_fatal (_("Invalid -march= option: `%s'"), arg);
7035       for (i = 0; i < ARRAY_SIZE (cpu_arch); i++)
7036         {
7037           if (strcmp (arg, cpu_arch [i].name) == 0)
7038             {
7039               cpu_arch_isa = cpu_arch[i].type;
7040               cpu_arch_isa_flags = cpu_arch[i].flags;
7041               if (!cpu_arch_tune_set)
7042                 {
7043                   cpu_arch_tune = cpu_arch_isa;
7044                   cpu_arch_tune_flags = cpu_arch_isa_flags;
7045                 }
7046               break;
7047             }
7048         }
7049       if (i >= ARRAY_SIZE (cpu_arch))
7050         as_fatal (_("Invalid -march= option: `%s'"), arg);
7051       break;
7052
7053     case OPTION_MTUNE:
7054       if (*arg == '.')
7055         as_fatal (_("Invalid -mtune= option: `%s'"), arg);
7056       for (i = 0; i < ARRAY_SIZE (cpu_arch); i++)
7057         {
7058           if (strcmp (arg, cpu_arch [i].name) == 0)
7059             {
7060               cpu_arch_tune_set = 1;
7061               cpu_arch_tune = cpu_arch [i].type;
7062               cpu_arch_tune_flags = cpu_arch[i].flags;
7063               break;
7064             }
7065         }
7066       if (i >= ARRAY_SIZE (cpu_arch))
7067         as_fatal (_("Invalid -mtune= option: `%s'"), arg);
7068       break;
7069
7070     case OPTION_MMNEMONIC:
7071       if (strcasecmp (arg, "att") == 0)
7072         intel_mnemonic = 0;
7073       else if (strcasecmp (arg, "intel") == 0)
7074         intel_mnemonic = 1;
7075       else
7076         as_fatal (_("Invalid -mmnemonic= option: `%s'"), arg);
7077       break;
7078
7079     case OPTION_MSYNTAX:
7080       if (strcasecmp (arg, "att") == 0)
7081         intel_syntax = 0;
7082       else if (strcasecmp (arg, "intel") == 0)
7083         intel_syntax = 1;
7084       else
7085         as_fatal (_("Invalid -msyntax= option: `%s'"), arg);
7086       break;
7087
7088     case OPTION_MINDEX_REG:
7089       allow_index_reg = 1;
7090       break;
7091
7092     case OPTION_MNAKED_REG:
7093       allow_naked_reg = 1;
7094       break;
7095
7096     case OPTION_MOLD_GCC:
7097       old_gcc = 1;
7098       break;
7099
7100     default:
7101       return 0;
7102     }
7103   return 1;
7104 }
7105
7106 void
7107 md_show_usage (stream)
7108      FILE *stream;
7109 {
7110 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7111   fprintf (stream, _("\
7112   -Q                      ignored\n\
7113   -V                      print assembler version number\n\
7114   -k                      ignored\n"));
7115 #endif
7116   fprintf (stream, _("\
7117   -n                      Do not optimize code alignment\n\
7118   -q                      quieten some warnings\n"));
7119 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7120   fprintf (stream, _("\
7121   -s                      ignored\n"));
7122 #endif
7123 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined(TE_PEP)
7124   fprintf (stream, _("\
7125   --32/--64               generate 32bit/64bit code\n"));
7126 #endif
7127 #ifdef SVR4_COMMENT_CHARS
7128   fprintf (stream, _("\
7129   --divide                do not treat `/' as a comment character\n"));
7130 #else
7131   fprintf (stream, _("\
7132   --divide                ignored\n"));
7133 #endif
7134   fprintf (stream, _("\
7135   -march=CPU/-mtune=CPU   generate code/optimize for CPU, where CPU is one of:\n\
7136                            i386, i486, pentium, pentiumpro, pentium4, nocona,\n\
7137                            core, core2, k6, athlon, k8, generic32, generic64\n"));
7138   fprintf (stream, _("\
7139   -mmnemonic=[att|intel]  use AT&T/Intel mnemonic\n"));
7140   fprintf (stream, _("\
7141   -msyntax=[att|intel]    use AT&T/Intel syntax\n"));
7142   fprintf (stream, _("\
7143   -mindex-reg             support pseudo index registers\n"));
7144   fprintf (stream, _("\
7145   -mnaked-reg             don't require `%%' prefix for registers\n"));
7146   fprintf (stream, _("\
7147   -mold-gcc               support old (<= 2.8.1) versions of gcc\n"));
7148 }
7149
7150 #if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
7151      || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) || defined (TE_PEP))
7152
7153 /* Pick the target format to use.  */
7154
7155 const char *
7156 i386_target_format (void)
7157 {
7158   if (!strcmp (default_arch, "x86_64"))
7159     {
7160       set_code_flag (CODE_64BIT);
7161       if (UINTS_ALL_ZERO (cpu_arch_isa_flags))
7162         {
7163           cpu_arch_isa_flags.bitfield.cpui186 = 1;
7164           cpu_arch_isa_flags.bitfield.cpui286 = 1;
7165           cpu_arch_isa_flags.bitfield.cpui386 = 1;
7166           cpu_arch_isa_flags.bitfield.cpui486 = 1;
7167           cpu_arch_isa_flags.bitfield.cpui586 = 1;
7168           cpu_arch_isa_flags.bitfield.cpui686 = 1;
7169           cpu_arch_isa_flags.bitfield.cpup4 = 1;
7170           cpu_arch_isa_flags.bitfield.cpummx= 1;
7171           cpu_arch_isa_flags.bitfield.cpummx2 = 1;
7172           cpu_arch_isa_flags.bitfield.cpusse = 1;
7173           cpu_arch_isa_flags.bitfield.cpusse2 = 1;
7174         }
7175       if (UINTS_ALL_ZERO (cpu_arch_tune_flags))
7176         {
7177           cpu_arch_tune_flags.bitfield.cpui186 = 1;
7178           cpu_arch_tune_flags.bitfield.cpui286 = 1;
7179           cpu_arch_tune_flags.bitfield.cpui386 = 1;
7180           cpu_arch_tune_flags.bitfield.cpui486 = 1;
7181           cpu_arch_tune_flags.bitfield.cpui586 = 1;
7182           cpu_arch_tune_flags.bitfield.cpui686 = 1;
7183           cpu_arch_tune_flags.bitfield.cpup4 = 1;
7184           cpu_arch_tune_flags.bitfield.cpummx= 1;
7185           cpu_arch_tune_flags.bitfield.cpummx2 = 1;
7186           cpu_arch_tune_flags.bitfield.cpusse = 1;
7187           cpu_arch_tune_flags.bitfield.cpusse2 = 1;
7188         }
7189     }
7190   else if (!strcmp (default_arch, "i386"))
7191     {
7192       set_code_flag (CODE_32BIT);
7193       if (UINTS_ALL_ZERO (cpu_arch_isa_flags))
7194         {
7195           cpu_arch_isa_flags.bitfield.cpui186 = 1;
7196           cpu_arch_isa_flags.bitfield.cpui286 = 1;
7197           cpu_arch_isa_flags.bitfield.cpui386 = 1;
7198         }
7199       if (UINTS_ALL_ZERO (cpu_arch_tune_flags))
7200         {
7201           cpu_arch_tune_flags.bitfield.cpui186 = 1;
7202           cpu_arch_tune_flags.bitfield.cpui286 = 1;
7203           cpu_arch_tune_flags.bitfield.cpui386 = 1;
7204         }
7205     }
7206   else
7207     as_fatal (_("Unknown architecture"));
7208   switch (OUTPUT_FLAVOR)
7209     {
7210 #ifdef TE_PEP
7211     case bfd_target_coff_flavour:
7212       return flag_code == CODE_64BIT ? COFF_TARGET_FORMAT : "coff-i386";
7213       break;
7214 #endif
7215 #ifdef OBJ_MAYBE_AOUT
7216     case bfd_target_aout_flavour:
7217       return AOUT_TARGET_FORMAT;
7218 #endif
7219 #ifdef OBJ_MAYBE_COFF
7220     case bfd_target_coff_flavour:
7221       return "coff-i386";
7222 #endif
7223 #if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
7224     case bfd_target_elf_flavour:
7225       {
7226         if (flag_code == CODE_64BIT)
7227           {
7228             object_64bit = 1;
7229             use_rela_relocations = 1;
7230           }
7231         return flag_code == CODE_64BIT ? ELF_TARGET_FORMAT64 : ELF_TARGET_FORMAT;
7232       }
7233 #endif
7234     default:
7235       abort ();
7236       return NULL;
7237     }
7238 }
7239
7240 #endif /* OBJ_MAYBE_ more than one  */
7241
7242 #if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
7243 void
7244 i386_elf_emit_arch_note (void)
7245 {
7246   if (IS_ELF && cpu_arch_name != NULL)
7247     {
7248       char *p;
7249       asection *seg = now_seg;
7250       subsegT subseg = now_subseg;
7251       Elf_Internal_Note i_note;
7252       Elf_External_Note e_note;
7253       asection *note_secp;
7254       int len;
7255
7256       /* Create the .note section.  */
7257       note_secp = subseg_new (".note", 0);
7258       bfd_set_section_flags (stdoutput,
7259                              note_secp,
7260                              SEC_HAS_CONTENTS | SEC_READONLY);
7261
7262       /* Process the arch string.  */
7263       len = strlen (cpu_arch_name);
7264
7265       i_note.namesz = len + 1;
7266       i_note.descsz = 0;
7267       i_note.type = NT_ARCH;
7268       p = frag_more (sizeof (e_note.namesz));
7269       md_number_to_chars (p, (valueT) i_note.namesz, sizeof (e_note.namesz));
7270       p = frag_more (sizeof (e_note.descsz));
7271       md_number_to_chars (p, (valueT) i_note.descsz, sizeof (e_note.descsz));
7272       p = frag_more (sizeof (e_note.type));
7273       md_number_to_chars (p, (valueT) i_note.type, sizeof (e_note.type));
7274       p = frag_more (len + 1);
7275       strcpy (p, cpu_arch_name);
7276
7277       frag_align (2, 0, 0);
7278
7279       subseg_set (seg, subseg);
7280     }
7281 }
7282 #endif
7283 \f
7284 symbolS *
7285 md_undefined_symbol (name)
7286      char *name;
7287 {
7288   if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
7289       && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
7290       && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
7291       && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
7292     {
7293       if (!GOT_symbol)
7294         {
7295           if (symbol_find (name))
7296             as_bad (_("GOT already in symbol table"));
7297           GOT_symbol = symbol_new (name, undefined_section,
7298                                    (valueT) 0, &zero_address_frag);
7299         };
7300       return GOT_symbol;
7301     }
7302   return 0;
7303 }
7304
7305 /* Round up a section size to the appropriate boundary.  */
7306
7307 valueT
7308 md_section_align (segment, size)
7309      segT segment ATTRIBUTE_UNUSED;
7310      valueT size;
7311 {
7312 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
7313   if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
7314     {
7315       /* For a.out, force the section size to be aligned.  If we don't do
7316          this, BFD will align it for us, but it will not write out the
7317          final bytes of the section.  This may be a bug in BFD, but it is
7318          easier to fix it here since that is how the other a.out targets
7319          work.  */
7320       int align;
7321
7322       align = bfd_get_section_alignment (stdoutput, segment);
7323       size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
7324     }
7325 #endif
7326
7327   return size;
7328 }
7329
7330 /* On the i386, PC-relative offsets are relative to the start of the
7331    next instruction.  That is, the address of the offset, plus its
7332    size, since the offset is always the last part of the insn.  */
7333
7334 long
7335 md_pcrel_from (fixS *fixP)
7336 {
7337   return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
7338 }
7339
7340 #ifndef I386COFF
7341
7342 static void
7343 s_bss (int ignore ATTRIBUTE_UNUSED)
7344 {
7345   int temp;
7346
7347 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
7348   if (IS_ELF)
7349     obj_elf_section_change_hook ();
7350 #endif
7351   temp = get_absolute_expression ();
7352   subseg_set (bss_section, (subsegT) temp);
7353   demand_empty_rest_of_line ();
7354 }
7355
7356 #endif
7357
7358 void
7359 i386_validate_fix (fixS *fixp)
7360 {
7361   if (fixp->fx_subsy && fixp->fx_subsy == GOT_symbol)
7362     {
7363       if (fixp->fx_r_type == BFD_RELOC_32_PCREL)
7364         {
7365           if (!object_64bit)
7366             abort ();
7367           fixp->fx_r_type = BFD_RELOC_X86_64_GOTPCREL;
7368         }
7369       else
7370         {
7371           if (!object_64bit)
7372             fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
7373           else
7374             fixp->fx_r_type = BFD_RELOC_X86_64_GOTOFF64;
7375         }
7376       fixp->fx_subsy = 0;
7377     }
7378 }
7379
7380 arelent *
7381 tc_gen_reloc (section, fixp)
7382      asection *section ATTRIBUTE_UNUSED;
7383      fixS *fixp;
7384 {
7385   arelent *rel;
7386   bfd_reloc_code_real_type code;
7387
7388   switch (fixp->fx_r_type)
7389     {
7390     case BFD_RELOC_X86_64_PLT32:
7391     case BFD_RELOC_X86_64_GOT32:
7392     case BFD_RELOC_X86_64_GOTPCREL:
7393     case BFD_RELOC_386_PLT32:
7394     case BFD_RELOC_386_GOT32:
7395     case BFD_RELOC_386_GOTOFF:
7396     case BFD_RELOC_386_GOTPC:
7397     case BFD_RELOC_386_TLS_GD:
7398     case BFD_RELOC_386_TLS_LDM:
7399     case BFD_RELOC_386_TLS_LDO_32:
7400     case BFD_RELOC_386_TLS_IE_32:
7401     case BFD_RELOC_386_TLS_IE:
7402     case BFD_RELOC_386_TLS_GOTIE:
7403     case BFD_RELOC_386_TLS_LE_32:
7404     case BFD_RELOC_386_TLS_LE:
7405     case BFD_RELOC_386_TLS_GOTDESC:
7406     case BFD_RELOC_386_TLS_DESC_CALL:
7407     case BFD_RELOC_X86_64_TLSGD:
7408     case BFD_RELOC_X86_64_TLSLD:
7409     case BFD_RELOC_X86_64_DTPOFF32:
7410     case BFD_RELOC_X86_64_DTPOFF64:
7411     case BFD_RELOC_X86_64_GOTTPOFF:
7412     case BFD_RELOC_X86_64_TPOFF32:
7413     case BFD_RELOC_X86_64_TPOFF64:
7414     case BFD_RELOC_X86_64_GOTOFF64:
7415     case BFD_RELOC_X86_64_GOTPC32:
7416     case BFD_RELOC_X86_64_GOT64:
7417     case BFD_RELOC_X86_64_GOTPCREL64:
7418     case BFD_RELOC_X86_64_GOTPC64:
7419     case BFD_RELOC_X86_64_GOTPLT64:
7420     case BFD_RELOC_X86_64_PLTOFF64:
7421     case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
7422     case BFD_RELOC_X86_64_TLSDESC_CALL:
7423     case BFD_RELOC_RVA:
7424     case BFD_RELOC_VTABLE_ENTRY:
7425     case BFD_RELOC_VTABLE_INHERIT:
7426 #ifdef TE_PE
7427     case BFD_RELOC_32_SECREL:
7428 #endif
7429       code = fixp->fx_r_type;
7430       break;
7431     case BFD_RELOC_X86_64_32S:
7432       if (!fixp->fx_pcrel)
7433         {
7434           /* Don't turn BFD_RELOC_X86_64_32S into BFD_RELOC_32.  */
7435           code = fixp->fx_r_type;
7436           break;
7437         }
7438     default:
7439       if (fixp->fx_pcrel)
7440         {
7441           switch (fixp->fx_size)
7442             {
7443             default:
7444               as_bad_where (fixp->fx_file, fixp->fx_line,
7445                             _("can not do %d byte pc-relative relocation"),
7446                             fixp->fx_size);
7447               code = BFD_RELOC_32_PCREL;
7448               break;
7449             case 1: code = BFD_RELOC_8_PCREL;  break;
7450             case 2: code = BFD_RELOC_16_PCREL; break;
7451             case 4: code = BFD_RELOC_32_PCREL; break;
7452 #ifdef BFD64
7453             case 8: code = BFD_RELOC_64_PCREL; break;
7454 #endif
7455             }
7456         }
7457       else
7458         {
7459           switch (fixp->fx_size)
7460             {
7461             default:
7462               as_bad_where (fixp->fx_file, fixp->fx_line,
7463                             _("can not do %d byte relocation"),
7464                             fixp->fx_size);
7465               code = BFD_RELOC_32;
7466               break;
7467             case 1: code = BFD_RELOC_8;  break;
7468             case 2: code = BFD_RELOC_16; break;
7469             case 4: code = BFD_RELOC_32; break;
7470 #ifdef BFD64
7471             case 8: code = BFD_RELOC_64; break;
7472 #endif
7473             }
7474         }
7475       break;
7476     }
7477
7478   if ((code == BFD_RELOC_32
7479        || code == BFD_RELOC_32_PCREL
7480        || code == BFD_RELOC_X86_64_32S)
7481       && GOT_symbol
7482       && fixp->fx_addsy == GOT_symbol)
7483     {
7484       if (!object_64bit)
7485         code = BFD_RELOC_386_GOTPC;
7486       else
7487         code = BFD_RELOC_X86_64_GOTPC32;
7488     }
7489   if ((code == BFD_RELOC_64 || code == BFD_RELOC_64_PCREL)
7490       && GOT_symbol
7491       && fixp->fx_addsy == GOT_symbol)
7492     {
7493       code = BFD_RELOC_X86_64_GOTPC64;
7494     }
7495
7496   rel = (arelent *) xmalloc (sizeof (arelent));
7497   rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
7498   *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
7499
7500   rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
7501
7502   if (!use_rela_relocations)
7503     {
7504       /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
7505          vtable entry to be used in the relocation's section offset.  */
7506       if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
7507         rel->address = fixp->fx_offset;
7508
7509       rel->addend = 0;
7510     }
7511   /* Use the rela in 64bit mode.  */
7512   else
7513     {
7514       if (!fixp->fx_pcrel)
7515         rel->addend = fixp->fx_offset;
7516       else
7517         switch (code)
7518           {
7519           case BFD_RELOC_X86_64_PLT32:
7520           case BFD_RELOC_X86_64_GOT32:
7521           case BFD_RELOC_X86_64_GOTPCREL:
7522           case BFD_RELOC_X86_64_TLSGD:
7523           case BFD_RELOC_X86_64_TLSLD:
7524           case BFD_RELOC_X86_64_GOTTPOFF:
7525           case BFD_RELOC_X86_64_GOTPC32_TLSDESC:
7526           case BFD_RELOC_X86_64_TLSDESC_CALL:
7527             rel->addend = fixp->fx_offset - fixp->fx_size;
7528             break;
7529           default:
7530             rel->addend = (section->vma
7531                            - fixp->fx_size
7532                            + fixp->fx_addnumber
7533                            + md_pcrel_from (fixp));
7534             break;
7535           }
7536     }
7537
7538   rel->howto = bfd_reloc_type_lookup (stdoutput, code);
7539   if (rel->howto == NULL)
7540     {
7541       as_bad_where (fixp->fx_file, fixp->fx_line,
7542                     _("cannot represent relocation type %s"),
7543                     bfd_get_reloc_code_name (code));
7544       /* Set howto to a garbage value so that we can keep going.  */
7545       rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
7546       assert (rel->howto != NULL);
7547     }
7548
7549   return rel;
7550 }
7551
7552 \f
7553 /* Parse operands using Intel syntax. This implements a recursive descent
7554    parser based on the BNF grammar published in Appendix B of the MASM 6.1
7555    Programmer's Guide.
7556
7557    FIXME: We do not recognize the full operand grammar defined in the MASM
7558           documentation.  In particular, all the structure/union and
7559           high-level macro operands are missing.
7560
7561    Uppercase words are terminals, lower case words are non-terminals.
7562    Objects surrounded by double brackets '[[' ']]' are optional. Vertical
7563    bars '|' denote choices. Most grammar productions are implemented in
7564    functions called 'intel_<production>'.
7565
7566    Initial production is 'expr'.
7567
7568     addOp               + | -
7569
7570     alpha               [a-zA-Z]
7571
7572     binOp               & | AND | \| | OR | ^ | XOR
7573
7574     byteRegister        AL | AH | BL | BH | CL | CH | DL | DH
7575
7576     constant            digits [[ radixOverride ]]
7577
7578     dataType            BYTE | WORD | DWORD | FWORD | QWORD | TBYTE | OWORD | XMMWORD
7579
7580     digits              decdigit
7581                         | digits decdigit
7582                         | digits hexdigit
7583
7584     decdigit            [0-9]
7585
7586     e04                 e04 addOp e05
7587                         | e05
7588
7589     e05                 e05 binOp e06
7590                         | e06
7591
7592     e06                 e06 mulOp e09
7593                         | e09
7594
7595     e09                 OFFSET e10
7596                         | SHORT e10
7597                         | + e10
7598                         | - e10
7599                         | ~ e10
7600                         | NOT e10
7601                         | e09 PTR e10
7602                         | e09 : e10
7603                         | e10
7604
7605     e10                 e10 [ expr ]
7606                         | e11
7607
7608     e11                 ( expr )
7609                         | [ expr ]
7610                         | constant
7611                         | dataType
7612                         | id
7613                         | $
7614                         | register
7615
7616  => expr                expr cmpOp e04
7617                         | e04
7618
7619     gpRegister          AX | EAX | BX | EBX | CX | ECX | DX | EDX
7620                         | BP | EBP | SP | ESP | DI | EDI | SI | ESI
7621
7622     hexdigit            a | b | c | d | e | f
7623                         | A | B | C | D | E | F
7624
7625     id                  alpha
7626                         | id alpha
7627                         | id decdigit
7628
7629     mulOp               * | / | % | MOD | << | SHL | >> | SHR
7630
7631     quote               " | '
7632
7633     register            specialRegister
7634                         | gpRegister
7635                         | byteRegister
7636
7637     segmentRegister     CS | DS | ES | FS | GS | SS
7638
7639     specialRegister     CR0 | CR2 | CR3 | CR4
7640                         | DR0 | DR1 | DR2 | DR3 | DR6 | DR7
7641                         | TR3 | TR4 | TR5 | TR6 | TR7
7642
7643     We simplify the grammar in obvious places (e.g., register parsing is
7644     done by calling parse_register) and eliminate immediate left recursion
7645     to implement a recursive-descent parser.
7646
7647     expr        e04 expr'
7648
7649     expr'       cmpOp e04 expr'
7650                 | Empty
7651
7652     e04         e05 e04'
7653
7654     e04'        addOp e05 e04'
7655                 | Empty
7656
7657     e05         e06 e05'
7658
7659     e05'        binOp e06 e05'
7660                 | Empty
7661
7662     e06         e09 e06'
7663
7664     e06'        mulOp e09 e06'
7665                 | Empty
7666
7667     e09         OFFSET e10 e09'
7668                 | SHORT e10'
7669                 | + e10'
7670                 | - e10'
7671                 | ~ e10'
7672                 | NOT e10'
7673                 | e10 e09'
7674
7675     e09'        PTR e10 e09'
7676                 | : e10 e09'
7677                 | Empty
7678
7679     e10         e11 e10'
7680
7681     e10'        [ expr ] e10'
7682                 | Empty
7683
7684     e11         ( expr )
7685                 | [ expr ]
7686                 | BYTE
7687                 | WORD
7688                 | DWORD
7689                 | FWORD
7690                 | QWORD
7691                 | TBYTE
7692                 | OWORD
7693                 | XMMWORD
7694                 | .
7695                 | $
7696                 | register
7697                 | id
7698                 | constant  */
7699
7700 /* Parsing structure for the intel syntax parser. Used to implement the
7701    semantic actions for the operand grammar.  */
7702 struct intel_parser_s
7703   {
7704     char *op_string;            /* The string being parsed.  */
7705     int got_a_float;            /* Whether the operand is a float.  */
7706     int op_modifier;            /* Operand modifier.  */
7707     int is_mem;                 /* 1 if operand is memory reference.  */
7708     int in_offset;              /* >=1 if parsing operand of offset.  */
7709     int in_bracket;             /* >=1 if parsing operand in brackets.  */
7710     const reg_entry *reg;       /* Last register reference found.  */
7711     char *disp;                 /* Displacement string being built.  */
7712     char *next_operand;         /* Resume point when splitting operands.  */
7713   };
7714
7715 static struct intel_parser_s intel_parser;
7716
7717 /* Token structure for parsing intel syntax.  */
7718 struct intel_token
7719   {
7720     int code;                   /* Token code.  */
7721     const reg_entry *reg;       /* Register entry for register tokens.  */
7722     char *str;                  /* String representation.  */
7723   };
7724
7725 static struct intel_token cur_token, prev_token;
7726
7727 /* Token codes for the intel parser. Since T_SHORT is already used
7728    by COFF, undefine it first to prevent a warning.  */
7729 #define T_NIL           -1
7730 #define T_CONST         1
7731 #define T_REG           2
7732 #define T_BYTE          3
7733 #define T_WORD          4
7734 #define T_DWORD         5
7735 #define T_FWORD         6
7736 #define T_QWORD         7
7737 #define T_TBYTE         8
7738 #define T_XMMWORD       9
7739 #undef  T_SHORT
7740 #define T_SHORT         10
7741 #define T_OFFSET        11
7742 #define T_PTR           12
7743 #define T_ID            13
7744 #define T_SHL           14
7745 #define T_SHR           15
7746
7747 /* Prototypes for intel parser functions.  */
7748 static int intel_match_token (int);
7749 static void intel_putback_token (void);
7750 static void intel_get_token (void);
7751 static int intel_expr (void);
7752 static int intel_e04 (void);
7753 static int intel_e05 (void);
7754 static int intel_e06 (void);
7755 static int intel_e09 (void);
7756 static int intel_e10 (void);
7757 static int intel_e11 (void);
7758
7759 static int
7760 i386_intel_operand (char *operand_string, int got_a_float)
7761 {
7762   int ret;
7763   char *p;
7764
7765   p = intel_parser.op_string = xstrdup (operand_string);
7766   intel_parser.disp = (char *) xmalloc (strlen (operand_string) + 1);
7767
7768   for (;;)
7769     {
7770       /* Initialize token holders.  */
7771       cur_token.code = prev_token.code = T_NIL;
7772       cur_token.reg = prev_token.reg = NULL;
7773       cur_token.str = prev_token.str = NULL;
7774
7775       /* Initialize parser structure.  */
7776       intel_parser.got_a_float = got_a_float;
7777       intel_parser.op_modifier = 0;
7778       intel_parser.is_mem = 0;
7779       intel_parser.in_offset = 0;
7780       intel_parser.in_bracket = 0;
7781       intel_parser.reg = NULL;
7782       intel_parser.disp[0] = '\0';
7783       intel_parser.next_operand = NULL;
7784
7785       /* Read the first token and start the parser.  */
7786       intel_get_token ();
7787       ret = intel_expr ();
7788
7789       if (!ret)
7790         break;
7791
7792       if (cur_token.code != T_NIL)
7793         {
7794           as_bad (_("invalid operand for '%s' ('%s' unexpected)"),
7795                   current_templates->start->name, cur_token.str);
7796           ret = 0;
7797         }
7798       /* If we found a memory reference, hand it over to i386_displacement
7799          to fill in the rest of the operand fields.  */
7800       else if (intel_parser.is_mem)
7801         {
7802           if ((i.mem_operands == 1
7803                && !current_templates->start->opcode_modifier.isstring)
7804               || i.mem_operands == 2)
7805             {
7806               as_bad (_("too many memory references for '%s'"),
7807                       current_templates->start->name);
7808               ret = 0;
7809             }
7810           else
7811             {
7812               char *s = intel_parser.disp;
7813               i.mem_operands++;
7814
7815               if (!quiet_warnings && intel_parser.is_mem < 0)
7816                 /* See the comments in intel_bracket_expr.  */
7817                 as_warn (_("Treating `%s' as memory reference"), operand_string);
7818
7819               /* Add the displacement expression.  */
7820               if (*s != '\0')
7821                 ret = i386_displacement (s, s + strlen (s));
7822               if (ret)
7823                 {
7824                   /* Swap base and index in 16-bit memory operands like
7825                      [si+bx]. Since i386_index_check is also used in AT&T
7826                      mode we have to do that here.  */
7827                   if (i.base_reg
7828                       && i.index_reg
7829                       && i.base_reg->reg_type.bitfield.reg16
7830                       && i.index_reg->reg_type.bitfield.reg16
7831                       && i.base_reg->reg_num >= 6
7832                       && i.index_reg->reg_num < 6)
7833                     {
7834                       const reg_entry *base = i.index_reg;
7835
7836                       i.index_reg = i.base_reg;
7837                       i.base_reg = base;
7838                     }
7839                   ret = i386_index_check (operand_string);
7840                 }
7841             }
7842         }
7843
7844       /* Constant and OFFSET expressions are handled by i386_immediate.  */
7845       else if ((intel_parser.op_modifier & (1 << T_OFFSET))
7846                || intel_parser.reg == NULL)
7847         ret = i386_immediate (intel_parser.disp);
7848
7849       if (intel_parser.next_operand && this_operand >= MAX_OPERANDS - 1)
7850         ret = 0;
7851       if (!ret || !intel_parser.next_operand)
7852         break;
7853       intel_parser.op_string = intel_parser.next_operand;
7854       this_operand = i.operands++;
7855     }
7856
7857   free (p);
7858   free (intel_parser.disp);
7859
7860   return ret;
7861 }
7862
7863 #define NUM_ADDRESS_REGS (!!i.base_reg + !!i.index_reg)
7864
7865 /* expr e04 expr'
7866
7867    expr'  cmpOp e04 expr'
7868         | Empty  */
7869 static int
7870 intel_expr (void)
7871 {
7872   /* XXX Implement the comparison operators.  */
7873   return intel_e04 ();
7874 }
7875
7876 /* e04  e05 e04'
7877
7878    e04' addOp e05 e04'
7879         | Empty  */
7880 static int
7881 intel_e04 (void)
7882 {
7883   int nregs = -1;
7884
7885   for (;;)
7886     {
7887       if (!intel_e05())
7888         return 0;
7889
7890       if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
7891         i.base_reg = i386_regtab + REGNAM_AL; /* al is invalid as base */
7892
7893       if (cur_token.code == '+')
7894         nregs = -1;
7895       else if (cur_token.code == '-')
7896         nregs = NUM_ADDRESS_REGS;
7897       else
7898         return 1;
7899
7900       strcat (intel_parser.disp, cur_token.str);
7901       intel_match_token (cur_token.code);
7902     }
7903 }
7904
7905 /* e05  e06 e05'
7906
7907    e05' binOp e06 e05'
7908         | Empty  */
7909 static int
7910 intel_e05 (void)
7911 {
7912   int nregs = ~NUM_ADDRESS_REGS;
7913
7914   for (;;)
7915     {
7916       if (!intel_e06())
7917         return 0;
7918
7919       if (cur_token.code == '&'
7920           || cur_token.code == '|'
7921           || cur_token.code == '^')
7922         {
7923           char str[2];
7924
7925           str[0] = cur_token.code;
7926           str[1] = 0;
7927           strcat (intel_parser.disp, str);
7928         }
7929       else
7930         break;
7931
7932       intel_match_token (cur_token.code);
7933
7934       if (nregs < 0)
7935         nregs = ~nregs;
7936     }
7937   if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
7938     i.base_reg = i386_regtab + REGNAM_AL + 1; /* cl is invalid as base */
7939   return 1;
7940 }
7941
7942 /* e06  e09 e06'
7943
7944    e06' mulOp e09 e06'
7945         | Empty  */
7946 static int
7947 intel_e06 (void)
7948 {
7949   int nregs = ~NUM_ADDRESS_REGS;
7950
7951   for (;;)
7952     {
7953       if (!intel_e09())
7954         return 0;
7955
7956       if (cur_token.code == '*'
7957           || cur_token.code == '/'
7958           || cur_token.code == '%')
7959         {
7960           char str[2];
7961
7962           str[0] = cur_token.code;
7963           str[1] = 0;
7964           strcat (intel_parser.disp, str);
7965         }
7966       else if (cur_token.code == T_SHL)
7967         strcat (intel_parser.disp, "<<");
7968       else if (cur_token.code == T_SHR)
7969         strcat (intel_parser.disp, ">>");
7970       else
7971         break;
7972
7973       intel_match_token (cur_token.code);
7974
7975       if (nregs < 0)
7976         nregs = ~nregs;
7977     }
7978   if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
7979     i.base_reg = i386_regtab + REGNAM_AL + 2; /* dl is invalid as base */
7980   return 1;
7981 }
7982
7983 /* e09  OFFSET e09
7984         | SHORT e09
7985         | + e09
7986         | - e09
7987         | ~ e09
7988         | NOT e09
7989         | e10 e09'
7990
7991    e09' PTR e10 e09'
7992         | : e10 e09'
7993         | Empty */
7994 static int
7995 intel_e09 (void)
7996 {
7997   int nregs = ~NUM_ADDRESS_REGS;
7998   int in_offset = 0;
7999
8000   for (;;)
8001     {
8002       /* Don't consume constants here.  */
8003       if (cur_token.code == '+' || cur_token.code == '-')
8004         {
8005           /* Need to look one token ahead - if the next token
8006              is a constant, the current token is its sign.  */
8007           int next_code;
8008
8009           intel_match_token (cur_token.code);
8010           next_code = cur_token.code;
8011           intel_putback_token ();
8012           if (next_code == T_CONST)
8013             break;
8014         }
8015
8016       /* e09  OFFSET e09  */
8017       if (cur_token.code == T_OFFSET)
8018         {
8019           if (!in_offset++)
8020             ++intel_parser.in_offset;
8021         }
8022
8023       /* e09  SHORT e09  */
8024       else if (cur_token.code == T_SHORT)
8025         intel_parser.op_modifier |= 1 << T_SHORT;
8026
8027       /* e09  + e09  */
8028       else if (cur_token.code == '+')
8029         strcat (intel_parser.disp, "+");
8030
8031       /* e09  - e09
8032               | ~ e09
8033               | NOT e09  */
8034       else if (cur_token.code == '-' || cur_token.code == '~')
8035         {
8036           char str[2];
8037
8038           if (nregs < 0)
8039             nregs = ~nregs;
8040           str[0] = cur_token.code;
8041           str[1] = 0;
8042           strcat (intel_parser.disp, str);
8043         }
8044
8045       /* e09  e10 e09'  */
8046       else
8047         break;
8048
8049       intel_match_token (cur_token.code);
8050     }
8051
8052   for (;;)
8053     {
8054       if (!intel_e10 ())
8055         return 0;
8056
8057       /* e09'  PTR e10 e09' */
8058       if (cur_token.code == T_PTR)
8059         {
8060           char suffix;
8061
8062           if (prev_token.code == T_BYTE)
8063             suffix = BYTE_MNEM_SUFFIX;
8064
8065           else if (prev_token.code == T_WORD)
8066             {
8067               if (current_templates->start->name[0] == 'l'
8068                   && current_templates->start->name[2] == 's'
8069                   && current_templates->start->name[3] == 0)
8070                 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
8071               else if (intel_parser.got_a_float == 2)   /* "fi..." */
8072                 suffix = SHORT_MNEM_SUFFIX;
8073               else
8074                 suffix = WORD_MNEM_SUFFIX;
8075             }
8076
8077           else if (prev_token.code == T_DWORD)
8078             {
8079               if (current_templates->start->name[0] == 'l'
8080                   && current_templates->start->name[2] == 's'
8081                   && current_templates->start->name[3] == 0)
8082                 suffix = WORD_MNEM_SUFFIX;
8083               else if (flag_code == CODE_16BIT
8084                        && (current_templates->start->opcode_modifier.jump
8085                            || current_templates->start->opcode_modifier.jumpdword))
8086                 suffix = LONG_DOUBLE_MNEM_SUFFIX;
8087               else if (intel_parser.got_a_float == 1)   /* "f..." */
8088                 suffix = SHORT_MNEM_SUFFIX;
8089               else
8090                 suffix = LONG_MNEM_SUFFIX;
8091             }
8092
8093           else if (prev_token.code == T_FWORD)
8094             {
8095               if (current_templates->start->name[0] == 'l'
8096                   && current_templates->start->name[2] == 's'
8097                   && current_templates->start->name[3] == 0)
8098                 suffix = LONG_MNEM_SUFFIX;
8099               else if (!intel_parser.got_a_float)
8100                 {
8101                   if (flag_code == CODE_16BIT)
8102                     add_prefix (DATA_PREFIX_OPCODE);
8103                   suffix = LONG_DOUBLE_MNEM_SUFFIX;
8104                 }
8105               else
8106                 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
8107             }
8108
8109           else if (prev_token.code == T_QWORD)
8110             {
8111               if (intel_parser.got_a_float == 1)        /* "f..." */
8112                 suffix = LONG_MNEM_SUFFIX;
8113               else
8114                 suffix = QWORD_MNEM_SUFFIX;
8115             }
8116
8117           else if (prev_token.code == T_TBYTE)
8118             {
8119               if (intel_parser.got_a_float == 1)
8120                 suffix = LONG_DOUBLE_MNEM_SUFFIX;
8121               else
8122                 suffix = BYTE_MNEM_SUFFIX; /* so it will cause an error */
8123             }
8124
8125           else if (prev_token.code == T_XMMWORD)
8126             {
8127               suffix = XMMWORD_MNEM_SUFFIX;
8128             }
8129
8130           else
8131             {
8132               as_bad (_("Unknown operand modifier `%s'"), prev_token.str);
8133               return 0;
8134             }
8135
8136           /* Operands for jump/call using 'ptr' notation denote absolute
8137              addresses.  */
8138           if (current_templates->start->opcode_modifier.jump
8139               || current_templates->start->opcode_modifier.jumpdword)
8140             i.types[this_operand].bitfield.jumpabsolute = 1;
8141
8142           if (current_templates->start->base_opcode == 0x8d /* lea */)
8143             ;
8144           else if (!i.suffix)
8145             i.suffix = suffix;
8146           else if (i.suffix != suffix)
8147             {
8148               as_bad (_("Conflicting operand modifiers"));
8149               return 0;
8150             }
8151
8152         }
8153
8154       /* e09'  : e10 e09'  */
8155       else if (cur_token.code == ':')
8156         {
8157           if (prev_token.code != T_REG)
8158             {
8159               /* While {call,jmp} SSSS:OOOO is MASM syntax only when SSSS is a
8160                  segment/group identifier (which we don't have), using comma
8161                  as the operand separator there is even less consistent, since
8162                  there all branches only have a single operand.  */
8163               if (this_operand != 0
8164                   || intel_parser.in_offset
8165                   || intel_parser.in_bracket
8166                   || (!current_templates->start->opcode_modifier.jump
8167                       && !current_templates->start->opcode_modifier.jumpdword
8168                       && !current_templates->start->opcode_modifier.jumpintersegment
8169                       && !current_templates->start->operand_types[0].bitfield.jumpabsolute))
8170                 return intel_match_token (T_NIL);
8171               /* Remember the start of the 2nd operand and terminate 1st
8172                  operand here.
8173                  XXX This isn't right, yet (when SSSS:OOOO is right operand of
8174                  another expression), but it gets at least the simplest case
8175                  (a plain number or symbol on the left side) right.  */
8176               intel_parser.next_operand = intel_parser.op_string;
8177               *--intel_parser.op_string = '\0';
8178               return intel_match_token (':');
8179             }
8180         }
8181
8182       /* e09'  Empty  */
8183       else
8184         break;
8185
8186       intel_match_token (cur_token.code);
8187
8188     }
8189
8190   if (in_offset)
8191     {
8192       --intel_parser.in_offset;
8193       if (nregs < 0)
8194         nregs = ~nregs;
8195       if (NUM_ADDRESS_REGS > nregs)
8196         {
8197           as_bad (_("Invalid operand to `OFFSET'"));
8198           return 0;
8199         }
8200       intel_parser.op_modifier |= 1 << T_OFFSET;
8201     }
8202
8203   if (nregs >= 0 && NUM_ADDRESS_REGS > nregs)
8204     i.base_reg = i386_regtab + REGNAM_AL + 3; /* bl is invalid as base */
8205   return 1;
8206 }
8207
8208 static int
8209 intel_bracket_expr (void)
8210 {
8211   int was_offset = intel_parser.op_modifier & (1 << T_OFFSET);
8212   const char *start = intel_parser.op_string;
8213   int len;
8214
8215   if (i.op[this_operand].regs)
8216     return intel_match_token (T_NIL);
8217
8218   intel_match_token ('[');
8219
8220   /* Mark as a memory operand only if it's not already known to be an
8221      offset expression.  If it's an offset expression, we need to keep
8222      the brace in.  */
8223   if (!intel_parser.in_offset)
8224     {
8225       ++intel_parser.in_bracket;
8226
8227       /* Operands for jump/call inside brackets denote absolute addresses.  */
8228       if (current_templates->start->opcode_modifier.jump
8229           || current_templates->start->opcode_modifier.jumpdword)
8230         i.types[this_operand].bitfield.jumpabsolute = 1;
8231
8232       /* Unfortunately gas always diverged from MASM in a respect that can't
8233          be easily fixed without risking to break code sequences likely to be
8234          encountered (the testsuite even check for this): MASM doesn't consider
8235          an expression inside brackets unconditionally as a memory reference.
8236          When that is e.g. a constant, an offset expression, or the sum of the
8237          two, this is still taken as a constant load. gas, however, always
8238          treated these as memory references. As a compromise, we'll try to make
8239          offset expressions inside brackets work the MASM way (since that's
8240          less likely to be found in real world code), but make constants alone
8241          continue to work the traditional gas way. In either case, issue a
8242          warning.  */
8243       intel_parser.op_modifier &= ~was_offset;
8244     }
8245   else
8246     strcat (intel_parser.disp, "[");
8247
8248   /* Add a '+' to the displacement string if necessary.  */
8249   if (*intel_parser.disp != '\0'
8250       && *(intel_parser.disp + strlen (intel_parser.disp) - 1) != '+')
8251     strcat (intel_parser.disp, "+");
8252
8253   if (intel_expr ()
8254       && (len = intel_parser.op_string - start - 1,
8255           intel_match_token (']')))
8256     {
8257       /* Preserve brackets when the operand is an offset expression.  */
8258       if (intel_parser.in_offset)
8259         strcat (intel_parser.disp, "]");
8260       else
8261         {
8262           --intel_parser.in_bracket;
8263           if (i.base_reg || i.index_reg)
8264             intel_parser.is_mem = 1;
8265           if (!intel_parser.is_mem)
8266             {
8267               if (!(intel_parser.op_modifier & (1 << T_OFFSET)))
8268                 /* Defer the warning until all of the operand was parsed.  */
8269                 intel_parser.is_mem = -1;
8270               else if (!quiet_warnings)
8271                 as_warn (_("`[%.*s]' taken to mean just `%.*s'"),
8272                          len, start, len, start);
8273             }
8274         }
8275       intel_parser.op_modifier |= was_offset;
8276
8277       return 1;
8278     }
8279   return 0;
8280 }
8281
8282 /* e10  e11 e10'
8283
8284    e10' [ expr ] e10'
8285         | Empty  */
8286 static int
8287 intel_e10 (void)
8288 {
8289   if (!intel_e11 ())
8290     return 0;
8291
8292   while (cur_token.code == '[')
8293     {
8294       if (!intel_bracket_expr ())
8295         return 0;
8296     }
8297
8298   return 1;
8299 }
8300
8301 /* e11  ( expr )
8302         | [ expr ]
8303         | BYTE
8304         | WORD
8305         | DWORD
8306         | FWORD
8307         | QWORD
8308         | TBYTE
8309         | OWORD
8310         | XMMWORD
8311         | $
8312         | .
8313         | register
8314         | id
8315         | constant  */
8316 static int
8317 intel_e11 (void)
8318 {
8319   switch (cur_token.code)
8320     {
8321     /* e11  ( expr ) */
8322     case '(':
8323       intel_match_token ('(');
8324       strcat (intel_parser.disp, "(");
8325
8326       if (intel_expr () && intel_match_token (')'))
8327         {
8328           strcat (intel_parser.disp, ")");
8329           return 1;
8330         }
8331       return 0;
8332
8333     /* e11  [ expr ] */
8334     case '[':
8335       return intel_bracket_expr ();
8336
8337     /* e11  $
8338             | .  */
8339     case '.':
8340       strcat (intel_parser.disp, cur_token.str);
8341       intel_match_token (cur_token.code);
8342
8343       /* Mark as a memory operand only if it's not already known to be an
8344          offset expression.  */
8345       if (!intel_parser.in_offset)
8346         intel_parser.is_mem = 1;
8347
8348       return 1;
8349
8350     /* e11  register  */
8351     case T_REG:
8352       {
8353         const reg_entry *reg = intel_parser.reg = cur_token.reg;
8354
8355         intel_match_token (T_REG);
8356
8357         /* Check for segment change.  */
8358         if (cur_token.code == ':')
8359           {
8360             if (!reg->reg_type.bitfield.sreg2
8361                 && !reg->reg_type.bitfield.sreg3)
8362               {
8363                 as_bad (_("`%s' is not a valid segment register"),
8364                         reg->reg_name);
8365                 return 0;
8366               }
8367             else if (i.seg[i.mem_operands])
8368               as_warn (_("Extra segment override ignored"));
8369             else
8370               {
8371                 if (!intel_parser.in_offset)
8372                   intel_parser.is_mem = 1;
8373                 switch (reg->reg_num)
8374                   {
8375                   case 0:
8376                     i.seg[i.mem_operands] = &es;
8377                     break;
8378                   case 1:
8379                     i.seg[i.mem_operands] = &cs;
8380                     break;
8381                   case 2:
8382                     i.seg[i.mem_operands] = &ss;
8383                     break;
8384                   case 3:
8385                     i.seg[i.mem_operands] = &ds;
8386                     break;
8387                   case 4:
8388                     i.seg[i.mem_operands] = &fs;
8389                     break;
8390                   case 5:
8391                     i.seg[i.mem_operands] = &gs;
8392                     break;
8393                   }
8394               }
8395           }
8396
8397         /* Not a segment register. Check for register scaling.  */
8398         else if (cur_token.code == '*')
8399           {
8400             if (!intel_parser.in_bracket)
8401               {
8402                 as_bad (_("Register scaling only allowed in memory operands"));
8403                 return 0;
8404               }
8405
8406             if (reg->reg_type.bitfield.reg16) /* Disallow things like [si*1]. */
8407               reg = i386_regtab + REGNAM_AX + 4; /* sp is invalid as index */
8408             else if (i.index_reg)
8409               reg = i386_regtab + REGNAM_EAX + 4; /* esp is invalid as index */
8410
8411             /* What follows must be a valid scale.  */
8412             intel_match_token ('*');
8413             i.index_reg = reg;
8414             i.types[this_operand].bitfield.baseindex = 1;
8415
8416             /* Set the scale after setting the register (otherwise,
8417                i386_scale will complain)  */
8418             if (cur_token.code == '+' || cur_token.code == '-')
8419               {
8420                 char *str, sign = cur_token.code;
8421                 intel_match_token (cur_token.code);
8422                 if (cur_token.code != T_CONST)
8423                   {
8424                     as_bad (_("Syntax error: Expecting a constant, got `%s'"),
8425                             cur_token.str);
8426                     return 0;
8427                   }
8428                 str = (char *) xmalloc (strlen (cur_token.str) + 2);
8429                 strcpy (str + 1, cur_token.str);
8430                 *str = sign;
8431                 if (!i386_scale (str))
8432                   return 0;
8433                 free (str);
8434               }
8435             else if (!i386_scale (cur_token.str))
8436               return 0;
8437             intel_match_token (cur_token.code);
8438           }
8439
8440         /* No scaling. If this is a memory operand, the register is either a
8441            base register (first occurrence) or an index register (second
8442            occurrence).  */
8443         else if (intel_parser.in_bracket)
8444           {
8445
8446             if (!i.base_reg)
8447               i.base_reg = reg;
8448             else if (!i.index_reg)
8449               i.index_reg = reg;
8450             else
8451               {
8452                 as_bad (_("Too many register references in memory operand"));
8453                 return 0;
8454               }
8455
8456             i.types[this_operand].bitfield.baseindex = 1;
8457           }
8458
8459         /* It's neither base nor index.  */
8460         else if (!intel_parser.in_offset && !intel_parser.is_mem)
8461           {
8462             i386_operand_type temp = reg->reg_type;
8463             temp.bitfield.baseindex = 0;
8464             i.types[this_operand] = operand_type_or (i.types[this_operand],
8465                                                      temp);
8466             i.op[this_operand].regs = reg;
8467             i.reg_operands++;
8468           }
8469         else
8470           {
8471             as_bad (_("Invalid use of register"));
8472             return 0;
8473           }
8474
8475         /* Since registers are not part of the displacement string (except
8476            when we're parsing offset operands), we may need to remove any
8477            preceding '+' from the displacement string.  */
8478         if (*intel_parser.disp != '\0'
8479             && !intel_parser.in_offset)
8480           {
8481             char *s = intel_parser.disp;
8482             s += strlen (s) - 1;
8483             if (*s == '+')
8484               *s = '\0';
8485           }
8486
8487         return 1;
8488       }
8489
8490     /* e11  BYTE
8491             | WORD
8492             | DWORD
8493             | FWORD
8494             | QWORD
8495             | TBYTE
8496             | OWORD
8497             | XMMWORD  */
8498     case T_BYTE:
8499     case T_WORD:
8500     case T_DWORD:
8501     case T_FWORD:
8502     case T_QWORD:
8503     case T_TBYTE:
8504     case T_XMMWORD:
8505       intel_match_token (cur_token.code);
8506
8507       if (cur_token.code == T_PTR)
8508         return 1;
8509
8510       /* It must have been an identifier.  */
8511       intel_putback_token ();
8512       cur_token.code = T_ID;
8513       /* FALLTHRU */
8514
8515     /* e11  id
8516             | constant  */
8517     case T_ID:
8518       if (!intel_parser.in_offset && intel_parser.is_mem <= 0)
8519         {
8520           symbolS *symbolP;
8521
8522           /* The identifier represents a memory reference only if it's not
8523              preceded by an offset modifier and if it's not an equate.  */
8524           symbolP = symbol_find(cur_token.str);
8525           if (!symbolP || S_GET_SEGMENT(symbolP) != absolute_section)
8526             intel_parser.is_mem = 1;
8527         }
8528         /* FALLTHRU */
8529
8530     case T_CONST:
8531     case '-':
8532     case '+':
8533       {
8534         char *save_str, sign = 0;
8535
8536         /* Allow constants that start with `+' or `-'.  */
8537         if (cur_token.code == '-' || cur_token.code == '+')
8538           {
8539             sign = cur_token.code;
8540             intel_match_token (cur_token.code);
8541             if (cur_token.code != T_CONST)
8542               {
8543                 as_bad (_("Syntax error: Expecting a constant, got `%s'"),
8544                         cur_token.str);
8545                 return 0;
8546               }
8547           }
8548
8549         save_str = (char *) xmalloc (strlen (cur_token.str) + 2);
8550         strcpy (save_str + !!sign, cur_token.str);
8551         if (sign)
8552           *save_str = sign;
8553
8554         /* Get the next token to check for register scaling.  */
8555         intel_match_token (cur_token.code);
8556
8557         /* Check if this constant is a scaling factor for an
8558            index register.  */
8559         if (cur_token.code == '*')
8560           {
8561             if (intel_match_token ('*') && cur_token.code == T_REG)
8562               {
8563                 const reg_entry *reg = cur_token.reg;
8564
8565                 if (!intel_parser.in_bracket)
8566                   {
8567                     as_bad (_("Register scaling only allowed "
8568                               "in memory operands"));
8569                     return 0;
8570                   }
8571
8572                  /* Disallow things like [1*si].
8573                     sp and esp are invalid as index.  */
8574                 if (reg->reg_type.bitfield.reg16)
8575                   reg = i386_regtab + REGNAM_AX + 4;
8576                 else if (i.index_reg)
8577                   reg = i386_regtab + REGNAM_EAX + 4;
8578
8579                 /* The constant is followed by `* reg', so it must be
8580                    a valid scale.  */
8581                 i.index_reg = reg;
8582                 i.types[this_operand].bitfield.baseindex = 1;
8583
8584                 /* Set the scale after setting the register (otherwise,
8585                    i386_scale will complain)  */
8586                 if (!i386_scale (save_str))
8587                   return 0;
8588                 intel_match_token (T_REG);
8589
8590                 /* Since registers are not part of the displacement
8591                    string, we may need to remove any preceding '+' from
8592                    the displacement string.  */
8593                 if (*intel_parser.disp != '\0')
8594                   {
8595                     char *s = intel_parser.disp;
8596                     s += strlen (s) - 1;
8597                     if (*s == '+')
8598                       *s = '\0';
8599                   }
8600
8601                 free (save_str);
8602
8603                 return 1;
8604               }
8605
8606             /* The constant was not used for register scaling. Since we have
8607                already consumed the token following `*' we now need to put it
8608                back in the stream.  */
8609             intel_putback_token ();
8610           }
8611
8612         /* Add the constant to the displacement string.  */
8613         strcat (intel_parser.disp, save_str);
8614         free (save_str);
8615
8616         return 1;
8617       }
8618     }
8619
8620   as_bad (_("Unrecognized token '%s'"), cur_token.str);
8621   return 0;
8622 }
8623
8624 /* Match the given token against cur_token. If they match, read the next
8625    token from the operand string.  */
8626 static int
8627 intel_match_token (int code)
8628 {
8629   if (cur_token.code == code)
8630     {
8631       intel_get_token ();
8632       return 1;
8633     }
8634   else
8635     {
8636       as_bad (_("Unexpected token `%s'"), cur_token.str);
8637       return 0;
8638     }
8639 }
8640
8641 /* Read a new token from intel_parser.op_string and store it in cur_token.  */
8642 static void
8643 intel_get_token (void)
8644 {
8645   char *end_op;
8646   const reg_entry *reg;
8647   struct intel_token new_token;
8648
8649   new_token.code = T_NIL;
8650   new_token.reg = NULL;
8651   new_token.str = NULL;
8652
8653   /* Free the memory allocated to the previous token and move
8654      cur_token to prev_token.  */
8655   if (prev_token.str)
8656     free (prev_token.str);
8657
8658   prev_token = cur_token;
8659
8660   /* Skip whitespace.  */
8661   while (is_space_char (*intel_parser.op_string))
8662     intel_parser.op_string++;
8663
8664   /* Return an empty token if we find nothing else on the line.  */
8665   if (*intel_parser.op_string == '\0')
8666     {
8667       cur_token = new_token;
8668       return;
8669     }
8670
8671   /* The new token cannot be larger than the remainder of the operand
8672      string.  */
8673   new_token.str = (char *) xmalloc (strlen (intel_parser.op_string) + 1);
8674   new_token.str[0] = '\0';
8675
8676   if (strchr ("0123456789", *intel_parser.op_string))
8677     {
8678       char *p = new_token.str;
8679       char *q = intel_parser.op_string;
8680       new_token.code = T_CONST;
8681
8682       /* Allow any kind of identifier char to encompass floating point and
8683          hexadecimal numbers.  */
8684       while (is_identifier_char (*q))
8685         *p++ = *q++;
8686       *p = '\0';
8687
8688       /* Recognize special symbol names [0-9][bf].  */
8689       if (strlen (intel_parser.op_string) == 2
8690           && (intel_parser.op_string[1] == 'b'
8691               || intel_parser.op_string[1] == 'f'))
8692         new_token.code = T_ID;
8693     }
8694
8695   else if ((reg = parse_register (intel_parser.op_string, &end_op)) != NULL)
8696     {
8697       size_t len = end_op - intel_parser.op_string;
8698
8699       new_token.code = T_REG;
8700       new_token.reg = reg;
8701
8702       memcpy (new_token.str, intel_parser.op_string, len);
8703       new_token.str[len] = '\0';
8704     }
8705
8706   else if (is_identifier_char (*intel_parser.op_string))
8707     {
8708       char *p = new_token.str;
8709       char *q = intel_parser.op_string;
8710
8711       /* A '.' or '$' followed by an identifier char is an identifier.
8712          Otherwise, it's operator '.' followed by an expression.  */
8713       if ((*q == '.' || *q == '$') && !is_identifier_char (*(q + 1)))
8714         {
8715           new_token.code = '.';
8716           new_token.str[0] = '.';
8717           new_token.str[1] = '\0';
8718         }
8719       else
8720         {
8721           while (is_identifier_char (*q) || *q == '@')
8722             *p++ = *q++;
8723           *p = '\0';
8724
8725           if (strcasecmp (new_token.str, "NOT") == 0)
8726             new_token.code = '~';
8727
8728           else if (strcasecmp (new_token.str, "MOD") == 0)
8729             new_token.code = '%';
8730
8731           else if (strcasecmp (new_token.str, "AND") == 0)
8732             new_token.code = '&';
8733
8734           else if (strcasecmp (new_token.str, "OR") == 0)
8735             new_token.code = '|';
8736
8737           else if (strcasecmp (new_token.str, "XOR") == 0)
8738             new_token.code = '^';
8739
8740           else if (strcasecmp (new_token.str, "SHL") == 0)
8741             new_token.code = T_SHL;
8742
8743           else if (strcasecmp (new_token.str, "SHR") == 0)
8744             new_token.code = T_SHR;
8745
8746           else if (strcasecmp (new_token.str, "BYTE") == 0)
8747             new_token.code = T_BYTE;
8748
8749           else if (strcasecmp (new_token.str, "WORD") == 0)
8750             new_token.code = T_WORD;
8751
8752           else if (strcasecmp (new_token.str, "DWORD") == 0)
8753             new_token.code = T_DWORD;
8754
8755           else if (strcasecmp (new_token.str, "FWORD") == 0)
8756             new_token.code = T_FWORD;
8757
8758           else if (strcasecmp (new_token.str, "QWORD") == 0)
8759             new_token.code = T_QWORD;
8760
8761           else if (strcasecmp (new_token.str, "TBYTE") == 0
8762                    /* XXX remove (gcc still uses it) */
8763                    || strcasecmp (new_token.str, "XWORD") == 0)
8764             new_token.code = T_TBYTE;
8765
8766           else if (strcasecmp (new_token.str, "XMMWORD") == 0
8767                    || strcasecmp (new_token.str, "OWORD") == 0)
8768             new_token.code = T_XMMWORD;
8769
8770           else if (strcasecmp (new_token.str, "PTR") == 0)
8771             new_token.code = T_PTR;
8772
8773           else if (strcasecmp (new_token.str, "SHORT") == 0)
8774             new_token.code = T_SHORT;
8775
8776           else if (strcasecmp (new_token.str, "OFFSET") == 0)
8777             {
8778               new_token.code = T_OFFSET;
8779
8780               /* ??? This is not mentioned in the MASM grammar but gcc
8781                      makes use of it with -mintel-syntax.  OFFSET may be
8782                      followed by FLAT:  */
8783               if (strncasecmp (q, " FLAT:", 6) == 0)
8784                 strcat (new_token.str, " FLAT:");
8785             }
8786
8787           /* ??? This is not mentioned in the MASM grammar.  */
8788           else if (strcasecmp (new_token.str, "FLAT") == 0)
8789             {
8790               new_token.code = T_OFFSET;
8791               if (*q == ':')
8792                 strcat (new_token.str, ":");
8793               else
8794                 as_bad (_("`:' expected"));
8795             }
8796
8797           else
8798             new_token.code = T_ID;
8799         }
8800     }
8801
8802   else if (strchr ("+-/*%|&^:[]()~", *intel_parser.op_string))
8803     {
8804       new_token.code = *intel_parser.op_string;
8805       new_token.str[0] = *intel_parser.op_string;
8806       new_token.str[1] = '\0';
8807     }
8808
8809   else if (strchr ("<>", *intel_parser.op_string)
8810            && *intel_parser.op_string == *(intel_parser.op_string + 1))
8811     {
8812       new_token.code = *intel_parser.op_string == '<' ? T_SHL : T_SHR;
8813       new_token.str[0] = *intel_parser.op_string;
8814       new_token.str[1] = *intel_parser.op_string;
8815       new_token.str[2] = '\0';
8816     }
8817
8818   else
8819     as_bad (_("Unrecognized token `%s'"), intel_parser.op_string);
8820
8821   intel_parser.op_string += strlen (new_token.str);
8822   cur_token = new_token;
8823 }
8824
8825 /* Put cur_token back into the token stream and make cur_token point to
8826    prev_token.  */
8827 static void
8828 intel_putback_token (void)
8829 {
8830   if (cur_token.code != T_NIL)
8831     {
8832       intel_parser.op_string -= strlen (cur_token.str);
8833       free (cur_token.str);
8834     }
8835   cur_token = prev_token;
8836
8837   /* Forget prev_token.  */
8838   prev_token.code = T_NIL;
8839   prev_token.reg = NULL;
8840   prev_token.str = NULL;
8841 }
8842
8843 int
8844 tc_x86_regname_to_dw2regnum (char *regname)
8845 {
8846   unsigned int regnum;
8847   unsigned int regnames_count;
8848   static const char *const regnames_32[] =
8849     {
8850       "eax", "ecx", "edx", "ebx",
8851       "esp", "ebp", "esi", "edi",
8852       "eip", "eflags", NULL,
8853       "st0", "st1", "st2", "st3",
8854       "st4", "st5", "st6", "st7",
8855       NULL, NULL,
8856       "xmm0", "xmm1", "xmm2", "xmm3",
8857       "xmm4", "xmm5", "xmm6", "xmm7",
8858       "mm0", "mm1", "mm2", "mm3",
8859       "mm4", "mm5", "mm6", "mm7",
8860       "fcw", "fsw", "mxcsr",
8861       "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
8862       "tr", "ldtr"
8863     };
8864   static const char *const regnames_64[] =
8865     {
8866       "rax", "rdx", "rcx", "rbx",
8867       "rsi", "rdi", "rbp", "rsp",
8868       "r8",  "r9",  "r10", "r11",
8869       "r12", "r13", "r14", "r15",
8870       "rip",
8871       "xmm0",  "xmm1",  "xmm2",  "xmm3",
8872       "xmm4",  "xmm5",  "xmm6",  "xmm7",
8873       "xmm8",  "xmm9",  "xmm10", "xmm11",
8874       "xmm12", "xmm13", "xmm14", "xmm15",
8875       "st0", "st1", "st2", "st3",
8876       "st4", "st5", "st6", "st7",
8877       "mm0", "mm1", "mm2", "mm3",
8878       "mm4", "mm5", "mm6", "mm7",
8879       "rflags",
8880       "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
8881       "fs.base", "gs.base", NULL, NULL,
8882       "tr", "ldtr",
8883       "mxcsr", "fcw", "fsw"
8884     };
8885   const char *const *regnames;
8886
8887   if (flag_code == CODE_64BIT)
8888     {
8889       regnames = regnames_64;
8890       regnames_count = ARRAY_SIZE (regnames_64);
8891     }
8892   else
8893     {
8894       regnames = regnames_32;
8895       regnames_count = ARRAY_SIZE (regnames_32);
8896     }
8897
8898   for (regnum = 0; regnum < regnames_count; regnum++)
8899     if (regnames[regnum] != NULL
8900         && strcmp (regname, regnames[regnum]) == 0)
8901       return regnum;
8902
8903   return -1;
8904 }
8905
8906 void
8907 tc_x86_frame_initial_instructions (void)
8908 {
8909   static unsigned int sp_regno;
8910
8911   if (!sp_regno)
8912     sp_regno = tc_x86_regname_to_dw2regnum (flag_code == CODE_64BIT
8913                                             ? "rsp" : "esp");
8914
8915   cfi_add_CFA_def_cfa (sp_regno, -x86_cie_data_alignment);
8916   cfi_add_CFA_offset (x86_dwarf2_return_column, x86_cie_data_alignment);
8917 }
8918
8919 int
8920 i386_elf_section_type (const char *str, size_t len)
8921 {
8922   if (flag_code == CODE_64BIT
8923       && len == sizeof ("unwind") - 1
8924       && strncmp (str, "unwind", 6) == 0)
8925     return SHT_X86_64_UNWIND;
8926
8927   return -1;
8928 }
8929
8930 #ifdef TE_PE
8931 void
8932 tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
8933 {
8934   expressionS expr;
8935
8936   expr.X_op = O_secrel;
8937   expr.X_add_symbol = symbol;
8938   expr.X_add_number = 0;
8939   emit_expr (&expr, size);
8940 }
8941 #endif
8942
8943 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
8944 /* For ELF on x86-64, add support for SHF_X86_64_LARGE.  */
8945
8946 int
8947 x86_64_section_letter (int letter, char **ptr_msg)
8948 {
8949   if (flag_code == CODE_64BIT)
8950     {
8951       if (letter == 'l')
8952         return SHF_X86_64_LARGE;
8953
8954       *ptr_msg = _("Bad .section directive: want a,l,w,x,M,S,G,T in string");
8955     }
8956   else
8957     *ptr_msg = _("Bad .section directive: want a,w,x,M,S,G,T in string");
8958   return -1;
8959 }
8960
8961 int
8962 x86_64_section_word (char *str, size_t len)
8963 {
8964   if (len == 5 && flag_code == CODE_64BIT && CONST_STRNEQ (str, "large"))
8965     return SHF_X86_64_LARGE;
8966
8967   return -1;
8968 }
8969
8970 static void
8971 handle_large_common (int small ATTRIBUTE_UNUSED)
8972 {
8973   if (flag_code != CODE_64BIT)
8974     {
8975       s_comm_internal (0, elf_common_parse);
8976       as_warn (_(".largecomm supported only in 64bit mode, producing .comm"));
8977     }
8978   else
8979     {
8980       static segT lbss_section;
8981       asection *saved_com_section_ptr = elf_com_section_ptr;
8982       asection *saved_bss_section = bss_section;
8983
8984       if (lbss_section == NULL)
8985         {
8986           flagword applicable;
8987           segT seg = now_seg;
8988           subsegT subseg = now_subseg;
8989
8990           /* The .lbss section is for local .largecomm symbols.  */
8991           lbss_section = subseg_new (".lbss", 0);
8992           applicable = bfd_applicable_section_flags (stdoutput);
8993           bfd_set_section_flags (stdoutput, lbss_section,
8994                                  applicable & SEC_ALLOC);
8995           seg_info (lbss_section)->bss = 1;
8996
8997           subseg_set (seg, subseg);
8998         }
8999
9000       elf_com_section_ptr = &_bfd_elf_large_com_section;
9001       bss_section = lbss_section;
9002
9003       s_comm_internal (0, elf_common_parse);
9004
9005       elf_com_section_ptr = saved_com_section_ptr;
9006       bss_section = saved_bss_section;
9007     }
9008 }
9009 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */