capstone_git/arch/
sparc.rs1use core::convert::From;
4use core::{cmp, fmt, slice};
5
6pub use capstone_sys::sparc_insn_group as SparcInsnGroup;
8pub use capstone_sys::sparc_insn as SparcInsn;
9pub use capstone_sys::sparc_reg as SparcReg;
10pub use capstone_sys::sparc_cc as SparcCC;
11pub use capstone_sys::sparc_hint as SparcHint;
12use capstone_sys::{cs_sparc, cs_sparc_op, sparc_op_mem, sparc_op_type};
13
14pub use crate::arch::arch_builder::sparc::*;
15use crate::arch::DetailsArchInsn;
16use crate::instruction::{RegId, RegIdInt};
17
18
19pub struct SparcInsnDetail<'a>(pub(crate) &'a cs_sparc);
21
22#[derive(Clone, Debug, Eq, PartialEq)]
24pub enum SparcOperand {
25 Reg(RegId),
27
28 Imm(i64),
30
31 Mem(SparcOpMem),
33
34 Invalid,
36}
37
38impl SparcInsnDetail<'_> {
39 pub fn cc(&self) -> SparcCC {
41 self.0.cc
42 }
43
44 pub fn hint(&self) -> SparcHint {
46 self.0.hint
47 }
48}
49
50impl_PartialEq_repr_fields!(SparcInsnDetail<'a> [ 'a ];
51 cc, hint, operands
52);
53
54impl Default for SparcOperand {
55 fn default() -> Self {
56 SparcOperand::Invalid
57 }
58}
59
60#[derive(Debug, Copy, Clone)]
62pub struct SparcOpMem(pub(crate) sparc_op_mem);
63
64impl SparcOpMem {
65 pub fn base(&self) -> RegId {
67 RegId(RegIdInt::from(self.0.base))
68 }
69
70 pub fn index(&self) -> RegId {
72 RegId(RegIdInt::from(self.0.index))
73 }
74
75 pub fn disp(&self) -> i32 {
77 self.0.disp
78 }
79}
80
81impl_PartialEq_repr_fields!(SparcOpMem;
82 base, index, disp
83);
84
85impl cmp::Eq for SparcOpMem {}
86
87impl From<&cs_sparc_op> for SparcOperand {
88 fn from(insn: &cs_sparc_op) -> SparcOperand {
89 match insn.type_ {
90 sparc_op_type::SPARC_OP_REG => {
91 SparcOperand::Reg(RegId(unsafe { insn.__bindgen_anon_1.reg } as RegIdInt))
92 }
93 sparc_op_type::SPARC_OP_IMM => SparcOperand::Imm(unsafe { insn.__bindgen_anon_1.imm }),
94 sparc_op_type::SPARC_OP_MEM => {
95 SparcOperand::Mem(SparcOpMem(unsafe { insn.__bindgen_anon_1.mem }))
96 }
97 sparc_op_type::SPARC_OP_INVALID => SparcOperand::Invalid,
98 }
99 }
100}
101
102def_arch_details_struct!(
103 InsnDetail = SparcInsnDetail;
104 Operand = SparcOperand;
105 OperandIterator = SparcOperandIterator;
106 OperandIteratorLife = SparcOperandIterator<'a>;
107 [ pub struct SparcOperandIterator<'a>(slice::Iter<'a, cs_sparc_op>); ]
108 cs_arch_op = cs_sparc_op;
109 cs_arch = cs_sparc;
110);