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