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