@@ -14,7 +14,7 @@ macro_rules! sorry {
1414/// Run the core logic to match from RISC-V to ARM Instructions.
1515
1616/// Translate one instruction at a time.
17- pub fn translate ( riscv_instr : RiscVInstruction ) -> ArmInstruction {
17+ pub fn translate ( riscv_instr : RiscVInstruction ) -> Vec < ArmInstruction > {
1818 match riscv_instr {
1919 RiscVInstruction :: Addi { dest, src, imm } => {
2020 if let RiscVRegister :: X0 = src {
@@ -23,68 +23,68 @@ pub fn translate(riscv_instr: RiscVInstruction) -> ArmInstruction {
2323
2424 let width = RiscVWidth :: Double ;
2525 if imm >= 0 {
26- ArmInstruction :: Add {
26+ vec ! [ ArmInstruction :: Add {
2727 dest: map_register( dest, & width) ,
2828 arg1: map_register( src, & width) ,
2929 arg2: ArmVal :: Imm ( imm) ,
30- }
30+ } ]
3131 } else {
32- ArmInstruction :: Sub {
32+ vec ! [ ArmInstruction :: Sub {
3333 dest: map_register( dest, & width) ,
3434 arg1: map_register( src, & width) ,
3535 arg2: ArmVal :: Imm ( imm. abs( ) ) ,
36- }
36+ } ]
3737 }
3838 } ,
39- RiscVInstruction :: Ble { arg1, arg2, target } => {
39+ RiscVInstruction :: Ble { arg1, arg2, target } => vec ! [ {
4040 let width = RiscVWidth :: Double ;
4141 ArmInstruction :: Ble {
4242 arg1: map_register( arg1, & width) ,
4343 arg2: map_register( arg2, & width) ,
4444 target: map_val( target, & width)
4545 }
46- } ,
47- RiscVInstruction :: J { target } => ArmInstruction :: B {
46+ } ] ,
47+ RiscVInstruction :: J { target } => vec ! [ ArmInstruction :: B {
4848 target: map_val( target, & RiscVWidth :: Double )
49- } ,
50- RiscVInstruction :: S { width, src, dest } => ArmInstruction :: Str {
49+ } ] ,
50+ RiscVInstruction :: S { width, src, dest } => vec ! [ ArmInstruction :: Str {
5151 width: map_width( & width) ,
5252 src: map_register( src, & width) ,
5353 dest: map_val( dest, & width) ,
54- } ,
55- RiscVInstruction :: L { width, dest, src } => ArmInstruction :: Ldr {
54+ } ] ,
55+ RiscVInstruction :: L { width, dest, src } => vec ! [ ArmInstruction :: Ldr {
5656 width: map_width( & width) ,
5757 dest: map_register( dest, & width) ,
5858 src: map_val( src, & width) ,
59- } ,
59+ } ] ,
6060 RiscVInstruction :: Directive { name, operands } => {
6161 let arm_operands = operands. replace ( "@" , "%" ) ;
62- ArmInstruction :: Directive { name, operands : arm_operands }
62+ vec ! [ ArmInstruction :: Directive { name, operands: arm_operands } ]
6363 }
64- RiscVInstruction :: Label { name } => ArmInstruction :: Label { name } ,
64+ RiscVInstruction :: Label { name } => vec ! [ ArmInstruction :: Label { name } ] ,
6565 RiscVInstruction :: Mv { dest, src } => {
6666 let width = RiscVWidth :: Double ;
67- ArmInstruction :: Add {
67+ vec ! [ ArmInstruction :: Add {
6868 dest: map_register( dest, & width) ,
6969 arg1: map_register( src, & width) ,
7070 arg2: ArmVal :: Imm ( 0 ) ,
71- }
72- }
73- RiscVInstruction :: Mvi { dest, imm } => {
71+ } ]
72+ } ,
73+ RiscVInstruction :: Mvi { dest, imm } => {
7474 let width = RiscVWidth :: Double ;
75- ArmInstruction :: Mov {
75+ vec ! [ ArmInstruction :: Mov {
7676 width: map_width( & width) ,
7777 dest: map_register( dest, & width) ,
78- src : ArmVal :: Imm ( imm) ,
79- }
80- }
78+ src: ArmVal :: Imm ( imm)
79+ } ]
80+ } ,
8181 RiscVInstruction :: Add {
8282 width,
8383 dest,
8484 arg1,
8585 arg2,
8686 } => match width {
87- RiscVWidth :: Word => ArmInstruction :: Add {
87+ RiscVWidth :: Word => vec ! [ ArmInstruction :: Add {
8888 dest: ArmRegister {
8989 width: ArmWidth :: Word ,
9090 name: map_register_name( dest) ,
@@ -97,10 +97,10 @@ pub fn translate(riscv_instr: RiscVInstruction) -> ArmInstruction {
9797 width: ArmWidth :: Word ,
9898 name: map_register_name( arg2) ,
9999 } ) ,
100- } ,
100+ } ] ,
101101 RiscVWidth :: Double => sorry ! ( ) ,
102102 } ,
103- RiscVInstruction :: SextW { dest, src } => ArmInstruction :: Sxtw {
103+ RiscVInstruction :: SextW { dest, src } => vec ! [ ArmInstruction :: Sxtw {
104104 dest: ArmRegister {
105105 width: ArmWidth :: Double ,
106106 name: map_register_name( dest) ,
@@ -109,21 +109,21 @@ pub fn translate(riscv_instr: RiscVInstruction) -> ArmInstruction {
109109 width: ArmWidth :: Word ,
110110 name: map_register_name( src) ,
111111 } ,
112- } ,
113- RiscVInstruction :: Jr { target } => ArmInstruction :: Blr {
112+ } ] ,
113+ RiscVInstruction :: Jr { target } => vec ! [ ArmInstruction :: Blr {
114114 target: map_register_name( target) ,
115- } ,
115+ } ] ,
116116 RiscVInstruction :: Li { dest, imm } => {
117117 if imm > 4095 || imm < 0 {
118118 panic ! ( "Li with imm out of range" ) ;
119119 }
120120
121121 let width = RiscVWidth :: Double ;
122- ArmInstruction :: Mov {
122+ vec ! [ ArmInstruction :: Mov {
123123 width: map_width( & width) ,
124124 dest: map_register( dest, & width) ,
125125 src: ArmVal :: Imm ( imm) ,
126- }
126+ } ]
127127 // ArmInstruction::Add {
128128 // dest: map_register(dest, &RiscVWidth::Double),
129129 // arg1: ArmRegister {
@@ -135,26 +135,44 @@ pub fn translate(riscv_instr: RiscVInstruction) -> ArmInstruction {
135135 } ,
136136 RiscVInstruction :: Addl { dest, src, label } => {
137137 let width = RiscVWidth :: Double ;
138- ArmInstruction :: Add {
138+ vec ! [ ArmInstruction :: Add {
139139 dest: map_register( dest, & width) ,
140140 arg1: map_register( src, & width) ,
141141 arg2: map_val( label, & width) ,
142- }
142+ } ]
143143 } ,
144144 RiscVInstruction :: Lui { dest, src } => {
145145 // only used to load upper bits or adrp in arm
146146 let width = RiscVWidth :: Double ;
147- ArmInstruction :: Adrp {
147+ vec ! [ ArmInstruction :: Adrp {
148148 dest: map_register( dest, & width) ,
149149 label: map_val( src, & width) ,
150- }
150+ } ]
151151 } ,
152152 RiscVInstruction :: Call { label } => {
153153 let width = RiscVWidth :: Double ;
154- ArmInstruction :: Bl {
154+ vec ! [ ArmInstruction :: Bl {
155155 target: map_val( label, & width) ,
156- }
156+ } ]
157+ }
158+ RiscVInstruction :: ECall => {
159+ let syscall_num_reg = ArmRegister {
160+ width : ArmWidth :: Double ,
161+ name : ArmRegisterName :: X8
162+ } ;
163+ vec ! [
164+ // ArmInstruction::Cmp(syscall_num_reg, ArmVal::Imm(RISCV_WRITE)), // if (x8 == RISCV_WRITE) {
165+ // ArmInstruction::Bne("else"),
166+ // ArmInstruction::Mov { width: ArmWidth::Double, dest: x8, src: ArmVal::Imm(SYS_WRITE) }, // x8 = ARM_WRITE;
167+ // ArmInstruction::B("done"),
168+ // ArmInstruction::Label("else"), // } else {
169+ // ArmInstruction::Mov { width: ArmWidth::Double, dest: x8, src: ArmVal::Imm(__) }, // x8 = ARM_EXIT
170+ // // }
171+ // ArmInstruction::Label("done"),
172+ ArmInstruction :: Svc { id: 0 }
173+ ]
157174 }
175+ RiscVInstruction :: Verbatim { text } => vec ! [ ArmInstruction :: Verbatim { text } ]
158176 }
159177}
160178
@@ -172,21 +190,30 @@ fn map_register_name(riscv_reg: RiscVRegister) -> ArmRegisterName {
172190 RiscVRegister :: X0 => ArmRegisterName :: Zero ,
173191 RiscVRegister :: RA => ArmRegisterName :: Lr ,
174192 RiscVRegister :: SP => ArmRegisterName :: Sp ,
175- RiscVRegister :: GP => ArmRegisterName :: X0 ,
176- RiscVRegister :: TP => ArmRegisterName :: X1 ,
177- RiscVRegister :: T0 => ArmRegisterName :: X2 ,
178- RiscVRegister :: T1 => ArmRegisterName :: X3 ,
179- RiscVRegister :: T2 => ArmRegisterName :: X4 ,
193+ RiscVRegister :: GP => ArmRegisterName :: X12 ,
194+ RiscVRegister :: TP => ArmRegisterName :: X14 ,
195+ RiscVRegister :: T0 => ArmRegisterName :: X9 ,
196+ RiscVRegister :: T1 => ArmRegisterName :: X10 ,
197+ RiscVRegister :: T2 => ArmRegisterName :: X11 ,
180198 // skipped X5
181- RiscVRegister :: S1 => ArmRegisterName :: X6 ,
182- RiscVRegister :: A0 => ArmRegisterName :: X0 ,
183- RiscVRegister :: A1 => ArmRegisterName :: X1 ,
184- RiscVRegister :: A2 => ArmRegisterName :: X2 ,
185- RiscVRegister :: A3 => ArmRegisterName :: X3 ,
186- RiscVRegister :: A4 => ArmRegisterName :: X4 ,
187- RiscVRegister :: A5 => ArmRegisterName :: X5 ,
188- RiscVRegister :: A6 => ArmRegisterName :: X6 ,
189- RiscVRegister :: A7 => ArmRegisterName :: X7 ,
199+ // RiscVRegister::S1 => ArmRegisterName::X6,
200+ // RiscVRegister::A0 => ArmRegisterName::X0,
201+ // RiscVRegister::A1 => ArmRegisterName::X1,
202+ // RiscVRegister::A2 => ArmRegisterName::X2,
203+ // RiscVRegister::A3 => ArmRegisterName::X3,
204+ // RiscVRegister::A4 => ArmRegisterName::X4,
205+ // RiscVRegister::A5 => ArmRegisterName::X5,
206+ // RiscVRegister::A6 => ArmRegisterName::X6,
207+ // RiscVRegister::A7 => ArmRegisterName::X7,
208+ RiscVRegister :: S1 => ArmRegisterName :: X13 ,
209+ RiscVRegister :: A0 => ArmRegisterName :: X0 , // return value/syscall arg 0
210+ RiscVRegister :: A1 => ArmRegisterName :: X1 , // syscall arg 1
211+ RiscVRegister :: A2 => ArmRegisterName :: X2 , // syscall arg 2
212+ RiscVRegister :: A3 => ArmRegisterName :: X3 , // syscall arg 3
213+ RiscVRegister :: A4 => ArmRegisterName :: X4 , // syscall arg 4
214+ RiscVRegister :: A5 => ArmRegisterName :: X5 , // syscall arg 5
215+ RiscVRegister :: A6 => ArmRegisterName :: X6 , // syscall arg 6
216+ RiscVRegister :: A7 => ArmRegisterName :: X8 , // syscall number
190217 RiscVRegister :: S2 => ArmRegisterName :: X15 ,
191218 RiscVRegister :: S3 => ArmRegisterName :: X16 ,
192219 RiscVRegister :: S4 => ArmRegisterName :: X17 ,
@@ -227,8 +254,10 @@ fn map_width(riscv_width: &RiscVWidth) -> ArmWidth {
227254pub fn translate_instrs ( riscv_instrs : Vec < RiscVInstruction > ) -> Vec < ArmInstruction > {
228255 riscv_instrs
229256 . into_iter ( )
230- . map ( |instr| translate ( instr) )
231- . collect :: < Vec < ArmInstruction > > ( )
257+ . map ( translate) . fold ( vec ! [ ] , |mut acc, x|{
258+ acc. extend ( x) ;
259+ acc
260+ } )
232261}
233262
234263/// Runs binary translation
0 commit comments