summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorRyan Houdek <Sonicadvance1@gmail.com>2014-11-16 21:12:11 -0600
committerRyan Houdek <Sonicadvance1@gmail.com>2014-11-16 21:12:11 -0600
commitf9208dcc134f96801711955dc99ff3caae9c7d56 (patch)
treec99d10ad2e50f5b8eb9556d9a300e82beee241bc /Source/Core
parentaa2fc1f66b768420fcb6958948572f0faa89986d (diff)
Fixes ARMv7 FP loadstores using fastmem when not enabled.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp103
1 files changed, 56 insertions, 47 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp b/Source/Core/Core/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp
index 1e5021dc3f..ea5fecf5ce 100644
--- a/Source/Core/Core/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp
+++ b/Source/Core/Core/PowerPC/JitArm32/JitArm_LoadStoreFloating.cpp
@@ -135,8 +135,10 @@ void JitArm::lfXX(UGeckoInstruction inst)
MOV(RA, rB);
// This branch gets changed to a NOP when the fastpath fails
- FixupBranch fast_path = B();
- FixupBranch slow_out;
+ FixupBranch fast_path;
+ if (SConfig::GetInstance().m_LocalCoreStartupParameter.bFastmem)
+ fast_path = B();
+
{
PUSH(4, R0, R1, R2, R3);
MOV(R0, rB);
@@ -160,34 +162,36 @@ void JitArm::lfXX(UGeckoInstruction inst)
#endif
}
POP(4, R0, R1, R2, R3);
- slow_out = B();
}
- SetJumpTarget(fast_path);
+ if (SConfig::GetInstance().m_LocalCoreStartupParameter.bFastmem)
{
- Operand2 mask(2, 1); // ~(Memory::MEMVIEW32_MASK)
- ARMReg rC = gpr.GetReg();
- BIC(rC, rB, mask);
- MOVI2R(rA, (u32)Memory::base);
- ADD(rC, rC, rA);
-
- NEONXEmitter nemit(this);
- if (single)
- {
- nemit.VLD1(F_32, D0, rC);
- nemit.VREV32(I_8, D0, D0); // Byte swap to result
- VCVT(v0, S0, 0);
- VCVT(v1, S0, 0);
- }
- else
+ FixupBranch slow_out = B();
+ SetJumpTarget(fast_path);
{
- nemit.VLD1(I_64, v0, rC);
- nemit.VREV64(I_8, v0, v0); // Byte swap to result
+ Operand2 mask(2, 1); // ~(Memory::MEMVIEW32_MASK)
+ ARMReg rC = gpr.GetReg();
+ BIC(rC, rB, mask);
+ MOVI2R(rA, (u32)Memory::base);
+ ADD(rC, rC, rA);
+
+ NEONXEmitter nemit(this);
+ if (single)
+ {
+ nemit.VLD1(F_32, D0, rC);
+ nemit.VREV32(I_8, D0, D0); // Byte swap to result
+ VCVT(v0, S0, 0);
+ VCVT(v1, S0, 0);
+ }
+ else
+ {
+ nemit.VLD1(I_64, v0, rC);
+ nemit.VREV64(I_8, v0, v0); // Byte swap to result
+ }
+ gpr.Unlock(rC);
}
- gpr.Unlock(rC);
+ SetJumpTarget(slow_out);
}
- SetJumpTarget(slow_out);
-
gpr.Unlock(rA, rB);
SetJumpTarget(DoNotLoad);
}
@@ -309,8 +313,10 @@ void JitArm::stfXX(UGeckoInstruction inst)
}
// This branch gets changed to a NOP when the fastpath fails
- FixupBranch fast_path = B();
- FixupBranch slow_out;
+ FixupBranch fast_path;
+ if (SConfig::GetInstance().m_LocalCoreStartupParameter.bFastmem)
+ fast_path = B();
+
{
PUSH(4, R0, R1, R2, R3);
if (single)
@@ -334,33 +340,36 @@ void JitArm::stfXX(UGeckoInstruction inst)
BL(rA);
}
POP(4, R0, R1, R2, R3);
- slow_out = B();
}
- SetJumpTarget(fast_path);
- {
- Operand2 mask(2, 1); // ~(Memory::MEMVIEW32_MASK)
- ARMReg rC = gpr.GetReg();
- BIC(rC, rB, mask);
- MOVI2R(rA, (u32)Memory::base);
- ADD(rC, rC, rA);
- NEONXEmitter nemit(this);
- if (single)
- {
- VCVT(S0, v0, 0);
- nemit.VREV32(I_8, D0, D0);
- VSTR(S0, rC, 0);
- }
- else
+ if (SConfig::GetInstance().m_LocalCoreStartupParameter.bFastmem)
+ {
+ FixupBranch slow_out = B();
+ SetJumpTarget(fast_path);
{
- nemit.VREV64(I_8, D0, v0);
- VSTR(D0, rC, 0);
+ Operand2 mask(2, 1); // ~(Memory::MEMVIEW32_MASK)
+ ARMReg rC = gpr.GetReg();
+ BIC(rC, rB, mask);
+ MOVI2R(rA, (u32)Memory::base);
+ ADD(rC, rC, rA);
+
+ NEONXEmitter nemit(this);
+ if (single)
+ {
+ VCVT(S0, v0, 0);
+ nemit.VREV32(I_8, D0, D0);
+ VSTR(S0, rC, 0);
+ }
+ else
+ {
+ nemit.VREV64(I_8, D0, v0);
+ VSTR(D0, rC, 0);
+ }
+ gpr.Unlock(rC);
}
- gpr.Unlock(rC);
+ SetJumpTarget(slow_out);
}
- SetJumpTarget(slow_out);
-
gpr.Unlock(rA, rB);
}