osx - sitio - Habilitación de interrupciones de punto flotante en Mac OS X Intel
picture in picture mac os sierra (2)
En Linux, feenableexcept y fedisableexcept se pueden usar para controlar la generación de interrupciones SIGFPE en excepciones de coma flotante. ¿Cómo puedo hacer esto en Mac OS X Intel?
El ensamblaje en línea para habilitar interrupciones de coma flotante se proporciona en http://developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf , pp. 7-15, pero solo para el ensamblaje de PowerPC.
En Mac OS X esto es moderadamente complicado. OS X usa la unidad SSE para todas las matemáticas FP por defecto, no la unidad x87 FP. La unidad SSE no respeta las opciones de interrupción, por lo que significa que además de habilitar las interrupciones, debe asegurarse de compilar todo el código para no utilizar las matemáticas SSE.
Puede desactivar los cálculos agregando "-mno-sse -mno-sse2 -mno-sse3" a su CFLAGS. Una vez que lo haga, puede usar un ensamblaje en línea para configurar sus excepciones de FP, básicamente con los mismos indicadores que Linux.
short fpflags = 0x1332 // Default FP flags, change this however you want.
asm("fnclex");
asm("fldcw _fpflags");
La única pega que puede encontrar es que, dado que OS X está construido completamente usando sse, puede haber errores no detectados. Sé que solía haber un gran problema con el manejador de señales que no transmitía los códigos adecuados, pero eso fue hace unos años, con suerte ya está arreglado.
Se pueden habilitar excepciones para sse usando _MM_SET_EXCEPTION_MASK
desde xmmintrin.h
. Por ejemplo, para habilitar las excepciones no válidas (nan), haga
#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);