42 #if defined(__x86_64__) && defined(HAVE_ECS) 98 insn one_byte_opcode_table[] = {
100 {
"add", { ADDR_E, ADDR_G, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMWR | I_MEMRD | I_ALU },
102 {
"add", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMWR | I_MEMRD | I_ALU },
104 {
"add", { ADDR_G, ADDR_E, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMRD | I_ALU },
106 {
"add", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_ALU },
108 {
"add", { R_AL, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, I_ALU },
110 {
"add", { R_AX, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, I_ALU },
112 {
"push", { R_ES, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_PUSHPOP },
114 {
"pop", { R_ES, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_PUSHPOP },
116 {
"or", { ADDR_E, ADDR_G, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMWR | I_MEMRD | I_ALU },
118 {
"or", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMWR | I_MEMRD | I_ALU },
120 {
"or", { ADDR_G, ADDR_E, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMRD | I_ALU },
122 {
"or", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_ALU },
124 {
"or", { R_AL, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, I_ALU },
126 {
"or", { R_AX, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, I_ALU },
128 {
"push", { R_CS, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_PUSHPOP },
130 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f_opcode, 0 },
132 {
"adc", { ADDR_E, ADDR_G, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMWR | I_ALU },
134 {
"adc", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMWR | I_ALU },
136 {
"adc", { ADDR_G, ADDR_E, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMRD | I_ALU },
138 {
"adc", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_ALU },
140 {
"adc", { R_AL, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, I_ALU },
142 {
"adc", { R_AX, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, I_ALU },
144 {
"push", { R_SS, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_PUSHPOP },
146 {
"pop", { R_SS, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_PUSHPOP },
148 {
"sbb", { ADDR_E, ADDR_G, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMWR | I_ALU },
150 {
"sbb", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMWR | I_ALU },
152 {
"sbb", { ADDR_G, ADDR_E, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMWR | I_ALU },
154 {
"sbb", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_ALU },
156 {
"sbb", { R_AL, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, I_ALU },
158 {
"sbb", { R_AX, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, I_ALU },
160 {
"push", { R_DS, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_PUSHPOP },
162 {
"pop", { R_DS, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_PUSHPOP },
164 {
"and", { ADDR_E, ADDR_G, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMWR | I_ALU },
166 {
"and", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMWR | I_ALU },
168 {
"and", { ADDR_G, ADDR_E, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMRD | I_ALU },
170 {
"and", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_ALU },
172 {
"and", { R_AL, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, I_ALU },
174 {
"and", { R_AX, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, I_ALU },
176 {
"es", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
178 {
"daa", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_ALU },
180 {
"sub", { ADDR_E, ADDR_G, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMWR | I_ALU },
182 {
"sub", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMWR | I_ALU },
184 {
"sub", { ADDR_G, ADDR_E, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMRD | I_ALU },
186 {
"sub", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_ALU },
188 {
"sub", { R_AL, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, I_ALU },
190 {
"sub", { R_AX, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, I_ALU },
192 {
"cs", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
194 {
"das", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_ALU },
196 {
"xor", { ADDR_E, ADDR_G, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMWR | I_ALU },
198 {
"xor", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMWR | I_ALU },
200 {
"xor", { ADDR_G, ADDR_E, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMRD | I_ALU },
202 {
"xor", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_ALU },
204 {
"xor", { R_AL, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, I_ALU },
206 {
"xor", { R_AX, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, I_ALU },
208 {
"ss", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
210 {
"aaa", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_ALU },
212 {
"cmp", { ADDR_E, ADDR_G, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMRD | I_ALU | I_CTRL },
214 {
"cmp", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_ALU | I_CTRL },
216 {
"cmp", { ADDR_G, ADDR_E, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMRD | I_ALU | I_CTRL },
218 {
"cmp", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_ALU | I_CTRL },
220 {
"cmp", { R_AL, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, I_ALU | I_CTRL },
222 {
"cmp", { R_AX, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, I_ALU | I_CTRL },
224 {
"ds", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
226 {
"aas", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_ALU },
228 {
"inc", { R_AX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
230 {
"inc", { R_CX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
232 {
"inc", { R_DX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
234 {
"inc", { R_BX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
236 {
"inc", { R_SP, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
238 {
"inc", { R_BP, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
240 {
"inc", { R_SI, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
242 {
"inc", { R_DI, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
244 {
"dec", { R_AX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
246 {
"dec", { R_CX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
248 {
"dec", { R_DX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
250 {
"dec", { R_BX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
252 {
"dec", { R_SP, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
254 {
"dec", { R_BP, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
256 {
"dec", { R_SI, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
258 {
"dec", { R_DI, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_ALU },
260 {
"push", { R_AX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
262 {
"push", { R_CX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
264 {
"push", { R_DX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
266 {
"push", { R_BX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
268 {
"push", { R_SP, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
270 {
"push", { R_BP, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
272 {
"push", { R_SI, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
274 {
"push", { R_DI, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
276 {
"pop", { R_AX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
278 {
"pop", { R_CX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
280 {
"pop", { R_DX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
282 {
"pop", { R_BX, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
284 {
"pop", { R_SP, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
286 {
"pop", { R_BP, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
288 {
"pop", { R_SI, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
290 {
"pop", { R_DI, ADDR_0, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, I_PUSHPOP },
292 {
"pusha", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_PUSHPOP },
294 {
"popa", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_PUSHPOP },
296 {
"bound", { ADDR_G, ADDR_M, ADDR_0 }, { OP_V, OP_A, OP_0 }, NULL, I_MEMRD | I_CTRL | I_ALU },
298 {
"arpl", { ADDR_E, ADDR_G, ADDR_0 }, { OP_W, OP_W, OP_0 }, NULL, I_MEMRD | I_MEMWR | I_CTRL | I_ALU },
300 {
"fs", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
302 {
"gs", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
304 {
"opd-size", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
306 {
"addr-size", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
308 {
"push", { ADDR_I, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_PUSHPOP },
310 {
"imul", { ADDR_G, ADDR_E, ADDR_I }, { OP_V, OP_V, OP_V }, NULL, I_MEMRD | I_ALU },
312 {
"push", { ADDR_I, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_PUSHPOP },
314 {
"imul", { ADDR_G, ADDR_E, ADDR_I }, { OP_V, OP_V, OP_B }, NULL, I_MEMRD | I_ALU },
316 {
"insb", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_MEMWR | I_STRING },
318 {
"insw", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_MEMWR | I_STRING },
320 {
"outsb", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_MEMRD | I_STRING },
322 {
"outsw", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_MEMRD | I_STRING },
324 {
"jo", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
326 {
"jno", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
328 {
"jc", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
330 {
"jnc", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
332 {
"jz", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
334 {
"jnz", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
336 {
"jbe", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
338 {
"ja", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
340 {
"js", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
342 {
"jns", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
344 {
"jp", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
346 {
"jnp", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
348 {
"jl", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
350 {
"jge", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
352 {
"jle", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
354 {
"jg", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
356 { NULL, { ADDR_E, ADDR_I, ADDR_0 }, { OP_B, OP_B, OP_0 }, immed_grp_1, 0 },
358 { NULL, { ADDR_E, ADDR_I, ADDR_0 }, { OP_V, OP_V, OP_0 }, immed_grp_1, 0 },
360 { NULL, { ADDR_E, ADDR_I, ADDR_0 }, { OP_B, OP_B, OP_0 }, immed_grp_1, 0 },
362 { NULL, { ADDR_E, ADDR_I, ADDR_0 }, { OP_V, OP_B, OP_0 }, immed_grp_1, 0 },
364 {
"test", { ADDR_E, ADDR_G, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_CTRL | I_ALU | I_MEMRD },
366 {
"test", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CTRL | I_ALU | I_MEMRD },
368 {
"xchg", { ADDR_E, ADDR_G, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMRD | I_MEMWR },
370 {
"xchg", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_MEMWR },
372 {
"mov", { ADDR_E, ADDR_G, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMWR },
374 {
"mov", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMWR },
376 {
"mov", { ADDR_G, ADDR_E, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMRD },
378 {
"mov", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD },
380 {
"mov", { ADDR_E, ADDR_S, ADDR_0 }, { OP_W, OP_W, OP_0 }, NULL, I_MEMWR },
382 {
"lea", { ADDR_G, ADDR_M, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_MEMIND },
384 {
"mov", { ADDR_S, ADDR_E, ADDR_0 }, { OP_W, OP_W, OP_0 }, NULL, I_MEMRD },
386 {
"pop", { ADDR_E, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_PUSHPOP | I_MEMWR },
388 {
"nop", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
390 {
"xchg", { R_AX, R_CX, ADDR_0 }, { OP_E, OP_E, OP_0 }, NULL, 0 },
392 {
"xchg", { R_AX, R_DX, ADDR_0 }, { OP_E, OP_E, OP_0 }, NULL, 0 },
394 {
"xchg", { R_AX, R_BX, ADDR_0 }, { OP_E, OP_E, OP_0 }, NULL, 0 },
396 {
"xchg", { R_AX, R_SP, ADDR_0 }, { OP_E, OP_E, OP_0 }, NULL, 0 },
398 {
"xchg", { R_AX, R_BP, ADDR_0 }, { OP_E, OP_E, OP_0 }, NULL, 0 },
400 {
"xchg", { R_AX, R_SI, ADDR_0 }, { OP_E, OP_E, OP_0 }, NULL, 0 },
402 {
"xchg", { R_AX, R_DI, ADDR_0 }, { OP_E, OP_E, OP_0 }, NULL, 0 },
404 {
"cbw", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
406 {
"cwd", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
408 {
"callf", { ADDR_A, ADDR_0, ADDR_0 }, { OP_P, OP_0, OP_0 }, NULL, I_CALL},
410 {
"fwait", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_FPU | I_CTRL },
412 {
"pushf", { ADDR_F, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_PUSHPOP | I_CTRL },
414 {
"popf", { ADDR_F, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_PUSHPOP | I_CTRL },
416 {
"sahf", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_CTRL },
418 {
"lahf", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_CTRL },
420 {
"mov", { R_AL, ADDR_O, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, I_MEMRD },
422 {
"mov", { R_AX, ADDR_O, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, I_MEMRD },
424 {
"mov", { ADDR_O, R_AL, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_MEMWR },
426 {
"mov", { ADDR_O, R_AX, ADDR_0 }, { OP_V, OP_E, OP_0 }, NULL, I_MEMWR },
428 {
"movs", { ADDR_X, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_STRING | I_MEMRD | I_MEMWR },
430 {
"movs", { ADDR_Y, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_STRING | I_MEMRD | I_MEMWR },
432 {
"cmps", { ADDR_X, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_STRING | I_CTRL | I_ALU | I_MEMRD },
434 {
"cmps", { ADDR_Y, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_STRING | I_CTRL | I_ALU | I_MEMRD },
436 {
"test", { R_AL, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, I_CTRL | I_ALU },
438 {
"test", { R_AX, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, I_CTRL | I_ALU},
440 {
"stos", { ADDR_X, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_STRING | I_MEMWR },
442 {
"stos", { ADDR_Y, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_STRING | I_MEMWR },
445 {
"lods", { ADDR_X, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_STRING | I_MEMRD },
447 {
"lods", { ADDR_Y, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_STRING | I_MEMRD },
449 {
"scas", { ADDR_X, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_STRING | I_MEMRD | I_ALU | I_CTRL },
451 {
"scas", { ADDR_Y, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_STRING | I_MEMRD | I_ALU | I_CTRL },
453 {
"mov", { R_AL, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, 0 },
455 {
"mov", { R_CL, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, 0 },
457 {
"mov", { R_DL, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, 0 },
459 {
"mov", { R_BL, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, 0 },
461 {
"mov", { R_AH, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, 0 },
463 {
"mov", { R_CH, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, 0 },
465 {
"mov", { R_DH, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, 0 },
467 {
"mov", { R_BH, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, 0 },
469 {
"mov", { R_AX, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, 0 },
471 {
"mov", { R_CX, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, 0 },
473 {
"mov", { R_DX, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, 0 },
475 {
"mov", { R_BX, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, 0 },
477 {
"mov", { R_SP, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, 0 },
479 {
"mov", { R_BP, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, 0 },
481 {
"mov", { R_SI, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, 0 },
483 {
"mov", { R_DI, ADDR_I, ADDR_0 }, { OP_E, OP_V, OP_0 }, NULL, 0 },
485 { NULL, { ADDR_E, ADDR_I, ADDR_0 }, { OP_B, OP_B, OP_0 }, shift_grp_2, 0 },
487 { NULL, { ADDR_E, ADDR_I, ADDR_0 }, { OP_V, OP_B, OP_0 }, shift_grp_2, 0 },
489 {
"ret", { ADDR_I, ADDR_0, ADDR_0 }, { OP_W, OP_0, OP_0 }, NULL, I_RET},
491 {
"ret", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_RET},
493 {
"les", { ADDR_G, ADDR_M, ADDR_0 }, { OP_V, OP_P, OP_0 }, NULL, I_MEMRD },
495 {
"lds", { ADDR_G, ADDR_M, ADDR_0 }, { OP_V, OP_P, OP_0 }, NULL, I_MEMRD },
497 { NULL, { ADDR_E, ADDR_I, ADDR_0 }, { OP_B, OP_B, OP_0 }, grp_11, 0 },
499 { NULL, { ADDR_E, ADDR_I, ADDR_0 }, { OP_V, OP_V, OP_0 }, grp_11, 0 },
501 {
"enter", { ADDR_I, ADDR_I, ADDR_0 }, { OP_W, OP_B, OP_0 }, NULL, 0 },
503 {
"leave", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_RET },
505 {
"retf", { ADDR_I, ADDR_0, ADDR_0 }, { OP_W, OP_0, OP_0 }, NULL, I_RET},
507 {
"retf", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_RET},
509 {
"int\t3", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
511 {
"int", { ADDR_I, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, 0 },
513 {
"into", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
515 {
"iret", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_RET },
517 { NULL, { ADDR_E, IMMED_1, ADDR_0 }, { OP_B, OP_0, OP_0 }, shift_grp_2, I_MEMWR },
519 { NULL, { ADDR_E, IMMED_1, ADDR_0 }, { OP_V, OP_0, OP_0 }, shift_grp_2, I_MEMWR },
521 { NULL, { ADDR_E, R_CL, ADDR_0 }, { OP_B, OP_0, OP_0 }, shift_grp_2, I_MEMWR },
523 { NULL, { ADDR_E, R_CL, ADDR_0 }, { OP_V, OP_0, OP_0 }, shift_grp_2, I_MEMWR },
525 {
"aam", { ADDR_I, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_ALU },
527 {
"aad", { ADDR_I, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_ALU },
529 {
"ill_d6", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
531 {
"xlatb", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_MEMRD },
533 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, d8_opcode, 0 },
535 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, d9_opcode, 0 },
537 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, da_opcode, 0 },
539 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, db_opcode, 0 },
541 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, dc_opcode, 0 },
543 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, dd_opcode, 0 },
545 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, de_opcode, 0 },
547 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, df_opcode, 0 },
549 {
"loopne", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
551 {
"loope", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
553 {
"loop", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
555 {
"jcxz", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP | I_CONDITIONAL },
557 {
"in", { R_AL, ADDR_I, ADDR_0 }, { OP_0, OP_B, OP_0 }, NULL, 0 },
559 {
"in", { R_AX, ADDR_I, ADDR_0 }, { OP_E, OP_B, OP_0 }, NULL, 0 },
561 {
"out", { ADDR_I, R_AL, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, 0 },
563 {
"out", { ADDR_I, R_AX, ADDR_0 }, { OP_B, OP_E, OP_0 }, NULL, 0 },
565 {
"call", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CALL },
567 {
"jmp", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_JUMP },
569 {
"jmp", { ADDR_A, ADDR_0, ADDR_0 }, { OP_P, OP_0, OP_0 }, NULL, I_JUMP },
571 {
"jmp short", { ADDR_J, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_JUMP },
573 {
"in", { R_AL, R_DX, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
575 {
"in", { R_AX, R_DX, ADDR_0 }, { OP_E, OP_0, OP_0 }, NULL, 0 },
577 {
"out", { R_DX, R_AL, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
579 {
"out", { R_DX, R_AX, ADDR_0 }, { OP_0, OP_E, OP_0 }, NULL, 0 },
581 {
"lock", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
583 {
"ill_f1", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
585 {
"repne", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
587 {
"repe", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
589 {
"hlt", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
591 {
"cmc", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_CTRL },
593 { NULL, { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, unary_grp_3, 0 },
595 { NULL, { ADDR_E, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, unary_grp_3, 0 },
597 {
"clc", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_CTRL },
599 {
"stc", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_CTRL },
601 {
"cli", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_CTRL },
603 {
"sti", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_CTRL },
605 {
"cld", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_CTRL },
607 {
"std", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_CTRL },
609 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, grp_4, 0 },
611 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, grp_5, 0 },
616 insn esc_0f_opcode_table[] = {
618 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, grp_6, 0 },
620 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, grp_7, 0 },
622 {
"lar", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_W, OP_0 }, NULL, I_MEMRD | I_CTRL },
624 {
"lsl", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_W, OP_0 }, NULL, I_MEMRD | I_CTRL },
626 {
"ill_0f04", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
628 {
"ill_0f05", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
630 {
"clts", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
632 {
"ill_0f07", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
634 {
"invd", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
636 {
"wbinvd", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
638 {
"ill_0f0a", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
640 {
"ud2", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
642 {
"ill_0f0c", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
644 {
"ill_0f0d", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
646 {
"ill_0f0e", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
648 {
"ill_0f0f", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
650 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f10_17, 0 },
652 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f10_17, 0 },
654 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f10_17, 0 },
656 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f10_17, 0 },
658 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f10_17, 0 },
660 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f10_17, 0 },
662 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f10_17, 0 },
664 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f10_17, 0 },
666 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, grp_16, 0 },
668 {
"ill_0f19", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
670 {
"ill_0f1a", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
672 {
"ill_0f1b", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
674 {
"ill_0f1c", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
676 {
"ill_0f1d", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
678 {
"ill_0f1e", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
680 {
"nop", { ADDR_E, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, 0 },
682 {
"mov", { ADDR_R, ADDR_C, ADDR_0 }, { OP_D, OP_D, OP_0 }, NULL, I_CTRL },
684 {
"mov", { ADDR_R, ADDR_D, ADDR_0 }, { OP_D, OP_D, OP_0 }, NULL, 0 },
686 {
"mov", { ADDR_C, ADDR_R, ADDR_0 }, { OP_D, OP_D, OP_0 }, NULL, I_CTRL },
688 {
"mov", { ADDR_D, ADDR_R, ADDR_0 }, { OP_D, OP_D, OP_0 }, NULL, 0 },
690 {
"mov", { ADDR_R, ADDR_T, ADDR_0 }, { OP_D, OP_D, OP_0 }, NULL, 0 },
692 {
"ill_0f25", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
694 {
"mov", { ADDR_T, ADDR_R, ADDR_0 }, { OP_D, OP_D, OP_0 }, NULL, 0 },
696 {
"ill_0f27", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
698 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f28_2f, 0 },
700 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f28_2f, 0 },
702 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f28_2f, 0 },
704 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f28_2f, 0 },
706 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f28_2f, 0 },
708 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f28_2f, 0 },
710 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f28_2f, 0 },
712 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f28_2f, 0 },
714 {
"wrmsr", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
716 {
"rdtsc", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
718 {
"rdmsr", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
720 {
"rdpmc", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
722 {
"sysenter", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
724 {
"sysexit", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
726 {
"ill_0f36", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
728 {
"ill_0f37", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
730 {
"ill_0f38", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
732 {
"ill_0f39", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
734 {
"ill_0f3a", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
736 {
"ill_0f3b", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
738 {
"ill_0f3c", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
740 {
"ill_0f3d", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
742 {
"ill_0f3e", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
744 {
"ill_0f3f", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
746 {
"cmovo", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
748 {
"cmovno", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
750 {
"cmovb", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
752 {
"cmovnb", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
754 {
"cmove", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
756 {
"cmovne", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
758 {
"cmovna", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
760 {
"cmova", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
762 {
"cmovs", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
764 {
"cmovns", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
766 {
"cmovp", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
768 {
"cmovnp", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
770 {
"cmovl", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
772 {
"cmovge", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
774 {
"cmovle", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
776 {
"cmovg", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_CONDITIONAL | I_MEMRD },
778 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
780 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
782 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
784 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
786 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
788 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
790 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
792 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
794 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
796 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
798 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
800 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
802 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
804 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
806 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
808 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
810 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
812 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
814 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
816 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
818 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
820 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
822 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
824 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
826 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
828 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
830 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
832 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
834 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
836 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
838 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
840 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
842 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f50_70, 0 },
844 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, grp_12, 0 },
846 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, grp_13, 0 },
848 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, grp_14, 0 },
850 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f74_76, 0 },
852 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f74_76, 0 },
854 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f74_76, 0 },
856 {
"emms", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_CTRL | I_FPU },
858 {
"mmxud", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
860 {
"mmxud", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
862 {
"mmxud", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
864 {
"mmxud", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
866 {
"mmxud", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
868 {
"mmxud", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
870 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f7e_7f, 0 },
872 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0f7e_7f, 0 },
874 {
"jo", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
876 {
"jno", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
878 {
"jb", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
880 {
"jae", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
882 {
"je", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
884 {
"jne", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
886 {
"jbe", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
888 {
"ja", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
890 {
"js", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
892 {
"jns", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
894 {
"jp", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
896 {
"jnp", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
898 {
"jl", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
900 {
"jge", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
902 {
"jle", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
904 {
"jg", { ADDR_J, ADDR_0, ADDR_0 }, { OP_V, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_JUMP },
906 {
"seto", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
908 {
"setno", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
910 {
"setb", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
912 {
"setae", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
914 {
"sete", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
916 {
"setne", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
918 {
"setbe", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
920 {
"seta", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
922 {
"sets", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
924 {
"setns", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
926 {
"setp", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
928 {
"setnp", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
930 {
"setl", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
932 {
"setge", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
934 {
"setle", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
936 {
"setg", { ADDR_E, ADDR_0, ADDR_0 }, { OP_B, OP_0, OP_0 }, NULL, I_CONDITIONAL | I_MEMWR },
938 {
"push", { R_FS, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_PUSHPOP },
940 {
"pop", { R_FS, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_PUSHPOP },
942 {
"cpuid", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
944 {
"bt", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_CTRL },
946 {
"shld", { ADDR_E, ADDR_G, ADDR_I }, { OP_V, OP_V, OP_B }, NULL, I_MEMWR | I_MEMRD | I_ALU },
948 {
"shld", { ADDR_E, ADDR_G, R_CL }, { OP_V, OP_V, OP_0 }, NULL, I_MEMWR | I_MEMRD| I_ALU },
950 {
"ill_0fa6", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
952 {
"ill_0fa7", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
954 {
"push", { R_GS, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_PUSHPOP },
956 {
"pop", { R_GS, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, I_PUSHPOP },
958 {
"rsm", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
960 {
"bts", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_MEMWR | I_CTRL },
962 {
"shrd", { ADDR_E, ADDR_G, ADDR_I }, { OP_V, OP_V, OP_B }, NULL, I_MEMWR | I_MEMRD | I_ALU },
964 {
"shrd", { ADDR_E, ADDR_G, R_CL }, { OP_V, OP_V, OP_0 }, NULL, I_MEMWR | I_MEMRD | I_ALU },
966 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, grp_15, 0 },
968 {
"imul", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_ALU },
970 {
"cmpxchg", { ADDR_E, ADDR_G, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMRD | I_MEMWR | I_CTRL | I_CONDITIONAL | I_ALU },
972 {
"cmpxchg", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_MEMWR | I_CTRL | I_CONDITIONAL | I_ALU },
975 {
"lss", { ADDR_G, ADDR_M, ADDR_0 }, { OP_V, OP_P, OP_0 }, NULL, I_MEMRD },
977 {
"btr", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_MEMWR | I_CTRL },
980 {
"lfs", { ADDR_G, ADDR_M, ADDR_0 }, { OP_V, OP_P, OP_0 }, NULL, I_MEMRD },
983 {
"lgs", { ADDR_G, ADDR_M, ADDR_0 }, { OP_V, OP_P, OP_0 }, NULL, I_MEMRD },
985 {
"movzx", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_B, OP_0 }, NULL, I_MEMRD },
987 {
"movzx", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_W, OP_0 }, NULL, I_MEMRD },
989 {
"ill_0fb8", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
991 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, grp_10, 0 },
993 { NULL, { ADDR_E, ADDR_I, ADDR_0 }, { OP_V, OP_B, OP_0 }, grp_8, 0 },
995 {
"btc", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_MEMWR | I_CTRL | I_ALU },
997 {
"bsf", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_CTRL | I_ALU },
999 {
"bsr", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_CTRL | I_ALU },
1001 {
"movsx", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_B, OP_0 }, NULL, I_MEMRD },
1003 {
"movsx", { ADDR_G, ADDR_E, ADDR_0 }, { OP_V, OP_W, OP_0 }, NULL, I_MEMRD },
1005 {
"xadd", { ADDR_E, ADDR_G, ADDR_0 }, { OP_B, OP_B, OP_0 }, NULL, I_MEMRD | I_MEMWR | I_ALU },
1007 {
"xadd", { ADDR_E, ADDR_G, ADDR_0 }, { OP_V, OP_V, OP_0 }, NULL, I_MEMRD | I_MEMWR | I_ALU },
1009 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fc2, 0 },
1012 {
"movnti", { ADDR_M, ADDR_G, ADDR_0 }, { OP_Y, OP_Y, OP_0 }, NULL, I_MEMWR },
1014 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fc4_c6, 0 },
1016 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fc4_c6, 0 },
1018 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fc4_c6, 0 },
1020 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, grp_9, 0 },
1022 {
"bswap", { R_EAX, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
1024 {
"bswap", { R_ECX, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
1026 {
"bswap", { R_EDX, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
1028 {
"bswap", { R_EBX, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
1030 {
"bswap", { R_ESP, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
1032 {
"bswap", { R_EBP, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
1034 {
"bswap", { R_ESI, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
1036 {
"bswap", { R_EDI, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
1038 {
"ill_0fd0", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
1040 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1042 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1044 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1046 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1048 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1050 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1052 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1054 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1056 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1058 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1060 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1062 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1064 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1066 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1068 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1070 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1072 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1074 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1076 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1078 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1080 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1082 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1084 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1086 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1088 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1090 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1092 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1094 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1096 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1098 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1100 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0fd1_ef, 0 },
1102 {
"ill_0ff0", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
1104 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0ff1_fe, 0 },
1106 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0ff1_fe, 0 },
1108 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0ff1_fe, 0 },
1110 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0ff1_fe, 0 },
1112 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0ff1_fe, 0 },
1114 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0ff1_fe, 0 },
1116 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0ff1_fe, 0 },
1118 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0ff1_fe, 0 },
1120 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0ff1_fe, 0 },
1122 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0ff1_fe, 0 },
1124 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0ff1_fe, 0 },
1126 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0ff1_fe, 0 },
1128 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0ff1_fe, 0 },
1130 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, esc_0ff1_fe, 0 },
1132 {
"ill_0fff", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
1141 unsigned char opcode;
1144 opcode = state->text[state->pos++];
1147 state->addr[0] = table[opcode].addr_method[0];
1148 state->addr[1] = table[opcode].addr_method[1];
1149 state->addr[2] = table[opcode].addr_method[2];
1151 state->op[0] = table[opcode].operand_type[0];
1152 state->op[1] = table[opcode].operand_type[1];
1153 state->op[2] = table[opcode].operand_type[2];
1155 state->opcode[1] = opcode;
1158 if(table[opcode].instruction != NULL) {
1159 strcpy(state->instrument->mnemonic, table[opcode].instruction);
1163 state->instrument->flags = table[opcode].flags;
1166 if(table[opcode].instruction == NULL) {
1168 if(table[opcode].esc_function == NULL) {
1169 fprintf(stderr,
"%s:%d: Errore interno\n", __FILE__, __LINE__);
1172 table[opcode].esc_function(state);
1184 state->modrm = state->text[state->pos];
1186 state->read_modrm =
true;
1196 char *instructions[4][2] = {{
"fadd",
"fmul"}, {
"fcom",
"fcomp"}, {
"fsub",
"fsubr"}, {
"fdiv",
"fdivr"}};
1198 enum addr_method floatingPointRegisters[8] = {R_ST0, R_ST1, R_ST2, R_ST3, R_ST4, R_ST5, R_ST6, R_ST7};
1203 state->instrument->flags |= I_FPU;
1205 if(state->modrm > 0xbf) {
1206 row = (state->modrm >> 4) - 0xC;
1207 col = ((state->modrm & 0x0F) < 0x8) ? 0 : 1;
1219 state->addr[0] = floatingPointRegisters[0];
1220 state->addr[1] = floatingPointRegisters[state->modrm & 0x07];
1251 row = ((state->modrm >> 3) & 0x07) / 2;
1252 col = ((state->modrm >> 3) & 0x07) % 2;
1254 switch((state->modrm >> 3) & 0x07) {
1256 strcpy(state->instrument->mnemonic,
"fadd");
1259 strcpy(state->instrument->mnemonic,
"fmul");
1262 strcpy(state->instrument->mnemonic,
"fcom");
1265 strcpy(state->instrument->mnemonic,
"fcomp");
1268 strcpy(state->instrument->mnemonic,
"fsub");
1271 strcpy(state->instrument->mnemonic,
"fsubr");
1274 strcpy(state->instrument->mnemonic,
"fdiv");
1277 strcpy(state->instrument->mnemonic,
"fdivr");
1282 state->addr[0] = ADDR_M;
1283 state->op[0] = OP_D;
1285 state->instrument->flags |= I_MEMRD;
1289 strcpy(state->instrument->mnemonic, instructions[row][col]);
1292 state->instrument->flags |= I_CTRL;
1294 state->instrument->flags |= I_PUSHPOP;
1303 enum addr_method floatingPointRegisters[8] = {R_ST0, R_ST1, R_ST2, R_ST3, R_ST4, R_ST5, R_ST6, R_ST7};
1306 state->instrument->flags |= I_FPU;
1308 if(state->modrm > 0xbf) {
1309 switch(state->modrm >> 4) {
1311 strcpy(state->instrument->mnemonic, (state->modrm < 0xc8) ?
"fld" :
"fxch");
1312 state->addr[0] = floatingPointRegisters[state->modrm & 0x07];
1313 if(state->modrm < 0x8C)
1314 state->instrument->flags |= I_PUSHPOP;
1318 if(state->modrm == 0xd0) {
1319 strcpy(state->instrument->mnemonic,
"fnop");
1321 strcpy(state->instrument->mnemonic,
"ill_d9");
1322 state->instrument->flags &= ~I_FPU;
1327 switch(state->modrm & 0x0f) {
1329 strcpy(state->instrument->mnemonic,
"fchs");
1330 state->addr[0] = R_ST0;
1333 strcpy(state->instrument->mnemonic,
"fabs");
1334 state->addr[0] = R_ST0;
1337 strcpy(state->instrument->mnemonic,
"fchs");
1338 state->addr[0] = R_ST0;
1339 state->instrument->flags |= I_CTRL;
1342 strcpy(state->instrument->mnemonic,
"fxam");
1343 state->addr[0] = R_ST0;
1344 state->instrument->flags |= I_CTRL;
1347 strcpy(state->instrument->mnemonic,
"fld1");
1348 state->instrument->flags |= I_PUSHPOP;
1351 strcpy(state->instrument->mnemonic,
"fldl2t");
1352 state->instrument->flags |= I_PUSHPOP;
1355 strcpy(state->instrument->mnemonic,
"fldl2e");
1356 state->instrument->flags |= I_PUSHPOP;
1359 strcpy(state->instrument->mnemonic,
"flpi");
1360 state->instrument->flags |= I_PUSHPOP;
1363 strcpy(state->instrument->mnemonic,
"fldlg2");
1364 state->instrument->flags |= I_PUSHPOP;
1367 strcpy(state->instrument->mnemonic,
"fldln2");
1368 state->instrument->flags |= I_PUSHPOP;
1371 strcpy(state->instrument->mnemonic,
"fldz");
1372 state->instrument->flags |= I_PUSHPOP;
1375 strcpy(state->instrument->mnemonic,
"ill_d9");
1376 state->instrument->flags &= ~I_FPU;
1382 switch(state->modrm & 0X0f) {
1384 strcpy(state->instrument->mnemonic,
"f2xm1");
1387 strcpy(state->instrument->mnemonic,
"fyl2x");
1388 state->instrument->flags |= I_PUSHPOP;
1391 strcpy(state->instrument->mnemonic,
"fptan");
1392 state->instrument->flags |= I_PUSHPOP;
1395 strcpy(state->instrument->mnemonic,
"fpatan");
1396 state->instrument->flags |= I_PUSHPOP;
1399 strcpy(state->instrument->mnemonic,
"fxtract");
1400 state->instrument->flags |= I_PUSHPOP;
1403 strcpy(state->instrument->mnemonic,
"fprem1");
1406 strcpy(state->instrument->mnemonic,
"fdecstp");
1407 state->instrument->flags |= I_CTRL;
1410 strcpy(state->instrument->mnemonic,
"fincstp");
1411 state->instrument->flags |= I_CTRL;
1414 strcpy(state->instrument->mnemonic,
"fprem");
1417 strcpy(state->instrument->mnemonic,
"fyl2xp1");
1418 state->instrument->flags |= I_PUSHPOP;
1421 strcpy(state->instrument->mnemonic,
"fsqrt");
1424 strcpy(state->instrument->mnemonic,
"fsincos");
1425 state->instrument->flags |= I_PUSHPOP;
1428 strcpy(state->instrument->mnemonic,
"frndint");
1431 strcpy(state->instrument->mnemonic,
"fscale");
1434 strcpy(state->instrument->mnemonic,
"fsin");
1437 strcpy(state->instrument->mnemonic,
"fcos");
1443 state->addr[0] = ADDR_M;
1447 switch((state->modrm >> 3) & 0x07) {
1450 strcpy(state->instrument->mnemonic,
"fld");
1451 state->op[0] = OP_D;
1452 state->instrument->flags |= I_MEMRD | I_PUSHPOP;
1456 strcpy(state->instrument->mnemonic,
"fst");
1457 state->op[0] = OP_D;
1458 state->instrument->flags |= I_MEMWR;
1462 strcpy(state->instrument->mnemonic,
"fstp");
1463 state->op[0] = OP_D;
1464 state->instrument->flags |= I_MEMWR | I_PUSHPOP;
1468 strcpy(state->instrument->mnemonic,
"fldenv");
1469 state->op[0] = OP_FS;
1470 state->instrument->flags |= I_MEMRD;
1474 strcpy(state->instrument->mnemonic,
"fldcw");
1475 state->op[0] = OP_W;
1476 state->instrument->flags |= I_MEMRD | I_CTRL;
1480 strcpy(state->instrument->mnemonic,
"fstenv");
1481 state->op[0] = OP_FS;
1482 state->instrument->flags |= I_MEMWR;
1486 strcpy(state->instrument->mnemonic,
"fstcw");
1487 state->op[0] = OP_W;
1488 state->instrument->flags |= I_MEMWR | I_CTRL;
1492 state->addr[0] = ADDR_0;
1493 state->op[0] = OP_0;
1494 state->instrument->flags &= ~I_FPU;
1504 enum addr_method floatingPointRegisters[8] = {R_ST0, R_ST1, R_ST2, R_ST3, R_ST4, R_ST5, R_ST6, R_ST7};
1507 state->instrument->flags |= I_FPU;
1509 if(state->modrm > 0xbf) {
1511 if(state->modrm == 0xe9) {
1512 strcpy(state->instrument->mnemonic,
"fucompp");
1513 state->instrument->flags |= I_CTRL | I_PUSHPOP;
1517 switch(state->modrm >> 4) {
1520 strcpy(state->instrument->mnemonic, (state->modrm < 0xc8) ?
"fcmovb" :
"fcmove");
1524 strcpy(state->instrument->mnemonic, (state->modrm < 0xd8) ?
"fcmovbe" :
"fcmovu");
1528 strcpy(state->instrument->mnemonic,
"ill_da");
1529 state->instrument->flags &= ~I_FPU;
1535 state->instrument->flags |= I_CONDITIONAL;
1536 state->addr[0] = R_ST0;
1537 state->addr[1] = floatingPointRegisters[state->modrm & 0x07];
1540 state->addr[0] = ADDR_M;
1541 state->op[0] = OP_D;
1542 state->instrument->flags |= I_MEMRD;
1544 switch((state->modrm >> 3) & 0x07) {
1547 strcpy(state->instrument->mnemonic,
"fiadd");
1551 strcpy(state->instrument->mnemonic,
"fimul");
1555 strcpy(state->instrument->mnemonic,
"ficom");
1556 state->instrument->flags |= I_CTRL;
1560 strcpy(state->instrument->mnemonic,
"ficomp");
1561 state->instrument->flags |= I_CTRL | I_PUSHPOP;
1565 strcpy(state->instrument->mnemonic,
"fisub");
1569 strcpy(state->instrument->mnemonic,
"fisubr");
1573 strcpy(state->instrument->mnemonic,
"fidiv");
1577 strcpy(state->instrument->mnemonic,
"fidivr");
1589 enum addr_method floatingPointRegisters[8] = {R_ST0, R_ST1, R_ST2, R_ST3, R_ST4, R_ST5, R_ST6, R_ST7};
1592 state->instrument->flags |= I_FPU;
1594 if(state->modrm > 0xbf) {
1595 if(state->modrm == 0xe2) {
1596 strcpy(state->instrument->mnemonic,
"fclex");
1597 state->instrument->flags |= I_CTRL;
1599 }
else if(state->modrm == 0xe3) {
1600 strcpy(state->instrument->mnemonic,
"finit");
1601 state->instrument->flags |= I_CTRL;
1603 }
else if(state->modrm > 0xf7 || (state->modrm > 0xdf && state->modrm < 0xe8)) {
1604 strcpy(state->instrument->mnemonic,
"ill_db");
1605 state->instrument->flags &= ~I_FPU;
1607 state->addr[0] = R_ST0;
1608 state->addr[1] = floatingPointRegisters[state->modrm && 0x07];
1610 switch(state->modrm >> 4) {
1612 strcpy(state->instrument->mnemonic, (state->modrm < 0xc8) ?
"fcmovnb" :
"fcmovne");
1613 state->instrument->flags |= I_CONDITIONAL;
1616 strcpy(state->instrument->mnemonic, (state->modrm < 0xc8) ?
"fcmovnbe" :
"fcmovnu");
1617 state->instrument->flags |= I_CONDITIONAL;
1620 strcpy(state->instrument->mnemonic,
"fucomi");
1621 state->instrument->flags |= I_CTRL;
1624 strcpy(state->instrument->mnemonic,
"fcomi");
1625 state->instrument->flags |= I_CTRL;
1630 state->addr[0] = ADDR_M;
1632 switch((state->modrm >> 3) & 0x07) {
1634 strcpy(state->instrument->mnemonic,
"fild");
1635 state->op[0] = OP_W;
1636 state->instrument->flags |= I_MEMRD | I_PUSHPOP;
1639 strcpy(state->instrument->mnemonic,
"fisttp");
1640 state->op[0] = OP_W;
1641 state->instrument->flags |= I_MEMWR | I_PUSHPOP;
1644 strcpy(state->instrument->mnemonic,
"fist");
1645 state->instrument->flags |= I_MEMWR;
1646 state->op[0] = OP_D;
1649 strcpy(state->instrument->mnemonic,
"fistp");
1650 state->instrument->flags |= I_MEMWR | I_PUSHPOP;
1651 state->op[0] = OP_D;
1654 strcpy(state->instrument->mnemonic,
"fld");
1655 state->instrument->flags |= I_MEMRD | I_PUSHPOP;
1656 state->op[0] = OP_M80;
1659 strcpy(state->instrument->mnemonic,
"fstp");
1660 state->instrument->flags |= I_MEMWR | I_PUSHPOP;
1661 state->op[0] = OP_M80;
1664 state->addr[0] = ADDR_0;
1665 strcpy(state->instrument->mnemonic,
"ill_db");
1666 state->instrument->flags &= ~I_FPU;
1676 enum addr_method floatingPointRegisters[8] = {R_ST0, R_ST1, R_ST2, R_ST3, R_ST4, R_ST5, R_ST6, R_ST7};
1679 state->instrument->flags |= I_FPU;
1681 if(state->modrm > 0xbf) {
1682 if(state->modrm >> 4 == 0xd) {
1683 strcpy(state->instrument->mnemonic,
"ill_dc");
1684 state->instrument->flags &= ~I_FPU;
1686 state->addr[1] = R_ST0;
1687 state->addr[0] = floatingPointRegisters[state->modrm & 0x07];
1689 switch(state->modrm >> 4) {
1691 strcpy(state->instrument->mnemonic, (state->modrm < 0xc8) ?
"fadd" :
"fmul");
1694 strcpy(state->instrument->mnemonic, (state->modrm < 0xc8) ?
"fsubr" :
"fsub");
1697 strcpy(state->instrument->mnemonic, (state->modrm < 0xc8) ?
"fdivr" :
"fdiv");
1702 state->addr[0] = ADDR_M;
1703 state->op[0] = OP_Q;
1704 state->instrument->flags |= I_MEMRD;
1706 switch((state->modrm >> 3) & 0x07) {
1708 strcpy(state->instrument->mnemonic,
"fadd");
1711 strcpy(state->instrument->mnemonic,
"fmul");
1714 strcpy(state->instrument->mnemonic,
"fcom");
1715 state->instrument->flags |= I_CTRL;
1718 strcpy(state->instrument->mnemonic,
"fcomp");
1719 state->instrument->flags |= I_CTRL | I_PUSHPOP;
1722 strcpy(state->instrument->mnemonic,
"fsub");
1725 strcpy(state->instrument->mnemonic,
"fsubr");
1728 strcpy(state->instrument->mnemonic,
"fdiv");
1731 strcpy(state->instrument->mnemonic,
"fdivr");
1742 enum addr_method floatingPointRegisters[8] = {R_ST0, R_ST1, R_ST2, R_ST3, R_ST4, R_ST5, R_ST6, R_ST7};
1745 state->instrument->flags |= I_FPU;
1747 if(state->modrm > 0xbf) {
1748 if((state->modrm >= 0xc8 && state->modrm <= 0xcf) || state->modrm >= 0xf0) {
1749 strcpy(state->instrument->mnemonic,
"ill_dd");
1750 state->instrument->flags &= ~I_FPU;
1754 if(state->modrm > 0xdf && state->modrm < 0xe8)
1755 state->addr[1] = R_ST0;
1757 state->addr[0] = floatingPointRegisters[state->modrm & 0x07];
1759 switch(state->modrm >> 4) {
1761 strcpy(state->instrument->mnemonic,
"ffree");
1764 if(state->modrm < 0xd8) {
1765 strcpy(state->instrument->mnemonic,
"fst");
1768 strcpy(state->instrument->mnemonic,
"fstp");
1770 state->instrument->flags |= I_PUSHPOP;
1774 if(state->modrm < 0xe8) {
1775 strcpy(state->instrument->mnemonic,
"fucom");
1776 state->instrument->flags |= I_CTRL;
1778 strcpy(state->instrument->mnemonic,
"fucomp");
1779 state->instrument->flags |= I_PUSHPOP | I_CTRL;
1785 state->addr[0] = ADDR_M;
1786 state->op[0] = OP_Q;
1788 switch((state->modrm >> 3) & 0x07) {
1790 strcpy(state->instrument->mnemonic,
"fld");
1791 state->instrument->flags |= I_MEMRD | I_PUSHPOP;
1794 strcpy(state->instrument->mnemonic,
"fisttp");
1795 state->instrument->flags |= I_MEMWR | I_PUSHPOP;
1798 strcpy(state->instrument->mnemonic,
"fst");
1799 state->instrument->flags |= I_MEMWR;
1802 strcpy(state->instrument->mnemonic,
"fstp");
1803 state->instrument->flags |= I_MEMWR | I_PUSHPOP;
1806 strcpy(state->instrument->mnemonic,
"frstor");
1807 state->instrument->flags |= I_MEMRD | I_CTRL;
1808 state->op[0] = OP_FSR;
1811 strcpy(state->instrument->mnemonic,
"fsave");
1812 state->instrument->flags |= I_MEMWR | I_CTRL;
1813 state->op[0] = OP_FSR;
1816 strcpy(state->instrument->mnemonic,
"fstsw");
1817 state->op[0] = OP_W;
1818 state->instrument->flags |= I_MEMWR | I_CTRL;
1821 strcpy(state->instrument->mnemonic,
"ill_dd");
1822 state->addr[0] = ADDR_0;
1823 state->op[0] = OP_0;
1824 state->instrument->flags &= ~I_FPU;
1834 enum addr_method floatingPointRegisters[8] = {R_ST0, R_ST1, R_ST2, R_ST3, R_ST4, R_ST5, R_ST6, R_ST7};
1837 state->instrument->flags |= I_FPU;
1839 if(state->modrm > 0xbf) {
1840 state->instrument->flags |= I_PUSHPOP;
1841 if(state->modrm == 0xd9){
1842 strcpy(state->instrument->mnemonic,
"fcompp");
1843 state->instrument->flags |= I_CTRL;
1845 else if(state->modrm >> 4 == 0xd) {
1846 strcpy(state->instrument->mnemonic,
"ill_de");
1847 state->instrument->flags &= ~I_PUSHPOP & ~I_FPU;
1850 state->addr[1] = R_ST0;
1851 state->addr[0] = floatingPointRegisters[state->modrm & 0x07];
1853 switch(state->modrm & 0xf8) {
1855 strcpy(state->instrument->mnemonic,
"faddp");
1858 strcpy(state->instrument->mnemonic,
"fmulp");
1861 strcpy(state->instrument->mnemonic,
"fsubrp");
1864 strcpy(state->instrument->mnemonic,
"fsubp");
1867 strcpy(state->instrument->mnemonic,
"fdivrp");
1870 strcpy(state->instrument->mnemonic,
"fdivp");
1874 state->addr[0] = ADDR_M;
1875 state->op[0] = OP_W;
1876 state->instrument->flags |= I_MEMRD;
1878 switch((state->modrm >> 3) & 0x07) {
1880 strcpy(state->instrument->mnemonic,
"fiadd");
1883 strcpy(state->instrument->mnemonic,
"fimul");
1886 strcpy(state->instrument->mnemonic,
"ficom");
1889 strcpy(state->instrument->mnemonic,
"ficomp");
1890 state->instrument->flags |= I_PUSHPOP;
1893 strcpy(state->instrument->mnemonic,
"fisub");
1896 strcpy(state->instrument->mnemonic,
"fisubr");
1899 strcpy(state->instrument->mnemonic,
"fidiv");
1902 strcpy(state->instrument->mnemonic,
"fidivr");
1913 enum addr_method floatingPointRegisters[8] = {R_ST0, R_ST1, R_ST2, R_ST3, R_ST4, R_ST5, R_ST6, R_ST7};
1916 state->instrument->flags |= I_FPU;
1921 if(state->modrm > 0xbf) {
1922 if(state->modrm == 0xe0) {
1923 strcpy(state->instrument->mnemonic,
"fstsw");
1924 state->addr[0] = R_AX;
1925 state->instrument->flags |= I_CTRL;
1926 }
else if(state->modrm < 0xe8 || state->modrm > 0xf7) {
1927 strcpy(state->instrument->mnemonic,
"ill_df");
1928 state->instrument->flags &= ~I_FPU;
1931 state->addr[0] = R_ST0;
1932 state->addr[1] = floatingPointRegisters[state->modrm & 0x07];
1933 state->instrument->flags |= I_CTRL | I_PUSHPOP;
1934 strcpy(state->instrument->mnemonic, (state->modrm > 0xef) ?
"fcomip" :
"fucomip");
1937 unsigned char enc = (state->modrm >> 3) & 0x07;
1938 state->addr[0] = ADDR_M;
1943 strcpy(state->instrument->mnemonic,
"fild");
1944 state->op[0] = OP_W;
1945 state->instrument->flags |= I_MEMRD | I_PUSHPOP;
1948 strcpy(state->instrument->mnemonic,
"fisttp");
1949 state->op[0] = OP_W;
1950 state->instrument->flags |= I_MEMWR | I_PUSHPOP;
1953 strcpy(state->instrument->mnemonic,
"fist");
1954 state->op[0] = OP_W;
1955 state->instrument->flags |= I_MEMWR;
1958 strcpy(state->instrument->mnemonic,
"fistp");
1959 state->op[0] = OP_W;
1960 state->instrument->flags |= I_MEMWR | I_PUSHPOP;
1963 strcpy(state->instrument->mnemonic,
"fbld");
1964 state->op[0] = OP_M80;
1965 state->instrument->flags |= I_MEMRD;
1968 strcpy(state->instrument->mnemonic,
"fild");
1969 state->op[0] = OP_Q;
1970 state->instrument->flags |= I_MEMRD | I_PUSHPOP;
1973 strcpy(state->instrument->mnemonic,
"fbstp");
1974 state->op[0] = OP_M80;
1975 state->instrument->flags |= I_MEMWR | I_PUSHPOP;
1978 strcpy(state->instrument->mnemonic,
"fistp");
1979 state->op[0] = OP_Q;
1980 state->instrument->flags |= I_MEMWR | I_PUSHPOP;
1993 int sse_prefix_to_index (
unsigned char sse_prefix)
1997 switch(sse_prefix) {
2011 fprintf(stderr,
"%s:%d: Unexpected SSE prefix: %d\n", __FILE__, __LINE__, sse_prefix);
2026 instruction = (table[state->opcode[1] - base][sse_prefix_to_index(state->sse_prefix)]);
2028 state->addr[0] = instruction.addr_method[0];
2029 state->addr[1] = instruction.addr_method[1];
2030 state->addr[2] = instruction.addr_method[2];
2032 state->op[0] = instruction.operand_type[0];
2033 state->op[1] = instruction.operand_type[1];
2034 state->op[2] = instruction.operand_type[2];
2036 state->instrument->flags = instruction.flags;
2050 {
"movups", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_SSE | I_XMM },
2052 {
"movupd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2054 {
"movsd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SD, OP_SD, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2056 {
"movss", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SS, OP_SS, OP_0 }, NULL, I_MEMRD | I_SSE | I_XMM }
2061 {
"movups", { ADDR_W, ADDR_V, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMWR | I_SSE | I_XMM },
2063 {
"movupd", { ADDR_W, ADDR_V, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMWR | I_SSE2 | I_XMM },
2065 {
"movsd", { ADDR_W, ADDR_V, ADDR_0 }, { OP_SD, OP_SD, OP_0 }, NULL, I_MEMWR | I_SSE2 | I_XMM },
2067 {
"movss", { ADDR_W, ADDR_V, ADDR_0 }, { OP_SS, OP_SS, OP_0 }, NULL, I_MEMWR | I_SSE | I_XMM }
2072 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2074 {
"movlpd", { ADDR_V, ADDR_M, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2076 {
"ill_f20f12", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2078 {
"ill_f20f13", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2083 {
"movlps", { ADDR_M, ADDR_V, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_MEMWR | I_SSE | I_XMM },
2085 {
"movlpd", { ADDR_M, ADDR_V, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_MEMWR | I_SSE2 | I_XMM },
2087 {
"ill_f20f13", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2089 {
"ill_f30f13", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2094 {
"unpcklps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_Q, OP_0 }, NULL, I_MEMRD | I_SSE | I_XMM },
2096 {
"unpcklpd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_Q, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2098 {
"ill_f20f14", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2100 {
"ill_f30f14", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2105 {
"unpckhps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_Q, OP_0 }, NULL, I_MEMRD | I_SSE | I_XMM },
2107 {
"unpckhpd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_Q, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2109 {
"ill_f20f15", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2111 {
"ill_f30f15", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2116 { NULL, { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2118 {
"movhpd", { ADDR_V, ADDR_M, ADDR_0 }, { OP_DQ, OP_Q, OP_0 }, NULL, I_MEMRD | I_SSE2 },
2120 {
"ill_f20f16", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2122 {
"ill_f30f16", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2127 {
"movhps", { ADDR_M, ADDR_V, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_MEMWR | I_SSE },
2129 {
"movhpd", { ADDR_M, ADDR_V, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_MEMWR | I_SSE2 },
2131 {
"ill_f20f17", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2133 {
"ill_f30f17", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2137 if((state->opcode[1] == 0x12 || state->opcode[1] == 0x16) && state->sse_prefix == 0) {
2138 unsigned char opcode = state->opcode[1];
2144 {
"movlps", { ADDR_V, ADDR_M, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_MEMWR | I_SSE },
2146 {
"movhlps", { ADDR_V, ADDR_V, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, 0 },
2150 {
"movhps", { ADDR_V, ADDR_M, ADDR_0 }, { OP_DQ, OP_Q, OP_0 }, NULL, I_MEMRD | I_SSE },
2153 {
"movlhps", { ADDR_V, ADDR_V, ADDR_0 }, { OP_DQ, OP_Q, OP_0 }, NULL, I_SSE }
2158 if(state->modrm >> 6 == 0x3) {
2170 state->addr[0] = tbl[idx].addr_method[0];
2171 state->addr[1] = tbl[idx].addr_method[1];
2172 state->addr[2] = tbl[idx].addr_method[2];
2174 state->op[0] = tbl[idx].operand_type[0];
2175 state->op[1] = tbl[idx].operand_type[1];
2176 state->op[2] = tbl[idx].operand_type[2];
2181 sse_esc(state, table, 0x10);
2190 {
"movaps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_SSE | I_XMM },
2192 {
"movapd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2194 {
"ill_f20f28", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2196 {
"ill_f30f28", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2201 {
"movaps", { ADDR_W, ADDR_V, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMWR | I_SSE | I_XMM },
2203 {
"movapd", { ADDR_W, ADDR_V, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMWR | I_SSE2 | I_XMM },
2205 {
"ill_f20f29", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2207 {
"ill_f30f29", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2212 {
"cvtpi2ps", { ADDR_V, ADDR_Q, ADDR_0 }, { OP_PS, OP_PI, OP_0 }, NULL, I_MEMRD | I_MMX | I_XMM },
2214 {
"cvtpi2pd", { ADDR_V, ADDR_Q, ADDR_0 }, { OP_PD, OP_PI, OP_0 }, NULL, I_MEMRD | I_MMX | I_XMM },
2216 {
"cvtsi2sd", { ADDR_V, ADDR_E, ADDR_0 }, { OP_SD, OP_Y, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2218 {
"cvtsi2ss", { ADDR_V, ADDR_E, ADDR_0 }, { OP_SS, OP_Y, OP_0 }, NULL, I_MEMRD | I_SSE | I_XMM }
2223 {
"movntps", { ADDR_M, ADDR_V, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMWR | I_SSE | I_XMM },
2225 {
"movntpd", { ADDR_M, ADDR_V, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMWR | I_SSE2 | I_XMM },
2227 {
"ill_f20f2b", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2229 {
"ill_f30f2b", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2234 {
"cvttps2pi", { ADDR_P, ADDR_W, ADDR_0 }, { OP_PI, OP_PS, OP_0 }, NULL, I_MEMRD | I_MMX | I_XMM },
2236 {
"cvttpd2pi", { ADDR_P, ADDR_W, ADDR_0 }, { OP_PI, OP_PD, OP_0}, NULL, I_MEMRD | I_MMX | I_XMM },
2238 {
"cvttsd2si", { ADDR_G, ADDR_W, ADDR_0 }, { OP_Y, OP_SD, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2240 {
"cvttss2si", { ADDR_G, ADDR_W, ADDR_0 }, { OP_Y, OP_SS, OP_0 }, NULL, I_MEMRD | I_SSE | I_XMM }
2245 {
"cvtps2pi", { ADDR_P, ADDR_W, ADDR_0 }, { OP_PI, OP_PS, OP_0 }, NULL, I_MEMRD | I_MMX | I_XMM },
2247 {
"cvtpd2pi", { ADDR_P, ADDR_W, ADDR_0 }, { OP_PI, OP_PD, OP_0}, NULL, I_MEMRD | I_MMX | I_XMM },
2249 {
"cvtsd2si", { ADDR_G, ADDR_W, ADDR_0 }, { OP_Y, OP_SD, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2251 {
"cvtss2si", { ADDR_G, ADDR_W, ADDR_0 }, { OP_Y, OP_SS, OP_0 }, NULL, I_MEMRD | I_SSE | I_XMM }
2256 {
"ucomiss", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SS, OP_SS, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE | I_XMM },
2258 {
"ucomisd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SD, OP_SD, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE2 | I_XMM },
2260 {
"ill_f20f2e", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2262 {
"ill_f30f2e", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2267 {
"comiss", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE | I_XMM },
2269 {
"comisd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SD, OP_SD, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE2 | I_XMM },
2271 {
"ill_f20f2f", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2273 {
"ill_f30f2f", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2277 sse_esc(state, table, 0x28);
2293 {
"movmskps", { ADDR_G, ADDR_V, ADDR_0 }, { OP_Y, OP_PS, OP_0 }, NULL, I_SSE },
2295 {
"movmskpd", { ADDR_G, ADDR_V, ADDR_0 }, { OP_Y, OP_PD, OP_0 }, NULL, I_SSE2 },
2297 {
"ill_f20f50", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2299 {
"ill_f30f50", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2304 {
"sqrtps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_SSE | I_XMM },
2306 {
"sqrtpd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2308 {
"sqrtsd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SD, OP_SD, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2310 {
"sqrtss", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SS, OP_SS, OP_0 }, NULL, I_MEMRD | I_SSE | I_XMM }
2315 {
"rsqrtps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_SSE | I_XMM },
2317 {
"ill_660f52", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2319 {
"ill_f20f52", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2321 {
"rsqrtss", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SS, OP_SS, OP_0 }, NULL, I_MEMRD | I_SSE | I_XMM }
2326 {
"rcpps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_SSE | I_XMM },
2328 {
"ill_660f52", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2330 {
"ill_f20f52", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2332 {
"rcpss", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SS, OP_SS, OP_0 }, NULL, I_MEMRD | I_SSE | I_XMM }
2337 {
"andps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM },
2339 {
"andpd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2341 {
"ill_f20f54", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2343 {
"ill_f30f54", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2348 {
"andnps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM },
2350 {
"andnpd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2352 {
"ill_f20f55", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2354 {
"ill_f30f55", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2359 {
"orps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM },
2361 {
"orpd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2363 {
"ill_f20f56", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2365 {
"ill_f30f56", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2370 {
"xorps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM },
2372 {
"xorpd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2374 {
"ill_f20f57", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2376 {
"ill_f30f57", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2381 {
"addps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM },
2383 {
"addpd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2385 {
"addsd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SD, OP_SD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2387 {
"addss", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SS, OP_SS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM }
2392 {
"mulps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM },
2394 {
"mulpd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2396 {
"mulsd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SD, OP_SD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2398 {
"mulss", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SS, OP_SS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM }
2403 {
"cvtps2pd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_PS, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2405 {
"cvtpd2ps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PD, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2407 {
"cvtsd2ss", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SS, OP_SD, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2409 {
"cvtss2sd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SD, OP_SS, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM }
2414 {
"cvtdq2ps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_DQ, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2416 {
"cvtps2dq", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_PS, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2418 {
"ill_f20f5b", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2420 {
"cvttps2dq", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_PS, OP_0}, NULL, I_MEMRD | I_SSE2 | I_XMM }
2425 {
"subps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM },
2427 {
"subpd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2429 {
"subsd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SD, OP_SD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2431 {
"subss", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SS, OP_SS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM }
2436 {
"minps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM },
2438 {
"minpd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2440 {
"minsd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SD, OP_SD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2442 {
"minss", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SS, OP_SS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM }
2447 {
"divps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM },
2449 {
"divpd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2451 {
"divsd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SD, OP_SD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2453 {
"divss", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SS, OP_SS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM }
2458 {
"maxps", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PS, OP_PS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM },
2460 {
"maxpd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_PD, OP_PD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2462 {
"maxsd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SD, OP_SD, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE2 | I_XMM },
2464 {
"maxss", { ADDR_V, ADDR_W, ADDR_0 }, { OP_SS, OP_SS, OP_0 }, NULL, I_MEMRD | I_ALU | I_SSE | I_XMM }
2469 {
"punpcklbw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_D, OP_0 }, NULL, I_MEMRD | I_MMX },
2471 {
"punpcklbw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0}, NULL, I_MEMRD | I_XMM | I_SSE2 },
2473 {
"ill_f20f60", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2475 {
"ill_f30f60", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2480 {
"punpcklwd", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_D, OP_0 }, NULL, I_MEMRD | I_MMX },
2482 {
"punpcklwd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0}, NULL, I_MEMRD | I_XMM | I_SSE2 },
2484 {
"ill_f20f61", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2486 {
"ill_f30f61", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2491 {
"punpckldq", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_D, OP_0 }, NULL, I_MEMRD | I_MMX },
2493 {
"punpckldq", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0}, NULL, I_MEMRD | I_XMM | I_SSE2 },
2495 {
"ill_f20f62", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2497 {
"ill_f30f62", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2502 {
"packsswb", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_MEMRD | I_MMX },
2504 {
"packsswb", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0}, NULL, I_MEMRD | I_XMM | I_SSE2 },
2506 {
"ill_f20f63", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2508 {
"ill_f30f63", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2513 {
"pcmpgtb", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_MMX },
2515 {
"pcmpgtb", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE2 | I_XMM },
2517 {
"ill_f20f64", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2519 {
"ill_f30f64", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2524 {
"pcmpgtw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_MMX },
2526 {
"pcmpgtw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE2 | I_XMM },
2528 {
"ill_f20f65", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2530 {
"ill_f30f65", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2535 {
"pcmpgtd", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_MMX },
2537 {
"pcmpgtd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE2 | I_XMM },
2539 {
"ill_f20f66", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2541 {
"ill_f30f66", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2546 {
"packuswb", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, 0 },
2548 {
"packuswb", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0}, NULL, 0 },
2550 {
"ill_f20f67", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2552 {
"ill_f30f67", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2557 {
"punpckhbw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_D, OP_0 }, NULL, I_MEMRD | I_MMX },
2559 {
"punpckhbw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0}, NULL, I_MEMRD | I_XMM | I_SSE2 },
2561 {
"ill_f20f68", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2563 {
"ill_f30f68", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2568 {
"punpckhwd", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_D, OP_0 }, NULL, I_MEMRD | I_MMX },
2570 {
"punpckhwd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0}, NULL, I_MEMRD | I_XMM | I_SSE2 },
2572 {
"ill_f20f69", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2574 {
"ill_f30f69", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2579 {
"punpckhdq", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_D, OP_0 }, NULL, I_MEMRD | I_MMX },
2581 {
"punpckhdq", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0}, NULL, I_MEMRD | I_XMM | I_SSE2 },
2583 {
"ill_f20f6a", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2585 {
"ill_f30f6a", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2590 {
"packssdw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_D, OP_0 }, NULL, I_MEMRD | I_MMX },
2592 {
"packssdw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_DQ, OP_DQ, OP_0}, NULL, I_MEMRD | I_XMM | I_SSE2 },
2594 {
"ill_f20f6b", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2596 {
"ill_f30f6b", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2601 {
"ill_0f6c", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2603 {
"punpcklqdq", { ADDR_V, ADDR_W, ADDR_0}, { OP_DQ, OP_DQ, OP_0}, NULL, I_MEMRD | I_XMM | I_SSE2 },
2605 {
"ill_f20f6c", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2607 {
"ill_f30f6c", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2612 {
"ill_0f6d", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2614 {
"punpckhqdq", { ADDR_V, ADDR_W, ADDR_0}, { OP_DQ, OP_DQ, OP_0}, NULL, I_MEMRD | I_XMM | I_SSE2 },
2616 {
"ill_f20f6d", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2618 {
"ill_f30f6d", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2623 {
"movd", { ADDR_P, ADDR_E, ADDR_0 }, { OP_D, OP_Y, OP_0 }, NULL, I_MEMRD | I_MMX | I_SSE2 },
2625 {
"movd", { ADDR_V, ADDR_E, ADDR_0 }, { OP_Y, OP_Y, OP_0 }, NULL, I_MEMRD | I_XMM | I_SSE2 },
2627 {
"ill_f20f6e", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2629 {
"ill_f30f6e", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2634 {
"movq", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_MEMRD | I_MMX },
2636 {
"movdqa", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_MEMRD | I_XMM | I_SSE2 },
2638 {
"ill_f20f6f", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2640 {
"movdqu", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_MEMRD | I_XMM | I_SSE2 },
2645 {
"pshufw", { ADDR_P, ADDR_Q, ADDR_I }, { OP_Q, OP_Q, OP_B }, NULL, I_MEMRD | I_MMX },
2647 {
"pshufd", { ADDR_V, ADDR_W, ADDR_I }, { OP_DQ, OP_DQ, OP_B }, NULL, I_MEMRD | I_XMM | I_SSE2 },
2649 {
"pshuflw", { ADDR_V, ADDR_W, ADDR_I }, { OP_DQ, OP_DQ, OP_B }, NULL, I_MEMRD | I_XMM | I_SSE2 },
2651 {
"pshufhw", { ADDR_V, ADDR_W, ADDR_I }, { OP_DQ, OP_DQ, OP_B }, NULL, I_MEMRD | I_XMM | I_SSE2 }
2655 sse_esc(state, table, 0x50);
2664 {
"pcmpeqb", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_CTRL | I_MEMRD | I_MMX },
2666 {
"pcmpeqb", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_CTRL | I_MEMRD | I_XMM | I_SSE2 },
2668 {
"ill_f20f74", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2670 {
"ill_f30f74", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2675 {
"pcmpeqw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_CTRL | I_MEMRD | I_MMX },
2677 {
"pcmpeqw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_CTRL | I_MEMRD | I_XMM | I_SSE2 },
2679 {
"ill_f20f75", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2681 {
"ill_f30f75", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2686 {
"pcmpeqd", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_CTRL | I_MEMRD | I_MMX },
2688 {
"pcmpeqd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_CTRL | I_MEMRD | I_XMM | I_SSE2 },
2690 {
"ill_f20f76", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2692 {
"ill_f30f76", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2696 sse_esc(state, table, 0x74);
2705 {
"movd", { ADDR_E, ADDR_P, ADDR_0 }, { OP_Y, OP_D, OP_0 }, NULL, I_MEMWR | I_MMX | I_SSE2 },
2707 {
"movd", { ADDR_E, ADDR_V, ADDR_0 }, { OP_Y, OP_Y, OP_0 }, NULL, I_MEMWR | I_XMM | I_SSE2 },
2709 {
"ill_f20f7e", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2711 {
"movq", { ADDR_V, ADDR_W, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_MEMRD | I_XMM }
2716 {
"movq", { ADDR_Q, ADDR_P, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_MEMWR | I_MMX },
2718 {
"movdqa", { ADDR_W, ADDR_V, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_MEMWR | I_XMM | I_SSE2 },
2720 {
"ill_f20f7f", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2722 {
"movdqu", { ADDR_W, ADDR_V, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_MEMWR | I_XMM | I_SSE2 }
2726 sse_esc(state, table, 0x7e);
2735 {
"cmpps", { ADDR_V, ADDR_W, ADDR_I }, { OP_PS, OP_PS, OP_B }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE | I_XMM },
2737 {
"cmppd", { ADDR_V, ADDR_W, ADDR_I }, { OP_PD, OP_PD, OP_B }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE2 | I_XMM },
2739 {
"cmpsd", { ADDR_V, ADDR_W, ADDR_I }, { OP_SD, OP_SD, OP_B }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE2 | I_XMM },
2741 {
"cmpss", { ADDR_V, ADDR_W, ADDR_I }, { OP_SS, OP_SS, OP_B }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE | I_XMM },
2745 sse_esc(state, table, 0xc2);
2754 {
"pinsrw", { ADDR_P, ADDR_E, ADDR_I }, { OP_Q, OP_D, OP_B }, NULL, I_MEMRD | I_SSE | I_MMX },
2756 {
"pinsrw", { ADDR_V, ADDR_E, ADDR_I }, { OP_DQ, OP_D, OP_B }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2758 {
"ill_f20fc4", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2760 {
"ill_f30fc4", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2765 {
"pextrw", { ADDR_G, ADDR_N, ADDR_I }, { OP_D, OP_Q, OP_B }, NULL, I_SSE | I_MMX },
2767 {
"pextrw", { ADDR_G, ADDR_U, ADDR_I }, { OP_D, OP_DQ, OP_B }, NULL, I_SSE2 | I_XMM },
2769 {
"ill_f20fc5", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2771 {
"ill_f30fc5", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2776 {
"shufps", { ADDR_V, ADDR_W, ADDR_I }, { OP_PS, OP_PS, OP_B }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2778 {
"shufpd", { ADDR_V, ADDR_W, ADDR_I }, { OP_PD, OP_PD, OP_B }, NULL, I_MEMRD | I_SSE2 | I_XMM },
2780 {
"ill_f20fc6", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2782 {
"ill_f30fc6", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2786 sse_esc(state, table, 0xc4);
2795 {
"psrlw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
2797 {
"psrlw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_XMM | I_SSE2 },
2799 {
"ill_f20fd1", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2801 {
"ill_f30fd1", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2806 {
"psrld", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
2808 {
"psrld", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_XMM | I_SSE2 },
2810 {
"ill_f20fd2", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2812 {
"ill_f30fd2", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2817 {
"psrlq", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
2819 {
"psrlq", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_XMM | I_SSE2 },
2821 {
"ill_f20fd3", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2823 {
"ill_f30fd3", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2828 {
"paddq", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_MMX },
2830 {
"paddq", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
2832 {
"ill_f20fd4", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2834 {
"ill_f30fd4", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2839 {
"pmulw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
2841 {
"pmulw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_MMX },
2843 {
"ill_f20fd5", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2845 {
"ill_f30fd5", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2850 {
"ill_0fd6", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2852 {
"movq", { ADDR_W, ADDR_V, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_MEMWR | I_XMM },
2854 {
"movdq2q", { ADDR_P, ADDR_U, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_MMX | I_XMM },
2856 {
"movq2dq", { ADDR_V, ADDR_N, ADDR_0 }, { OP_DQ, OP_Q, OP_0 }, NULL, I_MMX | I_XMM }
2861 {
"pmovmskb", { ADDR_G, ADDR_N, ADDR_0 }, { OP_D, OP_Q, OP_0 }, NULL, I_MMX | I_SSE },
2863 {
"pmovmksb", { ADDR_G, ADDR_U, ADDR_0 }, { OP_D, OP_DQ, OP_0 }, NULL, I_XMM | I_SSE2 },
2865 {
"ill_f20fd7", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2867 {
"ill_f30fd7", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2872 {
"psubusb", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
2874 {
"psubusb", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
2876 {
"ill_f20fd8", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2878 {
"ill_f30fd8", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2883 {
"psubusw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
2885 {
"psubusw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
2887 {
"ill_f20fd9", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2889 {
"ill_f30fd9", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2894 {
"pminub", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE | I_MMX },
2896 {
"pminub", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE2 | I_XMM },
2898 {
"ill_f20fda", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2900 {
"ill_f30fda", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2905 {
"pand", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
2907 {
"pand", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
2909 {
"ill_f20fdb", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2911 {
"ill_f30fdb", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2916 {
"paddusb", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
2918 {
"paddusb", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
2920 {
"ill_f20fdc", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2922 {
"ill_f30fdc", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2927 {
"paddusw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
2929 {
"paddusw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
2931 {
"ill_f20fdd", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2933 {
"ill_f30fdd", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2938 {
"pmaxub", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE | I_MMX },
2940 {
"pmaxub", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE2 | I_XMM },
2942 {
"ill_f20fde", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2944 {
"ill_f30fde", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2949 {
"pandn", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
2951 {
"pandn", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
2953 {
"ill_f20fdf", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2955 {
"ill_f30fdf", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2960 {
"pavgb", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE | I_MMX },
2962 {
"pavgb", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
2964 {
"ill_f20fe0", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2966 {
"ill_f30fe0", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2971 {
"praw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
2973 {
"praw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
2975 {
"ill_f20fe1", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2977 {
"ill_f30fe1", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2982 {
"prad", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
2984 {
"prad", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
2986 {
"ill_f20fe2", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2988 {
"ill_f30fe2", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
2993 {
"pavgw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE | I_MMX },
2995 {
"pavgw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
2997 {
"ill_f20fe3", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
2999 {
"ill_f30fe3", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3004 {
"pmulhuw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE | I_MMX },
3006 {
"pmulhuw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3008 {
"ill_f20fe4", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3010 {
"ill_f30fe4", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3015 {
"pmulhw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3017 {
"pmulhw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3019 {
"ill_f20fe5", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3021 {
"ill_f30fe5", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3026 {
"ill_0fe6", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3028 {
"cvttpd2dq", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_PD, OP_0}, NULL, I_MEMRD | I_SSE2 | I_XMM },
3030 {
"cvtpd2dq", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_PD, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM },
3032 {
"cvtdq2pd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_PD, OP_0 }, NULL, I_MEMRD | I_SSE2 | I_XMM }
3037 {
"movntq", { ADDR_M, ADDR_P, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_MEMWR | I_MMX },
3039 {
"movntdq", { ADDR_M, ADDR_V, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_MEMWR | I_SSE2 | I_XMM },
3041 {
"ill_f20fe7", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3043 {
"ill_f30fe7", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3048 {
"psubsb", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3050 {
"psubsb", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3052 {
"ill_f20fe8", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3054 {
"ill_f30fe8", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3059 {
"psubsw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3061 {
"psubsw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3063 {
"ill_f20fe9", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3065 {
"ill_f30fe9", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3070 {
"pminusw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE | I_MMX },
3072 {
"pminusw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE2 | I_XMM },
3074 {
"ill_f20fea", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3076 {
"ill_f30fea", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3081 {
"por", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3083 {
"por", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3085 {
"ill_f20feb", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3087 {
"ill_f30feb", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3092 {
"paddsb", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3094 {
"paddsb", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3096 {
"ill_f20fec", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3098 {
"ill_f30fec", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3103 {
"paddsw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3105 {
"paddsw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3107 {
"ill_f20fed", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3109 {
"ill_f30fed", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3114 {
"pmaxsw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE | I_MMX },
3116 {
"pmaxsw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_CTRL | I_MEMRD | I_SSE2 | I_XMM },
3118 {
"ill_f20fee", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3120 {
"ill_f30fee", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3125 {
"pxor", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3127 {
"pxor", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3129 {
"ill_f20fef", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3131 {
"ill_f30fef", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3135 sse_esc(state, table, 0xd1);
3144 {
"psllw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3146 {
"psllw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3148 {
"ill_f20ff1", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3150 {
"ill_f30ff1", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3155 {
"pslld", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3157 {
"pslld", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3159 {
"ill_f20ff2", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3161 {
"ill_f30ff2", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3166 {
"psllq", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3168 {
"psllq", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3170 {
"ill_f20ff3", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3172 {
"ill_f30ff3", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3177 {
"pmuludq", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_MMX },
3179 {
"pmuludq", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3181 {
"ill_f20ff4", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3183 {
"ill_f30ff4", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3188 {
"pmaddwd", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_MMX },
3190 {
"pmaddwd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3192 {
"ill_f20ff5", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3194 {
"ill_f30ff5", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3199 {
"psadbw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE | I_MMX },
3201 {
"psadbw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3203 {
"ill_f20ff6", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3205 {
"ill_f30ff6", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3210 {
"maskmovq", { ADDR_P, ADDR_N, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_MEMWR | I_MMX },
3212 {
"maskmovdqu", { ADDR_V, ADDR_U, ADDR_0}, { OP_DQ, OP_DQ, OP_0}, NULL, I_MEMWR | I_SSE2 | I_XMM },
3214 {
"ill_f20ff7", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3216 {
"ill_f30ff7", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3221 {
"psubb", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3223 {
"psubb", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3225 {
"ill_f20ff8", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3227 {
"ill_f30ff8", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3232 {
"psubw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3234 {
"psubw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3236 {
"ill_f20ff9", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3238 {
"ill_f30ff9", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3243 {
"psubd", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3245 {
"psubd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3247 {
"ill_f20ffa", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3249 {
"ill_f30ffa", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3254 {
"psubq", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_MMX },
3256 {
"psubq", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3258 {
"ill_f20ffb", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3260 {
"ill_f30ffb", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3265 {
"paddb", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3267 {
"paddb", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3269 {
"ill_f20ffc", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3271 {
"ill_f30ffc", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3276 {
"paddw", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3278 {
"paddw", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3280 {
"ill_f20ffd", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3282 {
"ill_f30ffd", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3287 {
"paddd", { ADDR_P, ADDR_Q, ADDR_0 }, { OP_Q, OP_Q, OP_0 }, NULL, I_ALU | I_MEMRD | I_MMX },
3289 {
"paddd", { ADDR_V, ADDR_W, ADDR_0 }, { OP_DQ, OP_DQ, OP_0 }, NULL, I_ALU | I_MEMRD | I_SSE2 | I_XMM },
3291 {
"ill_f20ffe", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 },
3293 {
"ill_f30ffe", { ADDR_0, ADDR_0, ADDR_0 }, { OP_0, OP_0, OP_0 }, NULL, 0 }
3297 sse_esc(state, table, 0xf1);
3308 unsigned char encoding;
3309 char *instructions[] = {
"add",
"or",
"adc",
"sbb",
3310 "and",
"sub",
"xor",
"cmp" };
3316 encoding = (state->modrm >> 3) & 0x07;
3318 strcpy(state->instrument->mnemonic, instructions[encoding]);
3320 if (encoding == 0b000 || encoding == 0b001 || encoding == 0b010 || encoding == 0b011 || encoding == 0b100 || encoding == 0b101 || encoding == 0b110)
3321 state->instrument->flags |= I_MEMRD | I_MEMWR | I_ALU;
3323 else if (encoding== 0b111)
3324 state->instrument->flags |= I_MEMRD | I_ALU | I_CTRL;
3329 case 0b000 ... 0b110:
3331 state->instrument->flags |= I_MEMRD | I_MEMWR | I_ALU;
3334 state->instrument->flags |= I_MEMRD | I_ALU | I_CTRL;
3341 unsigned char encoding;
3345 char *instructions[] = {
"rol",
"ror",
"rcl",
"rcr",
3346 "shl",
"shr",
"ill_grp_2",
"sar" };
3350 encoding = (state->modrm >> 3) & 0x07;
3352 strcpy(state->instrument->mnemonic, instructions[encoding]);
3354 if(encoding != 0b110) {
3355 state->instrument->flags |= I_MEMRD | I_MEMWR | I_ALU;
3364 unsigned char encoding, opcode;
3365 char *instructions[] = {
"test",
"ill_grp_3",
"not",
"neg",
3366 "mul",
"imul",
"div",
"idiv" };
3367 enum addr_method addr[8][2] = { { ADDR_I, ADDR_I }, { ADDR_0, ADDR_0 },
3368 { ADDR_0, ADDR_0 }, { ADDR_0, ADDR_0 },
3369 { R_AL, R_AX }, { R_AL, R_AX },
3370 { R_AL, R_AX }, { R_AL, R_AX } };
3371 enum operand_type op[8][2] = { { OP_B, OP_V }, { OP_0, OP_0 },
3372 { OP_0, OP_0 }, { OP_0, OP_0 },
3373 { OP_0, OP_E }, { OP_0, OP_E },
3374 { OP_0, OP_E }, { OP_0, OP_E } };
3376 unsigned long flags[8] = { I_ALU | I_CTRL | I_MEMRD,
3378 I_ALU | I_MEMRD | I_MEMWR,
3379 I_ALU | I_MEMRD | I_MEMWR,
3382 I_ALU | I_MEMRD, I_ALU | I_MEMRD};
3386 encoding = (state->modrm >> 3) & 0x07;
3387 opcode = state->opcode[0] - 0xf6;
3389 strcpy(state->instrument->mnemonic, instructions[encoding]);
3390 state->addr[1] = addr[encoding][opcode];
3391 state->op[1] = op[encoding][opcode];
3392 state->instrument->flags = flags[encoding];
3398 unsigned char encoding;
3402 encoding = (state->modrm >> 3) & 0x07;
3403 state->instrument->flags = I_MEMRD | I_MEMWR | I_ALU;
3407 strcpy(state->instrument->mnemonic,
"inc");
3410 strcpy(state->instrument->mnemonic,
"dec");
3413 strcpy(state->instrument->mnemonic,
"ill_grp_4");
3414 state->instrument->flags = 0;
3419 state->addr[0] = ADDR_E;
3420 state->op[0] = OP_B;
3427 unsigned char encoding;
3428 char *instructions[] = {
"inc",
"dec",
"call",
"call far",
3429 "jmp",
"jmp far",
"push",
"ill_grp_5" };
3433 encoding = (state->modrm >> 3) & 0x07;
3434 strcpy(state->instrument->mnemonic, instructions[encoding]);
3439 state->instrument->flags = I_ALU | I_MEMRD | I_MEMWR;
3443 state->instrument->flags = I_CALLIND | I_CALL;
3447 state->instrument->flags = I_JUMPIND | I_JUMP;
3450 state->instrument->flags = I_PUSHPOP | I_MEMRD;
3456 state->addr[0] = ADDR_E;
3458 if(encoding == 0x03 || encoding == 0x05)
3459 state->op[0] = OP_P;
3461 state->op[0] = OP_V;
3467 unsigned char encoding;
3469 char *instructions[6] = {
"sldt",
"str",
"lldt",
"ltr",
"verr",
"verw" };
3473 encoding = (state->modrm >> 3) & 0x07;
3474 if(encoding > 0x05) {
3475 strcpy(state->instrument->mnemonic,
"ill_grp_6");
3479 strcpy(state->instrument->mnemonic, instructions[encoding]);
3480 state->addr[0] = ADDR_E;
3481 state->op[0] = OP_W;
3485 state->instrument->flags = I_MEMWR;
3488 state->instrument->flags = I_MEMWR;
3491 state->instrument->flags = I_MEMRD;
3494 state->instrument->flags = I_MEMRD;
3497 state->instrument->flags = I_CTRL | I_MEMRD;
3500 state->instrument->flags = I_CTRL | I_MEMRD;
3510 unsigned char encoding, lower_bits, mod_76;
3511 char *instructions[] = {
"sgdt",
"sidt",
"lgdt",
"lidt",
3512 "smsw",
"ill_grp_7",
"lmsw",
"invlpg" };
3516 encoding = (state->modrm >> 3) & 0x07;
3517 lower_bits = state->modrm & 0x07;
3518 mod_76 = (state->modrm >> 6) & 0x03;
3591 strcpy(state->instrument->mnemonic, instructions[encoding]);
3597 state->addr[0] = ADDR_M;
3598 state->op[0] = OP_S;
3600 state->instrument->flags = I_MEMWR;
3602 state->instrument->flags = I_MEMRD;
3603 }
else if(encoding == 0x07) {
3604 state->addr[0] = ADDR_M;
3605 state->op[0] = OP_B;
3607 state->addr[0] = ADDR_E;
3608 state->op[0] = OP_W;
3610 state->instrument->flags = I_MEMWR;
3612 state->instrument->flags = I_MEMRD;
3620 unsigned char encoding;
3621 char *instructions[] = {
"bt",
"bts",
"btr",
"btc" };
3625 encoding = (state->modrm >> 3) & 0x07;
3629 strcpy(state->instrument->mnemonic,
"ill_grp_8");
3630 state->addr[0] = state->addr[1] = ADDR_0;
3631 state->op[0] = state->op[1] = OP_0;
3637 strcpy(state->instrument->mnemonic, instructions[encoding]);
3638 state->instrument->flags = I_MEMRD;
3641 state->instrument->flags |= I_MEMWR;
3647 unsigned char encoding, mod;
3651 encoding = (state->modrm >> 3) & 0x07;
3652 mod = (state->modrm >> 6) & 0x03;
3654 if(mod != 0x03 && encoding == 0x01) {
3655 state->instrument->flags = I_CTRL | I_CONDITIONAL | I_ALU | I_MEMRD | I_MEMWR;
3656 strcpy(state->instrument->mnemonic,
"cmpxch8b");
3657 state->addr[0] = ADDR_M;
3658 if(REXW(state->rex))
3659 state->op[0] = OP_DQ;
3661 state->op[0] = OP_Q;
3663 strcpy(state->instrument->mnemonic,
"ill_grp_9");
3671 strcpy(state->instrument->mnemonic,
"ill_grp_10");
3679 if((state->modrm >> 3) & 0x07) {
3680 strcpy(state->instrument->mnemonic,
"ill_grp_11");
3686 strcpy(state->instrument->mnemonic,
"mov");
3687 state->instrument->flags |= I_MEMWR;
3704 unsigned char encoding, mod, sse_prefix;
3705 bool illegal =
false;
3710 encoding = (state->modrm >> 3) & 0x07;
3711 mod = (state->modrm >> 6) & 0x03;
3712 sse_prefix = state->sse_prefix;
3714 state->prefix[0] = state->prefix[3] = 0x00;
3716 if(mod != 0b11 || (sse_prefix != 0x66 && sse_prefix != 0x00))
3720 case 0x02: mnemonic =
"psrlw";
break;
3721 case 0x04: mnemonic =
"psraw";
break;
3722 case 0x06: mnemonic =
"psllw";
break;
3723 default: illegal =
true;
3726 if(illegal ==
false) {
3727 strcpy(state->instrument->mnemonic, mnemonic);
3728 state->instrument->flags = I_ALU;
3730 if(sse_prefix == 0x66) {
3731 state->addr[0] = ADDR_W;
3732 state->op[0] = OP_DQ;
3733 state->instrument->flags |= I_SSE2 | I_XMM;
3736 state->addr[0] = ADDR_P;
3737 state->op[0] = OP_Q;
3738 state->instrument->flags |= I_MMX;
3741 state->addr[1] = ADDR_I;
3742 state->op[1] = OP_B;
3745 strcpy(state->instrument->mnemonic,
"ill_grp_12");
3752 unsigned char encoding, mod, sse_prefix;
3753 bool illegal =
false;
3758 encoding = (state->modrm >> 3) & 0x07;
3759 mod = (state->modrm >> 6) & 0x03;
3760 sse_prefix = state->sse_prefix;
3762 state->prefix[0] = state->prefix[2] = 0x00;
3764 if(mod != 0x03 || (sse_prefix != 0x66 && sse_prefix != 0x00))
3768 case 0x02: mnemonic =
"psrld";
break;
3769 case 0x04: mnemonic =
"psrad";
break;
3770 case 0x06: mnemonic =
"pslld";
break;
3771 default: illegal =
true;
3774 if(illegal ==
false) {
3775 strcpy(state->instrument->mnemonic, mnemonic);
3776 state->instrument->flags = I_ALU;
3778 state->addr[0] = ADDR_P;
3779 state->addr[1] = ADDR_I;
3781 if(sse_prefix == 0x66) {
3782 state->op[0] = OP_DQ;
3783 state->instrument->flags |= I_SSE2 | I_XMM;
3786 state->op[0] = OP_Q;
3787 state->instrument->flags |= I_MMX;
3790 state->op[1] = OP_B;
3793 strcpy(state->instrument->mnemonic,
"ill_grp_13");
3800 unsigned char encoding, mod, sse_prefix;
3805 encoding = (state->modrm >> 3) & 0x07;
3806 mod = (state->modrm >> 6) & 0x03;
3807 sse_prefix = state->sse_prefix;
3809 state->prefix[0] = state->prefix[3] = 0x00;
3815 (!((encoding == 0x02 || encoding == 0x06) && ((sse_prefix == 0x00) || (sse_prefix == 0x66)))) ||
3816 (!((encoding == 0x03 || encoding == 0x07) && (sse_prefix == 0x66))))
3818 strcpy(state->instrument->mnemonic,
"ill_grp_14");
3823 mnemonic = (encoding == 2) ?
"psrlq" : (encoding == 3) ?
"psrldq" : (encoding == 6) ?
"psllq" :
"pslldq";
3824 strcpy(state->instrument->mnemonic, mnemonic);
3826 state->instrument->flags = I_ALU;
3828 if(sse_prefix == 0x66) {
3829 state->addr[0] = ADDR_W;
3830 state->op[0] = OP_DQ;
3831 state->instrument->flags |= I_XMM | I_SSE2;
3833 state->addr[0] = ADDR_P;
3834 state->op[0] = OP_Q;
3835 state->instrument->flags |= I_MMX;
3838 state->addr[1] = ADDR_I;
3839 state->op[1] = OP_B;
3845 unsigned char encoding, mod;
3850 encoding = (state->modrm >> 3) & 0x07;
3851 mod = (state->modrm >> 6) & 0x03;
3853 if((mod == 0b11 && encoding < 5) || (mod != 0b11 && (encoding < 7 && encoding > 3))) {
3854 strcpy(state->instrument->mnemonic,
"ill_grp_15");
3860 case 0x05: mnemonic =
"lfence";
break;
3861 case 0x06: mnemonic =
"mfence";
break;
3862 case 0x07: mnemonic =
"sfence";
break;
3865 state->addr[0] = ADDR_M;
3869 mnemonic =
"fxsave";
3870 state->instrument->flags = I_MEMWR | I_CTRL | I_MMX | I_XMM | I_FPU;
3871 state->op[0] = OP_M512byte;
3874 mnemonic =
"fxrstor";
3875 state->instrument->flags = I_MEMRD | I_CTRL | I_MMX | I_XMM | I_FPU;
3876 state->op[0] = OP_M512byte;
3879 mnemonic =
"ldmxcsr";
3880 state->instrument->flags = I_MEMRD | I_SSE;
3881 state->op[0] = OP_D;
3884 mnemonic =
"stmxcsr";
3885 state->instrument->flags = I_MEMWR | I_SSE;
3886 state->op[0] = OP_D;
3889 mnemonic =
"clflush";
3890 state->instrument->flags = I_SSE2;
3891 state->op[0] = OP_B;
3895 strcpy(state->instrument->mnemonic, mnemonic);
3905 unsigned char encoding, mod;
3910 encoding = (state->modrm >> 3) & 0x07;
3911 mod = (state->modrm >> 6) & 0x03;
3913 if(mod == 0x03 || encoding > 0x03) {
3914 strcpy(state->instrument->mnemonic,
"ill_grp_16");
3919 case 0x00: mnemonic =
"prefetchnta";
break;
3920 case 0x01: mnemonic =
"prefetcht0";
break;
3921 case 0x02: mnemonic =
"prefetcht1";
break;
3922 case 0x03: mnemonic =
"prefetcht2";
break;
3925 state->instrument->flags = I_MEMRD;
3926 strcpy(state->instrument->mnemonic, mnemonic);
3927 state->addr[0] = ADDR_M;
3928 state->op[0] = OP_B;
3941 if(state->prefix[3] == 0x66 && !REXW(state->rex)) {
3942 state->instrument->span = 2;
3951 if(state->opd_size == SIZE_16)
3957 if(state->opd_size == SIZE_16)
3967 if(state->opd_size == SIZE_16) {
3979 if(REXW(state->rex)) {
3983 if(state->opd_size == SIZE_16) {
3992 if(REXW(state->rex)) {
4007 if(REXW(state->rex)) {
4011 if(state->opd_size == SIZE_16) {
4018 if(state->mode64 ==
true)
4038 if(REXW(state->rex)) {
4042 if(state->opd_size == SIZE_32) {
4051 state->instrument->span = size;
4055 void format_addr_m (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op);
4066 void format_addr_a (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4076 uint16_t
segment, short_offset;
4077 uint32_t long_offset, offset;
4080 memcpy(&segment, state->text + state->pos, 2);
4084 if(state->opd_size == SIZE_16) {
4085 memcpy(&short_offset, state->text + state->pos, 2);
4087 offset = short_offset;
4089 memcpy(&long_offset, state->text + state->pos, 4);
4091 offset = long_offset;
4095 state->instrument->addr = segment;
4100 fprintf(stderr,
"%s:%d: Errore interno\n", __FILE__, __LINE__);
4108 void format_addr_c (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4115 char modrm = (state->modrm >> 3) & 0x07;
4119 if(REXR(state->rex))
4138 void format_addr_d (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4145 char modrm = (state->modrm >> 3) & 0x07;
4149 if(REXR(state->rex))
4180 void format_addr_e (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4187 enum reg_size reg_size = REG_SIZE_128;
4191 rm = state->modrm & 0x07;
4195 reg_size = REG_SIZE_8;
4198 if(state->opd_size != SIZE_16) {
4199 reg_size = REG_SIZE_8;
4204 reg_size = REG_SIZE_16;
4207 if(state->opd_size == SIZE_64) {
4208 if(REXW(state->rex)) {
4209 reg_size = REG_SIZE_64;
4213 if(state->opd_size == SIZE_16) {
4214 reg_size = REG_SIZE_16;
4220 reg_size = REG_SIZE_32;
4224 reg_size = REG_SIZE_64;
4229 reg_size = REG_SIZE_128;
4232 if(state->opd_size == SIZE_64) {
4233 reg_size = REG_SIZE_64;
4235 reg_size = REG_SIZE_32;
4238 fprintf(stderr,
"%s: %d: Unexpected operand %d\n", __FILE__, __LINE__, op);
4242 if(state->modrm >> 6 == 0x3) {
4244 state->instrument->flags &= ~(I_MEMWR | I_MEMRD);
4246 if(!state->read_dest) {
4252 state->instrument->has_base_register =
true;
4253 state->instrument->breg = rm;
4266 if(state->addr[0] != ADDR_G
4267 && state->addr[1] != ADDR_G
4268 && state->addr[2] != ADDR_G) {
4270 if(state->mode64 && REXR(state->rex)) {
4275 if(state->op[0] == 0x0F && state->op[1] == 0xC4)
4277 format_addr_m(state, addr, op);
4284 void format_addr_g (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4286 enum reg_size reg_size;
4291 reg_size = REG_SIZE_128;
4292 reg_field = (state->modrm >> 3) & 0x07;
4295 if(state->mode64 && REXR(state->rex)) {
4301 reg_size = REG_SIZE_8;
4304 if(state->opd_size != SIZE_16) {
4305 reg_size = REG_SIZE_8;
4310 reg_size = REG_SIZE_16;
4313 if(state->opd_size == SIZE_64) {
4314 if(REXW(state->rex)) {
4315 reg_size = REG_SIZE_64;
4319 if(state->opd_size == SIZE_16) {
4320 reg_size = REG_SIZE_16;
4325 reg_size = REG_SIZE_32;
4328 if(state->opd_size == SIZE_64) {
4329 if(REXW(state->rex)) {
4330 reg_size = REG_SIZE_64;
4336 reg_size = REG_SIZE_32;
4339 fprintf(stderr,
"%s: %d: Unexpected operand %d\n", __FILE__, __LINE__, op);
4355 state->instrument->reg_dest = reg_field;
4361 void format_addr_i (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4368 uint64_t qword, immed_data = 0;
4376 if(state->opd_size != SIZE_16) {
4387 if(state->opcode[0] >= 0xb8 && state->opcode[0] <= 0xbf) {
4388 if(state->mode64 && REXW(state->rex)) {
4393 if(state->opd_size == SIZE_16) {
4402 fprintf(stderr,
"%s: %d: Unexpected operand %d\n", __FILE__, __LINE__, op);
4407 switch(immed_size) {
4409 memcpy(&byte, state->text + state->pos, immed_size);
4413 memcpy(&word, state->text + state->pos, immed_size);
4417 memcpy(&dword, state->text + state->pos, immed_size);
4421 memcpy(&qword, state->text + state->pos, immed_size);
4425 fprintf(stderr,
"%s: %d: Unexpected size %d\n", __FILE__, __LINE__, immed_size);
4431 state->instrument->immed_offset = state->immed_offset = state->pos;
4432 state->instrument->immed_size = state->immed_size = immed_size;
4433 state->instrument->immed = immed_data;
4435 state->pos += immed_size;
4441 void format_addr_j (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4443 int off_size = 0, jump_size = 0;
4454 if(state->opd_size != SIZE_16) {
4463 if(state->opd_size == SIZE_16) {
4472 fprintf(stderr,
"%s: %d: Unexpected operand %d\n", __FILE__, __LINE__, op);
4476 jump_size = off_size;
4480 memcpy(&dword_jump, state->text + state->pos, off_size);
4483 memcpy(&word_jump, state->text + state->pos, off_size);
4486 memcpy(&byte_jump, state->text + state->pos, off_size);
4487 if(state->opd_size == SIZE_16) {
4488 word_jump = (int16_t)byte_jump;
4491 dword_jump = (int32_t)byte_jump;
4496 fprintf(stderr,
"%s: errore interno alla riga %d: %d\n", __FILE__, __LINE__, jump_size);
4500 state->pos += off_size;
4502 if(jump_size == 2) {
4503 state->instrument->jump_dest = (int32_t)word_jump;
4505 state->instrument->jump_dest = dword_jump;
4517 void format_addr_m (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4519 bool no_sib_base =
false;
4520 unsigned char mod, rm;
4521 unsigned long mem_ref;
4524 select_operand_size(state, op);
4526 if(addr == ADDR_M && op == OP_P) {
4527 format_addr_a(state, addr, op);
4531 mod = state->modrm >> 6;
4532 rm = state->modrm & 0x07;
4541 fprintf(stderr,
"%s: errore interno alla riga %d: ModR/M %#02x\n", __FILE__, __LINE__, state->modrm);
4546 if(state->addr_size == SIZE_16) {
4549 char *eff_addr[] = {
"bx + si",
"bx + di",
"bp + si",
"bp + di",
4550 "si",
"di",
"bp",
"bx" };
4553 if(mod == 0x0 && rm == 0x6) {
4554 memcpy(&disp16, state->text + state->disp_offset, 2);
4557 mem_ref = (
unsigned long)disp16;
4559 state->instrument->addr = mem_ref;
4567 state->instrument->has_base_register =
true;
4568 state->instrument->breg = rm;
4569 strcpy(state->instrument->breg_mnem, eff_addr[rm]);
4573 if(rm == 0x2 || rm == 0x3 || rm == 0x6) {
4575 state->instrument->flags |= I_STACK;
4586 memcpy (&disp8, state->text + state->disp_offset, 1);
4587 state->instrument->addr = (int16_t)disp8;
4588 }
else if(mod == 0x2) {
4589 memcpy (&disp16, state->text + state->disp_offset, 2);
4590 state->instrument->addr = disp16;
4598 char *eff_addr_32[] = {
"eax",
"ecx",
"edx",
"ebx",
4599 "",
"ebp",
"esi",
"edi" };
4600 char *eff_addr_64[] = {
"rax",
"rcx",
"rdx",
"rbx",
4601 "",
"rbp",
"rsi",
"rdi",
4602 "r8",
"r9",
"r10",
"r11",
4603 "r12",
"r13",
"r14",
"r15"};
4604 char **eff_addr = eff_addr_32;
4608 eff_addr = eff_addr_64;
4611 if(mod == 0x0 && rm == 0x5) {
4615 state->uses_rip =
true;
4618 memcpy (&disp32, state->text + state->disp_offset, 4);
4621 mem_ref = (
unsigned long)disp32;
4623 state->instrument->addr = mem_ref;
4631 unsigned char ss, idx, base;
4632 char *base_r_32[] = {
"eax",
"ecx",
"edx",
"ebx",
4633 "esp",
"",
"esi",
"edi" };
4634 char *idx_r_32[] = {
"eax",
"ecx",
"edx",
"ebx",
4635 "",
"ebp",
"esi",
"edi" };
4636 char *base_r_64[] = {
"rax",
"rcx",
"rdx",
"rbx",
4637 "rsp",
"",
"rsi",
"rdi",
4638 "r8",
"r9",
"r10",
"r11",
4639 "r12",
"r13",
"r14",
"r15" };
4640 char *idx_r_64[] = {
"rax",
"rcx",
"rdx",
"rbx",
4641 "",
"rbp",
"rsi",
"rdi",
4642 "r8",
"r9",
"r10",
"r11",
4643 "r12",
"r13",
"r14",
"r15" };
4645 char **base_r = base_r_32;
4646 char **idx_r = idx_r_32;
4654 ss = state->sib >> 6;
4655 idx = (state->sib >> 3) & 0x07;
4656 base = state->sib & 0x07;
4659 if(state->addr_size == SIZE_64) {
4661 if(REXX(state->rex))
4664 if(REXB(state->rex))
4669 if(mod == 0x0 && (base == 0x5 || base == 0xd))
4674 strcpy(state->instrument->breg_mnem, base_r[base]);
4675 state->instrument->breg = base;
4676 state->instrument->has_base_register =
true;
4681 state->instrument->flags |= I_STACK;
4688 if(idx != 0x4 && idx != 0xc) {
4695 state->instrument->has_scale =
true;
4696 state->instrument->scale = 2;
4699 state->instrument->has_scale =
true;
4700 state->instrument->scale = 4;
4703 state->instrument->has_scale =
true;
4704 state->instrument->scale = 8;
4712 state->instrument->has_index_register =
true;
4713 state->instrument->ireg = idx;
4714 strcat(state->instrument->ireg_mnem, idx_r[idx]);
4719 state->instrument->flags |= I_STACK;
4728 if(state->addr_size == SIZE_64) {
4730 if(REXB(state->rex))
4736 strcpy(state->instrument->breg_mnem, eff_addr[rm]);
4737 state->instrument->breg = rm;
4738 state->instrument->has_base_register =
true;
4744 state->instrument->flags |= I_STACK;
4755 memcpy(&disp8, state->text + state->disp_offset, 1);
4756 state->instrument->addr = (
unsigned long)disp8;
4757 }
else if(mod == 0x2) {
4758 memcpy(&disp32, state->text + state->disp_offset, 4);
4759 state->instrument->addr = disp32;
4760 }
else if(no_sib_base) {
4761 memcpy(&disp32, state->text + state->pos, 4);
4762 state->instrument->addr = disp32;
4763 state->disp_offset = state->pos;
4772 void format_addr_o (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4785 select_operand_size(state, op);
4787 switch(state->addr_size) {
4802 printf(
"Caso di default...\n");
4806 memcpy(&qoff, state->text + state->pos, offsize);
4807 else if(offsize == 4)
4808 memcpy(&doff, state->text + state->pos, offsize);
4809 else if(offsize == 2)
4810 memcpy(&woff, state->text + state->pos, offsize);
4813 memcpy(&boff, state->text + state->pos, offsize);
4817 state->disp_offset = state->pos;
4820 state->pos += offsize;
4825 state->instrument->addr = qoff;
4828 state->instrument->addr = doff;
4831 state->instrument->addr = woff;
4835 state->instrument->addr = boff;
4842 void format_addr_p (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4854 void format_addr_n (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4866 void format_addr_q (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4868 if(state->modrm >> 6 == 0x3) {
4870 state->instrument->flags &= ~I_MEMRD & ~I_MEMWR;
4874 if(state->addr[0] != ADDR_P && state->addr[1] != ADDR_P &&
4875 state->addr[0] != ADDR_N && state->addr[1] != ADDR_N)
4876 state->instrument->flags &= ~I_MMX;
4877 format_addr_m (state, addr, op);
4884 void format_addr_r (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4890 fprintf(stderr,
"%s:%d: Errore interno\n", __FILE__, __LINE__);
4895 char reg = state->modrm & 0x07;
4896 if(state->mode64 && REXR(state->rex))
4905 void format_addr_s (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4927 void format_addr_t (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4939 void format_addr_v (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4944 char reg = (state->modrm >> 3) & 0x07;
4945 if(state->mode64 && REXR(state->rex))
4953 void format_addr_u (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4958 char reg = state->modrm & 0x07;
4959 if(state->mode64 && REXR(state->rex))
4966 void format_addr_w (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4968 if(state->modrm >> 6 == 0x3) {
4969 char reg = (state->modrm >> 3) & 0x07;
4972 state->instrument->flags &= ~I_MEMRD & ~I_MEMWR;
4974 if(state->mode64 && REXR(state->rex))
4977 if(state->addr[0] != ADDR_U && state->addr[0] != ADDR_V &&
4978 state->addr[1] != ADDR_U && state->addr[1] != ADDR_V )
4980 state->instrument->flags &= ~I_XMM;
4981 format_addr_m(state, addr, op);
4988 void format_addr_x (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
4994 state->instrument->span = 1;
5003 void format_addr_y (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
5009 select_operand_size(state, op);
5020 void format_addr_op (
struct disassembly_state *state,
enum addr_method addr,
enum operand_type op)
5026 format_addr_n(state, addr, op);
5030 format_addr_u(state, addr, op);
5034 format_addr_a(state, addr, op);
5038 format_addr_c(state, addr, op);
5042 format_addr_d(state, addr, op);
5046 format_addr_e(state, addr, op);
5056 format_addr_g(state, addr, op);
5061 format_addr_i(state, addr, op);
5066 format_addr_j(state, addr, op);
5070 format_addr_m(state, addr, op);
5075 format_addr_o(state, addr, op);
5079 format_addr_p(state, addr, op);
5083 format_addr_q(state, addr, op);
5087 format_addr_r(state, addr, op);
5091 format_addr_s(state, addr, op);
5098 format_addr_v(state, addr, op);
5102 format_addr_w(state, addr, op);
5106 format_addr_x(state, addr, op);
5110 format_addr_y(state, addr, op);
5113 case R_START ... R_END:
5123 fprintf(stderr,
"%s:%d: Unexpected address format %d\n", __FILE__, __LINE__, addr);
5131 void x86_disassemble_instruction (
unsigned char *text,
unsigned long *pos,
insn_info_x86 *instrument,
char flags)
5134 bool print_prefixes =
false;
5135 unsigned char opcode;
5141 state.disp_offset = 0;
5143 state.opcode[0] = 0x00;
5144 state.opcode[1] = 0x00;
5146 state.instrument = instrument;
5147 state.instrument->initial = *pos;
5158 state.opd_size = D64(flags) || D32(flags) ? SIZE_32 : SIZE_16;
5159 state.addr_size = A64(flags) || A32(flags) ? SIZE_32 : SIZE_16;
5161 state.mode64 = D64(flags) ?
true :
false;
5164 state.uses_rip =
false;
5168 state.read_modrm =
false;
5171 state.read_dest =
false;
5173 state.sse_prefix = 0;
5174 state.prefix[0] = 0;
5175 state.prefix[1] = 0;
5176 state.prefix[2] = 0;
5177 state.prefix[3] = 0;
5179 state.orig_pos = *pos;
5185 opcode = state.text[state.pos++];
5188 if(!is_prefix(opcode))
break;
5192 if(is_sse_prefix(opcode))
5193 state.sse_prefix = opcode;
5196 if(p_is_group1(opcode)) {
5197 if(!state.prefix[0])
5198 state.prefix[0] = opcode;
5199 }
else if(p_is_group2(opcode)) {
5200 if(!state.prefix[1])
5201 state.prefix[1] = opcode;
5202 }
else if(p_is_group3(opcode)) {
5203 if(!state.prefix[2])
5204 state.prefix[2] = opcode;
5205 }
else if(p_is_group4(opcode)) {
5206 if(!state.prefix[3])
5207 state.prefix[3] = opcode;
5209 fprintf(stderr,
"%s:%d: Errore interno\n", __FILE__, __LINE__);
5219 if(is_rex_prefix(opcode, state.mode64)) {
5221 opcode = state.text[state.pos++];
5228 state.addr[0] = table[opcode].addr_method[0];
5229 state.addr[1] = table[opcode].addr_method[1];
5230 state.addr[2] = table[opcode].addr_method[2];
5232 state.op[0] = table[opcode].operand_type[0];
5233 state.op[1] = table[opcode].operand_type[1];
5234 state.op[2] = table[opcode].operand_type[2];
5238 state.instrument->flags = table[opcode].flags;
5240 state.opcode[0] = opcode;
5243 if(table[opcode].instruction != NULL)
5244 strcpy(state.instrument->mnemonic, table[opcode].instruction);
5247 if(table[opcode].instruction == NULL) {
5249 if(table[opcode].esc_function == NULL) {
5250 fprintf(stderr,
"%s:%d: Errore interno\n", __FILE__, __LINE__);
5253 table[opcode].esc_function(&state);
5259 if(state.prefix[1]) {
5260 if(is_jcc_insn (state.opcode[0])
5261 || (state.opcode[0] == 0x0f && is_esc_jcc_insn(state.opcode[1]))) {
5262 if(print_prefixes) {
5263 if(state.prefix[1] == 0x2e) {
5265 else if(state.prefix[1] == 0x3e) {
5268 fprintf(stderr,
"%s:%d: Errore interno\n", __FILE__, __LINE__);
5272 state.prefix[1] = 0;
5276 if(state.prefix[2] == 0x66) {
5277 state.opd_size = ((state.opd_size == SIZE_32) || (state.opd_size == SIZE_64)) ? SIZE_16 : SIZE_32;
5279 if(state.prefix[3] == 0x67) {
5280 state.addr_size = ((state.addr_size == SIZE_32) || (state.addr_size == SIZE_64)) ? SIZE_16 : SIZE_32;
5286 if(!state.read_modrm && (has_modrm(state.addr[0])
5287 || has_modrm(state.addr[1]) || has_modrm(state.addr[2]))) {
5288 state.modrm = state.text[state.pos];
5293 if(has_sib(state.modrm, state.addr_size)) {
5294 state.sib = state.text[state.pos];
5299 state.disp_size = disp_size(state.modrm, state.addr_size);
5303 state.instrument->opcode_size = (state.pos - state.orig_pos);
5305 switch(state.disp_size) {
5307 state.instrument->disp = (
long long) *(int64_t *)(state.text + state.pos);
5308 state.disp_offset = state.pos;
5309 state.pos += state.disp_size;
5312 state.instrument->disp = (
long long) *(int32_t *)(state.text + state.pos);
5313 state.disp_offset = state.pos;
5314 state.pos += state.disp_size;
5317 state.instrument->disp = (
long long) *(int16_t *)(state.text + state.pos);
5318 state.disp_offset = state.pos;
5319 state.pos += state.disp_size;
5322 state.instrument->disp = (
long long) *(int8_t *)(state.text + state.pos);
5323 state.disp_offset = state.pos;
5324 state.pos += state.disp_size;
5335 for(k = 0; k < 3; k++) {
5337 if(state.addr[k] == ADDR_0)
break;
5342 format_addr_op(&state, state.addr[k], state.op[k]);
5343 state.read_dest =
true;
5346 if (k == 0 && state.addr[k] == ADDR_G) {
5347 state.instrument->dest_is_reg =
true;
5352 memcpy(state.instrument->insn, &(state.text[*pos]), state.pos - *pos);
5357 state.instrument->disp_offset = state.disp_offset;
5358 state.instrument->disp_size = state.disp_size;
5362 state.instrument->uses_rip = state.uses_rip;
5366 memcpy(state.instrument->opcode, state.opcode, 2);
5369 state.instrument->rex = state.rex;
5370 state.instrument->modrm = state.modrm;
5371 state.instrument->sib = state.sib;
5372 state.instrument->sse_prefix = state.sse_prefix;
5373 memcpy(state.instrument->prefix, state.prefix, 4);
5375 state.instrument->insn_size = (state.pos - *pos);
x86 ISA disassembler header