1+ use std:: convert:: Into ;
12use 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+ }
0 commit comments