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