[llvm] [AArch64] Use SVE2 bit-sel instructions for some binary patterns. (PR #147544)
Ricardo Jesus via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 8 09:08:28 PDT 2025
================
@@ -4034,6 +4034,36 @@ let Predicates = [HasSVE2_or_SME] in {
defm BSL2N_ZZZZ : sve2_int_bitwise_ternary_op<0b101, "bsl2n", AArch64bsl2n>;
defm NBSL_ZZZZ : sve2_int_bitwise_ternary_op<0b111, "nbsl", AArch64nbsl>;
+ multiclass binary_bitwise<ValueType VT, SDPatternOperator InOp, SDPatternOperator OutOp> {
+ def : Pat<(InOp VT:$op1, VT:$op2), (OutOp $op1, $op2)>;
+
+ def : Pat<(SVEType<VT>.DSub (InOp V64:$op1, V64:$op2)),
+ (EXTRACT_SUBREG (OutOp (INSERT_SUBREG (IMPLICIT_DEF), (SVEType<VT>.DSub $op1), dsub),
+ (INSERT_SUBREG (IMPLICIT_DEF), (SVEType<VT>.DSub $op2), dsub)), dsub)>;
+
+ def : Pat<(SVEType<VT>.ZSub (InOp V128:$op1, V128:$op2)),
+ (EXTRACT_SUBREG (OutOp (INSERT_SUBREG (IMPLICIT_DEF), (SVEType<VT>.ZSub $op1), zsub),
+ (INSERT_SUBREG (IMPLICIT_DEF), (SVEType<VT>.ZSub $op2), zsub)), zsub)>;
+ }
+
+ foreach VT = [nxv16i8, nxv8i16, nxv4i32, nxv2i64] in {
+ // EON (a, b) = BSL2N (a, a, b) = BSL2N (b, b, a)
+ defm : binary_bitwise<VT, PatFrag<(ops node:$op1, node:$op2), (vnot (xor node:$op1, node:$op2))>,
+ OutPatFrag<(ops node:$op1, node:$op2), (BSL2N_ZZZZ $op1, $op1, $op2)>>;
+
+ // NAND (a, b) = NBSL (a, b, b) = NBSL (b, a, a)
+ defm : binary_bitwise<VT, PatFrag<(ops node:$op1, node:$op2), (vnot (and node:$op1, node:$op2))>,
+ OutPatFrag<(ops node:$op1, node:$op2), (NBSL_ZZZZ $op2, $op1, $op1)>>;
+
+ // NOR (a, b) = NBSL (a, b, a) = NBSL (b, a, b)
+ defm : binary_bitwise<VT, PatFrag<(ops node:$op1, node:$op2), (vnot (or node:$op1, node:$op2))>,
+ OutPatFrag<(ops node:$op1, node:$op2), (NBSL_ZZZZ $op2, $op1, $op2)>>;
+
+ // ORN (a, b) = BSL2N (a, b, a)
+ defm : binary_bitwise<VT, PatFrag<(ops node:$op1, node:$op2), (or node:$op1, (vnot node:$op2))>,
+ OutPatFrag<(ops node:$op1, node:$op2), (BSL2N_ZZZZ $op1, $op2, $op1)>>;
+ }
----------------
rj-jesus wrote:
It wasn't obvious to me how that could be done and the order of the operands in the `*BSL*` instructions propagated, but if there's an example you could point me to, I'd be happy to give it a try.
https://github.com/llvm/llvm-project/pull/147544
More information about the llvm-commits
mailing list