fpu_modes.h 923 B

12345678910111213141516171819202122232425262728293031323334
  1. #ifndef FPU_MODES_H
  2. #define FPU_MODES_H
  3. #ifdef HAVE_FENV_H
  4. #include <fenv.h>
  5. #endif
  6. typedef struct FPUCtl {
  7. #if defined(__GNUC__) && defined(HAVE_SSE)
  8. unsigned int sse_state;
  9. #elif defined(HAVE___CONTROL87_2)
  10. unsigned int state;
  11. unsigned int sse_state;
  12. #elif defined(HAVE__CONTROLFP)
  13. unsigned int state;
  14. #endif
  15. } FPUCtl;
  16. void SetMixerFPUMode(FPUCtl *ctl);
  17. void RestoreFPUMode(const FPUCtl *ctl);
  18. #ifdef __GNUC__
  19. /* Use an alternate macro set with GCC to avoid accidental continue or break
  20. * statements within the mixer mode.
  21. */
  22. #define START_MIXER_MODE() __extension__({ FPUCtl _oldMode; SetMixerFPUMode(&_oldMode)
  23. #define END_MIXER_MODE() RestoreFPUMode(&_oldMode); })
  24. #else
  25. #define START_MIXER_MODE() do { FPUCtl _oldMode; SetMixerFPUMode(&_oldMode)
  26. #define END_MIXER_MODE() RestoreFPUMode(&_oldMode); } while(0)
  27. #endif
  28. #define LEAVE_MIXER_MODE() RestoreFPUMode(&_oldMode)
  29. #endif /* FPU_MODES_H */