Skip to content

Commit 6fa93ff

Browse files
committed
fixed width/segfault issues
1 parent f631c32 commit 6fa93ff

4 files changed

Lines changed: 76 additions & 20 deletions

File tree

run.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/usr/bin/env bash
2+
3+
aarch64-linux-gnu-as test_binary_translate_add.S
4+
aarch64-linux-gnu-ld a.out -o a.bin
5+
./a.bin
6+
echo $?

src/instruction.rs

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@ pub enum RiscVInstruction {
7575
dest: RiscVRegister,
7676
src: RiscVRegister,
7777
},
78+
// Copy immediate
79+
// `mv rd, rs1` expands to `addi rd, rs, 0`
80+
#[strum(serialize = "mvi")]
81+
Mvi {
82+
dest: RiscVRegister,
83+
imm: i32,
84+
},
7885
/// Sign extend Word
7986
///
8087
/// psuedo instruction which translates to `addiw rd, rs, 0`
@@ -175,7 +182,11 @@ pub enum ArmInstruction {
175182
src: ArmVal,
176183
},
177184
#[strum(serialize = "mov")]
178-
Mov,
185+
Mov {
186+
width: ArmWidth,
187+
dest: ArmRegister,
188+
src: ArmVal
189+
},
179190
#[strum(serialize = "ret")]
180191
Ret,
181192
/// Str [r2 + offset] = r1
@@ -435,7 +446,9 @@ impl Into<String> for ArmInstruction {
435446
_ => todo!()
436447
}
437448
},
438-
ArmInstruction::Mov => todo!(),
449+
ArmInstruction::Mov { width, dest, src } => {
450+
format!("mov {}, {}", dest, src)
451+
},
439452
ArmInstruction::Ret => todo!(),
440453
ArmInstruction::Str { width, src, dest } => {
441454
match width {
@@ -468,7 +481,9 @@ impl Into<String> for ArmRegister {
468481
(ArmRegisterName::Pc, ArmWidth::SignedHalf) => todo!(),
469482
(ArmRegisterName::Pc, ArmWidth::Word) => todo!(),
470483
(ArmRegisterName::Pc, ArmWidth::Double) => todo!(),
471-
(ArmRegisterName::Sp, _) => "sp",
484+
(ArmRegisterName::Sp, ArmWidth::Word) => "wsp",
485+
(ArmRegisterName::Sp, ArmWidth::Double) => "sp",
486+
(ArmRegisterName::Sp, _) => todo!(),
472487
(ArmRegisterName::Lr, ArmWidth::Byte) => todo!(),
473488
(ArmRegisterName::Lr, ArmWidth::SignedByte) => todo!(),
474489
(ArmRegisterName::Lr, ArmWidth::Half) => todo!(),
@@ -479,8 +494,8 @@ impl Into<String> for ArmRegister {
479494
(ArmRegisterName::X0, ArmWidth::SignedByte) => todo!(),
480495
(ArmRegisterName::X0, ArmWidth::Half) => todo!(),
481496
(ArmRegisterName::X0, ArmWidth::SignedHalf) => todo!(),
482-
(ArmRegisterName::X0, ArmWidth::Word) => todo!(),
483-
(ArmRegisterName::X0, ArmWidth::Double) => todo!(),
497+
(ArmRegisterName::X0, ArmWidth::Word) => "w0",
498+
(ArmRegisterName::X0, ArmWidth::Double) => "x0",
484499
(ArmRegisterName::X1, ArmWidth::Byte) => todo!(),
485500
(ArmRegisterName::X1, ArmWidth::SignedByte) => todo!(),
486501
(ArmRegisterName::X1, ArmWidth::Half) => todo!(),
@@ -653,8 +668,8 @@ impl Into<String> for ArmRegister {
653668
(ArmRegisterName::X29, ArmWidth::SignedByte) => todo!(),
654669
(ArmRegisterName::X29, ArmWidth::Half) => todo!(),
655670
(ArmRegisterName::X29, ArmWidth::SignedHalf) => todo!(),
656-
(ArmRegisterName::X29, ArmWidth::Word) => todo!(),
657-
(ArmRegisterName::X29, ArmWidth::Double) => todo!(),
671+
(ArmRegisterName::X29, ArmWidth::Word) => "w29",
672+
(ArmRegisterName::X29, ArmWidth::Double) => "x29",
658673
};
659674
s.to_string()
660675
}
@@ -675,7 +690,11 @@ impl Display for ArmVal {
675690
ArmVal::Reg(arm_register) => arm_register.fmt(f),
676691
ArmVal::Imm(x) => write!(f, "{}", x),
677692
ArmVal::RegOffset(arm_register, offset) => {
678-
write!(f, "[{}, {}]", arm_register, offset)
693+
let double_reg = ArmRegister {
694+
name: arm_register.name,
695+
width: ArmWidth::Double
696+
};
697+
write!(f, "[{}, {}]", double_reg, offset)
679698
},
680699
}
681700
}

src/translate.rs

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ macro_rules! sorry {
1717
pub fn translate(riscv_instr: RiscVInstruction) -> ArmInstruction {
1818
match riscv_instr {
1919
RiscVInstruction::Addi { dest, src, imm } => {
20-
let width = RiscVWidth::Word;
20+
if let RiscVRegister::X0 = src {
21+
return translate(RiscVInstruction::Mvi { dest, imm });
22+
}
23+
24+
let width = RiscVWidth::Double;
2125
if imm >= 0 {
2226
ArmInstruction::Add {
2327
dest: map_register(dest, &width),
@@ -28,7 +32,7 @@ pub fn translate(riscv_instr: RiscVInstruction) -> ArmInstruction {
2832
ArmInstruction::Sub {
2933
dest: map_register(dest, &width),
3034
arg1: map_register(src, &width),
31-
arg2: ArmVal::Imm(imm),
35+
arg2: ArmVal::Imm(imm.abs()),
3236
}
3337
}
3438
}
@@ -50,6 +54,14 @@ pub fn translate(riscv_instr: RiscVInstruction) -> ArmInstruction {
5054
arg2: ArmVal::Imm(0),
5155
}
5256
},
57+
RiscVInstruction::Mvi { dest, imm } => {
58+
let width = RiscVWidth::Double;
59+
ArmInstruction::Mov {
60+
width: map_width(&width),
61+
dest: map_register(dest, &width),
62+
src: ArmVal::Imm(imm)
63+
}
64+
},
5365
RiscVInstruction::Add {
5466
width,
5567
dest,
@@ -90,14 +102,20 @@ pub fn translate(riscv_instr: RiscVInstruction) -> ArmInstruction {
90102
panic!("Li with imm out of range");
91103
}
92104

93-
ArmInstruction::Add {
94-
dest: map_register(dest, &RiscVWidth::Double),
95-
arg1: ArmRegister {
96-
width: ArmWidth::Double,
97-
name: ArmRegisterName::Zero,
98-
},
99-
arg2: ArmVal::Imm(imm),
105+
let width = RiscVWidth::Double;
106+
ArmInstruction::Mov {
107+
width: map_width(&width),
108+
dest: map_register(dest, &width),
109+
src: ArmVal::Imm(imm)
100110
}
111+
// ArmInstruction::Add {
112+
// dest: map_register(dest, &RiscVWidth::Double),
113+
// arg1: ArmRegister {
114+
// width: ArmWidth::Double,
115+
// name: ArmRegisterName::Zero,
116+
// },
117+
// arg2: ArmVal::Imm(imm),
118+
// }
101119
}
102120
}
103121
}
@@ -121,9 +139,9 @@ fn map_register_name(riscv_reg: RiscVRegister) -> ArmRegisterName {
121139
RiscVRegister::T0 => ArmRegisterName::X2,
122140
RiscVRegister::T1 => ArmRegisterName::X3,
123141
RiscVRegister::T2 => ArmRegisterName::X4,
124-
RiscVRegister::S0FP => ArmRegisterName::X5,
142+
// skipped X5
125143
RiscVRegister::S1 => ArmRegisterName::X6,
126-
RiscVRegister::A0 => ArmRegisterName::X7,
144+
RiscVRegister::A0 => ArmRegisterName::X0,
127145
RiscVRegister::A1 => ArmRegisterName::X8,
128146
RiscVRegister::A2 => ArmRegisterName::X9,
129147
RiscVRegister::A3 => ArmRegisterName::X10,
@@ -145,6 +163,7 @@ fn map_register_name(riscv_reg: RiscVRegister) -> ArmRegisterName {
145163
RiscVRegister::T4 => ArmRegisterName::X26,
146164
RiscVRegister::T5 => ArmRegisterName::X27,
147165
RiscVRegister::T6 => ArmRegisterName::X28,
166+
RiscVRegister::S0FP => ArmRegisterName::X29,
148167
}
149168
}
150169

src/utils.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,22 @@ use std::fs;
22

33
use crate::{instruction::RiscVInstruction, translate::translate_instrs};
44

5+
const start: &str = r#"
6+
.text
7+
8+
.global _start
9+
10+
_start:
11+
bl main
12+
mov x8, #93
13+
svc #0
14+
15+
main:
16+
"#;
517

618
pub fn translate_to_file(instrs: Vec<RiscVInstruction>, path: String) {
719
let arm_instrs = translate_instrs(instrs);
8-
let mut contents = String::new();
20+
let mut contents = String::from(start);
921
for instr in arm_instrs {
1022
let x: String = instr.into();
1123
contents.push_str(&x);

0 commit comments

Comments
 (0)