2008-10-29 7 views
17

Linux에서는 feenableexcept 및 fedisableexcept를 사용하여 부동 소수점 예외에 대한 SIGFPE 인터럽트 생성을 제어 할 수 있습니다. Mac OS X Intel에서 어떻게하면됩니까?Mac OS X에서 부동 소수점 인터럽트 활성화 Intel

부동 소수점 인터럽트를 활성화하는 인라인 어셈블리는 http://developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf, pp. 7-15에 있지만 PowerPC 어셈블리에만 제공됩니다.

답변

23

_MM_SET_EXCEPTION_MASKxmmintrin.h을 사용하면 sse 예외를 사용할 수 있습니다. 예를 들어, (뿐만 아니라, 무효 (유모) 예외를 가능하게

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

Mac OS X의 경우 다소 복잡합니다. OS X은 기본적으로 모든 FP 수학에 SSE 단위를 사용하지만 x87 FP 단위는 사용하지 않습니다. SSE 유닛은 인터럽트 옵션을 존중하지 않으므로 인터럽트를 활성화하는 것 외에도 SSE 연산을 사용하지 않도록 모든 코드를 컴파일해야합니다.

"-mno-sse -mno-sse2 -mno-sse3"을 CFLAGS에 추가하여 수학을 사용하지 않도록 설정할 수 있습니다. 일단 그렇게하면 일부 인라인 어셈블리를 사용하여 FP 예외를 구성 할 수 있습니다. 기본적으로 Linux와 동일한 플래그가 사용됩니다.

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

OS X는 전적으로 sse를 사용하여 빌드 되었기 때문에 잡히지 않은 버그가있을 수 있습니다. 나는 적절한 코드를 되돌려 보내지 않는 시그널 핸들러를 가진 사람이 많았던 것을 알고 있었지만 몇 년 전 이었지만 잘하면 지금은 고쳐졌다.

+2

이 아마 2008 년에 매우 관련이 아니었다 수행하지만 64 비트 코드는 모든 플랫폼에서 SSE 단위가 아닌 x87 FP 유닛을 사용하는 주목할 필요합니다 OS X). – Spock