diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp index 204e33d89..5ca95e2fb 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Vector.cpp @@ -4679,8 +4679,12 @@ Ref OpDispatchBuilder::VDPPSOpImpl(OpcodeArgs, const X86Tables::DecodedOperand& // Now using the destination mask we choose where the result ends up // It can duplicate and zero results - Ref Result = ZeroVec; + if (DstMask == 0b1111) { + // Full broadcast + return _VDupElement(DstSize, ElementSize, Temp, 0); + } + Ref Result = ZeroVec; for (size_t i = 0; i < IR::NumElements(DstSize, ElementSize); ++i) { const auto Bit = 1U << (i % 4); @@ -4688,7 +4692,6 @@ Ref OpDispatchBuilder::VDPPSOpImpl(OpcodeArgs, const X86Tables::DecodedOperand& Result = _VInsElement(DstSize, ElementSize, i, 0, Result, Temp); } } - return Result; } diff --git a/unittests/InstructionCountCI/VEX_map3.json b/unittests/InstructionCountCI/VEX_map3.json index 4fa02342b..2406415a8 100644 --- a/unittests/InstructionCountCI/VEX_map3.json +++ b/unittests/InstructionCountCI/VEX_map3.json @@ -2846,7 +2846,7 @@ ] }, "vdpps ymm0, ymm1, ymm2, 11111111b": { - "ExpectedInstructionCount": 61, + "ExpectedInstructionCount": 13, "Comment": [ "Map 3 0b01 0x40 128-bit" ], @@ -2860,58 +2860,10 @@ "splice z3.d, p6, z3.d, z1.d", "movprfx z0, z3", "faddp z0.s, p7/m, z0.s, z2.s", - "uzp1 z3.s, z0.s, z0.s", + "uzp1 z2.s, z0.s, z0.s", "uzp2 z1.s, z0.s, z0.s", - "splice z3.d, p6, z3.d, z1.d", - "mov z1.s, s3", - "mrs x0, nzcv", - "index z0.s, #-4, #1", - "cmpeq p0.s, p7/z, z0.s, #-4", - "mov z2.s, p0/m, z1.s", - "msr nzcv, x0", - "mov z1.s, s3", - "mrs x0, nzcv", - "index z0.s, #-4, #1", - "cmpeq p0.s, p7/z, z0.s, #-3", - "mov z2.s, p0/m, z1.s", - "msr nzcv, x0", - "mov z1.s, s3", - "mrs x0, nzcv", - "index z0.s, #-4, #1", - "cmpeq p0.s, p7/z, z0.s, #-2", - "mov z2.s, p0/m, z1.s", - "msr nzcv, x0", - "mov z1.s, s3", - "mrs x0, nzcv", - "index z0.s, #-4, #1", - "cmpeq p0.s, p7/z, z0.s, #-1", - "mov z2.s, p0/m, z1.s", - "msr nzcv, x0", - "mov z1.s, s3", - "mrs x0, nzcv", - "index z0.s, #-4, #1", - "cmpeq p0.s, p7/z, z0.s, #0", - "mov z2.s, p0/m, z1.s", - "msr nzcv, x0", - "mov z1.s, s3", - "mrs x0, nzcv", - "index z0.s, #-4, #1", - "cmpeq p0.s, p7/z, z0.s, #1", - "mov z2.s, p0/m, z1.s", - "msr nzcv, x0", - "mov z1.s, s3", - "mrs x0, nzcv", - "index z0.s, #-4, #1", - "cmpeq p0.s, p7/z, z0.s, #2", - "mov z2.s, p0/m, z1.s", - "msr nzcv, x0", - "mov z1.s, s3", - "mov z16.d, z2.d", - "mrs x0, nzcv", - "index z0.s, #-4, #1", - "cmpeq p0.s, p7/z, z0.s, #3", - "mov z16.s, p0/m, z1.s", - "msr nzcv, x0" + "splice z2.d, p6, z2.d, z1.d", + "mov z16.s, s2" ] }, "vdppd xmm0, xmm1, xmm2, 00000000b": {