From f271b650dae204b7460b7013ab10fa19adfde3d3 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Fri, 29 Dec 2017 02:56:34 +0300 Subject: [PATCH] SPU: minor addition for CFLTU, CUFLT --- rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp | 35 ++++++++++++++++++++------ 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp index bcf5504957..d9efc7d4ca 100644 --- a/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp +++ b/rpcs3/Emu/Cell/SPUASMJITRecompiler.cpp @@ -2629,7 +2629,19 @@ void spu_recompiler::CFLTU(spu_opcode_t op) const XmmLink& vs2 = XmmAlloc(); const XmmLink& vs3 = XmmAlloc(); if (op.i8 != 173) c->mulps(va, XmmConst(_mm_set1_ps(std::exp2(static_cast(static_cast(173 - op.i8)))))); // scale - c->maxps(va, XmmConst(_mm_set1_ps(0.0f))); // saturate + + if (utils::has_512()) + { + c->vcvttps2udq(vs, va); + c->psrad(va, 31); + c->pandn(va, vs); + c->movdqa(SPU_OFF_128(gpr, op.rt), va); + return; + } + + c->movdqa(vs, va); + c->psrad(va, 31); + c->andnps(va, vs); c->movaps(vs, va); // copy scaled value c->movaps(vs2, va); c->movaps(vs3, XmmConst(_mm_set1_ps(std::exp2(31.f)))); @@ -2656,12 +2668,21 @@ void spu_recompiler::CUFLT(spu_opcode_t op) { const XmmLink& va = XmmGet(op.ra, XmmType::Int); const XmmLink& v1 = XmmAlloc(); - c->movdqa(v1, va); - c->pand(va, XmmConst(_mm_set1_epi32(0x7fffffff))); - c->cvtdq2ps(va, va); // convert to floats - c->psrad(v1, 31); // generate mask from sign bit - c->andps(v1, XmmConst(_mm_set1_ps(std::exp2(31.f)))); // generate correction component - c->addps(va, v1); // add correction component + + if (utils::has_512()) + { + c->vcvtudq2ps(va, va); + } + else + { + c->movdqa(v1, va); + c->pand(va, XmmConst(_mm_set1_epi32(0x7fffffff))); + c->cvtdq2ps(va, va); // convert to floats + c->psrad(v1, 31); // generate mask from sign bit + c->andps(v1, XmmConst(_mm_set1_ps(std::exp2(31.f)))); // generate correction component + c->addps(va, v1); // add correction component + } + if (op.i8 != 155) c->mulps(va, XmmConst(_mm_set1_ps(std::exp2(static_cast(static_cast(op.i8 - 155)))))); // scale c->movaps(SPU_OFF_128(gpr, op.rt), va); }