diff options
| author | LinesPrower <LinesPrower@gmail.com> | 2009-10-04 08:19:51 +0000 |
|---|---|---|
| committer | LinesPrower <LinesPrower@gmail.com> | 2009-10-04 08:19:51 +0000 |
| commit | d52f0fc9155a982f302c2592431315d4cade8423 (patch) | |
| tree | acb4d9f72351ac319b300ac2d1144026f2bd347e /Source/Core | |
| parent | 26a60eb9bf477a8845c37366ceffd0874f13b0de (diff) | |
ExRAM iCache support in JIT IL
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4359 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/Src/PowerPC/Jit64IL/JitAsm.cpp | 56 |
1 files changed, 39 insertions, 17 deletions
diff --git a/Source/Core/Core/Src/PowerPC/Jit64IL/JitAsm.cpp b/Source/Core/Core/Src/PowerPC/Jit64IL/JitAsm.cpp index cccd2c2707..e070347492 100644 --- a/Source/Core/Core/Src/PowerPC/Jit64IL/JitAsm.cpp +++ b/Source/Core/Core/Src/PowerPC/Jit64IL/JitAsm.cpp @@ -89,23 +89,8 @@ void AsmRoutineManager::Generate() MOV(32, R(EAX), M(&PowerPC::ppcState.pc)); dispatcherPcInEAX = GetCodePtr(); -#ifdef JIT_UNLIMITED_ICACHE - AND(32, R(EAX), Imm32(JIT_ICACHE_MASK)); -#ifdef _M_IX86 - MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICache())); -#else - MOV(64, R(RSI), Imm64((u64)jit.GetBlockCache()->GetICache())); - MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); -#endif -#else -#ifdef _M_IX86 - AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); - MOV(32, R(EBX), Imm32((u32)Memory::base)); - MOV(32, R(EAX), MComplex(EBX, EAX, SCALE_1, 0)); -#else - MOV(32, R(EAX), MComplex(RBX, RAX, SCALE_1, 0)); -#endif -#endif + FixupBranch needinst = J(true); + const u8* haveinst = GetCodePtr(); TEST(32, R(EAX), Imm32(0xFC)); FixupBranch notfound = J_CC(CC_NZ); @@ -176,6 +161,43 @@ void AsmRoutineManager::Generate() ABI_PopAllCalleeSavedRegsAndAdjustStack(); RET(); + SetJumpTarget(needinst); +#ifdef JIT_UNLIMITED_ICACHE + + TEST(32, R(EAX), Imm32(JIT_ICACHE_EXRAM_BIT)); + FixupBranch exram = J_CC(CC_NZ); + + AND(32, R(EAX), Imm32(JIT_ICACHE_MASK)); +#ifdef _M_IX86 + MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICache())); +#else + MOV(64, R(RSI), Imm64((u64)jit.GetBlockCache()->GetICache())); + MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); +#endif + + FixupBranch getinst = J(); + SetJumpTarget(exram); + + AND(32, R(EAX), Imm32(JIT_ICACHEEX_MASK)); +#ifdef _M_IX86 + MOV(32, R(EAX), MDisp(EAX, (u32)jit.GetBlockCache()->GetICacheEx())); +#else + MOV(64, R(RSI), Imm64((u64)jit.GetBlockCache()->GetICacheEx())); + MOV(32, R(EAX), MComplex(RSI, EAX, SCALE_1, 0)); +#endif + + SetJumpTarget(getinst); +#else +#ifdef _M_IX86 + AND(32, R(EAX), Imm32(Memory::MEMVIEW32_MASK)); + MOV(32, R(EBX), Imm32((u32)Memory::base)); + MOV(32, R(EAX), MComplex(EBX, EAX, SCALE_1, 0)); +#else + MOV(32, R(EAX), MComplex(RBX, RAX, SCALE_1, 0)); +#endif +#endif + JMP(haveinst, true); + GenerateCommon(); } |
