2008-10-29 15 views
17

Su Linux, feenableexcept e fedisableexcept può essere utilizzato per controllare la generazione di SIGFPE interrompe il galleggiante eccezioni point. Come posso farlo su Mac OS X Intel?Abilitazione virgola mobile interrompe su Mac OS X Intel

Il montaggio in linea per l'abilitazione degli interrupt in virgola mobile è fornito in http://developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf, pp. 7-15, ma solo per il gruppo PowerPC.

risposta

23

Eccezioni per sse possono essere abilitate tramite _MM_SET_EXCEPTION_MASK da xmmintrin.h. Ad esempio, per consentire valide eccezioni (Nan), fare

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

In Mac OS X questo è moderatamente complicato. OS X utilizza l'unità SSE per tutte le matematiche FP di default, non l'unità FP x87. L'unità SSE non rispetta le opzioni di interruzione, quindi significa che oltre a abilitare gli interrupt, è necessario assicurarsi di compilare tutto il codice per non utilizzare la matematica SSE.

è possibile disattivare la matematica con l'aggiunta di "-mno-sse -mno-SSE2 -mno-SSE3" per CFLAGS. Una volta fatto, puoi usare un assembly inline per configurare le tue eccezioni FP, con fondamentalmente gli stessi flag di Linux.

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

Quello cattura si può trovare è che dal momento che OS X è costruito interamente utilizzando sse ci possono essere errori non rilevati. So che prima c'era un grosso problema con il gestore del segnale che non passava indietro i codici corretti, ma è stato qualche anno fa, si spera che sia stato risolto adesso.

+2

Questo forse non era così rilevante nel 2008, ma vale la pena notare che il 64 bit di codice utilizza l'unità SSE piuttosto che unità x87 FP su tutte le piattaforme (non solo OS X). – Spock