summaryrefslogtreecommitdiff
path: root/Source/Core/Common
diff options
context:
space:
mode:
authorhrydgard <hrydgard@gmail.com>2009-06-14 11:30:33 +0000
committerhrydgard <hrydgard@gmail.com>2009-06-14 11:30:33 +0000
commit0bee242493340ac9d5de3e2574ccf31876322a67 (patch)
treec372315695a5882da7ba54bcee535aaa4e3b068f /Source/Core/Common
parentf67660cbfe0cd94a891a7da2801e7f42b03d502f (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.cpp56
-rw-r--r--Source/Core/Common/Src/MathUtil.h28
-rw-r--r--Source/Core/Common/Src/SDCardUtil.cpp4
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"