Skip to content

Commit 9677d8a

Browse files
committed
Refactor and fix FPU code.
1 parent c17670a commit 9677d8a

File tree

2 files changed

+44
-106
lines changed

2 files changed

+44
-106
lines changed

src/xrCore/_math.cpp

Lines changed: 38 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,6 @@
44
#include <process.h>
55
#include <powerbase.h>
66

7-
// mmsystem.h
8-
#define MMNOSOUND
9-
#define MMNOMIDI
10-
#define MMNOAUX
11-
#define MMNOMIXER
12-
#define MMNOJOY
13-
#include <mmsystem.h>
14-
157
typedef struct _PROCESSOR_POWER_INFORMATION
168
{
179
ULONG Number;
@@ -27,124 +19,65 @@ XRCORE_API Fmatrix Fidentity;
2719
XRCORE_API Dmatrix Didentity;
2820
XRCORE_API CRandom Random;
2921

30-
#ifdef _M_AMD64
31-
u16 getFPUsw() { return 0; }
32-
namespace FPU
33-
{
34-
XRCORE_API void m24(void)
35-
{
36-
_control87(_PC_24, MCW_PC);
37-
_control87(_RC_CHOP, MCW_RC);
38-
}
39-
40-
XRCORE_API void m24r(void)
41-
{
42-
_control87(_PC_24, MCW_PC);
43-
_control87(_RC_NEAR, MCW_RC);
44-
}
45-
46-
XRCORE_API void m53(void)
47-
{
48-
_control87(_PC_53, MCW_PC);
49-
_control87(_RC_CHOP, MCW_RC);
50-
}
51-
52-
XRCORE_API void m53r(void)
53-
{
54-
_control87(_PC_53, MCW_PC);
55-
_control87(_RC_NEAR, MCW_RC);
56-
}
57-
58-
XRCORE_API void m64(void)
59-
{
60-
_control87(_PC_64, MCW_PC);
61-
_control87(_RC_CHOP, MCW_RC);
62-
}
63-
64-
XRCORE_API void m64r(void)
65-
{
66-
_control87(_PC_64, MCW_PC);
67-
_control87(_RC_NEAR, MCW_RC);
68-
}
69-
70-
void initialize() {}
71-
};
72-
#else
73-
u16 getFPUsw()
74-
{
75-
u16 SW;
76-
__asm fstcw SW;
77-
return SW;
78-
}
79-
22+
/*
23+
Функции управления точностью вычислений с плавающей точкой.
24+
Более подробную информацию можно получить здесь:
25+
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/control87-controlfp-control87-2
26+
Число 24, 53 и 64 - определяют ограничение точности в битах.
27+
Наличие 'r' - включает округление результатов.
28+
Реально в движке используются только m24r и m64r. И один раз m64 - возможно ошибка?
29+
*/
8030
namespace FPU
8131
{
82-
u16 _24 = 0;
83-
u16 _24r = 0;
84-
u16 _53 = 0;
85-
u16 _53r = 0;
86-
u16 _64 = 0;
87-
u16 _64r = 0;
88-
8932
XRCORE_API void m24()
9033
{
91-
u16 p = _24;
92-
__asm fldcw p;
34+
_controlfp(_PC_24, MCW_PC);
35+
_controlfp(_RC_CHOP, MCW_RC);
9336
}
37+
9438
XRCORE_API void m24r()
9539
{
96-
u16 p = _24r;
97-
__asm fldcw p;
40+
_controlfp(_PC_24, MCW_PC);
41+
_controlfp(_RC_NEAR, MCW_RC);
9842
}
43+
9944
XRCORE_API void m53()
10045
{
101-
u16 p = _53;
102-
__asm fldcw p;
46+
_controlfp(_PC_53, MCW_PC);
47+
_controlfp(_RC_CHOP, MCW_RC);
10348
}
49+
10450
XRCORE_API void m53r()
10551
{
106-
u16 p = _53r;
107-
__asm fldcw p;
52+
_controlfp(_PC_53, MCW_PC);
53+
_controlfp(_RC_NEAR, MCW_RC);
10854
}
55+
10956
XRCORE_API void m64()
11057
{
111-
u16 p = _64;
112-
__asm fldcw p;
58+
_controlfp(_PC_64, MCW_PC);
59+
_controlfp(_RC_CHOP, MCW_RC);
11360
}
61+
11462
XRCORE_API void m64r()
11563
{
116-
u16 p = _64r;
117-
__asm fldcw p;
64+
_controlfp(_PC_64, MCW_PC);
65+
_controlfp(_RC_NEAR, MCW_RC);
11866
}
11967

12068
void initialize()
12169
{
122-
_clear87();
123-
124-
_control87(_PC_24, MCW_PC);
125-
_control87(_RC_CHOP, MCW_RC);
126-
_24 = getFPUsw(); // 24, chop
127-
_control87(_RC_NEAR, MCW_RC);
128-
_24r = getFPUsw(); // 24, rounding
129-
130-
_control87(_PC_53, MCW_PC);
131-
_control87(_RC_CHOP, MCW_RC);
132-
_53 = getFPUsw(); // 53, chop
133-
_control87(_RC_NEAR, MCW_RC);
134-
_53r = getFPUsw(); // 53, rounding
135-
136-
_control87(_PC_64, MCW_PC);
137-
_control87(_RC_CHOP, MCW_RC);
138-
_64 = getFPUsw(); // 64, chop
139-
_control87(_RC_NEAR, MCW_RC);
140-
_64r = getFPUsw(); // 64, rounding
141-
142-
if (!Core.PluginMode)
70+
_clearfp();
71+
72+
// По-умолчанию для плагинов экспорта из 3D-редакторов включена высокая точность вычислений с плавающей точкой
73+
if (Core.PluginMode)
74+
m64r();
75+
else
14376
m24r();
77+
14478
::Random.seed(u32(CPU::GetCLK() % (1i64 << 32i64)));
14579
}
14680
};
147-
#endif
14881

14982
namespace CPU
15083
{
@@ -251,8 +184,13 @@ extern void __cdecl _terminate();
251184
void _initialize_cpu_thread()
252185
{
253186
xrDebug::OnThreadSpawn();
254-
if (!Core.PluginMode)
187+
188+
// По-умолчанию для плагинов экспорта из 3D-редакторов включена высокая точность вычислений с плавающей точкой
189+
if (Core.PluginMode)
190+
FPU::m64r();
191+
else
255192
FPU::m24r();
193+
256194
if (CPU::ID.hasFeature(CpuFeature::Sse))
257195
{
258196
//_mm_setcsr ( _mm_getcsr() | (_MM_FLUSH_ZERO_ON+_MM_DENORMALS_ZERO_ON) );

src/xrCore/_math.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@
1111

1212
namespace FPU
1313
{
14-
XRCORE_API void m24(void);
15-
XRCORE_API void m24r(void);
16-
XRCORE_API void m53(void);
17-
XRCORE_API void m53r(void);
18-
XRCORE_API void m64(void);
19-
XRCORE_API void m64r(void);
14+
XRCORE_API void m24();
15+
XRCORE_API void m24r();
16+
XRCORE_API void m53();
17+
XRCORE_API void m53r();
18+
XRCORE_API void m64();
19+
XRCORE_API void m64r();
2020
};
2121
namespace CPU
2222
{

0 commit comments

Comments
 (0)