6.3.1. __ieee_status()

ARM 컴파일러는 부동 소수점 환경에서 상태어에 대한 인터페이스를 지원합니다. 이 함수는 __ieee_status라고 부르며 일반적으로 VFP에 대한 상태어를 수정할 때 가장 효과적인 함수입니다. __ieee_statusfenv.h에 정의되어 있습니다.

__ieee_status의 프로토타입은 다음과 같습니다.

unsigned int __ieee_status(unsigned int mask,
                           unsigned int flags);

이 함수는 매개변수에 따라 상태어에서 기록 가능한 부분을 수정하고 전체 워드의 이전 값을 반환합니다.

기록 가능한 비트를 수정하려면 다음과 같이 설정합니다.

new = (old & ~mask) ^ flags;

마스크와 플래그의 비트가 무엇인가에 따라 4가지 작업이 상태어의 각 비트에 수행됩니다(Table 6.6 참조).

Table 6.6. 상태어 비트 수정

마스크 비트플래그 비트효과
00변경 없음
01토글
100으로 설정
111로 설정

Figure 6.1__ieee_status를 통해 보는 상태어 레이아웃입니다.

Figure 6.1. IEEE 상태어 레이아웃

IEEE 상태어 레이아웃

Figure 6.1의 필드는 다음과 같습니다.

fenv.h__ieee_status 호출 자체를 정의할 뿐 아니라, 인수로 사용되는 다음과 같은 일부 상수도 정의합니다.

#define FE_IEEE_FLUSHZERO          (0x01000000)
#define FE_IEEE_ROUND_TONEAREST    (0x00000000)
#define FE_IEEE_ROUND_UPWARD       (0x00400000)
#define FE_IEEE_ROUND_DOWNWARD     (0x00800000)
#define FE_IEEE_ROUND_TOWARDZERO   (0x00C00000)
#define FE_IEEE_ROUND_MASK         (0x00C00000)
#define FE_IEEE_MASK_INVALID       (0x00000100)
#define FE_IEEE_MASK_DIVBYZERO     (0x00000200)
#define FE_IEEE_MASK_OVERFLOW      (0x00000400)
#define FE_IEEE_MASK_UNDERFLOW     (0x00000800)
#define FE_IEEE_MASK_INEXACT       (0x00001000)
#define FE_IEEE_MASK_ALL_EXCEPT    (0x00001F00)
#define FE_IEEE_INVALID            (0x00000001)
#define FE_IEEE_DIVBYZERO          (0x00000002)
#define FE_IEEE_OVERFLOW           (0x00000004)
#define FE_IEEE_UNDERFLOW          (0x00000008)
#define FE_IEEE_INEXACT            (0x00000010)
#define FE_IEEE_ALL_EXCEPT         (0x0000001F)

예를 들어, 반올림 모드를 설정하려면 다음을 수행해야 합니다.

__ieee_status(FE_IEEE_ROUND_MASK, FE_IEEE_ROUND_DOWNWARD);

잘못된 연산 예외를 트랩하고 다른 모든 예외를 언트랩하려면 다음을 수행하십시오.

__ieee_status(FE_IEEE_MASK_ALL_EXCEPT, FE_IEEE_MASK_INVALID);

정확하지 않은 결과 예외를 언트랩하려면 다음을 수행하십시오.

__ieee_status(FE_IEEE_MASK_INEXACT, 0);

언더플로 스티키 플래그를 지우려면 다음을 수행하십시오.

__ieee_status(FE_IEEE_UNDERFLOW, 0);
Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0205GK
Non-Confidential