JitCommon: Signed 32-bit division magic constants

Add a function to calculate the magic constants required to optimize
signed 32-bit division.

Since this optimization is not exclusive to any particular architecture,
JitCommon seemed like a good place to put this.
This commit is contained in:
Sintendo
2021-03-03 23:48:28 +01:00
parent c9adc60d73
commit 5bb8798df6
6 changed files with 121 additions and 0 deletions

View File

@ -430,6 +430,8 @@ add_library(core
PowerPC/Interpreter/Interpreter_Tables.cpp
PowerPC/Interpreter/Interpreter.cpp
PowerPC/Interpreter/Interpreter.h
PowerPC/JitCommon/DivUtils.cpp
PowerPC/JitCommon/DivUtils.h
PowerPC/JitCommon/JitAsmCommon.cpp
PowerPC/JitCommon/JitAsmCommon.h
PowerPC/JitCommon/JitBase.cpp

View File

@ -0,0 +1,57 @@
// Copyright 2021 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#include <cstdlib>
#include "Core/PowerPC/JitCommon/DivUtils.h"
namespace JitCommon
{
Magic SignedDivisionConstants(s32 d)
{
const u32 two31 = 2147483648;
const u32 ad = std::abs(d);
const u32 t = two31 - (d < 0);
const u32 anc = t - 1 - t % ad;
u32 q1 = two31 / anc;
u32 r1 = two31 - q1 * anc;
u32 q2 = two31 / ad;
u32 r2 = two31 - q2 * ad;
s32 p = 31;
u32 delta;
do
{
p++;
q1 *= 2;
r1 *= 2;
if (r1 >= anc)
{
q1++;
r1 -= anc;
}
q2 *= 2;
r2 *= 2;
if (r2 >= ad)
{
q2++;
r2 -= ad;
}
delta = ad - r2;
} while (q1 < delta || (q1 == delta && r1 == 0));
Magic mag;
mag.multiplier = q2 + 1;
if (d < 0)
mag.multiplier = -mag.multiplier;
mag.shift = p - 32;
return mag;
}
} // namespace JitCommon

View File

@ -0,0 +1,22 @@
// Copyright 2021 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#pragma once
#include "Common/CommonTypes.h"
namespace JitCommon
{
struct Magic
{
s32 multiplier;
u8 shift;
};
// Calculate the constants required to optimize a signed 32-bit integer division.
// Taken from The PowerPC Compiler Writer's Guide and LLVM.
// Divisor must not be -1, 0, and 1.
Magic SignedDivisionConstants(s32 divisor);
} // namespace JitCommon

View File

@ -27,6 +27,12 @@
<Project>{41279555-f94f-4ebc-99de-af863c10c5c4}</Project>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Core\PowerPC\JitCommon\DivUtils.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="Core\PowerPC\JitCommon\DivUtils.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets" />
</Project>