Skip to content

Commit b5c7724

Browse files
authored
[LoongArch] Fix fp_to_uint/fp_to_sint conversion errors for lasx (llvm#137129)
Prvious `fp_to_uint/fp_to_sint` patterns for `v4f64 -> v4i32` are wrong. Conversion error was triggered after pr llvm#126456.
1 parent a123891 commit b5c7724

File tree

3 files changed

+18
-18
lines changed

3 files changed

+18
-18
lines changed

llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1815,24 +1815,24 @@ def : Pat<(v4f32 (uint_to_fp v4i64:$vj)),
18151815
// XVFTINTRZ_{W_S/L_D}
18161816
def : Pat<(v8i32 (fp_to_sint v8f32:$vj)), (XVFTINTRZ_W_S v8f32:$vj)>;
18171817
def : Pat<(v4i64 (fp_to_sint v4f64:$vj)), (XVFTINTRZ_L_D v4f64:$vj)>;
1818-
def : Pat<(v4i64 (fp_to_sint v4f32:$vj)),
1819-
(VEXT2XV_D_W (SUBREG_TO_REG (i64 0), (VFTINTRZ_W_S v4f32:$vj),
1820-
sub_128))>;
1821-
def : Pat<(v4i32 (fp_to_sint (v4f64 LASX256:$vj))),
1822-
(EXTRACT_SUBREG (XVFTINTRZ_W_S (XVFCVT_S_D (XVPERMI_D v4f64:$vj, 238),
1823-
v4f64:$vj)),
1824-
sub_128)>;
1818+
def : Pat<(v4i64(fp_to_sint v4f32:$vj)), (VEXT2XV_D_W(SUBREG_TO_REG(i64 0),
1819+
(VFTINTRZ_W_S v4f32:$vj),
1820+
sub_128))>;
1821+
def : Pat<(v4i32(fp_to_sint v4f64:$vj)),
1822+
(EXTRACT_SUBREG(XVPICKEV_W(XVPERMI_D(XVFTINTRZ_L_D v4f64:$vj), 238),
1823+
(XVFTINTRZ_L_D v4f64:$vj)),
1824+
sub_128)>;
18251825

18261826
// XVFTINTRZ_{W_SU/L_DU}
18271827
def : Pat<(v8i32 (fp_to_uint v8f32:$vj)), (XVFTINTRZ_WU_S v8f32:$vj)>;
18281828
def : Pat<(v4i64 (fp_to_uint v4f64:$vj)), (XVFTINTRZ_LU_D v4f64:$vj)>;
1829-
def : Pat<(v4i64 (fp_to_uint v4f32:$vj)),
1830-
(VEXT2XV_DU_WU (SUBREG_TO_REG (i64 0), (VFTINTRZ_WU_S v4f32:$vj),
1831-
sub_128))>;
1832-
def : Pat<(v4i32 (fp_to_uint (v4f64 LASX256:$vj))),
1833-
(EXTRACT_SUBREG (XVFTINTRZ_W_S (XVFCVT_S_D (XVPERMI_D v4f64:$vj, 238),
1834-
v4f64:$vj)),
1835-
sub_128)>;
1829+
def : Pat<(v4i64(fp_to_uint v4f32:$vj)), (VEXT2XV_DU_WU(SUBREG_TO_REG(i64 0),
1830+
(VFTINTRZ_WU_S v4f32:$vj),
1831+
sub_128))>;
1832+
def : Pat<(v4i32(fp_to_uint v4f64:$vj)),
1833+
(EXTRACT_SUBREG(XVPICKEV_W(XVPERMI_D(XVFTINTRZ_LU_D v4f64:$vj), 238),
1834+
(XVFTINTRZ_LU_D v4f64:$vj)),
1835+
sub_128)>;
18361836

18371837
// XVPERMI_Q
18381838
foreach vt = [v32i8, v16i16, v8i32, v4i64, v8f32, v4f64] in

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ define void @fptosi_v4f64_v4i32(ptr %res, ptr %in){
3131
; CHECK-LABEL: fptosi_v4f64_v4i32:
3232
; CHECK: # %bb.0:
3333
; CHECK-NEXT: xvld $xr0, $a1, 0
34+
; CHECK-NEXT: xvftintrz.l.d $xr0, $xr0
3435
; CHECK-NEXT: xvpermi.d $xr1, $xr0, 238
35-
; CHECK-NEXT: xvfcvt.s.d $xr0, $xr1, $xr0
36-
; CHECK-NEXT: xvftintrz.w.s $xr0, $xr0
36+
; CHECK-NEXT: xvpickev.w $xr0, $xr1, $xr0
3737
; CHECK-NEXT: vst $vr0, $a0, 0
3838
; CHECK-NEXT: ret
3939
%v0 = load <4 x double>, ptr %in

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ define void @fptoui_v4f64_v4i32(ptr %res, ptr %in){
3131
; CHECK-LABEL: fptoui_v4f64_v4i32:
3232
; CHECK: # %bb.0:
3333
; CHECK-NEXT: xvld $xr0, $a1, 0
34+
; CHECK-NEXT: xvftintrz.lu.d $xr0, $xr0
3435
; CHECK-NEXT: xvpermi.d $xr1, $xr0, 238
35-
; CHECK-NEXT: xvfcvt.s.d $xr0, $xr1, $xr0
36-
; CHECK-NEXT: xvftintrz.w.s $xr0, $xr0
36+
; CHECK-NEXT: xvpickev.w $xr0, $xr1, $xr0
3737
; CHECK-NEXT: vst $vr0, $a0, 0
3838
; CHECK-NEXT: ret
3939
%v0 = load <4 x double>, ptr %in

0 commit comments

Comments
 (0)