@@ -2612,93 +2612,87 @@ LoongArchTargetLowering::lowerEXTRACT_VECTOR_ELT(SDValue Op,
2612
2612
SDValue Vec = Op->getOperand (0 );
2613
2613
EVT VecTy = Vec->getValueType (0 );
2614
2614
SDValue Idx = Op->getOperand (1 );
2615
- unsigned NumElts = VecTy.getVectorNumElements ();
2616
2615
SDLoc DL (Op);
2617
2616
MVT GRLenVT = Subtarget.getGRLenVT ();
2618
2617
2619
2618
assert (VecTy.is256BitVector () && " Unexpected EXTRACT_VECTOR_ELT vector type" );
2620
2619
2621
- if (isa<ConstantSDNode>(Idx) && Idx-> getAsZExtVal () < NumElts )
2620
+ if (isa<ConstantSDNode>(Idx))
2622
2621
return Op;
2623
2622
2624
- if (!isa<ConstantSDNode>(Idx)) {
2625
- switch (VecTy.getSimpleVT ().SimpleTy ) {
2626
- default :
2627
- llvm_unreachable (" Unexpected type" );
2628
- case MVT::v32i8:
2629
- case MVT::v16i16: {
2630
- // Consider the source vector as v8i32 type.
2631
- SDValue NewVec = DAG.getBitcast (MVT::v8i32, Vec);
2632
-
2633
- // Compute the adjusted index and use it to broadcast the vector.
2634
- // The original desired i8/i16 element is now replicated in each
2635
- // i32 lane of the splatted vector.
2636
- SDValue NewIdx = DAG.getNode (
2637
- LoongArchISD::BSTRPICK, DL, GRLenVT, Idx,
2638
- DAG.getConstant (31 , DL, GRLenVT),
2639
- DAG.getConstant (((VecTy == MVT::v32i8) ? 2 : 1 ), DL, GRLenVT));
2640
- SDValue SplatIdx = DAG.getSplatBuildVector (MVT::v8i32, DL, NewIdx);
2641
- SDValue SplatValue =
2642
- DAG.getNode (LoongArchISD::XVPERM, DL, MVT::v8i32, NewVec, SplatIdx);
2643
- SDValue SplatVec = DAG.getBitcast (VecTy, SplatValue);
2644
-
2645
- // Compute the local index of the original i8/i16 element within the
2646
- // i32 element and then use it to broadcast the vector. Each elements
2647
- // of the vector will be the desired element.
2648
- SDValue LocalIdx = DAG.getNode (
2649
- ISD::AND, DL, GRLenVT, Idx,
2650
- DAG.getConstant (((VecTy == MVT::v32i8) ? 3 : 1 ), DL, GRLenVT));
2651
- SDValue ExtractVec =
2652
- DAG.getNode (LoongArchISD::VREPLVE, DL, VecTy, SplatVec, LocalIdx);
2653
-
2654
- return DAG.getNode (ISD::EXTRACT_VECTOR_ELT, DL, EltVT, ExtractVec,
2655
- DAG.getConstant (0 , DL, GRLenVT));
2656
- }
2657
- case MVT::v8i32:
2658
- case MVT::v8f32: {
2659
- SDValue SplatIdx = DAG.getSplatBuildVector (MVT::v8i32, DL, Idx);
2660
- SDValue SplatValue =
2661
- DAG.getNode (LoongArchISD::XVPERM, DL, VecTy, Vec, SplatIdx);
2662
-
2663
- return DAG.getNode (ISD::EXTRACT_VECTOR_ELT, DL, EltVT, SplatValue,
2664
- DAG.getConstant (0 , DL, GRLenVT));
2665
- }
2666
- case MVT::v4i64:
2667
- case MVT::v4f64: {
2668
- // Consider the source vector as v8i32 type.
2669
- SDValue NewVec = DAG.getBitcast (MVT::v8i32, Vec);
2670
-
2671
- // Split the original element index into low and high parts:
2672
- // Lo = Idx * 2, Hi = Idx * 2 + 1.
2673
- SDValue SplatIdx = DAG.getSplatBuildVector (MVT::v8i32, DL, Idx);
2674
- SDValue SplatIdxLo =
2675
- DAG.getNode (LoongArchISD::VSLLI, DL, MVT::v8i32, SplatIdx,
2676
- DAG.getConstant (1 , DL, GRLenVT));
2677
- SDValue SplatIdxHi =
2678
- DAG.getNode (ISD::ADD, DL, MVT::v8i32, SplatIdxLo,
2679
- DAG.getSplatBuildVector (MVT::v8i32, DL,
2680
- DAG.getConstant (1 , DL, GRLenVT)));
2681
-
2682
- // Use the broadcasted index to broadcast the low and high parts of the
2683
- // vector separately.
2684
- SDValue SplatVecLo =
2685
- DAG.getNode (LoongArchISD::XVPERM, DL, MVT::v8i32, NewVec, SplatIdxLo);
2686
- SDValue SplatVecHi =
2687
- DAG.getNode (LoongArchISD::XVPERM, DL, MVT::v8i32, NewVec, SplatIdxHi);
2688
-
2689
- // Combine the low and high i32 parts to reconstruct the original i64/f64
2690
- // element.
2691
- SDValue SplatValue = DAG.getNode (LoongArchISD::VILVL, DL, MVT::v8i32,
2692
- SplatVecHi, SplatVecLo);
2693
- SDValue ExtractVec = DAG.getBitcast (VecTy, SplatValue);
2694
-
2695
- return DAG.getNode (ISD::EXTRACT_VECTOR_ELT, DL, EltVT, ExtractVec,
2696
- DAG.getConstant (0 , DL, GRLenVT));
2697
- }
2698
- }
2623
+ switch (VecTy.getSimpleVT ().SimpleTy ) {
2624
+ default :
2625
+ llvm_unreachable (" Unexpected type" );
2626
+ case MVT::v32i8:
2627
+ case MVT::v16i16: {
2628
+ // Consider the source vector as v8i32 type.
2629
+ SDValue NewVec = DAG.getBitcast (MVT::v8i32, Vec);
2630
+
2631
+ // Compute the adjusted index and use it to broadcast the vector.
2632
+ // The original desired i8/i16 element is now replicated in each
2633
+ // i32 lane of the splatted vector.
2634
+ SDValue NewIdx = DAG.getNode (
2635
+ LoongArchISD::BSTRPICK, DL, GRLenVT, Idx,
2636
+ DAG.getConstant (31 , DL, GRLenVT),
2637
+ DAG.getConstant (((VecTy == MVT::v32i8) ? 2 : 1 ), DL, GRLenVT));
2638
+ SDValue SplatIdx = DAG.getSplatBuildVector (MVT::v8i32, DL, NewIdx);
2639
+ SDValue SplatValue =
2640
+ DAG.getNode (LoongArchISD::XVPERM, DL, MVT::v8i32, NewVec, SplatIdx);
2641
+ SDValue SplatVec = DAG.getBitcast (VecTy, SplatValue);
2642
+
2643
+ // Compute the local index of the original i8/i16 element within the
2644
+ // i32 element and then use it to broadcast the vector. Each elements
2645
+ // of the vector will be the desired element.
2646
+ SDValue LocalIdx = DAG.getNode (
2647
+ ISD::AND, DL, GRLenVT, Idx,
2648
+ DAG.getConstant (((VecTy == MVT::v32i8) ? 3 : 1 ), DL, GRLenVT));
2649
+ SDValue ExtractVec =
2650
+ DAG.getNode (LoongArchISD::VREPLVE, DL, VecTy, SplatVec, LocalIdx);
2651
+
2652
+ return DAG.getNode (ISD::EXTRACT_VECTOR_ELT, DL, EltVT, ExtractVec,
2653
+ DAG.getConstant (0 , DL, GRLenVT));
2654
+ }
2655
+ case MVT::v8i32:
2656
+ case MVT::v8f32: {
2657
+ SDValue SplatIdx = DAG.getSplatBuildVector (MVT::v8i32, DL, Idx);
2658
+ SDValue SplatValue =
2659
+ DAG.getNode (LoongArchISD::XVPERM, DL, VecTy, Vec, SplatIdx);
2660
+
2661
+ return DAG.getNode (ISD::EXTRACT_VECTOR_ELT, DL, EltVT, SplatValue,
2662
+ DAG.getConstant (0 , DL, GRLenVT));
2663
+ }
2664
+ case MVT::v4i64:
2665
+ case MVT::v4f64: {
2666
+ // Consider the source vector as v8i32 type.
2667
+ SDValue NewVec = DAG.getBitcast (MVT::v8i32, Vec);
2668
+
2669
+ // Split the original element index into low and high parts:
2670
+ // Lo = Idx * 2, Hi = Idx * 2 + 1.
2671
+ SDValue SplatIdx = DAG.getSplatBuildVector (MVT::v8i32, DL, Idx);
2672
+ SDValue SplatIdxLo = DAG.getNode (LoongArchISD::VSLLI, DL, MVT::v8i32,
2673
+ SplatIdx, DAG.getConstant (1 , DL, GRLenVT));
2674
+ SDValue SplatIdxHi =
2675
+ DAG.getNode (ISD::ADD, DL, MVT::v8i32, SplatIdxLo,
2676
+ DAG.getSplatBuildVector (MVT::v8i32, DL,
2677
+ DAG.getConstant (1 , DL, GRLenVT)));
2678
+
2679
+ // Use the broadcasted index to broadcast the low and high parts of the
2680
+ // vector separately.
2681
+ SDValue SplatVecLo =
2682
+ DAG.getNode (LoongArchISD::XVPERM, DL, MVT::v8i32, NewVec, SplatIdxLo);
2683
+ SDValue SplatVecHi =
2684
+ DAG.getNode (LoongArchISD::XVPERM, DL, MVT::v8i32, NewVec, SplatIdxHi);
2685
+
2686
+ // Combine the low and high i32 parts to reconstruct the original i64/f64
2687
+ // element.
2688
+ SDValue SplatValue = DAG.getNode (LoongArchISD::VILVL, DL, MVT::v8i32,
2689
+ SplatVecHi, SplatVecLo);
2690
+ SDValue ExtractVec = DAG.getBitcast (VecTy, SplatValue);
2691
+
2692
+ return DAG.getNode (ISD::EXTRACT_VECTOR_ELT, DL, EltVT, ExtractVec,
2693
+ DAG.getConstant (0 , DL, GRLenVT));
2694
+ }
2699
2695
}
2700
-
2701
- return SDValue ();
2702
2696
}
2703
2697
2704
2698
SDValue
0 commit comments