2008-10-29 16 views
17

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?Activación de interrupciones de coma flotante 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.

Respuesta

23

Se pueden habilitar excepciones para sse usando _MM_SET_EXCEPTION_MASK desde xmmintrin.h. Por ejemplo, para permitir excepciones (NAN) no válidas, hacer

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

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"); 

El retén se puede encontrar es que desde OS X está construido en su totalidad utilizando sse puede haber errores sin capturar. 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.

+2

Esto tal vez no era tan relevante en 2008, pero vale la pena señalar que el código de 64 bits utiliza la unidad SSE en lugar de la unidad x87 FP en todas las plataformas (no sólo OS X). – Spock