52191134bd7ed90313e73716e9882420d773a2df
[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, 1999
3    Free Software Foundation.
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 /*
23   Intel 80386 machine specific gas.
24   Written by Eliot Dresselhaus (eliot@mgm.mit.edu).
25   Bugs & suggestions are completely welcome.  This is free software.
26   Please help us make it better.
27   */
28
29 #include <ctype.h>
30
31 #include "as.h"
32 #include "subsegs.h"
33 #include "opcode/i386.h"
34
35 #ifndef TC_RELOC
36 #define TC_RELOC(X,Y) (Y)
37 #endif
38
39 #ifndef REGISTER_WARNINGS
40 #define REGISTER_WARNINGS 1
41 #endif
42
43 #ifndef INFER_ADDR_PREFIX
44 #define INFER_ADDR_PREFIX 1
45 #endif
46
47 #ifndef SCALE1_WHEN_NO_INDEX
48 /* Specifying a scale factor besides 1 when there is no index is
49    futile.  eg. `mov (%ebx,2),%al' does exactly the same as
50    `mov (%ebx),%al'.  To slavishly follow what the programmer
51    specified, set SCALE1_WHEN_NO_INDEX to 0.  */
52 #define SCALE1_WHEN_NO_INDEX 1
53 #endif
54
55 #define true 1
56 #define false 0
57
58 static unsigned int mode_from_disp_size PARAMS ((unsigned int));
59 static int fits_in_signed_byte PARAMS ((long));
60 static int fits_in_unsigned_byte PARAMS ((long));
61 static int fits_in_unsigned_word PARAMS ((long));
62 static int fits_in_signed_word PARAMS ((long));
63 static int smallest_imm_type PARAMS ((long));
64 static int add_prefix PARAMS ((unsigned int));
65 static void set_16bit_code_flag PARAMS ((int));
66 static void set_16bit_gcc_code_flag PARAMS((int));
67 static void set_intel_syntax PARAMS ((int));
68
69 #ifdef BFD_ASSEMBLER
70 static bfd_reloc_code_real_type reloc
71   PARAMS ((int, int, bfd_reloc_code_real_type));
72 #endif
73
74 /* 'md_assemble ()' gathers together information and puts it into a
75    i386_insn. */
76
77 struct _i386_insn
78   {
79     /* TM holds the template for the insn were currently assembling. */
80     template tm;
81
82     /* SUFFIX holds the instruction mnemonic suffix if given.
83        (e.g. 'l' for 'movl')  */
84     char suffix;
85
86     /* Operands are coded with OPERANDS, TYPES, DISPS, IMMS, and REGS. */
87
88     /* OPERANDS gives the number of given operands. */
89     unsigned int operands;
90
91     /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number
92        of given register, displacement, memory operands and immediate
93        operands. */
94     unsigned int reg_operands, disp_operands, mem_operands, imm_operands;
95
96     /* TYPES [i] is the type (see above #defines) which tells us how to
97        search through DISPS [i] & IMMS [i] & REGS [i] for the required
98        operand.  */
99     unsigned int types[MAX_OPERANDS];
100
101     /* Displacements (if given) for each operand. */
102     expressionS *disps[MAX_OPERANDS];
103
104     /* Relocation type for operand */
105 #ifdef BFD_ASSEMBLER
106     enum bfd_reloc_code_real disp_reloc[MAX_OPERANDS];
107 #else
108     int disp_reloc[MAX_OPERANDS];
109 #endif
110
111     /* Immediate operands (if given) for each operand. */
112     expressionS *imms[MAX_OPERANDS];
113
114     /* Register operands (if given) for each operand. */
115     const reg_entry *regs[MAX_OPERANDS];
116
117     /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode
118        the base index byte below.  */
119     const reg_entry *base_reg;
120     const reg_entry *index_reg;
121     unsigned int log2_scale_factor;
122
123     /* SEG gives the seg_entries of this insn.  They are zero unless
124        explicit segment overrides are given. */
125     const seg_entry *seg[2];    /* segments for memory operands (if given) */
126
127     /* PREFIX holds all the given prefix opcodes (usually null).
128        PREFIXES is the number of prefix opcodes.  */
129     unsigned int prefixes;
130     unsigned char prefix[MAX_PREFIXES];
131
132     /* RM and SIB are the modrm byte and the sib byte where the
133        addressing modes of this insn are encoded.  */
134
135     modrm_byte rm;
136     sib_byte sib;
137   };
138
139 typedef struct _i386_insn i386_insn;
140
141 /* List of chars besides those in app.c:symbol_chars that can start an
142    operand.  Used to prevent the scrubber eating vital white-space.  */
143 #ifdef LEX_AT
144 const char extra_symbol_chars[] = "*%-(@";
145 #else
146 const char extra_symbol_chars[] = "*%-(";
147 #endif
148
149 /* This array holds the chars that always start a comment.  If the
150    pre-processor is disabled, these aren't very useful */
151 #if defined (TE_I386AIX) || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) && ! defined (TE_LINUX))
152 /* Putting '/' here makes it impossible to use the divide operator.
153    However, we need it for compatibility with SVR4 systems.  */
154 const char comment_chars[] = "#/";
155 #define PREFIX_SEPARATOR '\\'
156 #else
157 const char comment_chars[] = "#";
158 #define PREFIX_SEPARATOR '/'
159 #endif
160
161 /* This array holds the chars that only start a comment at the beginning of
162    a line.  If the line seems to have the form '# 123 filename'
163    .line and .file directives will appear in the pre-processed output */
164 /* Note that input_file.c hand checks for '#' at the beginning of the
165    first line of the input file.  This is because the compiler outputs
166    #NO_APP at the beginning of its output. */
167 /* Also note that comments started like this one will always work if
168    '/' isn't otherwise defined.  */
169 #if defined (TE_I386AIX) || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) && ! defined (TE_LINUX))
170 const char line_comment_chars[] = "";
171 #else
172 const char line_comment_chars[] = "/";
173 #endif
174
175 const char line_separator_chars[] = "";
176
177 /* Chars that can be used to separate mant from exp in floating point nums */
178 const char EXP_CHARS[] = "eE";
179
180 /* Chars that mean this number is a floating point constant */
181 /* As in 0f12.456 */
182 /* or    0d1.2345e12 */
183 const char FLT_CHARS[] = "fFdDxX";
184
185 /* tables for lexical analysis */
186 static char mnemonic_chars[256];
187 static char register_chars[256];
188 static char operand_chars[256];
189 static char identifier_chars[256];
190 static char digit_chars[256];
191
192 /* lexical macros */
193 #define is_mnemonic_char(x) (mnemonic_chars[(unsigned char) x])
194 #define is_operand_char(x) (operand_chars[(unsigned char) x])
195 #define is_register_char(x) (register_chars[(unsigned char) x])
196 #define is_space_char(x) ((x) == ' ')
197 #define is_identifier_char(x) (identifier_chars[(unsigned char) x])
198 #define is_digit_char(x) (digit_chars[(unsigned char) x])
199
200 /* put here all non-digit non-letter charcters that may occur in an operand */
201 static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:[@]";
202
203 /* md_assemble() always leaves the strings it's passed unaltered.  To
204    effect this we maintain a stack of saved characters that we've smashed
205    with '\0's (indicating end of strings for various sub-fields of the
206    assembler instruction). */
207 static char save_stack[32];
208 static char *save_stack_p;      /* stack pointer */
209 #define END_STRING_AND_SAVE(s) \
210         do { *save_stack_p++ = *(s); *(s) = '\0'; } while (0)
211 #define RESTORE_END_STRING(s) \
212         do { *(s) = *--save_stack_p; } while (0)
213
214 /* The instruction we're assembling. */
215 static i386_insn i;
216
217 /* Possible templates for current insn.  */
218 static const templates *current_templates;
219
220 /* Per instruction expressionS buffers: 2 displacements & 2 immediate max. */
221 static expressionS disp_expressions[2], im_expressions[2];
222
223 static int this_operand;        /* current operand we are working on */
224
225 static int flag_do_long_jump;   /* FIXME what does this do? */
226
227 static int flag_16bit_code;     /* 1 if we're writing 16-bit code, 0 if 32-bit */
228
229 static int intel_syntax = 0;    /* 1 for intel syntax, 0 if att syntax */
230
231 static int allow_naked_reg = 0;  /* 1 if register prefix % not required */
232
233 static char stackop_size = '\0';  /* Used in 16 bit gcc mode to add an l
234                                      suffix to call, ret, enter, leave, push,
235                                      and pop instructions.  */
236
237 /* Interface to relax_segment.
238    There are 2 relax states for 386 jump insns: one for conditional &
239    one for unconditional jumps.  This is because these two types of
240    jumps add different sizes to frags when we're figuring out what
241    sort of jump to choose to reach a given label.  */
242
243 /* types */
244 #define COND_JUMP 1             /* conditional jump */
245 #define UNCOND_JUMP 2           /* unconditional jump */
246 /* sizes */
247 #define CODE16  1
248 #define SMALL   0
249 #define SMALL16 (SMALL|CODE16)
250 #define BIG     2
251 #define BIG16   (BIG|CODE16)
252
253 #ifndef INLINE
254 #ifdef __GNUC__
255 #define INLINE __inline__
256 #else
257 #define INLINE
258 #endif
259 #endif
260
261 #define ENCODE_RELAX_STATE(type,size) \
262   ((relax_substateT)((type<<2) | (size)))
263 #define SIZE_FROM_RELAX_STATE(s) \
264     ( (((s) & 0x3) == BIG ? 4 : (((s) & 0x3) == BIG16 ? 2 : 1)) )
265
266 /* This table is used by relax_frag to promote short jumps to long
267    ones where necessary.  SMALL (short) jumps may be promoted to BIG
268    (32 bit long) ones, and SMALL16 jumps to BIG16 (16 bit long).  We
269    don't allow a short jump in a 32 bit code segment to be promoted to
270    a 16 bit offset jump because it's slower (requires data size
271    prefix), and doesn't work, unless the destination is in the bottom
272    64k of the code segment (The top 16 bits of eip are zeroed).  */
273
274 const relax_typeS md_relax_table[] =
275 {
276   /* The fields are:
277      1) most positive reach of this state,
278      2) most negative reach of this state,
279      3) how many bytes this mode will add to the size of the current frag
280      4) which index into the table to try if we can't fit into this one.
281   */
282   {1, 1, 0, 0},
283   {1, 1, 0, 0},
284   {1, 1, 0, 0},
285   {1, 1, 0, 0},
286
287   {127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
288   {127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
289   /* dword conditionals adds 4 bytes to frag:
290      1 extra opcode byte, 3 extra displacement bytes.  */
291   {0, 0, 4, 0},
292   /* word conditionals add 2 bytes to frag:
293      1 extra opcode byte, 1 extra displacement byte.  */
294   {0, 0, 2, 0},
295
296   {127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
297   {127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
298   /* dword jmp adds 3 bytes to frag:
299      0 extra opcode bytes, 3 extra displacement bytes.  */
300   {0, 0, 3, 0},
301   /* word jmp adds 1 byte to frag:
302      0 extra opcode bytes, 1 extra displacement byte.  */
303   {0, 0, 1, 0}
304
305 };
306
307
308 void
309 i386_align_code (fragP, count)
310      fragS *fragP;
311      int count;
312 {
313   /* Various efficient no-op patterns for aligning code labels.  */
314   /* Note: Don't try to assemble the instructions in the comments. */
315   /*       0L and 0w are not legal */
316   static const char f32_1[] =
317     {0x90};                                     /* nop                  */
318   static const char f32_2[] =
319     {0x89,0xf6};                                /* movl %esi,%esi       */
320   static const char f32_3[] =
321     {0x8d,0x76,0x00};                           /* leal 0(%esi),%esi    */
322   static const char f32_4[] =
323     {0x8d,0x74,0x26,0x00};                      /* leal 0(%esi,1),%esi  */
324   static const char f32_5[] =
325     {0x90,                                      /* nop                  */
326      0x8d,0x74,0x26,0x00};                      /* leal 0(%esi,1),%esi  */
327   static const char f32_6[] =
328     {0x8d,0xb6,0x00,0x00,0x00,0x00};            /* leal 0L(%esi),%esi   */
329   static const char f32_7[] =
330     {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00};       /* leal 0L(%esi,1),%esi */
331   static const char f32_8[] =
332     {0x90,                                      /* nop                  */
333      0x8d,0xb4,0x26,0x00,0x00,0x00,0x00};       /* leal 0L(%esi,1),%esi */
334   static const char f32_9[] =
335     {0x89,0xf6,                                 /* movl %esi,%esi       */
336      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
337   static const char f32_10[] =
338     {0x8d,0x76,0x00,                            /* leal 0(%esi),%esi    */
339      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
340   static const char f32_11[] =
341     {0x8d,0x74,0x26,0x00,                       /* leal 0(%esi,1),%esi  */
342      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
343   static const char f32_12[] =
344     {0x8d,0xb6,0x00,0x00,0x00,0x00,             /* leal 0L(%esi),%esi   */
345      0x8d,0xbf,0x00,0x00,0x00,0x00};            /* leal 0L(%edi),%edi   */
346   static const char f32_13[] =
347     {0x8d,0xb6,0x00,0x00,0x00,0x00,             /* leal 0L(%esi),%esi   */
348      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
349   static const char f32_14[] =
350     {0x8d,0xb4,0x26,0x00,0x00,0x00,0x00,        /* leal 0L(%esi,1),%esi */
351      0x8d,0xbc,0x27,0x00,0x00,0x00,0x00};       /* leal 0L(%edi,1),%edi */
352   static const char f32_15[] =
353     {0xeb,0x0d,0x90,0x90,0x90,0x90,0x90,        /* jmp .+15; lotsa nops */
354      0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90};
355   static const char f16_3[] =
356     {0x8d,0x74,0x00};                           /* lea 0(%esi),%esi     */
357   static const char f16_4[] =
358     {0x8d,0xb4,0x00,0x00};                      /* lea 0w(%si),%si      */
359   static const char f16_5[] =
360     {0x90,                                      /* nop                  */
361      0x8d,0xb4,0x00,0x00};                      /* lea 0w(%si),%si      */
362   static const char f16_6[] =
363     {0x89,0xf6,                                 /* mov %si,%si          */
364      0x8d,0xbd,0x00,0x00};                      /* lea 0w(%di),%di      */
365   static const char f16_7[] =
366     {0x8d,0x74,0x00,                            /* lea 0(%si),%si       */
367      0x8d,0xbd,0x00,0x00};                      /* lea 0w(%di),%di      */
368   static const char f16_8[] =
369     {0x8d,0xb4,0x00,0x00,                       /* lea 0w(%si),%si      */
370      0x8d,0xbd,0x00,0x00};                      /* lea 0w(%di),%di      */
371   static const char *const f32_patt[] = {
372     f32_1, f32_2, f32_3, f32_4, f32_5, f32_6, f32_7, f32_8,
373     f32_9, f32_10, f32_11, f32_12, f32_13, f32_14, f32_15
374   };
375   static const char *const f16_patt[] = {
376     f32_1, f32_2, f16_3, f16_4, f16_5, f16_6, f16_7, f16_8,
377     f32_15, f32_15, f32_15, f32_15, f32_15, f32_15, f32_15
378   };
379
380   if (count > 0 && count <= 15)
381     {
382       if (flag_16bit_code)
383         {
384           memcpy(fragP->fr_literal + fragP->fr_fix,
385                  f16_patt[count - 1], count);
386           if (count > 8) /* adjust jump offset */
387             fragP->fr_literal[fragP->fr_fix + 1] = count - 2;
388         }
389       else
390         memcpy(fragP->fr_literal + fragP->fr_fix,
391                f32_patt[count - 1], count);
392       fragP->fr_var = count;
393     }
394 }
395
396 static char *output_invalid PARAMS ((int c));
397 static int i386_operand PARAMS ((char *operand_string));
398 static int i386_intel_operand PARAMS ((char *operand_string, int got_a_float));
399 static const reg_entry *parse_register PARAMS ((char *reg_string,
400                                                 char **end_op));
401
402 #ifndef I386COFF
403 static void s_bss PARAMS ((int));
404 #endif
405
406 symbolS *GOT_symbol;            /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
407
408 static INLINE unsigned int
409 mode_from_disp_size (t)
410      unsigned int t;
411 {
412   return (t & Disp8) ? 1 : (t & (Disp16|Disp32)) ? 2 : 0;
413 }
414
415 static INLINE int
416 fits_in_signed_byte (num)
417      long num;
418 {
419   return (num >= -128) && (num <= 127);
420 }                               /* fits_in_signed_byte() */
421
422 static INLINE int
423 fits_in_unsigned_byte (num)
424      long num;
425 {
426   return (num & 0xff) == num;
427 }                               /* fits_in_unsigned_byte() */
428
429 static INLINE int
430 fits_in_unsigned_word (num)
431      long num;
432 {
433   return (num & 0xffff) == num;
434 }                               /* fits_in_unsigned_word() */
435
436 static INLINE int
437 fits_in_signed_word (num)
438      long num;
439 {
440   return (-32768 <= num) && (num <= 32767);
441 }                               /* fits_in_signed_word() */
442
443 static int
444 smallest_imm_type (num)
445      long num;
446 {
447 #if 0
448   /* This code is disabled because all the Imm1 forms in the opcode table
449      are slower on the i486, and they're the versions with the implicitly
450      specified single-position displacement, which has another syntax if
451      you really want to use that form.  If you really prefer to have the
452      one-byte-shorter Imm1 form despite these problems, re-enable this
453      code.  */
454   if (num == 1)
455     return Imm1 | Imm8 | Imm8S | Imm16 | Imm32;
456 #endif
457   return (fits_in_signed_byte (num)
458           ? (Imm8S | Imm8 | Imm16 | Imm32)
459           : fits_in_unsigned_byte (num)
460           ? (Imm8 | Imm16 | Imm32)
461           : (fits_in_signed_word (num) || fits_in_unsigned_word (num))
462           ? (Imm16 | Imm32)
463           : (Imm32));
464 }                               /* smallest_imm_type() */
465
466 /* Returns 0 if attempting to add a prefix where one from the same
467    class already exists, 1 if non rep/repne added, 2 if rep/repne
468    added.  */
469 static int
470 add_prefix (prefix)
471      unsigned int prefix;
472 {
473   int ret = 1;
474   int q;
475
476   switch (prefix)
477     {
478     default:
479       abort ();
480
481     case CS_PREFIX_OPCODE:
482     case DS_PREFIX_OPCODE:
483     case ES_PREFIX_OPCODE:
484     case FS_PREFIX_OPCODE:
485     case GS_PREFIX_OPCODE:
486     case SS_PREFIX_OPCODE:
487       q = SEG_PREFIX;
488       break;
489
490     case REPNE_PREFIX_OPCODE:
491     case REPE_PREFIX_OPCODE:
492       ret = 2;
493       /* fall thru */
494     case LOCK_PREFIX_OPCODE:
495       q = LOCKREP_PREFIX;
496       break;
497
498     case FWAIT_OPCODE:
499       q = WAIT_PREFIX;
500       break;
501
502     case ADDR_PREFIX_OPCODE:
503       q = ADDR_PREFIX;
504       break;
505
506     case DATA_PREFIX_OPCODE:
507       q = DATA_PREFIX;
508       break;
509     }
510
511   if (i.prefix[q])
512     {
513       as_bad (_("same type of prefix used twice"));
514       return 0;
515     }
516
517   i.prefixes += 1;
518   i.prefix[q] = prefix;
519   return ret;
520 }
521
522 static void
523 set_16bit_code_flag (new_16bit_code_flag)
524      int new_16bit_code_flag;
525 {
526   flag_16bit_code = new_16bit_code_flag;
527   stackop_size = '\0';
528 }
529
530 static void
531 set_16bit_gcc_code_flag (new_16bit_code_flag)
532      int new_16bit_code_flag;
533 {
534   flag_16bit_code = new_16bit_code_flag;
535   stackop_size = new_16bit_code_flag ? 'l' : '\0';
536 }
537
538 static void
539 set_intel_syntax (syntax_flag)
540      int syntax_flag;
541 {
542   /* Find out if register prefixing is specified.  */
543   int ask_naked_reg = 0;
544
545   SKIP_WHITESPACE ();
546   if (! is_end_of_line[(unsigned char) *input_line_pointer])
547     {
548       char *string = input_line_pointer;
549       int e = get_symbol_end ();
550
551       if (strcmp(string, "prefix") == 0)
552         ask_naked_reg = 1;
553       else if (strcmp(string, "noprefix") == 0)
554         ask_naked_reg = -1;
555       else
556         as_bad (_("Bad argument to syntax directive."));
557       *input_line_pointer = e;
558     }
559   demand_empty_rest_of_line ();
560
561   intel_syntax = syntax_flag;
562
563   if (ask_naked_reg == 0)
564     {
565 #ifdef BFD_ASSEMBLER
566       allow_naked_reg = (intel_syntax
567                          && (bfd_get_symbol_leading_char (stdoutput) != '\0'));
568 #else
569       allow_naked_reg = 0; /* conservative default */
570 #endif
571     }
572   else
573     allow_naked_reg = (ask_naked_reg < 0);
574 }
575
576 const pseudo_typeS md_pseudo_table[] =
577 {
578 #ifndef I386COFF
579   {"bss", s_bss, 0},
580 #endif
581 #if !defined(OBJ_AOUT) && !defined(USE_ALIGN_PTWO)
582   {"align", s_align_bytes, 0},
583 #else
584   {"align", s_align_ptwo, 0},
585 #endif
586   {"ffloat", float_cons, 'f'},
587   {"dfloat", float_cons, 'd'},
588   {"tfloat", float_cons, 'x'},
589   {"value", cons, 2},
590   {"noopt", s_ignore, 0},
591   {"optim", s_ignore, 0},
592   {"code16gcc", set_16bit_gcc_code_flag, 1},
593   {"code16", set_16bit_code_flag, 1},
594   {"code32", set_16bit_code_flag, 0},
595   {"intel_syntax", set_intel_syntax, 1},
596   {"att_syntax", set_intel_syntax, 0},
597   {0, 0, 0}
598 };
599
600 /* for interface with expression () */
601 extern char *input_line_pointer;
602
603 /* hash table for instruction mnemonic lookup */
604 static struct hash_control *op_hash;
605 /* hash table for register lookup */
606 static struct hash_control *reg_hash;
607 \f
608
609 void
610 md_begin ()
611 {
612   const char *hash_err;
613
614   /* initialize op_hash hash table */
615   op_hash = hash_new ();
616
617   {
618     register const template *optab;
619     register templates *core_optab;
620
621     optab = i386_optab;         /* setup for loop */
622     core_optab = (templates *) xmalloc (sizeof (templates));
623     core_optab->start = optab;
624
625     while (1)
626       {
627         ++optab;
628         if (optab->name == NULL
629             || strcmp (optab->name, (optab - 1)->name) != 0)
630           {
631             /* different name --> ship out current template list;
632                add to hash table; & begin anew */
633             core_optab->end = optab;
634             hash_err = hash_insert (op_hash,
635                                     (optab - 1)->name,
636                                     (PTR) core_optab);
637             if (hash_err)
638               {
639               hash_error:
640                 as_fatal (_("Internal Error:  Can't hash %s: %s"),
641                           (optab - 1)->name,
642                           hash_err);
643               }
644             if (optab->name == NULL)
645               break;
646             core_optab = (templates *) xmalloc (sizeof (templates));
647             core_optab->start = optab;
648           }
649       }
650   }
651
652   /* initialize reg_hash hash table */
653   reg_hash = hash_new ();
654   {
655     register const reg_entry *regtab;
656
657     for (regtab = i386_regtab;
658          regtab < i386_regtab + sizeof (i386_regtab) / sizeof (i386_regtab[0]);
659          regtab++)
660       {
661         hash_err = hash_insert (reg_hash, regtab->reg_name, (PTR) regtab);
662         if (hash_err)
663           goto hash_error;
664       }
665   }
666
667   /* fill in lexical tables:  mnemonic_chars, operand_chars.  */
668   {
669     register int c;
670     register char *p;
671
672     for (c = 0; c < 256; c++)
673       {
674         if (isdigit (c))
675           {
676             digit_chars[c] = c;
677             mnemonic_chars[c] = c;
678             register_chars[c] = c;
679             operand_chars[c] = c;
680           }
681         else if (islower (c))
682           {
683             mnemonic_chars[c] = c;
684             register_chars[c] = c;
685             operand_chars[c] = c;
686           }
687         else if (isupper (c))
688           {
689             mnemonic_chars[c] = tolower (c);
690             register_chars[c] = mnemonic_chars[c];
691             operand_chars[c] = c;
692           }
693
694         if (isalpha (c) || isdigit (c))
695           identifier_chars[c] = c;
696         else if (c >= 128)
697           {
698             identifier_chars[c] = c;
699             operand_chars[c] = c;
700           }
701       }
702
703 #ifdef LEX_AT
704     identifier_chars['@'] = '@';
705 #endif
706     digit_chars['-'] = '-';
707     identifier_chars['_'] = '_';
708     identifier_chars['.'] = '.';
709
710     for (p = operand_special_chars; *p != '\0'; p++)
711       operand_chars[(unsigned char) *p] = *p;
712   }
713
714 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
715   if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
716     {
717       record_alignment (text_section, 2);
718       record_alignment (data_section, 2);
719       record_alignment (bss_section, 2);
720     }
721 #endif
722 }
723
724 void
725 i386_print_statistics (file)
726      FILE *file;
727 {
728   hash_print_statistics (file, "i386 opcode", op_hash);
729   hash_print_statistics (file, "i386 register", reg_hash);
730 }
731 \f
732
733 #ifdef DEBUG386
734
735 /* debugging routines for md_assemble */
736 static void pi PARAMS ((char *, i386_insn *));
737 static void pte PARAMS ((template *));
738 static void pt PARAMS ((unsigned int));
739 static void pe PARAMS ((expressionS *));
740 static void ps PARAMS ((symbolS *));
741
742 static void
743 pi (line, x)
744      char *line;
745      i386_insn *x;
746 {
747   register template *p;
748   int i;
749
750   fprintf (stdout, "%s: template ", line);
751   pte (&x->tm);
752   fprintf (stdout, "  modrm:  mode %x  reg %x  reg/mem %x",
753            x->rm.mode, x->rm.reg, x->rm.regmem);
754   fprintf (stdout, " base %x  index %x  scale %x\n",
755            x->bi.base, x->bi.index, x->bi.scale);
756   for (i = 0; i < x->operands; i++)
757     {
758       fprintf (stdout, "    #%d:  ", i + 1);
759       pt (x->types[i]);
760       fprintf (stdout, "\n");
761       if (x->types[i]
762           & (Reg | SReg2 | SReg3 | Control | Debug | Test | RegMMX | RegXMM))
763         fprintf (stdout, "%s\n", x->regs[i]->reg_name);
764       if (x->types[i] & Imm)
765         pe (x->imms[i]);
766       if (x->types[i] & Disp)
767         pe (x->disps[i]);
768     }
769 }
770
771 static void
772 pte (t)
773      template *t;
774 {
775   int i;
776   fprintf (stdout, " %d operands ", t->operands);
777   fprintf (stdout, "opcode %x ",
778            t->base_opcode);
779   if (t->extension_opcode != None)
780     fprintf (stdout, "ext %x ", t->extension_opcode);
781   if (t->opcode_modifier & D)
782     fprintf (stdout, "D");
783   if (t->opcode_modifier & W)
784     fprintf (stdout, "W");
785   fprintf (stdout, "\n");
786   for (i = 0; i < t->operands; i++)
787     {
788       fprintf (stdout, "    #%d type ", i + 1);
789       pt (t->operand_types[i]);
790       fprintf (stdout, "\n");
791     }
792 }
793
794 static void
795 pe (e)
796      expressionS *e;
797 {
798   fprintf (stdout, "    operation     %d\n", e->X_op);
799   fprintf (stdout, "    add_number    %ld (%lx)\n",
800            (long) e->X_add_number, (long) e->X_add_number);
801   if (e->X_add_symbol)
802     {
803       fprintf (stdout, "    add_symbol    ");
804       ps (e->X_add_symbol);
805       fprintf (stdout, "\n");
806     }
807   if (e->X_op_symbol)
808     {
809       fprintf (stdout, "    op_symbol    ");
810       ps (e->X_op_symbol);
811       fprintf (stdout, "\n");
812     }
813 }
814
815 static void
816 ps (s)
817      symbolS *s;
818 {
819   fprintf (stdout, "%s type %s%s",
820            S_GET_NAME (s),
821            S_IS_EXTERNAL (s) ? "EXTERNAL " : "",
822            segment_name (S_GET_SEGMENT (s)));
823 }
824
825 struct type_name
826   {
827     unsigned int mask;
828     char *tname;
829   }
830
831 type_names[] =
832 {
833   { Reg8, "r8" },
834   { Reg16, "r16" },
835   { Reg32, "r32" },
836   { Imm8, "i8" },
837   { Imm8S, "i8s" },
838   { Imm16, "i16" },
839   { Imm32, "i32" },
840   { Imm1, "i1" },
841   { BaseIndex, "BaseIndex" },
842   { Disp8, "d8" },
843   { Disp16, "d16" },
844   { Disp32, "d32" },
845   { InOutPortReg, "InOutPortReg" },
846   { ShiftCount, "ShiftCount" },
847   { Control, "control reg" },
848   { Test, "test reg" },
849   { Debug, "debug reg" },
850   { FloatReg, "FReg" },
851   { FloatAcc, "FAcc" },
852   { SReg2, "SReg2" },
853   { SReg3, "SReg3" },
854   { Acc, "Acc" },
855   { JumpAbsolute, "Jump Absolute" },
856   { RegMMX, "rMMX" },
857   { RegXMM, "rXMM" },
858   { EsSeg, "es" },
859   { 0, "" }
860 };
861
862 static void
863 pt (t)
864      unsigned int t;
865 {
866   register struct type_name *ty;
867
868   if (t == Unknown)
869     {
870       fprintf (stdout, _("Unknown"));
871     }
872   else
873     {
874       for (ty = type_names; ty->mask; ty++)
875         if (t & ty->mask)
876           fprintf (stdout, "%s, ", ty->tname);
877     }
878   fflush (stdout);
879 }
880
881 #endif /* DEBUG386 */
882 \f
883 int
884 tc_i386_force_relocation (fixp)
885      struct fix *fixp;
886 {
887 #ifdef BFD_ASSEMBLER
888   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
889       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
890     return 1;
891   return 0;
892 #else
893   /* For COFF */
894   return fixp->fx_r_type==7;
895 #endif
896 }
897
898 #ifdef BFD_ASSEMBLER
899 static bfd_reloc_code_real_type reloc
900   PARAMS ((int, int, bfd_reloc_code_real_type));
901
902 static bfd_reloc_code_real_type
903 reloc (size, pcrel, other)
904      int size;
905      int pcrel;
906      bfd_reloc_code_real_type other;
907 {
908   if (other != NO_RELOC) return other;
909
910   if (pcrel)
911     {
912       switch (size)
913         {
914         case 1: return BFD_RELOC_8_PCREL;
915         case 2: return BFD_RELOC_16_PCREL;
916         case 4: return BFD_RELOC_32_PCREL;
917         }
918       as_bad (_("Can not do %d byte pc-relative relocation"), size);
919     }
920   else
921     {
922       switch (size)
923         {
924         case 1: return BFD_RELOC_8;
925         case 2: return BFD_RELOC_16;
926         case 4: return BFD_RELOC_32;
927         }
928       as_bad (_("Can not do %d byte relocation"), size);
929     }
930
931   return BFD_RELOC_NONE;
932 }
933
934 /*
935  * Here we decide which fixups can be adjusted to make them relative to
936  * the beginning of the section instead of the symbol.  Basically we need
937  * to make sure that the dynamic relocations are done correctly, so in
938  * some cases we force the original symbol to be used.
939  */
940 int
941 tc_i386_fix_adjustable (fixP)
942      fixS *fixP;
943 {
944 #if defined (OBJ_ELF) || defined (TE_PE)
945   /* Prevent all adjustments to global symbols, or else dynamic
946      linking will not work correctly.  */
947   if (S_IS_EXTERN (fixP->fx_addsy))
948     return 0;
949   if (S_IS_WEAK (fixP->fx_addsy))
950     return 0;
951 #endif
952   /* adjust_reloc_syms doesn't know about the GOT */
953   if (fixP->fx_r_type == BFD_RELOC_386_GOTOFF
954       || fixP->fx_r_type == BFD_RELOC_386_PLT32
955       || fixP->fx_r_type == BFD_RELOC_386_GOT32
956       || fixP->fx_r_type == BFD_RELOC_RVA
957       || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
958       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
959     return 0;
960   return 1;
961 }
962 #else
963 #define reloc(SIZE,PCREL,OTHER) 0
964 #define BFD_RELOC_16            0
965 #define BFD_RELOC_32            0
966 #define BFD_RELOC_16_PCREL      0
967 #define BFD_RELOC_32_PCREL      0
968 #define BFD_RELOC_386_PLT32     0
969 #define BFD_RELOC_386_GOT32     0
970 #define BFD_RELOC_386_GOTOFF    0
971 #endif
972
973 static int
974 intel_float_operand PARAMS ((char *mnemonic));
975
976 static int
977 intel_float_operand (mnemonic)
978      char *mnemonic;
979 {
980   if (mnemonic[0] == 'f' && mnemonic[1] =='i')
981     return 0;
982
983   if (mnemonic[0] == 'f')
984     return 1;
985
986   return 0;
987 }
988
989 /* This is the guts of the machine-dependent assembler.  LINE points to a
990    machine dependent instruction.  This function is supposed to emit
991    the frags/bytes it assembles to.  */
992
993 void
994 md_assemble (line)
995      char *line;
996 {
997   /* Points to template once we've found it. */
998   const template *t;
999
1000   /* Count the size of the instruction generated.  */
1001   int insn_size = 0;
1002
1003   int j;
1004
1005   char mnemonic[MAX_MNEM_SIZE];
1006
1007   /* Initialize globals. */
1008   memset (&i, '\0', sizeof (i));
1009   for (j = 0; j < MAX_OPERANDS; j++)
1010     i.disp_reloc[j] = NO_RELOC;
1011   memset (disp_expressions, '\0', sizeof (disp_expressions));
1012   memset (im_expressions, '\0', sizeof (im_expressions));
1013   save_stack_p = save_stack;    /* reset stack pointer */
1014
1015   /* First parse an instruction mnemonic & call i386_operand for the operands.
1016      We assume that the scrubber has arranged it so that line[0] is the valid
1017      start of a (possibly prefixed) mnemonic. */
1018   {
1019     char *l = line;
1020     char *token_start = l;
1021     char *mnem_p;
1022
1023     /* Non-zero if we found a prefix only acceptable with string insns. */
1024     const char *expecting_string_instruction = NULL;
1025
1026     while (1)
1027       {
1028         mnem_p = mnemonic;
1029         while ((*mnem_p = mnemonic_chars[(unsigned char) *l]) != 0)
1030           {
1031             mnem_p++;
1032             if (mnem_p >= mnemonic + sizeof (mnemonic))
1033               {
1034                 as_bad (_("no such 386 instruction: `%s'"), token_start);
1035                 return;
1036               }
1037             l++;
1038           }
1039         if (!is_space_char (*l)
1040             && *l != END_OF_INSN
1041             && *l != PREFIX_SEPARATOR)
1042           {
1043             as_bad (_("invalid character %s in mnemonic"),
1044                     output_invalid (*l));
1045             return;
1046           }
1047         if (token_start == l)
1048           {
1049             if (*l == PREFIX_SEPARATOR)
1050               as_bad (_("expecting prefix; got nothing"));
1051             else
1052               as_bad (_("expecting mnemonic; got nothing"));
1053             return;
1054           }
1055
1056         /* Look up instruction (or prefix) via hash table.  */
1057         current_templates = hash_find (op_hash, mnemonic);
1058
1059         if (*l != END_OF_INSN
1060             && (! is_space_char (*l) || l[1] != END_OF_INSN)
1061             && current_templates
1062             && (current_templates->start->opcode_modifier & IsPrefix))
1063           {
1064             /* If we are in 16-bit mode, do not allow addr16 or data16.
1065                Similarly, in 32-bit mode, do not allow addr32 or data32.  */
1066             if ((current_templates->start->opcode_modifier & (Size16 | Size32))
1067                 && (((current_templates->start->opcode_modifier & Size32) != 0)
1068                     ^ flag_16bit_code))
1069               {
1070                 as_bad (_("redundant %s prefix"),
1071                         current_templates->start->name);
1072                 return;
1073               }
1074             /* Add prefix, checking for repeated prefixes.  */
1075             switch (add_prefix (current_templates->start->base_opcode))
1076               {
1077               case 0:
1078                 return;
1079               case 2:
1080                 expecting_string_instruction =
1081                   current_templates->start->name;
1082                 break;
1083               }
1084             /* Skip past PREFIX_SEPARATOR and reset token_start.  */
1085             token_start = ++l;
1086           }
1087         else
1088           break;
1089       }
1090
1091     if (!current_templates)
1092       {
1093         /* See if we can get a match by trimming off a suffix.  */
1094         switch (mnem_p[-1])
1095           {
1096           case DWORD_MNEM_SUFFIX:
1097           case WORD_MNEM_SUFFIX:
1098           case BYTE_MNEM_SUFFIX:
1099           case SHORT_MNEM_SUFFIX:
1100 #if LONG_MNEM_SUFFIX != DWORD_MNEM_SUFFIX
1101           case LONG_MNEM_SUFFIX:
1102 #endif
1103             i.suffix = mnem_p[-1];
1104             mnem_p[-1] = '\0';
1105             current_templates = hash_find (op_hash, mnemonic);
1106             break;
1107
1108           /* Intel Syntax */
1109           case INTEL_DWORD_MNEM_SUFFIX:
1110             if (intel_syntax)
1111               {
1112                 i.suffix = mnem_p[-1];
1113                 mnem_p[-1] = '\0';
1114                 current_templates = hash_find (op_hash, mnemonic);
1115                 break;
1116               }
1117           }
1118         if (!current_templates)
1119           {
1120             as_bad (_("no such 386 instruction: `%s'"), token_start);
1121             return;
1122           }
1123       }
1124
1125     /* check for rep/repne without a string instruction */
1126     if (expecting_string_instruction
1127         && !(current_templates->start->opcode_modifier & IsString))
1128       {
1129         as_bad (_("expecting string instruction after `%s'"),
1130                 expecting_string_instruction);
1131         return;
1132       }
1133
1134     /* There may be operands to parse. */
1135     if (*l != END_OF_INSN)
1136       {
1137         /* parse operands */
1138
1139         /* 1 if operand is pending after ','. */
1140         unsigned int expecting_operand = 0;
1141
1142         /* Non-zero if operand parens not balanced. */
1143         unsigned int paren_not_balanced;
1144
1145         do
1146           {
1147             /* skip optional white space before operand */
1148             if (is_space_char (*l))
1149               ++l;
1150             if (!is_operand_char (*l) && *l != END_OF_INSN)
1151               {
1152                 as_bad (_("invalid character %s before operand %d"),
1153                         output_invalid (*l),
1154                         i.operands + 1);
1155                 return;
1156               }
1157             token_start = l;    /* after white space */
1158             paren_not_balanced = 0;
1159             while (paren_not_balanced || *l != ',')
1160               {
1161                 if (*l == END_OF_INSN)
1162                   {
1163                     if (paren_not_balanced)
1164                       {
1165                         if (!intel_syntax)
1166                           as_bad (_("unbalanced parenthesis in operand %d."),
1167                                   i.operands + 1);
1168                         else
1169                           as_bad (_("unbalanced brackets in operand %d."),
1170                                   i.operands + 1);
1171                         return;
1172                       }
1173                     else
1174                       break;    /* we are done */
1175                   }
1176                 else if (!is_operand_char (*l) && !is_space_char (*l))
1177                   {
1178                     as_bad (_("invalid character %s in operand %d"),
1179                             output_invalid (*l),
1180                             i.operands + 1);
1181                     return;
1182                   }
1183                 if (!intel_syntax)
1184                   {
1185                     if (*l == '(')
1186                       ++paren_not_balanced;
1187                     if (*l == ')')
1188                       --paren_not_balanced;
1189                   }
1190                 else
1191                   {
1192                     if (*l == '[')
1193                       ++paren_not_balanced;
1194                     if (*l == ']')
1195                       --paren_not_balanced;
1196                   }
1197                 l++;
1198               }
1199             if (l != token_start)
1200               {                 /* yes, we've read in another operand */
1201                 unsigned int operand_ok;
1202                 this_operand = i.operands++;
1203                 if (i.operands > MAX_OPERANDS)
1204                   {
1205                     as_bad (_("spurious operands; (%d operands/instruction max)"),
1206                             MAX_OPERANDS);
1207                     return;
1208                   }
1209                 /* now parse operand adding info to 'i' as we go along */
1210                 END_STRING_AND_SAVE (l);
1211
1212                 if (intel_syntax)
1213                   operand_ok = i386_intel_operand (token_start, intel_float_operand (mnemonic));
1214                 else
1215                   operand_ok = i386_operand (token_start);
1216
1217                 RESTORE_END_STRING (l); /* restore old contents */
1218                 if (!operand_ok)
1219                   return;
1220               }
1221             else
1222               {
1223                 if (expecting_operand)
1224                   {
1225                   expecting_operand_after_comma:
1226                     as_bad (_("expecting operand after ','; got nothing"));
1227                     return;
1228                   }
1229                 if (*l == ',')
1230                   {
1231                     as_bad (_("expecting operand before ','; got nothing"));
1232                     return;
1233                   }
1234               }
1235
1236             /* now *l must be either ',' or END_OF_INSN */
1237             if (*l == ',')
1238               {
1239                 if (*++l == END_OF_INSN)
1240                   {             /* just skip it, if it's \n complain */
1241                     goto expecting_operand_after_comma;
1242                   }
1243                 expecting_operand = 1;
1244               }
1245           }
1246         while (*l != END_OF_INSN);      /* until we get end of insn */
1247       }
1248   }
1249
1250   /* Now we've parsed the mnemonic into a set of templates, and have the
1251      operands at hand.
1252
1253      Next, we find a template that matches the given insn,
1254      making sure the overlap of the given operands types is consistent
1255      with the template operand types. */
1256
1257 #define MATCH(overlap, given, template) \
1258   ((overlap) \
1259    && ((given) & BaseIndex) == ((overlap) & BaseIndex) \
1260    && ((given) & JumpAbsolute) == ((template) & JumpAbsolute))
1261
1262   /* If given types r0 and r1 are registers they must be of the same type
1263      unless the expected operand type register overlap is null.
1264      Note that Acc in a template matches every size of reg.  */
1265 #define CONSISTENT_REGISTER_MATCH(m0, g0, t0, m1, g1, t1) \
1266   ( ((g0) & Reg) == 0 || ((g1) & Reg) == 0 || \
1267     ((g0) & Reg) == ((g1) & Reg) || \
1268     ((((m0) & Acc) ? Reg : (t0)) & (((m1) & Acc) ? Reg : (t1)) & Reg) == 0 )
1269
1270   {
1271     register unsigned int overlap0, overlap1;
1272     unsigned int overlap2;
1273     unsigned int found_reverse_match;
1274     int suffix_check;
1275
1276     /* All intel opcodes have reversed operands except for BOUND and ENTER */
1277     if (intel_syntax
1278         && (strcmp (mnemonic, "enter") != 0)
1279         && (strcmp (mnemonic, "bound") != 0)
1280         && (strncmp (mnemonic, "fsub", 4) !=0)
1281         && (strncmp (mnemonic, "fdiv", 4) !=0))
1282       {
1283         const reg_entry *temp_reg = NULL;
1284         expressionS *temp_disp = NULL;
1285         expressionS *temp_imm = NULL;
1286         unsigned int temp_type;
1287         int xchg1 = 0;
1288         int xchg2 = 0;
1289
1290         if (i.operands == 2)
1291           {
1292             xchg1 = 0;
1293             xchg2 = 1;
1294           }
1295         else if (i.operands == 3)
1296           {
1297             xchg1 = 0;
1298             xchg2 = 2;
1299           }
1300
1301         if (i.operands > 1)
1302           {
1303             temp_type = i.types[xchg2];
1304             if (temp_type & (Reg | FloatReg))
1305               temp_reg = i.regs[xchg2];
1306             else if (temp_type & Imm)
1307               temp_imm = i.imms[xchg2];
1308             else if (temp_type & Disp)
1309               temp_disp = i.disps[xchg2];
1310
1311             i.types[xchg2] = i.types[xchg1];
1312
1313             if (i.types[xchg1] & (Reg | FloatReg))
1314               {
1315                 i.regs[xchg2] = i.regs[xchg1];
1316                 i.regs[xchg1] = NULL;
1317               }
1318             else if (i.types[xchg2] & Imm)
1319               {
1320                 i.imms[xchg2] = i.imms[xchg1];
1321                 i.imms[xchg1] = NULL;
1322               }
1323             else if (i.types[xchg2] & Disp)
1324               {
1325                 i.disps[xchg2] = i.disps[xchg1];
1326                 i.disps[xchg1] = NULL;
1327               }
1328
1329             if (temp_type & (Reg | FloatReg))
1330               {
1331                 i.regs[xchg1] = temp_reg;
1332                 if (! (i.types[xchg1] & (Reg | FloatReg)))
1333                   i.regs[xchg2] = NULL;
1334               }
1335             else if (temp_type & Imm)
1336               {
1337                 i.imms[xchg1] = temp_imm;
1338                 if (! (i.types[xchg1] & Imm))
1339                   i.imms[xchg2] = NULL;
1340               }
1341             else if (temp_type & Disp)
1342               {
1343                 i.disps[xchg1] = temp_disp;
1344                 if (! (i.types[xchg1] & Disp))
1345                   i.disps[xchg2] = NULL;
1346               }
1347
1348             i.types[xchg1] = temp_type;
1349           }
1350         if (!strcmp(mnemonic,"jmp")
1351             || !strcmp (mnemonic, "call"))
1352           if ((i.types[0] & Reg) || i.types[0] & BaseIndex)
1353             i.types[0] |= JumpAbsolute;
1354
1355       }
1356     overlap0 = 0;
1357     overlap1 = 0;
1358     overlap2 = 0;
1359     found_reverse_match = 0;
1360     suffix_check = (i.suffix == BYTE_MNEM_SUFFIX
1361                     ? No_bSuf
1362                     : (i.suffix == WORD_MNEM_SUFFIX
1363                        ? No_wSuf
1364                        : (i.suffix == SHORT_MNEM_SUFFIX
1365                           ? No_sSuf
1366                           : (i.suffix == LONG_MNEM_SUFFIX
1367                              ? No_lSuf
1368                              : (i.suffix == INTEL_DWORD_MNEM_SUFFIX
1369                                 ? No_dSuf
1370                                 : (i.suffix == LONG_DOUBLE_MNEM_SUFFIX ? No_xSuf : 0))))));
1371
1372     for (t = current_templates->start;
1373          t < current_templates->end;
1374          t++)
1375       {
1376         /* Must have right number of operands. */
1377         if (i.operands != t->operands)
1378           continue;
1379
1380         /* For some opcodes, don't check the suffix */
1381         if (intel_syntax)
1382           {
1383             if (strcmp (t->name, "fnstcw")
1384                 && strcmp (t->name, "fldcw")
1385                 && (t->opcode_modifier & suffix_check))
1386               continue;
1387           }
1388         /* Must not have disallowed suffix. */
1389         else if ((t->opcode_modifier & suffix_check))
1390           continue;
1391
1392         else if (!t->operands)
1393           break;                /* 0 operands always matches */
1394
1395         overlap0 = i.types[0] & t->operand_types[0];
1396         switch (t->operands)
1397           {
1398           case 1:
1399             if (!MATCH (overlap0, i.types[0], t->operand_types[0]))
1400               continue;
1401             break;
1402           case 2:
1403           case 3:
1404             overlap1 = i.types[1] & t->operand_types[1];
1405             if (!MATCH (overlap0, i.types[0], t->operand_types[0])
1406                 || !MATCH (overlap1, i.types[1], t->operand_types[1])
1407                 || !CONSISTENT_REGISTER_MATCH (overlap0, i.types[0],
1408                                                t->operand_types[0],
1409                                                overlap1, i.types[1],
1410                                                t->operand_types[1]))
1411               {
1412
1413                 /* check if other direction is valid ... */
1414                 if ((t->opcode_modifier & (D|FloatD)) == 0)
1415                   continue;
1416
1417                 /* try reversing direction of operands */
1418                 overlap0 = i.types[0] & t->operand_types[1];
1419                 overlap1 = i.types[1] & t->operand_types[0];
1420                 if (!MATCH (overlap0, i.types[0], t->operand_types[1])
1421                     || !MATCH (overlap1, i.types[1], t->operand_types[0])
1422                     || !CONSISTENT_REGISTER_MATCH (overlap0, i.types[0],
1423                                                    t->operand_types[1],
1424                                                    overlap1, i.types[1],
1425                                                    t->operand_types[0]))
1426                   {
1427                     /* does not match either direction */
1428                     continue;
1429                   }
1430                 /* found_reverse_match holds which of D or FloatDR
1431                    we've found.  */
1432                 found_reverse_match = t->opcode_modifier & (D|FloatDR);
1433                 break;
1434               }
1435             /* found a forward 2 operand match here */
1436             if (t->operands == 3)
1437               {
1438                 /* Here we make use of the fact that there are no
1439                    reverse match 3 operand instructions, and all 3
1440                    operand instructions only need to be checked for
1441                    register consistency between operands 2 and 3.  */
1442                 overlap2 = i.types[2] & t->operand_types[2];
1443                 if (!MATCH (overlap2, i.types[2], t->operand_types[2])
1444                     || !CONSISTENT_REGISTER_MATCH (overlap1, i.types[1],
1445                                                    t->operand_types[1],
1446                                                    overlap2, i.types[2],
1447                                                    t->operand_types[2]))
1448
1449                   continue;
1450               }
1451             /* found either forward/reverse 2 or 3 operand match here:
1452                slip through to break */
1453           }
1454         break;                  /* we've found a match; break out of loop */
1455       }                         /* for (t = ... */
1456     if (t == current_templates->end)
1457       {                         /* we found no match */
1458         as_bad (_("suffix or operands invalid for `%s'"),
1459                 current_templates->start->name);
1460         return;
1461       }
1462
1463     if ((t->opcode_modifier & (IsPrefix|IgnoreSize)) == (IsPrefix|IgnoreSize))
1464       {
1465         /* Warn them that a data or address size prefix doesn't affect
1466            assembly of the next line of code.  */
1467         as_warn (_("stand-alone `%s' prefix"), t->name);
1468       }
1469
1470     /* Copy the template we found.  */
1471     i.tm = *t;
1472     if (found_reverse_match)
1473       {
1474         i.tm.operand_types[0] = t->operand_types[1];
1475         i.tm.operand_types[1] = t->operand_types[0];
1476       }
1477
1478
1479     if (i.tm.opcode_modifier & FWait)
1480       if (! add_prefix (FWAIT_OPCODE))
1481         return;
1482
1483     /* Check string instruction segment overrides */
1484     if ((i.tm.opcode_modifier & IsString) != 0 && i.mem_operands != 0)
1485       {
1486         int mem_op = (i.types[0] & AnyMem) ? 0 : 1;
1487         if ((i.tm.operand_types[mem_op] & EsSeg) != 0)
1488           {
1489             if (i.seg[0] != NULL && i.seg[0] != &es)
1490               {
1491                 as_bad (_("`%s' operand %d must use `%%es' segment"),
1492                         i.tm.name,
1493                         mem_op + 1);
1494                 return;
1495               }
1496             /* There's only ever one segment override allowed per instruction.
1497                This instruction possibly has a legal segment override on the
1498                second operand, so copy the segment to where non-string
1499                instructions store it, allowing common code.  */
1500             i.seg[0] = i.seg[1];
1501           }
1502         else if ((i.tm.operand_types[mem_op + 1] & EsSeg) != 0)
1503           {
1504             if (i.seg[1] != NULL && i.seg[1] != &es)
1505               {
1506                 as_bad (_("`%s' operand %d must use `%%es' segment"),
1507                         i.tm.name,
1508                         mem_op + 2);
1509                 return;
1510               }
1511           }
1512       }
1513
1514     /* If matched instruction specifies an explicit instruction mnemonic
1515        suffix, use it.  */
1516     if (i.tm.opcode_modifier & (Size16 | Size32))
1517       {
1518         if (i.tm.opcode_modifier & Size16)
1519           i.suffix = WORD_MNEM_SUFFIX;
1520         else
1521           i.suffix = DWORD_MNEM_SUFFIX;
1522       }
1523     else if (i.reg_operands)
1524       {
1525         /* If there's no instruction mnemonic suffix we try to invent one
1526            based on register operands. */
1527         if (!i.suffix)
1528           {
1529             /* We take i.suffix from the last register operand specified,
1530                Destination register type is more significant than source
1531                register type.  */
1532             int op;
1533             for (op = i.operands; --op >= 0; )
1534               if (i.types[op] & Reg)
1535                 {
1536                   i.suffix = ((i.types[op] & Reg8) ? BYTE_MNEM_SUFFIX :
1537                               (i.types[op] & Reg16) ? WORD_MNEM_SUFFIX :
1538                               DWORD_MNEM_SUFFIX);
1539                   break;
1540                 }
1541           }
1542         else if (i.suffix == BYTE_MNEM_SUFFIX)
1543           {
1544             int op;
1545             for (op = i.operands; --op >= 0; )
1546               {
1547                 /* If this is an eight bit register, it's OK.  If it's
1548                    the 16 or 32 bit version of an eight bit register,
1549                    we will just use the low portion, and that's OK too. */
1550                 if (i.types[op] & Reg8)
1551                   continue;
1552
1553                 /* movzx and movsx should not generate this warning. */
1554                 if (intel_syntax
1555                     && (i.tm.base_opcode == 0xfb7
1556                         || i.tm.base_opcode == 0xfb6
1557                         || i.tm.base_opcode == 0xfbe
1558                         || i.tm.base_opcode == 0xfbf))
1559                   continue;
1560
1561                 if ((i.types[op] & WordReg) && i.regs[op]->reg_num < 4
1562 #if 0
1563                     /* Check that the template allows eight bit regs
1564                        This kills insns such as `orb $1,%edx', which
1565                        maybe should be allowed.  */
1566                     && (i.tm.operand_types[op] & (Reg8|InOutPortReg))
1567 #endif
1568                     )
1569                   {
1570 #if REGISTER_WARNINGS
1571                     if ((i.tm.operand_types[op] & InOutPortReg) == 0)
1572                       as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
1573                                (i.regs[op] - (i.types[op] & Reg16 ? 8 : 16))->reg_name,
1574                                i.regs[op]->reg_name,
1575                                i.suffix);
1576 #endif
1577                     continue;
1578                   }
1579                 /* Any other register is bad */
1580                 if (i.types[op] & (Reg | RegMMX | RegXMM
1581                                    | SReg2 | SReg3
1582                                    | Control | Debug | Test
1583                                    | FloatReg | FloatAcc))
1584                   {
1585                     as_bad (_("`%%%s' not allowed with `%s%c'"),
1586                             i.regs[op]->reg_name,
1587                             i.tm.name,
1588                             i.suffix);
1589                     return;
1590                   }
1591               }
1592           }
1593         else if (i.suffix == DWORD_MNEM_SUFFIX)
1594           {
1595             int op;
1596             for (op = i.operands; --op >= 0; )
1597               /* Reject eight bit registers, except where the template
1598                  requires them. (eg. movzb)  */
1599               if ((i.types[op] & Reg8) != 0
1600                   && (i.tm.operand_types[op] & (Reg16|Reg32|Acc)) != 0)
1601                 {
1602                   as_bad (_("`%%%s' not allowed with `%s%c'"),
1603                           i.regs[op]->reg_name,
1604                           i.tm.name,
1605                           i.suffix);
1606                   return;
1607                 }
1608 #if REGISTER_WARNINGS
1609               /* Warn if the e prefix on a general reg is missing.  */
1610               else if ((i.types[op] & Reg16) != 0
1611                        && (i.tm.operand_types[op] & (Reg32|Acc)) != 0)
1612                 {
1613                   as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
1614                            (i.regs[op] + 8)->reg_name,
1615                            i.regs[op]->reg_name,
1616                            i.suffix);
1617                 }
1618 #endif
1619           }
1620         else if (i.suffix == WORD_MNEM_SUFFIX)
1621           {
1622             int op;
1623             for (op = i.operands; --op >= 0; )
1624               /* Reject eight bit registers, except where the template
1625                  requires them. (eg. movzb)  */
1626               if ((i.types[op] & Reg8) != 0
1627                   && (i.tm.operand_types[op] & (Reg16|Reg32|Acc)) != 0)
1628                 {
1629                   as_bad (_("`%%%s' not allowed with `%s%c'"),
1630                           i.regs[op]->reg_name,
1631                           i.tm.name,
1632                           i.suffix);
1633                   return;
1634                 }
1635 #if REGISTER_WARNINGS
1636               /* Warn if the e prefix on a general reg is present.  */
1637               else if ((i.types[op] & Reg32) != 0
1638                        && (i.tm.operand_types[op] & (Reg16|Acc)) != 0)
1639                 {
1640                   as_warn (_("using `%%%s' instead of `%%%s' due to `%c' suffix"),
1641                            (i.regs[op] - 8)->reg_name,
1642                            i.regs[op]->reg_name,
1643                            i.suffix);
1644                 }
1645 #endif
1646           }
1647         else
1648           abort();
1649       }
1650     else if ((i.tm.opcode_modifier & DefaultSize) && !i.suffix)
1651       {
1652         i.suffix = stackop_size;
1653       }
1654
1655     /* Make still unresolved immediate matches conform to size of immediate
1656        given in i.suffix.  Note: overlap2 cannot be an immediate!  */
1657     if ((overlap0 & (Imm8 | Imm8S | Imm16 | Imm32))
1658         && overlap0 != Imm8 && overlap0 != Imm8S
1659         && overlap0 != Imm16 && overlap0 != Imm32)
1660       {
1661         if (i.suffix)
1662           {
1663             overlap0 &= (i.suffix == BYTE_MNEM_SUFFIX ? (Imm8 | Imm8S) :
1664                          (i.suffix == WORD_MNEM_SUFFIX ? Imm16 : Imm32));
1665           }
1666         else if (overlap0 == (Imm16 | Imm32))
1667           {
1668             overlap0 =
1669               (flag_16bit_code ^ (i.prefix[DATA_PREFIX] != 0)) ? Imm16 : Imm32;
1670           }
1671         else
1672           {
1673             as_bad (_("no instruction mnemonic suffix given; can't determine immediate size"));
1674             return;
1675           }
1676       }
1677     if ((overlap1 & (Imm8 | Imm8S | Imm16 | Imm32))
1678         && overlap1 != Imm8 && overlap1 != Imm8S
1679         && overlap1 != Imm16 && overlap1 != Imm32)
1680       {
1681         if (i.suffix)
1682           {
1683             overlap1 &= (i.suffix == BYTE_MNEM_SUFFIX ? (Imm8 | Imm8S) :
1684                          (i.suffix == WORD_MNEM_SUFFIX ? Imm16 : Imm32));
1685           }
1686         else if (overlap1 == (Imm16 | Imm32))
1687           {
1688             overlap1 =
1689               (flag_16bit_code ^ (i.prefix[DATA_PREFIX] != 0)) ? Imm16 : Imm32;
1690           }
1691         else
1692           {
1693             as_bad (_("no instruction mnemonic suffix given; can't determine immediate size"));
1694             return;
1695           }
1696       }
1697     assert ((overlap2 & Imm) == 0);
1698
1699     i.types[0] = overlap0;
1700     if (overlap0 & ImplicitRegister)
1701       i.reg_operands--;
1702     if (overlap0 & Imm1)
1703       i.imm_operands = 0;       /* kludge for shift insns */
1704
1705     i.types[1] = overlap1;
1706     if (overlap1 & ImplicitRegister)
1707       i.reg_operands--;
1708
1709     i.types[2] = overlap2;
1710     if (overlap2 & ImplicitRegister)
1711       i.reg_operands--;
1712
1713     /* Finalize opcode.  First, we change the opcode based on the operand
1714        size given by i.suffix:  We need not change things for byte insns.  */
1715
1716     if (!i.suffix && (i.tm.opcode_modifier & W))
1717       {
1718         as_bad (_("no instruction mnemonic suffix given and no register operands; can't size instruction"));
1719         return;
1720       }
1721
1722     /* For movzx and movsx, need to check the register type */
1723     if (intel_syntax
1724         && (i.tm.base_opcode == 0xfb6 || i.tm.base_opcode == 0xfbe))
1725       if (i.suffix && i.suffix == BYTE_MNEM_SUFFIX)
1726         {
1727           unsigned int prefix = DATA_PREFIX_OPCODE;
1728
1729           if ((i.regs[1]->reg_type & Reg16) != 0)
1730             if (!add_prefix (prefix))
1731               return;
1732         }
1733
1734     if (i.suffix && i.suffix != BYTE_MNEM_SUFFIX)
1735       {
1736         /* It's not a byte, select word/dword operation.  */
1737         if (i.tm.opcode_modifier & W)
1738           {
1739             if (i.tm.opcode_modifier & ShortForm)
1740               i.tm.base_opcode |= 8;
1741             else
1742               i.tm.base_opcode |= 1;
1743           }
1744         /* Now select between word & dword operations via the operand
1745            size prefix, except for instructions that will ignore this
1746            prefix anyway.  */
1747         if (((intel_syntax && (i.suffix == INTEL_DWORD_MNEM_SUFFIX))
1748              || i.suffix == DWORD_MNEM_SUFFIX
1749              || i.suffix == LONG_MNEM_SUFFIX) == flag_16bit_code
1750             && !(i.tm.opcode_modifier & IgnoreSize))
1751           {
1752             unsigned int prefix = DATA_PREFIX_OPCODE;
1753             if (i.tm.opcode_modifier & JumpByte) /* jcxz, loop */
1754               prefix = ADDR_PREFIX_OPCODE;
1755
1756             if (! add_prefix (prefix))
1757               return;
1758           }
1759         /* Size floating point instruction.  */
1760         if (i.suffix == LONG_MNEM_SUFFIX
1761             || (intel_syntax && i.suffix == INTEL_DWORD_MNEM_SUFFIX))
1762           {
1763             if (i.tm.opcode_modifier & FloatMF)
1764               i.tm.base_opcode ^= 4;
1765           }
1766       }
1767
1768     if (i.tm.opcode_modifier & ImmExt)
1769       {
1770         /* These AMD 3DNow! and Intel Katmai New Instructions have an
1771            opcode suffix which is coded in the same place as an 8-bit
1772            immediate field would be.  Here we fake an 8-bit immediate
1773            operand from the opcode suffix stored in tm.extension_opcode.  */
1774
1775         expressionS *exp;
1776
1777         assert(i.imm_operands == 0 && i.operands <= 2);
1778
1779         exp = &im_expressions[i.imm_operands++];
1780         i.imms[i.operands] = exp;
1781         i.types[i.operands++] = Imm8;
1782         exp->X_op = O_constant;
1783         exp->X_add_number = i.tm.extension_opcode;
1784         i.tm.extension_opcode = None;
1785       }
1786
1787     /* For insns with operands there are more diddles to do to the opcode. */
1788     if (i.operands)
1789       {
1790         /* Default segment register this instruction will use
1791            for memory accesses.  0 means unknown.
1792            This is only for optimizing out unnecessary segment overrides.  */
1793         const seg_entry *default_seg = 0;
1794
1795         /* If we found a reverse match we must alter the opcode
1796            direction bit.  found_reverse_match holds bits to change
1797            (different for int & float insns).  */
1798
1799         i.tm.base_opcode ^= found_reverse_match;
1800
1801         /* The imul $imm, %reg instruction is converted into
1802            imul $imm, %reg, %reg, and the clr %reg instruction
1803            is converted into xor %reg, %reg.  */
1804         if (i.tm.opcode_modifier & regKludge)
1805           {
1806             unsigned int first_reg_op = (i.types[0] & Reg) ? 0 : 1;
1807             /* Pretend we saw the extra register operand. */
1808             i.regs[first_reg_op+1] = i.regs[first_reg_op];
1809             i.reg_operands = 2;
1810           }
1811
1812         if (i.tm.opcode_modifier & ShortForm)
1813           {
1814             /* The register or float register operand is in operand 0 or 1. */
1815             unsigned int op = (i.types[0] & (Reg | FloatReg)) ? 0 : 1;
1816             /* Register goes in low 3 bits of opcode. */
1817             i.tm.base_opcode |= i.regs[op]->reg_num;
1818             if ((i.tm.opcode_modifier & Ugh) != 0)
1819               {
1820                 /* Warn about some common errors, but press on regardless.
1821                    The first case can be generated by gcc (<= 2.8.1).  */
1822                 if (i.operands == 2)
1823                   {
1824                     /* reversed arguments on faddp, fsubp, etc. */
1825                     as_warn (_("translating to `%s %%%s,%%%s'"), i.tm.name,
1826                              i.regs[1]->reg_name,
1827                              i.regs[0]->reg_name);
1828                   }
1829                 else
1830                   {
1831                     /* extraneous `l' suffix on fp insn */
1832                     as_warn (_("translating to `%s %%%s'"), i.tm.name,
1833                              i.regs[0]->reg_name);
1834                   }
1835               }
1836           }
1837         else if (i.tm.opcode_modifier & Modrm)
1838           {
1839             /* The opcode is completed (modulo i.tm.extension_opcode which
1840                must be put into the modrm byte).
1841                Now, we make the modrm & index base bytes based on all the
1842                info we've collected. */
1843
1844             /* i.reg_operands MUST be the number of real register operands;
1845                implicit registers do not count. */
1846             if (i.reg_operands == 2)
1847               {
1848                 unsigned int source, dest;
1849                 source = ((i.types[0]
1850                            & (Reg | RegMMX | RegXMM
1851                               | SReg2 | SReg3
1852                               | Control | Debug | Test))
1853                           ? 0 : 1);
1854                 dest = source + 1;
1855
1856                 i.rm.mode = 3;
1857                 /* One of the register operands will be encoded in the
1858                    i.tm.reg field, the other in the combined i.tm.mode
1859                    and i.tm.regmem fields.  If no form of this
1860                    instruction supports a memory destination operand,
1861                    then we assume the source operand may sometimes be
1862                    a memory operand and so we need to store the
1863                    destination in the i.rm.reg field.  */
1864                 if ((i.tm.operand_types[dest] & AnyMem) == 0)
1865                   {
1866                     i.rm.reg = i.regs[dest]->reg_num;
1867                     i.rm.regmem = i.regs[source]->reg_num;
1868                   }
1869                 else
1870                   {
1871                     i.rm.reg = i.regs[source]->reg_num;
1872                     i.rm.regmem = i.regs[dest]->reg_num;
1873                   }
1874               }
1875             else
1876               {                 /* if it's not 2 reg operands... */
1877                 if (i.mem_operands)
1878                   {
1879                     unsigned int fake_zero_displacement = 0;
1880                     unsigned int op = ((i.types[0] & AnyMem)
1881                                        ? 0
1882                                        : (i.types[1] & AnyMem) ? 1 : 2);
1883
1884                     default_seg = &ds;
1885
1886                     if (! i.base_reg)
1887                       {
1888                         i.rm.mode = 0;
1889                         if (! i.disp_operands)
1890                           fake_zero_displacement = 1;
1891                         if (! i.index_reg)
1892                           {
1893                             /* Operand is just <disp> */
1894                             if (flag_16bit_code ^ (i.prefix[ADDR_PREFIX] != 0))
1895                               {
1896                                 i.rm.regmem = NO_BASE_REGISTER_16;
1897                                 i.types[op] &= ~Disp;
1898                                 i.types[op] |= Disp16;
1899                               }
1900                             else
1901                               {
1902                                 i.rm.regmem = NO_BASE_REGISTER;
1903                                 i.types[op] &= ~Disp;
1904                                 i.types[op] |= Disp32;
1905                               }
1906                           }
1907                         else /* ! i.base_reg && i.index_reg */
1908                           {
1909                             i.sib.index = i.index_reg->reg_num;
1910                             i.sib.base = NO_BASE_REGISTER;
1911                             i.sib.scale = i.log2_scale_factor;
1912                             i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
1913                             i.types[op] &= ~Disp;
1914                             i.types[op] |= Disp32;      /* Must be 32 bit */
1915                           }
1916                       }
1917                     else if (i.base_reg->reg_type & Reg16)
1918                       {
1919                         switch (i.base_reg->reg_num)
1920                           {
1921                           case 3: /* (%bx) */
1922                             if (! i.index_reg)
1923                               i.rm.regmem = 7;
1924                             else /* (%bx,%si) -> 0, or (%bx,%di) -> 1 */
1925                               i.rm.regmem = i.index_reg->reg_num - 6;
1926                             break;
1927                           case 5: /* (%bp) */
1928                             default_seg = &ss;
1929                             if (! i.index_reg)
1930                               {
1931                                 i.rm.regmem = 6;
1932                                 if ((i.types[op] & Disp) == 0)
1933                                   {
1934                                     /* fake (%bp) into 0(%bp) */
1935                                     i.types[op] |= Disp8;
1936                                     fake_zero_displacement = 1;
1937                                   }
1938                               }
1939                             else /* (%bp,%si) -> 2, or (%bp,%di) -> 3 */
1940                               i.rm.regmem = i.index_reg->reg_num - 6 + 2;
1941                             break;
1942                           default: /* (%si) -> 4 or (%di) -> 5 */
1943                             i.rm.regmem = i.base_reg->reg_num - 6 + 4;
1944                           }
1945                         i.rm.mode = mode_from_disp_size (i.types[op]);
1946                       }
1947                     else /* i.base_reg and 32 bit mode */
1948                       {
1949                         i.rm.regmem = i.base_reg->reg_num;
1950                         i.sib.base = i.base_reg->reg_num;
1951                         if (i.base_reg->reg_num == EBP_REG_NUM)
1952                           {
1953                             default_seg = &ss;
1954                             if (i.disp_operands == 0)
1955                               {
1956                                 fake_zero_displacement = 1;
1957                                 i.types[op] |= Disp8;
1958                               }
1959                           }
1960                         else if (i.base_reg->reg_num == ESP_REG_NUM)
1961                           {
1962                             default_seg = &ss;
1963                           }
1964                         i.sib.scale = i.log2_scale_factor;
1965                         if (! i.index_reg)
1966                           {
1967                             /* <disp>(%esp) becomes two byte modrm
1968                                with no index register.  We've already
1969                                stored the code for esp in i.rm.regmem
1970                                ie. ESCAPE_TO_TWO_BYTE_ADDRESSING.  Any
1971                                base register besides %esp will not use
1972                                the extra modrm byte.  */
1973                             i.sib.index = NO_INDEX_REGISTER;
1974 #if ! SCALE1_WHEN_NO_INDEX
1975                             /* Another case where we force the second
1976                                modrm byte.  */
1977                             if (i.log2_scale_factor)
1978                               i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
1979 #endif
1980                           }
1981                         else
1982                           {
1983                             i.sib.index = i.index_reg->reg_num;
1984                             i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING;
1985                           }
1986                         i.rm.mode = mode_from_disp_size (i.types[op]);
1987                       }
1988
1989                     if (fake_zero_displacement)
1990                       {
1991                         /* Fakes a zero displacement assuming that i.types[op]
1992                            holds the correct displacement size. */
1993                         expressionS *exp;
1994
1995                         exp = &disp_expressions[i.disp_operands++];
1996                         i.disps[op] = exp;
1997                         exp->X_op = O_constant;
1998                         exp->X_add_number = 0;
1999                         exp->X_add_symbol = (symbolS *) 0;
2000                         exp->X_op_symbol = (symbolS *) 0;
2001                       }
2002                   }
2003
2004                 /* Fill in i.rm.reg or i.rm.regmem field with register
2005                    operand (if any) based on i.tm.extension_opcode.
2006                    Again, we must be careful to make sure that
2007                    segment/control/debug/test/MMX registers are coded
2008                    into the i.rm.reg field. */
2009                 if (i.reg_operands)
2010                   {
2011                     unsigned int op =
2012                       ((i.types[0]
2013                         & (Reg | RegMMX | RegXMM
2014                            | SReg2 | SReg3
2015                            | Control | Debug | Test))
2016                        ? 0
2017                        : ((i.types[1]
2018                            & (Reg | RegMMX | RegXMM
2019                               | SReg2 | SReg3
2020                               | Control | Debug | Test))
2021                           ? 1
2022                           : 2));
2023                     /* If there is an extension opcode to put here, the
2024                        register number must be put into the regmem field. */
2025                     if (i.tm.extension_opcode != None)
2026                       i.rm.regmem = i.regs[op]->reg_num;
2027                     else
2028                       i.rm.reg = i.regs[op]->reg_num;
2029
2030                     /* Now, if no memory operand has set i.rm.mode = 0, 1, 2
2031                        we must set it to 3 to indicate this is a register
2032                        operand in the regmem field.  */
2033                     if (!i.mem_operands)
2034                       i.rm.mode = 3;
2035                   }
2036
2037                 /* Fill in i.rm.reg field with extension opcode (if any). */
2038                 if (i.tm.extension_opcode != None)
2039                   i.rm.reg = i.tm.extension_opcode;
2040               }
2041           }
2042         else if (i.tm.opcode_modifier & (Seg2ShortForm | Seg3ShortForm))
2043           {
2044             if (i.tm.base_opcode == POP_SEG_SHORT && i.regs[0]->reg_num == 1)
2045               {
2046                 as_bad (_("you can't `pop %%cs'"));
2047                 return;
2048               }
2049             i.tm.base_opcode |= (i.regs[0]->reg_num << 3);
2050           }
2051         else if ((i.tm.base_opcode & ~(D|W)) == MOV_AX_DISP32)
2052           {
2053             default_seg = &ds;
2054           }
2055         else if ((i.tm.opcode_modifier & IsString) != 0)
2056           {
2057             /* For the string instructions that allow a segment override
2058                on one of their operands, the default segment is ds.  */
2059             default_seg = &ds;
2060           }
2061
2062         /* If a segment was explicitly specified,
2063            and the specified segment is not the default,
2064            use an opcode prefix to select it.
2065            If we never figured out what the default segment is,
2066            then default_seg will be zero at this point,
2067            and the specified segment prefix will always be used.  */
2068         if ((i.seg[0]) && (i.seg[0] != default_seg))
2069           {
2070             if (! add_prefix (i.seg[0]->seg_prefix))
2071               return;
2072           }
2073       }
2074     else if ((i.tm.opcode_modifier & Ugh) != 0)
2075       {
2076         /* UnixWare fsub no args is alias for fsubp, fadd -> faddp, etc.  */
2077         as_warn (_("translating to `%sp'"), i.tm.name);
2078       }
2079   }
2080
2081   /* Handle conversion of 'int $3' --> special int3 insn. */
2082   if (i.tm.base_opcode == INT_OPCODE && i.imms[0]->X_add_number == 3)
2083     {
2084       i.tm.base_opcode = INT3_OPCODE;
2085       i.imm_operands = 0;
2086     }
2087
2088   if ((i.tm.opcode_modifier & (Jump | JumpByte | JumpDword))
2089       && i.disps[0]->X_op == O_constant)
2090     {
2091       /* Convert "jmp constant" (and "call constant") to a jump (call) to
2092          the absolute address given by the constant.  Since ix86 jumps and
2093          calls are pc relative, we need to generate a reloc.  */
2094       i.disps[0]->X_add_symbol = &abs_symbol;
2095       i.disps[0]->X_op = O_symbol;
2096     }
2097
2098   /* We are ready to output the insn. */
2099   {
2100     register char *p;
2101
2102     /* Output jumps. */
2103     if (i.tm.opcode_modifier & Jump)
2104       {
2105         int size;
2106         int code16;
2107         int prefix;
2108
2109         code16 = 0;
2110         if (flag_16bit_code)
2111           code16 = CODE16;
2112
2113         prefix = 0;
2114         if (i.prefix[DATA_PREFIX])
2115           {
2116             prefix = 1;
2117             i.prefixes -= 1;
2118             code16 ^= CODE16;
2119           }
2120
2121         size = 4;
2122         if (code16)
2123           size = 2;
2124
2125         if (i.prefixes != 0 && !intel_syntax)
2126           as_warn (_("skipping prefixes on this instruction"));
2127
2128         /* It's always a symbol;  End frag & setup for relax.
2129            Make sure there is enough room in this frag for the largest
2130            instruction we may generate in md_convert_frag.  This is 2
2131            bytes for the opcode and room for the prefix and largest
2132            displacement.  */
2133         frag_grow (prefix + 2 + size);
2134         insn_size += prefix + 1;
2135         /* Prefix and 1 opcode byte go in fr_fix.  */
2136         p = frag_more (prefix + 1);
2137         if (prefix)
2138           *p++ = DATA_PREFIX_OPCODE;
2139         *p = i.tm.base_opcode;
2140         /* 1 possible extra opcode + displacement go in fr_var.  */
2141         frag_var (rs_machine_dependent,
2142                   1 + size,
2143                   1,
2144                   ((unsigned char) *p == JUMP_PC_RELATIVE
2145                    ? ENCODE_RELAX_STATE (UNCOND_JUMP, SMALL) | code16
2146                    : ENCODE_RELAX_STATE (COND_JUMP, SMALL) | code16),
2147                   i.disps[0]->X_add_symbol,
2148                   i.disps[0]->X_add_number,
2149                   p);
2150       }
2151     else if (i.tm.opcode_modifier & (JumpByte | JumpDword))
2152       {
2153         int size;
2154
2155         if (i.tm.opcode_modifier & JumpByte)
2156           {
2157             /* This is a loop or jecxz type instruction.  */
2158             size = 1;
2159             if (i.prefix[ADDR_PREFIX])
2160               {
2161                 insn_size += 1;
2162                 FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
2163                 i.prefixes -= 1;
2164               }
2165           }
2166         else
2167           {
2168             int code16;
2169
2170             code16 = 0;
2171             if (flag_16bit_code)
2172               code16 = CODE16;
2173
2174             if (i.prefix[DATA_PREFIX])
2175               {
2176                 insn_size += 1;
2177                 FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
2178                 i.prefixes -= 1;
2179                 code16 ^= CODE16;
2180               }
2181
2182             size = 4;
2183             if (code16)
2184               size = 2;
2185           }
2186
2187         if (i.prefixes != 0 && !intel_syntax)
2188           as_warn (_("skipping prefixes on this instruction"));
2189
2190         if (fits_in_unsigned_byte (i.tm.base_opcode))
2191           {
2192             insn_size += 1 + size;
2193             p = frag_more (1 + size);
2194           }
2195         else
2196           {
2197             /* opcode can be at most two bytes */
2198             insn_size += 2 + size;
2199             p = frag_more (2 + size);
2200             *p++ = (i.tm.base_opcode >> 8) & 0xff;
2201           }
2202         *p++ = i.tm.base_opcode & 0xff;
2203
2204         fix_new_exp (frag_now, p - frag_now->fr_literal, size,
2205                      i.disps[0], 1, reloc (size, 1, i.disp_reloc[0]));
2206       }
2207     else if (i.tm.opcode_modifier & JumpInterSegment)
2208       {
2209         int size;
2210         int reloc_type;
2211         int prefix;
2212         int code16;
2213
2214         code16 = 0;
2215         if (flag_16bit_code)
2216           code16 = CODE16;
2217
2218         prefix = 0;
2219         if (i.prefix[DATA_PREFIX])
2220           {
2221             prefix = 1;
2222             i.prefixes -= 1;
2223             code16 ^= CODE16;
2224           }
2225
2226         size = 4;
2227         reloc_type = BFD_RELOC_32;
2228         if (code16)
2229           {
2230             size = 2;
2231             reloc_type = BFD_RELOC_16;
2232           }
2233
2234         if (i.prefixes != 0 && !intel_syntax)
2235           as_warn (_("skipping prefixes on this instruction"));
2236
2237         insn_size += prefix + 1 + 2 + size;  /* 1 opcode; 2 segment; offset */
2238         p = frag_more (prefix + 1 + 2 + size);
2239         if (prefix)
2240           *p++ = DATA_PREFIX_OPCODE;
2241         *p++ = i.tm.base_opcode;
2242         if (i.imms[1]->X_op == O_constant)
2243           {
2244             long n = (long) i.imms[1]->X_add_number;
2245
2246             if (size == 2 && !fits_in_unsigned_word (n))
2247               {
2248                 as_bad (_("16-bit jump out of range"));
2249                 return;
2250               }
2251             md_number_to_chars (p, (valueT) n, size);
2252           }
2253         else
2254           fix_new_exp (frag_now, p - frag_now->fr_literal, size,
2255                        i.imms[1], 0, reloc_type);
2256         if (i.imms[0]->X_op != O_constant)
2257           as_bad (_("can't handle non absolute segment in `%s'"),
2258                   i.tm.name);
2259         md_number_to_chars (p + size, (valueT) i.imms[0]->X_add_number, 2);
2260       }
2261     else
2262       {
2263         /* Output normal instructions here. */
2264         unsigned char *q;
2265
2266         /* The prefix bytes. */
2267         for (q = i.prefix;
2268              q < i.prefix + sizeof (i.prefix) / sizeof (i.prefix[0]);
2269              q++)
2270           {
2271             if (*q)
2272               {
2273                 insn_size += 1;
2274                 p = frag_more (1);
2275                 md_number_to_chars (p, (valueT) *q, 1);
2276               }
2277           }
2278
2279         /* Now the opcode; be careful about word order here! */
2280         if (fits_in_unsigned_byte (i.tm.base_opcode))
2281           {
2282             insn_size += 1;
2283             FRAG_APPEND_1_CHAR (i.tm.base_opcode);
2284           }
2285         else if (fits_in_unsigned_word (i.tm.base_opcode))
2286           {
2287             insn_size += 2;
2288             p = frag_more (2);
2289             /* put out high byte first: can't use md_number_to_chars! */
2290             *p++ = (i.tm.base_opcode >> 8) & 0xff;
2291             *p = i.tm.base_opcode & 0xff;
2292           }
2293         else
2294           {                     /* opcode is either 3 or 4 bytes */
2295             if (i.tm.base_opcode & 0xff000000)
2296               {
2297                 insn_size += 4;
2298                 p = frag_more (4);
2299                 *p++ = (i.tm.base_opcode >> 24) & 0xff;
2300               }
2301             else
2302               {
2303                 insn_size += 3;
2304                 p = frag_more (3);
2305               }
2306             *p++ = (i.tm.base_opcode >> 16) & 0xff;
2307             *p++ = (i.tm.base_opcode >> 8) & 0xff;
2308             *p = (i.tm.base_opcode) & 0xff;
2309           }
2310
2311         /* Now the modrm byte and sib byte (if present).  */
2312         if (i.tm.opcode_modifier & Modrm)
2313           {
2314             insn_size += 1;
2315             p = frag_more (1);
2316             md_number_to_chars (p,
2317                                 (valueT) (i.rm.regmem << 0
2318                                           | i.rm.reg << 3
2319                                           | i.rm.mode << 6),
2320                                 1);
2321             /* If i.rm.regmem == ESP (4)
2322                && i.rm.mode != (Register mode)
2323                && not 16 bit
2324                ==> need second modrm byte.  */
2325             if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING
2326                 && i.rm.mode != 3
2327                 && !(i.base_reg && (i.base_reg->reg_type & Reg16) != 0))
2328               {
2329                 insn_size += 1;
2330                 p = frag_more (1);
2331                 md_number_to_chars (p,
2332                                     (valueT) (i.sib.base << 0
2333                                               | i.sib.index << 3
2334                                               | i.sib.scale << 6),
2335                                     1);
2336               }
2337           }
2338
2339         if (i.disp_operands)
2340           {
2341             register unsigned int n;
2342
2343             for (n = 0; n < i.operands; n++)
2344               {
2345                 if (i.disps[n])
2346                   {
2347                     if (i.disps[n]->X_op == O_constant)
2348                       {
2349                         int size = 4;
2350                         long val = (long) i.disps[n]->X_add_number;
2351
2352                         if (i.types[n] & (Disp8 | Disp16))
2353                           {
2354                             long mask;
2355
2356                             size = 2;
2357                             mask = ~ (long) 0xffff;
2358                             if (i.types[n] & Disp8)
2359                               {
2360                                 size = 1;
2361                                 mask = ~ (long) 0xff;
2362                               }
2363
2364                             if ((val & mask) != 0 && (val & mask) != mask)
2365                               as_warn (_("%ld shortened to %ld"),
2366                                        val, val & ~mask);
2367                           }
2368                         insn_size += size;
2369                         p = frag_more (size);
2370                         md_number_to_chars (p, (valueT) val, size);
2371                       }
2372                     else if (i.types[n] & Disp32)
2373                       {
2374                         insn_size += 4;
2375                         p = frag_more (4);
2376                         fix_new_exp (frag_now, p - frag_now->fr_literal, 4,
2377                                      i.disps[n], 0,
2378                                      TC_RELOC (i.disp_reloc[n], BFD_RELOC_32));
2379                       }
2380                     else
2381                       { /* must be Disp16 */
2382                         insn_size += 2;
2383                         p = frag_more (2);
2384                         fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
2385                                      i.disps[n], 0,
2386                                      TC_RELOC (i.disp_reloc[n], BFD_RELOC_16));
2387                       }
2388                   }
2389               }
2390           }                     /* end displacement output */
2391
2392         /* output immediate */
2393         if (i.imm_operands)
2394           {
2395             register unsigned int n;
2396
2397             for (n = 0; n < i.operands; n++)
2398               {
2399                 if (i.imms[n])
2400                   {
2401                     if (i.imms[n]->X_op == O_constant)
2402                       {
2403                         int size = 4;
2404                         long val = (long) i.imms[n]->X_add_number;
2405
2406                         if (i.types[n] & (Imm8 | Imm8S | Imm16))
2407                           {
2408                             long mask;
2409
2410                             size = 2;
2411                             mask = ~ (long) 0xffff;
2412                             if (i.types[n] & (Imm8 | Imm8S))
2413                               {
2414                                 size = 1;
2415                                 mask = ~ (long) 0xff;
2416                               }
2417                             if ((val & mask) != 0 && (val & mask) != mask)
2418                               as_warn (_("%ld shortened to %ld"),
2419                                        val, val & ~mask);
2420                           }
2421                         insn_size += size;
2422                         p = frag_more (size);
2423                         md_number_to_chars (p, (valueT) val, size);
2424                       }
2425                     else
2426                       {         /* not absolute_section */
2427                         /* Need a 32-bit fixup (don't support 8bit
2428                            non-absolute ims).  Try to support other
2429                            sizes ... */
2430                         int r_type;
2431                         int size;
2432                         int pcrel = 0;
2433
2434                         if (i.types[n] & (Imm8 | Imm8S))
2435                           size = 1;
2436                         else if (i.types[n] & Imm16)
2437                           size = 2;
2438                         else
2439                           size = 4;
2440                         insn_size += size;
2441                         p = frag_more (size);
2442                         r_type = reloc (size, 0, i.disp_reloc[0]);
2443 #ifdef BFD_ASSEMBLER
2444                         if (r_type == BFD_RELOC_32
2445                             && GOT_symbol
2446                             && GOT_symbol == i.imms[n]->X_add_symbol
2447                             && (i.imms[n]->X_op == O_symbol
2448                                 || (i.imms[n]->X_op == O_add
2449                                     && ((symbol_get_value_expression
2450                                          (i.imms[n]->X_op_symbol)->X_op)
2451                                         == O_subtract))))
2452                           {
2453                             r_type = BFD_RELOC_386_GOTPC;
2454                             i.imms[n]->X_add_number += 3;
2455                           }
2456 #endif
2457                         fix_new_exp (frag_now, p - frag_now->fr_literal, size,
2458                                      i.imms[n], pcrel, r_type);
2459                       }
2460                   }
2461               }
2462           }                     /* end immediate output */
2463       }
2464
2465 #ifdef DEBUG386
2466     if (flag_debug)
2467       {
2468         pi (line, &i);
2469       }
2470 #endif /* DEBUG386 */
2471   }
2472 }
2473 \f
2474 static int i386_immediate PARAMS ((char *));
2475
2476 static int
2477 i386_immediate (imm_start)
2478      char *imm_start;
2479 {
2480   char *save_input_line_pointer;
2481   segT exp_seg = 0;
2482   expressionS * exp;
2483
2484   if (i.imm_operands == MAX_IMMEDIATE_OPERANDS)
2485     {
2486       as_bad (_("Only 1 or 2 immediate operands are allowed"));
2487       return 0;
2488     }
2489
2490   exp = &im_expressions[i.imm_operands++];
2491   i.imms[this_operand] = exp;
2492
2493   if (is_space_char (*imm_start))
2494     ++imm_start;
2495
2496   save_input_line_pointer = input_line_pointer;
2497   input_line_pointer = imm_start;
2498
2499 #ifndef LEX_AT
2500   {
2501     /*
2502      * We can have operands of the form
2503      *   <symbol>@GOTOFF+<nnn>
2504      * Take the easy way out here and copy everything
2505      * into a temporary buffer...
2506      */
2507     register char *cp;
2508
2509     cp = strchr (input_line_pointer, '@');
2510     if (cp != NULL)
2511       {
2512         char *tmpbuf;
2513         int len = 0;
2514         int first;
2515
2516         /* GOT relocations are not supported in 16 bit mode */
2517         if (flag_16bit_code)
2518           as_bad (_("GOT relocations not supported in 16 bit mode"));
2519
2520         if (GOT_symbol == NULL)
2521           GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
2522
2523         if (strncmp (cp + 1, "PLT", 3) == 0)
2524           {
2525             i.disp_reloc[this_operand] = BFD_RELOC_386_PLT32;
2526             len = 3;
2527           }
2528         else if (strncmp (cp + 1, "GOTOFF", 6) == 0)
2529           {
2530             i.disp_reloc[this_operand] = BFD_RELOC_386_GOTOFF;
2531             len = 6;
2532           }
2533         else if (strncmp (cp + 1, "GOT", 3) == 0)
2534           {
2535             i.disp_reloc[this_operand] = BFD_RELOC_386_GOT32;
2536             len = 3;
2537           }
2538         else
2539           as_bad (_("Bad reloc specifier in expression"));
2540
2541         /* Replace the relocation token with ' ', so that errors like
2542            foo@GOTOFF1 will be detected.  */
2543         first = cp - input_line_pointer;
2544         tmpbuf = (char *) alloca (strlen(input_line_pointer));
2545         memcpy (tmpbuf, input_line_pointer, first);
2546         tmpbuf[first] = ' ';
2547         strcpy (tmpbuf + first + 1, cp + 1 + len);
2548         input_line_pointer = tmpbuf;
2549       }
2550   }
2551 #endif
2552
2553   exp_seg = expression (exp);
2554
2555   SKIP_WHITESPACE ();
2556   if (*input_line_pointer)
2557     as_bad (_("Ignoring junk `%s' after expression"), input_line_pointer);
2558
2559   input_line_pointer = save_input_line_pointer;
2560
2561   if (exp->X_op == O_absent || exp->X_op == O_big)
2562     {
2563       /* missing or bad expr becomes absolute 0 */
2564       as_bad (_("Missing or invalid immediate expression `%s' taken as 0"),
2565               imm_start);
2566       exp->X_op = O_constant;
2567       exp->X_add_number = 0;
2568       exp->X_add_symbol = (symbolS *) 0;
2569       exp->X_op_symbol = (symbolS *) 0;
2570     }
2571
2572   if (exp->X_op == O_constant)
2573     {
2574       int bigimm = Imm32;
2575       if (flag_16bit_code ^ (i.prefix[DATA_PREFIX] != 0))
2576         bigimm = Imm16;
2577
2578       i.types[this_operand] |=
2579         (bigimm | smallest_imm_type ((long) exp->X_add_number));
2580
2581       /* If a suffix is given, this operand may be shortended. */
2582       switch (i.suffix)
2583         {
2584         case WORD_MNEM_SUFFIX:
2585           i.types[this_operand] |= Imm16;
2586           break;
2587         case BYTE_MNEM_SUFFIX:
2588           i.types[this_operand] |= Imm16 | Imm8 | Imm8S;
2589           break;
2590         }
2591     }
2592 #ifdef OBJ_AOUT
2593   else if (exp_seg != text_section
2594            && exp_seg != data_section
2595            && exp_seg != bss_section
2596            && exp_seg != undefined_section
2597 #ifdef BFD_ASSEMBLER
2598            && !bfd_is_com_section (exp_seg)
2599 #endif
2600            )
2601     {
2602       as_bad (_("Unimplemented segment type %d in operand"), exp_seg);
2603       return 0;
2604     }
2605 #endif
2606   else
2607     {
2608       /* This is an address.  The size of the address will be
2609          determined later, depending on destination register,
2610          suffix, or the default for the section.  We exclude
2611          Imm8S here so that `push $foo' and other instructions
2612          with an Imm8S form will use Imm16 or Imm32.  */
2613       i.types[this_operand] |= (Imm8 | Imm16 | Imm32);
2614     }
2615
2616   return 1;
2617 }
2618
2619 static int i386_scale PARAMS ((char *));
2620
2621 static int
2622 i386_scale (scale)
2623      char *scale;
2624 {
2625   if (!isdigit (*scale))
2626     goto bad_scale;
2627
2628   switch (*scale)
2629     {
2630     case '0':
2631     case '1':
2632       i.log2_scale_factor = 0;
2633       break;
2634     case '2':
2635       i.log2_scale_factor = 1;
2636       break;
2637     case '4':
2638       i.log2_scale_factor = 2;
2639       break;
2640     case '8':
2641       i.log2_scale_factor = 3;
2642       break;
2643     default:
2644     bad_scale:
2645       as_bad (_("expecting scale factor of 1, 2, 4, or 8: got `%s'"),
2646               scale);
2647       return 0;
2648     }
2649   if (i.log2_scale_factor != 0 && ! i.index_reg)
2650     {
2651       as_warn (_("scale factor of %d without an index register"),
2652                1 << i.log2_scale_factor);
2653 #if SCALE1_WHEN_NO_INDEX
2654       i.log2_scale_factor = 0;
2655 #endif
2656     }
2657   return 1;
2658 }
2659
2660 static int i386_displacement PARAMS ((char *, char *));
2661
2662 static int
2663 i386_displacement (disp_start, disp_end)
2664      char *disp_start;
2665      char *disp_end;
2666 {
2667   register expressionS *exp;
2668   segT exp_seg = 0;
2669   char *save_input_line_pointer;
2670   int bigdisp = Disp32;
2671
2672   if (flag_16bit_code ^ (i.prefix[ADDR_PREFIX] != 0))
2673     bigdisp = Disp16;
2674   i.types[this_operand] |= bigdisp;
2675
2676   exp = &disp_expressions[i.disp_operands];
2677   i.disps[this_operand] = exp;
2678   i.disp_reloc[this_operand] = NO_RELOC;
2679   i.disp_operands++;
2680   save_input_line_pointer = input_line_pointer;
2681   input_line_pointer = disp_start;
2682   END_STRING_AND_SAVE (disp_end);
2683
2684 #ifndef GCC_ASM_O_HACK
2685 #define GCC_ASM_O_HACK 0
2686 #endif
2687 #if GCC_ASM_O_HACK
2688   END_STRING_AND_SAVE (disp_end + 1);
2689   if ((i.types[this_operand] & BaseIndex) != 0
2690       && displacement_string_end[-1] == '+')
2691     {
2692       /* This hack is to avoid a warning when using the "o"
2693          constraint within gcc asm statements.
2694          For instance:
2695
2696          #define _set_tssldt_desc(n,addr,limit,type) \
2697          __asm__ __volatile__ ( \
2698          "movw %w2,%0\n\t" \
2699          "movw %w1,2+%0\n\t" \
2700          "rorl $16,%1\n\t" \
2701          "movb %b1,4+%0\n\t" \
2702          "movb %4,5+%0\n\t" \
2703          "movb $0,6+%0\n\t" \
2704          "movb %h1,7+%0\n\t" \
2705          "rorl $16,%1" \
2706          : "=o"(*(n)) : "q" (addr), "ri"(limit), "i"(type))
2707
2708          This works great except that the output assembler ends
2709          up looking a bit weird if it turns out that there is
2710          no offset.  You end up producing code that looks like:
2711
2712          #APP
2713          movw $235,(%eax)
2714          movw %dx,2+(%eax)
2715          rorl $16,%edx
2716          movb %dl,4+(%eax)
2717          movb $137,5+(%eax)
2718          movb $0,6+(%eax)
2719          movb %dh,7+(%eax)
2720          rorl $16,%edx
2721          #NO_APP
2722
2723          So here we provide the missing zero.
2724       */
2725
2726       *displacement_string_end = '0';
2727     }
2728 #endif
2729 #ifndef LEX_AT
2730   {
2731     /*
2732      * We can have operands of the form
2733      *   <symbol>@GOTOFF+<nnn>
2734      * Take the easy way out here and copy everything
2735      * into a temporary buffer...
2736      */
2737     register char *cp;
2738
2739     cp = strchr (input_line_pointer, '@');
2740     if (cp != NULL)
2741       {
2742         char *tmpbuf;
2743         int len = 0;
2744         int first;
2745
2746         /* GOT relocations are not supported in 16 bit mode */
2747         if (flag_16bit_code)
2748           as_bad (_("GOT relocations not supported in 16 bit mode"));
2749
2750         if (GOT_symbol == NULL)
2751           GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
2752
2753         if (strncmp (cp + 1, "PLT", 3) == 0)
2754           {
2755             i.disp_reloc[this_operand] = BFD_RELOC_386_PLT32;
2756             len = 3;
2757           }
2758         else if (strncmp (cp + 1, "GOTOFF", 6) == 0)
2759           {
2760             i.disp_reloc[this_operand] = BFD_RELOC_386_GOTOFF;
2761             len = 6;
2762           }
2763         else if (strncmp (cp + 1, "GOT", 3) == 0)
2764           {
2765             i.disp_reloc[this_operand] = BFD_RELOC_386_GOT32;
2766             len = 3;
2767           }
2768         else
2769           as_bad (_("Bad reloc specifier in expression"));
2770
2771         /* Replace the relocation token with ' ', so that errors like
2772            foo@GOTOFF1 will be detected.  */
2773         first = cp - input_line_pointer;
2774         tmpbuf = (char *) alloca (strlen(input_line_pointer));
2775         memcpy (tmpbuf, input_line_pointer, first);
2776         tmpbuf[first] = ' ';
2777         strcpy (tmpbuf + first + 1, cp + 1 + len);
2778         input_line_pointer = tmpbuf;
2779       }
2780   }
2781 #endif
2782
2783   exp_seg = expression (exp);
2784
2785 #ifdef BFD_ASSEMBLER
2786   /* We do this to make sure that the section symbol is in
2787      the symbol table.  We will ultimately change the relocation
2788      to be relative to the beginning of the section */
2789   if (i.disp_reloc[this_operand] == BFD_RELOC_386_GOTOFF)
2790     {
2791       if (S_IS_LOCAL(exp->X_add_symbol)
2792           && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section)
2793         section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
2794       assert (exp->X_op == O_symbol);
2795       exp->X_op = O_subtract;
2796       exp->X_op_symbol = GOT_symbol;
2797       i.disp_reloc[this_operand] = BFD_RELOC_32;
2798     }
2799 #endif
2800
2801   SKIP_WHITESPACE ();
2802   if (*input_line_pointer)
2803     as_bad (_("Ignoring junk `%s' after expression"),
2804             input_line_pointer);
2805 #if GCC_ASM_O_HACK
2806   RESTORE_END_STRING (disp_end + 1);
2807 #endif
2808   RESTORE_END_STRING (disp_end);
2809   input_line_pointer = save_input_line_pointer;
2810
2811   if (exp->X_op == O_absent || exp->X_op == O_big)
2812     {
2813       /* missing or bad expr becomes absolute 0 */
2814       as_bad (_("Missing or invalid displacement expression `%s' taken as 0"),
2815               disp_start);
2816       exp->X_op = O_constant;
2817       exp->X_add_number = 0;
2818       exp->X_add_symbol = (symbolS *) 0;
2819       exp->X_op_symbol = (symbolS *) 0;
2820     }
2821
2822   if (exp->X_op == O_constant)
2823     {
2824       if (fits_in_signed_byte (exp->X_add_number))
2825         i.types[this_operand] |= Disp8;
2826     }
2827 #ifdef OBJ_AOUT
2828   else if (exp_seg != text_section
2829            && exp_seg != data_section
2830            && exp_seg != bss_section
2831            && exp_seg != undefined_section)
2832     {
2833       as_bad (_ ("Unimplemented segment type %d in operand"), exp_seg);
2834       return 0;
2835     }
2836 #endif
2837   return 1;
2838 }
2839
2840 static int i386_operand_modifier PARAMS ((char **, int));
2841
2842 static int
2843 i386_operand_modifier (op_string, got_a_float)
2844      char **op_string;
2845      int got_a_float;
2846 {
2847   if (!strncasecmp (*op_string, "BYTE PTR", 8))
2848     {
2849       i.suffix = BYTE_MNEM_SUFFIX;
2850       *op_string += 8;
2851       return BYTE_PTR;
2852
2853     }
2854   else if (!strncasecmp (*op_string, "WORD PTR", 8))
2855     {
2856       i.suffix = WORD_MNEM_SUFFIX;
2857       *op_string += 8;
2858       return WORD_PTR;
2859     }
2860
2861   else if (!strncasecmp (*op_string, "DWORD PTR", 9))
2862     {
2863       if (got_a_float)
2864         i.suffix = SHORT_MNEM_SUFFIX;
2865       else
2866         i.suffix = DWORD_MNEM_SUFFIX;
2867       *op_string += 9;
2868       return DWORD_PTR;
2869     }
2870
2871   else if (!strncasecmp (*op_string, "QWORD PTR", 9))
2872     {
2873       i.suffix = INTEL_DWORD_MNEM_SUFFIX;
2874       *op_string += 9;
2875       return QWORD_PTR;
2876     }
2877
2878   else if (!strncasecmp (*op_string, "XWORD PTR", 9))
2879     {
2880       i.suffix = LONG_DOUBLE_MNEM_SUFFIX;
2881       *op_string += 9;
2882       return XWORD_PTR;
2883     }
2884
2885   else if (!strncasecmp (*op_string, "SHORT", 5))
2886     {
2887       *op_string += 5;
2888       return SHORT;
2889     }
2890
2891   else if (!strncasecmp (*op_string, "OFFSET FLAT:", 12))
2892     {
2893       *op_string += 12;
2894       return OFFSET_FLAT;
2895     }
2896
2897   else if (!strncasecmp (*op_string, "FLAT", 4))
2898     {
2899       *op_string += 4;
2900       return FLAT;
2901     }
2902
2903   else return NONE_FOUND;
2904 }
2905
2906 static char * build_displacement_string PARAMS ((int, char *));
2907
2908 static char *
2909 build_displacement_string (initial_disp, op_string)
2910      int initial_disp;
2911      char *op_string;
2912 {
2913   char *temp_string = (char *) malloc (strlen (op_string) + 1);
2914   char *end_of_operand_string;
2915   char *tc;
2916   char *temp_disp;
2917
2918   temp_string[0] = '\0';
2919   tc = end_of_operand_string = strchr (op_string, '[');
2920   if ( initial_disp && !end_of_operand_string)
2921     {
2922       strcpy (temp_string, op_string);
2923       return (temp_string);
2924     }
2925
2926   /* Build the whole displacement string */
2927   if (initial_disp)
2928     {
2929       strncpy (temp_string, op_string, end_of_operand_string - op_string);
2930       temp_string[end_of_operand_string - op_string] = '\0';
2931       temp_disp = tc;
2932     }
2933   else
2934     temp_disp = op_string;
2935
2936   while (*temp_disp != '\0')
2937     {
2938       char *end_op;
2939       int add_minus = (*temp_disp == '-');
2940
2941       if (*temp_disp == '+' || *temp_disp == '-' || *temp_disp == '[')
2942         temp_disp++;
2943
2944       if (is_space_char (*temp_disp))
2945         temp_disp++;
2946
2947       /* Don't consider registers */
2948       if ( !((*temp_disp == REGISTER_PREFIX || allow_naked_reg)
2949              && parse_register (temp_disp, &end_op)) )
2950         {
2951           char *string_start = temp_disp;
2952
2953           while (*temp_disp != ']'
2954                  && *temp_disp != '+'
2955                  && *temp_disp != '-'
2956                  && *temp_disp != '*')
2957             ++temp_disp;
2958
2959           if (add_minus)
2960             strcat (temp_string, "-");
2961           else
2962             strcat (temp_string, "+");
2963
2964           strncat (temp_string, string_start, temp_disp - string_start);
2965           if (*temp_disp == '+' || *temp_disp == '-')
2966             --temp_disp;
2967         }
2968
2969       while (*temp_disp != '\0'
2970              && *temp_disp != '+'
2971              && *temp_disp != '-')
2972         ++temp_disp;
2973     }
2974
2975   return temp_string;
2976 }
2977
2978 static int i386_parse_seg PARAMS ((char *));
2979
2980 static int
2981 i386_parse_seg (op_string)
2982      char *op_string;
2983 {
2984   if (is_space_char (*op_string))
2985     ++op_string;
2986
2987   /* Should be one of es, cs, ss, ds fs or gs */
2988   switch (*op_string++)
2989     {
2990     case 'e':
2991       i.seg[i.mem_operands] = &es;
2992       break;
2993     case 'c':
2994       i.seg[i.mem_operands] = &cs;
2995       break;
2996     case 's':
2997       i.seg[i.mem_operands] = &ss;
2998       break;
2999     case 'd':
3000       i.seg[i.mem_operands] = &ds;
3001       break;
3002     case 'f':
3003       i.seg[i.mem_operands] = &fs;
3004       break;
3005     case 'g':
3006       i.seg[i.mem_operands] = &gs;
3007       break;
3008     default:
3009       as_bad (_("bad segment name `%s'"), op_string);
3010       return 0;
3011     }
3012
3013   if (*op_string++ != 's')
3014     {
3015       as_bad (_("bad segment name `%s'"), op_string);
3016       return 0;
3017     }
3018
3019   if (is_space_char (*op_string))
3020     ++op_string;
3021
3022   if (*op_string != ':')
3023     {
3024       as_bad (_("bad segment name `%s'"), op_string);
3025       return 0;
3026     }
3027
3028   return 1;
3029
3030 }
3031
3032 static int i386_index_check PARAMS((const char *));
3033
3034 /* Make sure the memory operand we've been dealt is valid.
3035    Returns 1 on success, 0 on a failure.
3036 */
3037 static int
3038 i386_index_check (operand_string)
3039      const char *operand_string;
3040 {
3041 #if INFER_ADDR_PREFIX
3042   int fudged = 0;
3043
3044  tryprefix:
3045 #endif
3046   if (flag_16bit_code ^ (i.prefix[ADDR_PREFIX] != 0) ?
3047       /* 16 bit mode checks */
3048       ((i.base_reg
3049         && ((i.base_reg->reg_type & (Reg16|BaseIndex))
3050             != (Reg16|BaseIndex)))
3051        || (i.index_reg
3052            && (((i.index_reg->reg_type & (Reg16|BaseIndex))
3053                 != (Reg16|BaseIndex))
3054                || ! (i.base_reg
3055                      && i.base_reg->reg_num < 6
3056                      && i.index_reg->reg_num >= 6
3057                      && i.log2_scale_factor == 0)))) :
3058       /* 32 bit mode checks */
3059       ((i.base_reg
3060         && (i.base_reg->reg_type & Reg32) == 0)
3061        || (i.index_reg
3062            && ((i.index_reg->reg_type & (Reg32|BaseIndex))
3063                != (Reg32|BaseIndex)))))
3064     {
3065 #if INFER_ADDR_PREFIX
3066       if (i.prefix[ADDR_PREFIX] == 0 && stackop_size != '\0')
3067         {
3068           i.prefix[ADDR_PREFIX] = ADDR_PREFIX_OPCODE;
3069           i.prefixes += 1;
3070           /* Change the size of any displacement too.  At most one of
3071              Disp16 or Disp32 is set.
3072              FIXME.  There doesn't seem to be any real need for separate
3073              Disp16 and Disp32 flags.  The same goes for Imm16 and Imm32.
3074              Removing them would probably clean up the code quite a lot.
3075           */
3076           if (i.types[this_operand] & (Disp16|Disp32))
3077              i.types[this_operand] ^= (Disp16|Disp32);
3078           fudged = 1;
3079           goto tryprefix;
3080         }
3081       if (fudged)
3082         as_bad (_("`%s' is not a valid base/index expression"),
3083                 operand_string);
3084       else
3085 #endif
3086         as_bad (_("`%s' is not a valid %s bit base/index expression"),
3087                 operand_string,
3088                 flag_16bit_code ^ (i.prefix[ADDR_PREFIX] != 0) ? "16" : "32");
3089       return 0;
3090     }
3091   return 1;
3092 }
3093
3094 static int i386_intel_memory_operand PARAMS ((char *));
3095
3096 static int
3097 i386_intel_memory_operand (operand_string)
3098      char *operand_string;
3099 {
3100   char *op_string = operand_string;
3101   char *end_of_operand_string;
3102
3103   if ((i.mem_operands == 1
3104        && (current_templates->start->opcode_modifier & IsString) == 0)
3105       || i.mem_operands == 2)
3106     {
3107       as_bad (_("too many memory references for `%s'"),
3108               current_templates->start->name);
3109       return 0;
3110     }
3111
3112   /* Look for displacement preceding open bracket */
3113   if (*op_string != '[')
3114     {
3115       char *end_seg;
3116       char *temp_string;
3117
3118       end_seg = strchr (op_string, ':');
3119       if (end_seg)
3120         {
3121           if (!i386_parse_seg (op_string))
3122             return 0;
3123           op_string = end_seg + 1;
3124         }
3125
3126       temp_string = build_displacement_string (true, op_string);
3127
3128       if (i.disp_operands == 0 &&
3129           !i386_displacement (temp_string, temp_string + strlen (temp_string)))
3130         return 0;
3131
3132       end_of_operand_string = strchr (op_string, '[');
3133       if (!end_of_operand_string)
3134         end_of_operand_string = op_string + strlen (op_string);
3135
3136       if (is_space_char (*end_of_operand_string))
3137         --end_of_operand_string;
3138
3139       op_string = end_of_operand_string;
3140     }
3141
3142   if (*op_string == '[')
3143     {
3144       ++op_string;
3145
3146       /* Pick off each component and figure out where it belongs */
3147
3148       end_of_operand_string = op_string;
3149
3150       while (*op_string != ']')
3151         {
3152           const reg_entry *temp_reg;
3153           char *end_op;
3154           char *temp_string;
3155
3156           while (*end_of_operand_string != '+'
3157                  && *end_of_operand_string != '-'
3158                  && *end_of_operand_string != '*'
3159                  && *end_of_operand_string != ']')
3160             end_of_operand_string++;
3161
3162           temp_string = op_string;
3163           if (*temp_string == '+')
3164             {
3165               ++temp_string;
3166               if (is_space_char (*temp_string))
3167                 ++temp_string;
3168             }
3169
3170           if ((*temp_string == REGISTER_PREFIX || allow_naked_reg)
3171               && (temp_reg = parse_register (temp_string, &end_op)) != NULL)
3172             {
3173               if (i.base_reg == NULL)
3174                 i.base_reg = temp_reg;
3175               else
3176                 i.index_reg = temp_reg;
3177
3178               i.types[this_operand] |= BaseIndex;
3179             }
3180           else if (*temp_string == REGISTER_PREFIX)
3181             {
3182               as_bad (_("bad register name `%s'"), temp_string);
3183               return 0;
3184             }
3185           else if (is_digit_char (*op_string)
3186                    || *op_string == '+' || *op_string == '-')
3187             {
3188               temp_string = build_displacement_string (false, op_string);
3189
3190               if (*temp_string == '+')
3191                 ++temp_string;
3192
3193               if (i.disp_operands == 0 &&
3194                   !i386_displacement (temp_string, temp_string + strlen (temp_string)))
3195                 return 0;
3196
3197               ++op_string;
3198               end_of_operand_string = op_string;
3199               while (*end_of_operand_string != ']'
3200                      && *end_of_operand_string != '+'
3201                      && *end_of_operand_string != '-'
3202                      && *end_of_operand_string != '*')
3203                 ++end_of_operand_string;
3204             }
3205           else if (*op_string == '*')
3206             {
3207               ++op_string;
3208
3209               if (i.base_reg && !i.index_reg)
3210                 {
3211                   i.index_reg = i.base_reg;
3212                   i.base_reg = 0;
3213                 }
3214
3215               if (!i386_scale (op_string))
3216                 return 0;
3217             }
3218           op_string = end_of_operand_string;
3219           ++end_of_operand_string;
3220         }
3221     }
3222
3223   if (i386_index_check (operand_string) == 0)
3224     return 0;
3225
3226   i.mem_operands++;
3227   return 1;
3228 }
3229
3230 static int
3231 i386_intel_operand (operand_string, got_a_float)
3232      char *operand_string;
3233      int got_a_float;
3234 {
3235   const reg_entry * r;
3236   char *end_op;
3237   char *op_string = operand_string;
3238
3239   int operand_modifier = i386_operand_modifier (&op_string, got_a_float);
3240   if (is_space_char (*op_string))
3241     ++op_string;
3242
3243   switch (operand_modifier)
3244     {
3245     case BYTE_PTR:
3246     case WORD_PTR:
3247     case DWORD_PTR:
3248     case QWORD_PTR:
3249     case XWORD_PTR:
3250       if (!i386_intel_memory_operand (op_string))
3251         return 0;
3252       break;
3253
3254     case FLAT:
3255     case OFFSET_FLAT:
3256       if (!i386_immediate (op_string))
3257         return 0;
3258       break;
3259
3260     case SHORT:
3261     case NONE_FOUND:
3262       /* Should be register or immediate */
3263       if (is_digit_char (*op_string)
3264           && strchr (op_string, '[') == 0)
3265         {
3266           if (!i386_immediate (op_string))
3267             return 0;
3268         }
3269       else if ((*op_string == REGISTER_PREFIX || allow_naked_reg)
3270                && (r = parse_register (op_string, &end_op)) != NULL)
3271         {
3272           /* Check for a segment override by searching for ':' after a
3273              segment register.  */
3274           op_string = end_op;
3275           if (is_space_char (*op_string))
3276             ++op_string;
3277           if (*op_string == ':' && (r->reg_type & (SReg2 | SReg3)))
3278             {
3279               switch (r->reg_num)
3280                 {
3281                 case 0:
3282                   i.seg[i.mem_operands] = &es;
3283                   break;
3284                 case 1:
3285                   i.seg[i.mem_operands] = &cs;
3286                   break;
3287                 case 2:
3288                   i.seg[i.mem_operands] = &ss;
3289                   break;
3290                 case 3:
3291                   i.seg[i.mem_operands] = &ds;
3292                   break;
3293                 case 4:
3294                   i.seg[i.mem_operands] = &fs;
3295                   break;
3296                 case 5:
3297                   i.seg[i.mem_operands] = &gs;
3298                   break;
3299                 }
3300
3301             }
3302           i.types[this_operand] |= r->reg_type & ~BaseIndex;
3303           i.regs[this_operand] = r;
3304           i.reg_operands++;
3305         }
3306       else if (*op_string == REGISTER_PREFIX)
3307         {
3308           as_bad (_("bad register name `%s'"), op_string);
3309           return 0;
3310         }
3311       else if (!i386_intel_memory_operand (op_string))
3312         return 0;
3313
3314       break;
3315     }  /* end switch */
3316
3317   return 1;
3318 }
3319
3320 /* Parse OPERAND_STRING into the i386_insn structure I.  Returns non-zero
3321    on error. */
3322
3323 static int
3324 i386_operand (operand_string)
3325      char *operand_string;
3326 {
3327   const reg_entry *r;
3328   char *end_op;
3329   char *op_string = operand_string;
3330
3331   if (is_space_char (*op_string))
3332     ++op_string;
3333
3334   /* We check for an absolute prefix (differentiating,
3335      for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */
3336   if (*op_string == ABSOLUTE_PREFIX)
3337     {
3338       ++op_string;
3339       if (is_space_char (*op_string))
3340         ++op_string;
3341       i.types[this_operand] |= JumpAbsolute;
3342     }
3343
3344   /* Check if operand is a register. */
3345   if ((*op_string == REGISTER_PREFIX || allow_naked_reg)
3346       && (r = parse_register (op_string, &end_op)) != NULL)
3347     {
3348       /* Check for a segment override by searching for ':' after a
3349          segment register.  */
3350       op_string = end_op;
3351       if (is_space_char (*op_string))
3352         ++op_string;
3353       if (*op_string == ':' && (r->reg_type & (SReg2 | SReg3)))
3354         {
3355           switch (r->reg_num)
3356             {
3357             case 0:
3358               i.seg[i.mem_operands] = &es;
3359               break;
3360             case 1:
3361               i.seg[i.mem_operands] = &cs;
3362               break;
3363             case 2:
3364               i.seg[i.mem_operands] = &ss;
3365               break;
3366             case 3:
3367               i.seg[i.mem_operands] = &ds;
3368               break;
3369             case 4:
3370               i.seg[i.mem_operands] = &fs;
3371               break;
3372             case 5:
3373               i.seg[i.mem_operands] = &gs;
3374               break;
3375             }
3376
3377           /* Skip the ':' and whitespace.  */
3378           ++op_string;
3379           if (is_space_char (*op_string))
3380             ++op_string;
3381
3382           if (!is_digit_char (*op_string)
3383               && !is_identifier_char (*op_string)
3384               && *op_string != '('
3385               && *op_string != ABSOLUTE_PREFIX)
3386             {
3387               as_bad (_("bad memory operand `%s'"), op_string);
3388               return 0;
3389             }
3390           /* Handle case of %es:*foo. */
3391           if (*op_string == ABSOLUTE_PREFIX)
3392             {
3393               ++op_string;
3394               if (is_space_char (*op_string))
3395                 ++op_string;
3396               i.types[this_operand] |= JumpAbsolute;
3397             }
3398           goto do_memory_reference;
3399         }
3400       if (*op_string)
3401         {
3402           as_bad (_("Junk `%s' after register"), op_string);
3403           return 0;
3404         }
3405       i.types[this_operand] |= r->reg_type & ~BaseIndex;
3406       i.regs[this_operand] = r;
3407       i.reg_operands++;
3408     }
3409   else if (*op_string == REGISTER_PREFIX)
3410     {
3411       as_bad (_("bad register name `%s'"), op_string);
3412       return 0;
3413     }
3414   else if (*op_string == IMMEDIATE_PREFIX)
3415     {                           /* ... or an immediate */
3416       ++op_string;
3417       if (i.types[this_operand] & JumpAbsolute)
3418         {
3419           as_bad (_("Immediate operand illegal with absolute jump"));
3420           return 0;
3421         }
3422       if (!i386_immediate (op_string))
3423         return 0;
3424     }
3425   else if (is_digit_char (*op_string)
3426            || is_identifier_char (*op_string)
3427            || *op_string == '(' )
3428     {
3429       /* This is a memory reference of some sort. */
3430       char *base_string;
3431
3432       /* Start and end of displacement string expression (if found). */
3433       char *displacement_string_start;
3434       char *displacement_string_end;
3435
3436     do_memory_reference:
3437       if ((i.mem_operands == 1
3438            && (current_templates->start->opcode_modifier & IsString) == 0)
3439           || i.mem_operands == 2)
3440         {
3441           as_bad (_("too many memory references for `%s'"),
3442                   current_templates->start->name);
3443           return 0;
3444         }
3445
3446       /* Check for base index form.  We detect the base index form by
3447          looking for an ')' at the end of the operand, searching
3448          for the '(' matching it, and finding a REGISTER_PREFIX or ','
3449          after the '('.  */
3450       base_string = op_string + strlen (op_string);
3451
3452       --base_string;
3453       if (is_space_char (*base_string))
3454         --base_string;
3455
3456       /* If we only have a displacement, set-up for it to be parsed later. */
3457       displacement_string_start = op_string;
3458       displacement_string_end = base_string + 1;
3459
3460       if (*base_string == ')')
3461         {
3462           char *temp_string;
3463           unsigned int parens_balanced = 1;
3464           /* We've already checked that the number of left & right ()'s are
3465              equal, so this loop will not be infinite. */
3466           do
3467             {
3468               base_string--;
3469               if (*base_string == ')')
3470                 parens_balanced++;
3471               if (*base_string == '(')
3472                 parens_balanced--;
3473             }
3474           while (parens_balanced);
3475
3476           temp_string = base_string;
3477
3478           /* Skip past '(' and whitespace.  */
3479           ++base_string;
3480           if (is_space_char (*base_string))
3481             ++base_string;
3482
3483           if (*base_string == ','
3484               || ((*base_string == REGISTER_PREFIX || allow_naked_reg)
3485                   && (i.base_reg = parse_register (base_string, &end_op)) != NULL))
3486             {
3487               displacement_string_end = temp_string;
3488
3489               i.types[this_operand] |= BaseIndex;
3490
3491               if (i.base_reg)
3492                 {
3493                   base_string = end_op;
3494                   if (is_space_char (*base_string))
3495                     ++base_string;
3496                 }
3497
3498               /* There may be an index reg or scale factor here.  */
3499               if (*base_string == ',')
3500                 {
3501                   ++base_string;
3502                   if (is_space_char (*base_string))
3503                     ++base_string;
3504
3505                   if ((*base_string == REGISTER_PREFIX || allow_naked_reg)
3506                       && (i.index_reg = parse_register (base_string, &end_op)) != NULL)
3507                     {
3508                       base_string = end_op;
3509                       if (is_space_char (*base_string))
3510                         ++base_string;
3511                       if (*base_string == ',')
3512                         {
3513                           ++base_string;
3514                           if (is_space_char (*base_string))
3515                             ++base_string;
3516                         }
3517                       else if (*base_string != ')' )
3518                         {
3519                           as_bad (_("expecting `,' or `)' after index register in `%s'"),
3520                                   operand_string);
3521                           return 0;
3522                         }
3523                     }
3524                   else if (*base_string == REGISTER_PREFIX)
3525                     {
3526                       as_bad (_("bad register name `%s'"), base_string);
3527                       return 0;
3528                     }
3529
3530                   /* Check for scale factor. */
3531                   if (isdigit ((unsigned char) *base_string))
3532                     {
3533                       if (!i386_scale (base_string))
3534                         return 0;
3535
3536                       ++base_string;
3537                       if (is_space_char (*base_string))
3538                         ++base_string;
3539                       if (*base_string != ')')
3540                         {
3541                           as_bad (_("expecting `)' after scale factor in `%s'"),
3542                                   operand_string);
3543                           return 0;
3544                         }
3545                     }
3546                   else if (!i.index_reg)
3547                     {
3548                       as_bad (_("expecting index register or scale factor after `,'; got '%c'"),
3549                               *base_string);
3550                       return 0;
3551                     }
3552                 }
3553               else if (*base_string != ')')
3554                 {
3555                   as_bad (_("expecting `,' or `)' after base register in `%s'"),
3556                           operand_string);
3557                   return 0;
3558                 }
3559             }
3560           else if (*base_string == REGISTER_PREFIX)
3561             {
3562               as_bad (_("bad register name `%s'"), base_string);
3563               return 0;
3564             }
3565         }
3566
3567       /* If there's an expression beginning the operand, parse it,
3568          assuming displacement_string_start and
3569          displacement_string_end are meaningful.  */
3570       if (displacement_string_start != displacement_string_end)
3571         {
3572           if (!i386_displacement (displacement_string_start,
3573                                   displacement_string_end))
3574             return 0;
3575         }
3576
3577       /* Special case for (%dx) while doing input/output op.  */
3578       if (i.base_reg
3579           && i.base_reg->reg_type == (Reg16 | InOutPortReg)
3580           && i.index_reg == 0
3581           && i.log2_scale_factor == 0
3582           && i.seg[i.mem_operands] == 0
3583           && (i.types[this_operand] & Disp) == 0)
3584         {
3585           i.types[this_operand] = InOutPortReg;
3586           return 1;
3587         }
3588
3589       if (i386_index_check (operand_string) == 0)
3590         return 0;
3591       i.mem_operands++;
3592     }
3593   else
3594     {                           /* it's not a memory operand; argh! */
3595       as_bad (_("invalid char %s beginning operand %d `%s'"),
3596               output_invalid (*op_string),
3597               this_operand + 1,
3598               op_string);
3599       return 0;
3600     }
3601   return 1;                     /* normal return */
3602 }
3603 \f
3604 /*
3605  * md_estimate_size_before_relax()
3606  *
3607  * Called just before relax().
3608  * Any symbol that is now undefined will not become defined.
3609  * Return the correct fr_subtype in the frag.
3610  * Return the initial "guess for fr_var" to caller.
3611  * The guess for fr_var is ACTUALLY the growth beyond fr_fix.
3612  * Whatever we do to grow fr_fix or fr_var contributes to our returned value.
3613  * Although it may not be explicit in the frag, pretend fr_var starts with a
3614  * 0 value.
3615  */
3616 int
3617 md_estimate_size_before_relax (fragP, segment)
3618      register fragS *fragP;
3619      register segT segment;
3620 {
3621   register unsigned char *opcode;
3622   register int old_fr_fix;
3623
3624   old_fr_fix = fragP->fr_fix;
3625   opcode = (unsigned char *) fragP->fr_opcode;
3626   /* We've already got fragP->fr_subtype right;  all we have to do is
3627      check for un-relaxable symbols.  */
3628   if (S_GET_SEGMENT (fragP->fr_symbol) != segment)
3629     {
3630       /* symbol is undefined in this segment */
3631       int code16 = fragP->fr_subtype & CODE16;
3632       int size = code16 ? 2 : 4;
3633       int pcrel_reloc = code16 ? BFD_RELOC_16_PCREL : BFD_RELOC_32_PCREL;
3634
3635       switch (opcode[0])
3636         {
3637         case JUMP_PC_RELATIVE:  /* make jmp (0xeb) a dword displacement jump */
3638           opcode[0] = 0xe9;     /* dword disp jmp */
3639           fragP->fr_fix += size;
3640           fix_new (fragP, old_fr_fix, size,
3641                    fragP->fr_symbol,
3642                    fragP->fr_offset, 1,
3643                    (GOT_symbol && /* Not quite right - we should switch on
3644                                      presence of @PLT, but I cannot see how
3645                                      to get to that from here.  We should have
3646                                      done this in md_assemble to really
3647                                      get it right all of the time, but I
3648                                      think it does not matter that much, as
3649                                      this will be right most of the time. ERY*/
3650                     S_GET_SEGMENT(fragP->fr_symbol) == undefined_section)
3651                    ? BFD_RELOC_386_PLT32 : pcrel_reloc);
3652           break;
3653
3654         default:
3655           /* This changes the byte-displacement jump 0x7N
3656              to the dword-displacement jump 0x0f8N.  */
3657           opcode[1] = opcode[0] + 0x10;
3658           opcode[0] = TWO_BYTE_OPCODE_ESCAPE;   /* two-byte escape */
3659           fragP->fr_fix += 1 + size;    /* we've added an opcode byte */
3660           fix_new (fragP, old_fr_fix + 1, size,
3661                    fragP->fr_symbol,
3662                    fragP->fr_offset, 1,
3663                    (GOT_symbol &&  /* Not quite right - we should switch on
3664                                       presence of @PLT, but I cannot see how
3665                                       to get to that from here.  ERY */
3666                     S_GET_SEGMENT(fragP->fr_symbol) == undefined_section)
3667                    ? BFD_RELOC_386_PLT32 : pcrel_reloc);
3668           break;
3669         }
3670       frag_wane (fragP);
3671     }
3672   return (fragP->fr_var + fragP->fr_fix - old_fr_fix);
3673 }                               /* md_estimate_size_before_relax() */
3674 \f
3675 /*
3676  *                      md_convert_frag();
3677  *
3678  * Called after relax() is finished.
3679  * In:  Address of frag.
3680  *      fr_type == rs_machine_dependent.
3681  *      fr_subtype is what the address relaxed to.
3682  *
3683  * Out: Any fixSs and constants are set up.
3684  *      Caller will turn frag into a ".space 0".
3685  */
3686 #ifndef BFD_ASSEMBLER
3687 void
3688 md_convert_frag (headers, sec, fragP)
3689      object_headers *headers ATTRIBUTE_UNUSED;
3690      segT sec ATTRIBUTE_UNUSED;
3691      register fragS *fragP;
3692 #else
3693 void
3694 md_convert_frag (abfd, sec, fragP)
3695      bfd *abfd ATTRIBUTE_UNUSED;
3696      segT sec ATTRIBUTE_UNUSED;
3697      register fragS *fragP;
3698 #endif
3699 {
3700   register unsigned char *opcode;
3701   unsigned char *where_to_put_displacement = NULL;
3702   unsigned int target_address;
3703   unsigned int opcode_address;
3704   unsigned int extension = 0;
3705   int displacement_from_opcode_start;
3706
3707   opcode = (unsigned char *) fragP->fr_opcode;
3708
3709   /* Address we want to reach in file space. */
3710   target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
3711 #ifdef BFD_ASSEMBLER /* not needed otherwise? */
3712   target_address += symbol_get_frag (fragP->fr_symbol)->fr_address;
3713 #endif
3714
3715   /* Address opcode resides at in file space. */
3716   opcode_address = fragP->fr_address + fragP->fr_fix;
3717
3718   /* Displacement from opcode start to fill into instruction. */
3719   displacement_from_opcode_start = target_address - opcode_address;
3720
3721   switch (fragP->fr_subtype)
3722     {
3723     case ENCODE_RELAX_STATE (COND_JUMP, SMALL):
3724     case ENCODE_RELAX_STATE (COND_JUMP, SMALL16):
3725     case ENCODE_RELAX_STATE (UNCOND_JUMP, SMALL):
3726     case ENCODE_RELAX_STATE (UNCOND_JUMP, SMALL16):
3727       /* don't have to change opcode */
3728       extension = 1;            /* 1 opcode + 1 displacement */
3729       where_to_put_displacement = &opcode[1];
3730       break;
3731
3732     case ENCODE_RELAX_STATE (COND_JUMP, BIG):
3733       extension = 5;            /* 2 opcode + 4 displacement */
3734       opcode[1] = opcode[0] + 0x10;
3735       opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
3736       where_to_put_displacement = &opcode[2];
3737       break;
3738
3739     case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG):
3740       extension = 4;            /* 1 opcode + 4 displacement */
3741       opcode[0] = 0xe9;
3742       where_to_put_displacement = &opcode[1];
3743       break;
3744
3745     case ENCODE_RELAX_STATE (COND_JUMP, BIG16):
3746       extension = 3;            /* 2 opcode + 2 displacement */
3747       opcode[1] = opcode[0] + 0x10;
3748       opcode[0] = TWO_BYTE_OPCODE_ESCAPE;
3749       where_to_put_displacement = &opcode[2];
3750       break;
3751
3752     case ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16):
3753       extension = 2;            /* 1 opcode + 2 displacement */
3754       opcode[0] = 0xe9;
3755       where_to_put_displacement = &opcode[1];
3756       break;
3757
3758     default:
3759       BAD_CASE (fragP->fr_subtype);
3760       break;
3761     }
3762   /* now put displacement after opcode */
3763   md_number_to_chars ((char *) where_to_put_displacement,
3764                       (valueT) (displacement_from_opcode_start - extension),
3765                       SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
3766   fragP->fr_fix += extension;
3767 }
3768 \f
3769
3770 int md_short_jump_size = 2;     /* size of byte displacement jmp */
3771 int md_long_jump_size = 5;      /* size of dword displacement jmp */
3772 const int md_reloc_size = 8;    /* Size of relocation record */
3773
3774 void
3775 md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
3776      char *ptr;
3777      addressT from_addr, to_addr;
3778      fragS *frag ATTRIBUTE_UNUSED;
3779      symbolS *to_symbol ATTRIBUTE_UNUSED;
3780 {
3781   long offset;
3782
3783   offset = to_addr - (from_addr + 2);
3784   md_number_to_chars (ptr, (valueT) 0xeb, 1);   /* opcode for byte-disp jump */
3785   md_number_to_chars (ptr + 1, (valueT) offset, 1);
3786 }
3787
3788 void
3789 md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
3790      char *ptr;
3791      addressT from_addr, to_addr;
3792      fragS *frag;
3793      symbolS *to_symbol;
3794 {
3795   long offset;
3796
3797   if (flag_do_long_jump)
3798     {
3799       offset = to_addr - S_GET_VALUE (to_symbol);
3800       md_number_to_chars (ptr, (valueT) 0xe9, 1);/* opcode for long jmp */
3801       md_number_to_chars (ptr + 1, (valueT) offset, 4);
3802       fix_new (frag, (ptr + 1) - frag->fr_literal, 4,
3803                to_symbol, (offsetT) 0, 0, BFD_RELOC_32);
3804     }
3805   else
3806     {
3807       offset = to_addr - (from_addr + 5);
3808       md_number_to_chars (ptr, (valueT) 0xe9, 1);
3809       md_number_to_chars (ptr + 1, (valueT) offset, 4);
3810     }
3811 }
3812 \f
3813 /* Apply a fixup (fixS) to segment data, once it has been determined
3814    by our caller that we have all the info we need to fix it up.
3815
3816    On the 386, immediates, displacements, and data pointers are all in
3817    the same (little-endian) format, so we don't need to care about which
3818    we are handling.  */
3819
3820 int
3821 md_apply_fix3 (fixP, valp, seg)
3822      fixS *fixP;                /* The fix we're to put in.  */
3823      valueT *valp;              /* Pointer to the value of the bits.  */
3824      segT seg ATTRIBUTE_UNUSED; /* Segment fix is from.  */
3825 {
3826   register char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
3827   valueT value = *valp;
3828
3829 #if defined (BFD_ASSEMBLER) && !defined (TE_Mach)
3830   if (fixP->fx_pcrel)
3831     {
3832       switch (fixP->fx_r_type)
3833         {
3834         default:
3835           break;
3836
3837         case BFD_RELOC_32:
3838           fixP->fx_r_type = BFD_RELOC_32_PCREL;
3839           break;
3840         case BFD_RELOC_16:
3841           fixP->fx_r_type = BFD_RELOC_16_PCREL;
3842           break;
3843         case BFD_RELOC_8:
3844           fixP->fx_r_type = BFD_RELOC_8_PCREL;
3845           break;
3846         }
3847     }
3848
3849   /* This is a hack.  There should be a better way to handle this.
3850      This covers for the fact that bfd_install_relocation will
3851      subtract the current location (for partial_inplace, PC relative
3852      relocations); see more below.  */
3853   if ((fixP->fx_r_type == BFD_RELOC_32_PCREL
3854        || fixP->fx_r_type == BFD_RELOC_16_PCREL
3855        || fixP->fx_r_type == BFD_RELOC_8_PCREL)
3856       && fixP->fx_addsy)
3857     {
3858 #ifndef OBJ_AOUT
3859       if (OUTPUT_FLAVOR == bfd_target_elf_flavour
3860 #ifdef TE_PE
3861           || OUTPUT_FLAVOR == bfd_target_coff_flavour
3862 #endif
3863           )
3864         value += fixP->fx_where + fixP->fx_frag->fr_address;
3865 #endif
3866 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
3867       if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
3868         {
3869           segT fseg = S_GET_SEGMENT (fixP->fx_addsy);
3870
3871           if ((fseg == seg
3872                || (symbol_section_p (fixP->fx_addsy)
3873                    && fseg != absolute_section))
3874               && ! S_IS_EXTERNAL (fixP->fx_addsy)
3875               && ! S_IS_WEAK (fixP->fx_addsy)
3876               && S_IS_DEFINED (fixP->fx_addsy)
3877               && ! S_IS_COMMON (fixP->fx_addsy))
3878             {
3879               /* Yes, we add the values in twice.  This is because
3880                  bfd_perform_relocation subtracts them out again.  I think
3881                  bfd_perform_relocation is broken, but I don't dare change
3882                  it.  FIXME.  */
3883               value += fixP->fx_where + fixP->fx_frag->fr_address;
3884             }
3885         }
3886 #endif
3887 #if defined (OBJ_COFF) && defined (TE_PE)
3888       /* For some reason, the PE format does not store a section
3889          address offset for a PC relative symbol.  */
3890       if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
3891         value += md_pcrel_from (fixP);
3892       else if (S_IS_EXTERNAL (fixP->fx_addsy)
3893                || S_IS_WEAK (fixP->fx_addsy))
3894         {
3895           /* We are generating an external relocation for this defined
3896              symbol.  We add the address, because
3897              bfd_install_relocation will subtract it.  VALUE already
3898              holds the symbol value, because fixup_segment added it
3899              in.  We subtract it out, and then we subtract it out
3900              again because bfd_install_relocation will add it in
3901              again.  */
3902           value += md_pcrel_from (fixP);
3903           value -= 2 * S_GET_VALUE (fixP->fx_addsy);
3904         }
3905 #endif
3906     }
3907 #ifdef TE_PE
3908   else if (fixP->fx_addsy != NULL
3909            && S_IS_DEFINED (fixP->fx_addsy)
3910            && (S_IS_EXTERNAL (fixP->fx_addsy)
3911                || S_IS_WEAK (fixP->fx_addsy)))
3912     {
3913       /* We are generating an external relocation for this defined
3914          symbol.  VALUE already holds the symbol value, and
3915          bfd_install_relocation will add it in again.  We don't want
3916          either addition.  */
3917       value -= 2 * S_GET_VALUE (fixP->fx_addsy);
3918     }
3919 #endif
3920
3921   /* Fix a few things - the dynamic linker expects certain values here,
3922      and we must not dissappoint it. */
3923 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
3924   if (OUTPUT_FLAVOR == bfd_target_elf_flavour
3925       && fixP->fx_addsy)
3926     switch (fixP->fx_r_type) {
3927     case BFD_RELOC_386_PLT32:
3928       /* Make the jump instruction point to the address of the operand.  At
3929          runtime we merely add the offset to the actual PLT entry. */
3930       value = 0xfffffffc;
3931       break;
3932     case BFD_RELOC_386_GOTPC:
3933 /*
3934  *   This is tough to explain.  We end up with this one if we have
3935  * operands that look like "_GLOBAL_OFFSET_TABLE_+[.-.L284]".  The goal
3936  * here is to obtain the absolute address of the GOT, and it is strongly
3937  * preferable from a performance point of view to avoid using a runtime
3938  * relocation for this.  The actual sequence of instructions often look
3939  * something like:
3940  *
3941  *      call    .L66
3942  * .L66:
3943  *      popl    %ebx
3944  *      addl    $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx
3945  *
3946  *   The call and pop essentially return the absolute address of
3947  * the label .L66 and store it in %ebx.  The linker itself will
3948  * ultimately change the first operand of the addl so that %ebx points to
3949  * the GOT, but to keep things simple, the .o file must have this operand
3950  * set so that it generates not the absolute address of .L66, but the
3951  * absolute address of itself.  This allows the linker itself simply
3952  * treat a GOTPC relocation as asking for a pcrel offset to the GOT to be
3953  * added in, and the addend of the relocation is stored in the operand
3954  * field for the instruction itself.
3955  *
3956  *   Our job here is to fix the operand so that it would add the correct
3957  * offset so that %ebx would point to itself.  The thing that is tricky is
3958  * that .-.L66 will point to the beginning of the instruction, so we need
3959  * to further modify the operand so that it will point to itself.
3960  * There are other cases where you have something like:
3961  *
3962  *      .long   $_GLOBAL_OFFSET_TABLE_+[.-.L66]
3963  *
3964  * and here no correction would be required.  Internally in the assembler
3965  * we treat operands of this form as not being pcrel since the '.' is
3966  * explicitly mentioned, and I wonder whether it would simplify matters
3967  * to do it this way.  Who knows.  In earlier versions of the PIC patches,
3968  * the pcrel_adjust field was used to store the correction, but since the
3969  * expression is not pcrel, I felt it would be confusing to do it this way.
3970  */
3971       value -= 1;
3972       break;
3973     case BFD_RELOC_386_GOT32:
3974       value = 0; /* Fully resolved at runtime.  No addend.  */
3975       break;
3976     case BFD_RELOC_386_GOTOFF:
3977       break;
3978
3979     case BFD_RELOC_VTABLE_INHERIT:
3980     case BFD_RELOC_VTABLE_ENTRY:
3981       fixP->fx_done = 0;
3982       return 1;
3983
3984     default:
3985       break;
3986     }
3987 #endif /* defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) */
3988   *valp = value;
3989 #endif /* defined (BFD_ASSEMBLER) && !defined (TE_Mach) */
3990   md_number_to_chars (p, value, fixP->fx_size);
3991
3992   return 1;
3993 }
3994
3995 #if 0
3996 /* This is never used.  */
3997 long                            /* Knows about the byte order in a word. */
3998 md_chars_to_number (con, nbytes)
3999      unsigned char con[];       /* Low order byte 1st. */
4000      int nbytes;                /* Number of bytes in the input. */
4001 {
4002   long retval;
4003   for (retval = 0, con += nbytes - 1; nbytes--; con--)
4004     {
4005       retval <<= BITS_PER_CHAR;
4006       retval |= *con;
4007     }
4008   return retval;
4009 }
4010 #endif /* 0 */
4011 \f
4012
4013 #define MAX_LITTLENUMS 6
4014
4015 /* Turn the string pointed to by litP into a floating point constant of type
4016    type, and emit the appropriate bytes.  The number of LITTLENUMS emitted
4017    is stored in *sizeP .  An error message is returned, or NULL on OK.  */
4018 char *
4019 md_atof (type, litP, sizeP)
4020      int type;
4021      char *litP;
4022      int *sizeP;
4023 {
4024   int prec;
4025   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4026   LITTLENUM_TYPE *wordP;
4027   char *t;
4028
4029   switch (type)
4030     {
4031     case 'f':
4032     case 'F':
4033       prec = 2;
4034       break;
4035
4036     case 'd':
4037     case 'D':
4038       prec = 4;
4039       break;
4040
4041     case 'x':
4042     case 'X':
4043       prec = 5;
4044       break;
4045
4046     default:
4047       *sizeP = 0;
4048       return _("Bad call to md_atof ()");
4049     }
4050   t = atof_ieee (input_line_pointer, type, words);
4051   if (t)
4052     input_line_pointer = t;
4053
4054   *sizeP = prec * sizeof (LITTLENUM_TYPE);
4055   /* This loops outputs the LITTLENUMs in REVERSE order; in accord with
4056      the bigendian 386.  */
4057   for (wordP = words + prec - 1; prec--;)
4058     {
4059       md_number_to_chars (litP, (valueT) (*wordP--), sizeof (LITTLENUM_TYPE));
4060       litP += sizeof (LITTLENUM_TYPE);
4061     }
4062   return 0;
4063 }
4064 \f
4065 char output_invalid_buf[8];
4066
4067 static char * output_invalid PARAMS ((int));
4068
4069 static char *
4070 output_invalid (c)
4071      int c;
4072 {
4073   if (isprint (c))
4074     sprintf (output_invalid_buf, "'%c'", c);
4075   else
4076     sprintf (output_invalid_buf, "(0x%x)", (unsigned) c);
4077   return output_invalid_buf;
4078 }
4079
4080
4081 /* REG_STRING starts *before* REGISTER_PREFIX.  */
4082
4083 static const reg_entry *
4084 parse_register (reg_string, end_op)
4085      char *reg_string;
4086      char **end_op;
4087 {
4088   char *s = reg_string;
4089   char *p;
4090   char reg_name_given[MAX_REG_NAME_SIZE + 1];
4091   const reg_entry *r;
4092
4093   /* Skip possible REGISTER_PREFIX and possible whitespace.  */
4094   if (*s == REGISTER_PREFIX)
4095     ++s;
4096
4097   if (is_space_char (*s))
4098     ++s;
4099
4100   p = reg_name_given;
4101   while ((*p++ = register_chars[(unsigned char) *s]) != '\0')
4102     {
4103       if (p >= reg_name_given + MAX_REG_NAME_SIZE)
4104         return (const reg_entry *) NULL;
4105       s++;
4106     }
4107
4108   *end_op = s;
4109
4110   r = (const reg_entry *) hash_find (reg_hash, reg_name_given);
4111
4112   /* Handle floating point regs, allowing spaces in the (i) part.  */
4113   if (r == i386_regtab /* %st is first entry of table */)
4114     {
4115       if (is_space_char (*s))
4116         ++s;
4117       if (*s == '(')
4118         {
4119           ++s;
4120           if (is_space_char (*s))
4121             ++s;
4122           if (*s >= '0' && *s <= '7')
4123             {
4124               r = &i386_float_regtab[*s - '0'];
4125               ++s;
4126               if (is_space_char (*s))
4127                 ++s;
4128               if (*s == ')')
4129                 {
4130                   *end_op = s + 1;
4131                   return r;
4132                 }
4133             }
4134           /* We have "%st(" then garbage */
4135           return (const reg_entry *) NULL;
4136         }
4137     }
4138
4139   return r;
4140 }
4141 \f
4142 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4143 CONST char *md_shortopts = "kmVQ:sq";
4144 #else
4145 CONST char *md_shortopts = "m";
4146 #endif
4147 struct option md_longopts[] = {
4148   {NULL, no_argument, NULL, 0}
4149 };
4150 size_t md_longopts_size = sizeof (md_longopts);
4151
4152 int
4153 md_parse_option (c, arg)
4154      int c;
4155      char *arg ATTRIBUTE_UNUSED;
4156 {
4157   switch (c)
4158     {
4159     case 'm':
4160       flag_do_long_jump = 1;
4161       break;
4162
4163 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4164       /* -k: Ignore for FreeBSD compatibility.  */
4165     case 'k':
4166       break;
4167
4168       /* -V: SVR4 argument to print version ID.  */
4169     case 'V':
4170       print_version_id ();
4171       break;
4172
4173       /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
4174          should be emitted or not.  FIXME: Not implemented.  */
4175     case 'Q':
4176       break;
4177
4178     case 's':
4179       /* -s: On i386 Solaris, this tells the native assembler to use
4180          .stab instead of .stab.excl.  We always use .stab anyhow.  */
4181       break;
4182
4183     case 'q':
4184       /* -q: On i386 Solaris, this tells the native assembler does
4185          fewer checks.  */
4186       break;
4187 #endif
4188
4189     default:
4190       return 0;
4191     }
4192   return 1;
4193 }
4194
4195 void
4196 md_show_usage (stream)
4197      FILE *stream;
4198 {
4199   fprintf (stream, _("\
4200   -m                      do long jump\n"));
4201 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4202   fprintf (stream, _("\
4203   -V                      print assembler version number\n\
4204   -k                      ignored\n\
4205   -Qy, -Qn                ignored\n\
4206   -q                      ignored\n\
4207   -s                      ignored\n"));
4208 #endif
4209 }
4210
4211 #ifdef BFD_ASSEMBLER
4212 #ifdef OBJ_MAYBE_ELF
4213 #ifdef OBJ_MAYBE_COFF
4214
4215 /* Pick the target format to use.  */
4216
4217 const char  *
4218 i386_target_format ()
4219 {
4220   switch (OUTPUT_FLAVOR)
4221     {
4222     case bfd_target_coff_flavour:
4223       return "coff-i386";
4224     case bfd_target_elf_flavour:
4225       return "elf32-i386";
4226     default:
4227       abort ();
4228       return NULL;
4229     }
4230 }
4231
4232 #endif /* OBJ_MAYBE_COFF */
4233 #endif /* OBJ_MAYBE_ELF */
4234 #endif /* BFD_ASSEMBLER */
4235 \f
4236 symbolS *
4237 md_undefined_symbol (name)
4238      char *name;
4239 {
4240   if (name[0] == GLOBAL_OFFSET_TABLE_NAME[0]
4241       && name[1] == GLOBAL_OFFSET_TABLE_NAME[1]
4242       && name[2] == GLOBAL_OFFSET_TABLE_NAME[2]
4243       && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
4244     {
4245       if (!GOT_symbol)
4246         {
4247           if (symbol_find (name))
4248             as_bad (_("GOT already in symbol table"));
4249           GOT_symbol = symbol_new (name, undefined_section,
4250                                    (valueT) 0, &zero_address_frag);
4251         };
4252       return GOT_symbol;
4253     }
4254   return 0;
4255 }
4256
4257 /* Round up a section size to the appropriate boundary.  */
4258 valueT
4259 md_section_align (segment, size)
4260      segT segment ATTRIBUTE_UNUSED;
4261      valueT size;
4262 {
4263 #ifdef OBJ_AOUT
4264 #ifdef BFD_ASSEMBLER
4265   /* For a.out, force the section size to be aligned.  If we don't do
4266      this, BFD will align it for us, but it will not write out the
4267      final bytes of the section.  This may be a bug in BFD, but it is
4268      easier to fix it here since that is how the other a.out targets
4269      work.  */
4270   int align;
4271
4272   align = bfd_get_section_alignment (stdoutput, segment);
4273   size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
4274 #endif
4275 #endif
4276
4277   return size;
4278 }
4279
4280 /* On the i386, PC-relative offsets are relative to the start of the
4281    next instruction.  That is, the address of the offset, plus its
4282    size, since the offset is always the last part of the insn.  */
4283
4284 long
4285 md_pcrel_from (fixP)
4286      fixS *fixP;
4287 {
4288   return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
4289 }
4290
4291 #ifndef I386COFF
4292
4293 static void
4294 s_bss (ignore)
4295      int ignore ATTRIBUTE_UNUSED;
4296 {
4297   register int temp;
4298
4299   temp = get_absolute_expression ();
4300   subseg_set (bss_section, (subsegT) temp);
4301   demand_empty_rest_of_line ();
4302 }
4303
4304 #endif
4305
4306
4307 #ifdef BFD_ASSEMBLER
4308
4309 void
4310 i386_validate_fix (fixp)
4311      fixS *fixp;
4312 {
4313   if (fixp->fx_subsy && fixp->fx_subsy == GOT_symbol)
4314     {
4315       fixp->fx_r_type = BFD_RELOC_386_GOTOFF;
4316       fixp->fx_subsy = 0;
4317     }
4318 }
4319
4320 arelent *
4321 tc_gen_reloc (section, fixp)
4322      asection *section ATTRIBUTE_UNUSED;
4323      fixS *fixp;
4324 {
4325   arelent *rel;
4326   bfd_reloc_code_real_type code;
4327
4328   switch (fixp->fx_r_type)
4329     {
4330     case BFD_RELOC_386_PLT32:
4331     case BFD_RELOC_386_GOT32:
4332     case BFD_RELOC_386_GOTOFF:
4333     case BFD_RELOC_386_GOTPC:
4334     case BFD_RELOC_RVA:
4335     case BFD_RELOC_VTABLE_ENTRY:
4336     case BFD_RELOC_VTABLE_INHERIT:
4337       code = fixp->fx_r_type;
4338       break;
4339     default:
4340       if (fixp->fx_pcrel)
4341         {
4342           switch (fixp->fx_size)
4343             {
4344             default:
4345               as_bad (_("Can not do %d byte pc-relative relocation"),
4346                       fixp->fx_size);
4347               code = BFD_RELOC_32_PCREL;
4348               break;
4349             case 1: code = BFD_RELOC_8_PCREL;  break;
4350             case 2: code = BFD_RELOC_16_PCREL; break;
4351             case 4: code = BFD_RELOC_32_PCREL; break;
4352             }
4353         }
4354       else
4355         {
4356           switch (fixp->fx_size)
4357             {
4358             default:
4359               as_bad (_("Can not do %d byte relocation"), fixp->fx_size);
4360               code = BFD_RELOC_32;
4361               break;
4362             case 1: code = BFD_RELOC_8;  break;
4363             case 2: code = BFD_RELOC_16; break;
4364             case 4: code = BFD_RELOC_32; break;
4365             }
4366         }
4367       break;
4368     }
4369
4370   if (code == BFD_RELOC_32
4371       && GOT_symbol
4372       && fixp->fx_addsy == GOT_symbol)
4373     code = BFD_RELOC_386_GOTPC;
4374
4375   rel = (arelent *) xmalloc (sizeof (arelent));
4376   rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
4377   *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
4378
4379   rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
4380   /* HACK: Since i386 ELF uses Rel instead of Rela, encode the
4381      vtable entry to be used in the relocation's section offset.  */
4382   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
4383     rel->address = fixp->fx_offset;
4384
4385   if (fixp->fx_pcrel)
4386     rel->addend = fixp->fx_addnumber;
4387   else
4388     rel->addend = 0;
4389
4390   rel->howto = bfd_reloc_type_lookup (stdoutput, code);
4391   if (rel->howto == NULL)
4392     {
4393       as_bad_where (fixp->fx_file, fixp->fx_line,
4394                     _("Cannot represent relocation type %s"),
4395                     bfd_get_reloc_code_name (code));
4396       /* Set howto to a garbage value so that we can keep going.  */
4397       rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
4398       assert (rel->howto != NULL);
4399     }
4400
4401   return rel;
4402 }
4403
4404 #else /* ! BFD_ASSEMBLER */
4405
4406 #if (defined(OBJ_AOUT) | defined(OBJ_BOUT))
4407 void
4408 tc_aout_fix_to_chars (where, fixP, segment_address_in_file)
4409      char *where;
4410      fixS *fixP;
4411      relax_addressT segment_address_in_file;
4412 {
4413   /*
4414    * In: length of relocation (or of address) in chars: 1, 2 or 4.
4415    * Out: GNU LD relocation length code: 0, 1, or 2.
4416    */
4417
4418   static const unsigned char nbytes_r_length[] = {42, 0, 1, 42, 2};
4419   long r_symbolnum;
4420
4421   know (fixP->fx_addsy != NULL);
4422
4423   md_number_to_chars (where,
4424                       (valueT) (fixP->fx_frag->fr_address
4425                                 + fixP->fx_where - segment_address_in_file),
4426                       4);
4427
4428   r_symbolnum = (S_IS_DEFINED (fixP->fx_addsy)
4429                  ? S_GET_TYPE (fixP->fx_addsy)
4430                  : fixP->fx_addsy->sy_number);
4431
4432   where[6] = (r_symbolnum >> 16) & 0x0ff;
4433   where[5] = (r_symbolnum >> 8) & 0x0ff;
4434   where[4] = r_symbolnum & 0x0ff;
4435   where[7] = ((((!S_IS_DEFINED (fixP->fx_addsy)) << 3) & 0x08)
4436               | ((nbytes_r_length[fixP->fx_size] << 1) & 0x06)
4437               | (((fixP->fx_pcrel << 0) & 0x01) & 0x0f));
4438 }
4439
4440 #endif /* OBJ_AOUT or OBJ_BOUT */
4441
4442 #if defined (I386COFF)
4443
4444 short
4445 tc_coff_fix2rtype (fixP)
4446      fixS *fixP;
4447 {
4448   if (fixP->fx_r_type == R_IMAGEBASE)
4449     return R_IMAGEBASE;
4450
4451   return (fixP->fx_pcrel ?
4452           (fixP->fx_size == 1 ? R_PCRBYTE :
4453            fixP->fx_size == 2 ? R_PCRWORD :
4454            R_PCRLONG) :
4455           (fixP->fx_size == 1 ? R_RELBYTE :
4456            fixP->fx_size == 2 ? R_RELWORD :
4457            R_DIR32));
4458 }
4459
4460 int
4461 tc_coff_sizemachdep (frag)
4462      fragS *frag;
4463 {
4464   if (frag->fr_next)
4465     return (frag->fr_next->fr_address - frag->fr_address);
4466   else
4467     return 0;
4468 }
4469
4470 #endif /* I386COFF */
4471
4472 #endif /* ! BFD_ASSEMBLER */
4473 \f
4474 /* end of tc-i386.c */