fpu_ctrl.h 669 B

1234567891011121314151617181920212223242526272829303132
  1. #ifndef CORE_FPU_CTRL_H
  2. #define CORE_FPU_CTRL_H
  3. class FPUCtl {
  4. unsigned int sse_state{};
  5. bool in_mode{};
  6. static unsigned int Set() noexcept;
  7. static void Reset(unsigned int state) noexcept;
  8. public:
  9. FPUCtl() noexcept : sse_state{Set()}, in_mode{true} { }
  10. ~FPUCtl() { if(in_mode) Reset(sse_state); }
  11. FPUCtl(const FPUCtl&) = delete;
  12. FPUCtl& operator=(const FPUCtl&) = delete;
  13. void enter() noexcept
  14. {
  15. if(!in_mode)
  16. sse_state = Set();
  17. in_mode = true;
  18. }
  19. void leave() noexcept
  20. {
  21. if(in_mode)
  22. Reset(sse_state);
  23. in_mode = false;
  24. }
  25. };
  26. #endif /* CORE_FPU_CTRL_H */