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") {