1#ifndef CAPSTONE_SPARC_H
2#define CAPSTONE_SPARC_H
3
4/* Capstone Disassembly Engine */
5/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2014 */
6
7#ifdef __cplusplus
8extern "C" {
9#endif
10
11#if !defined(_MSC_VER) || !defined(_KERNEL_MODE)
12#include <stdint.h>
13#endif
14
15#include "platform.h"
16
17// GCC SPARC toolchain has a default macro called "sparc" which breaks
18// compilation
19#undef sparc
20
21#ifdef _MSC_VER
22#pragma warning(disable:4201)
23#endif
24
25//> Enums corresponding to Sparc condition codes, both icc's and fcc's.
26typedef enum sparc_cc {
27	SPARC_CC_INVALID = 0,	// invalid CC (default)
28	//> Integer condition codes
29	SPARC_CC_ICC_A   =  8+256,  // Always
30	SPARC_CC_ICC_N   =  0+256,  // Never
31	SPARC_CC_ICC_NE  =  9+256,  // Not Equal
32	SPARC_CC_ICC_E   =  1+256,  // Equal
33	SPARC_CC_ICC_G   = 10+256,  // Greater
34	SPARC_CC_ICC_LE  =  2+256,  // Less or Equal
35	SPARC_CC_ICC_GE  = 11+256,  // Greater or Equal
36	SPARC_CC_ICC_L   =  3+256,  // Less
37	SPARC_CC_ICC_GU  = 12+256,  // Greater Unsigned
38	SPARC_CC_ICC_LEU =  4+256,  // Less or Equal Unsigned
39	SPARC_CC_ICC_CC  = 13+256,  // Carry Clear/Great or Equal Unsigned
40	SPARC_CC_ICC_CS  =  5+256,  // Carry Set/Less Unsigned
41	SPARC_CC_ICC_POS = 14+256,  // Positive
42	SPARC_CC_ICC_NEG =  6+256,  // Negative
43	SPARC_CC_ICC_VC  = 15+256,  // Overflow Clear
44	SPARC_CC_ICC_VS  =  7+256,  // Overflow Set
45
46	//> Floating condition codes
47	SPARC_CC_FCC_A   =  8+16+256,  // Always
48	SPARC_CC_FCC_N   =  0+16+256,  // Never
49	SPARC_CC_FCC_U   =  7+16+256,  // Unordered
50	SPARC_CC_FCC_G   =  6+16+256,  // Greater
51	SPARC_CC_FCC_UG  =  5+16+256,  // Unordered or Greater
52	SPARC_CC_FCC_L   =  4+16+256,  // Less
53	SPARC_CC_FCC_UL  =  3+16+256,  // Unordered or Less
54	SPARC_CC_FCC_LG  =  2+16+256,  // Less or Greater
55	SPARC_CC_FCC_NE  =  1+16+256,  // Not Equal
56	SPARC_CC_FCC_E   =  9+16+256,  // Equal
57	SPARC_CC_FCC_UE  = 10+16+256,  // Unordered or Equal
58	SPARC_CC_FCC_GE  = 11+16+256,  // Greater or Equal
59	SPARC_CC_FCC_UGE = 12+16+256,  // Unordered or Greater or Equal
60	SPARC_CC_FCC_LE  = 13+16+256,  // Less or Equal
61	SPARC_CC_FCC_ULE = 14+16+256,  // Unordered or Less or Equal
62	SPARC_CC_FCC_O   = 15+16+256,  // Ordered
63} sparc_cc;
64
65//> Branch hint
66typedef enum sparc_hint {
67	SPARC_HINT_INVALID = 0,	// no hint
68	SPARC_HINT_A	= 1 << 0,	// annul delay slot instruction
69	SPARC_HINT_PT	= 1 << 1,	// branch taken
70	SPARC_HINT_PN	= 1 << 2,	// branch NOT taken
71} sparc_hint;
72
73//> Operand type for instruction's operands
74typedef enum sparc_op_type {
75	SPARC_OP_INVALID = 0, // = CS_OP_INVALID (Uninitialized).
76	SPARC_OP_REG, // = CS_OP_REG (Register operand).
77	SPARC_OP_IMM, // = CS_OP_IMM (Immediate operand).
78	SPARC_OP_MEM, // = CS_OP_MEM (Memory operand).
79} sparc_op_type;
80
81// Instruction's operand referring to memory
82// This is associated with SPARC_OP_MEM operand type above
83typedef struct sparc_op_mem {
84	uint8_t base;	// base register
85	uint8_t index;	// index register
86	int32_t disp;	// displacement/offset value
87} sparc_op_mem;
88
89// Instruction operand
90typedef struct cs_sparc_op {
91	sparc_op_type type;	// operand type
92	union {
93		unsigned int reg;	// register value for REG operand
94		int32_t imm;		// immediate value for IMM operand
95		sparc_op_mem mem;		// base/disp value for MEM operand
96	};
97} cs_sparc_op;
98
99// Instruction structure
100typedef struct cs_sparc {
101	sparc_cc cc;	// code condition for this insn
102	sparc_hint hint;	// branch hint: encoding as bitwise OR of sparc_hint.
103	// Number of operands of this instruction,
104	// or 0 when instruction has no operand.
105	uint8_t op_count;
106	cs_sparc_op operands[4]; // operands for this instruction.
107} cs_sparc;
108
109//> SPARC registers
110typedef enum sparc_reg {
111	SPARC_REG_INVALID = 0,
112
113	SPARC_REG_F0,
114	SPARC_REG_F1,
115	SPARC_REG_F2,
116	SPARC_REG_F3,
117	SPARC_REG_F4,
118	SPARC_REG_F5,
119	SPARC_REG_F6,
120	SPARC_REG_F7,
121	SPARC_REG_F8,
122	SPARC_REG_F9,
123	SPARC_REG_F10,
124	SPARC_REG_F11,
125	SPARC_REG_F12,
126	SPARC_REG_F13,
127	SPARC_REG_F14,
128	SPARC_REG_F15,
129	SPARC_REG_F16,
130	SPARC_REG_F17,
131	SPARC_REG_F18,
132	SPARC_REG_F19,
133	SPARC_REG_F20,
134	SPARC_REG_F21,
135	SPARC_REG_F22,
136	SPARC_REG_F23,
137	SPARC_REG_F24,
138	SPARC_REG_F25,
139	SPARC_REG_F26,
140	SPARC_REG_F27,
141	SPARC_REG_F28,
142	SPARC_REG_F29,
143	SPARC_REG_F30,
144	SPARC_REG_F31,
145	SPARC_REG_F32,
146	SPARC_REG_F34,
147	SPARC_REG_F36,
148	SPARC_REG_F38,
149	SPARC_REG_F40,
150	SPARC_REG_F42,
151	SPARC_REG_F44,
152	SPARC_REG_F46,
153	SPARC_REG_F48,
154	SPARC_REG_F50,
155	SPARC_REG_F52,
156	SPARC_REG_F54,
157	SPARC_REG_F56,
158	SPARC_REG_F58,
159	SPARC_REG_F60,
160	SPARC_REG_F62,
161	SPARC_REG_FCC0,	// Floating condition codes
162	SPARC_REG_FCC1,
163	SPARC_REG_FCC2,
164	SPARC_REG_FCC3,
165	SPARC_REG_FP,
166	SPARC_REG_G0,
167	SPARC_REG_G1,
168	SPARC_REG_G2,
169	SPARC_REG_G3,
170	SPARC_REG_G4,
171	SPARC_REG_G5,
172	SPARC_REG_G6,
173	SPARC_REG_G7,
174	SPARC_REG_I0,
175	SPARC_REG_I1,
176	SPARC_REG_I2,
177	SPARC_REG_I3,
178	SPARC_REG_I4,
179	SPARC_REG_I5,
180	SPARC_REG_I7,
181	SPARC_REG_ICC,	// Integer condition codes
182	SPARC_REG_L0,
183	SPARC_REG_L1,
184	SPARC_REG_L2,
185	SPARC_REG_L3,
186	SPARC_REG_L4,
187	SPARC_REG_L5,
188	SPARC_REG_L6,
189	SPARC_REG_L7,
190	SPARC_REG_O0,
191	SPARC_REG_O1,
192	SPARC_REG_O2,
193	SPARC_REG_O3,
194	SPARC_REG_O4,
195	SPARC_REG_O5,
196	SPARC_REG_O7,
197	SPARC_REG_SP,
198	SPARC_REG_Y,
199
200	// special register
201	SPARC_REG_XCC,
202
203	SPARC_REG_ENDING,   // <-- mark the end of the list of registers
204
205	// extras
206	SPARC_REG_O6 = SPARC_REG_SP,
207	SPARC_REG_I6 = SPARC_REG_FP,
208} sparc_reg;
209
210//> SPARC instruction
211typedef enum sparc_insn {
212	SPARC_INS_INVALID = 0,
213
214	SPARC_INS_ADDCC,
215	SPARC_INS_ADDX,
216	SPARC_INS_ADDXCC,
217	SPARC_INS_ADDXC,
218	SPARC_INS_ADDXCCC,
219	SPARC_INS_ADD,
220	SPARC_INS_ALIGNADDR,
221	SPARC_INS_ALIGNADDRL,
222	SPARC_INS_ANDCC,
223	SPARC_INS_ANDNCC,
224	SPARC_INS_ANDN,
225	SPARC_INS_AND,
226	SPARC_INS_ARRAY16,
227	SPARC_INS_ARRAY32,
228	SPARC_INS_ARRAY8,
229	SPARC_INS_B,
230	SPARC_INS_JMP,
231	SPARC_INS_BMASK,
232	SPARC_INS_FB,
233	SPARC_INS_BRGEZ,
234	SPARC_INS_BRGZ,
235	SPARC_INS_BRLEZ,
236	SPARC_INS_BRLZ,
237	SPARC_INS_BRNZ,
238	SPARC_INS_BRZ,
239	SPARC_INS_BSHUFFLE,
240	SPARC_INS_CALL,
241	SPARC_INS_CASX,
242	SPARC_INS_CAS,
243	SPARC_INS_CMASK16,
244	SPARC_INS_CMASK32,
245	SPARC_INS_CMASK8,
246	SPARC_INS_CMP,
247	SPARC_INS_EDGE16,
248	SPARC_INS_EDGE16L,
249	SPARC_INS_EDGE16LN,
250	SPARC_INS_EDGE16N,
251	SPARC_INS_EDGE32,
252	SPARC_INS_EDGE32L,
253	SPARC_INS_EDGE32LN,
254	SPARC_INS_EDGE32N,
255	SPARC_INS_EDGE8,
256	SPARC_INS_EDGE8L,
257	SPARC_INS_EDGE8LN,
258	SPARC_INS_EDGE8N,
259	SPARC_INS_FABSD,
260	SPARC_INS_FABSQ,
261	SPARC_INS_FABSS,
262	SPARC_INS_FADDD,
263	SPARC_INS_FADDQ,
264	SPARC_INS_FADDS,
265	SPARC_INS_FALIGNDATA,
266	SPARC_INS_FAND,
267	SPARC_INS_FANDNOT1,
268	SPARC_INS_FANDNOT1S,
269	SPARC_INS_FANDNOT2,
270	SPARC_INS_FANDNOT2S,
271	SPARC_INS_FANDS,
272	SPARC_INS_FCHKSM16,
273	SPARC_INS_FCMPD,
274	SPARC_INS_FCMPEQ16,
275	SPARC_INS_FCMPEQ32,
276	SPARC_INS_FCMPGT16,
277	SPARC_INS_FCMPGT32,
278	SPARC_INS_FCMPLE16,
279	SPARC_INS_FCMPLE32,
280	SPARC_INS_FCMPNE16,
281	SPARC_INS_FCMPNE32,
282	SPARC_INS_FCMPQ,
283	SPARC_INS_FCMPS,
284	SPARC_INS_FDIVD,
285	SPARC_INS_FDIVQ,
286	SPARC_INS_FDIVS,
287	SPARC_INS_FDMULQ,
288	SPARC_INS_FDTOI,
289	SPARC_INS_FDTOQ,
290	SPARC_INS_FDTOS,
291	SPARC_INS_FDTOX,
292	SPARC_INS_FEXPAND,
293	SPARC_INS_FHADDD,
294	SPARC_INS_FHADDS,
295	SPARC_INS_FHSUBD,
296	SPARC_INS_FHSUBS,
297	SPARC_INS_FITOD,
298	SPARC_INS_FITOQ,
299	SPARC_INS_FITOS,
300	SPARC_INS_FLCMPD,
301	SPARC_INS_FLCMPS,
302	SPARC_INS_FLUSHW,
303	SPARC_INS_FMEAN16,
304	SPARC_INS_FMOVD,
305	SPARC_INS_FMOVQ,
306	SPARC_INS_FMOVRDGEZ,
307	SPARC_INS_FMOVRQGEZ,
308	SPARC_INS_FMOVRSGEZ,
309	SPARC_INS_FMOVRDGZ,
310	SPARC_INS_FMOVRQGZ,
311	SPARC_INS_FMOVRSGZ,
312	SPARC_INS_FMOVRDLEZ,
313	SPARC_INS_FMOVRQLEZ,
314	SPARC_INS_FMOVRSLEZ,
315	SPARC_INS_FMOVRDLZ,
316	SPARC_INS_FMOVRQLZ,
317	SPARC_INS_FMOVRSLZ,
318	SPARC_INS_FMOVRDNZ,
319	SPARC_INS_FMOVRQNZ,
320	SPARC_INS_FMOVRSNZ,
321	SPARC_INS_FMOVRDZ,
322	SPARC_INS_FMOVRQZ,
323	SPARC_INS_FMOVRSZ,
324	SPARC_INS_FMOVS,
325	SPARC_INS_FMUL8SUX16,
326	SPARC_INS_FMUL8ULX16,
327	SPARC_INS_FMUL8X16,
328	SPARC_INS_FMUL8X16AL,
329	SPARC_INS_FMUL8X16AU,
330	SPARC_INS_FMULD,
331	SPARC_INS_FMULD8SUX16,
332	SPARC_INS_FMULD8ULX16,
333	SPARC_INS_FMULQ,
334	SPARC_INS_FMULS,
335	SPARC_INS_FNADDD,
336	SPARC_INS_FNADDS,
337	SPARC_INS_FNAND,
338	SPARC_INS_FNANDS,
339	SPARC_INS_FNEGD,
340	SPARC_INS_FNEGQ,
341	SPARC_INS_FNEGS,
342	SPARC_INS_FNHADDD,
343	SPARC_INS_FNHADDS,
344	SPARC_INS_FNOR,
345	SPARC_INS_FNORS,
346	SPARC_INS_FNOT1,
347	SPARC_INS_FNOT1S,
348	SPARC_INS_FNOT2,
349	SPARC_INS_FNOT2S,
350	SPARC_INS_FONE,
351	SPARC_INS_FONES,
352	SPARC_INS_FOR,
353	SPARC_INS_FORNOT1,
354	SPARC_INS_FORNOT1S,
355	SPARC_INS_FORNOT2,
356	SPARC_INS_FORNOT2S,
357	SPARC_INS_FORS,
358	SPARC_INS_FPACK16,
359	SPARC_INS_FPACK32,
360	SPARC_INS_FPACKFIX,
361	SPARC_INS_FPADD16,
362	SPARC_INS_FPADD16S,
363	SPARC_INS_FPADD32,
364	SPARC_INS_FPADD32S,
365	SPARC_INS_FPADD64,
366	SPARC_INS_FPMERGE,
367	SPARC_INS_FPSUB16,
368	SPARC_INS_FPSUB16S,
369	SPARC_INS_FPSUB32,
370	SPARC_INS_FPSUB32S,
371	SPARC_INS_FQTOD,
372	SPARC_INS_FQTOI,
373	SPARC_INS_FQTOS,
374	SPARC_INS_FQTOX,
375	SPARC_INS_FSLAS16,
376	SPARC_INS_FSLAS32,
377	SPARC_INS_FSLL16,
378	SPARC_INS_FSLL32,
379	SPARC_INS_FSMULD,
380	SPARC_INS_FSQRTD,
381	SPARC_INS_FSQRTQ,
382	SPARC_INS_FSQRTS,
383	SPARC_INS_FSRA16,
384	SPARC_INS_FSRA32,
385	SPARC_INS_FSRC1,
386	SPARC_INS_FSRC1S,
387	SPARC_INS_FSRC2,
388	SPARC_INS_FSRC2S,
389	SPARC_INS_FSRL16,
390	SPARC_INS_FSRL32,
391	SPARC_INS_FSTOD,
392	SPARC_INS_FSTOI,
393	SPARC_INS_FSTOQ,
394	SPARC_INS_FSTOX,
395	SPARC_INS_FSUBD,
396	SPARC_INS_FSUBQ,
397	SPARC_INS_FSUBS,
398	SPARC_INS_FXNOR,
399	SPARC_INS_FXNORS,
400	SPARC_INS_FXOR,
401	SPARC_INS_FXORS,
402	SPARC_INS_FXTOD,
403	SPARC_INS_FXTOQ,
404	SPARC_INS_FXTOS,
405	SPARC_INS_FZERO,
406	SPARC_INS_FZEROS,
407	SPARC_INS_JMPL,
408	SPARC_INS_LDD,
409	SPARC_INS_LD,
410	SPARC_INS_LDQ,
411	SPARC_INS_LDSB,
412	SPARC_INS_LDSH,
413	SPARC_INS_LDSW,
414	SPARC_INS_LDUB,
415	SPARC_INS_LDUH,
416	SPARC_INS_LDX,
417	SPARC_INS_LZCNT,
418	SPARC_INS_MEMBAR,
419	SPARC_INS_MOVDTOX,
420	SPARC_INS_MOV,
421	SPARC_INS_MOVRGEZ,
422	SPARC_INS_MOVRGZ,
423	SPARC_INS_MOVRLEZ,
424	SPARC_INS_MOVRLZ,
425	SPARC_INS_MOVRNZ,
426	SPARC_INS_MOVRZ,
427	SPARC_INS_MOVSTOSW,
428	SPARC_INS_MOVSTOUW,
429	SPARC_INS_MULX,
430	SPARC_INS_NOP,
431	SPARC_INS_ORCC,
432	SPARC_INS_ORNCC,
433	SPARC_INS_ORN,
434	SPARC_INS_OR,
435	SPARC_INS_PDIST,
436	SPARC_INS_PDISTN,
437	SPARC_INS_POPC,
438	SPARC_INS_RD,
439	SPARC_INS_RESTORE,
440	SPARC_INS_RETT,
441	SPARC_INS_SAVE,
442	SPARC_INS_SDIVCC,
443	SPARC_INS_SDIVX,
444	SPARC_INS_SDIV,
445	SPARC_INS_SETHI,
446	SPARC_INS_SHUTDOWN,
447	SPARC_INS_SIAM,
448	SPARC_INS_SLLX,
449	SPARC_INS_SLL,
450	SPARC_INS_SMULCC,
451	SPARC_INS_SMUL,
452	SPARC_INS_SRAX,
453	SPARC_INS_SRA,
454	SPARC_INS_SRLX,
455	SPARC_INS_SRL,
456	SPARC_INS_STBAR,
457	SPARC_INS_STB,
458	SPARC_INS_STD,
459	SPARC_INS_ST,
460	SPARC_INS_STH,
461	SPARC_INS_STQ,
462	SPARC_INS_STX,
463	SPARC_INS_SUBCC,
464	SPARC_INS_SUBX,
465	SPARC_INS_SUBXCC,
466	SPARC_INS_SUB,
467	SPARC_INS_SWAP,
468	SPARC_INS_TADDCCTV,
469	SPARC_INS_TADDCC,
470	SPARC_INS_T,
471	SPARC_INS_TSUBCCTV,
472	SPARC_INS_TSUBCC,
473	SPARC_INS_UDIVCC,
474	SPARC_INS_UDIVX,
475	SPARC_INS_UDIV,
476	SPARC_INS_UMULCC,
477	SPARC_INS_UMULXHI,
478	SPARC_INS_UMUL,
479	SPARC_INS_UNIMP,
480	SPARC_INS_FCMPED,
481	SPARC_INS_FCMPEQ,
482	SPARC_INS_FCMPES,
483	SPARC_INS_WR,
484	SPARC_INS_XMULX,
485	SPARC_INS_XMULXHI,
486	SPARC_INS_XNORCC,
487	SPARC_INS_XNOR,
488	SPARC_INS_XORCC,
489	SPARC_INS_XOR,
490
491	// alias instructions
492	SPARC_INS_RET,
493	SPARC_INS_RETL,
494
495	SPARC_INS_ENDING,   // <-- mark the end of the list of instructions
496} sparc_insn;
497
498//> Group of SPARC instructions
499typedef enum sparc_insn_group {
500	SPARC_GRP_INVALID = 0, // = CS_GRP_INVALID
501
502	//> Generic groups
503	// all jump instructions (conditional+direct+indirect jumps)
504	SPARC_GRP_JUMP,	// = CS_GRP_JUMP
505
506	//> Architecture-specific groups
507	SPARC_GRP_HARDQUAD = 128,
508	SPARC_GRP_V9,
509	SPARC_GRP_VIS,
510	SPARC_GRP_VIS2,
511	SPARC_GRP_VIS3,
512	SPARC_GRP_32BIT,
513	SPARC_GRP_64BIT,
514
515	SPARC_GRP_ENDING,   // <-- mark the end of the list of groups
516} sparc_insn_group;
517
518#ifdef __cplusplus
519}
520#endif
521
522#endif
523