summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorMarkus Wick <markus@selfnet.de>2015-08-25 22:47:39 +0200
committerMarkus Wick <markus@selfnet.de>2015-08-25 22:47:39 +0200
commitbd08c1b01afeae9642f564ea47b7061a28b6eeaa (patch)
tree25e92e10282d64acdabc63514621578d90580d3b /Source/Core
parent24cb65007862d76a43059940023cbce82f1e6715 (diff)
parentd3176fe22aad97a23dc4273da249e6bdd0ba10e7 (diff)
Merge pull request #2901 from Sonicadvance1/aarch64_stfiwx
[AArch64] Implement stfiwx
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_BackPatch.cpp15
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStoreFloating.cpp4
-rw-r--r--Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp2
-rw-r--r--Source/Core/Core/PowerPC/JitArmCommon/BackPatch.h3
4 files changed, 20 insertions, 4 deletions
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_BackPatch.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_BackPatch.cpp
index 3e8d7fcf84..9f5e830f18 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_BackPatch.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_BackPatch.cpp
@@ -51,7 +51,7 @@ void JitArm64::EmitBackpatchRoutine(u32 flags, bool fastmem, bool do_farcode,
{
if (flags & BackPatchInfo::FLAG_STORE &&
- flags & (BackPatchInfo::FLAG_SIZE_F32 | BackPatchInfo::FLAG_SIZE_F64))
+ flags & (BackPatchInfo::FLAG_SIZE_F32 | BackPatchInfo::FLAG_SIZE_F64 | BackPatchInfo::FLAG_SIZE_F32I))
{
if (flags & BackPatchInfo::FLAG_SIZE_F32)
{
@@ -59,6 +59,11 @@ void JitArm64::EmitBackpatchRoutine(u32 flags, bool fastmem, bool do_farcode,
m_float_emit.REV32(8, D0, D0);
m_float_emit.STR(32, D0, X28, addr);
}
+ else if (flags & BackPatchInfo::FLAG_SIZE_F32I)
+ {
+ m_float_emit.REV32(8, D0, RS);
+ m_float_emit.STR(32, D0, X28, addr);
+ }
else
{
m_float_emit.REV64(8, Q0, RS);
@@ -164,7 +169,7 @@ void JitArm64::EmitBackpatchRoutine(u32 flags, bool fastmem, bool do_farcode,
m_float_emit.ABI_PushRegisters(fprs_to_push, X30);
if (flags & BackPatchInfo::FLAG_STORE &&
- flags & (BackPatchInfo::FLAG_SIZE_F32 | BackPatchInfo::FLAG_SIZE_F64))
+ flags & (BackPatchInfo::FLAG_SIZE_F32 | BackPatchInfo::FLAG_SIZE_F64 | BackPatchInfo::FLAG_SIZE_F32I))
{
if (flags & BackPatchInfo::FLAG_SIZE_F32)
{
@@ -173,6 +178,12 @@ void JitArm64::EmitBackpatchRoutine(u32 flags, bool fastmem, bool do_farcode,
MOVI2R(X30, (u64)&PowerPC::Write_U32);
BLR(X30);
}
+ else if (flags & BackPatchInfo::FLAG_SIZE_F32I)
+ {
+ m_float_emit.UMOV(32, W0, RS, 0);
+ MOVI2R(X30, (u64)&PowerPC::Write_U32);
+ BLR(X30);
+ }
else
{
MOVI2R(X30, (u64)&PowerPC::Write_U64);
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStoreFloating.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStoreFloating.cpp
index ff9b1af996..31bae8de51 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStoreFloating.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_LoadStoreFloating.cpp
@@ -245,6 +245,10 @@ void JitArm64::stfXX(UGeckoInstruction inst)
update = true;
offset_reg = b;
break;
+ case 983: // stfiwx
+ flags |= BackPatchInfo::FLAG_SIZE_F32I;
+ offset_reg = b;
+ break;
}
break;
case 53: // stfsu
diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp
index 2dea62680a..84cef8bf70 100644
--- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp
+++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp
@@ -284,7 +284,7 @@ static GekkoOPTemplate table31[] =
{695, &JitArm64::stfXX}, // stfsux
{727, &JitArm64::stfXX}, // stfdx
{759, &JitArm64::stfXX}, // stfdux
- {983, &JitArm64::FallBackToInterpreter}, // stfiwx
+ {983, &JitArm64::stfXX}, // stfiwx
{19, &JitArm64::FallBackToInterpreter}, // mfcr
{83, &JitArm64::mfmsr}, // mfmsr
diff --git a/Source/Core/Core/PowerPC/JitArmCommon/BackPatch.h b/Source/Core/Core/PowerPC/JitArmCommon/BackPatch.h
index 7714cadef9..508b10b45d 100644
--- a/Source/Core/Core/PowerPC/JitArmCommon/BackPatch.h
+++ b/Source/Core/Core/PowerPC/JitArmCommon/BackPatch.h
@@ -19,6 +19,7 @@ struct BackPatchInfo
FLAG_REVERSE = (1 << 7),
FLAG_EXTEND = (1 << 8),
FLAG_ONLY_LOWER = (1 << 9),
+ FLAG_SIZE_F32I = (1 << 10),
};
static u32 GetFlagSize(u32 flags)
@@ -29,7 +30,7 @@ struct BackPatchInfo
return 16;
if (flags & FLAG_SIZE_32)
return 32;
- if (flags & FLAG_SIZE_F32)
+ if (flags & FLAG_SIZE_F32 || flags & FLAG_SIZE_F32I)
return 32;
if (flags & FLAG_SIZE_F64)
return 64;