Skip to content

Commit 8f6d308

Browse files
yjijdSixWeining
authored andcommitted
[CodeGen][LoongArch] Set FP_TO_SINT/FP_TO_UINT to legal for vector types (llvm#79107)
Support the following conversions: v4f32->v4i32, v2f64->v2i64(LSX) v8f32->v8i32, v4f64->v4i64(LASX) v4f32->v4i64, v4f64->v4i32(LASX) (cherry picked from commit 44ba6eb) Change-Id: I879a480fb9afa730144edf2a3ce4304793ef60ec
1 parent a5bc7ef commit 8f6d308

File tree

7 files changed

+208
-4
lines changed

7 files changed

+208
-4
lines changed

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,10 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
256256
{ISD::SETNE, ISD::SETGE, ISD::SETGT, ISD::SETUGE, ISD::SETUGT}, VT,
257257
Expand);
258258
}
259-
setOperationAction({ISD::SINT_TO_FP, ISD::UINT_TO_FP},
260-
{MVT::v4i32, MVT::v2i64}, Legal);
259+
for (MVT VT : {MVT::v4i32, MVT::v2i64}) {
260+
setOperationAction({ISD::SINT_TO_FP, ISD::UINT_TO_FP}, VT, Legal);
261+
setOperationAction({ISD::FP_TO_SINT, ISD::FP_TO_UINT}, VT, Legal);
262+
}
261263
for (MVT VT : {MVT::v4f32, MVT::v2f64}) {
262264
setOperationAction({ISD::FADD, ISD::FSUB}, VT, Legal);
263265
setOperationAction({ISD::FMUL, ISD::FDIV}, VT, Legal);
@@ -300,8 +302,10 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
300302
{ISD::SETNE, ISD::SETGE, ISD::SETGT, ISD::SETUGE, ISD::SETUGT}, VT,
301303
Expand);
302304
}
303-
setOperationAction({ISD::SINT_TO_FP, ISD::UINT_TO_FP},
304-
{MVT::v8i32, MVT::v4i32, MVT::v4i64}, Legal);
305+
for (MVT VT : {MVT::v8i32, MVT::v4i32, MVT::v4i64}) {
306+
setOperationAction({ISD::SINT_TO_FP, ISD::UINT_TO_FP}, VT, Legal);
307+
setOperationAction({ISD::FP_TO_SINT, ISD::FP_TO_UINT}, VT, Legal);
308+
}
305309
for (MVT VT : {MVT::v8f32, MVT::v4f64}) {
306310
setOperationAction({ISD::FADD, ISD::FSUB}, VT, Legal);
307311
setOperationAction({ISD::FMUL, ISD::FDIV}, VT, Legal);

llvm/lib/Target/LoongArch/LoongArchLASXInstrInfo.td

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1633,6 +1633,28 @@ def : Pat<(v4f32 (uint_to_fp v4i64:$vj)),
16331633
(XVFFINT_D_LU v4i64:$vj)),
16341634
sub_128)>;
16351635

1636+
// XVFTINTRZ_{W_S/L_D}
1637+
def : Pat<(v8i32 (fp_to_sint v8f32:$vj)), (XVFTINTRZ_W_S v8f32:$vj)>;
1638+
def : Pat<(v4i64 (fp_to_sint v4f64:$vj)), (XVFTINTRZ_L_D v4f64:$vj)>;
1639+
def : Pat<(v4i64 (fp_to_sint v4f32:$vj)),
1640+
(VEXT2XV_D_W (SUBREG_TO_REG (i64 0), (VFTINTRZ_W_S v4f32:$vj),
1641+
sub_128))>;
1642+
def : Pat<(v4i32 (fp_to_sint (v4f64 LASX256:$vj))),
1643+
(EXTRACT_SUBREG (XVFTINTRZ_W_S (XVFCVT_S_D (XVPERMI_D v4f64:$vj, 238),
1644+
v4f64:$vj)),
1645+
sub_128)>;
1646+
1647+
// XVFTINTRZ_{W_SU/L_DU}
1648+
def : Pat<(v8i32 (fp_to_uint v8f32:$vj)), (XVFTINTRZ_WU_S v8f32:$vj)>;
1649+
def : Pat<(v4i64 (fp_to_uint v4f64:$vj)), (XVFTINTRZ_LU_D v4f64:$vj)>;
1650+
def : Pat<(v4i64 (fp_to_uint v4f32:$vj)),
1651+
(VEXT2XV_DU_WU (SUBREG_TO_REG (i64 0), (VFTINTRZ_WU_S v4f32:$vj),
1652+
sub_128))>;
1653+
def : Pat<(v4i32 (fp_to_uint (v4f64 LASX256:$vj))),
1654+
(EXTRACT_SUBREG (XVFTINTRZ_W_S (XVFCVT_S_D (XVPERMI_D v4f64:$vj, 238),
1655+
v4f64:$vj)),
1656+
sub_128)>;
1657+
16361658
} // Predicates = [HasExtLASX]
16371659

16381660
/// Intrinsic pattern

llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1750,6 +1750,14 @@ def : Pat<(v2f64 (sint_to_fp v2i64:$vj)), (VFFINT_D_L v2i64:$vj)>;
17501750
def : Pat<(v4f32 (uint_to_fp v4i32:$vj)), (VFFINT_S_WU v4i32:$vj)>;
17511751
def : Pat<(v2f64 (uint_to_fp v2i64:$vj)), (VFFINT_D_LU v2i64:$vj)>;
17521752

1753+
// VFTINTRZ_{W_S/L_D}
1754+
def : Pat<(v4i32 (fp_to_sint v4f32:$vj)), (VFTINTRZ_W_S v4f32:$vj)>;
1755+
def : Pat<(v2i64 (fp_to_sint v2f64:$vj)), (VFTINTRZ_L_D v2f64:$vj)>;
1756+
1757+
// VFTINTRZ_{W_SU/L_DU}
1758+
def : Pat<(v4i32 (fp_to_uint v4f32:$vj)), (VFTINTRZ_WU_S v4f32:$vj)>;
1759+
def : Pat<(v2i64 (fp_to_uint v2f64:$vj)), (VFTINTRZ_LU_D v2f64:$vj)>;
1760+
17531761
} // Predicates = [HasExtLSX]
17541762

17551763
/// Intrinsic pattern
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2+
; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s
3+
4+
define void @fptosi_v8f32_v8i32(ptr %res, ptr %in){
5+
; CHECK-LABEL: fptosi_v8f32_v8i32:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: xvld $xr0, $a1, 0
8+
; CHECK-NEXT: xvftintrz.w.s $xr0, $xr0
9+
; CHECK-NEXT: xvst $xr0, $a0, 0
10+
; CHECK-NEXT: ret
11+
%v0 = load <8 x float>, ptr %in
12+
%v1 = fptosi <8 x float> %v0 to <8 x i32>
13+
store <8 x i32> %v1, ptr %res
14+
ret void
15+
}
16+
17+
define void @fptosi_v4f64_v4i64(ptr %res, ptr %in){
18+
; CHECK-LABEL: fptosi_v4f64_v4i64:
19+
; CHECK: # %bb.0:
20+
; CHECK-NEXT: xvld $xr0, $a1, 0
21+
; CHECK-NEXT: xvftintrz.l.d $xr0, $xr0
22+
; CHECK-NEXT: xvst $xr0, $a0, 0
23+
; CHECK-NEXT: ret
24+
%v0 = load <4 x double>, ptr %in
25+
%v1 = fptosi <4 x double> %v0 to <4 x i64>
26+
store <4 x i64> %v1, ptr %res
27+
ret void
28+
}
29+
30+
define void @fptosi_v4f64_v4i32(ptr %res, ptr %in){
31+
; CHECK-LABEL: fptosi_v4f64_v4i32:
32+
; CHECK: # %bb.0:
33+
; CHECK-NEXT: xvld $xr0, $a1, 0
34+
; CHECK-NEXT: xvpermi.d $xr1, $xr0, 238
35+
; CHECK-NEXT: xvfcvt.s.d $xr0, $xr1, $xr0
36+
; CHECK-NEXT: xvftintrz.w.s $xr0, $xr0
37+
; CHECK-NEXT: vst $vr0, $a0, 0
38+
; CHECK-NEXT: ret
39+
%v0 = load <4 x double>, ptr %in
40+
%v1 = fptosi <4 x double> %v0 to <4 x i32>
41+
store <4 x i32> %v1, ptr %res
42+
ret void
43+
}
44+
45+
define void @fptosi_v4f32_v4i64(ptr %res, ptr %in){
46+
; CHECK-LABEL: fptosi_v4f32_v4i64:
47+
; CHECK: # %bb.0:
48+
; CHECK-NEXT: vld $vr0, $a1, 0
49+
; CHECK-NEXT: vftintrz.w.s $vr0, $vr0
50+
; CHECK-NEXT: vext2xv.d.w $xr0, $xr0
51+
; CHECK-NEXT: xvst $xr0, $a0, 0
52+
; CHECK-NEXT: ret
53+
%v0 = load <4 x float>, ptr %in
54+
%v1 = fptosi <4 x float> %v0 to <4 x i64>
55+
store <4 x i64> %v1, ptr %res
56+
ret void
57+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2+
; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s
3+
4+
define void @fptoui_v8f32_v8i32(ptr %res, ptr %in){
5+
; CHECK-LABEL: fptoui_v8f32_v8i32:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: xvld $xr0, $a1, 0
8+
; CHECK-NEXT: xvftintrz.wu.s $xr0, $xr0
9+
; CHECK-NEXT: xvst $xr0, $a0, 0
10+
; CHECK-NEXT: ret
11+
%v0 = load <8 x float>, ptr %in
12+
%v1 = fptoui <8 x float> %v0 to <8 x i32>
13+
store <8 x i32> %v1, ptr %res
14+
ret void
15+
}
16+
17+
define void @fptoui_v4f64_v4i64(ptr %res, ptr %in){
18+
; CHECK-LABEL: fptoui_v4f64_v4i64:
19+
; CHECK: # %bb.0:
20+
; CHECK-NEXT: xvld $xr0, $a1, 0
21+
; CHECK-NEXT: xvftintrz.lu.d $xr0, $xr0
22+
; CHECK-NEXT: xvst $xr0, $a0, 0
23+
; CHECK-NEXT: ret
24+
%v0 = load <4 x double>, ptr %in
25+
%v1 = fptoui <4 x double> %v0 to <4 x i64>
26+
store <4 x i64> %v1, ptr %res
27+
ret void
28+
}
29+
30+
define void @fptoui_v4f64_v4i32(ptr %res, ptr %in){
31+
; CHECK-LABEL: fptoui_v4f64_v4i32:
32+
; CHECK: # %bb.0:
33+
; CHECK-NEXT: xvld $xr0, $a1, 0
34+
; CHECK-NEXT: xvpermi.d $xr1, $xr0, 238
35+
; CHECK-NEXT: xvfcvt.s.d $xr0, $xr1, $xr0
36+
; CHECK-NEXT: xvftintrz.w.s $xr0, $xr0
37+
; CHECK-NEXT: vst $vr0, $a0, 0
38+
; CHECK-NEXT: ret
39+
%v0 = load <4 x double>, ptr %in
40+
%v1 = fptoui <4 x double> %v0 to <4 x i32>
41+
store <4 x i32> %v1, ptr %res
42+
ret void
43+
}
44+
45+
define void @fptoui_v4f32_v4i64(ptr %res, ptr %in){
46+
; CHECK-LABEL: fptoui_v4f32_v4i64:
47+
; CHECK: # %bb.0:
48+
; CHECK-NEXT: vld $vr0, $a1, 0
49+
; CHECK-NEXT: vftintrz.wu.s $vr0, $vr0
50+
; CHECK-NEXT: vext2xv.du.wu $xr0, $xr0
51+
; CHECK-NEXT: xvst $xr0, $a0, 0
52+
; CHECK-NEXT: ret
53+
%v0 = load <4 x float>, ptr %in
54+
%v1 = fptoui <4 x float> %v0 to <4 x i64>
55+
store <4 x i64> %v1, ptr %res
56+
ret void
57+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2+
; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s
3+
4+
define void @fptosi_v4f32_v4i32(ptr %res, ptr %in){
5+
; CHECK-LABEL: fptosi_v4f32_v4i32:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: vld $vr0, $a1, 0
8+
; CHECK-NEXT: vftintrz.w.s $vr0, $vr0
9+
; CHECK-NEXT: vst $vr0, $a0, 0
10+
; CHECK-NEXT: ret
11+
%v0 = load <4 x float>, ptr %in
12+
%v1 = fptosi <4 x float> %v0 to <4 x i32>
13+
store <4 x i32> %v1, ptr %res
14+
ret void
15+
}
16+
17+
define void @fptosi_v2f64_v2i64(ptr %res, ptr %in){
18+
; CHECK-LABEL: fptosi_v2f64_v2i64:
19+
; CHECK: # %bb.0:
20+
; CHECK-NEXT: vld $vr0, $a1, 0
21+
; CHECK-NEXT: vftintrz.l.d $vr0, $vr0
22+
; CHECK-NEXT: vst $vr0, $a0, 0
23+
; CHECK-NEXT: ret
24+
%v0 = load <2 x double>, ptr %in
25+
%v1 = fptosi <2 x double> %v0 to <2 x i64>
26+
store <2 x i64> %v1, ptr %res
27+
ret void
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2+
; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s
3+
4+
define void @fptoui_v4f32_v4i32(ptr %res, ptr %in){
5+
; CHECK-LABEL: fptoui_v4f32_v4i32:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: vld $vr0, $a1, 0
8+
; CHECK-NEXT: vftintrz.wu.s $vr0, $vr0
9+
; CHECK-NEXT: vst $vr0, $a0, 0
10+
; CHECK-NEXT: ret
11+
%v0 = load <4 x float>, ptr %in
12+
%v1 = fptoui <4 x float> %v0 to <4 x i32>
13+
store <4 x i32> %v1, ptr %res
14+
ret void
15+
}
16+
17+
define void @fptoui_v2f64_v2i64(ptr %res, ptr %in){
18+
; CHECK-LABEL: fptoui_v2f64_v2i64:
19+
; CHECK: # %bb.0:
20+
; CHECK-NEXT: vld $vr0, $a1, 0
21+
; CHECK-NEXT: vftintrz.lu.d $vr0, $vr0
22+
; CHECK-NEXT: vst $vr0, $a0, 0
23+
; CHECK-NEXT: ret
24+
%v0 = load <2 x double>, ptr %in
25+
%v1 = fptoui <2 x double> %v0 to <2 x i64>
26+
store <2 x i64> %v1, ptr %res
27+
ret void
28+
}

0 commit comments

Comments
 (0)