From b9c026d441997b24c8373f7f300f5098122ae430 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Thu, 5 Jul 2018 15:37:48 +0300 Subject: [PATCH] SPU LLVM: improve ROTMA and ROTMAH instructions Avoid sign extension, clamp shift amount with min op --- rpcs3/Emu/Cell/SPURecompiler.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index 73114841f6..681eadd0a6 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -3086,7 +3086,8 @@ public: void ROTMA(spu_opcode_t op) { - set_vr(op.rt, trunc(sext(get_vr(op.ra)) >> zext(-get_vr(op.rb) & 0x3f))); + const auto sh = eval(-get_vr(op.rb) & 0x3f); + set_vr(op.rt, get_vr(op.ra) >> bitcast(min(sh, splat(0x1f)))); } void SHL(spu_opcode_t op) @@ -3106,7 +3107,8 @@ public: void ROTMAH(spu_opcode_t op) { - set_vr(op.rt, trunc(sext(get_vr(op.ra)) >> zext(-get_vr(op.rb) & 0x1f))); + const auto sh = eval(-get_vr(op.rb) & 0x1f); + set_vr(op.rt, get_vr(op.ra) >> bitcast(min(sh, splat(0xf)))); } void SHLH(spu_opcode_t op)