diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td index 424848252f6aa..95148a691b352 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td @@ -273,6 +273,8 @@ def HasSVE2p1_or_HasSME2p1 def HasSVE2p2orSME2p2 : Predicate<"Subtarget->isSVEorStreamingSVEAvailable() && (Subtarget->hasSVE2p2() || Subtarget->hasSME2p2())">, AssemblerPredicateWithAll<(any_of FeatureSME2p2, FeatureSVE2p2), "sme2p2 or sve2p2">; +def NotHasSVE2p2orSME2p2 + : Predicate<"!(Subtarget->isSVEorStreamingSVEAvailable() && (Subtarget->hasSVE2p2() || Subtarget->hasSME2p2()))">; def HasSVE2p1orSSVE_AES : Predicate<"(Subtarget->isSVEAvailable() && Subtarget->hasSVE2p1()) ||" "(Subtarget->isSVEorStreamingSVEAvailable() && Subtarget->hasSSVE_AES())">, diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td index 6fdcaec86340c..cf7d929ab2e82 100644 --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -4268,10 +4268,10 @@ let Predicates = [HasSVE2p2orSME2p2] in { defm FLOGB_ZPzZ : sve_fp_z2op_p_zd_d_flogb<"flogb">; // SVE2 integer unary operations, zeroing predicate - def URECPE_ZPzZ : sve2_int_un_pred_arit_z<0b10, 0b00, "urecpe", ZPR32>; - def URSQRTE_ZPzZ : sve2_int_un_pred_arit_z<0b10, 0b01, "ursqrte", ZPR32>; - defm SQABS_ZPzZ : sve2_int_un_pred_arit_z<0b10, "sqabs">; - defm SQNEG_ZPzZ : sve2_int_un_pred_arit_z<0b11, "sqneg">; + def URECPE_ZPzZ_S : sve2_int_un_pred_arit_z<0b10, 0b00, "urecpe", ZPR32>; + def URSQRTE_ZPzZ_S : sve2_int_un_pred_arit_z<0b10, 0b01, "ursqrte", ZPR32>; + defm SQABS_ZPzZ : sve2_int_un_pred_arit_z<0b10, "sqabs">; + defm SQNEG_ZPzZ : sve2_int_un_pred_arit_z<0b11, "sqneg">; // Floating point round to integral fp value in integer size range // Merging @@ -4296,7 +4296,7 @@ let Predicates = [HasSVE2p2orSME2p2] in { // Floating-point invert exponent, zeroing predicate defm FRECPX_ZPzZ : sve_fp_z2op_p_zd_hsd<0b01100, "frecpx">; // Floating-point square root, zeroing predicate - defm FSQRT_ZPZz : sve_fp_z2op_p_zd_hsd<0b01101, "fsqrt">; + defm FSQRT_ZPzZ : sve_fp_z2op_p_zd_hsd<0b01101, "fsqrt">; // SVE2p2 integer unary arithmetic (bitwise), zeroing predicate defm CLS_ZPzZ : sve_int_un_pred_arit_bitwise_z<0b000, "cls">; @@ -4324,11 +4324,11 @@ let Predicates = [HasSVE2p2orSME2p2] in { defm LASTP_XPP : sve_int_pcount_pred_tmp<0b010, "lastp">; // SVE reverse within elements, zeroing predicate - defm RBIT_ZPzZ : sve_int_perm_rev_rbit_z<"rbit">; - defm REVB_ZPzZ : sve_int_perm_rev_revb_z<"revb">; - defm REVH_ZPzZ : sve_int_perm_rev_revh_z<"revh">; - def REVW_ZPzZ : sve_int_perm_rev_z<0b11, 0b0110, "revw", ZPR64>; - def REVD_ZPzZ : sve_int_perm_rev_z<0b00, 0b1110, "revd", ZPR128>; + defm RBIT_ZPzZ : sve_int_perm_rev_rbit_z<"rbit">; + defm REVB_ZPzZ : sve_int_perm_rev_revb_z<"revb">; + defm REVH_ZPzZ : sve_int_perm_rev_revh_z<"revh">; + def REVW_ZPzZ_D : sve_int_perm_rev_z<0b11, 0b0110, "revw", ZPR64>; + defm REVD_ZPzZ : sve_int_perm_revd_z<"revd", AArch64revd_mt>; } // End HasSME2p2orSVE2p2 //===----------------------------------------------------------------------===// @@ -4442,3 +4442,250 @@ let Predicates = [HasSVE, HasCPA] in { // Multiply-add vectors, writing addend def MLA_CPA : sve_int_mla_cpa<"mlapt">; } + +multiclass sve_int_un_pred_arit_bitwise_fp_pat { + let Predicates = [HasSVEorSME, NotHasSVE2p2orSME2p2] in { + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_H_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_H_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_H_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_S_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_S_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_D_UNDEF)>; + } + + let Predicates = [HasSVE2p2orSME2p2] in { + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_H)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_H)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_H)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_S)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_S)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_D)>; + } +} + +defm FABS : sve_int_un_pred_arit_bitwise_fp_pat; +defm FNEG : sve_int_un_pred_arit_bitwise_fp_pat; + +multiclass sve_int_un_pred_arit_pat { + let Predicates = [HasSVEorSME, NotHasSVE2p2orSME2p2] in { + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_B_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_H_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_S_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_D_UNDEF)>; + } + + let Predicates = [HasSVE2p2orSME2p2] in { + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_B)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_H)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_S)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_D)>; + } +} + +defm ABS : sve_int_un_pred_arit_pat; +defm NEG : sve_int_un_pred_arit_pat; + +multiclass sve_fp_2op_p_zdr_pat { + let Predicates = [HasSVEorSME, NotHasSVE2p2orSME2p2] in { + defm : SVE_3_Op_Undef_Pat(NAME # _ZPmZ_StoH)>; + defm : SVE_3_Op_Undef_Pat(NAME # _ZPmZ_DtoH)>; + defm : SVE_3_Op_Undef_Pat(NAME # _ZPmZ_DtoS)>; + + defm : SVE_3_Op_Undef_Pat(NAME # _ZPmZ_HtoS)>; + defm : SVE_3_Op_Undef_Pat(NAME # _ZPmZ_HtoD)>; + defm : SVE_3_Op_Undef_Pat(NAME # _ZPmZ_StoD)>; + } + + let Predicates = [HasSVE2p2orSME2p2] in { + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_StoH)>; + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_DtoH)>; + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_DtoS)>; + + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_HtoS)>; + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_HtoD)>; + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_StoD)>; + } +} + +defm FCVT : sve_fp_2op_p_zdr_pat; + +multiclass sve_bfloat_convert_pat { + let Predicates = [HasBF16, HasSVE2p2orSME2p2] in { + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_StoH)>; + } +} + +defm BFCVT : sve_bfloat_convert_pat; + +multiclass sve2_fp_convert_up_long_pat { + let Predicates = [HasSVE2p2orSME2p2] in { + defm : SVE_3_Op_UndefZero_Pat(op # _f32f16), nxv4f32, nxv4i1, nxv8f16, !cast(NAME # _ZPzZ_HtoS)>; + defm : SVE_3_Op_UndefZero_Pat(op # _f64f32), nxv2f64, nxv2i1, nxv4f32, !cast(NAME # _ZPzZ_StoD)>; + } +} + +defm FCVTLT : sve2_fp_convert_up_long_pat<"int_aarch64_sve_fcvtlt">; + +multiclass sve2_fp_convert_down_odd_rounding_pat { + let Predicates = [HasSVE2p2orSME2p2] in { + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_DtoS)>; + } +} + +defm FCVTX : sve2_fp_convert_down_odd_rounding_pat; + +multiclass sve_fp_2op_p_zd_fcvtz_pat { + let Predicates = [HasSVE2p2orSME2p2] in { + defm : SVE_3_Op_UndefZero_Pat(op # _i32f64), nxv4i32, nxv2i1, nxv2f64, !cast(NAME # _ZPzZ_DtoS)>; + defm : SVE_3_Op_UndefZero_Pat(op # _i64f32), nxv2i64, nxv2i1, nxv4f32, !cast(NAME # _ZPzZ_StoD)>; + defm : SVE_3_Op_UndefZero_Pat(op # _i32f16), nxv4i32, nxv4i1, nxv8f16, !cast(NAME # _ZPzZ_HtoS)>; + defm : SVE_3_Op_UndefZero_Pat(op # _i64f16), nxv2i64, nxv2i1, nxv8f16, !cast(NAME # _ZPzZ_HtoD)>; + } +} + +defm FCVTZS : sve_fp_2op_p_zd_fcvtz_pat<"int_aarch64_sve_fcvtzs">; +defm FCVTZU : sve_fp_2op_p_zd_fcvtz_pat<"int_aarch64_sve_fcvtzu">; + +multiclass sve_fp_2op_p_zd_uscvtf_pat { + let Predicates = [HasSVE2p2orSME2p2] in { + defm : SVE_3_Op_UndefZero_Pat(op # _f32i64), nxv4f32, nxv2i1, nxv2i64, !cast(NAME # _ZPzZ_DtoS)>; + defm : SVE_3_Op_UndefZero_Pat(op # _f64i32), nxv2f64, nxv2i1, nxv4i32, !cast(NAME # _ZPzZ_StoD)>; + defm : SVE_3_Op_UndefZero_Pat(op # _f16i32), nxv8f16, nxv4i1, nxv4i32, !cast(NAME # _ZPzZ_StoH)>; + defm : SVE_3_Op_UndefZero_Pat(op # _f16i64), nxv8f16, nxv2i1, nxv2i64, !cast(NAME # _ZPzZ_DtoH)>; + } +} + +defm SCVTF : sve_fp_2op_p_zd_uscvtf_pat<"int_aarch64_sve_scvtf">; +defm UCVTF : sve_fp_2op_p_zd_uscvtf_pat<"int_aarch64_sve_ucvtf">; + +multiclass sve_int_un_pred_arit_bitwise_pat { + let Predicates = [HasSVEorSME, NotHasSVE2p2orSME2p2] in { + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_B_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_H_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_S_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_D_UNDEF)>; + } + + let Predicates = [HasSVE2p2orSME2p2] in { + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_B)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_H)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_S)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_D)>; + } +} + +defm CLS : sve_int_un_pred_arit_bitwise_pat; +defm CLZ : sve_int_un_pred_arit_bitwise_pat; +defm CNT : sve_int_un_pred_arit_bitwise_pat; +defm CNOT : sve_int_un_pred_arit_bitwise_pat; +defm NOT : sve_int_un_pred_arit_bitwise_pat; + +multiclass sve2_fp_flogb_pat { + let Predicates = [HasSVE2p2orSME2p2] in { + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_H)>; + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_S)>; + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_D)>; + } +} + +defm FLOGB : sve2_fp_flogb_pat; + +multiclass sve_fp_2op_p_zd_HSD_pat { + let Predicates = [HasSVEorSME, NotHasSVE2p2orSME2p2] in { + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_H_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_H_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_H_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_S_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_S_UNDEF)>; + defm : SVE_1_Op_PassthruUndef_Pat(NAME # _ZPmZ_D_UNDEF)>; + } + + let Predicates = [HasSVE2p2orSME2p2] in { + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_H)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_H)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_H)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_S)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_S)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_D)>; + } +} + +defm FRINTN : sve_fp_2op_p_zd_HSD_pat; +defm FRINTP : sve_fp_2op_p_zd_HSD_pat; +defm FRINTM : sve_fp_2op_p_zd_HSD_pat; +defm FRINTZ : sve_fp_2op_p_zd_HSD_pat; +defm FRINTA : sve_fp_2op_p_zd_HSD_pat; +defm FRINTX : sve_fp_2op_p_zd_HSD_pat; +defm FRINTI : sve_fp_2op_p_zd_HSD_pat; +defm FRECPX : sve_fp_2op_p_zd_HSD_pat; +defm FSQRT : sve_fp_2op_p_zd_HSD_pat; + +multiclass sve2_int_un_pred_arit_s_pat { + let Predicates = [HasSVE2orSME, NotHasSVE2p2orSME2p2] in { + defm : SVE_3_Op_Undef_Pat(NAME # _ZPmZ_S_UNDEF)>; + } + + let Predicates = [HasSVE2p2orSME2p2] in { + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_S)>; + } +} + +defm URECPE : sve2_int_un_pred_arit_s_pat; +defm URSQRTE : sve2_int_un_pred_arit_s_pat; + +multiclass sve2_int_un_pred_arit_pat { + let Predicates = [HasSVE2orSME, NotHasSVE2p2orSME2p2] in { + defm : SVE_3_Op_Undef_Pat(NAME # _ZPmZ_B_UNDEF)>; + defm : SVE_3_Op_Undef_Pat(NAME # _ZPmZ_H_UNDEF)>; + defm : SVE_3_Op_Undef_Pat(NAME # _ZPmZ_S_UNDEF)>; + defm : SVE_3_Op_Undef_Pat(NAME # _ZPmZ_D_UNDEF)>; + } + + let Predicates = [HasSVE2p2orSME2p2] in { + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_B)>; + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_H)>; + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_S)>; + defm : SVE_3_Op_UndefZero_Pat(NAME # _ZPzZ_D)>; + } +} + +defm SQABS : sve2_int_un_pred_arit_pat; +defm SQNEG : sve2_int_un_pred_arit_pat; + +multiclass sve_int_perm_rev_rbit_pat { + let Predicates = [HasSVE2p2orSME2p2] in { + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_B)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_H)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_S)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_D)>; + } +} + +defm RBIT : sve_int_perm_rev_rbit_pat; + +multiclass sve_int_perm_rev_revb_pat { + let Predicates = [HasSVE2p2orSME2p2] in { + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_H)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_S)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_D)>; + } +} + +defm REVB : sve_int_perm_rev_revb_pat; + +multiclass sve_int_perm_rev_revh_pat { + let Predicates = [HasSVE2p2orSME2p2] in { + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_S)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_D)>; + } +} + +defm REVH : sve_int_perm_rev_revh_pat; + +multiclass sve_int_perm_rev_revw_pat { + let Predicates = [HasSVE2p2orSME2p2] in { + def : SVE_1_Op_PassthruUndefZero_Pat(NAME # _ZPzZ_D)>; + } +} + +defm REVW : sve_int_perm_rev_revw_pat; diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td index 5cfcc01afd20f..271c2abbc693f 100644 --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -467,12 +467,18 @@ multiclass SVE_1_Op_PassthruUndef_Round_Pat; +def SVEDup0Undef : ComplexPattern; class SVE_1_Op_PassthruZero_Pat : Pat<(vtd (op (vtd (SVEDup0)), vt1:$Op1, vt2:$Op2)), (inst (IMPLICIT_DEF), $Op1, $Op2)>; +class SVE_1_Op_PassthruUndefZero_Pat + : Pat<(vtd (op pg:$Op1, vts:$Op2, (vtd (SVEDup0Undef)))), + (inst $Op1, $Op2)>; + class SVE_1_Op_Imm_OptLsl_Pat : Pat<(vt (op (vt zprty:$Op1), (vt (splat_vector (it (cpx i32:$imm, i32:$shift)))))), @@ -520,6 +526,14 @@ multiclass SVE_3_Op_Undef_Pat; } +multiclass SVE_3_Op_UndefZero_Pat { + def : Pat<(vtd (op (vt1 undef), vt2:$Op1, vt3:$Op2)), + (inst $Op1, $Op2)>; + def : Pat<(vtd (op (vt1 (SVEDup0)), vt2:$Op1, vt3:$Op2)), + (inst $Op1, $Op2)>; +} + class SVE_4_Op_Pat @@ -555,8 +569,6 @@ class SVE_4_Op_Imm_Pat; -def SVEDup0Undef : ComplexPattern; - let AddedComplexity = 1 in { class SVE_3_Op_Pat_SelZero @@ -3071,13 +3083,6 @@ multiclass sve_fp_2op_p_zd_HSD opc, string asm, SDPatternOperator op> { def _H_UNDEF : PredOneOpPassthruPseudo; def _S_UNDEF : PredOneOpPassthruPseudo; def _D_UNDEF : PredOneOpPassthruPseudo; - - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _H_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _H_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _H_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _S_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _S_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _D_UNDEF)>; } multiclass sve2_fp_flogb { @@ -4034,8 +4039,6 @@ multiclass sve2_int_un_pred_arit_s opc, string asm, def : SVE_3_Op_Pat(NAME # _S)>; def _S_UNDEF : PredOneOpPassthruPseudo; - - defm : SVE_3_Op_Undef_Pat(NAME # _S_UNDEF)>; } multiclass sve2_int_un_pred_arit opc, string asm, SDPatternOperator op> { @@ -4057,11 +4060,6 @@ multiclass sve2_int_un_pred_arit opc, string asm, SDPatternOperator op> def _H_UNDEF : PredOneOpPassthruPseudo; def _S_UNDEF : PredOneOpPassthruPseudo; def _D_UNDEF : PredOneOpPassthruPseudo; - - defm : SVE_3_Op_Undef_Pat(NAME # _B_UNDEF)>; - defm : SVE_3_Op_Undef_Pat(NAME # _H_UNDEF)>; - defm : SVE_3_Op_Undef_Pat(NAME # _S_UNDEF)>; - defm : SVE_3_Op_Undef_Pat(NAME # _D_UNDEF)>; } multiclass sve2_int_un_pred_arit_z opc, string asm> { @@ -4742,11 +4740,6 @@ multiclass sve_int_un_pred_arit opc, string asm, def _H_UNDEF : PredOneOpPassthruPseudo; def _S_UNDEF : PredOneOpPassthruPseudo; def _D_UNDEF : PredOneOpPassthruPseudo; - - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _B_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _H_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _S_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _D_UNDEF)>; } multiclass sve_int_un_pred_arit_z opc, string asm> { @@ -4838,11 +4831,6 @@ multiclass sve_int_un_pred_arit_bitwise opc, string asm, def _H_UNDEF : PredOneOpPassthruPseudo; def _S_UNDEF : PredOneOpPassthruPseudo; def _D_UNDEF : PredOneOpPassthruPseudo; - - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _B_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _H_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _S_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _D_UNDEF)>; } multiclass sve_int_un_pred_arit_bitwise_z opc, string asm> { @@ -4871,13 +4859,6 @@ multiclass sve_int_un_pred_arit_bitwise_fp opc, string asm, def _H_UNDEF : PredOneOpPassthruPseudo; def _S_UNDEF : PredOneOpPassthruPseudo; def _D_UNDEF : PredOneOpPassthruPseudo; - - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _H_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _H_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _H_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _S_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _S_UNDEF)>; - defm : SVE_1_Op_PassthruUndef_Pat(NAME # _D_UNDEF)>; } multiclass sve_int_un_pred_arit_bitwise_fp_z opc, string asm> { @@ -7468,6 +7449,20 @@ multiclass sve_int_perm_rev_revh_z { def _D : sve_int_perm_rev_z<0b11, 0b0101, asm, ZPR64>; } +multiclass sve_int_perm_revd_z { + def NAME : sve_int_perm_rev_z<0b00, 0b1110, asm, ZPR128>; + + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; + def : SVE_1_Op_PassthruUndefZero_Pat(NAME)>; +} + class sve_int_perm_cpy_r sz8_64, string asm, ZPRRegOp zprty, RegisterClass srcRegType> : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, srcRegType:$Rn), diff --git a/llvm/test/CodeGen/AArch64/zeroing-forms-abs-neg.ll b/llvm/test/CodeGen/AArch64/zeroing-forms-abs-neg.ll new file mode 100644 index 0000000000000..1caee994220f0 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-abs-neg.ll @@ -0,0 +1,666 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mattr=+sve < %s | FileCheck %s +; RUN: llc -mattr=+sve2p2 < %s | FileCheck %s -check-prefix CHECK-2p2 + +; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s +; RUN: llc -mattr=+sme2p2 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2 + +target triple = "aarch64-linux" + +define @test_svabs_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svabs_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fabs z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fabs z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fabs.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svabs_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svabs_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fabs z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fabs z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fabs.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svabs_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svabs_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: fabs z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fabs z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fabs.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svabs_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svabs_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fabs z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fabs z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fabs.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svabs_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svabs_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fabs z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fabs z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fabs.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svabs_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svabs_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fabs z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fabs z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fabs.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svabs_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svabs_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fabs z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fabs z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fabs.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svabs_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svabs_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fabs z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fabs z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fabs.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svabs_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svabs_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: fabs z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fabs z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fabs.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svabs_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svabs_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: abs z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: abs z0.b, p0/z, z0.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.abs.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svabs_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svabs_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: abs z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: abs z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %1 = tail call @llvm.aarch64.sve.abs.nxv16i8( undef, %pg, %x) + ret %1 +} + +define @test_svabs_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svabs_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: abs z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: abs z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %1 = tail call @llvm.aarch64.sve.abs.nxv16i8( zeroinitializer, %pg, %x) + ret %1 +} + +define @test_svabs_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svabs_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: abs z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: abs z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.abs.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svabs_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svabs_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: abs z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: abs z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.abs.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svabs_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svabs_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: abs z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: abs z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.abs.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svabs_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svabs_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: abs z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: abs z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.abs.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svabs_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svabs_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: abs z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: abs z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.abs.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svabs_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svabs_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: abs z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: abs z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.abs.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svabs_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svabs_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: abs z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: abs z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.abs.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svabs_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svabs_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: abs z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: abs z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.abs.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svabs_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svabs_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: abs z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svabs_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: abs z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.abs.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svneg_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svneg_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fneg z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fneg z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fneg.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svneg_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svneg_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fneg z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fneg z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fneg.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svneg_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svneg_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: fneg z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fneg z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fneg.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svneg_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svneg_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fneg z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fneg z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fneg.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svneg_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svneg_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fneg z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fneg z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fneg.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svneg_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svneg_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fneg z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fneg z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fneg.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svneg_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svneg_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fneg z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fneg z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fneg.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svneg_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svneg_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fneg z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fneg z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fneg.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svneg_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svneg_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: fneg z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fneg z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fneg.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svneg_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svneg_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: neg z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: neg z0.b, p0/z, z0.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.neg.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svneg_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svneg_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: neg z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: neg z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %1 = tail call @llvm.aarch64.sve.neg.nxv16i8( undef, %pg, %x) + ret %1 +} + +define @test_svneg_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svneg_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: neg z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: neg z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %1 = tail call @llvm.aarch64.sve.neg.nxv16i8( zeroinitializer, %pg, %x) + ret %1 +} + +define @test_svneg_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svneg_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: neg z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: neg z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.neg.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svneg_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svneg_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: neg z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: neg z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.neg.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svneg_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svneg_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: neg z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: neg z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.neg.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svneg_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svneg_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: neg z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: neg z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.neg.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svneg_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svneg_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: neg z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: neg z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.neg.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svneg_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svneg_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: neg z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: neg z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.neg.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svneg_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svneg_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: neg z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: neg z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.neg.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svneg_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svneg_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: neg z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: neg z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.neg.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svneg_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svneg_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: neg z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svneg_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: neg z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.neg.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} diff --git a/llvm/test/CodeGen/AArch64/zeroing-forms-counts-not.ll b/llvm/test/CodeGen/AArch64/zeroing-forms-counts-not.ll new file mode 100644 index 0000000000000..efdf4bd6a5c64 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-counts-not.ll @@ -0,0 +1,1152 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mattr=+bf16,+sve < %s | FileCheck %s +; RUN: llc -mattr=+bf16,+sve2p2 < %s | FileCheck %s -check-prefix CHECK-2p2 + +; RUN: llc -mattr=+bf16,+sme -force-streaming < %s | FileCheck %s +; RUN: llc -mattr=+bf16,+sme2p2 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2 + +target triple = "aarch64-linux" + +define @test_svcls_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svcls_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cls z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcls_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cls z0.b, p0/z, z0.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cls.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svcls_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcls_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cls z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcls_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cls z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cls.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svcls_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcls_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: cls z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcls_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cls z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cls.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcls_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svcls_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cls z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcls_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cls z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cls.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svcls_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcls_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cls z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcls_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cls z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cls.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svcls_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcls_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: cls z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcls_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cls z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cls.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcls_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svcls_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cls z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcls_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cls z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cls.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svcls_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcls_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cls z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcls_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cls z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cls.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svcls_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcls_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: cls z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcls_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cls z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cls.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcls_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svcls_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cls z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcls_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cls z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cls.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svcls_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcls_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cls z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcls_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cls z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cls.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svcls_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcls_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: cls z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcls_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cls z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cls.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svclz_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svclz_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: clz z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svclz_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: clz z0.b, p0/z, z0.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.clz.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svclz_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svclz_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: clz z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svclz_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: clz z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.clz.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svclz_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svclz_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: clz z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svclz_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: clz z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.clz.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svclz_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svclz_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: clz z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svclz_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: clz z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.clz.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svclz_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svclz_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: clz z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svclz_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: clz z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.clz.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svclz_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svclz_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: clz z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svclz_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: clz z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.clz.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svclz_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svclz_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: clz z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svclz_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: clz z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.clz.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svclz_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svclz_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: clz z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svclz_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: clz z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.clz.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svclz_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svclz_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: clz z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svclz_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: clz z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.clz.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svclz_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svclz_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: clz z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svclz_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: clz z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.clz.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svclz_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svclz_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: clz z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svclz_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: clz z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.clz.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svclz_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svclz_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: clz z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svclz_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: clz z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.clz.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcnt_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svcnt_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cnt z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.b, p0/z, z0.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cnt z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: cnt z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcnt_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svcnt_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cnt z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cnt z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: cnt z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcnt_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svcnt_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cnt z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cnt z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: cnt z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcnt_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svcnt_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cnt z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cnt z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: cnt z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcnt_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svcnt_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cnt z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cnt z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: cnt z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcnt_bf16_x_1( %pg, %x) { +; CHECK-LABEL: test_svcnt_bf16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cnt z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_bf16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv8bf16( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_bf16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_bf16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cnt z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_bf16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv8bf16( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_bf16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_bf16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: cnt z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_bf16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv8bf16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcnt_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svcnt_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cnt z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cnt z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: cnt z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcnt_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svcnt_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cnt z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cnt z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svcnt_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnt_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: cnt z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnt_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnt z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnt.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcnot_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svcnot_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cnot z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnot_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnot z0.b, p0/z, z0.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnot.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svcnot_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnot_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cnot z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnot_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnot z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnot.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svcnot_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnot_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: cnot z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnot_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnot z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnot.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcnot_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svcnot_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cnot z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnot_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnot z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnot.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svcnot_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnot_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cnot z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnot_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnot z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnot.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svcnot_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnot_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: cnot z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnot_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnot z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnot.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcnot_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svcnot_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cnot z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnot_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnot z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnot.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svcnot_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnot_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cnot z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnot_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnot z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnot.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svcnot_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnot_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: cnot z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnot_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnot z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnot.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcnot_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svcnot_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: cnot z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnot_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnot z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnot.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svcnot_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnot_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: cnot z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnot_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnot z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnot.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svcnot_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcnot_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: cnot z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcnot_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: cnot z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.cnot.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svnot_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svnot_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: not z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svnot_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: not z0.b, p0/z, z0.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.not.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svnot_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svnot_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: not z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svnot_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: not z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.not.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svnot_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svnot_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: not z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svnot_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: not z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.not.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svnot_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svnot_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: not z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svnot_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: not z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.not.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svnot_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svnot_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: not z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svnot_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: not z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.not.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svnot_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svnot_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: not z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svnot_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: not z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.not.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svnot_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svnot_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: not z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svnot_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: not z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.not.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svnot_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svnot_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: not z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svnot_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: not z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.not.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svnot_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svnot_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: not z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svnot_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: not z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.not.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svnot_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svnot_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: not z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svnot_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: not z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.not.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svnot_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svnot_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: not z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svnot_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: not z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.not.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svnot_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svnot_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: not z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svnot_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: not z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.not.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svnot_u64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svnot_u64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: not z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svnot_u64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: not z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.not.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} diff --git a/llvm/test/CodeGen/AArch64/zeroing-forms-fcvt-bfcvt.ll b/llvm/test/CodeGen/AArch64/zeroing-forms-fcvt-bfcvt.ll new file mode 100644 index 0000000000000..2ba8c59abc49b --- /dev/null +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-fcvt-bfcvt.ll @@ -0,0 +1,192 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mattr=+sve,+bf16 < %s | FileCheck %s +; RUN: llc -mattr=+sve2p2,+bf16 < %s | FileCheck %s -check-prefix CHECK-2p2 + +; RUN: llc -mattr=+sme,+bf16 -force-streaming < %s | FileCheck %s +; RUN: llc -mattr=+sme2p2,+bf16 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2 + +target triple = "aarch64-linux" + +define @test_svcvt_f16_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svcvt_f16_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvt z0.h, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_f16_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvt.f16f32( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_f16_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_f16_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvt z0.h, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_f16_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvt.f16f32( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_f16_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_f16_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: fcvt z0.h, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_f16_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvt.f16f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcvt_bf16_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svcvt_bf16_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: bfcvt z0.h, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_bf16_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: bfcvt z0.h, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvt.bf16f32.v2( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_bf16_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_bf16_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: bfcvt z0.h, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_bf16_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: bfcvt z0.h, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvt.bf16f32.v2( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_bf16_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_bf16_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: bfcvt z0.h, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_bf16_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: bfcvt z0.h, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvt.bf16f32.v2( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcvt_f16_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svcvt_f16_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvt z0.h, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_f16_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvt.f16f64( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_f16_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_f16_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvt z0.h, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_f16_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvt.f16f64( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_f16_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_f16_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: fcvt z0.h, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_f16_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvt z0.h, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvt.f16f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcvt_f32_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svcvt_f32_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvt z0.s, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_f32_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvt z0.s, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvt.f32f64( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_f32_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_f32_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvt z0.s, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_f32_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvt z0.s, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvt.f32f64( undef, %pg, %x) + ret %0 +} + +define @test_svcvt_f32_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvt_f32_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fcvt z0.s, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvt_f32_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvt z0.s, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvt.f32f64( zeroinitializer, %pg, %x) + ret %0 +} diff --git a/llvm/test/CodeGen/AArch64/zeroing-forms-fcvtlt-fcvtx.ll b/llvm/test/CodeGen/AArch64/zeroing-forms-fcvtlt-fcvtx.ll new file mode 100644 index 0000000000000..d2a948ce60f4a --- /dev/null +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-fcvtlt-fcvtx.ll @@ -0,0 +1,147 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mattr=+sve2 < %s | FileCheck %s +; RUN: llc -mattr=+sve2p2 < %s | FileCheck %s -check-prefix CHECK-2p2 + +; RUN: llc -mattr=+sme2 -force-streaming < %s | FileCheck %s +; RUN: llc -mattr=+sme2p2 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2 + +target triple = "aarch64-linux" + +define @test_svcvtlt_f32_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svcvtlt_f32_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtlt z0.s, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvtlt_f32_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtlt z0.s, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtlt.f32f16( undef, %pg, %x) + ret %0 +} + +define @test_svcvtlt_f32_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvtlt_f32_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtlt z0.s, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvtlt_f32_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtlt z0.s, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtlt.f32f16( undef, %pg, %x) + ret %0 +} + +define @test_svcvtlt_f32_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvtlt_f32_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fcvtlt z0.s, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvtlt_f32_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtlt z0.s, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtlt.f32f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcvtlt_f64_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svcvtlt_f64_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtlt z0.d, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvtlt_f64_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtlt z0.d, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtlt.f64f32( undef, %pg, %x) + ret %0 +} + +define @test_svcvtlt_f64_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvtlt_f64_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtlt z0.d, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvtlt_f64_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtlt z0.d, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtlt.f64f32( undef, %pg, %x) + ret %0 +} + +define @test_svcvtlt_f64_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svcvtlt_f64_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: fcvtlt z0.d, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvtlt_f64_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtlt z0.d, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtlt.f64f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svcvtx_f32_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svcvtx_f32_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtx z0.s, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvtx_f32_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtx z0.s, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtx.f32f64( undef, %pg, %x) + ret %0 +} + +define @test_svcvtx_f32_f64_x_2( %pg, %x) { +; CHECK-LABEL: test_svcvtx_f32_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtx z0.s, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvtx_f32_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtx z0.s, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtx.f32f64( undef, %pg, %x) + ret %0 +} + +define @test_svcvtx_f32_f64_z( %pg, %x) { +; CHECK-LABEL: test_svcvtx_f32_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z1.s, #0 // =0x0 +; CHECK-NEXT: fcvtx z1.s, p0/m, z0.d +; CHECK-NEXT: mov z0.d, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svcvtx_f32_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtx z0.s, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtx.f32f64( zeroinitializer, %pg, %x) + ret %0 +} diff --git a/llvm/test/CodeGen/AArch64/zeroing-forms-fcvtzsu.ll b/llvm/test/CodeGen/AArch64/zeroing-forms-fcvtzsu.ll new file mode 100644 index 0000000000000..a0169394b8e9c --- /dev/null +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-fcvtzsu.ll @@ -0,0 +1,376 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mattr=+sve < %s | FileCheck %s +; RUN: llc -mattr=+sve2p2 < %s | FileCheck %s -check-prefix CHECK-2p2 + +; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s +; RUN: llc -mattr=+sme2p2 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2 + +target triple = "aarch64-linux" + +define @test_fcvtzs_s32_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzs_s32_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s32_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i32f64( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s32_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s32_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.s, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s32_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i32f64( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s32_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s32_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fcvtzs z0.s, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s32_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i32f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s64_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzs_s64_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s64_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i64f32( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s64_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s64_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.d, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s64_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i64f32( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s64_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s64_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: fcvtzs z0.d, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s64_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i64f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s32_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzs_s32_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s32_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i32f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s32_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s32_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.s, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s32_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i32f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s32_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s32_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fcvtzs z0.s, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s32_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.s, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i32f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s64_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzs_s64_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s64_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i64f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s64_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s64_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzs z0.d, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s64_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i64f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzs_s64_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzs_s64_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: fcvtzs z0.d, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzs_s64_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzs z0.d, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzs.i64f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u32_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzu_u32_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u32_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i32f64( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u32_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u32_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.s, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u32_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i32f64( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u32_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u32_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fcvtzu z0.s, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u32_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i32f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u64_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzu_u64_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u64_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i64f32( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u64_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u64_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.d, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u64_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i64f32( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u64_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u64_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: fcvtzu z0.d, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u64_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i64f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u32_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzu_u32_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u32_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i32f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u32_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u32_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.s, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u32_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i32f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u32_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u32_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fcvtzu z0.s, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u32_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.s, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i32f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u64_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_fcvtzu_u64_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u64_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i64f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u64_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u64_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fcvtzu z0.d, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u64_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i64f16( undef, %pg, %x) + ret %0 +} + +define @test_fcvtzu_u64_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_fcvtzu_u64_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: fcvtzu z0.d, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_fcvtzu_u64_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fcvtzu z0.d, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fcvtzu.i64f16( zeroinitializer, %pg, %x) + ret %0 +} diff --git a/llvm/test/CodeGen/AArch64/zeroing-forms-flogb.ll b/llvm/test/CodeGen/AArch64/zeroing-forms-flogb.ll new file mode 100644 index 0000000000000..8d799cd322421 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-flogb.ll @@ -0,0 +1,146 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mattr=+sve2 < %s | FileCheck %s +; RUN: llc -mattr=+sve2p2 < %s | FileCheck %s -check-prefix CHECK-2p2 + +; RUN: llc -mattr=+sme2 -force-streaming < %s | FileCheck %s +; RUN: llc -mattr=+sme2p2 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2 + +target triple = "aarch64-linux" + +define @test_svlogb_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svlogb_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: flogb z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svlogb_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: flogb z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.flogb.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svlogb_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svlogb_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: flogb z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svlogb_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: flogb z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.flogb.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svlogb_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svlogb_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: flogb z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svlogb_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: flogb z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.flogb.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svlogb_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svlogb_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: flogb z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svlogb_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: flogb z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.flogb.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svlogb_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svlogb_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: flogb z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svlogb_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: flogb z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.flogb.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svlogb_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svlogb_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: flogb z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svlogb_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: flogb z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.flogb.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svlogb_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svlogb_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: flogb z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svlogb_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: flogb z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.flogb.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svlogb_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svlogb_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: flogb z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svlogb_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: flogb z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.flogb.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svlogb_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svlogb_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: flogb z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svlogb_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: flogb z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.flogb.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} diff --git a/llvm/test/CodeGen/AArch64/zeroing-forms-frint-frecpx-fsqrt.ll b/llvm/test/CodeGen/AArch64/zeroing-forms-frint-frecpx-fsqrt.ll new file mode 100644 index 0000000000000..8de7f3db29674 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-frint-frecpx-fsqrt.ll @@ -0,0 +1,2550 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mattr=+sve < %s | FileCheck %s +; RUN: llc -mattr=+sve2p2 < %s | FileCheck %s -check-prefix CHECK-2p2 + +; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s +; RUN: llc -mattr=+sme2p2 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2 + +target triple = "aarch64-linux" + +define @test_svrinta_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrinta_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frinta z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrinta_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinta_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frinta z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrinta_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinta_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frinta z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrinta_4f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrinta_4f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frinta z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_4f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrinta_4f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinta_4f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frinta z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_4f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrinta_4f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinta_4f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frinta z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_4f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv4f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrinta_2f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrinta_2f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frinta z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_2f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrinta_2f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinta_2f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frinta z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_2f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrinta_2f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinta_2f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frinta z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_2f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv2f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrinta_2f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrinta_2f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frinta z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_2f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrinta_2f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinta_2f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frinta z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_2f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrinta_2f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinta_2f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frinta z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_2f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv2f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrinta_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrinta_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frinta z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrinta_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinta_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frinta z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrinta_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinta_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frinta z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrinta_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrinta_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frinta z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrinta_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinta_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frinta z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrinta_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinta_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: frinta z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinta_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinta z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinta.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrinti_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrinti_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frinti z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrinti_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinti_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frinti z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrinti_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinti_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frinti z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrinti_4f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrinti_4f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frinti z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_4f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrinti_4f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinti_4f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frinti z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_4f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrinti_4f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinti_4f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frinti z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_4f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv4f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrinti_2f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrinti_2f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frinti z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_2f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrinti_2f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinti_2f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frinti z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_2f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrinti_2f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinti_2f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frinti z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_2f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv2f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrinti_2f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrinti_2f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frinti z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_2f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrinti_2f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinti_2f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frinti z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_2f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrinti_2f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinti_2f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frinti z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_2f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv2f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrinti_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrinti_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frinti z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrinti_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinti_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frinti z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrinti_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinti_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frinti z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrinti_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrinti_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frinti z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrinti_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinti_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frinti z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv2f64( undef, %pg, %x) + ret %0 +} + + +define @test_svrinti_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrinti_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: frinti z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrinti_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frinti z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frinti.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} + + +define @test_svrintm_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintm_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintm z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintm_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintm_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintm z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv8f16( undef, %pg, %x) + ret %0 +} + + +define @test_svrintm_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintm_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintm z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintm_4f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintm_4f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintm z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_4f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintm_4f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintm_4f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintm z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_4f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintm_4f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintm_4f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintm z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_4f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv4f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintm_2f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintm_2f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintm z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_2f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintm_2f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintm_2f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintm z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_2f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintm_2f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintm_2f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintm z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_2f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv2f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintm_2f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintm_2f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintm z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_2f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintm_2f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintm_2f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintm z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_2f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintm_2f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintm_2f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frintm z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_2f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv2f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintm_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintm_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintm z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintm_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintm_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintm z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintm_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintm_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frintm z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintm_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintm_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintm z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrintm_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintm_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintm z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrintm_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintm_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: frintm z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintm_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintm z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintm.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintn_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintn_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintn z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintn_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintn_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintn z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintn_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintn_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintn z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintn_4f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintn_4f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintn z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_4f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintn_4f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintn_4f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintn z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_4f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintn_4f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintn_4f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintn z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_4f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv4f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintn_2f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintn_2f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintn z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_2f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintn_2f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintn_2f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintn z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_2f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintn_2f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintn_2f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintn z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_2f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv2f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintn_2f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintn_2f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintn z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_2f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintn_2f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintn_2f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintn z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_2f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintn_2f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintn_2f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frintn z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_2f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv2f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintn_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintn_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintn z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintn_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintn_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintn z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintn_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintn_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frintn z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintn_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintn_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintn z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrintn_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintn_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintn z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrintn_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintn_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: frintn z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintn_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintn z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintn.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintp_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintp_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintp z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintp_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintp_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintp z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintp_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintp_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintp z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintp_4f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintp_4f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintp z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_4f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintp_4f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintp_4f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintp z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_4f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintp_4f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintp_4f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintp z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_4f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv4f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintp_2f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintp_2f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintp z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_2f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintp_2f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintp_2f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintp z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_2f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintp_2f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintp_2f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintp z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_2f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv2f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintp_2f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintp_2f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintp z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_2f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintp_2f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintp_2f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintp z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_2f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintp_2f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintp_2f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frintp z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_2f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv2f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintp_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintp_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintp z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintp_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintp_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintp z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintp_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintp_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frintp z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintp_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintp_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintp z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrintp_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintp_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintp z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv2f64( undef, %pg, %x) + ret %0 +} + + +define @test_svrintp_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintp_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: frintp z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintp_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintp z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintp.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintx_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintx_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintx z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintx_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintx_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintx z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintx_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintx_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintx z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintx_4f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintx_4f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintx z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_4f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintx_4f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintx_4f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintx z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_4f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintx_4f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintx_4f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintx z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_4f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv4f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintx_2f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintx_2f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintx z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_2f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintx_2f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintx_2f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintx z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_2f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintx_2f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintx_2f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintx z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_2f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv2f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintx_2f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintx_2f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintx z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_2f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintx_2f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintx_2f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintx z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_2f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintx_2f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintx_2f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frintx z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_2f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv2f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintx_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintx_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintx z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintx_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintx_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintx z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintx_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintx_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frintx z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintx_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintx_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintx z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrintx_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintx_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintx z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrintx_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintx_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: frintx z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintx_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintx z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintx.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintz_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintz_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintz z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintz_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintz_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintz z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintz_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintz_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintz z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintz_4f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintz_4f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintz z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_4f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintz_4f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintz_4f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintz z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_4f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintz_4f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintz_4f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintz z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_4f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv4f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintz_2f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintz_2f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintz z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_2f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintz_2f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintz_2f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintz z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_2f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrintz_2f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintz_2f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frintz z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_2f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv2f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintz_2f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintz_2f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintz z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_2f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintz_2f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintz_2f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintz z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_2f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintz_2f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintz_2f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frintz z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_2f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv2f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintz_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintz_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintz z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintz_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintz_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintz z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrintz_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintz_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frintz z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrintz_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrintz_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frintz z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrintz_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintz_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frintz z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrintz_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrintz_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: frintz z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrintz_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frintz z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frintz.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrecpx_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrecpx_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frecpx z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrecpx_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpx_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frecpx z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrecpx_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpx_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frecpx z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrecpx_4f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrecpx_4f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frecpx z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_4f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrecpx_4f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpx_4f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frecpx z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_4f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svrecpx_4f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpx_4f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frecpx z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_4f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv4f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrecpx_2f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrecpx_2f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frecpx z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_2f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrecpx_2f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpx_2f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frecpx z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_2f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svrecpx_2f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpx_2f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: frecpx z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_2f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv2f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrecpx_2f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrecpx_2f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frecpx z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_2f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrecpx_2f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpx_2f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frecpx z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_2f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svrecpx_2f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpx_2f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frecpx z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_2f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv2f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrecpx_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrecpx_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frecpx z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrecpx_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpx_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frecpx z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrecpx_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpx_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: frecpx z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrecpx_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrecpx_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: frecpx z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrecpx_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpx_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: frecpx z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrecpx_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpx_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: frecpx z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpx_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: frecpx z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.frecpx.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svsqrt_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svsqrt_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fsqrt z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svsqrt_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svsqrt_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fsqrt z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svsqrt_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svsqrt_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: fsqrt z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svsqrt_4f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svsqrt_4f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fsqrt z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_4f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svsqrt_4f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svsqrt_4f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fsqrt z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_4f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv4f16( undef, %pg, %x) + ret %0 +} + +define @test_svsqrt_4f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svsqrt_4f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: fsqrt z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_4f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv4f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svsqrt_2f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svsqrt_2f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fsqrt z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_2f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svsqrt_2f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svsqrt_2f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fsqrt z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_2f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv2f16( undef, %pg, %x) + ret %0 +} + +define @test_svsqrt_2f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svsqrt_2f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: fsqrt z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_2f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv2f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svsqrt_2f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svsqrt_2f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fsqrt z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_2f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svsqrt_2f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svsqrt_2f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fsqrt z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_2f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv2f32( undef, %pg, %x) + ret %0 +} + +define @test_svsqrt_2f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svsqrt_2f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fsqrt z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_2f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv2f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svsqrt_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svsqrt_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fsqrt z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svsqrt_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svsqrt_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fsqrt z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svsqrt_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svsqrt_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: fsqrt z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svsqrt_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svsqrt_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: fsqrt z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svsqrt_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svsqrt_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: fsqrt z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svsqrt_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svsqrt_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: fsqrt z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svsqrt_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: fsqrt z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.fsqrt.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} diff --git a/llvm/test/CodeGen/AArch64/zeroing-forms-rev.ll b/llvm/test/CodeGen/AArch64/zeroing-forms-rev.ll new file mode 100644 index 0000000000000..b7c2b1fcd9984 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-rev.ll @@ -0,0 +1,1480 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mattr=+sve2p1 < %s | FileCheck %s +; RUN: llc -mattr=+sve2p2 < %s | FileCheck %s -check-prefix CHECK-2p2 + +; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s +; RUN: llc -mattr=+sme2p2 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2 + +target triple = "aarch64-linux" + +define @test_svrbit_u8_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_u8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.b, p0/z, z0.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: rbit z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrbit_u16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_u16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: rbit z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrbit_u32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_u32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: rbit z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrbit_u64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_u64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_u64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_u64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: rbit z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_u64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrbit_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.b, p0/z, z0.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: rbit z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrbit_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: rbit z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrbit_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: rbit z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrbit_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrbit_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: rbit z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrbit_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrbit_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: rbit z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrbit_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: rbit z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.rbit.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevb_u16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevb_u16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_u16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_u16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_u16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_u16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: revb z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevb_u32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevb_u32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_u32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_u32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_u32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_u32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: revb z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevb_u64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevb_u64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_u64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_u64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_u64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_u64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: revb z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_u64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevb_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevb_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: revb z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevb_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevb_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: revb z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevb_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevb_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revb z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevb_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevb_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: revb z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevb_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revb z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revb.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevh_u32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevh_u32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_u32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrevh_u32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_u32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_u32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrevh_u32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_u32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: revh z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_u32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevh_u64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevh_u64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_u64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevh_u64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_u64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_u64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevh_u64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_u64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: revh z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_u64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevh_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevh_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrevh_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrevh_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: revh z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevh_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevh_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevh_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revh z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevh_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevh_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: revh z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevh_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revh z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revh.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevw_u64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevw_u64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revw z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevw_u64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revw z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revw.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevw_u64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevw_u64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revw z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevw_u64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revw z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revw.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevw_u64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevw_u64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: revw z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevw_u64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revw z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revw.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevw_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevw_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revw z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevw_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revw z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revw.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevw_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevw_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revw z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevw_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revw z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revw.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevw_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevw_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: revw z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevw_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revw z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revw.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_u8_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_u8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_u16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_u16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_u32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_u32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_u64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_u64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_u64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_u64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_u64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_f16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_f16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_f16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_f16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8f16( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_f16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_f16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8f16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_bf16_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_bf16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_bf16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8bf16( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_bf16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_bf16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_bf16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8bf16( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_bf16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_bf16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_bf16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv8bf16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_f32_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_f32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_f32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_f32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4f32( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_f32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_f32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv4f32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrevd_f64_x_1( %pg, %x) { +; CHECK-LABEL: test_svrevd_f64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z0.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z0.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_f64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_f64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2f64( undef, %pg, %x) + ret %0 +} + +define @test_svrevd_f64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrevd_f64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: revd z0.q, p0/m, z1.q +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrevd_f64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: revd z0.q, p0/z, z1.q +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.revd.nxv2f64( zeroinitializer, %pg, %x) + ret %0 +} diff --git a/llvm/test/CodeGen/AArch64/zeroing-forms-urecpe-ursqrte-sqabs-sqneg.ll b/llvm/test/CodeGen/AArch64/zeroing-forms-urecpe-ursqrte-sqabs-sqneg.ll new file mode 100644 index 0000000000000..3b072f71e30c5 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-urecpe-ursqrte-sqabs-sqneg.ll @@ -0,0 +1,478 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mattr=+sve2 < %s | FileCheck %s +; RUN: llc -mattr=+sve2p2 < %s | FileCheck %s -check-prefix CHECK-2p2 + +; RUN: llc -mattr=+sme --force-streaming < %s | FileCheck %s +; RUN: llc -mattr=+sme2p2 --force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2 + +target triple = "aarch64-linux" + +define @test_svrecpe_x_1( %pg, %x) { +; CHECK-LABEL: test_svrecpe_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: urecpe z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpe_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: urecpe z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.urecpe.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrecpe_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpe_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: urecpe z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpe_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: urecpe z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.urecpe.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrecpe_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrecpe_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: urecpe z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrecpe_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: urecpe z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.urecpe.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svrsqrte_x_1( %pg, %x) { +; CHECK-LABEL: test_svrsqrte_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ursqrte z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrsqrte_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ursqrte z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ursqrte.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrsqrte_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrsqrte_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: ursqrte z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrsqrte_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ursqrte z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ursqrte.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svrsqrte_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svrsqrte_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: ursqrte z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svrsqrte_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ursqrte z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ursqrte.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqabs_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svqabs_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqabs z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.b, p0/z, z0.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svqabs_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqabs z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svqabs_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: sqabs z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqabs_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svqabs_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqabs z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svqabs_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqabs z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svqabs_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: sqabs z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqabs_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svqabs_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqabs z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svqabs_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqabs z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svqabs_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: sqabs z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqabs_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svqabs_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqabs z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svqabs_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqabs z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svqabs_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqabs_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: sqabs z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqabs_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqabs z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqabs.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqneg_s8_x_1( %pg, %x) { +; CHECK-LABEL: test_svqneg_s8_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqneg z0.b, p0/m, z0.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s8_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.b, p0/z, z0.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svqneg_s8_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s8_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqneg z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s8_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv16i8( undef, %pg, %x) + ret %0 +} + +define @test_svqneg_s8_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s8_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.b, #0 // =0x0 +; CHECK-NEXT: sqneg z0.b, p0/m, z1.b +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s8_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.b, p0/z, z1.b +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv16i8( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqneg_s16_x_1( %pg, %x) { +; CHECK-LABEL: test_svqneg_s16_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqneg z0.h, p0/m, z0.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s16_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.h, p0/z, z0.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svqneg_s16_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s16_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqneg z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s16_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv8i16( undef, %pg, %x) + ret %0 +} + +define @test_svqneg_s16_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s16_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: sqneg z0.h, p0/m, z1.h +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s16_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.h, p0/z, z1.h +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv8i16( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqneg_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_svqneg_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqneg z0.s, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.s, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svqneg_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqneg z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv4i32( undef, %pg, %x) + ret %0 +} + +define @test_svqneg_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: sqneg z0.s, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.s, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv4i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_svqneg_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_svqneg_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: sqneg z0.d, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.d, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svqneg_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: movprfx z0, z1 +; CHECK-NEXT: sqneg z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv2i64( undef, %pg, %x) + ret %0 +} + +define @test_svqneg_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_svqneg_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: sqneg z0.d, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_svqneg_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: sqneg z0.d, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.sqneg.nxv2i64( zeroinitializer, %pg, %x) + ret %0 +} diff --git a/llvm/test/CodeGen/AArch64/zeroing-forms-uscvtf.ll b/llvm/test/CodeGen/AArch64/zeroing-forms-uscvtf.ll new file mode 100644 index 0000000000000..e9a8cc06323ae --- /dev/null +++ b/llvm/test/CodeGen/AArch64/zeroing-forms-uscvtf.ll @@ -0,0 +1,376 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc -mattr=+sve < %s | FileCheck %s +; RUN: llc -mattr=+sve2p2 < %s | FileCheck %s -check-prefix CHECK-2p2 + +; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s +; RUN: llc -mattr=+sme2p2 -force-streaming < %s | FileCheck %s -check-prefix CHECK-2p2 + +target triple = "aarch64-linux" + +define @test_scvtf_f32_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_scvtf_f32_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: scvtf z0.s, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_scvtf_f32_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: scvtf z0.s, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.scvtf.f32i64( undef, %pg, %x) + ret %0 +} + +define @test_scvtf_f32_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_scvtf_f32_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: scvtf z0.s, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_scvtf_f32_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: scvtf z0.s, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.scvtf.f32i64( undef, %pg, %x) + ret %0 +} + +define @test_scvtf_f32_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_scvtf_f32_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: scvtf z0.s, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_scvtf_f32_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: scvtf z0.s, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.scvtf.f32i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_scvtf_f64_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_scvtf_f64_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: scvtf z0.d, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_scvtf_f64_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: scvtf z0.d, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.scvtf.f64i32( undef, %pg, %x) + ret %0 +} + +define @test_scvtf_f64_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_scvtf_f64_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: scvtf z0.d, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_scvtf_f64_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: scvtf z0.d, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.scvtf.f64i32( undef, %pg, %x) + ret %0 +} + +define @test_scvtf_f64_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_scvtf_f64_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: scvtf z0.d, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_scvtf_f64_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: scvtf z0.d, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.scvtf.f64i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_scvtf_f16_s32_x_1( %pg, %x) { +; CHECK-LABEL: test_scvtf_f16_s32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: scvtf z0.h, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_scvtf_f16_s32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: scvtf z0.h, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.scvtf.f16i32( undef, %pg, %x) + ret %0 +} + +define @test_scvtf_f16_s32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_scvtf_f16_s32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: scvtf z0.h, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_scvtf_f16_s32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: scvtf z0.h, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.scvtf.f16i32( undef, %pg, %x) + ret %0 +} + +define @test_scvtf_f16_s32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_scvtf_f16_s32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: scvtf z0.h, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_scvtf_f16_s32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: scvtf z0.h, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.scvtf.f16i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_scvtf_f16_s64_x_1( %pg, %x) { +; CHECK-LABEL: test_scvtf_f16_s64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: scvtf z0.h, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_scvtf_f16_s64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: scvtf z0.h, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.scvtf.f16i64( undef, %pg, %x) + ret %0 +} + +define @test_scvtf_f16_s64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_scvtf_f16_s64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: scvtf z0.h, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_scvtf_f16_s64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: scvtf z0.h, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.scvtf.f16i64( undef, %pg, %x) + ret %0 +} + +define @test_scvtf_f16_s64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_scvtf_f16_s64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: scvtf z0.h, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_scvtf_f16_s64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: scvtf z0.h, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.scvtf.f16i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_ucvtf_f32_u64_x_1( %pg, %x) { +; CHECK-LABEL: test_ucvtf_f32_u64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ucvtf z0.s, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_ucvtf_f32_u64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ucvtf z0.s, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ucvtf.f32i64( undef, %pg, %x) + ret %0 +} + +define @test_ucvtf_f32_u64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_ucvtf_f32_u64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ucvtf z0.s, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_ucvtf_f32_u64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ucvtf z0.s, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ucvtf.f32i64( undef, %pg, %x) + ret %0 +} + +define @test_ucvtf_f32_u64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_ucvtf_f32_u64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.s, #0 // =0x0 +; CHECK-NEXT: ucvtf z0.s, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_ucvtf_f32_u64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ucvtf z0.s, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ucvtf.f32i64( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_ucvtf_f64_u32_x_1( %pg, %x) { +; CHECK-LABEL: test_ucvtf_f64_u32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ucvtf z0.d, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_ucvtf_f64_u32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ucvtf z0.d, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ucvtf.f64i32( undef, %pg, %x) + ret %0 +} + +define @test_ucvtf_f64_u32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_ucvtf_f64_u32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ucvtf z0.d, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_ucvtf_f64_u32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ucvtf z0.d, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ucvtf.f64i32( undef, %pg, %x) + ret %0 +} + +define @test_ucvtf_f64_u32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_ucvtf_f64_u32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.d, #0 // =0x0 +; CHECK-NEXT: ucvtf z0.d, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_ucvtf_f64_u32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ucvtf z0.d, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ucvtf.f64i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_ucvtf_f16_u32_x_1( %pg, %x) { +; CHECK-LABEL: test_ucvtf_f16_u32_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_ucvtf_f16_u32_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ucvtf z0.h, p0/z, z0.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ucvtf.f16i32( undef, %pg, %x) + ret %0 +} + +define @test_ucvtf_f16_u32_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_ucvtf_f16_u32_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ucvtf z0.h, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_ucvtf_f16_u32_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ucvtf z0.h, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ucvtf.f16i32( undef, %pg, %x) + ret %0 +} + +define @test_ucvtf_f16_u32_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_ucvtf_f16_u32_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: ucvtf z0.h, p0/m, z1.s +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_ucvtf_f16_u32_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ucvtf z0.h, p0/z, z1.s +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ucvtf.f16i32( zeroinitializer, %pg, %x) + ret %0 +} + +define @test_ucvtf_f16_u64_x_1( %pg, %x) { +; CHECK-LABEL: test_ucvtf_f16_u64_x_1: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ucvtf z0.h, p0/m, z0.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_ucvtf_f16_u64_x_1: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ucvtf z0.h, p0/z, z0.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ucvtf.f16i64( undef, %pg, %x) + ret %0 +} + +define @test_ucvtf_f16_u64_x_2( %pg, double %z0, %x) { +; CHECK-LABEL: test_ucvtf_f16_u64_x_2: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ucvtf z0.h, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_ucvtf_f16_u64_x_2: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ucvtf z0.h, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ucvtf.f16i64( undef, %pg, %x) + ret %0 +} + +define @test_ucvtf_f16_u64_z( %pg, double %z0, %x) { +; CHECK-LABEL: test_ucvtf_f16_u64_z: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov z0.h, #0 // =0x0 +; CHECK-NEXT: ucvtf z0.h, p0/m, z1.d +; CHECK-NEXT: ret +; +; CHECK-2p2-LABEL: test_ucvtf_f16_u64_z: +; CHECK-2p2: // %bb.0: // %entry +; CHECK-2p2-NEXT: ucvtf z0.h, p0/z, z1.d +; CHECK-2p2-NEXT: ret +entry: + %0 = tail call @llvm.aarch64.sve.ucvtf.f16i64( zeroinitializer, %pg, %x) + ret %0 +}