diff options
author | shadchin <shadchin@yandex-team.ru> | 2022-02-10 16:44:30 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:44:30 +0300 |
commit | 2598ef1d0aee359b4b6d5fdd1758916d5907d04f (patch) | |
tree | 012bb94d777798f1f56ac1cec429509766d05181 /contrib/libs/llvm12/lib/Target/ARM/ARMInstrMVE.td | |
parent | 6751af0b0c1b952fede40b19b71da8025b5d8bcf (diff) | |
download | ydb-2598ef1d0aee359b4b6d5fdd1758916d5907d04f.tar.gz |
Restoring authorship annotation for <shadchin@yandex-team.ru>. Commit 1 of 2.
Diffstat (limited to 'contrib/libs/llvm12/lib/Target/ARM/ARMInstrMVE.td')
-rw-r--r-- | contrib/libs/llvm12/lib/Target/ARM/ARMInstrMVE.td | 970 |
1 files changed, 485 insertions, 485 deletions
diff --git a/contrib/libs/llvm12/lib/Target/ARM/ARMInstrMVE.td b/contrib/libs/llvm12/lib/Target/ARM/ARMInstrMVE.td index 0dfea68887..64cef5d967 100644 --- a/contrib/libs/llvm12/lib/Target/ARM/ARMInstrMVE.td +++ b/contrib/libs/llvm12/lib/Target/ARM/ARMInstrMVE.td @@ -318,78 +318,78 @@ def MVE_v2f64 : MVEVectorVTInfo<v2f64, ?, v4i1, ?, 0b11, "f", ?>; def MVE_v16p8 : MVEVectorVTInfo<v16i8, v8i16, v16i1, v8i1, 0b11, "p", 0b0>; def MVE_v8p16 : MVEVectorVTInfo<v8i16, v4i32, v8i1, v4i1, 0b11, "p", 0b1>; -multiclass MVE_TwoOpPattern<MVEVectorVTInfo VTI, PatFrag Op, Intrinsic PredInt, - dag PredOperands, Instruction Inst, - SDPatternOperator IdentityVec = null_frag> { - // Unpredicated - def : Pat<(VTI.Vec (Op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn))), - (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; - - // Predicated with select - if !ne(VTI.Size, 0b11) then { - def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$mask), - (VTI.Vec (Op (VTI.Vec MQPR:$Qm), - (VTI.Vec MQPR:$Qn))), - (VTI.Vec MQPR:$inactive))), - (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; - - // Optionally with the select folded through the op - def : Pat<(VTI.Vec (Op (VTI.Vec MQPR:$Qm), - (VTI.Vec (vselect (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$Qn), - (VTI.Vec IdentityVec))))), - (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$Qm)))>; - } - - // Predicated with intrinsic - def : Pat<(VTI.Vec !con((PredInt (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)), - PredOperands, - (? (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)))>; -} - -multiclass MVE_TwoOpPatternDup<MVEVectorVTInfo VTI, PatFrag Op, Intrinsic PredInt, - dag PredOperands, Instruction Inst, - SDPatternOperator IdentityVec = null_frag> { - // Unpredicated - def : Pat<(VTI.Vec (Op (VTI.Vec MQPR:$Qm), (VTI.Vec (ARMvdup rGPR:$Rn)))), - (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), rGPR:$Rn))>; - - // Predicated with select - if !ne(VTI.Size, 0b11) then { - def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$mask), - (VTI.Vec (Op (VTI.Vec MQPR:$Qm), - (VTI.Vec (ARMvdup rGPR:$Rn)))), - (VTI.Vec MQPR:$inactive))), - (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), rGPR:$Rn, - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; - - // Optionally with the select folded through the op - def : Pat<(VTI.Vec (Op (VTI.Vec MQPR:$Qm), - (VTI.Vec (vselect (VTI.Pred VCCR:$mask), - (ARMvdup rGPR:$Rn), - (VTI.Vec IdentityVec))))), - (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), rGPR:$Rn, - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$Qm)))>; - } - - // Predicated with intrinsic - def : Pat<(VTI.Vec !con((PredInt (VTI.Vec MQPR:$Qm), (VTI.Vec (ARMvdup rGPR:$Rn))), - PredOperands, - (? (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive)))), - (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), rGPR:$Rn, - ARMVCCThen, (VTI.Pred VCCR:$mask), - (VTI.Vec MQPR:$inactive)))>; -} - +multiclass MVE_TwoOpPattern<MVEVectorVTInfo VTI, PatFrag Op, Intrinsic PredInt, + dag PredOperands, Instruction Inst, + SDPatternOperator IdentityVec = null_frag> { + // Unpredicated + def : Pat<(VTI.Vec (Op (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn))), + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; + + // Predicated with select + if !ne(VTI.Size, 0b11) then { + def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$mask), + (VTI.Vec (Op (VTI.Vec MQPR:$Qm), + (VTI.Vec MQPR:$Qn))), + (VTI.Vec MQPR:$inactive))), + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; + + // Optionally with the select folded through the op + def : Pat<(VTI.Vec (Op (VTI.Vec MQPR:$Qm), + (VTI.Vec (vselect (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$Qn), + (VTI.Vec IdentityVec))))), + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn), + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$Qm)))>; + } + + // Predicated with intrinsic + def : Pat<(VTI.Vec !con((PredInt (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)), + PredOperands, + (? (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)))>; +} + +multiclass MVE_TwoOpPatternDup<MVEVectorVTInfo VTI, PatFrag Op, Intrinsic PredInt, + dag PredOperands, Instruction Inst, + SDPatternOperator IdentityVec = null_frag> { + // Unpredicated + def : Pat<(VTI.Vec (Op (VTI.Vec MQPR:$Qm), (VTI.Vec (ARMvdup rGPR:$Rn)))), + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), rGPR:$Rn))>; + + // Predicated with select + if !ne(VTI.Size, 0b11) then { + def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$mask), + (VTI.Vec (Op (VTI.Vec MQPR:$Qm), + (VTI.Vec (ARMvdup rGPR:$Rn)))), + (VTI.Vec MQPR:$inactive))), + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), rGPR:$Rn, + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; + + // Optionally with the select folded through the op + def : Pat<(VTI.Vec (Op (VTI.Vec MQPR:$Qm), + (VTI.Vec (vselect (VTI.Pred VCCR:$mask), + (ARMvdup rGPR:$Rn), + (VTI.Vec IdentityVec))))), + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), rGPR:$Rn, + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$Qm)))>; + } + + // Predicated with intrinsic + def : Pat<(VTI.Vec !con((PredInt (VTI.Vec MQPR:$Qm), (VTI.Vec (ARMvdup rGPR:$Rn))), + PredOperands, + (? (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive)))), + (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), rGPR:$Rn, + ARMVCCThen, (VTI.Pred VCCR:$mask), + (VTI.Vec MQPR:$inactive)))>; +} + // --------- Start of base classes for the instructions themselves class MVE_MI<dag oops, dag iops, InstrItinClass itin, string asm, @@ -450,7 +450,7 @@ class MVE_ScalarShift<string iname, dag oops, dag iops, string asm, string cstr, : MVE_MI_with_pred<oops, iops, NoItinerary, iname, asm, cstr, pattern> { let Inst{31-20} = 0b111010100101; let Inst{8} = 0b1; - let validForTailPredication=1; + let validForTailPredication=1; } class MVE_ScalarShiftSingleReg<string iname, dag iops, string asm, string cstr, @@ -684,13 +684,13 @@ class MVE_VADDV<string iname, string suffix, dag iops, string cstr, let validForTailPredication = 1; } -def SDTVecReduceP : SDTypeProfile<1, 2, [ // VADDLVp - SDTCisInt<0>, SDTCisVec<1>, SDTCisVec<2> -]>; +def SDTVecReduceP : SDTypeProfile<1, 2, [ // VADDLVp + SDTCisInt<0>, SDTCisVec<1>, SDTCisVec<2> +]>; def ARMVADDVs : SDNode<"ARMISD::VADDVs", SDTVecReduce>; def ARMVADDVu : SDNode<"ARMISD::VADDVu", SDTVecReduce>; -def ARMVADDVps : SDNode<"ARMISD::VADDVps", SDTVecReduceP>; -def ARMVADDVpu : SDNode<"ARMISD::VADDVpu", SDTVecReduceP>; +def ARMVADDVps : SDNode<"ARMISD::VADDVps", SDTVecReduceP>; +def ARMVADDVpu : SDNode<"ARMISD::VADDVpu", SDTVecReduceP>; multiclass MVE_VADDV_A<MVEVectorVTInfo VTI> { def acc : MVE_VADDV<"vaddva", VTI.Suffix, @@ -707,39 +707,39 @@ multiclass MVE_VADDV_A<MVEVectorVTInfo VTI> { if VTI.Unsigned then { def : Pat<(i32 (vecreduce_add (VTI.Vec MQPR:$vec))), (i32 (InstN $vec))>; - def : Pat<(i32 (vecreduce_add (VTI.Vec (vselect (VTI.Pred VCCR:$pred), - (VTI.Vec MQPR:$vec), - (VTI.Vec ARMimmAllZerosV))))), - (i32 (InstN $vec, ARMVCCThen, $pred))>; + def : Pat<(i32 (vecreduce_add (VTI.Vec (vselect (VTI.Pred VCCR:$pred), + (VTI.Vec MQPR:$vec), + (VTI.Vec ARMimmAllZerosV))))), + (i32 (InstN $vec, ARMVCCThen, $pred))>; def : Pat<(i32 (ARMVADDVu (VTI.Vec MQPR:$vec))), (i32 (InstN $vec))>; - def : Pat<(i32 (ARMVADDVpu (VTI.Vec MQPR:$vec), (VTI.Pred VCCR:$pred))), - (i32 (InstN $vec, ARMVCCThen, $pred))>; + def : Pat<(i32 (ARMVADDVpu (VTI.Vec MQPR:$vec), (VTI.Pred VCCR:$pred))), + (i32 (InstN $vec, ARMVCCThen, $pred))>; def : Pat<(i32 (add (i32 (vecreduce_add (VTI.Vec MQPR:$vec))), (i32 tGPREven:$acc))), (i32 (InstA $acc, $vec))>; - def : Pat<(i32 (add (i32 (vecreduce_add (VTI.Vec (vselect (VTI.Pred VCCR:$pred), - (VTI.Vec MQPR:$vec), - (VTI.Vec ARMimmAllZerosV))))), - (i32 tGPREven:$acc))), - (i32 (InstA $acc, $vec, ARMVCCThen, $pred))>; + def : Pat<(i32 (add (i32 (vecreduce_add (VTI.Vec (vselect (VTI.Pred VCCR:$pred), + (VTI.Vec MQPR:$vec), + (VTI.Vec ARMimmAllZerosV))))), + (i32 tGPREven:$acc))), + (i32 (InstA $acc, $vec, ARMVCCThen, $pred))>; def : Pat<(i32 (add (i32 (ARMVADDVu (VTI.Vec MQPR:$vec))), (i32 tGPREven:$acc))), (i32 (InstA $acc, $vec))>; - def : Pat<(i32 (add (i32 (ARMVADDVpu (VTI.Vec MQPR:$vec), (VTI.Pred VCCR:$pred))), - (i32 tGPREven:$acc))), - (i32 (InstA $acc, $vec, ARMVCCThen, $pred))>; + def : Pat<(i32 (add (i32 (ARMVADDVpu (VTI.Vec MQPR:$vec), (VTI.Pred VCCR:$pred))), + (i32 tGPREven:$acc))), + (i32 (InstA $acc, $vec, ARMVCCThen, $pred))>; } else { def : Pat<(i32 (ARMVADDVs (VTI.Vec MQPR:$vec))), (i32 (InstN $vec))>; def : Pat<(i32 (add (i32 (ARMVADDVs (VTI.Vec MQPR:$vec))), (i32 tGPREven:$acc))), (i32 (InstA $acc, $vec))>; - def : Pat<(i32 (ARMVADDVps (VTI.Vec MQPR:$vec), (VTI.Pred VCCR:$pred))), - (i32 (InstN $vec, ARMVCCThen, $pred))>; - def : Pat<(i32 (add (i32 (ARMVADDVps (VTI.Vec MQPR:$vec), (VTI.Pred VCCR:$pred))), - (i32 tGPREven:$acc))), - (i32 (InstA $acc, $vec, ARMVCCThen, $pred))>; + def : Pat<(i32 (ARMVADDVps (VTI.Vec MQPR:$vec), (VTI.Pred VCCR:$pred))), + (i32 (InstN $vec, ARMVCCThen, $pred))>; + def : Pat<(i32 (add (i32 (ARMVADDVps (VTI.Vec MQPR:$vec), (VTI.Pred VCCR:$pred))), + (i32 tGPREven:$acc))), + (i32 (InstA $acc, $vec, ARMVCCThen, $pred))>; } def : Pat<(i32 (int_arm_mve_addv_predicated (VTI.Vec MQPR:$vec), @@ -944,14 +944,14 @@ multiclass MVE_VMINMAXV_ty<string iname, bit isMin, string intrBaseName> { defm u32: MVE_VMINMAXV_p<iname, 1, isMin, MVE_v4u32, intrBaseName>; } -def SDTVecReduceR : SDTypeProfile<1, 2, [ // Reduction of an integer and vector into an integer - SDTCisInt<0>, SDTCisInt<1>, SDTCisVec<2> -]>; -def ARMVMINVu : SDNode<"ARMISD::VMINVu", SDTVecReduceR>; -def ARMVMINVs : SDNode<"ARMISD::VMINVs", SDTVecReduceR>; -def ARMVMAXVu : SDNode<"ARMISD::VMAXVu", SDTVecReduceR>; -def ARMVMAXVs : SDNode<"ARMISD::VMAXVs", SDTVecReduceR>; - +def SDTVecReduceR : SDTypeProfile<1, 2, [ // Reduction of an integer and vector into an integer + SDTCisInt<0>, SDTCisInt<1>, SDTCisVec<2> +]>; +def ARMVMINVu : SDNode<"ARMISD::VMINVu", SDTVecReduceR>; +def ARMVMINVs : SDNode<"ARMISD::VMINVs", SDTVecReduceR>; +def ARMVMAXVu : SDNode<"ARMISD::VMAXVu", SDTVecReduceR>; +def ARMVMAXVs : SDNode<"ARMISD::VMAXVs", SDTVecReduceR>; + defm MVE_VMINV : MVE_VMINMAXV_ty<"vminv", 1, "int_arm_mve_minv">; defm MVE_VMAXV : MVE_VMINMAXV_ty<"vmaxv", 0, "int_arm_mve_maxv">; @@ -982,32 +982,32 @@ let Predicates = [HasMVEInt] in { def : Pat<(i32 (vecreduce_umin (v4i32 MQPR:$src))), (i32 (MVE_VMINVu32 (t2MOVi (i32 4294967295)), $src))>; - def : Pat<(i32 (ARMVMINVu (i32 rGPR:$x), (v16i8 MQPR:$src))), - (i32 (MVE_VMINVu8 $x, $src))>; - def : Pat<(i32 (ARMVMINVu (i32 rGPR:$x), (v8i16 MQPR:$src))), - (i32 (MVE_VMINVu16 $x, $src))>; - def : Pat<(i32 (ARMVMINVu (i32 rGPR:$x), (v4i32 MQPR:$src))), - (i32 (MVE_VMINVu32 $x, $src))>; - def : Pat<(i32 (ARMVMINVs (i32 rGPR:$x), (v16i8 MQPR:$src))), - (i32 (MVE_VMINVs8 $x, $src))>; - def : Pat<(i32 (ARMVMINVs (i32 rGPR:$x), (v8i16 MQPR:$src))), - (i32 (MVE_VMINVs16 $x, $src))>; - def : Pat<(i32 (ARMVMINVs (i32 rGPR:$x), (v4i32 MQPR:$src))), - (i32 (MVE_VMINVs32 $x, $src))>; - - def : Pat<(i32 (ARMVMAXVu (i32 rGPR:$x), (v16i8 MQPR:$src))), - (i32 (MVE_VMAXVu8 $x, $src))>; - def : Pat<(i32 (ARMVMAXVu (i32 rGPR:$x), (v8i16 MQPR:$src))), - (i32 (MVE_VMAXVu16 $x, $src))>; - def : Pat<(i32 (ARMVMAXVu (i32 rGPR:$x), (v4i32 MQPR:$src))), - (i32 (MVE_VMAXVu32 $x, $src))>; - def : Pat<(i32 (ARMVMAXVs (i32 rGPR:$x), (v16i8 MQPR:$src))), - (i32 (MVE_VMAXVs8 $x, $src))>; - def : Pat<(i32 (ARMVMAXVs (i32 rGPR:$x), (v8i16 MQPR:$src))), - (i32 (MVE_VMAXVs16 $x, $src))>; - def : Pat<(i32 (ARMVMAXVs (i32 rGPR:$x), (v4i32 MQPR:$src))), - (i32 (MVE_VMAXVs32 $x, $src))>; - + def : Pat<(i32 (ARMVMINVu (i32 rGPR:$x), (v16i8 MQPR:$src))), + (i32 (MVE_VMINVu8 $x, $src))>; + def : Pat<(i32 (ARMVMINVu (i32 rGPR:$x), (v8i16 MQPR:$src))), + (i32 (MVE_VMINVu16 $x, $src))>; + def : Pat<(i32 (ARMVMINVu (i32 rGPR:$x), (v4i32 MQPR:$src))), + (i32 (MVE_VMINVu32 $x, $src))>; + def : Pat<(i32 (ARMVMINVs (i32 rGPR:$x), (v16i8 MQPR:$src))), + (i32 (MVE_VMINVs8 $x, $src))>; + def : Pat<(i32 (ARMVMINVs (i32 rGPR:$x), (v8i16 MQPR:$src))), + (i32 (MVE_VMINVs16 $x, $src))>; + def : Pat<(i32 (ARMVMINVs (i32 rGPR:$x), (v4i32 MQPR:$src))), + (i32 (MVE_VMINVs32 $x, $src))>; + + def : Pat<(i32 (ARMVMAXVu (i32 rGPR:$x), (v16i8 MQPR:$src))), + (i32 (MVE_VMAXVu8 $x, $src))>; + def : Pat<(i32 (ARMVMAXVu (i32 rGPR:$x), (v8i16 MQPR:$src))), + (i32 (MVE_VMAXVu16 $x, $src))>; + def : Pat<(i32 (ARMVMAXVu (i32 rGPR:$x), (v4i32 MQPR:$src))), + (i32 (MVE_VMAXVu32 $x, $src))>; + def : Pat<(i32 (ARMVMAXVs (i32 rGPR:$x), (v16i8 MQPR:$src))), + (i32 (MVE_VMAXVs8 $x, $src))>; + def : Pat<(i32 (ARMVMAXVs (i32 rGPR:$x), (v8i16 MQPR:$src))), + (i32 (MVE_VMAXVs16 $x, $src))>; + def : Pat<(i32 (ARMVMAXVs (i32 rGPR:$x), (v4i32 MQPR:$src))), + (i32 (MVE_VMAXVs32 $x, $src))>; + } multiclass MVE_VMINMAXAV_ty<string iname, bit isMin, string intrBaseName> { @@ -1139,28 +1139,28 @@ def SDTVecReduce2LA : SDTypeProfile<2, 4, [ // VMLALVA SDTCisInt<0>, SDTCisInt<1>, SDTCisInt<2>, SDTCisInt<3>, SDTCisVec<4>, SDTCisVec<5> ]>; -def SDTVecReduce2P : SDTypeProfile<1, 3, [ // VMLAV - SDTCisInt<0>, SDTCisVec<1>, SDTCisVec<2>, SDTCisVec<3> -]>; -def SDTVecReduce2LP : SDTypeProfile<2, 3, [ // VMLALV - SDTCisInt<0>, SDTCisInt<1>, SDTCisVec<2>, SDTCisVec<3>, SDTCisVec<4> -]>; -def SDTVecReduce2LAP : SDTypeProfile<2, 5, [ // VMLALVA - SDTCisInt<0>, SDTCisInt<1>, SDTCisInt<2>, SDTCisInt<3>, - SDTCisVec<4>, SDTCisVec<5>, SDTCisVec<6> -]>; +def SDTVecReduce2P : SDTypeProfile<1, 3, [ // VMLAV + SDTCisInt<0>, SDTCisVec<1>, SDTCisVec<2>, SDTCisVec<3> +]>; +def SDTVecReduce2LP : SDTypeProfile<2, 3, [ // VMLALV + SDTCisInt<0>, SDTCisInt<1>, SDTCisVec<2>, SDTCisVec<3>, SDTCisVec<4> +]>; +def SDTVecReduce2LAP : SDTypeProfile<2, 5, [ // VMLALVA + SDTCisInt<0>, SDTCisInt<1>, SDTCisInt<2>, SDTCisInt<3>, + SDTCisVec<4>, SDTCisVec<5>, SDTCisVec<6> +]>; def ARMVMLAVs : SDNode<"ARMISD::VMLAVs", SDTVecReduce2>; def ARMVMLAVu : SDNode<"ARMISD::VMLAVu", SDTVecReduce2>; def ARMVMLALVs : SDNode<"ARMISD::VMLALVs", SDTVecReduce2L>; def ARMVMLALVu : SDNode<"ARMISD::VMLALVu", SDTVecReduce2L>; -def ARMVMLALVAs : SDNode<"ARMISD::VMLALVAs", SDTVecReduce2LA>; -def ARMVMLALVAu : SDNode<"ARMISD::VMLALVAu", SDTVecReduce2LA>; -def ARMVMLAVps : SDNode<"ARMISD::VMLAVps", SDTVecReduce2P>; -def ARMVMLAVpu : SDNode<"ARMISD::VMLAVpu", SDTVecReduce2P>; -def ARMVMLALVps : SDNode<"ARMISD::VMLALVps", SDTVecReduce2LP>; -def ARMVMLALVpu : SDNode<"ARMISD::VMLALVpu", SDTVecReduce2LP>; -def ARMVMLALVAps : SDNode<"ARMISD::VMLALVAps", SDTVecReduce2LAP>; -def ARMVMLALVApu : SDNode<"ARMISD::VMLALVApu", SDTVecReduce2LAP>; +def ARMVMLALVAs : SDNode<"ARMISD::VMLALVAs", SDTVecReduce2LA>; +def ARMVMLALVAu : SDNode<"ARMISD::VMLALVAu", SDTVecReduce2LA>; +def ARMVMLAVps : SDNode<"ARMISD::VMLAVps", SDTVecReduce2P>; +def ARMVMLAVpu : SDNode<"ARMISD::VMLAVpu", SDTVecReduce2P>; +def ARMVMLALVps : SDNode<"ARMISD::VMLALVps", SDTVecReduce2LP>; +def ARMVMLALVpu : SDNode<"ARMISD::VMLALVpu", SDTVecReduce2LP>; +def ARMVMLALVAps : SDNode<"ARMISD::VMLALVAps", SDTVecReduce2LAP>; +def ARMVMLALVApu : SDNode<"ARMISD::VMLALVApu", SDTVecReduce2LAP>; let Predicates = [HasMVEInt] in { def : Pat<(i32 (vecreduce_add (mul (v4i32 MQPR:$src1), (v4i32 MQPR:$src2)))), @@ -1179,68 +1179,68 @@ let Predicates = [HasMVEInt] in { (i32 (MVE_VMLADAVu8 (v16i8 MQPR:$val1), (v16i8 MQPR:$val2)))>; def : Pat<(i32 (add (i32 (vecreduce_add (mul (v4i32 MQPR:$src1), (v4i32 MQPR:$src2)))), - (i32 tGPREven:$src3))), + (i32 tGPREven:$src3))), (i32 (MVE_VMLADAVau32 $src3, $src1, $src2))>; def : Pat<(i32 (add (i32 (vecreduce_add (mul (v8i16 MQPR:$src1), (v8i16 MQPR:$src2)))), - (i32 tGPREven:$src3))), + (i32 tGPREven:$src3))), (i32 (MVE_VMLADAVau16 $src3, $src1, $src2))>; def : Pat<(i32 (add (ARMVMLAVs (v8i16 MQPR:$val1), (v8i16 MQPR:$val2)), tGPREven:$Rd)), (i32 (MVE_VMLADAVas16 tGPREven:$Rd, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2)))>; def : Pat<(i32 (add (ARMVMLAVu (v8i16 MQPR:$val1), (v8i16 MQPR:$val2)), tGPREven:$Rd)), (i32 (MVE_VMLADAVau16 tGPREven:$Rd, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2)))>; def : Pat<(i32 (add (i32 (vecreduce_add (mul (v16i8 MQPR:$src1), (v16i8 MQPR:$src2)))), - (i32 tGPREven:$src3))), + (i32 tGPREven:$src3))), (i32 (MVE_VMLADAVau8 $src3, $src1, $src2))>; def : Pat<(i32 (add (ARMVMLAVs (v16i8 MQPR:$val1), (v16i8 MQPR:$val2)), tGPREven:$Rd)), (i32 (MVE_VMLADAVas8 tGPREven:$Rd, (v16i8 MQPR:$val1), (v16i8 MQPR:$val2)))>; def : Pat<(i32 (add (ARMVMLAVu (v16i8 MQPR:$val1), (v16i8 MQPR:$val2)), tGPREven:$Rd)), (i32 (MVE_VMLADAVau8 tGPREven:$Rd, (v16i8 MQPR:$val1), (v16i8 MQPR:$val2)))>; - - // Predicated - def : Pat<(i32 (vecreduce_add (vselect (v4i1 VCCR:$pred), - (mul (v4i32 MQPR:$src1), (v4i32 MQPR:$src2)), - (v4i32 ARMimmAllZerosV)))), - (i32 (MVE_VMLADAVu32 $src1, $src2, ARMVCCThen, $pred))>; - def : Pat<(i32 (vecreduce_add (vselect (v8i1 VCCR:$pred), - (mul (v8i16 MQPR:$src1), (v8i16 MQPR:$src2)), - (v8i16 ARMimmAllZerosV)))), - (i32 (MVE_VMLADAVu16 $src1, $src2, ARMVCCThen, $pred))>; - def : Pat<(i32 (ARMVMLAVps (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred))), - (i32 (MVE_VMLADAVs16 (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred))>; - def : Pat<(i32 (ARMVMLAVpu (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred))), - (i32 (MVE_VMLADAVu16 (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred))>; - def : Pat<(i32 (vecreduce_add (vselect (v16i1 VCCR:$pred), - (mul (v16i8 MQPR:$src1), (v16i8 MQPR:$src2)), - (v16i8 ARMimmAllZerosV)))), - (i32 (MVE_VMLADAVu8 $src1, $src2, ARMVCCThen, $pred))>; - def : Pat<(i32 (ARMVMLAVps (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), (v16i1 VCCR:$pred))), - (i32 (MVE_VMLADAVs8 (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), ARMVCCThen, $pred))>; - def : Pat<(i32 (ARMVMLAVpu (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), (v16i1 VCCR:$pred))), - (i32 (MVE_VMLADAVu8 (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), ARMVCCThen, $pred))>; - - def : Pat<(i32 (add (i32 (vecreduce_add (vselect (v4i1 VCCR:$pred), - (mul (v4i32 MQPR:$src1), (v4i32 MQPR:$src2)), - (v4i32 ARMimmAllZerosV)))), - (i32 tGPREven:$src3))), - (i32 (MVE_VMLADAVau32 $src3, $src1, $src2, ARMVCCThen, $pred))>; - def : Pat<(i32 (add (i32 (vecreduce_add (vselect (v8i1 VCCR:$pred), - (mul (v8i16 MQPR:$src1), (v8i16 MQPR:$src2)), - (v8i16 ARMimmAllZerosV)))), - (i32 tGPREven:$src3))), - (i32 (MVE_VMLADAVau16 $src3, $src1, $src2, ARMVCCThen, $pred))>; - def : Pat<(i32 (add (ARMVMLAVps (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred)), tGPREven:$Rd)), - (i32 (MVE_VMLADAVas16 tGPREven:$Rd, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred))>; - def : Pat<(i32 (add (ARMVMLAVpu (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred)), tGPREven:$Rd)), - (i32 (MVE_VMLADAVau16 tGPREven:$Rd, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred))>; - def : Pat<(i32 (add (i32 (vecreduce_add (vselect (v16i1 VCCR:$pred), - (mul (v16i8 MQPR:$src1), (v16i8 MQPR:$src2)), - (v16i8 ARMimmAllZerosV)))), - (i32 tGPREven:$src3))), - (i32 (MVE_VMLADAVau8 $src3, $src1, $src2, ARMVCCThen, $pred))>; - def : Pat<(i32 (add (ARMVMLAVps (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), (v16i1 VCCR:$pred)), tGPREven:$Rd)), - (i32 (MVE_VMLADAVas8 tGPREven:$Rd, (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), ARMVCCThen, $pred))>; - def : Pat<(i32 (add (ARMVMLAVpu (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), (v16i1 VCCR:$pred)), tGPREven:$Rd)), - (i32 (MVE_VMLADAVau8 tGPREven:$Rd, (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), ARMVCCThen, $pred))>; + + // Predicated + def : Pat<(i32 (vecreduce_add (vselect (v4i1 VCCR:$pred), + (mul (v4i32 MQPR:$src1), (v4i32 MQPR:$src2)), + (v4i32 ARMimmAllZerosV)))), + (i32 (MVE_VMLADAVu32 $src1, $src2, ARMVCCThen, $pred))>; + def : Pat<(i32 (vecreduce_add (vselect (v8i1 VCCR:$pred), + (mul (v8i16 MQPR:$src1), (v8i16 MQPR:$src2)), + (v8i16 ARMimmAllZerosV)))), + (i32 (MVE_VMLADAVu16 $src1, $src2, ARMVCCThen, $pred))>; + def : Pat<(i32 (ARMVMLAVps (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred))), + (i32 (MVE_VMLADAVs16 (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred))>; + def : Pat<(i32 (ARMVMLAVpu (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred))), + (i32 (MVE_VMLADAVu16 (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred))>; + def : Pat<(i32 (vecreduce_add (vselect (v16i1 VCCR:$pred), + (mul (v16i8 MQPR:$src1), (v16i8 MQPR:$src2)), + (v16i8 ARMimmAllZerosV)))), + (i32 (MVE_VMLADAVu8 $src1, $src2, ARMVCCThen, $pred))>; + def : Pat<(i32 (ARMVMLAVps (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), (v16i1 VCCR:$pred))), + (i32 (MVE_VMLADAVs8 (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), ARMVCCThen, $pred))>; + def : Pat<(i32 (ARMVMLAVpu (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), (v16i1 VCCR:$pred))), + (i32 (MVE_VMLADAVu8 (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), ARMVCCThen, $pred))>; + + def : Pat<(i32 (add (i32 (vecreduce_add (vselect (v4i1 VCCR:$pred), + (mul (v4i32 MQPR:$src1), (v4i32 MQPR:$src2)), + (v4i32 ARMimmAllZerosV)))), + (i32 tGPREven:$src3))), + (i32 (MVE_VMLADAVau32 $src3, $src1, $src2, ARMVCCThen, $pred))>; + def : Pat<(i32 (add (i32 (vecreduce_add (vselect (v8i1 VCCR:$pred), + (mul (v8i16 MQPR:$src1), (v8i16 MQPR:$src2)), + (v8i16 ARMimmAllZerosV)))), + (i32 tGPREven:$src3))), + (i32 (MVE_VMLADAVau16 $src3, $src1, $src2, ARMVCCThen, $pred))>; + def : Pat<(i32 (add (ARMVMLAVps (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred)), tGPREven:$Rd)), + (i32 (MVE_VMLADAVas16 tGPREven:$Rd, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred))>; + def : Pat<(i32 (add (ARMVMLAVpu (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred)), tGPREven:$Rd)), + (i32 (MVE_VMLADAVau16 tGPREven:$Rd, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred))>; + def : Pat<(i32 (add (i32 (vecreduce_add (vselect (v16i1 VCCR:$pred), + (mul (v16i8 MQPR:$src1), (v16i8 MQPR:$src2)), + (v16i8 ARMimmAllZerosV)))), + (i32 tGPREven:$src3))), + (i32 (MVE_VMLADAVau8 $src3, $src1, $src2, ARMVCCThen, $pred))>; + def : Pat<(i32 (add (ARMVMLAVps (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), (v16i1 VCCR:$pred)), tGPREven:$Rd)), + (i32 (MVE_VMLADAVas8 tGPREven:$Rd, (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), ARMVCCThen, $pred))>; + def : Pat<(i32 (add (ARMVMLAVpu (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), (v16i1 VCCR:$pred)), tGPREven:$Rd)), + (i32 (MVE_VMLADAVau8 tGPREven:$Rd, (v16i8 MQPR:$val1), (v16i8 MQPR:$val2), ARMVCCThen, $pred))>; } // vmlav aliases vmladav @@ -1360,25 +1360,25 @@ let Predicates = [HasMVEInt] in { (MVE_VMLALDAVas16 tGPREven:$Rda, tGPROdd:$Rdb, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2))>; def : Pat<(ARMVMLALVAu tGPREven:$Rda, tGPROdd:$Rdb, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2)), (MVE_VMLALDAVau16 tGPREven:$Rda, tGPROdd:$Rdb, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2))>; - - // Predicated - def : Pat<(ARMVMLALVps (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), (v4i1 VCCR:$pred)), - (MVE_VMLALDAVs32 (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), ARMVCCThen, $pred)>; - def : Pat<(ARMVMLALVpu (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), (v4i1 VCCR:$pred)), - (MVE_VMLALDAVu32 (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), ARMVCCThen, $pred)>; - def : Pat<(ARMVMLALVps (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred)), - (MVE_VMLALDAVs16 (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred)>; - def : Pat<(ARMVMLALVpu (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred)), - (MVE_VMLALDAVu16 (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred)>; - - def : Pat<(ARMVMLALVAps tGPREven:$Rda, tGPROdd:$Rdb, (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), (v4i1 VCCR:$pred)), - (MVE_VMLALDAVas32 tGPREven:$Rda, tGPROdd:$Rdb, (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), ARMVCCThen, $pred)>; - def : Pat<(ARMVMLALVApu tGPREven:$Rda, tGPROdd:$Rdb, (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), (v4i1 VCCR:$pred)), - (MVE_VMLALDAVau32 tGPREven:$Rda, tGPROdd:$Rdb, (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), ARMVCCThen, $pred)>; - def : Pat<(ARMVMLALVAps tGPREven:$Rda, tGPROdd:$Rdb, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred)), - (MVE_VMLALDAVas16 tGPREven:$Rda, tGPROdd:$Rdb, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred)>; - def : Pat<(ARMVMLALVApu tGPREven:$Rda, tGPROdd:$Rdb, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred)), - (MVE_VMLALDAVau16 tGPREven:$Rda, tGPROdd:$Rdb, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred)>; + + // Predicated + def : Pat<(ARMVMLALVps (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), (v4i1 VCCR:$pred)), + (MVE_VMLALDAVs32 (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), ARMVCCThen, $pred)>; + def : Pat<(ARMVMLALVpu (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), (v4i1 VCCR:$pred)), + (MVE_VMLALDAVu32 (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), ARMVCCThen, $pred)>; + def : Pat<(ARMVMLALVps (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred)), + (MVE_VMLALDAVs16 (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred)>; + def : Pat<(ARMVMLALVpu (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred)), + (MVE_VMLALDAVu16 (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred)>; + + def : Pat<(ARMVMLALVAps tGPREven:$Rda, tGPROdd:$Rdb, (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), (v4i1 VCCR:$pred)), + (MVE_VMLALDAVas32 tGPREven:$Rda, tGPROdd:$Rdb, (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), ARMVCCThen, $pred)>; + def : Pat<(ARMVMLALVApu tGPREven:$Rda, tGPROdd:$Rdb, (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), (v4i1 VCCR:$pred)), + (MVE_VMLALDAVau32 tGPREven:$Rda, tGPROdd:$Rdb, (v4i32 MQPR:$val1), (v4i32 MQPR:$val2), ARMVCCThen, $pred)>; + def : Pat<(ARMVMLALVAps tGPREven:$Rda, tGPROdd:$Rdb, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred)), + (MVE_VMLALDAVas16 tGPREven:$Rda, tGPROdd:$Rdb, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred)>; + def : Pat<(ARMVMLALVApu tGPREven:$Rda, tGPROdd:$Rdb, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), (v8i1 VCCR:$pred)), + (MVE_VMLALDAVau16 tGPREven:$Rda, tGPROdd:$Rdb, (v8i16 MQPR:$val1), (v8i16 MQPR:$val2), ARMVCCThen, $pred)>; } // vmlalv aliases vmlaldav @@ -1426,7 +1426,7 @@ class MVE_comp<InstrItinClass itin, string iname, string suffix, } class MVE_VMINMAXNM<string iname, string suffix, bit sz, bit bit_21, - list<dag> pattern=[]> + list<dag> pattern=[]> : MVE_comp<NoItinerary, iname, suffix, "", pattern> { let Inst{28} = 0b1; @@ -1442,18 +1442,18 @@ class MVE_VMINMAXNM<string iname, string suffix, bit sz, bit bit_21, let Predicates = [HasMVEFloat]; } -multiclass MVE_VMINMAXNM_m<string iname, bit bit_4, MVEVectorVTInfo VTI, SDNode Op, Intrinsic PredInt> { - def "" : MVE_VMINMAXNM<iname, VTI.Suffix, VTI.Size{0}, bit_4>; +multiclass MVE_VMINMAXNM_m<string iname, bit bit_4, MVEVectorVTInfo VTI, SDNode Op, Intrinsic PredInt> { + def "" : MVE_VMINMAXNM<iname, VTI.Suffix, VTI.Size{0}, bit_4>; - let Predicates = [HasMVEFloat] in { - defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? (i32 0)), !cast<Instruction>(NAME)>; - } + let Predicates = [HasMVEFloat] in { + defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? (i32 0)), !cast<Instruction>(NAME)>; + } } -defm MVE_VMAXNMf32 : MVE_VMINMAXNM_m<"vmaxnm", 0b0, MVE_v4f32, fmaxnum, int_arm_mve_max_predicated>; -defm MVE_VMAXNMf16 : MVE_VMINMAXNM_m<"vmaxnm", 0b0, MVE_v8f16, fmaxnum, int_arm_mve_max_predicated>; -defm MVE_VMINNMf32 : MVE_VMINMAXNM_m<"vminnm", 0b1, MVE_v4f32, fminnum, int_arm_mve_min_predicated>; -defm MVE_VMINNMf16 : MVE_VMINMAXNM_m<"vminnm", 0b1, MVE_v8f16, fminnum, int_arm_mve_min_predicated>; +defm MVE_VMAXNMf32 : MVE_VMINMAXNM_m<"vmaxnm", 0b0, MVE_v4f32, fmaxnum, int_arm_mve_max_predicated>; +defm MVE_VMAXNMf16 : MVE_VMINMAXNM_m<"vmaxnm", 0b0, MVE_v8f16, fmaxnum, int_arm_mve_max_predicated>; +defm MVE_VMINNMf32 : MVE_VMINMAXNM_m<"vminnm", 0b1, MVE_v4f32, fminnum, int_arm_mve_min_predicated>; +defm MVE_VMINNMf16 : MVE_VMINMAXNM_m<"vminnm", 0b1, MVE_v8f16, fminnum, int_arm_mve_min_predicated>; class MVE_VMINMAX<string iname, string suffix, bit U, bits<2> size, @@ -1472,11 +1472,11 @@ class MVE_VMINMAX<string iname, string suffix, bit U, bits<2> size, } multiclass MVE_VMINMAX_m<string iname, bit bit_4, MVEVectorVTInfo VTI, - SDNode Op, Intrinsic PredInt> { + SDNode Op, Intrinsic PredInt> { def "" : MVE_VMINMAX<iname, VTI.Suffix, VTI.Unsigned, VTI.Size, bit_4>; let Predicates = [HasMVEInt] in { - defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? (i32 VTI.Unsigned)), !cast<Instruction>(NAME)>; + defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? (i32 VTI.Unsigned)), !cast<Instruction>(NAME)>; } } @@ -1649,39 +1649,39 @@ foreach s=["s8", "s16", "s32", "u8", "u16", "u32", "i8", "i16", "i32", "f16", "f (MVE_VAND MQPR:$QdSrc, MQPR:$QnSrc, MQPR:$QmSrc, vpred_r:$vp)>; } -let Predicates = [HasMVEInt] in { - defm : MVE_TwoOpPattern<MVE_v16i8, and, int_arm_mve_and_predicated, (? ), MVE_VAND, ARMimmAllOnesV>; - defm : MVE_TwoOpPattern<MVE_v8i16, and, int_arm_mve_and_predicated, (? ), MVE_VAND, ARMimmAllOnesV>; - defm : MVE_TwoOpPattern<MVE_v4i32, and, int_arm_mve_and_predicated, (? ), MVE_VAND, ARMimmAllOnesV>; - defm : MVE_TwoOpPattern<MVE_v2i64, and, int_arm_mve_and_predicated, (? ), MVE_VAND, ARMimmAllOnesV>; - - defm : MVE_TwoOpPattern<MVE_v16i8, or, int_arm_mve_orr_predicated, (? ), MVE_VORR, ARMimmAllZerosV>; - defm : MVE_TwoOpPattern<MVE_v8i16, or, int_arm_mve_orr_predicated, (? ), MVE_VORR, ARMimmAllZerosV>; - defm : MVE_TwoOpPattern<MVE_v4i32, or, int_arm_mve_orr_predicated, (? ), MVE_VORR, ARMimmAllZerosV>; - defm : MVE_TwoOpPattern<MVE_v2i64, or, int_arm_mve_orr_predicated, (? ), MVE_VORR, ARMimmAllZerosV>; - - defm : MVE_TwoOpPattern<MVE_v16i8, xor, int_arm_mve_eor_predicated, (? ), MVE_VEOR, ARMimmAllZerosV>; - defm : MVE_TwoOpPattern<MVE_v8i16, xor, int_arm_mve_eor_predicated, (? ), MVE_VEOR, ARMimmAllZerosV>; - defm : MVE_TwoOpPattern<MVE_v4i32, xor, int_arm_mve_eor_predicated, (? ), MVE_VEOR, ARMimmAllZerosV>; - defm : MVE_TwoOpPattern<MVE_v2i64, xor, int_arm_mve_eor_predicated, (? ), MVE_VEOR, ARMimmAllZerosV>; - - defm : MVE_TwoOpPattern<MVE_v16i8, BinOpFrag<(and node:$LHS, (vnotq node:$RHS))>, - int_arm_mve_bic_predicated, (? ), MVE_VBIC>; - defm : MVE_TwoOpPattern<MVE_v8i16, BinOpFrag<(and node:$LHS, (vnotq node:$RHS))>, - int_arm_mve_bic_predicated, (? ), MVE_VBIC>; - defm : MVE_TwoOpPattern<MVE_v4i32, BinOpFrag<(and node:$LHS, (vnotq node:$RHS))>, - int_arm_mve_bic_predicated, (? ), MVE_VBIC>; - defm : MVE_TwoOpPattern<MVE_v2i64, BinOpFrag<(and node:$LHS, (vnotq node:$RHS))>, - int_arm_mve_bic_predicated, (? ), MVE_VBIC>; - - defm : MVE_TwoOpPattern<MVE_v16i8, BinOpFrag<(or node:$LHS, (vnotq node:$RHS))>, - int_arm_mve_orn_predicated, (? ), MVE_VORN>; - defm : MVE_TwoOpPattern<MVE_v8i16, BinOpFrag<(or node:$LHS, (vnotq node:$RHS))>, - int_arm_mve_orn_predicated, (? ), MVE_VORN>; - defm : MVE_TwoOpPattern<MVE_v4i32, BinOpFrag<(or node:$LHS, (vnotq node:$RHS))>, - int_arm_mve_orn_predicated, (? ), MVE_VORN>; - defm : MVE_TwoOpPattern<MVE_v2i64, BinOpFrag<(or node:$LHS, (vnotq node:$RHS))>, - int_arm_mve_orn_predicated, (? ), MVE_VORN>; +let Predicates = [HasMVEInt] in { + defm : MVE_TwoOpPattern<MVE_v16i8, and, int_arm_mve_and_predicated, (? ), MVE_VAND, ARMimmAllOnesV>; + defm : MVE_TwoOpPattern<MVE_v8i16, and, int_arm_mve_and_predicated, (? ), MVE_VAND, ARMimmAllOnesV>; + defm : MVE_TwoOpPattern<MVE_v4i32, and, int_arm_mve_and_predicated, (? ), MVE_VAND, ARMimmAllOnesV>; + defm : MVE_TwoOpPattern<MVE_v2i64, and, int_arm_mve_and_predicated, (? ), MVE_VAND, ARMimmAllOnesV>; + + defm : MVE_TwoOpPattern<MVE_v16i8, or, int_arm_mve_orr_predicated, (? ), MVE_VORR, ARMimmAllZerosV>; + defm : MVE_TwoOpPattern<MVE_v8i16, or, int_arm_mve_orr_predicated, (? ), MVE_VORR, ARMimmAllZerosV>; + defm : MVE_TwoOpPattern<MVE_v4i32, or, int_arm_mve_orr_predicated, (? ), MVE_VORR, ARMimmAllZerosV>; + defm : MVE_TwoOpPattern<MVE_v2i64, or, int_arm_mve_orr_predicated, (? ), MVE_VORR, ARMimmAllZerosV>; + + defm : MVE_TwoOpPattern<MVE_v16i8, xor, int_arm_mve_eor_predicated, (? ), MVE_VEOR, ARMimmAllZerosV>; + defm : MVE_TwoOpPattern<MVE_v8i16, xor, int_arm_mve_eor_predicated, (? ), MVE_VEOR, ARMimmAllZerosV>; + defm : MVE_TwoOpPattern<MVE_v4i32, xor, int_arm_mve_eor_predicated, (? ), MVE_VEOR, ARMimmAllZerosV>; + defm : MVE_TwoOpPattern<MVE_v2i64, xor, int_arm_mve_eor_predicated, (? ), MVE_VEOR, ARMimmAllZerosV>; + + defm : MVE_TwoOpPattern<MVE_v16i8, BinOpFrag<(and node:$LHS, (vnotq node:$RHS))>, + int_arm_mve_bic_predicated, (? ), MVE_VBIC>; + defm : MVE_TwoOpPattern<MVE_v8i16, BinOpFrag<(and node:$LHS, (vnotq node:$RHS))>, + int_arm_mve_bic_predicated, (? ), MVE_VBIC>; + defm : MVE_TwoOpPattern<MVE_v4i32, BinOpFrag<(and node:$LHS, (vnotq node:$RHS))>, + int_arm_mve_bic_predicated, (? ), MVE_VBIC>; + defm : MVE_TwoOpPattern<MVE_v2i64, BinOpFrag<(and node:$LHS, (vnotq node:$RHS))>, + int_arm_mve_bic_predicated, (? ), MVE_VBIC>; + + defm : MVE_TwoOpPattern<MVE_v16i8, BinOpFrag<(or node:$LHS, (vnotq node:$RHS))>, + int_arm_mve_orn_predicated, (? ), MVE_VORN>; + defm : MVE_TwoOpPattern<MVE_v8i16, BinOpFrag<(or node:$LHS, (vnotq node:$RHS))>, + int_arm_mve_orn_predicated, (? ), MVE_VORN>; + defm : MVE_TwoOpPattern<MVE_v4i32, BinOpFrag<(or node:$LHS, (vnotq node:$RHS))>, + int_arm_mve_orn_predicated, (? ), MVE_VORN>; + defm : MVE_TwoOpPattern<MVE_v2i64, BinOpFrag<(or node:$LHS, (vnotq node:$RHS))>, + int_arm_mve_orn_predicated, (? ), MVE_VORN>; } class MVE_bit_cmode<string iname, string suffix, bit halfword, dag inOps> @@ -1718,8 +1718,8 @@ multiclass MVE_bit_cmode_p<string iname, bit opcode, defvar UnpredPat = (VTI.Vec (op (VTI.Vec MQPR:$src), timm:$simm)); let Predicates = [HasMVEInt] in { - def : Pat<UnpredPat, - (VTI.Vec (Inst (VTI.Vec MQPR:$src), imm_type:$simm))>; + def : Pat<UnpredPat, + (VTI.Vec (Inst (VTI.Vec MQPR:$src), imm_type:$simm))>; def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$pred), UnpredPat, (VTI.Vec MQPR:$src))), (VTI.Vec (Inst (VTI.Vec MQPR:$src), imm_type:$simm, @@ -1929,18 +1929,18 @@ class MVE_VMULt1<string iname, string suffix, bits<2> size, let validForTailPredication = 1; } -multiclass MVE_VMUL_m<MVEVectorVTInfo VTI> { - def "" : MVE_VMULt1<"vmul", VTI.Suffix, VTI.Size>; +multiclass MVE_VMUL_m<MVEVectorVTInfo VTI> { + def "" : MVE_VMULt1<"vmul", VTI.Suffix, VTI.Size>; let Predicates = [HasMVEInt] in { - defm : MVE_TwoOpPattern<VTI, mul, int_arm_mve_mul_predicated, (? ), - !cast<Instruction>(NAME), ARMimmOneV>; + defm : MVE_TwoOpPattern<VTI, mul, int_arm_mve_mul_predicated, (? ), + !cast<Instruction>(NAME), ARMimmOneV>; } } -defm MVE_VMULi8 : MVE_VMUL_m<MVE_v16i8>; -defm MVE_VMULi16 : MVE_VMUL_m<MVE_v8i16>; -defm MVE_VMULi32 : MVE_VMUL_m<MVE_v4i32>; +defm MVE_VMULi8 : MVE_VMUL_m<MVE_v16i8>; +defm MVE_VMULi16 : MVE_VMUL_m<MVE_v8i16>; +defm MVE_VMULi32 : MVE_VMUL_m<MVE_v4i32>; class MVE_VQxDMULH_Base<string iname, string suffix, bits<2> size, bit rounding, list<dag> pattern=[]> @@ -1952,30 +1952,30 @@ class MVE_VQxDMULH_Base<string iname, string suffix, bits<2> size, bit rounding, let Inst{12-8} = 0b01011; let Inst{4} = 0b0; let Inst{0} = 0b0; - let validForTailPredication = 1; + let validForTailPredication = 1; } -def MVEvqdmulh : SDNode<"ARMISD::VQDMULH", SDTIntBinOp>; - +def MVEvqdmulh : SDNode<"ARMISD::VQDMULH", SDTIntBinOp>; + multiclass MVE_VQxDMULH_m<string iname, MVEVectorVTInfo VTI, - SDNode Op, Intrinsic unpred_int, Intrinsic pred_int, + SDNode Op, Intrinsic unpred_int, Intrinsic pred_int, bit rounding> { def "" : MVE_VQxDMULH_Base<iname, VTI.Suffix, VTI.Size, rounding>; defvar Inst = !cast<Instruction>(NAME); let Predicates = [HasMVEInt] in { - defm : MVE_TwoOpPattern<VTI, Op, pred_int, (? ), Inst>; - - // Extra unpredicated multiply intrinsic patterns - def : Pat<(VTI.Vec (unpred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn))), + defm : MVE_TwoOpPattern<VTI, Op, pred_int, (? ), Inst>; + + // Extra unpredicated multiply intrinsic patterns + def : Pat<(VTI.Vec (unpred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn))), (VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>; } } multiclass MVE_VQxDMULH<string iname, MVEVectorVTInfo VTI, bit rounding> - : MVE_VQxDMULH_m<iname, VTI, !if(rounding, null_frag, - MVEvqdmulh), - !if(rounding, int_arm_mve_vqrdmulh, + : MVE_VQxDMULH_m<iname, VTI, !if(rounding, null_frag, + MVEvqdmulh), + !if(rounding, int_arm_mve_vqrdmulh, int_arm_mve_vqdmulh), !if(rounding, int_arm_mve_qrdmulh_predicated, int_arm_mve_qdmulh_predicated), @@ -2003,12 +2003,12 @@ class MVE_VADDSUB<string iname, string suffix, bits<2> size, bit subtract, } multiclass MVE_VADDSUB_m<string iname, MVEVectorVTInfo VTI, bit subtract, - SDNode Op, Intrinsic PredInt> { + SDNode Op, Intrinsic PredInt> { def "" : MVE_VADDSUB<iname, VTI.Suffix, VTI.Size, subtract>; defvar Inst = !cast<Instruction>(NAME); let Predicates = [HasMVEInt] in { - defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? ), !cast<Instruction>(NAME), ARMimmAllZerosV>; + defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? ), !cast<Instruction>(NAME), ARMimmAllZerosV>; } } @@ -2046,13 +2046,13 @@ class MVE_VQSUB_<string suffix, bit U, bits<2> size> : MVE_VQADDSUB<"vqsub", suffix, U, 0b1, size>; multiclass MVE_VQADD_m<MVEVectorVTInfo VTI, - SDNode Op, Intrinsic PredInt> { + SDNode Op, Intrinsic PredInt> { def "" : MVE_VQADD_<VTI.Suffix, VTI.Unsigned, VTI.Size>; defvar Inst = !cast<Instruction>(NAME); let Predicates = [HasMVEInt] in { - defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? (i32 VTI.Unsigned)), - !cast<Instruction>(NAME)>; + defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? (i32 VTI.Unsigned)), + !cast<Instruction>(NAME)>; } } @@ -2067,13 +2067,13 @@ defm MVE_VQADDu16 : MVE_VQADD<MVE_v8u16, uaddsat>; defm MVE_VQADDu32 : MVE_VQADD<MVE_v4u32, uaddsat>; multiclass MVE_VQSUB_m<MVEVectorVTInfo VTI, - SDNode Op, Intrinsic PredInt> { + SDNode Op, Intrinsic PredInt> { def "" : MVE_VQSUB_<VTI.Suffix, VTI.Unsigned, VTI.Size>; defvar Inst = !cast<Instruction>(NAME); let Predicates = [HasMVEInt] in { - defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? (i32 VTI.Unsigned)), - !cast<Instruction>(NAME)>; + defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? (i32 VTI.Unsigned)), + !cast<Instruction>(NAME)>; } } @@ -2199,32 +2199,32 @@ defm MVE_VRHADDu32 : MVE_VRHADD<MVE_v4u32>; // modelling that here with these patterns, but we're using no wrap forms of // add to ensure that the extra bit of information is not needed for the // arithmetic or the rounding. -let Predicates = [HasMVEInt] in { - def : Pat<(v16i8 (ARMvshrsImm (addnsw (addnsw (v16i8 MQPR:$Qm), (v16i8 MQPR:$Qn)), - (v16i8 (ARMvmovImm (i32 3585)))), - (i32 1))), - (MVE_VRHADDs8 MQPR:$Qm, MQPR:$Qn)>; - def : Pat<(v8i16 (ARMvshrsImm (addnsw (addnsw (v8i16 MQPR:$Qm), (v8i16 MQPR:$Qn)), - (v8i16 (ARMvmovImm (i32 2049)))), - (i32 1))), - (MVE_VRHADDs16 MQPR:$Qm, MQPR:$Qn)>; - def : Pat<(v4i32 (ARMvshrsImm (addnsw (addnsw (v4i32 MQPR:$Qm), (v4i32 MQPR:$Qn)), - (v4i32 (ARMvmovImm (i32 1)))), - (i32 1))), - (MVE_VRHADDs32 MQPR:$Qm, MQPR:$Qn)>; - def : Pat<(v16i8 (ARMvshruImm (addnuw (addnuw (v16i8 MQPR:$Qm), (v16i8 MQPR:$Qn)), - (v16i8 (ARMvmovImm (i32 3585)))), - (i32 1))), - (MVE_VRHADDu8 MQPR:$Qm, MQPR:$Qn)>; - def : Pat<(v8i16 (ARMvshruImm (addnuw (addnuw (v8i16 MQPR:$Qm), (v8i16 MQPR:$Qn)), - (v8i16 (ARMvmovImm (i32 2049)))), - (i32 1))), - (MVE_VRHADDu16 MQPR:$Qm, MQPR:$Qn)>; - def : Pat<(v4i32 (ARMvshruImm (addnuw (addnuw (v4i32 MQPR:$Qm), (v4i32 MQPR:$Qn)), - (v4i32 (ARMvmovImm (i32 1)))), - (i32 1))), - (MVE_VRHADDu32 MQPR:$Qm, MQPR:$Qn)>; -} +let Predicates = [HasMVEInt] in { + def : Pat<(v16i8 (ARMvshrsImm (addnsw (addnsw (v16i8 MQPR:$Qm), (v16i8 MQPR:$Qn)), + (v16i8 (ARMvmovImm (i32 3585)))), + (i32 1))), + (MVE_VRHADDs8 MQPR:$Qm, MQPR:$Qn)>; + def : Pat<(v8i16 (ARMvshrsImm (addnsw (addnsw (v8i16 MQPR:$Qm), (v8i16 MQPR:$Qn)), + (v8i16 (ARMvmovImm (i32 2049)))), + (i32 1))), + (MVE_VRHADDs16 MQPR:$Qm, MQPR:$Qn)>; + def : Pat<(v4i32 (ARMvshrsImm (addnsw (addnsw (v4i32 MQPR:$Qm), (v4i32 MQPR:$Qn)), + (v4i32 (ARMvmovImm (i32 1)))), + (i32 1))), + (MVE_VRHADDs32 MQPR:$Qm, MQPR:$Qn)>; + def : Pat<(v16i8 (ARMvshruImm (addnuw (addnuw (v16i8 MQPR:$Qm), (v16i8 MQPR:$Qn)), + (v16i8 (ARMvmovImm (i32 3585)))), + (i32 1))), + (MVE_VRHADDu8 MQPR:$Qm, MQPR:$Qn)>; + def : Pat<(v8i16 (ARMvshruImm (addnuw (addnuw (v8i16 MQPR:$Qm), (v8i16 MQPR:$Qn)), + (v8i16 (ARMvmovImm (i32 2049)))), + (i32 1))), + (MVE_VRHADDu16 MQPR:$Qm, MQPR:$Qn)>; + def : Pat<(v4i32 (ARMvshruImm (addnuw (addnuw (v4i32 MQPR:$Qm), (v4i32 MQPR:$Qn)), + (v4i32 (ARMvmovImm (i32 1)))), + (i32 1))), + (MVE_VRHADDu32 MQPR:$Qm, MQPR:$Qn)>; +} class MVE_VHADDSUB<string iname, string suffix, bit U, bit subtract, @@ -2473,9 +2473,9 @@ multiclass MVE_VABSNEG_int_m<string iname, bit negate, bit saturate, let Predicates = [HasMVEInt] in { // VQABS and VQNEG have more difficult isel patterns defined elsewhere - if !not(saturate) then { - def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$v))), - (VTI.Vec (Inst $v))>; + if !not(saturate) then { + def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$v))), + (VTI.Vec (Inst $v))>; } def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$v), (VTI.Pred VCCR:$mask), @@ -3032,7 +3032,7 @@ multiclass MVE_VSHRN_patterns<MVE_shift_imm_partial inst, defvar outparams = (inst (OutVTI.Vec MQPR:$QdSrc), (InVTI.Vec MQPR:$Qm), (imm:$imm)); - def : Pat<(OutVTI.Vec !setdagop(inparams, int_arm_mve_vshrn)), + def : Pat<(OutVTI.Vec !setdagop(inparams, int_arm_mve_vshrn)), (OutVTI.Vec outparams)>; def : Pat<(OutVTI.Vec !con(inparams, (int_arm_mve_vshrn_predicated (InVTI.Pred VCCR:$pred)))), @@ -3234,7 +3234,7 @@ multiclass MVE_VSxI_patterns<MVE_VSxI_imm inst, string name, defvar unpred_int = !cast<Intrinsic>("int_arm_mve_" # name); defvar pred_int = !cast<Intrinsic>("int_arm_mve_" # name # "_predicated"); - def : Pat<(VTI.Vec !setdagop(inparams, unpred_int)), + def : Pat<(VTI.Vec !setdagop(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)))>; @@ -3586,12 +3586,12 @@ class MVE_VMUL_fp<string iname, string suffix, bit size, list<dag> pattern=[]> } multiclass MVE_VMULT_fp_m<string iname, bit bit_21, MVEVectorVTInfo VTI, - SDNode Op, Intrinsic PredInt> { + SDNode Op, Intrinsic PredInt> { def "" : MVE_VMUL_fp<iname, VTI.Suffix, VTI.Size{0}>; defvar Inst = !cast<Instruction>(NAME); let Predicates = [HasMVEFloat] in { - defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? ), !cast<Instruction>(NAME)>; + defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? ), !cast<Instruction>(NAME)>; } } @@ -3682,23 +3682,23 @@ multiclass MVE_VFMA_fp_multi<string iname, bit fms, MVEVectorVTInfo VTI> { let Predicates = [HasMVEFloat] in { if fms then { - def : Pat<(VTI.Vec (fma (fneg m1), m2, add)), - (Inst $add, $m1, $m2)>; - def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$pred), - (VTI.Vec (fma (fneg m1), m2, add)), - add)), - (Inst $add, $m1, $m2, ARMVCCThen, $pred)>; + def : Pat<(VTI.Vec (fma (fneg m1), m2, add)), + (Inst $add, $m1, $m2)>; + def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$pred), + (VTI.Vec (fma (fneg m1), m2, add)), + add)), + (Inst $add, $m1, $m2, ARMVCCThen, $pred)>; def : Pat<(VTI.Vec (pred_int (fneg m1), m2, add, pred)), (Inst $add, $m1, $m2, ARMVCCThen, $pred)>; def : Pat<(VTI.Vec (pred_int m1, (fneg m2), add, pred)), (Inst $add, $m1, $m2, ARMVCCThen, $pred)>; } else { - def : Pat<(VTI.Vec (fma m1, m2, add)), - (Inst $add, $m1, $m2)>; - def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$pred), - (VTI.Vec (fma m1, m2, add)), - add)), - (Inst $add, $m1, $m2, ARMVCCThen, $pred)>; + def : Pat<(VTI.Vec (fma m1, m2, add)), + (Inst $add, $m1, $m2)>; + def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$pred), + (VTI.Vec (fma m1, m2, add)), + add)), + (Inst $add, $m1, $m2, ARMVCCThen, $pred)>; def : Pat<(VTI.Vec (pred_int m1, m2, add, pred)), (Inst $add, $m1, $m2, ARMVCCThen, $pred)>; } @@ -3711,14 +3711,14 @@ defm MVE_VFMSf32 : MVE_VFMA_fp_multi<"vfms", 1, MVE_v4f32>; defm MVE_VFMSf16 : MVE_VFMA_fp_multi<"vfms", 1, MVE_v8f16>; multiclass MVE_VADDSUB_fp_m<string iname, bit bit_21, MVEVectorVTInfo VTI, - SDNode Op, Intrinsic PredInt> { + SDNode Op, Intrinsic PredInt> { def "" : MVE_VADDSUBFMA_fp<iname, VTI.Suffix, VTI.Size{0}, 0, 1, bit_21> { let validForTailPredication = 1; } defvar Inst = !cast<Instruction>(NAME); let Predicates = [HasMVEFloat] in { - defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? ), !cast<Instruction>(NAME)>; + defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? ), !cast<Instruction>(NAME)>; } } @@ -3820,15 +3820,15 @@ multiclass MVE_VABD_fp_m<MVEVectorVTInfo VTI> : MVE_VABDT_fp_m<VTI, int_arm_mve_vabd, int_arm_mve_abd_predicated>; defm MVE_VABDf32 : MVE_VABD_fp_m<MVE_v4f32>; -defm MVE_VABDf16 : MVE_VABD_fp_m<MVE_v8f16>; - -let Predicates = [HasMVEFloat] in { - def : Pat<(v8f16 (fabs (fsub (v8f16 MQPR:$Qm), (v8f16 MQPR:$Qn)))), - (MVE_VABDf16 MQPR:$Qm, MQPR:$Qn)>; - def : Pat<(v4f32 (fabs (fsub (v4f32 MQPR:$Qm), (v4f32 MQPR:$Qn)))), - (MVE_VABDf32 MQPR:$Qm, MQPR:$Qn)>; -} - +defm MVE_VABDf16 : MVE_VABD_fp_m<MVE_v8f16>; + +let Predicates = [HasMVEFloat] in { + def : Pat<(v8f16 (fabs (fsub (v8f16 MQPR:$Qm), (v8f16 MQPR:$Qn)))), + (MVE_VABDf16 MQPR:$Qm, MQPR:$Qn)>; + def : Pat<(v4f32 (fabs (fsub (v4f32 MQPR:$Qm), (v4f32 MQPR:$Qn)))), + (MVE_VABDf32 MQPR:$Qm, MQPR:$Qn)>; +} + class MVE_VCVT_fix<string suffix, bit fsi, bit U, bit op, Operand imm_operand_type> : MVE_float<"vcvt", suffix, @@ -4047,8 +4047,8 @@ multiclass MVE_VABSNEG_fp_m<string iname, SDNode unpred_op, Intrinsic pred_int, defvar Inst = !cast<Instruction>(NAME); let Predicates = [HasMVEInt] in { - def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$v))), - (VTI.Vec (Inst $v))>; + def : Pat<(VTI.Vec (unpred_op (VTI.Vec MQPR:$v))), + (VTI.Vec (Inst $v))>; def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$v), (VTI.Pred VCCR:$mask), (VTI.Vec MQPR:$inactive))), (VTI.Vec (Inst $v, ARMVCCThen, $mask, $inactive))>; @@ -4083,8 +4083,8 @@ class MVE_VMAXMINNMA<string iname, string suffix, bit size, bit bit_12, let Inst{4} = 0b0; let Inst{3-1} = Qm{2-0}; let Inst{0} = 0b1; - - let isCommutable = 1; + + let isCommutable = 1; } multiclass MVE_VMAXMINNMA_m<string iname, MVEVectorVTInfo VTI, @@ -4410,10 +4410,10 @@ let Predicates = [HasMVEInt] in { // vector types (v4i1<>v8i1, etc.) also as part of lowering vector shuffles. def predicate_cast : SDNode<"ARMISD::PREDICATE_CAST", SDTUnaryOp>; -def load_align4 : PatFrag<(ops node:$ptr), (load node:$ptr), [{ - return cast<LoadSDNode>(N)->getAlignment() >= 4; -}]>; - +def load_align4 : PatFrag<(ops node:$ptr), (load node:$ptr), [{ + return cast<LoadSDNode>(N)->getAlignment() >= 4; +}]>; + let Predicates = [HasMVEInt] in { foreach VT = [ v4i1, v8i1, v16i1 ] in { def : Pat<(i32 (predicate_cast (VT VCCR:$src))), @@ -4426,13 +4426,13 @@ let Predicates = [HasMVEInt] in { (VT (COPY_TO_REGCLASS (VT2 VCCR:$src), VCCR))>; } - // If we happen to be casting from a load we can convert that straight - // into a predicate load, so long as the load is of the correct type. - foreach VT = [ v4i1, v8i1, v16i1 ] in { - def : Pat<(VT (predicate_cast (i32 (load_align4 taddrmode_imm7<2>:$addr)))), - (VT (VLDR_P0_off taddrmode_imm7<2>:$addr))>; - } - + // If we happen to be casting from a load we can convert that straight + // into a predicate load, so long as the load is of the correct type. + foreach VT = [ v4i1, v8i1, v16i1 ] in { + def : Pat<(VT (predicate_cast (i32 (load_align4 taddrmode_imm7<2>:$addr)))), + (VT (VLDR_P0_off taddrmode_imm7<2>:$addr))>; + } + // Here we match the specific SDNode type 'ARMVectorRegCastImpl' // rather than the more general 'ARMVectorRegCast' which would also // match some bitconverts. If we use the latter in cases where the @@ -4441,8 +4441,8 @@ let Predicates = [HasMVEInt] in { foreach VT = [ v16i8, v8i16, v8f16, v4i32, v4f32, v2i64, v2f64 ] in foreach VT2 = [ v16i8, v8i16, v8f16, v4i32, v4f32, v2i64, v2f64 ] in - def : Pat<(VT (ARMVectorRegCastImpl (VT2 MQPR:$src))), - (VT MQPR:$src)>; + def : Pat<(VT (ARMVectorRegCastImpl (VT2 MQPR:$src))), + (VT MQPR:$src)>; } // end of MVE compares @@ -4770,7 +4770,7 @@ class MVE_VxMOVxN<string iname, string suffix, bit bit_28, bit bit_17, let Inst{16} = 0b1; let Inst{12} = T; let Inst{8} = 0b0; - let Inst{7} = !not(bit_17); + let Inst{7} = !not(bit_17); let Inst{0} = 0b1; let validForTailPredication = 1; let retainsPreviousHalfElement = 1; @@ -4801,7 +4801,7 @@ multiclass MVE_VMOVN_p<Instruction Inst, bit top, (VTI.Vec MQPR:$Qm), (i32 top))), (VTI.Vec (Inst (VTI.Vec MQPR:$Qd_src), (VTI.Vec MQPR:$Qm)))>; - if !not(top) then { + if !not(top) then { // If we see MVEvmovn(a,ARMvrev(b),1), that wants to overwrite the odd // lanes of a with the odd lanes of b. In other words, the lanes we're // _keeping_ from a are the even ones. So we can flip it round and say that @@ -5173,11 +5173,11 @@ class MVE_VADDSUB_qr<string iname, string suffix, bits<2> size, // Vector-scalar add/sub multiclass MVE_VADDSUB_qr_m<string iname, MVEVectorVTInfo VTI, bit subtract, - SDNode Op, Intrinsic PredInt> { + SDNode Op, Intrinsic PredInt> { def "" : MVE_VADDSUB_qr<iname, VTI.Suffix, VTI.Size, 0b0, subtract, 0b1, 0b0>; - let Predicates = [HasMVEInt] in { - defm : MVE_TwoOpPatternDup<VTI, Op, PredInt, (? ), !cast<Instruction>(NAME), ARMimmAllZerosV>; - } + let Predicates = [HasMVEInt] in { + defm : MVE_TwoOpPatternDup<VTI, Op, PredInt, (? ), !cast<Instruction>(NAME), ARMimmAllZerosV>; + } } multiclass MVE_VADD_qr_m<MVEVectorVTInfo VTI> @@ -5196,35 +5196,35 @@ defm MVE_VSUB_qr_i32 : MVE_VSUB_qr_m<MVE_v4i32>; // Vector-scalar saturating add/sub multiclass MVE_VQADDSUB_qr_m<string iname, MVEVectorVTInfo VTI, bit subtract, - SDNode Op, Intrinsic PredInt> { + SDNode Op, Intrinsic PredInt> { def "" : MVE_VADDSUB_qr<iname, VTI.Suffix, VTI.Size, 0b1, subtract, 0b0, VTI.Unsigned>; - - let Predicates = [HasMVEInt] in { - defm : MVE_TwoOpPatternDup<VTI, Op, PredInt, (? (i32 VTI.Unsigned)), - !cast<Instruction>(NAME)>; - } + + let Predicates = [HasMVEInt] in { + defm : MVE_TwoOpPatternDup<VTI, Op, PredInt, (? (i32 VTI.Unsigned)), + !cast<Instruction>(NAME)>; + } } -multiclass MVE_VQADD_qr_m<MVEVectorVTInfo VTI, SDNode Op> - : MVE_VQADDSUB_qr_m<"vqadd", VTI, 0b0, Op, int_arm_mve_qadd_predicated>; +multiclass MVE_VQADD_qr_m<MVEVectorVTInfo VTI, SDNode Op> + : MVE_VQADDSUB_qr_m<"vqadd", VTI, 0b0, Op, int_arm_mve_qadd_predicated>; -multiclass MVE_VQSUB_qr_m<MVEVectorVTInfo VTI, SDNode Op> - : MVE_VQADDSUB_qr_m<"vqsub", VTI, 0b1, Op, int_arm_mve_qsub_predicated>; +multiclass MVE_VQSUB_qr_m<MVEVectorVTInfo VTI, SDNode Op> + : MVE_VQADDSUB_qr_m<"vqsub", VTI, 0b1, Op, int_arm_mve_qsub_predicated>; -defm MVE_VQADD_qr_s8 : MVE_VQADD_qr_m<MVE_v16s8, saddsat>; -defm MVE_VQADD_qr_s16 : MVE_VQADD_qr_m<MVE_v8s16, saddsat>; -defm MVE_VQADD_qr_s32 : MVE_VQADD_qr_m<MVE_v4s32, saddsat>; -defm MVE_VQADD_qr_u8 : MVE_VQADD_qr_m<MVE_v16u8, uaddsat>; -defm MVE_VQADD_qr_u16 : MVE_VQADD_qr_m<MVE_v8u16, uaddsat>; -defm MVE_VQADD_qr_u32 : MVE_VQADD_qr_m<MVE_v4u32, uaddsat>; +defm MVE_VQADD_qr_s8 : MVE_VQADD_qr_m<MVE_v16s8, saddsat>; +defm MVE_VQADD_qr_s16 : MVE_VQADD_qr_m<MVE_v8s16, saddsat>; +defm MVE_VQADD_qr_s32 : MVE_VQADD_qr_m<MVE_v4s32, saddsat>; +defm MVE_VQADD_qr_u8 : MVE_VQADD_qr_m<MVE_v16u8, uaddsat>; +defm MVE_VQADD_qr_u16 : MVE_VQADD_qr_m<MVE_v8u16, uaddsat>; +defm MVE_VQADD_qr_u32 : MVE_VQADD_qr_m<MVE_v4u32, uaddsat>; -defm MVE_VQSUB_qr_s8 : MVE_VQSUB_qr_m<MVE_v16s8, ssubsat>; -defm MVE_VQSUB_qr_s16 : MVE_VQSUB_qr_m<MVE_v8s16, ssubsat>; -defm MVE_VQSUB_qr_s32 : MVE_VQSUB_qr_m<MVE_v4s32, ssubsat>; -defm MVE_VQSUB_qr_u8 : MVE_VQSUB_qr_m<MVE_v16u8, usubsat>; -defm MVE_VQSUB_qr_u16 : MVE_VQSUB_qr_m<MVE_v8u16, usubsat>; -defm MVE_VQSUB_qr_u32 : MVE_VQSUB_qr_m<MVE_v4u32, usubsat>; +defm MVE_VQSUB_qr_s8 : MVE_VQSUB_qr_m<MVE_v16s8, ssubsat>; +defm MVE_VQSUB_qr_s16 : MVE_VQSUB_qr_m<MVE_v8s16, ssubsat>; +defm MVE_VQSUB_qr_s32 : MVE_VQSUB_qr_m<MVE_v4s32, ssubsat>; +defm MVE_VQSUB_qr_u8 : MVE_VQSUB_qr_m<MVE_v16u8, usubsat>; +defm MVE_VQSUB_qr_u16 : MVE_VQSUB_qr_m<MVE_v8u16, usubsat>; +defm MVE_VQSUB_qr_u32 : MVE_VQSUB_qr_m<MVE_v4u32, usubsat>; class MVE_VQDMULL_qr<string iname, string suffix, bit size, bit T, string cstr="", list<dag> pattern=[]> @@ -5315,23 +5315,23 @@ defm MVE_VHSUB_qr_u8 : MVE_VHSUB_qr_m<MVE_v16u8>; defm MVE_VHSUB_qr_u16 : MVE_VHSUB_qr_m<MVE_v8u16>; defm MVE_VHSUB_qr_u32 : MVE_VHSUB_qr_m<MVE_v4u32>; -multiclass MVE_VADDSUB_qr_f<string iname, MVEVectorVTInfo VTI, bit subtract, - SDNode Op, Intrinsic PredInt> { - def "" : MVE_VxADDSUB_qr<iname, VTI.Suffix, VTI.Size{0}, 0b11, subtract>; - defm : MVE_TwoOpPatternDup<VTI, Op, PredInt, (? ), - !cast<Instruction>(NAME)>; -} - +multiclass MVE_VADDSUB_qr_f<string iname, MVEVectorVTInfo VTI, bit subtract, + SDNode Op, Intrinsic PredInt> { + def "" : MVE_VxADDSUB_qr<iname, VTI.Suffix, VTI.Size{0}, 0b11, subtract>; + defm : MVE_TwoOpPatternDup<VTI, Op, PredInt, (? ), + !cast<Instruction>(NAME)>; +} + let Predicates = [HasMVEFloat] in { - defm MVE_VADD_qr_f32 : MVE_VADDSUB_qr_f<"vadd", MVE_v4f32, 0b0, fadd, - int_arm_mve_add_predicated>; - defm MVE_VADD_qr_f16 : MVE_VADDSUB_qr_f<"vadd", MVE_v8f16, 0b0, fadd, - int_arm_mve_add_predicated>; + defm MVE_VADD_qr_f32 : MVE_VADDSUB_qr_f<"vadd", MVE_v4f32, 0b0, fadd, + int_arm_mve_add_predicated>; + defm MVE_VADD_qr_f16 : MVE_VADDSUB_qr_f<"vadd", MVE_v8f16, 0b0, fadd, + int_arm_mve_add_predicated>; - defm MVE_VSUB_qr_f32 : MVE_VADDSUB_qr_f<"vsub", MVE_v4f32, 0b1, fsub, - int_arm_mve_sub_predicated>; - defm MVE_VSUB_qr_f16 : MVE_VADDSUB_qr_f<"vsub", MVE_v8f16, 0b1, fsub, - int_arm_mve_sub_predicated>; + defm MVE_VSUB_qr_f32 : MVE_VADDSUB_qr_f<"vsub", MVE_v4f32, 0b1, fsub, + int_arm_mve_sub_predicated>; + defm MVE_VSUB_qr_f16 : MVE_VADDSUB_qr_f<"vsub", MVE_v8f16, 0b1, fsub, + int_arm_mve_sub_predicated>; } class MVE_VxSHL_qr<string iname, string suffix, bit U, bits<2> size, @@ -5461,10 +5461,10 @@ class MVE_VMUL_qr_int<string iname, string suffix, bits<2> size> multiclass MVE_VMUL_qr_int_m<MVEVectorVTInfo VTI> { def "" : MVE_VMUL_qr_int<"vmul", VTI.Suffix, VTI.Size>; - let Predicates = [HasMVEInt] in { - defm : MVE_TwoOpPatternDup<VTI, mul, int_arm_mve_mul_predicated, (? ), - !cast<Instruction>(NAME), ARMimmOneV>; - } + let Predicates = [HasMVEInt] in { + defm : MVE_TwoOpPatternDup<VTI, mul, int_arm_mve_mul_predicated, (? ), + !cast<Instruction>(NAME), ARMimmOneV>; + } } defm MVE_VMUL_qr_i8 : MVE_VMUL_qr_int_m<MVE_v16i8>; @@ -5481,25 +5481,25 @@ class MVE_VxxMUL_qr<string iname, string suffix, let Inst{12} = 0b0; let Inst{8} = 0b0; let Inst{5} = 0b1; - let validForTailPredication = 1; + let validForTailPredication = 1; } multiclass MVE_VxxMUL_qr_m<string iname, MVEVectorVTInfo VTI, bit bit_28, - PatFrag Op, Intrinsic int_unpred, Intrinsic int_pred> { + PatFrag Op, Intrinsic int_unpred, Intrinsic int_pred> { def "" : MVE_VxxMUL_qr<iname, VTI.Suffix, bit_28, VTI.Size>; - - let Predicates = [HasMVEInt] in { - defm : MVE_TwoOpPatternDup<VTI, Op, int_pred, (? ), !cast<Instruction>(NAME)>; - } - defm : MVE_vec_scalar_int_pat_m<!cast<Instruction>(NAME), VTI, int_unpred, int_pred>; + + let Predicates = [HasMVEInt] in { + defm : MVE_TwoOpPatternDup<VTI, Op, int_pred, (? ), !cast<Instruction>(NAME)>; + } + defm : MVE_vec_scalar_int_pat_m<!cast<Instruction>(NAME), VTI, int_unpred, int_pred>; } multiclass MVE_VQDMULH_qr_m<MVEVectorVTInfo VTI> : - MVE_VxxMUL_qr_m<"vqdmulh", VTI, 0b0, MVEvqdmulh, + MVE_VxxMUL_qr_m<"vqdmulh", VTI, 0b0, MVEvqdmulh, int_arm_mve_vqdmulh, int_arm_mve_qdmulh_predicated>; multiclass MVE_VQRDMULH_qr_m<MVEVectorVTInfo VTI> : - MVE_VxxMUL_qr_m<"vqrdmulh", VTI, 0b1, null_frag, + MVE_VxxMUL_qr_m<"vqrdmulh", VTI, 0b1, null_frag, int_arm_mve_vqrdmulh, int_arm_mve_qrdmulh_predicated>; defm MVE_VQDMULH_qr_s8 : MVE_VQDMULH_qr_m<MVE_v16s8>; @@ -5510,17 +5510,17 @@ defm MVE_VQRDMULH_qr_s8 : MVE_VQRDMULH_qr_m<MVE_v16s8>; defm MVE_VQRDMULH_qr_s16 : MVE_VQRDMULH_qr_m<MVE_v8s16>; defm MVE_VQRDMULH_qr_s32 : MVE_VQRDMULH_qr_m<MVE_v4s32>; -multiclass MVE_VxxMUL_qr_f_m<MVEVectorVTInfo VTI> { - let validForTailPredication = 1 in - def "" : MVE_VxxMUL_qr<"vmul", VTI.Suffix, VTI.Size{0}, 0b11>; - defm : MVE_TwoOpPatternDup<VTI, fmul, int_arm_mve_mul_predicated, (? ), - !cast<Instruction>(NAME)>; +multiclass MVE_VxxMUL_qr_f_m<MVEVectorVTInfo VTI> { + let validForTailPredication = 1 in + def "" : MVE_VxxMUL_qr<"vmul", VTI.Suffix, VTI.Size{0}, 0b11>; + defm : MVE_TwoOpPatternDup<VTI, fmul, int_arm_mve_mul_predicated, (? ), + !cast<Instruction>(NAME)>; } -let Predicates = [HasMVEFloat] in { - defm MVE_VMUL_qr_f16 : MVE_VxxMUL_qr_f_m<MVE_v8f16>; - defm MVE_VMUL_qr_f32 : MVE_VxxMUL_qr_f_m<MVE_v4f32>; -} +let Predicates = [HasMVEFloat] in { + defm MVE_VMUL_qr_f16 : MVE_VxxMUL_qr_f_m<MVE_v8f16>; + defm MVE_VMUL_qr_f32 : MVE_VxxMUL_qr_f_m<MVE_v4f32>; +} class MVE_VFMAMLA_qr<string iname, string suffix, bit bit_28, bits<2> bits_21_20, bit S, @@ -5595,10 +5595,10 @@ multiclass MVE_VFMA_qr_multi<string iname, MVEVectorVTInfo VTI, if scalar_addend then { def : Pat<(VTI.Vec (fma v1, v2, vs)), (VTI.Vec (Inst v1, v2, is))>; - def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$pred), - (VTI.Vec (fma v1, v2, vs)), - v1)), - (VTI.Vec (Inst v1, v2, is, ARMVCCThen, $pred))>; + def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$pred), + (VTI.Vec (fma v1, v2, vs)), + v1)), + (VTI.Vec (Inst v1, v2, is, ARMVCCThen, $pred))>; def : Pat<(VTI.Vec (pred_int v1, v2, vs, pred)), (VTI.Vec (Inst v1, v2, is, ARMVCCThen, pred))>; } else { @@ -5606,14 +5606,14 @@ multiclass MVE_VFMA_qr_multi<string iname, MVEVectorVTInfo VTI, (VTI.Vec (Inst v2, v1, is))>; def : Pat<(VTI.Vec (fma vs, v1, v2)), (VTI.Vec (Inst v2, v1, is))>; - def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$pred), - (VTI.Vec (fma vs, v2, v1)), - v1)), - (VTI.Vec (Inst v1, v2, is, ARMVCCThen, $pred))>; - def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$pred), - (VTI.Vec (fma v2, vs, v1)), - v1)), - (VTI.Vec (Inst v1, v2, is, ARMVCCThen, $pred))>; + def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$pred), + (VTI.Vec (fma vs, v2, v1)), + v1)), + (VTI.Vec (Inst v1, v2, is, ARMVCCThen, $pred))>; + def : Pat<(VTI.Vec (vselect (VTI.Pred VCCR:$pred), + (VTI.Vec (fma v2, vs, v1)), + v1)), + (VTI.Vec (Inst v1, v2, is, ARMVCCThen, $pred))>; def : Pat<(VTI.Vec (pred_int v1, vs, v2, pred)), (VTI.Vec (Inst v2, v1, is, ARMVCCThen, pred))>; def : Pat<(VTI.Vec (pred_int vs, v1, v2, pred)), @@ -5742,7 +5742,7 @@ def MVE_VDWDUPu8 : MVE_VxWDUP<"vdwdup", "u8", 0b00, 0b1>; def MVE_VDWDUPu16 : MVE_VxWDUP<"vdwdup", "u16", 0b01, 0b1>; def MVE_VDWDUPu32 : MVE_VxWDUP<"vdwdup", "u32", 0b10, 0b1>; -let isReMaterializable = 1 in +let isReMaterializable = 1 in class MVE_VCTPInst<string suffix, bits<2> size, list<dag> pattern=[]> : MVE_p<(outs VCCR:$P0), (ins rGPR:$Rn), NoItinerary, "vctp", suffix, "$Rn", vpred_n, "", pattern> { @@ -5766,8 +5766,8 @@ multiclass MVE_VCTP<MVEVectorVTInfo VTI, Intrinsic intr> { defvar Inst = !cast<Instruction>(NAME); let Predicates = [HasMVEInt] in { - def : Pat<(intr rGPR:$Rn), - (VTI.Pred (Inst rGPR:$Rn))>; + def : Pat<(intr rGPR:$Rn), + (VTI.Pred (Inst rGPR:$Rn))>; def : Pat<(and (intr rGPR:$Rn), (VTI.Pred VCCR:$mask)), (VTI.Pred (Inst rGPR:$Rn, ARMVCCThen, VCCR:$mask))>; } @@ -5845,41 +5845,41 @@ def MVE_VMOV_rr_q : MVE_VMOV_64bit<(outs rGPR:$Rt, rGPR:$Rt2), (ins MQPR:$Qd), let AsmMatchConverter = "cvtMVEVMOVQtoDReg"; } -let Predicates = [HasMVEInt] in { - // Double lane moves. There are a number of patterns here. We know that the - // insertelt's will be in descending order by index, and need to match the 5 - // patterns that might contain 2-0 or 3-1 pairs. These are: - // 3 2 1 0 -> vmovqrr 31; vmovqrr 20 - // 3 2 1 -> vmovqrr 31; vmov 2 - // 3 1 -> vmovqrr 31 - // 2 1 0 -> vmovqrr 20; vmov 1 - // 2 0 -> vmovqrr 20 - // The other potential patterns will be handled by single lane inserts. - def : Pat<(insertelt (insertelt (insertelt (insertelt (v4i32 MQPR:$src1), - rGPR:$srcA, (i32 0)), - rGPR:$srcB, (i32 1)), - rGPR:$srcC, (i32 2)), - rGPR:$srcD, (i32 3)), - (MVE_VMOV_q_rr (MVE_VMOV_q_rr MQPR:$src1, rGPR:$srcA, rGPR:$srcC, (i32 2), (i32 0)), - rGPR:$srcB, rGPR:$srcD, (i32 3), (i32 1))>; - def : Pat<(insertelt (insertelt (insertelt (v4i32 MQPR:$src1), - rGPR:$srcB, (i32 1)), - rGPR:$srcC, (i32 2)), - rGPR:$srcD, (i32 3)), - (MVE_VMOV_q_rr (MVE_VMOV_to_lane_32 MQPR:$src1, rGPR:$srcC, (i32 2)), - rGPR:$srcB, rGPR:$srcD, (i32 3), (i32 1))>; - def : Pat<(insertelt (insertelt (v4i32 MQPR:$src1), rGPR:$srcA, (i32 1)), rGPR:$srcB, (i32 3)), - (MVE_VMOV_q_rr MQPR:$src1, rGPR:$srcA, rGPR:$srcB, (i32 3), (i32 1))>; - def : Pat<(insertelt (insertelt (insertelt (v4i32 MQPR:$src1), - rGPR:$srcB, (i32 0)), - rGPR:$srcC, (i32 1)), - rGPR:$srcD, (i32 2)), - (MVE_VMOV_q_rr (MVE_VMOV_to_lane_32 MQPR:$src1, rGPR:$srcC, (i32 1)), - rGPR:$srcB, rGPR:$srcD, (i32 2), (i32 0))>; - def : Pat<(insertelt (insertelt (v4i32 MQPR:$src1), rGPR:$srcA, (i32 0)), rGPR:$srcB, (i32 2)), - (MVE_VMOV_q_rr MQPR:$src1, rGPR:$srcA, rGPR:$srcB, (i32 2), (i32 0))>; -} - +let Predicates = [HasMVEInt] in { + // Double lane moves. There are a number of patterns here. We know that the + // insertelt's will be in descending order by index, and need to match the 5 + // patterns that might contain 2-0 or 3-1 pairs. These are: + // 3 2 1 0 -> vmovqrr 31; vmovqrr 20 + // 3 2 1 -> vmovqrr 31; vmov 2 + // 3 1 -> vmovqrr 31 + // 2 1 0 -> vmovqrr 20; vmov 1 + // 2 0 -> vmovqrr 20 + // The other potential patterns will be handled by single lane inserts. + def : Pat<(insertelt (insertelt (insertelt (insertelt (v4i32 MQPR:$src1), + rGPR:$srcA, (i32 0)), + rGPR:$srcB, (i32 1)), + rGPR:$srcC, (i32 2)), + rGPR:$srcD, (i32 3)), + (MVE_VMOV_q_rr (MVE_VMOV_q_rr MQPR:$src1, rGPR:$srcA, rGPR:$srcC, (i32 2), (i32 0)), + rGPR:$srcB, rGPR:$srcD, (i32 3), (i32 1))>; + def : Pat<(insertelt (insertelt (insertelt (v4i32 MQPR:$src1), + rGPR:$srcB, (i32 1)), + rGPR:$srcC, (i32 2)), + rGPR:$srcD, (i32 3)), + (MVE_VMOV_q_rr (MVE_VMOV_to_lane_32 MQPR:$src1, rGPR:$srcC, (i32 2)), + rGPR:$srcB, rGPR:$srcD, (i32 3), (i32 1))>; + def : Pat<(insertelt (insertelt (v4i32 MQPR:$src1), rGPR:$srcA, (i32 1)), rGPR:$srcB, (i32 3)), + (MVE_VMOV_q_rr MQPR:$src1, rGPR:$srcA, rGPR:$srcB, (i32 3), (i32 1))>; + def : Pat<(insertelt (insertelt (insertelt (v4i32 MQPR:$src1), + rGPR:$srcB, (i32 0)), + rGPR:$srcC, (i32 1)), + rGPR:$srcD, (i32 2)), + (MVE_VMOV_q_rr (MVE_VMOV_to_lane_32 MQPR:$src1, rGPR:$srcC, (i32 1)), + rGPR:$srcB, rGPR:$srcD, (i32 2), (i32 0))>; + def : Pat<(insertelt (insertelt (v4i32 MQPR:$src1), rGPR:$srcA, (i32 0)), rGPR:$srcB, (i32 2)), + (MVE_VMOV_q_rr MQPR:$src1, rGPR:$srcA, rGPR:$srcB, (i32 2), (i32 0))>; +} + // end of coproc mov // start of MVE interleaving load/store @@ -5908,7 +5908,7 @@ class MVE_vldst24_base<bit writeback, bit fourregs, bits<2> stage, bits<2> size, let mayLoad = load; let mayStore = !eq(load,0); let hasSideEffects = 0; - let validForTailPredication = load; + let validForTailPredication = load; } // A parameter class used to encapsulate all the ways the writeback @@ -6518,7 +6518,7 @@ class MVE_VPT<string suffix, bits<2> size, dag iops, string asm, list<dag> patte let Inst{4} = 0b0; let Defs = [VPR]; - let validForTailPredication=1; + let validForTailPredication=1; } class MVE_VPTt1<string suffix, bits<2> size, dag iops> @@ -6631,7 +6631,7 @@ class MVE_VPTf<string suffix, bit size, dag iops, string asm, list<dag> pattern= let Defs = [VPR]; let Predicates = [HasMVEFloat]; - let validForTailPredication=1; + let validForTailPredication=1; } class MVE_VPTft1<string suffix, bit size> @@ -7107,7 +7107,7 @@ class MVE_vector_load_typed<ValueType Ty, Instruction RegImmInst, class MVE_vector_maskedload_typed<ValueType Ty, Instruction RegImmInst, PatFrag LoadKind, int shift> - : Pat<(Ty (LoadKind t2addrmode_imm7<shift>:$addr, VCCR:$pred, (Ty (ARMvmovImm (i32 0))))), + : Pat<(Ty (LoadKind t2addrmode_imm7<shift>:$addr, VCCR:$pred, (Ty (ARMvmovImm (i32 0))))), (Ty (RegImmInst t2addrmode_imm7<shift>:$addr, ARMVCCThen, VCCR:$pred))>; multiclass MVE_vector_load<Instruction RegImmInst, PatFrag LoadKind, @@ -7274,11 +7274,11 @@ multiclass MVEExtLoadStore<Instruction LoadSInst, Instruction LoadUInst, string (VT (LoadUInst taddrmode_imm7<Shift>:$addr))>; // Masked ext loads - def : Pat<(VT (!cast<PatFrag>("aligned_extmaskedload"#Amble) taddrmode_imm7<Shift>:$addr, VCCR:$pred, (VT (ARMvmovImm (i32 0))))), + def : Pat<(VT (!cast<PatFrag>("aligned_extmaskedload"#Amble) taddrmode_imm7<Shift>:$addr, VCCR:$pred, (VT (ARMvmovImm (i32 0))))), (VT (LoadUInst taddrmode_imm7<Shift>:$addr, ARMVCCThen, VCCR:$pred))>; - def : Pat<(VT (!cast<PatFrag>("aligned_sextmaskedload"#Amble) taddrmode_imm7<Shift>:$addr, VCCR:$pred, (VT (ARMvmovImm (i32 0))))), + def : Pat<(VT (!cast<PatFrag>("aligned_sextmaskedload"#Amble) taddrmode_imm7<Shift>:$addr, VCCR:$pred, (VT (ARMvmovImm (i32 0))))), (VT (LoadSInst taddrmode_imm7<Shift>:$addr, ARMVCCThen, VCCR:$pred))>; - def : Pat<(VT (!cast<PatFrag>("aligned_zextmaskedload"#Amble) taddrmode_imm7<Shift>:$addr, VCCR:$pred, (VT (ARMvmovImm (i32 0))))), + def : Pat<(VT (!cast<PatFrag>("aligned_zextmaskedload"#Amble) taddrmode_imm7<Shift>:$addr, VCCR:$pred, (VT (ARMvmovImm (i32 0))))), (VT (LoadUInst taddrmode_imm7<Shift>:$addr, ARMVCCThen, VCCR:$pred))>; } |