13 #ifdef CAPSTONE_HAS_POWERPC
19 #include "../../cs_priv.h"
20 #include "../../utils.h"
24 #include "../../MCInst.h"
25 #include "../../MCInstrDesc.h"
26 #include "../../MCFixedLenDisassembler.h"
27 #include "../../MCRegisterInfo.h"
28 #include "../../MCDisassembler.h"
29 #include "../../MathExtras.h"
31 #define GET_REGINFO_ENUM
38 static const unsigned CRRegs[] = {
39 PPC_CR0, PPC_CR1, PPC_CR2, PPC_CR3,
40 PPC_CR4, PPC_CR5, PPC_CR6, PPC_CR7
43 static const unsigned CRBITRegs[] = {
44 PPC_CR0LT, PPC_CR0GT, PPC_CR0EQ, PPC_CR0UN,
45 PPC_CR1LT, PPC_CR1GT, PPC_CR1EQ, PPC_CR1UN,
46 PPC_CR2LT, PPC_CR2GT, PPC_CR2EQ, PPC_CR2UN,
47 PPC_CR3LT, PPC_CR3GT, PPC_CR3EQ, PPC_CR3UN,
48 PPC_CR4LT, PPC_CR4GT, PPC_CR4EQ, PPC_CR4UN,
49 PPC_CR5LT, PPC_CR5GT, PPC_CR5EQ, PPC_CR5UN,
50 PPC_CR6LT, PPC_CR6GT, PPC_CR6EQ, PPC_CR6UN,
51 PPC_CR7LT, PPC_CR7GT, PPC_CR7EQ, PPC_CR7UN
54 static const unsigned FRegs[] = {
55 PPC_F0, PPC_F1, PPC_F2, PPC_F3,
56 PPC_F4, PPC_F5, PPC_F6, PPC_F7,
57 PPC_F8, PPC_F9, PPC_F10, PPC_F11,
58 PPC_F12, PPC_F13, PPC_F14, PPC_F15,
59 PPC_F16, PPC_F17, PPC_F18, PPC_F19,
60 PPC_F20, PPC_F21, PPC_F22, PPC_F23,
61 PPC_F24, PPC_F25, PPC_F26, PPC_F27,
62 PPC_F28, PPC_F29, PPC_F30, PPC_F31
65 static const unsigned VRegs[] = {
66 PPC_V0, PPC_V1, PPC_V2, PPC_V3,
67 PPC_V4, PPC_V5, PPC_V6, PPC_V7,
68 PPC_V8, PPC_V9, PPC_V10, PPC_V11,
69 PPC_V12, PPC_V13, PPC_V14, PPC_V15,
70 PPC_V16, PPC_V17, PPC_V18, PPC_V19,
71 PPC_V20, PPC_V21, PPC_V22, PPC_V23,
72 PPC_V24, PPC_V25, PPC_V26, PPC_V27,
73 PPC_V28, PPC_V29, PPC_V30, PPC_V31
76 static const unsigned VSRegs[] = {
77 PPC_VSL0, PPC_VSL1, PPC_VSL2, PPC_VSL3,
78 PPC_VSL4, PPC_VSL5, PPC_VSL6, PPC_VSL7,
79 PPC_VSL8, PPC_VSL9, PPC_VSL10, PPC_VSL11,
80 PPC_VSL12, PPC_VSL13, PPC_VSL14, PPC_VSL15,
81 PPC_VSL16, PPC_VSL17, PPC_VSL18, PPC_VSL19,
82 PPC_VSL20, PPC_VSL21, PPC_VSL22, PPC_VSL23,
83 PPC_VSL24, PPC_VSL25, PPC_VSL26, PPC_VSL27,
84 PPC_VSL28, PPC_VSL29, PPC_VSL30, PPC_VSL31,
86 PPC_VSH0, PPC_VSH1, PPC_VSH2, PPC_VSH3,
87 PPC_VSH4, PPC_VSH5, PPC_VSH6, PPC_VSH7,
88 PPC_VSH8, PPC_VSH9, PPC_VSH10, PPC_VSH11,
89 PPC_VSH12, PPC_VSH13, PPC_VSH14, PPC_VSH15,
90 PPC_VSH16, PPC_VSH17, PPC_VSH18, PPC_VSH19,
91 PPC_VSH20, PPC_VSH21, PPC_VSH22, PPC_VSH23,
92 PPC_VSH24, PPC_VSH25, PPC_VSH26, PPC_VSH27,
93 PPC_VSH28, PPC_VSH29, PPC_VSH30, PPC_VSH31
96 static const unsigned VSFRegs[] = {
97 PPC_F0, PPC_F1, PPC_F2, PPC_F3,
98 PPC_F4, PPC_F5, PPC_F6, PPC_F7,
99 PPC_F8, PPC_F9, PPC_F10, PPC_F11,
100 PPC_F12, PPC_F13, PPC_F14, PPC_F15,
101 PPC_F16, PPC_F17, PPC_F18, PPC_F19,
102 PPC_F20, PPC_F21, PPC_F22, PPC_F23,
103 PPC_F24, PPC_F25, PPC_F26, PPC_F27,
104 PPC_F28, PPC_F29, PPC_F30, PPC_F31,
106 PPC_VF0, PPC_VF1, PPC_VF2, PPC_VF3,
107 PPC_VF4, PPC_VF5, PPC_VF6, PPC_VF7,
108 PPC_VF8, PPC_VF9, PPC_VF10, PPC_VF11,
109 PPC_VF12, PPC_VF13, PPC_VF14, PPC_VF15,
110 PPC_VF16, PPC_VF17, PPC_VF18, PPC_VF19,
111 PPC_VF20, PPC_VF21, PPC_VF22, PPC_VF23,
112 PPC_VF24, PPC_VF25, PPC_VF26, PPC_VF27,
113 PPC_VF28, PPC_VF29, PPC_VF30, PPC_VF31
116 static const unsigned GPRegs[] = {
117 PPC_R0, PPC_R1, PPC_R2, PPC_R3,
118 PPC_R4, PPC_R5, PPC_R6, PPC_R7,
119 PPC_R8, PPC_R9, PPC_R10, PPC_R11,
120 PPC_R12, PPC_R13, PPC_R14, PPC_R15,
121 PPC_R16, PPC_R17, PPC_R18, PPC_R19,
122 PPC_R20, PPC_R21, PPC_R22, PPC_R23,
123 PPC_R24, PPC_R25, PPC_R26, PPC_R27,
124 PPC_R28, PPC_R29, PPC_R30, PPC_R31
127 static const unsigned GP0Regs[] = {
128 PPC_ZERO, PPC_R1, PPC_R2, PPC_R3,
129 PPC_R4, PPC_R5, PPC_R6, PPC_R7,
130 PPC_R8, PPC_R9, PPC_R10, PPC_R11,
131 PPC_R12, PPC_R13, PPC_R14, PPC_R15,
132 PPC_R16, PPC_R17, PPC_R18, PPC_R19,
133 PPC_R20, PPC_R21, PPC_R22, PPC_R23,
134 PPC_R24, PPC_R25, PPC_R26, PPC_R27,
135 PPC_R28, PPC_R29, PPC_R30, PPC_R31
138 static const unsigned G8Regs[] = {
139 PPC_X0, PPC_X1, PPC_X2, PPC_X3,
140 PPC_X4, PPC_X5, PPC_X6, PPC_X7,
141 PPC_X8, PPC_X9, PPC_X10, PPC_X11,
142 PPC_X12, PPC_X13, PPC_X14, PPC_X15,
143 PPC_X16, PPC_X17, PPC_X18, PPC_X19,
144 PPC_X20, PPC_X21, PPC_X22, PPC_X23,
145 PPC_X24, PPC_X25, PPC_X26, PPC_X27,
146 PPC_X28, PPC_X29, PPC_X30, PPC_X31
149 static const unsigned QFRegs[] = {
150 PPC_QF0, PPC_QF1, PPC_QF2, PPC_QF3,
151 PPC_QF4, PPC_QF5, PPC_QF6, PPC_QF7,
152 PPC_QF8, PPC_QF9, PPC_QF10, PPC_QF11,
153 PPC_QF12, PPC_QF13, PPC_QF14, PPC_QF15,
154 PPC_QF16, PPC_QF17, PPC_QF18, PPC_QF19,
155 PPC_QF20, PPC_QF21, PPC_QF22, PPC_QF23,
156 PPC_QF24, PPC_QF25, PPC_QF26, PPC_QF27,
157 PPC_QF28, PPC_QF29, PPC_QF30, PPC_QF31
160 static uint64_t getFeatureBits(
int feature)
167 const unsigned *Regs)
178 return decodeRegisterClass(Inst, RegNo, CRRegs);
185 return decodeRegisterClass(Inst, RegNo, CRBITRegs);
192 return decodeRegisterClass(Inst, RegNo, FRegs);
199 return decodeRegisterClass(Inst, RegNo, FRegs);
206 return decodeRegisterClass(Inst, RegNo, VRegs);
213 return decodeRegisterClass(Inst, RegNo, VSRegs);
220 return decodeRegisterClass(Inst, RegNo, VSFRegs);
227 return decodeRegisterClass(Inst, RegNo, GPRegs);
234 return decodeRegisterClass(Inst, RegNo, GP0Regs);
241 return decodeRegisterClass(Inst, RegNo, G8Regs);
244 #define DecodePointerLikeRegClass0 DecodeGPRCRegisterClass
245 #define DecodePointerLikeRegClass1 DecodeGPRC_NOR0RegisterClass
251 return decodeRegisterClass(Inst, RegNo, QFRegs);
254 #define DecodeQSRCRegisterClass DecodeQFRCRegisterClass
255 #define DecodeQBRCRegisterClass DecodeQFRCRegisterClass
258 int64_t Address,
const void *Decoder,
unsigned N)
266 int64_t Address,
const void *Decoder,
unsigned N)
274 #define GET_INSTRINFO_ENUM
278 int64_t Address,
const void *Decoder)
316 int64_t Address,
const void *Decoder)
338 int64_t Address,
const void *Decoder)
380 result = decodeInstruction_4(DecoderTableQPX32, MI, insn, Address, 4);
389 result = decodeInstruction_4(DecoderTable32, MI, insn, Address, 4);
412 #define GET_REGINFO_MC_DESC
434 PPCMCRegisterClasses, 23,
438 PPCSubRegIdxLists, 8,
MCOperand * MCOperand_CreateReg1(MCInst *mcInst, unsigned Reg)
unsigned MCInst_getOpcode(const MCInst *inst)
void MCInst_clear(MCInst *inst)
void MCInst_insert0(MCInst *inst, int index, MCOperand *Op)
void MCOperand_CreateReg0(MCInst *mcInst, unsigned Reg)
void MCOperand_CreateImm0(MCInst *mcInst, int64_t Val)
void MCRegisterInfo_InitMCRegisterInfo(MCRegisterInfo *RI, const MCRegisterDesc *D, unsigned NR, unsigned RA, unsigned PC, const MCRegisterClass *C, unsigned NC, uint16_t(*RURoots)[2], unsigned NRU, const MCPhysReg *DL, const char *Strings, const uint16_t *SubIndices, unsigned NumIndices, const uint16_t *RET)
void PPC_init(MCRegisterInfo *MRI)
bool PPC_getInstruction(csh ud, const uint8_t *code, size_t code_len, MCInst *instr, uint16_t *size, uint64_t address, void *info)
RzBinInfo * info(RzBinFile *bf)
@ CS_MODE_QPX
Quad Processing eXtensions mode (PPC)
#define MODE_IS_BIG_ENDIAN(mode)
#define offsetof(type, member)
return memset(p, 0, total)
static const char struct stat static buf struct stat static buf static vhangup int status
void __stdcall getInstruction(cs_insn *insn, uint32_t index, void *curInst, uint32_t bufSize)