1*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
2*9a0e4156SSadaf Ebrahimi /* TMS320C64x Backend by Fotis Loukos <[email protected]> 2016 */
3*9a0e4156SSadaf Ebrahimi
4*9a0e4156SSadaf Ebrahimi #ifdef CAPSTONE_HAS_TMS320C64X
5*9a0e4156SSadaf Ebrahimi
6*9a0e4156SSadaf Ebrahimi #ifdef _MSC_VER
7*9a0e4156SSadaf Ebrahimi // Disable security warnings for strcpy
8*9a0e4156SSadaf Ebrahimi #ifndef _CRT_SECURE_NO_WARNINGS
9*9a0e4156SSadaf Ebrahimi #define _CRT_SECURE_NO_WARNINGS
10*9a0e4156SSadaf Ebrahimi #endif
11*9a0e4156SSadaf Ebrahimi
12*9a0e4156SSadaf Ebrahimi // Banned API Usage : strcpy is a Banned API as listed in dontuse.h for
13*9a0e4156SSadaf Ebrahimi // security purposes.
14*9a0e4156SSadaf Ebrahimi #pragma warning(disable:28719)
15*9a0e4156SSadaf Ebrahimi #endif
16*9a0e4156SSadaf Ebrahimi
17*9a0e4156SSadaf Ebrahimi #include <ctype.h>
18*9a0e4156SSadaf Ebrahimi #include <string.h>
19*9a0e4156SSadaf Ebrahimi
20*9a0e4156SSadaf Ebrahimi #include "TMS320C64xInstPrinter.h"
21*9a0e4156SSadaf Ebrahimi #include "../../MCInst.h"
22*9a0e4156SSadaf Ebrahimi #include "../../utils.h"
23*9a0e4156SSadaf Ebrahimi #include "../../SStream.h"
24*9a0e4156SSadaf Ebrahimi #include "../../MCRegisterInfo.h"
25*9a0e4156SSadaf Ebrahimi #include "../../MathExtras.h"
26*9a0e4156SSadaf Ebrahimi #include "TMS320C64xMapping.h"
27*9a0e4156SSadaf Ebrahimi
28*9a0e4156SSadaf Ebrahimi #include "capstone/tms320c64x.h"
29*9a0e4156SSadaf Ebrahimi
30*9a0e4156SSadaf Ebrahimi static char *getRegisterName(unsigned RegNo);
31*9a0e4156SSadaf Ebrahimi static void printOperand(MCInst *MI, unsigned OpNo, SStream *O);
32*9a0e4156SSadaf Ebrahimi static void printMemOperand(MCInst *MI, unsigned OpNo, SStream *O);
33*9a0e4156SSadaf Ebrahimi static void printMemOperand2(MCInst *MI, unsigned OpNo, SStream *O);
34*9a0e4156SSadaf Ebrahimi static void printRegPair(MCInst *MI, unsigned OpNo, SStream *O);
35*9a0e4156SSadaf Ebrahimi
TMS320C64x_post_printer(csh ud,cs_insn * insn,char * insn_asm,MCInst * mci)36*9a0e4156SSadaf Ebrahimi void TMS320C64x_post_printer(csh ud, cs_insn *insn, char *insn_asm, MCInst *mci)
37*9a0e4156SSadaf Ebrahimi {
38*9a0e4156SSadaf Ebrahimi SStream ss;
39*9a0e4156SSadaf Ebrahimi char *p, *p2, tmp[8];
40*9a0e4156SSadaf Ebrahimi unsigned int unit = 0;
41*9a0e4156SSadaf Ebrahimi int i;
42*9a0e4156SSadaf Ebrahimi cs_tms320c64x *tms320c64x;
43*9a0e4156SSadaf Ebrahimi
44*9a0e4156SSadaf Ebrahimi if (mci->csh->detail) {
45*9a0e4156SSadaf Ebrahimi tms320c64x = &mci->flat_insn->detail->tms320c64x;
46*9a0e4156SSadaf Ebrahimi
47*9a0e4156SSadaf Ebrahimi for (i = 0; i < insn->detail->groups_count; i++) {
48*9a0e4156SSadaf Ebrahimi switch(insn->detail->groups[i]) {
49*9a0e4156SSadaf Ebrahimi case TMS320C64X_GRP_FUNIT_D:
50*9a0e4156SSadaf Ebrahimi unit = TMS320C64X_FUNIT_D;
51*9a0e4156SSadaf Ebrahimi break;
52*9a0e4156SSadaf Ebrahimi case TMS320C64X_GRP_FUNIT_L:
53*9a0e4156SSadaf Ebrahimi unit = TMS320C64X_FUNIT_L;
54*9a0e4156SSadaf Ebrahimi break;
55*9a0e4156SSadaf Ebrahimi case TMS320C64X_GRP_FUNIT_M:
56*9a0e4156SSadaf Ebrahimi unit = TMS320C64X_FUNIT_M;
57*9a0e4156SSadaf Ebrahimi break;
58*9a0e4156SSadaf Ebrahimi case TMS320C64X_GRP_FUNIT_S:
59*9a0e4156SSadaf Ebrahimi unit = TMS320C64X_FUNIT_S;
60*9a0e4156SSadaf Ebrahimi break;
61*9a0e4156SSadaf Ebrahimi case TMS320C64X_GRP_FUNIT_NO:
62*9a0e4156SSadaf Ebrahimi unit = TMS320C64X_FUNIT_NO;
63*9a0e4156SSadaf Ebrahimi break;
64*9a0e4156SSadaf Ebrahimi }
65*9a0e4156SSadaf Ebrahimi if (unit != 0)
66*9a0e4156SSadaf Ebrahimi break;
67*9a0e4156SSadaf Ebrahimi }
68*9a0e4156SSadaf Ebrahimi tms320c64x->funit.unit = unit;
69*9a0e4156SSadaf Ebrahimi
70*9a0e4156SSadaf Ebrahimi SStream_Init(&ss);
71*9a0e4156SSadaf Ebrahimi if (tms320c64x->condition.reg != TMS320C64X_REG_INVALID)
72*9a0e4156SSadaf Ebrahimi SStream_concat(&ss, "[%c%s]|", (tms320c64x->condition.zero == 1) ? '!' : '|', cs_reg_name(ud, tms320c64x->condition.reg));
73*9a0e4156SSadaf Ebrahimi else
74*9a0e4156SSadaf Ebrahimi SStream_concat0(&ss, "||||||");
75*9a0e4156SSadaf Ebrahimi
76*9a0e4156SSadaf Ebrahimi p = strchr(insn_asm, '\t');
77*9a0e4156SSadaf Ebrahimi if (p != NULL)
78*9a0e4156SSadaf Ebrahimi *p++ = '\0';
79*9a0e4156SSadaf Ebrahimi
80*9a0e4156SSadaf Ebrahimi SStream_concat0(&ss, insn_asm);
81*9a0e4156SSadaf Ebrahimi if ((p != NULL) && (((p2 = strchr(p, '[')) != NULL) || ((p2 = strchr(p, '(')) != NULL))) {
82*9a0e4156SSadaf Ebrahimi while ((p2 > p) && ((*p2 != 'a') && (*p2 != 'b')))
83*9a0e4156SSadaf Ebrahimi p2--;
84*9a0e4156SSadaf Ebrahimi if (p2 == p) {
85*9a0e4156SSadaf Ebrahimi strcpy(insn_asm, "Invalid!");
86*9a0e4156SSadaf Ebrahimi return;
87*9a0e4156SSadaf Ebrahimi }
88*9a0e4156SSadaf Ebrahimi if (*p2 == 'a')
89*9a0e4156SSadaf Ebrahimi strcpy(tmp, "1T");
90*9a0e4156SSadaf Ebrahimi else
91*9a0e4156SSadaf Ebrahimi strcpy(tmp, "2T");
92*9a0e4156SSadaf Ebrahimi } else {
93*9a0e4156SSadaf Ebrahimi tmp[0] = '\0';
94*9a0e4156SSadaf Ebrahimi }
95*9a0e4156SSadaf Ebrahimi switch(tms320c64x->funit.unit) {
96*9a0e4156SSadaf Ebrahimi case TMS320C64X_FUNIT_D:
97*9a0e4156SSadaf Ebrahimi SStream_concat(&ss, ".D%s%u", tmp, tms320c64x->funit.side);
98*9a0e4156SSadaf Ebrahimi break;
99*9a0e4156SSadaf Ebrahimi case TMS320C64X_FUNIT_L:
100*9a0e4156SSadaf Ebrahimi SStream_concat(&ss, ".L%s%u", tmp, tms320c64x->funit.side);
101*9a0e4156SSadaf Ebrahimi break;
102*9a0e4156SSadaf Ebrahimi case TMS320C64X_FUNIT_M:
103*9a0e4156SSadaf Ebrahimi SStream_concat(&ss, ".M%s%u", tmp, tms320c64x->funit.side);
104*9a0e4156SSadaf Ebrahimi break;
105*9a0e4156SSadaf Ebrahimi case TMS320C64X_FUNIT_S:
106*9a0e4156SSadaf Ebrahimi SStream_concat(&ss, ".S%s%u", tmp, tms320c64x->funit.side);
107*9a0e4156SSadaf Ebrahimi break;
108*9a0e4156SSadaf Ebrahimi }
109*9a0e4156SSadaf Ebrahimi if (tms320c64x->funit.crosspath > 0)
110*9a0e4156SSadaf Ebrahimi SStream_concat0(&ss, "X");
111*9a0e4156SSadaf Ebrahimi
112*9a0e4156SSadaf Ebrahimi if (p != NULL)
113*9a0e4156SSadaf Ebrahimi SStream_concat(&ss, "\t%s", p);
114*9a0e4156SSadaf Ebrahimi
115*9a0e4156SSadaf Ebrahimi if (tms320c64x->parallel != 0)
116*9a0e4156SSadaf Ebrahimi SStream_concat(&ss, "\t||");
117*9a0e4156SSadaf Ebrahimi
118*9a0e4156SSadaf Ebrahimi /* insn_asm is a buffer from an SStream, so there should be enough space */
119*9a0e4156SSadaf Ebrahimi strcpy(insn_asm, ss.buffer);
120*9a0e4156SSadaf Ebrahimi }
121*9a0e4156SSadaf Ebrahimi }
122*9a0e4156SSadaf Ebrahimi
123*9a0e4156SSadaf Ebrahimi #define PRINT_ALIAS_INSTR
124*9a0e4156SSadaf Ebrahimi #include "TMS320C64xGenAsmWriter.inc"
125*9a0e4156SSadaf Ebrahimi
126*9a0e4156SSadaf Ebrahimi #define GET_INSTRINFO_ENUM
127*9a0e4156SSadaf Ebrahimi #include "TMS320C64xGenInstrInfo.inc"
128*9a0e4156SSadaf Ebrahimi
printOperand(MCInst * MI,unsigned OpNo,SStream * O)129*9a0e4156SSadaf Ebrahimi static void printOperand(MCInst *MI, unsigned OpNo, SStream *O)
130*9a0e4156SSadaf Ebrahimi {
131*9a0e4156SSadaf Ebrahimi MCOperand *Op = MCInst_getOperand(MI, OpNo);
132*9a0e4156SSadaf Ebrahimi unsigned reg;
133*9a0e4156SSadaf Ebrahimi
134*9a0e4156SSadaf Ebrahimi if (MCOperand_isReg(Op)) {
135*9a0e4156SSadaf Ebrahimi reg = MCOperand_getReg(Op);
136*9a0e4156SSadaf Ebrahimi if ((MCInst_getOpcode(MI) == TMS320C64x_MVC_s1_rr) && (OpNo == 1)) {
137*9a0e4156SSadaf Ebrahimi switch(reg) {
138*9a0e4156SSadaf Ebrahimi case TMS320C64X_REG_EFR:
139*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "EFR");
140*9a0e4156SSadaf Ebrahimi break;
141*9a0e4156SSadaf Ebrahimi case TMS320C64X_REG_IFR:
142*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "IFR");
143*9a0e4156SSadaf Ebrahimi break;
144*9a0e4156SSadaf Ebrahimi default:
145*9a0e4156SSadaf Ebrahimi SStream_concat0(O, getRegisterName(reg));
146*9a0e4156SSadaf Ebrahimi break;
147*9a0e4156SSadaf Ebrahimi }
148*9a0e4156SSadaf Ebrahimi } else {
149*9a0e4156SSadaf Ebrahimi SStream_concat0(O, getRegisterName(reg));
150*9a0e4156SSadaf Ebrahimi }
151*9a0e4156SSadaf Ebrahimi
152*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
153*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->tms320c64x.operands[MI->flat_insn->detail->tms320c64x.op_count].type = TMS320C64X_OP_REG;
154*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->tms320c64x.operands[MI->flat_insn->detail->tms320c64x.op_count].reg = reg;
155*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->tms320c64x.op_count++;
156*9a0e4156SSadaf Ebrahimi }
157*9a0e4156SSadaf Ebrahimi } else if (MCOperand_isImm(Op)) {
158*9a0e4156SSadaf Ebrahimi int64_t Imm = MCOperand_getImm(Op);
159*9a0e4156SSadaf Ebrahimi
160*9a0e4156SSadaf Ebrahimi if (Imm >= 0) {
161*9a0e4156SSadaf Ebrahimi if (Imm > HEX_THRESHOLD)
162*9a0e4156SSadaf Ebrahimi SStream_concat(O, "0x%"PRIx64, Imm);
163*9a0e4156SSadaf Ebrahimi else
164*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%"PRIu64, Imm);
165*9a0e4156SSadaf Ebrahimi } else {
166*9a0e4156SSadaf Ebrahimi if (Imm < -HEX_THRESHOLD)
167*9a0e4156SSadaf Ebrahimi SStream_concat(O, "-0x%"PRIx64, -Imm);
168*9a0e4156SSadaf Ebrahimi else
169*9a0e4156SSadaf Ebrahimi SStream_concat(O, "-%"PRIu64, -Imm);
170*9a0e4156SSadaf Ebrahimi }
171*9a0e4156SSadaf Ebrahimi
172*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
173*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->tms320c64x.operands[MI->flat_insn->detail->tms320c64x.op_count].type = TMS320C64X_OP_IMM;
174*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->tms320c64x.operands[MI->flat_insn->detail->tms320c64x.op_count].imm = Imm;
175*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->tms320c64x.op_count++;
176*9a0e4156SSadaf Ebrahimi }
177*9a0e4156SSadaf Ebrahimi }
178*9a0e4156SSadaf Ebrahimi }
179*9a0e4156SSadaf Ebrahimi
printMemOperand(MCInst * MI,unsigned OpNo,SStream * O)180*9a0e4156SSadaf Ebrahimi static void printMemOperand(MCInst *MI, unsigned OpNo, SStream *O)
181*9a0e4156SSadaf Ebrahimi {
182*9a0e4156SSadaf Ebrahimi MCOperand *Op = MCInst_getOperand(MI, OpNo);
183*9a0e4156SSadaf Ebrahimi int64_t Val = MCOperand_getImm(Op);
184*9a0e4156SSadaf Ebrahimi unsigned scaled, base, offset, mode, unit;
185*9a0e4156SSadaf Ebrahimi cs_tms320c64x *tms320c64x;
186*9a0e4156SSadaf Ebrahimi char st, nd;
187*9a0e4156SSadaf Ebrahimi
188*9a0e4156SSadaf Ebrahimi scaled = (Val >> 19) & 1;
189*9a0e4156SSadaf Ebrahimi base = (Val >> 12) & 0x7f;
190*9a0e4156SSadaf Ebrahimi offset = (Val >> 5) & 0x7f;
191*9a0e4156SSadaf Ebrahimi mode = (Val >> 1) & 0xf;
192*9a0e4156SSadaf Ebrahimi unit = Val & 1;
193*9a0e4156SSadaf Ebrahimi
194*9a0e4156SSadaf Ebrahimi if (scaled) {
195*9a0e4156SSadaf Ebrahimi st = '[';
196*9a0e4156SSadaf Ebrahimi nd = ']';
197*9a0e4156SSadaf Ebrahimi } else {
198*9a0e4156SSadaf Ebrahimi st = '(';
199*9a0e4156SSadaf Ebrahimi nd = ')';
200*9a0e4156SSadaf Ebrahimi }
201*9a0e4156SSadaf Ebrahimi
202*9a0e4156SSadaf Ebrahimi switch(mode) {
203*9a0e4156SSadaf Ebrahimi case 0:
204*9a0e4156SSadaf Ebrahimi SStream_concat(O, "*-%s%c%u%c", getRegisterName(base), st, offset, nd);
205*9a0e4156SSadaf Ebrahimi break;
206*9a0e4156SSadaf Ebrahimi case 1:
207*9a0e4156SSadaf Ebrahimi SStream_concat(O, "*+%s%c%u%c", getRegisterName(base), st, offset, nd);
208*9a0e4156SSadaf Ebrahimi break;
209*9a0e4156SSadaf Ebrahimi case 4:
210*9a0e4156SSadaf Ebrahimi SStream_concat(O, "*-%s%c%s%c", getRegisterName(base), st, getRegisterName(offset), nd);
211*9a0e4156SSadaf Ebrahimi break;
212*9a0e4156SSadaf Ebrahimi case 5:
213*9a0e4156SSadaf Ebrahimi SStream_concat(O, "*+%s%c%s%c", getRegisterName(base), st, getRegisterName(offset), nd);
214*9a0e4156SSadaf Ebrahimi break;
215*9a0e4156SSadaf Ebrahimi case 8:
216*9a0e4156SSadaf Ebrahimi SStream_concat(O, "*--%s%c%u%c", getRegisterName(base), st, offset, nd);
217*9a0e4156SSadaf Ebrahimi break;
218*9a0e4156SSadaf Ebrahimi case 9:
219*9a0e4156SSadaf Ebrahimi SStream_concat(O, "*++%s%c%u%c", getRegisterName(base), st, offset, nd);
220*9a0e4156SSadaf Ebrahimi break;
221*9a0e4156SSadaf Ebrahimi case 10:
222*9a0e4156SSadaf Ebrahimi SStream_concat(O, "*%s--%c%u%c", getRegisterName(base), st, offset, nd);
223*9a0e4156SSadaf Ebrahimi break;
224*9a0e4156SSadaf Ebrahimi case 11:
225*9a0e4156SSadaf Ebrahimi SStream_concat(O, "*%s++%c%u%c", getRegisterName(base), st, offset, nd);
226*9a0e4156SSadaf Ebrahimi break;
227*9a0e4156SSadaf Ebrahimi case 12:
228*9a0e4156SSadaf Ebrahimi SStream_concat(O, "*--%s%c%s%c", getRegisterName(base), st, getRegisterName(offset), nd);
229*9a0e4156SSadaf Ebrahimi break;
230*9a0e4156SSadaf Ebrahimi case 13:
231*9a0e4156SSadaf Ebrahimi SStream_concat(O, "*++%s%c%s%c", getRegisterName(base), st, getRegisterName(offset), nd);
232*9a0e4156SSadaf Ebrahimi break;
233*9a0e4156SSadaf Ebrahimi case 14:
234*9a0e4156SSadaf Ebrahimi SStream_concat(O, "*%s--%c%s%c", getRegisterName(base), st, getRegisterName(offset), nd);
235*9a0e4156SSadaf Ebrahimi break;
236*9a0e4156SSadaf Ebrahimi case 15:
237*9a0e4156SSadaf Ebrahimi SStream_concat(O, "*%s++%c%s%c", getRegisterName(base), st, getRegisterName(offset), nd);
238*9a0e4156SSadaf Ebrahimi break;
239*9a0e4156SSadaf Ebrahimi }
240*9a0e4156SSadaf Ebrahimi
241*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
242*9a0e4156SSadaf Ebrahimi tms320c64x = &MI->flat_insn->detail->tms320c64x;
243*9a0e4156SSadaf Ebrahimi
244*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].type = TMS320C64X_OP_MEM;
245*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.base = base;
246*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disp = offset;
247*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.unit = unit + 1;
248*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.scaled = scaled;
249*9a0e4156SSadaf Ebrahimi switch(mode) {
250*9a0e4156SSadaf Ebrahimi case 0:
251*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disptype = TMS320C64X_MEM_DISP_CONSTANT;
252*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.direction = TMS320C64X_MEM_DIR_BW;
253*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.modify = TMS320C64X_MEM_MOD_NO;
254*9a0e4156SSadaf Ebrahimi break;
255*9a0e4156SSadaf Ebrahimi case 1:
256*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disptype = TMS320C64X_MEM_DISP_CONSTANT;
257*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.direction = TMS320C64X_MEM_DIR_FW;
258*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.modify = TMS320C64X_MEM_MOD_NO;
259*9a0e4156SSadaf Ebrahimi break;
260*9a0e4156SSadaf Ebrahimi case 4:
261*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disptype = TMS320C64X_MEM_DISP_REGISTER;
262*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.direction = TMS320C64X_MEM_DIR_BW;
263*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.modify = TMS320C64X_MEM_MOD_NO;
264*9a0e4156SSadaf Ebrahimi break;
265*9a0e4156SSadaf Ebrahimi case 5:
266*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disptype = TMS320C64X_MEM_DISP_REGISTER;
267*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.direction = TMS320C64X_MEM_DIR_FW;
268*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.modify = TMS320C64X_MEM_MOD_NO;
269*9a0e4156SSadaf Ebrahimi break;
270*9a0e4156SSadaf Ebrahimi case 8:
271*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disptype = TMS320C64X_MEM_DISP_CONSTANT;
272*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.direction = TMS320C64X_MEM_DIR_BW;
273*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.modify = TMS320C64X_MEM_MOD_PRE;
274*9a0e4156SSadaf Ebrahimi break;
275*9a0e4156SSadaf Ebrahimi case 9:
276*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disptype = TMS320C64X_MEM_DISP_CONSTANT;
277*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.direction = TMS320C64X_MEM_DIR_FW;
278*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.modify = TMS320C64X_MEM_MOD_PRE;
279*9a0e4156SSadaf Ebrahimi break;
280*9a0e4156SSadaf Ebrahimi case 10:
281*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disptype = TMS320C64X_MEM_DISP_CONSTANT;
282*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.direction = TMS320C64X_MEM_DIR_BW;
283*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.modify = TMS320C64X_MEM_MOD_POST;
284*9a0e4156SSadaf Ebrahimi break;
285*9a0e4156SSadaf Ebrahimi case 11:
286*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disptype = TMS320C64X_MEM_DISP_CONSTANT;
287*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.direction = TMS320C64X_MEM_DIR_FW;
288*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.modify = TMS320C64X_MEM_MOD_POST;
289*9a0e4156SSadaf Ebrahimi break;
290*9a0e4156SSadaf Ebrahimi case 12:
291*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disptype = TMS320C64X_MEM_DISP_REGISTER;
292*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.direction = TMS320C64X_MEM_DIR_BW;
293*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.modify = TMS320C64X_MEM_MOD_PRE;
294*9a0e4156SSadaf Ebrahimi break;
295*9a0e4156SSadaf Ebrahimi case 13:
296*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disptype = TMS320C64X_MEM_DISP_REGISTER;
297*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.direction = TMS320C64X_MEM_DIR_FW;
298*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.modify = TMS320C64X_MEM_MOD_PRE;
299*9a0e4156SSadaf Ebrahimi break;
300*9a0e4156SSadaf Ebrahimi case 14:
301*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disptype = TMS320C64X_MEM_DISP_REGISTER;
302*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.direction = TMS320C64X_MEM_DIR_BW;
303*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.modify = TMS320C64X_MEM_MOD_POST;
304*9a0e4156SSadaf Ebrahimi break;
305*9a0e4156SSadaf Ebrahimi case 15:
306*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disptype = TMS320C64X_MEM_DISP_REGISTER;
307*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.direction = TMS320C64X_MEM_DIR_FW;
308*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.modify = TMS320C64X_MEM_MOD_POST;
309*9a0e4156SSadaf Ebrahimi break;
310*9a0e4156SSadaf Ebrahimi }
311*9a0e4156SSadaf Ebrahimi tms320c64x->op_count++;
312*9a0e4156SSadaf Ebrahimi }
313*9a0e4156SSadaf Ebrahimi }
314*9a0e4156SSadaf Ebrahimi
printMemOperand2(MCInst * MI,unsigned OpNo,SStream * O)315*9a0e4156SSadaf Ebrahimi static void printMemOperand2(MCInst *MI, unsigned OpNo, SStream *O)
316*9a0e4156SSadaf Ebrahimi {
317*9a0e4156SSadaf Ebrahimi MCOperand *Op = MCInst_getOperand(MI, OpNo);
318*9a0e4156SSadaf Ebrahimi int64_t Val = MCOperand_getImm(Op);
319*9a0e4156SSadaf Ebrahimi uint16_t offset;
320*9a0e4156SSadaf Ebrahimi unsigned basereg;
321*9a0e4156SSadaf Ebrahimi cs_tms320c64x *tms320c64x;
322*9a0e4156SSadaf Ebrahimi
323*9a0e4156SSadaf Ebrahimi basereg = Val & 0x7f;
324*9a0e4156SSadaf Ebrahimi offset = (Val >> 7) & 0x7fff;
325*9a0e4156SSadaf Ebrahimi SStream_concat(O, "*+%s[0x%x]", getRegisterName(basereg), offset);
326*9a0e4156SSadaf Ebrahimi
327*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
328*9a0e4156SSadaf Ebrahimi tms320c64x = &MI->flat_insn->detail->tms320c64x;
329*9a0e4156SSadaf Ebrahimi
330*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].type = TMS320C64X_OP_MEM;
331*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.base = basereg;
332*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.unit = 2;
333*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disp = offset;
334*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.disptype = TMS320C64X_MEM_DISP_CONSTANT;
335*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.direction = TMS320C64X_MEM_DIR_FW;
336*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].mem.modify = TMS320C64X_MEM_MOD_NO;
337*9a0e4156SSadaf Ebrahimi tms320c64x->op_count++;
338*9a0e4156SSadaf Ebrahimi }
339*9a0e4156SSadaf Ebrahimi }
340*9a0e4156SSadaf Ebrahimi
printRegPair(MCInst * MI,unsigned OpNo,SStream * O)341*9a0e4156SSadaf Ebrahimi static void printRegPair(MCInst *MI, unsigned OpNo, SStream *O)
342*9a0e4156SSadaf Ebrahimi {
343*9a0e4156SSadaf Ebrahimi MCOperand *Op = MCInst_getOperand(MI, OpNo);
344*9a0e4156SSadaf Ebrahimi unsigned reg = MCOperand_getReg(Op);
345*9a0e4156SSadaf Ebrahimi cs_tms320c64x *tms320c64x;
346*9a0e4156SSadaf Ebrahimi
347*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%s:%s", getRegisterName(reg + 1), getRegisterName(reg));
348*9a0e4156SSadaf Ebrahimi
349*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
350*9a0e4156SSadaf Ebrahimi tms320c64x = &MI->flat_insn->detail->tms320c64x;
351*9a0e4156SSadaf Ebrahimi
352*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].type = TMS320C64X_OP_REGPAIR;
353*9a0e4156SSadaf Ebrahimi tms320c64x->operands[tms320c64x->op_count].reg = reg;
354*9a0e4156SSadaf Ebrahimi tms320c64x->op_count++;
355*9a0e4156SSadaf Ebrahimi }
356*9a0e4156SSadaf Ebrahimi }
357*9a0e4156SSadaf Ebrahimi
printAliasInstruction(MCInst * MI,SStream * O,MCRegisterInfo * MRI)358*9a0e4156SSadaf Ebrahimi static bool printAliasInstruction(MCInst *MI, SStream *O, MCRegisterInfo *MRI)
359*9a0e4156SSadaf Ebrahimi {
360*9a0e4156SSadaf Ebrahimi unsigned opcode = MCInst_getOpcode(MI);
361*9a0e4156SSadaf Ebrahimi MCOperand *op;
362*9a0e4156SSadaf Ebrahimi
363*9a0e4156SSadaf Ebrahimi switch(opcode) {
364*9a0e4156SSadaf Ebrahimi /* ADD.Dx -i, x, y -> SUB.Dx x, i, y */
365*9a0e4156SSadaf Ebrahimi case TMS320C64x_ADD_d2_rir:
366*9a0e4156SSadaf Ebrahimi /* ADD.L -i, x, y -> SUB.L x, i, y */
367*9a0e4156SSadaf Ebrahimi case TMS320C64x_ADD_l1_irr:
368*9a0e4156SSadaf Ebrahimi case TMS320C64x_ADD_l1_ipp:
369*9a0e4156SSadaf Ebrahimi /* ADD.S -i, x, y -> SUB.S x, i, y */
370*9a0e4156SSadaf Ebrahimi case TMS320C64x_ADD_s1_irr:
371*9a0e4156SSadaf Ebrahimi if ((MCInst_getNumOperands(MI) == 3) &&
372*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
373*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
374*9a0e4156SSadaf Ebrahimi MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
375*9a0e4156SSadaf Ebrahimi (MCOperand_getImm(MCInst_getOperand(MI, 2)) < 0)) {
376*9a0e4156SSadaf Ebrahimi
377*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, TMS320C64X_INS_SUB);
378*9a0e4156SSadaf Ebrahimi op = MCInst_getOperand(MI, 2);
379*9a0e4156SSadaf Ebrahimi MCOperand_setImm(op, -MCOperand_getImm(op));
380*9a0e4156SSadaf Ebrahimi
381*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "SUB\t");
382*9a0e4156SSadaf Ebrahimi printOperand(MI, 1, O);
383*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ", ");
384*9a0e4156SSadaf Ebrahimi printOperand(MI, 2, O);
385*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ", ");
386*9a0e4156SSadaf Ebrahimi printOperand(MI, 0, O);
387*9a0e4156SSadaf Ebrahimi
388*9a0e4156SSadaf Ebrahimi return true;
389*9a0e4156SSadaf Ebrahimi }
390*9a0e4156SSadaf Ebrahimi break;
391*9a0e4156SSadaf Ebrahimi }
392*9a0e4156SSadaf Ebrahimi switch(opcode) {
393*9a0e4156SSadaf Ebrahimi /* ADD.D 0, x, y -> MV.D x, y */
394*9a0e4156SSadaf Ebrahimi case TMS320C64x_ADD_d1_rir:
395*9a0e4156SSadaf Ebrahimi /* OR.D x, 0, y -> MV.D x, y */
396*9a0e4156SSadaf Ebrahimi case TMS320C64x_OR_d2_rir:
397*9a0e4156SSadaf Ebrahimi /* ADD.L 0, x, y -> MV.L x, y */
398*9a0e4156SSadaf Ebrahimi case TMS320C64x_ADD_l1_irr:
399*9a0e4156SSadaf Ebrahimi case TMS320C64x_ADD_l1_ipp:
400*9a0e4156SSadaf Ebrahimi /* OR.L 0, x, y -> MV.L x, y */
401*9a0e4156SSadaf Ebrahimi case TMS320C64x_OR_l1_irr:
402*9a0e4156SSadaf Ebrahimi /* ADD.S 0, x, y -> MV.S x, y */
403*9a0e4156SSadaf Ebrahimi case TMS320C64x_ADD_s1_irr:
404*9a0e4156SSadaf Ebrahimi /* OR.S 0, x, y -> MV.S x, y */
405*9a0e4156SSadaf Ebrahimi case TMS320C64x_OR_s1_irr:
406*9a0e4156SSadaf Ebrahimi if ((MCInst_getNumOperands(MI) == 3) &&
407*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
408*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
409*9a0e4156SSadaf Ebrahimi MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
410*9a0e4156SSadaf Ebrahimi (MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0)) {
411*9a0e4156SSadaf Ebrahimi
412*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, TMS320C64X_INS_MV);
413*9a0e4156SSadaf Ebrahimi MI->size--;
414*9a0e4156SSadaf Ebrahimi
415*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "MV\t");
416*9a0e4156SSadaf Ebrahimi printOperand(MI, 1, O);
417*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ", ");
418*9a0e4156SSadaf Ebrahimi printOperand(MI, 0, O);
419*9a0e4156SSadaf Ebrahimi
420*9a0e4156SSadaf Ebrahimi return true;
421*9a0e4156SSadaf Ebrahimi }
422*9a0e4156SSadaf Ebrahimi break;
423*9a0e4156SSadaf Ebrahimi }
424*9a0e4156SSadaf Ebrahimi switch(opcode) {
425*9a0e4156SSadaf Ebrahimi /* XOR.D -1, x, y -> NOT.D x, y */
426*9a0e4156SSadaf Ebrahimi case TMS320C64x_XOR_d2_rir:
427*9a0e4156SSadaf Ebrahimi /* XOR.L -1, x, y -> NOT.L x, y */
428*9a0e4156SSadaf Ebrahimi case TMS320C64x_XOR_l1_irr:
429*9a0e4156SSadaf Ebrahimi /* XOR.S -1, x, y -> NOT.S x, y */
430*9a0e4156SSadaf Ebrahimi case TMS320C64x_XOR_s1_irr:
431*9a0e4156SSadaf Ebrahimi if ((MCInst_getNumOperands(MI) == 3) &&
432*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
433*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
434*9a0e4156SSadaf Ebrahimi MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
435*9a0e4156SSadaf Ebrahimi (MCOperand_getImm(MCInst_getOperand(MI, 2)) == -1)) {
436*9a0e4156SSadaf Ebrahimi
437*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, TMS320C64X_INS_NOT);
438*9a0e4156SSadaf Ebrahimi MI->size--;
439*9a0e4156SSadaf Ebrahimi
440*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "NOT\t");
441*9a0e4156SSadaf Ebrahimi printOperand(MI, 1, O);
442*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ", ");
443*9a0e4156SSadaf Ebrahimi printOperand(MI, 0, O);
444*9a0e4156SSadaf Ebrahimi
445*9a0e4156SSadaf Ebrahimi return true;
446*9a0e4156SSadaf Ebrahimi }
447*9a0e4156SSadaf Ebrahimi break;
448*9a0e4156SSadaf Ebrahimi }
449*9a0e4156SSadaf Ebrahimi switch(opcode) {
450*9a0e4156SSadaf Ebrahimi /* MVK.D 0, x -> ZERO.D x */
451*9a0e4156SSadaf Ebrahimi case TMS320C64x_MVK_d1_rr:
452*9a0e4156SSadaf Ebrahimi /* MVK.L 0, x -> ZERO.L x */
453*9a0e4156SSadaf Ebrahimi case TMS320C64x_MVK_l2_ir:
454*9a0e4156SSadaf Ebrahimi if ((MCInst_getNumOperands(MI) == 2) &&
455*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
456*9a0e4156SSadaf Ebrahimi MCOperand_isImm(MCInst_getOperand(MI, 1)) &&
457*9a0e4156SSadaf Ebrahimi (MCOperand_getImm(MCInst_getOperand(MI, 1)) == 0)) {
458*9a0e4156SSadaf Ebrahimi
459*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, TMS320C64X_INS_ZERO);
460*9a0e4156SSadaf Ebrahimi MI->size--;
461*9a0e4156SSadaf Ebrahimi
462*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "ZERO\t");
463*9a0e4156SSadaf Ebrahimi printOperand(MI, 0, O);
464*9a0e4156SSadaf Ebrahimi
465*9a0e4156SSadaf Ebrahimi return true;
466*9a0e4156SSadaf Ebrahimi }
467*9a0e4156SSadaf Ebrahimi break;
468*9a0e4156SSadaf Ebrahimi }
469*9a0e4156SSadaf Ebrahimi switch(opcode) {
470*9a0e4156SSadaf Ebrahimi /* SUB.L x, x, y -> ZERO.L y */
471*9a0e4156SSadaf Ebrahimi case TMS320C64x_SUB_l1_rrp_x1:
472*9a0e4156SSadaf Ebrahimi /* SUB.S x, x, y -> ZERO.S y */
473*9a0e4156SSadaf Ebrahimi case TMS320C64x_SUB_s1_rrr:
474*9a0e4156SSadaf Ebrahimi if ((MCInst_getNumOperands(MI) == 3) &&
475*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
476*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
477*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
478*9a0e4156SSadaf Ebrahimi (MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
479*9a0e4156SSadaf Ebrahimi
480*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, TMS320C64X_INS_ZERO);
481*9a0e4156SSadaf Ebrahimi MI->size -= 2;
482*9a0e4156SSadaf Ebrahimi
483*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "ZERO\t");
484*9a0e4156SSadaf Ebrahimi printOperand(MI, 0, O);
485*9a0e4156SSadaf Ebrahimi
486*9a0e4156SSadaf Ebrahimi return true;
487*9a0e4156SSadaf Ebrahimi }
488*9a0e4156SSadaf Ebrahimi break;
489*9a0e4156SSadaf Ebrahimi }
490*9a0e4156SSadaf Ebrahimi switch(opcode) {
491*9a0e4156SSadaf Ebrahimi /* SUB.L 0, x, y -> NEG.L x, y */
492*9a0e4156SSadaf Ebrahimi case TMS320C64x_SUB_l1_irr:
493*9a0e4156SSadaf Ebrahimi case TMS320C64x_SUB_l1_ipp:
494*9a0e4156SSadaf Ebrahimi /* SUB.S 0, x, y -> NEG.S x, y */
495*9a0e4156SSadaf Ebrahimi case TMS320C64x_SUB_s1_irr:
496*9a0e4156SSadaf Ebrahimi if ((MCInst_getNumOperands(MI) == 3) &&
497*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
498*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
499*9a0e4156SSadaf Ebrahimi MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
500*9a0e4156SSadaf Ebrahimi (MCOperand_getImm(MCInst_getOperand(MI, 2)) == 0)) {
501*9a0e4156SSadaf Ebrahimi
502*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, TMS320C64X_INS_NEG);
503*9a0e4156SSadaf Ebrahimi MI->size--;
504*9a0e4156SSadaf Ebrahimi
505*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "NEG\t");
506*9a0e4156SSadaf Ebrahimi printOperand(MI, 1, O);
507*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ", ");
508*9a0e4156SSadaf Ebrahimi printOperand(MI, 0, O);
509*9a0e4156SSadaf Ebrahimi
510*9a0e4156SSadaf Ebrahimi return true;
511*9a0e4156SSadaf Ebrahimi }
512*9a0e4156SSadaf Ebrahimi break;
513*9a0e4156SSadaf Ebrahimi }
514*9a0e4156SSadaf Ebrahimi switch(opcode) {
515*9a0e4156SSadaf Ebrahimi /* PACKLH2.L x, x, y -> SWAP2.L x, y */
516*9a0e4156SSadaf Ebrahimi case TMS320C64x_PACKLH2_l1_rrr_x2:
517*9a0e4156SSadaf Ebrahimi /* PACKLH2.S x, x, y -> SWAP2.S x, y */
518*9a0e4156SSadaf Ebrahimi case TMS320C64x_PACKLH2_s1_rrr:
519*9a0e4156SSadaf Ebrahimi if ((MCInst_getNumOperands(MI) == 3) &&
520*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 0)) &&
521*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 1)) &&
522*9a0e4156SSadaf Ebrahimi MCOperand_isReg(MCInst_getOperand(MI, 2)) &&
523*9a0e4156SSadaf Ebrahimi (MCOperand_getReg(MCInst_getOperand(MI, 1)) == MCOperand_getReg(MCInst_getOperand(MI, 2)))) {
524*9a0e4156SSadaf Ebrahimi
525*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, TMS320C64X_INS_SWAP2);
526*9a0e4156SSadaf Ebrahimi MI->size--;
527*9a0e4156SSadaf Ebrahimi
528*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "SWAP2\t");
529*9a0e4156SSadaf Ebrahimi printOperand(MI, 1, O);
530*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ", ");
531*9a0e4156SSadaf Ebrahimi printOperand(MI, 0, O);
532*9a0e4156SSadaf Ebrahimi
533*9a0e4156SSadaf Ebrahimi return true;
534*9a0e4156SSadaf Ebrahimi }
535*9a0e4156SSadaf Ebrahimi break;
536*9a0e4156SSadaf Ebrahimi }
537*9a0e4156SSadaf Ebrahimi switch(opcode) {
538*9a0e4156SSadaf Ebrahimi /* NOP 16 -> IDLE */
539*9a0e4156SSadaf Ebrahimi /* NOP 1 -> NOP */
540*9a0e4156SSadaf Ebrahimi case TMS320C64x_NOP_n:
541*9a0e4156SSadaf Ebrahimi if ((MCInst_getNumOperands(MI) == 1) &&
542*9a0e4156SSadaf Ebrahimi MCOperand_isImm(MCInst_getOperand(MI, 0)) &&
543*9a0e4156SSadaf Ebrahimi (MCOperand_getReg(MCInst_getOperand(MI, 0)) == 16)) {
544*9a0e4156SSadaf Ebrahimi
545*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, TMS320C64X_INS_IDLE);
546*9a0e4156SSadaf Ebrahimi MI->size--;
547*9a0e4156SSadaf Ebrahimi
548*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "IDLE");
549*9a0e4156SSadaf Ebrahimi
550*9a0e4156SSadaf Ebrahimi return true;
551*9a0e4156SSadaf Ebrahimi }
552*9a0e4156SSadaf Ebrahimi if ((MCInst_getNumOperands(MI) == 1) &&
553*9a0e4156SSadaf Ebrahimi MCOperand_isImm(MCInst_getOperand(MI, 0)) &&
554*9a0e4156SSadaf Ebrahimi (MCOperand_getReg(MCInst_getOperand(MI, 0)) == 1)) {
555*9a0e4156SSadaf Ebrahimi
556*9a0e4156SSadaf Ebrahimi MI->size--;
557*9a0e4156SSadaf Ebrahimi
558*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "NOP");
559*9a0e4156SSadaf Ebrahimi
560*9a0e4156SSadaf Ebrahimi return true;
561*9a0e4156SSadaf Ebrahimi }
562*9a0e4156SSadaf Ebrahimi break;
563*9a0e4156SSadaf Ebrahimi }
564*9a0e4156SSadaf Ebrahimi
565*9a0e4156SSadaf Ebrahimi return false;
566*9a0e4156SSadaf Ebrahimi }
567*9a0e4156SSadaf Ebrahimi
TMS320C64x_printInst(MCInst * MI,SStream * O,void * Info)568*9a0e4156SSadaf Ebrahimi void TMS320C64x_printInst(MCInst *MI, SStream *O, void *Info)
569*9a0e4156SSadaf Ebrahimi {
570*9a0e4156SSadaf Ebrahimi if (!printAliasInstruction(MI, O, Info))
571*9a0e4156SSadaf Ebrahimi printInstruction(MI, O, Info);
572*9a0e4156SSadaf Ebrahimi }
573*9a0e4156SSadaf Ebrahimi
574*9a0e4156SSadaf Ebrahimi #endif
575