Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/cranelift/codegen/src/isa/riscv64/inst/regs.rs
1693 views
1
//! Riscv64 ISA definitions: registers.
2
//!
3
4
use crate::machinst::{Reg, Writable};
5
6
use regalloc2::{PReg, RegClass, VReg};
7
8
// first argument of function call
9
#[inline]
10
pub const fn a0() -> Reg {
11
x_reg(10)
12
}
13
14
// second argument of function call
15
#[inline]
16
pub const fn a1() -> Reg {
17
x_reg(11)
18
}
19
20
// third argument of function call
21
#[inline]
22
pub fn a2() -> Reg {
23
x_reg(12)
24
}
25
26
#[inline]
27
pub fn writable_a0() -> Writable<Reg> {
28
Writable::from_reg(a0())
29
}
30
#[inline]
31
#[cfg(test)]
32
pub fn writable_a1() -> Writable<Reg> {
33
Writable::from_reg(a1())
34
}
35
#[inline]
36
#[expect(dead_code, reason = "here if needed in the future")]
37
pub fn writable_a2() -> Writable<Reg> {
38
Writable::from_reg(a2())
39
}
40
41
#[inline]
42
#[cfg(test)]
43
pub fn fa0() -> Reg {
44
f_reg(10)
45
}
46
#[inline]
47
#[cfg(test)]
48
pub fn writable_fa0() -> Writable<Reg> {
49
Writable::from_reg(fa0())
50
}
51
#[inline]
52
#[expect(dead_code, reason = "here if needed in the future")]
53
pub fn writable_fa1() -> Writable<Reg> {
54
Writable::from_reg(fa1())
55
}
56
#[inline]
57
pub fn fa1() -> Reg {
58
f_reg(11)
59
}
60
61
/// Get a reference to the zero-register.
62
#[inline]
63
pub fn zero_reg() -> Reg {
64
x_reg(0)
65
}
66
67
/// Get a writable reference to the zero-register (this discards a result).
68
#[inline]
69
pub fn writable_zero_reg() -> Writable<Reg> {
70
Writable::from_reg(zero_reg())
71
}
72
#[inline]
73
pub fn stack_reg() -> Reg {
74
x_reg(2)
75
}
76
77
/// Get a writable reference to the stack-pointer register.
78
#[inline]
79
pub fn writable_stack_reg() -> Writable<Reg> {
80
Writable::from_reg(stack_reg())
81
}
82
83
/// Get a reference to the link register (x1).
84
pub fn link_reg() -> Reg {
85
x_reg(1)
86
}
87
88
/// Get a writable reference to the link register.
89
#[inline]
90
pub fn writable_link_reg() -> Writable<Reg> {
91
Writable::from_reg(link_reg())
92
}
93
94
/// Get a reference to the frame pointer (x8).
95
#[inline]
96
pub fn fp_reg() -> Reg {
97
x_reg(8)
98
}
99
100
/// Get a writable reference to the frame pointer.
101
#[inline]
102
pub fn writable_fp_reg() -> Writable<Reg> {
103
Writable::from_reg(fp_reg())
104
}
105
106
/// Get a reference to the first temporary, sometimes "spill temporary",
107
/// register. This register is used in various ways as a temporary.
108
#[inline]
109
pub fn spilltmp_reg() -> Reg {
110
x_reg(31)
111
}
112
113
/// Get a writable reference to the spilltmp reg.
114
#[inline]
115
pub fn writable_spilltmp_reg() -> Writable<Reg> {
116
Writable::from_reg(spilltmp_reg())
117
}
118
119
///spilltmp2
120
#[inline]
121
pub fn spilltmp_reg2() -> Reg {
122
x_reg(30)
123
}
124
125
/// Get a writable reference to the spilltmp2 reg.
126
#[inline]
127
pub fn writable_spilltmp_reg2() -> Writable<Reg> {
128
Writable::from_reg(spilltmp_reg2())
129
}
130
131
#[inline]
132
pub const fn x_reg(enc: usize) -> Reg {
133
let p_reg = PReg::new(enc, RegClass::Int);
134
let v_reg = VReg::new(p_reg.index(), p_reg.class());
135
Reg::from_virtual_reg(v_reg)
136
}
137
pub const fn px_reg(enc: usize) -> PReg {
138
PReg::new(enc, RegClass::Int)
139
}
140
141
#[inline]
142
pub fn f_reg(enc: usize) -> Reg {
143
let p_reg = PReg::new(enc, RegClass::Float);
144
let v_reg = VReg::new(p_reg.index(), p_reg.class());
145
Reg::from(v_reg)
146
}
147
pub const fn pf_reg(enc: usize) -> PReg {
148
PReg::new(enc, RegClass::Float)
149
}
150
151
pub const fn pv_reg(enc: usize) -> PReg {
152
PReg::new(enc, RegClass::Vector)
153
}
154
155