diff options
| author | Sintendo <bram.speeckaert@gmail.com> | 2023-10-10 22:47:31 +0200 |
|---|---|---|
| committer | Sintendo <bram.speeckaert@gmail.com> | 2023-10-21 21:08:21 +0200 |
| commit | 3c3168706c02ef0a22ad208442217254125d50e2 (patch) | |
| tree | 1a15f91bf75f70a108661f7bc032c58016d48f2e /Source/Core/Common/FloatUtils.cpp | |
| parent | 60e3b4c0932ca963c67922cd7deb5d7e90732b92 (diff) | |
PowerPC: Negate m_dec values in frsqrte table
This value is used in a multiplication. The result of this
multiplication is then subtracted from m_base. By negating m_dec, we are
free to use an addition instead.
On x64, this saves an instruction.
Diffstat (limited to 'Source/Core/Common/FloatUtils.cpp')
| -rw-r--r-- | Source/Core/Common/FloatUtils.cpp | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/Source/Core/Common/FloatUtils.cpp b/Source/Core/Common/FloatUtils.cpp index 57add0d18e..dbe2a0b508 100644 --- a/Source/Core/Common/FloatUtils.cpp +++ b/Source/Core/Common/FloatUtils.cpp @@ -74,14 +74,14 @@ u32 ClassifyFloat(float fvalue) } const std::array<BaseAndDec, 32> frsqrte_expected = {{ - {0x1a7e800, 0x568}, {0x17cb800, 0x4f3}, {0x1552800, 0x48d}, {0x130c000, 0x435}, - {0x10f2000, 0x3e7}, {0x0eff000, 0x3a2}, {0x0d2e000, 0x365}, {0x0b7c000, 0x32e}, - {0x09e5000, 0x2fc}, {0x0867000, 0x2d0}, {0x06ff000, 0x2a8}, {0x05ab800, 0x283}, - {0x046a000, 0x261}, {0x0339800, 0x243}, {0x0218800, 0x226}, {0x0105800, 0x20b}, - {0x3ffa000, 0x7a4}, {0x3c29000, 0x700}, {0x38aa000, 0x670}, {0x3572000, 0x5f2}, - {0x3279000, 0x584}, {0x2fb7000, 0x524}, {0x2d26000, 0x4cc}, {0x2ac0000, 0x47e}, - {0x2881000, 0x43a}, {0x2665000, 0x3fa}, {0x2468000, 0x3c2}, {0x2287000, 0x38e}, - {0x20c1000, 0x35e}, {0x1f12000, 0x332}, {0x1d79000, 0x30a}, {0x1bf4000, 0x2e6}, + {0x1a7e800, -0x568}, {0x17cb800, -0x4f3}, {0x1552800, -0x48d}, {0x130c000, -0x435}, + {0x10f2000, -0x3e7}, {0x0eff000, -0x3a2}, {0x0d2e000, -0x365}, {0x0b7c000, -0x32e}, + {0x09e5000, -0x2fc}, {0x0867000, -0x2d0}, {0x06ff000, -0x2a8}, {0x05ab800, -0x283}, + {0x046a000, -0x261}, {0x0339800, -0x243}, {0x0218800, -0x226}, {0x0105800, -0x20b}, + {0x3ffa000, -0x7a4}, {0x3c29000, -0x700}, {0x38aa000, -0x670}, {0x3572000, -0x5f2}, + {0x3279000, -0x584}, {0x2fb7000, -0x524}, {0x2d26000, -0x4cc}, {0x2ac0000, -0x47e}, + {0x2881000, -0x43a}, {0x2665000, -0x3fa}, {0x2468000, -0x3c2}, {0x2287000, -0x38e}, + {0x20c1000, -0x35e}, {0x1f12000, -0x332}, {0x1d79000, -0x30a}, {0x1bf4000, -0x2e6}, }}; double ApproximateReciprocalSquareRoot(double val) @@ -134,7 +134,7 @@ double ApproximateReciprocalSquareRoot(double val) const int i = static_cast<int>((exponent_lsb | mantissa) >> 37); const auto& entry = frsqrte_expected[i / 2048]; - integral |= static_cast<s64>(entry.m_base - entry.m_dec * (i % 2048)) << 26; + integral |= static_cast<s64>(entry.m_base + entry.m_dec * (i % 2048)) << 26; return BitCast<double>(integral); } |
