Skip to content

Commit 4ad7f8a

Browse files
committed
use movgr2fr
1 parent e0b1b66 commit 4ad7f8a

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2811,12 +2811,16 @@ LoongArchTargetLowering::lowerEXTRACT_VECTOR_ELT(SDValue Op,
28112811
DAG.getNode(ISD::INSERT_SUBVECTOR, DL, VecTy, DAG.getUNDEF(VecTy),
28122812
VecHi, DAG.getConstant(0, DL, GRLenVT));
28132813

2814-
// Shuffle the origin Vec and the TmpVec. Each element of the low half of
2815-
// the ResVec will be the desired element.
2816-
SDValue SplatIdx = DAG.getSplatBuildVector(
2817-
(VecTy == MVT::v4f64) ? MVT::v4i64 : VecTy, DL, Idx);
2814+
// Shuffle the origin Vec and the TmpVec using MaskVec, the lowest element
2815+
// of MaskVec is Idx, the rest do not matter. ResVec[0] will hold the
2816+
// desired element.
2817+
SDValue IdxCp =
2818+
DAG.getNode(LoongArchISD::MOVGR2FR_W_LA64, DL, MVT::f32, Idx);
2819+
SDValue IdxVec = DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, MVT::v8f32, IdxCp);
2820+
SDValue MaskVec =
2821+
DAG.getBitcast((VecTy == MVT::v4f64) ? MVT::v4i64 : VecTy, IdxVec);
28182822
SDValue ResVec =
2819-
DAG.getNode(LoongArchISD::VSHUF, DL, VecTy, SplatIdx, TmpVec, Vec);
2823+
DAG.getNode(LoongArchISD::VSHUF, DL, VecTy, MaskVec, TmpVec, Vec);
28202824

28212825
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, EltVT, ResVec,
28222826
DAG.getConstant(0, DL, GRLenVT));

llvm/test/CodeGen/LoongArch/lasx/ir-instruction/extractelement.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ define void @extract_32xi8_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
7878
; CHECK: # %bb.0:
7979
; CHECK-NEXT: xvld $xr0, $a0, 0
8080
; CHECK-NEXT: xvpermi.q $xr1, $xr0, 1
81-
; CHECK-NEXT: xvreplgr2vr.b $xr2, $a2
81+
; CHECK-NEXT: movgr2fr.w $fa2, $a2
8282
; CHECK-NEXT: xvshuf.b $xr0, $xr1, $xr0, $xr2
8383
; CHECK-NEXT: xvstelm.b $xr0, $a1, 0, 0
8484
; CHECK-NEXT: ret
@@ -93,7 +93,7 @@ define void @extract_16xi16_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
9393
; CHECK: # %bb.0:
9494
; CHECK-NEXT: xvld $xr0, $a0, 0
9595
; CHECK-NEXT: xvpermi.q $xr1, $xr0, 1
96-
; CHECK-NEXT: xvreplgr2vr.h $xr2, $a2
96+
; CHECK-NEXT: movgr2fr.w $fa2, $a2
9797
; CHECK-NEXT: xvshuf.h $xr2, $xr1, $xr0
9898
; CHECK-NEXT: xvstelm.h $xr2, $a1, 0, 0
9999
; CHECK-NEXT: ret
@@ -122,7 +122,7 @@ define void @extract_4xi64_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
122122
; CHECK: # %bb.0:
123123
; CHECK-NEXT: xvld $xr0, $a0, 0
124124
; CHECK-NEXT: xvpermi.q $xr1, $xr0, 1
125-
; CHECK-NEXT: xvreplgr2vr.d $xr2, $a2
125+
; CHECK-NEXT: movgr2fr.w $fa2, $a2
126126
; CHECK-NEXT: xvshuf.d $xr2, $xr1, $xr0
127127
; CHECK-NEXT: xvstelm.d $xr2, $a1, 0, 0
128128
; CHECK-NEXT: ret
@@ -151,7 +151,7 @@ define void @extract_4xdouble_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
151151
; CHECK: # %bb.0:
152152
; CHECK-NEXT: xvld $xr0, $a0, 0
153153
; CHECK-NEXT: xvpermi.q $xr1, $xr0, 1
154-
; CHECK-NEXT: xvreplgr2vr.d $xr2, $a2
154+
; CHECK-NEXT: movgr2fr.w $fa2, $a2
155155
; CHECK-NEXT: xvshuf.d $xr2, $xr1, $xr0
156156
; CHECK-NEXT: xvstelm.d $xr2, $a1, 0, 0
157157
; CHECK-NEXT: ret

0 commit comments

Comments
 (0)