git-subtree-dir: external/capstone git-subtree-split: 5430745e9623786f65c0d773a417f389ebb43395
544 lines
9.3 KiB
C
544 lines
9.3 KiB
C
#ifndef CAPSTONE_HPPA_H
|
|
#define CAPSTONE_HPPA_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "cs_operand.h"
|
|
#include "platform.h"
|
|
|
|
#define NUM_HPPA_OPS 5
|
|
#define HPPA_STR_MODIFIER_LEN 8
|
|
#define HPPA_MAX_MODIFIERS_LEN 5
|
|
|
|
/// Operand type for instruction's operands
|
|
typedef enum hppa_op_type {
|
|
HPPA_OP_INVALID = 0,
|
|
|
|
HPPA_OP_REG,
|
|
HPPA_OP_IMM,
|
|
HPPA_OP_IDX_REG,
|
|
HPPA_OP_DISP,
|
|
HPPA_OP_MEM,
|
|
HPPA_OP_TARGET,
|
|
|
|
} hppa_op_type;
|
|
|
|
//> HPPA registers
|
|
typedef enum hppa_reg {
|
|
HPPA_REG_INVALID = 0,
|
|
|
|
///> General registers
|
|
HPPA_REG_GR0,
|
|
HPPA_REG_GR1,
|
|
HPPA_REG_GR2,
|
|
HPPA_REG_GR3,
|
|
HPPA_REG_GR4,
|
|
HPPA_REG_GR5,
|
|
HPPA_REG_GR6,
|
|
HPPA_REG_GR7,
|
|
HPPA_REG_GR8,
|
|
HPPA_REG_GR9,
|
|
HPPA_REG_GR10,
|
|
HPPA_REG_GR11,
|
|
HPPA_REG_GR12,
|
|
HPPA_REG_GR13,
|
|
HPPA_REG_GR14,
|
|
HPPA_REG_GR15,
|
|
HPPA_REG_GR16,
|
|
HPPA_REG_GR17,
|
|
HPPA_REG_GR18,
|
|
HPPA_REG_GR19,
|
|
HPPA_REG_GR20,
|
|
HPPA_REG_GR21,
|
|
HPPA_REG_GR22,
|
|
HPPA_REG_GR23,
|
|
HPPA_REG_GR24,
|
|
HPPA_REG_GR25,
|
|
HPPA_REG_GR26,
|
|
HPPA_REG_GR27,
|
|
HPPA_REG_GR28,
|
|
HPPA_REG_GR29,
|
|
HPPA_REG_GR30,
|
|
HPPA_REG_GR31,
|
|
|
|
///> Floating-point registers
|
|
HPPA_REG_FPR0,
|
|
HPPA_REG_FPR1,
|
|
HPPA_REG_FPR2,
|
|
HPPA_REG_FPR3,
|
|
HPPA_REG_FPR4,
|
|
HPPA_REG_FPR5,
|
|
HPPA_REG_FPR6,
|
|
HPPA_REG_FPR7,
|
|
HPPA_REG_FPR8,
|
|
HPPA_REG_FPR9,
|
|
HPPA_REG_FPR10,
|
|
HPPA_REG_FPR11,
|
|
HPPA_REG_FPR12,
|
|
HPPA_REG_FPR13,
|
|
HPPA_REG_FPR14,
|
|
HPPA_REG_FPR15,
|
|
HPPA_REG_FPR16,
|
|
HPPA_REG_FPR17,
|
|
HPPA_REG_FPR18,
|
|
HPPA_REG_FPR19,
|
|
HPPA_REG_FPR20,
|
|
HPPA_REG_FPR21,
|
|
HPPA_REG_FPR22,
|
|
HPPA_REG_FPR23,
|
|
HPPA_REG_FPR24,
|
|
HPPA_REG_FPR25,
|
|
HPPA_REG_FPR26,
|
|
HPPA_REG_FPR27,
|
|
HPPA_REG_FPR28,
|
|
HPPA_REG_FPR29,
|
|
HPPA_REG_FPR30,
|
|
HPPA_REG_FPR31,
|
|
|
|
///> Space registers
|
|
HPPA_REG_SR0,
|
|
HPPA_REG_SR1,
|
|
HPPA_REG_SR2,
|
|
HPPA_REG_SR3,
|
|
HPPA_REG_SR4,
|
|
HPPA_REG_SR5,
|
|
HPPA_REG_SR6,
|
|
HPPA_REG_SR7,
|
|
|
|
///> Control registers
|
|
HPPA_REG_CR0,
|
|
HPPA_REG_CR1,
|
|
HPPA_REG_CR2,
|
|
HPPA_REG_CR3,
|
|
HPPA_REG_CR4,
|
|
HPPA_REG_CR5,
|
|
HPPA_REG_CR6,
|
|
HPPA_REG_CR7,
|
|
HPPA_REG_CR8,
|
|
HPPA_REG_CR9,
|
|
HPPA_REG_CR10,
|
|
HPPA_REG_CR11,
|
|
HPPA_REG_CR12,
|
|
HPPA_REG_CR13,
|
|
HPPA_REG_CR14,
|
|
HPPA_REG_CR15,
|
|
HPPA_REG_CR16,
|
|
HPPA_REG_CR17,
|
|
HPPA_REG_CR18,
|
|
HPPA_REG_CR19,
|
|
HPPA_REG_CR20,
|
|
HPPA_REG_CR21,
|
|
HPPA_REG_CR22,
|
|
HPPA_REG_CR23,
|
|
HPPA_REG_CR24,
|
|
HPPA_REG_CR25,
|
|
HPPA_REG_CR26,
|
|
HPPA_REG_CR27,
|
|
HPPA_REG_CR28,
|
|
HPPA_REG_CR29,
|
|
HPPA_REG_CR30,
|
|
HPPA_REG_CR31,
|
|
|
|
///> Special floating point exception registers
|
|
HPPA_REG_FPE0,
|
|
HPPA_REG_FPE1,
|
|
HPPA_REG_FPE2,
|
|
HPPA_REG_FPE3,
|
|
HPPA_REG_FPE4,
|
|
HPPA_REG_FPE5,
|
|
HPPA_REG_FPE6,
|
|
HPPA_REG_FPE7,
|
|
HPPA_REG_FPE8,
|
|
HPPA_REG_FPE9,
|
|
HPPA_REG_FPE10,
|
|
HPPA_REG_FPE11,
|
|
HPPA_REG_FPE12,
|
|
HPPA_REG_FPE13,
|
|
HPPA_REG_FPE14,
|
|
HPPA_REG_FPE15,
|
|
HPPA_REG_FPE16,
|
|
HPPA_REG_FPE17,
|
|
HPPA_REG_FPE18,
|
|
HPPA_REG_FPE19,
|
|
HPPA_REG_FPE20,
|
|
HPPA_REG_FPE21,
|
|
HPPA_REG_FPE22,
|
|
HPPA_REG_FPE23,
|
|
HPPA_REG_FPE24,
|
|
HPPA_REG_FPE25,
|
|
HPPA_REG_FPE26,
|
|
HPPA_REG_FPE27,
|
|
HPPA_REG_FPE28,
|
|
HPPA_REG_FPE29,
|
|
HPPA_REG_FPE30,
|
|
HPPA_REG_FPE31,
|
|
|
|
///> Single-precision floating point registers
|
|
HPPA_REG_SP_FPR0,
|
|
HPPA_REG_SP_FPR1,
|
|
HPPA_REG_SP_FPR2,
|
|
HPPA_REG_SP_FPR3,
|
|
HPPA_REG_SP_FPR4,
|
|
HPPA_REG_SP_FPR5,
|
|
HPPA_REG_SP_FPR6,
|
|
HPPA_REG_SP_FPR7,
|
|
HPPA_REG_SP_FPR8,
|
|
HPPA_REG_SP_FPR9,
|
|
HPPA_REG_SP_FPR10,
|
|
HPPA_REG_SP_FPR11,
|
|
HPPA_REG_SP_FPR12,
|
|
HPPA_REG_SP_FPR13,
|
|
HPPA_REG_SP_FPR14,
|
|
HPPA_REG_SP_FPR15,
|
|
HPPA_REG_SP_FPR16,
|
|
HPPA_REG_SP_FPR17,
|
|
HPPA_REG_SP_FPR18,
|
|
HPPA_REG_SP_FPR19,
|
|
HPPA_REG_SP_FPR20,
|
|
HPPA_REG_SP_FPR21,
|
|
HPPA_REG_SP_FPR22,
|
|
HPPA_REG_SP_FPR23,
|
|
HPPA_REG_SP_FPR24,
|
|
HPPA_REG_SP_FPR25,
|
|
HPPA_REG_SP_FPR26,
|
|
HPPA_REG_SP_FPR27,
|
|
HPPA_REG_SP_FPR28,
|
|
HPPA_REG_SP_FPR29,
|
|
HPPA_REG_SP_FPR30,
|
|
HPPA_REG_SP_FPR31,
|
|
|
|
HPPA_REG_ENDING,
|
|
} hppa_reg;
|
|
|
|
/// HPPA instruction
|
|
typedef enum hppa_insn {
|
|
HPPA_INS_INVALID = 0,
|
|
|
|
HPPA_INS_ADD,
|
|
HPPA_INS_ADDI,
|
|
HPPA_INS_ADDIO,
|
|
HPPA_INS_ADDIT,
|
|
HPPA_INS_ADDITO,
|
|
HPPA_INS_ADDB,
|
|
HPPA_INS_ADDBT,
|
|
HPPA_INS_ADDBF,
|
|
HPPA_INS_ADDIB,
|
|
HPPA_INS_ADDIBT,
|
|
HPPA_INS_ADDIBF,
|
|
HPPA_INS_ADDIL,
|
|
HPPA_INS_ADDC,
|
|
HPPA_INS_ADDCO,
|
|
HPPA_INS_ADDL,
|
|
HPPA_INS_ADDO,
|
|
HPPA_INS_AND,
|
|
HPPA_INS_ANDCM,
|
|
HPPA_INS_B,
|
|
HPPA_INS_BB,
|
|
HPPA_INS_BE,
|
|
HPPA_INS_BL,
|
|
HPPA_INS_BLE,
|
|
HPPA_INS_BLR,
|
|
HPPA_INS_BREAK,
|
|
HPPA_INS_BV,
|
|
HPPA_INS_BVB,
|
|
HPPA_INS_BVE,
|
|
HPPA_INS_CALL,
|
|
HPPA_INS_CLDD,
|
|
HPPA_INS_CLDDS,
|
|
HPPA_INS_CLDDX,
|
|
HPPA_INS_CLDW,
|
|
HPPA_INS_CLDWS,
|
|
HPPA_INS_CLDWX,
|
|
HPPA_INS_CLRBTS,
|
|
HPPA_INS_CMPB,
|
|
HPPA_INS_CMPCLR,
|
|
HPPA_INS_CMPIB,
|
|
HPPA_INS_CMPICLR,
|
|
HPPA_INS_COMB,
|
|
HPPA_INS_COMBT,
|
|
HPPA_INS_COMBF,
|
|
HPPA_INS_COMCLR,
|
|
HPPA_INS_COMIB,
|
|
HPPA_INS_COMIBT,
|
|
HPPA_INS_COMIBF,
|
|
HPPA_INS_COMICLR,
|
|
HPPA_INS_COPR,
|
|
HPPA_INS_COPY,
|
|
HPPA_INS_CSTD,
|
|
HPPA_INS_CSTDS,
|
|
HPPA_INS_CSTDX,
|
|
HPPA_INS_CSTW,
|
|
HPPA_INS_CSTWS,
|
|
HPPA_INS_CSTWX,
|
|
HPPA_INS_DCOR,
|
|
HPPA_INS_DEP,
|
|
HPPA_INS_DEPI,
|
|
HPPA_INS_DEPD,
|
|
HPPA_INS_DEPDI,
|
|
HPPA_INS_DEPW,
|
|
HPPA_INS_DEPWI,
|
|
HPPA_INS_DIAG,
|
|
HPPA_INS_DS,
|
|
HPPA_INS_EXTRD,
|
|
HPPA_INS_EXTRS,
|
|
HPPA_INS_EXTRU,
|
|
HPPA_INS_EXTRW,
|
|
HPPA_INS_FABS,
|
|
HPPA_INS_FADD,
|
|
HPPA_INS_FCMP,
|
|
HPPA_INS_FCNV,
|
|
HPPA_INS_FCNVFF,
|
|
HPPA_INS_FCNVFX,
|
|
HPPA_INS_FCNVFXT,
|
|
HPPA_INS_FCNVXF,
|
|
HPPA_INS_FCPY,
|
|
HPPA_INS_FDC,
|
|
HPPA_INS_FDCE,
|
|
HPPA_INS_FDIV,
|
|
HPPA_INS_FIC,
|
|
HPPA_INS_FICE,
|
|
HPPA_INS_FID,
|
|
HPPA_INS_FLDD,
|
|
HPPA_INS_FLDDS,
|
|
HPPA_INS_FLDDX,
|
|
HPPA_INS_FLDW,
|
|
HPPA_INS_FLDWS,
|
|
HPPA_INS_FLDWX,
|
|
HPPA_INS_FMPY,
|
|
HPPA_INS_FMPYADD,
|
|
HPPA_INS_FMPYFADD,
|
|
HPPA_INS_FMPYNFADD,
|
|
HPPA_INS_FMPYSUB,
|
|
HPPA_INS_FNEG,
|
|
HPPA_INS_FNEGABS,
|
|
HPPA_INS_FREM,
|
|
HPPA_INS_FRND,
|
|
HPPA_INS_FSQRT,
|
|
HPPA_INS_FSTD,
|
|
HPPA_INS_FSTDS,
|
|
HPPA_INS_FSTDX,
|
|
HPPA_INS_FSTW,
|
|
HPPA_INS_FSTWS,
|
|
HPPA_INS_FSTWX,
|
|
HPPA_INS_FSTQS,
|
|
HPPA_INS_FSTQX,
|
|
HPPA_INS_FSUB,
|
|
HPPA_INS_FTEST,
|
|
HPPA_INS_GATE,
|
|
HPPA_INS_GFR,
|
|
HPPA_INS_GFW,
|
|
HPPA_INS_GRSHDW,
|
|
HPPA_INS_HADD,
|
|
HPPA_INS_HAVG,
|
|
HPPA_INS_HSHL,
|
|
HPPA_INS_HSHLADD,
|
|
HPPA_INS_HSHR,
|
|
HPPA_INS_HSHRADD,
|
|
HPPA_INS_HSUB,
|
|
HPPA_INS_IDTLBA,
|
|
HPPA_INS_IDTLBP,
|
|
HPPA_INS_IDTLBT,
|
|
HPPA_INS_IDCOR,
|
|
HPPA_INS_IITLBA,
|
|
HPPA_INS_IITLBP,
|
|
HPPA_INS_IITLBT,
|
|
HPPA_INS_LCI,
|
|
HPPA_INS_LDB,
|
|
HPPA_INS_LDBS,
|
|
HPPA_INS_LDBX,
|
|
HPPA_INS_LDCD,
|
|
HPPA_INS_LDCW,
|
|
HPPA_INS_LDCWS,
|
|
HPPA_INS_LDCWX,
|
|
HPPA_INS_LDD,
|
|
HPPA_INS_LDDA,
|
|
HPPA_INS_LDH,
|
|
HPPA_INS_LDHS,
|
|
HPPA_INS_LDHX,
|
|
HPPA_INS_LDI,
|
|
HPPA_INS_LDIL,
|
|
HPPA_INS_LDO,
|
|
HPPA_INS_LDSID,
|
|
HPPA_INS_LDW,
|
|
HPPA_INS_LDWA,
|
|
HPPA_INS_LDWAS,
|
|
HPPA_INS_LDWAX,
|
|
HPPA_INS_LDWM,
|
|
HPPA_INS_LDWS,
|
|
HPPA_INS_LDWX,
|
|
HPPA_INS_LPA,
|
|
HPPA_INS_MFCPU,
|
|
HPPA_INS_MFCTL,
|
|
HPPA_INS_MFIA,
|
|
HPPA_INS_MFSP,
|
|
HPPA_INS_MIXH,
|
|
HPPA_INS_MIXW,
|
|
HPPA_INS_MOVB,
|
|
HPPA_INS_MOVIB,
|
|
HPPA_INS_MTCPU,
|
|
HPPA_INS_MTCTL,
|
|
HPPA_INS_MTSAR,
|
|
HPPA_INS_MTSARCM,
|
|
HPPA_INS_MTSM,
|
|
HPPA_INS_MTSP,
|
|
HPPA_INS_NOP,
|
|
HPPA_INS_OR,
|
|
HPPA_INS_PDC,
|
|
HPPA_INS_PDTLB,
|
|
HPPA_INS_PDTLBE,
|
|
HPPA_INS_PERMH,
|
|
HPPA_INS_PITLB,
|
|
HPPA_INS_PITLBE,
|
|
HPPA_INS_PMDIS,
|
|
HPPA_INS_PMENB,
|
|
HPPA_INS_POPBTS,
|
|
HPPA_INS_PROBE,
|
|
HPPA_INS_PROBEI,
|
|
HPPA_INS_PROBER,
|
|
HPPA_INS_PROBERI,
|
|
HPPA_INS_PROBEW,
|
|
HPPA_INS_PROBEWI,
|
|
HPPA_INS_PUSHBTS,
|
|
HPPA_INS_PUSHNOM,
|
|
HPPA_INS_RET,
|
|
HPPA_INS_RFI,
|
|
HPPA_INS_RFIR,
|
|
HPPA_INS_RSM,
|
|
HPPA_INS_SHDWGR,
|
|
HPPA_INS_SHLADD,
|
|
HPPA_INS_SH1ADD,
|
|
HPPA_INS_SH1ADDL,
|
|
HPPA_INS_SH1ADDO,
|
|
HPPA_INS_SH2ADD,
|
|
HPPA_INS_SH2ADDL,
|
|
HPPA_INS_SH2ADDO,
|
|
HPPA_INS_SH3ADD,
|
|
HPPA_INS_SH3ADDL,
|
|
HPPA_INS_SH3ADDO,
|
|
HPPA_INS_SHD,
|
|
HPPA_INS_SHRPD,
|
|
HPPA_INS_SHRPW,
|
|
HPPA_INS_SPOP0,
|
|
HPPA_INS_SPOP1,
|
|
HPPA_INS_SPOP2,
|
|
HPPA_INS_SPOP3,
|
|
HPPA_INS_SSM,
|
|
HPPA_INS_STB,
|
|
HPPA_INS_STBS,
|
|
HPPA_INS_STBY,
|
|
HPPA_INS_STBYS,
|
|
HPPA_INS_STD,
|
|
HPPA_INS_STDA,
|
|
HPPA_INS_STDBY,
|
|
HPPA_INS_STH,
|
|
HPPA_INS_STHS,
|
|
HPPA_INS_STW,
|
|
HPPA_INS_STWA,
|
|
HPPA_INS_STWAS,
|
|
HPPA_INS_STWS,
|
|
HPPA_INS_STWM,
|
|
HPPA_INS_SUB,
|
|
HPPA_INS_SUBB,
|
|
HPPA_INS_SUBBO,
|
|
HPPA_INS_SUBI,
|
|
HPPA_INS_SUBIO,
|
|
HPPA_INS_SUBO,
|
|
HPPA_INS_SUBT,
|
|
HPPA_INS_SUBTO,
|
|
HPPA_INS_SYNC,
|
|
HPPA_INS_SYNCDMA,
|
|
HPPA_INS_TOCDIS,
|
|
HPPA_INS_TOCEN,
|
|
HPPA_INS_UADDCM,
|
|
HPPA_INS_UADDCMT,
|
|
HPPA_INS_UXOR,
|
|
HPPA_INS_VDEP,
|
|
HPPA_INS_VDEPI,
|
|
HPPA_INS_VEXTRS,
|
|
HPPA_INS_VEXTRU,
|
|
HPPA_INS_VSHD,
|
|
HPPA_INS_XMPYU,
|
|
HPPA_INS_XOR,
|
|
HPPA_INS_ZDEP,
|
|
HPPA_INS_ZDEPI,
|
|
HPPA_INS_ZVDEP,
|
|
HPPA_INS_ZVDEPI,
|
|
|
|
HPPA_INS_ENDING
|
|
} hppa_insn;
|
|
|
|
/// HPPA space select operand
|
|
typedef struct hppa_mem {
|
|
hppa_reg base;
|
|
hppa_reg space;
|
|
cs_ac_type base_access;
|
|
} hppa_mem;
|
|
|
|
// Instruction operand
|
|
typedef struct cs_hppa_op {
|
|
hppa_op_type type; ///< operand type
|
|
union {
|
|
hppa_reg reg; ///< register value for REG operand
|
|
int64_t imm; ///< immediate value for IMM operand
|
|
hppa_mem mem;
|
|
};
|
|
cs_ac_type access;
|
|
} cs_hppa_op;
|
|
|
|
// Instruction structure
|
|
typedef struct cs_hppa {
|
|
// Number of operands of this instruction,
|
|
// or 0 when instruction has no operand.
|
|
uint8_t op_count;
|
|
cs_hppa_op operands[NUM_HPPA_OPS]; ///< operands for hppa instruction.
|
|
} cs_hppa;
|
|
|
|
/// HPPA modifiers type. Can be string (most of them) or int (uid, sop)
|
|
typedef enum hppa_modifier_type {
|
|
HPPA_MOD_STR = 0,
|
|
HPPA_MOD_INT = 1
|
|
} hppa_modifier_type;
|
|
|
|
/// hppa string/integer modifier
|
|
typedef struct hppa_modifier {
|
|
hppa_modifier_type type;
|
|
union {
|
|
char str_mod[HPPA_STR_MODIFIER_LEN];
|
|
uint32_t int_mod;
|
|
};
|
|
|
|
} hppa_modifier;
|
|
|
|
// Additional instruction info
|
|
typedef struct hppa_ext {
|
|
hppa_modifier modifiers[HPPA_MAX_MODIFIERS_LEN]; ///< instruction modifiers array
|
|
uint8_t mod_num; ///< number of modifiers of current instruction
|
|
bool b_writeble; ///< true if some load/store modifier has modify base register bit
|
|
bool is_alternative; ///< true if some modifier affects instruction format
|
|
} hppa_ext;
|
|
|
|
// Group of HPPA instructions
|
|
typedef enum hppa_insn_group {
|
|
HPPA_GRP_INVALID = 0, ///< = CS_GRP_INVALID
|
|
|
|
HPPA_GRP_COMPUTATION = 128,
|
|
HPPA_GRP_MULTIMEDIA,
|
|
HPPA_GRP_MEM_REF,
|
|
HPPA_GRP_LONG_IMM,
|
|
HPPA_GRP_BRANCH,
|
|
HPPA_GRP_SYSCTRL,
|
|
HPPA_GRP_ASSIST,
|
|
HPPA_GRP_FLOAT,
|
|
HPPA_GRP_PERFMON,
|
|
|
|
HPPA_GRP_ENDING,
|
|
} hppa_insn_group;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|