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:
parent
e24784d32a
commit
cc0c9bba36
@ -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 */
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user