xref: /aosp_15_r20/external/capstone/arch/TMS320C64x/TMS320C64xDisassembler.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 #include <string.h>
7*9a0e4156SSadaf Ebrahimi 
8*9a0e4156SSadaf Ebrahimi #include "../../cs_priv.h"
9*9a0e4156SSadaf Ebrahimi #include "../../utils.h"
10*9a0e4156SSadaf Ebrahimi 
11*9a0e4156SSadaf Ebrahimi #include "TMS320C64xDisassembler.h"
12*9a0e4156SSadaf Ebrahimi 
13*9a0e4156SSadaf Ebrahimi #include "../../MCInst.h"
14*9a0e4156SSadaf Ebrahimi #include "../../MCInstrDesc.h"
15*9a0e4156SSadaf Ebrahimi #include "../../MCFixedLenDisassembler.h"
16*9a0e4156SSadaf Ebrahimi #include "../../MCRegisterInfo.h"
17*9a0e4156SSadaf Ebrahimi #include "../../MCDisassembler.h"
18*9a0e4156SSadaf Ebrahimi #include "../../MathExtras.h"
19*9a0e4156SSadaf Ebrahimi 
20*9a0e4156SSadaf Ebrahimi static uint64_t getFeatureBits(int mode);
21*9a0e4156SSadaf Ebrahimi 
22*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeGPRegsRegisterClass(MCInst *Inst, unsigned RegNo,
23*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
24*9a0e4156SSadaf Ebrahimi 
25*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeControlRegsRegisterClass(MCInst *Inst, unsigned RegNo,
26*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
27*9a0e4156SSadaf Ebrahimi 
28*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeScst5(MCInst *Inst, unsigned Val,
29*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
30*9a0e4156SSadaf Ebrahimi 
31*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeScst16(MCInst *Inst, unsigned Val,
32*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
33*9a0e4156SSadaf Ebrahimi 
34*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodePCRelScst7(MCInst *Inst, unsigned Val,
35*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
36*9a0e4156SSadaf Ebrahimi 
37*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodePCRelScst10(MCInst *Inst, unsigned Val,
38*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
39*9a0e4156SSadaf Ebrahimi 
40*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodePCRelScst12(MCInst *Inst, unsigned Val,
41*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
42*9a0e4156SSadaf Ebrahimi 
43*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodePCRelScst21(MCInst *Inst, unsigned Val,
44*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
45*9a0e4156SSadaf Ebrahimi 
46*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMemOperand(MCInst *Inst, unsigned Val,
47*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
48*9a0e4156SSadaf Ebrahimi 
49*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMemOperandSc(MCInst *Inst, unsigned Val,
50*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
51*9a0e4156SSadaf Ebrahimi 
52*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMemOperand2(MCInst *Inst, unsigned Val,
53*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
54*9a0e4156SSadaf Ebrahimi 
55*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeRegPair5(MCInst *Inst, unsigned RegNo,
56*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
57*9a0e4156SSadaf Ebrahimi 
58*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeRegPair4(MCInst *Inst, unsigned RegNo,
59*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
60*9a0e4156SSadaf Ebrahimi 
61*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeCondRegister(MCInst *Inst, unsigned Val,
62*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
63*9a0e4156SSadaf Ebrahimi 
64*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeCondRegisterZero(MCInst *Inst, unsigned Val,
65*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
66*9a0e4156SSadaf Ebrahimi 
67*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeSide(MCInst *Inst, unsigned Val,
68*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
69*9a0e4156SSadaf Ebrahimi 
70*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeParallel(MCInst *Inst, unsigned Val,
71*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
72*9a0e4156SSadaf Ebrahimi 
73*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeCrosspathX1(MCInst *Inst, unsigned Val,
74*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
75*9a0e4156SSadaf Ebrahimi 
76*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeCrosspathX2(MCInst *Inst, unsigned Val,
77*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
78*9a0e4156SSadaf Ebrahimi 
79*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeCrosspathX3(MCInst *Inst, unsigned Val,
80*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
81*9a0e4156SSadaf Ebrahimi 
82*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeNop(MCInst *Inst, unsigned Val,
83*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder);
84*9a0e4156SSadaf Ebrahimi 
85*9a0e4156SSadaf Ebrahimi #include "TMS320C64xGenDisassemblerTables.inc"
86*9a0e4156SSadaf Ebrahimi 
87*9a0e4156SSadaf Ebrahimi #define GET_REGINFO_ENUM
88*9a0e4156SSadaf Ebrahimi #define GET_REGINFO_MC_DESC
89*9a0e4156SSadaf Ebrahimi #include "TMS320C64xGenRegisterInfo.inc"
90*9a0e4156SSadaf Ebrahimi 
91*9a0e4156SSadaf Ebrahimi static const unsigned GPRegsDecoderTable[] = {
92*9a0e4156SSadaf Ebrahimi 	TMS320C64x_A0,  TMS320C64x_A1,  TMS320C64x_A2,  TMS320C64x_A3,
93*9a0e4156SSadaf Ebrahimi 	TMS320C64x_A4,  TMS320C64x_A5,  TMS320C64x_A6,  TMS320C64x_A7,
94*9a0e4156SSadaf Ebrahimi 	TMS320C64x_A8,  TMS320C64x_A9,  TMS320C64x_A10, TMS320C64x_A11,
95*9a0e4156SSadaf Ebrahimi 	TMS320C64x_A12, TMS320C64x_A13, TMS320C64x_A14, TMS320C64x_A15,
96*9a0e4156SSadaf Ebrahimi 	TMS320C64x_A16, TMS320C64x_A17, TMS320C64x_A18, TMS320C64x_A19,
97*9a0e4156SSadaf Ebrahimi 	TMS320C64x_A20, TMS320C64x_A21, TMS320C64x_A22, TMS320C64x_A23,
98*9a0e4156SSadaf Ebrahimi 	TMS320C64x_A24, TMS320C64x_A25, TMS320C64x_A26, TMS320C64x_A27,
99*9a0e4156SSadaf Ebrahimi 	TMS320C64x_A28, TMS320C64x_A29, TMS320C64x_A30, TMS320C64x_A31
100*9a0e4156SSadaf Ebrahimi };
101*9a0e4156SSadaf Ebrahimi 
102*9a0e4156SSadaf Ebrahimi static const unsigned ControlRegsDecoderTable[] = {
103*9a0e4156SSadaf Ebrahimi 	TMS320C64x_AMR,    TMS320C64x_CSR,  TMS320C64x_ISR,   TMS320C64x_ICR,
104*9a0e4156SSadaf Ebrahimi 	TMS320C64x_IER,    TMS320C64x_ISTP, TMS320C64x_IRP,   TMS320C64x_NRP,
105*9a0e4156SSadaf Ebrahimi 	~0U,               ~0U,             TMS320C64x_TSCL,  TMS320C64x_TSCH,
106*9a0e4156SSadaf Ebrahimi 	~0U,               TMS320C64x_ILC,  TMS320C64x_RILC,  TMS320C64x_REP,
107*9a0e4156SSadaf Ebrahimi 	TMS320C64x_PCE1,   TMS320C64x_DNUM, ~0U,              ~0U,
108*9a0e4156SSadaf Ebrahimi 	~0U,               TMS320C64x_SSR,  TMS320C64x_GPLYA, TMS320C64x_GPLYB,
109*9a0e4156SSadaf Ebrahimi 	TMS320C64x_GFPGFR, TMS320C64x_DIER, TMS320C64x_TSR,   TMS320C64x_ITSR,
110*9a0e4156SSadaf Ebrahimi 	TMS320C64x_NTSR,   TMS320C64x_ECR,  ~0U,              TMS320C64x_IERR
111*9a0e4156SSadaf Ebrahimi };
112*9a0e4156SSadaf Ebrahimi 
getFeatureBits(int mode)113*9a0e4156SSadaf Ebrahimi static uint64_t getFeatureBits(int mode)
114*9a0e4156SSadaf Ebrahimi {
115*9a0e4156SSadaf Ebrahimi 	// support everything
116*9a0e4156SSadaf Ebrahimi 	return (uint64_t)-1;
117*9a0e4156SSadaf Ebrahimi }
118*9a0e4156SSadaf Ebrahimi 
getReg(const unsigned * RegTable,unsigned RegNo)119*9a0e4156SSadaf Ebrahimi static unsigned getReg(const unsigned *RegTable, unsigned RegNo)
120*9a0e4156SSadaf Ebrahimi {
121*9a0e4156SSadaf Ebrahimi 	if(RegNo > 31)
122*9a0e4156SSadaf Ebrahimi 		return ~0U;
123*9a0e4156SSadaf Ebrahimi 	return RegTable[RegNo];
124*9a0e4156SSadaf Ebrahimi }
125*9a0e4156SSadaf Ebrahimi 
DecodeGPRegsRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Address,void * Decoder)126*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeGPRegsRegisterClass(MCInst *Inst, unsigned RegNo,
127*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
128*9a0e4156SSadaf Ebrahimi {
129*9a0e4156SSadaf Ebrahimi 	unsigned Reg;
130*9a0e4156SSadaf Ebrahimi 
131*9a0e4156SSadaf Ebrahimi 	if(RegNo > 31)
132*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
133*9a0e4156SSadaf Ebrahimi 
134*9a0e4156SSadaf Ebrahimi 	Reg = getReg(GPRegsDecoderTable, RegNo);
135*9a0e4156SSadaf Ebrahimi 	if(Reg == ~0U)
136*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
137*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Reg);
138*9a0e4156SSadaf Ebrahimi 
139*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
140*9a0e4156SSadaf Ebrahimi }
141*9a0e4156SSadaf Ebrahimi 
DecodeControlRegsRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Address,void * Decoder)142*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeControlRegsRegisterClass(MCInst *Inst, unsigned RegNo,
143*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
144*9a0e4156SSadaf Ebrahimi {
145*9a0e4156SSadaf Ebrahimi 	unsigned Reg;
146*9a0e4156SSadaf Ebrahimi 
147*9a0e4156SSadaf Ebrahimi 	if(RegNo > 31)
148*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
149*9a0e4156SSadaf Ebrahimi 
150*9a0e4156SSadaf Ebrahimi 	Reg = getReg(ControlRegsDecoderTable, RegNo);
151*9a0e4156SSadaf Ebrahimi 	if(Reg == ~0U)
152*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
153*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Reg);
154*9a0e4156SSadaf Ebrahimi 
155*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
156*9a0e4156SSadaf Ebrahimi }
157*9a0e4156SSadaf Ebrahimi 
DecodeScst5(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)158*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeScst5(MCInst *Inst, unsigned Val,
159*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
160*9a0e4156SSadaf Ebrahimi {
161*9a0e4156SSadaf Ebrahimi 	int32_t imm;
162*9a0e4156SSadaf Ebrahimi 
163*9a0e4156SSadaf Ebrahimi 	imm = Val;
164*9a0e4156SSadaf Ebrahimi 	/* Sign extend 5 bit value */
165*9a0e4156SSadaf Ebrahimi 	if(imm & (1 << (5 - 1)))
166*9a0e4156SSadaf Ebrahimi 		imm |= ~((1 << 5) - 1);
167*9a0e4156SSadaf Ebrahimi 
168*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, imm);
169*9a0e4156SSadaf Ebrahimi 
170*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
171*9a0e4156SSadaf Ebrahimi }
172*9a0e4156SSadaf Ebrahimi 
DecodeScst16(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)173*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeScst16(MCInst *Inst, unsigned Val,
174*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
175*9a0e4156SSadaf Ebrahimi {
176*9a0e4156SSadaf Ebrahimi 	int32_t imm;
177*9a0e4156SSadaf Ebrahimi 
178*9a0e4156SSadaf Ebrahimi 	imm = Val;
179*9a0e4156SSadaf Ebrahimi 	/* Sign extend 16 bit value */
180*9a0e4156SSadaf Ebrahimi 	if(imm & (1 << (16 - 1)))
181*9a0e4156SSadaf Ebrahimi 		imm |= ~((1 << 16) - 1);
182*9a0e4156SSadaf Ebrahimi 
183*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, imm);
184*9a0e4156SSadaf Ebrahimi 
185*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
186*9a0e4156SSadaf Ebrahimi }
187*9a0e4156SSadaf Ebrahimi 
DecodePCRelScst7(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)188*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodePCRelScst7(MCInst *Inst, unsigned Val,
189*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
190*9a0e4156SSadaf Ebrahimi {
191*9a0e4156SSadaf Ebrahimi 	int32_t imm;
192*9a0e4156SSadaf Ebrahimi 
193*9a0e4156SSadaf Ebrahimi 	imm = Val;
194*9a0e4156SSadaf Ebrahimi 	/* Sign extend 7 bit value */
195*9a0e4156SSadaf Ebrahimi 	if(imm & (1 << (7 - 1)))
196*9a0e4156SSadaf Ebrahimi 		imm |= ~((1 << 7) - 1);
197*9a0e4156SSadaf Ebrahimi 
198*9a0e4156SSadaf Ebrahimi 	/* Address is relative to the address of the first instruction in the fetch packet */
199*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, (Address & ~31) + (imm * 4));
200*9a0e4156SSadaf Ebrahimi 
201*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
202*9a0e4156SSadaf Ebrahimi }
203*9a0e4156SSadaf Ebrahimi 
DecodePCRelScst10(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)204*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodePCRelScst10(MCInst *Inst, unsigned Val,
205*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
206*9a0e4156SSadaf Ebrahimi {
207*9a0e4156SSadaf Ebrahimi 	int32_t imm;
208*9a0e4156SSadaf Ebrahimi 
209*9a0e4156SSadaf Ebrahimi 	imm = Val;
210*9a0e4156SSadaf Ebrahimi 	/* Sign extend 10 bit value */
211*9a0e4156SSadaf Ebrahimi 	if(imm & (1 << (10 - 1)))
212*9a0e4156SSadaf Ebrahimi 		imm |= ~((1 << 10) - 1);
213*9a0e4156SSadaf Ebrahimi 
214*9a0e4156SSadaf Ebrahimi 	/* Address is relative to the address of the first instruction in the fetch packet */
215*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, (Address & ~31) + (imm * 4));
216*9a0e4156SSadaf Ebrahimi 
217*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
218*9a0e4156SSadaf Ebrahimi }
219*9a0e4156SSadaf Ebrahimi 
DecodePCRelScst12(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)220*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodePCRelScst12(MCInst *Inst, unsigned Val,
221*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
222*9a0e4156SSadaf Ebrahimi {
223*9a0e4156SSadaf Ebrahimi 	int32_t imm;
224*9a0e4156SSadaf Ebrahimi 
225*9a0e4156SSadaf Ebrahimi 	imm = Val;
226*9a0e4156SSadaf Ebrahimi 	/* Sign extend 12 bit value */
227*9a0e4156SSadaf Ebrahimi 	if(imm & (1 << (12 - 1)))
228*9a0e4156SSadaf Ebrahimi 		imm |= ~((1 << 12) - 1);
229*9a0e4156SSadaf Ebrahimi 
230*9a0e4156SSadaf Ebrahimi 	/* Address is relative to the address of the first instruction in the fetch packet */
231*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, (Address & ~31) + (imm * 4));
232*9a0e4156SSadaf Ebrahimi 
233*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
234*9a0e4156SSadaf Ebrahimi }
235*9a0e4156SSadaf Ebrahimi 
DecodePCRelScst21(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)236*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodePCRelScst21(MCInst *Inst, unsigned Val,
237*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
238*9a0e4156SSadaf Ebrahimi {
239*9a0e4156SSadaf Ebrahimi 	int32_t imm;
240*9a0e4156SSadaf Ebrahimi 
241*9a0e4156SSadaf Ebrahimi 	imm = Val;
242*9a0e4156SSadaf Ebrahimi 	/* Sign extend 21 bit value */
243*9a0e4156SSadaf Ebrahimi 	if(imm & (1 << (21 - 1)))
244*9a0e4156SSadaf Ebrahimi 		imm |= ~((1 << 21) - 1);
245*9a0e4156SSadaf Ebrahimi 
246*9a0e4156SSadaf Ebrahimi 	/* Address is relative to the address of the first instruction in the fetch packet */
247*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, (Address & ~31) + (imm * 4));
248*9a0e4156SSadaf Ebrahimi 
249*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
250*9a0e4156SSadaf Ebrahimi }
251*9a0e4156SSadaf Ebrahimi 
DecodeMemOperand(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)252*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMemOperand(MCInst *Inst, unsigned Val,
253*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
254*9a0e4156SSadaf Ebrahimi {
255*9a0e4156SSadaf Ebrahimi 	return DecodeMemOperandSc(Inst, Val | (1 << 15), Address, Decoder);
256*9a0e4156SSadaf Ebrahimi }
257*9a0e4156SSadaf Ebrahimi 
DecodeMemOperandSc(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)258*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMemOperandSc(MCInst *Inst, unsigned Val,
259*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
260*9a0e4156SSadaf Ebrahimi {
261*9a0e4156SSadaf Ebrahimi 	uint8_t scaled, base, offset, mode, unit;
262*9a0e4156SSadaf Ebrahimi 	unsigned basereg, offsetreg;
263*9a0e4156SSadaf Ebrahimi 
264*9a0e4156SSadaf Ebrahimi 	scaled = (Val >> 15) & 1;
265*9a0e4156SSadaf Ebrahimi 	base = (Val >> 10) & 0x1f;
266*9a0e4156SSadaf Ebrahimi 	offset = (Val >> 5) & 0x1f;
267*9a0e4156SSadaf Ebrahimi 	mode = (Val >> 1) & 0xf;
268*9a0e4156SSadaf Ebrahimi 	unit = Val & 1;
269*9a0e4156SSadaf Ebrahimi 
270*9a0e4156SSadaf Ebrahimi 	if((base >= TMS320C64X_REG_A0) && (base <= TMS320C64X_REG_A31))
271*9a0e4156SSadaf Ebrahimi 		base = (base - TMS320C64X_REG_A0 + TMS320C64X_REG_B0);
272*9a0e4156SSadaf Ebrahimi 	else if((base >= TMS320C64X_REG_B0) && (base <= TMS320C64X_REG_B31))
273*9a0e4156SSadaf Ebrahimi 		base = (base - TMS320C64X_REG_B0 + TMS320C64X_REG_A0);
274*9a0e4156SSadaf Ebrahimi 	basereg = getReg(GPRegsDecoderTable, base);
275*9a0e4156SSadaf Ebrahimi 	if (basereg ==  ~0U)
276*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
277*9a0e4156SSadaf Ebrahimi 
278*9a0e4156SSadaf Ebrahimi 	switch(mode) {
279*9a0e4156SSadaf Ebrahimi 		case 0:
280*9a0e4156SSadaf Ebrahimi 		case 1:
281*9a0e4156SSadaf Ebrahimi 		case 8:
282*9a0e4156SSadaf Ebrahimi 		case 9:
283*9a0e4156SSadaf Ebrahimi 		case 10:
284*9a0e4156SSadaf Ebrahimi 		case 11:
285*9a0e4156SSadaf Ebrahimi 			MCOperand_CreateImm0(Inst, (scaled << 19) | (basereg << 12) | (offset << 5) | (mode << 1) | unit);
286*9a0e4156SSadaf Ebrahimi 			break;
287*9a0e4156SSadaf Ebrahimi 		case 4:
288*9a0e4156SSadaf Ebrahimi 		case 5:
289*9a0e4156SSadaf Ebrahimi 		case 12:
290*9a0e4156SSadaf Ebrahimi 		case 13:
291*9a0e4156SSadaf Ebrahimi 		case 14:
292*9a0e4156SSadaf Ebrahimi 		case 15:
293*9a0e4156SSadaf Ebrahimi 			if((offset >= TMS320C64X_REG_A0) && (offset <= TMS320C64X_REG_A31))
294*9a0e4156SSadaf Ebrahimi 				offset = (offset - TMS320C64X_REG_A0 + TMS320C64X_REG_B0);
295*9a0e4156SSadaf Ebrahimi 			else if((offset >= TMS320C64X_REG_B0) && (offset <= TMS320C64X_REG_B31))
296*9a0e4156SSadaf Ebrahimi 				offset = (offset - TMS320C64X_REG_B0 + TMS320C64X_REG_A0);
297*9a0e4156SSadaf Ebrahimi 			offsetreg = getReg(GPRegsDecoderTable, offset);
298*9a0e4156SSadaf Ebrahimi 			if (offsetreg ==  ~0U)
299*9a0e4156SSadaf Ebrahimi 				return MCDisassembler_Fail;
300*9a0e4156SSadaf Ebrahimi 			MCOperand_CreateImm0(Inst, (scaled << 19) | (basereg << 12) | (offsetreg << 5) | (mode << 1) | unit);
301*9a0e4156SSadaf Ebrahimi 			break;
302*9a0e4156SSadaf Ebrahimi 		default:
303*9a0e4156SSadaf Ebrahimi 			return MCDisassembler_Fail;
304*9a0e4156SSadaf Ebrahimi 	}
305*9a0e4156SSadaf Ebrahimi 
306*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
307*9a0e4156SSadaf Ebrahimi }
308*9a0e4156SSadaf Ebrahimi 
DecodeMemOperand2(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)309*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMemOperand2(MCInst *Inst, unsigned Val,
310*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
311*9a0e4156SSadaf Ebrahimi {
312*9a0e4156SSadaf Ebrahimi 	uint16_t offset;
313*9a0e4156SSadaf Ebrahimi 	unsigned basereg;
314*9a0e4156SSadaf Ebrahimi 
315*9a0e4156SSadaf Ebrahimi 	if(Val & 1)
316*9a0e4156SSadaf Ebrahimi 		basereg = TMS320C64X_REG_B15;
317*9a0e4156SSadaf Ebrahimi 	else
318*9a0e4156SSadaf Ebrahimi 		basereg = TMS320C64X_REG_B14;
319*9a0e4156SSadaf Ebrahimi 
320*9a0e4156SSadaf Ebrahimi 	offset = (Val >> 1) & 0x7fff;
321*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, (offset << 7) | basereg);
322*9a0e4156SSadaf Ebrahimi 
323*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
324*9a0e4156SSadaf Ebrahimi }
325*9a0e4156SSadaf Ebrahimi 
DecodeRegPair5(MCInst * Inst,unsigned RegNo,uint64_t Address,void * Decoder)326*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeRegPair5(MCInst *Inst, unsigned RegNo,
327*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
328*9a0e4156SSadaf Ebrahimi {
329*9a0e4156SSadaf Ebrahimi 	unsigned Reg;
330*9a0e4156SSadaf Ebrahimi 
331*9a0e4156SSadaf Ebrahimi 	if(RegNo > 31)
332*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
333*9a0e4156SSadaf Ebrahimi 
334*9a0e4156SSadaf Ebrahimi 	Reg = getReg(GPRegsDecoderTable, RegNo);
335*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Reg);
336*9a0e4156SSadaf Ebrahimi 
337*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
338*9a0e4156SSadaf Ebrahimi }
339*9a0e4156SSadaf Ebrahimi 
DecodeRegPair4(MCInst * Inst,unsigned RegNo,uint64_t Address,void * Decoder)340*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeRegPair4(MCInst *Inst, unsigned RegNo,
341*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
342*9a0e4156SSadaf Ebrahimi {
343*9a0e4156SSadaf Ebrahimi 	unsigned Reg;
344*9a0e4156SSadaf Ebrahimi 
345*9a0e4156SSadaf Ebrahimi 	if(RegNo > 15)
346*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
347*9a0e4156SSadaf Ebrahimi 
348*9a0e4156SSadaf Ebrahimi 	Reg = getReg(GPRegsDecoderTable, RegNo << 1);
349*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Reg);
350*9a0e4156SSadaf Ebrahimi 
351*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
352*9a0e4156SSadaf Ebrahimi }
353*9a0e4156SSadaf Ebrahimi 
DecodeCondRegister(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)354*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeCondRegister(MCInst *Inst, unsigned Val,
355*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
356*9a0e4156SSadaf Ebrahimi {
357*9a0e4156SSadaf Ebrahimi 	DecodeStatus ret = MCDisassembler_Success;
358*9a0e4156SSadaf Ebrahimi 
359*9a0e4156SSadaf Ebrahimi 	if(!Inst->flat_insn->detail)
360*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Success;
361*9a0e4156SSadaf Ebrahimi 
362*9a0e4156SSadaf Ebrahimi 	switch(Val) {
363*9a0e4156SSadaf Ebrahimi 		case 0:
364*9a0e4156SSadaf Ebrahimi 		case 7:
365*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.condition.reg = TMS320C64X_REG_INVALID;
366*9a0e4156SSadaf Ebrahimi 			break;
367*9a0e4156SSadaf Ebrahimi 		case 1:
368*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.condition.reg = TMS320C64X_REG_B0;
369*9a0e4156SSadaf Ebrahimi 			break;
370*9a0e4156SSadaf Ebrahimi 		case 2:
371*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.condition.reg = TMS320C64X_REG_B1;
372*9a0e4156SSadaf Ebrahimi 			break;
373*9a0e4156SSadaf Ebrahimi 		case 3:
374*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.condition.reg = TMS320C64X_REG_B2;
375*9a0e4156SSadaf Ebrahimi 			break;
376*9a0e4156SSadaf Ebrahimi 		case 4:
377*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.condition.reg = TMS320C64X_REG_A1;
378*9a0e4156SSadaf Ebrahimi 			break;
379*9a0e4156SSadaf Ebrahimi 		case 5:
380*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.condition.reg = TMS320C64X_REG_A2;
381*9a0e4156SSadaf Ebrahimi 			break;
382*9a0e4156SSadaf Ebrahimi 		case 6:
383*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.condition.reg = TMS320C64X_REG_A0;
384*9a0e4156SSadaf Ebrahimi 			break;
385*9a0e4156SSadaf Ebrahimi 		default:
386*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.condition.reg = TMS320C64X_REG_INVALID;
387*9a0e4156SSadaf Ebrahimi 			ret = MCDisassembler_Fail;
388*9a0e4156SSadaf Ebrahimi 			break;
389*9a0e4156SSadaf Ebrahimi 	}
390*9a0e4156SSadaf Ebrahimi 
391*9a0e4156SSadaf Ebrahimi 	return ret;
392*9a0e4156SSadaf Ebrahimi }
393*9a0e4156SSadaf Ebrahimi 
DecodeCondRegisterZero(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)394*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeCondRegisterZero(MCInst *Inst, unsigned Val,
395*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
396*9a0e4156SSadaf Ebrahimi {
397*9a0e4156SSadaf Ebrahimi 	DecodeStatus ret = MCDisassembler_Success;
398*9a0e4156SSadaf Ebrahimi 
399*9a0e4156SSadaf Ebrahimi 	if(!Inst->flat_insn->detail)
400*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Success;
401*9a0e4156SSadaf Ebrahimi 
402*9a0e4156SSadaf Ebrahimi 	switch(Val) {
403*9a0e4156SSadaf Ebrahimi 		case 0:
404*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.condition.zero = 0;
405*9a0e4156SSadaf Ebrahimi 			break;
406*9a0e4156SSadaf Ebrahimi 		case 1:
407*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.condition.zero = 1;
408*9a0e4156SSadaf Ebrahimi 			break;
409*9a0e4156SSadaf Ebrahimi 		default:
410*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.condition.zero = 0;
411*9a0e4156SSadaf Ebrahimi 			ret = MCDisassembler_Fail;
412*9a0e4156SSadaf Ebrahimi 			break;
413*9a0e4156SSadaf Ebrahimi 	}
414*9a0e4156SSadaf Ebrahimi 
415*9a0e4156SSadaf Ebrahimi 	return ret;
416*9a0e4156SSadaf Ebrahimi }
417*9a0e4156SSadaf Ebrahimi 
DecodeSide(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)418*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeSide(MCInst *Inst, unsigned Val,
419*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
420*9a0e4156SSadaf Ebrahimi {
421*9a0e4156SSadaf Ebrahimi 	DecodeStatus ret = MCDisassembler_Success;
422*9a0e4156SSadaf Ebrahimi 	MCOperand *op;
423*9a0e4156SSadaf Ebrahimi 	int i;
424*9a0e4156SSadaf Ebrahimi 
425*9a0e4156SSadaf Ebrahimi 	/* This is pretty messy, probably we should find a better way */
426*9a0e4156SSadaf Ebrahimi 	if(Val == 1) {
427*9a0e4156SSadaf Ebrahimi 		for(i = 0; i < Inst->size; i++) {
428*9a0e4156SSadaf Ebrahimi 			op = &Inst->Operands[i];
429*9a0e4156SSadaf Ebrahimi 			if(op->Kind == kRegister) {
430*9a0e4156SSadaf Ebrahimi 				if((op->RegVal >= TMS320C64X_REG_A0) && (op->RegVal <= TMS320C64X_REG_A31))
431*9a0e4156SSadaf Ebrahimi 					op->RegVal = (op->RegVal - TMS320C64X_REG_A0 + TMS320C64X_REG_B0);
432*9a0e4156SSadaf Ebrahimi 				else if((op->RegVal >= TMS320C64X_REG_B0) && (op->RegVal <= TMS320C64X_REG_B31))
433*9a0e4156SSadaf Ebrahimi 					op->RegVal = (op->RegVal - TMS320C64X_REG_B0 + TMS320C64X_REG_A0);
434*9a0e4156SSadaf Ebrahimi 			}
435*9a0e4156SSadaf Ebrahimi 		}
436*9a0e4156SSadaf Ebrahimi 	}
437*9a0e4156SSadaf Ebrahimi 
438*9a0e4156SSadaf Ebrahimi 	if(!Inst->flat_insn->detail)
439*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Success;
440*9a0e4156SSadaf Ebrahimi 
441*9a0e4156SSadaf Ebrahimi 	switch(Val) {
442*9a0e4156SSadaf Ebrahimi 		case 0:
443*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.funit.side = 1;
444*9a0e4156SSadaf Ebrahimi 			break;
445*9a0e4156SSadaf Ebrahimi 		case 1:
446*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.funit.side = 2;
447*9a0e4156SSadaf Ebrahimi 			break;
448*9a0e4156SSadaf Ebrahimi 		default:
449*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.funit.side = 0;
450*9a0e4156SSadaf Ebrahimi 			ret = MCDisassembler_Fail;
451*9a0e4156SSadaf Ebrahimi 			break;
452*9a0e4156SSadaf Ebrahimi 	}
453*9a0e4156SSadaf Ebrahimi 
454*9a0e4156SSadaf Ebrahimi 	return ret;
455*9a0e4156SSadaf Ebrahimi }
456*9a0e4156SSadaf Ebrahimi 
DecodeParallel(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)457*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeParallel(MCInst *Inst, unsigned Val,
458*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
459*9a0e4156SSadaf Ebrahimi {
460*9a0e4156SSadaf Ebrahimi 	DecodeStatus ret = MCDisassembler_Success;
461*9a0e4156SSadaf Ebrahimi 
462*9a0e4156SSadaf Ebrahimi 	if(!Inst->flat_insn->detail)
463*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Success;
464*9a0e4156SSadaf Ebrahimi 
465*9a0e4156SSadaf Ebrahimi 	switch(Val) {
466*9a0e4156SSadaf Ebrahimi 		case 0:
467*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.parallel = 0;
468*9a0e4156SSadaf Ebrahimi 			break;
469*9a0e4156SSadaf Ebrahimi 		case 1:
470*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.parallel = 1;
471*9a0e4156SSadaf Ebrahimi 			break;
472*9a0e4156SSadaf Ebrahimi 		default:
473*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.parallel = -1;
474*9a0e4156SSadaf Ebrahimi 			ret = MCDisassembler_Fail;
475*9a0e4156SSadaf Ebrahimi 			break;
476*9a0e4156SSadaf Ebrahimi 	}
477*9a0e4156SSadaf Ebrahimi 
478*9a0e4156SSadaf Ebrahimi 	return ret;
479*9a0e4156SSadaf Ebrahimi }
480*9a0e4156SSadaf Ebrahimi 
DecodeCrosspathX1(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)481*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeCrosspathX1(MCInst *Inst, unsigned Val,
482*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
483*9a0e4156SSadaf Ebrahimi {
484*9a0e4156SSadaf Ebrahimi 	DecodeStatus ret = MCDisassembler_Success;
485*9a0e4156SSadaf Ebrahimi 	MCOperand *op;
486*9a0e4156SSadaf Ebrahimi 
487*9a0e4156SSadaf Ebrahimi 	if(!Inst->flat_insn->detail)
488*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Success;
489*9a0e4156SSadaf Ebrahimi 
490*9a0e4156SSadaf Ebrahimi 	switch(Val) {
491*9a0e4156SSadaf Ebrahimi 		case 0:
492*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.funit.crosspath = 0;
493*9a0e4156SSadaf Ebrahimi 			break;
494*9a0e4156SSadaf Ebrahimi 		case 1:
495*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.funit.crosspath = 1;
496*9a0e4156SSadaf Ebrahimi 			op = &Inst->Operands[0];
497*9a0e4156SSadaf Ebrahimi 			if(op->Kind == kRegister) {
498*9a0e4156SSadaf Ebrahimi 				if((op->RegVal >= TMS320C64X_REG_A0) && (op->RegVal <= TMS320C64X_REG_A31))
499*9a0e4156SSadaf Ebrahimi 					op->RegVal = (op->RegVal - TMS320C64X_REG_A0 + TMS320C64X_REG_B0);
500*9a0e4156SSadaf Ebrahimi 				else if((op->RegVal >= TMS320C64X_REG_B0) && (op->RegVal <= TMS320C64X_REG_B31))
501*9a0e4156SSadaf Ebrahimi 					op->RegVal = (op->RegVal - TMS320C64X_REG_B0 + TMS320C64X_REG_A0);
502*9a0e4156SSadaf Ebrahimi 			}
503*9a0e4156SSadaf Ebrahimi 			break;
504*9a0e4156SSadaf Ebrahimi 		default:
505*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.funit.crosspath = -1;
506*9a0e4156SSadaf Ebrahimi 			ret = MCDisassembler_Fail;
507*9a0e4156SSadaf Ebrahimi 			break;
508*9a0e4156SSadaf Ebrahimi 	}
509*9a0e4156SSadaf Ebrahimi 
510*9a0e4156SSadaf Ebrahimi 	return ret;
511*9a0e4156SSadaf Ebrahimi }
512*9a0e4156SSadaf Ebrahimi 
DecodeCrosspathX2(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)513*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeCrosspathX2(MCInst *Inst, unsigned Val,
514*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
515*9a0e4156SSadaf Ebrahimi {
516*9a0e4156SSadaf Ebrahimi 	DecodeStatus ret = MCDisassembler_Success;
517*9a0e4156SSadaf Ebrahimi 	MCOperand *op;
518*9a0e4156SSadaf Ebrahimi 
519*9a0e4156SSadaf Ebrahimi 	if(!Inst->flat_insn->detail)
520*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Success;
521*9a0e4156SSadaf Ebrahimi 
522*9a0e4156SSadaf Ebrahimi 	switch(Val) {
523*9a0e4156SSadaf Ebrahimi 		case 0:
524*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.funit.crosspath = 0;
525*9a0e4156SSadaf Ebrahimi 			break;
526*9a0e4156SSadaf Ebrahimi 		case 1:
527*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.funit.crosspath = 1;
528*9a0e4156SSadaf Ebrahimi 			op = &Inst->Operands[1];
529*9a0e4156SSadaf Ebrahimi 			if(op->Kind == kRegister) {
530*9a0e4156SSadaf Ebrahimi 				if((op->RegVal >= TMS320C64X_REG_A0) && (op->RegVal <= TMS320C64X_REG_A31))
531*9a0e4156SSadaf Ebrahimi 					op->RegVal = (op->RegVal - TMS320C64X_REG_A0 + TMS320C64X_REG_B0);
532*9a0e4156SSadaf Ebrahimi 				else if((op->RegVal >= TMS320C64X_REG_B0) && (op->RegVal <= TMS320C64X_REG_B31))
533*9a0e4156SSadaf Ebrahimi 					op->RegVal = (op->RegVal - TMS320C64X_REG_B0 + TMS320C64X_REG_A0);
534*9a0e4156SSadaf Ebrahimi 			}
535*9a0e4156SSadaf Ebrahimi 			break;
536*9a0e4156SSadaf Ebrahimi 		default:
537*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.funit.crosspath = -1;
538*9a0e4156SSadaf Ebrahimi 			ret = MCDisassembler_Fail;
539*9a0e4156SSadaf Ebrahimi 			break;
540*9a0e4156SSadaf Ebrahimi 	}
541*9a0e4156SSadaf Ebrahimi 
542*9a0e4156SSadaf Ebrahimi 	return ret;
543*9a0e4156SSadaf Ebrahimi }
544*9a0e4156SSadaf Ebrahimi 
DecodeCrosspathX3(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)545*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeCrosspathX3(MCInst *Inst, unsigned Val,
546*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
547*9a0e4156SSadaf Ebrahimi {
548*9a0e4156SSadaf Ebrahimi 	DecodeStatus ret = MCDisassembler_Success;
549*9a0e4156SSadaf Ebrahimi 	MCOperand *op;
550*9a0e4156SSadaf Ebrahimi 
551*9a0e4156SSadaf Ebrahimi 	if(!Inst->flat_insn->detail)
552*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Success;
553*9a0e4156SSadaf Ebrahimi 
554*9a0e4156SSadaf Ebrahimi 	switch(Val) {
555*9a0e4156SSadaf Ebrahimi 		case 0:
556*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.funit.crosspath = 0;
557*9a0e4156SSadaf Ebrahimi 			break;
558*9a0e4156SSadaf Ebrahimi 		case 1:
559*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.funit.crosspath = 2;
560*9a0e4156SSadaf Ebrahimi 			op = &Inst->Operands[2];
561*9a0e4156SSadaf Ebrahimi 			if(op->Kind == kRegister) {
562*9a0e4156SSadaf Ebrahimi 				if((op->RegVal >= TMS320C64X_REG_A0) && (op->RegVal <= TMS320C64X_REG_A31))
563*9a0e4156SSadaf Ebrahimi 					op->RegVal = (op->RegVal - TMS320C64X_REG_A0 + TMS320C64X_REG_B0);
564*9a0e4156SSadaf Ebrahimi 				else if((op->RegVal >= TMS320C64X_REG_B0) && (op->RegVal <= TMS320C64X_REG_B31))
565*9a0e4156SSadaf Ebrahimi 					op->RegVal = (op->RegVal - TMS320C64X_REG_B0 + TMS320C64X_REG_A0);
566*9a0e4156SSadaf Ebrahimi 			}
567*9a0e4156SSadaf Ebrahimi 			break;
568*9a0e4156SSadaf Ebrahimi 		default:
569*9a0e4156SSadaf Ebrahimi 			Inst->flat_insn->detail->tms320c64x.funit.crosspath = -1;
570*9a0e4156SSadaf Ebrahimi 			ret = MCDisassembler_Fail;
571*9a0e4156SSadaf Ebrahimi 			break;
572*9a0e4156SSadaf Ebrahimi 	}
573*9a0e4156SSadaf Ebrahimi 
574*9a0e4156SSadaf Ebrahimi 	return ret;
575*9a0e4156SSadaf Ebrahimi }
576*9a0e4156SSadaf Ebrahimi 
577*9a0e4156SSadaf Ebrahimi 
DecodeNop(MCInst * Inst,unsigned Val,uint64_t Address,void * Decoder)578*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeNop(MCInst *Inst, unsigned Val,
579*9a0e4156SSadaf Ebrahimi 		uint64_t Address, void *Decoder)
580*9a0e4156SSadaf Ebrahimi {
581*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, Val + 1);
582*9a0e4156SSadaf Ebrahimi 
583*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
584*9a0e4156SSadaf Ebrahimi }
585*9a0e4156SSadaf Ebrahimi 
586*9a0e4156SSadaf Ebrahimi #define GET_INSTRINFO_ENUM
587*9a0e4156SSadaf Ebrahimi #include "TMS320C64xGenInstrInfo.inc"
588*9a0e4156SSadaf Ebrahimi 
TMS320C64x_getInstruction(csh ud,const uint8_t * code,size_t code_len,MCInst * MI,uint16_t * size,uint64_t address,void * info)589*9a0e4156SSadaf Ebrahimi bool TMS320C64x_getInstruction(csh ud, const uint8_t *code, size_t code_len,
590*9a0e4156SSadaf Ebrahimi 		MCInst *MI, uint16_t *size, uint64_t address, void *info)
591*9a0e4156SSadaf Ebrahimi {
592*9a0e4156SSadaf Ebrahimi 	uint32_t insn;
593*9a0e4156SSadaf Ebrahimi 	DecodeStatus result;
594*9a0e4156SSadaf Ebrahimi 
595*9a0e4156SSadaf Ebrahimi 	if(code_len < 4) {
596*9a0e4156SSadaf Ebrahimi 		*size = 0;
597*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
598*9a0e4156SSadaf Ebrahimi 	}
599*9a0e4156SSadaf Ebrahimi 
600*9a0e4156SSadaf Ebrahimi 	if(MI->flat_insn->detail)
601*9a0e4156SSadaf Ebrahimi 		memset(MI->flat_insn->detail, 0, offsetof(cs_detail, tms320c64x)+sizeof(cs_tms320c64x));
602*9a0e4156SSadaf Ebrahimi 
603*9a0e4156SSadaf Ebrahimi 	insn = (code[3] << 0) | (code[2] << 8) | (code[1] << 16) | ((uint32_t) code[0] << 24);
604*9a0e4156SSadaf Ebrahimi 	result = decodeInstruction_4(DecoderTable32, MI, insn, address, info, 0);
605*9a0e4156SSadaf Ebrahimi 
606*9a0e4156SSadaf Ebrahimi 	if(result == MCDisassembler_Success) {
607*9a0e4156SSadaf Ebrahimi 		*size = 4;
608*9a0e4156SSadaf Ebrahimi 		return true;
609*9a0e4156SSadaf Ebrahimi 	}
610*9a0e4156SSadaf Ebrahimi 
611*9a0e4156SSadaf Ebrahimi 	MCInst_clear(MI);
612*9a0e4156SSadaf Ebrahimi 	*size = 0;
613*9a0e4156SSadaf Ebrahimi 	return false;
614*9a0e4156SSadaf Ebrahimi }
615*9a0e4156SSadaf Ebrahimi 
TMS320C64x_init(MCRegisterInfo * MRI)616*9a0e4156SSadaf Ebrahimi void TMS320C64x_init(MCRegisterInfo *MRI)
617*9a0e4156SSadaf Ebrahimi {
618*9a0e4156SSadaf Ebrahimi 	MCRegisterInfo_InitMCRegisterInfo(MRI, TMS320C64xRegDesc, 90,
619*9a0e4156SSadaf Ebrahimi 			0, 0,
620*9a0e4156SSadaf Ebrahimi 			TMS320C64xMCRegisterClasses, 7,
621*9a0e4156SSadaf Ebrahimi 			0, 0,
622*9a0e4156SSadaf Ebrahimi 			TMS320C64xRegDiffLists,
623*9a0e4156SSadaf Ebrahimi 			0,
624*9a0e4156SSadaf Ebrahimi 			TMS320C64xSubRegIdxLists, 1,
625*9a0e4156SSadaf Ebrahimi 			0);
626*9a0e4156SSadaf Ebrahimi }
627*9a0e4156SSadaf Ebrahimi 
628*9a0e4156SSadaf Ebrahimi #endif
629