-
Notifications
You must be signed in to change notification settings - Fork 54
/
Copy path0051-RISCV-Codegen-support-for-FPR32-stack-loads-stores.patch
129 lines (122 loc) · 4.17 KB
/
0051-RISCV-Codegen-support-for-FPR32-stack-loads-stores.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
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Alex Bradbury <[email protected]>
Subject: [RISCV] Codegen support for FPR32<->stack loads/stores
---
lib/Target/RISCV/RISCVInstrInfo.cpp | 34 ++++++++++++++---------
test/CodeGen/RISCV/float-mem.ll | 55 +++++++++++++++++++++++++++++++++++++
2 files changed, 76 insertions(+), 13 deletions(-)
diff --git a/lib/Target/RISCV/RISCVInstrInfo.cpp b/lib/Target/RISCV/RISCVInstrInfo.cpp
index e2fc3ad91e0..b630fb87286 100644
--- a/lib/Target/RISCV/RISCVInstrInfo.cpp
+++ b/lib/Target/RISCV/RISCVInstrInfo.cpp
@@ -54,15 +54,19 @@ void RISCVInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
if (I != MBB.end())
DL = I->getDebugLoc();
- if (RISCV::GPRRegClass.hasSubClassEq(RC)) {
- unsigned Opcode = Subtarget.is64Bit() ? RISCV::SD : RISCV::SW;
- BuildMI(MBB, I, DL, get(Opcode))
- .addReg(SrcReg, getKillRegState(IsKill))
- .addFrameIndex(FI)
- .addImm(0);
- } else {
+ unsigned Opcode;
+
+ if (RISCV::GPRRegClass.hasSubClassEq(RC))
+ Opcode = Subtarget.is64Bit() ? RISCV::SD : RISCV::SW;
+ else if (RISCV::FPR32RegClass.hasSubClassEq(RC))
+ Opcode = RISCV::FSW;
+ else
llvm_unreachable("Can't store this register to stack slot");
- }
+
+ BuildMI(MBB, I, DL, get(Opcode))
+ .addReg(SrcReg, getKillRegState(IsKill))
+ .addFrameIndex(FI)
+ .addImm(0);
}
void RISCVInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
@@ -74,12 +78,16 @@ void RISCVInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
if (I != MBB.end())
DL = I->getDebugLoc();
- if (RISCV::GPRRegClass.hasSubClassEq(RC)) {
- unsigned Opcode = Subtarget.is64Bit() ? RISCV::LD : RISCV::LW;
- BuildMI(MBB, I, DL, get(Opcode), DstReg).addFrameIndex(FI).addImm(0);
- } else {
+ unsigned Opcode;
+
+ if (RISCV::GPRRegClass.hasSubClassEq(RC))
+ Opcode = Subtarget.is64Bit() ? RISCV::LD : RISCV::LW;
+ else if (RISCV::FPR32RegClass.hasSubClassEq(RC))
+ Opcode = RISCV::FLW;
+ else
llvm_unreachable("Can't load this register from stack slot");
- }
+
+ BuildMI(MBB, I, DL, get(Opcode), DstReg).addFrameIndex(FI).addImm(0);
}
void RISCVInstrInfo::movImm32(MachineBasicBlock &MBB,
diff --git a/test/CodeGen/RISCV/float-mem.ll b/test/CodeGen/RISCV/float-mem.ll
index f1cbb4330f3..0f543ef083f 100644
--- a/test/CodeGen/RISCV/float-mem.ll
+++ b/test/CodeGen/RISCV/float-mem.ll
@@ -82,3 +82,58 @@ define float @flw_fsw_constant(float %a) nounwind {
store float %3, float* %1
ret float %3
}
+
+declare void @notdead(i8*)
+
+define float @flw_stack(float %a) nounwind {
+; Tests RISCV::LdFPR32_FI
+; RV32IF-LABEL: flw_stack:
+; RV32IF: # %bb.0:
+; RV32IF-NEXT: addi sp, sp, -16
+; RV32IF-NEXT: sw ra, 12(sp)
+; RV32IF-NEXT: sw s1, 8(sp)
+; RV32IF-NEXT: addi s1, a0, 0
+; RV32IF-NEXT: lui a0, %hi(notdead)
+; RV32IF-NEXT: addi a1, a0, %lo(notdead)
+; RV32IF-NEXT: addi a0, sp, 4
+; RV32IF-NEXT: jalr ra, a1, 0
+; RV32IF-NEXT: fmv.w.x ft0, s1
+; RV32IF-NEXT: flw ft1, 4(sp)
+; RV32IF-NEXT: fadd.s ft0, ft1, ft0
+; RV32IF-NEXT: fmv.x.w a0, ft0
+; RV32IF-NEXT: lw s1, 8(sp)
+; RV32IF-NEXT: lw ra, 12(sp)
+; RV32IF-NEXT: addi sp, sp, 16
+; RV32IF-NEXT: jalr zero, ra, 0
+ %1 = alloca float, align 4
+ %2 = bitcast float* %1 to i8*
+ call void @notdead(i8* %2)
+ %3 = load float, float* %1
+ %4 = fadd float %3, %a ; force load in to FPR32
+ ret float %4
+}
+
+define void @fsw_stack(float %a, float %b) nounwind {
+; Tests RISCV::StFPR32_FI
+; RV32IF-LABEL: fsw_stack:
+; RV32IF: # %bb.0:
+; RV32IF-NEXT: addi sp, sp, -16
+; RV32IF-NEXT: sw ra, 12(sp)
+; RV32IF-NEXT: fmv.w.x ft0, a1
+; RV32IF-NEXT: fmv.w.x ft1, a0
+; RV32IF-NEXT: fadd.s ft0, ft1, ft0
+; RV32IF-NEXT: fsw ft0, 8(sp)
+; RV32IF-NEXT: lui a0, %hi(notdead)
+; RV32IF-NEXT: addi a1, a0, %lo(notdead)
+; RV32IF-NEXT: addi a0, sp, 8
+; RV32IF-NEXT: jalr ra, a1, 0
+; RV32IF-NEXT: lw ra, 12(sp)
+; RV32IF-NEXT: addi sp, sp, 16
+; RV32IF-NEXT: jalr zero, ra, 0
+ %1 = fadd float %a, %b ; force store from FPR32
+ %2 = alloca float, align 4
+ store float %1, float* %2
+ %3 = bitcast float* %2 to i8*
+ call void @notdead(i8* %3)
+ ret void
+}
--
2.16.2