diff foosdk/sdk/pfc/fpu.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/pfc/fpu.h	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,58 @@
+#pragma once
+
+#ifdef _MSC_VER
+
+class fpu_control
+{
+	unsigned old_val;
+	unsigned mask;
+public:
+	inline fpu_control(unsigned p_mask,unsigned p_val)
+	{
+		mask = p_mask;
+		_controlfp_s(&old_val,p_val,mask);
+	}
+	inline ~fpu_control()
+	{
+		unsigned dummy;
+		_controlfp_s(&dummy,old_val,mask);
+	}
+};
+
+class fpu_control_roundnearest : private fpu_control
+{
+public:
+	fpu_control_roundnearest() : fpu_control(_MCW_RC,_RC_NEAR) {}
+};
+
+class fpu_control_flushdenormal : private fpu_control
+{
+public:
+	fpu_control_flushdenormal() : fpu_control(_MCW_DN,_DN_FLUSH) {}
+};
+
+class fpu_control_default : private fpu_control
+{
+public:
+	fpu_control_default() : fpu_control(_MCW_DN|_MCW_RC,_DN_FLUSH|_RC_NEAR) {}
+};
+
+#ifdef _M_IX86
+class sse_control {
+public:
+	sse_control(unsigned p_mask,unsigned p_val) : m_mask(p_mask) {
+		__control87_2(p_val,p_mask,NULL,&m_oldval);
+	}
+	~sse_control() {
+		__control87_2(m_oldval,m_mask,NULL,&m_oldval);
+	}
+private:
+	unsigned m_mask,m_oldval;
+};
+class sse_control_flushdenormal : private sse_control {
+public:
+	sse_control_flushdenormal() : sse_control(_MCW_DN,_DN_FLUSH) {}
+};
+#endif
+
+#endif