Home | History | Annotate | Download | only in include
      1 #ifndef CAPSTONE_SPARC_H
      2 #define CAPSTONE_SPARC_H
      3 
      4 /* Capstone Disassembly Engine */
      5 /* By Nguyen Anh Quynh <aquynh (at) 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