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