1
0
Fork 0
forked from suyu/suyu

Merge pull request #770 from lioncash/dyncom_clean

dyncom: Minor cleanup.
This commit is contained in:
bunnei 2015-05-15 09:44:39 -04:00
commit 6abed88092
2 changed files with 260 additions and 275 deletions

View file

@ -13,6 +13,7 @@
#include "core/memory.h" #include "core/memory.h"
#include "core/hle/svc.h" #include "core/hle/svc.h"
#include "core/arm/disassembler/arm_disasm.h" #include "core/arm/disassembler/arm_disasm.h"
#include "core/arm/dyncom/arm_dyncom_dec.h"
#include "core/arm/dyncom/arm_dyncom_interpreter.h" #include "core/arm/dyncom/arm_dyncom_interpreter.h"
#include "core/arm/dyncom/arm_dyncom_thumb.h" #include "core/arm/dyncom/arm_dyncom_thumb.h"
#include "core/arm/dyncom/arm_dyncom_run.h" #include "core/arm/dyncom/arm_dyncom_run.h"
@ -68,6 +69,67 @@ static void remove_exclusive(ARMul_State* state, ARMword addr){
state->exclusive_tag = 0xFFFFFFFF; state->exclusive_tag = 0xFFFFFFFF;
} }
static int CondPassed(ARMul_State* cpu, unsigned int cond) {
const u32 NFLAG = cpu->NFlag;
const u32 ZFLAG = cpu->ZFlag;
const u32 CFLAG = cpu->CFlag;
const u32 VFLAG = cpu->VFlag;
int temp = 0;
switch (cond) {
case 0x0:
temp = ZFLAG;
break;
case 0x1: // NE
temp = !ZFLAG;
break;
case 0x2: // CS
temp = CFLAG;
break;
case 0x3: // CC
temp = !CFLAG;
break;
case 0x4: // MI
temp = NFLAG;
break;
case 0x5: // PL
temp = !NFLAG;
break;
case 0x6: // VS
temp = VFLAG;
break;
case 0x7: // VC
temp = !VFLAG;
break;
case 0x8: // HI
temp = (CFLAG && !ZFLAG);
break;
case 0x9: // LS
temp = (!CFLAG || ZFLAG);
break;
case 0xa: // GE
temp = ((!NFLAG && !VFLAG) || (NFLAG && VFLAG));
break;
case 0xb: // LT
temp = ((NFLAG && !VFLAG) || (!NFLAG && VFLAG));
break;
case 0xc: // GT
temp = ((!NFLAG && !VFLAG && !ZFLAG) || (NFLAG && VFLAG && !ZFLAG));
break;
case 0xd: // LE
temp = ((NFLAG && !VFLAG) || (!NFLAG && VFLAG)) || ZFLAG;
break;
case 0xe: // AL
temp = 1;
break;
case 0xf:
temp = 1;
break;
}
return temp;
}
static unsigned int DPO(Immediate)(ARMul_State* cpu, unsigned int sht_oper) { static unsigned int DPO(Immediate)(ARMul_State* cpu, unsigned int sht_oper) {
unsigned int immed_8 = BITS(sht_oper, 0, 7); unsigned int immed_8 = BITS(sht_oper, 0, 7);
unsigned int rotate_imm = BITS(sht_oper, 8, 11); unsigned int rotate_imm = BITS(sht_oper, 8, 11);
@ -224,14 +286,12 @@ static unsigned int DPO(RotateRightByRegister)(ARMul_State* cpu, unsigned int sh
typedef void (*get_addr_fp_t)(ARMul_State *cpu, unsigned int inst, unsigned int &virt_addr, unsigned int rw); typedef void (*get_addr_fp_t)(ARMul_State *cpu, unsigned int inst, unsigned int &virt_addr, unsigned int rw);
typedef struct _ldst_inst { struct ldst_inst {
unsigned int inst; unsigned int inst;
get_addr_fp_t get_addr; get_addr_fp_t get_addr;
} ldst_inst; };
#define DEBUG_MSG LOG_DEBUG(Core_ARM11, "inst is %x", inst); CITRA_IGNORE_EXIT(0) #define DEBUG_MSG LOG_DEBUG(Core_ARM11, "inst is %x", inst); CITRA_IGNORE_EXIT(0)
int CondPassed(ARMul_State* cpu, unsigned int cond);
#define LnSWoUB(s) glue(LnSWoUB, s) #define LnSWoUB(s) glue(LnSWoUB, s)
#define MLnS(s) glue(MLnS, s) #define MLnS(s) glue(MLnS, s)
#define LdnStM(s) glue(LdnStM, s) #define LdnStM(s) glue(LdnStM, s)
@ -647,255 +707,248 @@ static void LnSWoUB(ScaledRegisterOffset)(ARMul_State* cpu, unsigned int inst, u
virt_addr = addr; virt_addr = addr;
} }
typedef struct _arm_inst { struct arm_inst {
unsigned int idx; unsigned int idx;
unsigned int cond; unsigned int cond;
int br; int br;
int load_r15; int load_r15;
char component[0]; char component[0];
} arm_inst; };
typedef struct generic_arm_inst { struct generic_arm_inst {
u32 Ra; u32 Ra;
u32 Rm; u32 Rm;
u32 Rn; u32 Rn;
u32 Rd; u32 Rd;
u8 op1; u8 op1;
u8 op2; u8 op2;
} generic_arm_inst; };
typedef struct _adc_inst { struct adc_inst {
unsigned int I; unsigned int I;
unsigned int S; unsigned int S;
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} adc_inst; };
typedef struct _add_inst { struct add_inst {
unsigned int I; unsigned int I;
unsigned int S; unsigned int S;
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} add_inst; };
typedef struct _orr_inst { struct orr_inst {
unsigned int I; unsigned int I;
unsigned int S; unsigned int S;
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} orr_inst; };
typedef struct _and_inst { struct and_inst {
unsigned int I; unsigned int I;
unsigned int S; unsigned int S;
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} and_inst; };
typedef struct _eor_inst { struct eor_inst {
unsigned int I; unsigned int I;
unsigned int S; unsigned int S;
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} eor_inst; };
typedef struct _bbl_inst { struct bbl_inst {
unsigned int L; unsigned int L;
int signed_immed_24; int signed_immed_24;
unsigned int next_addr; unsigned int next_addr;
unsigned int jmp_addr; unsigned int jmp_addr;
} bbl_inst; };
typedef struct _bx_inst { struct bx_inst {
unsigned int Rm; unsigned int Rm;
} bx_inst; };
typedef struct _blx_inst { struct blx_inst {
union { union {
int32_t signed_immed_24; int32_t signed_immed_24;
uint32_t Rm; uint32_t Rm;
} val; } val;
unsigned int inst; unsigned int inst;
} blx_inst; };
typedef struct _clz_inst { struct clz_inst {
unsigned int Rm; unsigned int Rm;
unsigned int Rd; unsigned int Rd;
} clz_inst; };
typedef struct _cps_inst { struct cps_inst {
unsigned int imod0; unsigned int imod0;
unsigned int imod1; unsigned int imod1;
unsigned int mmod; unsigned int mmod;
unsigned int A, I, F; unsigned int A, I, F;
unsigned int mode; unsigned int mode;
} cps_inst; };
typedef struct _clrex_inst { struct clrex_inst {
} clrex_inst; };
typedef struct _cpy_inst { struct cpy_inst {
unsigned int Rm; unsigned int Rm;
unsigned int Rd; unsigned int Rd;
} cpy_inst; };
typedef struct _bic_inst { struct bic_inst {
unsigned int I; unsigned int I;
unsigned int S; unsigned int S;
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} bic_inst; };
typedef struct _sub_inst { struct sub_inst {
unsigned int I; unsigned int I;
unsigned int S; unsigned int S;
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} sub_inst; };
typedef struct _tst_inst { struct tst_inst {
unsigned int I; unsigned int I;
unsigned int S; unsigned int S;
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} tst_inst; };
typedef struct _cmn_inst { struct cmn_inst {
unsigned int I; unsigned int I;
unsigned int Rn; unsigned int Rn;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} cmn_inst; };
typedef struct _teq_inst { struct teq_inst {
unsigned int I; unsigned int I;
unsigned int Rn; unsigned int Rn;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} teq_inst; };
typedef struct _stm_inst { struct stm_inst {
unsigned int inst; unsigned int inst;
} stm_inst; };
struct bkpt_inst { struct bkpt_inst {
u32 imm; u32 imm;
}; };
struct blx1_inst { struct stc_inst {
unsigned int addr;
}; };
struct blx2_inst { struct ldc_inst {
unsigned int Rm;
}; };
typedef struct _stc_inst { struct swi_inst {
} stc_inst;
typedef struct _ldc_inst {
} ldc_inst;
typedef struct _swi_inst {
unsigned int num; unsigned int num;
} swi_inst; };
typedef struct _cmp_inst { struct cmp_inst {
unsigned int I; unsigned int I;
unsigned int Rn; unsigned int Rn;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} cmp_inst; };
typedef struct _mov_inst { struct mov_inst {
unsigned int I; unsigned int I;
unsigned int S; unsigned int S;
unsigned int Rd; unsigned int Rd;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} mov_inst; };
typedef struct _mvn_inst { struct mvn_inst {
unsigned int I; unsigned int I;
unsigned int S; unsigned int S;
unsigned int Rd; unsigned int Rd;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} mvn_inst; };
typedef struct _rev_inst { struct rev_inst {
unsigned int Rd; unsigned int Rd;
unsigned int Rm; unsigned int Rm;
unsigned int op1; unsigned int op1;
unsigned int op2; unsigned int op2;
} rev_inst; };
typedef struct _rsb_inst { struct rsb_inst {
unsigned int I; unsigned int I;
unsigned int S; unsigned int S;
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} rsb_inst; };
typedef struct _rsc_inst { struct rsc_inst {
unsigned int I; unsigned int I;
unsigned int S; unsigned int S;
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} rsc_inst; };
typedef struct _sbc_inst { struct sbc_inst {
unsigned int I; unsigned int I;
unsigned int S; unsigned int S;
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int shifter_operand; unsigned int shifter_operand;
shtop_fp_t shtop_func; shtop_fp_t shtop_func;
} sbc_inst; };
typedef struct _mul_inst { struct mul_inst {
unsigned int S; unsigned int S;
unsigned int Rd; unsigned int Rd;
unsigned int Rs; unsigned int Rs;
unsigned int Rm; unsigned int Rm;
} mul_inst; };
typedef struct _smul_inst { struct smul_inst {
unsigned int Rd; unsigned int Rd;
unsigned int Rs; unsigned int Rs;
unsigned int Rm; unsigned int Rm;
unsigned int x; unsigned int x;
unsigned int y; unsigned int y;
} smul_inst; };
typedef struct _umull_inst { struct umull_inst {
unsigned int S; unsigned int S;
unsigned int RdHi; unsigned int RdHi;
unsigned int RdLo; unsigned int RdLo;
unsigned int Rs; unsigned int Rs;
unsigned int Rm; unsigned int Rm;
} umull_inst; };
typedef struct _smlad_inst {
struct smlad_inst {
unsigned int m; unsigned int m;
unsigned int Rm; unsigned int Rm;
unsigned int Rd; unsigned int Rd;
@ -903,58 +956,58 @@ typedef struct _smlad_inst {
unsigned int Rn; unsigned int Rn;
unsigned int op1; unsigned int op1;
unsigned int op2; unsigned int op2;
} smlad_inst; };
typedef struct _smla_inst { struct smla_inst {
unsigned int x; unsigned int x;
unsigned int y; unsigned int y;
unsigned int Rm; unsigned int Rm;
unsigned int Rd; unsigned int Rd;
unsigned int Rs; unsigned int Rs;
unsigned int Rn; unsigned int Rn;
} smla_inst; };
typedef struct smlalxy_inst { struct smlalxy_inst {
unsigned int x; unsigned int x;
unsigned int y; unsigned int y;
unsigned int RdLo; unsigned int RdLo;
unsigned int RdHi; unsigned int RdHi;
unsigned int Rm; unsigned int Rm;
unsigned int Rn; unsigned int Rn;
} smlalxy_inst; };
typedef struct ssat_inst { struct ssat_inst {
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int imm5; unsigned int imm5;
unsigned int sat_imm; unsigned int sat_imm;
unsigned int shift_type; unsigned int shift_type;
} ssat_inst; };
typedef struct umaal_inst { struct umaal_inst {
unsigned int Rn; unsigned int Rn;
unsigned int Rm; unsigned int Rm;
unsigned int RdHi; unsigned int RdHi;
unsigned int RdLo; unsigned int RdLo;
} umaal_inst; };
typedef struct _umlal_inst { struct umlal_inst {
unsigned int S; unsigned int S;
unsigned int Rm; unsigned int Rm;
unsigned int Rs; unsigned int Rs;
unsigned int RdHi; unsigned int RdHi;
unsigned int RdLo; unsigned int RdLo;
} umlal_inst; };
typedef struct _smlal_inst { struct smlal_inst {
unsigned int S; unsigned int S;
unsigned int Rm; unsigned int Rm;
unsigned int Rs; unsigned int Rs;
unsigned int RdHi; unsigned int RdHi;
unsigned int RdLo; unsigned int RdLo;
} smlal_inst; };
typedef struct smlald_inst { struct smlald_inst {
unsigned int RdLo; unsigned int RdLo;
unsigned int RdHi; unsigned int RdHi;
unsigned int Rm; unsigned int Rm;
@ -962,17 +1015,17 @@ typedef struct smlald_inst {
unsigned int swap; unsigned int swap;
unsigned int op1; unsigned int op1;
unsigned int op2; unsigned int op2;
} smlald_inst; };
typedef struct _mla_inst { struct mla_inst {
unsigned int S; unsigned int S;
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int Rs; unsigned int Rs;
unsigned int Rm; unsigned int Rm;
} mla_inst; };
typedef struct _mrc_inst { struct mrc_inst {
unsigned int opcode_1; unsigned int opcode_1;
unsigned int opcode_2; unsigned int opcode_2;
unsigned int cp_num; unsigned int cp_num;
@ -980,9 +1033,9 @@ typedef struct _mrc_inst {
unsigned int crm; unsigned int crm;
unsigned int Rd; unsigned int Rd;
unsigned int inst; unsigned int inst;
} mrc_inst; };
typedef struct _mcr_inst { struct mcr_inst {
unsigned int opcode_1; unsigned int opcode_1;
unsigned int opcode_2; unsigned int opcode_2;
unsigned int cp_num; unsigned int cp_num;
@ -990,77 +1043,77 @@ typedef struct _mcr_inst {
unsigned int crm; unsigned int crm;
unsigned int Rd; unsigned int Rd;
unsigned int inst; unsigned int inst;
} mcr_inst; };
typedef struct mcrr_inst { struct mcrr_inst {
unsigned int opcode_1; unsigned int opcode_1;
unsigned int cp_num; unsigned int cp_num;
unsigned int crm; unsigned int crm;
unsigned int rt; unsigned int rt;
unsigned int rt2; unsigned int rt2;
} mcrr_inst; };
typedef struct _mrs_inst { struct mrs_inst {
unsigned int R; unsigned int R;
unsigned int Rd; unsigned int Rd;
} mrs_inst; };
typedef struct _msr_inst { struct msr_inst {
unsigned int field_mask; unsigned int field_mask;
unsigned int R; unsigned int R;
unsigned int inst; unsigned int inst;
} msr_inst; };
typedef struct _pld_inst { struct pld_inst {
} pld_inst; };
typedef struct _sxtb_inst { struct sxtb_inst {
unsigned int Rd; unsigned int Rd;
unsigned int Rm; unsigned int Rm;
unsigned int rotate; unsigned int rotate;
} sxtb_inst; };
typedef struct _sxtab_inst { struct sxtab_inst {
unsigned int Rd; unsigned int Rd;
unsigned int Rn; unsigned int Rn;
unsigned int Rm; unsigned int Rm;
unsigned rotate; unsigned rotate;
} sxtab_inst; };
typedef struct _sxtah_inst { struct sxtah_inst {
unsigned int Rd; unsigned int Rd;
unsigned int Rn; unsigned int Rn;
unsigned int Rm; unsigned int Rm;
unsigned int rotate; unsigned int rotate;
} sxtah_inst; };
typedef struct _sxth_inst { struct sxth_inst {
unsigned int Rd; unsigned int Rd;
unsigned int Rm; unsigned int Rm;
unsigned int rotate; unsigned int rotate;
} sxth_inst; };
typedef struct _uxtab_inst { struct uxtab_inst {
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int rotate; unsigned int rotate;
unsigned int Rm; unsigned int Rm;
} uxtab_inst; };
typedef struct _uxtah_inst { struct uxtah_inst {
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int rotate; unsigned int rotate;
unsigned int Rm; unsigned int Rm;
} uxtah_inst; };
typedef struct _uxth_inst { struct uxth_inst {
unsigned int Rd; unsigned int Rd;
unsigned int Rm; unsigned int Rm;
unsigned int rotate; unsigned int rotate;
} uxth_inst; };
typedef struct _cdp_inst { struct cdp_inst {
unsigned int opcode_1; unsigned int opcode_1;
unsigned int CRn; unsigned int CRn;
unsigned int CRd; unsigned int CRd;
@ -1068,56 +1121,56 @@ typedef struct _cdp_inst {
unsigned int opcode_2; unsigned int opcode_2;
unsigned int CRm; unsigned int CRm;
unsigned int inst; unsigned int inst;
}cdp_inst; };
typedef struct _uxtb_inst { struct uxtb_inst {
unsigned int Rd; unsigned int Rd;
unsigned int Rm; unsigned int Rm;
unsigned int rotate; unsigned int rotate;
} uxtb_inst; };
typedef struct _swp_inst { struct swp_inst {
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned int Rm; unsigned int Rm;
} swp_inst; };
typedef struct setend_inst { struct setend_inst {
unsigned int set_bigend; unsigned int set_bigend;
} setend_inst; };
typedef struct _b_2_thumb { struct b_2_thumb {
unsigned int imm; unsigned int imm;
}b_2_thumb; };
typedef struct _b_cond_thumb { struct b_cond_thumb {
unsigned int imm; unsigned int imm;
unsigned int cond; unsigned int cond;
}b_cond_thumb; };
typedef struct _bl_1_thumb { struct bl_1_thumb {
unsigned int imm; unsigned int imm;
}bl_1_thumb; };
typedef struct _bl_2_thumb { struct bl_2_thumb {
unsigned int imm; unsigned int imm;
}bl_2_thumb; };
typedef struct _blx_1_thumb { struct blx_1_thumb {
unsigned int imm; unsigned int imm;
unsigned int instr; unsigned int instr;
}blx_1_thumb; };
typedef struct _pkh_inst { struct pkh_inst {
unsigned int Rm; unsigned int Rm;
unsigned int Rn; unsigned int Rn;
unsigned int Rd; unsigned int Rd;
unsigned char imm; unsigned char imm;
} pkh_inst; };
typedef arm_inst * ARM_INST_PTR; typedef arm_inst * ARM_INST_PTR;
#define CACHE_BUFFER_SIZE (64 * 1024 * 2000) #define CACHE_BUFFER_SIZE (64 * 1024 * 2000)
char inst_buf[CACHE_BUFFER_SIZE]; static char inst_buf[CACHE_BUFFER_SIZE];
int top = 0; static int top = 0;
inline void *AllocBuffer(unsigned int size) { static inline void *AllocBuffer(unsigned int size) {
int start = top; int start = top;
top += size; top += size;
if (top > CACHE_BUFFER_SIZE) { if (top > CACHE_BUFFER_SIZE) {
@ -1127,74 +1180,6 @@ inline void *AllocBuffer(unsigned int size) {
return (void *)&inst_buf[start]; return (void *)&inst_buf[start];
} }
int CondPassed(ARMul_State* cpu, unsigned int cond) {
#define NFLAG cpu->NFlag
#define ZFLAG cpu->ZFlag
#define CFLAG cpu->CFlag
#define VFLAG cpu->VFlag
int temp = 0;
switch (cond) {
case 0x0:
temp = ZFLAG;
break;
case 0x1: // NE
temp = !ZFLAG;
break;
case 0x6: // VS
temp = VFLAG;
break;
case 0x7: // VC
temp = !VFLAG;
break;
case 0x4: // MI
temp = NFLAG;
break;
case 0x5: // PL
temp = !NFLAG;
break;
case 0x2: // CS
temp = CFLAG;
break;
case 0x3: // CC
temp = !CFLAG;
break;
case 0x8: // HI
temp = (CFLAG && !ZFLAG);
break;
case 0x9: // LS
temp = (!CFLAG || ZFLAG);
break;
case 0xa: // GE
temp = ((!NFLAG && !VFLAG) || (NFLAG && VFLAG));
break;
case 0xb: // LT
temp = ((NFLAG && !VFLAG) || (!NFLAG && VFLAG));
break;
case 0xc: // GT
temp = ((!NFLAG && !VFLAG && !ZFLAG) || (NFLAG && VFLAG && !ZFLAG));
break;
case 0xd: // LE
temp = ((NFLAG && !VFLAG) || (!NFLAG && VFLAG)) || ZFLAG;
break;
case 0xe: // AL
temp = 1;
break;
case 0xf:
temp = 1;
break;
}
return temp;
}
enum DECODE_STATUS {
DECODE_SUCCESS,
DECODE_FAILURE
};
int decode_arm_instr(uint32_t instr, int32_t *idx);
static shtop_fp_t get_shtop(unsigned int inst) { static shtop_fp_t get_shtop(unsigned int inst) {
if (BIT(inst, 25)) { if (BIT(inst, 25)) {
return DPO(Immediate); return DPO(Immediate);

View file

@ -13,10 +13,10 @@
/* VMLA */ /* VMLA */
/* cond 1110 0D00 Vn-- Vd-- 101X N0M0 Vm-- */ /* cond 1110 0D00 Vn-- Vd-- 101X N0M0 Vm-- */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vmla_inst { struct vmla_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vmla_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vmla)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vmla)(unsigned int inst, int index)
@ -63,10 +63,10 @@ VMLA_INST:
/* VNMLS */ /* VNMLS */
/* cond 1110 0D00 Vn-- Vd-- 101X N1M0 Vm-- */ /* cond 1110 0D00 Vn-- Vd-- 101X N1M0 Vm-- */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vmls_inst { struct vmls_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vmls_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vmls)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vmls)(unsigned int inst, int index)
@ -113,10 +113,10 @@ VMLS_INST:
/* VNMLA */ /* VNMLA */
/* cond 1110 0D01 Vn-- Vd-- 101X N1M0 Vm-- */ /* cond 1110 0D01 Vn-- Vd-- 101X N1M0 Vm-- */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vnmla_inst { struct vnmla_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vnmla_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vnmla)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vnmla)(unsigned int inst, int index)
@ -164,10 +164,10 @@ VNMLA_INST:
/* cond 1110 0D01 Vn-- Vd-- 101X N0M0 Vm-- */ /* cond 1110 0D01 Vn-- Vd-- 101X N0M0 Vm-- */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vnmls_inst { struct vnmls_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vnmls_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vnmls)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vnmls)(unsigned int inst, int index)
@ -214,10 +214,10 @@ VNMLS_INST:
/* VNMUL */ /* VNMUL */
/* cond 1110 0D10 Vn-- Vd-- 101X N0M0 Vm-- */ /* cond 1110 0D10 Vn-- Vd-- 101X N0M0 Vm-- */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vnmul_inst { struct vnmul_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vnmul_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vnmul)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vnmul)(unsigned int inst, int index)
@ -264,10 +264,10 @@ VNMUL_INST:
/* VMUL */ /* VMUL */
/* cond 1110 0D10 Vn-- Vd-- 101X N0M0 Vm-- */ /* cond 1110 0D10 Vn-- Vd-- 101X N0M0 Vm-- */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vmul_inst { struct vmul_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vmul_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vmul)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vmul)(unsigned int inst, int index)
@ -314,10 +314,10 @@ VMUL_INST:
/* VADD */ /* VADD */
/* cond 1110 0D11 Vn-- Vd-- 101X N0M0 Vm-- */ /* cond 1110 0D11 Vn-- Vd-- 101X N0M0 Vm-- */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vadd_inst { struct vadd_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vadd_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vadd)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vadd)(unsigned int inst, int index)
@ -364,10 +364,10 @@ VADD_INST:
/* VSUB */ /* VSUB */
/* cond 1110 0D11 Vn-- Vd-- 101X N1M0 Vm-- */ /* cond 1110 0D11 Vn-- Vd-- 101X N1M0 Vm-- */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vsub_inst { struct vsub_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vsub_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vsub)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vsub)(unsigned int inst, int index)
@ -414,10 +414,10 @@ VSUB_INST:
/* VDIV */ /* VDIV */
/* cond 1110 1D00 Vn-- Vd-- 101X N0M0 Vm-- */ /* cond 1110 1D00 Vn-- Vd-- 101X N0M0 Vm-- */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vdiv_inst { struct vdiv_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vdiv_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vdiv)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vdiv)(unsigned int inst, int index)
@ -465,11 +465,11 @@ VDIV_INST:
/* cond 1110 1D11 im4H Vd-- 101X 0000 im4L */ /* cond 1110 1D11 im4H Vd-- 101X 0000 im4L */
/* cond 1110 opc1 CRn- CRd- copr op20 CRm- CDP */ /* cond 1110 opc1 CRn- CRd- copr op20 CRm- CDP */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vmovi_inst { struct vmovi_inst {
unsigned int single; unsigned int single;
unsigned int d; unsigned int d;
unsigned int imm; unsigned int imm;
} vmovi_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vmovi)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vmovi)(unsigned int inst, int index)
@ -514,11 +514,11 @@ VMOVI_INST:
/* cond 1110 1D11 0000 Vd-- 101X 01M0 Vm-- */ /* cond 1110 1D11 0000 Vd-- 101X 01M0 Vm-- */
/* cond 1110 opc1 CRn- CRd- copr op20 CRm- CDP */ /* cond 1110 opc1 CRn- CRd- copr op20 CRm- CDP */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vmovr_inst { struct vmovr_inst {
unsigned int single; unsigned int single;
unsigned int d; unsigned int d;
unsigned int m; unsigned int m;
} vmovr_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vmovr)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vmovr)(unsigned int inst, int index)
@ -609,10 +609,10 @@ VABS_INST:
/* cond 1110 1D11 0001 Vd-- 101X 11M0 Vm-- */ /* cond 1110 1D11 0001 Vd-- 101X 11M0 Vm-- */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vneg_inst { struct vneg_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vneg_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vneg)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vneg)(unsigned int inst, int index)
@ -659,10 +659,10 @@ VNEG_INST:
/* VSQRT */ /* VSQRT */
/* cond 1110 1D11 0001 Vd-- 101X 11M0 Vm-- */ /* cond 1110 1D11 0001 Vd-- 101X 11M0 Vm-- */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vsqrt_inst { struct vsqrt_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vsqrt_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vsqrt)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vsqrt)(unsigned int inst, int index)
@ -709,10 +709,10 @@ VSQRT_INST:
/* VCMP VCMPE */ /* VCMP VCMPE */
/* cond 1110 1D11 0100 Vd-- 101X E1M0 Vm-- Encoding 1 */ /* cond 1110 1D11 0100 Vd-- 101X E1M0 Vm-- Encoding 1 */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vcmp_inst { struct vcmp_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vcmp_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vcmp)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vcmp)(unsigned int inst, int index)
@ -759,10 +759,10 @@ VCMP_INST:
/* VCMP VCMPE */ /* VCMP VCMPE */
/* cond 1110 1D11 0100 Vd-- 101X E1M0 Vm-- Encoding 2 */ /* cond 1110 1D11 0100 Vd-- 101X E1M0 Vm-- Encoding 2 */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vcmp2_inst { struct vcmp2_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vcmp2_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vcmp2)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vcmp2)(unsigned int inst, int index)
@ -809,10 +809,10 @@ VCMP2_INST:
/* VCVTBDS between double and single */ /* VCVTBDS between double and single */
/* cond 1110 1D11 0111 Vd-- 101X 11M0 Vm-- */ /* cond 1110 1D11 0111 Vd-- 101X 11M0 Vm-- */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vcvtbds_inst { struct vcvtbds_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vcvtbds_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vcvtbds)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vcvtbds)(unsigned int inst, int index)
@ -859,10 +859,10 @@ VCVTBDS_INST:
/* VCVTBFF between floating point and fixed point */ /* VCVTBFF between floating point and fixed point */
/* cond 1110 1D11 1op2 Vd-- 101X X1M0 Vm-- */ /* cond 1110 1D11 1op2 Vd-- 101X X1M0 Vm-- */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vcvtbff_inst { struct vcvtbff_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vcvtbff_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vcvtbff)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vcvtbff)(unsigned int inst, int index)
@ -911,10 +911,10 @@ VCVTBFF_INST:
/* VCVTBFI between floating point and integer */ /* VCVTBFI between floating point and integer */
/* cond 1110 1D11 1op2 Vd-- 101X X1M0 Vm-- */ /* cond 1110 1D11 1op2 Vd-- 101X X1M0 Vm-- */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vcvtbfi_inst { struct vcvtbfi_inst {
unsigned int instr; unsigned int instr;
unsigned int dp_operation; unsigned int dp_operation;
} vcvtbfi_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vcvtbfi)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vcvtbfi)(unsigned int inst, int index)
@ -967,11 +967,11 @@ VCVTBFI_INST:
/* cond 1110 000o Vn-- Rt-- 1010 N001 0000 */ /* cond 1110 000o Vn-- Rt-- 1010 N001 0000 */
/* cond 1110 op11 CRn- Rt-- copr op21 CRm- MRC */ /* cond 1110 op11 CRn- Rt-- copr op21 CRm- MRC */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vmovbrs_inst { struct vmovbrs_inst {
unsigned int to_arm; unsigned int to_arm;
unsigned int t; unsigned int t;
unsigned int n; unsigned int n;
} vmovbrs_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vmovbrs)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vmovbrs)(unsigned int inst, int index)
@ -1013,10 +1013,10 @@ VMOVBRS_INST:
/* cond 1110 1110 reg- Rt-- 1010 0001 0000 */ /* cond 1110 1110 reg- Rt-- 1010 0001 0000 */
/* cond 1110 op10 CRn- Rt-- copr op21 CRm- MCR */ /* cond 1110 op10 CRn- Rt-- copr op21 CRm- MCR */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vmsr_inst { struct vmsr_inst {
unsigned int reg; unsigned int reg;
unsigned int Rd; unsigned int Rd;
} vmsr_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vmsr)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vmsr)(unsigned int inst, int index)
@ -1040,7 +1040,7 @@ VMSR_INST:
{ {
if ((inst_base->cond == 0xe) || CondPassed(cpu, inst_base->cond)) { if ((inst_base->cond == 0xe) || CondPassed(cpu, inst_base->cond)) {
/* FIXME: special case for access to FPSID and FPEXC, VFP must be disabled , /* FIXME: special case for access to FPSID and FPEXC, VFP must be disabled ,
and in privilegied mode */ and in privileged mode */
/* Exceptions must be checked, according to v7 ref manual */ /* Exceptions must be checked, according to v7 ref manual */
CHECK_VFP_ENABLED; CHECK_VFP_ENABLED;
@ -1060,12 +1060,12 @@ VMSR_INST:
/* cond 1110 0XX0 Vd-- Rt-- 1011 DXX1 0000 */ /* cond 1110 0XX0 Vd-- Rt-- 1011 DXX1 0000 */
/* cond 1110 op10 CRn- Rt-- copr op21 CRm- MCR */ /* cond 1110 op10 CRn- Rt-- copr op21 CRm- MCR */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vmovbrc_inst { struct vmovbrc_inst {
unsigned int esize; unsigned int esize;
unsigned int index; unsigned int index;
unsigned int d; unsigned int d;
unsigned int t; unsigned int t;
} vmovbrc_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vmovbrc)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vmovbrc)(unsigned int inst, int index)
@ -1109,10 +1109,10 @@ VMOVBRC_INST:
/* cond 1110 1111 CRn- Rt-- 1010 0001 0000 */ /* cond 1110 1111 CRn- Rt-- 1010 0001 0000 */
/* cond 1110 op11 CRn- Rt-- copr op21 CRm- MRC */ /* cond 1110 op11 CRn- Rt-- copr op21 CRm- MRC */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vmrs_inst { struct vmrs_inst {
unsigned int reg; unsigned int reg;
unsigned int Rt; unsigned int Rt;
} vmrs_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vmrs)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vmrs)(unsigned int inst, int index)
@ -1136,7 +1136,7 @@ VMRS_INST:
{ {
if ((inst_base->cond == 0xe) || CondPassed(cpu, inst_base->cond)) { if ((inst_base->cond == 0xe) || CondPassed(cpu, inst_base->cond)) {
/* FIXME: special case for access to FPSID and FPEXC, VFP must be disabled, /* FIXME: special case for access to FPSID and FPEXC, VFP must be disabled,
and in privilegied mode */ and in privileged mode */
/* Exceptions must be checked, according to v7 ref manual */ /* Exceptions must be checked, according to v7 ref manual */
CHECK_VFP_ENABLED; CHECK_VFP_ENABLED;
@ -1191,12 +1191,12 @@ VMRS_INST:
/* cond 1110 XXX1 Vd-- Rt-- 1011 NXX1 0000 */ /* cond 1110 XXX1 Vd-- Rt-- 1011 NXX1 0000 */
/* cond 1110 op11 CRn- Rt-- copr op21 CRm- MCR */ /* cond 1110 op11 CRn- Rt-- copr op21 CRm- MCR */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vmovbcr_inst { struct vmovbcr_inst {
unsigned int esize; unsigned int esize;
unsigned int index; unsigned int index;
unsigned int d; unsigned int d;
unsigned int t; unsigned int t;
} vmovbcr_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vmovbcr)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vmovbcr)(unsigned int inst, int index)
@ -1245,12 +1245,12 @@ VMOVBCR_INST:
/* cond 1100 010X Rt2- Rt-- 1010 00X1 Vm-- */ /* cond 1100 010X Rt2- Rt-- 1010 00X1 Vm-- */
/* cond 1100 0101 Rt2- Rt-- copr opc1 CRm- MRRC */ /* cond 1100 0101 Rt2- Rt-- copr opc1 CRm- MRRC */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vmovbrrss_inst { struct vmovbrrss_inst {
unsigned int to_arm; unsigned int to_arm;
unsigned int t; unsigned int t;
unsigned int t2; unsigned int t2;
unsigned int m; unsigned int m;
} vmovbrrss_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vmovbrrss)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vmovbrrss)(unsigned int inst, int index)
@ -1294,12 +1294,12 @@ VMOVBRRSS_INST:
/* cond 1100 010X Rt2- Rt-- 1011 00X1 Vm-- */ /* cond 1100 010X Rt2- Rt-- 1011 00X1 Vm-- */
/* cond 1100 0101 Rt2- Rt-- copr opc1 CRm- MRRC */ /* cond 1100 0101 Rt2- Rt-- copr opc1 CRm- MRRC */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vmovbrrd_inst { struct vmovbrrd_inst {
unsigned int to_arm; unsigned int to_arm;
unsigned int t; unsigned int t;
unsigned int t2; unsigned int t2;
unsigned int m; unsigned int m;
} vmovbrrd_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vmovbrrd)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vmovbrrd)(unsigned int inst, int index)
@ -1347,13 +1347,13 @@ VMOVBRRD_INST:
/* VSTR */ /* VSTR */
/* cond 1101 UD00 Rn-- Vd-- 101X imm8 imm8 */ /* cond 1101 UD00 Rn-- Vd-- 101X imm8 imm8 */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vstr_inst { struct vstr_inst {
unsigned int single; unsigned int single;
unsigned int n; unsigned int n;
unsigned int d; unsigned int d;
unsigned int imm32; unsigned int imm32;
unsigned int add; unsigned int add;
} vstr_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vstr)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vstr)(unsigned int inst, int index)
@ -1415,12 +1415,12 @@ VSTR_INST:
/* VPUSH */ /* VPUSH */
/* cond 1101 0D10 1101 Vd-- 101X imm8 imm8 */ /* cond 1101 0D10 1101 Vd-- 101X imm8 imm8 */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vpush_inst { struct vpush_inst {
unsigned int single; unsigned int single;
unsigned int d; unsigned int d;
unsigned int imm32; unsigned int imm32;
unsigned int regs; unsigned int regs;
} vpush_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vpush)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vpush)(unsigned int inst, int index)
@ -1488,7 +1488,7 @@ VPUSH_INST:
/* VSTM */ /* VSTM */
/* cond 110P UDW0 Rn-- Vd-- 101X imm8 imm8 */ /* cond 110P UDW0 Rn-- Vd-- 101X imm8 imm8 */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vstm_inst { struct vstm_inst {
unsigned int single; unsigned int single;
unsigned int add; unsigned int add;
unsigned int wback; unsigned int wback;
@ -1496,7 +1496,7 @@ typedef struct _vstm_inst {
unsigned int n; unsigned int n;
unsigned int imm32; unsigned int imm32;
unsigned int regs; unsigned int regs;
} vstm_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vstm)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vstm)(unsigned int inst, int index)
@ -1570,12 +1570,12 @@ VSTM_INST: /* encoding 1 */
/* VPOP */ /* VPOP */
/* cond 1100 1D11 1101 Vd-- 101X imm8 imm8 */ /* cond 1100 1D11 1101 Vd-- 101X imm8 imm8 */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vpop_inst { struct vpop_inst {
unsigned int single; unsigned int single;
unsigned int d; unsigned int d;
unsigned int imm32; unsigned int imm32;
unsigned int regs; unsigned int regs;
} vpop_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vpop)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vpop)(unsigned int inst, int index)
@ -1643,13 +1643,13 @@ VPOP_INST:
/* VLDR */ /* VLDR */
/* cond 1101 UD01 Rn-- Vd-- 101X imm8 imm8 */ /* cond 1101 UD01 Rn-- Vd-- 101X imm8 imm8 */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vldr_inst { struct vldr_inst {
unsigned int single; unsigned int single;
unsigned int n; unsigned int n;
unsigned int d; unsigned int d;
unsigned int imm32; unsigned int imm32;
unsigned int add; unsigned int add;
} vldr_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vldr)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vldr)(unsigned int inst, int index)
@ -1711,7 +1711,7 @@ VLDR_INST:
/* VLDM */ /* VLDM */
/* cond 110P UDW1 Rn-- Vd-- 101X imm8 imm8 */ /* cond 110P UDW1 Rn-- Vd-- 101X imm8 imm8 */
#ifdef VFP_INTERPRETER_STRUCT #ifdef VFP_INTERPRETER_STRUCT
typedef struct _vldm_inst { struct vldm_inst {
unsigned int single; unsigned int single;
unsigned int add; unsigned int add;
unsigned int wback; unsigned int wback;
@ -1719,7 +1719,7 @@ typedef struct _vldm_inst {
unsigned int n; unsigned int n;
unsigned int imm32; unsigned int imm32;
unsigned int regs; unsigned int regs;
} vldm_inst; };
#endif #endif
#ifdef VFP_INTERPRETER_TRANS #ifdef VFP_INTERPRETER_TRANS
static ARM_INST_PTR INTERPRETER_TRANSLATE(vldm)(unsigned int inst, int index) static ARM_INST_PTR INTERPRETER_TRANSLATE(vldm)(unsigned int inst, int index)