diff --git a/External/FEXCore/Source/Interface/Core/ArchHelpers/CodeEmitter/ASIMDOps.inl b/External/FEXCore/Source/Interface/Core/ArchHelpers/CodeEmitter/ASIMDOps.inl index cdb58f119..d762f9b59 100644 --- a/External/FEXCore/Source/Interface/Core/ArchHelpers/CodeEmitter/ASIMDOps.inl +++ b/External/FEXCore/Source/Interface/Core/ArchHelpers/CodeEmitter/ASIMDOps.inl @@ -1906,641 +1906,513 @@ public: // TODO: Don't enforce DRegister/QRegister for Q check ///< Size is dest size template - requires(std::is_same_v) - void saddl(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void saddl(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b0000, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void saddl2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void saddl2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b0000, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void saddw(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void saddw(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b0001, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void saddw2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void saddw2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b0001, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void ssubl(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void ssubl(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b0010, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void ssubl2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void ssubl2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b0010, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void ssubw(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void ssubw(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b0011, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void ssubw2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void ssubw2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b0011, ConvertedSize, rd, rn, rm); } template - requires(std::is_same_v) - void addhn(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i64Bit, "No 64-bit dest support."); + requires(std::is_same_v) + void addhn(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i64Bit, "No 64-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; ASIMD3Different(Op, 0, 0b0100, size, rd, rn, rm); } template - requires(std::is_same_v) - void addhn2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i64Bit, "No 64-bit dest support."); + requires(std::is_same_v) + void addhn2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i64Bit, "No 64-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; ASIMD3Different(Op, 0, 0b0100, size, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void sabal(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void sabal(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b0101, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void sabal2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void sabal2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b0101, ConvertedSize, rd, rn, rm); } template - requires(std::is_same_v) - void subhn(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i64Bit, "No 64-bit dest support."); + requires(std::is_same_v) + void subhn(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i64Bit, "No 64-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; ASIMD3Different(Op, 0, 0b0110, size, rd, rn, rm); } template - requires(std::is_same_v) - void subhn2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i64Bit, "No 64-bit dest support."); + requires(std::is_same_v) + void subhn2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i64Bit, "No 64-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; ASIMD3Different(Op, 0, 0b0110, size, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void sabdl(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void sabdl(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b0111, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void sabdl2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void sabdl2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b0111, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void smlal(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void smlal(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b1000, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void smlal2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void smlal2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b1000, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void sqdmlal(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit && size != FEXCore::ARMEmitter::SubRegSize::i16Bit, "No 8/16-bit dest support."); + requires(std::is_same_v) + void sqdmlal(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i16Bit, "No 8/16-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b1001, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void sqdmlal2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit && size != FEXCore::ARMEmitter::SubRegSize::i16Bit, "No 8/16-bit dest support."); + requires(std::is_same_v) + void sqdmlal2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i16Bit, "No 8/16-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b1001, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void smlsl(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void smlsl(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b1010, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void smlsl2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void smlsl2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b1010, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void sqdmlsl(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit && size != FEXCore::ARMEmitter::SubRegSize::i16Bit, "No 8/16-bit dest support."); + requires(std::is_same_v) + void sqdmlsl(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i16Bit, "No 8/16-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b1011, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void sqdmlsl2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit && size != FEXCore::ARMEmitter::SubRegSize::i16Bit, "No 8/16-bit dest support."); + requires(std::is_same_v) + void sqdmlsl2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i16Bit, "No 8/16-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b1011, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void smull(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void smull(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b1100, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void smull2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void smull2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b1100, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void sqdmull(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit && size != FEXCore::ARMEmitter::SubRegSize::i16Bit, "No 8/16-bit dest support."); + requires(std::is_same_v) + void sqdmull(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i16Bit, "No 8/16-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b1101, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void sqdmull2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit && size != FEXCore::ARMEmitter::SubRegSize::i16Bit, "No 8/16-bit dest support."); + requires(std::is_same_v) + void sqdmull2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit && size != SubRegSize::i16Bit, "No 8/16-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 0, 0b1101, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void pmull(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size == FEXCore::ARMEmitter::SubRegSize::i16Bit || size == FEXCore::ARMEmitter::SubRegSize::i128Bit, "Only 16-bit and 128-bit destination supported"); - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i64Bit; + requires(std::is_same_v) + void pmull(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size == SubRegSize::i16Bit || size == SubRegSize::i128Bit, "Only 16-bit and 128-bit destination supported"); + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; ASIMD3Different(Op, 0, 0b1110, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void pmull2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size == FEXCore::ARMEmitter::SubRegSize::i16Bit || size == FEXCore::ARMEmitter::SubRegSize::i128Bit, "Only 16-bit and 128-bit destination supported"); - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i64Bit; + requires(std::is_same_v) + void pmull2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size == SubRegSize::i16Bit || size == SubRegSize::i128Bit, "Only 16-bit and 128-bit destination supported"); + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; ASIMD3Different(Op, 0, 0b1110, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void uaddl(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void uaddl(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b0000, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void uaddl2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void uaddl2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b0000, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void uaddw(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void uaddw(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b0001, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void uaddw2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void uaddw2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b0001, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void usubl(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void usubl(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b0010, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void usubl2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void usubl2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b0010, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void usubw(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void usubw(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b0011, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void usubw2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void usubw2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b0011, ConvertedSize, rd, rn, rm); } // XXX: RADDHN/2 ///< Size is dest size template - requires(std::is_same_v) - void uabal(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void uabal(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b0101, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void uabal2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void uabal2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b0101, ConvertedSize, rd, rn, rm); } // XXX: RSUBHN/2 ///< Size is dest size template - requires(std::is_same_v) - void uabdl(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void uabdl(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b0111, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void uabdl2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void uabdl2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b0111, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void umlal(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void umlal(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b1000, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void umlal2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void umlal2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b1000, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void umlsl(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void umlsl(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b1010, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void umlsl2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void umlsl2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b1010, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void umull(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void umull(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b1100, ConvertedSize, rd, rn, rm); } ///< Size is dest size template - requires(std::is_same_v) - void umull2(FEXCore::ARMEmitter::SubRegSize size, T rd, T rn, T rm) { - LOGMAN_THROW_AA_FMT(size != FEXCore::ARMEmitter::SubRegSize::i8Bit, "No 8-bit dest support."); + requires(std::is_same_v) + void umull2(SubRegSize size, T rd, T rn, T rm) { + LOGMAN_THROW_AA_FMT(size != SubRegSize::i8Bit, "No 8-bit dest support."); constexpr uint32_t Op = 0b0000'1110'0010'0000'0000'00 << 10; - const auto ConvertedSize = - size == FEXCore::ARMEmitter::SubRegSize::i64Bit ? FEXCore::ARMEmitter::SubRegSize::i32Bit : - size == FEXCore::ARMEmitter::SubRegSize::i32Bit ? FEXCore::ARMEmitter::SubRegSize::i16Bit : - size == FEXCore::ARMEmitter::SubRegSize::i16Bit ? FEXCore::ARMEmitter::SubRegSize::i8Bit : FEXCore::ARMEmitter::SubRegSize::i8Bit; + const auto ConvertedSize = SubRegSize{FEXCore::ToUnderlying(size) - 1}; ASIMD3Different(Op, 1, 0b1100, ConvertedSize, rd, rn, rm); }