From 548fd9daf88affdc22524e45bc56677ef28cd477 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 10 Jul 2024 23:07:37 -0700 Subject: [PATCH] OpcodeDispatcher: Implement support for SSE4.1 NT load --- FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp index 38b3467d0..e52e33548 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp @@ -45,8 +45,13 @@ void OpDispatchBuilder::MOVVectorUnalignedOp(OpcodeArgs) { void OpDispatchBuilder::MOVVectorNTOp(OpcodeArgs) { const auto Size = GetDstSize(Op); - if (Op->Dest.IsGPR()) { + if (Op->Dest.IsGPR() && Size >= OpSize::i128Bit) { ///< MOVNTDQA load non-temporal comes from SSE4.1 and is extended by AVX/AVX2. + Ref SrcAddr = LoadSource(GPRClass, Op, Op->Src[0], Op->Flags, {.LoadData = false}); + auto Src = _VLoadNonTemporal(Size, SrcAddr, 0); + + StoreResult(FPRClass, Op, Src, 1, MemoryAccessType::STREAM); + } else if (Op->Dest.IsGPR()) { Ref Src = LoadSource(FPRClass, Op, Op->Src[0], Op->Flags, {.Align = 1, .AccessType = MemoryAccessType::STREAM}); StoreResult(FPRClass, Op, Src, 1, MemoryAccessType::STREAM); } else {