blob: 2991c71018e2e47f11f1a2d62c22308c279cc13a [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
4#include <stdio.h>
5#include <stdlib.h>
6#include <string.h>
7
8#include "MCInst.h"
9#include "utils.h"
10
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +070011#define MCINST_CACHE (ARR_SIZE(mcInst->Operands) - 1)
12
Nguyen Anh Quynh495295e2014-06-16 15:54:32 +080013void MCInst_Init(MCInst *inst)
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080014{
Nguyen Anh Quynh495295e2014-06-16 15:54:32 +080015 inst->OpcodePub = 0;
16 inst->size = 0;
Nguyen Anh Quynhff7bba32014-11-03 16:32:06 +080017 inst->has_imm = false;
18 inst->op1_size = 0;
Nguyen Anh Quynhe19490e2015-01-21 12:15:14 +080019 inst->writeback = false;
Nguyen Anh Quynh29f777b2015-04-07 11:59:26 +080020 inst->ac_idx = 0;
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080021}
22
23void MCInst_clear(MCInst *inst)
24{
25 inst->size = 0;
26}
27
Nguyen Anh Quynh0f648ea2014-06-10 01:01:23 +070028// do not free @Op
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +070029void MCInst_insert0(MCInst *inst, int index, MCOperand *Op)
30{
31 int i;
32
33 for(i = inst->size; i > index; i--)
34 //memcpy(&(inst->Operands[i]), &(inst->Operands[i-1]), sizeof(MCOperand));
35 inst->Operands[i] = inst->Operands[i-1];
36
37 inst->Operands[index] = *Op;
38 inst->size++;
39}
40
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080041void MCInst_setOpcode(MCInst *inst, unsigned Op)
42{
43 inst->Opcode = Op;
44}
45
Nguyen Anh Quynh6b7abe32013-11-30 00:54:24 +080046void MCInst_setOpcodePub(MCInst *inst, unsigned Op)
47{
48 inst->OpcodePub = Op;
49}
50
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080051unsigned MCInst_getOpcode(const MCInst *inst)
52{
53 return inst->Opcode;
54}
55
Nguyen Anh Quynh6b7abe32013-11-30 00:54:24 +080056unsigned MCInst_getOpcodePub(const MCInst *inst)
57{
58 return inst->OpcodePub;
59}
60
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080061MCOperand *MCInst_getOperand(MCInst *inst, unsigned i)
62{
63 return &inst->Operands[i];
64}
65
66unsigned MCInst_getNumOperands(const MCInst *inst)
67{
68 return inst->size;
69}
70
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080071// This addOperand2 function doesnt free Op
Nguyen Anh Quynh264ca372014-06-16 14:52:09 +080072void MCInst_addOperand2(MCInst *inst, MCOperand *Op)
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080073{
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080074 inst->Operands[inst->size] = *Op;
75
76 inst->size++;
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080077}
78
79void MCOperand_Init(MCOperand *op)
80{
81 op->Kind = kInvalid;
82 op->FPImmVal = 0.0;
83}
84
85bool MCOperand_isValid(const MCOperand *op)
86{
87 return op->Kind != kInvalid;
88}
89
90bool MCOperand_isReg(const MCOperand *op)
91{
92 return op->Kind == kRegister;
93}
94
95bool MCOperand_isImm(const MCOperand *op)
96{
97 return op->Kind == kImmediate;
98}
99
100bool MCOperand_isFPImm(const MCOperand *op)
101{
102 return op->Kind == kFPImmediate;
103}
104
105/// getReg - Returns the register number.
106unsigned MCOperand_getReg(const MCOperand *op)
107{
108 return op->RegVal;
109}
110
111/// setReg - Set the register number.
112void MCOperand_setReg(MCOperand *op, unsigned Reg)
113{
114 op->RegVal = Reg;
115}
116
117int64_t MCOperand_getImm(MCOperand *op)
118{
119 return op->ImmVal;
120}
121
122void MCOperand_setImm(MCOperand *op, int64_t Val)
123{
124 op->ImmVal = Val;
125}
126
127double MCOperand_getFPImm(const MCOperand *op)
128{
129 return op->FPImmVal;
130}
131
132void MCOperand_setFPImm(MCOperand *op, double Val)
133{
134 op->FPImmVal = Val;
135}
136
Nguyen Anh Quynh0f648ea2014-06-10 01:01:23 +0700137MCOperand *MCOperand_CreateReg1(MCInst *mcInst, unsigned Reg)
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +0700138{
139 MCOperand *op = &(mcInst->Operands[MCINST_CACHE]);
140
141 op->Kind = kRegister;
142 op->RegVal = Reg;
143
144 return op;
145}
Nguyen Anh Quynhcf081382014-06-06 00:56:46 +0800146
147void MCOperand_CreateReg0(MCInst *mcInst, unsigned Reg)
148{
149 MCOperand *op = &(mcInst->Operands[mcInst->size]);
150 mcInst->size++;
151
152 op->Kind = kRegister;
153 op->RegVal = Reg;
154}
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +0700155
Nguyen Anh Quynh0f648ea2014-06-10 01:01:23 +0700156MCOperand *MCOperand_CreateImm1(MCInst *mcInst, int64_t Val)
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +0700157{
158 MCOperand *op = &(mcInst->Operands[MCINST_CACHE]);
159
160 op->Kind = kImmediate;
161 op->ImmVal = Val;
162
163 return op;
164}
Nguyen Anh Quynhcf081382014-06-06 00:56:46 +0800165
166void MCOperand_CreateImm0(MCInst *mcInst, int64_t Val)
167{
168 MCOperand *op = &(mcInst->Operands[mcInst->size]);
169 mcInst->size++;
170
171 op->Kind = kImmediate;
172 op->ImmVal = Val;
173}