capstone_git/arch/
tricore.rs1use core::convert::From;
4use core::{cmp, fmt, slice};
5
6pub use capstone_sys::tricore_insn as TriCoreInsn;
7pub use capstone_sys::tricore_insn_group as TriCoreInsnGroup;
8pub use capstone_sys::tricore_reg as TriCoreReg;
9use capstone_sys::{cs_tricore, cs_tricore_op, tricore_op_mem, tricore_op_type};
10
11pub use crate::arch::arch_builder::tricore::*;
12use crate::arch::DetailsArchInsn;
13use crate::instruction::{RegId, RegIdInt};
14
15pub struct TriCoreInsnDetail<'a>(pub(crate) &'a cs_tricore);
17
18impl_PartialEq_repr_fields!(TriCoreInsnDetail<'a> [ 'a ];
19 operands
20);
21
22#[derive(Clone, Debug, Eq, PartialEq)]
24pub enum TriCoreOperand {
25 Reg(RegId),
27
28 Imm(i32),
30
31 Mem(TriCoreOpMem),
33
34 Invalid,
36}
37
38impl Default for TriCoreOperand {
39 fn default() -> Self {
40 TriCoreOperand::Invalid
41 }
42}
43
44#[derive(Debug, Copy, Clone)]
46pub struct TriCoreOpMem(pub(crate) tricore_op_mem);
47
48impl TriCoreOpMem {
49 pub fn base(&self) -> RegId {
51 RegId(RegIdInt::from(self.0.base))
52 }
53
54 pub fn disp(&self) -> i32 {
56 self.0.disp
57 }
58}
59
60impl_PartialEq_repr_fields!(TriCoreOpMem;
61 base, disp
62);
63
64impl cmp::Eq for TriCoreOpMem {}
65
66impl From<&cs_tricore_op> for TriCoreOperand {
67 fn from(insn: &cs_tricore_op) -> TriCoreOperand {
68 match insn.type_ {
69 tricore_op_type::TRICORE_OP_REG => {
70 TriCoreOperand::Reg(RegId(unsafe { insn.__bindgen_anon_1.reg } as RegIdInt))
71 }
72 tricore_op_type::TRICORE_OP_IMM => {
73 TriCoreOperand::Imm(unsafe { insn.__bindgen_anon_1.imm })
74 }
75 tricore_op_type::TRICORE_OP_MEM => {
76 TriCoreOperand::Mem(TriCoreOpMem(unsafe { insn.__bindgen_anon_1.mem }))
77 }
78 tricore_op_type::TRICORE_OP_INVALID => TriCoreOperand::Invalid,
79 }
80 }
81}
82
83def_arch_details_struct!(
84 InsnDetail = TriCoreInsnDetail;
85 Operand = TriCoreOperand;
86 OperandIterator = TriCoreOperandIterator;
87 OperandIteratorLife = TriCoreOperandIterator<'a>;
88 [ pub struct TriCoreOperandIterator<'a>(slice::Iter<'a, cs_tricore_op>); ]
89 cs_arch_op = cs_tricore_op;
90 cs_arch = cs_tricore;
91);