Use fegetenv/fesetenv to backup and restore the FPU state

This commit is contained in:
Chris Robinson
2013-05-22 23:05:26 -07:00
parent eb15b13ca1
commit be4a4d7468
2 changed files with 8 additions and 4 deletions
+4 -4
View File
@@ -201,8 +201,8 @@ void al_free(void *ptr)
void SetMixerFPUMode(FPUCtl *ctl)
{
#if defined(HAVE_FESETROUND)
ctl->state = fegetround();
#ifdef HAVE_FENV_H
fegetenv(STATIC_CAST(fenv_t, ctl));
#if defined(__GNUC__) && defined(HAVE_SSE)
if((CPUCapFlags&CPU_CAP_SSE))
__asm__ __volatile__("stmxcsr %0" : "=m" (*&ctl->sse_state));
@@ -245,8 +245,8 @@ void SetMixerFPUMode(FPUCtl *ctl)
void RestoreFPUMode(const FPUCtl *ctl)
{
#if defined(HAVE_FESETROUND)
fesetround(ctl->state);
#ifdef HAVE_FENV_H
fesetenv(STATIC_CAST(fenv_t, ctl));
#if defined(__GNUC__) && defined(HAVE_SSE)
if((CPUCapFlags&CPU_CAP_SSE))
__asm__ __volatile__("ldmxcsr %0" : : "m" (*&ctl->sse_state));
+4
View File
@@ -748,7 +748,11 @@ void *al_calloc(size_t alignment, size_t size);
void al_free(void *ptr);
typedef struct {
#ifdef HAVE_FENV_H
DERIVE_FROM_TYPE(fenv_t);
#else
int state;
#endif
#ifdef HAVE_SSE
int sse_state;
#endif