use crate::architecture::xtensa::arch::{CpuRegister, SpecialRegister};
pub mod format;
#[derive(Clone, Copy, PartialEq, Debug)]
#[allow(dead_code)]
pub enum Instruction {
Lddr32P(CpuRegister),
Sddr32P(CpuRegister),
L32I(CpuRegister, CpuRegister, u8),
S32I(CpuRegister, CpuRegister, u8),
Rsr(SpecialRegister, CpuRegister),
Wsr(SpecialRegister, CpuRegister),
Rfdo(u8),
CallX8(CpuRegister),
Break(u8, u8),
Rotw(u8),
Esync,
}
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum InstructionEncoding {
Narrow(u32),
}
impl Instruction {
const fn encode_bytes(self) -> (usize, u32) {
let word = match self {
Instruction::Lddr32P(src) => 0x0070E0 | ((src as u32 & 0x0F) << 8),
Instruction::Sddr32P(src) => 0x0070F0 | ((src as u32 & 0x0F) << 8),
Instruction::L32I(s, t, imm) => format::rri8(0x002002, s as u8, t as u8, imm),
Instruction::S32I(s, t, imm) => format::rri8(0x006002, s as u8, t as u8, imm),
Instruction::Rsr(sr, t) => format::rsr(0x030000, sr as u8, t as u8),
Instruction::Wsr(sr, t) => format::rsr(0x130000, sr as u8, t as u8),
Instruction::Break(s, t) => {
format::rrr(0x000000, 4, s, t)
}
Instruction::CallX8(s) => format::callx(2, s as u8),
Instruction::Rfdo(_) => 0xF1E000,
Instruction::Rotw(count) => {
format::rrr(0x400000, 8, 0, count)
}
Instruction::Esync => 0x002020,
};
(3, word)
}
pub const fn encode(self) -> InstructionEncoding {
let narrow = self.encode_bytes().1;
InstructionEncoding::Narrow(narrow)
}
}