19

Linux では、fenableexcept と fedisableexcept を使用して、浮動小数点例外での SIGFPE 割り込みの生成を制御できます。Mac OS X Intel でこれを行うにはどうすればよいですか?

浮動小数点割り込みを有効にするインライン アセンブリは、http: //developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf の 7-15 ページで提供されていますが、PowerPC アセンブリのみです。

4

2 に答える 2

25

_MM_SET_EXCEPTION_MASKfromを使用して、sse の例外を有効にすることができますxmmintrin.h。たとえば、無効な (nan) 例外を有効にするには、次のようにします。

#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
于 2008-12-04T14:06:35.710 に答える
7

Mac OS Xでは、これはやや複雑です。OS Xは、x87 FPユニットではなく、デフォルトですべてのFP計算にSSEユニットを使用します。SSEユニットは割り込みオプションを尊重しません。つまり、割り込みを有効にすることに加えて、SSE演算を使用しないようにすべてのコードをコンパイルする必要があります。

CFLAGSに「-mno-sse-mno-sse2-mno-sse3」を追加すると、計算を無効にできます。これを行うと、インラインアセンブリを使用して、基本的にLinuxと同じフラグを使用してFP例外を構成できます。

short fpflags = 0x1332 // Default FP flags, change this however you want. 
asm("fnclex");
asm("fldcw _fpflags");

OS Xは完全にsseを使用して構築されているため、キャッチされていないバグが存在する可能性があります。シグナルハンドラーが適切なコードを返さないという大きな問題があったことは知っていますが、それは数年前のことであり、うまくいけば今は修正されています。

于 2008-10-31T04:23:30.837 に答える