diff --git a/rpcs3/Emu/Cell/PPUInterpreter.h b/rpcs3/Emu/Cell/PPUInterpreter.h index ebc8193c96..0ca920f8fd 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.h +++ b/rpcs3/Emu/Cell/PPUInterpreter.h @@ -1210,11 +1210,15 @@ private: } void VPERM(u32 vd, u32 va, u32 vb, u32 vc) { + u8 tmpSRC[32]; + memcpy(tmpSRC, CPU.VPR[vb]._u8, 16); + memcpy(tmpSRC + 16, CPU.VPR[va]._u8, 16); + for (uint b = 0; b < 16; b++) { u8 index = CPU.VPR[vc]._u8[b] & 0x1f; - CPU.VPR[vd]._u8[b] = index < 0x10 ? CPU.VPR[va]._u8[0xf - index] : CPU.VPR[vb]._u8[0xf - (index - 0x10)]; + CPU.VPR[vd]._u8[b] = tmpSRC[0x1f - index]; } } void VPKPX(u32 vd, u32 va, u32 vb) @@ -1553,14 +1557,23 @@ private: } void VSLDOI(u32 vd, u32 va, u32 vb, u32 sh) { - for (uint b = 0; b < 16 - sh; b++) + u8 tmpSRC[32]; + memcpy(tmpSRC, CPU.VPR[vb]._u8, 16); + memcpy(tmpSRC + 16, CPU.VPR[va]._u8, 16); + + for(uint b=0; b<16; b++) + { + CPU.VPR[vd]._u8[15 - b] = tmpSRC[31 - (b + sh)]; + } + + /*for (uint b = 0; b < 16 - sh; b++) { CPU.VPR[vd]._u8[15 - b] = CPU.VPR[va]._u8[15 - (b + sh)]; } for (uint b = 16 - sh; b < 16; b++) { CPU.VPR[vd]._u8[15 - b] = CPU.VPR[vb]._u8[15 - (b - (16 - sh))]; - } + }*/ } void VSLH(u32 vd, u32 va, u32 vb) {