summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2016-02-12 11:07:28 +0100
committerdegasus <wickmarkus@web.de>2016-02-25 19:47:06 +0100
commitfe87462be8d5e6a9ea7aa3b53605ddced2f37bbd (patch)
tree291d04f1b6c2921d626b92e82868838e6a0d707f
parent5fad3d94a0930c3db2137c68fdd712a756036362 (diff)
JitArm64: Track singles in stfs.
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStoreFloating.cpp36
1 files changed, 25 insertions, 11 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStoreFloating.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStoreFloating.cpp
index 7dabbc8600..5fe4628a8d 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStoreFloating.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStoreFloating.cpp
@@ -270,7 +270,16 @@ void JitArm64::stfXX(UGeckoInstruction inst)
gpr.Lock(W0, W1, W30);
fpr.Lock(Q0);
- ARM64Reg V0 = fpr.R(inst.FS, REG_IS_LOADED);
+ bool single = (flags & BackPatchInfo::FLAG_SIZE_F32) && fpr.IsSingle(inst.FS);
+
+ ARM64Reg V0 = fpr.R(inst.FS, single ? REG_IS_LOADED_SINGLE : REG_IS_LOADED);
+
+ if (single)
+ {
+ flags &= ~BackPatchInfo::FLAG_SIZE_F32;
+ flags |= BackPatchInfo::FLAG_SIZE_F32I;
+ }
+
ARM64Reg addr_reg = W1;
if (update)
@@ -407,24 +416,29 @@ void JitArm64::stfXX(UGeckoInstruction inst)
ADD(X1, X30, pipe_off);
LDR(INDEX_UNSIGNED, W0, X30, count_off);
- if (accessSize == 64)
+ if (flags & BackPatchInfo::FLAG_SIZE_F64)
{
m_float_emit.REV64(8, Q0, V0);
- if (pipe_off)
- m_float_emit.STR(64, Q0, X1, ArithOption(X0));
- else
- m_float_emit.STR(64, Q0, X30, ArithOption(X0));
}
- else if (accessSize == 32)
+ else if (flags & BackPatchInfo::FLAG_SIZE_F32)
{
m_float_emit.FCVT(32, 64, D0, EncodeRegToDouble(V0));
m_float_emit.REV32(8, D0, D0);
- if (pipe_off)
- m_float_emit.STR(32, D0, X1, ArithOption(X0));
- else
- m_float_emit.STR(32, D0, X30, ArithOption(X0));
+ }
+ else if (flags & BackPatchInfo::FLAG_SIZE_F32I)
+ {
+ m_float_emit.REV32(8, D0, V0);
+ }
+ if (pipe_off)
+ {
+ m_float_emit.STR(accessSize, accessSize == 64 ? Q0 : D0, X1, ArithOption(X0));
}
+ else
+ {
+ m_float_emit.STR(accessSize, accessSize == 64 ? Q0 : D0, X30, ArithOption(X0));
+ }
+
ADD(W0, W0, accessSize >> 3);
STR(INDEX_UNSIGNED, W0, X30, count_off);
js.fifoBytesThisBlock += accessSize >> 3;