@@ -286,7 +286,8 @@ class AArch64DAGToDAGISel : public SelectionDAGISel {
286
286
void SelectLoadLane (SDNode *N, unsigned NumVecs, unsigned Opc);
287
287
void SelectPostLoadLane (SDNode *N, unsigned NumVecs, unsigned Opc);
288
288
void SelectPredicatedLoad (SDNode *N, unsigned NumVecs, unsigned Scale,
289
- unsigned Opc_rr, unsigned Opc_ri);
289
+ unsigned Opc_rr, unsigned Opc_ri,
290
+ bool IsIntr = false );
290
291
291
292
bool SelectAddrModeFrameIndexSVE (SDValue N, SDValue &Base, SDValue &OffImm);
292
293
// / SVE Reg+Imm addressing mode.
@@ -1487,7 +1488,7 @@ AArch64DAGToDAGISel::findAddrModeSVELoadStore(SDNode *N, unsigned Opc_rr,
1487
1488
1488
1489
void AArch64DAGToDAGISel::SelectPredicatedLoad (SDNode *N, unsigned NumVecs,
1489
1490
unsigned Scale, unsigned Opc_ri,
1490
- unsigned Opc_rr) {
1491
+ unsigned Opc_rr, bool IsIntr ) {
1491
1492
assert (Scale < 4 && " Invalid scaling value." );
1492
1493
SDLoc DL (N);
1493
1494
EVT VT = N->getValueType (0 );
@@ -1497,11 +1498,11 @@ void AArch64DAGToDAGISel::SelectPredicatedLoad(SDNode *N, unsigned NumVecs,
1497
1498
SDValue Base, Offset;
1498
1499
unsigned Opc;
1499
1500
std::tie (Opc, Base, Offset) = findAddrModeSVELoadStore (
1500
- N, Opc_rr, Opc_ri, N->getOperand (2 ),
1501
+ N, Opc_rr, Opc_ri, N->getOperand (IsIntr ? 3 : 2 ),
1501
1502
CurDAG->getTargetConstant (0 , DL, MVT::i64 ), Scale);
1502
1503
1503
- SDValue Ops[] = {N->getOperand (1 ), // Predicate
1504
- Base, // Memory operand
1504
+ SDValue Ops[] = {N->getOperand (IsIntr ? 2 : 1 ), // Predicate
1505
+ Base, // Memory operand
1505
1506
Offset, Chain};
1506
1507
1507
1508
const EVT ResTys[] = {MVT::Untyped, MVT::Other};
@@ -3894,6 +3895,69 @@ void AArch64DAGToDAGISel::Select(SDNode *Node) {
3894
3895
case Intrinsic::aarch64_ld64b:
3895
3896
SelectLoad (Node, 8 , AArch64::LD64B, AArch64::x8sub_0);
3896
3897
return ;
3898
+ case Intrinsic::aarch64_sve_ld2_sret: {
3899
+ if (VT == MVT::nxv16i8) {
3900
+ SelectPredicatedLoad (Node, 2 , 0 , AArch64::LD2B_IMM, AArch64::LD2B,
3901
+ true );
3902
+ return ;
3903
+ } else if (VT == MVT::nxv8i16 || VT == MVT::nxv8f16 ||
3904
+ (VT == MVT::nxv8bf16 && Subtarget->hasBF16 ())) {
3905
+ SelectPredicatedLoad (Node, 2 , 1 , AArch64::LD2H_IMM, AArch64::LD2H,
3906
+ true );
3907
+ return ;
3908
+ } else if (VT == MVT::nxv4i32 || VT == MVT::nxv4f32) {
3909
+ SelectPredicatedLoad (Node, 2 , 2 , AArch64::LD2W_IMM, AArch64::LD2W,
3910
+ true );
3911
+ return ;
3912
+ } else if (VT == MVT::nxv2i64 || VT == MVT::nxv2f64) {
3913
+ SelectPredicatedLoad (Node, 2 , 3 , AArch64::LD2D_IMM, AArch64::LD2D,
3914
+ true );
3915
+ return ;
3916
+ }
3917
+ break ;
3918
+ }
3919
+ case Intrinsic::aarch64_sve_ld3_sret: {
3920
+ if (VT == MVT::nxv16i8) {
3921
+ SelectPredicatedLoad (Node, 3 , 0 , AArch64::LD3B_IMM, AArch64::LD3B,
3922
+ true );
3923
+ return ;
3924
+ } else if (VT == MVT::nxv8i16 || VT == MVT::nxv8f16 ||
3925
+ (VT == MVT::nxv8bf16 && Subtarget->hasBF16 ())) {
3926
+ SelectPredicatedLoad (Node, 3 , 1 , AArch64::LD3H_IMM, AArch64::LD3H,
3927
+ true );
3928
+ return ;
3929
+ } else if (VT == MVT::nxv4i32 || VT == MVT::nxv4f32) {
3930
+ SelectPredicatedLoad (Node, 3 , 2 , AArch64::LD3W_IMM, AArch64::LD3W,
3931
+ true );
3932
+ return ;
3933
+ } else if (VT == MVT::nxv2i64 || VT == MVT::nxv2f64) {
3934
+ SelectPredicatedLoad (Node, 3 , 3 , AArch64::LD3D_IMM, AArch64::LD3D,
3935
+ true );
3936
+ return ;
3937
+ }
3938
+ break ;
3939
+ }
3940
+ case Intrinsic::aarch64_sve_ld4_sret: {
3941
+ if (VT == MVT::nxv16i8) {
3942
+ SelectPredicatedLoad (Node, 4 , 0 , AArch64::LD4B_IMM, AArch64::LD4B,
3943
+ true );
3944
+ return ;
3945
+ } else if (VT == MVT::nxv8i16 || VT == MVT::nxv8f16 ||
3946
+ (VT == MVT::nxv8bf16 && Subtarget->hasBF16 ())) {
3947
+ SelectPredicatedLoad (Node, 4 , 1 , AArch64::LD4H_IMM, AArch64::LD4H,
3948
+ true );
3949
+ return ;
3950
+ } else if (VT == MVT::nxv4i32 || VT == MVT::nxv4f32) {
3951
+ SelectPredicatedLoad (Node, 4 , 2 , AArch64::LD4W_IMM, AArch64::LD4W,
3952
+ true );
3953
+ return ;
3954
+ } else if (VT == MVT::nxv2i64 || VT == MVT::nxv2f64) {
3955
+ SelectPredicatedLoad (Node, 4 , 3 , AArch64::LD4D_IMM, AArch64::LD4D,
3956
+ true );
3957
+ return ;
3958
+ }
3959
+ break ;
3960
+ }
3897
3961
}
3898
3962
} break ;
3899
3963
case ISD::INTRINSIC_WO_CHAIN: {
0 commit comments