From e5ca0a26846e74a501e36b075b914619b0eb20f1 Mon Sep 17 00:00:00 2001 From: CRACKbomber <1568512+CRACKbomber@users.noreply.github.com> Date: Fri, 23 May 2025 14:51:45 -0400 Subject: [PATCH] Implement vcmpbfp/vcmpbfp128 - need to implement vscr saturation bit control --- XenonRecomp/recompiler.cpp | 6 +++++- XenonUtils/ppc_context.h | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/XenonRecomp/recompiler.cpp b/XenonRecomp/recompiler.cpp index 56ff854..99bd86d 100644 --- a/XenonRecomp/recompiler.cpp +++ b/XenonRecomp/recompiler.cpp @@ -1876,7 +1876,11 @@ bool Recompiler::Recompile( case PPC_INST_VCMPBFP: case PPC_INST_VCMPBFP128: - println("\t__builtin_debugtrap();"); + printSetFlushMode(true); + println("\t_mm_store_ps({}.f32, _mm_vcmpbfp(_mm_load_ps({}.f32), _mm_load_ps({}.f32)));", + v(insn.operands[0]), v(insn.operands[1]), v(insn.operands[2])); + if (strchr(insn.opcode->name, '.')) + println("\t{}.setFromMask(_mm_load_ps({}.f32), 0xF);", cr(6), v(insn.operands[0])); break; case PPC_INST_VCMPEQFP: diff --git a/XenonUtils/ppc_context.h b/XenonUtils/ppc_context.h index c1091d1..2a6e27a 100644 --- a/XenonUtils/ppc_context.h +++ b/XenonUtils/ppc_context.h @@ -651,4 +651,11 @@ inline __m128i _mm_vsr(__m128i a, __m128i b) return _mm_castps_si128(_mm_insert_ps(_mm_castsi128_ps(_mm_srl_epi64(a, b)), _mm_castsi128_ps(_mm_srl_epi64(_mm_srli_si128(a, 4), b)), 0x10)); } +inline __m128 _mm_vcmpbfp(__m128 a, __m128 b) +{ + __m128 xmm0 = _mm_and_ps(_mm_cmpgt_ps(a, b), _mm_castsi128_ps(_mm_set1_epi32(0x80000000))); + __m128 xmm1 = _mm_and_ps(_mm_cmplt_ps(a, _mm_sub_ps(_mm_setzero_ps(), b)), _mm_castsi128_ps(_mm_set1_epi32(0x40000000))); + return _mm_or_ps(xmm0, xmm1); +} + #endif