mirror of
https://github.com/holub/mame
synced 2025-04-23 08:49:55 +03:00
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:
parent
79fcba5fe6
commit
f0680b3ba9
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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}
|
||||
};
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user