capstone_git/arch/
tricore.rs

1//! Contains tricore-specific types
2
3use 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
15/// Contains tricore-specific details for an instruction
16pub struct TriCoreInsnDetail<'a>(pub(crate) &'a cs_tricore);
17
18impl_PartialEq_repr_fields!(TriCoreInsnDetail<'a> [ 'a ];
19    operands
20);
21
22/// tricore operand
23#[derive(Clone, Debug, Eq, PartialEq)]
24pub enum TriCoreOperand {
25    /// Register
26    Reg(RegId),
27
28    /// Immediate
29    Imm(i32),
30
31    /// Memory
32    Mem(TriCoreOpMem),
33
34    /// Invalid
35    Invalid,
36}
37
38impl Default for TriCoreOperand {
39    fn default() -> Self {
40        TriCoreOperand::Invalid
41    }
42}
43
44/// tricore memory operand
45#[derive(Debug, Copy, Clone)]
46pub struct TriCoreOpMem(pub(crate) tricore_op_mem);
47
48impl TriCoreOpMem {
49    /// Base register
50    pub fn base(&self) -> RegId {
51        RegId(RegIdInt::from(self.0.base))
52    }
53
54    /// Disp value
55    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);