From 4aa10d383f347654c6c39514cf77b6ac9cc8f3db Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Thu, 20 Nov 2014 17:35:09 +0100 Subject: pentium: More support of the magic 0x66 prefix [O. Galibert] --- src/emu/cpu/i386/pentops.inc | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/emu/cpu/i386/pentops.inc b/src/emu/cpu/i386/pentops.inc index 390f96618f8..66494a6968d 100644 --- a/src/emu/cpu/i386/pentops.inc +++ b/src/emu/cpu/i386/pentops.inc @@ -1892,10 +1892,16 @@ void i386_device::mmx_movd_r64_rm32() // Opcode 0f 6e MMXPROLOG(); UINT8 modrm = FETCH(); if( modrm >= 0xc0 ) { - MMX((modrm >> 3) & 0x7).d[0]=LOAD_RM32(modrm); + if (m_xmm_operand_size) + XMM((modrm >> 3) & 0x7).d[0]=LOAD_RM32(modrm); + else + MMX((modrm >> 3) & 0x7).d[0]=LOAD_RM32(modrm); } else { UINT32 ea = GetEA(modrm, 0); - MMX((modrm >> 3) & 0x7).d[0]=READ32(ea); + 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[1]=0; CYCLES(1); // TODO: correct cycle count @@ -1906,10 +1912,17 @@ void i386_device::mmx_movq_r64_rm64() // Opcode 0f 6f MMXPROLOG(); UINT8 modrm = FETCH(); if( modrm >= 0xc0 ) { - MMX((modrm >> 3) & 0x7).l=MMX(modrm & 0x7).l; + 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; } else { UINT32 ea = GetEA(modrm, 0); - READMMX(ea, MMX((modrm >> 3) & 0x7)); + if (m_xmm_operand_size) + READXMM_LO64(ea, XMM((modrm >> 3) & 0x7)); + else + READMMX(ea, MMX((modrm >> 3) & 0x7)); + } CYCLES(1); // TODO: correct cycle count } @@ -1919,10 +1932,16 @@ void i386_device::mmx_movd_rm32_r64() // Opcode 0f 7e MMXPROLOG(); UINT8 modrm = FETCH(); if( modrm >= 0xc0 ) { - STORE_RM32(modrm, MMX((modrm >> 3) & 0x7).d[0]); + if (m_xmm_operand_size) + STORE_RM32(modrm, XMM((modrm >> 3) & 0x7).d[0]); + else + STORE_RM32(modrm, MMX((modrm >> 3) & 0x7).d[0]); } else { UINT32 ea = GetEA(modrm, 0); - WRITE32(ea, MMX((modrm >> 3) & 0x7).d[0]); + if (m_xmm_operand_size) + WRITE32(ea, XMM((modrm >> 3) & 0x7).d[0]); + else + WRITE32(ea, MMX((modrm >> 3) & 0x7).d[0]); } CYCLES(1); // TODO: correct cycle count } @@ -1932,7 +1951,10 @@ void i386_device::mmx_movq_rm64_r64() // Opcode 0f 7f MMXPROLOG(); UINT8 modrm = FETCH(); if( modrm >= 0xc0 ) { - MMX(modrm & 0x7)=MMX((modrm >> 3) & 0x7); + if (m_xmm_operand_size) + XMM(modrm & 0x7).l[0]=XMM((modrm >> 3) & 0x7).l[0]; + else + MMX(modrm & 0x7)=MMX((modrm >> 3) & 0x7); } else { UINT32 ea = GetEA(modrm, 0); WRITEMMX(ea, MMX((modrm >> 3) & 0x7)); -- cgit v1.2.3