Path: blob/main/cranelift/codegen/src/isa/riscv64/inst/regs.rs
1693 views
//! Riscv64 ISA definitions: registers.1//!23use crate::machinst::{Reg, Writable};45use regalloc2::{PReg, RegClass, VReg};67// first argument of function call8#[inline]9pub const fn a0() -> Reg {10x_reg(10)11}1213// second argument of function call14#[inline]15pub const fn a1() -> Reg {16x_reg(11)17}1819// third argument of function call20#[inline]21pub fn a2() -> Reg {22x_reg(12)23}2425#[inline]26pub fn writable_a0() -> Writable<Reg> {27Writable::from_reg(a0())28}29#[inline]30#[cfg(test)]31pub fn writable_a1() -> Writable<Reg> {32Writable::from_reg(a1())33}34#[inline]35#[expect(dead_code, reason = "here if needed in the future")]36pub fn writable_a2() -> Writable<Reg> {37Writable::from_reg(a2())38}3940#[inline]41#[cfg(test)]42pub fn fa0() -> Reg {43f_reg(10)44}45#[inline]46#[cfg(test)]47pub fn writable_fa0() -> Writable<Reg> {48Writable::from_reg(fa0())49}50#[inline]51#[expect(dead_code, reason = "here if needed in the future")]52pub fn writable_fa1() -> Writable<Reg> {53Writable::from_reg(fa1())54}55#[inline]56pub fn fa1() -> Reg {57f_reg(11)58}5960/// Get a reference to the zero-register.61#[inline]62pub fn zero_reg() -> Reg {63x_reg(0)64}6566/// Get a writable reference to the zero-register (this discards a result).67#[inline]68pub fn writable_zero_reg() -> Writable<Reg> {69Writable::from_reg(zero_reg())70}71#[inline]72pub fn stack_reg() -> Reg {73x_reg(2)74}7576/// Get a writable reference to the stack-pointer register.77#[inline]78pub fn writable_stack_reg() -> Writable<Reg> {79Writable::from_reg(stack_reg())80}8182/// Get a reference to the link register (x1).83pub fn link_reg() -> Reg {84x_reg(1)85}8687/// Get a writable reference to the link register.88#[inline]89pub fn writable_link_reg() -> Writable<Reg> {90Writable::from_reg(link_reg())91}9293/// Get a reference to the frame pointer (x8).94#[inline]95pub fn fp_reg() -> Reg {96x_reg(8)97}9899/// Get a writable reference to the frame pointer.100#[inline]101pub fn writable_fp_reg() -> Writable<Reg> {102Writable::from_reg(fp_reg())103}104105/// Get a reference to the first temporary, sometimes "spill temporary",106/// register. This register is used in various ways as a temporary.107#[inline]108pub fn spilltmp_reg() -> Reg {109x_reg(31)110}111112/// Get a writable reference to the spilltmp reg.113#[inline]114pub fn writable_spilltmp_reg() -> Writable<Reg> {115Writable::from_reg(spilltmp_reg())116}117118///spilltmp2119#[inline]120pub fn spilltmp_reg2() -> Reg {121x_reg(30)122}123124/// Get a writable reference to the spilltmp2 reg.125#[inline]126pub fn writable_spilltmp_reg2() -> Writable<Reg> {127Writable::from_reg(spilltmp_reg2())128}129130#[inline]131pub const fn x_reg(enc: usize) -> Reg {132let p_reg = PReg::new(enc, RegClass::Int);133let v_reg = VReg::new(p_reg.index(), p_reg.class());134Reg::from_virtual_reg(v_reg)135}136pub const fn px_reg(enc: usize) -> PReg {137PReg::new(enc, RegClass::Int)138}139140#[inline]141pub fn f_reg(enc: usize) -> Reg {142let p_reg = PReg::new(enc, RegClass::Float);143let v_reg = VReg::new(p_reg.index(), p_reg.class());144Reg::from(v_reg)145}146pub const fn pf_reg(enc: usize) -> PReg {147PReg::new(enc, RegClass::Float)148}149150pub const fn pv_reg(enc: usize) -> PReg {151PReg::new(enc, RegClass::Vector)152}153154155