Domanda

Su Linux, feenableexcept e fedisableexcept possono essere utilizzati per controllare la generazione di interrupt SIGFPE su eccezioni in virgola mobile. Come posso farlo su Mac OS X Intel?

L'assemblaggio inline per abilitare gli interrupt in virgola mobile è disponibile in http: // developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf , pagg. 7-15, ma solo per l'assemblaggio di PowerPC.

È stato utile?

Soluzione

Le eccezioni per sse possono essere abilitate usando _MM_SET_EXCEPTION_MASK da xmmintrin.h . Ad esempio, per abilitare eccezioni (nan) non valide, fare

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

Altri suggerimenti

Su Mac OS X questo è moderatamente complicato. OS X utilizza per impostazione predefinita l'unità SSE per tutta la matematica FP, non l'unità FP x87. L'unità SSE non rispetta le opzioni di interruzione, quindi ciò significa che oltre ad abilitare gli interrupt, è necessario assicurarsi di compilare tutto il codice per non utilizzare la matematica SSE.

Puoi disabilitare la matematica aggiungendo " -mno-sse -mno-sse2 -mno-sse3 " ai tuoi CFLAGS. Una volta che lo fai, puoi usare alcuni assembly inline per configurare le tue eccezioni FP, con sostanzialmente gli stessi flag di Linux.

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

L'unico problema che potresti trovare è che poiché OS X è stato creato interamente usando sse potrebbero esserci dei bug non rilevati. So che c'era un grosso problema con il gestore del segnale che non restituiva i codici corretti, ma è successo qualche anno fa, spero che sia stato corretto ora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top