use core::convert::From;
use core::{cmp, fmt, slice};
pub use capstone_sys::sysz_insn_group as SysZInsnGroup;
pub use capstone_sys::sysz_insn as SysZInsn;
pub use capstone_sys::sysz_reg as SysZReg;
use capstone_sys::{cs_sysz, cs_sysz_op, sysz_op_mem, sysz_op_type};
pub use crate::arch::arch_builder::sysz::*;
use crate::arch::DetailsArchInsn;
use crate::instruction::{RegId, RegIdInt};
pub struct SysZInsnDetail<'a>(pub(crate) &'a cs_sysz);
impl_PartialEq_repr_fields!(SysZInsnDetail<'a> [ 'a ];
operands
);
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum SysZOperand {
Reg(RegId),
Imm(i64),
Mem(SysZOpMem),
AcReg(RegId),
Invalid,
}
impl Default for SysZOperand {
fn default() -> Self {
SysZOperand::Invalid
}
}
#[derive(Debug, Copy, Clone)]
pub struct SysZOpMem(pub(crate) sysz_op_mem);
impl SysZOpMem {
pub fn base(&self) -> u8 {
self.0.base
}
pub fn index(&self) -> u8 {
self.0.index
}
pub fn length(&self) -> u64 {
self.0.length
}
pub fn disp(&self) -> i64 {
self.0.disp
}
}
impl_PartialEq_repr_fields!(SysZOpMem;
base, index, length, disp
);
impl cmp::Eq for SysZOpMem {}
impl From<&cs_sysz_op> for SysZOperand {
fn from(insn: &cs_sysz_op) -> SysZOperand {
match insn.type_ {
sysz_op_type::SYSZ_OP_REG => {
SysZOperand::Reg(RegId(unsafe { insn.__bindgen_anon_1.reg } as RegIdInt))
},
sysz_op_type::SYSZ_OP_IMM => SysZOperand::Imm(unsafe { insn.__bindgen_anon_1.imm }),
sysz_op_type::SYSZ_OP_MEM => {
SysZOperand::Mem(SysZOpMem(unsafe { insn.__bindgen_anon_1.mem }))
},
sysz_op_type::SYSZ_OP_ACREG => {
SysZOperand::AcReg(RegId(unsafe { insn.__bindgen_anon_1.reg } as RegIdInt))
},
sysz_op_type::SYSZ_OP_INVALID => SysZOperand::Invalid,
}
}
}
def_arch_details_struct!(
InsnDetail = SysZInsnDetail;
Operand = SysZOperand;
OperandIterator = SysZOperandIterator;
OperandIteratorLife = SysZOperandIterator<'a>;
[ pub struct SysZOperandIterator<'a>(slice::Iter<'a, cs_sysz_op>); ]
cs_arch_op = cs_sysz_op;
cs_arch = cs_sysz;
);