在Linux上,feenableexcept和fedisableexcept可用於控制浮點異常中SIGFPE中斷的生成。我如何在Mac OS X上執行此操作?在Mac OS X上啓用浮點中斷英特爾
用於啓用浮點中斷的內聯彙編在http://developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf,第7-15頁中提供,但僅適用於PowerPC彙編。
在Linux上,feenableexcept和fedisableexcept可用於控制浮點異常中SIGFPE中斷的生成。我如何在Mac OS X上執行此操作?在Mac OS X上啓用浮點中斷英特爾
用於啓用浮點中斷的內聯彙編在http://developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf,第7-15頁中提供,但僅適用於PowerPC彙編。
sse的例外情況可以使用_MM_SET_EXCEPTION_MASK
從xmmintrin.h
啓用。例如,爲了使無效(NAN)異常,做
#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
在Mac OS X上,這是相當複雜的。 OS X默認使用SSE單位進行所有FP數學運算,而不是x87 FP單位。 SSE單元不遵守中斷選項,這意味着除了啓用中斷之外,還需要確保編譯所有代碼而不要使用SSE數學。
您可以通過向CFLAGS添加「-mno-sse -mno-sse2 -mno-sse3」來禁用數學運算。一旦你這樣做了,你可以使用一些內聯彙編來配置你的FP異常,其標誌與Linux基本相同。
short fpflags = 0x1332 // Default FP flags, change this however you want.
asm("fnclex");
asm("fldcw _fpflags");
您可能發現的一個問題是,由於OS X完全使用sse構建,因此可能存在未捕獲的錯誤。我知道信號處理程序過去並沒有傳回正確的代碼,但那是幾年前的事情,希望現在已經修復了。
這也許不是2008年那麼重要,但值得注意的是,64位代碼使用SSE單元,而不是的x87 FP單元在所有平臺上(不僅OS X)。 – Spock 2014-05-09 09:59:12