Make FLT_ROUNDS correctly reflect the dynamic rounding mode.
This commit is contained in:
parent
ec79bc0da9
commit
479f8d2214
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=132383
@ -4,5 +4,5 @@
|
|||||||
SRCS+= _setjmp.S rfork_thread.S setjmp.S sigsetjmp.S \
|
SRCS+= _setjmp.S rfork_thread.S setjmp.S sigsetjmp.S \
|
||||||
fabs.S modf.S \
|
fabs.S modf.S \
|
||||||
infinity.c ldexp.c makecontext.c signalcontext.c \
|
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
|
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$
|
# $FreeBSD$
|
||||||
|
|
||||||
SRCS+= _ctx_start.S _setjmp.S alloca.S fabs.S \
|
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
|
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 \
|
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 \
|
__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
|
ldexp.c makecontext.c modf.c setjmp.S signalcontext.c sigsetjmp.S
|
||||||
|
|
||||||
# The following may go away if function _Unwind_FindTableEntry()
|
# 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>
|
#include <sys/cdefs.h>
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
extern int __flt_rounds(void);
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
#define FLT_RADIX 2 /* b */
|
#define FLT_RADIX 2 /* b */
|
||||||
#define FLT_ROUNDS 1 /* FP addition rounds to nearest */
|
#define FLT_ROUNDS __flt_rounds()
|
||||||
#if __ISO_C_VISIBLE >= 1999
|
#if __ISO_C_VISIBLE >= 1999
|
||||||
#define FLT_EVAL_METHOD (-1) /* i387 semantics are...interesting */
|
#define FLT_EVAL_METHOD (-1) /* i387 semantics are...interesting */
|
||||||
#define DECIMAL_DIG 21 /* max precision in decimal digits */
|
#define DECIMAL_DIG 21 /* max precision in decimal digits */
|
||||||
|
@ -38,8 +38,8 @@
|
|||||||
#define _MACHINE_FLOAT_H_ 1
|
#define _MACHINE_FLOAT_H_ 1
|
||||||
|
|
||||||
#define FLT_RADIX 2 /* b */
|
#define FLT_RADIX 2 /* b */
|
||||||
#define FLT_ROUNDS 1 /* FP addition rounds to nearest */
|
#define FLT_ROUNDS (-1) /* indeterminate */
|
||||||
#define FLT_EVAL_METHOD (-1) /* i387 semantics are...interesting */
|
#define FLT_EVAL_METHOD (-1) /* XXX */
|
||||||
#define DECIMAL_DIG 21 /* max precision in decimal digits */
|
#define DECIMAL_DIG 21 /* max precision in decimal digits */
|
||||||
|
|
||||||
#define FLT_MANT_DIG 24 /* p */
|
#define FLT_MANT_DIG 24 /* p */
|
||||||
|
@ -35,8 +35,12 @@
|
|||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
extern int __flt_rounds(void);
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
#define FLT_RADIX 2 /* b */
|
#define FLT_RADIX 2 /* b */
|
||||||
#define FLT_ROUNDS 1 /* FP addition rounds to nearest */
|
#define FLT_ROUNDS __flt_rounds()
|
||||||
#if __ISO_C_VISIBLE >= 1999
|
#if __ISO_C_VISIBLE >= 1999
|
||||||
#define FLT_EVAL_METHOD (-1) /* i387 semantics are...interesting */
|
#define FLT_EVAL_METHOD (-1) /* i387 semantics are...interesting */
|
||||||
#define DECIMAL_DIG 21 /* max precision in decimal digits */
|
#define DECIMAL_DIG 21 /* max precision in decimal digits */
|
||||||
|
@ -35,8 +35,12 @@
|
|||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
extern int __flt_rounds(void);
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
#define FLT_RADIX 2 /* b */
|
#define FLT_RADIX 2 /* b */
|
||||||
#define FLT_ROUNDS 1 /* FP addition rounds to nearest */
|
#define FLT_ROUNDS __flt_rounds()
|
||||||
#if __ISO_C_VISIBLE >= 1999
|
#if __ISO_C_VISIBLE >= 1999
|
||||||
#define FLT_EVAL_METHOD 0 /* no promotions */
|
#define FLT_EVAL_METHOD 0 /* no promotions */
|
||||||
#define DECIMAL_DIG 35 /* max precision in decimal digits */
|
#define DECIMAL_DIG 35 /* max precision in decimal digits */
|
||||||
|
@ -36,8 +36,12 @@
|
|||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
extern int __flt_rounds(void);
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
#define FLT_RADIX 2 /* b */
|
#define FLT_RADIX 2 /* b */
|
||||||
#define FLT_ROUNDS 1 /* FP addition rounds to nearest */
|
#define FLT_ROUNDS __flt_rounds()
|
||||||
#if __ISO_C_VISIBLE >= 1999
|
#if __ISO_C_VISIBLE >= 1999
|
||||||
#define FLT_EVAL_METHOD 1 /* operands promoted to double */
|
#define FLT_EVAL_METHOD 1 /* operands promoted to double */
|
||||||
#define DECIMAL_DIG 35 /* max precision in decimal digits */
|
#define DECIMAL_DIG 35 /* max precision in decimal digits */
|
||||||
|
Loading…
Reference in New Issue
Block a user