From f0680b3ba96f52bd9aea9ea05c7c4c88ed1aaf05 Mon Sep 17 00:00:00 2001 From: yz70s Date: Sun, 22 Feb 2015 15:31:04 +0100 Subject: [PATCH] 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 --- src/emu/cpu/i386/i386.c | 114 +++++++++- src/emu/cpu/i386/i386.h | 34 ++- src/emu/cpu/i386/i386ops.h | 346 ++++++++++++++++++++++++++++++- src/emu/cpu/i386/pentops.inc | 391 ++++++++++++++++++++++++++--------- 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;