xref: /aosp_15_r20/external/capstone/arch/TMS320C64x/TMS320C64xInstPrinter.c (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
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