OSDN Git Service

[General] Tracking to upstream, rev 2015-01-14.
[csp-qt/common_source_project-fm7.git] / source / src / vm / mame / emu / cpu / i386 / i386dasm.c
1 /*\r
2    i386 Disassembler\r
3 \r
4    Written by Ville Linde\r
5 */\r
6 \r
7 //#include "emu.h"\r
8 \r
9 enum\r
10 {\r
11         PARAM_REG = 1,      /* 16 or 32-bit register */\r
12         PARAM_REG8,         /* 8-bit register */\r
13         PARAM_REG16,        /* 16-bit register */\r
14         PARAM_REG32,        /* 32-bit register */\r
15         PARAM_REG3264,      /* 32-bit or 64-bit register */\r
16         PARAM_REG2_32,      /* 32-bit register */\r
17         PARAM_MMX,          /* MMX register */\r
18         PARAM_MMX2,         /* MMX register in modrm */\r
19         PARAM_XMM,          /* XMM register */\r
20         PARAM_RM,           /* 16 or 32-bit memory or register */\r
21         PARAM_RM8,          /* 8-bit memory or register */\r
22         PARAM_RM16,         /* 16-bit memory or register */\r
23         PARAM_RM32,         /* 32-bit memory or register */\r
24         PARAM_RMPTR,        /* 16 or 32-bit memory or register */\r
25         PARAM_RMPTR8,       /* 8-bit memory or register */\r
26         PARAM_RMPTR16,      /* 16-bit memory or register */\r
27         PARAM_RMPTR32,      /* 32-bit memory or register */\r
28         PARAM_RMXMM,        /* 32 or 64-bit memory or register */\r
29         PARAM_REGORXMM,     /* 32 or 64-bit register or XMM register */\r
30         PARAM_M64,          /* 64-bit memory */\r
31         PARAM_M64PTR,       /* 64-bit memory */\r
32         PARAM_MMXM,         /* 64-bit memory or MMX register */\r
33         PARAM_XMMM,         /* 128-bit memory or XMM register */\r
34         PARAM_I4,           /* 4-bit signed immediate */\r
35         PARAM_I8,           /* 8-bit signed immediate */\r
36         PARAM_I16,          /* 16-bit signed immediate */\r
37         PARAM_UI8,          /* 8-bit unsigned immediate */\r
38         PARAM_UI16,         /* 16-bit unsigned immediate */\r
39         PARAM_IMM,          /* 16 or 32-bit immediate */\r
40         PARAM_IMM64,        /* 16, 32 or 64-bit immediate */\r
41         PARAM_ADDR,         /* 16:16 or 16:32 address */\r
42         PARAM_REL,          /* 16 or 32-bit PC-relative displacement */\r
43         PARAM_REL8,         /* 8-bit PC-relative displacement */\r
44         PARAM_MEM_OFFS,     /* 16 or 32-bit mem offset */\r
45         PARAM_PREIMP,       /* prefix with implicit register */\r
46         PARAM_SREG,         /* segment register */\r
47         PARAM_CREG,         /* control register */\r
48         PARAM_DREG,         /* debug register */\r
49         PARAM_TREG,         /* test register */\r
50         PARAM_1,            /* used by shift/rotate instructions */\r
51         PARAM_AL,\r
52         PARAM_CL,\r
53         PARAM_DL,\r
54         PARAM_BL,\r
55         PARAM_AH,\r
56         PARAM_CH,\r
57         PARAM_DH,\r
58         PARAM_BH,\r
59         PARAM_DX,\r
60         PARAM_EAX,          /* EAX or AX */\r
61         PARAM_ECX,          /* ECX or CX */\r
62         PARAM_EDX,          /* EDX or DX */\r
63         PARAM_EBX,          /* EBX or BX */\r
64         PARAM_ESP,          /* ESP or SP */\r
65         PARAM_EBP,          /* EBP or BP */\r
66         PARAM_ESI,          /* ESI or SI */\r
67         PARAM_EDI,          /* EDI or DI */\r
68         PARAM_XMM0,\r
69         PARAM_XMM64,            /* 64-bit memory or XMM register */\r
70         PARAM_XMM32,            /* 32-bit memory or XMM register */\r
71         PARAM_XMM16,            /* 16-bit memory or XMM register */\r
72 };\r
73 \r
74 enum\r
75 {\r
76         MODRM = 1,\r
77         GROUP,\r
78         FPU,\r
79         OP_SIZE,\r
80         ADDR_SIZE,\r
81         TWO_BYTE,\r
82         PREFIX,\r
83         SEG_CS,\r
84         SEG_DS,\r
85         SEG_ES,\r
86         SEG_FS,\r
87         SEG_GS,\r
88         SEG_SS,\r
89         ISREX,\r
90         THREE_BYTE          /* [prefix] 0f op1 op2 and then mod/rm */\r
91 };\r
92 \r
93 #define FLAGS_MASK          0x0ff\r
94 #define VAR_NAME            0x100\r
95 #define VAR_NAME4           0x200\r
96 #define ALWAYS64            0x400\r
97 #define SPECIAL64           0x800\r
98 #define SPECIAL64_ENT(x)    (SPECIAL64 | ((x) << 24))\r
99 \r
100 struct I386_OPCODE {\r
101         const char *mnemonic;\r
102         UINT32 flags;\r
103         UINT32 param1;\r
104         UINT32 param2;\r
105         UINT32 param3;\r
106         offs_t dasm_flags;\r
107 };\r
108 \r
109 struct GROUP_OP {\r
110         char mnemonic[32];\r
111         const I386_OPCODE *opcode;\r
112 };\r
113 \r
114 static const UINT8 *opcode_ptr;\r
115 static const UINT8 *opcode_ptr_base;\r
116 \r
117 static const I386_OPCODE i386_opcode_table1[256] =\r
118 {\r
119         // 0x00\r
120         {"add",             MODRM,          PARAM_RM8,          PARAM_REG8,         0               },\r
121         {"add",             MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
122         {"add",             MODRM,          PARAM_REG8,         PARAM_RM8,          0               },\r
123         {"add",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
124         {"add",             0,              PARAM_AL,           PARAM_UI8,          0               },\r
125         {"add",             0,              PARAM_EAX,          PARAM_IMM,          0               },\r
126         {"push    es",      0,              0,                  0,                  0               },\r
127         {"pop     es",      0,              0,                  0,                  0               },\r
128         {"or",              MODRM,          PARAM_RM8,          PARAM_REG8,         0               },\r
129         {"or",              MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
130         {"or",              MODRM,          PARAM_REG8,         PARAM_RM8,          0               },\r
131         {"or",              MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
132         {"or",              0,              PARAM_AL,           PARAM_UI8,          0               },\r
133         {"or",              0,              PARAM_EAX,          PARAM_IMM,          0               },\r
134         {"push    cs",      0,              0,                  0,                  0               },\r
135         {"two_byte",        TWO_BYTE,       0,                  0,                  0               },\r
136         // 0x10\r
137         {"adc",             MODRM,          PARAM_RM8,          PARAM_REG8,         0               },\r
138         {"adc",             MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
139         {"adc",             MODRM,          PARAM_REG8,         PARAM_RM8,          0               },\r
140         {"adc",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
141         {"adc",             0,              PARAM_AL,           PARAM_UI8,          0               },\r
142         {"adc",             0,              PARAM_EAX,          PARAM_IMM,          0               },\r
143         {"push    ss",      0,              0,                  0,                  0               },\r
144         {"pop     ss",      0,              0,                  0,                  0               },\r
145         {"sbb",             MODRM,          PARAM_RM8,          PARAM_REG8,         0               },\r
146         {"sbb",             MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
147         {"sbb",             MODRM,          PARAM_REG8,         PARAM_RM8,          0               },\r
148         {"sbb",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
149         {"sbb",             0,              PARAM_AL,           PARAM_UI8,          0               },\r
150         {"sbb",             0,              PARAM_EAX,          PARAM_IMM,          0               },\r
151         {"push    ds",      0,              0,                  0,                  0               },\r
152         {"pop     ds",      0,              0,                  0,                  0               },\r
153         // 0x20\r
154         {"and",             MODRM,          PARAM_RM8,          PARAM_REG8,         0               },\r
155         {"and",             MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
156         {"and",             MODRM,          PARAM_REG8,         PARAM_RM8,          0               },\r
157         {"and",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
158         {"and",             0,              PARAM_AL,           PARAM_UI8,          0               },\r
159         {"and",             0,              PARAM_EAX,          PARAM_IMM,          0               },\r
160         {"seg_es",          SEG_ES,         0,                  0,                  0               },\r
161         {"daa",             0,              0,                  0,                  0               },\r
162         {"sub",             MODRM,          PARAM_RM8,          PARAM_REG8,         0               },\r
163         {"sub",             MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
164         {"sub",             MODRM,          PARAM_REG8,         PARAM_RM8,          0               },\r
165         {"sub",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
166         {"sub",             0,              PARAM_AL,           PARAM_UI8,          0               },\r
167         {"sub",             0,              PARAM_EAX,          PARAM_IMM,          0               },\r
168         {"seg_cs",          SEG_CS,         0,                  0,                  0               },\r
169         {"das",             0,              0,                  0,                  0               },\r
170         // 0x30\r
171         {"xor",             MODRM,          PARAM_RM8,          PARAM_REG8,         0               },\r
172         {"xor",             MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
173         {"xor",             MODRM,          PARAM_REG8,         PARAM_RM8,          0               },\r
174         {"xor",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
175         {"xor",             0,              PARAM_AL,           PARAM_UI8,          0               },\r
176         {"xor",             0,              PARAM_EAX,          PARAM_IMM,          0               },\r
177         {"seg_ss",          SEG_SS,         0,                  0,                  0               },\r
178         {"aaa",             0,              0,                  0,                  0               },\r
179         {"cmp",             MODRM,          PARAM_RM8,          PARAM_REG8,         0               },\r
180         {"cmp",             MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
181         {"cmp",             MODRM,          PARAM_REG8,         PARAM_RM8,          0               },\r
182         {"cmp",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
183         {"cmp",             0,              PARAM_AL,           PARAM_UI8,          0               },\r
184         {"cmp",             0,              PARAM_EAX,          PARAM_IMM,          0               },\r
185         {"seg_ds",          SEG_DS,         0,                  0,                  0               },\r
186         {"aas",             0,              0,                  0,                  0               },\r
187         // 0x40\r
188         {"inc",             ISREX,          PARAM_EAX,          0,                  0               },\r
189         {"inc",             ISREX,          PARAM_ECX,          0,                  0               },\r
190         {"inc",             ISREX,          PARAM_EDX,          0,                  0               },\r
191         {"inc",             ISREX,          PARAM_EBX,          0,                  0               },\r
192         {"inc",             ISREX,          PARAM_ESP,          0,                  0               },\r
193         {"inc",             ISREX,          PARAM_EBP,          0,                  0               },\r
194         {"inc",             ISREX,          PARAM_ESI,          0,                  0               },\r
195         {"inc",             ISREX,          PARAM_EDI,          0,                  0               },\r
196         {"dec",             ISREX,          PARAM_EAX,          0,                  0               },\r
197         {"dec",             ISREX,          PARAM_ECX,          0,                  0               },\r
198         {"dec",             ISREX,          PARAM_EDX,          0,                  0               },\r
199         {"dec",             ISREX,          PARAM_EBX,          0,                  0               },\r
200         {"dec",             ISREX,          PARAM_ESP,          0,                  0               },\r
201         {"dec",             ISREX,          PARAM_EBP,          0,                  0               },\r
202         {"dec",             ISREX,          PARAM_ESI,          0,                  0               },\r
203         {"dec",             ISREX,          PARAM_EDI,          0,                  0               },\r
204         // 0x50\r
205         {"push",            ALWAYS64,       PARAM_EAX,          0,                  0               },\r
206         {"push",            ALWAYS64,       PARAM_ECX,          0,                  0               },\r
207         {"push",            ALWAYS64,       PARAM_EDX,          0,                  0               },\r
208         {"push",            ALWAYS64,       PARAM_EBX,          0,                  0               },\r
209         {"push",            ALWAYS64,       PARAM_ESP,          0,                  0               },\r
210         {"push",            ALWAYS64,       PARAM_EBP,          0,                  0               },\r
211         {"push",            ALWAYS64,       PARAM_ESI,          0,                  0               },\r
212         {"push",            ALWAYS64,       PARAM_EDI,          0,                  0               },\r
213         {"pop",             ALWAYS64,       PARAM_EAX,          0,                  0               },\r
214         {"pop",             ALWAYS64,       PARAM_ECX,          0,                  0               },\r
215         {"pop",             ALWAYS64,       PARAM_EDX,          0,                  0               },\r
216         {"pop",             ALWAYS64,       PARAM_EBX,          0,                  0               },\r
217         {"pop",             ALWAYS64,       PARAM_ESP,          0,                  0               },\r
218         {"pop",             ALWAYS64,       PARAM_EBP,          0,                  0               },\r
219         {"pop",             ALWAYS64,       PARAM_ESI,          0,                  0               },\r
220         {"pop",             ALWAYS64,       PARAM_EDI,          0,                  0               },\r
221         // 0x60\r
222         {"pusha\0pushad\0<invalid>",VAR_NAME,0,                 0,                  0               },\r
223         {"popa\0popad\0<invalid>",  VAR_NAME,0,                 0,                  0               },\r
224         {"bound",           MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
225         {"arpl",            MODRM | SPECIAL64_ENT(0),PARAM_RM,  PARAM_REG16,        0               },\r
226         {"seg_fs",          SEG_FS,         0,                  0,                  0               },\r
227         {"seg_gs",          SEG_GS,         0,                  0,                  0               },\r
228         {"op_size",         OP_SIZE,        0,                  0,                  0               },\r
229         {"addr_size",       ADDR_SIZE,      0,                  0,                  0               },\r
230         {"push",            0,              PARAM_IMM,          0,                  0               },\r
231         {"imul",            MODRM,          PARAM_REG,          PARAM_RM,           PARAM_IMM       },\r
232         {"push",            0,              PARAM_I8,           0,                  0               },\r
233         {"imul",            MODRM,          PARAM_REG,          PARAM_RM,           PARAM_I8        },\r
234         {"insb",            0,              0,                  0,                  0               },\r
235         {"insw\0insd\0insd",VAR_NAME,       0,                  0,                  0               },\r
236         {"outsb",           0,              PARAM_PREIMP,       0,                  0               },\r
237         {"outsw\0outsd\0outsd",VAR_NAME,    PARAM_PREIMP,       0,                  0               },\r
238         // 0x70\r
239         {"jo",              0,              PARAM_REL8,         0,                  0               },\r
240         {"jno",             0,              PARAM_REL8,         0,                  0               },\r
241         {"jb",              0,              PARAM_REL8,         0,                  0               },\r
242         {"jae",             0,              PARAM_REL8,         0,                  0               },\r
243         {"je",              0,              PARAM_REL8,         0,                  0               },\r
244         {"jne",             0,              PARAM_REL8,         0,                  0               },\r
245         {"jbe",             0,              PARAM_REL8,         0,                  0               },\r
246         {"ja",              0,              PARAM_REL8,         0,                  0               },\r
247         {"js",              0,              PARAM_REL8,         0,                  0               },\r
248         {"jns",             0,              PARAM_REL8,         0,                  0               },\r
249         {"jp",              0,              PARAM_REL8,         0,                  0               },\r
250         {"jnp",             0,              PARAM_REL8,         0,                  0               },\r
251         {"jl",              0,              PARAM_REL8,         0,                  0               },\r
252         {"jge",             0,              PARAM_REL8,         0,                  0               },\r
253         {"jle",             0,              PARAM_REL8,         0,                  0               },\r
254         {"jg",              0,              PARAM_REL8,         0,                  0               },\r
255         // 0x80\r
256         {"group80",         GROUP,          0,                  0,                  0               },\r
257         {"group81",         GROUP,          0,                  0,                  0               },\r
258         {"group80",         GROUP,          0,                  0,                  0               },\r
259         {"group83",         GROUP,          0,                  0,                  0               },\r
260         {"test",            MODRM,          PARAM_RM8,          PARAM_REG8,         0               },\r
261         {"test",            MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
262         {"xchg",            MODRM,          PARAM_REG8,         PARAM_RM8,          0               },\r
263         {"xchg",            MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
264         {"mov",             MODRM,          PARAM_RM8,          PARAM_REG8,         0               },\r
265         {"mov",             MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
266         {"mov",             MODRM,          PARAM_REG8,         PARAM_RM8,          0               },\r
267         {"mov",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
268         {"mov",             MODRM,          PARAM_RM,           PARAM_SREG,         0               },\r
269         {"lea",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
270         {"mov",             MODRM,          PARAM_SREG,         PARAM_RM,           0               },\r
271         {"pop",             MODRM,          PARAM_RM,           0,                  0               },\r
272         // 0x90\r
273         {"nop\0???\0???\0pause",    VAR_NAME4,          0,                  0,                  0               },\r
274         {"xchg",            0,              PARAM_EAX,          PARAM_ECX,          0               },\r
275         {"xchg",            0,              PARAM_EAX,          PARAM_EDX,          0               },\r
276         {"xchg",            0,              PARAM_EAX,          PARAM_EBX,          0               },\r
277         {"xchg",            0,              PARAM_EAX,          PARAM_ESP,          0               },\r
278         {"xchg",            0,              PARAM_EAX,          PARAM_EBP,          0               },\r
279         {"xchg",            0,              PARAM_EAX,          PARAM_ESI,          0               },\r
280         {"xchg",            0,              PARAM_EAX,          PARAM_EDI,          0               },\r
281         {"cbw\0cwde\0cdqe", VAR_NAME,       0,                  0,                  0               },\r
282         {"cwd\0cdq\0cqo",   VAR_NAME,       0,                  0,                  0               },\r
283         {"call",            ALWAYS64,       PARAM_ADDR,         0,                  0,              DASMFLAG_STEP_OVER},\r
284         {"wait",            0,              0,                  0,                  0               },\r
285         {"pushf\0pushfd\0pushfq",VAR_NAME,  0,                  0,                  0               },\r
286         {"popf\0popfd\0popfq",VAR_NAME,     0,                  0,                  0               },\r
287         {"sahf",            0,              0,                  0,                  0               },\r
288         {"lahf",            0,              0,                  0,                  0               },\r
289         // 0xa0\r
290         {"mov",             0,              PARAM_AL,           PARAM_MEM_OFFS,     0               },\r
291         {"mov",             0,              PARAM_EAX,          PARAM_MEM_OFFS,     0               },\r
292         {"mov",             0,              PARAM_MEM_OFFS,     PARAM_AL,           0               },\r
293         {"mov",             0,              PARAM_MEM_OFFS,     PARAM_EAX,          0               },\r
294         {"movsb",           0,              PARAM_PREIMP,       0,                  0               },\r
295         {"movsw\0movsd\0movsq",VAR_NAME,    PARAM_PREIMP,       0,                  0               },\r
296         {"cmpsb",           0,              PARAM_PREIMP,       0,                  0               },\r
297         {"cmpsw\0cmpsd\0cmpsq",VAR_NAME,    PARAM_PREIMP,       0,                  0               },\r
298         {"test",            0,              PARAM_AL,           PARAM_UI8,          0               },\r
299         {"test",            0,              PARAM_EAX,          PARAM_IMM,          0               },\r
300         {"stosb",           0,              0,                  0,                  0               },\r
301         {"stosw\0stosd\0stosq",VAR_NAME,    0,                  0,                  0               },\r
302         {"lodsb",           0,              PARAM_PREIMP,       0,                  0               },\r
303         {"lodsw\0lodsd\0lodsq",VAR_NAME,    PARAM_PREIMP,       0,                  0               },\r
304         {"scasb",           0,              0,                  0,                  0               },\r
305         {"scasw\0scasd\0scasq",VAR_NAME,    0,                  0,                  0               },\r
306         // 0xb0\r
307         {"mov",             0,              PARAM_AL,           PARAM_UI8,          0               },\r
308         {"mov",             0,              PARAM_CL,           PARAM_UI8,          0               },\r
309         {"mov",             0,              PARAM_DL,           PARAM_UI8,          0               },\r
310         {"mov",             0,              PARAM_BL,           PARAM_UI8,          0               },\r
311         {"mov",             0,              PARAM_AH,           PARAM_UI8,          0               },\r
312         {"mov",             0,              PARAM_CH,           PARAM_UI8,          0               },\r
313         {"mov",             0,              PARAM_DH,           PARAM_UI8,          0               },\r
314         {"mov",             0,              PARAM_BH,           PARAM_UI8,          0               },\r
315         {"mov",             0,              PARAM_EAX,          PARAM_IMM64,        0               },\r
316         {"mov",             0,              PARAM_ECX,          PARAM_IMM64,        0               },\r
317         {"mov",             0,              PARAM_EDX,          PARAM_IMM64,        0               },\r
318         {"mov",             0,              PARAM_EBX,          PARAM_IMM64,        0               },\r
319         {"mov",             0,              PARAM_ESP,          PARAM_IMM64,        0               },\r
320         {"mov",             0,              PARAM_EBP,          PARAM_IMM64,        0               },\r
321         {"mov",             0,              PARAM_ESI,          PARAM_IMM64,        0               },\r
322         {"mov",             0,              PARAM_EDI,          PARAM_IMM64,        0               },\r
323         // 0xc0\r
324         {"groupC0",         GROUP,          0,                  0,                  0               },\r
325         {"groupC1",         GROUP,          0,                  0,                  0               },\r
326         {"ret",             0,              PARAM_UI16,         0,                  0,              DASMFLAG_STEP_OUT},\r
327         {"ret",             0,              0,                  0,                  0,              DASMFLAG_STEP_OUT},\r
328         {"les",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
329         {"lds",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
330         {"mov",             MODRM,          PARAM_RMPTR8,       PARAM_UI8,          0               },\r
331         {"mov",             MODRM,          PARAM_RMPTR,        PARAM_IMM,          0               },\r
332         {"enter",           0,              PARAM_UI16,         PARAM_UI8,          0               },\r
333         {"leave",           0,              0,                  0,                  0               },\r
334         {"retf",            0,              PARAM_UI16,         0,                  0,              DASMFLAG_STEP_OUT},\r
335         {"retf",            0,              0,                  0,                  0,              DASMFLAG_STEP_OUT},\r
336         {"int 3",           0,              0,                  0,                  0,              DASMFLAG_STEP_OVER},\r
337         {"int",             0,              PARAM_UI8,          0,                  0,              DASMFLAG_STEP_OVER},\r
338         {"into",            0,              0,                  0,                  0               },\r
339         {"iret",            0,              0,                  0,                  0,              DASMFLAG_STEP_OUT},\r
340         // 0xd0\r
341         {"groupD0",         GROUP,          0,                  0,                  0               },\r
342         {"groupD1",         GROUP,          0,                  0,                  0               },\r
343         {"groupD2",         GROUP,          0,                  0,                  0               },\r
344         {"groupD3",         GROUP,          0,                  0,                  0               },\r
345         {"aam",             0,              PARAM_UI8,          0,                  0               },\r
346         {"aad",             0,              PARAM_UI8,          0,                  0               },\r
347         {"salc",            0,              0,                  0,                  0               }, //AMD docs name it\r
348         {"xlat",            0,              0,                  0,                  0               },\r
349         {"escape",          FPU,            0,                  0,                  0               },\r
350         {"escape",          FPU,            0,                  0,                  0               },\r
351         {"escape",          FPU,            0,                  0,                  0               },\r
352         {"escape",          FPU,            0,                  0,                  0               },\r
353         {"escape",          FPU,            0,                  0,                  0               },\r
354         {"escape",          FPU,            0,                  0,                  0               },\r
355         {"escape",          FPU,            0,                  0,                  0               },\r
356         {"escape",          FPU,            0,                  0,                  0               },\r
357         // 0xe0\r
358         {"loopne",          0,              PARAM_REL8,         0,                  0,              DASMFLAG_STEP_OVER},\r
359         {"loopz",           0,              PARAM_REL8,         0,                  0,              DASMFLAG_STEP_OVER},\r
360         {"loop",            0,              PARAM_REL8,         0,                  0,              DASMFLAG_STEP_OVER},\r
361         {"jcxz\0jecxz\0jrcxz",VAR_NAME,     PARAM_REL8,         0,                  0               },\r
362         {"in",              0,              PARAM_AL,           PARAM_UI8,          0               },\r
363         {"in",              0,              PARAM_EAX,          PARAM_UI8,          0               },\r
364         {"out",             0,              PARAM_UI8,          PARAM_AL,           0               },\r
365         {"out",             0,              PARAM_UI8,          PARAM_EAX,          0               },\r
366         {"call",            0,              PARAM_REL,          0,                  0,              DASMFLAG_STEP_OVER},\r
367         {"jmp",             0,              PARAM_REL,          0,                  0               },\r
368         {"jmp",             0,              PARAM_ADDR,         0,                  0               },\r
369         {"jmp",             0,              PARAM_REL8,         0,                  0               },\r
370         {"in",              0,              PARAM_AL,           PARAM_DX,           0               },\r
371         {"in",              0,              PARAM_EAX,          PARAM_DX,           0               },\r
372         {"out",             0,              PARAM_DX,           PARAM_AL,           0               },\r
373         {"out",             0,              PARAM_DX,           PARAM_EAX,          0               },\r
374         // 0xf0\r
375         {"lock",            0,              0,                  0,                  0               },\r
376         {"???",             0,              0,                  0,                  0               },\r
377         {"repne",           PREFIX,         0,                  0,                  0               },\r
378         {"rep",             PREFIX,         0,                  0,                  0               },\r
379         {"hlt",             0,              0,                  0,                  0               },\r
380         {"cmc",             0,              0,                  0,                  0               },\r
381         {"groupF6",         GROUP,          0,                  0,                  0               },\r
382         {"groupF7",         GROUP,          0,                  0,                  0               },\r
383         {"clc",             0,              0,                  0,                  0               },\r
384         {"stc",             0,              0,                  0,                  0               },\r
385         {"cli",             0,              0,                  0,                  0               },\r
386         {"sti",             0,              0,                  0,                  0               },\r
387         {"cld",             0,              0,                  0,                  0               },\r
388         {"std",             0,              0,                  0,                  0               },\r
389         {"groupFE",         GROUP,          0,                  0,                  0               },\r
390         {"groupFF",         GROUP,          0,                  0,                  0               }\r
391 };\r
392 \r
393 static const I386_OPCODE x64_opcode_alt[] =\r
394 {\r
395         {"movsxd",          MODRM | ALWAYS64,PARAM_REG,         PARAM_RMPTR32,      0               },\r
396 };\r
397 \r
398 static const I386_OPCODE i386_opcode_table2[256] =\r
399 {\r
400         // 0x00\r
401         {"group0F00",       GROUP,          0,                  0,                  0               },\r
402         {"group0F01",       GROUP,          0,                  0,                  0               },\r
403         {"lar",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
404         {"lsl",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
405         {"???",             0,              0,                  0,                  0               },\r
406         {"syscall",         0,              0,                  0,                  0               },\r
407         {"clts",            0,              0,                  0,                  0               },\r
408         {"sysret",          0,              0,                  0,                  0               },\r
409         {"invd",            0,              0,                  0,                  0               },\r
410         {"wbinvd",          0,              0,                  0,                  0               },\r
411         {"???",             0,              0,                  0,                  0               },\r
412         {"ud2",             0,              0,                  0,                  0               },\r
413         {"???",             0,              0,                  0,                  0               },\r
414         {"group0F0D",           GROUP,              0,                  0,                  0               }, //AMD only\r
415         {"???",             0,              0,                  0,                  0               },\r
416         {"???",             0,              0,                  0,                  0               },\r
417         // 0x10\r
418         {"movups\0"\r
419                 "movupd\0"\r
420                 "movsd\0"\r
421                 "movss",            MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
422         {"movups\0"\r
423                 "movupd\0"\r
424                 "movsd\0"\r
425                 "movss",            MODRM|VAR_NAME4,PARAM_XMMM,         PARAM_XMM,          0               },\r
426         {"movlps\0"\r
427                 "movlpd\0"\r
428                 "movddup\0"\r
429                 "movsldup",     MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
430         {"movlps\0"\r
431                 "movlpd\0"\r
432                 "???\0"\r
433                 "???",              MODRM|VAR_NAME4,PARAM_XMMM,         PARAM_XMM,          0               },\r
434         {"unpcklps\0"\r
435                 "unpcklpd\0"\r
436                 "???\0"\r
437                 "???",              MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
438         {"unpckhps\0"\r
439                 "unpckhpd\0"\r
440                 "???\0"\r
441                 "???",              MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
442         {"movhps\0"\r
443                 "movhpd\0"\r
444                 "???\0"\r
445                 "movshdup",     MODRM|VAR_NAME4,PARAM_XMMM,         PARAM_XMM,          0               },\r
446         {"movhps\0"\r
447                 "movhpd\0"\r
448                 "???\0"\r
449                 "???",              MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
450         {"group0F18",       GROUP,          0,                  0,                  0               },\r
451         {"nop_hint",        0,              PARAM_RMPTR8,               0,                  0               },\r
452         {"nop_hint",        0,              PARAM_RMPTR8,               0,                  0               },\r
453         {"nop_hint",        0,              PARAM_RMPTR8,               0,                  0               },\r
454         {"nop_hint",        0,              PARAM_RMPTR8,               0,                  0               },\r
455         {"nop_hint",        0,              PARAM_RMPTR8,               0,                  0               },\r
456         {"nop_hint",        0,              PARAM_RMPTR8,               0,                  0               },\r
457         {"nop_hint",        0,              PARAM_RMPTR8,               0,                  0               },\r
458         // 0x20\r
459         {"mov",             MODRM,          PARAM_REG2_32,      PARAM_CREG,         0               },\r
460         {"mov",             MODRM,          PARAM_REG2_32,      PARAM_DREG,         0               },\r
461         {"mov",             MODRM,          PARAM_CREG,         PARAM_REG2_32,      0               },\r
462         {"mov",             MODRM,          PARAM_DREG,         PARAM_REG2_32,      0               },\r
463         {"mov",             MODRM,          PARAM_REG2_32,      PARAM_TREG,         0               },\r
464         {"???",             0,              0,                  0,                  0               },\r
465         {"mov",             MODRM,          PARAM_TREG,         PARAM_REG2_32,      0               },\r
466         {"???",             0,              0,                  0,                  0               },\r
467         {"movaps\0"\r
468                 "movapd\0"\r
469                 "???\0"\r
470                 "???",              MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
471         {"movaps\0"\r
472                 "movapd\0"\r
473                 "???\0"\r
474                 "???",              MODRM|VAR_NAME4,PARAM_XMMM,         PARAM_XMM,          0               },\r
475         {"cvtpi2ps\0"\r
476                 "cvtpi2pd\0"\r
477                 "cvtsi2sd\0"\r
478                 "cvtsi2ss",     MODRM|VAR_NAME4,PARAM_XMM,          PARAM_RMXMM,        0               },\r
479         {"movntps\0"\r
480                 "movntpd\0"\r
481                 "???\0"\r
482                 "???",              MODRM|VAR_NAME4,PARAM_XMMM,         PARAM_XMM,          0               },\r
483         {"cvttps2pi\0"\r
484                 "cvttpd2pi\0"\r
485                 "cvttsd2si\0"\r
486                 "cvttss2si",        MODRM|VAR_NAME4,PARAM_REGORXMM,     PARAM_XMMM,         0               },\r
487         {"cvtps2pi\0"\r
488                 "cvtpd2pi\0"\r
489                 "cvtsd2si\0"\r
490                 "cvtss2si",     MODRM|VAR_NAME4,PARAM_REGORXMM,     PARAM_XMMM,         0               },\r
491         {"ucomiss\0"\r
492                 "ucomisd\0"\r
493                 "???\0"\r
494                 "???",              MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
495         {"comiss\0"\r
496                 "comisd\0"\r
497                 "???\0"\r
498                 "???",              MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
499         // 0x30\r
500         {"wrmsr",           0,              0,                  0,                  0               },\r
501         {"rdtsc",           0,              0,                  0,                  0               },\r
502         {"rdmsr",           0,              0,                  0,                  0               },\r
503         {"rdpmc",           0,              0,                  0,                  0               },\r
504         {"sysenter",        0,              0,                  0,                  0               },\r
505         {"sysexit",         0,              0,                  0,                  0               },\r
506         {"???",             0,              0,                  0,                  0               },\r
507         {"???",             0,              0,                  0,                  0               },\r
508         {"three_byte",          THREE_BYTE,         0,                  0,                  0               },\r
509         {"???",             0,              0,                  0,                  0               },\r
510         {"three_byte",          THREE_BYTE,         0,                  0,                  0               },\r
511         {"???",             0,              0,                  0,                  0               },\r
512         {"???",             0,              0,                  0,                  0               },\r
513         {"???",             0,              0,                  0,                  0               },\r
514         {"???",             0,              0,                  0,                  0               },\r
515         {"???",             0,              0,                  0,                  0               },\r
516         // 0x40\r
517         {"cmovo",           MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
518         {"cmovno",          MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
519         {"cmovb",           MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
520         {"cmovae",          MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
521         {"cmove",           MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
522         {"cmovne",          MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
523         {"cmovbe",          MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
524         {"cmova",           MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
525         {"cmovs",           MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
526         {"cmovns",          MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
527         {"cmovpe",          MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
528         {"cmovpo",          MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
529         {"cmovl",           MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
530         {"cmovge",          MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
531         {"cmovle",          MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
532         {"cmovg",           MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
533         // 0x50\r
534         {"movmskps\0"\r
535                 "movmskpd\0"\r
536                 "???\0"\r
537                 "???",              MODRM|VAR_NAME4,PARAM_REG3264,      PARAM_XMMM,         0               },\r
538         {"sqrtps\0"\r
539                 "sqrtpd\0"\r
540                 "sqrtsd\0"\r
541                 "sqrtss",           MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
542         {"rsqrtps\0"\r
543                 "???\0"\r
544                 "???\0"\r
545                 "rsqrtss",          MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
546         {"rcpps\0"\r
547                 "???\0"\r
548                 "???\0"\r
549                 "rcpss",            MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
550         {"andps\0"\r
551                 "andpd\0"\r
552                 "???\0"\r
553                 "???",              MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
554         {"andnps\0"\r
555                 "andnpd\0"\r
556                 "???\0"\r
557                 "???",              MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
558         {"orps\0"\r
559                 "orpd\0"\r
560                 "???\0"\r
561                 "???",              MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
562         {"xorps\0"\r
563                 "xorpd\0"\r
564                 "???\0"\r
565                 "???",              MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
566         {"addps\0"\r
567                 "addpd\0"\r
568                 "addsd\0"\r
569                 "addss",            MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
570         {"mulps\0"\r
571                 "mulpd\0"\r
572                 "mulsd\0"\r
573                 "mulss",            MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
574         {"cvtps2pd\0"\r
575                 "cvtpd2ps\0"\r
576                 "cvtsd2ss\0"\r
577                 "cvtss2sd",     MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
578         {"cvtdq2ps\0"\r
579                 "cvtps2dq\0"\r
580                 "???\0"\r
581                 "cvttps2dq",        MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
582         {"subps\0"\r
583                 "subpd\0"\r
584                 "subsd\0"\r
585                 "subss",            MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
586         {"minps\0"\r
587                 "minpd\0"\r
588                 "minsd\0"\r
589                 "minss",            MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
590         {"divps\0"\r
591                 "divpd\0"\r
592                 "divsd\0"\r
593                 "divss",            MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
594         {"maxps\0"\r
595                 "maxpd\0"\r
596                 "maxsd\0"\r
597                 "maxss",            MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
598         // 0x60\r
599         {"punpcklbw",       MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
600         {"punpcklwd",       MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
601         {"punpckldq",       MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
602         {"packsswb",        MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
603         {"pcmpgtb",         MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
604         {"pcmpgtw",         MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
605         {"pcmpgtd",         MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
606         {"packuswb",        MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
607         {"punpckhbw",       MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
608         {"punpckhwd",       MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
609         {"punpckhdq",       MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
610         {"packssdw",        MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
611         {"???\0"\r
612                 "punpcklqdq\0"\r
613                 "???\0"\r
614                 "???\0",        MODRM|VAR_NAME4,            PARAM_XMM,          PARAM_XMMM,         0               },\r
615         {"???\0"\r
616                 "punpckhqdq\0"\r
617                 "???\0"\r
618                 "???\0",        MODRM|VAR_NAME4,            PARAM_XMM,          PARAM_XMMM,         0               },\r
619         {"movd",            MODRM,          PARAM_MMX,          PARAM_RM,           0               },\r
620         {"movq\0"\r
621                 "movdqa\0"\r
622                 "???\0"\r
623                 "movdqu",           MODRM|VAR_NAME4,PARAM_MMX,          PARAM_MMXM,         0               },\r
624         // 0x70\r
625         {"pshufw\0"\r
626                 "pshufd\0"\r
627                 "pshuflw\0"\r
628                 "pshufhw",          MODRM|VAR_NAME4,PARAM_MMX,          PARAM_MMXM,         PARAM_UI8       },\r
629         {"group0F71",       GROUP,          0,                  0,                  0               },\r
630         {"group0F72",       GROUP,          0,                  0,                  0               },\r
631         {"group0F73",       GROUP,          0,                  0,                  0               },\r
632         {"pcmpeqb",         MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
633         {"pcmpeqw",         MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
634         {"pcmpeqd",         MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
635         {"emms",            0,              0,                  0,                  0               },\r
636         {"vmread",          MODRM,              PARAM_RM,               PARAM_REG,              0               },\r
637         {"vmwrite",         MODRM,              PARAM_RM,               PARAM_REG,              0               },\r
638         {"???",             0,              0,                  0,                  0               },\r
639         {"???",             0,              0,                  0,                  0               },\r
640         {"???\0"\r
641                 "haddpd\0"\r
642                 "haddps\0"\r
643                 "???",              MODRM|VAR_NAME4,PARAM_MMX,          PARAM_MMXM,         0               },\r
644         {"???\0"\r
645                 "hsubpd\0"\r
646                 "hsubps\0"\r
647                 "???",              MODRM|VAR_NAME4,PARAM_MMX,          PARAM_MMXM,         0               },\r
648         {"movd\0"\r
649                 "movd\0"\r
650                 "???\0"\r
651                 "movq",         MODRM|VAR_NAME4,PARAM_RM,           PARAM_MMX,          0               },\r
652         {"movq\0"\r
653                 "movdqa\0"\r
654                 "???\0"\r
655                 "movdqu",           MODRM|VAR_NAME4,PARAM_MMXM,         PARAM_MMX,          0               },\r
656         // 0x80\r
657         {"jo",              0,              PARAM_REL,          0,                  0               },\r
658         {"jno",             0,              PARAM_REL,          0,                  0               },\r
659         {"jb",              0,              PARAM_REL,          0,                  0               },\r
660         {"jae",             0,              PARAM_REL,          0,                  0               },\r
661         {"je",              0,              PARAM_REL,          0,                  0               },\r
662         {"jne",             0,              PARAM_REL,          0,                  0               },\r
663         {"jbe",             0,              PARAM_REL,          0,                  0               },\r
664         {"ja",              0,              PARAM_REL,          0,                  0               },\r
665         {"js",              0,              PARAM_REL,          0,                  0               },\r
666         {"jns",             0,              PARAM_REL,          0,                  0               },\r
667         {"jp",              0,              PARAM_REL,          0,                  0               },\r
668         {"jnp",             0,              PARAM_REL,          0,                  0               },\r
669         {"jl",              0,              PARAM_REL,          0,                  0               },\r
670         {"jge",             0,              PARAM_REL,          0,                  0               },\r
671         {"jle",             0,              PARAM_REL,          0,                  0               },\r
672         {"jg",              0,              PARAM_REL,          0,                  0               },\r
673         // 0x90\r
674         {"seto",            MODRM,          PARAM_RMPTR8,       0,                  0               },\r
675         {"setno",           MODRM,          PARAM_RMPTR8,       0,                  0               },\r
676         {"setb",            MODRM,          PARAM_RMPTR8,       0,                  0               },\r
677         {"setae",           MODRM,          PARAM_RMPTR8,       0,                  0               },\r
678         {"sete",            MODRM,          PARAM_RMPTR8,       0,                  0               },\r
679         {"setne",           MODRM,          PARAM_RMPTR8,       0,                  0               },\r
680         {"setbe",           MODRM,          PARAM_RMPTR8,       0,                  0               },\r
681         {"seta",            MODRM,          PARAM_RMPTR8,       0,                  0               },\r
682         {"sets",            MODRM,          PARAM_RMPTR8,       0,                  0               },\r
683         {"setns",           MODRM,          PARAM_RMPTR8,       0,                  0               },\r
684         {"setp",            MODRM,          PARAM_RMPTR8,       0,                  0               },\r
685         {"setnp",           MODRM,          PARAM_RMPTR8,       0,                  0               },\r
686         {"setl",            MODRM,          PARAM_RMPTR8,       0,                  0               },\r
687         {"setge",           MODRM,          PARAM_RMPTR8,       0,                  0               },\r
688         {"setle",           MODRM,          PARAM_RMPTR8,       0,                  0               },\r
689         {"setg",            MODRM,          PARAM_RMPTR8,       0,                  0               },\r
690         // 0xa0\r
691         {"push    fs",      0,              0,                  0,                  0               },\r
692         {"pop     fs",      0,              0,                  0,                  0               },\r
693         {"cpuid",           0,              0,                  0,                  0               },\r
694         {"bt",              MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
695         {"shld",            MODRM,          PARAM_RM,           PARAM_REG,          PARAM_UI8       },\r
696         {"shld",            MODRM,          PARAM_RM,           PARAM_REG,          PARAM_CL        },\r
697         {"???",             0,              0,                  0,                  0               },\r
698         {"???",             0,              0,                  0,                  0               },\r
699         {"push    gs",      0,              0,                  0,                  0               },\r
700         {"pop     gs",      0,              0,                  0,                  0               },\r
701         {"rsm",             0,              0,                  0,                  0               },\r
702         {"bts",             MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
703         {"shrd",            MODRM,          PARAM_RM,           PARAM_REG,          PARAM_UI8       },\r
704         {"shrd",            MODRM,          PARAM_RM,           PARAM_REG,          PARAM_CL        },\r
705         {"group0FAE",       GROUP,          0,                  0,                  0               },\r
706         {"imul",            MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
707         // 0xb0\r
708         {"cmpxchg",         MODRM,          PARAM_RM8,          PARAM_REG,          0               },\r
709         {"cmpxchg",         MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
710         {"lss",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
711         {"btr",             MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
712         {"lfs",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
713         {"lgs",             MODRM,          PARAM_REG,          PARAM_RM,           0               },\r
714         {"movzx",           MODRM,          PARAM_REG,          PARAM_RMPTR8,       0               },\r
715         {"movzx",           MODRM,          PARAM_REG,          PARAM_RMPTR16,      0               },\r
716         {"???\0"\r
717                 "???\0"\r
718                 "???\0"\r
719                 "popcnt",           MODRM|VAR_NAME4,        PARAM_REG,              PARAM_RM16,             0               },\r
720         {"ud2",             0,              0,                  0,                  0               },\r
721         {"group0FBA",       GROUP,          0,                  0,                  0               },\r
722         {"btc",             MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
723         {"bsf\0"\r
724                 "???\0"\r
725                 "???\0"\r
726                 "tzcnt",            MODRM|VAR_NAME4,    PARAM_REG,          PARAM_RM,           0               },\r
727         {"bsr\0"\r
728                 "???\0"\r
729                 "???\0"\r
730                 "lzcnt",            MODRM|VAR_NAME4,    PARAM_REG,          PARAM_RM,           0,              DASMFLAG_STEP_OVER},\r
731         {"movsx",           MODRM,          PARAM_REG,          PARAM_RMPTR8,       0               },\r
732         {"movsx",           MODRM,          PARAM_REG,          PARAM_RMPTR16,      0               },\r
733         // 0xc0\r
734         {"xadd",            MODRM,          PARAM_RM8,          PARAM_REG,          0               },\r
735         {"xadd",            MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
736         {"cmpps\0"\r
737                 "cmppd\0"\r
738                 "cmpsd\0"\r
739                 "cmpss",            MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
740         {"movnti",          MODRM,          PARAM_RM,           PARAM_REG,          0               },\r
741         {"pinsrw",          MODRM,          PARAM_MMX,          PARAM_RM,           PARAM_UI8       },\r
742         {"pextrw",          MODRM,          PARAM_MMX,          PARAM_RM,           PARAM_UI8       },\r
743         {"shufps\0"\r
744                 "shufpd\0"\r
745                 "???\0"\r
746                 "???",              MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         PARAM_UI8       },\r
747         {"group0FC7",           GROUP,          0,          0,                  0               },\r
748         {"bswap",           0,              PARAM_EAX,          0,                  0               },\r
749         {"bswap",           0,              PARAM_ECX,          0,                  0               },\r
750         {"bswap",           0,              PARAM_EDX,          0,                  0               },\r
751         {"bswap",           0,              PARAM_EBX,          0,                  0               },\r
752         {"bswap",           0,              PARAM_ESP,          0,                  0               },\r
753         {"bswap",           0,              PARAM_EBP,          0,                  0               },\r
754         {"bswap",           0,              PARAM_ESI,          0,                  0               },\r
755         {"bswap",           0,              PARAM_EDI,          0,                  0               },\r
756         // 0xd0\r
757         {"???\0"\r
758                 "addsubpd\0"\r
759                 "addsubps\0"\r
760                 "???\0",            MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
761         {"psrlw",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
762         {"psrld",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
763         {"psrlq",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
764         {"paddq",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
765         {"pmullw",          MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
766         {"???\0"\r
767                 "movq\0"\r
768                 "movdq2q\0"\r
769                 "movq2dq",          MODRM|VAR_NAME4,PARAM_MMX,          PARAM_MMXM,         0               },\r
770         {"pmovmskb",        MODRM,          PARAM_REG3264,      PARAM_MMXM,         0               },\r
771         {"psubusb",         MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
772         {"psubusw",         MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
773         {"pminub",          MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
774         {"pand",            MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
775         {"paddusb",         MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
776         {"paddusw",         MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
777         {"pmaxub",          MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
778         {"pandn",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
779         // 0xe0\r
780         {"pavgb",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
781         {"psraw",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
782         {"psrad",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
783         {"pavgw",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
784         {"pmulhuw",         MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
785         {"pmulhw",          MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
786         {"???\0"\r
787                 "cvttpd2dq\0"\r
788                 "cvtpd2dq\0"\r
789                 "cvtdq2pd",     MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
790         {"movntq\0"\r
791                 "movntdq\0"\r
792                 "???\0"\r
793                 "???\0",            MODRM|VAR_NAME4,    PARAM_M64,          PARAM_MMX,          0               },\r
794         {"psubsb",          MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
795         {"psubsw",          MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
796         {"pminsw",          MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
797         {"por",             MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
798         {"paddsb",          MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
799         {"paddsw",          MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
800         {"pmaxsw",          MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
801         {"pxor",            MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
802         // 0xf0\r
803         {"???\0"\r
804                 "???\0"\r
805                 "lddqu\0"\r
806                 "???",              MODRM|VAR_NAME4,PARAM_XMM,          PARAM_XMMM,         0               },\r
807         {"psllw",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
808         {"pslld",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
809         {"psllq",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
810         {"pmuludq",         MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
811         {"pmaddwd",         MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
812         {"psadbw",          MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
813         {"maskmovq\0"\r
814                 "maskmovdqu\0"\r
815                 "???\0"\r
816                 "???",              MODRM|VAR_NAME4,PARAM_MMX,          PARAM_MMXM,         0               },\r
817         {"psubb",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
818         {"psubw",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
819         {"psubd",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
820         {"psubq",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
821         {"paddb",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
822         {"paddw",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
823         {"paddd",           MODRM,          PARAM_MMX,          PARAM_MMXM,         0               },\r
824         {"???",             0,              0,                  0,                  0               }\r
825 };\r
826 \r
827 static const I386_OPCODE i386_opcode_table0F38[256] =\r
828 {\r
829         // 0x00\r
830         {"pshufb\0"\r
831                 "pshufb\0"\r
832                 "???\0"\r
833                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
834         {"phaddw\0"\r
835                 "phaddw\0"\r
836                 "???\0"\r
837                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
838         {"phaddd\0"\r
839                 "phadd\0"\r
840                 "???\0"\r
841                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
842         {"phaddsw\0"\r
843                 "phaddsw\0"\r
844                 "???\0"\r
845                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
846         {"pmaddubsw\0"\r
847                 "pmaddubsw\0"\r
848                 "???\0"\r
849                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
850         {"phsubw\0"\r
851                 "phsubw\0"\r
852                 "???\0"\r
853                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
854         {"phsubd\0"\r
855                 "phsubd\0"\r
856                 "???\0"\r
857                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
858         {"phsubsw\0"\r
859                 "phsubsw\0"\r
860                 "???\0"\r
861                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
862         {"psignb\0"\r
863                 "psignb\0"\r
864                 "???\0"\r
865                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
866         {"psignw\0"\r
867                 "psignw\0"\r
868                 "???\0"\r
869                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
870         {"psignd\0"\r
871                 "psignd\0"\r
872                 "???\0"\r
873                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
874         {"pmulhrsw\0"\r
875                 "pmulhrsw\0"\r
876                 "???\0"\r
877                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
878         {"???",             0,              0,          0,              0               },\r
879         {"???",             0,              0,          0,              0               },\r
880         {"???",             0,              0,          0,              0               },\r
881         {"???",             0,              0,          0,              0               },\r
882         // 0x10\r
883         {"???\0"\r
884                 "pblendvb\0"\r
885                 "???\0"\r
886                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_XMM0          },\r
887         {"???",             0,              0,          0,              0               },\r
888         {"???",             0,              0,          0,              0               },\r
889         {"???",             0,              0,          0,              0               },\r
890         {"???\0"\r
891                 "blendvps\0"\r
892                 "???\0"\r
893                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_XMM0          },\r
894         {"???\0"\r
895                 "blendvpd\0"\r
896                 "???\0"\r
897                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_XMM0          },\r
898         {"???",             0,              0,          0,              0               },\r
899         {"???\0"\r
900                 "ptest\0"\r
901                 "???\0"\r
902                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
903         {"???",             0,              0,          0,              0               },\r
904         {"???",             0,              0,          0,              0               },\r
905         {"???",             0,              0,          0,              0               },\r
906         {"???",             0,              0,          0,              0               },\r
907         {"pabsb\0"\r
908                 "pabsb\0"\r
909                 "???\0"\r
910                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
911         {"pabsw\0"\r
912                 "pabsw\0"\r
913                 "???\0"\r
914                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
915         {"pabsd\0"\r
916                 "pabsd\0"\r
917                 "???\0"\r
918                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
919         {"???",             0,              0,          0,              0               },\r
920         // 0x20\r
921         {"???\0"\r
922                 "pmovsxbw\0"\r
923                 "???\0"\r
924                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMM64,            0               },\r
925         {"???\0"\r
926                 "pmovsxbd\0"\r
927                 "???\0"\r
928                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMM32,            0               },\r
929         {"???\0"\r
930                 "pmovsxbq\0"\r
931                 "???\0"\r
932                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMM16,            0               },\r
933         {"???\0"\r
934                 "pmovsxwd\0"\r
935                 "???\0"\r
936                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMM64,            0               },\r
937         {"???\0"\r
938                 "pmovsxwq\0"\r
939                 "???\0"\r
940                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMM32,            0               },\r
941         {"???\0"\r
942                 "pmovsxdq\0"\r
943                 "???\0"\r
944                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMM64,            0               },\r
945         {"???",             0,              0,          0,              0               },\r
946         {"???",             0,              0,          0,              0               },\r
947         {"???\0"\r
948                 "pmuldq\0"\r
949                 "???\0"\r
950                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
951         {"???\0"\r
952                 "pcmpeqq\0"\r
953                 "???\0"\r
954                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
955         {"???\0"\r
956                 "movntdqa\0"\r
957                 "???\0"\r
958                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
959         {"???\0"\r
960                 "packusdw\0"\r
961                 "???\0"\r
962                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
963         {"???",             0,              0,          0,              0               },\r
964         {"???",             0,              0,          0,              0               },\r
965         {"???",             0,              0,          0,              0               },\r
966         {"???",             0,              0,          0,              0               },\r
967         // 0x30\r
968         {"???\0"\r
969                 "pmovzxbw\0"\r
970                 "???\0"\r
971                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMM64,            0               },\r
972         {"???\0"\r
973                 "pmovzxbd\0"\r
974                 "???\0"\r
975                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMM32,            0               },\r
976         {"???\0"\r
977                 "pmovzxbq\0"\r
978                 "???\0"\r
979                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMM16,            0               },\r
980         {"???\0"\r
981                 "pmovzxwd\0"\r
982                 "???\0"\r
983                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMM64,            0               },\r
984         {"???\0"\r
985                 "pmovzxwq\0"\r
986                 "???\0"\r
987                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMM32,            0               },\r
988         {"???\0"\r
989                 "pmovzxdq\0"\r
990                 "???\0"\r
991                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMM64,            0               },\r
992         {"???",             0,              0,          0,              0               },\r
993         {"???\0"\r
994                 "pcmpgtq\0"\r
995                 "???\0"\r
996                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
997         {"???\0"\r
998                 "pminsb\0"\r
999                 "???\0"\r
1000                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1001         {"???\0"\r
1002                 "pminsd\0"\r
1003                 "???\0"\r
1004                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1005         {"???\0"\r
1006                 "pminuw\0"\r
1007                 "???\0"\r
1008                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1009         {"???\0"\r
1010                 "pminud\0"\r
1011                 "???\0"\r
1012                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1013         {"???\0"\r
1014                 "pmaxsb\0"\r
1015                 "???\0"\r
1016                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1017         {"???\0"\r
1018                 "pmaxsd\0"\r
1019                 "???\0"\r
1020                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1021         {"???\0"\r
1022                 "pmaxuw\0"\r
1023                 "???\0"\r
1024                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1025         {"???\0"\r
1026                 "pmaxud\0"\r
1027                 "???\0"\r
1028                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1029         // 0x40\r
1030         {"???\0"\r
1031                 "pmulld\0"\r
1032                 "???\0"\r
1033                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1034         {"???\0"\r
1035                 "phminposuw\0"\r
1036                 "???\0"\r
1037                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1038         {"???",             0,              0,          0,              0               },\r
1039         {"???",             0,              0,          0,              0               },\r
1040         {"???",             0,              0,          0,              0               },\r
1041         {"???",             0,              0,          0,              0               },\r
1042         {"???",             0,              0,          0,              0               },\r
1043         {"???",             0,              0,          0,              0               },\r
1044         {"???",             0,              0,          0,              0               },\r
1045         {"???",             0,              0,          0,              0               },\r
1046         {"???",             0,              0,          0,              0               },\r
1047         {"???",             0,              0,          0,              0               },\r
1048         {"???",             0,              0,          0,              0               },\r
1049         {"???",             0,              0,          0,              0               },\r
1050         {"???",             0,              0,          0,              0               },\r
1051         {"???",             0,              0,          0,              0               },\r
1052         // 0x50\r
1053         {"???",             0,              0,          0,              0               },\r
1054         {"???",             0,              0,          0,              0               },\r
1055         {"???",             0,              0,          0,              0               },\r
1056         {"???",             0,              0,          0,              0               },\r
1057         {"???",             0,              0,          0,              0               },\r
1058         {"???",             0,              0,          0,              0               },\r
1059         {"???",             0,              0,          0,              0               },\r
1060         {"???",             0,              0,          0,              0               },\r
1061         {"???",             0,              0,          0,              0               },\r
1062         {"???",             0,              0,          0,              0               },\r
1063         {"???",             0,              0,          0,              0               },\r
1064         {"???",             0,              0,          0,              0               },\r
1065         {"???",             0,              0,          0,              0               },\r
1066         {"???",             0,              0,          0,              0               },\r
1067         {"???",             0,              0,          0,              0               },\r
1068         {"???",             0,              0,          0,              0               },\r
1069         // 0x60\r
1070         {"???",             0,              0,          0,              0               },\r
1071         {"???",             0,              0,          0,              0               },\r
1072         {"???",             0,              0,          0,              0               },\r
1073         {"???",             0,              0,          0,              0               },\r
1074         {"???",             0,              0,          0,              0               },\r
1075         {"???",             0,              0,          0,              0               },\r
1076         {"???",             0,              0,          0,              0               },\r
1077         {"???",             0,              0,          0,              0               },\r
1078         {"???",             0,              0,          0,              0               },\r
1079         {"???",             0,              0,          0,              0               },\r
1080         {"???",             0,              0,          0,              0               },\r
1081         {"???",             0,              0,          0,              0               },\r
1082         {"???",             0,              0,          0,              0               },\r
1083         {"???",             0,              0,          0,              0               },\r
1084         {"???",             0,              0,          0,              0               },\r
1085         {"???",             0,              0,          0,              0               },\r
1086         // 0x70\r
1087         {"???",             0,              0,          0,              0               },\r
1088         {"???",             0,              0,          0,              0               },\r
1089         {"???",             0,              0,          0,              0               },\r
1090         {"???",             0,              0,          0,              0               },\r
1091         {"???",             0,              0,          0,              0               },\r
1092         {"???",             0,              0,          0,              0               },\r
1093         {"???",             0,              0,          0,              0               },\r
1094         {"???",             0,              0,          0,              0               },\r
1095         {"???",             0,              0,          0,              0               },\r
1096         {"???",             0,              0,          0,              0               },\r
1097         {"???",             0,              0,          0,              0               },\r
1098         {"???",             0,              0,          0,              0               },\r
1099         {"???",             0,              0,          0,              0               },\r
1100         {"???",             0,              0,          0,              0               },\r
1101         {"???",             0,              0,          0,              0               },\r
1102         {"???",             0,              0,          0,              0               },\r
1103         // 0x80\r
1104         {"???\0"\r
1105                 "invept\0"\r
1106                 "???\0"\r
1107                 "???",              MODRM|VAR_NAME4,    PARAM_REG32,            PARAM_XMMM,         0               },\r
1108         {"???\0"\r
1109                 "invvpid\0"\r
1110                 "???\0"\r
1111                 "???",              MODRM|VAR_NAME4,    PARAM_REG32,            PARAM_XMMM,         0               },\r
1112         {"???\0"\r
1113                 "invpcid\0"\r
1114                 "???\0"\r
1115                 "???",              MODRM|VAR_NAME4,    PARAM_REG32,            PARAM_XMMM,         0               },\r
1116         {"???",             0,              0,          0,              0               },\r
1117         {"???",             0,              0,          0,              0               },\r
1118         {"???",             0,              0,          0,              0               },\r
1119         {"???",             0,              0,          0,              0               },\r
1120         {"???",             0,              0,          0,              0               },\r
1121         {"???",             0,              0,          0,              0               },\r
1122         {"???",             0,              0,          0,              0               },\r
1123         {"???",             0,              0,          0,              0               },\r
1124         {"???",             0,              0,          0,              0               },\r
1125         {"???",             0,              0,          0,              0               },\r
1126         {"???",             0,              0,          0,              0               },\r
1127         {"???",             0,              0,          0,              0               },\r
1128         {"???",             0,              0,          0,              0               },\r
1129         // 0x90\r
1130         {"???",             0,              0,          0,              0               },\r
1131         {"???",             0,              0,          0,              0               },\r
1132         {"???",             0,              0,          0,              0               },\r
1133         {"???",             0,              0,          0,              0               },\r
1134         {"???",             0,              0,          0,              0               },\r
1135         {"???",             0,              0,          0,              0               },\r
1136         {"???",             0,              0,          0,              0               },\r
1137         {"???",             0,              0,          0,              0               },\r
1138         {"???",             0,              0,          0,              0               },\r
1139         {"???",             0,              0,          0,              0               },\r
1140         {"???",             0,              0,          0,              0               },\r
1141         {"???",             0,              0,          0,              0               },\r
1142         {"???",             0,              0,          0,              0               },\r
1143         {"???",             0,              0,          0,              0               },\r
1144         {"???",             0,              0,          0,              0               },\r
1145         {"???",             0,              0,          0,              0               },\r
1146         // 0xa0\r
1147         {"???",             0,              0,          0,              0               },\r
1148         {"???",             0,              0,          0,              0               },\r
1149         {"???",             0,              0,          0,              0               },\r
1150         {"???",             0,              0,          0,              0               },\r
1151         {"???",             0,              0,          0,              0               },\r
1152         {"???",             0,              0,          0,              0               },\r
1153         {"???",             0,              0,          0,              0               },\r
1154         {"???",             0,              0,          0,              0               },\r
1155         {"???",             0,              0,          0,              0               },\r
1156         {"???",             0,              0,          0,              0               },\r
1157         {"???",             0,              0,          0,              0               },\r
1158         {"???",             0,              0,          0,              0               },\r
1159         {"???",             0,              0,          0,              0               },\r
1160         {"???",             0,              0,          0,              0               },\r
1161         {"???",             0,              0,          0,              0               },\r
1162         {"???",             0,              0,          0,              0               },\r
1163         // 0xb0\r
1164         {"???",             0,              0,          0,              0               },\r
1165         {"???",             0,              0,          0,              0               },\r
1166         {"???",             0,              0,          0,              0               },\r
1167         {"???",             0,              0,          0,              0               },\r
1168         {"???",             0,              0,          0,              0               },\r
1169         {"???",             0,              0,          0,              0               },\r
1170         {"???",             0,              0,          0,              0               },\r
1171         {"???",             0,              0,          0,              0               },\r
1172         {"???",             0,              0,          0,              0               },\r
1173         {"???",             0,              0,          0,              0               },\r
1174         {"???",             0,              0,          0,              0               },\r
1175         {"???",             0,              0,          0,              0               },\r
1176         {"???",             0,              0,          0,              0               },\r
1177         {"???",             0,              0,          0,              0               },\r
1178         {"???",             0,              0,          0,              0               },\r
1179         {"???",             0,              0,          0,              0               },\r
1180         // 0xc0\r
1181         {"???",             0,              0,          0,              0               },\r
1182         {"???",             0,              0,          0,              0               },\r
1183         {"???",             0,              0,          0,              0               },\r
1184         {"???",             0,              0,          0,              0               },\r
1185         {"???",             0,              0,          0,              0               },\r
1186         {"???",             0,              0,          0,              0               },\r
1187         {"???",             0,              0,          0,              0               },\r
1188         {"???",             0,              0,          0,              0               },\r
1189         {"???",             0,              0,          0,              0               },\r
1190         {"???",             0,              0,          0,              0               },\r
1191         {"???",             0,              0,          0,              0               },\r
1192         {"???",             0,              0,          0,              0               },\r
1193         {"???",             0,              0,          0,              0               },\r
1194         {"???",             0,              0,          0,              0               },\r
1195         {"???",             0,              0,          0,              0               },\r
1196         {"???",             0,              0,          0,              0               },\r
1197         // 0xd0\r
1198         {"???",             0,              0,          0,              0               },\r
1199         {"???",             0,              0,          0,              0               },\r
1200         {"???",             0,              0,          0,              0               },\r
1201         {"???",             0,              0,          0,              0               },\r
1202         {"???",             0,              0,          0,              0               },\r
1203         {"???",             0,              0,          0,              0               },\r
1204         {"???",             0,              0,          0,              0               },\r
1205         {"???",             0,              0,          0,              0               },\r
1206         {"???",             0,              0,          0,              0               },\r
1207         {"???",             0,              0,          0,              0               },\r
1208         {"???",             0,              0,          0,              0               },\r
1209         {"???\0"\r
1210                 "aesimc\0"\r
1211                 "???\0"\r
1212                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1213         {"???\0"\r
1214                 "aesenc\0"\r
1215                 "???\0"\r
1216                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1217         {"???\0"\r
1218                 "aesenclast\0"\r
1219                 "???\0"\r
1220                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1221         {"???\0"\r
1222                 "aesdec\0"\r
1223                 "???\0"\r
1224                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1225         {"???\0"\r
1226                 "aesdeclast\0"\r
1227                 "???\0"\r
1228                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         0               },\r
1229         // 0xe0\r
1230         {"???",             0,              0,          0,              0               },\r
1231         {"???",             0,              0,          0,              0               },\r
1232         {"???",             0,              0,          0,              0               },\r
1233         {"???",             0,              0,          0,              0               },\r
1234         {"???",             0,              0,          0,              0               },\r
1235         {"???",             0,              0,          0,              0               },\r
1236         {"???",             0,              0,          0,              0               },\r
1237         {"???",             0,              0,          0,              0               },\r
1238         {"???",             0,              0,          0,              0               },\r
1239         {"???",             0,              0,          0,              0               },\r
1240         {"???",             0,              0,          0,              0               },\r
1241         {"???",             0,              0,          0,              0               },\r
1242         {"???",             0,              0,          0,              0               },\r
1243         {"???",             0,              0,          0,              0               },\r
1244         {"???",             0,              0,          0,              0               },\r
1245         {"???",             0,              0,          0,              0               },\r
1246         // 0xf0\r
1247         {"movbe\0"\r
1248                 "???\0"\r
1249                 "crc32\0"\r
1250                 "???",              MODRM|VAR_NAME4,    PARAM_REG32,            PARAM_RMPTR,            0               }, // not quite correct\r
1251         {"movbe\0"\r
1252                 "???\0"\r
1253                 "crc32\0"\r
1254                 "???",              MODRM|VAR_NAME4,    PARAM_RMPTR,            PARAM_REG32,            0               }, // not quite correct\r
1255         {"???",             0,              0,          0,              0               },\r
1256         {"???",             0,              0,          0,              0               },\r
1257         {"???",             0,              0,          0,              0               },\r
1258         {"???",             0,              0,          0,              0               },\r
1259         {"???",             0,              0,          0,              0               },\r
1260         {"???",             0,              0,          0,              0               },\r
1261         {"???",             0,              0,          0,              0               },\r
1262         {"???",             0,              0,          0,              0               },\r
1263         {"???",             0,              0,          0,              0               },\r
1264         {"???",             0,              0,          0,              0               },\r
1265         {"???",             0,              0,          0,              0               },\r
1266         {"???",             0,              0,          0,              0               },\r
1267         {"???",             0,              0,          0,              0               },\r
1268         {"???",             0,              0,          0,              0               },\r
1269 };\r
1270 \r
1271 static const I386_OPCODE i386_opcode_table0F3A[256] =\r
1272 {\r
1273         // 0x00\r
1274         {"???",             0,              0,          0,              0               },\r
1275         {"???",             0,              0,          0,              0               },\r
1276         {"???",             0,              0,          0,              0               },\r
1277         {"???",             0,              0,          0,              0               },\r
1278         {"???",             0,              0,          0,              0               },\r
1279         {"???",             0,              0,          0,              0               },\r
1280         {"???",             0,              0,          0,              0               },\r
1281         {"???",             0,              0,          0,              0               },\r
1282         {"???\0"\r
1283                 "roundps\0"\r
1284                 "???\0"\r
1285                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1286         {"???\0"\r
1287                 "roundpd\0"\r
1288                 "???\0"\r
1289                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1290         {"???\0"\r
1291                 "roundss\0"\r
1292                 "???\0"\r
1293                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1294         {"???\0"\r
1295                 "roundsd\0"\r
1296                 "???\0"\r
1297                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1298         {"???\0"\r
1299                 "blendps\0"\r
1300                 "???\0"\r
1301                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1302         {"???\0"\r
1303                 "blendpd\0"\r
1304                 "???\0"\r
1305                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1306         {"???\0"\r
1307                 "pblendw\0"\r
1308                 "???\0"\r
1309                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1310         {"palignr\0"\r
1311                 "palignr\0"\r
1312                 "???\0"\r
1313                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1314         // 0x10\r
1315         {"???",             0,              0,          0,              0               },\r
1316         {"???",             0,              0,          0,              0               },\r
1317         {"???",             0,              0,          0,              0               },\r
1318         {"???",             0,              0,          0,              0               },\r
1319         {"???\0"\r
1320                 "pextrb\0"\r
1321                 "???\0"\r
1322                 "???",              MODRM|VAR_NAME4,    PARAM_RM8,          PARAM_XMM,          PARAM_UI8           },\r
1323         {"???\0"\r
1324                 "pextrw\0"\r
1325                 "???\0"\r
1326                 "???",              MODRM|VAR_NAME4,    PARAM_RM16,         PARAM_XMM,          PARAM_UI8           },\r
1327         {"???\0"\r
1328                 "pextrd\0"\r
1329                 "???\0"\r
1330                 "???",              MODRM|VAR_NAME4,    PARAM_RM8,          PARAM_XMM,          PARAM_UI8           },\r
1331         {"???\0"\r
1332                 "extractps\0"\r
1333                 "???\0"\r
1334                 "???",              MODRM|VAR_NAME4,    PARAM_RM32,         PARAM_XMM,          PARAM_UI8           },\r
1335         {"???",             0,              0,          0,              0               },\r
1336         {"???",             0,              0,          0,              0               },\r
1337         {"???",             0,              0,          0,              0               },\r
1338         {"???",             0,              0,          0,              0               },\r
1339         {"???",             0,              0,          0,              0               },\r
1340         {"???",             0,              0,          0,              0               },\r
1341         {"???",             0,              0,          0,              0               },\r
1342         {"???",             0,              0,          0,              0               },\r
1343         // 0x20\r
1344         {"???\0"\r
1345                 "pinsrb\0"\r
1346                 "???\0"\r
1347                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_RM8,          PARAM_UI8           },\r
1348         {"???\0"\r
1349                 "insertps\0"\r
1350                 "???\0"\r
1351                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_RM8,          PARAM_UI8           },\r
1352         {"???\0"\r
1353                 "pinsrd\0"\r
1354                 "???\0"\r
1355                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_RM32,         PARAM_UI8           },\r
1356         {"???",             0,              0,          0,              0               },\r
1357         {"???",             0,              0,          0,              0               },\r
1358         {"???",             0,              0,          0,              0               },\r
1359         {"???",             0,              0,          0,              0               },\r
1360         {"???",             0,              0,          0,              0               },\r
1361         {"???",             0,              0,          0,              0               },\r
1362         {"???",             0,              0,          0,              0               },\r
1363         {"???",             0,              0,          0,              0               },\r
1364         {"???",             0,              0,          0,              0               },\r
1365         {"???",             0,              0,          0,              0               },\r
1366         {"???",             0,              0,          0,              0               },\r
1367         {"???",             0,              0,          0,              0               },\r
1368         {"???",             0,              0,          0,              0               },\r
1369         // 0x30\r
1370         {"???",             0,              0,          0,              0               },\r
1371         {"???",             0,              0,          0,              0               },\r
1372         {"???",             0,              0,          0,              0               },\r
1373         {"???",             0,              0,          0,              0               },\r
1374         {"???",             0,              0,          0,              0               },\r
1375         {"???",             0,              0,          0,              0               },\r
1376         {"???",             0,              0,          0,              0               },\r
1377         {"???",             0,              0,          0,              0               },\r
1378         {"???",             0,              0,          0,              0               },\r
1379         {"???",             0,              0,          0,              0               },\r
1380         {"???",             0,              0,          0,              0               },\r
1381         {"???",             0,              0,          0,              0               },\r
1382         {"???",             0,              0,          0,              0               },\r
1383         {"???",             0,              0,          0,              0               },\r
1384         {"???",             0,              0,          0,              0               },\r
1385         {"???",             0,              0,          0,              0               },\r
1386         // 0x40\r
1387         {"???\0"\r
1388                 "dpps\0"\r
1389                 "???\0"\r
1390                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1391         {"???\0"\r
1392                 "dppd\0"\r
1393                 "???\0"\r
1394                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1395         {"???\0"\r
1396                 "mpsadbw\0"\r
1397                 "???\0"\r
1398                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1399         {"???",             0,              0,          0,              0               },\r
1400         {"???\0"\r
1401                 "pclmulqdq\0"\r
1402                 "???\0"\r
1403                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1404         {"???",             0,              0,          0,              0               },\r
1405         {"???",             0,              0,          0,              0               },\r
1406         {"???",             0,              0,          0,              0               },\r
1407         {"???",             0,              0,          0,              0               },\r
1408         {"???",             0,              0,          0,              0               },\r
1409         {"???",             0,              0,          0,              0               },\r
1410         {"???",             0,              0,          0,              0               },\r
1411         {"???",             0,              0,          0,              0               },\r
1412         {"???",             0,              0,          0,              0               },\r
1413         {"???",             0,              0,          0,              0               },\r
1414         {"???",             0,              0,          0,              0               },\r
1415         // 0x50\r
1416         {"???",             0,              0,          0,              0               },\r
1417         {"???",             0,              0,          0,              0               },\r
1418         {"???",             0,              0,          0,              0               },\r
1419         {"???",             0,              0,          0,              0               },\r
1420         {"???",             0,              0,          0,              0               },\r
1421         {"???",             0,              0,          0,              0               },\r
1422         {"???",             0,              0,          0,              0               },\r
1423         {"???",             0,              0,          0,              0               },\r
1424         {"???",             0,              0,          0,              0               },\r
1425         {"???",             0,              0,          0,              0               },\r
1426         {"???",             0,              0,          0,              0               },\r
1427         {"???",             0,              0,          0,              0               },\r
1428         {"???",             0,              0,          0,              0               },\r
1429         {"???",             0,              0,          0,              0               },\r
1430         {"???",             0,              0,          0,              0               },\r
1431         {"???",             0,              0,          0,              0               },\r
1432         // 0x60\r
1433         {"???\0"\r
1434                 "pcmestrm\0"\r
1435                 "???\0"\r
1436                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1437         {"???\0"\r
1438                 "pcmestri\0"\r
1439                 "???\0"\r
1440                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1441         {"???\0"\r
1442                 "pcmistrm\0"\r
1443                 "???\0"\r
1444                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1445         {"???\0"\r
1446                 "pcmistri\0"\r
1447                 "???\0"\r
1448                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1449         {"???",             0,              0,          0,              0               },\r
1450         {"???",             0,              0,          0,              0               },\r
1451         {"???",             0,              0,          0,              0               },\r
1452         {"???",             0,              0,          0,              0               },\r
1453         {"???",             0,              0,          0,              0               },\r
1454         {"???",             0,              0,          0,              0               },\r
1455         {"???",             0,              0,          0,              0               },\r
1456         {"???",             0,              0,          0,              0               },\r
1457         {"???",             0,              0,          0,              0               },\r
1458         {"???",             0,              0,          0,              0               },\r
1459         {"???",             0,              0,          0,              0               },\r
1460         {"???",             0,              0,          0,              0               },\r
1461         // 0x70\r
1462         {"???",             0,              0,          0,              0               },\r
1463         {"???",             0,              0,          0,              0               },\r
1464         {"???",             0,              0,          0,              0               },\r
1465         {"???",             0,              0,          0,              0               },\r
1466         {"???",             0,              0,          0,              0               },\r
1467         {"???",             0,              0,          0,              0               },\r
1468         {"???",             0,              0,          0,              0               },\r
1469         {"???",             0,              0,          0,              0               },\r
1470         {"???",             0,              0,          0,              0               },\r
1471         {"???",             0,              0,          0,              0               },\r
1472         {"???",             0,              0,          0,              0               },\r
1473         {"???",             0,              0,          0,              0               },\r
1474         {"???",             0,              0,          0,              0               },\r
1475         {"???",             0,              0,          0,              0               },\r
1476         {"???",             0,              0,          0,              0               },\r
1477         {"???",             0,              0,          0,              0               },\r
1478         // 0x80\r
1479         {"???",             0,              0,          0,              0               },\r
1480         {"???",             0,              0,          0,              0               },\r
1481         {"???",             0,              0,          0,              0               },\r
1482         {"???",             0,              0,          0,              0               },\r
1483         {"???",             0,              0,          0,              0               },\r
1484         {"???",             0,              0,          0,              0               },\r
1485         {"???",             0,              0,          0,              0               },\r
1486         {"???",             0,              0,          0,              0               },\r
1487         {"???",             0,              0,          0,              0               },\r
1488         {"???",             0,              0,          0,              0               },\r
1489         {"???",             0,              0,          0,              0               },\r
1490         {"???",             0,              0,          0,              0               },\r
1491         {"???",             0,              0,          0,              0               },\r
1492         {"???",             0,              0,          0,              0               },\r
1493         {"???",             0,              0,          0,              0               },\r
1494         {"???",             0,              0,          0,              0               },\r
1495         // 0x90\r
1496         {"???",             0,              0,          0,              0               },\r
1497         {"???",             0,              0,          0,              0               },\r
1498         {"???",             0,              0,          0,              0               },\r
1499         {"???",             0,              0,          0,              0               },\r
1500         {"???",             0,              0,          0,              0               },\r
1501         {"???",             0,              0,          0,              0               },\r
1502         {"???",             0,              0,          0,              0               },\r
1503         {"???",             0,              0,          0,              0               },\r
1504         {"???",             0,              0,          0,              0               },\r
1505         {"???",             0,              0,          0,              0               },\r
1506         {"???",             0,              0,          0,              0               },\r
1507         {"???",             0,              0,          0,              0               },\r
1508         {"???",             0,              0,          0,              0               },\r
1509         {"???",             0,              0,          0,              0               },\r
1510         {"???",             0,              0,          0,              0               },\r
1511         {"???",             0,              0,          0,              0               },\r
1512         // 0xa0\r
1513         {"???",             0,              0,          0,              0               },\r
1514         {"???",             0,              0,          0,              0               },\r
1515         {"???",             0,              0,          0,              0               },\r
1516         {"???",             0,              0,          0,              0               },\r
1517         {"???",             0,              0,          0,              0               },\r
1518         {"???",             0,              0,          0,              0               },\r
1519         {"???",             0,              0,          0,              0               },\r
1520         {"???",             0,              0,          0,              0               },\r
1521         {"???",             0,              0,          0,              0               },\r
1522         {"???",             0,              0,          0,              0               },\r
1523         {"???",             0,              0,          0,              0               },\r
1524         {"???",             0,              0,          0,              0               },\r
1525         {"???",             0,              0,          0,              0               },\r
1526         {"???",             0,              0,          0,              0               },\r
1527         {"???",             0,              0,          0,              0               },\r
1528         {"???",             0,              0,          0,              0               },\r
1529         // 0xb0\r
1530         {"???",             0,              0,          0,              0               },\r
1531         {"???",             0,              0,          0,              0               },\r
1532         {"???",             0,              0,          0,              0               },\r
1533         {"???",             0,              0,          0,              0               },\r
1534         {"???",             0,              0,          0,              0               },\r
1535         {"???",             0,              0,          0,              0               },\r
1536         {"???",             0,              0,          0,              0               },\r
1537         {"???",             0,              0,          0,              0               },\r
1538         {"???",             0,              0,          0,              0               },\r
1539         {"???",             0,              0,          0,              0               },\r
1540         {"???",             0,              0,          0,              0               },\r
1541         {"???",             0,              0,          0,              0               },\r
1542         {"???",             0,              0,          0,              0               },\r
1543         {"???",             0,              0,          0,              0               },\r
1544         {"???",             0,              0,          0,              0               },\r
1545         {"???",             0,              0,          0,              0               },\r
1546         // 0xc0\r
1547         {"???",             0,              0,          0,              0               },\r
1548         {"???",             0,              0,          0,              0               },\r
1549         {"???",             0,              0,          0,              0               },\r
1550         {"???",             0,              0,          0,              0               },\r
1551         {"???",             0,              0,          0,              0               },\r
1552         {"???",             0,              0,          0,              0               },\r
1553         {"???",             0,              0,          0,              0               },\r
1554         {"???",             0,              0,          0,              0               },\r
1555         {"???",             0,              0,          0,              0               },\r
1556         {"???",             0,              0,          0,              0               },\r
1557         {"???",             0,              0,          0,              0               },\r
1558         {"???",             0,              0,          0,              0               },\r
1559         {"???",             0,              0,          0,              0               },\r
1560         {"???",             0,              0,          0,              0               },\r
1561         {"???",             0,              0,          0,              0               },\r
1562         {"???",             0,              0,          0,              0               },\r
1563         // 0xd0\r
1564         {"???",             0,              0,          0,              0               },\r
1565         {"???",             0,              0,          0,              0               },\r
1566         {"???",             0,              0,          0,              0               },\r
1567         {"???",             0,              0,          0,              0               },\r
1568         {"???",             0,              0,          0,              0               },\r
1569         {"???",             0,              0,          0,              0               },\r
1570         {"???",             0,              0,          0,              0               },\r
1571         {"???",             0,              0,          0,              0               },\r
1572         {"???",             0,              0,          0,              0               },\r
1573         {"???",             0,              0,          0,              0               },\r
1574         {"???",             0,              0,          0,              0               },\r
1575         {"???",             0,              0,          0,              0               },\r
1576         {"???",             0,              0,          0,              0               },\r
1577         {"???",             0,              0,          0,              0               },\r
1578         {"???",             0,              0,          0,              0               },\r
1579         {"???\0"\r
1580                 "aeskeygenassist\0"\r
1581                 "???\0"\r
1582                 "???",              MODRM|VAR_NAME4,    PARAM_XMM,          PARAM_XMMM,         PARAM_UI8           },\r
1583         // 0xe0\r
1584         {"???",             0,              0,          0,              0               },\r
1585         {"???",             0,              0,          0,              0               },\r
1586         {"???",             0,              0,          0,              0               },\r
1587         {"???",             0,              0,          0,              0               },\r
1588         {"???",             0,              0,          0,              0               },\r
1589         {"???",             0,              0,          0,              0               },\r
1590         {"???",             0,              0,          0,              0               },\r
1591         {"???",             0,              0,          0,              0               },\r
1592         {"???",             0,              0,          0,              0               },\r
1593         {"???",             0,              0,          0,              0               },\r
1594         {"???",             0,              0,          0,              0               },\r
1595         {"???",             0,              0,          0,              0               },\r
1596         {"???",             0,              0,          0,              0               },\r
1597         {"???",             0,              0,          0,              0               },\r
1598         {"???",             0,              0,          0,              0               },\r
1599         {"???",             0,              0,          0,              0               },\r
1600         // 0xf0\r
1601         {"???",             0,              0,          0,              0               },\r
1602         {"???",             0,              0,          0,              0               },\r
1603         {"???",             0,              0,          0,              0               },\r
1604         {"???",             0,              0,          0,              0               },\r
1605         {"???",             0,              0,          0,              0               },\r
1606         {"???",             0,              0,          0,              0               },\r
1607         {"???",             0,              0,          0,              0               },\r
1608         {"???",             0,              0,          0,              0               },\r
1609         {"???",             0,              0,          0,              0               },\r
1610         {"???",             0,              0,          0,              0               },\r
1611         {"???",             0,              0,          0,              0               },\r
1612         {"???",             0,              0,          0,              0               },\r
1613         {"???",             0,              0,          0,              0               },\r
1614         {"???",             0,              0,          0,              0               },\r
1615         {"???",             0,              0,          0,              0               },\r
1616         {"???",             0,              0,          0,              0               },\r
1617 };\r
1618 \r
1619 static const I386_OPCODE group80_table[8] =\r
1620 {\r
1621         {"add",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1622         {"or",              0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1623         {"adc",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1624         {"sbb",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1625         {"and",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1626         {"sub",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1627         {"xor",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1628         {"cmp",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               }\r
1629 };\r
1630 \r
1631 static const I386_OPCODE group81_table[8] =\r
1632 {\r
1633         {"add",             0,              PARAM_RMPTR,        PARAM_IMM,          0               },\r
1634         {"or",              0,              PARAM_RMPTR,        PARAM_IMM,          0               },\r
1635         {"adc",             0,              PARAM_RMPTR,        PARAM_IMM,          0               },\r
1636         {"sbb",             0,              PARAM_RMPTR,        PARAM_IMM,          0               },\r
1637         {"and",             0,              PARAM_RMPTR,        PARAM_IMM,          0               },\r
1638         {"sub",             0,              PARAM_RMPTR,        PARAM_IMM,          0               },\r
1639         {"xor",             0,              PARAM_RMPTR,        PARAM_IMM,          0               },\r
1640         {"cmp",             0,              PARAM_RMPTR,        PARAM_IMM,          0               }\r
1641 };\r
1642 \r
1643 static const I386_OPCODE group83_table[8] =\r
1644 {\r
1645         {"add",             0,              PARAM_RMPTR,        PARAM_I8,           0               },\r
1646         {"or",              0,              PARAM_RMPTR,        PARAM_I8,           0               },\r
1647         {"adc",             0,              PARAM_RMPTR,        PARAM_I8,           0               },\r
1648         {"sbb",             0,              PARAM_RMPTR,        PARAM_I8,           0               },\r
1649         {"and",             0,              PARAM_RMPTR,        PARAM_I8,           0               },\r
1650         {"sub",             0,              PARAM_RMPTR,        PARAM_I8,           0               },\r
1651         {"xor",             0,              PARAM_RMPTR,        PARAM_I8,           0               },\r
1652         {"cmp",             0,              PARAM_RMPTR,        PARAM_I8,           0               }\r
1653 };\r
1654 \r
1655 static const I386_OPCODE groupC0_table[8] =\r
1656 {\r
1657         {"rol",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1658         {"ror",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1659         {"rcl",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1660         {"rcr",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1661         {"shl",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1662         {"shr",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1663         {"sal",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1664         {"sar",             0,              PARAM_RMPTR8,       PARAM_UI8,          0               }\r
1665 };\r
1666 \r
1667 static const I386_OPCODE groupC1_table[8] =\r
1668 {\r
1669         {"rol",             0,              PARAM_RMPTR,        PARAM_UI8,          0               },\r
1670         {"ror",             0,              PARAM_RMPTR,        PARAM_UI8,          0               },\r
1671         {"rcl",             0,              PARAM_RMPTR,        PARAM_UI8,          0               },\r
1672         {"rcr",             0,              PARAM_RMPTR,        PARAM_UI8,          0               },\r
1673         {"shl",             0,              PARAM_RMPTR,        PARAM_UI8,          0               },\r
1674         {"shr",             0,              PARAM_RMPTR,        PARAM_UI8,          0               },\r
1675         {"sal",             0,              PARAM_RMPTR,        PARAM_UI8,          0               },\r
1676         {"sar",             0,              PARAM_RMPTR,        PARAM_UI8,          0               }\r
1677 };\r
1678 \r
1679 static const I386_OPCODE groupD0_table[8] =\r
1680 {\r
1681         {"rol",             0,              PARAM_RMPTR8,       PARAM_1,            0               },\r
1682         {"ror",             0,              PARAM_RMPTR8,       PARAM_1,            0               },\r
1683         {"rcl",             0,              PARAM_RMPTR8,       PARAM_1,            0               },\r
1684         {"rcr",             0,              PARAM_RMPTR8,       PARAM_1,            0               },\r
1685         {"shl",             0,              PARAM_RMPTR8,       PARAM_1,            0               },\r
1686         {"shr",             0,              PARAM_RMPTR8,       PARAM_1,            0               },\r
1687         {"sal",             0,              PARAM_RMPTR8,       PARAM_1,            0               },\r
1688         {"sar",             0,              PARAM_RMPTR8,       PARAM_1,            0               }\r
1689 };\r
1690 \r
1691 static const I386_OPCODE groupD1_table[8] =\r
1692 {\r
1693         {"rol",             0,              PARAM_RMPTR,        PARAM_1,            0               },\r
1694         {"ror",             0,              PARAM_RMPTR,        PARAM_1,            0               },\r
1695         {"rcl",             0,              PARAM_RMPTR,        PARAM_1,            0               },\r
1696         {"rcr",             0,              PARAM_RMPTR,        PARAM_1,            0               },\r
1697         {"shl",             0,              PARAM_RMPTR,        PARAM_1,            0               },\r
1698         {"shr",             0,              PARAM_RMPTR,        PARAM_1,            0               },\r
1699         {"sal",             0,              PARAM_RMPTR,        PARAM_1,            0               },\r
1700         {"sar",             0,              PARAM_RMPTR,        PARAM_1,            0               }\r
1701 };\r
1702 \r
1703 static const I386_OPCODE groupD2_table[8] =\r
1704 {\r
1705         {"rol",             0,              PARAM_RMPTR8,       PARAM_CL,           0               },\r
1706         {"ror",             0,              PARAM_RMPTR8,       PARAM_CL,           0               },\r
1707         {"rcl",             0,              PARAM_RMPTR8,       PARAM_CL,           0               },\r
1708         {"rcr",             0,              PARAM_RMPTR8,       PARAM_CL,           0               },\r
1709         {"shl",             0,              PARAM_RMPTR8,       PARAM_CL,           0               },\r
1710         {"shr",             0,              PARAM_RMPTR8,       PARAM_CL,           0               },\r
1711         {"sal",             0,              PARAM_RMPTR8,       PARAM_CL,           0               },\r
1712         {"sar",             0,              PARAM_RMPTR8,       PARAM_CL,           0               }\r
1713 };\r
1714 \r
1715 static const I386_OPCODE groupD3_table[8] =\r
1716 {\r
1717         {"rol",             0,              PARAM_RMPTR,        PARAM_CL,           0               },\r
1718         {"ror",             0,              PARAM_RMPTR,        PARAM_CL,           0               },\r
1719         {"rcl",             0,              PARAM_RMPTR,        PARAM_CL,           0               },\r
1720         {"rcr",             0,              PARAM_RMPTR,        PARAM_CL,           0               },\r
1721         {"shl",             0,              PARAM_RMPTR,        PARAM_CL,           0               },\r
1722         {"shr",             0,              PARAM_RMPTR,        PARAM_CL,           0               },\r
1723         {"sal",             0,              PARAM_RMPTR,        PARAM_CL,           0               },\r
1724         {"sar",             0,              PARAM_RMPTR,        PARAM_CL,           0               }\r
1725 };\r
1726 \r
1727 static const I386_OPCODE groupF6_table[8] =\r
1728 {\r
1729         {"test",            0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1730         {"test",            0,              PARAM_RMPTR8,       PARAM_UI8,          0               },\r
1731         {"not",             0,              PARAM_RMPTR8,       0,                  0               },\r
1732         {"neg",             0,              PARAM_RMPTR8,       0,                  0               },\r
1733         {"mul",             0,              PARAM_RMPTR8,       0,                  0               },\r
1734         {"imul",            0,              PARAM_RMPTR8,       0,                  0               },\r
1735         {"div",             0,              PARAM_RMPTR8,       0,                  0               },\r
1736         {"idiv",            0,              PARAM_RMPTR8,       0,                  0               }\r
1737 };\r
1738 \r
1739 static const I386_OPCODE groupF7_table[8] =\r
1740 {\r
1741         {"test",            0,              PARAM_RMPTR,        PARAM_IMM,          0               },\r
1742         {"test",            0,              PARAM_RMPTR,        PARAM_IMM,          0               },\r
1743         {"not",             0,              PARAM_RMPTR,        0,                  0               },\r
1744         {"neg",             0,              PARAM_RMPTR,        0,                  0               },\r
1745         {"mul",             0,              PARAM_RMPTR,        0,                  0               },\r
1746         {"imul",            0,              PARAM_RMPTR,        0,                  0               },\r
1747         {"div",             0,              PARAM_RMPTR,        0,                  0               },\r
1748         {"idiv",            0,              PARAM_RMPTR,        0,                  0               }\r
1749 };\r
1750 \r
1751 static const I386_OPCODE groupFE_table[8] =\r
1752 {\r
1753         {"inc",             0,              PARAM_RMPTR8,       0,                  0               },\r
1754         {"dec",             0,              PARAM_RMPTR8,       0,                  0               },\r
1755         {"???",             0,              0,                  0,                  0               },\r
1756         {"???",             0,              0,                  0,                  0               },\r
1757         {"???",             0,              0,                  0,                  0               },\r
1758         {"???",             0,              0,                  0,                  0               },\r
1759         {"???",             0,              0,                  0,                  0               },\r
1760         {"???",             0,              0,                  0,                  0               }\r
1761 };\r
1762 \r
1763 static const I386_OPCODE groupFF_table[8] =\r
1764 {\r
1765         {"inc",             0,              PARAM_RMPTR,        0,                  0               },\r
1766         {"dec",             0,              PARAM_RMPTR,        0,                  0               },\r
1767         {"call",            ALWAYS64,       PARAM_RMPTR,        0,                  0,              DASMFLAG_STEP_OVER},\r
1768         {"call    far ptr ",0,              PARAM_RM,           0,                  0,              DASMFLAG_STEP_OVER},\r
1769         {"jmp",             ALWAYS64,       PARAM_RMPTR,        0,                  0               },\r
1770         {"jmp     far ptr ",0,              PARAM_RM,           0,                  0               },\r
1771         {"push",            0,              PARAM_RMPTR,        0,                  0               },\r
1772         {"???",             0,              0,                  0,                  0               }\r
1773 };\r
1774 \r
1775 static const I386_OPCODE group0F00_table[8] =\r
1776 {\r
1777         {"sldt",            0,              PARAM_RM,           0,                  0               },\r
1778         {"str",             0,              PARAM_RM,           0,                  0               },\r
1779         {"lldt",            0,              PARAM_RM,           0,                  0               },\r
1780         {"ltr",             0,              PARAM_RM,           0,                  0               },\r
1781         {"verr",            0,              PARAM_RM,           0,                  0               },\r
1782         {"verw",            0,              PARAM_RM,           0,                  0               },\r
1783         {"???",             0,              0,                  0,                  0               },\r
1784         {"???",             0,              0,                  0,                  0               }\r
1785 };\r
1786 \r
1787 static const I386_OPCODE group0F01_table[8] =\r
1788 {\r
1789         {"sgdt",            0,              PARAM_RM,           0,                  0               },\r
1790         {"sidt",            0,              PARAM_RM,           0,                  0               },\r
1791         {"lgdt",            0,              PARAM_RM,           0,                  0               },\r
1792         {"lidt",            0,              PARAM_RM,           0,                  0               },\r
1793         {"smsw",            0,              PARAM_RM,           0,                  0               },\r
1794         {"???",             0,              0,                  0,                  0               },\r
1795         {"lmsw",            0,              PARAM_RM,           0,                  0               },\r
1796         {"invlpg",          0,              PARAM_RM,           0,                  0               }\r
1797 };\r
1798 \r
1799 static const I386_OPCODE group0F0D_table[8] =\r
1800 {\r
1801         {"prefetch",        0,              PARAM_RM8,          0,                  0               },\r
1802         {"prefetchw",       0,              PARAM_RM8,          0,                  0               },\r
1803         {"???",             0,              0,                  0,                  0               },\r
1804         {"???",             0,              0,                  0,                  0               },\r
1805         {"???",             0,              0,                  0,                  0               },\r
1806         {"???",             0,              0,                  0,                  0               },\r
1807         {"???",             0,              0,                  0,                  0               },\r
1808         {"???",             0,              0,                  0,                  0               }\r
1809 };\r
1810 \r
1811 static const I386_OPCODE group0F18_table[8] =\r
1812 {\r
1813         {"prefetchnta",     0,              PARAM_RM8,          0,                  0               },\r
1814         {"prefetch0",       0,              PARAM_RM8,          0,                  0               },\r
1815         {"prefetch1",       0,              PARAM_RM8,          0,                  0               },\r
1816         {"prefetch2",       0,              PARAM_RM8,          0,                  0               },\r
1817         {"???",             0,              0,                  0,                  0               },\r
1818         {"???",             0,              0,                  0,                  0               },\r
1819         {"???",             0,              0,                  0,                  0               },\r
1820         {"???",             0,              0,                  0,                  0               }\r
1821 };\r
1822 \r
1823 static const I386_OPCODE group0F71_table[8] =\r
1824 {\r
1825         {"???",             0,              0,                  0,                  0               },\r
1826         {"???",             0,              0,                  0,                  0               },\r
1827         {"psrlw",           0,              PARAM_MMX2,         PARAM_UI8,          0               },\r
1828         {"???",             0,              0,                  0,                  0               },\r
1829         {"psraw",           0,              PARAM_MMX2,         PARAM_UI8,          0               },\r
1830         {"???",             0,              0,                  0,                  0               },\r
1831         {"psllw",           0,              PARAM_MMX2,         PARAM_UI8,          0               },\r
1832         {"???",             0,              0,                  0,                  0               }\r
1833 };\r
1834 \r
1835 static const I386_OPCODE group0F72_table[8] =\r
1836 {\r
1837         {"???",             0,              0,                  0,                  0               },\r
1838         {"???",             0,              0,                  0,                  0               },\r
1839         {"psrld",           0,              PARAM_MMX2,         PARAM_UI8,          0               },\r
1840         {"???",             0,              0,                  0,                  0               },\r
1841         {"psrad",           0,              PARAM_MMX2,         PARAM_UI8,          0               },\r
1842         {"???",             0,              0,                  0,                  0               },\r
1843         {"pslld",           0,              PARAM_MMX2,         PARAM_UI8,          0               },\r
1844         {"???",             0,              0,                  0,                  0               }\r
1845 };\r
1846 \r
1847 static const I386_OPCODE group0F73_table[8] =\r
1848 {\r
1849         {"???",             0,              0,                  0,                  0               },\r
1850         {"???",             0,              0,                  0,                  0               },\r
1851         {"psrlq",           0,              PARAM_MMX2,         PARAM_UI8,          0               },\r
1852         {"psrldq",          0,              PARAM_MMX2,         PARAM_UI8,          0               },\r
1853         {"???",             0,              0,                  0,                  0               },\r
1854         {"???",             0,              0,                  0,                  0               },\r
1855         {"psllq",           0,              PARAM_MMX2,         PARAM_UI8,          0               },\r
1856         {"pslldq",          0,              PARAM_MMX2,         PARAM_UI8,          0               },\r
1857 };\r
1858 \r
1859 static const I386_OPCODE group0FAE_table[8] =\r
1860 {\r
1861         {"fxsave",          0,              PARAM_RM,           0,                  0               },\r
1862         {"fxrstor",         0,              PARAM_RM,           0,                  0               },\r
1863         {"ldmxcsr",         0,              PARAM_RM,           0,                  0               },\r
1864         {"stmxscr",         0,              PARAM_RM,           0,                  0               },\r
1865         {"???",             0,              0,                  0,                  0               },\r
1866         {"lfence",          0,              0,                  0,                  0               },\r
1867         {"mfence",          0,              0,                  0,                  0               },\r
1868         {"sfence",          0,              0,                  0,                  0               }\r
1869 };\r
1870 \r
1871 \r
1872 static const I386_OPCODE group0FBA_table[8] =\r
1873 {\r
1874         {"???",             0,              0,                  0,                  0               },\r
1875         {"???",             0,              0,                  0,                  0               },\r
1876         {"???",             0,              0,                  0,                  0               },\r
1877         {"???",             0,              0,                  0,                  0               },\r
1878         {"bt",              0,              PARAM_RM,           PARAM_UI8,          0               },\r
1879         {"bts",             0,              PARAM_RM,           PARAM_UI8,          0               },\r
1880         {"btr",             0,              PARAM_RM,           PARAM_UI8,          0               },\r
1881         {"btc",             0,              PARAM_RM,           PARAM_UI8,          0               }\r
1882 };\r
1883 \r
1884 static const I386_OPCODE group0FC7_table[8] =\r
1885 {\r
1886         {"???",             0,              0,                  0,                  0               },\r
1887         {"cmpxchg8b",           MODRM,              PARAM_M64PTR,               0,                  0               },\r
1888         {"???",             0,              0,                  0,                  0               },\r
1889         {"???",             0,              0,                  0,                  0               },\r
1890         {"???",             0,              0,                  0,                  0               },\r
1891         {"???",             0,              0,                  0,                  0               },\r
1892         {"vmptrld\0"\r
1893                 "vmclear\0"\r
1894                 "???\0"\r
1895                 "vmxon",            MODRM|VAR_NAME4,        PARAM_M64PTR,               0,                  0               },\r
1896         {"vmptrtst",            MODRM,              PARAM_M64PTR,               0,                  0               }\r
1897 };\r
1898 \r
1899 static const GROUP_OP group_op_table[] =\r
1900 {\r
1901         { "group80",            group80_table           },\r
1902         { "group81",            group81_table           },\r
1903         { "group83",            group83_table           },\r
1904         { "groupC0",            groupC0_table           },\r
1905         { "groupC1",            groupC1_table           },\r
1906         { "groupD0",            groupD0_table           },\r
1907         { "groupD1",            groupD1_table           },\r
1908         { "groupD2",            groupD2_table           },\r
1909         { "groupD3",            groupD3_table           },\r
1910         { "groupF6",            groupF6_table           },\r
1911         { "groupF7",            groupF7_table           },\r
1912         { "groupFE",            groupFE_table           },\r
1913         { "groupFF",            groupFF_table           },\r
1914         { "group0F00",          group0F00_table         },\r
1915         { "group0F01",          group0F01_table         },\r
1916         { "group0F0D",          group0F0D_table         },\r
1917         { "group0F18",          group0F18_table         },\r
1918         { "group0F71",          group0F71_table         },\r
1919         { "group0F72",          group0F72_table         },\r
1920         { "group0F73",          group0F73_table         },\r
1921         { "group0FAE",          group0FAE_table         },\r
1922         { "group0FBA",          group0FBA_table         },\r
1923         { "group0FC7",          group0FC7_table         }\r
1924 };\r
1925 \r
1926 \r
1927 \r
1928 static const char *const i386_reg[3][16] =\r
1929 {\r
1930         {"ax",  "cx",  "dx",  "bx",  "sp",  "bp",  "si",  "di",  "r8w", "r9w", "r10w","r11w","r12w","r13w","r14w","r15w"},\r
1931         {"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "r8d", "r9d", "r10d","r11d","r12d","r13d","r14d","r15d"},\r
1932         {"rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15"}\r
1933 };\r
1934 \r
1935 static const char *const i386_reg8[8] = {"al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"};\r
1936 static const char *const i386_reg8rex[16] = {"al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil", "r8l", "r9l", "r10l", "r11l", "r12l", "r13l", "r14l", "r15l"};\r
1937 static const char *const i386_sreg[8] = {"es", "cs", "ss", "ds", "fs", "gs", "???", "???"};\r
1938 \r
1939 static int address_size;\r
1940 static int operand_size;\r
1941 static int address_prefix;\r
1942 static int operand_prefix;\r
1943 static int max_length;\r
1944 static UINT64 pc;\r
1945 static UINT8 modrm;\r
1946 static UINT32 segment;\r
1947 static offs_t dasm_flags;\r
1948 static char modrm_string[256];\r
1949 static UINT8 rex, regex, sibex, rmex;\r
1950 static UINT8 pre0f;\r
1951 static UINT8 curmode;\r
1952 \r
1953 #define MODRM_REG1  ((modrm >> 3) & 0x7)\r
1954 #define MODRM_REG2  (modrm & 0x7)\r
1955 \r
1956 INLINE UINT8 _FETCH(void)\r
1957 {\r
1958         if ((opcode_ptr - opcode_ptr_base) + 1 > max_length)\r
1959                 return 0xff;\r
1960         pc++;\r
1961         return *opcode_ptr++;\r
1962 }\r
1963 \r
1964 INLINE UINT16 _FETCH16(void)\r
1965 {\r
1966         UINT16 d;\r
1967         if ((opcode_ptr - opcode_ptr_base) + 2 > max_length)\r
1968                 return 0xffff;\r
1969         d = opcode_ptr[0] | (opcode_ptr[1] << 8);\r
1970         opcode_ptr += 2;\r
1971         pc += 2;\r
1972         return d;\r
1973 }\r
1974 \r
1975 INLINE UINT32 _FETCH32(void)\r
1976 {\r
1977         UINT32 d;\r
1978         if ((opcode_ptr - opcode_ptr_base) + 4 > max_length)\r
1979                 return 0xffffffff;\r
1980         d = opcode_ptr[0] | (opcode_ptr[1] << 8) | (opcode_ptr[2] << 16) | (opcode_ptr[3] << 24);\r
1981         opcode_ptr += 4;\r
1982         pc += 4;\r
1983         return d;\r
1984 }\r
1985 \r
1986 INLINE UINT8 _FETCHD(void)\r
1987 {\r
1988         if ((opcode_ptr - opcode_ptr_base) + 1 > max_length)\r
1989                 return 0xff;\r
1990         pc++;\r
1991         return *opcode_ptr++;\r
1992 }\r
1993 \r
1994 INLINE UINT16 _FETCHD16(void)\r
1995 {\r
1996         UINT16 d;\r
1997         if ((opcode_ptr - opcode_ptr_base) + 2 > max_length)\r
1998                 return 0xffff;\r
1999         d = opcode_ptr[0] | (opcode_ptr[1] << 8);\r
2000         opcode_ptr += 2;\r
2001         pc += 2;\r
2002         return d;\r
2003 }\r
2004 \r
2005 INLINE UINT32 _FETCHD32(void)\r
2006 {\r
2007         UINT32 d;\r
2008         if ((opcode_ptr - opcode_ptr_base) + 4 > max_length)\r
2009                 return 0xffffffff;\r
2010         d = opcode_ptr[0] | (opcode_ptr[1] << 8) | (opcode_ptr[2] << 16) | (opcode_ptr[3] << 24);\r
2011         opcode_ptr += 4;\r
2012         pc += 4;\r
2013         return d;\r
2014 }\r
2015 \r
2016 static char *hexstring(UINT32 value, int digits)\r
2017 {\r
2018         static char buffer[20];\r
2019         buffer[0] = '0';\r
2020         if (digits)\r
2021                 sprintf(&buffer[1], "%0*Xh", digits, value);\r
2022         else\r
2023                 sprintf(&buffer[1], "%Xh", value);\r
2024         return (buffer[1] >= '0' && buffer[1] <= '9') ? &buffer[1] : &buffer[0];\r
2025 }\r
2026 \r
2027 static char *hexstring64(UINT32 lo, UINT32 hi)\r
2028 {\r
2029         static char buffer[40];\r
2030         buffer[0] = '0';\r
2031         if (hi != 0)\r
2032                 sprintf(&buffer[1], "%X%08Xh", hi, lo);\r
2033         else\r
2034                 sprintf(&buffer[1], "%Xh", lo);\r
2035         return (buffer[1] >= '0' && buffer[1] <= '9') ? &buffer[1] : &buffer[0];\r
2036 }\r
2037 \r
2038 static char *hexstringpc(UINT64 pc)\r
2039 {\r
2040         if (curmode == 64)\r
2041                 return hexstring64((UINT32)pc, (UINT32)(pc >> 32));\r
2042         else\r
2043                 return hexstring((UINT32)pc, 0);\r
2044 }\r
2045 \r
2046 static char *shexstring(UINT32 value, int digits, int always)\r
2047 {\r
2048         static char buffer[20];\r
2049         if (value >= 0x80000000)\r
2050                 sprintf(buffer, "-%s", hexstring(-value, digits));\r
2051         else if (always)\r
2052                 sprintf(buffer, "+%s", hexstring(value, digits));\r
2053         else\r
2054                 return hexstring(value, digits);\r
2055         return buffer;\r
2056 }\r
2057 \r
2058 static char* handle_sib_byte( char* s, UINT8 mod )\r
2059 {\r
2060         UINT32 i32;\r
2061         UINT8 scale, i, base;\r
2062         UINT8 sib = _FETCHD();\r
2063 \r
2064         scale = (sib >> 6) & 0x3;\r
2065         i = ((sib >> 3) & 0x7) | sibex;\r
2066         base = (sib & 0x7) | rmex;\r
2067 \r
2068         if (base == 5 && mod == 0) {\r
2069                 i32 = _FETCH32();\r
2070                 s += sprintf( s, "%s", hexstring(i32, 0) );\r
2071         } else if (base != 5 || mod != 3)\r
2072                 s += sprintf( s, "%s", i386_reg[address_size][base] );\r
2073 \r
2074         if ( i != 4 ) {\r
2075                 s += sprintf( s, "+%s", i386_reg[address_size][i] );\r
2076                 if (scale)\r
2077                         s += sprintf( s, "*%d", 1 << scale );\r
2078         }\r
2079         return s;\r
2080 }\r
2081 \r
2082 static void handle_modrm(char* s)\r
2083 {\r
2084         INT8 disp8;\r
2085         INT16 disp16;\r
2086         INT32 disp32;\r
2087         UINT8 mod, rm;\r
2088 \r
2089         modrm = _FETCHD();\r
2090         mod = (modrm >> 6) & 0x3;\r
2091         rm = (modrm & 0x7) | rmex;\r
2092 \r
2093         if( modrm >= 0xc0 )\r
2094                 return;\r
2095 \r
2096         switch(segment)\r
2097         {\r
2098                 case SEG_CS: s += sprintf( s, "cs:" ); break;\r
2099                 case SEG_DS: s += sprintf( s, "ds:" ); break;\r
2100                 case SEG_ES: s += sprintf( s, "es:" ); break;\r
2101                 case SEG_FS: s += sprintf( s, "fs:" ); break;\r
2102                 case SEG_GS: s += sprintf( s, "gs:" ); break;\r
2103                 case SEG_SS: s += sprintf( s, "ss:" ); break;\r
2104         }\r
2105 \r
2106         s += sprintf( s, "[" );\r
2107         if( address_size == 2 ) {\r
2108                 if ((rm & 7) == 4)\r
2109                         s = handle_sib_byte( s, mod );\r
2110                 else if ((rm & 7) == 5 && mod == 0) {\r
2111                         disp32 = _FETCHD32();\r
2112                         s += sprintf( s, "rip%s", shexstring(disp32, 0, TRUE) );\r
2113                 } else\r
2114                         s += sprintf( s, "%s", i386_reg[2][rm]);\r
2115                 if( mod == 1 ) {\r
2116                         disp8 = _FETCHD();\r
2117                         if (disp8 != 0)\r
2118                                 s += sprintf( s, "%s", shexstring((INT32)disp8, 0, TRUE) );\r
2119                 } else if( mod == 2 ) {\r
2120                         disp32 = _FETCHD32();\r
2121                         if (disp32 != 0)\r
2122                                 s += sprintf( s, "%s", shexstring(disp32, 0, TRUE) );\r
2123                 }\r
2124         } else if (address_size == 1) {\r
2125                 if ((rm & 7) == 4)\r
2126                         s = handle_sib_byte( s, mod );\r
2127                 else if ((rm & 7) == 5 && mod == 0) {\r
2128                         disp32 = _FETCHD32();\r
2129                         if (curmode == 64)\r
2130                                 s += sprintf( s, "eip%s", shexstring(disp32, 0, TRUE) );\r
2131                         else\r
2132                                 s += sprintf( s, "%s", hexstring(disp32, 0) );\r
2133                 } else\r
2134                         s += sprintf( s, "%s", i386_reg[1][rm]);\r
2135                 if( mod == 1 ) {\r
2136                         disp8 = _FETCHD();\r
2137                         if (disp8 != 0)\r
2138                                 s += sprintf( s, "%s", shexstring((INT32)disp8, 0, TRUE) );\r
2139                 } else if( mod == 2 ) {\r
2140                         disp32 = _FETCHD32();\r
2141                         if (disp32 != 0)\r
2142                                 s += sprintf( s, "%s", shexstring(disp32, 0, TRUE) );\r
2143                 }\r
2144         } else {\r
2145                 switch( rm )\r
2146                 {\r
2147                         case 0: s += sprintf( s, "bx+si" ); break;\r
2148                         case 1: s += sprintf( s, "bx+di" ); break;\r
2149                         case 2: s += sprintf( s, "bp+si" ); break;\r
2150                         case 3: s += sprintf( s, "bp+di" ); break;\r
2151                         case 4: s += sprintf( s, "si" ); break;\r
2152                         case 5: s += sprintf( s, "di" ); break;\r
2153                         case 6:\r
2154                                 if( mod == 0 ) {\r
2155                                         disp16 = _FETCHD16();\r
2156                                         s += sprintf( s, "%s", hexstring((unsigned) (UINT16) disp16, 0) );\r
2157                                 } else {\r
2158                                         s += sprintf( s, "bp" );\r
2159                                 }\r
2160                                 break;\r
2161                         case 7: s += sprintf( s, "bx" ); break;\r
2162                 }\r
2163                 if( mod == 1 ) {\r
2164                         disp8 = _FETCHD();\r
2165                         if (disp8 != 0)\r
2166                                 s += sprintf( s, "%s", shexstring((INT32)disp8, 0, TRUE) );\r
2167                 } else if( mod == 2 ) {\r
2168                         disp16 = _FETCHD16();\r
2169                         if (disp16 != 0)\r
2170                                 s += sprintf( s, "%s", shexstring((INT32)disp16, 0, TRUE) );\r
2171                 }\r
2172         }\r
2173         s += sprintf( s, "]" );\r
2174 }\r
2175 \r
2176 static char* handle_param(char* s, UINT32 param)\r
2177 {\r
2178         UINT8 i8;\r
2179         UINT16 i16;\r
2180         UINT32 i32;\r
2181         UINT16 ptr;\r
2182         UINT32 addr;\r
2183         INT8 d8;\r
2184         INT16 d16;\r
2185         INT32 d32;\r
2186 \r
2187         switch(param)\r
2188         {\r
2189                 case PARAM_REG:\r
2190                         s += sprintf( s, "%s", i386_reg[operand_size][MODRM_REG1 | regex] );\r
2191                         break;\r
2192 \r
2193                 case PARAM_REG8:\r
2194                         s += sprintf( s, "%s", (rex ? i386_reg8rex : i386_reg8)[MODRM_REG1 | regex] );\r
2195                         break;\r
2196 \r
2197                 case PARAM_REG16:\r
2198                         s += sprintf( s, "%s", i386_reg[0][MODRM_REG1 | regex] );\r
2199                         break;\r
2200 \r
2201                 case PARAM_REG32:\r
2202                         s += sprintf( s, "%s", i386_reg[1][MODRM_REG1 | regex] );\r
2203                         break;\r
2204 \r
2205                 case PARAM_REG3264:\r
2206                         s += sprintf( s, "%s", i386_reg[(operand_size == 2) ? 2 : 1][MODRM_REG1 | regex] );\r
2207                         break;\r
2208 \r
2209                 case PARAM_MMX:\r
2210                         if (pre0f == 0x66 || pre0f == 0xf2 || pre0f == 0xf3)\r
2211                                 s += sprintf( s, "xmm%d", MODRM_REG1 | regex );\r
2212                         else\r
2213                                 s += sprintf( s, "mm%d", MODRM_REG1 | regex );\r
2214                         break;\r
2215 \r
2216                 case PARAM_MMX2:\r
2217                         if (pre0f == 0x66 || pre0f == 0xf2 || pre0f == 0xf3)\r
2218                                 s += sprintf( s, "xmm%d", MODRM_REG2 | regex );\r
2219                         else\r
2220                                 s += sprintf( s, "mm%d", MODRM_REG2 | regex );\r
2221                         break;\r
2222 \r
2223                 case PARAM_XMM:\r
2224                         s += sprintf( s, "xmm%d", MODRM_REG1 | regex );\r
2225                         break;\r
2226 \r
2227                 case PARAM_REGORXMM:\r
2228                         if (pre0f != 0xf2 && pre0f != 0xf3)\r
2229                                 s += sprintf( s, "xmm%d", MODRM_REG1 | regex );\r
2230                         else\r
2231                                 s += sprintf( s, "%s", i386_reg[(operand_size == 2) ? 2 : 1][MODRM_REG1 | regex] );\r
2232                         break;\r
2233 \r
2234                 case PARAM_REG2_32:\r
2235                         s += sprintf( s, "%s", i386_reg[1][MODRM_REG2 | rmex] );\r
2236                         break;\r
2237 \r
2238                 case PARAM_RM:\r
2239                 case PARAM_RMPTR:\r
2240                         if( modrm >= 0xc0 ) {\r
2241                                 s += sprintf( s, "%s", i386_reg[operand_size][MODRM_REG2 | rmex] );\r
2242                         } else {\r
2243                                 if (param == PARAM_RMPTR)\r
2244                                 {\r
2245                                         if( operand_size == 2 )\r
2246                                                 s += sprintf( s, "qword ptr " );\r
2247                                         else if (operand_size == 1)\r
2248                                                 s += sprintf( s, "dword ptr " );\r
2249                                         else\r
2250                                                 s += sprintf( s, "word ptr " );\r
2251                                 }\r
2252                                 s += sprintf( s, "%s", modrm_string );\r
2253                         }\r
2254                         break;\r
2255 \r
2256                 case PARAM_RM8:\r
2257                 case PARAM_RMPTR8:\r
2258                         if( modrm >= 0xc0 ) {\r
2259                                 s += sprintf( s, "%s", (rex ? i386_reg8rex : i386_reg8)[MODRM_REG2 | rmex] );\r
2260                         } else {\r
2261                                 if (param == PARAM_RMPTR8)\r
2262                                         s += sprintf( s, "byte ptr " );\r
2263                                 s += sprintf( s, "%s", modrm_string );\r
2264                         }\r
2265                         break;\r
2266 \r
2267                 case PARAM_RM16:\r
2268                 case PARAM_RMPTR16:\r
2269                         if( modrm >= 0xc0 ) {\r
2270                                 s += sprintf( s, "%s", i386_reg[0][MODRM_REG2 | rmex] );\r
2271                         } else {\r
2272                                 if (param == PARAM_RMPTR16)\r
2273                                         s += sprintf( s, "word ptr " );\r
2274                                 s += sprintf( s, "%s", modrm_string );\r
2275                         }\r
2276                         break;\r
2277 \r
2278                 case PARAM_RM32:\r
2279                 case PARAM_RMPTR32:\r
2280                         if( modrm >= 0xc0 ) {\r
2281                                 s += sprintf( s, "%s", i386_reg[1][MODRM_REG2 | rmex] );\r
2282                         } else {\r
2283                                 if (param == PARAM_RMPTR32)\r
2284                                         s += sprintf( s, "dword ptr " );\r
2285                                 s += sprintf( s, "%s", modrm_string );\r
2286                         }\r
2287                         break;\r
2288 \r
2289                 case PARAM_RMXMM:\r
2290                         if( modrm >= 0xc0 ) {\r
2291                                 if (pre0f != 0xf2 && pre0f != 0xf3)\r
2292                                         s += sprintf( s, "xmm%d", MODRM_REG2 | rmex );\r
2293                                 else\r
2294                                         s += sprintf( s, "%s", i386_reg[(operand_size == 2) ? 2 : 1][MODRM_REG2 | rmex] );\r
2295                         } else {\r
2296                                 if (param == PARAM_RMPTR32)\r
2297                                         s += sprintf( s, "dword ptr " );\r
2298                                 s += sprintf( s, "%s", modrm_string );\r
2299                         }\r
2300                         break;\r
2301 \r
2302                 case PARAM_M64:\r
2303                 case PARAM_M64PTR:\r
2304                         if( modrm >= 0xc0 ) {\r
2305                                 s += sprintf( s, "???" );\r
2306                         } else {\r
2307                                 if (param == PARAM_M64PTR)\r
2308                                         s += sprintf( s, "qword ptr " );\r
2309                                 s += sprintf( s, "%s", modrm_string );\r
2310                         }\r
2311                         break;\r
2312 \r
2313                 case PARAM_MMXM:\r
2314                         if( modrm >= 0xc0 ) {\r
2315                                 if (pre0f == 0x66 || pre0f == 0xf2 || pre0f == 0xf3)\r
2316                                         s += sprintf( s, "xmm%d", MODRM_REG2 | rmex );\r
2317                                 else\r
2318                                         s += sprintf( s, "mm%d", MODRM_REG2 | rmex );\r
2319                         } else {\r
2320                                 s += sprintf( s, "%s", modrm_string );\r
2321                         }\r
2322                         break;\r
2323 \r
2324                 case PARAM_XMMM:\r
2325                         if( modrm >= 0xc0 ) {\r
2326                                 s += sprintf( s, "xmm%d", MODRM_REG2 | rmex );\r
2327                         } else {\r
2328                                 s += sprintf( s, "%s", modrm_string );\r
2329                         }\r
2330                         break;\r
2331 \r
2332                 case PARAM_I4:\r
2333                         i8 = _FETCHD();\r
2334                         s += sprintf( s, "%d", i8 & 0x0f );\r
2335                         break;\r
2336 \r
2337                 case PARAM_I8:\r
2338                         i8 = _FETCHD();\r
2339                         s += sprintf( s, "%s", shexstring((INT8)i8, 0, FALSE) );\r
2340                         break;\r
2341 \r
2342                 case PARAM_I16:\r
2343                         i16 = _FETCHD16();\r
2344                         s += sprintf( s, "%s", shexstring((INT16)i16, 0, FALSE) );\r
2345                         break;\r
2346 \r
2347                 case PARAM_UI8:\r
2348                         i8 = _FETCHD();\r
2349                         s += sprintf( s, "%s", shexstring((UINT8)i8, 0, FALSE) );\r
2350                         break;\r
2351 \r
2352                 case PARAM_UI16:\r
2353                         i16 = _FETCHD16();\r
2354                         s += sprintf( s, "%s", shexstring((UINT16)i16, 0, FALSE) );\r
2355                         break;\r
2356 \r
2357                 case PARAM_IMM64:\r
2358                         if (operand_size == 2) {\r
2359                                 UINT32 lo32 = _FETCHD32();\r
2360                                 i32 = _FETCHD32();\r
2361                                 s += sprintf( s, "%s", hexstring64(lo32, i32) );\r
2362                         } else if( operand_size ) {\r
2363                                 i32 = _FETCHD32();\r
2364                                 s += sprintf( s, "%s", hexstring(i32, 0) );\r
2365                         } else {\r
2366                                 i16 = _FETCHD16();\r
2367                                 s += sprintf( s, "%s", hexstring(i16, 0) );\r
2368                         }\r
2369                         break;\r
2370 \r
2371                 case PARAM_IMM:\r
2372                         if( operand_size ) {\r
2373                                 i32 = _FETCHD32();\r
2374                                 s += sprintf( s, "%s", hexstring(i32, 0) );\r
2375                         } else {\r
2376                                 i16 = _FETCHD16();\r
2377                                 s += sprintf( s, "%s", hexstring(i16, 0) );\r
2378                         }\r
2379                         break;\r
2380 \r
2381                 case PARAM_ADDR:\r
2382                         if( operand_size ) {\r
2383                                 addr = _FETCHD32();\r
2384                                 ptr = _FETCHD16();\r
2385                                 s += sprintf( s, "%s:", hexstring(ptr, 4) );\r
2386                                 s += sprintf( s, "%s", hexstring(addr, 0) );\r
2387                         } else {\r
2388                                 addr = _FETCHD16();\r
2389                                 ptr = _FETCHD16();\r
2390                                 s += sprintf( s, "%s:", hexstring(ptr, 4) );\r
2391                                 s += sprintf( s, "%s", hexstring(addr, 0) );\r
2392                         }\r
2393                         break;\r
2394 \r
2395                 case PARAM_REL:\r
2396                         if( operand_size ) {\r
2397                                 d32 = _FETCHD32();\r
2398                                 s += sprintf( s, "%s", hexstringpc(pc + d32) );\r
2399                         } else {\r
2400                                 /* make sure to keep the relative offset within the segment */\r
2401                                 d16 = _FETCHD16();\r
2402                                 s += sprintf( s, "%s", hexstringpc((pc & 0xFFFF0000) | ((pc + d16) & 0x0000FFFF)) );\r
2403                         }\r
2404                         break;\r
2405 \r
2406                 case PARAM_REL8:\r
2407                         d8 = _FETCHD();\r
2408                         s += sprintf( s, "%s", hexstringpc(pc + d8) );\r
2409                         break;\r
2410 \r
2411                 case PARAM_MEM_OFFS:\r
2412                         switch(segment)\r
2413                         {\r
2414                                 case SEG_CS: s += sprintf( s, "cs:" ); break;\r
2415                                 case SEG_DS: s += sprintf( s, "ds:" ); break;\r
2416                                 case SEG_ES: s += sprintf( s, "es:" ); break;\r
2417                                 case SEG_FS: s += sprintf( s, "fs:" ); break;\r
2418                                 case SEG_GS: s += sprintf( s, "gs:" ); break;\r
2419                                 case SEG_SS: s += sprintf( s, "ss:" ); break;\r
2420                         }\r
2421 \r
2422                         if( address_size ) {\r
2423                                 i32 = _FETCHD32();\r
2424                                 s += sprintf( s, "[%s]", hexstring(i32, 0) );\r
2425                         } else {\r
2426                                 i16 = _FETCHD16();\r
2427                                 s += sprintf( s, "[%s]", hexstring(i16, 0) );\r
2428                         }\r
2429                         break;\r
2430 \r
2431                 case PARAM_PREIMP:\r
2432                         switch(segment)\r
2433                         {\r
2434                                 case SEG_CS: s += sprintf( s, "cs:" ); break;\r
2435                                 case SEG_DS: s += sprintf( s, "ds:" ); break;\r
2436                                 case SEG_ES: s += sprintf( s, "es:" ); break;\r
2437                                 case SEG_FS: s += sprintf( s, "fs:" ); break;\r
2438                                 case SEG_GS: s += sprintf( s, "gs:" ); break;\r
2439                                 case SEG_SS: s += sprintf( s, "ss:" ); break;\r
2440                         }\r
2441                         break;\r
2442 \r
2443                 case PARAM_SREG:\r
2444                         s += sprintf( s, "%s", i386_sreg[MODRM_REG1] );\r
2445                         break;\r
2446 \r
2447                 case PARAM_CREG:\r
2448                         s += sprintf( s, "cr%d", MODRM_REG1 | regex );\r
2449                         break;\r
2450 \r
2451                 case PARAM_TREG:\r
2452                         s += sprintf( s, "tr%d", MODRM_REG1 | regex );\r
2453                         break;\r
2454 \r
2455                 case PARAM_DREG:\r
2456                         s += sprintf( s, "dr%d", MODRM_REG1 | regex );\r
2457                         break;\r
2458 \r
2459                 case PARAM_1:\r
2460                         s += sprintf( s, "1" );\r
2461                         break;\r
2462 \r
2463                 case PARAM_DX:\r
2464                         s += sprintf( s, "dx" );\r
2465                         break;\r
2466 \r
2467                 case PARAM_XMM0:\r
2468                         s += sprintf( s, "xmm0" );\r
2469                         break;\r
2470 \r
2471                 case PARAM_AL: s += sprintf( s, "al" ); break;\r
2472                 case PARAM_CL: s += sprintf( s, "cl" ); break;\r
2473                 case PARAM_DL: s += sprintf( s, "dl" ); break;\r
2474                 case PARAM_BL: s += sprintf( s, "bl" ); break;\r
2475                 case PARAM_AH: s += sprintf( s, "ah" ); break;\r
2476                 case PARAM_CH: s += sprintf( s, "ch" ); break;\r
2477                 case PARAM_DH: s += sprintf( s, "dh" ); break;\r
2478                 case PARAM_BH: s += sprintf( s, "bh" ); break;\r
2479 \r
2480                 case PARAM_EAX: s += sprintf( s, "%s", i386_reg[operand_size][0 | rmex] ); break;\r
2481                 case PARAM_ECX: s += sprintf( s, "%s", i386_reg[operand_size][1 | rmex] ); break;\r
2482                 case PARAM_EDX: s += sprintf( s, "%s", i386_reg[operand_size][2 | rmex] ); break;\r
2483                 case PARAM_EBX: s += sprintf( s, "%s", i386_reg[operand_size][3 | rmex] ); break;\r
2484                 case PARAM_ESP: s += sprintf( s, "%s", i386_reg[operand_size][4 | rmex] ); break;\r
2485                 case PARAM_EBP: s += sprintf( s, "%s", i386_reg[operand_size][5 | rmex] ); break;\r
2486                 case PARAM_ESI: s += sprintf( s, "%s", i386_reg[operand_size][6 | rmex] ); break;\r
2487                 case PARAM_EDI: s += sprintf( s, "%s", i386_reg[operand_size][7 | rmex] ); break;\r
2488         }\r
2489         return s;\r
2490 }\r
2491 \r
2492 static void handle_fpu(char *s, UINT8 op1, UINT8 op2)\r
2493 {\r
2494         switch (op1 & 0x7)\r
2495         {\r
2496                 case 0:     // Group D8\r
2497                 {\r
2498                         if (op2 < 0xc0)\r
2499                         {\r
2500                                 pc--;       // adjust fetch pointer, so modrm byte read again\r
2501                                 opcode_ptr--;\r
2502                                 handle_modrm( modrm_string );\r
2503                                 switch ((op2 >> 3) & 0x7)\r
2504                                 {\r
2505                                         case 0: sprintf(s, "fadd    dword ptr %s", modrm_string); break;\r
2506                                         case 1: sprintf(s, "fmul    dword ptr %s", modrm_string); break;\r
2507                                         case 2: sprintf(s, "fcom    dword ptr %s", modrm_string); break;\r
2508                                         case 3: sprintf(s, "fcomp   dword ptr %s", modrm_string); break;\r
2509                                         case 4: sprintf(s, "fsub    dword ptr %s", modrm_string); break;\r
2510                                         case 5: sprintf(s, "fsubr   dword ptr %s", modrm_string); break;\r
2511                                         case 6: sprintf(s, "fdiv    dword ptr %s", modrm_string); break;\r
2512                                         case 7: sprintf(s, "fdivr   dword ptr %s", modrm_string); break;\r
2513                                 }\r
2514                         }\r
2515                         else\r
2516                         {\r
2517                                 switch ((op2 >> 3) & 0x7)\r
2518                                 {\r
2519                                         case 0: sprintf(s, "fadd    st(0),st(%d)", op2 & 0x7); break;\r
2520                                         case 1: sprintf(s, "fmul    st(0),st(%d)", op2 & 0x7); break;\r
2521                                         case 2: sprintf(s, "fcom    st(0),st(%d)", op2 & 0x7); break;\r
2522                                         case 3: sprintf(s, "fcomp   st(0),st(%d)", op2 & 0x7); break;\r
2523                                         case 4: sprintf(s, "fsub    st(0),st(%d)", op2 & 0x7); break;\r
2524                                         case 5: sprintf(s, "fsubr   st(0),st(%d)", op2 & 0x7); break;\r
2525                                         case 6: sprintf(s, "fdiv    st(0),st(%d)", op2 & 0x7); break;\r
2526                                         case 7: sprintf(s, "fdivr   st(0),st(%d)", op2 & 0x7); break;\r
2527                                 }\r
2528                         }\r
2529                         break;\r
2530                 }\r
2531 \r
2532                 case 1:     // Group D9\r
2533                 {\r
2534                         if (op2 < 0xc0)\r
2535                         {\r
2536                                 pc--;       // adjust fetch pointer, so modrm byte read again\r
2537                                 opcode_ptr--;\r
2538                                 handle_modrm( modrm_string );\r
2539                                 switch ((op2 >> 3) & 0x7)\r
2540                                 {\r
2541                                         case 0: sprintf(s, "fld     dword ptr %s", modrm_string); break;\r
2542                                         case 1: sprintf(s, "??? (FPU)"); break;\r
2543                                         case 2: sprintf(s, "fst     dword ptr %s", modrm_string); break;\r
2544                                         case 3: sprintf(s, "fstp    dword ptr %s", modrm_string); break;\r
2545                                         case 4: sprintf(s, "fldenv  word ptr %s", modrm_string); break;\r
2546                                         case 5: sprintf(s, "fldcw   word ptr %s", modrm_string); break;\r
2547                                         case 6: sprintf(s, "fstenv  word ptr %s", modrm_string); break;\r
2548                                         case 7: sprintf(s, "fstcw   word ptr %s", modrm_string); break;\r
2549                                 }\r
2550                         }\r
2551                         else\r
2552                         {\r
2553                                 switch (op2 & 0x3f)\r
2554                                 {\r
2555                                         case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:\r
2556                                                 sprintf(s, "fld     st(0),st(%d)", op2 & 0x7); break;\r
2557 \r
2558                                         case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:\r
2559                                                 sprintf(s, "fxch    st(0),st(%d)", op2 & 0x7); break;\r
2560 \r
2561                                         case 0x10: sprintf(s, "fnop"); break;\r
2562                                         case 0x20: sprintf(s, "fchs"); break;\r
2563                                         case 0x21: sprintf(s, "fabs"); break;\r
2564                                         case 0x24: sprintf(s, "ftst"); break;\r
2565                                         case 0x25: sprintf(s, "fxam"); break;\r
2566                                         case 0x28: sprintf(s, "fld1"); break;\r
2567                                         case 0x29: sprintf(s, "fldl2t"); break;\r
2568                                         case 0x2a: sprintf(s, "fldl2e"); break;\r
2569                                         case 0x2b: sprintf(s, "fldpi"); break;\r
2570                                         case 0x2c: sprintf(s, "fldlg2"); break;\r
2571                                         case 0x2d: sprintf(s, "fldln2"); break;\r
2572                                         case 0x2e: sprintf(s, "fldz"); break;\r
2573                                         case 0x30: sprintf(s, "f2xm1"); break;\r
2574                                         case 0x31: sprintf(s, "fyl2x"); break;\r
2575                                         case 0x32: sprintf(s, "fptan"); break;\r
2576                                         case 0x33: sprintf(s, "fpatan"); break;\r
2577                                         case 0x34: sprintf(s, "fxtract"); break;\r
2578                                         case 0x35: sprintf(s, "fprem1"); break;\r
2579                                         case 0x36: sprintf(s, "fdecstp"); break;\r
2580                                         case 0x37: sprintf(s, "fincstp"); break;\r
2581                                         case 0x38: sprintf(s, "fprem"); break;\r
2582                                         case 0x39: sprintf(s, "fyl2xp1"); break;\r
2583                                         case 0x3a: sprintf(s, "fsqrt"); break;\r
2584                                         case 0x3b: sprintf(s, "fsincos"); break;\r
2585                                         case 0x3c: sprintf(s, "frndint"); break;\r
2586                                         case 0x3d: sprintf(s, "fscale"); break;\r
2587                                         case 0x3e: sprintf(s, "fsin"); break;\r
2588                                         case 0x3f: sprintf(s, "fcos"); break;\r
2589 \r
2590                                         default: sprintf(s, "??? (FPU)"); break;\r
2591                                 }\r
2592                         }\r
2593                         break;\r
2594                 }\r
2595 \r
2596                 case 2:     // Group DA\r
2597                 {\r
2598                         if (op2 < 0xc0)\r
2599                         {\r
2600                                 pc--;       // adjust fetch pointer, so modrm byte read again\r
2601                                 opcode_ptr--;\r
2602                                 handle_modrm( modrm_string );\r
2603                                 switch ((op2 >> 3) & 0x7)\r
2604                                 {\r
2605                                         case 0: sprintf(s, "fiadd   dword ptr %s", modrm_string); break;\r
2606                                         case 1: sprintf(s, "fimul   dword ptr %s", modrm_string); break;\r
2607                                         case 2: sprintf(s, "ficom   dword ptr %s", modrm_string); break;\r
2608                                         case 3: sprintf(s, "ficomp  dword ptr %s", modrm_string); break;\r
2609                                         case 4: sprintf(s, "fisub   dword ptr %s", modrm_string); break;\r
2610                                         case 5: sprintf(s, "fisubr  dword ptr %s", modrm_string); break;\r
2611                                         case 6: sprintf(s, "fidiv   dword ptr %s", modrm_string); break;\r
2612                                         case 7: sprintf(s, "fidivr  dword ptr %s", modrm_string); break;\r
2613                                 }\r
2614                         }\r
2615                         else\r
2616                         {\r
2617                                 switch (op2 & 0x3f)\r
2618                                 {\r
2619                                         case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:\r
2620                                                 sprintf(s, "fcmovb  st(0),st(%d)", op2 & 0x7); break;\r
2621 \r
2622                                         case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:\r
2623                                                 sprintf(s, "fcmove  st(0),st(%d)", op2 & 0x7); break;\r
2624 \r
2625                                         case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:\r
2626                                                 sprintf(s, "fcmovbe st(0),st(%d)", op2 & 0x7); break;\r
2627 \r
2628                                         case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:\r
2629                                                 sprintf(s, "fcmovu  st(0),st(%d)", op2 & 0x7); break;\r
2630                                         case 0x29:\r
2631                                                 sprintf(s, "fucompp"); break;\r
2632 \r
2633                                         default: sprintf(s, "??? (FPU)"); break;\r
2634 \r
2635                                 }\r
2636                         }\r
2637                         break;\r
2638                 }\r
2639 \r
2640                 case 3:     // Group DB\r
2641                 {\r
2642                         if (op2 < 0xc0)\r
2643                         {\r
2644                                 pc--;       // adjust fetch pointer, so modrm byte read again\r
2645                                 opcode_ptr--;\r
2646                                 handle_modrm( modrm_string );\r
2647                                 switch ((op2 >> 3) & 0x7)\r
2648                                 {\r
2649                                         case 0: sprintf(s, "fild    dword ptr %s", modrm_string); break;\r
2650                                         case 1: sprintf(s, "fisttp  dword ptr %s", modrm_string); break;\r
2651                                         case 2: sprintf(s, "fist    dword ptr %s", modrm_string); break;\r
2652                                         case 3: sprintf(s, "fistp   dword ptr %s", modrm_string); break;\r
2653                                         case 4: sprintf(s, "??? (FPU)"); break;\r
2654                                         case 5: sprintf(s, "fld     tword ptr %s", modrm_string); break;\r
2655                                         case 6: sprintf(s, "??? (FPU)"); break;\r
2656                                         case 7: sprintf(s, "fstp    tword ptr %s", modrm_string); break;\r
2657                                 }\r
2658                         }\r
2659                         else\r
2660                         {\r
2661                                 switch (op2 & 0x3f)\r
2662                                 {\r
2663                                         case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:\r
2664                                                 sprintf(s, "fcmovnb st(0),st(%d)", op2 & 0x7); break;\r
2665 \r
2666                                         case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:\r
2667                                                 sprintf(s, "fcmovne st(0),st(%d)", op2 & 0x7); break;\r
2668 \r
2669                                         case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:\r
2670                                                 sprintf(s, "fcmovnbe st(0),st(%d)", op2 & 0x7); break;\r
2671 \r
2672                                         case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:\r
2673                                                 sprintf(s, "fcmovnu st(0),st(%d)", op2 & 0x7); break;\r
2674 \r
2675                                         case 0x22: sprintf(s, "fclex"); break;\r
2676                                         case 0x23: sprintf(s, "finit"); break;\r
2677 \r
2678                                         case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:\r
2679                                                 sprintf(s, "fucomi  st(0),st(%d)", op2 & 0x7); break;\r
2680 \r
2681                                         case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:\r
2682                                                 sprintf(s, "fcomi   st(0),st(%d)", op2 & 0x7); break;\r
2683 \r
2684                                         default: sprintf(s, "??? (FPU)"); break;\r
2685                                 }\r
2686                         }\r
2687                         break;\r
2688                 }\r
2689 \r
2690                 case 4:     // Group DC\r
2691                 {\r
2692                         if (op2 < 0xc0)\r
2693                         {\r
2694                                 pc--;       // adjust fetch pointer, so modrm byte read again\r
2695                                 opcode_ptr--;\r
2696                                 handle_modrm( modrm_string );\r
2697                                 switch ((op2 >> 3) & 0x7)\r
2698                                 {\r
2699                                         case 0: sprintf(s, "fadd    qword ptr %s", modrm_string); break;\r
2700                                         case 1: sprintf(s, "fmul    qword ptr %s", modrm_string); break;\r
2701                                         case 2: sprintf(s, "fcom    qword ptr %s", modrm_string); break;\r
2702                                         case 3: sprintf(s, "fcomp   qword ptr %s", modrm_string); break;\r
2703                                         case 4: sprintf(s, "fsub    qword ptr %s", modrm_string); break;\r
2704                                         case 5: sprintf(s, "fsubr   qword ptr %s", modrm_string); break;\r
2705                                         case 6: sprintf(s, "fdiv    qword ptr %s", modrm_string); break;\r
2706                                         case 7: sprintf(s, "fdivr   qword ptr %s", modrm_string); break;\r
2707                                 }\r
2708                         }\r
2709                         else\r
2710                         {\r
2711                                 switch (op2 & 0x3f)\r
2712                                 {\r
2713                                         case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:\r
2714                                                 sprintf(s, "fadd    st(%d),st(0)", op2 & 0x7); break;\r
2715 \r
2716                                         case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:\r
2717                                                 sprintf(s, "fmul    st(%d),st(0)", op2 & 0x7); break;\r
2718 \r
2719                                         case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:\r
2720                                                 sprintf(s, "fsubr   st(%d),st(0)", op2 & 0x7); break;\r
2721 \r
2722                                         case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:\r
2723                                                 sprintf(s, "fsub    st(%d),st(0)", op2 & 0x7); break;\r
2724 \r
2725                                         case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:\r
2726                                                 sprintf(s, "fdivr   st(%d),st(0)", op2 & 0x7); break;\r
2727 \r
2728                                         case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f:\r
2729                                                 sprintf(s, "fdiv    st(%d),st(0)", op2 & 0x7); break;\r
2730 \r
2731                                         default: sprintf(s, "??? (FPU)"); break;\r
2732                                 }\r
2733                         }\r
2734                         break;\r
2735                 }\r
2736 \r
2737                 case 5:     // Group DD\r
2738                 {\r
2739                         if (op2 < 0xc0)\r
2740                         {\r
2741                                 pc--;       // adjust fetch pointer, so modrm byte read again\r
2742                                 opcode_ptr--;\r
2743                                 handle_modrm( modrm_string );\r
2744                                 switch ((op2 >> 3) & 0x7)\r
2745                                 {\r
2746                                         case 0: sprintf(s, "fld     qword ptr %s", modrm_string); break;\r
2747                                         case 1: sprintf(s, "fisttp  qword ptr %s", modrm_string); break;\r
2748                                         case 2: sprintf(s, "fst     qword ptr %s", modrm_string); break;\r
2749                                         case 3: sprintf(s, "fstp    qword ptr %s", modrm_string); break;\r
2750                                         case 4: sprintf(s, "frstor  %s", modrm_string); break;\r
2751                                         case 5: sprintf(s, "??? (FPU)"); break;\r
2752                                         case 6: sprintf(s, "fsave   %s", modrm_string); break;\r
2753                                         case 7: sprintf(s, "fstsw   word ptr %s", modrm_string); break;\r
2754                                 }\r
2755                         }\r
2756                         else\r
2757                         {\r
2758                                 switch (op2 & 0x3f)\r
2759                                 {\r
2760                                         case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:\r
2761                                                 sprintf(s, "ffree   st(%d)", op2 & 0x7); break;\r
2762 \r
2763                                         case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:\r
2764                                                 sprintf(s, "fst     st(%d)", op2 & 0x7); break;\r
2765 \r
2766                                         case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:\r
2767                                                 sprintf(s, "fstp    st(%d)", op2 & 0x7); break;\r
2768 \r
2769                                         case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:\r
2770                                                 sprintf(s, "fucom   st(%d), st(0)", op2 & 0x7); break;\r
2771 \r
2772                                         case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:\r
2773                                                 sprintf(s, "fucomp  st(%d)", op2 & 0x7); break;\r
2774 \r
2775                                         default: sprintf(s, "??? (FPU)"); break;\r
2776                                 }\r
2777                         }\r
2778                         break;\r
2779                 }\r
2780 \r
2781                 case 6:     // Group DE\r
2782                 {\r
2783                         if (op2 < 0xc0)\r
2784                         {\r
2785                                 pc--;       // adjust fetch pointer, so modrm byte read again\r
2786                                 opcode_ptr--;\r
2787                                 handle_modrm( modrm_string );\r
2788                                 switch ((op2 >> 3) & 0x7)\r
2789                                 {\r
2790                                         case 0: sprintf(s, "fiadd   word ptr %s", modrm_string); break;\r
2791                                         case 1: sprintf(s, "fimul   word ptr %s", modrm_string); break;\r
2792                                         case 2: sprintf(s, "ficom   word ptr %s", modrm_string); break;\r
2793                                         case 3: sprintf(s, "ficomp  word ptr %s", modrm_string); break;\r
2794                                         case 4: sprintf(s, "fisub   word ptr %s", modrm_string); break;\r
2795                                         case 5: sprintf(s, "fisubr  word ptr %s", modrm_string); break;\r
2796                                         case 6: sprintf(s, "fidiv   word ptr %s", modrm_string); break;\r
2797                                         case 7: sprintf(s, "fidivr  word ptr %s", modrm_string); break;\r
2798                                 }\r
2799                         }\r
2800                         else\r
2801                         {\r
2802                                 switch (op2 & 0x3f)\r
2803                                 {\r
2804                                         case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:\r
2805                                                 sprintf(s, "faddp   st(%d)", op2 & 0x7); break;\r
2806 \r
2807                                         case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:\r
2808                                                 sprintf(s, "fmulp   st(%d)", op2 & 0x7); break;\r
2809 \r
2810                                         case 0x19: sprintf(s, "fcompp"); break;\r
2811 \r
2812                                         case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:\r
2813                                                 sprintf(s, "fsubrp  st(%d)", op2 & 0x7); break;\r
2814 \r
2815                                         case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:\r
2816                                                 sprintf(s, "fsubp   st(%d)", op2 & 0x7); break;\r
2817 \r
2818                                         case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:\r
2819                                                 sprintf(s, "fdivrp  st(%d), st(0)", op2 & 0x7); break;\r
2820 \r
2821                                         case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f:\r
2822                                                 sprintf(s, "fdivp   st(%d)", op2 & 0x7); break;\r
2823 \r
2824                                         default: sprintf(s, "??? (FPU)"); break;\r
2825                                 }\r
2826                         }\r
2827                         break;\r
2828                 }\r
2829 \r
2830                 case 7:     // Group DF\r
2831                 {\r
2832                         if (op2 < 0xc0)\r
2833                         {\r
2834                                 pc--;       // adjust fetch pointer, so modrm byte read again\r
2835                                 opcode_ptr--;\r
2836                                 handle_modrm( modrm_string );\r
2837                                 switch ((op2 >> 3) & 0x7)\r
2838                                 {\r
2839                                         case 0: sprintf(s, "fild    word ptr %s", modrm_string); break;\r
2840                                         case 1: sprintf(s, "fisttp  word ptr %s", modrm_string); break;\r
2841                                         case 2: sprintf(s, "fist    word ptr %s", modrm_string); break;\r
2842                                         case 3: sprintf(s, "fistp   word ptr %s", modrm_string); break;\r
2843                                         case 4: sprintf(s, "fbld    %s", modrm_string); break;\r
2844                                         case 5: sprintf(s, "fild    qword ptr %s", modrm_string); break;\r
2845                                         case 6: sprintf(s, "fbstp   %s", modrm_string); break;\r
2846                                         case 7: sprintf(s, "fistp   qword ptr %s", modrm_string); break;\r
2847                                 }\r
2848                         }\r
2849                         else\r
2850                         {\r
2851                                 switch (op2 & 0x3f)\r
2852                                 {\r
2853                                         case 0x20: sprintf(s, "fstsw   ax"); break;\r
2854 \r
2855                                         case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:\r
2856                                                 sprintf(s, "fucomip st(%d)", op2 & 0x7); break;\r
2857 \r
2858                                         case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:\r
2859                                                 sprintf(s, "fcomip  st(%d),st(0)", op2 & 0x7); break;\r
2860 \r
2861                                         default: sprintf(s, "??? (FPU)"); break;\r
2862                                 }\r
2863                         }\r
2864                         break;\r
2865                 }\r
2866         }\r
2867 }\r
2868 \r
2869 static void decode_opcode(char *s, const I386_OPCODE *op, UINT8 op1)\r
2870 {\r
2871         int i;\r
2872         UINT8 op2;\r
2873 \r
2874         if ((op->flags & SPECIAL64) && (address_size == 2))\r
2875                 op = &x64_opcode_alt[op->flags >> 24];\r
2876 \r
2877         switch( op->flags & FLAGS_MASK )\r
2878         {\r
2879                 case ISREX:\r
2880                         if (curmode == 64)\r
2881                         {\r
2882                                 rex = op1;\r
2883                                 operand_size = (op1 & 8) ? 2 : 1;\r
2884                                 regex = (op1 << 1) & 8;\r
2885                                 sibex = (op1 << 2) & 8;\r
2886                                 rmex = (op1 << 3) & 8;\r
2887                                 op2 = _FETCH();\r
2888                                 decode_opcode( s, &i386_opcode_table1[op2], op1 );\r
2889                                 return;\r
2890                         }\r
2891                         break;\r
2892 \r
2893                 case OP_SIZE:\r
2894                         rex = regex = sibex = rmex = 0;\r
2895                         if (operand_size < 2 && operand_prefix == 0)\r
2896                         {\r
2897                                 operand_size ^= 1;\r
2898                                 operand_prefix = 1;\r
2899                         }\r
2900                         op2 = _FETCH();\r
2901                         decode_opcode( s, &i386_opcode_table1[op2], op2 );\r
2902                         return;\r
2903 \r
2904                 case ADDR_SIZE:\r
2905                         rex = regex = sibex = rmex = 0;\r
2906                         if(address_prefix == 0)\r
2907                         {\r
2908                                 if (curmode != 64)\r
2909                                         address_size ^= 1;\r
2910                                 else\r
2911                                         address_size ^= 3;\r
2912                                 address_prefix = 1;\r
2913                         }\r
2914                         op2 = _FETCH();\r
2915                         decode_opcode( s, &i386_opcode_table1[op2], op2 );\r
2916                         return;\r
2917 \r
2918                 case TWO_BYTE:\r
2919                         if (&opcode_ptr[-2] >= opcode_ptr_base)\r
2920                                 pre0f = opcode_ptr[-2];\r
2921                         op2 = _FETCHD();\r
2922                         decode_opcode( s, &i386_opcode_table2[op2], op1 );\r
2923                         return;\r
2924 \r
2925                 case THREE_BYTE:\r
2926                         op2 = _FETCHD();\r
2927                         if (opcode_ptr[-2] == 0x38)\r
2928                                 decode_opcode( s, &i386_opcode_table0F38[op2], op1 );\r
2929                         else\r
2930                                 decode_opcode( s, &i386_opcode_table0F3A[op2], op1 );\r
2931                         return;\r
2932 \r
2933                 case SEG_CS:\r
2934                 case SEG_DS:\r
2935                 case SEG_ES:\r
2936                 case SEG_FS:\r
2937                 case SEG_GS:\r
2938                 case SEG_SS:\r
2939                         rex = regex = sibex = rmex = 0;\r
2940                         segment = op->flags;\r
2941                         op2 = _FETCH();\r
2942                         decode_opcode( s, &i386_opcode_table1[op2], op2 );\r
2943                         return;\r
2944 \r
2945                 case PREFIX:\r
2946                         op2 = _FETCH();\r
2947                         if ((op2 != 0x0f) && (op2 != 0x90))\r
2948                                 s += sprintf( s, "%-7s ", op->mnemonic );\r
2949                         if ((op2 == 0x90) && !pre0f)\r
2950                                 pre0f = op1;\r
2951                         decode_opcode( s, &i386_opcode_table1[op2], op2 );\r
2952                         return;\r
2953 \r
2954                 case GROUP:\r
2955                         handle_modrm( modrm_string );\r
2956                         for( i=0; i < ARRAY_LENGTH(group_op_table); i++ ) {\r
2957                                 if( strcmp(op->mnemonic, group_op_table[i].mnemonic) == 0 ) {\r
2958                                         decode_opcode( s, &group_op_table[i].opcode[MODRM_REG1], op1 );\r
2959                                         return;\r
2960                                 }\r
2961                         }\r
2962                         goto handle_unknown;\r
2963 \r
2964                 case FPU:\r
2965                         op2 = _FETCHD();\r
2966                         handle_fpu( s, op1, op2);\r
2967                         return;\r
2968 \r
2969                 case MODRM:\r
2970                         handle_modrm( modrm_string );\r
2971                         break;\r
2972         }\r
2973 \r
2974         if ((op->flags & ALWAYS64) && curmode == 64)\r
2975                 operand_size = 2;\r
2976 \r
2977         if ((op->flags & VAR_NAME) && operand_size > 0)\r
2978         {\r
2979                 const char *mnemonic = op->mnemonic + strlen(op->mnemonic) + 1;\r
2980                 if (operand_size == 2)\r
2981                         mnemonic += strlen(mnemonic) + 1;\r
2982                 s += sprintf( s, "%-7s ", mnemonic );\r
2983         }\r
2984         else if (op->flags & VAR_NAME4)\r
2985         {\r
2986                 const char *mnemonic = op->mnemonic;\r
2987                 int which = (pre0f == 0xf3) ? 3 : (pre0f == 0xf2) ? 2 : (pre0f == 0x66) ? 1 : 0;\r
2988                 while (which--)\r
2989                         mnemonic += strlen(mnemonic) + 1;\r
2990                 s += sprintf( s, "%-7s ", mnemonic );\r
2991         }\r
2992         else\r
2993                 s += sprintf( s, "%-7s ", op->mnemonic );\r
2994         dasm_flags = op->dasm_flags;\r
2995 \r
2996         if( op->param1 != 0 ) {\r
2997                 s = handle_param( s, op->param1 );\r
2998         }\r
2999 \r
3000         if( op->param2 != 0 ) {\r
3001                 s += sprintf( s, "," );\r
3002                 s = handle_param( s, op->param2 );\r
3003         }\r
3004 \r
3005         if( op->param3 != 0 ) {\r
3006                 s += sprintf( s, "," );\r
3007                 s = handle_param( s, op->param3 );\r
3008         }\r
3009         return;\r
3010 \r
3011 handle_unknown:\r
3012         sprintf(s, "???");\r
3013 }\r
3014 \r
3015 int i386_dasm_one_ex(char *buffer, UINT64 eip, const UINT8 *oprom, int mode)\r
3016 {\r
3017         UINT8 op;\r
3018 \r
3019         opcode_ptr = opcode_ptr_base = oprom;\r
3020         switch(mode)\r
3021         {\r
3022                 case 1: /* 8086/8088/80186/80188 */\r
3023                         address_size = 0;\r
3024                         operand_size = 0;\r
3025                         max_length = 8; /* maximum without redundant prefixes - not enforced by chip */\r
3026                         break;\r
3027                 case 2: /* 80286 */\r
3028                         address_size = 0;\r
3029                         operand_size = 0;\r
3030                         max_length = 10;\r
3031                         break;\r
3032                 case 16: /* 80386+ 16-bit code segment */\r
3033                         address_size = 0;\r
3034                         operand_size = 0;\r
3035                         max_length = 15;\r
3036                         break;\r
3037                 case 32: /* 80386+ 32-bit code segment */\r
3038                         address_size = 1;\r
3039                         operand_size = 1;\r
3040                         max_length = 15;\r
3041                         break;\r
3042                 case 64: /* x86_64 */\r
3043                         address_size = 2;\r
3044                         operand_size = 1;\r
3045                         max_length = 15;\r
3046                         break;\r
3047         }\r
3048         pc = eip;\r
3049         dasm_flags = 0;\r
3050         segment = 0;\r
3051         curmode = mode;\r
3052         pre0f = 0;\r
3053         rex = regex = sibex = rmex = 0;\r
3054         address_prefix = 0;\r
3055         operand_prefix = 0;\r
3056 \r
3057         op = _FETCH();\r
3058 \r
3059         decode_opcode( buffer, &i386_opcode_table1[op], op );\r
3060         return (pc-eip) | dasm_flags | DASMFLAG_SUPPORTED;\r
3061 }\r
3062 \r
3063 int i386_dasm_one(char *buffer, offs_t eip, const UINT8 *oprom, int mode)\r
3064 {\r
3065         return i386_dasm_one_ex(buffer, eip, oprom, mode);\r
3066 }\r
3067 \r
3068 CPU_DISASSEMBLE( x86_16 )\r
3069 {\r
3070         return i386_dasm_one_ex(buffer, pc, oprom, 16);\r
3071 }\r
3072 \r
3073 CPU_DISASSEMBLE( x86_32 )\r
3074 {\r
3075         return i386_dasm_one_ex(buffer, pc, oprom, 32);\r
3076 }\r
3077 \r
3078 CPU_DISASSEMBLE( x86_64 )\r
3079 {\r
3080         return i386_dasm_one_ex(buffer, pc, oprom, 64);\r
3081 }\r