diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp index c636f294c..04f9e3f54 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp @@ -1812,7 +1812,11 @@ void OpDispatchBuilder::VPSRLVOp(OpcodeArgs) { } void OpDispatchBuilder::MOVDDUPOp(OpcodeArgs) { - OrderedNode *Src = LoadSource(FPRClass, Op, Op->Src[0], Op->Flags, -1); + // If loading a vector, use the full size, so we don't + // unnecessarily zero extend the vector. Otherwise, if + // memory, then we want to load the element size exactly. + const auto SrcSize = Op->Src[0].IsGPR() ? 16U : GetSrcSize(Op); + OrderedNode *Src = LoadSource_WithOpSize(FPRClass, Op, Op->Src[0], SrcSize, Op->Flags, -1); OrderedNode *Res = _VDupElement(16, GetSrcSize(Op), Src, 0); StoreResult(FPRClass, Op, Res, -1);