From a11aed2f47d044c221cecacedb62d07fa7fc353b Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 24 Sep 2020 23:08:33 -0700 Subject: [PATCH] Removes some undefined behaviour in the interpreter VExtr implementation --- .../Interface/Core/Interpreter/InterpreterCore.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/External/FEXCore/Source/Interface/Core/Interpreter/InterpreterCore.cpp b/External/FEXCore/Source/Interface/Core/Interpreter/InterpreterCore.cpp index 608e212af..e5327d40a 100644 --- a/External/FEXCore/Source/Interface/Core/Interpreter/InterpreterCore.cpp +++ b/External/FEXCore/Source/Interface/Core/Interpreter/InterpreterCore.cpp @@ -3788,7 +3788,14 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { __uint128_t Src2 = *GetSrc<__uint128_t*>(SSAData, Op->Header.Args[1]); uint64_t Offset = Op->Index * Op->Header.ElementSize * 8; - __uint128_t Dst = (Src1 << (sizeof(__uint128_t) * 8 - Offset)) | (Src2 >> Offset); + __uint128_t Dst{}; + if (Offset >= (OpSize * 8)) { + Offset -= OpSize * 8; + Dst = Src1 >> Offset; + } + else { + Dst = (Src1 << (OpSize * 8 - Offset)) | (Src2 >> Offset); + } memcpy(GDP, &Dst, OpSize); break;