From dc41c3bd9f28ae5c2cbd552a4af04dd695e2d76e Mon Sep 17 00:00:00 2001 From: lioncash Date: Wed, 16 Nov 2022 17:33:36 +0000 Subject: [PATCH] x86_64/VectorOps: Separate 128-bit VectorImm path --- .../Interface/Core/JIT/x86_64/VectorOps.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/JIT/x86_64/VectorOps.cpp b/External/FEXCore/Source/Interface/Core/JIT/x86_64/VectorOps.cpp index 5381569e7..09836a572 100644 --- a/External/FEXCore/Source/Interface/Core/JIT/x86_64/VectorOps.cpp +++ b/External/FEXCore/Source/Interface/Core/JIT/x86_64/VectorOps.cpp @@ -23,9 +23,12 @@ DEF_OP(VectorZero) { } DEF_OP(VectorImm) { - auto Op = IROp->C(); + const auto Op = IROp->C(); + const auto OpSize = IROp->Size; + + const auto Is128Bit = OpSize == Core::CPUState::XMM_SSE_REG_SIZE; + const auto Is256Bit = OpSize == Core::CPUState::XMM_AVX_REG_SIZE; - const uint8_t OpSize = IROp->Size; const uint64_t Imm = Op->Immediate; const auto Dst = GetDst(Node); @@ -63,12 +66,10 @@ DEF_OP(VectorImm) { mov(TMP1, Element); vmovq(Dst, TMP1); - if (OpSize >= 16) { - LOGMAN_THROW_AA_FMT(OpSize == 16 || OpSize == 32, - "Can't handle a vector of size: {}", OpSize); - - // Duplicate into upper elements - vbroadcastsd(ToYMM(Dst), Dst); + if (Is256Bit) { + vpbroadcastq(ToYMM(Dst), Dst); + } else if (Is128Bit) { + vpbroadcastq(Dst, Dst); } }