]> Witch of Git - jade-rose/blob - toolchain/src/inst.rs
Add decoding with proptest round-trip test
[jade-rose] / toolchain / src / inst.rs
1 pub mod decode;
2 pub mod encode;
3 pub mod parse;
4 #[cfg(test)]
5 pub mod test;
6
7 #[cfg(test)]
8 use proptest_derive::Arbitrary;
9
10 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
11 #[cfg_attr(test, derive(Arbitrary))]
12 #[repr(u8)]
13 pub enum Op1 {
14 Zero,
15 Lsl1,
16 Lsr1,
17 Asr1,
18 Incr,
19 Decr,
20 Comp,
21 Negt,
22 }
23
24 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
25 #[cfg_attr(test, derive(Arbitrary))]
26 #[repr(u8)]
27 pub enum OpR {
28 Add,
29 Sub,
30 And,
31 Ior,
32 Xor,
33 Lsl,
34 Lsr,
35 Asr,
36 }
37
38 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
39 #[cfg_attr(test, derive(Arbitrary))]
40 #[repr(u8)]
41 pub enum OpI3 {
42 Rol,
43 Lsl,
44 Lsr,
45 Asr,
46 Clr,
47 Set,
48 Tog,
49 Ext,
50 }
51
52 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
53 #[cfg_attr(test, derive(Arbitrary))]
54 #[repr(u8)]
55 pub enum Data {
56 D1,
57 D2,
58 }
59
60 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
61 #[cfg_attr(test, derive(Arbitrary))]
62 pub enum Special {
63 Data(Data),
64 Code,
65 }
66
67 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
68 #[cfg_attr(test, derive(Arbitrary))]
69 pub struct Reg(U3);
70 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
71 #[cfg_attr(test, derive(Arbitrary))]
72 pub struct U3(#[cfg_attr(test, proptest(strategy = "0..=7u8"))] u8);
73 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
74 #[cfg_attr(test, derive(Arbitrary))]
75 pub struct AddImm(#[cfg_attr(test, proptest(strategy = "-64..=127i8"))] i8);
76
77 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
78 #[cfg_attr(test, derive(Arbitrary))]
79 pub enum AluI {
80 And(u8),
81 Ior(u8),
82 Xor(u8),
83 Add(AddImm),
84 Compact(OpI3, U3),
85 }
86
87 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
88 #[cfg_attr(test, derive(Arbitrary))]
89 pub enum Target {
90 Abs,
91 Off,
92 OffImm(i8),
93 }
94
95 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
96 #[cfg_attr(test, derive(Arbitrary))]
97 #[cfg_attr(test, proptest(no_params))]
98 pub enum Inst {
99 Trap,
100 Jump(Target),
101 Call(Target),
102 Swap(Reg),
103 GetR(Reg),
104 SetR(Reg),
105 Get(Special),
106 Set(Special),
107 Alu1(Op1),
108 IsLt(Reg),
109 AluR(OpR, Reg),
110 LdD(Data, Reg, bool),
111 StD(Data, Reg, bool),
112 AluI(AluI),
113 BEzI(i8),
114 }
115
116 impl Reg {
117 pub fn new(x: u8) -> Option<Reg> {
118 U3::new(x).map(Reg)
119 }
120 }
121
122 impl U3 {
123 pub fn new(x: u8) -> Option<U3> {
124 match x {
125 0..=7 => Some(U3(x)),
126 _ => None,
127 }
128 }
129 }
130
131 impl AddImm {
132 pub fn new(x: i8) -> Option<AddImm> {
133 match x {
134 -64..=127 => Some(AddImm(x)),
135 _ => None,
136 }
137 }
138 }