Mac OS X Intel에서 부동 소수점 인터럽트를 활성화합니다
-
05-07-2019 - |
문제
Linux에서는 FeenableExcrect 및 FedisableExcept를 사용하여 부동 소수점 예외에서 SIGFPE 인터럽트 생성을 제어 할 수 있습니다. Mac OS X Intel에서 어떻게 할 수 있습니까?
플로팅 포인트 인터럽트를 활성화하기위한 인라인 어셈블리가 제공됩니다. http://developer.apple.com/documentation/performance/conceptual/mac_osx_numerics/mac_osx_numerics.pdf, pp. 7-15, 그러나 PowerPC 어셈블리 용.
해결책
SSE에 대한 예외를 사용하여 활성화 할 수 있습니다 _MM_SET_EXCEPTION_MASK
~에서 xmmintrin.h
. 예를 들어, 유효하지 않은 (NAN) 예외를 활성화하려면
#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
다른 팁
Mac OS X에서 이것은 적당히 복잡합니다. OS X는 X87 FP 장치가 아닌 기본적으로 모든 FP 수학에 대한 SSE 장치를 사용합니다. SSE 장치는 인터럽트 옵션을 존중하지 않으므로 인터럽트를 활성화하는 것 외에도 SSE 수학을 사용하지 않도록 모든 코드를 컴파일해야합니다.
CFLAG에 "-mno-sse -mno-sse2 -mno-sse3"를 추가하여 수학을 비활성화 할 수 있습니다. 이렇게하면 인라인 어셈블리를 사용하여 기본적으로 Linux와 동일한 플래그를 사용하여 FP 예외를 구성 할 수 있습니다.
short fpflags = 0x1332 // Default FP flags, change this however you want.
asm("fnclex");
asm("fldcw _fpflags");
당신이 찾을 수있는 한 가지는 OS X가 SSE를 사용하여 완전히 구축되기 때문에 매치되지 않은 버그가있을 수 있다는 것입니다. 나는 신호 핸들러가 적절한 코드를 뒤로 전달하지 않는 것이 큰 것을 알고 있었지만, 몇 년 전, 지금은 지금 고정되어 있기를 바랍니다.