Skip to content

Commit 56e092c

Browse files
authored
[RISCV][GISel] Legalize the G_FCANONICALIZE instruction (#166162)
1 parent 43f0b69 commit 56e092c

File tree

3 files changed

+73
-2
lines changed

3 files changed

+73
-2
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,11 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
639639
.libcallFor({{s32, s32}, {s64, s32}})
640640
.libcallFor(ST.is64Bit(), {s128, s32});
641641

642+
getActionDefinitionsBuilder(G_FCANONICALIZE)
643+
.legalFor(ST.hasStdExtF(), {s32})
644+
.legalFor(ST.hasStdExtD(), {s64})
645+
.legalFor(ST.hasStdExtZfh(), {s16});
646+
642647
getActionDefinitionsBuilder(G_VASTART).customFor({p0});
643648

644649
// va_list must be a pointer, but most sized types are pretty easy to handle
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; FIXME: @llvm.canonicalize doesn't support soft-float abi yet.
3+
; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECK-FP16-RV64
4+
; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECK-FP16-RV32
5+
6+
declare half @llvm.fcanonicalize.f16(half)
7+
declare float @llvm.fcanonicalize.f32(float)
8+
declare double @llvm.fcanonicalize.f64(double)
9+
10+
define half @fcanonicalize_f16(half %x) {
11+
; CHECK-LABEL: fcanonicalize_f16:
12+
; CHECK: # %bb.0:
13+
; CHECK-NEXT: fmin.h fa0, fa0, fa0
14+
; CHECK-NEXT: ret
15+
%z = call half @llvm.canonicalize.f16(half %x)
16+
ret half %z
17+
}
18+
19+
define half @fcanonicalize_f16_nnan(half %x) {
20+
; CHECK-LABEL: fcanonicalize_f16_nnan:
21+
; CHECK: # %bb.0:
22+
; CHECK-NEXT: fmin.h fa0, fa0, fa0
23+
; CHECK-NEXT: ret
24+
%z = call nnan half @llvm.canonicalize.f16(half %x)
25+
ret half %z
26+
}
27+
28+
define float @fcanonicalize_f32(float %x) {
29+
; CHECK-LABEL: fcanonicalize_f32:
30+
; CHECK: # %bb.0:
31+
; CHECK-NEXT: fmin.s fa0, fa0, fa0
32+
; CHECK-NEXT: ret
33+
%z = call float @llvm.canonicalize.f32(float %x)
34+
ret float %z
35+
}
36+
37+
define float @fcanonicalize_f32_nnan(float %x) {
38+
; CHECK-LABEL: fcanonicalize_f32_nnan:
39+
; CHECK: # %bb.0:
40+
; CHECK-NEXT: fmin.s fa0, fa0, fa0
41+
; CHECK-NEXT: ret
42+
%z = call nnan float @llvm.canonicalize.f32(float %x)
43+
ret float %z
44+
}
45+
46+
define double @fcanonicalize_f64(double %x) {
47+
; CHECK-LABEL: fcanonicalize_f64:
48+
; CHECK: # %bb.0:
49+
; CHECK-NEXT: fmin.d fa0, fa0, fa0
50+
; CHECK-NEXT: ret
51+
%z = call double @llvm.canonicalize.f64(double %x)
52+
ret double %z
53+
}
54+
55+
define double @fcanonicalize_f64_nnan(double %x) {
56+
; CHECK-LABEL: fcanonicalize_f64_nnan:
57+
; CHECK: # %bb.0:
58+
; CHECK-NEXT: fmin.d fa0, fa0, fa0
59+
; CHECK-NEXT: ret
60+
%z = call nnan double @llvm.canonicalize.f64(double %x)
61+
ret double %z
62+
}
63+
64+
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
65+
; CHECK-FP16-RV32: {{.*}}
66+
; CHECK-FP16-RV64: {{.*}}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -603,8 +603,8 @@
603603
# DEBUG-NEXT: .. the first uncovered type index: 2, OK
604604
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
605605
# DEBUG-NEXT: G_FCANONICALIZE (opcode {{[0-9]+}}): 1 type index, 0 imm indices
606-
# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined
607-
# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined
606+
# DEBUG-NEXT: .. the first uncovered type index: 1, OK
607+
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
608608
# DEBUG-NEXT: G_FMINNUM (opcode {{[0-9]+}}): 1 type index
609609
# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}}
610610
# DEBUG-NEXT: .. the first uncovered type index: 1, OK

0 commit comments

Comments
 (0)