Set the FPU into single-precision mode for mixer updates

This commit is contained in:
Chris Robinson
2011-09-29 05:10:15 -07:00
parent f4925a0e6a
commit d3a6de3f86
4 changed files with 28 additions and 8 deletions
+1
View File
@@ -215,6 +215,7 @@ CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(pri
int main() {return 0;}" HAVE_GCC_FORMAT)
CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
CHECK_INCLUDE_FILE(fpu_control.h HAVE_FPU_CONTROL_H)
CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
+4
View File
@@ -9,6 +9,10 @@
#include <fenv.h>
#endif
#ifdef HAVE_FPU_CONTROL_H
#include <fpu_control.h>
#endif
#include "AL/al.h"
#include "AL/alc.h"
#include "AL/alext.h"
+20 -8
View File
@@ -198,23 +198,35 @@ static __inline ALfloat cubic(ALfloat val0, ALfloat val1, ALfloat val2, ALfloat
static __inline int SetMixerFPUMode(void)
{
int fpuState = 0;
#if defined(HAVE_FESETROUND)
#if defined(_FPU_GETCW) && defined(_FPU_SETCW)
fpu_control_t fpuState, newState;
_FPU_GETCW(fpuState);
newState = fpuState&~(_FPU_EXTENDED|_FPU_DOUBLE|_FPU_SINGLE |
_FPU_RC_NEAREST|_FPU_RC_DOWN|_FPU_RC_UP|_FPU_RC_ZERO);
newState |= _FPU_SINGLE | _FPU_RC_ZERO;
_FPU_SETCW(newState);
#else
int fpuState;
#if defined(HAVE__CONTROLFP)
fpuState = _controlfp(0, 0);
(void)_controlfp(_RC_CHOP|_PC_24, _MCW_RC|_MCW_PC);
#elif defined(HAVE_FESETROUND)
fpuState = fegetround();
fesetround(FE_TOWARDZERO);
#elif defined(HAVE__CONTROLFP)
fpuState = _controlfp(0, 0);
(void)_controlfp(_RC_CHOP, _MCW_RC);
#endif
#endif
return fpuState;
}
static __inline void RestoreFPUMode(int state)
{
#if defined(HAVE_FESETROUND)
fesetround(state);
#if defined(_FPU_GETCW) && defined(_FPU_SETCW)
fpu_control_t fpuState = state;
_FPU_SETCW(fpuState);
#elif defined(HAVE__CONTROLFP)
_controlfp(state, _MCW_RC);
_controlfp(state, _MCW_RC|_MCW_PC);
#elif defined(HAVE_FESETROUND)
fesetround(state);
#endif
}
+3
View File
@@ -119,6 +119,9 @@
/* Define if we have float.h */
#cmakedefine HAVE_FLOAT_H
/* Define if we have fpu_control.h */
#cmakedefine HAVE_FPU_CONTROL_H
/* Define if we have fenv.h */
#cmakedefine HAVE_FENV_H