Skip to content

Commit a5bc7ef

Browse files
yjijdSixWeining
authored andcommitted
[CodeGen][LoongArch] Set SINT_TO_FP/UINT_TO_FP to legal for vector types (llvm#78924)
Support the following conversions: v4i32->v4f32, v2i64->v2f64(LSX) v8i32->v8f32, v4i64->v4f64(LASX) v4i32->v4f64, v4i64->v4f32(LASX) (cherry picked from commit f799f93) Change-Id: Ib8460a68a74d9d69edbdf6abc8bf193dcaeb7c13
1 parent 959a4cd commit a5bc7ef

File tree

7 files changed

+204
-0
lines changed

7 files changed

+204
-0
lines changed

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,8 @@ 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);
259261
for (MVT VT : {MVT::v4f32, MVT::v2f64}) {
260262
setOperationAction({ISD::FADD, ISD::FSUB}, VT, Legal);
261263
setOperationAction({ISD::FMUL, ISD::FDIV}, VT, Legal);
@@ -298,6 +300,8 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
298300
{ISD::SETNE, ISD::SETGE, ISD::SETGT, ISD::SETUGE, ISD::SETUGT}, VT,
299301
Expand);
300302
}
303+
setOperationAction({ISD::SINT_TO_FP, ISD::UINT_TO_FP},
304+
{MVT::v8i32, MVT::v4i32, MVT::v4i64}, Legal);
301305
for (MVT VT : {MVT::v8f32, MVT::v4f64}) {
302306
setOperationAction({ISD::FADD, ISD::FSUB}, VT, Legal);
303307
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
@@ -1611,6 +1611,28 @@ foreach vt = [v32i8, v16i16, v8i32, v4i64, v8f32, v4f64] in
16111611
def : Pat<(fneg (v8f32 LASX256:$xj)), (XVBITREVI_W LASX256:$xj, 31)>;
16121612
def : Pat<(fneg (v4f64 LASX256:$xj)), (XVBITREVI_D LASX256:$xj, 63)>;
16131613

1614+
// XVFFINT_{S_W/D_L}
1615+
def : Pat<(v8f32 (sint_to_fp v8i32:$vj)), (XVFFINT_S_W v8i32:$vj)>;
1616+
def : Pat<(v4f64 (sint_to_fp v4i64:$vj)), (XVFFINT_D_L v4i64:$vj)>;
1617+
def : Pat<(v4f64 (sint_to_fp v4i32:$vj)),
1618+
(XVFFINT_D_L (VEXT2XV_D_W (SUBREG_TO_REG (i64 0), v4i32:$vj,
1619+
sub_128)))>;
1620+
def : Pat<(v4f32 (sint_to_fp v4i64:$vj)),
1621+
(EXTRACT_SUBREG (XVFCVT_S_D (XVPERMI_D (XVFFINT_D_L v4i64:$vj), 238),
1622+
(XVFFINT_D_L v4i64:$vj)),
1623+
sub_128)>;
1624+
1625+
// XVFFINT_{S_WU/D_LU}
1626+
def : Pat<(v8f32 (uint_to_fp v8i32:$vj)), (XVFFINT_S_WU v8i32:$vj)>;
1627+
def : Pat<(v4f64 (uint_to_fp v4i64:$vj)), (XVFFINT_D_LU v4i64:$vj)>;
1628+
def : Pat<(v4f64 (uint_to_fp v4i32:$vj)),
1629+
(XVFFINT_D_LU (VEXT2XV_DU_WU (SUBREG_TO_REG (i64 0), v4i32:$vj,
1630+
sub_128)))>;
1631+
def : Pat<(v4f32 (uint_to_fp v4i64:$vj)),
1632+
(EXTRACT_SUBREG (XVFCVT_S_D (XVPERMI_D (XVFFINT_D_LU v4i64:$vj), 238),
1633+
(XVFFINT_D_LU v4i64:$vj)),
1634+
sub_128)>;
1635+
16141636
} // Predicates = [HasExtLASX]
16151637

16161638
/// Intrinsic pattern

llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1742,6 +1742,14 @@ foreach vt = [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64] in
17421742
def : Pat<(fneg (v4f32 LSX128:$vj)), (VBITREVI_W LSX128:$vj, 31)>;
17431743
def : Pat<(fneg (v2f64 LSX128:$vj)), (VBITREVI_D LSX128:$vj, 63)>;
17441744

