Skip to content

Commit 68a3d16

Browse files
committed
[LoongArch] Optimize inserting fp element to vector
1 parent fe19419 commit 68a3d16

File tree

4 files changed

+29
-18
lines changed

4 files changed

+29
-18
lines changed

llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1651,18 +1651,20 @@ def : Pat<(vector_insert v8i32:$xd, GRLenVT:$rj, uimm3:$imm),
16511651
(XVINSGR2VR_W v8i32:$xd, GRLenVT:$rj, uimm3:$imm)>;
16521652
def : Pat<(vector_insert v4i64:$xd, GRLenVT:$rj, uimm2:$imm),
16531653
(XVINSGR2VR_D v4i64:$xd, GRLenVT:$rj, uimm2:$imm)>;
1654-
def : Pat<(vector_insert v8f32:$vd, (loongarch_movgr2fr_w_la64 GPR:$rj), uimm3:$imm),
1655-
(XVINSGR2VR_W $vd, $rj, uimm3:$imm)>;
1656-
def : Pat<(vector_insert v4f64:$vd, (f64 (bitconvert i64:$rj)), uimm2:$imm),
1657-
(XVINSGR2VR_D $vd, $rj, uimm2:$imm)>;
1654+
def : Pat<(vector_insert v8f32:$xd, (loongarch_movgr2fr_w_la64 GPR:$rj), uimm3:$imm),
1655+
(XVINSGR2VR_W $xd, $rj, uimm3:$imm)>;
1656+
def : Pat<(vector_insert v4f64:$xd, (f64 (bitconvert i64:$rj)), uimm2:$imm),
1657+
(XVINSGR2VR_D $xd, $rj, uimm2:$imm)>;
16581658
def : Pat<(vector_insert v8f32:$xd, (f32 (vector_extract v8f32:$xj, uimm3:$imm1)), uimm3:$imm2),
16591659
(XVINSGR2VR_W $xd, (XVPICKVE2GR_W v8f32:$xj, uimm3:$imm1), uimm3:$imm2)>;
16601660
def : Pat<(vector_insert v4f64:$xd, (f64 (vector_extract v4f64:$xj, uimm2:$imm1)), uimm2:$imm2),
16611661
(XVINSGR2VR_D $xd, (XVPICKVE2GR_D v4f64:$xj, uimm2:$imm1), uimm2:$imm2)>;
1662+
1663+
// XVINSVE0_{W/D}
16621664
def : Pat<(vector_insert v8f32:$xd, FPR32:$fj, uimm3:$imm),
1663-
(XVINSGR2VR_W $xd, (COPY_TO_REGCLASS FPR32:$fj, GPR), uimm3:$imm)>;
1665+
(XVINSVE0_W $xd, (SUBREG_TO_REG (i64 0), FPR32:$fj, sub_32), uimm3:$imm)>;
16641666
def : Pat<(vector_insert v4f64:$xd, FPR64:$fj, uimm2:$imm),
1665-
(XVINSGR2VR_D $xd, (COPY_TO_REGCLASS FPR64:$fj, GPR), uimm2:$imm)>;
1667+
(XVINSVE0_D $xd, (SUBREG_TO_REG (i64 0), FPR64:$fj, sub_64), uimm2:$imm)>;
16661668

16671669
// scalar_to_vector
16681670
def : Pat<(v8f32 (scalar_to_vector FPR32:$fj)),

llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1842,10 +1842,19 @@ def : Pat<(vector_insert v4f32:$vd, (loongarch_movgr2fr_w_la64 GPR:$rj), uimm2:$
18421842
(VINSGR2VR_W $vd, $rj, uimm2:$imm)>;
18431843
def : Pat<(vector_insert v2f64:$vd, (f64 (bitconvert i64:$rj)), uimm1:$imm),
18441844
(VINSGR2VR_D $vd, $rj, uimm1:$imm)>;
1845-
def : Pat<(vector_insert v4f32:$vd, FPR32:$fj, uimm2:$imm),
1846-
(VINSGR2VR_W $vd, (COPY_TO_REGCLASS FPR32:$fj, GPR), uimm2:$imm)>;
1847-
def : Pat<(vector_insert v2f64:$vd, FPR64:$fj, uimm1:$imm),
1848-
(VINSGR2VR_D $vd, (COPY_TO_REGCLASS FPR64:$fj, GPR), uimm1:$imm)>;
1845+
1846+
// VEXTRINS_{W/D}
1847+
foreach imm = 0...3 in {
1848+
defvar Imm = !shl(imm, 4);
1849+
def : Pat<(vector_insert v4f32:$vd, FPR32:$fj, imm),
1850+
(VEXTRINS_W $vd, (SUBREG_TO_REG (i64 0), FPR32:$fj, sub_32), Imm)>;
1851+
}
1852+
1853+
foreach imm = 0...1 in {
1854+
defvar Imm = !shl(imm, 4);
1855+
def : Pat<(vector_insert v2f64:$vd, FPR64:$fj, imm),
1856+
(VEXTRINS_D $vd, (SUBREG_TO_REG (i64 0), FPR64:$fj, sub_64), Imm)>;
1857+
}
18491858

18501859
// scalar_to_vector
18511860
def : Pat<(v4f32 (scalar_to_vector FPR32:$fj)),

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ define void @insert_8xfloat(ptr %src, ptr %dst, float %in) nounwind {
8787
; CHECK-LABEL: insert_8xfloat:
8888
; CHECK: # %bb.0:
8989
; CHECK-NEXT: xvld $xr1, $a0, 0
90-
; CHECK-NEXT: movfr2gr.s $a0, $fa0
91-
; CHECK-NEXT: xvinsgr2vr.w $xr1, $a0, 1
90+
; CHECK-NEXT: # kill: def $f0 killed $f0 def $xr0
91+
; CHECK-NEXT: xvinsve0.w $xr1, $xr0, 1
9292
; CHECK-NEXT: xvst $xr1, $a1, 0
9393
; CHECK-NEXT: ret
9494
%v = load volatile <8 x float>, ptr %src
@@ -101,8 +101,8 @@ define void @insert_4xdouble(ptr %src, ptr %dst, double %in) nounwind {
101101
; CHECK-LABEL: insert_4xdouble:
102102
; CHECK: # %bb.0:
103103
; CHECK-NEXT: xvld $xr1, $a0, 0
104-
; CHECK-NEXT: movfr2gr.d $a0, $fa0
105-
; CHECK-NEXT: xvinsgr2vr.d $xr1, $a0, 1
104+
; CHECK-NEXT: # kill: def $f0_64 killed $f0_64 def $xr0
105+
; CHECK-NEXT: xvinsve0.d $xr1, $xr0, 1
106106
; CHECK-NEXT: xvst $xr1, $a1, 0
107107
; CHECK-NEXT: ret
108108
%v = load volatile <4 x double>, ptr %src

llvm/test/CodeGen/LoongArch/lsx/ir-instruction/insertelement.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ define void @insert_4xfloat(ptr %src, ptr %dst, float %ins) nounwind {
5757
; CHECK-LABEL: insert_4xfloat:
5858
; CHECK: # %bb.0:
5959
; CHECK-NEXT: vld $vr1, $a0, 0
60-
; CHECK-NEXT: movfr2gr.s $a0, $fa0
61-
; CHECK-NEXT: vinsgr2vr.w $vr1, $a0, 1
60+
; CHECK-NEXT: # kill: def $f0 killed $f0 def $vr0
61+
; CHECK-NEXT: vextrins.w $vr1, $vr0, 16
6262
; CHECK-NEXT: vst $vr1, $a1, 0
6363
; CHECK-NEXT: ret
6464
%v = load volatile <4 x float>, ptr %src
@@ -71,8 +71,8 @@ define void @insert_2xdouble(ptr %src, ptr %dst, double %ins) nounwind {
7171
; CHECK-LABEL: insert_2xdouble:
7272
; CHECK: # %bb.0:
7373
; CHECK-NEXT: vld $vr1, $a0, 0
74-
; CHECK-NEXT: movfr2gr.d $a0, $fa0
75-
; CHECK-NEXT: vinsgr2vr.d $vr1, $a0, 1
74+
; CHECK-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0
75+
; CHECK-NEXT: vextrins.d $vr1, $vr0, 16
7676
; CHECK-NEXT: vst $vr1, $a1, 0
7777
; CHECK-NEXT: ret
7878
%v = load volatile <2 x double>, ptr %src

0 commit comments

Comments
 (0)