use core::convert::From;
use core::{cmp, fmt, slice};
pub use capstone_sys::sh_insn as ShInsn;
pub use capstone_sys::sh_reg as ShReg;
use capstone_sys::{cs_sh, cs_sh_op, sh_op_mem, sh_op_mem_type, sh_op_type};
pub use crate::arch::arch_builder::sh::*;
use crate::arch::DetailsArchInsn;
use crate::instruction::{RegId, RegIdInt};
pub struct ShInsnDetail<'a>(pub(crate) &'a cs_sh);
impl_PartialEq_repr_fields!(ShInsnDetail<'a> [ 'a ];
operands
);
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum ShOperand {
Reg(RegId),
Imm(u64),
Mem(ShOpMem),
Invalid,
}
impl Default for ShOperand {
fn default() -> Self {
ShOperand::Invalid
}
}
impl From<&cs_sh_op> for ShOperand {
fn from(insn: &cs_sh_op) -> ShOperand {
match insn.type_ {
sh_op_type::SH_OP_REG => {
ShOperand::Reg(RegId(unsafe { insn.__bindgen_anon_1.reg } as RegIdInt))
}
sh_op_type::SH_OP_IMM => ShOperand::Imm(unsafe { insn.__bindgen_anon_1.imm }),
sh_op_type::SH_OP_MEM => ShOperand::Mem(ShOpMem(unsafe { insn.__bindgen_anon_1.mem })),
sh_op_type::SH_OP_INVALID => ShOperand::Invalid,
}
}
}
#[derive(Debug, Copy, Clone)]
pub struct ShOpMem(pub(crate) sh_op_mem);
impl ShOpMem {
pub fn reg(&self) -> RegId {
RegId(self.0.reg as RegIdInt)
}
fn disp(&self) -> u32 {
self.0.disp as u32
}
pub fn address(&self) -> ShOpMemType {
ShOpMemType::from_u32(self.0.address as u32).unwrap_or(ShOpMemType::Invalid)
}
}
define_cs_enum_wrapper_reverse!(
[
=> ShOpMemType = sh_op_mem_type,
]
=> Invalid = SH_OP_MEM_INVALID;
=> RegisterIndirect = SH_OP_MEM_REG_IND;
=> RegisterPost = SH_OP_MEM_REG_POST;
=> RegisterPre = SH_OP_MEM_REG_PRE;
=> Displacement = SH_OP_MEM_REG_DISP;
=> RegisterR0 = SH_OP_MEM_REG_R0;
=> GBRDisplacement = SH_OP_MEM_GBR_DISP;
=> GBRR0 = SH_OP_MEM_GBR_R0;
=> PCRelative = SH_OP_MEM_PCR;
=> TBRDisplacement = SH_OP_MEM_TBR_DISP;
);
impl_PartialEq_repr_fields!(ShOpMem;
address, reg, disp
);
impl cmp::Eq for ShOpMem {}
def_arch_details_struct!(
InsnDetail = ShInsnDetail;
Operand = ShOperand;
OperandIterator = ShOperandIterator;
OperandIteratorLife = ShOperandIterator<'a>;
[ pub struct ShOperandIterator<'a>(slice::Iter<'a, cs_sh_op>); ]
cs_arch_op = cs_sh_op;
cs_arch = cs_sh;
);