blob: 0a42091705ec67c0685a7c22a736dc39e21b3811 [file] [log] [blame]
Nguyen Anh Quynh30e4d7f2014-05-08 22:54:58 +08001/* Capstone Disassembly Engine */
Nguyen Anh Quynhbfcaba52015-03-04 17:45:23 +08002/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +08003
reverser160e1982015-04-09 18:28:19 +01004#if defined(CAPSTONE_HAS_OSXKERNEL)
5#include <libkern/libkern.h>
6#else
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +08007#include <stdio.h>
8#include <stdlib.h>
reverser160e1982015-04-09 18:28:19 +01009#endif
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080010#include <string.h>
11
12#include "MCInst.h"
13#include "utils.h"
14
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +070015#define MCINST_CACHE (ARR_SIZE(mcInst->Operands) - 1)
16
Nguyen Anh Quynh495295e2014-06-16 15:54:32 +080017void MCInst_Init(MCInst *inst)
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080018{
Nguyen Anh Quynh495295e2014-06-16 15:54:32 +080019 inst->OpcodePub = 0;
20 inst->size = 0;
Nguyen Anh Quynhff7bba32014-11-03 16:32:06 +080021 inst->has_imm = false;
22 inst->op1_size = 0;
Nguyen Anh Quynhe19490e2015-01-21 12:15:14 +080023 inst->writeback = false;
Nguyen Anh Quynh29f777b2015-04-07 11:59:26 +080024 inst->ac_idx = 0;
Nguyen Anh Quynhdabc9f22016-07-15 20:37:19 +080025 inst->popcode_adjust = 0;
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080026}
27
28void MCInst_clear(MCInst *inst)
29{
30 inst->size = 0;
31}
32
Nguyen Anh Quynh0f648ea2014-06-10 01:01:23 +070033// do not free @Op
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +070034void MCInst_insert0(MCInst *inst, int index, MCOperand *Op)
35{
36 int i;
37
38 for(i = inst->size; i > index; i--)
39 //memcpy(&(inst->Operands[i]), &(inst->Operands[i-1]), sizeof(MCOperand));
40 inst->Operands[i] = inst->Operands[i-1];
41
42 inst->Operands[index] = *Op;
43 inst->size++;
44}
45
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080046void MCInst_setOpcode(MCInst *inst, unsigned Op)
47{
48 inst->Opcode = Op;
49}
50
Nguyen Anh Quynh6b7abe32013-11-30 00:54:24 +080051void MCInst_setOpcodePub(MCInst *inst, unsigned Op)
52{
53 inst->OpcodePub = Op;
54}
55
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080056unsigned MCInst_getOpcode(const MCInst *inst)
57{
58 return inst->Opcode;
59}
60
Nguyen Anh Quynh6b7abe32013-11-30 00:54:24 +080061unsigned MCInst_getOpcodePub(const MCInst *inst)
62{
63 return inst->OpcodePub;
64}
65
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080066MCOperand *MCInst_getOperand(MCInst *inst, unsigned i)
67{
68 return &inst->Operands[i];
69}
70
71unsigned MCInst_getNumOperands(const MCInst *inst)
72{
73 return inst->size;
74}
75
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080076// This addOperand2 function doesnt free Op
Nguyen Anh Quynh264ca372014-06-16 14:52:09 +080077void MCInst_addOperand2(MCInst *inst, MCOperand *Op)
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080078{
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080079 inst->Operands[inst->size] = *Op;
80
81 inst->size++;
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080082}
83
84void MCOperand_Init(MCOperand *op)
85{
86 op->Kind = kInvalid;
87 op->FPImmVal = 0.0;
88}
89
90bool MCOperand_isValid(const MCOperand *op)
91{
92 return op->Kind != kInvalid;
93}
94
95bool MCOperand_isReg(const MCOperand *op)
96{
97 return op->Kind == kRegister;
98}
99
100bool MCOperand_isImm(const MCOperand *op)
101{
102 return op->Kind == kImmediate;
103}
104
105bool MCOperand_isFPImm(const MCOperand *op)
106{
107 return op->Kind == kFPImmediate;
108}
109
110/// getReg - Returns the register number.
111unsigned MCOperand_getReg(const MCOperand *op)
112{
113 return op->RegVal;
114}
115
116/// setReg - Set the register number.
117void MCOperand_setReg(MCOperand *op, unsigned Reg)
118{
119 op->RegVal = Reg;
120}
121
122int64_t MCOperand_getImm(MCOperand *op)
123{
124 return op->ImmVal;
125}
126
127void MCOperand_setImm(MCOperand *op, int64_t Val)
128{
129 op->ImmVal = Val;
130}
131
132double MCOperand_getFPImm(const MCOperand *op)
133{
134 return op->FPImmVal;
135}
136
137void MCOperand_setFPImm(MCOperand *op, double Val)
138{
139 op->FPImmVal = Val;
140}
141
Nguyen Anh Quynh0f648ea2014-06-10 01:01:23 +0700142MCOperand *MCOperand_CreateReg1(MCInst *mcInst, unsigned Reg)
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +0700143{
144 MCOperand *op = &(mcInst->Operands[MCINST_CACHE]);
145
146 op->Kind = kRegister;
147 op->RegVal = Reg;
148
149 return op;
150}
Nguyen Anh Quynhcf081382014-06-06 00:56:46 +0800151
152void MCOperand_CreateReg0(MCInst *mcInst, unsigned Reg)
153{
154 MCOperand *op = &(mcInst->Operands[mcInst->size]);
155 mcInst->size++;
156
157 op->Kind = kRegister;
158 op->RegVal = Reg;
159}
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +0700160
Nguyen Anh Quynh0f648ea2014-06-10 01:01:23 +0700161MCOperand *MCOperand_CreateImm1(MCInst *mcInst, int64_t Val)
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +0700162{
163 MCOperand *op = &(mcInst->Operands[MCINST_CACHE]);
164
165 op->Kind = kImmediate;
166 op->ImmVal = Val;
167
168 return op;
169}
Nguyen Anh Quynhcf081382014-06-06 00:56:46 +0800170
171void MCOperand_CreateImm0(MCInst *mcInst, int64_t Val)
172{
173 MCOperand *op = &(mcInst->Operands[mcInst->size]);
174 mcInst->size++;
175
176 op->Kind = kImmediate;
177 op->ImmVal = Val;
178}