riscy_isa/opcode/
op_32_function.rs1#[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}