Skip to content

Commit

Permalink
Refactor and fix FPU code.
Browse files Browse the repository at this point in the history
  • Loading branch information
intorr committed Feb 15, 2018
1 parent c17670a commit 9677d8a
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 106 deletions.
138 changes: 38 additions & 100 deletions src/xrCore/_math.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,6 @@
#include <process.h>
#include <powerbase.h>

// mmsystem.h
#define MMNOSOUND
#define MMNOMIDI
#define MMNOAUX
#define MMNOMIXER
#define MMNOJOY
#include <mmsystem.h>

typedef struct _PROCESSOR_POWER_INFORMATION
{
ULONG Number;
Expand All @@ -27,124 +19,65 @@ XRCORE_API Fmatrix Fidentity;
XRCORE_API Dmatrix Didentity;
XRCORE_API CRandom Random;

#ifdef _M_AMD64
u16 getFPUsw() { return 0; }
namespace FPU
{
XRCORE_API void m24(void)
{
_control87(_PC_24, MCW_PC);
_control87(_RC_CHOP, MCW_RC);
}

XRCORE_API void m24r(void)
{
_control87(_PC_24, MCW_PC);
_control87(_RC_NEAR, MCW_RC);
}

XRCORE_API void m53(void)
{
_control87(_PC_53, MCW_PC);
_control87(_RC_CHOP, MCW_RC);
}

XRCORE_API void m53r(void)
{
_control87(_PC_53, MCW_PC);
_control87(_RC_NEAR, MCW_RC);
}

XRCORE_API void m64(void)
{
_control87(_PC_64, MCW_PC);
_control87(_RC_CHOP, MCW_RC);
}

XRCORE_API void m64r(void)
{
_control87(_PC_64, MCW_PC);
_control87(_RC_NEAR, MCW_RC);
}

void initialize() {}
};
#else
u16 getFPUsw()
{
u16 SW;
__asm fstcw SW;
return SW;
}

/*
Функции управления точностью вычислений с плавающей точкой.
Более подробную информацию можно получить здесь:
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/control87-controlfp-control87-2
Число 24, 53 и 64 - определяют ограничение точности в битах.
Наличие 'r' - включает округление результатов.
Реально в движке используются только m24r и m64r. И один раз m64 - возможно ошибка?
*/
namespace FPU
{
u16 _24 = 0;
u16 _24r = 0;
u16 _53 = 0;
u16 _53r = 0;
u16 _64 = 0;
u16 _64r = 0;

XRCORE_API void m24()
{
u16 p = _24;
__asm fldcw p;
_controlfp(_PC_24, MCW_PC);
_controlfp(_RC_CHOP, MCW_RC);
}

XRCORE_API void m24r()
{
u16 p = _24r;
__asm fldcw p;
_controlfp(_PC_24, MCW_PC);
_controlfp(_RC_NEAR, MCW_RC);
}

XRCORE_API void m53()
{
u16 p = _53;
__asm fldcw p;
_controlfp(_PC_53, MCW_PC);
_controlfp(_RC_CHOP, MCW_RC);
}

XRCORE_API void m53r()
{
u16 p = _53r;
__asm fldcw p;
_controlfp(_PC_53, MCW_PC);
_controlfp(_RC_NEAR, MCW_RC);
}

XRCORE_API void m64()
{
u16 p = _64;
__asm fldcw p;
_controlfp(_PC_64, MCW_PC);
_controlfp(_RC_CHOP, MCW_RC);
}

XRCORE_API void m64r()
{
u16 p = _64r;
__asm fldcw p;
_controlfp(_PC_64, MCW_PC);
_controlfp(_RC_NEAR, MCW_RC);
}

void initialize()
{
_clear87();

_control87(_PC_24, MCW_PC);
_control87(_RC_CHOP, MCW_RC);
_24 = getFPUsw(); // 24, chop
_control87(_RC_NEAR, MCW_RC);
_24r = getFPUsw(); // 24, rounding

_control87(_PC_53, MCW_PC);
_control87(_RC_CHOP, MCW_RC);
_53 = getFPUsw(); // 53, chop
_control87(_RC_NEAR, MCW_RC);
_53r = getFPUsw(); // 53, rounding

_control87(_PC_64, MCW_PC);
_control87(_RC_CHOP, MCW_RC);
_64 = getFPUsw(); // 64, chop
_control87(_RC_NEAR, MCW_RC);
_64r = getFPUsw(); // 64, rounding

if (!Core.PluginMode)
_clearfp();

// По-умолчанию для плагинов экспорта из 3D-редакторов включена высокая точность вычислений с плавающей точкой
if (Core.PluginMode)
m64r();
else
m24r();

::Random.seed(u32(CPU::GetCLK() % (1i64 << 32i64)));
}
};
#endif

namespace CPU
{
Expand Down Expand Up @@ -251,8 +184,13 @@ extern void __cdecl _terminate();
void _initialize_cpu_thread()
{
xrDebug::OnThreadSpawn();
if (!Core.PluginMode)

// По-умолчанию для плагинов экспорта из 3D-редакторов включена высокая точность вычислений с плавающей точкой
if (Core.PluginMode)
FPU::m64r();
else
FPU::m24r();

if (CPU::ID.hasFeature(CpuFeature::Sse))
{
//_mm_setcsr ( _mm_getcsr() | (_MM_FLUSH_ZERO_ON+_MM_DENORMALS_ZERO_ON) );
Expand Down
12 changes: 6 additions & 6 deletions src/xrCore/_math.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@

namespace FPU
{
XRCORE_API void m24(void);
XRCORE_API void m24r(void);
XRCORE_API void m53(void);
XRCORE_API void m53r(void);
XRCORE_API void m64(void);
XRCORE_API void m64r(void);
XRCORE_API void m24();
XRCORE_API void m24r();
XRCORE_API void m53();
XRCORE_API void m53r();
XRCORE_API void m64();
XRCORE_API void m64r();
};
namespace CPU
{
Expand Down

0 comments on commit 9677d8a

Please sign in to comment.