diff options
Diffstat (limited to 'Alc/helpers.c')
-rw-r--r-- | Alc/helpers.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/Alc/helpers.c b/Alc/helpers.c index 9529acec..5acf2be2 100644 --- a/Alc/helpers.c +++ b/Alc/helpers.c @@ -173,41 +173,38 @@ void al_free(void *ptr) } -int SetMixerFPUMode(void) +void SetMixerFPUMode(FPUCtl *ctl) { #if defined(_FPU_GETCW) && defined(_FPU_SETCW) && (defined(__i386__) || defined(__x86_64__)) fpu_control_t fpuState, newState; _FPU_GETCW(fpuState); + ctl->state = 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; if((CPUCapFlags&CPU_CAP_SSE)) newState |= 0x8000; /* flush-to-zero */ _FPU_SETCW(newState); -#else - int fpuState; -#if defined(HAVE__CONTROLFP) - fpuState = _controlfp(0, 0); +#elif defined(HAVE__CONTROLFP) + ctl->state = _controlfp(0, 0); (void)_controlfp(_RC_CHOP|_DN_FLUSH|_PC_24, _MCW_RC|_MCW_DN|_MCW_PC); #elif defined(HAVE_FESETROUND) - fpuState = fegetround(); + ctl->state = fegetround(); #ifdef FE_TOWARDZERO fesetround(FE_TOWARDZERO); #endif #endif -#endif - return fpuState; } -void RestoreFPUMode(int state) +void RestoreFPUMode(const FPUCtl *ctl) { #if defined(_FPU_GETCW) && defined(_FPU_SETCW) && (defined(__i386__) || defined(__x86_64__)) - fpu_control_t fpuState = state; + fpu_control_t fpuState = ctl->state; _FPU_SETCW(fpuState); #elif defined(HAVE__CONTROLFP) - _controlfp(state, _MCW_RC|_MCW_DN|_MCW_PC); + _controlfp(ctl->state, _MCW_RC|_MCW_DN|_MCW_PC); #elif defined(HAVE_FESETROUND) - fesetround(state); + fesetround(ctl->state); #endif } |