File tree 5 files changed +110
-0
lines changed
5 files changed +110
-0
lines changed Original file line number Diff line number Diff line change @@ -2894,3 +2894,22 @@ bool RISCVTargetLowering::shouldExtendTypeInLibCall(EVT Type) const {
2894
2894
2895
2895
return true ;
2896
2896
}
2897
+
2898
+ #define GET_REGISTER_MATCHER
2899
+ #include " RISCVGenAsmMatcher.inc"
2900
+
2901
+ Register
2902
+ RISCVTargetLowering::getRegisterByName (const char *RegName, EVT VT,
2903
+ const MachineFunction &MF) const {
2904
+ Register Reg = MatchRegisterAltName (RegName);
2905
+ if (Reg == RISCV::NoRegister)
2906
+ Reg = MatchRegisterName (RegName);
2907
+ if (Reg == RISCV::NoRegister)
2908
+ report_fatal_error (
2909
+ Twine (" Invalid register name \" " + StringRef (RegName) + " \" ." ));
2910
+ BitVector ReservedRegs = Subtarget.getRegisterInfo ()->getReservedRegs (MF);
2911
+ if (!ReservedRegs.test (Reg) && !Subtarget.isRegisterReservedByUser (Reg))
2912
+ report_fatal_error (Twine (" Trying to obtain non-reserved register \" " +
2913
+ StringRef (RegName) + " \" ." ));
2914
+ return Reg;
2915
+ }
Original file line number Diff line number Diff line change @@ -147,6 +147,13 @@ class RISCVTargetLowering : public TargetLowering {
147
147
148
148
bool shouldExtendTypeInLibCall (EVT Type) const override ;
149
149
150
+ // / Returns the register with the specified architectural or ABI name. This
151
+ // / method is necessary to lower the llvm.read_register.* and
152
+ // / llvm.write_register.* intrinsics. Allocatable registers must be reserved
153
+ // / with the clang -ffixed-xX flag for access to be allowed.
154
+ Register getRegisterByName (const char *RegName, EVT VT,
155
+ const MachineFunction &MF) const override ;
156
+
150
157
private:
151
158
void analyzeInputArgs (MachineFunction &MF, CCState &CCInfo,
152
159
const SmallVectorImpl<ISD::InputArg> &Ins,
Original file line number Diff line number Diff line change
1
+ ; RUN: not llc < %s -mtriple=riscv32 2>&1 | FileCheck %s
2
+
3
+ define i32 @get_invalid_reg () nounwind {
4
+ entry:
5
+ ; CHECK: Invalid register name "notareg".
6
+ %reg = call i32 @llvm.read_register.i32 (metadata !0 )
7
+ ret i32 %reg
8
+ }
9
+
10
+ declare i32 @llvm.read_register.i32 (metadata ) nounwind
11
+
12
+ !0 = !{!"notareg\00 " }
Original file line number Diff line number Diff line change
1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2
+ ; RUN: llc < %s -mtriple=riscv32 | FileCheck %s
3
+
4
+ define i32 @get_stack () nounwind {
5
+ ; CHECK-LABEL: get_stack:
6
+ ; CHECK: # %bb.0: # %entry
7
+ ; CHECK-NEXT: mv a0, sp
8
+ ; CHECK-NEXT: ret
9
+ entry:
10
+ %sp = call i32 @llvm.read_register.i32 (metadata !0 )
11
+ ret i32 %sp
12
+ }
13
+
14
+ define void @set_stack (i32 %val ) nounwind {
15
+ ; CHECK-LABEL: set_stack:
16
+ ; CHECK: # %bb.0: # %entry
17
+ ; CHECK-NEXT: mv sp, a0
18
+ ; CHECK-NEXT: ret
19
+ entry:
20
+ call void @llvm.write_register.i32 (metadata !0 , i32 %val )
21
+ ret void
22
+ }
23
+
24
+ define i32 @get_tp_arch_name () nounwind {
25
+ ; CHECK-LABEL: get_tp_arch_name:
26
+ ; CHECK: # %bb.0: # %entry
27
+ ; CHECK-NEXT: mv a0, tp
28
+ ; CHECK-NEXT: ret
29
+ entry:
30
+ %sp = call i32 @llvm.read_register.i32 (metadata !1 )
31
+ ret i32 %sp
32
+ }
33
+
34
+ declare i32 @llvm.read_register.i32 (metadata ) nounwind
35
+ declare void @llvm.write_register.i32 (metadata , i32 ) nounwind
36
+
37
+ !0 = !{!"sp\00 " }
38
+ !1 = !{!"x4\00 " }
Original file line number Diff line number Diff line change
1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2
+ ; RUN: not llc < %s -mtriple=riscv32 -mattr +reserve-x8 2>&1 \
3
+ ; RUN: | FileCheck -check-prefix=NO-RESERVE-A1 %s
4
+ ; RUN: not llc < %s -mtriple=riscv32 -mattr +reserve-x11 2>&1 \
5
+ ; RUN: | FileCheck -check-prefix=NO-RESERVE-FP %s
6
+ ; RUN: llc < %s -mtriple=riscv32 -mattr +reserve-x8 -mattr +reserve-x11 \
7
+ ; RUN: | FileCheck -check-prefix=RESERVE %s
8
+
9
+ define i32 @get_reg_a1 () nounwind {
10
+ ; NO-RESERVE-A1: Trying to obtain non-reserved register "a1".
11
+ ; RESERVE-LABEL: get_reg_a1:
12
+ ; RESERVE: # %bb.0: # %entry
13
+ ; RESERVE-NEXT: mv a0, a1
14
+ ; RESERVE-NEXT: ret
15
+ entry:
16
+ %a1 = call i32 @llvm.read_register.i32 (metadata !0 )
17
+ ret i32 %a1
18
+ }
19
+
20
+ define i32 @get_reg_fp () nounwind {
21
+ ; NO-RESERVE-FP: Trying to obtain non-reserved register "fp".
22
+ ; RESERVE-LABEL: get_reg_fp:
23
+ ; RESERVE: # %bb.0: # %entry
24
+ ; RESERVE-NEXT: mv a0, s0
25
+ ; RESERVE-NEXT: ret
26
+ entry:
27
+ %fp = call i32 @llvm.read_register.i32 (metadata !1 )
28
+ ret i32 %fp
29
+ }
30
+
31
+ declare i32 @llvm.read_register.i32 (metadata ) nounwind
32
+
33
+ !0 = !{!"a1\00 " }
34
+ !1 = !{!"fp\00 " }
You can’t perform that action at this time.
0 commit comments