Permitindo interrupções de ponto flutuante no Mac OS X Intel
-
05-07-2019 - |
Pergunta
No Linux, feenableexcept e fedisableexcept pode ser usado para controlar a geração de interrupções SIGFPE sobre exceções de ponto flutuante. Como posso fazer isso no Mac OS X Intel?
Inline montagem para permitir interrupções de ponto flutuante é fornecida no http: // developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf , pp. 7-15, mas apenas para PowerPC montagem.
Solução
Exceções para sse pode ser ativado usando _MM_SET_EXCEPTION_MASK
de xmmintrin.h
. Por exemplo, para permitir inválido exceções (NAN), faça
#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
Outras dicas
No Mac OS X isso é moderadamente complicado. OS X usa a unidade SSE para todos FP matemática por padrão, não a unidade x87 FP. A unidade SSE não honrar as opções de interrupção, o que significa que, além de permitir interrupções, você precisa se certificar de compilar todo o seu código para não usar SSE matemática.
Você pode desativar a matemática, adicionando "-mno-sse -mno-SSE2 -mno-SSE3" aos seus CFLAGS. Depois de fazer isso você pode usar algumas linha de montagem para configurar suas exceções FP, com basicamente as mesmas bandeiras como o Linux.
short fpflags = 0x1332 // Default FP flags, change this however you want.
asm("fnclex");
asm("fldcw _fpflags");
A captura você pode encontrar é que, desde OS X é construído inteiramente utilizando sse pode haver erros não detectados. Sei lá costumava ser um grande com o manipulador de sinal não passar de volta os códigos adequados, mas isso foi há alguns anos, espero que seja corrigido agora.