4 Written by Ville Linde
\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
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
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
90 THREE_BYTE /* [prefix] 0f op1 op2 and then mod/rm */
\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
100 struct I386_OPCODE {
\r
101 const char *mnemonic;
\r
111 const I386_OPCODE *opcode;
\r
114 static const UINT8 *opcode_ptr;
\r
115 static const UINT8 *opcode_ptr_base;
\r
117 static const I386_OPCODE i386_opcode_table1[256] =
\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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
393 static const I386_OPCODE x64_opcode_alt[] =
\r
395 {"movsxd", MODRM | ALWAYS64,PARAM_REG, PARAM_RMPTR32, 0 },
\r
398 static const I386_OPCODE i386_opcode_table2[256] =
\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
421 "movss", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
425 "movss", MODRM|VAR_NAME4,PARAM_XMMM, PARAM_XMM, 0 },
\r
429 "movsldup", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
433 "???", MODRM|VAR_NAME4,PARAM_XMMM, PARAM_XMM, 0 },
\r
437 "???", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
441 "???", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
445 "movshdup", MODRM|VAR_NAME4,PARAM_XMMM, PARAM_XMM, 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
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
470 "???", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
474 "???", MODRM|VAR_NAME4,PARAM_XMMM, PARAM_XMM, 0 },
\r
478 "cvtsi2ss", MODRM|VAR_NAME4,PARAM_XMM, PARAM_RMXMM, 0 },
\r
482 "???", MODRM|VAR_NAME4,PARAM_XMMM, PARAM_XMM, 0 },
\r
486 "cvttss2si", MODRM|VAR_NAME4,PARAM_REGORXMM, PARAM_XMMM, 0 },
\r
490 "cvtss2si", MODRM|VAR_NAME4,PARAM_REGORXMM, PARAM_XMMM, 0 },
\r
494 "???", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
498 "???", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\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
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
537 "???", MODRM|VAR_NAME4,PARAM_REG3264, PARAM_XMMM, 0 },
\r
541 "sqrtss", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
545 "rsqrtss", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
549 "rcpss", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
553 "???", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
557 "???", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
561 "???", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
565 "???", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
569 "addss", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
573 "mulss", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
577 "cvtss2sd", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
581 "cvttps2dq", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
585 "subss", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
589 "minss", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
593 "divss", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\r
597 "maxss", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 },
\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
614 "???\0", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
618 "???\0", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
619 {"movd", MODRM, PARAM_MMX, PARAM_RM, 0 },
\r
623 "movdqu", MODRM|VAR_NAME4,PARAM_MMX, PARAM_MMXM, 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
643 "???", MODRM|VAR_NAME4,PARAM_MMX, PARAM_MMXM, 0 },
\r
647 "???", MODRM|VAR_NAME4,PARAM_MMX, PARAM_MMXM, 0 },
\r
651 "movq", MODRM|VAR_NAME4,PARAM_RM, PARAM_MMX, 0 },
\r
655 "movdqu", MODRM|VAR_NAME4,PARAM_MMXM, PARAM_MMX, 0 },
\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
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
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
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
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
726 "tzcnt", MODRM|VAR_NAME4, PARAM_REG, PARAM_RM, 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
734 {"xadd", MODRM, PARAM_RM8, PARAM_REG, 0 },
\r
735 {"xadd", MODRM, PARAM_RM, PARAM_REG, 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
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
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
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
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
789 "cvtdq2pd", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 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
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
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
827 static const I386_OPCODE i386_opcode_table0F38[256] =
\r
833 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
837 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
841 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
845 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
849 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
853 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
857 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
861 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
865 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
869 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
873 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 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
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
893 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_XMM0 },
\r
897 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_XMM0 },
\r
898 {"???", 0, 0, 0, 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
910 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
914 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
918 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
919 {"???", 0, 0, 0, 0 },
\r
924 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMM64, 0 },
\r
928 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMM32, 0 },
\r
932 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMM16, 0 },
\r
936 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMM64, 0 },
\r
940 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMM32, 0 },
\r
944 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMM64, 0 },
\r
945 {"???", 0, 0, 0, 0 },
\r
946 {"???", 0, 0, 0, 0 },
\r
950 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
954 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
958 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 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
971 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMM64, 0 },
\r
975 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMM32, 0 },
\r
979 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMM16, 0 },
\r
983 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMM64, 0 },
\r
987 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMM32, 0 },
\r
991 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMM64, 0 },
\r
992 {"???", 0, 0, 0, 0 },
\r
996 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
1000 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
1004 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
1008 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
1012 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
1016 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
1020 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
1024 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
1028 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
1033 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 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
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
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
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
1107 "???", MODRM|VAR_NAME4, PARAM_REG32, PARAM_XMMM, 0 },
\r
1111 "???", MODRM|VAR_NAME4, PARAM_REG32, PARAM_XMMM, 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
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
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
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
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
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
1212 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
1216 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
1220 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
1224 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\r
1228 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, 0 },
\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
1250 "???", MODRM|VAR_NAME4, PARAM_REG32, PARAM_RMPTR, 0 }, // not quite correct
\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
1271 static const I386_OPCODE i386_opcode_table0F3A[256] =
\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
1285 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\r
1289 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\r
1293 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\r
1297 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\r
1301 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\r
1305 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\r
1309 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\r
1313 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\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
1322 "???", MODRM|VAR_NAME4, PARAM_RM8, PARAM_XMM, PARAM_UI8 },
\r
1326 "???", MODRM|VAR_NAME4, PARAM_RM16, PARAM_XMM, PARAM_UI8 },
\r
1330 "???", MODRM|VAR_NAME4, PARAM_RM8, PARAM_XMM, PARAM_UI8 },
\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
1347 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_RM8, PARAM_UI8 },
\r
1351 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_RM8, PARAM_UI8 },
\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
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
1390 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\r
1394 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\r
1398 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\r
1399 {"???", 0, 0, 0, 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
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
1436 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\r
1440 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\r
1444 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\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
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
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
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
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
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
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
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
1580 "aeskeygenassist\0"
\r
1582 "???", MODRM|VAR_NAME4, PARAM_XMM, PARAM_XMMM, PARAM_UI8 },
\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
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
1619 static const I386_OPCODE group80_table[8] =
\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
1631 static const I386_OPCODE group81_table[8] =
\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
1643 static const I386_OPCODE group83_table[8] =
\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
1655 static const I386_OPCODE groupC0_table[8] =
\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
1667 static const I386_OPCODE groupC1_table[8] =
\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
1679 static const I386_OPCODE groupD0_table[8] =
\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
1691 static const I386_OPCODE groupD1_table[8] =
\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
1703 static const I386_OPCODE groupD2_table[8] =
\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
1715 static const I386_OPCODE groupD3_table[8] =
\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
1727 static const I386_OPCODE groupF6_table[8] =
\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
1739 static const I386_OPCODE groupF7_table[8] =
\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
1751 static const I386_OPCODE groupFE_table[8] =
\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
1763 static const I386_OPCODE groupFF_table[8] =
\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
1775 static const I386_OPCODE group0F00_table[8] =
\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
1787 static const I386_OPCODE group0F01_table[8] =
\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
1799 static const I386_OPCODE group0F0D_table[8] =
\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
1811 static const I386_OPCODE group0F18_table[8] =
\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
1823 static const I386_OPCODE group0F71_table[8] =
\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
1835 static const I386_OPCODE group0F72_table[8] =
\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
1847 static const I386_OPCODE group0F73_table[8] =
\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
1859 static const I386_OPCODE group0FAE_table[8] =
\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
1872 static const I386_OPCODE group0FBA_table[8] =
\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
1884 static const I386_OPCODE group0FC7_table[8] =
\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
1895 "vmxon", MODRM|VAR_NAME4, PARAM_M64PTR, 0, 0 },
\r
1896 {"vmptrtst", MODRM, PARAM_M64PTR, 0, 0 }
\r
1899 static const GROUP_OP group_op_table[] =
\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
1928 static const char *const i386_reg[3][16] =
\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
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
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
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
1953 #define MODRM_REG1 ((modrm >> 3) & 0x7)
\r
1954 #define MODRM_REG2 (modrm & 0x7)
\r
1956 INLINE UINT8 _FETCH(void)
\r
1958 if ((opcode_ptr - opcode_ptr_base) + 1 > max_length)
\r
1961 return *opcode_ptr++;
\r
1964 INLINE UINT16 _FETCH16(void)
\r
1967 if ((opcode_ptr - opcode_ptr_base) + 2 > max_length)
\r
1969 d = opcode_ptr[0] | (opcode_ptr[1] << 8);
\r
1975 INLINE UINT32 _FETCH32(void)
\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
1986 INLINE UINT8 _FETCHD(void)
\r
1988 if ((opcode_ptr - opcode_ptr_base) + 1 > max_length)
\r
1991 return *opcode_ptr++;
\r
1994 INLINE UINT16 _FETCHD16(void)
\r
1997 if ((opcode_ptr - opcode_ptr_base) + 2 > max_length)
\r
1999 d = opcode_ptr[0] | (opcode_ptr[1] << 8);
\r
2005 INLINE UINT32 _FETCHD32(void)
\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
2016 static char *hexstring(UINT32 value, int digits)
\r
2018 static char buffer[20];
\r
2021 sprintf(&buffer[1], "%0*Xh", digits, value);
\r
2023 sprintf(&buffer[1], "%Xh", value);
\r
2024 return (buffer[1] >= '0' && buffer[1] <= '9') ? &buffer[1] : &buffer[0];
\r
2027 static char *hexstring64(UINT32 lo, UINT32 hi)
\r
2029 static char buffer[40];
\r
2032 sprintf(&buffer[1], "%X%08Xh", hi, lo);
\r
2034 sprintf(&buffer[1], "%Xh", lo);
\r
2035 return (buffer[1] >= '0' && buffer[1] <= '9') ? &buffer[1] : &buffer[0];
\r
2038 static char *hexstringpc(UINT64 pc)
\r
2040 if (curmode == 64)
\r
2041 return hexstring64((UINT32)pc, (UINT32)(pc >> 32));
\r
2043 return hexstring((UINT32)pc, 0);
\r
2046 static char *shexstring(UINT32 value, int digits, int always)
\r
2048 static char buffer[20];
\r
2049 if (value >= 0x80000000)
\r
2050 sprintf(buffer, "-%s", hexstring(-value, digits));
\r
2052 sprintf(buffer, "+%s", hexstring(value, digits));
\r
2054 return hexstring(value, digits);
\r
2058 static char* handle_sib_byte( char* s, UINT8 mod )
\r
2061 UINT8 scale, i, base;
\r
2062 UINT8 sib = _FETCHD();
\r
2064 scale = (sib >> 6) & 0x3;
\r
2065 i = ((sib >> 3) & 0x7) | sibex;
\r
2066 base = (sib & 0x7) | rmex;
\r
2068 if (base == 5 && mod == 0) {
\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
2075 s += sprintf( s, "+%s", i386_reg[address_size][i] );
\r
2077 s += sprintf( s, "*%d", 1 << scale );
\r
2082 static void handle_modrm(char* s)
\r
2089 modrm = _FETCHD();
\r
2090 mod = (modrm >> 6) & 0x3;
\r
2091 rm = (modrm & 0x7) | rmex;
\r
2093 if( modrm >= 0xc0 )
\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
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
2114 s += sprintf( s, "%s", i386_reg[2][rm]);
\r
2116 disp8 = _FETCHD();
\r
2118 s += sprintf( s, "%s", shexstring((INT32)disp8, 0, TRUE) );
\r
2119 } else if( mod == 2 ) {
\r
2120 disp32 = _FETCHD32();
\r
2122 s += sprintf( s, "%s", shexstring(disp32, 0, TRUE) );
\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
2132 s += sprintf( s, "%s", hexstring(disp32, 0) );
\r
2134 s += sprintf( s, "%s", i386_reg[1][rm]);
\r
2136 disp8 = _FETCHD();
\r
2138 s += sprintf( s, "%s", shexstring((INT32)disp8, 0, TRUE) );
\r
2139 } else if( mod == 2 ) {
\r
2140 disp32 = _FETCHD32();
\r
2142 s += sprintf( s, "%s", shexstring(disp32, 0, TRUE) );
\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
2155 disp16 = _FETCHD16();
\r
2156 s += sprintf( s, "%s", hexstring((unsigned) (UINT16) disp16, 0) );
\r
2158 s += sprintf( s, "bp" );
\r
2161 case 7: s += sprintf( s, "bx" ); break;
\r
2164 disp8 = _FETCHD();
\r
2166 s += sprintf( s, "%s", shexstring((INT32)disp8, 0, TRUE) );
\r
2167 } else if( mod == 2 ) {
\r
2168 disp16 = _FETCHD16();
\r
2170 s += sprintf( s, "%s", shexstring((INT32)disp16, 0, TRUE) );
\r
2173 s += sprintf( s, "]" );
\r
2176 static char* handle_param(char* s, UINT32 param)
\r
2190 s += sprintf( s, "%s", i386_reg[operand_size][MODRM_REG1 | regex] );
\r
2194 s += sprintf( s, "%s", (rex ? i386_reg8rex : i386_reg8)[MODRM_REG1 | regex] );
\r
2198 s += sprintf( s, "%s", i386_reg[0][MODRM_REG1 | regex] );
\r
2202 s += sprintf( s, "%s", i386_reg[1][MODRM_REG1 | regex] );
\r
2205 case PARAM_REG3264:
\r
2206 s += sprintf( s, "%s", i386_reg[(operand_size == 2) ? 2 : 1][MODRM_REG1 | regex] );
\r
2210 if (pre0f == 0x66 || pre0f == 0xf2 || pre0f == 0xf3)
\r
2211 s += sprintf( s, "xmm%d", MODRM_REG1 | regex );
\r
2213 s += sprintf( s, "mm%d", MODRM_REG1 | regex );
\r
2217 if (pre0f == 0x66 || pre0f == 0xf2 || pre0f == 0xf3)
\r
2218 s += sprintf( s, "xmm%d", MODRM_REG2 | regex );
\r
2220 s += sprintf( s, "mm%d", MODRM_REG2 | regex );
\r
2224 s += sprintf( s, "xmm%d", MODRM_REG1 | regex );
\r
2227 case PARAM_REGORXMM:
\r
2228 if (pre0f != 0xf2 && pre0f != 0xf3)
\r
2229 s += sprintf( s, "xmm%d", MODRM_REG1 | regex );
\r
2231 s += sprintf( s, "%s", i386_reg[(operand_size == 2) ? 2 : 1][MODRM_REG1 | regex] );
\r
2234 case PARAM_REG2_32:
\r
2235 s += sprintf( s, "%s", i386_reg[1][MODRM_REG2 | rmex] );
\r
2240 if( modrm >= 0xc0 ) {
\r
2241 s += sprintf( s, "%s", i386_reg[operand_size][MODRM_REG2 | rmex] );
\r
2243 if (param == PARAM_RMPTR)
\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
2250 s += sprintf( s, "word ptr " );
\r
2252 s += sprintf( s, "%s", modrm_string );
\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
2261 if (param == PARAM_RMPTR8)
\r
2262 s += sprintf( s, "byte ptr " );
\r
2263 s += sprintf( s, "%s", modrm_string );
\r
2268 case PARAM_RMPTR16:
\r
2269 if( modrm >= 0xc0 ) {
\r
2270 s += sprintf( s, "%s", i386_reg[0][MODRM_REG2 | rmex] );
\r
2272 if (param == PARAM_RMPTR16)
\r
2273 s += sprintf( s, "word ptr " );
\r
2274 s += sprintf( s, "%s", modrm_string );
\r
2279 case PARAM_RMPTR32:
\r
2280 if( modrm >= 0xc0 ) {
\r
2281 s += sprintf( s, "%s", i386_reg[1][MODRM_REG2 | rmex] );
\r
2283 if (param == PARAM_RMPTR32)
\r
2284 s += sprintf( s, "dword ptr " );
\r
2285 s += sprintf( s, "%s", modrm_string );
\r
2290 if( modrm >= 0xc0 ) {
\r
2291 if (pre0f != 0xf2 && pre0f != 0xf3)
\r
2292 s += sprintf( s, "xmm%d", MODRM_REG2 | rmex );
\r
2294 s += sprintf( s, "%s", i386_reg[(operand_size == 2) ? 2 : 1][MODRM_REG2 | rmex] );
\r
2296 if (param == PARAM_RMPTR32)
\r
2297 s += sprintf( s, "dword ptr " );
\r
2298 s += sprintf( s, "%s", modrm_string );
\r
2303 case PARAM_M64PTR:
\r
2304 if( modrm >= 0xc0 ) {
\r
2305 s += sprintf( s, "???" );
\r
2307 if (param == PARAM_M64PTR)
\r
2308 s += sprintf( s, "qword ptr " );
\r
2309 s += sprintf( s, "%s", modrm_string );
\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
2318 s += sprintf( s, "mm%d", MODRM_REG2 | rmex );
\r
2320 s += sprintf( s, "%s", modrm_string );
\r
2325 if( modrm >= 0xc0 ) {
\r
2326 s += sprintf( s, "xmm%d", MODRM_REG2 | rmex );
\r
2328 s += sprintf( s, "%s", modrm_string );
\r
2334 s += sprintf( s, "%d", i8 & 0x0f );
\r
2339 s += sprintf( s, "%s", shexstring((INT8)i8, 0, FALSE) );
\r
2343 i16 = _FETCHD16();
\r
2344 s += sprintf( s, "%s", shexstring((INT16)i16, 0, FALSE) );
\r
2349 s += sprintf( s, "%s", shexstring((UINT8)i8, 0, FALSE) );
\r
2353 i16 = _FETCHD16();
\r
2354 s += sprintf( s, "%s", shexstring((UINT16)i16, 0, FALSE) );
\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
2366 i16 = _FETCHD16();
\r
2367 s += sprintf( s, "%s", hexstring(i16, 0) );
\r
2372 if( operand_size ) {
\r
2373 i32 = _FETCHD32();
\r
2374 s += sprintf( s, "%s", hexstring(i32, 0) );
\r
2376 i16 = _FETCHD16();
\r
2377 s += sprintf( s, "%s", hexstring(i16, 0) );
\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
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
2396 if( operand_size ) {
\r
2397 d32 = _FETCHD32();
\r
2398 s += sprintf( s, "%s", hexstringpc(pc + d32) );
\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
2408 s += sprintf( s, "%s", hexstringpc(pc + d8) );
\r
2411 case PARAM_MEM_OFFS:
\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
2422 if( address_size ) {
\r
2423 i32 = _FETCHD32();
\r
2424 s += sprintf( s, "[%s]", hexstring(i32, 0) );
\r
2426 i16 = _FETCHD16();
\r
2427 s += sprintf( s, "[%s]", hexstring(i16, 0) );
\r
2431 case PARAM_PREIMP:
\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
2444 s += sprintf( s, "%s", i386_sreg[MODRM_REG1] );
\r
2448 s += sprintf( s, "cr%d", MODRM_REG1 | regex );
\r
2452 s += sprintf( s, "tr%d", MODRM_REG1 | regex );
\r
2456 s += sprintf( s, "dr%d", MODRM_REG1 | regex );
\r
2460 s += sprintf( s, "1" );
\r
2464 s += sprintf( s, "dx" );
\r
2468 s += sprintf( s, "xmm0" );
\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
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
2492 static void handle_fpu(char *s, UINT8 op1, UINT8 op2)
\r
2494 switch (op1 & 0x7)
\r
2496 case 0: // Group D8
\r
2500 pc--; // adjust fetch pointer, so modrm byte read again
\r
2502 handle_modrm( modrm_string );
\r
2503 switch ((op2 >> 3) & 0x7)
\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
2517 switch ((op2 >> 3) & 0x7)
\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
2532 case 1: // Group D9
\r
2536 pc--; // adjust fetch pointer, so modrm byte read again
\r
2538 handle_modrm( modrm_string );
\r
2539 switch ((op2 >> 3) & 0x7)
\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
2553 switch (op2 & 0x3f)
\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
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
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
2590 default: sprintf(s, "??? (FPU)"); break;
\r
2596 case 2: // Group DA
\r
2600 pc--; // adjust fetch pointer, so modrm byte read again
\r
2602 handle_modrm( modrm_string );
\r
2603 switch ((op2 >> 3) & 0x7)
\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
2617 switch (op2 & 0x3f)
\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
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
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
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
2631 sprintf(s, "fucompp"); break;
\r
2633 default: sprintf(s, "??? (FPU)"); break;
\r
2640 case 3: // Group DB
\r
2644 pc--; // adjust fetch pointer, so modrm byte read again
\r
2646 handle_modrm( modrm_string );
\r
2647 switch ((op2 >> 3) & 0x7)
\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
2661 switch (op2 & 0x3f)
\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
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
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
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
2675 case 0x22: sprintf(s, "fclex"); break;
\r
2676 case 0x23: sprintf(s, "finit"); break;
\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
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
2684 default: sprintf(s, "??? (FPU)"); break;
\r
2690 case 4: // Group DC
\r
2694 pc--; // adjust fetch pointer, so modrm byte read again
\r
2696 handle_modrm( modrm_string );
\r
2697 switch ((op2 >> 3) & 0x7)
\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
2711 switch (op2 & 0x3f)
\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
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
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
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
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
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
2731 default: sprintf(s, "??? (FPU)"); break;
\r
2737 case 5: // Group DD
\r
2741 pc--; // adjust fetch pointer, so modrm byte read again
\r
2743 handle_modrm( modrm_string );
\r
2744 switch ((op2 >> 3) & 0x7)
\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
2758 switch (op2 & 0x3f)
\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
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
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
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
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
2775 default: sprintf(s, "??? (FPU)"); break;
\r
2781 case 6: // Group DE
\r
2785 pc--; // adjust fetch pointer, so modrm byte read again
\r
2787 handle_modrm( modrm_string );
\r
2788 switch ((op2 >> 3) & 0x7)
\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
2802 switch (op2 & 0x3f)
\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
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
2810 case 0x19: sprintf(s, "fcompp"); break;
\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
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
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
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
2824 default: sprintf(s, "??? (FPU)"); break;
\r
2830 case 7: // Group DF
\r
2834 pc--; // adjust fetch pointer, so modrm byte read again
\r
2836 handle_modrm( modrm_string );
\r
2837 switch ((op2 >> 3) & 0x7)
\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
2851 switch (op2 & 0x3f)
\r
2853 case 0x20: sprintf(s, "fstsw ax"); break;
\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
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
2861 default: sprintf(s, "??? (FPU)"); break;
\r
2869 static void decode_opcode(char *s, const I386_OPCODE *op, UINT8 op1)
\r
2874 if ((op->flags & SPECIAL64) && (address_size == 2))
\r
2875 op = &x64_opcode_alt[op->flags >> 24];
\r
2877 switch( op->flags & FLAGS_MASK )
\r
2880 if (curmode == 64)
\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
2888 decode_opcode( s, &i386_opcode_table1[op2], op1 );
\r
2894 rex = regex = sibex = rmex = 0;
\r
2895 if (operand_size < 2 && operand_prefix == 0)
\r
2897 operand_size ^= 1;
\r
2898 operand_prefix = 1;
\r
2901 decode_opcode( s, &i386_opcode_table1[op2], op2 );
\r
2905 rex = regex = sibex = rmex = 0;
\r
2906 if(address_prefix == 0)
\r
2908 if (curmode != 64)
\r
2909 address_size ^= 1;
\r
2911 address_size ^= 3;
\r
2912 address_prefix = 1;
\r
2915 decode_opcode( s, &i386_opcode_table1[op2], op2 );
\r
2919 if (&opcode_ptr[-2] >= opcode_ptr_base)
\r
2920 pre0f = opcode_ptr[-2];
\r
2922 decode_opcode( s, &i386_opcode_table2[op2], op1 );
\r
2927 if (opcode_ptr[-2] == 0x38)
\r
2928 decode_opcode( s, &i386_opcode_table0F38[op2], op1 );
\r
2930 decode_opcode( s, &i386_opcode_table0F3A[op2], op1 );
\r
2939 rex = regex = sibex = rmex = 0;
\r
2940 segment = op->flags;
\r
2942 decode_opcode( s, &i386_opcode_table1[op2], op2 );
\r
2947 if ((op2 != 0x0f) && (op2 != 0x90))
\r
2948 s += sprintf( s, "%-7s ", op->mnemonic );
\r
2949 if ((op2 == 0x90) && !pre0f)
\r
2951 decode_opcode( s, &i386_opcode_table1[op2], op2 );
\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
2962 goto handle_unknown;
\r
2966 handle_fpu( s, op1, op2);
\r
2970 handle_modrm( modrm_string );
\r
2974 if ((op->flags & ALWAYS64) && curmode == 64)
\r
2977 if ((op->flags & VAR_NAME) && operand_size > 0)
\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
2984 else if (op->flags & VAR_NAME4)
\r
2986 const char *mnemonic = op->mnemonic;
\r
2987 int which = (pre0f == 0xf3) ? 3 : (pre0f == 0xf2) ? 2 : (pre0f == 0x66) ? 1 : 0;
\r
2989 mnemonic += strlen(mnemonic) + 1;
\r
2990 s += sprintf( s, "%-7s ", mnemonic );
\r
2993 s += sprintf( s, "%-7s ", op->mnemonic );
\r
2994 dasm_flags = op->dasm_flags;
\r
2996 if( op->param1 != 0 ) {
\r
2997 s = handle_param( s, op->param1 );
\r
3000 if( op->param2 != 0 ) {
\r
3001 s += sprintf( s, "," );
\r
3002 s = handle_param( s, op->param2 );
\r
3005 if( op->param3 != 0 ) {
\r
3006 s += sprintf( s, "," );
\r
3007 s = handle_param( s, op->param3 );
\r
3012 sprintf(s, "???");
\r
3015 int i386_dasm_one_ex(char *buffer, UINT64 eip, const UINT8 *oprom, int mode)
\r
3019 opcode_ptr = opcode_ptr_base = oprom;
\r
3022 case 1: /* 8086/8088/80186/80188 */
\r
3025 max_length = 8; /* maximum without redundant prefixes - not enforced by chip */
\r
3027 case 2: /* 80286 */
\r
3032 case 16: /* 80386+ 16-bit code segment */
\r
3037 case 32: /* 80386+ 32-bit code segment */
\r
3042 case 64: /* x86_64 */
\r
3053 rex = regex = sibex = rmex = 0;
\r
3054 address_prefix = 0;
\r
3055 operand_prefix = 0;
\r
3059 decode_opcode( buffer, &i386_opcode_table1[op], op );
\r
3060 return (pc-eip) | dasm_flags | DASMFLAG_SUPPORTED;
\r
3063 int i386_dasm_one(char *buffer, offs_t eip, const UINT8 *oprom, int mode)
\r
3065 return i386_dasm_one_ex(buffer, eip, oprom, mode);
\r
3068 CPU_DISASSEMBLE( x86_16 )
\r
3070 return i386_dasm_one_ex(buffer, pc, oprom, 16);
\r
3073 CPU_DISASSEMBLE( x86_32 )
\r
3075 return i386_dasm_one_ex(buffer, pc, oprom, 32);
\r
3078 CPU_DISASSEMBLE( x86_64 )
\r
3080 return i386_dasm_one_ex(buffer, pc, oprom, 64);
\r