1#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
2pub struct RType(pub u32);
3impl RType {
4 pub fn rs2(&self) -> u32 {
5 (self.0 >> 20) & 0x1f
6 }
7 pub fn rs1(&self) -> u32 {
8 (self.0 >> 15) & 0x1f
9 }
10 pub fn rd(&self) -> u32 {
11 (self.0 >> 7) & 0x1f
12 }
13}
14
15#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
16pub struct CsrType(pub u32);
17impl CsrType {
18 pub fn csr(&self) -> u32 {
19 self.0 >> 20
20 }
21 pub fn rs1(&self) -> u32 {
22 (self.0 >> 15) & 0x1f
23 }
24 pub fn rd(&self) -> u32 {
25 (self.0 >> 7) & 0x1f
26 }
27}
28
29#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
30pub struct CsrIType(pub u32);
31impl CsrIType {
32 pub fn csr(&self) -> u32 {
33 self.0 >> 20
34 }
35 pub fn zimm(&self) -> u32 {
36 (self.0 >> 15) & 0x1f
37 }
38 pub fn rd(&self) -> u32 {
39 (self.0 >> 7) & 0x1f
40 }
41}
42
43#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
44pub struct IType(pub u32);
45impl IType {
46 pub fn imm(&self) -> u32 {
47 self.0 >> 20
48 }
49 pub fn rs1(&self) -> u32 {
50 (self.0 >> 15) & 0x1f
51 }
52 pub fn rd(&self) -> u32 {
53 (self.0 >> 7) & 0x1f
54 }
55}
56
57#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
58pub struct SType(pub u32);
59impl SType {
60 pub fn imm(&self) -> u32 {
61 ((self.0 >> 20) & 0xfe0) | ((self.0 >> 7) & 0x1f)
62 }
63 pub fn rs1(&self) -> u32 {
64 (self.0 >> 15) & 0x1f
65 }
66 pub fn rs2(&self) -> u32 {
67 (self.0 >> 20) & 0x1f
68 }
69}
70
71#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
72pub struct BType(pub u32);
73impl BType {
74 pub fn imm(&self) -> u32 {
75 ((self.0 & 0x8000_0000) >> 19)
76 | ((self.0 & 0x7e00_0000) >> 20)
77 | ((self.0 & 0x0000_0f00) >> 7)
78 | ((self.0 & 0x0000_0080) << 4)
79 }
80 pub fn rs1(&self) -> u32 {
81 (self.0 >> 15) & 0x1f
82 }
83 pub fn rs2(&self) -> u32 {
84 (self.0 >> 20) & 0x1f
85 }
86}
87
88#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
89pub struct UType(pub u32);
90impl UType {
91 pub fn imm(&self) -> u32 {
92 self.0 & 0xfffff000
93 }
94 pub fn rd(&self) -> u32 {
95 (self.0 >> 7) & 0x1f
96 }
97}
98
99#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
100pub struct JType(pub u32);
101impl JType {
102 pub fn imm(&self) -> u32 {
103 ((self.0 & 0x8000_0000) >> 11)
104 | ((self.0 & 0x7fe0_0000) >> 20)
105 | ((self.0 & 0x0010_0000) >> 9)
106 | (self.0 & 0x000f_f000)
107 }
108 pub fn rd(&self) -> u32 {
109 (self.0 >> 7) & 0x1f
110 }
111}
112
113#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
114pub struct FenceType(pub u32);
115impl FenceType {
116 pub fn pred(&self) -> u32 {
117 (self.0 >> 24) & 0xf
118 }
119 pub fn succ(&self) -> u32 {
120 (self.0 >> 20) & 0xf
121 }
122}
123
124#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
125pub struct ShiftType(pub u32);
126impl ShiftType {
127 pub fn shamt(&self) -> u32 {
128 (self.0 >> 20) & 0x3f
129 }
130 pub fn rs1(&self) -> u32 {
131 (self.0 >> 15) & 0x1f
132 }
133 pub fn rd(&self) -> u32 {
134 (self.0 >> 7) & 0x1f
135 }
136}
137
138#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
139pub struct R4Type(pub u32);
140impl R4Type {
141 pub fn rs3(&self) -> u32 {
142 (self.0 >> 27) & 0x1f
143 }
144 pub fn rs2(&self) -> u32 {
145 (self.0 >> 20) & 0x1f
146 }
147 pub fn rs1(&self) -> u32 {
148 (self.0 >> 15) & 0x1f
149 }
150 pub fn rd(&self) -> u32 {
151 (self.0 >> 7) & 0x1f
152 }
153}
154
155#[cfg(test)]
156mod tests {
157 use super::*;
158
159 #[test]
160 fn rtype() {
161 assert_eq!(RType(0x00c58633).rs1(), 11); assert_eq!(RType(0x40b50533).rs1(), 10); assert_eq!(RType(0x00209f33).rs1(), 1); assert_eq!(RType(0x0020af33).rs1(), 1); assert_eq!(RType(0x0020bf33).rs1(), 1); assert_eq!(RType(0x00f647b3).rs1(), 12); assert_eq!(RType(0x0020d0b3).rs1(), 1); assert_eq!(RType(0x4020df33).rs1(), 1); assert_eq!(RType(0x00b7e5b3).rs1(), 15); assert_eq!(RType(0x00d57533).rs1(), 10); assert_eq!(RType(0x00c58633).rs2(), 12); assert_eq!(RType(0x40b50533).rs2(), 11); assert_eq!(RType(0x00209f33).rs2(), 2); assert_eq!(RType(0x0020af33).rs2(), 2); assert_eq!(RType(0x0020bf33).rs2(), 2); assert_eq!(RType(0x00f647b3).rs2(), 15); assert_eq!(RType(0x0020d0b3).rs2(), 2); assert_eq!(RType(0x4020df33).rs2(), 2); assert_eq!(RType(0x00b7e5b3).rs2(), 11); assert_eq!(RType(0x00d57533).rs2(), 13); assert_eq!(RType(0x00c58633).rd(), 12); assert_eq!(RType(0x40b50533).rd(), 10); assert_eq!(RType(0x00209f33).rd(), 30); assert_eq!(RType(0x0020af33).rd(), 30); assert_eq!(RType(0x0020bf33).rd(), 30); assert_eq!(RType(0x00f647b3).rd(), 15); assert_eq!(RType(0x0020d0b3).rd(), 1); assert_eq!(RType(0x4020df33).rd(), 30); assert_eq!(RType(0x00b7e5b3).rd(), 11); assert_eq!(RType(0x00d57533).rd(), 10); }
194
195 #[test]
196 fn csrtype() {
197 assert_eq!(CsrType(0x10569073).rs1(), 13); assert_eq!(CsrType(0x18079073).rs1(), 15); assert_eq!(CsrType(0x10551073).rs1(), 10); assert_eq!(CsrType(0x1007a073).rs1(), 15); assert_eq!(CsrType(0x1006a073).rs1(), 13); assert_eq!(CsrType(0x1004b073).rs1(), 9); assert_eq!(CsrType(0x100db073).rs1(), 27); assert_eq!(CsrType(0x1006b073).rs1(), 13); assert_eq!(CsrType(0x10569073).rd(), 0); assert_eq!(CsrType(0x18079073).rd(), 0); assert_eq!(CsrType(0x10551073).rd(), 0); assert_eq!(CsrType(0x1007a073).rd(), 0); assert_eq!(CsrType(0x10569073).csr(), 0x105); assert_eq!(CsrType(0x18079073).csr(), 0x180); assert_eq!(CsrType(0x10551073).csr(), 0x105); assert_eq!(CsrType(0x1007a073).csr(), 0x100); }
216
217 #[test]
218 fn csritype() {
219 assert_eq!(CsrIType(0x14005073).zimm(), 0); assert_eq!(CsrIType(0x10016073).zimm(), 2); assert_eq!(CsrIType(0x100176f3).zimm(), 2); assert_eq!(CsrIType(0x10017773).zimm(), 2); assert_eq!(CsrIType(0x14005073).rd(), 0); assert_eq!(CsrIType(0x10016073).rd(), 0); assert_eq!(CsrIType(0x100176f3).rd(), 13); assert_eq!(CsrIType(0x10017773).rd(), 14); assert_eq!(CsrIType(0x14005073).csr(), 0x140); assert_eq!(CsrIType(0x10016073).csr(), 0x100); }
232
233 #[test]
234 fn itype() {
235 assert_eq!(IType(0x02008283).rd(), 5); assert_eq!(IType(0x00708283).rd(), 5); assert_eq!(IType(0x00108f03).rd(), 30); assert_eq!(IType(0x00411f03).rd(), 30); assert_eq!(IType(0x00611f03).rd(), 30); assert_eq!(IType(0x00811f03).rd(), 30); assert_eq!(IType(0x02052403).rd(), 8); assert_eq!(IType(0x03452683).rd(), 13); assert_eq!(IType(0x0006a703).rd(), 14); assert_eq!(IType(0x0006c783).rd(), 15); assert_eq!(IType(0x0006c703).rd(), 14); assert_eq!(IType(0x0007c683).rd(), 13); assert_eq!(IType(0x0060df03).rd(), 30); assert_eq!(IType(0xffe0df03).rd(), 30); assert_eq!(IType(0x0002d303).rd(), 6); assert_eq!(IType(0x00346303).rd(), 6); assert_eq!(IType(0x0080ef03).rd(), 30); assert_eq!(IType(0x0000ef03).rd(), 30); assert_eq!(IType(0x01853683).rd(), 13); assert_eq!(IType(0x02013c03).rd(), 24); assert_eq!(IType(0x0007b703).rd(), 14); assert_eq!(IType(0x02008283).rs1(), 1); assert_eq!(IType(0x00708283).rs1(), 1); assert_eq!(IType(0x00108f03).rs1(), 1); assert_eq!(IType(0x00411f03).rs1(), 2); assert_eq!(IType(0x00611f03).rs1(), 2); assert_eq!(IType(0x00811f03).rs1(), 2); assert_eq!(IType(0x02052403).rs1(), 10); assert_eq!(IType(0x03452683).rs1(), 10); assert_eq!(IType(0x0006a703).rs1(), 13); assert_eq!(IType(0x0006c783).rs1(), 13); assert_eq!(IType(0x0006c703).rs1(), 13); assert_eq!(IType(0x0007c683).rs1(), 15); assert_eq!(IType(0x0060df03).rs1(), 1); assert_eq!(IType(0xffe0df03).rs1(), 1); assert_eq!(IType(0x0002d303).rs1(), 5); assert_eq!(IType(0x00346303).rs1(), 8); assert_eq!(IType(0x0080ef03).rs1(), 1); assert_eq!(IType(0x0000ef03).rs1(), 1); assert_eq!(IType(0x01853683).rs1(), 10); assert_eq!(IType(0x02013c03).rs1(), 2); assert_eq!(IType(0x0007b703).rs1(), 15); assert_eq!(IType(0x02008283).imm(), 32); assert_eq!(IType(0x00708283).imm(), 7); assert_eq!(IType(0x00108f03).imm(), 1); assert_eq!(IType(0x00411f03).imm(), 4); assert_eq!(IType(0x00611f03).imm(), 6); assert_eq!(IType(0x00811f03).imm(), 8); assert_eq!(IType(0x02052403).imm(), 32); assert_eq!(IType(0x03452683).imm(), 52); assert_eq!(IType(0x0006a703).imm(), 0); assert_eq!(IType(0x0006c783).imm(), 0); assert_eq!(IType(0x0006c703).imm(), 0); assert_eq!(IType(0x0007c683).imm(), 0); assert_eq!(IType(0x0060df03).imm(), 6); assert_eq!(IType(0xffe0df03).imm(), (-2i32) as u32 & 0xfff); assert_eq!(IType(0x0002d303).imm(), 0); assert_eq!(IType(0x00346303).imm(), 3); assert_eq!(IType(0x0080ef03).imm(), 8); assert_eq!(IType(0x0000ef03).imm(), 0); assert_eq!(IType(0x01853683).imm(), 24); assert_eq!(IType(0x02013c03).imm(), 32); assert_eq!(IType(0x0007b703).imm(), 0); }
301
302 #[test]
303 #[allow(overflowing_literals)]
304 fn btype() {
305 assert_eq!(BType(0x0420c063).imm(), 0x80002ea4 - 0x80002e64); assert_eq!(BType(0x06f58063).imm(), 0x80002724 - 0x800026c4); assert_eq!(BType(0x06f58063).imm(), 0x80002648 - 0x800025e8); assert_eq!(BType(0x00050a63).imm(), 0x800024e8 - 0x800024d4); assert_eq!(BType(0x03ff0663).imm(), 0x80000040 - 0x80000014); assert_eq!(
311 BType(0xfe069ae3).imm(),
312 (0x800026f0i32 - 0x800026fci32) as u32 & 0x1fff
313 ); assert_eq!(BType(0x00f5f463).imm(), 0x80002290 - 0x80002288); assert_eq!(BType(0x1e301c63).imm(), 0x800003c4 - 0x800001cc); assert_eq!(BType(0x13df1063).imm(), 0x800030dc - 0x80002fbc); assert_eq!(BType(0x37df1263).imm(), 0x80002f90 - 0x80002c2c); }
319
320 #[test]
321 fn utype() {
322 assert_eq!(UType(0x00001a37).rd(), 20); assert_eq!(UType(0x800002b7).rd(), 5); assert_eq!(UType(0x212120b7).rd(), 1); assert_eq!(UType(0xffffe517).rd(), 10); assert_eq!(UType(0xfffff797).rd(), 15); assert_eq!(UType(0xfffff797).rd(), 15); assert_eq!(UType(0x00001a37).rd(), 20); assert_eq!(UType(0x800002b7).rd(), 5); assert_eq!(UType(0x212120b7).rd(), 1); assert_eq!(UType(0xffffe517).rd(), 10); assert_eq!(UType(0xfffff797).rd(), 15); assert_eq!(UType(0xfffff797).rd(), 15); }
336
337 #[test]
338 #[allow(overflowing_literals)]
339 fn jtype() {
340 assert_eq!(
341 JType(0xfe1ff06f).imm(),
342 (0x800029eci32 - 0x80002a0ci32) as u32 & 0x1fffff
343 ); assert_eq!(JType(0x0000006f).imm(), 0x80002258 - 0x80002258); assert_eq!(
346 JType(0xf89ff06f).imm(),
347 (0x800027aci32 - 0x80002824i32) as u32 & 0x1fffff
348 ); assert_eq!(JType(0x0240006f).imm(), 0x8000215c - 0x80002138); assert_eq!(
351 JType(0xd89ff0ef).imm(),
352 (0x80002230i32 - 0x800024a8i32) as u32 & 0x1fffff
353 ); assert_eq!(JType(0x008007ef).imm(), 0x8000265c - 0x80002654); assert_eq!(JType(0x0240006f).imm(), 0x80002154 - 0x80002130); assert_eq!(
357 JType(0xf71ff06f).imm(),
358 (0x80002750i32 - 0x800027e0i32) as u32 & 0x1fffff
359 ); assert_eq!(JType(0x00c0006f).imm(), 0x8000000c - 0x80000000); assert_eq!(JType(0xfe1ff06f).rd(), 0); assert_eq!(JType(0x0000006f).rd(), 0); assert_eq!(JType(0xf89ff06f).rd(), 0); assert_eq!(JType(0x0240006f).rd(), 0); assert_eq!(JType(0xd89ff0ef).rd(), 1); assert_eq!(JType(0x008007ef).rd(), 15); assert_eq!(JType(0x0240006f).rd(), 0); assert_eq!(JType(0xf71ff06f).rd(), 0); assert_eq!(JType(0x00c0006f).rd(), 0); }
372
373 #[test]
374 fn fencetype() {
375 assert_eq!(FenceType(0x0310000f).pred(), 0x3); assert_eq!(FenceType(0x0820000f).pred(), 0x8); assert_eq!(FenceType(0x0ff0000f).pred(), 0xf); assert_eq!(FenceType(0x0140000f).pred(), 0x1); assert_eq!(FenceType(0x0310000f).succ(), 0x1); assert_eq!(FenceType(0x0820000f).succ(), 0x2); assert_eq!(FenceType(0x0ff0000f).succ(), 0xf); assert_eq!(FenceType(0x0140000f).succ(), 0x4); }
385
386 #[test]
387 fn shifttype() {
388 assert_eq!(ShiftType(0x0057979b).shamt(), 0x5); assert_eq!(ShiftType(0x0057979b).shamt(), 0x5); assert_eq!(ShiftType(0x00e09f1b).shamt(), 0xe); assert_eq!(ShiftType(0x0017d61b).shamt(), 0x1); assert_eq!(ShiftType(0x01f0df1b).shamt(), 0x1f); assert_eq!(ShiftType(0x0017d61b).shamt(), 0x1); assert_eq!(ShiftType(0x41f0df1b).shamt(), 0x1f); assert_eq!(ShiftType(0x4000df1b).shamt(), 0x0); assert_eq!(ShiftType(0x4070d09b).shamt(), 0x7); assert_eq!(ShiftType(0x0057979b).rs1(), 15); assert_eq!(ShiftType(0x0057979b).rs1(), 15); assert_eq!(ShiftType(0x00e09f1b).rs1(), 1); assert_eq!(ShiftType(0x0017d61b).rs1(), 15); assert_eq!(ShiftType(0x01f0df1b).rs1(), 1); assert_eq!(ShiftType(0x0017d61b).rs1(), 15); assert_eq!(ShiftType(0x41f0df1b).rs1(), 1); assert_eq!(ShiftType(0x4000df1b).rs1(), 1); assert_eq!(ShiftType(0x4070d09b).rs1(), 1); assert_eq!(ShiftType(0x0057979b).rd(), 15); assert_eq!(ShiftType(0x0057979b).rd(), 15); assert_eq!(ShiftType(0x00e09f1b).rd(), 30); assert_eq!(ShiftType(0x0017d61b).rd(), 12); assert_eq!(ShiftType(0x01f0df1b).rd(), 30); assert_eq!(ShiftType(0x0017d61b).rd(), 12); assert_eq!(ShiftType(0x41f0df1b).rd(), 30); assert_eq!(ShiftType(0x4000df1b).rd(), 30); assert_eq!(ShiftType(0x4070d09b).rd(), 1); }
418}