Skip to content

Commit aaeb3c8

Browse files
committed
starting instruction encoding
1 parent 2273195 commit aaeb3c8

2 files changed

Lines changed: 256 additions & 1 deletion

File tree

src/instruction.rs

Lines changed: 250 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
use std::convert::Into;
12
use std::default;
3+
use std::fmt::{write, Display};
24

35
/// This file defines all the supported ARM and RISC-V instructions we support.
46
/// We use `strum` to assist in serializing asm files to our [`Instruction`] enum.
@@ -414,3 +416,251 @@ pub fn parse_asm(asm: &str) -> Vec<RiscVInstruction> {
414416
})
415417
.collect()
416418
}
419+
420+
impl Into<String> for ArmInstruction {
421+
fn into(self) -> String {
422+
match self {
423+
ArmInstruction::Adc => todo!(),
424+
ArmInstruction::Add { dest, arg1, arg2 } => {
425+
format!("add {} {} {}", dest, arg1, arg2)
426+
},
427+
ArmInstruction::And => todo!(),
428+
ArmInstruction::B => todo!(),
429+
ArmInstruction::Blr { target } => todo!(),
430+
ArmInstruction::Ldr { width, dest, src } => todo!(),
431+
ArmInstruction::Mov => todo!(),
432+
ArmInstruction::Ret => todo!(),
433+
ArmInstruction::Str { width, src, dest } => todo!(),
434+
ArmInstruction::Sub { dest, arg1, arg2 } =>
435+
{
436+
format!("sub {} {} {}", dest, arg1, arg2)
437+
},
438+
ArmInstruction::Sxtw { dest, src } => todo!(),
439+
}
440+
}
441+
}
442+
443+
impl Display for ArmRegister {
444+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
445+
match (&self.width, &self.name) {
446+
(ArmWidth::Byte, ArmRegisterName::Zero) => todo!(),
447+
(ArmWidth::Byte, ArmRegisterName::Pc) => todo!(),
448+
(ArmWidth::Byte, ArmRegisterName::Sp) => todo!(),
449+
(ArmWidth::Byte, ArmRegisterName::Lr) => todo!(),
450+
(ArmWidth::Byte, ArmRegisterName::X0) => todo!(),
451+
(ArmWidth::Byte, ArmRegisterName::X1) => todo!(),
452+
(ArmWidth::Byte, ArmRegisterName::X2) => todo!(),
453+
(ArmWidth::Byte, ArmRegisterName::X3) => todo!(),
454+
(ArmWidth::Byte, ArmRegisterName::X4) => todo!(),
455+
(ArmWidth::Byte, ArmRegisterName::X5) => todo!(),
456+
(ArmWidth::Byte, ArmRegisterName::X6) => todo!(),
457+
(ArmWidth::Byte, ArmRegisterName::X7) => todo!(),
458+
(ArmWidth::Byte, ArmRegisterName::X8) => todo!(),
459+
(ArmWidth::Byte, ArmRegisterName::X9) => todo!(),
460+
(ArmWidth::Byte, ArmRegisterName::X10) => todo!(),
461+
(ArmWidth::Byte, ArmRegisterName::X11) => todo!(),
462+
(ArmWidth::Byte, ArmRegisterName::X12) => todo!(),
463+
(ArmWidth::Byte, ArmRegisterName::X13) => todo!(),
464+
(ArmWidth::Byte, ArmRegisterName::X14) => todo!(),
465+
(ArmWidth::Byte, ArmRegisterName::X15) => todo!(),
466+
(ArmWidth::Byte, ArmRegisterName::X16) => todo!(),
467+
(ArmWidth::Byte, ArmRegisterName::X17) => todo!(),
468+
(ArmWidth::Byte, ArmRegisterName::X18) => todo!(),
469+
(ArmWidth::Byte, ArmRegisterName::X19) => todo!(),
470+
(ArmWidth::Byte, ArmRegisterName::X20) => todo!(),
471+
(ArmWidth::Byte, ArmRegisterName::X21) => todo!(),
472+
(ArmWidth::Byte, ArmRegisterName::X22) => todo!(),
473+
(ArmWidth::Byte, ArmRegisterName::X23) => todo!(),
474+
(ArmWidth::Byte, ArmRegisterName::X24) => todo!(),
475+
(ArmWidth::Byte, ArmRegisterName::X25) => todo!(),
476+
(ArmWidth::Byte, ArmRegisterName::X26) => todo!(),
477+
(ArmWidth::Byte, ArmRegisterName::X27) => todo!(),
478+
(ArmWidth::Byte, ArmRegisterName::X28) => todo!(),
479+
(ArmWidth::Byte, ArmRegisterName::X29) => todo!(),
480+
(ArmWidth::SignedByte, ArmRegisterName::Zero) => todo!(),
481+
(ArmWidth::SignedByte, ArmRegisterName::Pc) => todo!(),
482+
(ArmWidth::SignedByte, ArmRegisterName::Sp) => todo!(),
483+
(ArmWidth::SignedByte, ArmRegisterName::Lr) => todo!(),
484+
(ArmWidth::SignedByte, ArmRegisterName::X0) => todo!(),
485+
(ArmWidth::SignedByte, ArmRegisterName::X1) => todo!(),
486+
(ArmWidth::SignedByte, ArmRegisterName::X2) => todo!(),
487+
(ArmWidth::SignedByte, ArmRegisterName::X3) => todo!(),
488+
(ArmWidth::SignedByte, ArmRegisterName::X4) => todo!(),
489+
(ArmWidth::SignedByte, ArmRegisterName::X5) => todo!(),
490+
(ArmWidth::SignedByte, ArmRegisterName::X6) => todo!(),
491+
(ArmWidth::SignedByte, ArmRegisterName::X7) => todo!(),
492+
(ArmWidth::SignedByte, ArmRegisterName::X8) => todo!(),
493+
(ArmWidth::SignedByte, ArmRegisterName::X9) => todo!(),
494+
(ArmWidth::SignedByte, ArmRegisterName::X10) => todo!(),
495+
(ArmWidth::SignedByte, ArmRegisterName::X11) => todo!(),
496+
(ArmWidth::SignedByte, ArmRegisterName::X12) => todo!(),
497+
(ArmWidth::SignedByte, ArmRegisterName::X13) => todo!(),
498+
(ArmWidth::SignedByte, ArmRegisterName::X14) => todo!(),
499+
(ArmWidth::SignedByte, ArmRegisterName::X15) => todo!(),
500+
(ArmWidth::SignedByte, ArmRegisterName::X16) => todo!(),
501+
(ArmWidth::SignedByte, ArmRegisterName::X17) => todo!(),
502+
(ArmWidth::SignedByte, ArmRegisterName::X18) => todo!(),
503+
(ArmWidth::SignedByte, ArmRegisterName::X19) => todo!(),
504+
(ArmWidth::SignedByte, ArmRegisterName::X20) => todo!(),
505+
(ArmWidth::SignedByte, ArmRegisterName::X21) => todo!(),
506+
(ArmWidth::SignedByte, ArmRegisterName::X22) => todo!(),
507+
(ArmWidth::SignedByte, ArmRegisterName::X23) => todo!(),
508+
(ArmWidth::SignedByte, ArmRegisterName::X24) => todo!(),
509+
(ArmWidth::SignedByte, ArmRegisterName::X25) => todo!(),
510+
(ArmWidth::SignedByte, ArmRegisterName::X26) => todo!(),
511+
(ArmWidth::SignedByte, ArmRegisterName::X27) => todo!(),
512+
(ArmWidth::SignedByte, ArmRegisterName::X28) => todo!(),
513+
(ArmWidth::SignedByte, ArmRegisterName::X29) => todo!(),
514+
(ArmWidth::Half, ArmRegisterName::Zero) => todo!(),
515+
(ArmWidth::Half, ArmRegisterName::Pc) => todo!(),
516+
(ArmWidth::Half, ArmRegisterName::Sp) => todo!(),
517+
(ArmWidth::Half, ArmRegisterName::Lr) => todo!(),
518+
(ArmWidth::Half, ArmRegisterName::X0) => todo!(),
519+
(ArmWidth::Half, ArmRegisterName::X1) => todo!(),
520+
(ArmWidth::Half, ArmRegisterName::X2) => todo!(),
521+
(ArmWidth::Half, ArmRegisterName::X3) => todo!(),
522+
(ArmWidth::Half, ArmRegisterName::X4) => todo!(),
523+
(ArmWidth::Half, ArmRegisterName::X5) => todo!(),
524+
(ArmWidth::Half, ArmRegisterName::X6) => todo!(),
525+
(ArmWidth::Half, ArmRegisterName::X7) => todo!(),
526+
(ArmWidth::Half, ArmRegisterName::X8) => todo!(),
527+
(ArmWidth::Half, ArmRegisterName::X9) => todo!(),
528+
(ArmWidth::Half, ArmRegisterName::X10) => todo!(),
529+
(ArmWidth::Half, ArmRegisterName::X11) => todo!(),
530+
(ArmWidth::Half, ArmRegisterName::X12) => todo!(),
531+
(ArmWidth::Half, ArmRegisterName::X13) => todo!(),
532+
(ArmWidth::Half, ArmRegisterName::X14) => todo!(),
533+
(ArmWidth::Half, ArmRegisterName::X15) => todo!(),
534+
(ArmWidth::Half, ArmRegisterName::X16) => todo!(),
535+
(ArmWidth::Half, ArmRegisterName::X17) => todo!(),
536+
(ArmWidth::Half, ArmRegisterName::X18) => todo!(),
537+
(ArmWidth::Half, ArmRegisterName::X19) => todo!(),
538+
(ArmWidth::Half, ArmRegisterName::X20) => todo!(),
539+
(ArmWidth::Half, ArmRegisterName::X21) => todo!(),
540+
(ArmWidth::Half, ArmRegisterName::X22) => todo!(),
541+
(ArmWidth::Half, ArmRegisterName::X23) => todo!(),
542+
(ArmWidth::Half, ArmRegisterName::X24) => todo!(),
543+
(ArmWidth::Half, ArmRegisterName::X25) => todo!(),
544+
(ArmWidth::Half, ArmRegisterName::X26) => todo!(),
545+
(ArmWidth::Half, ArmRegisterName::X27) => todo!(),
546+
(ArmWidth::Half, ArmRegisterName::X28) => todo!(),
547+
(ArmWidth::Half, ArmRegisterName::X29) => todo!(),
548+
(ArmWidth::SignedHalf, ArmRegisterName::Zero) => todo!(),
549+
(ArmWidth::SignedHalf, ArmRegisterName::Pc) => todo!(),
550+
(ArmWidth::SignedHalf, ArmRegisterName::Sp) => todo!(),
551+
(ArmWidth::SignedHalf, ArmRegisterName::Lr) => todo!(),
552+
(ArmWidth::SignedHalf, ArmRegisterName::X0) => todo!(),
553+
(ArmWidth::SignedHalf, ArmRegisterName::X1) => todo!(),
554+
(ArmWidth::SignedHalf, ArmRegisterName::X2) => todo!(),
555+
(ArmWidth::SignedHalf, ArmRegisterName::X3) => todo!(),
556+
(ArmWidth::SignedHalf, ArmRegisterName::X4) => todo!(),
557+
(ArmWidth::SignedHalf, ArmRegisterName::X5) => todo!(),
558+
(ArmWidth::SignedHalf, ArmRegisterName::X6) => todo!(),
559+
(ArmWidth::SignedHalf, ArmRegisterName::X7) => todo!(),
560+
(ArmWidth::SignedHalf, ArmRegisterName::X8) => todo!(),
561+
(ArmWidth::SignedHalf, ArmRegisterName::X9) => todo!(),
562+
(ArmWidth::SignedHalf, ArmRegisterName::X10) => todo!(),
563+
(ArmWidth::SignedHalf, ArmRegisterName::X11) => todo!(),
564+
(ArmWidth::SignedHalf, ArmRegisterName::X12) => todo!(),
565+
(ArmWidth::SignedHalf, ArmRegisterName::X13) => todo!(),
566+
(ArmWidth::SignedHalf, ArmRegisterName::X14) => todo!(),
567+
(ArmWidth::SignedHalf, ArmRegisterName::X15) => todo!(),
568+
(ArmWidth::SignedHalf, ArmRegisterName::X16) => todo!(),
569+
(ArmWidth::SignedHalf, ArmRegisterName::X17) => todo!(),
570+
(ArmWidth::SignedHalf, ArmRegisterName::X18) => todo!(),
571+
(ArmWidth::SignedHalf, ArmRegisterName::X19) => todo!(),
572+
(ArmWidth::SignedHalf, ArmRegisterName::X20) => todo!(),
573+
(ArmWidth::SignedHalf, ArmRegisterName::X21) => todo!(),
574+
(ArmWidth::SignedHalf, ArmRegisterName::X22) => todo!(),
575+
(ArmWidth::SignedHalf, ArmRegisterName::X23) => todo!(),
576+
(ArmWidth::SignedHalf, ArmRegisterName::X24) => todo!(),
577+
(ArmWidth::SignedHalf, ArmRegisterName::X25) => todo!(),
578+
(ArmWidth::SignedHalf, ArmRegisterName::X26) => todo!(),
579+
(ArmWidth::SignedHalf, ArmRegisterName::X27) => todo!(),
580+
(ArmWidth::SignedHalf, ArmRegisterName::X28) => todo!(),
581+
(ArmWidth::SignedHalf, ArmRegisterName::X29) => todo!(),
582+
(ArmWidth::Word, ArmRegisterName::Zero) => todo!(),
583+
(ArmWidth::Word, ArmRegisterName::Pc) => todo!(),
584+
(ArmWidth::Word, ArmRegisterName::Sp) => todo!(),
585+
(ArmWidth::Word, ArmRegisterName::Lr) => todo!(),
586+
(ArmWidth::Word, ArmRegisterName::X0) => todo!(),
587+
(ArmWidth::Word, ArmRegisterName::X1) => todo!(),
588+
(ArmWidth::Word, ArmRegisterName::X2) => todo!(),
589+
(ArmWidth::Word, ArmRegisterName::X3) => todo!(),
590+
(ArmWidth::Word, ArmRegisterName::X4) => todo!(),
591+
(ArmWidth::Word, ArmRegisterName::X5) => todo!(),
592+
(ArmWidth::Word, ArmRegisterName::X6) => todo!(),
593+
(ArmWidth::Word, ArmRegisterName::X7) => todo!(),
594+
(ArmWidth::Word, ArmRegisterName::X8) => todo!(),
595+
(ArmWidth::Word, ArmRegisterName::X9) => todo!(),
596+
(ArmWidth::Word, ArmRegisterName::X10) => todo!(),
597+
(ArmWidth::Word, ArmRegisterName::X11) => todo!(),
598+
(ArmWidth::Word, ArmRegisterName::X12) => todo!(),
599+
(ArmWidth::Word, ArmRegisterName::X13) => todo!(),
600+
(ArmWidth::Word, ArmRegisterName::X14) => todo!(),
601+
(ArmWidth::Word, ArmRegisterName::X15) => todo!(),
602+
(ArmWidth::Word, ArmRegisterName::X16) => todo!(),
603+
(ArmWidth::Word, ArmRegisterName::X17) => todo!(),
604+
(ArmWidth::Word, ArmRegisterName::X18) => todo!(),
605+
(ArmWidth::Word, ArmRegisterName::X19) => todo!(),
606+
(ArmWidth::Word, ArmRegisterName::X20) => todo!(),
607+
(ArmWidth::Word, ArmRegisterName::X21) => todo!(),
608+
(ArmWidth::Word, ArmRegisterName::X22) => todo!(),
609+
(ArmWidth::Word, ArmRegisterName::X23) => todo!(),
610+
(ArmWidth::Word, ArmRegisterName::X24) => todo!(),
611+
(ArmWidth::Word, ArmRegisterName::X25) => todo!(),
612+
(ArmWidth::Word, ArmRegisterName::X26) => todo!(),
613+
(ArmWidth::Word, ArmRegisterName::X27) => todo!(),
614+
(ArmWidth::Word, ArmRegisterName::X28) => todo!(),
615+
(ArmWidth::Word, ArmRegisterName::X29) => todo!(),
616+
(ArmWidth::Double, ArmRegisterName::Zero) => todo!(),
617+
(ArmWidth::Double, ArmRegisterName::Pc) => todo!(),
618+
(ArmWidth::Double, ArmRegisterName::Sp) => todo!(),
619+
(ArmWidth::Double, ArmRegisterName::Lr) => todo!(),
620+
(ArmWidth::Double, ArmRegisterName::X0) => todo!(),
621+
(ArmWidth::Double, ArmRegisterName::X1) => todo!(),
622+
(ArmWidth::Double, ArmRegisterName::X2) => todo!(),
623+
(ArmWidth::Double, ArmRegisterName::X3) => todo!(),
624+
(ArmWidth::Double, ArmRegisterName::X4) => todo!(),
625+
(ArmWidth::Double, ArmRegisterName::X5) => todo!(),
626+
(ArmWidth::Double, ArmRegisterName::X6) => todo!(),
627+
(ArmWidth::Double, ArmRegisterName::X7) => todo!(),
628+
(ArmWidth::Double, ArmRegisterName::X8) => todo!(),
629+
(ArmWidth::Double, ArmRegisterName::X9) => todo!(),
630+
(ArmWidth::Double, ArmRegisterName::X10) => todo!(),
631+
(ArmWidth::Double, ArmRegisterName::X11) => todo!(),
632+
(ArmWidth::Double, ArmRegisterName::X12) => todo!(),
633+
(ArmWidth::Double, ArmRegisterName::X13) => todo!(),
634+
(ArmWidth::Double, ArmRegisterName::X14) => todo!(),
635+
(ArmWidth::Double, ArmRegisterName::X15) => todo!(),
636+
(ArmWidth::Double, ArmRegisterName::X16) => todo!(),
637+
(ArmWidth::Double, ArmRegisterName::X17) => todo!(),
638+
(ArmWidth::Double, ArmRegisterName::X18) => todo!(),
639+
(ArmWidth::Double, ArmRegisterName::X19) => todo!(),
640+
(ArmWidth::Double, ArmRegisterName::X20) => todo!(),
641+
(ArmWidth::Double, ArmRegisterName::X21) => todo!(),
642+
(ArmWidth::Double, ArmRegisterName::X22) => todo!(),
643+
(ArmWidth::Double, ArmRegisterName::X23) => todo!(),
644+
(ArmWidth::Double, ArmRegisterName::X24) => todo!(),
645+
(ArmWidth::Double, ArmRegisterName::X25) => todo!(),
646+
(ArmWidth::Double, ArmRegisterName::X26) => todo!(),
647+
(ArmWidth::Double, ArmRegisterName::X27) => todo!(),
648+
(ArmWidth::Double, ArmRegisterName::X28) => todo!(),
649+
(ArmWidth::Double, ArmRegisterName::X29) => todo!(),
650+
}
651+
// let s: String = self.into();
652+
// write!(f, "{}", s)
653+
}
654+
}
655+
656+
impl Display for ArmVal {
657+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
658+
match self {
659+
ArmVal::Reg(arm_register) => arm_register.fmt(f),
660+
ArmVal::Imm(x) => write!(f, "{}", x),
661+
ArmVal::RegOffset(arm_register, offset) => {
662+
write!(f, "[{}, {}]", arm_register, offset)
663+
},
664+
}
665+
}
666+
}

tests/test_translation.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,12 @@ mod tests {
116116
},
117117
];
118118

119-
println!("{:?}", translate_instrs(riscv_asm))
119+
let arm_instrs = translate_instrs(riscv_asm);
120+
println!("{:?}", arm_instrs);
120121
// assert_eq!(translated_asm, expected_output);
122+
for instr in arm_instrs {
123+
let x: String = instr.into();
124+
println!("{}", x);
125+
}
121126
}
122127
}

0 commit comments

Comments
 (0)