ab_riscv_primitives/instructions/rv32/zk/zkn/
zkne.rs1#[cfg(test)]
4mod tests;
5
6use crate::instructions::Instruction;
7use crate::instructions::rv32::zk::zkn::zknd::Rv32AesBs;
8use crate::registers::general_purpose::Register;
9use ab_riscv_macros::instruction;
10use core::fmt;
11
12#[instruction]
14#[derive(Debug, Clone, Copy)]
15#[derive_const(PartialEq, Eq)]
16pub enum Rv32ZkneInstruction<Reg> {
17 Aes32Esi {
22 rd: Reg,
23 rs1: Reg,
24 rs2: Reg,
25 bs: Rv32AesBs,
26 },
27 Aes32Esmi {
32 rd: Reg,
33 rs1: Reg,
34 rs2: Reg,
35 bs: Rv32AesBs,
36 },
37}
38
39#[instruction]
59const impl<Reg> Instruction for Rv32ZkneInstruction<Reg>
60where
61 Reg: [const] Register<Type = u32>,
62{
63 type Reg = Reg;
64
65 #[inline(always)]
66 #[cfg_attr(feature = "no-panic", no_panic_const::no_panic(const))]
67 fn try_decode(instruction: u32) -> Option<Self> {
68 let opcode = (instruction & 0b111_1111) as u8;
69 let rd_bits = ((instruction >> 7) & 0x1f) as u8;
70 let funct3 = ((instruction >> 12) & 0b111) as u8;
71 let rs1_bits = ((instruction >> 15) & 0x1f) as u8;
72 let rs2_bits = ((instruction >> 20) & 0x1f) as u8;
73 let funct5 = ((instruction >> 25) & 0b1_1111) as u8;
74 let bs_bits = ((instruction >> 30) & 0b11) as u8;
75
76 if opcode != 0b011_0011 {
78 None?;
79 }
80 if funct3 != 0b000 {
81 None?;
82 }
83
84 let rd = Reg::from_bits(rd_bits)?;
85 let rs1 = Reg::from_bits(rs1_bits)?;
86 let rs2 = Reg::from_bits(rs2_bits)?;
87 let bs = Rv32AesBs::from_bits(bs_bits)?;
88
89 match funct5 {
90 0b1_0001 => Some(Self::Aes32Esi { rd, rs1, rs2, bs }),
92 0b1_0011 => Some(Self::Aes32Esmi { rd, rs1, rs2, bs }),
94 _ => None,
95 }
96 }
97
98 #[inline(always)]
99 fn alignment() -> u8 {
100 align_of::<u32>() as u8
101 }
102
103 #[inline(always)]
104 fn size(&self) -> u8 {
105 size_of::<u32>() as u8
106 }
107}
108
109#[instruction]
110impl<Reg> fmt::Display for Rv32ZkneInstruction<Reg>
111where
112 Reg: fmt::Display,
113{
114 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
115 match self {
116 Self::Aes32Esi { rd, rs1, rs2, bs } => {
117 write!(f, "aes32esi {rd}, {rs1}, {rs2}, {bs}")
118 }
119 Self::Aes32Esmi { rd, rs1, rs2, bs } => {
120 write!(f, "aes32esmi {rd}, {rs1}, {rs2}, {bs}")
121 }
122 }
123 }
124}