mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00
More efficient target register / TC accesses.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4794 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
a37ee56cb7
commit
b5dc7732e1
16 changed files with 327 additions and 246 deletions
|
@ -134,29 +134,53 @@ typedef struct mips_def_t mips_def_t;
|
|||
#define MIPS_TC_MAX 5
|
||||
#define MIPS_DSP_ACC 4
|
||||
|
||||
typedef struct TCState TCState;
|
||||
struct TCState {
|
||||
target_ulong gpr[32];
|
||||
target_ulong PC;
|
||||
target_ulong HI[MIPS_DSP_ACC];
|
||||
target_ulong LO[MIPS_DSP_ACC];
|
||||
target_ulong ACX[MIPS_DSP_ACC];
|
||||
target_ulong DSPControl;
|
||||
int32_t CP0_TCStatus;
|
||||
#define CP0TCSt_TCU3 31
|
||||
#define CP0TCSt_TCU2 30
|
||||
#define CP0TCSt_TCU1 29
|
||||
#define CP0TCSt_TCU0 28
|
||||
#define CP0TCSt_TMX 27
|
||||
#define CP0TCSt_RNST 23
|
||||
#define CP0TCSt_TDS 21
|
||||
#define CP0TCSt_DT 20
|
||||
#define CP0TCSt_DA 15
|
||||
#define CP0TCSt_A 13
|
||||
#define CP0TCSt_TKSU 11
|
||||
#define CP0TCSt_IXMT 10
|
||||
#define CP0TCSt_TASID 0
|
||||
int32_t CP0_TCBind;
|
||||
#define CP0TCBd_CurTC 21
|
||||
#define CP0TCBd_TBE 17
|
||||
#define CP0TCBd_CurVPE 0
|
||||
target_ulong CP0_TCHalt;
|
||||
target_ulong CP0_TCContext;
|
||||
target_ulong CP0_TCSchedule;
|
||||
target_ulong CP0_TCScheFBack;
|
||||
int32_t CP0_Debug_tcstatus;
|
||||
};
|
||||
|
||||
typedef struct CPUMIPSState CPUMIPSState;
|
||||
struct CPUMIPSState {
|
||||
/* General integer registers */
|
||||
target_ulong gpr[MIPS_SHADOW_SET_MAX][32];
|
||||
/* Special registers */
|
||||
target_ulong PC[MIPS_TC_MAX];
|
||||
TCState active_tc;
|
||||
|
||||
/* temporary hack for FP globals */
|
||||
#ifndef USE_HOST_FLOAT_REGS
|
||||
fpr_t ft0;
|
||||
fpr_t ft1;
|
||||
fpr_t ft2;
|
||||
#endif
|
||||
target_ulong HI[MIPS_TC_MAX][MIPS_DSP_ACC];
|
||||
target_ulong LO[MIPS_TC_MAX][MIPS_DSP_ACC];
|
||||
target_ulong ACX[MIPS_TC_MAX][MIPS_DSP_ACC];
|
||||
target_ulong DSPControl[MIPS_TC_MAX];
|
||||
|
||||
CPUMIPSMVPContext *mvp;
|
||||
CPUMIPSTLBContext *tlb;
|
||||
CPUMIPSFPUContext *fpu;
|
||||
uint32_t current_tc;
|
||||
target_ulong *current_tc_gprs;
|
||||
target_ulong *current_tc_hi;
|
||||
|
||||
uint32_t SEGBITS;
|
||||
target_ulong SEGMask;
|
||||
|
@ -206,28 +230,6 @@ struct CPUMIPSState {
|
|||
#define CP0VPEOpt_DWX1 1
|
||||
#define CP0VPEOpt_DWX0 0
|
||||
target_ulong CP0_EntryLo0;
|
||||
int32_t CP0_TCStatus[MIPS_TC_MAX];
|
||||
#define CP0TCSt_TCU3 31
|
||||
#define CP0TCSt_TCU2 30
|
||||
#define CP0TCSt_TCU1 29
|
||||
#define CP0TCSt_TCU0 28
|
||||
#define CP0TCSt_TMX 27
|
||||
#define CP0TCSt_RNST 23
|
||||
#define CP0TCSt_TDS 21
|
||||
#define CP0TCSt_DT 20
|
||||
#define CP0TCSt_DA 15
|
||||
#define CP0TCSt_A 13
|
||||
#define CP0TCSt_TKSU 11
|
||||
#define CP0TCSt_IXMT 10
|
||||
#define CP0TCSt_TASID 0
|
||||
int32_t CP0_TCBind[MIPS_TC_MAX];
|
||||
#define CP0TCBd_CurTC 21
|
||||
#define CP0TCBd_TBE 17
|
||||
#define CP0TCBd_CurVPE 0
|
||||
target_ulong CP0_TCHalt[MIPS_TC_MAX];
|
||||
target_ulong CP0_TCContext[MIPS_TC_MAX];
|
||||
target_ulong CP0_TCSchedule[MIPS_TC_MAX];
|
||||
target_ulong CP0_TCScheFBack[MIPS_TC_MAX];
|
||||
target_ulong CP0_EntryLo1;
|
||||
target_ulong CP0_Context;
|
||||
int32_t CP0_PageMask;
|
||||
|
@ -398,7 +400,6 @@ struct CPUMIPSState {
|
|||
#define CP0DB_DDBL 2
|
||||
#define CP0DB_DBp 1
|
||||
#define CP0DB_DSS 0
|
||||
int32_t CP0_Debug_tcstatus[MIPS_TC_MAX];
|
||||
target_ulong CP0_DEPC;
|
||||
int32_t CP0_Performance0;
|
||||
int32_t CP0_TagLo;
|
||||
|
@ -407,6 +408,8 @@ struct CPUMIPSState {
|
|||
int32_t CP0_DataHi;
|
||||
target_ulong CP0_ErrorEPC;
|
||||
int32_t CP0_DESAVE;
|
||||
/* We waste some space so we can handle shadow registers like TCs. */
|
||||
TCState tcs[MIPS_SHADOW_SET_MAX];
|
||||
/* Qemu */
|
||||
int interrupt_request;
|
||||
int error_code;
|
||||
|
@ -501,9 +504,9 @@ static inline int cpu_mmu_index (CPUState *env)
|
|||
static inline void cpu_clone_regs(CPUState *env, target_ulong newsp)
|
||||
{
|
||||
if (newsp)
|
||||
env->gpr[env->current_tc][29] = newsp;
|
||||
env->gpr[env->current_tc][7] = 0;
|
||||
env->gpr[env->current_tc][2] = 0;
|
||||
env->active_tc.gpr[29] = newsp;
|
||||
env->active_tc.gpr[7] = 0;
|
||||
env->active_tc.gpr[2] = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue