From 79a3bd75cc4660294d8ec03f0a81d5f57cbbd2dd Mon Sep 17 00:00:00 2001 From: lioncash Date: Tue, 9 Aug 2022 09:27:03 -0400 Subject: [PATCH] VectorOps: Handle 256-bit VectorZero --- .../Source/Interface/Core/JIT/Arm64/JIT.cpp | 1 + .../Interface/Core/JIT/Arm64/JITClass.h | 1 + .../Interface/Core/JIT/Arm64/VectorOps.cpp | 30 ++++++++++++------- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/JIT/Arm64/JIT.cpp b/External/FEXCore/Source/Interface/Core/JIT/Arm64/JIT.cpp index d0a2cd86e..6cd8a221a 100644 --- a/External/FEXCore/Source/Interface/Core/JIT/Arm64/JIT.cpp +++ b/External/FEXCore/Source/Interface/Core/JIT/Arm64/JIT.cpp @@ -426,6 +426,7 @@ void Arm64JITCore::Op_NoOp(IR::IROp_Header *IROp, IR::NodeID Node) { Arm64JITCore::Arm64JITCore(FEXCore::Context::Context *ctx, FEXCore::Core::InternalThreadState *Thread) : CPUBackend(Thread, INITIAL_CODE_SIZE, MAX_CODE_SIZE) , Arm64Emitter(ctx, 0) + , CanUseSVE{ctx->HostFeatures.SupportsAVX} , CTX {ctx} { RAPass = Thread->PassManager->GetPass("RA"); diff --git a/External/FEXCore/Source/Interface/Core/JIT/Arm64/JITClass.h b/External/FEXCore/Source/Interface/Core/JIT/Arm64/JITClass.h index 029e87c1c..aefab239d 100644 --- a/External/FEXCore/Source/Interface/Core/JIT/Arm64/JITClass.h +++ b/External/FEXCore/Source/Interface/Core/JIT/Arm64/JITClass.h @@ -66,6 +66,7 @@ public: private: FEX_CONFIG_OPT(ParanoidTSO, PARANOIDTSO); + const bool CanUseSVE{}; Label *PendingTargetLabel; FEXCore::Context::Context *CTX; diff --git a/External/FEXCore/Source/Interface/Core/JIT/Arm64/VectorOps.cpp b/External/FEXCore/Source/Interface/Core/JIT/Arm64/VectorOps.cpp index 27a57bf00..27d96a5cb 100644 --- a/External/FEXCore/Source/Interface/Core/JIT/Arm64/VectorOps.cpp +++ b/External/FEXCore/Source/Interface/Core/JIT/Arm64/VectorOps.cpp @@ -12,17 +12,27 @@ using namespace vixl; using namespace vixl::aarch64; #define DEF_OP(x) void Arm64JITCore::Op_##x(IR::IROp_Header *IROp, IR::NodeID Node) DEF_OP(VectorZero) { - uint8_t OpSize = IROp->Size; - switch (OpSize) { - case 8: { - eor(GetDst(Node).V8B(), GetDst(Node).V8B(), GetDst(Node).V8B()); - break; + if (CanUseSVE) { + const auto Dst = GetDst(Node).Z().VnD(); + eor(Dst, Dst, Dst); + } else { + const uint8_t OpSize = IROp->Size; + + switch (OpSize) { + case 8: { + const auto Dst = GetDst(Node).V8B(); + eor(Dst, Dst, Dst); + break; + } + case 16: { + const auto Dst = GetDst(Node).V16B(); + eor(Dst, Dst, Dst); + break; + } + default: + LOGMAN_MSG_A_FMT("Unknown Op Size: {}", OpSize); + break; } - case 16: { - eor(GetDst(Node).V16B(), GetDst(Node).V16B(), GetDst(Node).V16B()); - break; - } - default: LOGMAN_MSG_A_FMT("Unknown Element Size: {}", OpSize); break; } }