mirror of
https://github.com/RPCS3/rpcs3.git
synced 2026-10-12 02:09:17 +00:00
[SPU LLVM] Optimize AVX-512 XFloat conversion
This commit is contained in:
@@ -716,6 +716,16 @@ class spu_llvm_recompiler : public spu_recompiler_base, public cpu_translator
|
||||
ensure(val && val->getType() == get_type<u32[4]>());
|
||||
|
||||
const auto x = m_ir->CreateZExt(val, get_type<u64[4]>());
|
||||
|
||||
if (m_use_avx512)
|
||||
{
|
||||
const auto s = m_ir->CreateAnd(m_ir->CreateShl(x, 32), 0x8000000000000000);
|
||||
const auto m = m_ir->CreateAnd(m_ir->CreateShl(x, 29), 0x0fffffffe0000000);
|
||||
const auto f = m_ir->CreateAdd(m_ir->CreateOr(s, m), splat<u64[4]>(0x3800000000000000).eval(m_ir));
|
||||
const auto e = m_ir->CreateAnd(val, 0x7f800000);
|
||||
return uint64_as_double(m_ir->CreateSelect(m_ir->CreateIsNotNull(e), f, s));
|
||||
}
|
||||
|
||||
const auto s = m_ir->CreateShl(m_ir->CreateAnd(x, 0x80000000), 32);
|
||||
const auto a = m_ir->CreateAnd(x, 0x7fffffff);
|
||||
const auto m = m_ir->CreateShl(m_ir->CreateAdd(a, splat<u64[4]>(0x1c0000000).eval(m_ir)), 29);
|
||||
@@ -729,6 +739,18 @@ class spu_llvm_recompiler : public spu_recompiler_base, public cpu_translator
|
||||
{
|
||||
ensure(val && val->getType() == get_type<f64[4]>());
|
||||
|
||||
if (m_use_avx512)
|
||||
{
|
||||
const auto d = double_as_uint64(val);
|
||||
const auto smax = splat<u64[4]>(0x47ffffffe0000000).eval(m_ir);
|
||||
const auto smin = splat<u64[4]>(0x3810000000000000).eval(m_ir);
|
||||
const auto a = m_ir->CreateAnd(d, 0x7fffffffe0000000);
|
||||
const auto n = m_ir->CreateICmpUGE(a, smin);
|
||||
const auto c = m_ir->CreateSelect(m_ir->CreateICmpULT(a, smax), a, smax);
|
||||
const auto r = m_ir->CreateOr(c, m_ir->CreateAnd(d, 0x8000000000000000));
|
||||
return uint64_as_double(m_ir->CreateSelect(n, r, splat<u64[4]>(0).eval(m_ir)));
|
||||
}
|
||||
|
||||
const auto smax = uint64_as_double(splat<u64[4]>(0x47ffffffe0000000).eval(m_ir));
|
||||
const auto smin = uint64_as_double(splat<u64[4]>(0x3810000000000000).eval(m_ir));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user