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