From 1a1c161a0d9bf5eea8a0e76e0c49e051f3a75d60 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sat, 27 Apr 2013 20:52:42 +0200 Subject: [PATCH] Implement vmin/vmax in x86 jit, slots right into VecDo3 --- Core/MIPS/ARM/ArmCompVFPU.cpp | 4 ---- Core/MIPS/ARM/ArmJit.h | 1 - Core/MIPS/MIPSIntVFPU.cpp | 2 +- Core/MIPS/MIPSTables.cpp | 4 ++-- Core/MIPS/x86/CompVFPU.cpp | 21 +++++++++++++++++---- Core/MIPS/x86/Jit.h | 1 - 6 files changed, 20 insertions(+), 13 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompVFPU.cpp b/Core/MIPS/ARM/ArmCompVFPU.cpp index 315542d7bc..b177f697d3 100644 --- a/Core/MIPS/ARM/ArmCompVFPU.cpp +++ b/Core/MIPS/ARM/ArmCompVFPU.cpp @@ -730,10 +730,6 @@ namespace MIPSComp DISABLE; } - void Jit::Comp_VMinMax(u32 op) { - DISABLE; - } - void Jit::Comp_VHdp(u32 op) { DISABLE; } diff --git a/Core/MIPS/ARM/ArmJit.h b/Core/MIPS/ARM/ArmJit.h index af0a286a05..efd2b76bcc 100644 --- a/Core/MIPS/ARM/ArmJit.h +++ b/Core/MIPS/ARM/ArmJit.h @@ -200,7 +200,6 @@ public: void Comp_VHdp(u32 op); void Comp_VCrs(u32 op); void Comp_VDet(u32 op); - void Comp_VMinMax(u32 op); void Comp_Vi2x(u32 op); void Comp_Vx2i(u32 op); void Comp_Vf2i(u32 op); diff --git a/Core/MIPS/MIPSIntVFPU.cpp b/Core/MIPS/MIPSIntVFPU.cpp index 485c5475af..8fcde3df42 100644 --- a/Core/MIPS/MIPSIntVFPU.cpp +++ b/Core/MIPS/MIPSIntVFPU.cpp @@ -1052,7 +1052,7 @@ namespace MIPSInt int n = GetNumVectorElements(sz); if (op & 0x10000) { - //vbfy2 + // vbfy2 d[0] = s[0] + s[2]; d[1] = s[1] + s[3]; d[2] = s[0] - s[2]; diff --git a/Core/MIPS/MIPSTables.cpp b/Core/MIPS/MIPSTables.cpp index 7e7640cc2b..209351f4df 100644 --- a/Core/MIPS/MIPSTables.cpp +++ b/Core/MIPS/MIPSTables.cpp @@ -502,8 +502,8 @@ const MIPSInstruction tableVFPU3[8] = //011011 xxx { INSTR("vcmp",&Jit::Comp_Generic, Dis_Vcmp, Int_Vcmp, IS_VFPU|OUT_EAT_PREFIX), {-2}, - INSTR("vmin",&Jit::Comp_VMinMax, Dis_VectorSet3, Int_Vminmax, IS_VFPU|OUT_EAT_PREFIX), - INSTR("vmax",&Jit::Comp_VMinMax, Dis_VectorSet3, Int_Vminmax, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vmin",&Jit::Comp_VecDo3, Dis_VectorSet3, Int_Vminmax, IS_VFPU|OUT_EAT_PREFIX), + INSTR("vmax",&Jit::Comp_VecDo3, Dis_VectorSet3, Int_Vminmax, IS_VFPU|OUT_EAT_PREFIX), {-2}, INSTR("vscmp",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vscmp, IS_VFPU|OUT_EAT_PREFIX), INSTR("vsge",&Jit::Comp_Generic, Dis_VectorSet3, Int_Vsge, IS_VFPU|OUT_EAT_PREFIX), diff --git a/Core/MIPS/x86/CompVFPU.cpp b/Core/MIPS/x86/CompVFPU.cpp index a63b03cba0..5efe7ec787 100644 --- a/Core/MIPS/x86/CompVFPU.cpp +++ b/Core/MIPS/x86/CompVFPU.cpp @@ -435,13 +435,27 @@ void Jit::Comp_VecDo3(u32 op) { } break; case 25: //VFPU1 - switch ((op >> 23)&7) + switch ((op >> 23) & 7) { case 0: // d[i] = s[i] * t[i]; break; //vmul xmmop = &XEmitter::MULSS; break; } break; + case 27: //VFPU3 + switch ((op >> 23) & 3) + { + case 2: // vmin + xmmop = &XEmitter::MINSS; + break; + case 3: // vmax + xmmop = &XEmitter::MAXSS; + break; + } + break; + default: + _dbg_assert_msg_(CPU,0,"invalid VecDo3"); + break; } if (xmmop == NULL) @@ -484,8 +498,10 @@ void Jit::Comp_VecDo3(u32 op) { if (!fpr.V(sregs[i]).IsSimpleReg(tempxregs[i])) MOVSS(tempxregs[i], fpr.V(sregs[i])); } + for (int i = 0; i < n; ++i) (this->*xmmop)(tempxregs[i], fpr.V(tregs[i])); + for (int i = 0; i < n; ++i) { if (!fpr.V(dregs[i]).IsSimpleReg(tempxregs[i])) @@ -934,9 +950,6 @@ void Jit::Comp_Vtfm(u32 op) { fpr.ReleaseSpillLocks(); } -void Jit::Comp_VMinMax(u32 op) { - DISABLE; -} void Jit::Comp_VHdp(u32 op) { DISABLE; diff --git a/Core/MIPS/x86/Jit.h b/Core/MIPS/x86/Jit.h index 8a38fc9ed1..705faedddb 100644 --- a/Core/MIPS/x86/Jit.h +++ b/Core/MIPS/x86/Jit.h @@ -210,7 +210,6 @@ public: void Comp_VHdp(u32 op); void Comp_VCrs(u32 op); void Comp_VDet(u32 op); - void Comp_VMinMax(u32 op); void Comp_Vi2x(u32 op); void Comp_Vx2i(u32 op); void Comp_Vf2i(u32 op);