1 /* Capstone Disassembly Engine */
2 /* TMS320C64x Backend by Fotis Loukos <me@fotisl.com> 2016 */
3 
4 #ifndef CAPSTONE_TMS320C64X_H
5 #define CAPSTONE_TMS320C64X_H
6 
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 
11 #include <stdint.h>
12 #include "platform.h"
13 
14 #ifdef _MSC_VER
15 #pragma warning(disable:4201)
16 #endif
17 
18 typedef enum tms320c64x_op_type {
19 	TMS320C64X_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized).
20 	TMS320C64X_OP_REG, ///< = CS_OP_REG (Register operand).
21 	TMS320C64X_OP_IMM, ///< = CS_OP_IMM (Immediate operand).
22 	TMS320C64X_OP_MEM, ///< = CS_OP_MEM (Memory operand).
23 	TMS320C64X_OP_REGPAIR = 64, ///< Register pair for double word ops
24 } tms320c64x_op_type;
25 
26 typedef enum tms320c64x_mem_disp {
27 	TMS320C64X_MEM_DISP_INVALID = 0,
28 	TMS320C64X_MEM_DISP_CONSTANT,
29 	TMS320C64X_MEM_DISP_REGISTER,
30 } tms320c64x_mem_disp;
31 
32 typedef enum tms320c64x_mem_dir {
33 	TMS320C64X_MEM_DIR_INVALID = 0,
34 	TMS320C64X_MEM_DIR_FW,
35 	TMS320C64X_MEM_DIR_BW,
36 } tms320c64x_mem_dir;
37 
38 typedef enum tms320c64x_mem_mod {
39 	TMS320C64X_MEM_MOD_INVALID = 0,
40 	TMS320C64X_MEM_MOD_NO,
41 	TMS320C64X_MEM_MOD_PRE,
42 	TMS320C64X_MEM_MOD_POST,
43 } tms320c64x_mem_mod;
44 
45 typedef struct tms320c64x_op_mem {
46 	unsigned int	base;	///< base register
47 	unsigned int	disp;	///< displacement/offset value
48 	unsigned int	unit;	///< unit of base and offset register
49 	unsigned int	scaled;	///< offset scaled
50 	unsigned int	disptype;	///< displacement type
51 	unsigned int	direction;	///< direction
52 	unsigned int	modify;	///< modification
53 } tms320c64x_op_mem;
54 
55 typedef struct cs_tms320c64x_op {
56 	tms320c64x_op_type type;	///< operand type
57 	union {
58 		unsigned int reg;	///< register value for REG operand or first register for REGPAIR operand
59 		int32_t imm;		///< immediate value for IMM operand
60 		tms320c64x_op_mem mem;		///< base/disp value for MEM operand
61 	};
62 } cs_tms320c64x_op;
63 
64 typedef struct cs_tms320c64x {
65 	uint8_t op_count;
66 	cs_tms320c64x_op operands[8]; ///< operands for this instruction.
67 	struct {
68 		unsigned int reg;
69 		unsigned int zero;
70 	} condition;
71 	struct {
72 		unsigned int unit;
73 		unsigned int side;
74 		unsigned int crosspath;
75 	} funit;
76 	unsigned int parallel;
77 } cs_tms320c64x;
78 
79 typedef enum tms320c64x_reg {
80 	TMS320C64X_REG_INVALID = 0,
81 
82 	TMS320C64X_REG_AMR,
83 	TMS320C64X_REG_CSR,
84 	TMS320C64X_REG_DIER,
85 	TMS320C64X_REG_DNUM,
86 	TMS320C64X_REG_ECR,
87 	TMS320C64X_REG_GFPGFR,
88 	TMS320C64X_REG_GPLYA,
89 	TMS320C64X_REG_GPLYB,
90 	TMS320C64X_REG_ICR,
91 	TMS320C64X_REG_IER,
92 	TMS320C64X_REG_IERR,
93 	TMS320C64X_REG_ILC,
94 	TMS320C64X_REG_IRP,
95 	TMS320C64X_REG_ISR,
96 	TMS320C64X_REG_ISTP,
97 	TMS320C64X_REG_ITSR,
98 	TMS320C64X_REG_NRP,
99 	TMS320C64X_REG_NTSR,
100 	TMS320C64X_REG_REP,
101 	TMS320C64X_REG_RILC,
102 	TMS320C64X_REG_SSR,
103 	TMS320C64X_REG_TSCH,
104 	TMS320C64X_REG_TSCL,
105 	TMS320C64X_REG_TSR,
106 	TMS320C64X_REG_A0,
107 	TMS320C64X_REG_A1,
108 	TMS320C64X_REG_A2,
109 	TMS320C64X_REG_A3,
110 	TMS320C64X_REG_A4,
111 	TMS320C64X_REG_A5,
112 	TMS320C64X_REG_A6,
113 	TMS320C64X_REG_A7,
114 	TMS320C64X_REG_A8,
115 	TMS320C64X_REG_A9,
116 	TMS320C64X_REG_A10,
117 	TMS320C64X_REG_A11,
118 	TMS320C64X_REG_A12,
119 	TMS320C64X_REG_A13,
120 	TMS320C64X_REG_A14,
121 	TMS320C64X_REG_A15,
122 	TMS320C64X_REG_A16,
123 	TMS320C64X_REG_A17,
124 	TMS320C64X_REG_A18,
125 	TMS320C64X_REG_A19,
126 	TMS320C64X_REG_A20,
127 	TMS320C64X_REG_A21,
128 	TMS320C64X_REG_A22,
129 	TMS320C64X_REG_A23,
130 	TMS320C64X_REG_A24,
131 	TMS320C64X_REG_A25,
132 	TMS320C64X_REG_A26,
133 	TMS320C64X_REG_A27,
134 	TMS320C64X_REG_A28,
135 	TMS320C64X_REG_A29,
136 	TMS320C64X_REG_A30,
137 	TMS320C64X_REG_A31,
138 	TMS320C64X_REG_B0,
139 	TMS320C64X_REG_B1,
140 	TMS320C64X_REG_B2,
141 	TMS320C64X_REG_B3,
142 	TMS320C64X_REG_B4,
143 	TMS320C64X_REG_B5,
144 	TMS320C64X_REG_B6,
145 	TMS320C64X_REG_B7,
146 	TMS320C64X_REG_B8,
147 	TMS320C64X_REG_B9,
148 	TMS320C64X_REG_B10,
149 	TMS320C64X_REG_B11,
150 	TMS320C64X_REG_B12,
151 	TMS320C64X_REG_B13,
152 	TMS320C64X_REG_B14,
153 	TMS320C64X_REG_B15,
154 	TMS320C64X_REG_B16,
155 	TMS320C64X_REG_B17,
156 	TMS320C64X_REG_B18,
157 	TMS320C64X_REG_B19,
158 	TMS320C64X_REG_B20,
159 	TMS320C64X_REG_B21,
160 	TMS320C64X_REG_B22,
161 	TMS320C64X_REG_B23,
162 	TMS320C64X_REG_B24,
163 	TMS320C64X_REG_B25,
164 	TMS320C64X_REG_B26,
165 	TMS320C64X_REG_B27,
166 	TMS320C64X_REG_B28,
167 	TMS320C64X_REG_B29,
168 	TMS320C64X_REG_B30,
169 	TMS320C64X_REG_B31,
170 	TMS320C64X_REG_PCE1,
171 
172 	TMS320C64X_REG_ENDING,	// <-- mark the end of the list of registers
173 
174 	// Alias registers
175 	TMS320C64X_REG_EFR = TMS320C64X_REG_ECR,
176 	TMS320C64X_REG_IFR = TMS320C64X_REG_ISR,
177 } tms320c64x_reg;
178 
179 typedef enum tms320c64x_insn {
180 	TMS320C64X_INS_INVALID = 0,
181 
182 	TMS320C64X_INS_ABS,
183 	TMS320C64X_INS_ABS2,
184 	TMS320C64X_INS_ADD,
185 	TMS320C64X_INS_ADD2,
186 	TMS320C64X_INS_ADD4,
187 	TMS320C64X_INS_ADDAB,
188 	TMS320C64X_INS_ADDAD,
189 	TMS320C64X_INS_ADDAH,
190 	TMS320C64X_INS_ADDAW,
191 	TMS320C64X_INS_ADDK,
192 	TMS320C64X_INS_ADDKPC,
193 	TMS320C64X_INS_ADDU,
194 	TMS320C64X_INS_AND,
195 	TMS320C64X_INS_ANDN,
196 	TMS320C64X_INS_AVG2,
197 	TMS320C64X_INS_AVGU4,
198 	TMS320C64X_INS_B,
199 	TMS320C64X_INS_BDEC,
200 	TMS320C64X_INS_BITC4,
201 	TMS320C64X_INS_BNOP,
202 	TMS320C64X_INS_BPOS,
203 	TMS320C64X_INS_CLR,
204 	TMS320C64X_INS_CMPEQ,
205 	TMS320C64X_INS_CMPEQ2,
206 	TMS320C64X_INS_CMPEQ4,
207 	TMS320C64X_INS_CMPGT,
208 	TMS320C64X_INS_CMPGT2,
209 	TMS320C64X_INS_CMPGTU4,
210 	TMS320C64X_INS_CMPLT,
211 	TMS320C64X_INS_CMPLTU,
212 	TMS320C64X_INS_DEAL,
213 	TMS320C64X_INS_DOTP2,
214 	TMS320C64X_INS_DOTPN2,
215 	TMS320C64X_INS_DOTPNRSU2,
216 	TMS320C64X_INS_DOTPRSU2,
217 	TMS320C64X_INS_DOTPSU4,
218 	TMS320C64X_INS_DOTPU4,
219 	TMS320C64X_INS_EXT,
220 	TMS320C64X_INS_EXTU,
221 	TMS320C64X_INS_GMPGTU,
222 	TMS320C64X_INS_GMPY4,
223 	TMS320C64X_INS_LDB,
224 	TMS320C64X_INS_LDBU,
225 	TMS320C64X_INS_LDDW,
226 	TMS320C64X_INS_LDH,
227 	TMS320C64X_INS_LDHU,
228 	TMS320C64X_INS_LDNDW,
229 	TMS320C64X_INS_LDNW,
230 	TMS320C64X_INS_LDW,
231 	TMS320C64X_INS_LMBD,
232 	TMS320C64X_INS_MAX2,
233 	TMS320C64X_INS_MAXU4,
234 	TMS320C64X_INS_MIN2,
235 	TMS320C64X_INS_MINU4,
236 	TMS320C64X_INS_MPY,
237 	TMS320C64X_INS_MPY2,
238 	TMS320C64X_INS_MPYH,
239 	TMS320C64X_INS_MPYHI,
240 	TMS320C64X_INS_MPYHIR,
241 	TMS320C64X_INS_MPYHL,
242 	TMS320C64X_INS_MPYHLU,
243 	TMS320C64X_INS_MPYHSLU,
244 	TMS320C64X_INS_MPYHSU,
245 	TMS320C64X_INS_MPYHU,
246 	TMS320C64X_INS_MPYHULS,
247 	TMS320C64X_INS_MPYHUS,
248 	TMS320C64X_INS_MPYLH,
249 	TMS320C64X_INS_MPYLHU,
250 	TMS320C64X_INS_MPYLI,
251 	TMS320C64X_INS_MPYLIR,
252 	TMS320C64X_INS_MPYLSHU,
253 	TMS320C64X_INS_MPYLUHS,
254 	TMS320C64X_INS_MPYSU,
255 	TMS320C64X_INS_MPYSU4,
256 	TMS320C64X_INS_MPYU,
257 	TMS320C64X_INS_MPYU4,
258 	TMS320C64X_INS_MPYUS,
259 	TMS320C64X_INS_MVC,
260 	TMS320C64X_INS_MVD,
261 	TMS320C64X_INS_MVK,
262 	TMS320C64X_INS_MVKL,
263 	TMS320C64X_INS_MVKLH,
264 	TMS320C64X_INS_NOP,
265 	TMS320C64X_INS_NORM,
266 	TMS320C64X_INS_OR,
267 	TMS320C64X_INS_PACK2,
268 	TMS320C64X_INS_PACKH2,
269 	TMS320C64X_INS_PACKH4,
270 	TMS320C64X_INS_PACKHL2,
271 	TMS320C64X_INS_PACKL4,
272 	TMS320C64X_INS_PACKLH2,
273 	TMS320C64X_INS_ROTL,
274 	TMS320C64X_INS_SADD,
275 	TMS320C64X_INS_SADD2,
276 	TMS320C64X_INS_SADDU4,
277 	TMS320C64X_INS_SADDUS2,
278 	TMS320C64X_INS_SAT,
279 	TMS320C64X_INS_SET,
280 	TMS320C64X_INS_SHFL,
281 	TMS320C64X_INS_SHL,
282 	TMS320C64X_INS_SHLMB,
283 	TMS320C64X_INS_SHR,
284 	TMS320C64X_INS_SHR2,
285 	TMS320C64X_INS_SHRMB,
286 	TMS320C64X_INS_SHRU,
287 	TMS320C64X_INS_SHRU2,
288 	TMS320C64X_INS_SMPY,
289 	TMS320C64X_INS_SMPY2,
290 	TMS320C64X_INS_SMPYH,
291 	TMS320C64X_INS_SMPYHL,
292 	TMS320C64X_INS_SMPYLH,
293 	TMS320C64X_INS_SPACK2,
294 	TMS320C64X_INS_SPACKU4,
295 	TMS320C64X_INS_SSHL,
296 	TMS320C64X_INS_SSHVL,
297 	TMS320C64X_INS_SSHVR,
298 	TMS320C64X_INS_SSUB,
299 	TMS320C64X_INS_STB,
300 	TMS320C64X_INS_STDW,
301 	TMS320C64X_INS_STH,
302 	TMS320C64X_INS_STNDW,
303 	TMS320C64X_INS_STNW,
304 	TMS320C64X_INS_STW,
305 	TMS320C64X_INS_SUB,
306 	TMS320C64X_INS_SUB2,
307 	TMS320C64X_INS_SUB4,
308 	TMS320C64X_INS_SUBAB,
309 	TMS320C64X_INS_SUBABS4,
310 	TMS320C64X_INS_SUBAH,
311 	TMS320C64X_INS_SUBAW,
312 	TMS320C64X_INS_SUBC,
313 	TMS320C64X_INS_SUBU,
314 	TMS320C64X_INS_SWAP4,
315 	TMS320C64X_INS_UNPKHU4,
316 	TMS320C64X_INS_UNPKLU4,
317 	TMS320C64X_INS_XOR,
318 	TMS320C64X_INS_XPND2,
319 	TMS320C64X_INS_XPND4,
320 	// Aliases
321 	TMS320C64X_INS_IDLE,
322 	TMS320C64X_INS_MV,
323 	TMS320C64X_INS_NEG,
324 	TMS320C64X_INS_NOT,
325 	TMS320C64X_INS_SWAP2,
326 	TMS320C64X_INS_ZERO,
327 
328 	TMS320C64X_INS_ENDING,   // <-- mark the end of the list of instructions
329 } tms320c64x_insn;
330 
331 typedef enum tms320c64x_insn_group {
332 	TMS320C64X_GRP_INVALID = 0, ///< = CS_GRP_INVALID
333 
334 	TMS320C64X_GRP_JUMP,	///< = CS_GRP_JUMP
335 
336 	TMS320C64X_GRP_FUNIT_D = 128,
337 	TMS320C64X_GRP_FUNIT_L,
338 	TMS320C64X_GRP_FUNIT_M,
339 	TMS320C64X_GRP_FUNIT_S,
340 	TMS320C64X_GRP_FUNIT_NO,
341 
342 	TMS320C64X_GRP_ENDING,   // <-- mark the end of the list of groups
343 } tms320c64x_insn_group;
344 
345 typedef enum tms320c64x_funit {
346 	TMS320C64X_FUNIT_INVALID = 0,
347 	TMS320C64X_FUNIT_D,
348 	TMS320C64X_FUNIT_L,
349 	TMS320C64X_FUNIT_M,
350 	TMS320C64X_FUNIT_S,
351 	TMS320C64X_FUNIT_NO
352 } tms320c64x_funit;
353 
354 #ifdef __cplusplus
355 }
356 #endif
357 
358 #endif
359 
360