riscy_isa/opcode/
op_32_function.rs

1#[derive(Copy, Clone, Debug, PartialEq)]
2pub enum Op32Function {
3    ADDW,
4    SUBW,
5    SLLW,
6    SRLW,
7    SRAW,
8
9    DIVW,
10    DIVUW,
11    MULW,
12    REMW,
13    REMUW,
14}
15
16impl Op32Function {
17    pub fn from_func3_func7(func3: u8, func7: u8) -> Self {
18        match (func7, func3) {
19            (0b0000000, 0b000) => Op32Function::ADDW,
20            (0b0100000, 0b000) => Op32Function::SUBW,
21            (0b0000000, 0b001) => Op32Function::SLLW,
22            (0b0000000, 0b101) => Op32Function::SRLW,
23            (0b0100000, 0b101) => Op32Function::SRAW,
24
25            (0b0000001, 0b000) => Op32Function::MULW,
26            (0b0000001, 0b100) => Op32Function::DIVW,
27            (0b0000001, 0b101) => Op32Function::DIVUW,
28            (0b0000001, 0b110) => Op32Function::REMW,
29            (0b0000001, 0b111) => Op32Function::REMUW,
30
31            _ => unimplemented!("OP-32 with func7={:#07b}, func3={:#03b}", func7, func3),
32        }
33    }
34
35    pub fn to_func3(&self) -> i32 {
36        match self {
37            Op32Function::ADDW => 0b000,
38            Op32Function::SUBW => 0b000,
39            Op32Function::SLLW => 0b001,
40            Op32Function::SRLW => 0b101,
41            Op32Function::SRAW => 0b101,
42
43            Op32Function::MULW => 0b000,
44            Op32Function::DIVW => 0b100,
45            Op32Function::DIVUW => 0b101,
46            Op32Function::REMW => 0b110,
47            Op32Function::REMUW => 0b111,
48        }
49    }
50
51    pub fn to_func7(&self) -> i32 {
52        match self {
53            Op32Function::ADDW => 0b0000000,
54            Op32Function::SUBW => 0b0100000,
55            Op32Function::SLLW => 0b0000000,
56            Op32Function::SRLW => 0b0000000,
57            Op32Function::SRAW => 0b0100000,
58
59            Op32Function::MULW => 0b0000001,
60            Op32Function::DIVW => 0b0000001,
61            Op32Function::DIVUW => 0b0000001,
62            Op32Function::REMW => 0b0000001,
63            Op32Function::REMUW => 0b0000001,
64        }
65    }
66}