From d3176fe22aad97a23dc4273da249e6bdd0ba10e7 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Sun, 23 Aug 2015 17:58:38 -0500 Subject: [PATCH] [AArch64] Implement stfiwx Improves povray performance by ~4% --- .../Core/PowerPC/JitArm64/JitArm64_BackPatch.cpp | 15 +++++++++++++-- .../JitArm64/JitArm64_LoadStoreFloating.cpp | 4 ++++ .../Core/PowerPC/JitArm64/JitArm64_Tables.cpp | 2 +- Source/Core/Core/PowerPC/JitArmCommon/BackPatch.h | 3 ++- 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 2aea4fc737..f2a758c416 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;