OSDN Git Service

2007-08-05 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
authorfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 5 Aug 2007 22:14:34 +0000 (22:14 +0000)
committerfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 5 Aug 2007 22:14:34 +0000 (22:14 +0000)
PR fortran/31202
* intrinsics/c99_functions.c (roundl): Provide fallback
implementation for systems without ceill.
* c99_protos.h (roundl): Define prototype in all cases.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127227 138bc75d-0d04-0410-961f-82ee72b054a4

libgfortran/ChangeLog
libgfortran/c99_protos.h
libgfortran/intrinsics/c99_functions.c

index 2ccb46b..bb999ec 100644 (file)
@@ -1,3 +1,10 @@
+2007-08-05  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+
+       PR fortran/31202
+       * intrinsics/c99_functions.c (roundl): Provide fallback
+       implementation for systems without ceill.
+       * c99_protos.h (roundl): Define prototype in all cases.
+
 2007-08-03  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR libfortran/32977
index c4738db..e511b68 100644 (file)
@@ -200,7 +200,7 @@ extern double round(double);
 extern float roundf(float);
 #endif
 
-#if !defined(HAVE_ROUNDL) && defined(HAVE_CEILL)
+#if !defined(HAVE_ROUNDL)
 #define HAVE_ROUNDL 1
 extern long double roundl(long double);
 #endif
index e36c5ba..65c284e 100644 (file)
@@ -500,8 +500,9 @@ powf(float x, float y)
 
 /* Algorithm by Steven G. Kargl.  */
 
-#if !defined(HAVE_ROUNDL) && defined(HAVE_CEILL)
+#if !defined(HAVE_ROUNDL)
 #define HAVE_ROUNDL 1
+#if defined(HAVE_CEILL)
 /* Round to nearest integral value.  If the argument is halfway between two
    integral values then round away from zero.  */
 
@@ -527,6 +528,27 @@ roundl(long double x)
       return (-t);
     }
 }
+#else
+
+/* Poor version of roundl for system that don't have ceill.  */
+long double
+roundl(long double x)
+{
+  if (x > DBL_MAX || x < -DBL_MAX)
+    {
+#ifdef HAVE_NEXTAFTERL
+      static long double prechalf = nexafterl (0.5L, LDBL_MAX);
+#else
+      static long double prechalf = 0.5L;
+#endif
+      return (GFC_INTEGER_LARGEST) (x + (x > 0 ? prechalf : -prechalf));
+    }
+  else
+    /* Use round().  */
+    return round((double) x);
+}
+
+#endif
 #endif
 
 #ifndef HAVE_ROUND