From 928a932a438e1817828da600e2cdf6efcdab3d0f Mon Sep 17 00:00:00 2001 From: Lioncache Date: Thu, 19 Mar 2026 21:34:00 -0400 Subject: [PATCH] MemoryOps: Collapse duplicate add/sub in Memset We can just use ilog2 to deduplicate this a bit. --- .../Source/Interface/Core/JIT/MemoryOps.cpp | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/FEXCore/Source/Interface/Core/JIT/MemoryOps.cpp b/FEXCore/Source/Interface/Core/JIT/MemoryOps.cpp index 2643bf78a..1c9b4c22d 100644 --- a/FEXCore/Source/Interface/Core/JIT/MemoryOps.cpp +++ b/FEXCore/Source/Interface/Core/JIT/MemoryOps.cpp @@ -1926,7 +1926,6 @@ DEF_OP(MemSet) { ARMEmitter::SubRegSize::i8Bit; auto EmitMemset = [&](int32_t Direction) { - const int32_t OpSize = Size; const int32_t SizeDirection = Size * Direction; const bool IsBackwards = Direction == -1; @@ -1934,20 +1933,20 @@ DEF_OP(MemSet) { // whether or not the memset is forwards or backwards. const auto MakeFinalAddress = [&] { if (IsBackwards) { - switch (OpSize) { + switch (Size) { case 1: sub(Dst.X(), MemReg.X(), Length.X()); break; - case 2: sub(Dst.X(), MemReg.X(), Length.X(), ARMEmitter::ShiftType::LSL, 1); break; - case 4: sub(Dst.X(), MemReg.X(), Length.X(), ARMEmitter::ShiftType::LSL, 2); break; - case 8: sub(Dst.X(), MemReg.X(), Length.X(), ARMEmitter::ShiftType::LSL, 3); break; - default: LOGMAN_MSG_A_FMT("Unhandled MemSet size: {}", OpSize); break; + case 2: + case 4: + case 8: sub(Dst.X(), MemReg.X(), Length.X(), ARMEmitter::ShiftType::LSL, FEXCore::ilog2(Size)); break; + default: LOGMAN_MSG_A_FMT("Unhandled MemSet size: {}", Size); break; } } else { - switch (OpSize) { + switch (Size) { case 1: add(Dst.X(), MemReg.X(), Length.X()); break; - case 2: add(Dst.X(), MemReg.X(), Length.X(), ARMEmitter::ShiftType::LSL, 1); break; - case 4: add(Dst.X(), MemReg.X(), Length.X(), ARMEmitter::ShiftType::LSL, 2); break; - case 8: add(Dst.X(), MemReg.X(), Length.X(), ARMEmitter::ShiftType::LSL, 3); break; - default: LOGMAN_MSG_A_FMT("Unhandled MemSet size: {}", OpSize); break; + case 2: + case 4: + case 8: add(Dst.X(), MemReg.X(), Length.X(), ARMEmitter::ShiftType::LSL, FEXCore::ilog2(Size)); break; + default: LOGMAN_MSG_A_FMT("Unhandled MemSet size: {}", Size); break; } } }; @@ -2053,9 +2052,9 @@ DEF_OP(MemSet) { (void)Bind(&AgainInternal); if (IsAtomic) { - MemStoreTSO(Value, OpSize, SizeDirection); + MemStoreTSO(Value, Size, SizeDirection); } else { - MemStore(Value, OpSize, SizeDirection); + MemStore(Value, Size, SizeDirection); } sub(ARMEmitter::Size::i64Bit, TMP1, TMP1, 1); (void)cbnz(ARMEmitter::Size::i64Bit, TMP1, &AgainInternal);