1745+
// VFFINT_{S_W/D_L}
1746+
def : Pat<(v4f32 (sint_to_fp v4i32:$vj)), (VFFINT_S_W v4i32:$vj)>;
1747+
def : Pat<(v2f64 (sint_to_fp v2i64:$vj)), (VFFINT_D_L v2i64:$vj)>;
1748+
1749+
// VFFINT_{S_WU/D_LU}
1750+
def : Pat<(v4f32 (uint_to_fp v4i32:$vj)), (VFFINT_S_WU v4i32:$vj)>;
1751+
def : Pat<(v2f64 (uint_to_fp v2i64:$vj)), (VFFINT_D_LU v2i64:$vj)>;
1752+
17451753
} // Predicates = [HasExtLSX]
17461754

17471755
/// 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 @sitofp_v8i32_v8f32(ptr %res, ptr %in){
5+
; CHECK-LABEL: sitofp_v8i32_v8f32:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: xvld $xr0, $a1, 0
8+
; CHECK-NEXT: xvffint.s.w $xr0, $xr0
9+
; CHECK-NEXT: xvst $xr0, $a0, 0
10+
; CHECK-NEXT: ret
11+
%v0 = load <8 x i32>, ptr %in
12+
%v1 = sitofp <8 x i32> %v0 to <8 x float>
13+
store <8 x float> %v1, ptr %res
14+
ret void
15+
}
16+
17+
define void @sitofp_v4f64_v4f64(ptr %res, ptr %in){
18+
; CHECK-LABEL: sitofp_v4f64_v4f64:
19+
; CHECK: # %bb.0:
20+
; CHECK-NEXT: xvld $xr0, $a1, 0
21+
; CHECK-NEXT: xvffint.d.l $xr0, $xr0
22+
; CHECK-NEXT: xvst $xr0, $a0, 0
23+
; CHECK-NEXT: ret
24+
%v0 = load <4 x i64>, ptr %in
25+
%v1 = sitofp <4 x i64> %v0 to <4 x double>
26+
store <4 x double> %v1, ptr %res
27+
ret void
28+
}
29+
30+
define void @sitofp_v4i64_v4f32(ptr %res, ptr %in){
31+
; CHECK-LABEL: sitofp_v4i64_v4f32:
32+
; CHECK: # %bb.0:
33+
; CHECK-NEXT: xvld $xr0, $a1, 0
34+
; CHECK-NEXT: xvffint.d.l $xr0, $xr0
35+
; CHECK-NEXT: xvpermi.d $xr1, $xr0, 238
36+
; CHECK-NEXT: xvfcvt.s.d $xr0, $xr1, $xr0
37+
; CHECK-NEXT: vst $vr0, $a0, 0
38+
; CHECK-NEXT: ret
39+
%v0 = load <4 x i64>, ptr %in
40+
%v1 = sitofp <4 x i64> %v0 to <4 x float>
41+
store <4 x float> %v1, ptr %res
42+
ret void
43+
}
44+
45+
define void @sitofp_v4i32_v4f64(ptr %res, ptr %in){
46+
; CHECK-LABEL: sitofp_v4i32_v4f64:
47+
; CHECK: # %bb.0:
48+
; CHECK-NEXT: vld $vr0, $a1, 0
49+
; CHECK-NEXT: vext2xv.d.w $xr0, $xr0
50+
; CHECK-NEXT: xvffint.d.l $xr0, $xr0
51+
; CHECK-NEXT: xvst $xr0, $a0, 0
52+
; CHECK-NEXT: ret
53+
%v0 = load <4 x i32>, ptr %in
54+
%v1 = sitofp <4 x i32> %v0 to <4 x double>
55+
store <4 x double> %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 @uitofp_v8i32_v8f32(ptr %res, ptr %in){
5+
; CHECK-LABEL: uitofp_v8i32_v8f32:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: xvld $xr0, $a1, 0
8+
; CHECK-NEXT: xvffint.s.wu $xr0, $xr0
9+
; CHECK-NEXT: xvst $xr0, $a0, 0
10+
; CHECK-NEXT: ret
11+
%v0 = load <8 x i32>, ptr %in
12+
%v1 = uitofp <8 x i32> %v0 to <8 x float>
13+
store <8 x float> %v1, ptr %res
14+
ret void
15+
}
16+
17+
define void @uitofp_v4f64_v4f64(ptr %res, ptr %in){
18+
; CHECK-LABEL: uitofp_v4f64_v4f64:
19+
; CHECK: # %bb.0:
20+
; CHECK-NEXT: xvld $xr0, $a1, 0
21+
; CHECK-NEXT: xvffint.d.lu $xr0, $xr0
22+
; CHECK-NEXT: xvst $xr0, $a0, 0
23+
; CHECK-NEXT: ret
24+
%v0 = load <4 x i64>, ptr %in
25+
%v1 = uitofp <4 x i64> %v0 to <4 x double>
26+
store <4 x double> %v1, ptr %res
27+
ret void
28+
}
29+
30+
define void @uitofp_v4i64_v4f32(ptr %res, ptr %in){
31+
; CHECK-LABEL: uitofp_v4i64_v4f32:
32+
; CHECK: # %bb.0:
33+
; CHECK-NEXT: xvld $xr0, $a1, 0
34+
; CHECK-NEXT: xvffint.d.lu $xr0, $xr0
35+
; CHECK-NEXT: xvpermi.d $xr1, $xr0, 238
36+
; CHECK-NEXT: xvfcvt.s.d $xr0, $xr1, $xr0
37+
; CHECK-NEXT: vst $vr0, $a0, 0
38+
; CHECK-NEXT: ret
39+
%v0 = load <4 x i64>, ptr %in
40+
%v1 = uitofp <4 x i64> %v0 to <4 x float>
41+
store <4 x float> %v1, ptr %res
42+
ret void
43+
}
44+
45+
define void @uitofp_v4i32_v4f64(ptr %res, ptr %in){
46+
; CHECK-LABEL: uitofp_v4i32_v4f64:
47+
; CHECK: # %bb.0:
48+
; CHECK-NEXT: vld $vr0, $a1, 0
49+
; CHECK-NEXT: vext2xv.du.wu $xr0, $xr0
50+
; CHECK-NEXT: xvffint.d.lu $xr0, $xr0
51+
; CHECK-NEXT: xvst $xr0, $a0, 0
52+
; CHECK-NEXT: ret
53+
%v0 = load <4 x i32>, ptr %in
54+
%v1 = uitofp <4 x i32> %v0 to <4 x double>
55+
store <4 x double> %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 @sitofp_v4i32_v4f32(ptr %res, ptr %in){
5+
; CHECK-LABEL: sitofp_v4i32_v4f32:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: vld $vr0, $a1, 0
8+
; CHECK-NEXT: vffint.s.w $vr0, $vr0
9+
; CHECK-NEXT: vst $vr0, $a0, 0
10+
; CHECK-NEXT: ret
11+
%v0 = load <4 x i32>, ptr %in
12+
%v1 = sitofp <4 x i32> %v0 to <4 x float>
13+
store <4 x float> %v1, ptr %res
14+
ret void
15+
}
16+
17+
define void @sitofp_v2i64_v2f64(ptr %res, ptr %in){
18+
; CHECK-LABEL: sitofp_v2i64_v2f64:
19+
; CHECK: # %bb.0:
20+
; CHECK-NEXT: vld $vr0, $a1, 0
21+
; CHECK-NEXT: vffint.d.l $vr0, $vr0
22+
; CHECK-NEXT: vst $vr0, $a0, 0
23+
; CHECK-NEXT: ret
24+
%v0 = load <2 x i64>, ptr %in
25+
%v1 = sitofp <2 x i64> %v0 to <2 x double>
26+
store <2 x double> %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 @uitofp_v4i32_v4f32(ptr %res, ptr %in){
5+
; CHECK-LABEL: uitofp_v4i32_v4f32:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: vld $vr0, $a1, 0
8+
; CHECK-NEXT: vffint.s.wu $vr0, $vr0
9+
; CHECK-NEXT: vst $vr0, $a0, 0
10+
; CHECK-NEXT: ret
11+
%v0 = load <4 x i32>, ptr %in
12+
%v1 = uitofp <4 x i32> %v0 to <4 x float>
13+
store <4 x float> %v1, ptr %res
14+
ret void
15+
}
16+
17+
define void @uitofp_v2i64_v2f64(ptr %res, ptr %in){
18+
; CHECK-LABEL: uitofp_v2i64_v2f64:
19+
; CHECK: # %bb.0:
20+
; CHECK-NEXT: vld $vr0, $a1, 0
21+
; CHECK-NEXT: vffint.d.lu $vr0, $vr0
22+
; CHECK-NEXT: vst $vr0, $a0, 0
23+
; CHECK-NEXT: ret
24+
%v0 = load <2 x i64>, ptr %in
25+
%v1 = uitofp <2 x i64> %v0 to <2 x double>
26+
store <2 x double> %v1, ptr %res
27+
ret void
28+
}

0 commit comments

Comments
 (0)