diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td index e99b3f8ff07e0..37de22940afc2 100644 --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -262,15 +262,15 @@ def AArch64fmaxnm_p_nnan : PatFrag<(ops node:$op1, node:$op2, node:$op3), def SDT_AArch64Arith_Imm : SDTypeProfile<1, 3, [ SDTCisVec<0>, SDTCisVec<1>, SDTCisVec<2>, SDTCisVT<3,i32>, - SDTCVecEltisVT<1,i1>, SDTCisSameAs<0,2> + SDTCVecEltisVT<1,i1>, SDTCisSameNumEltsAs<0,1>, SDTCisSameAs<0,2> ]>; def AArch64asrd_m1 : SDNode<"AArch64ISD::ASRD_MERGE_OP1", SDT_AArch64Arith_Imm>; -def AArch64urshri_p_node : SDNode<"AArch64ISD::URSHR_I_PRED", SDT_AArch64Arith_Imm>; +def AArch64urshri_p : SDNode<"AArch64ISD::URSHR_I_PRED", SDT_AArch64Arith_Imm>; -def AArch64urshri_p : PatFrags<(ops node:$op1, node:$op2, node:$op3), - [(int_aarch64_sve_urshr node:$op1, node:$op2, node:$op3), - (AArch64urshri_p_node node:$op1, node:$op2, node:$op3)]>; +def AArch64urshr : PatFrags<(ops node:$op1, node:$op2, node:$op3), + [(int_aarch64_sve_urshr node:$op1, node:$op2, node:$op3), + (AArch64urshri_p node:$op1, node:$op2, node:$op3)]>; def SDT_AArch64IntExtend : SDTypeProfile<1, 4, [ SDTCisVec<0>, SDTCisVec<1>, SDTCisVec<2>, SDTCisVT<3, OtherVT>, SDTCisVec<4>, @@ -355,6 +355,10 @@ def AArch64ssra : PatFrags<(ops node:$op1, node:$op2, node:$op3), [(int_aarch64_sve_ssra node:$op1, node:$op2, node:$op3), (add node:$op1, (AArch64asr_p (SVEAnyPredicate), node:$op2, (SVEShiftSplatImmR (i32 node:$op3))))]>; +def AArch64ursra : PatFrags<(ops node:$op1, node:$op2, node:$op3), + [(int_aarch64_sve_ursra node:$op1, node:$op2, node:$op3), + (add node:$op1, (AArch64urshri_p (SVEAllActive), node:$op2, node:$op3))]>; + // Replace pattern min(max(v1,v2),v3) by clamp def AArch64sclamp : PatFrags<(ops node:$Zd, node:$Zn, node:$Zm), [(int_aarch64_sve_sclamp node:$Zd, node:$Zn, node:$Zm), @@ -3906,7 +3910,7 @@ let Predicates = [HasSVE2_or_SME] in { defm SQSHL_ZPmI : sve_int_bin_pred_shift_imm_left_dup<0b0110, "sqshl", "SQSHL_ZPZI", int_aarch64_sve_sqshl>; defm UQSHL_ZPmI : sve_int_bin_pred_shift_imm_left_dup<0b0111, "uqshl", "UQSHL_ZPZI", int_aarch64_sve_uqshl>; defm SRSHR_ZPmI : sve_int_bin_pred_shift_imm_right< 0b1100, "srshr", "SRSHR_ZPZI", int_aarch64_sve_srshr>; - defm URSHR_ZPmI : sve_int_bin_pred_shift_imm_right< 0b1101, "urshr", "URSHR_ZPZI", AArch64urshri_p>; + defm URSHR_ZPmI : sve_int_bin_pred_shift_imm_right< 0b1101, "urshr", "URSHR_ZPZI", AArch64urshr>; defm SQSHLU_ZPmI : sve_int_bin_pred_shift_imm_left< 0b1111, "sqshlu", "SQSHLU_ZPZI", int_aarch64_sve_sqshlu>; // SVE2 integer add/subtract long @@ -3964,7 +3968,7 @@ let Predicates = [HasSVE2_or_SME] in { defm SSRA_ZZI : sve2_int_bin_accum_shift_imm_right<0b00, "ssra", AArch64ssra>; defm USRA_ZZI : sve2_int_bin_accum_shift_imm_right<0b01, "usra", AArch64usra>; defm SRSRA_ZZI : sve2_int_bin_accum_shift_imm_right<0b10, "srsra", int_aarch64_sve_srsra, int_aarch64_sve_srshr>; - defm URSRA_ZZI : sve2_int_bin_accum_shift_imm_right<0b11, "ursra", int_aarch64_sve_ursra, AArch64urshri_p>; + defm URSRA_ZZI : sve2_int_bin_accum_shift_imm_right<0b11, "ursra", AArch64ursra, int_aarch64_sve_urshr>; // SVE2 complex integer add defm CADD_ZZI : sve2_int_cadd<0b0, "cadd", int_aarch64_sve_cadd_x>;