Skip to content

Commit 22774bb

Browse files
authored
[RISCV][GISel] Add Zfa FP legalization and full tests for 9 insn (llvm#118723)
ceil, floor, round, roundeven, trunc, rint, nearbyint, maximum, minimum.
1 parent a821937 commit 22774bb

File tree

5 files changed

+273
-1
lines changed

5 files changed

+273
-1
lines changed

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -590,12 +590,19 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
590590
.libcallFor(ST.is64Bit(), {{s32, s128}, {s64, s128}, {s128, s128}});
591591

592592
// FIXME: We can do custom inline expansion like SelectionDAG.
593-
// FIXME: Legal with Zfa.
594593
getActionDefinitionsBuilder({G_FCEIL, G_FFLOOR, G_FRINT, G_FNEARBYINT,
595594
G_INTRINSIC_TRUNC, G_INTRINSIC_ROUND,
596595
G_INTRINSIC_ROUNDEVEN})
596+
.legalFor(ST.hasStdExtZfa(), {s32})
597+
.legalFor(ST.hasStdExtZfa() && ST.hasStdExtD(), {s64})
598+
.legalFor(ST.hasStdExtZfa() && ST.hasStdExtZfh(), {s16})
597599
.libcallFor({s32, s64});
598600

601+
getActionDefinitionsBuilder({G_FMAXIMUM, G_FMINIMUM})
602+
.legalFor(ST.hasStdExtZfa(), {s32})
603+
.legalFor(ST.hasStdExtZfa() && ST.hasStdExtD(), {s64})
604+
.legalFor(ST.hasStdExtZfa() && ST.hasStdExtZfh(), {s16});
605+
599606
getActionDefinitionsBuilder({G_FCOS, G_FSIN, G_FTAN, G_FPOW, G_FLOG, G_FLOG2,
600607
G_FLOG10, G_FEXP, G_FEXP2, G_FEXP10, G_FACOS,
601608
G_FASIN, G_FATAN, G_FATAN2, G_FCOSH, G_FSINH,
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
3+
; RUN: llc -mtriple=riscv32 -mattr=+zfa,d -global-isel < %s \
4+
; RUN: | FileCheck %s
5+
; RUN: llc -mtriple=riscv64 -mattr=+zfa,d -global-isel < %s \
6+
; RUN: | FileCheck %s
7+
8+
9+
define double @fceil(double %a) {
10+
; CHECK-LABEL: fceil:
11+
; CHECK: # %bb.0:
12+
; CHECK-NEXT: fround.d fa0, fa0, rup
13+
; CHECK-NEXT: ret
14+
%b = call double @llvm.ceil.f64(double %a)
15+
ret double %b
16+
}
17+
18+
define double @ffloor(double %a) {
19+
; CHECK-LABEL: ffloor:
20+
; CHECK: # %bb.0:
21+
; CHECK-NEXT: fround.d fa0, fa0, rdn
22+
; CHECK-NEXT: ret
23+
%b = call double @llvm.floor.f64(double %a)
24+
ret double %b
25+
}
26+
27+
define double @frint(double %a) {
28+
; CHECK-LABEL: frint:
29+
; CHECK: # %bb.0:
30+
; CHECK-NEXT: froundnx.d fa0, fa0
31+
; CHECK-NEXT: ret
32+
%b = call double @llvm.rint.f64(double %a)
33+
ret double %b
34+
}
35+
36+
define double @fnearbyint(double %a) {
37+
; CHECK-LABEL: fnearbyint:
38+
; CHECK: # %bb.0:
39+
; CHECK-NEXT: fround.d fa0, fa0
40+
; CHECK-NEXT: ret
41+
%b = call double @llvm.nearbyint.f64(double %a)
42+
ret double %b
43+
}
44+
45+
define double @fround(double %a) {
46+
; CHECK-LABEL: fround:
47+
; CHECK: # %bb.0:
48+
; CHECK-NEXT: fround.d fa0, fa0, rmm
49+
; CHECK-NEXT: ret
50+
%b = call double @llvm.round.f64(double %a)
51+
ret double %b
52+
}
53+
54+
define double @froundeven(double %a) {
55+
; CHECK-LABEL: froundeven:
56+
; CHECK: # %bb.0:
57+
; CHECK-NEXT: fround.d fa0, fa0, rne
58+
; CHECK-NEXT: ret
59+
%b = call double @llvm.roundeven.f64(double %a)
60+
ret double %b
61+
}
62+
63+
define double @ftrunc(double %a) {
64+
; CHECK-LABEL: ftrunc:
65+
; CHECK: # %bb.0:
66+
; CHECK-NEXT: fround.d fa0, fa0, rtz
67+
; CHECK-NEXT: ret
68+
%b = call double @llvm.trunc.f64(double %a)
69+
ret double %b
70+
}
71+
72+
define double @fmaximum(double %a, double %b) {
73+
; CHECK-LABEL: fmaximum:
74+
; CHECK: # %bb.0:
75+
; CHECK-NEXT: fmaxm.d fa0, fa0, fa1
76+
; CHECK-NEXT: ret
77+
%c = call double @llvm.maximum.f64(double %a, double %b)
78+
ret double %c
79+
}
80+
81+
define double @fminimum(double %a, double %b) {
82+
; CHECK-LABEL: fminimum:
83+
; CHECK: # %bb.0:
84+
; CHECK-NEXT: fminm.d fa0, fa0, fa1
85+
; CHECK-NEXT: ret
86+
%c = call double @llvm.minimum.f64(double %a, double %b)
87+
ret double %c
88+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
3+
; RUN: llc -mtriple=riscv32 -mattr=+zfa -global-isel < %s \
4+
; RUN: | FileCheck %s
5+
; RUN: llc -mtriple=riscv64 -mattr=+zfa -global-isel < %s \
6+
; RUN: | FileCheck %s
7+
8+
9+
define float @fceil(float %a) {
10+
; CHECK-LABEL: fceil:
11+
; CHECK: # %bb.0:
12+
; CHECK-NEXT: fround.s fa0, fa0, rup
13+
; CHECK-NEXT: ret
14+
%b = call float @llvm.ceil.f32(float %a)
15+
ret float %b
16+
}
17+
18+
define float @ffloor(float %a) {
19+
; CHECK-LABEL: ffloor:
20+
; CHECK: # %bb.0:
21+
; CHECK-NEXT: fround.s fa0, fa0, rdn
22+
; CHECK-NEXT: ret
23+
%b = call float @llvm.floor.f32(float %a)
24+
ret float %b
25+
}
26+
27+
define float @frint(float %a) {
28+
; CHECK-LABEL: frint:
29+
; CHECK: # %bb.0:
30+
; CHECK-NEXT: froundnx.s fa0, fa0
31+
; CHECK-NEXT: ret
32+
%b = call float @llvm.rint.f32(float %a)
33+
ret float %b
34+
}
35+
36+
define float @fnearbyint(float %a) {
37+
; CHECK-LABEL: fnearbyint:
38+
; CHECK: # %bb.0:
39+
; CHECK-NEXT: fround.s fa0, fa0
40+
; CHECK-NEXT: ret
41+
%b = call float @llvm.nearbyint.f32(float %a)
42+
ret float %b
43+
}
44+
45+
define float @fround(float %a) {
46+
; CHECK-LABEL: fround:
47+
; CHECK: # %bb.0:
48+
; CHECK-NEXT: fround.s fa0, fa0, rmm
49+
; CHECK-NEXT: ret
50+
%b = call float @llvm.round.f32(float %a)
51+
ret float %b
52+
}
53+
54+
define float @froundeven(float %a) {
55+
; CHECK-LABEL: froundeven:
56+
; CHECK: # %bb.0:
57+
; CHECK-NEXT: fround.s fa0, fa0, rne
58+
; CHECK-NEXT: ret
59+
%b = call float @llvm.roundeven.f32(float %a)
60+
ret float %b
61+
}
62+
63+
define float @ftrunc(float %a) {
64+
; CHECK-LABEL: ftrunc:
65+
; CHECK: # %bb.0:
66+
; CHECK-NEXT: fround.s fa0, fa0, rtz
67+
; CHECK-NEXT: ret
68+
%b = call float @llvm.trunc.f32(float %a)
69+
ret float %b
70+
}
71+
72+
define float @fmaximum(float %a, float %b) {
73+
; CHECK-LABEL: fmaximum:
74+
; CHECK: # %bb.0:
75+
; CHECK-NEXT: fmaxm.s fa0, fa0, fa1
76+
; CHECK-NEXT: ret
77+
%c = call float @llvm.maximum.f32(float %a, float %b)
78+
ret float %c
79+
}
80+
81+
define float @fminimum(float %a, float %b) {
82+
; CHECK-LABEL: fminimum:
83+
; CHECK: # %bb.0:
84+
; CHECK-NEXT: fminm.s fa0, fa0, fa1
85+
; CHECK-NEXT: ret
86+
%c = call float @llvm.minimum.f32(float %a, float %b)
87+
ret float %c
88+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
3+
; RUN: llc -mtriple=riscv32 -mattr=+zfa,+zfh -global-isel < %s \
4+
; RUN: | FileCheck %s
5+
; RUN: llc -mtriple=riscv64 -mattr=+zfa,+zfh -global-isel < %s \
6+
; RUN: | FileCheck %s
7+
8+
9+
define half @fceil(half %a) {
10+
; CHECK-LABEL: fceil:
11+
; CHECK: # %bb.0:
12+
; CHECK-NEXT: fround.h fa0, fa0, rup
13+
; CHECK-NEXT: ret
14+
%b = call half @llvm.ceil.f16(half %a)
15+
ret half %b
16+
}
17+
18+
define half @ffloor(half %a) {
19+
; CHECK-LABEL: ffloor:
20+
; CHECK: # %bb.0:
21+
; CHECK-NEXT: fround.h fa0, fa0, rdn
22+
; CHECK-NEXT: ret
23+
%b = call half @llvm.floor.f16(half %a)
24+
ret half %b
25+
}
26+
27+
define half @frint(half %a) {
28+
; CHECK-LABEL: frint:
29+
; CHECK: # %bb.0:
30+
; CHECK-NEXT: froundnx.h fa0, fa0
31+
; CHECK-NEXT: ret
32+
%b = call half @llvm.rint.f16(half %a)
33+
ret half %b
34+
}
35+
36+
define half @fnearbyint(half %a) {
37+
; CHECK-LABEL: fnearbyint:
38+
; CHECK: # %bb.0:
39+
; CHECK-NEXT: fround.h fa0, fa0
40+
; CHECK-NEXT: ret
41+
%b = call half @llvm.nearbyint.f16(half %a)
42+
ret half %b
43+
}
44+
45+
define half @fround(half %a) {
46+
; CHECK-LABEL: fround:
47+
; CHECK: # %bb.0:
48+
; CHECK-NEXT: fround.h fa0, fa0, rmm
49+
; CHECK-NEXT: ret
50+
%b = call half @llvm.round.f16(half %a)
51+
ret half %b
52+
}
53+
54+
define half @froundeven(half %a) {
55+
; CHECK-LABEL: froundeven:
56+
; CHECK: # %bb.0:
57+
; CHECK-NEXT: fround.h fa0, fa0, rne
58+
; CHECK-NEXT: ret
59+
%b = call half @llvm.roundeven.f16(half %a)
60+
ret half %b
61+
}
62+
63+
define half @ftrunc(half %a) {
64+
; CHECK-LABEL: ftrunc:
65+
; CHECK: # %bb.0:
66+
; CHECK-NEXT: fround.h fa0, fa0, rtz
67+
; CHECK-NEXT: ret
68+
%b = call half @llvm.trunc.f16(half %a)
69+
ret half %b
70+
}
71+
72+
define half @fmaximum(half %a, half %b) {
73+
; CHECK-LABEL: fmaximum:
74+
; CHECK: # %bb.0:
75+
; CHECK-NEXT: fmaxm.h fa0, fa0, fa1
76+
; CHECK-NEXT: ret
77+
%c = call half @llvm.maximum.f16(half %a, half %b)
78+
ret half %c
79+
}
80+
81+
define half @fminimum(half %a, half %b) {
82+
; CHECK-LABEL: fminimum:
83+
; CHECK: # %bb.0:
84+
; CHECK-NEXT: fminm.h fa0, fa0, fa1
85+
; CHECK-NEXT: ret
86+
%c = call half @llvm.minimum.f16(half %a, half %b)
87+
ret half %c
88+
}

llvm/test/CodeGen/RISCV/GlobalISel/legalizer-info-validation.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,7 @@
579579
# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined
580580
# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined
581581
# DEBUG-NEXT: G_FMINIMUM (opcode {{[0-9]+}}): 1 type index
582+
# DEBUG-NEXT: .. opcode 212 is aliased to 213
582583
# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined
583584
# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined
584585
# DEBUG-NEXT: G_FMAXIMUM (opcode {{[0-9]+}}): 1 type index

0 commit comments

Comments
 (0)