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