riscy_isa/opcode/
system_function.rs1#[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 Environment(EnvironmentFunction),
55
56 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}