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