Browse Source
Merge pull request #1898 from archshift/interpreter-split-take2
Merge pull request #1898 from archshift/interpreter-split-take2
Refactor arm_dyncom_interpreter into several files (take 2)nce_cpp
committed by
GitHub
5 changed files with 2729 additions and 2727 deletions
-
2src/core/CMakeLists.txt
-
2723src/core/arm/dyncom/arm_dyncom_interpreter.cpp
-
2178src/core/arm/dyncom/arm_dyncom_trans.cpp
-
493src/core/arm/dyncom/arm_dyncom_trans.h
-
64src/core/arm/skyeye_common/vfp/vfpinstr.cpp
2723
src/core/arm/dyncom/arm_dyncom_interpreter.cpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2178
src/core/arm/dyncom/arm_dyncom_trans.cpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,493 @@ |
|||||
|
struct ARMul_State; |
||||
|
typedef unsigned int (*shtop_fp_t)(ARMul_State* cpu, unsigned int sht_oper); |
||||
|
|
||||
|
enum class TransExtData { |
||||
|
COND = (1 << 0), |
||||
|
NON_BRANCH = (1 << 1), |
||||
|
DIRECT_BRANCH = (1 << 2), |
||||
|
INDIRECT_BRANCH = (1 << 3), |
||||
|
CALL = (1 << 4), |
||||
|
RET = (1 << 5), |
||||
|
END_OF_PAGE = (1 << 6), |
||||
|
THUMB = (1 << 7), |
||||
|
SINGLE_STEP = (1 << 8) |
||||
|
}; |
||||
|
|
||||
|
struct arm_inst { |
||||
|
unsigned int idx; |
||||
|
unsigned int cond; |
||||
|
TransExtData br; |
||||
|
char component[0]; |
||||
|
}; |
||||
|
|
||||
|
struct generic_arm_inst { |
||||
|
u32 Ra; |
||||
|
u32 Rm; |
||||
|
u32 Rn; |
||||
|
u32 Rd; |
||||
|
u8 op1; |
||||
|
u8 op2; |
||||
|
}; |
||||
|
|
||||
|
struct adc_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int S; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct add_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int S; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct orr_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int S; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct and_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int S; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct eor_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int S; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct bbl_inst { |
||||
|
unsigned int L; |
||||
|
int signed_immed_24; |
||||
|
unsigned int next_addr; |
||||
|
unsigned int jmp_addr; |
||||
|
}; |
||||
|
|
||||
|
struct bx_inst { |
||||
|
unsigned int Rm; |
||||
|
}; |
||||
|
|
||||
|
struct blx_inst { |
||||
|
union { |
||||
|
s32 signed_immed_24; |
||||
|
u32 Rm; |
||||
|
} val; |
||||
|
unsigned int inst; |
||||
|
}; |
||||
|
|
||||
|
struct clz_inst { |
||||
|
unsigned int Rm; |
||||
|
unsigned int Rd; |
||||
|
}; |
||||
|
|
||||
|
struct cps_inst { |
||||
|
unsigned int imod0; |
||||
|
unsigned int imod1; |
||||
|
unsigned int mmod; |
||||
|
unsigned int A, I, F; |
||||
|
unsigned int mode; |
||||
|
}; |
||||
|
|
||||
|
struct clrex_inst { |
||||
|
}; |
||||
|
|
||||
|
struct cpy_inst { |
||||
|
unsigned int Rm; |
||||
|
unsigned int Rd; |
||||
|
}; |
||||
|
|
||||
|
struct bic_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int S; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct sub_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int S; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct tst_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int S; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct cmn_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int Rn; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct teq_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int Rn; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct stm_inst { |
||||
|
unsigned int inst; |
||||
|
}; |
||||
|
|
||||
|
struct bkpt_inst { |
||||
|
u32 imm; |
||||
|
}; |
||||
|
|
||||
|
struct stc_inst { |
||||
|
}; |
||||
|
|
||||
|
struct ldc_inst { |
||||
|
}; |
||||
|
|
||||
|
struct swi_inst { |
||||
|
unsigned int num; |
||||
|
}; |
||||
|
|
||||
|
struct cmp_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int Rn; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct mov_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int S; |
||||
|
unsigned int Rd; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct mvn_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int S; |
||||
|
unsigned int Rd; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct rev_inst { |
||||
|
unsigned int Rd; |
||||
|
unsigned int Rm; |
||||
|
unsigned int op1; |
||||
|
unsigned int op2; |
||||
|
}; |
||||
|
|
||||
|
struct rsb_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int S; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct rsc_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int S; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct sbc_inst { |
||||
|
unsigned int I; |
||||
|
unsigned int S; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int shifter_operand; |
||||
|
shtop_fp_t shtop_func; |
||||
|
}; |
||||
|
|
||||
|
struct mul_inst { |
||||
|
unsigned int S; |
||||
|
unsigned int Rd; |
||||
|
unsigned int Rs; |
||||
|
unsigned int Rm; |
||||
|
}; |
||||
|
|
||||
|
struct smul_inst { |
||||
|
unsigned int Rd; |
||||
|
unsigned int Rs; |
||||
|
unsigned int Rm; |
||||
|
unsigned int x; |
||||
|
unsigned int y; |
||||
|
}; |
||||
|
|
||||
|
struct umull_inst { |
||||
|
unsigned int S; |
||||
|
unsigned int RdHi; |
||||
|
unsigned int RdLo; |
||||
|
unsigned int Rs; |
||||
|
unsigned int Rm; |
||||
|
}; |
||||
|
|
||||
|
struct smlad_inst { |
||||
|
unsigned int m; |
||||
|
unsigned int Rm; |
||||
|
unsigned int Rd; |
||||
|
unsigned int Ra; |
||||
|
unsigned int Rn; |
||||
|
unsigned int op1; |
||||
|
unsigned int op2; |
||||
|
}; |
||||
|
|
||||
|
struct smla_inst { |
||||
|
unsigned int x; |
||||
|
unsigned int y; |
||||
|
unsigned int Rm; |
||||
|
unsigned int Rd; |
||||
|
unsigned int Rs; |
||||
|
unsigned int Rn; |
||||
|
}; |
||||
|
|
||||
|
struct smlalxy_inst { |
||||
|
unsigned int x; |
||||
|
unsigned int y; |
||||
|
unsigned int RdLo; |
||||
|
unsigned int RdHi; |
||||
|
unsigned int Rm; |
||||
|
unsigned int Rn; |
||||
|
}; |
||||
|
|
||||
|
struct ssat_inst { |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int imm5; |
||||
|
unsigned int sat_imm; |
||||
|
unsigned int shift_type; |
||||
|
}; |
||||
|
|
||||
|
struct umaal_inst { |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rm; |
||||
|
unsigned int RdHi; |
||||
|
unsigned int RdLo; |
||||
|
}; |
||||
|
|
||||
|
struct umlal_inst { |
||||
|
unsigned int S; |
||||
|
unsigned int Rm; |
||||
|
unsigned int Rs; |
||||
|
unsigned int RdHi; |
||||
|
unsigned int RdLo; |
||||
|
}; |
||||
|
|
||||
|
struct smlal_inst { |
||||
|
unsigned int S; |
||||
|
unsigned int Rm; |
||||
|
unsigned int Rs; |
||||
|
unsigned int RdHi; |
||||
|
unsigned int RdLo; |
||||
|
}; |
||||
|
|
||||
|
struct smlald_inst { |
||||
|
unsigned int RdLo; |
||||
|
unsigned int RdHi; |
||||
|
unsigned int Rm; |
||||
|
unsigned int Rn; |
||||
|
unsigned int swap; |
||||
|
unsigned int op1; |
||||
|
unsigned int op2; |
||||
|
}; |
||||
|
|
||||
|
struct mla_inst { |
||||
|
unsigned int S; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int Rs; |
||||
|
unsigned int Rm; |
||||
|
}; |
||||
|
|
||||
|
struct mrc_inst { |
||||
|
unsigned int opcode_1; |
||||
|
unsigned int opcode_2; |
||||
|
unsigned int cp_num; |
||||
|
unsigned int crn; |
||||
|
unsigned int crm; |
||||
|
unsigned int Rd; |
||||
|
unsigned int inst; |
||||
|
}; |
||||
|
|
||||
|
struct mcr_inst { |
||||
|
unsigned int opcode_1; |
||||
|
unsigned int opcode_2; |
||||
|
unsigned int cp_num; |
||||
|
unsigned int crn; |
||||
|
unsigned int crm; |
||||
|
unsigned int Rd; |
||||
|
unsigned int inst; |
||||
|
}; |
||||
|
|
||||
|
struct mcrr_inst { |
||||
|
unsigned int opcode_1; |
||||
|
unsigned int cp_num; |
||||
|
unsigned int crm; |
||||
|
unsigned int rt; |
||||
|
unsigned int rt2; |
||||
|
}; |
||||
|
|
||||
|
struct mrs_inst { |
||||
|
unsigned int R; |
||||
|
unsigned int Rd; |
||||
|
}; |
||||
|
|
||||
|
struct msr_inst { |
||||
|
unsigned int field_mask; |
||||
|
unsigned int R; |
||||
|
unsigned int inst; |
||||
|
}; |
||||
|
|
||||
|
struct pld_inst { |
||||
|
}; |
||||
|
|
||||
|
struct sxtb_inst { |
||||
|
unsigned int Rd; |
||||
|
unsigned int Rm; |
||||
|
unsigned int rotate; |
||||
|
}; |
||||
|
|
||||
|
struct sxtab_inst { |
||||
|
unsigned int Rd; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rm; |
||||
|
unsigned rotate; |
||||
|
}; |
||||
|
|
||||
|
struct sxtah_inst { |
||||
|
unsigned int Rd; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rm; |
||||
|
unsigned int rotate; |
||||
|
}; |
||||
|
|
||||
|
struct sxth_inst { |
||||
|
unsigned int Rd; |
||||
|
unsigned int Rm; |
||||
|
unsigned int rotate; |
||||
|
}; |
||||
|
|
||||
|
struct uxtab_inst { |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int rotate; |
||||
|
unsigned int Rm; |
||||
|
}; |
||||
|
|
||||
|
struct uxtah_inst { |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int rotate; |
||||
|
unsigned int Rm; |
||||
|
}; |
||||
|
|
||||
|
struct uxth_inst { |
||||
|
unsigned int Rd; |
||||
|
unsigned int Rm; |
||||
|
unsigned int rotate; |
||||
|
}; |
||||
|
|
||||
|
struct cdp_inst { |
||||
|
unsigned int opcode_1; |
||||
|
unsigned int CRn; |
||||
|
unsigned int CRd; |
||||
|
unsigned int cp_num; |
||||
|
unsigned int opcode_2; |
||||
|
unsigned int CRm; |
||||
|
unsigned int inst; |
||||
|
}; |
||||
|
|
||||
|
struct uxtb_inst { |
||||
|
unsigned int Rd; |
||||
|
unsigned int Rm; |
||||
|
unsigned int rotate; |
||||
|
}; |
||||
|
|
||||
|
struct swp_inst { |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned int Rm; |
||||
|
}; |
||||
|
|
||||
|
struct setend_inst { |
||||
|
unsigned int set_bigend; |
||||
|
}; |
||||
|
|
||||
|
struct b_2_thumb { |
||||
|
unsigned int imm; |
||||
|
}; |
||||
|
struct b_cond_thumb { |
||||
|
unsigned int imm; |
||||
|
unsigned int cond; |
||||
|
}; |
||||
|
|
||||
|
struct bl_1_thumb { |
||||
|
unsigned int imm; |
||||
|
}; |
||||
|
struct bl_2_thumb { |
||||
|
unsigned int imm; |
||||
|
}; |
||||
|
struct blx_1_thumb { |
||||
|
unsigned int imm; |
||||
|
unsigned int instr; |
||||
|
}; |
||||
|
|
||||
|
struct pkh_inst { |
||||
|
unsigned int Rm; |
||||
|
unsigned int Rn; |
||||
|
unsigned int Rd; |
||||
|
unsigned char imm; |
||||
|
}; |
||||
|
|
||||
|
// Floating point VFPv3 structures |
||||
|
#define VFP_INTERPRETER_STRUCT |
||||
|
#include "core/arm/skyeye_common/vfp/vfpinstr.cpp" |
||||
|
#undef VFP_INTERPRETER_STRUCT |
||||
|
|
||||
|
typedef void (*get_addr_fp_t)(ARMul_State *cpu, unsigned int inst, unsigned int &virt_addr); |
||||
|
|
||||
|
struct ldst_inst { |
||||
|
unsigned int inst; |
||||
|
get_addr_fp_t get_addr; |
||||
|
}; |
||||
|
|
||||
|
typedef arm_inst* ARM_INST_PTR; |
||||
|
typedef ARM_INST_PTR (*transop_fp_t)(unsigned int, int); |
||||
|
|
||||
|
extern const transop_fp_t arm_instruction_trans[]; |
||||
|
extern const size_t arm_instruction_trans_len; |
||||
|
|
||||
|
#define TRANS_CACHE_SIZE (64 * 1024 * 2000) |
||||
|
extern char trans_cache_buf[TRANS_CACHE_SIZE]; |
||||
|
extern size_t trans_cache_buf_top; |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue