Skip to content

Commit 85e06a7

Browse files
tangaactstellar
authored andcommitted
[LoongArch] Fix fp_to_uint/fp_to_sint conversion errors for lasx (#137129)
Prvious `fp_to_uint/fp_to_sint` patterns for `v4f64 -> v4i32` are wrong. Conversion error was triggered after pr #126456. (cherry picked from commit b5c7724)
1 parent ff2e8f9 commit 85e06a7

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
@@ -1792,24 +1792,24 @@ def : Pat<(v4f32 (uint_to_fp v4i64:$vj)),
17921792
// XVFTINTRZ_{W_S/L_D}
17931793
def : Pat<(v8i32 (fp_to_sint v8f32:$vj)), (XVFTINTRZ_W_S v8f32:$vj)>;
17941794
def : Pat<(v4i64 (fp_to_sint v4f64:$vj)), (XVFTINTRZ_L_D v4f64:$vj)>;
1795-
def : Pat<(v4i64 (fp_to_sint v4f32:$vj)),
1796-
(VEXT2XV_D_W (SUBREG_TO_REG (i64 0), (VFTINTRZ_W_S v4f32:$vj),
1797-
sub_128))>;
1798-
def : Pat<(v4i32 (fp_to_sint (v4f64 LASX256:$vj))),
1799-
(EXTRACT_SUBREG (XVFTINTRZ_W_S (XVFCVT_S_D (XVPERMI_D v4f64:$vj, 238),
1800-
v4f64:$vj)),
1801-
sub_128)>;
1795+
def : Pat<(v4i64(fp_to_sint v4f32:$vj)), (VEXT2XV_D_W(SUBREG_TO_REG(i64 0),
1796+
(VFTINTRZ_W_S v4f32:$vj),
1797+
sub_128))>;
1798+
def : Pat<(v4i32(fp_to_sint v4f64:$vj)),
1799+
(EXTRACT_SUBREG(XVPICKEV_W(XVPERMI_D(XVFTINTRZ_L_D v4f64:$vj), 238),
1800+
(XVFTINTRZ_L_D v4f64:$vj)),
1801+
sub_128)>;
18021802

18031803
// XVFTINTRZ_{W_SU/L_DU}
18041804
def : Pat<(v8i32 (fp_to_uint v8f32:$vj)), (XVFTINTRZ_WU_S v8f32:$vj)>;
18051805
def : Pat<(v4i64 (fp_to_uint v4f64:$vj)), (XVFTINTRZ_LU_D v4f64:$vj)>;
1806-
def : Pat<(v4i64 (fp_to_uint v4f32:$vj)),
1807-
(VEXT2XV_DU_WU (SUBREG_TO_REG (i64 0), (VFTINTRZ_WU_S v4f32:$vj),
1808-
sub_128))>;
1809-
def : Pat<(v4i32 (fp_to_uint (v4f64 LASX256:$vj))),
1810-
(EXTRACT_SUBREG (XVFTINTRZ_W_S (XVFCVT_S_D (XVPERMI_D v4f64:$vj, 238),
1811-
v4f64:$vj)),
1812-
sub_128)>;
1806+
def : Pat<(v4i64(fp_to_uint v4f32:$vj)), (VEXT2XV_DU_WU(SUBREG_TO_REG(i64 0),
1807+
(VFTINTRZ_WU_S v4f32:$vj),
1808+
sub_128))>;
1809+
def : Pat<(v4i32(fp_to_uint v4f64:$vj)),
1810+
(EXTRACT_SUBREG(XVPICKEV_W(XVPERMI_D(XVFTINTRZ_LU_D v4f64:$vj), 238),
1811+
(XVFTINTRZ_LU_D v4f64:$vj)),
1812+
sub_128)>;
18131813

18141814
// XVPERMI_Q
18151815
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)