This is the mail archive of the libc-ports@sources.redhat.com mailing list for the libc-ports project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] [PORTS] PPC fenv fixes for soft-fp


This change exposes a few bugs in the soft-fp implementations for PPC.
The current feholdexcept implementation has where it uses fesetenv to
resort the current env:

/* Get the current state. */
fegetenv (envp);

u.fenv = *envp;
/* Clear everything except the rounding mode. */
u.l[0] &= 0x3;

/* ?? Should we clear the disabled exceptions as well ?? */

/* Put the new state in effect. */
fesetenv (envp);

Which is incorrect. It should disable exceptions and pass the updated
env to fesetenv:

/* Disable exceptions */
u.l[1] = FE_ALL_EXCEPT;

/* Put the new state in effect. */
fesetenv (&u.fenv);

Finally the powerpc/nofpu version is missing the libm_hidden_def which
results in a link error in make check.

The attached patch fixes all of these problems.

2007-04-02  Steven Munroe  <sjmunroe@us.ibm.com>

	* sysdeps/powerpc/nofpu/feholdexcpt.c (feholdexcept): Disable
	exceptions.  Use the updated env in fesetenv().
	Add libm_hidden_def.

diff -urN libc25-cvstip-20070320/ports/sysdeps/powerpc/nofpu/feholdexcpt.c libc25/ports/sysdeps/powerpc/nofpu/feholdexcpt.c
--- libc25-cvstip-20070320/ports/sysdeps/powerpc/nofpu/feholdexcpt.c	2002-10-19 15:06:29.000000000 -0500
+++ libc25/ports/sysdeps/powerpc/nofpu/feholdexcpt.c	2007-04-02 10:57:50.350540888 -0500
@@ -1,6 +1,6 @@
 /* Store current floating-point environment and clear exceptions
    (soft-float edition).
-   Copyright (C) 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2007 Free Software Foundation, Inc.
    Contributed by Aldy Hernandez <aldyh@redhat.com>, 2002.
    This file is part of the GNU C Library.
 
@@ -33,11 +33,12 @@
   u.fenv = *envp;
   /* Clear everything except the rounding mode.  */
   u.l[0] &= 0x3;
-
-  /* ?? Should we clear the disabled exceptions as well ?? */
+  /* Disable exceptions */
+  u.l[1] = FE_ALL_EXCEPT;
 
   /* Put the new state in effect.  */
-  fesetenv (envp);
+  fesetenv (&u.fenv);
 
   return 0;
 }
+libm_hidden_def (feholdexcept)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]