Implement __flt_rounds for ARMv6 hard-float. The fpscr register stores the

current rounding mode used by the VFP unit.
This commit is contained in:
Andrew Turner 2014-03-22 12:28:21 +00:00
parent e24784d32a
commit cc0c9bba36

View File

@ -30,20 +30,32 @@ __FBSDID("$FreeBSD$");
#include <fenv.h>
#include <float.h>
#ifndef __ARM_PCS_VFP
#include "softfloat-for-gcc.h"
#include "milieu.h"
#include "softfloat.h"
#endif
int
__flt_rounds(void)
{
int mode;
#ifndef ARM_HARD_FLOAT
#ifndef __ARM_PCS_VFP
/*
* Translate our rounding modes to the unnamed
* manifest constants required by C99 et. al.
*/
switch (__softfloat_float_rounding_mode) {
mode = __softfloat_float_rounding_mode;
#else /* __ARM_PCS_VFP */
/*
* Read the floating-point status and control register
*/
__asm __volatile("vmrs %0, fpscr" : "=&r"(mode));
mode &= _ROUND_MASK;
#endif /* __ARM_PCS_VFP */
switch (mode) {
case FE_TOWARDZERO:
return (0);
case FE_TONEAREST:
@ -54,12 +66,4 @@ __flt_rounds(void)
return (3);
}
return (-1);
#else /* ARM_HARD_FLOAT */
/*
* Apparently, the rounding mode is specified as part of the
* instruction format on ARM, so the dynamic rounding mode is
* indeterminate. Some FPUs may differ.
*/
return (-1);
#endif /* ARM_HARD_FLOAT */
}