From e1418cfe3e313f0646f374c0ab4e86a29069deef Mon Sep 17 00:00:00 2001 From: Peter Avalos Date: Sun, 17 Jun 2007 02:27:53 +0000 Subject: [PATCH] make an intermediate float variable "volatile" on i386 to work around a gcc optimization problem: subsequent add/subs were done inside FPU registers, with "double" precision, without rounding to "float" in between Obtained-from: NetBSD --- lib/libm/src/lrintf.c | 12 ++++++++---- lib/libm/src/s_rintf.c | 10 +++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/libm/src/lrintf.c b/lib/libm/src/lrintf.c index e65b880d76..3ad9fee418 100644 --- a/lib/libm/src/lrintf.c +++ b/lib/libm/src/lrintf.c @@ -23,8 +23,8 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $NetBSD: lrintf.c,v 1.3 2004/10/13 15:18:32 drochner Exp $ - * $DragonFly: src/lib/libm/src/lrintf.c,v 1.1 2005/07/26 21:15:20 joerg Exp $ + * $NetBSD: lrintf.c,v 1.4 2006/08/01 20:14:35 drochner Exp $ + * $DragonFly: src/lib/libm/src/lrintf.c,v 1.2 2007/06/17 02:27:53 pavalos Exp $ */ #include @@ -53,6 +53,10 @@ LRINTNAME(float x) u_int32_t i0; int e, s, shift; RESTYPE res; +#ifdef __i386__ /* XXX gcc4 will omit the rounding otherwise */ + volatile +#endif + float w; GET_FLOAT_WORD(i0, x); e = i0 >> SNG_FRACBITS; @@ -69,8 +73,8 @@ LRINTNAME(float x) /* >= 2^23 is already an exact integer */ if (e < SNG_FRACBITS) { /* round, using current direction */ - x += TWO23[s]; - x -= TWO23[s]; + w = TWO23[s] + x; + x = w - TWO23[s]; } GET_FLOAT_WORD(i0, x); diff --git a/lib/libm/src/s_rintf.c b/lib/libm/src/s_rintf.c index 9ec603b0ab..0790312fad 100644 --- a/lib/libm/src/s_rintf.c +++ b/lib/libm/src/s_rintf.c @@ -12,8 +12,8 @@ * is preserved. * ==================================================== * - * $NetBSD: s_rintf.c,v 1.7 2002/05/26 22:01:58 wiz Exp $ - * $DragonFly: src/lib/libm/src/s_rintf.c,v 1.1 2005/07/26 21:15:20 joerg Exp $ + * $NetBSD: s_rintf.c,v 1.8 2006/08/01 20:14:35 drochner Exp $ + * $DragonFly: src/lib/libm/src/s_rintf.c,v 1.2 2007/06/17 02:27:53 pavalos Exp $ */ #include @@ -30,7 +30,11 @@ rintf(float x) { int32_t i0,j0,sx; u_int32_t i,i1; - float w,t; +#ifdef __i386__ /* XXX gcc4 will omit the rounding otherwise */ + volatile +#endif + float w; + float t; GET_FLOAT_WORD(i0,x); sx = (i0>>31)&1; j0 = ((i0>>23)&0xff)-0x7f; -- 2.41.0