From 20ef8bf390541339f068676f9d14061fe2f5e115 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 31 Dec 2020 16:47:12 -0800 Subject: Move cpu_caps and fpu_ctrl to core --- core/fpu_ctrl.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 core/fpu_ctrl.cpp (limited to 'core/fpu_ctrl.cpp') diff --git a/core/fpu_ctrl.cpp b/core/fpu_ctrl.cpp new file mode 100644 index 00000000..24021c7d --- /dev/null +++ b/core/fpu_ctrl.cpp @@ -0,0 +1,54 @@ + +#include "config.h" + +#include "fpu_ctrl.h" + +#ifdef HAVE_INTRIN_H +#include +#endif +#ifdef HAVE_SSE_INTRINSICS +#include +#endif + +#include "cpu_caps.h" + + +FPUCtl::FPUCtl() +{ +#if defined(HAVE_SSE_INTRINSICS) + this->sse_state = _mm_getcsr(); + unsigned int sseState = this->sse_state; + sseState |= 0x8000; /* set flush-to-zero */ + sseState |= 0x0040; /* set denormals-are-zero */ + _mm_setcsr(sseState); + +#elif defined(__GNUC__) && defined(HAVE_SSE) + + if((CPUCapFlags&CPU_CAP_SSE)) + { + __asm__ __volatile__("stmxcsr %0" : "=m" (*&this->sse_state)); + unsigned int sseState = this->sse_state; + sseState |= 0x8000; /* set flush-to-zero */ + if((CPUCapFlags&CPU_CAP_SSE2)) + sseState |= 0x0040; /* set denormals-are-zero */ + __asm__ __volatile__("ldmxcsr %0" : : "m" (*&sseState)); + } +#endif + + this->in_mode = true; +} + +void FPUCtl::leave() +{ + if(!this->in_mode) return; + +#if defined(HAVE_SSE_INTRINSICS) + _mm_setcsr(this->sse_state); + +#elif defined(__GNUC__) && defined(HAVE_SSE) + + if((CPUCapFlags&CPU_CAP_SSE)) + __asm__ __volatile__("ldmxcsr %0" : : "m" (*&this->sse_state)); +#endif + this->in_mode = false; +} -- cgit v1.2.3