Make FLT_ROUNDS correctly reflect the dynamic rounding mode.
This commit is contained in:
parent
ec79bc0da9
commit
479f8d2214
@ -4,5 +4,5 @@
|
||||
SRCS+= _setjmp.S rfork_thread.S setjmp.S sigsetjmp.S \
|
||||
fabs.S modf.S \
|
||||
infinity.c ldexp.c makecontext.c signalcontext.c \
|
||||
fpgetmask.c fpsetmask.c fpgetprec.c fpsetprec.c \
|
||||
flt_rounds.c fpgetmask.c fpsetmask.c fpgetprec.c fpsetprec.c \
|
||||
fpgetround.c fpsetround.c fpgetsticky.c fpsetsticky.c
|
||||
|
26
lib/libc/amd64/gen/flt_rounds.c
Normal file
26
lib/libc/amd64/gen/flt_rounds.c
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Written by J.T. Conklin, Apr 10, 1995
|
||||
* Public domain.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <float.h>
|
||||
|
||||
static const int map[] = {
|
||||
1, /* round to nearest */
|
||||
3, /* round to zero */
|
||||
2, /* round to negative infinity */
|
||||
0 /* round to positive infinity */
|
||||
};
|
||||
|
||||
int
|
||||
__flt_rounds(void)
|
||||
{
|
||||
int x;
|
||||
|
||||
/* Assume that the x87 and the SSE unit agree on the rounding mode. */
|
||||
__asm("fnstcw %0" : "=m" (x));
|
||||
return (map[(x >> 10) & 0x03]);
|
||||
}
|
@ -2,5 +2,5 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SRCS+= _ctx_start.S _setjmp.S alloca.S fabs.S \
|
||||
infinity.c ldexp.c makecontext.c modf.S \
|
||||
flt_rounds.c infinity.c ldexp.c makecontext.c modf.S \
|
||||
rfork_thread.S setjmp.S signalcontext.c sigsetjmp.S
|
||||
|
25
lib/libc/i386/gen/flt_rounds.c
Normal file
25
lib/libc/i386/gen/flt_rounds.c
Normal file
@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Written by J.T. Conklin, Apr 10, 1995
|
||||
* Public domain.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <float.h>
|
||||
|
||||
static const int map[] = {
|
||||
1, /* round to nearest */
|
||||
3, /* round to zero */
|
||||
2, /* round to negative infinity */
|
||||
0 /* round to positive infinity */
|
||||
};
|
||||
|
||||
int
|
||||
__flt_rounds(void)
|
||||
{
|
||||
int x;
|
||||
|
||||
__asm("fnstcw %0" : "=m" (x));
|
||||
return (map[(x >> 10) & 0x03]);
|
||||
}
|
@ -2,7 +2,8 @@
|
||||
|
||||
SRCS+= __divdf3.S __divdi3.S __divsf3.S __divsi3.S __moddi3.S __modsi3.S \
|
||||
__udivdi3.S __udivsi3.S __umoddi3.S __umodsi3.S _setjmp.S fabs.S \
|
||||
fpgetmask.c fpgetround.c fpsetmask.c fpsetround.c infinity.c \
|
||||
flt_rounds.c fpgetmask.c fpgetround.c fpsetmask.c \
|
||||
fpsetround.c infinity.c \
|
||||
ldexp.c makecontext.c modf.c setjmp.S signalcontext.c sigsetjmp.S
|
||||
|
||||
# The following may go away if function _Unwind_FindTableEntry()
|
||||
|
25
lib/libc/ia64/gen/flt_rounds.c
Normal file
25
lib/libc/ia64/gen/flt_rounds.c
Normal file
@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Written by J.T. Conklin, Apr 10, 1995
|
||||
* Public domain.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <float.h>
|
||||
|
||||
static const int map[] = {
|
||||
1, /* round to nearest */
|
||||
3, /* round to zero */
|
||||
2, /* round to negative infinity */
|
||||
0 /* round to positive infinity */
|
||||
};
|
||||
|
||||
int
|
||||
__flt_rounds(void)
|
||||
{
|
||||
int x;
|
||||
|
||||
__asm("mov %0=ar.fpsr" : "=r" (x));
|
||||
return (map[(x >> 10) & 0x03]);
|
||||
}
|
@ -35,8 +35,12 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
extern int __flt_rounds(void);
|
||||
__END_DECLS
|
||||
|
||||
#define FLT_RADIX 2 /* b */
|
||||
#define FLT_ROUNDS 1 /* FP addition rounds to nearest */
|
||||
#define FLT_ROUNDS __flt_rounds()
|
||||
#if __ISO_C_VISIBLE >= 1999
|
||||
#define FLT_EVAL_METHOD (-1) /* i387 semantics are...interesting */
|
||||
#define DECIMAL_DIG 21 /* max precision in decimal digits */
|
||||
|
@ -38,8 +38,8 @@
|
||||
#define _MACHINE_FLOAT_H_ 1
|
||||
|
||||
#define FLT_RADIX 2 /* b */
|
||||
#define FLT_ROUNDS 1 /* FP addition rounds to nearest */
|
||||
#define FLT_EVAL_METHOD (-1) /* i387 semantics are...interesting */
|
||||
#define FLT_ROUNDS (-1) /* indeterminate */
|
||||
#define FLT_EVAL_METHOD (-1) /* XXX */
|
||||
#define DECIMAL_DIG 21 /* max precision in decimal digits */
|
||||
|
||||
#define FLT_MANT_DIG 24 /* p */
|
||||
|
@ -35,8 +35,12 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
extern int __flt_rounds(void);
|
||||
__END_DECLS
|
||||
|
||||
#define FLT_RADIX 2 /* b */
|
||||
#define FLT_ROUNDS 1 /* FP addition rounds to nearest */
|
||||
#define FLT_ROUNDS __flt_rounds()
|
||||
#if __ISO_C_VISIBLE >= 1999
|
||||
#define FLT_EVAL_METHOD (-1) /* i387 semantics are...interesting */
|
||||
#define DECIMAL_DIG 21 /* max precision in decimal digits */
|
||||
|
@ -35,8 +35,12 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
extern int __flt_rounds(void);
|
||||
__END_DECLS
|
||||
|
||||
#define FLT_RADIX 2 /* b */
|
||||
#define FLT_ROUNDS 1 /* FP addition rounds to nearest */
|
||||
#define FLT_ROUNDS __flt_rounds()
|
||||
#if __ISO_C_VISIBLE >= 1999
|
||||
#define FLT_EVAL_METHOD 0 /* no promotions */
|
||||
#define DECIMAL_DIG 35 /* max precision in decimal digits */
|
||||
|
@ -36,8 +36,12 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
extern int __flt_rounds(void);
|
||||
__END_DECLS
|
||||
|
||||
#define FLT_RADIX 2 /* b */
|
||||
#define FLT_ROUNDS 1 /* FP addition rounds to nearest */
|
||||
#define FLT_ROUNDS __flt_rounds()
|
||||
#if __ISO_C_VISIBLE >= 1999
|
||||
#define FLT_EVAL_METHOD 1 /* operands promoted to double */
|
||||
#define DECIMAL_DIG 35 /* max precision in decimal digits */
|
||||
|
Loading…
Reference in New Issue
Block a user