2008-10-29 20 views

回答

23

sse的例外情況可以使用_MM_SET_EXCEPTION_MASKxmmintrin.h啓用。例如,爲了使無效(NAN)異常,做

#include <xmmintrin.h> 
... 
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID); 
6

在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構建,因此可能存在未捕獲的錯誤。我知道信號處理程序過去並沒有傳回正確的代碼,但那是幾年前的事情,希望現在已經修復了。

+2

這也許不是2008年那麼重要,但值得注意的是,64位代碼使用SSE單元,而不是的x87 FP單元在所有平臺上(不僅OS X)。 – Spock 2014-05-09 09:59:12