5.3.3. Microsoft compatibility functions

The following three functions are implemented for compatibility with Microsoft products, to ease porting of floating-point code to the ARM architecture. They are defined in float.h.

The _controlfp function

The function _controlfp allows you to control exception traps and rounding modes:

unsigned int _controlfp(unsigned int new, unsigned int mask);

This function also modifies a control word using a mask to isolate the bits to modify. For every bit of mask that is zero, the corresponding control word bit is unchanged. For every bit of mask that is nonzero, the corresponding control word bit is set to the value of the corresponding bit of new. The return value is the previous state of the control word.

Note

This is not quite the same as the behavior of __fp_status and __ieee_status, where you can toggle a bit by setting a zero in the mask word and a one in the flags word.

The macros you can use to form the arguments to _controlfp are given in Table 5.7.

Table 5.7. _controlfp argument macros

MacroDescription
_MCW_EMMask containing all exception bits
_EM_INVALIDBit describing the Invalid Operation exception
_EM_ZERODIVIDEBit describing the Divide by Zero exception
_EM_OVERFLOWBit describing the Overflow exception
_EM_UNDERFLOWBit describing the Underflow exception
_EM_INEXACTBit describing the Inexact Result exception
_MCW_RCMask for the rounding mode field
_RC_CHOPRounding mode value describing Round Toward Zero
_RC_UPRounding mode value describing Round Up
_RC_DOWNRounding mode value describing Round Down
_RC_NEARRounding mode value describing Round To Nearest

Note

It is not guaranteed that the values of these macros will remain the same in future versions of ARM products. To ensure that your code continues to work if the value changes in future releases, use the macro rather than its value.

For example, to set the rounding mode to round down, you would do:

_controlfp(_RC_DOWN, _MCW_RC);

To trap the Invalid Operation exception and untrap all other exceptions:

_controlfp(_EM_INVALID, _MCW_EM);

To untrap the Inexact Result exception:

_controlfp(0, _EM_INEXACT);

The _clearfp function

The function _clearfp clears all five exception sticky flags, and returns their previous value. The macros given in Table 5.7, for example _EM_INVALID, _EM_ZERODIVIDE, can be used to test bits of the returned result.

_clearfp has the following prototype:

unsigned _clearfp(void);

The _statusfp function

The function _statusfp returns the current value of the exception sticky flags. The macros given in Table 5.7, for example _EM_INVALID, _EM_ZERODIVIDE, can be used to test bits of the returned result.

_statusfp has the following prototype:

unsigned _statusfp(void);
Copyright © 1999-2001 ARM Limited. All rights reserved.ARM DUI 0067D
Non-Confidential