tc-i386.h revision 78838
1139804Simp/* tc-i386.h -- Header file for tc-i386.c
2139013Sdavidxu   Copyright 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3112904Sjeff   2001
4112904Sjeff   Free Software Foundation, Inc.
5112904Sjeff
6112904Sjeff   This file is part of GAS, the GNU Assembler.
7112904Sjeff
8112904Sjeff   GAS is free software; you can redistribute it and/or modify
9112904Sjeff   it under the terms of the GNU General Public License as published by
10112904Sjeff   the Free Software Foundation; either version 2, or (at your option)
11112904Sjeff   any later version.
12112904Sjeff
13112904Sjeff   GAS is distributed in the hope that it will be useful,
14112904Sjeff   but WITHOUT ANY WARRANTY; without even the implied warranty of
15112904Sjeff   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16112904Sjeff   GNU General Public License for more details.
17112904Sjeff
18112904Sjeff   You should have received a copy of the GNU General Public License
19112904Sjeff   along with GAS; see the file COPYING.  If not, write to the Free
20112904Sjeff   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21112904Sjeff   02111-1307, USA.  */
22112904Sjeff
23112904Sjeff
24112904Sjeff/* $FreeBSD: head/contrib/binutils/gas/config/tc-i386.h 78838 2001-06-26 17:53:08Z obrien $ */
25112904Sjeff
26112904Sjeff
27112904Sjeff#ifndef TC_I386
28116182Sobrien#define TC_I386 1
29116182Sobrien
30116182Sobrien#ifdef ANSI_PROTOTYPES
31162536Sdavidxustruct fix;
32112904Sjeff#endif
33112904Sjeff
34131431Smarcel#define TARGET_BYTES_BIG_ENDIAN	0
35112904Sjeff
36115765Sjeff#ifdef TE_LYNX
37112904Sjeff#define TARGET_FORMAT		"coff-i386-lynx"
38164033Srwatson#endif
39112904Sjeff
40161678Sdavidxu#ifdef BFD_ASSEMBLER
41165369Sdavidxu/* This is used to determine relocation types in tc-i386.c.  The first
42161678Sdavidxu   parameter is the current relocation type, the second one is the desired
43112904Sjeff   type.  The idea is that if the original type is already some kind of PIC
44112904Sjeff   relocation, we leave it alone, otherwise we give it the desired type */
45112904Sjeff
46216641Sdavidxu#define tc_fix_adjustable(X)  tc_i386_fix_adjustable(X)
47139013Sdavidxuextern int tc_i386_fix_adjustable PARAMS ((struct fix *));
48112904Sjeff
49112904Sjeff#if (defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF) || defined (OBJ_MAYBE_COFF) || defined (OBJ_COFF)) && !defined (TE_PE)
50139013Sdavidxu/* This arranges for gas/write.c to not apply a relocation if
51139013Sdavidxu   tc_fix_adjustable() says it is not adjustable.
52139013Sdavidxu   The "! symbol_used_in_reloc_p" test is there specifically to cover
53139013Sdavidxu   the case of non-global symbols in linkonce sections.  It's the
54139013Sdavidxu   generally correct thing to do though;  If a reloc is going to be
55139013Sdavidxu   emitted against a symbol then we don't want to adjust the fixup by
56165369Sdavidxu   applying the reloc during assembly.  The reloc will be applied by
57165369Sdavidxu   the linker during final link.  */
58205014Snwhitehorn#define TC_FIX_ADJUSTABLE(fixP) \
59162536Sdavidxu  (! symbol_used_in_reloc_p ((fixP)->fx_addsy) && tc_fix_adjustable (fixP))
60162536Sdavidxu#endif
61162536Sdavidxu
62179970Sdavidxu/* This expression evaluates to false if the relocation is for a local object
63179970Sdavidxu   for which we still want to do the relocation at runtime.  True if we
64179970Sdavidxu   are willing to perform this relocation while building the .o file.
65161678Sdavidxu   This is only used for pcrel relocations, so GOTOFF does not need to be
66161678Sdavidxu   checked here.  I am not sure if some of the others are ever used with
67161678Sdavidxu   pcrel, but it is easier to be safe than sorry.  */
68161678Sdavidxu
69161678Sdavidxu#define TC_RELOC_RTSYM_LOC_FIXUP(FIX)				\
70161678Sdavidxu  ((FIX)->fx_r_type != BFD_RELOC_386_PLT32			\
71161678Sdavidxu   && (FIX)->fx_r_type != BFD_RELOC_386_GOT32			\
72161678Sdavidxu   && (FIX)->fx_r_type != BFD_RELOC_386_GOTPC			\
73161678Sdavidxu   && ((FIX)->fx_addsy == NULL					\
74161678Sdavidxu       || (! S_IS_EXTERNAL ((FIX)->fx_addsy)			\
75161678Sdavidxu	   && ! S_IS_WEAK ((FIX)->fx_addsy)			\
76161678Sdavidxu	   && S_IS_DEFINED ((FIX)->fx_addsy)			\
77161678Sdavidxu	   && ! S_IS_COMMON ((FIX)->fx_addsy))))
78161678Sdavidxu
79161678Sdavidxu#define TARGET_ARCH		bfd_arch_i386
80161678Sdavidxu#define TARGET_MACH		(i386_mach ())
81161678Sdavidxuextern unsigned long i386_mach PARAMS ((void));
82161678Sdavidxu
83161678Sdavidxu#ifdef TE_FreeBSD
84161678Sdavidxu#define AOUT_TARGET_FORMAT	"a.out-i386-freebsd"
85161678Sdavidxu#endif
86161678Sdavidxu#ifdef TE_NetBSD
87115765Sjeff#define AOUT_TARGET_FORMAT	"a.out-i386-netbsd"
88161678Sdavidxu#endif
89161678Sdavidxu#ifdef TE_386BSD
90161678Sdavidxu#define AOUT_TARGET_FORMAT	"a.out-i386-bsd"
91161678Sdavidxu#endif
92161678Sdavidxu#ifdef TE_LINUX
93161678Sdavidxu#define AOUT_TARGET_FORMAT	"a.out-i386-linux"
94161678Sdavidxu#endif
95161678Sdavidxu#ifdef TE_Mach
96161678Sdavidxu#define AOUT_TARGET_FORMAT	"a.out-mach3"
97161678Sdavidxu#endif
98161678Sdavidxu#ifdef TE_DYNIX
99161678Sdavidxu#define AOUT_TARGET_FORMAT	"a.out-i386-dynix"
100161678Sdavidxu#endif
101161678Sdavidxu#ifndef AOUT_TARGET_FORMAT
102161678Sdavidxu#define AOUT_TARGET_FORMAT	"a.out-i386"
103170300Sjeff#endif
104170300Sjeff
105161678Sdavidxu#if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
106161678Sdavidxu     || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
107161678Sdavidxuextern const char *i386_target_format PARAMS ((void));
108161678Sdavidxu#define TARGET_FORMAT i386_target_format ()
109161678Sdavidxu#else
110161678Sdavidxu#ifdef OBJ_ELF
111161678Sdavidxu#define TARGET_FORMAT		"elf32-i386"
112161678Sdavidxu#endif
113161678Sdavidxu#ifdef OBJ_AOUT
114161742Sdavidxu#define TARGET_FORMAT		AOUT_TARGET_FORMAT
115161678Sdavidxu#endif
116201991Sdavidxu#endif
117201991Sdavidxu
118201991Sdavidxu#else /* ! BFD_ASSEMBLER */
119201991Sdavidxu
120201991Sdavidxu/* COFF STUFF */
121201991Sdavidxu
122115765Sjeff#define COFF_MAGIC I386MAGIC
123115765Sjeff#define BFD_ARCH bfd_arch_i386
124161678Sdavidxu#define COFF_FLAGS F_AR32WR
125161678Sdavidxu#define TC_COUNT_RELOC(x) ((x)->fx_addsy || (x)->fx_r_type==7)
126201991Sdavidxu#define TC_COFF_FIX2RTYPE(fixP) tc_coff_fix2rtype(fixP)
127201991Sdavidxuextern short tc_coff_fix2rtype PARAMS ((struct fix *));
128201991Sdavidxu#define TC_COFF_SIZEMACHDEP(frag) tc_coff_sizemachdep(frag)
129201991Sdavidxuextern int tc_coff_sizemachdep PARAMS ((fragS *frag));
130201991Sdavidxu
131201991Sdavidxu#ifdef TE_GO32
132201991Sdavidxu/* DJGPP now expects some sections to be 2**4 aligned.  */
133201991Sdavidxu#define SUB_SEGMENT_ALIGN(SEG)						\
134201991Sdavidxu  ((strcmp (obj_segment_name (SEG), ".text") == 0			\
135201991Sdavidxu    || strcmp (obj_segment_name (SEG), ".data") == 0			\
136161678Sdavidxu    || strcmp (obj_segment_name (SEG), ".bss") == 0			\
137138224Sdavidxu    || strncmp (obj_segment_name (SEG), ".gnu.linkonce.t", 15) == 0	\
138161678Sdavidxu    || strncmp (obj_segment_name (SEG), ".gnu.linkonce.d", 15) == 0	\
139161678Sdavidxu    || strncmp (obj_segment_name (SEG), ".gnu.linkonce.r", 15) == 0)	\
140161678Sdavidxu   ? 4									\
141161678Sdavidxu   : 2)
142201991Sdavidxu#else
143177848Sdavidxu#define SUB_SEGMENT_ALIGN(SEG) 2
144177848Sdavidxu#endif
145161678Sdavidxu
146201991Sdavidxu#define TC_RVA_RELOC 7
147201991Sdavidxu/* Need this for PIC relocations */
148161678Sdavidxu#define NEED_FX_R_TYPE
149161678Sdavidxu
150161678Sdavidxu#ifdef TE_386BSD
151161678Sdavidxu/* The BSDI linker apparently rejects objects with a machine type of
152158377Sdavidxu   M_386 (100).  */
153161678Sdavidxu#define AOUT_MACHTYPE 0
154161678Sdavidxu#else
155161678Sdavidxu#define AOUT_MACHTYPE 100
156201991Sdavidxu#endif
157138224Sdavidxu
158115765Sjeff#undef REVERSE_SORT_RELOCS
159161678Sdavidxu
160189756Sdavidxu#endif /* ! BFD_ASSEMBLER */
161161678Sdavidxu
162161678Sdavidxu#ifndef LEX_AT
163161678Sdavidxu#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) x86_cons (EXP, NBYTES)
164161678Sdavidxuextern void x86_cons PARAMS ((expressionS *, int));
165161678Sdavidxu
166161678Sdavidxu#define TC_CONS_FIX_NEW(FRAG,OFF,LEN,EXP) x86_cons_fix_new(FRAG, OFF, LEN, EXP)
167161678Sdavidxuextern void x86_cons_fix_new
168161678Sdavidxu  PARAMS ((fragS *, unsigned int, unsigned int, expressionS *));
169161678Sdavidxu#endif
170161678Sdavidxu
171163709Sjb#define TC_FORCE_RELOCATION(fixp) tc_i386_force_relocation(fixp)
172163709Sjbextern int tc_i386_force_relocation PARAMS ((struct fix *));
173163709Sjb
174161678Sdavidxu#ifdef BFD_ASSEMBLER
175138224Sdavidxu#define NO_RELOC BFD_RELOC_NONE
176216678Sdavidxu#else
177216678Sdavidxu#define NO_RELOC 0
178115765Sjeff#endif
179161678Sdavidxu#define tc_coff_symbol_emit_hook(a)	;	/* not used */
180161678Sdavidxu
181161678Sdavidxu#ifndef BFD_ASSEMBLER
182177848Sdavidxu#ifndef OBJ_AOUT
183177848Sdavidxu#ifndef TE_PE
184161678Sdavidxu#ifndef TE_GO32
185179421Sdavidxu/* Local labels starts with .L */
186138224Sdavidxu#define LOCAL_LABEL(name) (name[0] == '.' \
187161678Sdavidxu		 && (name[1] == 'L' || name[1] == 'X' || name[1] == '.'))
188115310Sjeff#endif
189227309Sed#endif
190161678Sdavidxu#endif
191161678Sdavidxu#endif
192161678Sdavidxu
193161678Sdavidxu#define LOCAL_LABELS_FB 1
194161678Sdavidxu
195161678Sdavidxu#define tc_aout_pre_write_hook(x)	{;}	/* not used */
196139013Sdavidxu#define tc_crawl_symbol_chain(a)	{;}	/* not used */
197139013Sdavidxu#define tc_headers_hook(a)		{;}	/* not used */
198139257Sdavidxu
199139257Sdavidxuextern const char extra_symbol_chars[];
200177848Sdavidxu#define tc_symbol_chars extra_symbol_chars
201177848Sdavidxu
202161678Sdavidxu#define MAX_OPERANDS 3		/* max operands per insn */
203139257Sdavidxu#define MAX_IMMEDIATE_OPERANDS 2/* max immediates per insn (lcall, ljmp) */
204163697Sdavidxu#define MAX_MEMORY_OPERANDS 2	/* max memory refs per insn (string ops) */
205161678Sdavidxu
206161678Sdavidxu/* Prefixes will be emitted in the order defined below.
207161678Sdavidxu   WAIT_PREFIX must be the first prefix since FWAIT is really is an
208161678Sdavidxu   instruction, and so must come before any prefixes.  */
209161678Sdavidxu#define WAIT_PREFIX	0
210161678Sdavidxu#define LOCKREP_PREFIX	1
211115310Sjeff#define ADDR_PREFIX	2
212177848Sdavidxu#define DATA_PREFIX	3
213177848Sdavidxu#define SEG_PREFIX	4
214177848Sdavidxu#define REX_PREFIX	5       /* must come last.  */
215177848Sdavidxu#define MAX_PREFIXES	6	/* max prefixes per opcode */
216170300Sjeff
217170300Sjeff/* we define the syntax here (modulo base,index,scale syntax) */
218161678Sdavidxu#define REGISTER_PREFIX '%'
219161678Sdavidxu#define IMMEDIATE_PREFIX '$'
220161678Sdavidxu#define ABSOLUTE_PREFIX '*'
221179421Sdavidxu
222138224Sdavidxu#define TWO_BYTE_OPCODE_ESCAPE 0x0f
223161678Sdavidxu#define NOP_OPCODE (char) 0x90
224161678Sdavidxu
225179421Sdavidxu/* register numbers */
226179421Sdavidxu#define EBP_REG_NUM 5
227179421Sdavidxu#define ESP_REG_NUM 4
228179421Sdavidxu
229201991Sdavidxu/* modrm_byte.regmem for twobyte escape */
230201991Sdavidxu#define ESCAPE_TO_TWO_BYTE_ADDRESSING ESP_REG_NUM
231201991Sdavidxu/* index_base_byte.index for no index register addressing */
232179421Sdavidxu#define NO_INDEX_REGISTER ESP_REG_NUM
233179421Sdavidxu/* index_base_byte.base for no base register addressing */
234179421Sdavidxu#define NO_BASE_REGISTER EBP_REG_NUM
235179421Sdavidxu#define NO_BASE_REGISTER_16 6
236161678Sdavidxu
237170300Sjeff/* these are the instruction mnemonic suffixes.  */
238161678Sdavidxu#define WORD_MNEM_SUFFIX  'w'
239161678Sdavidxu#define BYTE_MNEM_SUFFIX  'b'
240161678Sdavidxu#define SHORT_MNEM_SUFFIX 's'
241161678Sdavidxu#define LONG_MNEM_SUFFIX  'l'
242143149Sdavidxu#define QWORD_MNEM_SUFFIX  'q'
243143149Sdavidxu/* Intel Syntax */
244143149Sdavidxu#define LONG_DOUBLE_MNEM_SUFFIX 'x'
245161678Sdavidxu
246161678Sdavidxu/* modrm.mode = REGMEM_FIELD_HAS_REG when a register is in there */
247161678Sdavidxu#define REGMEM_FIELD_HAS_REG 0x3/* always = 0x3 */
248201991Sdavidxu#define REGMEM_FIELD_HAS_MEM (~REGMEM_FIELD_HAS_REG)
249201991Sdavidxu
250161678Sdavidxu#define END_OF_INSN '\0'
251161678Sdavidxu
252161678Sdavidxu/* Intel Syntax */
253143149Sdavidxu/* Values 0-4 map onto scale factor */
254143149Sdavidxu#define BYTE_PTR     0
255143149Sdavidxu#define WORD_PTR     1
256143149Sdavidxu#define DWORD_PTR    2
257143149Sdavidxu#define QWORD_PTR    3
258201991Sdavidxu#define XWORD_PTR    4
259201991Sdavidxu#define SHORT        5
260143149Sdavidxu#define OFFSET_FLAT  6
261143149Sdavidxu#define FLAT         7
262143149Sdavidxu#define NONE_FOUND   8
263161678Sdavidxu
264139013Sdavidxutypedef struct
265138224Sdavidxu{
266161678Sdavidxu  /* instruction name sans width suffix ("mov" for movl insns) */
267161678Sdavidxu  char *name;
268138224Sdavidxu
269138224Sdavidxu  /* how many operands */
270161678Sdavidxu  unsigned int operands;
271161678Sdavidxu
272139013Sdavidxu  /* base_opcode is the fundamental opcode byte without optional
273201886Sdavidxu     prefix(es).  */
274179421Sdavidxu  unsigned int base_opcode;
275179421Sdavidxu
276139013Sdavidxu  /* extension_opcode is the 3 bit extension for group <n> insns.
277139013Sdavidxu     This field is also used to store the 8-bit opcode suffix for the
278161678Sdavidxu     AMD 3DNow! instructions.
279177848Sdavidxu     If this template has no extension opcode (the usual case) use None */
280161678Sdavidxu  unsigned int extension_opcode;
281138224Sdavidxu#define None 0xffff		/* If no extension_opcode is possible.  */
282177848Sdavidxu
283139257Sdavidxu  /* cpu feature flags */
284161678Sdavidxu  unsigned int cpu_flags;
285139257Sdavidxu#define Cpu086		  0x1	/* Any old cpu will do, 0 does the same */
286161678Sdavidxu#define Cpu186		  0x2	/* i186 or better required */
287177848Sdavidxu#define Cpu286		  0x4	/* i286 or better required */
288139257Sdavidxu#define Cpu386		  0x8	/* i386 or better required */
289139257Sdavidxu#define Cpu486		 0x10	/* i486 or better required */
290161678Sdavidxu#define Cpu586		 0x20	/* i585 or better required */
291177848Sdavidxu#define Cpu686		 0x40	/* i686 or better required */
292161678Sdavidxu#define CpuP4		 0x80	/* Pentium4 or better required */
293139257Sdavidxu#define CpuK6		0x100	/* AMD K6 or better required*/
294177848Sdavidxu#define CpuAthlon	0x200	/* AMD Athlon or better required*/
295139257Sdavidxu#define CpuSledgehammer 0x400	/* Sledgehammer or better required */
296161678Sdavidxu#define CpuMMX		0x800	/* MMX support required */
297139257Sdavidxu#define CpuSSE	       0x1000	/* Streaming SIMD extensions required */
298161678Sdavidxu#define CpuSSE2	       0x2000	/* Streaming SIMD extensions 2 required */
299177848Sdavidxu#define Cpu3dnow       0x4000	/* 3dnow! support required */
300139257Sdavidxu#define CpuUnknown     0x8000	/* The CPU is unknown,  be on the safe side.  */
301139257Sdavidxu
302161678Sdavidxu  /* These flags are set by gas depending on the flag_code.  */
303177848Sdavidxu#define Cpu64	     0x4000000   /* 64bit support required  */
304177848Sdavidxu#define CpuNo64      0x8000000   /* Not supported in the 64bit mode  */
305161678Sdavidxu
306139257Sdavidxu  /* The default value for unknown CPUs - enable all features to avoid problems.  */
307177848Sdavidxu#define CpuUnknownFlags (Cpu086|Cpu186|Cpu286|Cpu386|Cpu486|Cpu586|Cpu686|CpuP4|CpuSledgehammer|CpuMMX|CpuSSE|CpuSSE2|Cpu3dnow|CpuK6|CpuAthlon)
308138224Sdavidxu
309161678Sdavidxu  /* the bits in opcode_modifier are used to generate the final opcode from
310161678Sdavidxu     the base_opcode.  These bits also are used to detect alternate forms of
311161678Sdavidxu     the same instruction */
312177848Sdavidxu  unsigned int opcode_modifier;
313177848Sdavidxu
314177880Sdavidxu  /* opcode_modifier bits: */
315177880Sdavidxu#define W		   0x1	/* set if operands can be words or dwords
316177880Sdavidxu				   encoded the canonical way */
317177880Sdavidxu#define D		   0x2	/* D = 0 if Reg --> Regmem;
318177880Sdavidxu				   D = 1 if Regmem --> Reg:    MUST BE 0x2 */
319177880Sdavidxu#define Modrm		   0x4
320177880Sdavidxu#define FloatR		   0x8	/* src/dest swap for floats:   MUST BE 0x8 */
321177880Sdavidxu#define ShortForm	  0x10	/* register is in low 3 bits of opcode */
322177880Sdavidxu#define FloatMF		  0x20	/* FP insn memory format bit, sized by 0x4 */
323177848Sdavidxu#define Jump		  0x40	/* special case for jump insns.  */
324177880Sdavidxu#define JumpDword	  0x80  /* call and jump */
325177880Sdavidxu#define JumpByte	 0x100  /* loop and jecxz */
326177848Sdavidxu#define JumpInterSegment 0x200	/* special case for intersegment leaps/calls */
327177848Sdavidxu#define FloatD		 0x400	/* direction for float insns:  MUST BE 0x400 */
328177848Sdavidxu#define Seg2ShortForm	 0x800	/* encoding of load segment reg insns */
329177848Sdavidxu#define Seg3ShortForm	0x1000	/* fs/gs segment register insns.  */
330177848Sdavidxu#define Size16		0x2000	/* needs size prefix if in 32-bit mode */
331177848Sdavidxu#define Size32		0x4000	/* needs size prefix if in 16-bit mode */
332138224Sdavidxu#define Size64		0x8000	/* needs size prefix if in 16-bit mode */
333138224Sdavidxu#define IgnoreSize     0x10000  /* instruction ignores operand size prefix */
334161678Sdavidxu#define DefaultSize    0x20000  /* default insn size depends on mode */
335177848Sdavidxu#define No_bSuf	       0x40000	/* b suffix on instruction illegal */
336161678Sdavidxu#define No_wSuf	       0x80000	/* w suffix on instruction illegal */
337138225Sdavidxu#define No_lSuf	      0x100000 	/* l suffix on instruction illegal */
338177848Sdavidxu#define No_sSuf	      0x200000	/* s suffix on instruction illegal */
339138224Sdavidxu#define No_qSuf       0x400000  /* q suffix on instruction illegal */
340161678Sdavidxu#define No_xSuf       0x800000  /* x suffix on instruction illegal */
341161678Sdavidxu#define FWait	     0x1000000	/* instruction needs FWAIT */
342161678Sdavidxu#define IsString     0x2000000	/* quick test for string instructions */
343177848Sdavidxu#define regKludge    0x4000000	/* fake an extra reg operand for clr, imul */
344177848Sdavidxu#define IsPrefix     0x8000000	/* opcode is a prefix */
345177848Sdavidxu#define ImmExt	    0x10000000	/* instruction has extension in 8 bit imm */
346177848Sdavidxu#define NoRex64	    0x20000000  /* instruction don't need Rex64 prefix.  */
347177848Sdavidxu#define Rex64	    0x40000000  /* instruction require Rex64 prefix.  */
348138224Sdavidxu#define Ugh	    0x80000000	/* deprecated fp insn, gets a warning */
349138224Sdavidxu
350201991Sdavidxu  /* operand_types[i] describes the type of operand i.  This is made
351201991Sdavidxu     by OR'ing together all of the possible type masks.  (e.g.
352201991Sdavidxu     'operand_types[i] = Reg|Imm' specifies that operand i can be
353201991Sdavidxu     either a register or an immediate operand.  */
354201991Sdavidxu  unsigned int operand_types[3];
355201991Sdavidxu
356201991Sdavidxu  /* operand_types[i] bits */
357201991Sdavidxu  /* register */
358201991Sdavidxu#define Reg8		   0x1	/* 8 bit reg */
359201991Sdavidxu#define Reg16		   0x2	/* 16 bit reg */
360201991Sdavidxu#define Reg32		   0x4	/* 32 bit reg */
361201991Sdavidxu#define Reg64		   0x8	/* 64 bit reg */
362201991Sdavidxu  /* immediate */
363201991Sdavidxu#define Imm8		  0x10	/* 8 bit immediate */
364201991Sdavidxu#define Imm8S		  0x20	/* 8 bit immediate sign extended */
365201991Sdavidxu#define Imm16		  0x40	/* 16 bit immediate */
366139013Sdavidxu#define Imm32		  0x80	/* 32 bit immediate */
367177848Sdavidxu#define Imm32S		 0x100	/* 32 bit immediate sign extended */
368115765Sjeff#define Imm64		 0x200	/* 64 bit immediate */
369201991Sdavidxu#define Imm1		 0x400	/* 1 bit immediate */
370161678Sdavidxu  /* memory */
371139013Sdavidxu#define BaseIndex	 0x800
372161678Sdavidxu  /* Disp8,16,32 are used in different ways, depending on the
373161678Sdavidxu     instruction.  For jumps, they specify the size of the PC relative
374201991Sdavidxu     displacement, for baseindex type instructions, they specify the
375203744Sdavidxu     size of the offset relative to the base register, and for memory
376201991Sdavidxu     offset instructions such as `mov 1234,%al' they specify the size of
377201991Sdavidxu     the offset relative to the segment base.  */
378201991Sdavidxu#define Disp8		0x1000	/* 8 bit displacement */
379201991Sdavidxu#define Disp16		0x2000	/* 16 bit displacement */
380201991Sdavidxu#define Disp32		0x4000	/* 32 bit displacement */
381201991Sdavidxu#define Disp32S	        0x8000	/* 32 bit signed displacement */
382201991Sdavidxu#define Disp64	       0x10000	/* 64 bit displacement */
383201991Sdavidxu  /* specials */
384201991Sdavidxu#define InOutPortReg   0x20000	/* register to hold in/out port addr = dx */
385201991Sdavidxu#define ShiftCount     0x40000	/* register to hold shift cound = cl */
386201991Sdavidxu#define Control	       0x80000	/* Control register */
387158718Sdavidxu#define Debug	      0x100000	/* Debug register */
388201991Sdavidxu#define Test	      0x200000	/* Test register */
389201991Sdavidxu#define FloatReg      0x400000	/* Float register */
390139013Sdavidxu#define FloatAcc      0x800000	/* Float stack top %st(0) */
391139013Sdavidxu#define SReg2	     0x1000000	/* 2 bit segment register */
392139013Sdavidxu#define SReg3	     0x2000000	/* 3 bit segment register */
393177848Sdavidxu#define Acc	     0x4000000	/* Accumulator %al or %ax or %eax */
394139013Sdavidxu#define JumpAbsolute 0x8000000
395161678Sdavidxu#define RegMMX	    0x10000000	/* MMX register */
396201991Sdavidxu#define RegXMM	    0x20000000	/* XMM registers in PIII */
397161678Sdavidxu#define EsSeg	    0x40000000	/* String insn operand with fixed es segment */
398161678Sdavidxu
399161678Sdavidxu  /* InvMem is for instructions with a modrm byte that only allow a
400158718Sdavidxu     general register encoding in the i.tm.mode and i.tm.regmem fields,
401201991Sdavidxu     eg. control reg moves.  They really ought to support a memory form,
402201991Sdavidxu     but don't, so we add an InvMem flag to the register operand to
403201991Sdavidxu     indicate that it should be encoded in the i.tm.regmem field.  */
404158718Sdavidxu#define InvMem	    0x80000000
405201991Sdavidxu
406201991Sdavidxu#define Reg	(Reg8|Reg16|Reg32|Reg64) /* gen'l register */
407201991Sdavidxu#define WordReg (Reg16|Reg32|Reg64)
408201991Sdavidxu#define ImplicitRegister (InOutPortReg|ShiftCount|Acc|FloatAcc)
409201991Sdavidxu#define Imm	(Imm8|Imm8S|Imm16|Imm32S|Imm32|Imm64) /* gen'l immediate */
410201991Sdavidxu#define EncImm	(Imm8|Imm16|Imm32|Imm32S) /* Encodable gen'l immediate */
411201991Sdavidxu#define Disp	(Disp8|Disp16|Disp32|Disp32S|Disp64) /* General displacement */
412201991Sdavidxu#define AnyMem	(Disp8|Disp16|Disp32|Disp32S|BaseIndex|InvMem)	/* General memory */
413201991Sdavidxu  /* The following aliases are defined because the opcode table
414201991Sdavidxu     carefully specifies the allowed memory types for each instruction.
415201991Sdavidxu     At the moment we can only tell a memory reference size by the
416139013Sdavidxu     instruction suffix, so there's not much point in defining Mem8,
417139013Sdavidxu     Mem16, Mem32 and Mem64 opcode modifiers - We might as well just use
418139013Sdavidxu     the suffix directly to check memory operands.  */
419161678Sdavidxu#define LLongMem AnyMem		/* 64 bits (or more) */
420161678Sdavidxu#define LongMem AnyMem		/* 32 bit memory ref */
421161678Sdavidxu#define ShortMem AnyMem		/* 16 bit memory ref */
422139013Sdavidxu#define WordMem AnyMem		/* 16 or 32 bit memory ref */
423139013Sdavidxu#define ByteMem AnyMem		/* 8 bit memory ref */
424139013Sdavidxu}
425161678Sdavidxutemplate;
426201991Sdavidxu
427115765Sjeff/*
428161678Sdavidxu  'templates' is for grouping together 'template' structures for opcodes
429161678Sdavidxu  of the same name.  This is only used for storing the insns in the grand
430201991Sdavidxu  ole hash table of insns.
431201991Sdavidxu  The templates themselves start at START and range up to (but not including)
432201991Sdavidxu  END.
433201991Sdavidxu  */
434115765Sjefftypedef struct
435115765Sjeff{
436161678Sdavidxu  const template *start;
437161678Sdavidxu  const template *end;
438161678Sdavidxu}
439161678Sdavidxutemplates;
440139257Sdavidxu
441161678Sdavidxu/* these are for register name --> number & type hash lookup */
442161678Sdavidxutypedef struct
443161678Sdavidxu{
444201991Sdavidxu  char *reg_name;
445161678Sdavidxu  unsigned int reg_type;
446161678Sdavidxu  unsigned int reg_flags;
447161678Sdavidxu#define RegRex	    0x1  /* Extended register.  */
448161678Sdavidxu#define RegRex64    0x2  /* Extended 8 bit register.  */
449201991Sdavidxu  unsigned int reg_num;
450201991Sdavidxu}
451201991Sdavidxureg_entry;
452201991Sdavidxu
453161678Sdavidxutypedef struct
454201991Sdavidxu{
455161678Sdavidxu  char *seg_name;
456161678Sdavidxu  unsigned int seg_prefix;
457161678Sdavidxu}
458161678Sdavidxuseg_entry;
459161678Sdavidxu
460177848Sdavidxu/* 386 operand encoding bytes:  see 386 book for details of this.  */
461161678Sdavidxutypedef struct
462177848Sdavidxu{
463115765Sjeff  unsigned int regmem;	/* codes register or memory operand */
464161678Sdavidxu  unsigned int reg;	/* codes register operand (or extended opcode) */
465201991Sdavidxu  unsigned int mode;	/* how to interpret regmem & reg */
466201991Sdavidxu}
467161678Sdavidxumodrm_byte;
468115765Sjeff
469139257Sdavidxu/* x86-64 extension prefix.  */
470161678Sdavidxutypedef struct
471161678Sdavidxu  {
472201991Sdavidxu    unsigned int mode64;
473201991Sdavidxu    unsigned int extX;		/* Used to extend modrm reg field.  */
474201991Sdavidxu    unsigned int extY;		/* Used to extend SIB index field.  */
475177848Sdavidxu    unsigned int extZ;		/* Used to extend modrm reg/mem, SIB base, modrm base fields.  */
476161678Sdavidxu    unsigned int empty;		/* Used to old-style byte registers to new style.  */
477139257Sdavidxu  }
478201991Sdavidxurex_byte;
479139013Sdavidxu
480139013Sdavidxu/* 386 opcode byte to code indirect addressing.  */
481139257Sdavidxutypedef struct
482138224Sdavidxu{
483138224Sdavidxu  unsigned base;
484177848Sdavidxu  unsigned index;
485161678Sdavidxu  unsigned scale;
486161678Sdavidxu}
487161678Sdavidxusib_byte;
488161678Sdavidxu
489161678Sdavidxu/* x86 arch names and features */
490161678Sdavidxutypedef struct
491161678Sdavidxu{
492161678Sdavidxu  const char *name;	/* arch name */
493161678Sdavidxu  unsigned int flags;	/* cpu feature flags */
494161678Sdavidxu}
495161678Sdavidxuarch_entry;
496161678Sdavidxu
497161678Sdavidxu/* The name of the global offset table generated by the compiler. Allow
498161678Sdavidxu   this to be overridden if need be.  */
499161678Sdavidxu#ifndef GLOBAL_OFFSET_TABLE_NAME
500161678Sdavidxu#define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_"
501161678Sdavidxu#endif
502161678Sdavidxu
503138224Sdavidxu#ifdef BFD_ASSEMBLER
504161678Sdavidxuvoid i386_validate_fix PARAMS ((struct fix *));
505138224Sdavidxu#define TC_VALIDATE_FIX(FIXP,SEGTYPE,SKIP) i386_validate_fix(FIXP)
506161678Sdavidxu#endif
507161678Sdavidxu
508161678Sdavidxu#endif /* TC_I386 */
509161678Sdavidxu
510161678Sdavidxu#define md_operand(x)
511161678Sdavidxu
512161678Sdavidxuextern const struct relax_type md_relax_table[];
513161678Sdavidxu#define TC_GENERIC_RELAX_TABLE md_relax_table
514139751Sdavidxu
515139751Sdavidxu#define md_do_align(n, fill, len, max, around)				\
516139751Sdavidxuif ((n) && !need_pass_2							\
517138224Sdavidxu    && (!(fill) || ((char)*(fill) == (char)0x90 && (len) == 1))		\
518138224Sdavidxu    && subseg_text_p (now_seg))						\
519161678Sdavidxu  {									\
520161678Sdavidxu    frag_align_code ((n), (max));					\
521161678Sdavidxu    goto around;							\
522218969Sjhb  }
523161678Sdavidxu
524139013Sdavidxu#define MAX_MEM_FOR_RS_ALIGN_CODE  15
525161678Sdavidxu
526139013Sdavidxuextern void i386_align_code PARAMS ((fragS *, int));
527139013Sdavidxu
528139013Sdavidxu#define HANDLE_ALIGN(fragP)						\
529139013Sdavidxuif (fragP->fr_type == rs_align_code) 					\
530139013Sdavidxu  i386_align_code (fragP, (fragP->fr_next->fr_address			\
531139013Sdavidxu			   - fragP->fr_address				\
532161678Sdavidxu			   - fragP->fr_fix));
533161678Sdavidxu
534161678Sdavidxu/* call md_apply_fix3 with segment instead of md_apply_fix */
535161678Sdavidxu#define MD_APPLY_FIX3
536161678Sdavidxu
537163677Sdavidxuvoid i386_print_statistics PARAMS ((FILE *));
538163677Sdavidxu#define tc_print_statistics i386_print_statistics
539161678Sdavidxu
540161678Sdavidxu#define md_number_to_chars number_to_chars_littleendian
541161678Sdavidxu
542161678Sdavidxu#ifdef SCO_ELF
543161678Sdavidxu#define tc_init_after_args() sco_id ()
544161678Sdavidxuextern void sco_id PARAMS ((void));
545161678Sdavidxu#endif
546161678Sdavidxu
547161678Sdavidxu#define DIFF_EXPR_OK    /* foo-. gets turned into PC relative relocs */
548161678Sdavidxu