Skip to content

Commit f799f93

Browse files
authored
[CodeGen][LoongArch] Set SINT_TO_FP/UINT_TO_FP to legal for vector types (#78924)
Support the following conversions: v4i32->v4f32, v2i64->v2f64(LSX) v8i32->v8f32, v4i64->v4f64(LASX) v4i32->v4f64, v4i64->v4f32(LASX)
1 parent 297b770 commit f799f93

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
@@ -265,6 +265,8 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
265265
{ISD::SETNE, ISD::SETGE, ISD::SETGT, ISD::SETUGE, ISD::SETUGT}, VT,
266266
Expand);
267267
}
268+
setOperationAction({ISD::SINT_TO_FP, ISD::UINT_TO_FP},
269+
{MVT::v4i32, MVT::v2i64}, Legal);
268270
for (MVT VT : {MVT::v4f32, MVT::v2f64}) {
269271
setOperationAction({ISD::FADD, ISD::FSUB}, VT, Legal);
270272
setOperationAction({ISD::FMUL, ISD::FDIV}, VT, Legal);
@@ -307,6 +309,8 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
307309
{ISD::SETNE, ISD::SETGE, ISD::SETGT, ISD::SETUGE, ISD::SETUGT}, VT,
308310
Expand);
309311
}
312+
setOperationAction({ISD::SINT_TO_FP, ISD::UINT_TO_FP},
313+
{MVT::v8i32, MVT::v4i32, MVT::v4i64}, Legal);
310314
for (MVT VT : {MVT::v8f32, MVT::v4f64}) {
311315
setOperationAction({ISD::FADD, ISD::FSUB}, VT, Legal);
312316
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
@@ -1615,6 +1615,28 @@ foreach vt = [v32i8, v16i16, v8i32, v4i64, v8f32, v4f64] in
16151615
def : Pat<(fneg (v8f32 LASX256:$xj)), (XVBITREVI_W LASX256:$xj, 31)>;
16161616
def : Pat<(fneg (v4f64 LASX256:$xj)), (XVBITREVI_D LASX256:$xj, 63)>;
16171617

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

16201642
/// Intrinsic pattern

llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td

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

1749+
// VFFINT_{S_W/D_L}
1750+
def : Pat<(v4f32 (sint_to_fp v4i32:$vj)), (VFFINT_S_W v4i32:$vj)>;
1751+
def : Pat<(v2f64 (sint_to_fp v2i64:$vj)), (VFFINT_D_L v2i64:$vj)>;
1752+
1753+
// VFFINT_{S_WU/D_LU}
1754+
def : Pat<(v4f32 (uint_to_fp v4i32:$vj)), (VFFINT_S_WU v4i32:$vj)>;
1755+
def : Pat<(v2f64 (uint_to_fp v2i64:$vj)), (VFFINT_D_LU v2i64:$vj)>;
1756+
17491757
} // Predicates = [HasExtLSX]
17501758

17511759
/// 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)