From 0f42cc4d68db1ae43a7fccb46f0cfcd73ef63820 Mon Sep 17 00:00:00 2001 From: CRACKbomber <1568512+CRACKbomber@users.noreply.github.com> Date: Fri, 23 May 2025 18:36:18 -0400 Subject: [PATCH] Implement vpkshss and vpkswus --- XenonRecomp/recompiler.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/XenonRecomp/recompiler.cpp b/XenonRecomp/recompiler.cpp index 19cb6aa..89026f7 100644 --- a/XenonRecomp/recompiler.cpp +++ b/XenonRecomp/recompiler.cpp @@ -2339,11 +2339,31 @@ bool Recompiler::Recompile( } break; + case PPC_INST_VPKSHSS: + case PPC_INST_VPKSHSS128: + println("\t_mm_store_si128((__m128i*){}.s8, _mm_packs_epi16(_mm_load_si128((__m128i*){}.s16), _mm_load_si128((__m128i*){}.s16)));", + v(insn.operands[0]), v(insn.operands[2]), v(insn.operands[1])); + break; + case PPC_INST_VPKSHUS: case PPC_INST_VPKSHUS128: println("\t_mm_store_si128((__m128i*){}.u8, _mm_packus_epi16(_mm_load_si128((__m128i*){}.s16), _mm_load_si128((__m128i*){}.s16)));", v(insn.operands[0]), v(insn.operands[2]), v(insn.operands[1])); break; + case PPC_INST_VPKSWUS: + case PPC_INST_VPKSWUS128: + println("\t_mm_store_si128((__m128i*){}.s32, _mm_load_si128((__m128i*){}.s32));", vTemp(), v(insn.operands[2])); + for (int i = 0; i < 4; i++) { + println("\t{}.u16[{}] = {}.s32[{}] < 0 ? 0 : ({}.s32[{}] > 0xFFFF ? 0xFFFF : {}.s32[{}]);", + v(insn.operands[0]), i, vTemp(), i, vTemp(), i, vTemp(), i); + } + println("\t_mm_store_si128((__m128i*){}.s32, _mm_load_si128((__m128i*){}.s32));", vTemp(), v(insn.operands[1])); + for (int i = 0; i < 4; i++) { + println("\t{}.u16[{}] = {}.s32[{}] < 0 ? 0 : ({}.s32[{}] > 0xFFFF ? 0xFFFF : {}.s32[{}]);", + v(insn.operands[0]), i + 4, vTemp(), i, vTemp(), i, vTemp(), i); + } + break; + case PPC_INST_VREFP: case PPC_INST_VREFP128: // TODO: see if we can use rcp safely