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