riscv_decode/
types.rs

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); // add x12,x11,x12
162        assert_eq!(RType(0x40b50533).rs1(), 10); // sub x10,x10,x11
163        assert_eq!(RType(0x00209f33).rs1(), 1); // sll x30,x1,x2
164        assert_eq!(RType(0x0020af33).rs1(), 1); // slt x30,x1,x2
165        assert_eq!(RType(0x0020bf33).rs1(), 1); // sltu x30,x1,x2
166        assert_eq!(RType(0x00f647b3).rs1(), 12); // xor x15,x12,x15
167        assert_eq!(RType(0x0020d0b3).rs1(), 1); // srl x1,x1,x2
168        assert_eq!(RType(0x4020df33).rs1(), 1); // sra x30,x1,x2
169        assert_eq!(RType(0x00b7e5b3).rs1(), 15); // or x11,x15,x11
170        assert_eq!(RType(0x00d57533).rs1(), 10); // and x10,x10,x13
171
172        assert_eq!(RType(0x00c58633).rs2(), 12); // add x12,x11,x12
173        assert_eq!(RType(0x40b50533).rs2(), 11); // sub x10,x10,x11
174        assert_eq!(RType(0x00209f33).rs2(), 2); // sll x30,x1,x2
175        assert_eq!(RType(0x0020af33).rs2(), 2); // slt x30,x1,x2
176        assert_eq!(RType(0x0020bf33).rs2(), 2); // sltu x30,x1,x2
177        assert_eq!(RType(0x00f647b3).rs2(), 15); // xor x15,x12,x15
178        assert_eq!(RType(0x0020d0b3).rs2(), 2); // srl x1,x1,x2
179        assert_eq!(RType(0x4020df33).rs2(), 2); // sra x30,x1,x2
180        assert_eq!(RType(0x00b7e5b3).rs2(), 11); // or x11,x15,x11
181        assert_eq!(RType(0x00d57533).rs2(), 13); // and x10,x10,x13
182
183        assert_eq!(RType(0x00c58633).rd(), 12); // add x12,x11,x12
184        assert_eq!(RType(0x40b50533).rd(), 10); // sub x10,x10,x11
185        assert_eq!(RType(0x00209f33).rd(), 30); // sll x30,x1,x2
186        assert_eq!(RType(0x0020af33).rd(), 30); // slt x30,x1,x2
187        assert_eq!(RType(0x0020bf33).rd(), 30); // sltu x30,x1,x2
188        assert_eq!(RType(0x00f647b3).rd(), 15); // xor x15,x12,x15
189        assert_eq!(RType(0x0020d0b3).rd(), 1); // srl x1,x1,x2
190        assert_eq!(RType(0x4020df33).rd(), 30); // sra x30,x1,x2
191        assert_eq!(RType(0x00b7e5b3).rd(), 11); // or x11,x15,x11
192        assert_eq!(RType(0x00d57533).rd(), 10); // and x10,x10,x13
193    }
194
195    #[test]
196    fn csrtype() {
197        assert_eq!(CsrType(0x10569073).rs1(), 13); // csrrw x0,stvec,x13
198        assert_eq!(CsrType(0x18079073).rs1(), 15); // csrrw x0,satp,x15
199        assert_eq!(CsrType(0x10551073).rs1(), 10); // csrrw x0,stvec,x10
200        assert_eq!(CsrType(0x1007a073).rs1(), 15); // csrrs x0,sstatus,x15
201        assert_eq!(CsrType(0x1006a073).rs1(), 13); // csrrs x0,sstatus,x13
202        assert_eq!(CsrType(0x1004b073).rs1(), 9); // csrrc x0,sstatus,x9
203        assert_eq!(CsrType(0x100db073).rs1(), 27); // csrrc x0,sstatus,x27
204        assert_eq!(CsrType(0x1006b073).rs1(), 13); // csrrc x0,sstatus,x13
205
206        assert_eq!(CsrType(0x10569073).rd(), 0); // csrrw x0,stvec,x13
207        assert_eq!(CsrType(0x18079073).rd(), 0); // csrrw x0,satp,x15
208        assert_eq!(CsrType(0x10551073).rd(), 0); // csrrw x0,stvec,x10
209        assert_eq!(CsrType(0x1007a073).rd(), 0); // csrrs x0,sstatus,x15
210
211        assert_eq!(CsrType(0x10569073).csr(), 0x105); // csrrw x0,stvec,x13
212        assert_eq!(CsrType(0x18079073).csr(), 0x180); // csrrw x0,satp,x15
213        assert_eq!(CsrType(0x10551073).csr(), 0x105); // csrrw x0,stvec,x10
214        assert_eq!(CsrType(0x1007a073).csr(), 0x100); // csrrs x0,sstatus,x15
215    }
216
217    #[test]
218    fn csritype() {
219        assert_eq!(CsrIType(0x14005073).zimm(), 0); // csrrwi x0,sscratch,0
220        assert_eq!(CsrIType(0x10016073).zimm(), 2); // csrrsi x0,sstatus,2
221        assert_eq!(CsrIType(0x100176f3).zimm(), 2); // csrrci x13,sstatus,2
222        assert_eq!(CsrIType(0x10017773).zimm(), 2); // csrrci x14,sstatus,2
223
224        assert_eq!(CsrIType(0x14005073).rd(), 0); // csrrwi x0,sscratch,0
225        assert_eq!(CsrIType(0x10016073).rd(), 0); // csrrsi x0,sstatus,2
226        assert_eq!(CsrIType(0x100176f3).rd(), 13); // csrrci x13,sstatus,2
227        assert_eq!(CsrIType(0x10017773).rd(), 14); // csrrci x14,sstatus,2
228
229        assert_eq!(CsrIType(0x14005073).csr(), 0x140); // csrrwi x0,sscratch,0
230        assert_eq!(CsrIType(0x10016073).csr(), 0x100); // csrrsi x0,sstatus,2
231    }
232
233    #[test]
234    fn itype() {
235        assert_eq!(IType(0x02008283).rd(), 5); // lb x5,32(x1)
236        assert_eq!(IType(0x00708283).rd(), 5); // lb x5,7(x1)
237        assert_eq!(IType(0x00108f03).rd(), 30); // lb x30,1(x1)
238        assert_eq!(IType(0x00411f03).rd(), 30); // Lh x30,4(x2)
239        assert_eq!(IType(0x00611f03).rd(), 30); // Lh x30,6(x2)
240        assert_eq!(IType(0x00811f03).rd(), 30); // Lh x30,8(x2)
241        assert_eq!(IType(0x02052403).rd(), 8); // Lw x8,32(x10)
242        assert_eq!(IType(0x03452683).rd(), 13); // Lw x13,52(x10)
243        assert_eq!(IType(0x0006a703).rd(), 14); // Lw x14,0(x13)
244        assert_eq!(IType(0x0006c783).rd(), 15); // Lbu x15,0(x13)
245        assert_eq!(IType(0x0006c703).rd(), 14); // Lbu x14,0(x13)
246        assert_eq!(IType(0x0007c683).rd(), 13); // Lbu x13,0(x15)
247        assert_eq!(IType(0x0060df03).rd(), 30); // Lhu x30,6(x1)
248        assert_eq!(IType(0xffe0df03).rd(), 30); // Lhu x30,-2(x1)
249        assert_eq!(IType(0x0002d303).rd(), 6); // Lhu x6,0(x5)
250        assert_eq!(IType(0x00346303).rd(), 6); // Lwu x6,3(x8)
251        assert_eq!(IType(0x0080ef03).rd(), 30); // Lwu x30,8(x1)
252        assert_eq!(IType(0x0000ef03).rd(), 30); // Lwu x30,0(x1)
253        assert_eq!(IType(0x01853683).rd(), 13); // Ld x13,24(x10)
254        assert_eq!(IType(0x02013c03).rd(), 24); // Ld x24,32(x2)
255        assert_eq!(IType(0x0007b703).rd(), 14); // Ld x14,0(x15)
256
257        assert_eq!(IType(0x02008283).rs1(), 1); // lb x5,32(x1)
258        assert_eq!(IType(0x00708283).rs1(), 1); // lb x5,7(x1)
259        assert_eq!(IType(0x00108f03).rs1(), 1); // lb x30,1(x1)
260        assert_eq!(IType(0x00411f03).rs1(), 2); // Lh x30,4(x2)
261        assert_eq!(IType(0x00611f03).rs1(), 2); // Lh x30,6(x2)
262        assert_eq!(IType(0x00811f03).rs1(), 2); // Lh x30,8(x2)
263        assert_eq!(IType(0x02052403).rs1(), 10); // Lw x8,32(x10)
264        assert_eq!(IType(0x03452683).rs1(), 10); // Lw x13,52(x10)
265        assert_eq!(IType(0x0006a703).rs1(), 13); // Lw x14,0(x13)
266        assert_eq!(IType(0x0006c783).rs1(), 13); // Lbu x15,0(x13)
267        assert_eq!(IType(0x0006c703).rs1(), 13); // Lbu x14,0(x13)
268        assert_eq!(IType(0x0007c683).rs1(), 15); // Lbu x13,0(x15)
269        assert_eq!(IType(0x0060df03).rs1(), 1); // Lhu x30,6(x1)
270        assert_eq!(IType(0xffe0df03).rs1(), 1); // Lhu x30,-2(x1)
271        assert_eq!(IType(0x0002d303).rs1(), 5); // Lhu x6,0(x5)
272        assert_eq!(IType(0x00346303).rs1(), 8); // Lwu x6,3(x8)
273        assert_eq!(IType(0x0080ef03).rs1(), 1); // Lwu x30,8(x1)
274        assert_eq!(IType(0x0000ef03).rs1(), 1); // Lwu x30,0(x1)
275        assert_eq!(IType(0x01853683).rs1(), 10); // Ld x13,24(x10)
276        assert_eq!(IType(0x02013c03).rs1(), 2); // Ld x24,32(x2)
277        assert_eq!(IType(0x0007b703).rs1(), 15); // Ld x14,0(x15)
278
279        assert_eq!(IType(0x02008283).imm(), 32); // lb x5,32(x1)
280        assert_eq!(IType(0x00708283).imm(), 7); // lb x5,7(x1)
281        assert_eq!(IType(0x00108f03).imm(), 1); // lb x30,1(x1)
282        assert_eq!(IType(0x00411f03).imm(), 4); // Lh x30,4(x2)
283        assert_eq!(IType(0x00611f03).imm(), 6); // Lh x30,6(x2)
284        assert_eq!(IType(0x00811f03).imm(), 8); // Lh x30,8(x2)
285        assert_eq!(IType(0x02052403).imm(), 32); // Lw x8,32(x10)
286        assert_eq!(IType(0x03452683).imm(), 52); // Lw x13,52(x10)
287        assert_eq!(IType(0x0006a703).imm(), 0); // Lw x14,0(x13)
288        assert_eq!(IType(0x0006c783).imm(), 0); // Lbu x15,0(x13)
289        assert_eq!(IType(0x0006c703).imm(), 0); // Lbu x14,0(x13)
290        assert_eq!(IType(0x0007c683).imm(), 0); // Lbu x13,0(x15)
291        assert_eq!(IType(0x0060df03).imm(), 6); // Lhu x30,6(x1)
292        assert_eq!(IType(0xffe0df03).imm(), (-2i32) as u32 & 0xfff); // Lhu x30,-2(x1)
293        assert_eq!(IType(0x0002d303).imm(), 0); // Lhu x6,0(x5)
294        assert_eq!(IType(0x00346303).imm(), 3); // Lwu x6,3(x8)
295        assert_eq!(IType(0x0080ef03).imm(), 8); // Lwu x30,8(x1)
296        assert_eq!(IType(0x0000ef03).imm(), 0); // Lwu x30,0(x1)
297        assert_eq!(IType(0x01853683).imm(), 24); // Ld x13,24(x10)
298        assert_eq!(IType(0x02013c03).imm(), 32); // Ld x24,32(x2)
299        assert_eq!(IType(0x0007b703).imm(), 0); // Ld x14,0(x15)
300    }
301
302    #[test]
303    #[allow(overflowing_literals)]
304    fn btype() {
305        assert_eq!(BType(0x0420c063).imm(), 0x80002ea4 - 0x80002e64); // blt x1,x2,80002ea4
306        assert_eq!(BType(0x06f58063).imm(), 0x80002724 - 0x800026c4); // beq x11,x15,80002724
307        assert_eq!(BType(0x06f58063).imm(), 0x80002648 - 0x800025e8); // beq x11,x15,80002648
308        assert_eq!(BType(0x00050a63).imm(), 0x800024e8 - 0x800024d4); // beq x10,x0,800024e8
309        assert_eq!(BType(0x03ff0663).imm(), 0x80000040 - 0x80000014); // beq x30,x31,80000040
310        assert_eq!(
311            BType(0xfe069ae3).imm(),
312            (0x800026f0i32 - 0x800026fci32) as u32 & 0x1fff
313        ); // bne x13,x0,800026f0
314        assert_eq!(BType(0x00f5f463).imm(), 0x80002290 - 0x80002288); // bgeu x11,x15,80002290
315        assert_eq!(BType(0x1e301c63).imm(), 0x800003c4 - 0x800001cc); // bne x0,x3,800003c4
316        assert_eq!(BType(0x13df1063).imm(), 0x800030dc - 0x80002fbc); // bne x30,x29,800030dc
317        assert_eq!(BType(0x37df1263).imm(), 0x80002f90 - 0x80002c2c); // bne x30,x29,80002f90
318    }
319
320    #[test]
321    fn utype() {
322        assert_eq!(UType(0x00001a37).rd(), 20); // lui x20,0x1
323        assert_eq!(UType(0x800002b7).rd(), 5); // lui x5,0x80000
324        assert_eq!(UType(0x212120b7).rd(), 1); // lui x1,0x21212
325        assert_eq!(UType(0xffffe517).rd(), 10); // auipc x10,0xffffe
326        assert_eq!(UType(0xfffff797).rd(), 15); // auipc x15,0xfffff
327        assert_eq!(UType(0xfffff797).rd(), 15); // auipc x15,0xfffff
328
329        assert_eq!(UType(0x00001a37).rd(), 20); // lui x20,0x1
330        assert_eq!(UType(0x800002b7).rd(), 5); // lui x5,0x80000
331        assert_eq!(UType(0x212120b7).rd(), 1); // lui x1,0x21212
332        assert_eq!(UType(0xffffe517).rd(), 10); // auipc x10,0xffffe
333        assert_eq!(UType(0xfffff797).rd(), 15); // auipc x15,0xfffff
334        assert_eq!(UType(0xfffff797).rd(), 15); // auipc x15,0xfffff
335    }
336
337    #[test]
338    #[allow(overflowing_literals)]
339    fn jtype() {
340        assert_eq!(
341            JType(0xfe1ff06f).imm(),
342            (0x800029eci32 - 0x80002a0ci32) as u32 & 0x1fffff
343        ); // jal x0,800029ec
344        assert_eq!(JType(0x0000006f).imm(), 0x80002258 - 0x80002258); // jal x0,80002258
345        assert_eq!(
346            JType(0xf89ff06f).imm(),
347            (0x800027aci32 - 0x80002824i32) as u32 & 0x1fffff
348        ); // jal x0,800027ac
349        assert_eq!(JType(0x0240006f).imm(), 0x8000215c - 0x80002138); // jal x0,8000215c
350        assert_eq!(
351            JType(0xd89ff0ef).imm(),
352            (0x80002230i32 - 0x800024a8i32) as u32 & 0x1fffff
353        ); // jal x1,80002230
354        assert_eq!(JType(0x008007ef).imm(), 0x8000265c - 0x80002654); // jal x15,8000265c
355        assert_eq!(JType(0x0240006f).imm(), 0x80002154 - 0x80002130); // jal x0,80002154
356        assert_eq!(
357            JType(0xf71ff06f).imm(),
358            (0x80002750i32 - 0x800027e0i32) as u32 & 0x1fffff
359        ); // jal x0,80002750
360        assert_eq!(JType(0x00c0006f).imm(), 0x8000000c - 0x80000000); // jal x0,8000000c
361
362        assert_eq!(JType(0xfe1ff06f).rd(), 0); // jal x0,800029ec
363        assert_eq!(JType(0x0000006f).rd(), 0); // jal x0,80002258
364        assert_eq!(JType(0xf89ff06f).rd(), 0); // jal x0,800027ac
365        assert_eq!(JType(0x0240006f).rd(), 0); // jal x0,8000215c
366        assert_eq!(JType(0xd89ff0ef).rd(), 1); // jal x1,80002230
367        assert_eq!(JType(0x008007ef).rd(), 15); // jal x15,8000265c
368        assert_eq!(JType(0x0240006f).rd(), 0); // jal x0,80002154
369        assert_eq!(JType(0xf71ff06f).rd(), 0); // jal x0,80002750
370        assert_eq!(JType(0x00c0006f).rd(), 0); // jal x0,8000000c
371    }
372
373    #[test]
374    fn fencetype() {
375        assert_eq!(FenceType(0x0310000f).pred(), 0x3); // fence rw,w
376        assert_eq!(FenceType(0x0820000f).pred(), 0x8); // fence i,r
377        assert_eq!(FenceType(0x0ff0000f).pred(), 0xf); // fence iorw,iorw
378        assert_eq!(FenceType(0x0140000f).pred(), 0x1); // fence w,o
379
380        assert_eq!(FenceType(0x0310000f).succ(), 0x1); // fence rw,w
381        assert_eq!(FenceType(0x0820000f).succ(), 0x2); // fence i,r
382        assert_eq!(FenceType(0x0ff0000f).succ(), 0xf); // fence iorw,iorw
383        assert_eq!(FenceType(0x0140000f).succ(), 0x4); // fence w,o
384    }
385
386    #[test]
387    fn shifttype() {
388        assert_eq!(ShiftType(0x0057979b).shamt(), 0x5); // slliw x15,x15,0x5
389        assert_eq!(ShiftType(0x0057979b).shamt(), 0x5); // slliw x15,x15,0x5
390        assert_eq!(ShiftType(0x00e09f1b).shamt(), 0xe); // slliw x30,x1,0xe
391        assert_eq!(ShiftType(0x0017d61b).shamt(), 0x1); // srliw x12,x15,0x1
392        assert_eq!(ShiftType(0x01f0df1b).shamt(), 0x1f); // srliw x30,x1,0x1f
393        assert_eq!(ShiftType(0x0017d61b).shamt(), 0x1); // srliw x12,x15,0x1
394        assert_eq!(ShiftType(0x41f0df1b).shamt(), 0x1f); // sraiw x30,x1,0x1f
395        assert_eq!(ShiftType(0x4000df1b).shamt(), 0x0); // sraiw x30,x1,0x0
396        assert_eq!(ShiftType(0x4070d09b).shamt(), 0x7); // sraiw x1,x1,0x7
397
398        assert_eq!(ShiftType(0x0057979b).rs1(), 15); // slliw x15,x15,0x5
399        assert_eq!(ShiftType(0x0057979b).rs1(), 15); // slliw x15,x15,0x5
400        assert_eq!(ShiftType(0x00e09f1b).rs1(), 1); // slliw x30,x1,0xe
401        assert_eq!(ShiftType(0x0017d61b).rs1(), 15); // srliw x12,x15,0x1
402        assert_eq!(ShiftType(0x01f0df1b).rs1(), 1); // srliw x30,x1,0x1f
403        assert_eq!(ShiftType(0x0017d61b).rs1(), 15); // srliw x12,x15,0x1
404        assert_eq!(ShiftType(0x41f0df1b).rs1(), 1); // sraiw x30,x1,0x1f
405        assert_eq!(ShiftType(0x4000df1b).rs1(), 1); // sraiw x30,x1,0x0
406        assert_eq!(ShiftType(0x4070d09b).rs1(), 1); // sraiw x1,x1,0x7
407
408        assert_eq!(ShiftType(0x0057979b).rd(), 15); // slliw x15,x15,0x5
409        assert_eq!(ShiftType(0x0057979b).rd(), 15); // slliw x15,x15,0x5
410        assert_eq!(ShiftType(0x00e09f1b).rd(), 30); // slliw x30,x1,0xe
411        assert_eq!(ShiftType(0x0017d61b).rd(), 12); // srliw x12,x15,0x1
412        assert_eq!(ShiftType(0x01f0df1b).rd(), 30); // srliw x30,x1,0x1f
413        assert_eq!(ShiftType(0x0017d61b).rd(), 12); // srliw x12,x15,0x1
414        assert_eq!(ShiftType(0x41f0df1b).rd(), 30); // sraiw x30,x1,0x1f
415        assert_eq!(ShiftType(0x4000df1b).rd(), 30); // sraiw x30,x1,0x0
416        assert_eq!(ShiftType(0x4070d09b).rd(), 1); // sraiw x1,x1,0x7
417    }
418}