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