mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-11-13 09:39:33 +01:00
Merge pull request #792 from unknownbrackets/jit-vfpu
Fix vcmp + some nan stuff + more prefix marking
This commit is contained in:
commit
a7caa1b63d
2 files changed
+44
-20
No files matched your search
+35
-11
@@ -84,11 +84,32 @@
|
||||
|
||||
#ifdef __APPLE__
|
||||
using std::isnan;
|
||||
using std::isinf;
|
||||
#endif
|
||||
#ifdef _MSC_VER
|
||||
#define isnan _isnan
|
||||
#define isinf(x) (!_finite(x) && !_isnan(x))
|
||||
#endif
|
||||
|
||||
// Preserves NaN in first param, takes sign of equal second param.
|
||||
// Technically, std::max may do this but it's undefined.
|
||||
inline float nanmax(float f, float cst)
|
||||
{
|
||||
return f <= cst ? cst : f;
|
||||
}
|
||||
|
||||
// Preserves NaN in first param, takes sign of equal second param.
|
||||
inline float nanmin(float f, float cst)
|
||||
{
|
||||
return f >= cst ? cst : f;
|
||||
}
|
||||
|
||||
// Preserves NaN in first param, takes sign of equal value in others.
|
||||
inline float nanclamp(float f, float lower, float upper)
|
||||
{
|
||||
return nanmin(nanmax(f, lower), upper);
|
||||
}
|
||||
|
||||
void ApplyPrefixST(float *v, u32 data, VectorSize size)
|
||||
{
|
||||
// Possible optimization shortcut:
|
||||
@@ -523,7 +544,8 @@ namespace MIPSInt
|
||||
ReadVector(s, sz, vs);
|
||||
for (int i = 0; i < GetNumVectorElements(sz); i++)
|
||||
{
|
||||
d[i] = 1.0f - s[i];
|
||||
// Always positive NaN.
|
||||
d[i] = isnan(s[i]) ? fabsf(s[i]) : 1.0f - s[i];
|
||||
}
|
||||
ApplyPrefixD(d, sz);
|
||||
WriteVector(d, sz, vd);
|
||||
@@ -540,13 +562,13 @@ namespace MIPSInt
|
||||
ReadVector(s, sz, vs);
|
||||
int n = GetNumVectorElements(sz);
|
||||
float x = s[0];
|
||||
d[0] = std::min(std::max(0.0f, 1.0f - x), 1.0f);
|
||||
d[1] = std::min(std::max(0.0f, x), 1.0f);
|
||||
d[0] = nanclamp(1.0f - x, 0.0f, 1.0f);
|
||||
d[1] = nanclamp(x, 0.0f, 1.0f);
|
||||
VectorSize outSize = V_Pair;
|
||||
if (n > 1) {
|
||||
float y = s[1];
|
||||
d[2] = std::min(std::max(0.0f, 1.0f - y), 1.0f);
|
||||
d[3] = std::min(std::max(0.0f, y), 1.0f);
|
||||
d[2] = nanclamp(1.0f - y, 0.0f, 1.0f);
|
||||
d[3] = nanclamp(y, 0.0f, 1.0f);
|
||||
outSize = V_Quad;
|
||||
}
|
||||
WriteVector(d, outSize, vd);
|
||||
@@ -1001,7 +1023,7 @@ namespace MIPSInt
|
||||
{
|
||||
sum += (i == n - 1) ? t[i] : s[i]*t[i];
|
||||
}
|
||||
d = sum;
|
||||
d = isnan(sum) ? fabsf(sum) : sum;
|
||||
ApplyPrefixD(&d,V_Single);
|
||||
V(vd) = d;
|
||||
PC += 4;
|
||||
@@ -1534,16 +1556,18 @@ namespace MIPSInt
|
||||
|
||||
case VC_EZ: c = s[i] == 0.0f || s[i] == -0.0f; break;
|
||||
case VC_EN: c = isnan(s[i]); break;
|
||||
case VC_EI: c = 0; break;
|
||||
case VC_ES: c = (s[i] != s[i]) || (s[i] == std::numeric_limits<float>::infinity()); break; // Tekken Dark Resurrection
|
||||
case VC_EI: c = isinf(s[i]); break;
|
||||
case VC_ES: c = isnan(s[i]) || isinf(s[i]); break; // Tekken Dark Resurrection
|
||||
|
||||
case VC_NZ: c = s[i] != 0; break;
|
||||
case VC_NN: c = s[i] != 0; break;
|
||||
case VC_NI: c = s[i] != 0; break;
|
||||
case VC_NS: c = s[i] != 0; break;
|
||||
case VC_NN: c = !isnan(s[i]); break;
|
||||
case VC_NI: c = !isinf(s[i]); break;
|
||||
case VC_NS: c = !isnan(s[i]) && !isinf(s[i]); break;
|
||||
|
||||
default:
|
||||
_dbg_assert_msg_(CPU,0,"Unsupported vcmp condition code %d", cond);
|
||||
PC += 4;
|
||||
EatPrefixes();
|
||||
return;
|
||||
}
|
||||
cc |= (c<<i);
|
||||
|
||||
@@ -492,7 +492,7 @@ const MIPSInstruction tableVFPU1[8] =
|
||||
INSTR("vdot",&Jit::Comp_VDot, Dis_VectorDot, Int_VDot, IS_VFPU|OUT_EAT_PREFIX),
|
||||
INSTR("vscl",&Jit::Comp_Generic, Dis_VScl, Int_VScl, IS_VFPU|OUT_EAT_PREFIX),
|
||||
{-2},
|
||||
INSTR("vhdp",&Jit::Comp_Generic, Dis_Generic, Int_VHdp, IS_VFPU),
|
||||
INSTR("vhdp",&Jit::Comp_Generic, Dis_Generic, Int_VHdp, IS_VFPU|OUT_EAT_PREFIX),
|
||||
INSTR("vcrs",&Jit::Comp_Generic, Dis_Vcrs, Int_Vcrs, IS_VFPU),
|
||||
INSTR("vdet",&Jit::Comp_Generic, Dis_Generic, Int_Vdet, IS_VFPU),
|
||||
{-2},
|
||||
@@ -619,8 +619,8 @@ MIPSInstruction tableVFPU5[8] = //110111 xxx
|
||||
INSTR("vpfxt",&Jit::Comp_VPFX, Dis_VPFXST, Int_VPFX, IS_VFPU),
|
||||
INSTR("vpfxd", &Jit::Comp_VPFX, Dis_VPFXD, Int_VPFX, IS_VFPU),
|
||||
INSTR("vpfxd", &Jit::Comp_VPFX, Dis_VPFXD, Int_VPFX, IS_VFPU),
|
||||
INSTR("viim.s",&Jit::Comp_Generic, Dis_Viim,Int_Viim, IS_VFPU),
|
||||
INSTR("vfim.s",&Jit::Comp_Generic, Dis_Viim,Int_Viim, IS_VFPU),
|
||||
INSTR("viim.s",&Jit::Comp_Generic, Dis_Viim,Int_Viim, IS_VFPU|OUT_EAT_PREFIX),
|
||||
INSTR("vfim.s",&Jit::Comp_Generic, Dis_Viim,Int_Viim, IS_VFPU|OUT_EAT_PREFIX),
|
||||
};
|
||||
|
||||
const MIPSInstruction tableVFPU6[32] = //111100 xxx
|
||||
@@ -690,14 +690,14 @@ const MIPSInstruction tableVFPU9[32] = //110100 00010 xxxxx
|
||||
INSTR("vbfy1", &Jit::Comp_Generic, Dis_Vbfy, Int_Vbfy, IS_VFPU|OUT_EAT_PREFIX),
|
||||
INSTR("vbfy2", &Jit::Comp_Generic, Dis_Vbfy, Int_Vbfy, IS_VFPU|OUT_EAT_PREFIX),
|
||||
//4
|
||||
INSTR("vocp", &Jit::Comp_Generic, Dis_Vbfy, Int_Vocp, IS_VFPU), // one's complement
|
||||
INSTR("vsocp", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsocp, IS_VFPU),
|
||||
INSTR("vocp", &Jit::Comp_Generic, Dis_Vbfy, Int_Vocp, IS_VFPU|OUT_EAT_PREFIX), // one's complement
|
||||
INSTR("vsocp", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsocp, IS_VFPU|OUT_EAT_PREFIX),
|
||||
INSTR("vfad", &Jit::Comp_Generic, Dis_Vfad, Int_Vfad, IS_VFPU|OUT_EAT_PREFIX),
|
||||
INSTR("vavg", &Jit::Comp_Generic, Dis_Vfad, Int_Vavg, IS_VFPU),
|
||||
//8
|
||||
INSTR("vsrt3", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsrt3, IS_VFPU),
|
||||
INSTR("vsrt4", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsrt4, IS_VFPU),
|
||||
INSTR("vsgn", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsgn, IS_VFPU),
|
||||
INSTR("vsgn", &Jit::Comp_Generic, Dis_Vbfy, Int_Vsgn, IS_VFPU|OUT_EAT_PREFIX),
|
||||
{-2},
|
||||
//12
|
||||
{-2},
|
||||
@@ -715,9 +715,9 @@ const MIPSInstruction tableVFPU9[32] = //110100 00010 xxxxx
|
||||
{-2},{-2},{-2},{-2},
|
||||
//24
|
||||
{-2},
|
||||
INSTR("vt4444", &Jit::Comp_Generic, Dis_Generic, Int_ColorConv, IS_VFPU),
|
||||
INSTR("vt5551", &Jit::Comp_Generic, Dis_Generic, Int_ColorConv, IS_VFPU),
|
||||
INSTR("vt5650", &Jit::Comp_Generic, Dis_Generic, Int_ColorConv, IS_VFPU),
|
||||
INSTR("vt4444", &Jit::Comp_Generic, Dis_Generic, Int_ColorConv, IS_VFPU|OUT_EAT_PREFIX),
|
||||
INSTR("vt5551", &Jit::Comp_Generic, Dis_Generic, Int_ColorConv, IS_VFPU|OUT_EAT_PREFIX),
|
||||
INSTR("vt5650", &Jit::Comp_Generic, Dis_Generic, Int_ColorConv, IS_VFPU|OUT_EAT_PREFIX),
|
||||
|
||||
//28
|
||||
{-2},{-2},{-2},{-2},
|
||||
|
||||
Reference in new issue
Block a user