mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
Implement and use libc_feholdexcept_setround_53bit and libc_feupdateenv_53bit
so that double arithmetic in s_sin is done in 53 bit (without extend i386 double precision)
This commit is contained in:
parent
1e2405c8fa
commit
c4814b6b3a
@ -370,6 +370,9 @@ extern void __docos (double __x, double __dx, double __v[]);
|
|||||||
#define libc_feholdexcept_setroundl(e, r) \
|
#define libc_feholdexcept_setroundl(e, r) \
|
||||||
do { feholdexcept (e); fesetround (r); } while (0)
|
do { feholdexcept (e); fesetround (r); } while (0)
|
||||||
|
|
||||||
|
#define libc_feholdexcept_setround_53bit(e, r) \
|
||||||
|
libc_feholdexcept_setround (e, r)
|
||||||
|
|
||||||
#define libc_fetestexcept(e) fetestexcept (e)
|
#define libc_fetestexcept(e) fetestexcept (e)
|
||||||
#define libc_fetestexceptf(e) fetestexcept (e)
|
#define libc_fetestexceptf(e) fetestexcept (e)
|
||||||
#define libc_fetestexceptl(e) fetestexcept (e)
|
#define libc_fetestexceptl(e) fetestexcept (e)
|
||||||
@ -382,6 +385,8 @@ extern void __docos (double __x, double __dx, double __v[]);
|
|||||||
#define libc_feupdateenvf(e) (void) feupdateenv (e)
|
#define libc_feupdateenvf(e) (void) feupdateenv (e)
|
||||||
#define libc_feupdateenvl(e) (void) feupdateenv (e)
|
#define libc_feupdateenvl(e) (void) feupdateenv (e)
|
||||||
|
|
||||||
|
#define libc_feupdateenv_53bit(e) libc_feupdateenv (e)
|
||||||
|
|
||||||
#define __nan(str) \
|
#define __nan(str) \
|
||||||
(__builtin_constant_p (str) && str[0] == '\0' ? NAN : __nan (str))
|
(__builtin_constant_p (str) && str[0] == '\0' ? NAN : __nan (str))
|
||||||
#define __nanf(str) \
|
#define __nanf(str) \
|
||||||
|
@ -16,4 +16,33 @@ do \
|
|||||||
while (0)
|
while (0)
|
||||||
|
|
||||||
#include_next <math_private.h>
|
#include_next <math_private.h>
|
||||||
|
|
||||||
|
# include <fpu_control.h>
|
||||||
|
|
||||||
|
# undef libc_feholdexcept_setround_53bit
|
||||||
|
# define libc_feholdexcept_setround_53bit(e, r) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
fpu_control_t cw; \
|
||||||
|
libc_feholdexcept_setround (e, r); \
|
||||||
|
_FPU_GETCW (cw); \
|
||||||
|
cw &= ~(fpu_control_t) _FPU_EXTENDED; \
|
||||||
|
cw |= _FPU_DOUBLE; \
|
||||||
|
_FPU_SETCW (cw); \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
# undef libc_feupdateenv_53bit
|
||||||
|
# define libc_feupdateenv_53bit(e) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
fpu_control_t cw; \
|
||||||
|
libc_feupdateenv (e); \
|
||||||
|
_FPU_GETCW (cw); \
|
||||||
|
cw &= ~(fpu_control_t) _FPU_EXTENDED; \
|
||||||
|
cw |= _FPU_EXTENDED; \
|
||||||
|
_FPU_SETCW (cw); \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* IBM Accurate Mathematical Library
|
* IBM Accurate Mathematical Library
|
||||||
* written by International Business Machines Corp.
|
* written by International Business Machines Corp.
|
||||||
* Copyright (C) 2001, 2009, 2011 Free Software Foundation
|
* Copyright (C) 2001-2012 Free Software Foundation
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
@ -111,7 +111,7 @@ __sin(double x){
|
|||||||
fenv_t env;
|
fenv_t env;
|
||||||
double retval = 0;
|
double retval = 0;
|
||||||
|
|
||||||
libc_feholdexcept_setround (&env, FE_TONEAREST);
|
libc_feholdexcept_setround_53bit (&env, FE_TONEAREST);
|
||||||
|
|
||||||
u.x = x;
|
u.x = x;
|
||||||
m = u.i[HIGH_HALF];
|
m = u.i[HIGH_HALF];
|
||||||
@ -365,7 +365,7 @@ __sin(double x){
|
|||||||
}
|
}
|
||||||
|
|
||||||
ret:
|
ret:
|
||||||
libc_feupdateenv (&env);
|
libc_feupdateenv_53bit (&env);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -386,7 +386,7 @@ __cos(double x)
|
|||||||
fenv_t env;
|
fenv_t env;
|
||||||
double retval = 0;
|
double retval = 0;
|
||||||
|
|
||||||
libc_feholdexcept_setround (&env, FE_TONEAREST);
|
libc_feholdexcept_setround_53bit (&env, FE_TONEAREST);
|
||||||
|
|
||||||
u.x = x;
|
u.x = x;
|
||||||
m = u.i[HIGH_HALF];
|
m = u.i[HIGH_HALF];
|
||||||
@ -635,7 +635,7 @@ __cos(double x)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ret:
|
ret:
|
||||||
libc_feupdateenv (&env);
|
libc_feupdateenv_53bit (&env);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user