[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`)
This commit is contained in:
Wunkolo
2026-03-23 19:33:50 -07:00
committed by Heel
parent 095bbbbda1
commit 531c49fbdc

View File

@@ -208,11 +208,9 @@ inline void FlushDenormals_V128(A64Emitter& e, int vreg, int sa = 2,
// denorms→[0x00000001,0x00FFFFFD]. Denormal iff ((val<<1) - 1) < 0x00FFFFFF // denorms→[0x00000001,0x00FFFFFD]. Denormal iff ((val<<1) - 1) < 0x00FFFFFF
// (unsigned). // (unsigned).
e.shl(VReg(sa).s4, VReg(vreg).s4, 1); e.shl(VReg(sa).s4, VReg(vreg).s4, 1);
e.mov(e.w0, static_cast<uint64_t>(1u)); e.movi(VReg(sb).s4, 1u);
e.dup(VReg(sb).s4, e.w0);
e.sub(VReg(sa).s4, VReg(sa).s4, VReg(sb).s4); e.sub(VReg(sa).s4, VReg(sa).s4, VReg(sb).s4);
e.mov(e.w0, static_cast<uint64_t>(0x00FFFFFFu)); e.mvni(VReg(sb).s4, 0xFFu, LSL, 24); // 0x00FFFFFF
e.dup(VReg(sb).s4, e.w0);
e.cmhi(VReg(sb).s4, VReg(sb).s4, e.cmhi(VReg(sb).s4, VReg(sb).s4,
VReg(sa).s4); // mask: all-1s for denormal lanes VReg(sa).s4); // mask: all-1s for denormal lanes
// Clear only bits 30:0 (preserve sign bit 31) so -denormal → -0, +denormal → // Clear only bits 30:0 (preserve sign bit 31) so -denormal → -0, +denormal →