diff options
| author | hrydgard <hrydgard@gmail.com> | 2009-06-14 11:30:33 +0000 |
|---|---|---|
| committer | hrydgard <hrydgard@gmail.com> | 2009-06-14 11:30:33 +0000 |
| commit | 0bee242493340ac9d5de3e2574ccf31876322a67 (patch) | |
| tree | c372315695a5882da7ba54bcee535aaa4e3b068f /Source/Core/Common | |
| parent | f67660cbfe0cd94a891a7da2801e7f42b03d502f (diff) | |
Unbreak the build (sorry, forgot a few includes), move FP classification to MathUtil, add some more unittests.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3442 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/Common')
| -rw-r--r-- | Source/Core/Common/Src/MathUtil.cpp | 56 | ||||
| -rw-r--r-- | Source/Core/Common/Src/MathUtil.h | 28 | ||||
| -rw-r--r-- | Source/Core/Common/Src/SDCardUtil.cpp | 4 |
3 files changed, 84 insertions, 4 deletions
diff --git a/Source/Core/Common/Src/MathUtil.cpp b/Source/Core/Common/Src/MathUtil.cpp index e2dbaa0640..88e929ec41 100644 --- a/Source/Core/Common/Src/MathUtil.cpp +++ b/Source/Core/Common/Src/MathUtil.cpp @@ -22,9 +22,64 @@ #include <cmath> +namespace { + static u32 saved_sse_state = _mm_getcsr(); static const u32 default_sse_state = _mm_getcsr(); +} + +namespace MathUtil +{ + +int ClassifyFP(double dvalue) +{ + // TODO: Optimize the below to be as fast as possible. + IntDouble value; + value.d = dvalue; + // 5 bits (C, <, >, =, ?) + // easy cases first + if (value.i == 0) { + // positive zero + return 0x2; + } else if (value.i == 0x8000000000000000ULL) { + // negative zero + return 0x12; + } else if (value.i == 0x7FF0000000000000ULL) { + // positive inf + return 0x5; + } else if (value.i == 0xFFF0000000000000ULL) { + // negative inf + return 0x9; + } else { + // OK let's dissect this thing. + int sign = value.i >> 63; + int exp = (int)((value.i >> 52) & 0x7FF); + if (exp >= 1 && exp <= 2046) { + // Nice normalized number. + if (sign) { + return 0x8; // negative + } else { + return 0x4; // positive + } + } + u64 mantissa = value.i & 0x000FFFFFFFFFFFFFULL; + if (exp == 0 && mantissa) { + // Denormalized number. + if (sign) { + return 0x18; + } else { + return 0x14; + } + } else if (exp == 0x7FF && mantissa /* && mantissa_top*/) { + return 0x11; // Quiet NAN + } + } + + return 0x4; +} + +} // namespace void LoadDefaultSSEState() { @@ -145,3 +200,4 @@ void Matrix44::Multiply(const Matrix44 &a, const Matrix44 &b, Matrix44 &result) { MatrixMul(4, a.data, b.data, result.data); } + diff --git a/Source/Core/Common/Src/MathUtil.h b/Source/Core/Common/Src/MathUtil.h index 1399ee1f76..1226fc4f48 100644 --- a/Source/Core/Common/Src/MathUtil.h +++ b/Source/Core/Common/Src/MathUtil.h @@ -83,8 +83,29 @@ inline double FlushToZeroAsFloat(double d) return x.d; } -} // namespace MathUtil +enum PPCFpClass +{ + PPC_FPCLASS_QNAN = 0x11, + PPC_FPCLASS_NINF = 0x9, + PPC_FPCLASS_NN = 0x8, + PPC_FPCLASS_ND = 0x18, + PPC_FPCLASS_NZ = 0x12, + PPC_FPCLASS_PZ = 0x2, + PPC_FPCLASS_PD = 0x14, + PPC_FPCLASS_PN = 0x4, + PPC_FPCLASS_PINF = 0x5, +}; +// Uses PowerPC conventions for the return value, so it can be easily +// used directly in CPU emulation. +int ClassifyFP(double dvalue); + +// TODO: More efficient float version. +inline int ClassifyFP(float fvalue) { + ClassifyFP((double)fvalue); +} + +} // namespace MathUtil inline float pow2f(float x) {return x * x;} inline double pow2(double x) {return x * x;} @@ -103,7 +124,10 @@ void LoadDefaultSSEState(); #define ROUND_UP(x, a) (((x) + (a) - 1) & ~((a) - 1)) -// ugly matrix implementation + +// Tiny matrix/vector library. +// Used for things like Free-Look in the gfx plugin. + class Matrix33 { public: diff --git a/Source/Core/Common/Src/SDCardUtil.cpp b/Source/Core/Common/Src/SDCardUtil.cpp index 27d4895d2c..3002b89db7 100644 --- a/Source/Core/Common/Src/SDCardUtil.cpp +++ b/Source/Core/Common/Src/SDCardUtil.cpp @@ -25,8 +25,8 @@ ** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -// A simple and portable program used to generate a blank FAT32 image file -// Modified for Dolphin-emu +// A simple and portable piece of code used to generate a blank FAT32 image file. +// Modified for Dolphin. #include "SDCardUtil.h" |
