Make building of w65 simulator conditional on --enable-sim.
[deliverable/binutils-gdb.git] / include / opcode / i386.h
CommitLineData
ce868e5c 1/* i386-opcode.h -- Intel 80386 opcode table
80aeca14 2 Copyright 1989, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation.
ce868e5c
JG
3
4This file is part of GAS, the GNU Assembler, and GDB, the GNU Debugger.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
cd22144a 18Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
ce868e5c 19
c0d7b534
ILT
20/* The NON_BROKEN_OPCODES cases use the operands in the reverse order
21 from that documented in the Intel manuals. The opcode values are
22 such that they actually generate different instructions. These
654b0845
ILT
23 values must not be changed, as they are the values generated by the
24 UnixWare assembler, and possibly other ix86 assemblers. */
c0d7b534 25
ce868e5c
JG
26static const template i386_optab[] = {
27
28#define _ None
29/* move instructions */
a43022bd 30#define MOV_AX_DISP32 0xa0
fc0d7441
ILT
31{ "mov", 2, 0xa0, _, DW|NoModrm, { Disp32, Acc, 0 } },
32{ "mov", 2, 0x88, _, DW|Modrm, { Reg, Reg|Mem, 0 } },
33{ "mov", 2, 0xb0, _, ShortFormW, { Imm, Reg, 0 } },
34{ "mov", 2, 0xc6, _, W|Modrm, { Imm, Reg|Mem, 0 } },
35{ "mov", 2, 0x8c, _, D|Modrm, { SReg3|SReg2, Reg16|Mem, 0 } },
ce868e5c 36/* move to/from control debug registers */
fc0d7441
ILT
37{ "mov", 2, 0x0f20, _, D|Modrm, { Control, Reg32, 0} },
38{ "mov", 2, 0x0f21, _, D|Modrm, { Debug, Reg32, 0} },
39{ "mov", 2, 0x0f24, _, D|Modrm, { Test, Reg32, 0} },
ce868e5c
JG
40
41/* move with sign extend */
42/* "movsbl" & "movsbw" must not be unified into "movsb" to avoid
43 conflict with the "movs" string move instruction. Thus,
fc0d7441 44 {"movsb", 2, 0x0fbe, _, ReverseRegRegmem|Modrm, { Reg8|Mem, Reg16|Reg32, 0} },
ce868e5c 45 is not kosher; we must seperate the two instructions. */
a43022bd
KR
46{"movsbl", 2, 0x0fbe, _, ReverseRegRegmem|Modrm|Data32, { Reg8|Mem, Reg32, 0} },
47{"movsbw", 2, 0x0fbe, _, ReverseRegRegmem|Modrm|Data16, { Reg8|Mem, Reg16, 0} },
fc0d7441 48{"movswl", 2, 0x0fbf, _, ReverseRegRegmem|Modrm, { Reg16|Mem, Reg32, 0} },
ce868e5c
JG
49
50/* move with zero extend */
fc0d7441
ILT
51{"movzb", 2, 0x0fb6, _, ReverseRegRegmem|Modrm, { Reg8|Mem, Reg16|Reg32, 0} },
52{"movzwl", 2, 0x0fb7, _, ReverseRegRegmem|Modrm, { Reg16|Mem, Reg32, 0} },
ce868e5c
JG
53
54/* push instructions */
fc0d7441
ILT
55{"push", 1, 0x50, _, ShortForm, { WordReg,0,0 } },
56{"push", 1, 0xff, 0x6, Modrm, { WordReg|WordMem, 0, 0 } },
57{"push", 1, 0x6a, _, NoModrm, { Imm8S, 0, 0} },
a43022bd 58{"push", 1, 0x68, _, NoModrm, { Imm16|Imm32, 0, 0} },
fc0d7441
ILT
59{"push", 1, 0x06, _, Seg2ShortForm, { SReg2,0,0 } },
60{"push", 1, 0x0fa0, _, Seg3ShortForm, { SReg3,0,0 } },
ce868e5c 61/* push all */
fc0d7441 62{"pusha", 0, 0x60, _, NoModrm, { 0, 0, 0 } },
ce868e5c
JG
63
64/* pop instructions */
fc0d7441
ILT
65{"pop", 1, 0x58, _, ShortForm, { WordReg,0,0 } },
66{"pop", 1, 0x8f, 0x0, Modrm, { WordReg|WordMem, 0, 0 } },
ce868e5c 67#define POP_SEG_SHORT 0x7
fc0d7441
ILT
68{"pop", 1, 0x07, _, Seg2ShortForm, { SReg2,0,0 } },
69{"pop", 1, 0x0fa1, _, Seg3ShortForm, { SReg3,0,0 } },
ce868e5c 70/* pop all */
fc0d7441 71{"popa", 0, 0x61, _, NoModrm, { 0, 0, 0 } },
ce868e5c
JG
72
73/* xchg exchange instructions
74 xchg commutes: we allow both operand orders */
fc0d7441
ILT
75{"xchg", 2, 0x90, _, ShortForm, { WordReg, Acc, 0 } },
76{"xchg", 2, 0x90, _, ShortForm, { Acc, WordReg, 0 } },
77{"xchg", 2, 0x86, _, W|Modrm, { Reg, Reg|Mem, 0 } },
78{"xchg", 2, 0x86, _, W|Modrm, { Reg|Mem, Reg, 0 } },
ce868e5c
JG
79
80/* in/out from ports */
fc0d7441
ILT
81{"in", 2, 0xe4, _, W|NoModrm, { Imm8, Acc, 0 } },
82{"in", 2, 0xec, _, W|NoModrm, { InOutPortReg, Acc, 0 } },
83{"in", 1, 0xe4, _, W|NoModrm, { Imm8, 0, 0 } },
84{"in", 1, 0xec, _, W|NoModrm, { InOutPortReg, 0, 0 } },
85{"out", 2, 0xe6, _, W|NoModrm, { Acc, Imm8, 0 } },
86{"out", 2, 0xee, _, W|NoModrm, { Acc, InOutPortReg, 0 } },
87{"out", 1, 0xe6, _, W|NoModrm, { Imm8, 0, 0 } },
88{"out", 1, 0xee, _, W|NoModrm, { InOutPortReg, 0, 0 } },
89
ce868e5c 90/* load effective address */
fc0d7441 91{"lea", 2, 0x8d, _, Modrm, { WordMem, WordReg, 0 } },
ce868e5c
JG
92
93/* load segment registers from memory */
fc0d7441
ILT
94{"lds", 2, 0xc5, _, Modrm, { Mem, Reg32, 0} },
95{"les", 2, 0xc4, _, Modrm, { Mem, Reg32, 0} },
96{"lfs", 2, 0x0fb4, _, Modrm, { Mem, Reg32, 0} },
97{"lgs", 2, 0x0fb5, _, Modrm, { Mem, Reg32, 0} },
98{"lss", 2, 0x0fb2, _, Modrm, { Mem, Reg32, 0} },
ce868e5c
JG
99
100/* flags register instructions */
fc0d7441
ILT
101{"clc", 0, 0xf8, _, NoModrm, { 0, 0, 0} },
102{"cld", 0, 0xfc, _, NoModrm, { 0, 0, 0} },
103{"cli", 0, 0xfa, _, NoModrm, { 0, 0, 0} },
104{"clts", 0, 0x0f06, _, NoModrm, { 0, 0, 0} },
105{"cmc", 0, 0xf5, _, NoModrm, { 0, 0, 0} },
106{"lahf", 0, 0x9f, _, NoModrm, { 0, 0, 0} },
107{"sahf", 0, 0x9e, _, NoModrm, { 0, 0, 0} },
cd22144a
KR
108{"pushfl", 0, 0x9c, _, NoModrm|Data32, { 0, 0, 0} },
109{"popfl", 0, 0x9d, _, NoModrm|Data32, { 0, 0, 0} },
a43022bd
KR
110{"pushfw", 0, 0x9c, _, NoModrm|Data16, { 0, 0, 0} },
111{"popfw", 0, 0x9d, _, NoModrm|Data16, { 0, 0, 0} },
527cabaf
ILT
112{"pushf", 0, 0x9c, _, NoModrm, { 0, 0, 0} },
113{"popf", 0, 0x9d, _, NoModrm, { 0, 0, 0} },
fc0d7441
ILT
114{"stc", 0, 0xf9, _, NoModrm, { 0, 0, 0} },
115{"std", 0, 0xfd, _, NoModrm, { 0, 0, 0} },
116{"sti", 0, 0xfb, _, NoModrm, { 0, 0, 0} },
117
118{"add", 2, 0x0, _, DW|Modrm, { Reg, Reg|Mem, 0} },
119{"add", 2, 0x83, 0, Modrm, { Imm8S, WordReg|WordMem, 0} },
120{"add", 2, 0x4, _, W|NoModrm, { Imm, Acc, 0} },
121{"add", 2, 0x80, 0, W|Modrm, { Imm, Reg|Mem, 0} },
122
123{"inc", 1, 0x40, _, ShortForm, { WordReg, 0, 0} },
124{"inc", 1, 0xfe, 0, W|Modrm, { Reg|Mem, 0, 0} },
125
126{"sub", 2, 0x28, _, DW|Modrm, { Reg, Reg|Mem, 0} },
127{"sub", 2, 0x83, 5, Modrm, { Imm8S, WordReg|WordMem, 0} },
128{"sub", 2, 0x2c, _, W|NoModrm, { Imm, Acc, 0} },
129{"sub", 2, 0x80, 5, W|Modrm, { Imm, Reg|Mem, 0} },
130
131{"dec", 1, 0x48, _, ShortForm, { WordReg, 0, 0} },
132{"dec", 1, 0xfe, 1, W|Modrm, { Reg|Mem, 0, 0} },
133
134{"sbb", 2, 0x18, _, DW|Modrm, { Reg, Reg|Mem, 0} },
135{"sbb", 2, 0x83, 3, Modrm, { Imm8S, WordReg|WordMem, 0} },
136{"sbb", 2, 0x1c, _, W|NoModrm, { Imm, Acc, 0} },
137{"sbb", 2, 0x80, 3, W|Modrm, { Imm, Reg|Mem, 0} },
138
139{"cmp", 2, 0x38, _, DW|Modrm, { Reg, Reg|Mem, 0} },
140{"cmp", 2, 0x83, 7, Modrm, { Imm8S, WordReg|WordMem, 0} },
141{"cmp", 2, 0x3c, _, W|NoModrm, { Imm, Acc, 0} },
142{"cmp", 2, 0x80, 7, W|Modrm, { Imm, Reg|Mem, 0} },
143
144{"test", 2, 0x84, _, W|Modrm, { Reg|Mem, Reg, 0} },
145{"test", 2, 0x84, _, W|Modrm, { Reg, Reg|Mem, 0} },
146{"test", 2, 0xa8, _, W|NoModrm, { Imm, Acc, 0} },
147{"test", 2, 0xf6, 0, W|Modrm, { Imm, Reg|Mem, 0} },
148
149{"and", 2, 0x20, _, DW|Modrm, { Reg, Reg|Mem, 0} },
150{"and", 2, 0x83, 4, Modrm, { Imm8S, WordReg|WordMem, 0} },
151{"and", 2, 0x24, _, W|NoModrm, { Imm, Acc, 0} },
152{"and", 2, 0x80, 4, W|Modrm, { Imm, Reg|Mem, 0} },
153
154{"or", 2, 0x08, _, DW|Modrm, { Reg, Reg|Mem, 0} },
155{"or", 2, 0x83, 1, Modrm, { Imm8S, WordReg|WordMem, 0} },
156{"or", 2, 0x0c, _, W|NoModrm, { Imm, Acc, 0} },
157{"or", 2, 0x80, 1, W|Modrm, { Imm, Reg|Mem, 0} },
158
159{"xor", 2, 0x30, _, DW|Modrm, { Reg, Reg|Mem, 0} },
160{"xor", 2, 0x83, 6, Modrm, { Imm8S, WordReg|WordMem, 0} },
161{"xor", 2, 0x34, _, W|NoModrm, { Imm, Acc, 0} },
162{"xor", 2, 0x80, 6, W|Modrm, { Imm, Reg|Mem, 0} },
163
c00435ed
ILT
164/* iclr with 1 operand is really xor with 2 operands. */
165{"clr", 1, 0x30, _, W|Modrm|iclrKludge, { Reg } },
166
fc0d7441
ILT
167{"adc", 2, 0x10, _, DW|Modrm, { Reg, Reg|Mem, 0} },
168{"adc", 2, 0x83, 2, Modrm, { Imm8S, WordReg|WordMem, 0} },
169{"adc", 2, 0x14, _, W|NoModrm, { Imm, Acc, 0} },
170{"adc", 2, 0x80, 2, W|Modrm, { Imm, Reg|Mem, 0} },
171
172{"neg", 1, 0xf6, 3, W|Modrm, { Reg|Mem, 0, 0} },
173{"not", 1, 0xf6, 2, W|Modrm, { Reg|Mem, 0, 0} },
174
175{"aaa", 0, 0x37, _, NoModrm, { 0, 0, 0} },
176{"aas", 0, 0x3f, _, NoModrm, { 0, 0, 0} },
177{"daa", 0, 0x27, _, NoModrm, { 0, 0, 0} },
178{"das", 0, 0x2f, _, NoModrm, { 0, 0, 0} },
179{"aad", 0, 0xd50a, _, NoModrm, { 0, 0, 0} },
180{"aam", 0, 0xd40a, _, NoModrm, { 0, 0, 0} },
ce868e5c
JG
181
182/* conversion insns */
183/* conversion: intel naming */
a43022bd
KR
184{"cbw", 0, 0x98, _, NoModrm|Data16, { 0, 0, 0} },
185{"cwd", 0, 0x99, _, NoModrm|Data16, { 0, 0, 0} },
186{"cwde", 0, 0x98, _, NoModrm|Data32, { 0, 0, 0} },
187{"cdq", 0, 0x99, _, NoModrm|Data32, { 0, 0, 0} },
ce868e5c 188/* att naming */
a43022bd
KR
189{"cbtw", 0, 0x98, _, NoModrm|Data16, { 0, 0, 0} },
190{"cwtl", 0, 0x98, _, NoModrm|Data32, { 0, 0, 0} },
191{"cwtd", 0, 0x99, _, NoModrm|Data16, { 0, 0, 0} },
192{"cltd", 0, 0x99, _, NoModrm|Data32, { 0, 0, 0} },
ce868e5c
JG
193
194/* Warning! the mul/imul (opcode 0xf6) must only have 1 operand! They are
195 expanding 64-bit multiplies, and *cannot* be selected to accomplish
196 'imul %ebx, %eax' (opcode 0x0faf must be used in this case)
a43022bd 197 These multiplies can only be selected with single operand forms. */
fc0d7441
ILT
198{"mul", 1, 0xf6, 4, W|Modrm, { Reg|Mem, 0, 0} },
199{"imul", 1, 0xf6, 5, W|Modrm, { Reg|Mem, 0, 0} },
ce868e5c
JG
200
201
202
203
204/* imulKludge here is needed to reverse the i.rm.reg & i.rm.regmem fields.
205 These instructions are exceptions: 'imul $2, %eax, %ecx' would put
206 '%eax' in the reg field and '%ecx' in the regmem field if we did not
207 switch them. */
fc0d7441
ILT
208{"imul", 2, 0x0faf, _, Modrm|ReverseRegRegmem, { WordReg|Mem, WordReg, 0} },
209{"imul", 3, 0x6b, _, Modrm|ReverseRegRegmem, { Imm8S, WordReg|Mem, WordReg} },
210{"imul", 3, 0x69, _, Modrm|ReverseRegRegmem, { Imm16|Imm32, WordReg|Mem, WordReg} },
ce868e5c
JG
211/*
212 imul with 2 operands mimicks imul with 3 by puting register both
213 in i.rm.reg & i.rm.regmem fields
214*/
fc0d7441
ILT
215{"imul", 2, 0x6b, _, Modrm|imulKludge, { Imm8S, WordReg, 0} },
216{"imul", 2, 0x69, _, Modrm|imulKludge, { Imm16|Imm32, WordReg, 0} },
217{"div", 1, 0xf6, 6, W|Modrm, { Reg|Mem, 0, 0} },
218{"div", 2, 0xf6, 6, W|Modrm, { Reg|Mem, Acc, 0} },
219{"idiv", 1, 0xf6, 7, W|Modrm, { Reg|Mem, 0, 0} },
220{"idiv", 2, 0xf6, 7, W|Modrm, { Reg|Mem, Acc, 0} },
221
222{"rol", 2, 0xd0, 0, W|Modrm, { Imm1, Reg|Mem, 0} },
223{"rol", 2, 0xc0, 0, W|Modrm, { Imm8, Reg|Mem, 0} },
224{"rol", 2, 0xd2, 0, W|Modrm, { ShiftCount, Reg|Mem, 0} },
225{"rol", 1, 0xd0, 0, W|Modrm, { Reg|Mem, 0, 0} },
226
227{"ror", 2, 0xd0, 1, W|Modrm, { Imm1, Reg|Mem, 0} },
228{"ror", 2, 0xc0, 1, W|Modrm, { Imm8, Reg|Mem, 0} },
229{"ror", 2, 0xd2, 1, W|Modrm, { ShiftCount, Reg|Mem, 0} },
230{"ror", 1, 0xd0, 1, W|Modrm, { Reg|Mem, 0, 0} },
231
232{"rcl", 2, 0xd0, 2, W|Modrm, { Imm1, Reg|Mem, 0} },
233{"rcl", 2, 0xc0, 2, W|Modrm, { Imm8, Reg|Mem, 0} },
234{"rcl", 2, 0xd2, 2, W|Modrm, { ShiftCount, Reg|Mem, 0} },
235{"rcl", 1, 0xd0, 2, W|Modrm, { Reg|Mem, 0, 0} },
236
237{"rcr", 2, 0xd0, 3, W|Modrm, { Imm1, Reg|Mem, 0} },
238{"rcr", 2, 0xc0, 3, W|Modrm, { Imm8, Reg|Mem, 0} },
239{"rcr", 2, 0xd2, 3, W|Modrm, { ShiftCount, Reg|Mem, 0} },
240{"rcr", 1, 0xd0, 3, W|Modrm, { Reg|Mem, 0, 0} },
241
242{"sal", 2, 0xd0, 4, W|Modrm, { Imm1, Reg|Mem, 0} },
243{"sal", 2, 0xc0, 4, W|Modrm, { Imm8, Reg|Mem, 0} },
244{"sal", 2, 0xd2, 4, W|Modrm, { ShiftCount, Reg|Mem, 0} },
245{"sal", 1, 0xd0, 4, W|Modrm, { Reg|Mem, 0, 0} },
246{"shl", 2, 0xd0, 4, W|Modrm, { Imm1, Reg|Mem, 0} },
247{"shl", 2, 0xc0, 4, W|Modrm, { Imm8, Reg|Mem, 0} },
248{"shl", 2, 0xd2, 4, W|Modrm, { ShiftCount, Reg|Mem, 0} },
249{"shl", 1, 0xd0, 4, W|Modrm, { Reg|Mem, 0, 0} },
250
251{"shld", 3, 0x0fa4, _, Modrm, { Imm8, WordReg, WordReg|Mem} },
252{"shld", 3, 0x0fa5, _, Modrm, { ShiftCount, WordReg, WordReg|Mem} },
253{"shld", 2, 0x0fa5, _, Modrm, { WordReg, WordReg|Mem, 0} },
254
255{"shr", 2, 0xd0, 5, W|Modrm, { Imm1, Reg|Mem, 0} },
256{"shr", 2, 0xc0, 5, W|Modrm, { Imm8, Reg|Mem, 0} },
257{"shr", 2, 0xd2, 5, W|Modrm, { ShiftCount, Reg|Mem, 0} },
258{"shr", 1, 0xd0, 5, W|Modrm, { Reg|Mem, 0, 0} },
259
260{"shrd", 3, 0x0fac, _, Modrm, { Imm8, WordReg, WordReg|Mem} },
261{"shrd", 3, 0x0fad, _, Modrm, { ShiftCount, WordReg, WordReg|Mem} },
262{"shrd", 2, 0x0fad, _, Modrm, { WordReg, WordReg|Mem, 0} },
263
264{"sar", 2, 0xd0, 7, W|Modrm, { Imm1, Reg|Mem, 0} },
265{"sar", 2, 0xc0, 7, W|Modrm, { Imm8, Reg|Mem, 0} },
266{"sar", 2, 0xd2, 7, W|Modrm, { ShiftCount, Reg|Mem, 0} },
267{"sar", 1, 0xd0, 7, W|Modrm, { Reg|Mem, 0, 0} },
ce868e5c
JG
268
269/* control transfer instructions */
270#define CALL_PC_RELATIVE 0xe8
fc0d7441 271{"call", 1, 0xe8, _, JumpDword, { Disp32, 0, 0} },
a43022bd
KR
272{"call", 1, 0xff, 2, Modrm|Data32, { Reg|Mem|JumpAbsolute, 0, 0} },
273{"callw", 1, 0xff, 2, Modrm|Data16, { Reg|Mem|JumpAbsolute, 0, 0} },
ce868e5c 274#define CALL_FAR_IMMEDIATE 0x9a
527cabaf 275{"lcall", 2, 0x9a, _, JumpInterSegment, { Imm16, Imm32, 0} },
a43022bd
KR
276{"lcall", 1, 0xff, 3, Modrm|Data32, { Mem, 0, 0} },
277{"lcallw", 1, 0xff, 3, Modrm|Data16, { Mem, 0, 0} },
ce868e5c
JG
278
279#define JUMP_PC_RELATIVE 0xeb
fc0d7441
ILT
280{"jmp", 1, 0xeb, _, Jump, { Disp, 0, 0} },
281{"jmp", 1, 0xff, 4, Modrm, { Reg32|Mem|JumpAbsolute, 0, 0} },
ce868e5c 282#define JUMP_FAR_IMMEDIATE 0xea
fc0d7441 283{"ljmp", 2, 0xea, _, JumpInterSegment, { Imm16, Imm32, 0} },
a43022bd
KR
284{"ljmp", 1, 0xff, 5, Modrm|Data32, { Mem, 0, 0} },
285
286{"ret", 0, 0xc3, _, NoModrm|Data32, { 0, 0, 0} },
287{"ret", 1, 0xc2, _, NoModrm|Data32, { Imm16, 0, 0} },
288{"retw", 0, 0xc3, _, NoModrm|Data16, { 0, 0, 0} },
289{"retw", 1, 0xc2, _, NoModrm|Data16, { Imm16, 0, 0} },
290{"lret", 0, 0xcb, _, NoModrm|Data32, { 0, 0, 0} },
291{"lret", 1, 0xca, _, NoModrm|Data32, { Imm16, 0, 0} },
292{"lretw", 0, 0xcb, _, NoModrm|Data16, { 0, 0, 0} },
293{"lretw", 1, 0xca, _, NoModrm|Data16, { Imm16, 0, 0} },
cd22144a
KR
294{"enter", 2, 0xc8, _, NoModrm|Data32, { Imm16, Imm8, 0} },
295{"leave", 0, 0xc9, _, NoModrm|Data32, { 0, 0, 0} },
296{"enterw", 2, 0xc8, _, NoModrm|Data16, { Imm16, Imm8, 0} },
297{"leavew", 0, 0xc9, _, NoModrm|Data16, { 0, 0, 0} },
ce868e5c
JG
298
299/* conditional jumps */
fc0d7441 300{"jo", 1, 0x70, _, Jump, { Disp, 0, 0} },
ce868e5c 301
fc0d7441 302{"jno", 1, 0x71, _, Jump, { Disp, 0, 0} },
ce868e5c 303
fc0d7441
ILT
304{"jb", 1, 0x72, _, Jump, { Disp, 0, 0} },
305{"jc", 1, 0x72, _, Jump, { Disp, 0, 0} },
306{"jnae", 1, 0x72, _, Jump, { Disp, 0, 0} },
ce868e5c 307
fc0d7441
ILT
308{"jnb", 1, 0x73, _, Jump, { Disp, 0, 0} },
309{"jnc", 1, 0x73, _, Jump, { Disp, 0, 0} },
310{"jae", 1, 0x73, _, Jump, { Disp, 0, 0} },
ce868e5c 311
fc0d7441
ILT
312{"je", 1, 0x74, _, Jump, { Disp, 0, 0} },
313{"jz", 1, 0x74, _, Jump, { Disp, 0, 0} },
ce868e5c 314
fc0d7441
ILT
315{"jne", 1, 0x75, _, Jump, { Disp, 0, 0} },
316{"jnz", 1, 0x75, _, Jump, { Disp, 0, 0} },
ce868e5c 317
fc0d7441
ILT
318{"jbe", 1, 0x76, _, Jump, { Disp, 0, 0} },
319{"jna", 1, 0x76, _, Jump, { Disp, 0, 0} },
ce868e5c 320
fc0d7441
ILT
321{"jnbe", 1, 0x77, _, Jump, { Disp, 0, 0} },
322{"ja", 1, 0x77, _, Jump, { Disp, 0, 0} },
ce868e5c 323
fc0d7441 324{"js", 1, 0x78, _, Jump, { Disp, 0, 0} },
ce868e5c 325
fc0d7441 326{"jns", 1, 0x79, _, Jump, { Disp, 0, 0} },
ce868e5c 327
fc0d7441
ILT
328{"jp", 1, 0x7a, _, Jump, { Disp, 0, 0} },
329{"jpe", 1, 0x7a, _, Jump, { Disp, 0, 0} },
ce868e5c 330
fc0d7441
ILT
331{"jnp", 1, 0x7b, _, Jump, { Disp, 0, 0} },
332{"jpo", 1, 0x7b, _, Jump, { Disp, 0, 0} },
ce868e5c 333
fc0d7441
ILT
334{"jl", 1, 0x7c, _, Jump, { Disp, 0, 0} },
335{"jnge", 1, 0x7c, _, Jump, { Disp, 0, 0} },
ce868e5c 336
fc0d7441
ILT
337{"jnl", 1, 0x7d, _, Jump, { Disp, 0, 0} },
338{"jge", 1, 0x7d, _, Jump, { Disp, 0, 0} },
ce868e5c 339
fc0d7441
ILT
340{"jle", 1, 0x7e, _, Jump, { Disp, 0, 0} },
341{"jng", 1, 0x7e, _, Jump, { Disp, 0, 0} },
ce868e5c 342
fc0d7441
ILT
343{"jnle", 1, 0x7f, _, Jump, { Disp, 0, 0} },
344{"jg", 1, 0x7f, _, Jump, { Disp, 0, 0} },
ce868e5c 345
a43022bd
KR
346#if 0 /* XXX where are these macros used?
347 To get them working again, they need to take
348 an entire template as the parameter,
349 and check for Data16/Data32 flags. */
ce868e5c
JG
350/* these turn into pseudo operations when disp is larger than 8 bits */
351#define IS_JUMP_ON_CX_ZERO(o) \
a43022bd 352 (o == 0x66e3)
ce868e5c
JG
353#define IS_JUMP_ON_ECX_ZERO(o) \
354 (o == 0xe3)
a43022bd 355#endif
ce868e5c 356
a43022bd
KR
357{"jcxz", 1, 0xe3, _, JumpByte|Data16, { Disp, 0, 0} },
358{"jecxz", 1, 0xe3, _, JumpByte|Data32, { Disp, 0, 0} },
ce868e5c
JG
359
360#define IS_LOOP_ECX_TIMES(o) \
361 (o == 0xe2 || o == 0xe1 || o == 0xe0)
362
fc0d7441 363{"loop", 1, 0xe2, _, JumpByte, { Disp, 0, 0} },
ce868e5c 364
fc0d7441
ILT
365{"loopz", 1, 0xe1, _, JumpByte, { Disp, 0, 0} },
366{"loope", 1, 0xe1, _, JumpByte, { Disp, 0, 0} },
ce868e5c 367
fc0d7441
ILT
368{"loopnz", 1, 0xe0, _, JumpByte, { Disp, 0, 0} },
369{"loopne", 1, 0xe0, _, JumpByte, { Disp, 0, 0} },
ce868e5c
JG
370
371/* set byte on flag instructions */
fc0d7441 372{"seto", 1, 0x0f90, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 373
fc0d7441 374{"setno", 1, 0x0f91, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 375
fc0d7441
ILT
376{"setb", 1, 0x0f92, 0, Modrm, { Reg8|Mem, 0, 0} },
377{"setc", 1, 0x0f92, 0, Modrm, { Reg8|Mem, 0, 0} },
378{"setnae", 1, 0x0f92, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 379
fc0d7441
ILT
380{"setnb", 1, 0x0f93, 0, Modrm, { Reg8|Mem, 0, 0} },
381{"setnc", 1, 0x0f93, 0, Modrm, { Reg8|Mem, 0, 0} },
382{"setae", 1, 0x0f93, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 383
fc0d7441
ILT
384{"sete", 1, 0x0f94, 0, Modrm, { Reg8|Mem, 0, 0} },
385{"setz", 1, 0x0f94, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 386
fc0d7441
ILT
387{"setne", 1, 0x0f95, 0, Modrm, { Reg8|Mem, 0, 0} },
388{"setnz", 1, 0x0f95, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 389
fc0d7441
ILT
390{"setbe", 1, 0x0f96, 0, Modrm, { Reg8|Mem, 0, 0} },
391{"setna", 1, 0x0f96, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 392
fc0d7441
ILT
393{"setnbe", 1, 0x0f97, 0, Modrm, { Reg8|Mem, 0, 0} },
394{"seta", 1, 0x0f97, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 395
fc0d7441 396{"sets", 1, 0x0f98, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 397
fc0d7441 398{"setns", 1, 0x0f99, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 399
fc0d7441
ILT
400{"setp", 1, 0x0f9a, 0, Modrm, { Reg8|Mem, 0, 0} },
401{"setpe", 1, 0x0f9a, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 402
fc0d7441
ILT
403{"setnp", 1, 0x0f9b, 0, Modrm, { Reg8|Mem, 0, 0} },
404{"setpo", 1, 0x0f9b, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 405
fc0d7441
ILT
406{"setl", 1, 0x0f9c, 0, Modrm, { Reg8|Mem, 0, 0} },
407{"setnge", 1, 0x0f9c, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 408
fc0d7441
ILT
409{"setnl", 1, 0x0f9d, 0, Modrm, { Reg8|Mem, 0, 0} },
410{"setge", 1, 0x0f9d, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 411
fc0d7441
ILT
412{"setle", 1, 0x0f9e, 0, Modrm, { Reg8|Mem, 0, 0} },
413{"setng", 1, 0x0f9e, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c 414
fc0d7441
ILT
415{"setnle", 1, 0x0f9f, 0, Modrm, { Reg8|Mem, 0, 0} },
416{"setg", 1, 0x0f9f, 0, Modrm, { Reg8|Mem, 0, 0} },
ce868e5c
JG
417
418#define IS_STRING_INSTRUCTION(o) \
419 ((o) == 0xa6 || (o) == 0x6c || (o) == 0x6e || (o) == 0x6e || \
420 (o) == 0xac || (o) == 0xa4 || (o) == 0xae || (o) == 0xaa || \
421 (o) == 0xd7)
422
423/* string manipulation */
fc0d7441
ILT
424{"cmps", 0, 0xa6, _, W|NoModrm, { 0, 0, 0} },
425{"scmp", 0, 0xa6, _, W|NoModrm, { 0, 0, 0} },
426{"ins", 0, 0x6c, _, W|NoModrm, { 0, 0, 0} },
427{"outs", 0, 0x6e, _, W|NoModrm, { 0, 0, 0} },
428{"lods", 0, 0xac, _, W|NoModrm, { 0, 0, 0} },
429{"slod", 0, 0xac, _, W|NoModrm, { 0, 0, 0} },
430{"movs", 0, 0xa4, _, W|NoModrm, { 0, 0, 0} },
431{"smov", 0, 0xa4, _, W|NoModrm, { 0, 0, 0} },
432{"scas", 0, 0xae, _, W|NoModrm, { 0, 0, 0} },
433{"ssca", 0, 0xae, _, W|NoModrm, { 0, 0, 0} },
434{"stos", 0, 0xaa, _, W|NoModrm, { 0, 0, 0} },
435{"ssto", 0, 0xaa, _, W|NoModrm, { 0, 0, 0} },
436{"xlat", 0, 0xd7, _, NoModrm, { 0, 0, 0} },
ce868e5c
JG
437
438/* bit manipulation */
fc0d7441
ILT
439{"bsf", 2, 0x0fbc, _, Modrm|ReverseRegRegmem, { Reg|Mem, Reg, 0} },
440{"bsr", 2, 0x0fbd, _, Modrm|ReverseRegRegmem, { Reg|Mem, Reg, 0} },
441{"bt", 2, 0x0fa3, _, Modrm, { Reg, Reg|Mem, 0} },
442{"bt", 2, 0x0fba, 4, Modrm, { Imm8, Reg|Mem, 0} },
443{"btc", 2, 0x0fbb, _, Modrm, { Reg, Reg|Mem, 0} },
444{"btc", 2, 0x0fba, 7, Modrm, { Imm8, Reg|Mem, 0} },
445{"btr", 2, 0x0fb3, _, Modrm, { Reg, Reg|Mem, 0} },
446{"btr", 2, 0x0fba, 6, Modrm, { Imm8, Reg|Mem, 0} },
447{"bts", 2, 0x0fab, _, Modrm, { Reg, Reg|Mem, 0} },
448{"bts", 2, 0x0fba, 5, Modrm, { Imm8, Reg|Mem, 0} },
ce868e5c
JG
449
450/* interrupts & op. sys insns */
a43022bd
KR
451/* See gas/config/tc-i386.c for conversion of 'int $3' into the special
452 int 3 insn. */
ce868e5c
JG
453#define INT_OPCODE 0xcd
454#define INT3_OPCODE 0xcc
fc0d7441
ILT
455{"int", 1, 0xcd, _, NoModrm, { Imm8, 0, 0} },
456{"int3", 0, 0xcc, _, NoModrm, { 0, 0, 0} },
457{"into", 0, 0xce, _, NoModrm, { 0, 0, 0} },
a43022bd
KR
458{"iret", 0, 0xcf, _, NoModrm|Data32, { 0, 0, 0} },
459{"iretw", 0, 0xcf, _, NoModrm|Data16, { 0, 0, 0} },
cd22144a 460/* i386sl, i486sl, later 486, and Pentium */
a43022bd 461{"rsm", 0, 0x0faa, _, NoModrm,{ 0, 0, 0} },
ce868e5c 462
a43022bd
KR
463{"boundl", 2, 0x62, _, Modrm|Data32, { Reg32, Mem, 0} },
464{"boundw", 2, 0x62, _, Modrm|Data16, { Reg16, Mem, 0} },
ce868e5c 465
fc0d7441
ILT
466{"hlt", 0, 0xf4, _, NoModrm, { 0, 0, 0} },
467{"wait", 0, 0x9b, _, NoModrm, { 0, 0, 0} },
ce868e5c 468/* nop is actually 'xchgl %eax, %eax' */
fc0d7441 469{"nop", 0, 0x90, _, NoModrm, { 0, 0, 0} },
ce868e5c
JG
470
471/* protection control */
fc0d7441
ILT
472{"arpl", 2, 0x63, _, Modrm, { Reg16, Reg16|Mem, 0} },
473{"lar", 2, 0x0f02, _, Modrm|ReverseRegRegmem, { WordReg|Mem, WordReg, 0} },
474{"lgdt", 1, 0x0f01, 2, Modrm, { Mem, 0, 0} },
475{"lidt", 1, 0x0f01, 3, Modrm, { Mem, 0, 0} },
476{"lldt", 1, 0x0f00, 2, Modrm, { WordReg|Mem, 0, 0} },
477{"lmsw", 1, 0x0f01, 6, Modrm, { WordReg|Mem, 0, 0} },
478{"lsl", 2, 0x0f03, _, Modrm|ReverseRegRegmem, { WordReg|Mem, WordReg, 0} },
479{"ltr", 1, 0x0f00, 3, Modrm, { WordReg|Mem, 0, 0} },
480
481{"sgdt", 1, 0x0f01, 0, Modrm, { Mem, 0, 0} },
482{"sidt", 1, 0x0f01, 1, Modrm, { Mem, 0, 0} },
483{"sldt", 1, 0x0f00, 0, Modrm, { WordReg|Mem, 0, 0} },
484{"smsw", 1, 0x0f01, 4, Modrm, { WordReg|Mem, 0, 0} },
485{"str", 1, 0x0f00, 1, Modrm, { Reg16|Mem, 0, 0} },
486
487{"verr", 1, 0x0f00, 4, Modrm, { WordReg|Mem, 0, 0} },
488{"verw", 1, 0x0f00, 5, Modrm, { WordReg|Mem, 0, 0} },
ce868e5c
JG
489
490/* floating point instructions */
491
492/* load */
fc0d7441
ILT
493{"fld", 1, 0xd9c0, _, ShortForm, { FloatReg, 0, 0} }, /* register */
494{"flds", 1, 0xd9, 0, Modrm, { Mem, 0, 0} }, /* %st0 <-- mem float */
495{"fldl", 1, 0xdd, 0, Modrm, { Mem, 0, 0} }, /* %st0 <-- mem double */
496{"fldl", 1, 0xd9c0, _, ShortForm, { FloatReg, 0, 0} }, /* register */
497{"fild", 1, 0xdf, 0, Modrm, { Mem, 0, 0} }, /* %st0 <-- mem word (16) */
498{"fildl", 1, 0xdb, 0, Modrm, { Mem, 0, 0} }, /* %st0 <-- mem dword (32) */
499{"fildq",1, 0xdf, 5, Modrm, { Mem, 0, 0} }, /* %st0 <-- mem qword (64) */
500{"fildll",1, 0xdf, 5, Modrm, { Mem, 0, 0} }, /* %st0 <-- mem qword (64) */
501{"fldt", 1, 0xdb, 5, Modrm, { Mem, 0, 0} }, /* %st0 <-- mem efloat */
502{"fbld", 1, 0xdf, 4, Modrm, { Mem, 0, 0} }, /* %st0 <-- mem bcd */
ce868e5c
JG
503
504/* store (no pop) */
fc0d7441
ILT
505{"fst", 1, 0xddd0, _, ShortForm, { FloatReg, 0, 0} }, /* register */
506{"fsts", 1, 0xd9, 2, Modrm, { Mem, 0, 0} }, /* %st0 --> mem float */
507{"fstl", 1, 0xdd, 2, Modrm, { Mem, 0, 0} }, /* %st0 --> mem double */
508{"fstl", 1, 0xddd0, _, ShortForm, { FloatReg, 0, 0} }, /* register */
509{"fist", 1, 0xdf, 2, Modrm, { Mem, 0, 0} }, /* %st0 --> mem word (16) */
510{"fistl", 1, 0xdb, 2, Modrm, { Mem, 0, 0} }, /* %st0 --> mem dword (32) */
ce868e5c
JG
511
512/* store (with pop) */
fc0d7441
ILT
513{"fstp", 1, 0xddd8, _, ShortForm, { FloatReg, 0, 0} }, /* register */
514{"fstps", 1, 0xd9, 3, Modrm, { Mem, 0, 0} }, /* %st0 --> mem float */
515{"fstpl", 1, 0xdd, 3, Modrm, { Mem, 0, 0} }, /* %st0 --> mem double */
516{"fstpl", 1, 0xddd8, _, ShortForm, { FloatReg, 0, 0} }, /* register */
517{"fistp", 1, 0xdf, 3, Modrm, { Mem, 0, 0} }, /* %st0 --> mem word (16) */
518{"fistpl",1, 0xdb, 3, Modrm, { Mem, 0, 0} }, /* %st0 --> mem dword (32) */
519{"fistpq",1, 0xdf, 7, Modrm, { Mem, 0, 0} }, /* %st0 --> mem qword (64) */
520{"fistpll",1,0xdf, 7, Modrm, { Mem, 0, 0} }, /* %st0 --> mem qword (64) */
521{"fstpt", 1, 0xdb, 7, Modrm, { Mem, 0, 0} }, /* %st0 --> mem efloat */
522{"fbstp", 1, 0xdf, 6, Modrm, { Mem, 0, 0} }, /* %st0 --> mem bcd */
ce868e5c
JG
523
524/* exchange %st<n> with %st0 */
fc0d7441 525{"fxch", 1, 0xd9c8, _, ShortForm, { FloatReg, 0, 0} },
a43022bd 526{"fxch", 0, 0xd9c9, _, NoModrm, { 0, 0, 0} }, /* alias for fxch %st, %st(1) */
ce868e5c
JG
527
528/* comparison (without pop) */
fc0d7441
ILT
529{"fcom", 1, 0xd8d0, _, ShortForm, { FloatReg, 0, 0} },
530{"fcoms", 1, 0xd8, 2, Modrm, { Mem, 0, 0} }, /* compare %st0, mem float */
c0d7b534 531{"ficoml", 1, 0xda, 2, Modrm, { Mem, 0, 0} }, /* compare %st0, mem word */
fc0d7441
ILT
532{"fcoml", 1, 0xdc, 2, Modrm, { Mem, 0, 0} }, /* compare %st0, mem double */
533{"fcoml", 1, 0xd8d0, _, ShortForm, { FloatReg, 0, 0} },
534{"ficoms", 1, 0xde, 2, Modrm, { Mem, 0, 0} }, /* compare %st0, mem dword */
ce868e5c
JG
535
536/* comparison (with pop) */
fc0d7441
ILT
537{"fcomp", 1, 0xd8d8, _, ShortForm, { FloatReg, 0, 0} },
538{"fcomps", 1, 0xd8, 3, Modrm, { Mem, 0, 0} }, /* compare %st0, mem float */
c0d7b534 539{"ficompl", 1, 0xda, 3, Modrm, { Mem, 0, 0} }, /* compare %st0, mem word */
fc0d7441
ILT
540{"fcompl", 1, 0xdc, 3, Modrm, { Mem, 0, 0} }, /* compare %st0, mem double */
541{"fcompl", 1, 0xd8d8, _, ShortForm, { FloatReg, 0, 0} },
542{"ficomps", 1, 0xde, 3, Modrm, { Mem, 0, 0} }, /* compare %st0, mem dword */
543{"fcompp", 0, 0xded9, _, NoModrm, { 0, 0, 0} }, /* compare %st0, %st1 & pop 2 */
ce868e5c
JG
544
545/* unordered comparison (with pop) */
fc0d7441
ILT
546{"fucom", 1, 0xdde0, _, ShortForm, { FloatReg, 0, 0} },
547{"fucomp", 1, 0xdde8, _, ShortForm, { FloatReg, 0, 0} },
548{"fucompp", 0, 0xdae9, _, NoModrm, { 0, 0, 0} }, /* ucompare %st0, %st1 & pop twice */
ce868e5c 549
fc0d7441
ILT
550{"ftst", 0, 0xd9e4, _, NoModrm, { 0, 0, 0} }, /* test %st0 */
551{"fxam", 0, 0xd9e5, _, NoModrm, { 0, 0, 0} }, /* examine %st0 */
ce868e5c
JG
552
553/* load constants into %st0 */
fc0d7441
ILT
554{"fld1", 0, 0xd9e8, _, NoModrm, { 0, 0, 0} }, /* %st0 <-- 1.0 */
555{"fldl2t", 0, 0xd9e9, _, NoModrm, { 0, 0, 0} }, /* %st0 <-- log2(10) */
556{"fldl2e", 0, 0xd9ea, _, NoModrm, { 0, 0, 0} }, /* %st0 <-- log2(e) */
557{"fldpi", 0, 0xd9eb, _, NoModrm, { 0, 0, 0} }, /* %st0 <-- pi */
558{"fldlg2", 0, 0xd9ec, _, NoModrm, { 0, 0, 0} }, /* %st0 <-- log10(2) */
559{"fldln2", 0, 0xd9ed, _, NoModrm, { 0, 0, 0} }, /* %st0 <-- ln(2) */
560{"fldz", 0, 0xd9ee, _, NoModrm, { 0, 0, 0} }, /* %st0 <-- 0.0 */
ce868e5c
JG
561
562/* arithmetic */
563
564/* add */
fc0d7441
ILT
565{"fadd", 1, 0xd8c0, _, ShortForm, { FloatReg, 0, 0} },
566{"fadd", 2, 0xd8c0, _, ShortForm|FloatD, { FloatReg, FloatAcc, 0} },
567{"fadd", 0, 0xdcc1, _, NoModrm, { 0, 0, 0} }, /* alias for fadd %st, %st(1) */
527cabaf
ILT
568{"faddp", 1, 0xdec0, _, ShortForm, { FloatReg, 0, 0} },
569{"faddp", 2, 0xdec0, _, ShortForm, { FloatReg, FloatAcc, 0} },
570{"faddp", 2, 0xdec0, _, ShortForm, { FloatAcc, FloatReg, 0} },
fc0d7441
ILT
571{"faddp", 0, 0xdec1, _, NoModrm, { 0, 0, 0} }, /* alias for faddp %st, %st(1) */
572{"fadds", 1, 0xd8, 0, Modrm, { Mem, 0, 0} },
573{"fiaddl", 1, 0xda, 0, Modrm, { Mem, 0, 0} },
574{"faddl", 1, 0xdc, 0, Modrm, { Mem, 0, 0} },
575{"fiadds", 1, 0xde, 0, Modrm, { Mem, 0, 0} },
ce868e5c
JG
576
577/* sub */
578/* Note: intel has decided that certain of these operations are reversed
579 in assembler syntax. */
fc0d7441
ILT
580{"fsub", 1, 0xd8e0, _, ShortForm, { FloatReg, 0, 0} },
581{"fsub", 2, 0xd8e0, _, ShortForm, { FloatReg, FloatAcc, 0} },
ce868e5c 582#ifdef NON_BROKEN_OPCODES
fc0d7441 583{"fsub", 2, 0xdce8, _, ShortForm, { FloatAcc, FloatReg, 0} },
ce868e5c 584#else
fc0d7441 585{"fsub", 2, 0xdce0, _, ShortForm, { FloatAcc, FloatReg, 0} },
ce868e5c 586#endif
fc0d7441 587{"fsub", 0, 0xdce1, _, NoModrm, { 0, 0, 0} },
c00435ed
ILT
588{"fsubp", 1, 0xdee8, _, ShortForm, { FloatReg, 0, 0} },
589{"fsubp", 2, 0xdee8, _, ShortForm, { FloatReg, FloatAcc, 0} },
ce868e5c 590#ifdef NON_BROKEN_OPCODES
fc0d7441 591{"fsubp", 2, 0xdee8, _, ShortForm, { FloatAcc, FloatReg, 0} },
654b0845 592{"fsubp", 0, 0xdee9, _, NoModrm, { 0, 0, 0} },
ce868e5c 593#else
c0d7b534 594{"fsubp", 2, 0xdee0, _, ShortForm, { FloatAcc, FloatReg, 0} },
654b0845 595{"fsubp", 0, 0xdee1, _, NoModrm, { 0, 0, 0} },
ce868e5c 596#endif
fc0d7441
ILT
597{"fsubs", 1, 0xd8, 4, Modrm, { Mem, 0, 0} },
598{"fisubl", 1, 0xda, 4, Modrm, { Mem, 0, 0} },
599{"fsubl", 1, 0xdc, 4, Modrm, { Mem, 0, 0} },
600{"fisubs", 1, 0xde, 4, Modrm, { Mem, 0, 0} },
ce868e5c
JG
601
602/* sub reverse */
fc0d7441
ILT
603{"fsubr", 1, 0xd8e8, _, ShortForm, { FloatReg, 0, 0} },
604{"fsubr", 2, 0xd8e8, _, ShortForm, { FloatReg, FloatAcc, 0} },
ce868e5c 605#ifdef NON_BROKEN_OPCODES
fc0d7441 606{"fsubr", 2, 0xdce0, _, ShortForm, { FloatAcc, FloatReg, 0} },
ce868e5c 607#else
fc0d7441 608{"fsubr", 2, 0xdce8, _, ShortForm, { FloatAcc, FloatReg, 0} },
ce868e5c 609#endif
fc0d7441 610{"fsubr", 0, 0xdce9, _, NoModrm, { 0, 0, 0} },
c00435ed
ILT
611{"fsubrp", 1, 0xdee0, _, ShortForm, { FloatReg, 0, 0} },
612{"fsubrp", 2, 0xdee0, _, ShortForm, { FloatReg, FloatAcc, 0} },
ce868e5c 613#ifdef NON_BROKEN_OPCODES
fc0d7441 614{"fsubrp", 2, 0xdee0, _, ShortForm, { FloatAcc, FloatReg, 0} },
654b0845 615{"fsubrp", 0, 0xdee1, _, NoModrm, { 0, 0, 0} },
ce868e5c 616#else
c0d7b534 617{"fsubrp", 2, 0xdee8, _, ShortForm, { FloatAcc, FloatReg, 0} },
654b0845 618{"fsubrp", 0, 0xdee9, _, NoModrm, { 0, 0, 0} },
ce868e5c 619#endif
fc0d7441
ILT
620{"fsubrs", 1, 0xd8, 5, Modrm, { Mem, 0, 0} },
621{"fisubrl", 1, 0xda, 5, Modrm, { Mem, 0, 0} },
622{"fsubrl", 1, 0xdc, 5, Modrm, { Mem, 0, 0} },
623{"fisubrs", 1, 0xde, 5, Modrm, { Mem, 0, 0} },
ce868e5c
JG
624
625/* mul */
fc0d7441
ILT
626{"fmul", 1, 0xd8c8, _, ShortForm, { FloatReg, 0, 0} },
627{"fmul", 2, 0xd8c8, _, ShortForm|FloatD, { FloatReg, FloatAcc, 0} },
628{"fmul", 0, 0xdcc9, _, NoModrm, { 0, 0, 0} },
527cabaf
ILT
629{"fmulp", 1, 0xdec8, _, ShortForm, { FloatReg, 0, 0} },
630{"fmulp", 2, 0xdec8, _, ShortForm, { FloatReg, FloatAcc, 0} },
631{"fmulp", 2, 0xdec8, _, ShortForm, { FloatAcc, FloatReg, 0} },
fc0d7441
ILT
632{"fmulp", 0, 0xdec9, _, NoModrm, { 0, 0, 0} },
633{"fmuls", 1, 0xd8, 1, Modrm, { Mem, 0, 0} },
634{"fimull", 1, 0xda, 1, Modrm, { Mem, 0, 0} },
635{"fmull", 1, 0xdc, 1, Modrm, { Mem, 0, 0} },
636{"fimuls", 1, 0xde, 1, Modrm, { Mem, 0, 0} },
ce868e5c
JG
637
638/* div */
639/* Note: intel has decided that certain of these operations are reversed
640 in assembler syntax. */
fc0d7441
ILT
641{"fdiv", 1, 0xd8f0, _, ShortForm, { FloatReg, 0, 0} },
642{"fdiv", 2, 0xd8f0, _, ShortForm, { FloatReg, FloatAcc, 0} },
ce868e5c 643#ifdef NON_BROKEN_OPCODES
fc0d7441 644{"fdiv", 2, 0xdcf8, _, ShortForm, { FloatAcc, FloatReg, 0} },
ce868e5c 645#else
fc0d7441 646{"fdiv", 2, 0xdcf0, _, ShortForm, { FloatAcc, FloatReg, 0} },
ce868e5c 647#endif
fc0d7441 648{"fdiv", 0, 0xdcf1, _, NoModrm, { 0, 0, 0} },
c00435ed
ILT
649{"fdivp", 1, 0xdef8, _, ShortForm, { FloatReg, 0, 0} },
650{"fdivp", 2, 0xdef8, _, ShortForm, { FloatReg, FloatAcc, 0} },
ce868e5c 651#ifdef NON_BROKEN_OPCODES
fc0d7441 652{"fdivp", 2, 0xdef8, _, ShortForm, { FloatAcc, FloatReg, 0} },
654b0845 653{"fdivp", 0, 0xdef9, _, NoModrm, { 0, 0, 0} },
ce868e5c 654#else
c0d7b534 655{"fdivp", 2, 0xdef0, _, ShortForm, { FloatAcc, FloatReg, 0} },
654b0845 656{"fdivp", 0, 0xdef1, _, NoModrm, { 0, 0, 0} },
ce868e5c 657#endif
fc0d7441
ILT
658{"fdivs", 1, 0xd8, 6, Modrm, { Mem, 0, 0} },
659{"fidivl", 1, 0xda, 6, Modrm, { Mem, 0, 0} },
660{"fdivl", 1, 0xdc, 6, Modrm, { Mem, 0, 0} },
661{"fidivs", 1, 0xde, 6, Modrm, { Mem, 0, 0} },
ce868e5c
JG
662
663/* div reverse */
fc0d7441
ILT
664{"fdivr", 1, 0xd8f8, _, ShortForm, { FloatReg, 0, 0} },
665{"fdivr", 2, 0xd8f8, _, ShortForm, { FloatReg, FloatAcc, 0} },
ce868e5c 666#ifdef NON_BROKEN_OPCODES
fc0d7441 667{"fdivr", 2, 0xdcf0, _, ShortForm, { FloatAcc, FloatReg, 0} },
ce868e5c 668#else
fc0d7441 669{"fdivr", 2, 0xdcf8, _, ShortForm, { FloatAcc, FloatReg, 0} },
ce868e5c 670#endif
fc0d7441 671{"fdivr", 0, 0xdcf9, _, NoModrm, { 0, 0, 0} },
c00435ed
ILT
672{"fdivrp", 1, 0xdef0, _, ShortForm, { FloatReg, 0, 0} },
673{"fdivrp", 2, 0xdef0, _, ShortForm, { FloatReg, FloatAcc, 0} },
ce868e5c 674#ifdef NON_BROKEN_OPCODES
fc0d7441 675{"fdivrp", 2, 0xdef0, _, ShortForm, { FloatAcc, FloatReg, 0} },
654b0845 676{"fdivrp", 0, 0xdef1, _, NoModrm, { 0, 0, 0} },
ce868e5c 677#else
c0d7b534 678{"fdivrp", 2, 0xdef8, _, ShortForm, { FloatAcc, FloatReg, 0} },
654b0845 679{"fdivrp", 0, 0xdef9, _, NoModrm, { 0, 0, 0} },
ce868e5c 680#endif
fc0d7441
ILT
681{"fdivrs", 1, 0xd8, 7, Modrm, { Mem, 0, 0} },
682{"fidivrl", 1, 0xda, 7, Modrm, { Mem, 0, 0} },
683{"fdivrl", 1, 0xdc, 7, Modrm, { Mem, 0, 0} },
684{"fidivrs", 1, 0xde, 7, Modrm, { Mem, 0, 0} },
685
686{"f2xm1", 0, 0xd9f0, _, NoModrm, { 0, 0, 0} },
687{"fyl2x", 0, 0xd9f1, _, NoModrm, { 0, 0, 0} },
688{"fptan", 0, 0xd9f2, _, NoModrm, { 0, 0, 0} },
689{"fpatan", 0, 0xd9f3, _, NoModrm, { 0, 0, 0} },
690{"fxtract", 0, 0xd9f4, _, NoModrm, { 0, 0, 0} },
691{"fprem1", 0, 0xd9f5, _, NoModrm, { 0, 0, 0} },
692{"fdecstp", 0, 0xd9f6, _, NoModrm, { 0, 0, 0} },
693{"fincstp", 0, 0xd9f7, _, NoModrm, { 0, 0, 0} },
694{"fprem", 0, 0xd9f8, _, NoModrm, { 0, 0, 0} },
695{"fyl2xp1", 0, 0xd9f9, _, NoModrm, { 0, 0, 0} },
696{"fsqrt", 0, 0xd9fa, _, NoModrm, { 0, 0, 0} },
697{"fsincos", 0, 0xd9fb, _, NoModrm, { 0, 0, 0} },
698{"frndint", 0, 0xd9fc, _, NoModrm, { 0, 0, 0} },
699{"fscale", 0, 0xd9fd, _, NoModrm, { 0, 0, 0} },
700{"fsin", 0, 0xd9fe, _, NoModrm, { 0, 0, 0} },
701{"fcos", 0, 0xd9ff, _, NoModrm, { 0, 0, 0} },
702
703{"fchs", 0, 0xd9e0, _, NoModrm, { 0, 0, 0} },
704{"fabs", 0, 0xd9e1, _, NoModrm, { 0, 0, 0} },
ce868e5c
JG
705
706/* processor control */
fc0d7441 707{"fninit", 0, 0xdbe3, _, NoModrm, { 0, 0, 0} },
527cabaf 708{"finit", 0, 0x9bdbe3, _, NoModrm, { 0, 0, 0} },
fc0d7441
ILT
709{"fldcw", 1, 0xd9, 5, Modrm, { Mem, 0, 0} },
710{"fnstcw", 1, 0xd9, 7, Modrm, { Mem, 0, 0} },
527cabaf 711{"fstcw", 1, 0x9bd9, 7, Modrm, { Mem, 0, 0} },
fc0d7441
ILT
712{"fnstsw", 1, 0xdfe0, _, NoModrm, { Acc, 0, 0} },
713{"fnstsw", 1, 0xdd, 7, Modrm, { Mem, 0, 0} },
714{"fnstsw", 0, 0xdfe0, _, NoModrm, { 0, 0, 0} },
527cabaf
ILT
715{"fstsw", 1, 0x9bdfe0, _, NoModrm, { Acc, 0, 0} },
716{"fstsw", 1, 0x9bdd, 7, Modrm, { Mem, 0, 0} },
717{"fstsw", 0, 0x9bdfe0, _, NoModrm, { 0, 0, 0} },
fc0d7441 718{"fnclex", 0, 0xdbe2, _, NoModrm, { 0, 0, 0} },
527cabaf 719{"fclex", 0, 0x9bdbe2, _, NoModrm, { 0, 0, 0} },
ce868e5c
JG
720/*
721 We ignore the short format (287) versions of fstenv/fldenv & fsave/frstor
722 instructions; i'm not sure how to add them or how they are different.
723 My 386/387 book offers no details about this.
724*/
fc0d7441 725{"fnstenv", 1, 0xd9, 6, Modrm, { Mem, 0, 0} },
527cabaf 726{"fstenv", 1, 0x9bd9, 6, Modrm, { Mem, 0, 0} },
fc0d7441
ILT
727{"fldenv", 1, 0xd9, 4, Modrm, { Mem, 0, 0} },
728{"fnsave", 1, 0xdd, 6, Modrm, { Mem, 0, 0} },
527cabaf 729{"fsave", 1, 0x9bdd, 6, Modrm, { Mem, 0, 0} },
fc0d7441 730{"frstor", 1, 0xdd, 4, Modrm, { Mem, 0, 0} },
ce868e5c 731
fc0d7441 732{"ffree", 1, 0xddc0, _, ShortForm, { FloatReg, 0, 0} },
527cabaf
ILT
733/* P6:free st(i), pop st */
734{"ffreep", 1, 0xdfc0, _, ShortForm, { FloatReg, 0, 0} },
fc0d7441
ILT
735{"fnop", 0, 0xd9d0, _, NoModrm, { 0, 0, 0} },
736{"fwait", 0, 0x9b, _, NoModrm, { 0, 0, 0} },
ce868e5c
JG
737
738/*
739 opcode prefixes; we allow them as seperate insns too
740 (see prefix table below)
741*/
fc0d7441
ILT
742{"aword", 0, 0x67, _, NoModrm, { 0, 0, 0} },
743{"addr16", 0, 0x67, _, NoModrm, { 0, 0, 0} },
744{"word", 0, 0x66, _, NoModrm, { 0, 0, 0} },
745{"data16", 0, 0x66, _, NoModrm, { 0, 0, 0} },
746{"lock", 0, 0xf0, _, NoModrm, { 0, 0, 0} },
747{"cs", 0, 0x2e, _, NoModrm, { 0, 0, 0} },
748{"ds", 0, 0x3e, _, NoModrm, { 0, 0, 0} },
749{"es", 0, 0x26, _, NoModrm, { 0, 0, 0} },
750{"fs", 0, 0x64, _, NoModrm, { 0, 0, 0} },
751{"gs", 0, 0x65, _, NoModrm, { 0, 0, 0} },
752{"ss", 0, 0x36, _, NoModrm, { 0, 0, 0} },
753{"rep", 0, 0xf3, _, NoModrm, { 0, 0, 0} },
754{"repe", 0, 0xf3, _, NoModrm, { 0, 0, 0} },
755{"repz", 0, 0xf3, _, NoModrm, { 0, 0, 0} },
756{"repne", 0, 0xf2, _, NoModrm, { 0, 0, 0} },
757{"repnz", 0, 0xf2, _, NoModrm, { 0, 0, 0} },
758
759/* 486 extensions */
760
761{"bswap", 1, 0x0fc8, _, ShortForm, { Reg32,0,0 } },
527cabaf
ILT
762{"xadd", 2, 0x0fc0, _, W|Modrm, { Reg, Reg|Mem, 0 } },
763{"cmpxchg", 2, 0x0fb0, _, W|Modrm, { Reg, Reg|Mem, 0 } },
fc0d7441
ILT
764{"invd", 0, 0x0f08, _, NoModrm, { 0, 0, 0} },
765{"wbinvd", 0, 0x0f09, _, NoModrm, { 0, 0, 0} },
766{"invlpg", 1, 0x0f01, 7, Modrm, { Mem, 0, 0} },
767
cd22144a
KR
768/* 586 and late 486 extensions */
769{"cpuid", 0, 0x0fa2, _, NoModrm, { 0, 0, 0} },
770
771/* Pentium extensions */
772{"wrmsr", 0, 0x0f30, _, NoModrm, { 0, 0, 0} },
773{"rdtsc", 0, 0x0f31, _, NoModrm, { 0, 0, 0} },
774{"rdmsr", 0, 0x0f32, _, NoModrm, { 0, 0, 0} },
527cabaf
ILT
775{"cmpxchg8b", 1, 0x0fc7, 1, Modrm, { Mem, 0, 0} },
776
777/* Pentium Pro extensions */
778{"rdpmc", 0, 0x0f33, _, NoModrm, { 0, 0, 0} },
779
654b0845
ILT
780{"cmovo", 2, 0x0f40, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
781{"cmovno", 2, 0x0f41, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
782{"cmovb", 2, 0x0f42, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
783{"cmovae", 2, 0x0f43, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
784{"cmove", 2, 0x0f44, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
785{"cmovne", 2, 0x0f45, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
786{"cmovbe", 2, 0x0f46, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
787{"cmova", 2, 0x0f47, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
788{"cmovs", 2, 0x0f48, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
789{"cmovns", 2, 0x0f49, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
790{"cmovp", 2, 0x0f4a, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
791{"cmovnp", 2, 0x0f4b, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
792{"cmovl", 2, 0x0f4c, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
793{"cmovge", 2, 0x0f4d, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
794{"cmovle", 2, 0x0f4e, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
795{"cmovg", 2, 0x0f4f, _, Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} },
527cabaf
ILT
796
797{"fcmovb", 2, 0xdac0, _, ShortForm, { FloatReg, FloatAcc, 0} },
798{"fcmove", 2, 0xdac8, _, ShortForm, { FloatReg, FloatAcc, 0} },
799{"fcmovbe",2, 0xdad0, _, ShortForm, { FloatReg, FloatAcc, 0} },
800{"fcmovu", 2, 0xdad8, _, ShortForm, { FloatReg, FloatAcc, 0} },
801{"fcmovnb", 2, 0xdbc0, _, ShortForm, { FloatReg, FloatAcc, 0} },
802{"fcmovne", 2, 0xdbc8, _, ShortForm, { FloatReg, FloatAcc, 0} },
803{"fcmovnbe",2, 0xdbd0, _, ShortForm, { FloatReg, FloatAcc, 0} },
804{"fcmovnu", 2, 0xdbd8, _, ShortForm, { FloatReg, FloatAcc, 0} },
805
806{"fcomi", 2, 0xdbf0, _, ShortForm, { FloatReg, FloatAcc, 0} },
807{"fucomi", 2, 0xdbe8, _, ShortForm, { FloatReg, FloatAcc, 0} },
808{"fcomip", 2, 0xdff0, _, ShortForm, { FloatReg, FloatAcc, 0} },
809{"fucomip",2, 0xdfe8, _, ShortForm, { FloatReg, FloatAcc, 0} },
cd22144a 810
3abaf930
ILT
811/* MMX instructions. */
812
813{"emms", 0, 0x0f77, _, NoModrm, { 0, 0, 0 } },
814{"movd", 2, 0x0f6e, _, Modrm, { WordReg|WordMem, RegMMX, 0 } },
815{"movd", 2, 0x0f7e, _, Modrm, { RegMMX, WordReg|WordMem, 0 } },
816{"movq", 2, 0x0f6f, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
817{"movq", 2, 0x0f7f, _, Modrm, { RegMMX, RegMMX|WordMem, 0 } },
818{"packssdw", 2, 0x0f6b, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
819{"packsswb", 2, 0x0f63, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
820{"packuswb", 2, 0x0f67, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
821{"paddb", 2, 0x0ffc, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
822{"paddw", 2, 0x0ffd, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
823{"paddd", 2, 0x0ffe, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
824{"paddsb", 2, 0x0fec, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
825{"paddsw", 2, 0x0fed, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
826{"paddusb", 2, 0x0fdc, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
827{"paddusw", 2, 0x0fdd, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
828{"pand", 2, 0x0fda, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
829{"pandn", 2, 0x0fdf, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
830{"pcmpeqb", 2, 0x0f74, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
831{"pcmpeqw", 2, 0x0f75, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
832{"pcmpeqd", 2, 0x0f76, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
833{"pcmpgtb", 2, 0x0f64, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
834{"pcmpgtw", 2, 0x0f65, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
835{"pcmpgtd", 2, 0x0f66, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
836{"pmaddwd", 2, 0x0ff5, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
837{"pmulhw", 2, 0x0fe5, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
838{"pmullw", 2, 0x0fd5, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
839{"por", 2, 0x0feb, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
840{"psllw", 2, 0x0ff1, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
841{"psllw", 2, 0x0f71, 6, Modrm, { Imm8, RegMMX, 0 } },
842{"pslld", 2, 0x0ff2, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
843{"pslld", 2, 0x0f72, 6, Modrm, { Imm8, RegMMX, 0 } },
844{"psllq", 2, 0x0ff3, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
845{"psllq", 2, 0x0f73, 6, Modrm, { Imm8, RegMMX, 0 } },
846{"psraw", 2, 0x0fe1, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
847{"psraw", 2, 0x0f71, 4, Modrm, { Imm8, RegMMX, 0 } },
848{"psrad", 2, 0x0fe2, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
849{"psrad", 2, 0x0f72, 4, Modrm, { Imm8, RegMMX, 0 } },
850{"psrlw", 2, 0x0fd1, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
851{"psrlw", 2, 0x0f71, 2, Modrm, { Imm8, RegMMX, 0 } },
852{"psrld", 2, 0x0fd2, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
853{"psrld", 2, 0x0f72, 2, Modrm, { Imm8, RegMMX, 0 } },
854{"psrlq", 2, 0x0fd3, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
855{"psrlq", 2, 0x0f73, 2, Modrm, { Imm8, RegMMX, 0 } },
856{"psubb", 2, 0x0ff8, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
857{"psubw", 2, 0x0ff9, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
858{"psubd", 2, 0x0ffa, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
859{"psubsb", 2, 0x0fe8, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
860{"psubsw", 2, 0x0fe9, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
861{"psubusb", 2, 0x0fd8, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
862{"psubusw", 2, 0x0fd9, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
863{"punpckhbw", 2, 0x0f68, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
864{"punpckhwd", 2, 0x0f69, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
865{"punpckhdq", 2, 0x0f6a, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
866{"punpcklbw", 2, 0x0f60, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
867{"punpcklwd", 2, 0x0f61, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
868{"punpckldq", 2, 0x0f62, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
869{"pxor", 2, 0x0fef, _, Modrm, { RegMMX|WordMem, RegMMX, 0 } },
870
a43022bd 871{"", 0, 0, 0, 0, { 0, 0, 0} } /* sentinel */
ce868e5c
JG
872};
873#undef _
874
fc0d7441 875static const template *const i386_optab_end
ce868e5c
JG
876 = i386_optab + sizeof (i386_optab)/sizeof(i386_optab[0]);
877
878/* 386 register table */
879
880static const reg_entry i386_regtab[] = {
881 /* 8 bit regs */
882 {"al", Reg8|Acc, 0}, {"cl", Reg8|ShiftCount, 1}, {"dl", Reg8, 2},
883 {"bl", Reg8, 3},
884 {"ah", Reg8, 4}, {"ch", Reg8, 5}, {"dh", Reg8, 6}, {"bh", Reg8, 7},
885 /* 16 bit regs */
886 {"ax", Reg16|Acc, 0}, {"cx", Reg16, 1}, {"dx", Reg16|InOutPortReg, 2}, {"bx", Reg16, 3},
887 {"sp", Reg16, 4}, {"bp", Reg16, 5}, {"si", Reg16, 6}, {"di", Reg16, 7},
888 /* 32 bit regs */
889 {"eax", Reg32|Acc, 0}, {"ecx", Reg32, 1}, {"edx", Reg32, 2}, {"ebx", Reg32, 3},
890 {"esp", Reg32, 4}, {"ebp", Reg32, 5}, {"esi", Reg32, 6}, {"edi", Reg32, 7},
891 /* segment registers */
892 {"es", SReg2, 0}, {"cs", SReg2, 1}, {"ss", SReg2, 2},
893 {"ds", SReg2, 3}, {"fs", SReg3, 4}, {"gs", SReg3, 5},
894 /* control registers */
895 {"cr0", Control, 0}, {"cr2", Control, 2}, {"cr3", Control, 3},
cd22144a 896 {"cr4", Control, 4},
ce868e5c
JG
897 /* debug registers */
898 {"db0", Debug, 0}, {"db1", Debug, 1}, {"db2", Debug, 2},
899 {"db3", Debug, 3}, {"db6", Debug, 6}, {"db7", Debug, 7},
cd22144a
KR
900 {"dr0", Debug, 0}, {"dr1", Debug, 1}, {"dr2", Debug, 2},
901 {"dr3", Debug, 3}, {"dr6", Debug, 6}, {"dr7", Debug, 7},
ce868e5c 902 /* test registers */
527cabaf 903 {"tr3", Test, 3}, {"tr4", Test, 4}, {"tr5", Test, 5},
ce868e5c
JG
904 {"tr6", Test, 6}, {"tr7", Test, 7},
905 /* float registers */
906 {"st(0)", FloatReg|FloatAcc, 0},
907 {"st", FloatReg|FloatAcc, 0},
c0d7b534
ILT
908 {"st(1)", FloatReg, 1}, {"st(2)", FloatReg, 2},
909 {"st(3)", FloatReg, 3}, {"st(4)", FloatReg, 4}, {"st(5)", FloatReg, 5},
3abaf930
ILT
910 {"st(6)", FloatReg, 6}, {"st(7)", FloatReg, 7},
911 {"mm0", RegMMX, 0}, {"mm1", RegMMX, 1}, {"mm2", RegMMX, 2},
912 {"mm3", RegMMX, 3}, {"mm4", RegMMX, 4}, {"mm5", RegMMX, 5},
913 {"mm6", RegMMX, 6}, {"mm7", RegMMX, 7}
ce868e5c
JG
914};
915
916#define MAX_REG_NAME_SIZE 8 /* for parsing register names from input */
917
fc0d7441 918static const reg_entry *const i386_regtab_end
ce868e5c
JG
919 = i386_regtab + sizeof(i386_regtab)/sizeof(i386_regtab[0]);
920
921/* segment stuff */
922static const seg_entry cs = { "cs", 0x2e };
923static const seg_entry ds = { "ds", 0x3e };
924static const seg_entry ss = { "ss", 0x36 };
925static const seg_entry es = { "es", 0x26 };
926static const seg_entry fs = { "fs", 0x64 };
927static const seg_entry gs = { "gs", 0x65 };
928static const seg_entry null = { "", 0x0 };
929
930/*
931 This table is used to store the default segment register implied by all
932 possible memory addressing modes.
933 It is indexed by the mode & modrm entries of the modrm byte as follows:
934 index = (mode<<3) | modrm;
935*/
fc0d7441 936static const seg_entry *const one_byte_segment_defaults[] = {
ce868e5c
JG
937 /* mode 0 */
938 &ds, &ds, &ds, &ds, &null, &ds, &ds, &ds,
939 /* mode 1 */
940 &ds, &ds, &ds, &ds, &null, &ss, &ds, &ds,
941 /* mode 2 */
942 &ds, &ds, &ds, &ds, &null, &ss, &ds, &ds,
943 /* mode 3 --- not a memory reference; never referenced */
944};
945
fc0d7441 946static const seg_entry *const two_byte_segment_defaults[] = {
ce868e5c
JG
947 /* mode 0 */
948 &ds, &ds, &ds, &ds, &ss, &ds, &ds, &ds,
949 /* mode 1 */
950 &ds, &ds, &ds, &ds, &ss, &ds, &ds, &ds,
951 /* mode 2 */
952 &ds, &ds, &ds, &ds, &ss, &ds, &ds, &ds,
953 /* mode 3 --- not a memory reference; never referenced */
954};
955
956static const prefix_entry i386_prefixtab[] = {
a43022bd 957#define ADDR_PREFIX_OPCODE 0x67
ce868e5c
JG
958 { "addr16", 0x67 }, /* address size prefix ==> 16bit addressing
959 * (How is this useful?) */
960#define WORD_PREFIX_OPCODE 0x66
961 { "data16", 0x66 }, /* operand size prefix */
962 { "lock", 0xf0 }, /* bus lock prefix */
963 { "wait", 0x9b }, /* wait for coprocessor */
964 { "cs", 0x2e }, { "ds", 0x3e }, /* segment overrides ... */
965 { "es", 0x26 }, { "fs", 0x64 },
966 { "gs", 0x65 }, { "ss", 0x36 },
967/* REPE & REPNE used to detect rep/repne with a non-string instruction */
968#define REPNE 0xf2
969#define REPE 0xf3
970 { "rep", 0xf3 }, /* repeat string instructions */
971 { "repe", 0xf3 }, { "repz", 0xf3 },
972 { "repne", 0xf2 }, { "repnz", 0xf2 }
973};
974
fc0d7441 975static const prefix_entry *const i386_prefixtab_end
ce868e5c
JG
976 = i386_prefixtab + sizeof(i386_prefixtab)/sizeof(i386_prefixtab[0]);
977
978/* end of i386-opcode.h */
This page took 0.213969 seconds and 4 git commands to generate.