Mac OS X Intelでの浮動小数点割り込みの有効化
-
05-07-2019 - |
質問
Linuxでは、feenableexceptおよびfedisableexceptを使用して、浮動小数点例外でのSIGFPE割り込みの生成を制御できます。 Mac OS X Intelでこれを行うにはどうすればよいですか?
浮動小数点割り込みを有効にするためのインラインアセンブリは、 http://で提供されています。 developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf 、7-15ページ、ただしPowerPCアセンブリのみ。
解決
sseの例外は、 xmmintrin.h
の _MM_SET_EXCEPTION_MASK
を使用して有効にできます。たとえば、無効な(nan)例外を有効にするには、do
#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
他のヒント
Mac OS Xでは、これはやや複雑です。 OS Xは、x87 FPユニットではなく、デフォルトですべてのFP演算にSSEユニットを使用します。 SSEユニットは割り込みオプションを尊重しないため、割り込みを有効にすることに加えて、SSE数学を使用しないようにすべてのコードをコンパイルする必要があります。
&quot; -mno-sse -mno-sse2 -mno-sse3&quot;を追加して、数学を無効にできます。 CFLAGSへ。これを行うと、インラインアセンブリを使用して、基本的にLinuxと同じフラグを使用してFP例外を構成できます。
short fpflags = 0x1332 // Default FP flags, change this however you want.
asm("fnclex");
asm("fldcw _fpflags");
あなたが見つけるかもしれない1つのキャッチは、OS Xが完全にsseを使用して構築されているため、キャッチされていないバグがあるかもしれないということです。以前はシグナルハンドラが適切なコードを返さないという大きな問題がありましたが、それは数年前のことでしたが、今は修正されていることを願っています。