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 const ALIGNMENT: u8 = align_of::<u32>() as u8;
64
65 type Reg = Reg;
66
67 #[inline(always)]
68 #[cfg_attr(feature = "no-panic", no_panic_const::no_panic(const))]
69 fn try_decode(instruction: u32) -> Option<Self> {
70 let opcode = (instruction & 0b111_1111) as u8;
71 let rd_bits = ((instruction >> 7) & 0x1f) as u8;
72 let funct3 = ((instruction >> 12) & 0b111) as u8;
73 let rs1_bits = ((instruction >> 15) & 0x1f) as u8;
74 let rs2_bits = ((instruction >> 20) & 0x1f) as u8;
75 let funct5 = ((instruction >> 25) & 0b1_1111) as u8;
76 let bs_bits = ((instruction >> 30) & 0b11) as u8;
77
78 if opcode != 0b011_0011 {
80 None?;
81 }
82 if funct3 != 0b000 {
83 None?;
84 }
85
86 let rd = Reg::from_bits(rd_bits)?;
87 let rs1 = Reg::from_bits(rs1_bits)?;
88 let rs2 = Reg::from_bits(rs2_bits)?;
89 let bs = Rv32AesBs::from_bits(bs_bits)?;
90
91 match funct5 {
92 0b1_0001 => Some(Self::Aes32Esi { rd, rs1, rs2, bs }),
94 0b1_0011 => Some(Self::Aes32Esmi { rd, rs1, rs2, bs }),
96 _ => None,
97 }
98 }
99
100 #[inline(always)]
101 fn size(&self) -> u8 {
102 size_of::<u32>() as u8
103 }
104}
105
106#[instruction]
107impl<Reg> fmt::Display for Rv32ZkneInstruction<Reg>
108where
109 Reg: fmt::Display,
110{
111 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
112 match self {
113 Self::Aes32Esi { rd, rs1, rs2, bs } => {
114 write!(f, "aes32esi {rd}, {rs1}, {rs2}, {bs}")
115 }
116 Self::Aes32Esmi { rd, rs1, rs2, bs } => {
117 write!(f, "aes32esmi {rd}, {rs1}, {rs2}, {bs}")
118 }
119 }
120 }
121}