polkavm_common/
regmap.rs

1use crate::program::Reg;
2pub use polkavm_assembler::amd64::RegIndex as NativeReg;
3use polkavm_assembler::amd64::RegIndex::*;
4
5#[inline]
6pub const fn to_native_reg(reg: Reg) -> NativeReg {
7    // NOTE: This is sorted roughly in the order of which registers are more commonly used.
8    // We try to assign registers which result in more compact code to the more common RISC-V registers.
9    match reg {
10        Reg::A0 => rdi,
11        Reg::A1 => rax,
12        Reg::SP => rsi,
13        Reg::RA => rbx,
14        Reg::A2 => rdx,
15        Reg::A3 => rbp,
16        Reg::S0 => r8,
17        Reg::S1 => r9,
18        Reg::A4 => r10,
19        Reg::A5 => r11,
20        Reg::T0 => r13,
21        Reg::T1 => r14,
22        Reg::T2 => r12,
23    }
24}
25
26/// A temporary register which can be freely used.
27pub const TMP_REG: NativeReg = rcx;
28
29/// A temporary register which must be saved/restored.
30pub const AUX_TMP_REG: NativeReg = r15;
31
32#[inline]
33pub const fn to_guest_reg(reg: NativeReg) -> Option<Reg> {
34    let mut index = 0;
35    while index < Reg::ALL.len() {
36        let guest_reg = Reg::ALL[index];
37        if to_native_reg(guest_reg) as u32 == reg as u32 {
38            return Some(guest_reg);
39        }
40
41        index += 1;
42    }
43
44    None
45}