6.3.2. __fp_status()

Previous versions of the ARM libraries implemented a function called __fp_status that manipulated a status word in the floating-point environment. This is the same as __ieee_status but uses an older-style status word layout. The ARM compiler still supports the __fp_status function for backwards compatibility. __fp_status is defined in stdlib.h.

__fp_status has the following prototype:

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

The layout of the status word as seen by __fp_status is shown in Figure 6.2.

Figure 6.2. Floating-point status word layout

The fields in Figure 6.2 are as follows:

The rounding mode cannot be changed with the __fp_status call.

In addition to defining the __fp_status call itself, stdlib.h also defines some constants to be used for the arguments:


#define __fpsr_IXE  0x100000
#define __fpsr_UFE  0x80000
#define __fpsr_OFE  0x40000
#define __fpsr_DZE  0x20000
#define __fpsr_IOE  0x10000
#define __fpsr_IXC  0x10
#define __fpsr_UFC  0x8
#define __fpsr_OFC  0x4
#define __fpsr_DZC  0x2
#define __fpsr_IOC  0x1

For example, to trap the Invalid Operation exception and untrap all other exceptions, you would do:


__fp_status(_fpsr_IXE | _fpsr_UFE | _fpsr_OFE |
            _fpsr_DZE | _fpsr_IOE, _fpsr_IOE);

To untrap the Inexact Result exception:


__fp_status(_fpsr_IXE, 0);

To clear the Underflow sticky flag:


__fp_status(_fpsr_UFC, 0);
Copyright © 2005 ARM Limited. All rights reserved.ARM DUI 0282B
Non-Confidential