Skip to content

Commit 0f83d37

Browse files
committed
[ARM] MVE vabd
This adds MVE lowering for VABDS/VABDU, using the code parted from AArch64 in D91937. Differential Revision: https://reviews.llvm.org/D91938
1 parent 2887f14 commit 0f83d37

File tree

3 files changed

+119
-194
lines changed

3 files changed

+119
-194
lines changed

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,8 @@ void ARMTargetLowering::addMVEVectorTypes(bool HasMVEFP) {
281281
setOperationAction(ISD::UADDSAT, VT, Legal);
282282
setOperationAction(ISD::SSUBSAT, VT, Legal);
283283
setOperationAction(ISD::USUBSAT, VT, Legal);
284+
setOperationAction(ISD::ABDS, VT, Legal);
285+
setOperationAction(ISD::ABDU, VT, Legal);
284286

285287
// No native support for these.
286288
setOperationAction(ISD::UDIV, VT, Expand);
@@ -14616,6 +14618,8 @@ static SDValue FlattenVectorShuffle(ShuffleVectorSDNode *N, SelectionDAG &DAG) {
1461614618
case ARMISD::VQDMULH:
1461714619
case ISD::MULHS:
1461814620
case ISD::MULHU:
14621+
case ISD::ABDS:
14622+
case ISD::ABDU:
1461914623
break;
1462014624
default:
1462114625
return SDValue();

llvm/lib/Target/ARM/ARMInstrMVE.td

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2131,36 +2131,31 @@ class MVE_VABD_int<string suffix, bit U, bits<2> size,
21312131
let validForTailPredication = 1;
21322132
}
21332133

2134-
multiclass MVE_VABD_m<MVEVectorVTInfo VTI,
2135-
Intrinsic unpred_int, Intrinsic pred_int> {
2134+
multiclass MVE_VABD_m<MVEVectorVTInfo VTI, SDNode Op,
2135+
Intrinsic unpred_int, Intrinsic PredInt> {
21362136
def "" : MVE_VABD_int<VTI.Suffix, VTI.Unsigned, VTI.Size>;
21372137
defvar Inst = !cast<Instruction>(NAME);
21382138

21392139
let Predicates = [HasMVEInt] in {
2140+
defm : MVE_TwoOpPattern<VTI, Op, PredInt, (? (i32 VTI.Unsigned)),
2141+
!cast<Instruction>(NAME)>;
2142+
21402143
// Unpredicated absolute difference
21412144
def : Pat<(VTI.Vec (unpred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn),
21422145
(i32 VTI.Unsigned))),
21432146
(VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn)))>;
2144-
2145-
// Predicated absolute difference
2146-
def : Pat<(VTI.Vec (pred_int (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn),
2147-
(i32 VTI.Unsigned), (VTI.Pred VCCR:$mask),
2148-
(VTI.Vec MQPR:$inactive))),
2149-
(VTI.Vec (Inst (VTI.Vec MQPR:$Qm), (VTI.Vec MQPR:$Qn),
2150-
ARMVCCThen, (VTI.Pred VCCR:$mask),
2151-
(VTI.Vec MQPR:$inactive)))>;
21522147
}
21532148
}
21542149

2155-
multiclass MVE_VABD<MVEVectorVTInfo VTI>
2156-
: MVE_VABD_m<VTI, int_arm_mve_vabd, int_arm_mve_abd_predicated>;
2150+
multiclass MVE_VABD<MVEVectorVTInfo VTI, SDNode Op>
2151+
: MVE_VABD_m<VTI, Op, int_arm_mve_vabd, int_arm_mve_abd_predicated>;
21572152

2158-
defm MVE_VABDs8 : MVE_VABD<MVE_v16s8>;
2159-
defm MVE_VABDs16 : MVE_VABD<MVE_v8s16>;
2160-
defm MVE_VABDs32 : MVE_VABD<MVE_v4s32>;
2161-
defm MVE_VABDu8 : MVE_VABD<MVE_v16u8>;
2162-
defm MVE_VABDu16 : MVE_VABD<MVE_v8u16>;
2163-
defm MVE_VABDu32 : MVE_VABD<MVE_v4u32>;
2153+
defm MVE_VABDs8 : MVE_VABD<MVE_v16s8, abds>;
2154+
defm MVE_VABDs16 : MVE_VABD<MVE_v8s16, abds>;
2155+
defm MVE_VABDs32 : MVE_VABD<MVE_v4s32, abds>;
2156+
defm MVE_VABDu8 : MVE_VABD<MVE_v16u8, abdu>;
2157+
defm MVE_VABDu16 : MVE_VABD<MVE_v8u16, abdu>;
2158+
defm MVE_VABDu32 : MVE_VABD<MVE_v4u32, abdu>;
21642159

21652160
class MVE_VRHADD_Base<string suffix, bit U, bits<2> size, list<dag> pattern=[]>
21662161
: MVE_int<"vrhadd", suffix, size, pattern> {

0 commit comments

Comments
 (0)