summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author yz70s <yz70s@users.noreply.github.com>2015-02-22 15:31:04 +0100
committer yz70s <yz70s@users.noreply.github.com>2015-02-22 15:31:04 +0100
commitf0680b3ba96f52bd9aea9ea05c7c4c88ed1aaf05 (patch)
tree7483b77d48d252139ad688674b0643724f5d84cf
parent79fcba5fe62d42c9d3e7c1d96122785a44c00ba8 (diff)
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
-rw-r--r--src/emu/cpu/i386/i386.c114
-rw-r--r--src/emu/cpu/i386/i386.h34
-rw-r--r--src/emu/cpu/i386/i386ops.h346
-rw-r--r--src/emu/cpu/i386/pentops.inc391
4 files changed, 777 insertions, 108 deletions
diff --git a/src/emu/cpu/i386/i386.c b/src/emu/cpu/i386/i386.c
index 3143b211ea6..85aa0d6cd65 100644
--- a/src/emu/cpu/i386/i386.c
+++ b/src/emu/cpu/i386/i386.c
@@ -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;
diff --git a/src/emu/cpu/i386/i386.h b/src/emu/cpu/i386/i386.h
index d8a56d94a72..0bc8f851084 100644
--- a/src/emu/cpu/i386/i386.h
+++ b/src/emu/cpu/i386/i386.h
@@ -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();
diff --git a/src/emu/cpu/i386/i386ops.h b/src/emu/cpu/i386/i386ops.h
index b84d188835f..9edaee19683 100644
--- a/src/emu/cpu/i386/i386ops.h
+++ b/src/emu/cpu/i386/i386ops.h
@@ -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}
};
diff --git a/src/emu/cpu/i386/pentops.inc b/src/emu/cpu/i386/pentops.inc
index 2195ba9fccb..5543673595b 100644
--- a/src/emu/cpu/i386/pentops.inc
+++ b/src/emu/cpu/i386/pentops.inc
@@ -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;