SPU LLVM: Additional FCGT optimizations

This commit is contained in:
Malcolm Jestadt 2020-06-05 04:18:11 -04:00 committed by Ivan
parent 39149fd84d
commit 8357523ec0
1 changed files with 22 additions and 1 deletions

View File

@ -7350,17 +7350,32 @@ public:
{ {
v128 data = get_const_vector(cv, m_pos, 5000); v128 data = get_const_vector(cv, m_pos, 5000);
bool safe_int_compare = true; bool safe_int_compare = true;
bool safe_simple_compare = true;
for (u32 i = 0; i < 4; i++) for (u32 i = 0; i < 4; i++)
{ {
const u32 exponent = data._u32[i] & 0x7f800000u; const u32 exponent = data._u32[i] & 0x7f800000u;
const u32 sign_bit = data._u32[i] & 0x80000000u;
const u32 absolute_float_bits = data._u32[i] & 0x7fffffffu;
if (data._u32[i] >= 0x7f7fffffu || !exponent) if (data._u32[i] >= 0x7f7fffffu || !exponent)
{ {
// Postive or negative zero, Denormal (treated as zero), Negative constant, or Normalized number with exponent +127 // Postive or negative zero, Denormal (treated as zero), Negative constant, or Normalized number with exponent +127
// Cannot used signed integer compare safely // Cannot used signed integer compare safely
// Note: Technically this optimization is accurate for any positive value, but due to the fact that
// we don't produce "extended range" values the same way as real hardware, it's not safe to apply
// this optimization for values outside of the range of x86 floating point hardware.
safe_int_compare = false; safe_int_compare = false;
break; }
if (absolute_float_bits < 0x7f7fffffu)
{
// Zero or a float in normalized range for x86
continue;
}
else
{
safe_simple_compare = false;
} }
} }
@ -7369,6 +7384,12 @@ public:
set_vr(op.rt, sext<s32[4]>(bitcast<s32[4]>(a) > bitcast<s32[4]>(b))); set_vr(op.rt, sext<s32[4]>(bitcast<s32[4]>(a) > bitcast<s32[4]>(b)));
return; return;
} }
if (safe_simple_compare)
{
set_vr(op.rt, sext<s32[4]>(fcmp_uno(a > b)));
return;
}
} }
if (auto cv = llvm::dyn_cast<llvm::Constant>(a.value)) if (auto cv = llvm::dyn_cast<llvm::Constant>(a.value))