Pregunta

En Linux, feenableexcept y fedisableexcept se pueden usar para controlar la generación de interrupciones SIGFPE en excepciones de punto flotante. ¿Cómo puedo hacer esto en Mac OS X Intel?

El ensamblaje en línea para habilitar interrupciones de punto 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.

¿Fue útil?

Solución

Las excepciones para sse se pueden habilitar usando _MM_SET_EXCEPTION_MASK desde xmmintrin.h . Por ejemplo, para habilitar excepciones no válidas (nan), haga

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

Otros consejos

En Mac OS X esto es moderadamente complicado. OS X usa la unidad SSE para todas las matemáticas FP de forma predeterminada, no la unidad x87 FP. La unidad SSE no respeta las opciones de interrupción, por lo que eso significa que además de habilitar interrupciones, debe asegurarse de compilar todo su código para no utilizar las matemáticas de SSE.

Puedes deshabilitar las matemáticas agregando " -mno-sse -mno-sse2 -mno-sse3 " a tus CFLAGS. Una vez que haga eso, puede usar algún ensamblaje en línea para configurar sus excepciones de PF, básicamente con las mismas marcas que Linux.

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

El único problema 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 devolvía los códigos adecuados, pero eso fue hace algunos años, con suerte ahora está arreglado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top