Interpreter: software-based flush-to-zero
bDAZ is now called bFlushToZero to better reflect what it's actually used for. I decided not to support any hardware-based flush-to-zero on systems that don't support this for both inputs _and_ outputs. It makes the code cleaner and the intersection of CPUs that support SSE2 but not DAZ should be very small.
This commit is contained in:
1 parent
466a7afde3
commit
cd069fdce1
5 files changed
+26
-22
No files matched your search
@@ -5,6 +5,7 @@
|
||||
#ifndef _INTERPRETER_FPUTILS_H
|
||||
#define _INTERPRETER_FPUTILS_H
|
||||
|
||||
#include "CPUDetect.h"
|
||||
#include "Interpreter.h"
|
||||
#include "MathUtil.h"
|
||||
|
||||
@@ -69,28 +70,22 @@ inline void UpdateFPSCR()
|
||||
|
||||
inline double ForceSingle(double _x)
|
||||
{
|
||||
//if (FPSCR.RN != 0)
|
||||
// PanicAlert("RN = %d at %x", (int)FPSCR.RN, PC);
|
||||
if (FPSCR.NI)
|
||||
_x = FlushToZeroAsFloat(_x);
|
||||
|
||||
double x = static_cast<float>(_x);
|
||||
|
||||
// convert to float...
|
||||
float x = _x;
|
||||
if (!cpu_info.bFlushToZero && FPSCR.NI)
|
||||
{
|
||||
x = FlushToZero(x);
|
||||
}
|
||||
// ...and back to double:
|
||||
return x;
|
||||
}
|
||||
|
||||
inline double ForceDouble(double d)
|
||||
{
|
||||
//if (FPSCR.RN != 0)
|
||||
// PanicAlert("RN = %d at %x", (int)FPSCR.RN, PC);
|
||||
|
||||
//if (FPSCR.NI)
|
||||
//{
|
||||
// IntDouble x; x.d = d;
|
||||
//if ((x.i & DOUBLE_EXP) == 0)
|
||||
// x.i &= DOUBLE_SIGN; // turn into signed zero
|
||||
// return x.d;
|
||||
//}
|
||||
if (!cpu_info.bFlushToZero && FPSCR.NI)
|
||||
{
|
||||
d = FlushToZero(d);
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user