i386.c: updates for the future and more [Samuele Zannoli]

- add infrastructure to support opcodes ?? 0f 38 ?? and ?? 0f 3a ??
 - add placeholders in opcode table for all instructions not yet implemented
 - fix opcode group 0f 73
 - add opcode group 66 0f 73
 - move sse opcodes movd movdqa to their own routine
 - move sse opcodes pinsrw pextrw to ther own routine
 - add opcodes punpcklbw punpcklwd punpckldq punpcklqdq
This commit is contained in:
yz70s 2015-02-22 15:31:04 +01:00
parent 79fcba5fe6
commit f0680b3ba9
4 changed files with 777 additions and 108 deletions

View File

@ -2876,7 +2876,7 @@ void i386_device::i386_decode_opcode()
(this->*m_opcode_table1_16[m_opcode])();
}
/* Two-byte opcode prefix */
/* Two-byte opcode 0f xx */
void i386_device::i386_decode_two_byte()
{
m_opcode = FETCH();
@ -2890,7 +2890,29 @@ void i386_device::i386_decode_two_byte()
(this->*m_opcode_table2_16[m_opcode])();
}
/* Three-byte opcode prefix 66 0f */
/* Three-byte opcode 0f 38 xx */
void i386_device::i386_decode_three_byte38()
{
m_opcode = FETCH();
if (m_operand_size)
(this->*m_opcode_table338_32[m_opcode])();
else
(this->*m_opcode_table338_16[m_opcode])();
}
/* Three-byte opcode 0f 3a xx */
void i386_device::i386_decode_three_byte3a()
{
m_opcode = FETCH();
if (m_operand_size)
(this->*m_opcode_table33a_32[m_opcode])();
else
(this->*m_opcode_table33a_16[m_opcode])();
}
/* Three-byte opcode prefix 66 0f xx */
void i386_device::i386_decode_three_byte66()
{
m_opcode = FETCH();
@ -2900,7 +2922,7 @@ void i386_device::i386_decode_three_byte66()
(this->*m_opcode_table366_16[m_opcode])();
}
/* Three-byte opcode prefix f2 0f */
/* Three-byte opcode prefix f2 0f xx */
void i386_device::i386_decode_three_bytef2()
{
m_opcode = FETCH();
@ -2920,6 +2942,57 @@ void i386_device::i386_decode_three_bytef3()
(this->*m_opcode_table3f3_16[m_opcode])();
}
/* Four-byte opcode prefix 66 0f 38 xx */
void i386_device::i386_decode_four_byte3866()
{
m_opcode = FETCH();
if (m_operand_size)
(this->*m_opcode_table46638_32[m_opcode])();
else
(this->*m_opcode_table46638_16[m_opcode])();
}
/* Four-byte opcode prefix 66 0f 3a xx */
void i386_device::i386_decode_four_byte3a66()
{
m_opcode = FETCH();
if (m_operand_size)
(this->*m_opcode_table4663a_32[m_opcode])();
else
(this->*m_opcode_table4663a_16[m_opcode])();
}
/* Four-byte opcode prefix f2 0f 38 xx */
void i386_device::i386_decode_four_byte38f2()
{
m_opcode = FETCH();
if (m_operand_size)
(this->*m_opcode_table4f238_32[m_opcode])();
else
(this->*m_opcode_table4f238_16[m_opcode])();
}
/* Four-byte opcode prefix f2 0f 3a xx */
void i386_device::i386_decode_four_byte3af2()
{
m_opcode = FETCH();
if (m_operand_size)
(this->*m_opcode_table4f23a_32[m_opcode])();
else
(this->*m_opcode_table4f23a_16[m_opcode])();
}
/* Four-byte opcode prefix f3 0f 38 xx */
void i386_device::i386_decode_four_byte38f3()
{
m_opcode = FETCH();
if (m_operand_size)
(this->*m_opcode_table4f338_32[m_opcode])();
else
(this->*m_opcode_table4f338_16[m_opcode])();
}
/*************************************************************************/
UINT8 i386_device::read8_debug(UINT32 ea, UINT8 *data)
@ -3501,6 +3574,41 @@ void i386_device::build_opcode_table(UINT32 features)
m_opcode_table3f3_32[op->opcode] = op->handler32;
m_opcode_table3f3_16[op->opcode] = op->handler16;
}
else if (op->flags & OP_3BYTE38)
{
m_opcode_table338_32[op->opcode] = op->handler32;
m_opcode_table338_16[op->opcode] = op->handler16;
}
else if (op->flags & OP_3BYTE3A)
{
m_opcode_table33a_32[op->opcode] = op->handler32;
m_opcode_table33a_16[op->opcode] = op->handler16;
}
else if (op->flags & OP_4BYTE3866)
{
m_opcode_table46638_32[op->opcode] = op->handler32;
m_opcode_table46638_16[op->opcode] = op->handler16;
}
else if (op->flags & OP_4BYTE3A66)
{
m_opcode_table4663a_32[op->opcode] = op->handler32;
m_opcode_table4663a_16[op->opcode] = op->handler16;
}
else if (op->flags & OP_4BYTE38F2)
{
m_opcode_table4f238_32[op->opcode] = op->handler32;
m_opcode_table4f238_16[op->opcode] = op->handler16;
}
else if (op->flags & OP_4BYTE3AF2)
{
m_opcode_table4f23a_32[op->opcode] = op->handler32;
m_opcode_table4f23a_16[op->opcode] = op->handler16;
}
else if (op->flags & OP_4BYTE38F3)
{
m_opcode_table4f338_32[op->opcode] = op->handler32;
m_opcode_table4f338_16[op->opcode] = op->handler16;
}
else
{
m_opcode_table1_32[op->opcode] = op->handler32;

View File

@ -239,12 +239,26 @@ struct I386_CALL_GATE
i386_op_func m_opcode_table1_32[256];
i386_op_func m_opcode_table2_16[256];
i386_op_func m_opcode_table2_32[256];
i386_op_func m_opcode_table338_16[256];
i386_op_func m_opcode_table338_32[256];
i386_op_func m_opcode_table33a_16[256];
i386_op_func m_opcode_table33a_32[256];
i386_op_func m_opcode_table366_16[256];
i386_op_func m_opcode_table366_32[256];
i386_op_func m_opcode_table3f2_16[256];
i386_op_func m_opcode_table3f2_32[256];
i386_op_func m_opcode_table3f3_16[256];
i386_op_func m_opcode_table3f3_32[256];
i386_op_func m_opcode_table46638_16[256];
i386_op_func m_opcode_table46638_32[256];
i386_op_func m_opcode_table4f238_16[256];
i386_op_func m_opcode_table4f238_32[256];
i386_op_func m_opcode_table4f338_16[256];
i386_op_func m_opcode_table4f338_32[256];
i386_op_func m_opcode_table4663a_16[256];
i386_op_func m_opcode_table4663a_32[256];
i386_op_func m_opcode_table4f23a_16[256];
i386_op_func m_opcode_table4f23a_32[256];
bool m_lock_table[2][256];
@ -366,9 +380,16 @@ struct I386_CALL_GATE
void report_invalid_modrm(const char* opcode, UINT8 modrm);
void i386_decode_opcode();
void i386_decode_two_byte();
void i386_decode_three_byte38();
void i386_decode_three_byte3a();
void i386_decode_three_byte66();
void i386_decode_three_bytef2();
void i386_decode_three_bytef3();
void i386_decode_four_byte3866();
void i386_decode_four_byte3a66();
void i386_decode_four_byte38f2();
void i386_decode_four_byte3af2();
void i386_decode_four_byte38f3();
UINT8 read8_debug(UINT32 ea, UINT8 *data);
UINT32 i386_get_debug_desc(I386_SREG *seg);
inline void CYCLES(int x);
@ -1003,7 +1024,8 @@ struct I386_CALL_GATE
void mmx_punpckhwd_r64_rm64();
void mmx_punpckhdq_r64_rm64();
void mmx_packssdw_r64_rm64();
void sse_sse_group0fae();
void sse_group_0fae();
void sse_group_660f73();
void sse_cvttps2dq_r128_rm128();
void sse_cvtss2sd_r128_r128m32();
void sse_cvttss2si_r32_r128m32();
@ -1033,7 +1055,11 @@ struct I386_CALL_GATE
void sse_movq2dq_r128_r64();
void sse_movdqu_r128_rm128();
void sse_movdqu_rm128_r128();
void sse_movd_m128_rm32();
void sse_movdqa_m128_rm128();
void sse_movq_r128_r128m64();
void sse_movd_rm32_r128();
void sse_movdqa_rm128_r128();
void sse_pmovmskb_r16_r64();
void sse_pmovmskb_r32_r64();
void sse_xorps();
@ -1061,14 +1087,20 @@ struct I386_CALL_GATE
void sse_comiss_r128_r128m32();
void sse_ucomiss_r128_r128m32();
void sse_shufps();
void sse_punpcklbw_r128_rm128();
void sse_punpcklwd_r128_rm128();
void sse_punpckldq_r128_rm128();
void sse_punpcklqdq_r128_rm128();
void sse_unpcklps_r128_rm128();
void sse_unpckhps_r128_rm128();
void sse_cmpps_r128_rm128_i8();
void sse_cmpss_r128_r128m32_i8();
void sse_pinsrw_r64_r16m16_i8();
void sse_pinsrw_r64_r32m16_i8();
void sse_pinsrw_r128_r32m16_i8();
void sse_pextrw_r16_r64_i8();
void sse_pextrw_r32_r64_i8();
void sse_pextrw_reg_r128_i8();
void sse_pminub_r64_rm64();
void sse_pmaxub_r64_rm64();
void sse_pavgb_r64_rm64();

View File

@ -14,6 +14,13 @@
#define OP_3BYTE66 0x40000000
#define OP_3BYTEF2 0x20000000
#define OP_3BYTEF3 0x10000000
#define OP_3BYTE38 0x08000000
#define OP_3BYTE3A 0x04000000
#define OP_4BYTE3866 0x02000000
#define OP_4BYTE3A66 0x01000000
#define OP_4BYTE38F2 0x00800000
#define OP_4BYTE3AF2 0x00400000
#define OP_4BYTE38F3 0x00200000
const i386_device::X86_OPCODE i386_device::s_x86_opcode_table[] =
{
@ -320,7 +327,9 @@ const i386_device::X86_OPCODE i386_device::s_x86_opcode_table[] =
{ 0x30, OP_2BYTE|OP_PENTIUM, &i386_device::pentium_wrmsr, &i386_device::pentium_wrmsr, false},
{ 0x31, OP_2BYTE|OP_PENTIUM, &i386_device::pentium_rdtsc, &i386_device::pentium_rdtsc, false},
{ 0x32, OP_2BYTE|OP_PENTIUM, &i386_device::pentium_rdmsr, &i386_device::pentium_rdmsr, false},
{ 0x40, OP_2BYTE|OP_PENTIUM, &i386_device::pentium_cmovo_r16_rm16, &i386_device::pentium_cmovo_r32_rm32, false},
{ 0x38, OP_2BYTE|OP_PENTIUM, &i386_device::i386_decode_three_byte38, &i386_device::i386_decode_three_byte38,false},
{ 0x3A, OP_2BYTE|OP_PENTIUM, &i386_device::i386_decode_three_byte3a, &i386_device::i386_decode_three_byte3a,false},
{ 0x40, OP_2BYTE|OP_PENTIUM, &i386_device::pentium_cmovo_r16_rm16, &i386_device::pentium_cmovo_r32_rm32, false},
{ 0x41, OP_2BYTE|OP_PENTIUM, &i386_device::pentium_cmovno_r16_rm16, &i386_device::pentium_cmovno_r32_rm32, false},
{ 0x42, OP_2BYTE|OP_PENTIUM, &i386_device::pentium_cmovb_r16_rm16, &i386_device::pentium_cmovb_r32_rm32, false},
{ 0x43, OP_2BYTE|OP_PENTIUM, &i386_device::pentium_cmovae_r16_rm16, &i386_device::pentium_cmovae_r32_rm32, false},
@ -421,7 +430,7 @@ const i386_device::X86_OPCODE i386_device::s_x86_opcode_table[] =
{ 0xAB, OP_2BYTE|OP_I386, &i386_device::i386_bts_rm16_r16, &i386_device::i386_bts_rm32_r32, true },
{ 0xAC, OP_2BYTE|OP_I386, &i386_device::i386_shrd16_i8, &i386_device::i386_shrd32_i8, false},
{ 0xAD, OP_2BYTE|OP_I386, &i386_device::i386_shrd16_cl, &i386_device::i386_shrd32_cl, false},
{ 0xAE, OP_2BYTE|OP_SSE, &i386_device::sse_sse_group0fae, &i386_device::sse_sse_group0fae, false},
{ 0xAE, OP_2BYTE|OP_SSE, &i386_device::sse_group_0fae, &i386_device::sse_group_0fae, false},
{ 0xAF, OP_2BYTE|OP_I386, &i386_device::i386_imul_r16_rm16, &i386_device::i386_imul_r32_rm32, false},
{ 0xB0, OP_2BYTE|OP_I486, &i386_device::i486_cmpxchg_rm8_r8, &i386_device::i486_cmpxchg_rm8_r8, true },
{ 0xB1, OP_2BYTE|OP_I486, &i386_device::i486_cmpxchg_rm16_r16, &i386_device::i486_cmpxchg_rm32_r32, true },
@ -519,9 +528,338 @@ const i386_device::X86_OPCODE i386_device::s_x86_opcode_table[] =
{ 0x70, OP_3BYTEF3|OP_SSE, &i386_device::sse_pshufhw_r128_rm128_i8, &i386_device::sse_pshufhw_r128_rm128_i8,false},
{ 0x7E, OP_3BYTEF3|OP_SSE, &i386_device::sse_movq_r128_r128m64, &i386_device::sse_movq_r128_r128m64, false},
{ 0x7F, OP_3BYTEF3|OP_SSE, &i386_device::sse_movdqu_rm128_r128, &i386_device::sse_movdqu_rm128_r128, false},
{ 0xAE, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xB8, OP_3BYTEF3|OP_PENTIUM, &i386_device::pentium_popcnt_r16_rm16, &i386_device::pentium_popcnt_r32_rm32, false},
{ 0xBC, OP_3BYTEF3|OP_PENTIUM, &i386_device::pentium_tzcnt_r16_rm16, &i386_device::pentium_tzcnt_r32_rm32, false},
{ 0xBC, OP_3BYTEF3|OP_PENTIUM, &i386_device::pentium_tzcnt_r16_rm16, &i386_device::pentium_tzcnt_r32_rm32, false},
{ 0xC2, OP_3BYTEF3|OP_SSE, &i386_device::sse_cmpss_r128_r128m32_i8, &i386_device::sse_cmpss_r128_r128m32_i8,false},
{ 0xC7, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xD6, OP_3BYTEF3|OP_SSE, &i386_device::sse_movq2dq_r128_r64, &i386_device::sse_movq2dq_r128_r64, false},
{ 0xE6, OP_3BYTEF3|OP_SSE, &i386_device::sse_cvtdq2pd_r128_r128m64, &i386_device::sse_cvtdq2pd_r128_r128m64,false}
{ 0xE6, OP_3BYTEF3|OP_SSE, &i386_device::sse_cvtdq2pd_r128_r128m64, &i386_device::sse_cvtdq2pd_r128_r128m64,false},
/* F2 0F ?? */
{ 0x10, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x11, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x12, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2A, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2C, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2D, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x51, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x58, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x59, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x5A, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x5C, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x5D, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x5E, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x5F, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x70, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x7C, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x7D, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xC2, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xD0, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xD6, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xE6, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF0, OP_3BYTEF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
/* 66 0F ?? */
{ 0x10, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x11, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x12, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x13, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x14, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x15, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x16, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x17, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x28, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x29, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2A, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2B, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2C, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2D, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2E, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2F, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x50, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x51, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x54, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x55, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x56, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x57, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x58, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x59, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x5A, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x5B, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x5C, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x5D, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x5E, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x5F, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x60, OP_3BYTE66|OP_SSE, &i386_device::sse_punpcklbw_r128_rm128, &i386_device::sse_punpcklbw_r128_rm128,false},
{ 0x61, OP_3BYTE66|OP_SSE, &i386_device::sse_punpcklwd_r128_rm128, &i386_device::sse_punpcklwd_r128_rm128,false},
{ 0x62, OP_3BYTE66|OP_SSE, &i386_device::sse_punpckldq_r128_rm128, &i386_device::sse_punpckldq_r128_rm128,false},
{ 0x63, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x64, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x65, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x66, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x67, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x68, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x69, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x6A, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x6B, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x6C, OP_3BYTE66|OP_SSE, &i386_device::sse_punpcklqdq_r128_rm128, &i386_device::sse_punpcklqdq_r128_rm128,false},
{ 0x6D, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x6E, OP_3BYTE66|OP_SSE, &i386_device::sse_movd_m128_rm32, &i386_device::sse_movd_m128_rm32, false},
{ 0x6F, OP_3BYTE66|OP_SSE, &i386_device::sse_movdqa_m128_rm128, &i386_device::sse_movdqa_m128_rm128, false},
{ 0x70, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x71, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x72, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x73, OP_3BYTE66|OP_SSE, &i386_device::sse_group_660f73, &i386_device::sse_group_660f73, false},
{ 0x74, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x76, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x7C, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x7D, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x7E, OP_3BYTE66|OP_SSE, &i386_device::sse_movd_rm32_r128, &i386_device::sse_movd_rm32_r128, false},
{ 0x7F, OP_3BYTE66|OP_SSE, &i386_device::sse_movdqa_rm128_r128, &i386_device::sse_movdqa_rm128_r128, false},
{ 0xC2, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xC4, OP_3BYTE66|OP_SSE, &i386_device::sse_pinsrw_r128_r32m16_i8, &i386_device::sse_pinsrw_r128_r32m16_i8,false},
{ 0xC5, OP_3BYTE66|OP_SSE, &i386_device::sse_pextrw_reg_r128_i8, &i386_device::sse_pextrw_reg_r128_i8, false},
{ 0xC6, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xC7, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xD0, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xD1, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xD2, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xD3, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xD4, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xD5, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xD6, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xD7, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xD8, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xD9, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xDA, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xDB, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xDC, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xDD, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xDE, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xDF, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xE0, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xE1, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xE2, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xE3, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xE4, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xE5, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xE6, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xE7, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xE8, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xE9, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xEA, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xEB, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xEC, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xED, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xEE, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xEF, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF1, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF2, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF3, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF4, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF5, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF6, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF7, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF8, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF9, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xFA, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xFB, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xFC, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xFD, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xFE, OP_3BYTE66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
/* 0F 38 ?? */
{ 0x00, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x01, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x02, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x03, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x04, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x05, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x06, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x07, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x08, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x09, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x0A, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x0B, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x1C, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x1D, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x1E, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF0, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF1, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF2, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF3, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF5, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF7, OP_3BYTE38|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
/* 0F 3A ?? */
{ 0x0F, OP_3BYTE3A|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
/* 66 0F 38 ?? */
{ 0x00, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x01, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x02, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x03, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x04, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x05, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x06, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x07, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x08, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x09, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x0A, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x0B, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x0C, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x0D, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x0E, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x0F, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x10, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x13, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x14, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x15, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x16, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x17, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x18, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x19, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x1A, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x1C, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x1D, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x1E, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x20, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x21, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x22, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x23, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x24, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x25, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x28, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x29, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2A, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2B, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2C, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2D, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2E, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x2F, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x30, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x31, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x32, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x33, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x34, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x35, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x36, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x37, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x38, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x39, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x3A, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x3B, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x3C, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x3D, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x3E, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x3F, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x40, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x41, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x45, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x46, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x47, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x58, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x59, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x5A, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x78, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x79, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x80, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x81, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x82, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x8C, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x8E, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x90, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x91, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x92, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x93, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x96, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x97, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x98, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x99, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x9A, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x9B, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x9C, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x9D, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x9E, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x9F, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xA6, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xA7, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xA8, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xA9, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xAA, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xAB, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xAC, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xAD, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xAE, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xAF, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xB6, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xB7, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xB8, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xB9, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xBA, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xBB, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xBC, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xBD, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xBE, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xBF, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xDB, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xDC, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xDD, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xDE, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xDF, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF0, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF1, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF3, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF6, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF7, OP_4BYTE3866|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
/* F2 0F 38 ?? */
{ 0xF0, OP_4BYTE38F2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF1, OP_4BYTE38F2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF3, OP_4BYTE38F2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF5, OP_4BYTE38F2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF6, OP_4BYTE38F2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF7, OP_4BYTE38F2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
/* F3 0F 38 ?? */
{ 0xF3, OP_4BYTE38F3|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF5, OP_4BYTE38F3|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF6, OP_4BYTE38F3|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xF7, OP_4BYTE38F3|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
/* 66 0F 3A ?? */
{ 0x00, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x01, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x02, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x04, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x05, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x06, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x08, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x09, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x0A, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x0B, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x0C, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x0D, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x0E, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x0F, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x14, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x15, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x16, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x17, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x18, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x19, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x1D, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x20, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x21, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x22, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x38, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x39, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x40, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x41, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x42, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x44, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x46, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x4A, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x4B, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x4C, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x60, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x61, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x62, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0x63, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
{ 0xDF, OP_4BYTE3A66|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false},
/* F2 0F 3A ?? */
{ 0xF0, OP_4BYTE3AF2|OP_SSE, &i386_device::i386_invalid, &i386_device::i386_invalid, false}
};

View File

@ -1269,60 +1269,10 @@ void i386_device::mmx_group_0f73() // Opcode 0f 73
switch ( (modm & 0x38) >> 3 )
{
case 2: // psrlq
if (m_xmm_operand_size)
{
XMM(modm & 7).q[0] = imm8 > 63 ? 0 : XMM(modm & 7).q[0] >> imm8;
XMM(modm & 7).q[1] = imm8 > 63 ? 0 : XMM(modm & 7).q[1] >> imm8;
}
else
MMX(modm & 7).q = imm8 > 63 ? 0 : MMX(modm & 7).q >> imm8;
break;
case 3: // psrldq
if (imm8 >= 16)
{
XMM(modm & 7).q[0] = 0;
XMM(modm & 7).q[1] = 0;
}
else if(imm8 >= 8)
{
imm8 = (imm8 & 7) << 3;
XMM(modm & 7).q[0] = XMM(modm & 7).q[1] >> imm8;
XMM(modm & 7).q[1] = 0;
}
else if(imm8)
{
imm8 = imm8 << 3;
XMM(modm & 7).q[0] = (XMM(modm & 7).q[1] << (64 - imm8)) | (XMM(modm & 7).q[0] >> imm8);
XMM(modm & 7).q[1] = XMM(modm & 7).q[0] >> imm8;
}
MMX(modm & 7).q = imm8 > 63 ? 0 : MMX(modm & 7).q >> imm8;
break;
case 6: // psllq
if (m_xmm_operand_size)
{
XMM(modm & 7).q[0] = imm8 > 63 ? 0 : XMM(modm & 7).q[0] << imm8;
XMM(modm & 7).q[1] = imm8 > 63 ? 0 : XMM(modm & 7).q[1] << imm8;
}
else
MMX(modm & 7).q = imm8 > 63 ? 0 : MMX(modm & 7).q << imm8;
break;
case 7: // pslldq
if (imm8 >= 16)
{
XMM(modm & 7).q[0] = 0;
XMM(modm & 7).q[1] = 0;
}
else if(imm8 >= 8)
{
imm8 = (imm8 & 7) << 3;
XMM(modm & 7).q[1] = XMM(modm & 7).q[0] << imm8;
XMM(modm & 7).q[0] = 0;
}
else if(imm8)
{
imm8 = imm8 << 3;
XMM(modm & 7).q[1] = (XMM(modm & 7).q[0] >> (64 - imm8)) | (XMM(modm & 7).q[1] << imm8);
XMM(modm & 7).q[0] = XMM(modm & 7).q[0] << imm8;
}
MMX(modm & 7).q = imm8 > 63 ? 0 : MMX(modm & 7).q << imm8;
break;
default:
report_invalid_modrm("mmx_group0f73", modm);
@ -1330,6 +1280,67 @@ void i386_device::mmx_group_0f73() // Opcode 0f 73
}
}
void i386_device::sse_group_660f73() // Opcode 66 0f 73
{
UINT64 t0;
UINT8 modm = FETCH();
UINT8 imm8 = FETCH();
if (modm >= 0xc0) {
switch ((modm & 0x38) >> 3)
{
case 2: // psrlq
XMM(modm & 7).q[0] = imm8 > 63 ? 0 : XMM(modm & 7).q[0] >> imm8;
XMM(modm & 7).q[1] = imm8 > 63 ? 0 : XMM(modm & 7).q[1] >> imm8;
break;
case 3: // psrldq
if (imm8 >= 16)
{
XMM(modm & 7).q[0] = 0;
XMM(modm & 7).q[1] = 0;
}
else if (imm8 >= 8)
{
imm8 = (imm8 & 7) << 3;
XMM(modm & 7).q[0] = XMM(modm & 7).q[1] >> imm8;
XMM(modm & 7).q[1] = 0;
}
else if (imm8)
{
t0 = XMM(modm & 7).q[0];
imm8 = imm8 << 3;
XMM(modm & 7).q[0] = (XMM(modm & 7).q[1] << (64 - imm8)) | (t0 >> imm8);
XMM(modm & 7).q[1] = t0 >> imm8;
}
break;
case 6: // psllq
XMM(modm & 7).q[0] = imm8 > 63 ? 0 : XMM(modm & 7).q[0] << imm8;
XMM(modm & 7).q[1] = imm8 > 63 ? 0 : XMM(modm & 7).q[1] << imm8;
break;
case 7: // pslldq
if (imm8 >= 16)
{
XMM(modm & 7).q[0] = 0;
XMM(modm & 7).q[1] = 0;
}
else if (imm8 >= 8)
{
imm8 = (imm8 & 7) << 3;
XMM(modm & 7).q[1] = XMM(modm & 7).q[0] << imm8;
XMM(modm & 7).q[0] = 0;
}
else if (imm8)
{
imm8 = imm8 << 3;
XMM(modm & 7).q[1] = (XMM(modm & 7).q[0] >> (64 - imm8)) | (XMM(modm & 7).q[1] << imm8);
XMM(modm & 7).q[0] = XMM(modm & 7).q[0] << imm8;
}
break;
default:
report_invalid_modrm("sse_group660f73", modm);
}
}
}
void i386_device::mmx_psrlw_r64_rm64() // Opcode 0f d1
{
MMXPROLOG();
@ -1892,16 +1903,10 @@ void i386_device::mmx_movd_r64_rm32() // Opcode 0f 6e
MMXPROLOG();
UINT8 modrm = FETCH();
if( modrm >= 0xc0 ) {
if (m_xmm_operand_size)
XMM((modrm >> 3) & 0x7).d[0]=LOAD_RM32(modrm);
else
MMX((modrm >> 3) & 0x7).d[0]=LOAD_RM32(modrm);
MMX((modrm >> 3) & 0x7).d[0]=LOAD_RM32(modrm);
} else {
UINT32 ea = GetEA(modrm, 0);
if (m_xmm_operand_size)
XMM((modrm >> 3) & 0x7).d[0]=READ32(ea);
else
MMX((modrm >> 3) & 0x7).d[0]=READ32(ea);
MMX((modrm >> 3) & 0x7).d[0]=READ32(ea);
}
MMX((modrm >> 3) & 0x7).d[1]=0;
CYCLES(1); // TODO: correct cycle count
@ -1912,17 +1917,10 @@ void i386_device::mmx_movq_r64_rm64() // Opcode 0f 6f
MMXPROLOG();
UINT8 modrm = FETCH();
if( modrm >= 0xc0 ) {
if (m_xmm_operand_size)
XMM((modrm >> 3) & 0x7).l[0]=XMM(modrm & 0x7).l[0];
else
MMX((modrm >> 3) & 0x7).l=MMX(modrm & 0x7).l;
MMX((modrm >> 3) & 0x7).l=MMX(modrm & 0x7).l;
} else {
UINT32 ea = GetEA(modrm, 0);
if (m_xmm_operand_size)
READXMM_LO64(ea, XMM((modrm >> 3) & 0x7));
else
READMMX(ea, MMX((modrm >> 3) & 0x7));
READMMX(ea, MMX((modrm >> 3) & 0x7));
}
CYCLES(1); // TODO: correct cycle count
}
@ -1932,16 +1930,10 @@ void i386_device::mmx_movd_rm32_r64() // Opcode 0f 7e
MMXPROLOG();
UINT8 modrm = FETCH();
if( modrm >= 0xc0 ) {
if (m_xmm_operand_size)
STORE_RM32(modrm, XMM((modrm >> 3) & 0x7).d[0]);
else
STORE_RM32(modrm, MMX((modrm >> 3) & 0x7).d[0]);
STORE_RM32(modrm, MMX((modrm >> 3) & 0x7).d[0]);
} else {
UINT32 ea = GetEA(modrm, 0);
if (m_xmm_operand_size)
WRITE32(ea, XMM((modrm >> 3) & 0x7).d[0]);
else
WRITE32(ea, MMX((modrm >> 3) & 0x7).d[0]);
WRITE32(ea, MMX((modrm >> 3) & 0x7).d[0]);
}
CYCLES(1); // TODO: correct cycle count
}
@ -1951,10 +1943,7 @@ void i386_device::mmx_movq_rm64_r64() // Opcode 0f 7f
MMXPROLOG();
UINT8 modrm = FETCH();
if( modrm >= 0xc0 ) {
if (m_xmm_operand_size)
XMM(modrm & 0x7).l[0]=XMM((modrm >> 3) & 0x7).l[0];
else
MMX(modrm & 0x7)=MMX((modrm >> 3) & 0x7);
MMX(modrm & 0x7)=MMX((modrm >> 3) & 0x7);
} else {
UINT32 ea = GetEA(modrm, 0);
WRITEMMX(ea, MMX((modrm >> 3) & 0x7));
@ -2059,6 +2048,130 @@ void i386_device::mmx_pshufw_r64_rm64_i8() // Opcode 0f 70
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_punpcklbw_r128_rm128() // Opcode 66 0f 60
{
UINT8 modrm = FETCH();
if (modrm >= 0xc0) {
XMM_REG xd,xs;
int s, d;
s = modrm & 0x7;
d = (modrm >> 3) & 0x7;
xd.l[0] = XMM(d).l[0];
xs.l[0] = XMM(s).l[0];
XMM(d).b[0] = xd.b[0];
XMM(d).b[1] = xs.b[0];
XMM(d).b[2] = xd.b[1];
XMM(d).b[3] = xs.b[1];
XMM(d).b[4] = xd.b[2];
XMM(d).b[5] = xs.b[2];
XMM(d).b[6] = xd.b[3];
XMM(d).b[7] = xs.b[3];
XMM(d).b[8] = xd.b[4];
XMM(d).b[9] = xs.b[4];
XMM(d).b[10] = xd.b[5];
XMM(d).b[11] = xs.b[5];
XMM(d).b[12] = xd.b[6];
XMM(d).b[13] = xs.b[6];
XMM(d).b[14] = xd.b[7];
XMM(d).b[15] = xs.b[7];
}
else {
XMM_REG xd, xs;
int d = (modrm >> 3) & 0x7;
UINT32 ea = GetEA(modrm, 0);
xd.l[0] = XMM(d).l[0];
xs.q[0] = READ64(ea);
for (int n = 0; n < 8; n++) {
XMM(d).b[n << 1] = xd.b[n];
XMM(d).b[(n << 1) | 1] = xs.b[n];
}
}
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_punpcklwd_r128_rm128()
{
UINT8 modrm = FETCH();
if (modrm >= 0xc0) {
XMM_REG xd, xs;
int s, d;
s = modrm & 0x7;
d = (modrm >> 3) & 0x7;
xd.l[0] = XMM(d).l[0];
xs.l[0] = XMM(s).l[0];
for (int n = 0; n < 4; n++) {
XMM(d).w[n << 1] = xd.w[n];
XMM(d).w[(n << 1) | 1] = xs.w[n];
}
}
else {
XMM_REG xd, xs;
int d = (modrm >> 3) & 0x7;
UINT32 ea = GetEA(modrm, 0);
xd.l[0] = XMM(d).l[0];
xs.q[0] = READ64(ea);
for (int n = 0; n < 4; n++) {
XMM(d).w[n << 1] = xd.w[n];
XMM(d).w[(n << 1) | 1] = xs.w[n];
}
}
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_punpckldq_r128_rm128()
{
UINT8 modrm = FETCH();
if (modrm >= 0xc0) {
XMM_REG xd, xs;
int s, d;
s = modrm & 0x7;
d = (modrm >> 3) & 0x7;
xd.l[0] = XMM(d).l[0];
xs.l[0] = XMM(s).l[0];
for (int n = 0; n < 2; n++) {
XMM(d).d[n << 1] = xd.d[n];
XMM(d).d[(n << 1) | 1] = xs.d[n];
}
}
else {
XMM_REG xd, xs;
int d = (modrm >> 3) & 0x7;
UINT32 ea = GetEA(modrm, 0);
xd.l[0] = XMM(d).l[0];
xs.q[0] = READ64(ea);
for (int n = 0; n < 2; n++) {
XMM(d).d[n << 1] = xd.d[n];
XMM(d).d[(n << 1) | 1] = xs.d[n];
}
}
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_punpcklqdq_r128_rm128()
{
UINT8 modrm = FETCH();
if (modrm >= 0xc0) {
XMM_REG xd, xs;
int s, d;
s = modrm & 0x7;
d = (modrm >> 3) & 0x7;
xd.l[0] = XMM(d).l[0];
xs.l[0] = XMM(s).l[0];
XMM(d).q[0] = xd.q[0];
XMM(d).q[1] = xs.q[0];
}
else {
XMM_REG xd, xs;
int d = (modrm >> 3) & 0x7;
UINT32 ea = GetEA(modrm, 0);
xd.l[0] = XMM(d).l[0];
xs.q[0] = READ64(ea);
XMM(d).q[0] = xd.q[0];
XMM(d).q[1] = xs.q[0];
}
CYCLES(1); // TODO: correct cycle count
}
void i386_device::mmx_punpcklbw_r64_r64m32() // Opcode 0f 60
{
MMXPROLOG();
@ -2394,7 +2507,7 @@ void i386_device::mmx_packssdw_r64_rm64() // Opcode 0f 6b
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_sse_group0fae() // Opcode 0f ae
void i386_device::sse_group_0fae() // Opcode 0f ae
{
UINT8 modm = FETCH();
if( modm == 0xf8 ) {
@ -2420,10 +2533,10 @@ void i386_device::sse_sse_group0fae() // Opcode 0f ae
GetNonTranslatedEA(modm, NULL);
break;
default:
report_invalid_modrm("sse_group0fae", modm);
report_invalid_modrm("sse_group_0fae", modm);
}
} else {
report_invalid_modrm("sse_group0fae", modm);
report_invalid_modrm("sse_group_0fae", modm);
}
}
@ -2857,6 +2970,35 @@ void i386_device::sse_movdqu_rm128_r128() // Opcode f3 0f 7f
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_movd_m128_rm32() // Opcode 66 0f 6e
{
UINT8 modrm = FETCH();
if (modrm >= 0xc0) {
XMM((modrm >> 3) & 0x7).d[0] = LOAD_RM32(modrm);
}
else {
UINT32 ea = GetEA(modrm, 0);
XMM((modrm >> 3) & 0x7).d[0] = READ32(ea);
}
XMM((modrm >> 3) & 0x7).d[1] = 0;
XMM((modrm >> 3) & 0x7).q[1] = 0;
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_movdqa_m128_rm128() // Opcode 66 0f 6f
{
UINT8 modrm = FETCH();
if (modrm >= 0xc0) {
XMM((modrm >> 3) & 0x7).q[0] = XMM(modrm & 0x7).q[0];
XMM((modrm >> 3) & 0x7).q[1] = XMM(modrm & 0x7).q[1];
}
else {
UINT32 ea = GetEA(modrm, 0);
READXMM(ea, XMM((modrm >> 3) & 0x7));
}
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_movq_r128_r128m64() // Opcode f3 0f 7e
{
MMXPROLOG();
@ -2872,6 +3014,33 @@ void i386_device::sse_movq_r128_r128m64() // Opcode f3 0f 7e
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_movd_rm32_r128() // Opcode 66 0f 7e
{
UINT8 modrm = FETCH();
if (modrm >= 0xc0) {
STORE_RM32(modrm, XMM((modrm >> 3) & 0x7).d[0]);
}
else {
UINT32 ea = GetEA(modrm, 0);
WRITE32(ea, XMM((modrm >> 3) & 0x7).d[0]);
}
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_movdqa_rm128_r128() // Opcode 66 0f 7f
{
UINT8 modrm = FETCH();
if (modrm >= 0xc0) {
XMM(modrm & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0];
XMM(modrm & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1];
}
else {
UINT32 ea = GetEA(modrm, 0);
WRITEXMM(ea, XMM((modrm >> 3) & 0x7));
}
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_pmovmskb_r16_r64() // Opcode 0f d7
{
//MMXPROLOG();
@ -3470,10 +3639,10 @@ void i386_device::sse_unpckhps_r128_rm128() // Opcode 0f 15
UINT32 ea = GetEA(modrm, 0);
READXMM(ea, src);
t1 = XMM(d).d[2];
t3 = XMM(d).d[3];
t2 = XMM(d).d[3];
XMM(d).d[0]=t1;
XMM(d).d[1]=src.d[2];
XMM(d).d[2]=t3;
XMM(d).d[2]=t2;
XMM(d).d[3]=src.d[3];
}
CYCLES(1); // TODO: correct cycle count
@ -3619,7 +3788,7 @@ void i386_device::sse_cmpss_r128_r128m32_i8() // Opcode f3 0f c2
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_pinsrw_r64_r16m16_i8() // Opcode 0f c4
void i386_device::sse_pinsrw_r64_r16m16_i8() // Opcode 0f c4, 16bit register
{
MMXPROLOG();
UINT8 modrm = FETCH();
@ -3642,25 +3811,36 @@ void i386_device::sse_pinsrw_r64_r16m16_i8() // Opcode 0f c4
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_pinsrw_r64_r32m16_i8() // Opcode 0f c4
void i386_device::sse_pinsrw_r64_r32m16_i8() // Opcode 0f c4, 32bit register
{
MMXPROLOG();
UINT8 modrm = FETCH();
if( modrm >= 0xc0 ) {
UINT8 imm8 = FETCH();
UINT16 v = (UINT16)LOAD_RM32(modrm);
if (m_xmm_operand_size)
XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
else
MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
} else {
UINT32 ea = GetEA(modrm, 0);
UINT8 imm8 = FETCH();
UINT16 v = READ16(ea);
if (m_xmm_operand_size)
XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
else
MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
}
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_pinsrw_r128_r32m16_i8() // Opcode 66 0f c4
{
UINT8 modrm = FETCH();
if (modrm >= 0xc0) {
UINT8 imm8 = FETCH();
UINT16 v = (UINT16)LOAD_RM32(modrm);
XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
}
else {
UINT32 ea = GetEA(modrm, 0);
UINT8 imm8 = FETCH();
UINT16 v = READ16(ea);
XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
}
CYCLES(1); // TODO: correct cycle count
}
@ -3688,10 +3868,7 @@ void i386_device::sse_pextrw_r32_r64_i8() // Opcode 0f c5
UINT8 modrm = FETCH();
if( modrm >= 0xc0 ) {
UINT8 imm8 = FETCH();
if (m_xmm_operand_size)
STORE_REG32(modrm, XMM(modrm & 0x7).w[imm8 & 7]);
else
STORE_REG32(modrm, MMX(modrm & 0x7).w[imm8 & 3]);
STORE_REG32(modrm, MMX(modrm & 0x7).w[imm8 & 3]);
} else {
//UINT8 imm8 = FETCH();
report_invalid_modrm("pextrw_r32_r64_i8", modrm);
@ -3699,6 +3876,20 @@ void i386_device::sse_pextrw_r32_r64_i8() // Opcode 0f c5
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_pextrw_reg_r128_i8() // Opcode 66 0f c5
{
UINT8 modrm = FETCH();
if (modrm >= 0xc0) {
UINT8 imm8 = FETCH();
STORE_REG32(modrm, XMM(modrm & 0x7).w[imm8 & 7]);
}
else {
//UINT8 imm8 = FETCH();
report_invalid_modrm("sse_pextrw_reg_r128_i8", modrm);
}
CYCLES(1); // TODO: correct cycle count
}
void i386_device::sse_pminub_r64_rm64() // Opcode 0f da
{
int n;