mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-06 10:00:16 +02:00
AVX128: Convert vzeroupper/vzeroall zeroing to dc zva
For the upper-half of the registers it is more efficient to zero the context with `dc zva` on Ampere1A hardware, while Cortex implements this as equivalent uops in their store pipeline and aren't affected one way or the other. ARM C1-Pro and newer with FEAT_MOPS also match `dc zva` performance with 64B/c, but theoretically slightly fewer instructions. C1-Nano on the other hand, clearly loses to `dc zva`, where mops can only do 16B/c, but `dc zva` does 64B/c. So we'll need to benchmark or not if MOPS is a clear win once hardware is actually shipping.
This commit is contained in:
2 files changed
+10
-8
No files matched your search
@@ -2070,6 +2070,12 @@ private:
|
||||
RegCache.Written |= Bit;
|
||||
}
|
||||
|
||||
void InvalidateHighAVXRegisters() {
|
||||
for (size_t i = 0; i < 16; ++i) {
|
||||
InvalidateReg(AVXHigh0Index + i);
|
||||
}
|
||||
}
|
||||
|
||||
void StoreRegister(uint8_t Reg, bool FPR, Ref Value) {
|
||||
StoreContext(Reg + (FPR ? FPR0Index : GPR0Index), Value);
|
||||
}
|
||||
|
||||
@@ -340,16 +340,12 @@ void OpDispatchBuilder::AVX128_VZERO(OpcodeArgs) {
|
||||
AVX128_StoreXMMRegister(i, ZeroVector, false);
|
||||
}
|
||||
|
||||
// More efficient for non-SRA upper-halves to use a cached constant and store directly.
|
||||
for (uint32_t i = 0; i < NumRegs; i++) {
|
||||
AVX128_StoreXMMRegister(i, ZeroVector, true);
|
||||
}
|
||||
InvalidateHighAVXRegisters();
|
||||
_ContextClear(offsetof(FEXCore::Core::CPUState, avx_high), sizeof(FEXCore::Core::CPUState::avx_high[0]) * NumRegs);
|
||||
} else {
|
||||
// Likewise, VZEROUPPER will only ever zero only up to the first 16 registers
|
||||
const auto ZeroVector = LoadZeroVector(OpSize::i128Bit);
|
||||
for (uint32_t i = 0; i < NumRegs; i++) {
|
||||
AVX128_StoreXMMRegister(i, ZeroVector, true);
|
||||
}
|
||||
InvalidateHighAVXRegisters();
|
||||
_ContextClear(offsetof(FEXCore::Core::CPUState, avx_high), sizeof(FEXCore::Core::CPUState::avx_high[0]) * NumRegs);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user