diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index 5ef039b99f..a0698aee82 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -288,7 +288,13 @@ void Jit::Comp_SVQ(u32 op) void Jit::Comp_VDot(u32 op) { DISABLE; + // WARNING: No prefix support! + if (js.MayHavePrefix()) { + Comp_Generic(op); + js.EatPrefix(); + return; + } int vd = _VD; int vs = _VS; @@ -306,7 +312,6 @@ void Jit::Comp_VDot(u32 op) { MOVSS(XMM0, fpr.V(sregs[0])); MULSS(XMM0, fpr.V(tregs[0])); - float sum = 0.0f; int n = GetNumVectorElements(sz); for (int i = 1; i < n; i++) { diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index 080375ba7b..b452f9ad97 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -78,6 +78,17 @@ struct JitState prefixTFlag = PREFIX_UNKNOWN; prefixDFlag = PREFIX_UNKNOWN; } + bool MayHavePrefix() const { + if (!(prefixSFlag & PREFIX_KNOWN) || !(prefixTFlag & PREFIX_KNOWN) || !(prefixDFlag & PREFIX_KNOWN)) { + return true; + } else if (prefixS != 0xE4 || prefixT != 0xE4 || prefixD != 0) { + return true; + } else if (writeMask[0] || writeMask[1] || writeMask[2] || writeMask[3]) { + return true; + } + + return false; + } void EatPrefix() { if ((prefixSFlag & PREFIX_KNOWN) == 0 || prefixS != 0xE4) { prefixSFlag = PREFIX_KNOWN_DIRTY;