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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top