From 5ee2db34a75622270aa8a6fde1b044d16d619fa1 Mon Sep 17 00:00:00 2001 From: Lioncache Date: Mon, 27 Feb 2023 14:18:08 -0500 Subject: [PATCH] ARMEmitter: Handle SVE conditionally terminate scalars group --- .../Core/ArchHelpers/CodeEmitter/SVEOps.inl | 14 +++++++++++++- External/FEXCore/unittests/Emitter/SVE_Tests.cpp | 6 +++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/ArchHelpers/CodeEmitter/SVEOps.inl b/External/FEXCore/Source/Interface/Core/ArchHelpers/CodeEmitter/SVEOps.inl index 5d8e1b3a7..c4288d061 100644 --- a/External/FEXCore/Source/Interface/Core/ArchHelpers/CodeEmitter/SVEOps.inl +++ b/External/FEXCore/Source/Interface/Core/ArchHelpers/CodeEmitter/SVEOps.inl @@ -1469,7 +1469,19 @@ public: } // SVE conditionally terminate scalars - // XXX: + template + requires IsXOrWRegister + void ctermeq(T rn, T rm) { + constexpr auto size = std::is_same_v ? SubRegSize::i64Bit : SubRegSize::i32Bit; + SVEIntCompareScalar(0b1000, 0, 0b0000, size, rn, rm); + } + template + requires IsXOrWRegister + void ctermne(T rn, T rm) { + constexpr auto size = std::is_same_v ? SubRegSize::i64Bit : SubRegSize::i32Bit; + SVEIntCompareScalar(0b1000, 1, 0b0000, size, rn, rm); + } + // SVE pointer conflict compare // XXX: diff --git a/External/FEXCore/unittests/Emitter/SVE_Tests.cpp b/External/FEXCore/unittests/Emitter/SVE_Tests.cpp index 7830e48bb..e9ed30261 100644 --- a/External/FEXCore/unittests/Emitter/SVE_Tests.cpp +++ b/External/FEXCore/unittests/Emitter/SVE_Tests.cpp @@ -1675,7 +1675,11 @@ TEST_CASE_METHOD(TestDisassembler, "Emitter: SVE: SVE integer compare scalar cou } TEST_CASE_METHOD(TestDisassembler, "Emitter: SVE: SVE conditionally terminate scalars") { - // TODO: Implement in emitter. + TEST_SINGLE(ctermeq(XReg::x30, XReg::x29), "ctermeq x30, x29"); + TEST_SINGLE(ctermeq(WReg::w30, WReg::w29), "ctermeq w30, w29"); + + TEST_SINGLE(ctermne(XReg::x30, XReg::x29), "ctermne x30, x29"); + TEST_SINGLE(ctermne(WReg::w30, WReg::w29), "ctermne w30, w29"); } TEST_CASE_METHOD(TestDisassembler, "Emitter: SVE: SVE pointer conflict compare") {