diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td index 2159116d1ab7c..17d96370c04a5 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td @@ -746,8 +746,6 @@ def AArch64vsli : SDNode<"AArch64ISD::VSLI", SDT_AArch64vshiftinsert>; def AArch64vsri : SDNode<"AArch64ISD::VSRI", SDT_AArch64vshiftinsert>; def AArch64bsp: SDNode<"AArch64ISD::BSP", SDT_AArch64trivec>; -def AArch64nbsl: PatFrag<(ops node:$Op1, node:$Op2, node:$Op3), - (vnot (AArch64bsp node:$Op1, node:$Op2, node:$Op3))>; def AArch64cmeq: SDNode<"AArch64ISD::CMEQ", SDT_AArch64binvec>; def AArch64cmge: SDNode<"AArch64ISD::CMGE", SDT_AArch64binvec>; diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td index b90ac0ff1fe00..62e68de1359f7 100644 --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -508,6 +508,16 @@ def AArch64smulh : PatFrag<(ops node:$op1, node:$op2), def AArch64umulh : PatFrag<(ops node:$op1, node:$op2), (AArch64umulh_p (SVEAnyPredicate), node:$op1, node:$op2)>; + +def AArch64bsl : PatFrags<(ops node:$Op1, node:$Op2, node:$Op3), + [(int_aarch64_sve_bsl node:$Op1, node:$Op2, node:$Op3), + (AArch64bsp node:$Op3, node:$Op1, node:$Op2)]>; + +def AArch64nbsl : PatFrags<(ops node:$Op1, node:$Op2, node:$Op3), + [(int_aarch64_sve_nbsl node:$Op1, node:$Op2, node:$Op3), + (vnot (AArch64bsp node:$Op3, node:$Op1, node:$Op2))]>; + + let Predicates = [HasSVE] in { def RDFFR_PPz : sve_int_rdffr_pred<0b0, "rdffr", int_aarch64_sve_rdffr_z>; def RDFFRS_PPz : sve_int_rdffr_pred<0b1, "rdffrs">; @@ -3757,10 +3767,10 @@ let Predicates = [HasSVE2orSME] in { // SVE2 bitwise ternary operations defm EOR3_ZZZZ : sve2_int_bitwise_ternary_op<0b000, "eor3", AArch64eor3>; defm BCAX_ZZZZ : sve2_int_bitwise_ternary_op<0b010, "bcax", AArch64bcax>; - defm BSL_ZZZZ : sve2_int_bitwise_ternary_op<0b001, "bsl", int_aarch64_sve_bsl, AArch64bsp>; + defm BSL_ZZZZ : sve2_int_bitwise_ternary_op<0b001, "bsl", AArch64bsl>; defm BSL1N_ZZZZ : sve2_int_bitwise_ternary_op<0b011, "bsl1n", int_aarch64_sve_bsl1n>; defm BSL2N_ZZZZ : sve2_int_bitwise_ternary_op<0b101, "bsl2n", int_aarch64_sve_bsl2n>; - defm NBSL_ZZZZ : sve2_int_bitwise_ternary_op<0b111, "nbsl", int_aarch64_sve_nbsl, AArch64nbsl>; + defm NBSL_ZZZZ : sve2_int_bitwise_ternary_op<0b111, "nbsl", AArch64nbsl>; // SVE2 bitwise xor and rotate right by immediate defm XAR_ZZZI : sve2_int_rotate_right_imm<"xar", int_aarch64_sve_xar>; diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td index 485b38a29a0f7..69c3238c7d614 100644 --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -605,13 +605,6 @@ class SVE_2_Op_Fp_Imm_Pat_Zero; -// Used to re-order the operands of BSP when lowering to BSL. BSP has the order: -// mask, in1, in2 whereas BSL for SVE2 has them ordered in1, in2, mask -class SVE_3_Op_BSP_Pat -: Pat<(vtd (op vt1:$Op1, vt2:$Op2, vt3:$Op3)), - (inst $Op2, $Op3, $Op1)>; - class SVE_Shift_Add_All_Active_Pat @@ -4922,8 +4915,8 @@ class sve2_int_bitwise_ternary_op_d opc, string asm> let hasSideEffects = 0; } -multiclass sve2_int_bitwise_ternary_op opc, string asm, SDPatternOperator op, - SDPatternOperator ir_op = null_frag> { +multiclass sve2_int_bitwise_ternary_op opc, string asm, + SDPatternOperator op> { def NAME : sve2_int_bitwise_ternary_op_d; def : InstAlias opc, string asm, SDPatternOperato def : SVE_3_Op_Pat(NAME)>; def : SVE_3_Op_Pat(NAME)>; def : SVE_3_Op_Pat(NAME)>; - - def : SVE_3_Op_BSP_Pat(NAME)>; - def : SVE_3_Op_BSP_Pat(NAME)>; - def : SVE_3_Op_BSP_Pat(NAME)>; - def : SVE_3_Op_BSP_Pat(NAME)>; } class sve2_int_rotate_right_imm tsz8_64, string asm,