-
Notifications
You must be signed in to change notification settings - Fork 54
/
Copy path0056-RISCV-Codegen-support-for-RV32D-floating-point-conve.patch
134 lines (128 loc) · 4.16 KB
/
0056-RISCV-Codegen-support-for-RV32D-floating-point-conve.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Alex Bradbury <[email protected]>
Subject: [RISCV] Codegen support for RV32D floating point conversion
operations
---
lib/Target/RISCV/RISCVInstrInfoD.td | 14 ++++++
test/CodeGen/RISCV/double-convert.ll | 89 ++++++++++++++++++++++++++++++++++++
2 files changed, 103 insertions(+)
create mode 100644 test/CodeGen/RISCV/double-convert.ll
diff --git a/lib/Target/RISCV/RISCVInstrInfoD.td b/lib/Target/RISCV/RISCVInstrInfoD.td
index b6b47c97e85..4cb5a30d03e 100644
--- a/lib/Target/RISCV/RISCVInstrInfoD.td
+++ b/lib/Target/RISCV/RISCVInstrInfoD.td
@@ -172,6 +172,20 @@ class PatFpr64Fpr64DynFrm<SDPatternOperator OpNode, RVInstRFrm Inst>
let Predicates = [HasStdExtD] in {
+/// Float conversion operations
+
+// f64 -> f32, f32 -> f64
+def : Pat<(fpround FPR64:$rs1), (FCVT_S_D FPR64:$rs1, 0b111)>;
+def : Pat<(fpextend FPR32:$rs1), (FCVT_D_S FPR32:$rs1)>;
+
+// FP->[u]int. Round-to-zero must be used
+def : Pat<(fp_to_sint FPR64:$rs1), (FCVT_W_D FPR64:$rs1, 0b001)>;
+def : Pat<(fp_to_uint FPR64:$rs1), (FCVT_WU_D FPR64:$rs1, 0b001)>;
+
+// [u]int->fp
+def : Pat<(sint_to_fp GPR:$rs1), (FCVT_D_W GPR:$rs1)>;
+def : Pat<(uint_to_fp GPR:$rs1), (FCVT_D_WU GPR:$rs1)>;
+
/// Float arithmetic operations
def : PatFpr64Fpr64DynFrm<fadd, FADD_D>;
diff --git a/test/CodeGen/RISCV/double-convert.ll b/test/CodeGen/RISCV/double-convert.ll
new file mode 100644
index 00000000000..4b2c9707aa4
--- /dev/null
+++ b/test/CodeGen/RISCV/double-convert.ll
@@ -0,0 +1,89 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \
+; RUN: | FileCheck -check-prefix=RV32IFD %s
+
+define float @fcvt_s_d(double %a) nounwind {
+; RV32IFD-LABEL: fcvt_s_d:
+; RV32IFD: # %bb.0:
+; RV32IFD-NEXT: addi sp, sp, -16
+; RV32IFD-NEXT: sw a1, 12(sp)
+; RV32IFD-NEXT: sw a0, 8(sp)
+; RV32IFD-NEXT: fld ft0, 8(sp)
+; RV32IFD-NEXT: fcvt.s.d ft0, ft0
+; RV32IFD-NEXT: fmv.x.w a0, ft0
+; RV32IFD-NEXT: addi sp, sp, 16
+; RV32IFD-NEXT: jalr zero, ra, 0
+ %1 = fptrunc double %a to float
+ ret float %1
+}
+
+define double @fcvt_d_s(float %a) nounwind {
+; RV32IFD-LABEL: fcvt_d_s:
+; RV32IFD: # %bb.0:
+; RV32IFD-NEXT: addi sp, sp, -16
+; RV32IFD-NEXT: fmv.w.x ft0, a0
+; RV32IFD-NEXT: fcvt.d.s ft0, ft0
+; RV32IFD-NEXT: fsd ft0, 8(sp)
+; RV32IFD-NEXT: lw a0, 8(sp)
+; RV32IFD-NEXT: lw a1, 12(sp)
+; RV32IFD-NEXT: addi sp, sp, 16
+; RV32IFD-NEXT: jalr zero, ra, 0
+ %1 = fpext float %a to double
+ ret double %1
+}
+
+define i32 @fcvt_w_d(double %a) nounwind {
+; RV32IFD-LABEL: fcvt_w_d:
+; RV32IFD: # %bb.0:
+; RV32IFD-NEXT: addi sp, sp, -16
+; RV32IFD-NEXT: sw a1, 12(sp)
+; RV32IFD-NEXT: sw a0, 8(sp)
+; RV32IFD-NEXT: fld ft0, 8(sp)
+; RV32IFD-NEXT: fcvt.w.d a0, ft0, rtz
+; RV32IFD-NEXT: addi sp, sp, 16
+; RV32IFD-NEXT: jalr zero, ra, 0
+ %1 = fptosi double %a to i32
+ ret i32 %1
+}
+
+define i32 @fcvt_wu_d(double %a) nounwind {
+; RV32IFD-LABEL: fcvt_wu_d:
+; RV32IFD: # %bb.0:
+; RV32IFD-NEXT: addi sp, sp, -16
+; RV32IFD-NEXT: sw a1, 12(sp)
+; RV32IFD-NEXT: sw a0, 8(sp)
+; RV32IFD-NEXT: fld ft0, 8(sp)
+; RV32IFD-NEXT: fcvt.wu.d a0, ft0, rtz
+; RV32IFD-NEXT: addi sp, sp, 16
+; RV32IFD-NEXT: jalr zero, ra, 0
+ %1 = fptoui double %a to i32
+ ret i32 %1
+}
+
+define double @fcvt_d_w(i32 %a) nounwind {
+; RV32IFD-LABEL: fcvt_d_w:
+; RV32IFD: # %bb.0:
+; RV32IFD-NEXT: addi sp, sp, -16
+; RV32IFD-NEXT: fcvt.d.w ft0, a0
+; RV32IFD-NEXT: fsd ft0, 8(sp)
+; RV32IFD-NEXT: lw a0, 8(sp)
+; RV32IFD-NEXT: lw a1, 12(sp)
+; RV32IFD-NEXT: addi sp, sp, 16
+; RV32IFD-NEXT: jalr zero, ra, 0
+ %1 = sitofp i32 %a to double
+ ret double %1
+}
+
+define double @fcvt_d_wu(i32 %a) nounwind {
+; RV32IFD-LABEL: fcvt_d_wu:
+; RV32IFD: # %bb.0:
+; RV32IFD-NEXT: addi sp, sp, -16
+; RV32IFD-NEXT: fcvt.d.wu ft0, a0
+; RV32IFD-NEXT: fsd ft0, 8(sp)
+; RV32IFD-NEXT: lw a0, 8(sp)
+; RV32IFD-NEXT: lw a1, 12(sp)
+; RV32IFD-NEXT: addi sp, sp, 16
+; RV32IFD-NEXT: jalr zero, ra, 0
+ %1 = uitofp i32 %a to double
+ ret double %1
+}
--
2.16.2