Skip to content

Commit 7a5d205

Browse files
committed
translate: map_register_name with semantic meanings
Corrected the translation between registers for our 64 bit architectures.
1 parent 5fd4018 commit 7a5d205

2 files changed

Lines changed: 85 additions & 50 deletions

File tree

src/instruction.rs

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ pub enum RiscVRegister {
248248
/// Temporaries
249249
T2,
250250
#[strum(serialize = "s0", serialize = "fp")]
251-
/// Saved register/frame pointer
251+
/// Saved register/frame pointer R29
252252
S0FP,
253253
#[strum(serialize = "s1")]
254254
/// Saved registers
@@ -335,58 +335,60 @@ impl Default for ArmRegister {
335335

336336
/// ARM Registers
337337
/// https://developer.arm.com/documentation/dui0056/d/using-the-procedure-call-standard/register-roles-and-names/register-names
338+
/// Image of instructions https://duetorun.com/blog/arm/images/AArch64-registers.png
339+
/// - https://duetorun.com/blog/20230601/a64-regs/#user_program_registers
338340
#[derive(Debug, EnumString)]
339341
pub enum ArmRegisterName {
342+
#[strum(serialize = "wzr", serialize = "xzr")]
343+
/// Zero register. Hardware special.
344+
Zero,
340345
#[strum(serialize = "pc")]
341-
/// Program counter.
346+
/// Program counter. Hardware special register.
342347
Pc,
343-
#[strum(serialize = "lr")]
344-
/// Link register.
345-
Lr,
346348
#[strum(serialize = "sp")]
347-
/// Stack pointer.
349+
/// Stack pointer. Hardware special register.
348350
Sp,
349-
#[strum(serialize = "ip")]
350-
/// Intra-procedure-call scratch register.
351-
Ip,
352-
#[strum(serialize = "v8")]
353-
/// ARM-state variable register 8.
354-
V8,
355-
#[strum(serialize = "sl")]
356-
/// ARM-state variable register 7. Stack limit pointer in stack-checked variants.
357-
Sl,
358-
#[strum(serialize = "sb")]
359-
/// ARM-state variable register 6. Static base in RWPI variants.
360-
Sb,
361-
#[strum(serialize = "v5")]
362-
/// ARM-state variable register 5.
363-
V5,
364-
#[strum(serialize = "v4")]
365-
/// Variable register 4.
366-
V4,
367-
#[strum(serialize = "v3")]
368-
/// Variable register 3.
369-
V3,
370-
#[strum(serialize = "v2")]
371-
/// Variable register 2.
372-
V2,
373-
#[strum(serialize = "v1")]
374-
/// Variable register 1.
375-
V1,
376-
#[strum(serialize = "a4")]
377-
/// Argument/result/scratch register 4.
378-
A4,
379-
#[strum(serialize = "a3")]
380-
/// Argument/result/scratch register 3.
381-
A3,
382-
#[strum(serialize = "a2")]
383-
/// Argument/result/scratch register 2.
384-
A2,
385-
#[strum(serialize = "a1")]
386-
/// Argument/result/scratch register 1.
387-
A1,
388-
#[strum(serialize = "wzr", serialize = "xzr")]
389-
Zero,
351+
#[strum(serialize = "lr")]
352+
/// Link register. X30. Hardware special register.
353+
Lr,
354+
// Parameter passing and/or scratch registers (volatile)
355+
X0,
356+
X1,
357+
X2,
358+
X3,
359+
X4,
360+
X5,
361+
X6,
362+
X7,
363+
// Caller-Saved scratch registers (volatile)
364+
/// XR
365+
X8,
366+
X9,
367+
X10,
368+
X11,
369+
X12,
370+
X13,
371+
X14,
372+
X15,
373+
/// IP0
374+
X16,
375+
/// IP1
376+
X17,
377+
/// PR
378+
X18,
379+
// Caller-Saved registers (non-volatile)
380+
X19,
381+
X20,
382+
X21,
383+
X22,
384+
X23,
385+
X24,
386+
X25,
387+
X26,
388+
X27,
389+
X28,
390+
/// FP
391+
X29,
390392
}
391393

392394
impl Default for ArmRegisterName {

src/translate.rs

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,43 @@ fn map_register(riscv_reg: RiscVRegister, riscv_width: &RiscVWidth) -> ArmRegist
109109
}
110110
}
111111

112+
/// Semantic meaning of registers
113+
/// https://riscv.org/wp-content/uploads/2024/12/riscv-calling.pdf#page=3
112114
fn map_register_name(riscv_reg: RiscVRegister) -> ArmRegisterName {
113-
// todo!()
114-
// FIXME: do real implementation
115-
ArmRegisterName::A1
115+
match riscv_reg {
116+
RiscVRegister::X0 => ArmRegisterName::Zero,
117+
RiscVRegister::RA => ArmRegisterName::Lr,
118+
RiscVRegister::SP => ArmRegisterName::Sp,
119+
RiscVRegister::GP => ArmRegisterName::X0,
120+
RiscVRegister::TP => ArmRegisterName::X1,
121+
RiscVRegister::T0 => ArmRegisterName::X2,
122+
RiscVRegister::T1 => ArmRegisterName::X3,
123+
RiscVRegister::T2 => ArmRegisterName::X4,
124+
RiscVRegister::S0FP => ArmRegisterName::X5,
125+
RiscVRegister::S1 => ArmRegisterName::X6,
126+
RiscVRegister::A0 => ArmRegisterName::X7,
127+
RiscVRegister::A1 => ArmRegisterName::X8,
128+
RiscVRegister::A2 => ArmRegisterName::X9,
129+
RiscVRegister::A3 => ArmRegisterName::X10,
130+
RiscVRegister::A4 => ArmRegisterName::X11,
131+
RiscVRegister::A5 => ArmRegisterName::X12,
132+
RiscVRegister::A6 => ArmRegisterName::X13,
133+
RiscVRegister::A7 => ArmRegisterName::X14,
134+
RiscVRegister::S2 => ArmRegisterName::X15,
135+
RiscVRegister::S3 => ArmRegisterName::X16,
136+
RiscVRegister::S4 => ArmRegisterName::X17,
137+
RiscVRegister::S5 => ArmRegisterName::X18,
138+
RiscVRegister::S6 => ArmRegisterName::X19,
139+
RiscVRegister::S7 => ArmRegisterName::X20,
140+
RiscVRegister::S8 => ArmRegisterName::X21,
141+
RiscVRegister::S9 => ArmRegisterName::X22,
142+
RiscVRegister::S10 => ArmRegisterName::X23,
143+
RiscVRegister::S11 => ArmRegisterName::X24,
144+
RiscVRegister::T3 => ArmRegisterName::X25,
145+
RiscVRegister::T4 => ArmRegisterName::X26,
146+
RiscVRegister::T5 => ArmRegisterName::X27,
147+
RiscVRegister::T6 => ArmRegisterName::X28,
148+
}
116149
}
117150

118151
fn map_val(riscv_val: RiscVVal, riscv_width: &RiscVWidth) -> ArmVal {

0 commit comments

Comments
 (0)