• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
8 extern "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.
26 typedef 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
66 typedef 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
74 typedef 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
83 typedef 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
90 typedef 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
100 typedef 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
110 typedef 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
211 typedef 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
499 typedef 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