rizin/libr/asm/arch/rsp/rsp_idec.h
bsmiles32 622e828e1d Add basic support for N64 RSP processor. (#5269)
* Add basic support for N64 RSP processor.
This includes:
* a table driven instruction decoder (rsp_idec)
* a disassembler
* a very primitive anal plugin
2016-07-03 22:03:26 +02:00

179 lines
3.3 KiB
C

/* radare - LGPL - Copyright 2016 - bobby.smiles32@gmail.com */
#ifndef R_ASM_ARCH_RSP_RSP_IDEC_H
#define R_ASM_ARCH_RSP_RSP_IDEC_H
#include <r_types.h>
extern const char* rsp_gp_reg_soft_names[];
extern const char* rsp_c0_reg_soft_names[];
extern const char* rsp_gp_reg_names[];
extern const char* rsp_c0_reg_names[];
extern const char* rsp_c2_creg_names[];
extern const char* rsp_c2_accu_names[];
extern const char* rsp_c2_vreg_names[];
extern const char* rsp_c2_vreg_element_names[];
enum {
RSP_DMEM_OFFSET = 0x0000,
RSP_IMEM_OFFSET = 0x1000
};
/* restrict address inside rsp MEM */
static inline ut64 rsp_mem_addr(ut64 addr, ut64 base) { addr &= 0xfff; addr |= base; return addr; }
typedef enum {
RSP_OP_INVALID,
RSP_OP_NOP,
RSP_OP_SLL,
RSP_OP_SRL,
RSP_OP_SRA,
RSP_OP_SLLV,
RSP_OP_SRLV,
RSP_OP_SRAV,
RSP_OP_JR,
RSP_OP_BREAK,
RSP_OP_ADD,
RSP_OP_ADDU,
RSP_OP_SUB,
RSP_OP_SUBU,
RSP_OP_AND,
RSP_OP_OR,
RSP_OP_XOR,
RSP_OP_NOR,
RSP_OP_SLT,
RSP_OP_SLTU,
RSP_OP_BLTZ,
RSP_OP_BGEZ,
RSP_OP_BLTZAL,
RSP_OP_BGEZAL,
RSP_OP_MFC0,
RSP_OP_MTC0,
RSP_OP_MFC2,
RSP_OP_MTC2,
RSP_OP_CFC2,
RSP_OP_CTC2,
RSP_OP_VMULF,
RSP_OP_VMULU,
RSP_OP_VMUDL,
RSP_OP_VMUDM,
RSP_OP_VMUDN,
RSP_OP_VMUDH,
RSP_OP_VMACF,
RSP_OP_VMACU,
RSP_OP_VMADL,
RSP_OP_VMADM,
RSP_OP_VMADN,
RSP_OP_VMADH,
RSP_OP_VADD,
RSP_OP_VSUB,
RSP_OP_VABS,
RSP_OP_VADDC,
RSP_OP_VSUBC,
RSP_OP_VSAR,
RSP_OP_VLT,
RSP_OP_VEQ,
RSP_OP_VNE,
RSP_OP_VGE,
RSP_OP_VCL,
RSP_OP_VCH,
RSP_OP_VCR,
RSP_OP_VMRG,
RSP_OP_VAND,
RSP_OP_VNAND,
RSP_OP_VOR,
RSP_OP_VNOR,
RSP_OP_VXOR,
RSP_OP_VNXOR,
RSP_OP_VRCP,
RSP_OP_VRCPL,
RSP_OP_VRCPH,
RSP_OP_VMOV,
RSP_OP_VRSQ,
RSP_OP_VRSQL,
RSP_OP_VRSQH,
RSP_OP_VNOP,
RSP_OP_LBV,
RSP_OP_LSV,
RSP_OP_LLV,
RSP_OP_LDV,
RSP_OP_LQV,
RSP_OP_LRV,
RSP_OP_LPV,
RSP_OP_LUV,
RSP_OP_LHV,
RSP_OP_LFV,
RSP_OP_LTV,
RSP_OP_SBV,
RSP_OP_SSV,
RSP_OP_SLV,
RSP_OP_SDV,
RSP_OP_SQV,
RSP_OP_SRV,
RSP_OP_SPV,
RSP_OP_SUV,
RSP_OP_SHV,
RSP_OP_SFV,
RSP_OP_SWV,
RSP_OP_STV,
RSP_OP_J,
RSP_OP_JAL,
RSP_OP_BEQ,
RSP_OP_BNE,
RSP_OP_BLEZ,
RSP_OP_BGTZ,
RSP_OP_ADDI,
RSP_OP_ADDIU,
RSP_OP_SLTI,
RSP_OP_SLTIU,
RSP_OP_ANDI,
RSP_OP_ORI,
RSP_OP_XORI,
RSP_OP_LUI,
RSP_OP_LB,
RSP_OP_LH,
RSP_OP_LW,
RSP_OP_LBU,
RSP_OP_LHU,
RSP_OP_SB,
RSP_OP_SH,
RSP_OP_SW
} rsp_opcode;
typedef enum {
RSP_OPND_GP_REG, /* u=reg_num */
RSP_OPND_TARGET, /* u=imem_address */
RSP_OPND_OFFSET, /* u=imem_address, s=offset */
RSP_OPND_ZIMM, /* u=zero-extended imm */
RSP_OPND_SIMM, /* s=sign extended imm */
RSP_OPND_SHIFT_AMOUNT, /* u=shift amount */
RSP_OPND_BASE_OFFSET, /* u=reg_numm, s=offset */
RSP_OPND_C0_REG, /* u=reg_num */
RSP_OPND_C2_CREG, /* u=reg_num */
RSP_OPND_C2_ACCU, /* u=reg_num */
RSP_OPND_C2_VREG, /* u=reg_num */
RSP_OPND_C2_VREG_BYTE, /* u=reg_num, s=byte element (0-15) */
RSP_OPND_C2_VREG_SCALAR, /* u=reg_num, s=scalar element (0-7) */
RSP_OPND_C2_VREG_ELEMENT /* u=reg_num, s=element (0-15) */
} rsp_operand_type;
typedef struct {
rsp_operand_type type;
ut64 u;
st64 s;
} rsp_operand;
enum { RSP_MAX_OPNDS = 3 };
typedef struct {
const char* mnemonic;
rsp_opcode opcode;
int noperands;
rsp_operand operands[RSP_MAX_OPNDS];
} rsp_instruction;
rsp_instruction rsp_instruction_decode(ut64 pc, ut32 iw);
#endif