From d0852cf1bb321c25bc0969b2bddfa6ce68604f2c Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 19 Jun 2024 19:38:28 -0700 Subject: [PATCH] TestHarnessRunner: Reconverge YMM registers if AVX is supported The TestHarness infrastructure doesn't understand the difference between converged versus split view. So fetch the split view immediately and reconverge the view manually inside of the state object so it continues working with the split ymm view. --- Source/Tools/TestHarnessRunner/TestHarnessRunner.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Source/Tools/TestHarnessRunner/TestHarnessRunner.cpp b/Source/Tools/TestHarnessRunner/TestHarnessRunner.cpp index 72eebb9dc..0e7888889 100644 --- a/Source/Tools/TestHarnessRunner/TestHarnessRunner.cpp +++ b/Source/Tools/TestHarnessRunner/TestHarnessRunner.cpp @@ -323,6 +323,17 @@ int main(int argc, char** argv, char** const envp) { FEX::HLE::_SyscallHandler->TM.DestroyThread(ParentThread, true); SyscallHandler.reset(); + + if (SupportsAVX) { + ///< Reconstruct the XMM registers even if they are in split view, then remerge them. + __uint128_t XMM_Low[FEXCore::Core::CPUState::NUM_XMMS]; + __uint128_t YMM_High[FEXCore::Core::CPUState::NUM_XMMS]; + CTX->ReconstructXMMRegisters(ParentThread->Thread, XMM_Low, YMM_High); + for (size_t i = 0; i < FEXCore::Core::CPUState::NUM_XMMS; ++i) { + memcpy(&State.xmm.avx.data[i][0], &XMM_Low[i], sizeof(__uint128_t)); + memcpy(&State.xmm.avx.data[i][2], &YMM_High[i], sizeof(__uint128_t)); + } + } } #ifndef _WIN32 else {