riscy_isa/opcode/
system_function.rs

1#[derive(Copy, Clone, Debug, PartialEq)]
2pub enum EnvironmentFunction {
3    ECALL,
4    EBREAK,
5
6    URET,
7    SRET,
8    MRET,
9}
10
11impl EnvironmentFunction {
12    pub fn from_imm11_0(imm11_0: u16) -> Self {
13        match imm11_0 {
14            0b000000000000 => EnvironmentFunction::ECALL,
15            0b000000000001 => EnvironmentFunction::EBREAK,
16
17            0b000000000010 => EnvironmentFunction::URET,
18            0b000100000010 => EnvironmentFunction::SRET,
19            0b001100000010 => EnvironmentFunction::MRET,
20
21            _ => unimplemented!("environment function {:#012b}", imm11_0),
22        }
23    }
24}
25
26#[derive(Copy, Clone, Debug, PartialEq)]
27pub enum CSRFunction {
28    CSRRW,
29    CSRRS,
30    CSRRC,
31    CSRRWI,
32    CSRRSI,
33    CSRRCI,
34}
35
36impl CSRFunction {
37    pub fn from_func3(func3: u8) -> Self {
38        match func3 {
39            0b001 => CSRFunction::CSRRW,
40            0b010 => CSRFunction::CSRRS,
41            0b011 => CSRFunction::CSRRC,
42            0b101 => CSRFunction::CSRRWI,
43            0b110 => CSRFunction::CSRRSI,
44            0b111 => CSRFunction::CSRRCI,
45
46            _ => unimplemented!("csr function {:#03b}", func3),
47        }
48    }
49}
50
51#[derive(Copy, Clone, Debug, PartialEq)]
52pub enum SystemFunction {
53    // base
54    Environment(EnvironmentFunction),
55
56    //Zicsr
57    CSR(CSRFunction),
58}
59
60impl SystemFunction {
61    pub fn from_func3_imm11_0(func3: u8, imm11_0: u16) -> Self {
62        match func3 {
63            0 => SystemFunction::Environment(EnvironmentFunction::from_imm11_0(imm11_0)),
64            0b001 | 0b010 | 0b011 | 0b101 | 0b110 | 0b111 => {
65                SystemFunction::CSR(CSRFunction::from_func3(func3))
66            }
67
68            _ => unimplemented!("system function {:#04x}", func3),
69        }
70    }
71}