From 531c49fbdc2bb3cf69f1c00b806f2b98185876e2 Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Mon, 23 Mar 2026 19:33:50 -0700 Subject: [PATCH] [a64] Optimize `FlushDenormals_V128` constants `mov`+`dup` can ve `movi`. `mov`+dup` sequences for constants like `0x00FFFFFF` in particular can just use `mvni`(bit-inverse of `movi`) --- src/xenia/cpu/backend/a64/a64_seq_util.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/xenia/cpu/backend/a64/a64_seq_util.h b/src/xenia/cpu/backend/a64/a64_seq_util.h index ea15d6492..46be7b811 100644 --- a/src/xenia/cpu/backend/a64/a64_seq_util.h +++ b/src/xenia/cpu/backend/a64/a64_seq_util.h @@ -208,11 +208,9 @@ inline void FlushDenormals_V128(A64Emitter& e, int vreg, int sa = 2, // denorms→[0x00000001,0x00FFFFFD]. Denormal iff ((val<<1) - 1) < 0x00FFFFFF // (unsigned). e.shl(VReg(sa).s4, VReg(vreg).s4, 1); - e.mov(e.w0, static_cast(1u)); - e.dup(VReg(sb).s4, e.w0); + e.movi(VReg(sb).s4, 1u); e.sub(VReg(sa).s4, VReg(sa).s4, VReg(sb).s4); - e.mov(e.w0, static_cast(0x00FFFFFFu)); - e.dup(VReg(sb).s4, e.w0); + e.mvni(VReg(sb).s4, 0xFFu, LSL, 24); // 0x00FFFFFF e.cmhi(VReg(sb).s4, VReg(sb).s4, VReg(sa).s4); // mask: all-1s for denormal lanes // Clear only bits 30:0 (preserve sign bit 31) so -denormal → -0, +denormal →