diff --git a/clang/include/clang/Basic/arm_mve.td b/clang/include/clang/Basic/arm_mve.td --- a/clang/include/clang/Basic/arm_mve.td +++ b/clang/include/clang/Basic/arm_mve.td @@ -212,20 +212,17 @@ (Scalar (IRInt<"maxv", [Vector], 1> $prev, $vec))>; } -foreach half = [ "b", "t" ] in -foreach halfconst = [ !if(!eq(half, "b"), 0, 1) ] in { - -let params = [f32], pnt = PNT_None in { - -def vcvt#half#q_f16: Intrinsic< - VecOf, (args VecOf:$inactive, Vector:$a), - (IRInt<"vcvt_narrow"> $inactive, $a, halfconst)>; -def vcvt#half#q_m_f16: Intrinsic< - VecOf, (args VecOf:$inactive, Vector:$a, PredOf:$pred), - (IRInt<"vcvt_narrow_predicated"> $inactive, $a, halfconst, $pred)>; - -} // params = [f32], pnt = PNT_None - +foreach half = [ "b", "t" ] in { + defvar halfconst = !if(!eq(half, "b"), 0, 1); + + let params = [f32], pnt = PNT_None in { + def vcvt#half#q_f16: Intrinsic< + VecOf, (args VecOf:$inactive, Vector:$a), + (IRInt<"vcvt_narrow"> $inactive, $a, halfconst)>; + def vcvt#half#q_m_f16: Intrinsic< + VecOf, (args VecOf:$inactive, Vector:$a, PredOf:$pred), + (IRInt<"vcvt_narrow_predicated"> $inactive, $a, halfconst, $pred)>; + } // params = [f32], pnt = PNT_None } // loop over half = "b", "t" multiclass compare_with_pred { - foreach intparams = [!if(!eq(!cast(outtype), !cast(Vector)), - [Vector], [outtype, Vector])] in { - def q_n: Intrinsic< - outtype, (args outtype:$a, Vector:$b, imm:$sh), - !con((IRInt $a, $b, $sh), extraargs)>; - - def q_m_n: Intrinsic< - outtype, (args outtype:$a, Vector:$b, imm:$sh, Predicate:$pred), - !con((IRInt - $a, $b, $sh), extraargs, (? $pred))>; - } + defvar intparams = !if(!eq(!cast(outtype), !cast(Vector)), + [Vector], [outtype, Vector]); + + def q_n: Intrinsic< + outtype, (args outtype:$a, Vector:$b, imm:$sh), + !con((IRInt $a, $b, $sh), extraargs)>; + + def q_m_n: Intrinsic< + outtype, (args outtype:$a, Vector:$b, imm:$sh, Predicate:$pred), + !con((IRInt + $a, $b, $sh), extraargs, (? $pred))>; } multiclass VSHRN { @@ -672,12 +669,11 @@ } let params = [s16, s32, u16, u32], pnt = PNT_NType in { - foreach U = [(unsignedflag Scalar)] in { - defm vshrn : VSHRN; - defm vqshrn : VSHRN; - defm vrshrn : VSHRN; - defm vqrshrn : VSHRN; - } + defvar U = (unsignedflag Scalar); + defm vshrn : VSHRN; + defm vqshrn : VSHRN; + defm vrshrn : VSHRN; + defm vqrshrn : VSHRN; } let params = [s16, s32], pnt = PNT_NType in { defm vqshrun : VSHRN; diff --git a/llvm/lib/Target/ARM/ARMInstrMVE.td b/llvm/lib/Target/ARM/ARMInstrMVE.td --- a/llvm/lib/Target/ARM/ARMInstrMVE.td +++ b/llvm/lib/Target/ARM/ARMInstrMVE.td @@ -594,25 +594,24 @@ multiclass MVE_VABAV_m { def "" : MVE_VABAV; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in { def : Pat<(i32 (int_arm_mve_vabav - (i32 VTI.Unsigned), - (i32 rGPR:$Rda_src), - (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm))), - (i32 (!cast(NAME) - (i32 rGPR:$Rda_src), - (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm)))>; + (i32 VTI.Unsigned), + (i32 rGPR:$Rda_src), + (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm))), + (i32 (Inst (i32 rGPR:$Rda_src), + (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm)))>; def : Pat<(i32 (int_arm_mve_vabav_predicated - (i32 VTI.Unsigned), - (i32 rGPR:$Rda_src), - (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), - (VTI.Pred VCCR:$mask))), - (i32 (!cast(NAME) - (i32 rGPR:$Rda_src), - (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), - ARMVCCThen, (VTI.Pred VCCR:$mask)))>; + (i32 VTI.Unsigned), + (i32 rGPR:$Rda_src), + (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), + (VTI.Pred VCCR:$mask))), + (i32 (Inst (i32 rGPR:$Rda_src), + (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), + ARMVCCThen, (VTI.Pred VCCR:$mask)))>; } } @@ -769,11 +768,11 @@ MVEVectorVTInfo VTI, Intrinsic intr> { def "": MVE_VMINMAXV; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in def _pat : Pat<(i32 (intr (i32 rGPR:$prev), (VTI.Vec MQPR:$vec))), - (i32 (!cast(NAME) - (i32 rGPR:$prev), (VTI.Vec MQPR:$vec)))>; + (i32 (Inst (i32 rGPR:$prev), (VTI.Vec MQPR:$vec)))>; } multiclass MVE_VMINMAXV_ty { def "" : MVE_VMINMAX; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in { // Unpredicated min/max def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; // Predicated min/max def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 VTI.Unsigned), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -1633,20 +1631,19 @@ multiclass MVE_VMUL_m { def "" : MVE_VMULt1; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in { // Unpredicated multiply def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; // Predicated multiply def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -1673,20 +1670,19 @@ SDNode unpred_op, Intrinsic pred_int, bit rounding> { def "" : MVE_VQxDMULH_Base; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in { // Unpredicated multiply def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; // Predicated multiply def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -1721,20 +1717,19 @@ multiclass MVE_VADDSUB_m { def "" : MVE_VADDSUB; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in { // Unpredicated add/subtract def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; // Predicated add/subtract def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -1774,21 +1769,20 @@ multiclass MVE_VQADD_m { def "" : MVE_VQADD_; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in { // Unpredicated saturating add def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; // Predicated saturating add def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 VTI.Unsigned), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -1805,21 +1799,20 @@ multiclass MVE_VQSUB_m { def "" : MVE_VQSUB_; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in { // Unpredicated saturating subtract def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; // Predicated saturating subtract def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 VTI.Unsigned), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -1849,22 +1842,21 @@ multiclass MVE_VABD_m { def "" : MVE_VABD_int; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in { // Unpredicated absolute difference def : Pat<(VTI.Vec (unpred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 VTI.Unsigned))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; // Predicated absolute difference def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 VTI.Unsigned), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -1893,22 +1885,21 @@ multiclass MVE_VRHADD_m { def "" : MVE_VRHADD_Base; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in { // Unpredicated rounding add-with-divide-by-two def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 VTI.Unsigned))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; // Predicated add-with-divide-by-two def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 VTI.Unsigned), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -1947,20 +1938,19 @@ multiclass MVE_VHADD_m { def "" : MVE_VHADD_; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in { // Unpredicated add-and-divide-by-two def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 VTI.Unsigned))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; // Predicated add-and-divide-by-two def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 VTI.Unsigned), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -1977,22 +1967,21 @@ multiclass MVE_VHSUB_m { def "" : MVE_VHSUB_; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in { // Unpredicated subtract-and-divide-by-two def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 VTI.Unsigned))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; // Predicated subtract-and-divide-by-two def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 VTI.Unsigned), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -2467,38 +2456,34 @@ defm MVE_VSHLL_lwu16 : MVE_VSHLL_lw<"vshll", "u16", 0b01, 0b1, "$Qd, $Qm, #16">; multiclass MVE_VSHLL_patterns { - // A succession of local variable definitions, via singleton - // foreach, to make the actual patterns legible - foreach suffix = [!strconcat(VTI.Suffix, !if(top, "th", "bh"))] in - foreach inst_imm = [!cast("MVE_VSHLL_imm" # suffix)] in - foreach inst_lw = [!cast("MVE_VSHLL_lw" # suffix)] in - foreach unpred_int = [int_arm_mve_vshll_imm] in - foreach pred_int = [int_arm_mve_vshll_imm_predicated] in - foreach imm = [inst_imm.immediateType] in { - - def : Pat<(VTI.DblVec (unpred_int (VTI.Vec MQPR:$src), imm:$imm, - (i32 VTI.Unsigned), (i32 top))), - (VTI.DblVec (inst_imm (VTI.Vec MQPR:$src), imm:$imm))>; - def : Pat<(VTI.DblVec (unpred_int (VTI.Vec MQPR:$src), (i32 VTI.LaneBits), - (i32 VTI.Unsigned), (i32 top))), - (VTI.DblVec (inst_lw (VTI.Vec MQPR:$src)))>; - - def : Pat<(VTI.DblVec (pred_int (VTI.Vec MQPR:$src), imm:$imm, - (i32 VTI.Unsigned), (i32 top), - (VTI.Pred VCCR:$mask), - (VTI.DblVec MQPR:$inactive))), - (VTI.DblVec (inst_imm (VTI.Vec MQPR:$src), imm:$imm, - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.DblVec MQPR:$inactive)))>; - def : Pat<(VTI.DblVec (pred_int (VTI.Vec MQPR:$src), (i32 VTI.LaneBits), - (i32 VTI.Unsigned), (i32 top), - (VTI.Pred VCCR:$mask), - (VTI.DblVec MQPR:$inactive))), - (VTI.DblVec (inst_lw (VTI.Vec MQPR:$src), ARMVCCThen, - (VTI.Pred VCCR:$mask), - (VTI.DblVec MQPR:$inactive)))>; - - } + defvar suffix = !strconcat(VTI.Suffix, !if(top, "th", "bh")); + defvar inst_imm = !cast("MVE_VSHLL_imm" # suffix); + defvar inst_lw = !cast("MVE_VSHLL_lw" # suffix); + defvar unpred_int = int_arm_mve_vshll_imm; + defvar pred_int = int_arm_mve_vshll_imm_predicated; + defvar imm = inst_imm.immediateType; + + def : Pat<(VTI.DblVec (unpred_int (VTI.Vec MQPR:$src), imm:$imm, + (i32 VTI.Unsigned), (i32 top))), + (VTI.DblVec (inst_imm (VTI.Vec MQPR:$src), imm:$imm))>; + def : Pat<(VTI.DblVec (unpred_int (VTI.Vec MQPR:$src), (i32 VTI.LaneBits), + (i32 VTI.Unsigned), (i32 top))), + (VTI.DblVec (inst_lw (VTI.Vec MQPR:$src)))>; + + def : Pat<(VTI.DblVec (pred_int (VTI.Vec MQPR:$src), imm:$imm, + (i32 VTI.Unsigned), (i32 top), + (VTI.Pred VCCR:$mask), + (VTI.DblVec MQPR:$inactive))), + (VTI.DblVec (inst_imm (VTI.Vec MQPR:$src), imm:$imm, + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.DblVec MQPR:$inactive)))>; + def : Pat<(VTI.DblVec (pred_int (VTI.Vec MQPR:$src), (i32 VTI.LaneBits), + (i32 VTI.Unsigned), (i32 top), + (VTI.Pred VCCR:$mask), + (VTI.DblVec MQPR:$inactive))), + (VTI.DblVec (inst_lw (VTI.Vec MQPR:$src), ARMVCCThen, + (VTI.Pred VCCR:$mask), + (VTI.DblVec MQPR:$inactive)))>; } foreach VTI = [MVE_v16s8, MVE_v8s16, MVE_v16u8, MVE_v8u16] in @@ -2642,18 +2627,17 @@ multiclass MVE_VSHRN_patterns { - foreach inparams = [(? (OutVTI.Vec MQPR:$QdSrc), (InVTI.Vec MQPR:$Qm), - (inst.immediateType:$imm), (i32 q), (i32 r), - (i32 OutVTI.Unsigned), (i32 InVTI.Unsigned), - (i32 top))] in - foreach outparams = [(inst (OutVTI.Vec MQPR:$QdSrc), (InVTI.Vec MQPR:$Qm), - (imm:$imm))] in { - def : Pat<(OutVTI.Vec !setop(inparams, int_arm_mve_vshrn)), - (OutVTI.Vec outparams)>; - def : Pat<(OutVTI.Vec !con(inparams, (int_arm_mve_vshrn_predicated - (InVTI.Pred VCCR:$pred)))), - (OutVTI.Vec !con(outparams, (? ARMVCCThen, VCCR:$pred)))>; - } + defvar inparams = (? (OutVTI.Vec MQPR:$QdSrc), (InVTI.Vec MQPR:$Qm), + (inst.immediateType:$imm), (i32 q), (i32 r), + (i32 OutVTI.Unsigned), (i32 InVTI.Unsigned), (i32 top)); + defvar outparams = (inst (OutVTI.Vec MQPR:$QdSrc), (InVTI.Vec MQPR:$Qm), + (imm:$imm)); + + def : Pat<(OutVTI.Vec !setop(inparams, int_arm_mve_vshrn)), + (OutVTI.Vec outparams)>; + def : Pat<(OutVTI.Vec !con(inparams, (int_arm_mve_vshrn_predicated + (InVTI.Pred VCCR:$pred)))), + (OutVTI.Vec !con(outparams, (? ARMVCCThen, VCCR:$pred)))>; } defm : MVE_VSHRN_patterns; @@ -2731,21 +2715,20 @@ multiclass MVE_shift_by_vec_p { def "" : MVE_shift_by_vec; + defvar Inst = !cast(NAME); def : Pat<(VTI.Vec (int_arm_mve_vshl_vector (VTI.Vec MQPR:$in), (VTI.Vec MQPR:$sh), (i32 q), (i32 r), (i32 VTI.Unsigned))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$in), (VTI.Vec MQPR:$sh)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$in), (VTI.Vec MQPR:$sh)))>; def : Pat<(VTI.Vec (int_arm_mve_vshl_vector_predicated (VTI.Vec MQPR:$in), (VTI.Vec MQPR:$sh), (i32 q), (i32 r), (i32 VTI.Unsigned), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$in), (VTI.Vec MQPR:$sh), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$in), (VTI.Vec MQPR:$sh), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } multiclass mve_shift_by_vec_multi { @@ -2845,17 +2828,17 @@ multiclass MVE_VSxI_patterns { - foreach inparams = [(? (VTI.Vec MQPR:$QdSrc), (VTI.Vec MQPR:$Qm), - (inst.immediateType:$imm))] in - foreach outparams = [(inst (VTI.Vec MQPR:$QdSrc), (VTI.Vec MQPR:$Qm), - (inst.immediateType:$imm))] in - foreach unpred_int = [!cast("int_arm_mve_" # name)] in - foreach pred_int = [!cast("int_arm_mve_" # name # "_predicated")] in { - def : Pat<(VTI.Vec !setop(inparams, unpred_int)), - (VTI.Vec outparams)>; - def : Pat<(VTI.Vec !con(inparams, (pred_int (VTI.Pred VCCR:$pred)))), - (VTI.Vec !con(outparams, (? ARMVCCThen, VCCR:$pred)))>; - } + defvar inparams = (? (VTI.Vec MQPR:$QdSrc), (VTI.Vec MQPR:$Qm), + (inst.immediateType:$imm)); + defvar outparams = (inst (VTI.Vec MQPR:$QdSrc), (VTI.Vec MQPR:$Qm), + (inst.immediateType:$imm)); + defvar unpred_int = !cast("int_arm_mve_" # name); + defvar pred_int = !cast("int_arm_mve_" # name # "_predicated"); + + def : Pat<(VTI.Vec !setop(inparams, unpred_int)), + (VTI.Vec outparams)>; + def : Pat<(VTI.Vec !con(inparams, (pred_int (VTI.Pred VCCR:$pred)))), + (VTI.Vec !con(outparams, (? ARMVCCThen, VCCR:$pred)))>; } defm : MVE_VSxI_patterns; @@ -3213,17 +3196,16 @@ multiclass MVE_VMULT_fp_m { def "" : MVE_VMUL_fp; + defvar Inst = !cast(NAME); let Predicates = [HasMVEFloat] in { def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -3255,24 +3237,23 @@ multiclass MVE_VCMLA_m { def "" : MVE_VCMLA; + defvar Inst = !cast(NAME); let Predicates = [HasMVEFloat] in { def : Pat<(VTI.Vec (int_arm_mve_vcmlaq imm:$rot, (VTI.Vec MQPR:$Qd_src), (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qd_src), - (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), - imm:$rot))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qd_src), + (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), + imm:$rot))>; def : Pat<(VTI.Vec (int_arm_mve_vcmlaq_predicated imm:$rot, (VTI.Vec MQPR:$Qd_src), (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), (VTI.Pred VCCR:$mask))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qd_src), (VTI.Vec MQPR:$Qn), - (VTI.Vec MQPR:$Qm), imm:$rot, - ARMVCCThen, (VTI.Pred VCCR:$mask)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qd_src), (VTI.Vec MQPR:$Qn), + (VTI.Vec MQPR:$Qm), imm:$rot, + ARMVCCThen, (VTI.Pred VCCR:$mask)))>; } } @@ -3328,17 +3309,16 @@ def "" : MVE_VADDSUBFMA_fp { let validForTailPredication = 1; } + defvar Inst = !cast(NAME); let Predicates = [HasMVEFloat] in { def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -3376,23 +3356,21 @@ multiclass MVE_VCADD_m { def "" : MVE_VCADD; + defvar Inst = !cast(NAME); let Predicates = [HasMVEFloat] in { def : Pat<(VTI.Vec (int_arm_mve_vcaddq (i32 1), imm:$rot, (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), - imm:$rot))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), + imm:$rot))>; def : Pat<(VTI.Vec (int_arm_mve_vcaddq_predicated (i32 1), imm:$rot, (VTI.Vec MQPR:$inactive), (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), (VTI.Pred VCCR:$mask))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), - imm:$rot, - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), + imm:$rot, ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -3423,19 +3401,18 @@ multiclass MVE_VABDT_fp_m { def "" : MVE_VABD_fp; + defvar Inst = !cast(NAME); let Predicates = [HasMVEFloat] in { def : Pat<(VTI.Vec (unpred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 0))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 0), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -4034,24 +4011,21 @@ multiclass MVE_VCMUL_m { def "" : MVE_VCMUL; - + defvar Inst = !cast(NAME); let Predicates = [HasMVEFloat] in { def : Pat<(VTI.Vec (int_arm_mve_vcmulq imm:$rot, (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), - imm:$rot))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), + imm:$rot))>; def : Pat<(VTI.Vec (int_arm_mve_vcmulq_predicated imm:$rot, (VTI.Vec MQPR:$inactive), (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), (VTI.Pred VCCR:$mask))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), - imm:$rot, - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), + imm:$rot, ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -4084,27 +4058,25 @@ bit Top, string cstr=""> { def "" : MVE_VMULL<"vmull" # !if(Top, "t", "b"), VTI.Suffix, VTI.Unsigned, VTI.Size, Top, cstr>; + defvar Inst = !cast(NAME); - foreach uflag = [!if(!eq(VTI.SuffixLetter, "p"), - (?), (? (i32 VTI.Unsigned)))] in let Predicates = [HasMVEInt] in { + defvar uflag = !if(!eq(VTI.SuffixLetter, "p"), (?), (? (i32 VTI.Unsigned))); // Unpredicated multiply def : Pat<(VTI.DblVec !con((unpred_op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)), uflag, (? (i32 Top)))), - (VTI.DblVec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.DblVec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; // Predicated multiply def : Pat<(VTI.DblVec !con((pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)), uflag, (? (i32 Top), (VTI.Pred VCCR:$mask), (VTI.DblVec MQPR:$inactive)))), - (VTI.DblVec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.DblVec MQPR:$inactive)))>; + (VTI.DblVec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.DblVec MQPR:$inactive)))>; } } @@ -4170,22 +4142,21 @@ multiclass MVE_VxMULH_m { def "" : MVE_VxMULH; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in { // Unpredicated multiply returning high bits def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 VTI.Unsigned))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; // Predicated multiply returning high bits def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), (i32 VTI.Unsigned), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -4268,18 +4239,17 @@ multiclass MVE_VCVT_f2h_m { def "": MVE_VCVT_ff; + defvar Inst = !cast(NAME); let Predicates = [HasMVEFloat] in { def : Pat<(v8f16 (int_arm_mve_vcvt_narrow (v8f16 MQPR:$Qd_src), (v4f32 MQPR:$Qm), (i32 half))), - (v8f16 (!cast(NAME) - (v8f16 MQPR:$Qd_src), (v4f32 MQPR:$Qm)))>; + (v8f16 (Inst (v8f16 MQPR:$Qd_src), (v4f32 MQPR:$Qm)))>; def : Pat<(v8f16 (int_arm_mve_vcvt_narrow_predicated (v8f16 MQPR:$Qd_src), (v4f32 MQPR:$Qm), (i32 half), (v4i1 VCCR:$mask))), - (v8f16 (!cast(NAME) - (v8f16 MQPR:$Qd_src), (v4f32 MQPR:$Qm), - ARMVCCThen, (v4i1 VCCR:$mask)))>; + (v8f16 (Inst (v8f16 MQPR:$Qd_src), (v4f32 MQPR:$Qm), + ARMVCCThen, (v4i1 VCCR:$mask)))>; } } @@ -4313,23 +4283,21 @@ multiclass MVE_VxCADD_m { def "" : MVE_VxCADD; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in { def : Pat<(VTI.Vec (int_arm_mve_vcaddq halve, imm:$rot, (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), - imm:$rot))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), + imm:$rot))>; def : Pat<(VTI.Vec (int_arm_mve_vcaddq_predicated halve, imm:$rot, (VTI.Vec MQPR:$inactive), (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), (VTI.Pred VCCR:$mask))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), - imm:$rot, - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$Qn), (VTI.Vec MQPR:$Qm), + imm:$rot, ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; } } @@ -4565,20 +4533,19 @@ multiclass MVE_VxSHL_qr_p { def "" : MVE_VxSHL_qr; + defvar Inst = !cast(NAME); def : Pat<(VTI.Vec (int_arm_mve_vshl_scalar (VTI.Vec MQPR:$in), (i32 rGPR:$sh), (i32 q), (i32 r), (i32 VTI.Unsigned))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$in), (i32 rGPR:$sh)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$in), (i32 rGPR:$sh)))>; def : Pat<(VTI.Vec (int_arm_mve_vshl_scalar_predicated (VTI.Vec MQPR:$in), (i32 rGPR:$sh), (i32 q), (i32 r), (i32 VTI.Unsigned), (VTI.Pred VCCR:$mask))), - (VTI.Vec (!cast(NAME) - (VTI.Vec MQPR:$in), (i32 rGPR:$sh), - ARMVCCThen, (VTI.Pred VCCR:$mask)))>; + (VTI.Vec (Inst (VTI.Vec MQPR:$in), (i32 rGPR:$sh), + ARMVCCThen, (VTI.Pred VCCR:$mask)))>; } multiclass MVE_VxSHL_qr_types { @@ -4851,12 +4818,12 @@ multiclass MVE_VCTP { def "": MVE_VCTPInst; + defvar Inst = !cast(NAME); let Predicates = [HasMVEInt] in { - def : Pat<(intr rGPR:$Rn), - (VTI.Pred (!cast(NAME) rGPR:$Rn))>; + def : Pat<(intr rGPR:$Rn), (VTI.Pred (Inst rGPR:$Rn))>; def : Pat<(and (intr rGPR:$Rn), (VTI.Pred VCCR:$mask)), - (VTI.Pred (!cast(NAME) rGPR:$Rn, ARMVCCThen, VCCR:$mask))>; + (VTI.Pred (Inst rGPR:$Rn, ARMVCCThen, VCCR:$mask))>; } } @@ -5319,51 +5286,61 @@ multiclass MVE_VLDR_rq_w VTIs> { defm "": MVE_VLDRSTR_rq_w; + defvar Inst = !cast(NAME); + defvar InstU = !cast(NAME # "_u"); + foreach VTI = VTIs in foreach UnsignedFlag = !if(!eq(VTI.Size, memsz.encoding), [0,1], [VTI.Unsigned]) in { def : Pat<(VTI.Vec (int_arm_mve_vldr_gather_offset GPR:$base, (VTIs[0].Vec MQPR:$offsets), memsz.TypeBits, 0, UnsignedFlag)), - (VTI.Vec (!cast(NAME#"_u") GPR:$base, MQPR:$offsets))>; + (VTI.Vec (InstU GPR:$base, MQPR:$offsets))>; def : Pat<(VTI.Vec (int_arm_mve_vldr_gather_offset GPR:$base, (VTIs[0].Vec MQPR:$offsets), memsz.TypeBits, memsz.shift, UnsignedFlag)), - (VTI.Vec (!cast(NAME) GPR:$base, MQPR:$offsets))>; + (VTI.Vec (Inst GPR:$base, MQPR:$offsets))>; def : Pat<(VTI.Vec (int_arm_mve_vldr_gather_offset_predicated GPR:$base, (VTIs[0].Vec MQPR:$offsets), memsz.TypeBits, 0, UnsignedFlag, (VTI.Pred VCCR:$pred))), - (VTI.Vec (!cast(NAME#"_u") GPR:$base, MQPR:$offsets, ARMVCCThen, VCCR:$pred))>; + (VTI.Vec (InstU GPR:$base, MQPR:$offsets, ARMVCCThen, VCCR:$pred))>; def : Pat<(VTI.Vec (int_arm_mve_vldr_gather_offset_predicated GPR:$base, (VTIs[0].Vec MQPR:$offsets), memsz.TypeBits, memsz.shift, UnsignedFlag, (VTI.Pred VCCR:$pred))), - (VTI.Vec (!cast(NAME) GPR:$base, MQPR:$offsets, ARMVCCThen, VCCR:$pred))>; + (VTI.Vec (Inst GPR:$base, MQPR:$offsets, ARMVCCThen, VCCR:$pred))>; } } multiclass MVE_VLDR_rq_b VTIs> { def "": MVE_VLDRSTR_rq_b; + defvar Inst = !cast(NAME); + foreach VTI = VTIs in { def : Pat<(VTI.Vec (int_arm_mve_vldr_gather_offset GPR:$base, (VTIs[0].Vec MQPR:$offsets), 8, 0, VTI.Unsigned)), - (VTI.Vec (!cast(NAME) GPR:$base, MQPR:$offsets))>; + (VTI.Vec (Inst GPR:$base, MQPR:$offsets))>; def : Pat<(VTI.Vec (int_arm_mve_vldr_gather_offset_predicated GPR:$base, (VTIs[0].Vec MQPR:$offsets), 8, 0, VTI.Unsigned, (VTI.Pred VCCR:$pred))), - (VTI.Vec (!cast(NAME) GPR:$base, MQPR:$offsets, ARMVCCThen, VCCR:$pred))>; + (VTI.Vec (Inst GPR:$base, MQPR:$offsets, ARMVCCThen, VCCR:$pred))>; } } multiclass MVE_VSTR_rq_w VTIs> { defm "": MVE_VLDRSTR_rq_w; + defvar Inst = !cast(NAME); + defvar InstU = !cast(NAME # "_u"); + foreach VTI = VTIs in { def : Pat<(int_arm_mve_vstr_scatter_offset GPR:$base, (VTIs[0].Vec MQPR:$offsets), (VTI.Vec MQPR:$data), memsz.TypeBits, 0), - (!cast(NAME#"_u") MQPR:$data, GPR:$base, MQPR:$offsets)>; + (InstU MQPR:$data, GPR:$base, MQPR:$offsets)>; def : Pat<(int_arm_mve_vstr_scatter_offset GPR:$base, (VTIs[0].Vec MQPR:$offsets), (VTI.Vec MQPR:$data), memsz.TypeBits, memsz.shift), - (!cast(NAME) MQPR:$data, GPR:$base, MQPR:$offsets)>; + (Inst MQPR:$data, GPR:$base, MQPR:$offsets)>; def : Pat<(int_arm_mve_vstr_scatter_offset_predicated GPR:$base, (VTIs[0].Vec MQPR:$offsets), (VTI.Vec MQPR:$data), memsz.TypeBits, 0, (VTI.Pred VCCR:$pred)), - (!cast(NAME#"_u") MQPR:$data, GPR:$base, MQPR:$offsets, ARMVCCThen, VCCR:$pred)>; + (InstU MQPR:$data, GPR:$base, MQPR:$offsets, ARMVCCThen, VCCR:$pred)>; def : Pat<(int_arm_mve_vstr_scatter_offset_predicated GPR:$base, (VTIs[0].Vec MQPR:$offsets), (VTI.Vec MQPR:$data), memsz.TypeBits, memsz.shift, (VTI.Pred VCCR:$pred)), - (!cast(NAME) MQPR:$data, GPR:$base, MQPR:$offsets, ARMVCCThen, VCCR:$pred)>; + (Inst MQPR:$data, GPR:$base, MQPR:$offsets, ARMVCCThen, VCCR:$pred)>; } } multiclass MVE_VSTR_rq_b VTIs> { def "": MVE_VLDRSTR_rq_b; + defvar Inst = !cast(NAME); + foreach VTI = VTIs in { def : Pat<(int_arm_mve_vstr_scatter_offset GPR:$base, (VTIs[0].Vec MQPR:$offsets), (VTI.Vec MQPR:$data), 8, 0), - (!cast(NAME) MQPR:$data, GPR:$base, MQPR:$offsets)>; + (Inst MQPR:$data, GPR:$base, MQPR:$offsets)>; def : Pat<(int_arm_mve_vstr_scatter_offset_predicated GPR:$base, (VTIs[0].Vec MQPR:$offsets), (VTI.Vec MQPR:$data), 8, 0, (VTI.Pred VCCR:$pred)), - (!cast(NAME) MQPR:$data, GPR:$base, MQPR:$offsets, ARMVCCThen, VCCR:$pred)>; + (Inst MQPR:$data, GPR:$base, MQPR:$offsets, ARMVCCThen, VCCR:$pred)>; } } @@ -5435,40 +5412,42 @@ list DVTIs> { defm "" : MVE_VLDRSTR_qi_m; + defvar Inst = !cast(NAME); foreach DVTI = DVTIs in { def : Pat<(DVTI.Vec (int_arm_mve_vldr_gather_base (AVTI.Vec MQPR:$addr), (i32 imm:$offset))), - (DVTI.Vec (!cast(NAME) - (AVTI.Vec MQPR:$addr), (i32 imm:$offset)))>; + (DVTI.Vec (Inst (AVTI.Vec MQPR:$addr), (i32 imm:$offset)))>; def : Pat<(DVTI.Vec (int_arm_mve_vldr_gather_base_predicated (AVTI.Vec MQPR:$addr), (i32 imm:$offset), (AVTI.Pred VCCR:$pred))), - (DVTI.Vec (!cast(NAME) - (AVTI.Vec MQPR:$addr), (i32 imm:$offset), ARMVCCThen, VCCR:$pred))>; + (DVTI.Vec (Inst (AVTI.Vec MQPR:$addr), (i32 imm:$offset), + ARMVCCThen, VCCR:$pred))>; } } multiclass MVE_VSTR_qi DVTIs> { defm "" : MVE_VLDRSTR_qi_m(memsz.TypeBits)>; + defvar Inst = !cast(NAME); + defvar InstPre = !cast(NAME # "_pre"); foreach DVTI = DVTIs in { def : Pat<(int_arm_mve_vstr_scatter_base (AVTI.Vec MQPR:$addr), (i32 imm:$offset), (DVTI.Vec MQPR:$data)), - (!cast(NAME) - (DVTI.Vec MQPR:$data), (AVTI.Vec MQPR:$addr), (i32 imm:$offset))>; + (Inst (DVTI.Vec MQPR:$data), (AVTI.Vec MQPR:$addr), + (i32 imm:$offset))>; def : Pat<(int_arm_mve_vstr_scatter_base_predicated (AVTI.Vec MQPR:$addr), (i32 imm:$offset), (DVTI.Vec MQPR:$data), (AVTI.Pred VCCR:$pred)), - (!cast(NAME) - (DVTI.Vec MQPR:$data), (AVTI.Vec MQPR:$addr), (i32 imm:$offset), ARMVCCThen, VCCR:$pred)>; + (Inst (DVTI.Vec MQPR:$data), (AVTI.Vec MQPR:$addr), + (i32 imm:$offset), ARMVCCThen, VCCR:$pred)>; def : Pat<(AVTI.Vec (int_arm_mve_vstr_scatter_base_wb (AVTI.Vec MQPR:$addr), (i32 imm:$offset), (DVTI.Vec MQPR:$data))), - (AVTI.Vec (!cast(NAME # "_pre") - (DVTI.Vec MQPR:$data), (AVTI.Vec MQPR:$addr), (i32 imm:$offset)))>; + (AVTI.Vec (InstPre (DVTI.Vec MQPR:$data), (AVTI.Vec MQPR:$addr), + (i32 imm:$offset)))>; def : Pat<(AVTI.Vec (int_arm_mve_vstr_scatter_base_wb_predicated (AVTI.Vec MQPR:$addr), (i32 imm:$offset), (DVTI.Vec MQPR:$data), (AVTI.Pred VCCR:$pred))), - (AVTI.Vec (!cast(NAME # "_pre") - (DVTI.Vec MQPR:$data), (AVTI.Vec MQPR:$addr), (i32 imm:$offset), ARMVCCThen, VCCR:$pred))>; + (AVTI.Vec (InstPre (DVTI.Vec MQPR:$data), (AVTI.Vec MQPR:$addr), + (i32 imm:$offset), ARMVCCThen, VCCR:$pred))>; } } @@ -5494,21 +5473,21 @@ foreach vpt_cond = ["", "t", "e"] in foreach memsz = [MVE_memB, MVE_memH, MVE_memW, MVE_memD] in foreach suffix = memsz.suffixes in { + // Define an alias with every suffix in the list, except for the one + // used by the real Instruction record (i.e. the one that all the + // rest are aliases *for*). + + if !ne(suffix, memsz.CanonLoadSuffix) then { + def : MnemonicAlias< + "vldr" # memsz.MnemonicLetter # vpt_cond # suffix, + "vldr" # memsz.MnemonicLetter # vpt_cond # memsz.CanonLoadSuffix>; + } - // These foreaches are conceptually ifs, implemented by iterating a - // dummy variable over a list with 0 or 1 elements depending on the - // condition. The idea is to iterate over _nearly_ all the suffixes - // in memsz.suffixes, but omit the one we want all the others to alias. - - foreach _ = !if(!ne(suffix, memsz.CanonLoadSuffix), [1], []) in - def : MnemonicAlias< - "vldr" # memsz.MnemonicLetter # vpt_cond # suffix, - "vldr" # memsz.MnemonicLetter # vpt_cond # memsz.CanonLoadSuffix>; - - foreach _ = !if(!ne(suffix, memsz.CanonStoreSuffix), [1], []) in - def : MnemonicAlias< - "vstr" # memsz.MnemonicLetter # vpt_cond # suffix, - "vstr" # memsz.MnemonicLetter # vpt_cond # memsz.CanonStoreSuffix>; + if !ne(suffix, memsz.CanonStoreSuffix) then { + def : MnemonicAlias< + "vstr" # memsz.MnemonicLetter # vpt_cond # suffix, + "vstr" # memsz.MnemonicLetter # vpt_cond # memsz.CanonStoreSuffix>; + } } // end of MVE predicable load/store