From 81e8dd677760895eb0be9d7474bdf2ac8c210fb3 Mon Sep 17 00:00:00 2001 From: CRACKbomber <1568512+CRACKbomber@users.noreply.github.com> Date: Fri, 23 May 2025 19:09:25 -0400 Subject: [PATCH] Implement vpkuwum/vpkuwum128 and vpkuwus/vpkuwum128 --- XenonRecomp/recompiler.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/XenonRecomp/recompiler.cpp b/XenonRecomp/recompiler.cpp index 89026f7..3b5a599 100644 --- a/XenonRecomp/recompiler.cpp +++ b/XenonRecomp/recompiler.cpp @@ -2364,6 +2364,34 @@ bool Recompiler::Recompile( } break; + case PPC_INST_VPKUWUM: + case PPC_INST_VPKUWUM128: + println("\t_mm_store_si128((__m128i*){}.u32, _mm_load_si128((__m128i*){}.u32));", vTemp(), v(insn.operands[2])); + for (int i = 0; i < 4; i++) { + println("\t{}.u16[{}] = {}.u16[{}];", + v(insn.operands[0]), i, vTemp(), i*2); + } + println("\t_mm_store_si128((__m128i*){}.u32, _mm_load_si128((__m128i*){}.u32));", vTemp(), v(insn.operands[1])); + for (int i = 0; i < 4; i++) { + println("\t{}.u16[{}] = {}.u16[{}];", + v(insn.operands[0]), i + 4, vTemp(), i*2); + } + break; + + case PPC_INST_VPKUWUS: + case PPC_INST_VPKUWUS128: + println("\t_mm_store_si128((__m128i*){}.u32, _mm_load_si128((__m128i*){}.u32));", vTemp(), v(insn.operands[2])); + for (int i = 0; i < 4; i++) { + println("\t{}.u16[{}] = {}.u32[{}] > 0xFFFF ? 0xFFFF : {}.u32[{}];", + v(insn.operands[0]), i, vTemp(), i, vTemp(), i); + } + println("\t_mm_store_si128((__m128i*){}.u32, _mm_load_si128((__m128i*){}.u32));", vTemp(), v(insn.operands[1])); + for (int i = 0; i < 4; i++) { + println("\t{}.u16[{}] = {}.u32[{}] > 0xFFFF ? 0xFFFF : {}.u32[{}];", + v(insn.operands[0]), i + 4, vTemp(), i, vTemp(), i); + } + break; + case PPC_INST_VREFP: case PPC_INST_VREFP128: // TODO: see if we can use rcp safely