powerpc: consolidate rint
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 8 Mar 2019 20:26:36 +0000 (20:26 +0000)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 12 Jun 2019 14:46:22 +0000 (11:46 -0300)
This patches consolidates all the powerpc rint{f} implementations on
the generic sysdeps/powerpc/fpu/s_rint{f}.

Checked on powerpc-linux-gnu (built without --with-cpu, with
--with-cpu=power4 and with --with-cpu=power5+ and --disable-multi-arch),
powerpc64-linux-gnu (built without --with-cp and with --with-cpu=power5+
and --disable-multi-arch).

* sysdeps/powerpc/fpu/round_to_integer.h (set_fenv_mode,
round_to_integer_float, round_mode): Add RINT handling.
(reset_fenv_mode): New symbol.
* sysdeps/powerpc/fpu/s_rint.c (__rint): Use generic implementation.
* sysdeps/powerpc/fpu/s_rintf.c (__rintf): Likewise.
* sysdeps/powerpc/powerpc32/fpu/s_rint.S: Remove file.
* sysdeps/powerpc/powerpc32/fpu/s_rintf.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_rint.S: Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_rintf.S: Likewise.

Reviewed-by: Gabriel F. T. Gomes <gabrielftg@linux.ibm.com>
ChangeLog
sysdeps/powerpc/fpu/round_to_integer.h
sysdeps/powerpc/fpu/s_rint.c
sysdeps/powerpc/fpu/s_rintf.c
sysdeps/powerpc/powerpc32/fpu/s_rint.S [deleted file]
sysdeps/powerpc/powerpc32/fpu/s_rintf.S [deleted file]
sysdeps/powerpc/powerpc64/fpu/s_rint.S [deleted file]
sysdeps/powerpc/powerpc64/fpu/s_rintf.S [deleted file]

index 6efe9c4..840c28c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2019-06-12  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
+
+       * sysdeps/powerpc/fpu/round_to_integer.h (set_fenv_mode,
+       round_to_integer_float, round_mode): Add RINT handling.
+       (reset_fenv_mode): New symbol.
+       * sysdeps/powerpc/fpu/s_rint.c (__rint): Use generic implementation.
+       * sysdeps/powerpc/fpu/s_rintf.c (__rintf): Likewise.
+       * sysdeps/powerpc/powerpc32/fpu/s_rint.S: Remove file.
+       * sysdeps/powerpc/powerpc32/fpu/s_rintf.S: Likewise.
+       * sysdeps/powerpc/powerpc64/fpu/s_rint.S: Likewise.
+       * sysdeps/powerpc/powerpc64/fpu/s_rintf.S: Likewise.
+
 2019-06-12  Florian Weimer  <fweimer@redhat.com>
 
        [BZ #24632]
index 4bbd885..c759483 100644 (file)
@@ -27,12 +27,18 @@ enum round_mode
   FLOOR,
   ROUND,
   TRUNC,
-  NEARBYINT
+  NEARBYINT,
+  RINT
 };
 
-static inline void
+static inline fenv_t
 set_fenv_mode (enum round_mode mode)
 {
+  fenv_t fe = 0;
+  if (mode != RINT)
+    /* Save current FPU rounding mode and inexact state.  */
+    fe = fegetenv_register ();
+
   switch (mode)
   {
   case CEIL:
@@ -49,6 +55,22 @@ set_fenv_mode (enum round_mode mode)
     /*  Disable FE_INEXACT exception  */
     reset_fpscr_bit (FPSCR_XE);
     break;
+  case RINT:
+    break;
+  }
+  return fe;
+}
+
+static inline void
+reset_fenv_mode (fenv_t fe, enum round_mode mode)
+{
+  switch (mode)
+  {
+  default:
+    __builtin_mtfsf (0xff, fe);
+    break;
+  case RINT:
+    break;
   }
 }
 
@@ -64,9 +86,7 @@ round_to_integer_float (enum round_mode mode, float x)
 
   float r = x;
 
-  /* Save current FPU rounding mode and inexact state.  */
-  fenv_t fe = fegetenv_register ();
-  set_fenv_mode (mode);
+  fenv_t fe = set_fenv_mode (mode);
   if (x > 0.0)
     {
       /* IEEE 1003.1 round function.  IEEE specifies "round to the nearest
@@ -91,7 +111,7 @@ round_to_integer_float (enum round_mode mode, float x)
       r += 0x1p+23;
       r = -fabs (r);
     }
-  __builtin_mtfsf (0xff, fe);
+  reset_fenv_mode (fe, mode);
 
   return r;
 }
@@ -109,8 +129,7 @@ round_to_integer_double (enum round_mode mode, double x)
   double r = x;
 
   /* Save current FPU rounding mode and inexact state.  */
-  fenv_t fe = fegetenv_register ();
-  set_fenv_mode (mode);
+  fenv_t fe = set_fenv_mode (mode);
   if (x > 0.0)
     {
       if (mode == ROUND)
@@ -127,7 +146,7 @@ round_to_integer_double (enum round_mode mode, double x)
       r += 0x1p+52;
       r = -fabs (r);
     }
-  __builtin_mtfsf (0xff, fe);
+  reset_fenv_mode (fe, mode);
 
   return r;
 }
index 8bf43e3..062d6b1 100644 (file)
 #define NO_MATH_REDIRECT
 #include <math.h>
 #include <libm-alias-double.h>
+#include <round_to_integer.h>
 
 double
 __rint (double x)
 {
-  static const float TWO52 = 4503599627370496.0;
-
-  if (fabs (x) < TWO52)
-    {
-      if (x > 0.0)
-       {
-         x += TWO52;
-         x -= TWO52;
-       }
-      else if (x < 0.0)
-       {
-         x = TWO52 - x;
-         x = -(x - TWO52);
-       }
-    }
-
-  return x;
+  return round_to_integer_double (RINT, x);
 }
 libm_alias_double (__rint, rint)
index 03aaec2..c29e7a2 100644 (file)
 #define NO_MATH_REDIRECT
 #include <math.h>
 #include <libm-alias-float.h>
+#include <round_to_integer.h>
 
 float
 __rintf (float x)
 {
-  static const float TWO23 = 8388608.0;
-
-  if (fabsf (x) < TWO23)
-    {
-      if (x > 0.0)
-       {
-         x += TWO23;
-         x -= TWO23;
-       }
-      else if (x < 0.0)
-       {
-         x = TWO23 - x;
-         x = -(x - TWO23);
-       }
-    }
-
-  return x;
+  return round_to_integer_float (RINT, x);
 }
 libm_alias_float (__rint, rint)
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_rint.S b/sysdeps/powerpc/powerpc32/fpu/s_rint.S
deleted file mode 100644 (file)
index 0b50b6f..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Round to int floating-point values.  PowerPC32 version.
-   Copyright (C) 2004-2019 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This has been coded in assembler because GCC makes such a mess of it
-   when it's coded in C.  */
-
-#include <sysdep.h>
-#include <math_ldbl_opt.h>
-#include <libm-alias-double.h>
-
-       .section        .rodata.cst4,"aM",@progbits,4
-       .align  2
-.LC0:  /* 2**52 */
-       .long 0x59800000
-
-       .section        ".text"
-ENTRY (__rint)
-#ifdef SHARED
-       mflr    r11
-       cfi_register(lr,r11)
-       SETUP_GOT_ACCESS(r9,got_label)
-       addis   r9,r9,.LC0-got_label@ha
-       lfs     fp13,.LC0-got_label@l(r9)
-       mtlr    r11
-       cfi_same_value (lr)
-#else
-       lis     r9,.LC0@ha
-       lfs     fp13,.LC0@l(r9)
-#endif
-       fabs    fp0,fp1
-       fsub    fp12,fp13,fp13  /* generate 0.0  */
-       fcmpu   cr7,fp0,fp13    /* if (fabs(x) > TWO52)  */
-       fcmpu   cr6,fp1,fp12    /* if (x > 0.0)  */
-       bnl     cr7,.L10
-       bng     cr6,.L4
-       fadd    fp1,fp1,fp13    /* x+= TWO52;  */
-       fsub    fp1,fp1,fp13    /* x-= TWO52;  */
-       fabs    fp1,fp1         /* if (x == 0.0)  */
-       blr                     /* x = 0.0; */
-.L4:
-       bnllr   cr6             /* if (x < 0.0)  */
-       fsub    fp1,fp1,fp13    /* x-= TWO52;  */
-       fadd    fp1,fp1,fp13    /* x+= TWO52;  */
-       fnabs   fp1,fp1         /* if (x == 0.0)  */
-       blr                     /* x = -0.0; */
-.L10:
-       /* Ensure sNaN input is converted to qNaN.  */
-       fcmpu   cr7,fp1,fp1
-       beqlr   cr7
-       fadd    fp1,fp1,fp1
-       blr
-       END (__rint)
-
-libm_alias_double (__rint, rint)
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_rintf.S b/sysdeps/powerpc/powerpc32/fpu/s_rintf.S
deleted file mode 100644 (file)
index f22ad8b..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Round float to int floating-point values.  PowerPC32 version.
-   Copyright (C) 2004-2019 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sysdep.h>
-#include <libm-alias-float.h>
-
-       .section        .rodata.cst4,"aM",@progbits,4
-       .align  2
-.LC0:  /* 2**23 */
-       .long 0x4b000000
-
-       .section        ".text"
-ENTRY (__rintf)
-#ifdef SHARED
-       mflr    r11
-       cfi_register(lr,r11)
-       SETUP_GOT_ACCESS(r9,got_label)
-       addis   r9,r9,.LC0-got_label@ha
-       lfs     fp13,.LC0-got_label@l(r9)
-       mtlr    r11
-       cfi_same_value (lr)
-#else
-       lis     r9,.LC0@ha
-       lfs     fp13,.LC0@l(r9)
-#endif
-       fabs    fp0,fp1
-       fsubs   fp12,fp13,fp13  /* generate 0.0  */
-       fcmpu   cr7,fp0,fp13    /* if (fabs(x) > TWO23)  */
-       fcmpu   cr6,fp1,fp12    /* if (x > 0.0)  */
-       bnl     cr7,.L10
-       bng     cr6,.L4
-       fadds   fp1,fp1,fp13    /* x+= TWO23;  */
-       fsubs   fp1,fp1,fp13    /* x-= TWO23;  */
-       fabs    fp1,fp1         /* if (x == 0.0)  */
-       blr                     /* x = 0.0; */
-.L4:
-       bnllr   cr6             /* if (x < 0.0)  */
-       fsubs   fp1,fp1,fp13    /* x-= TWO23;  */
-       fadds   fp1,fp1,fp13    /* x+= TWO23;  */
-       fnabs   fp1,fp1         /* if (x == 0.0)  */
-       blr                     /* x = -0.0; */
-.L10:
-       /* Ensure sNaN input is converted to qNaN.  */
-       fcmpu   cr7,fp1,fp1
-       beqlr   cr7
-       fadds   fp1,fp1,fp1
-       blr
-       END (__rintf)
-
-libm_alias_float (__rint, rint)
-
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_rint.S b/sysdeps/powerpc/powerpc64/fpu/s_rint.S
deleted file mode 100644 (file)
index 5616f4d..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Round to int floating-point values.  PowerPC64 version.
-   Copyright (C) 2004-2019 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This has been coded in assembler because GCC makes such a mess of it
-   when it's coded in C.  */
-
-#include <sysdep.h>
-#include <math_ldbl_opt.h>
-#include <libm-alias-double.h>
-
-       .section        ".toc","aw"
-.LC0:  /* 2**52 */
-       .tc FD_43300000_0[TC],0x4330000000000000
-       .section        ".text"
-
-ENTRY (__rint, 4)
-       CALL_MCOUNT 0
-       lfd     fp13,.LC0@toc(2)
-       fabs    fp0,fp1
-       fsub    fp12,fp13,fp13  /* generate 0.0  */
-       fcmpu   cr7,fp0,fp13    /* if (fabs(x) > TWO52)  */
-       fcmpu   cr6,fp1,fp12    /* if (x > 0.0)  */
-       bnl     cr7,.L10
-       bng     cr6,.L4
-       fadd    fp1,fp1,fp13    /* x+= TWO52;  */
-       fsub    fp1,fp1,fp13    /* x-= TWO52;  */
-       fabs    fp1,fp1         /* if (x == 0.0)  */
-       blr                     /* x = 0.0; */
-.L4:
-       bnllr   cr6             /* if (x < 0.0)  */
-       fsub    fp1,fp1,fp13    /* x-= TWO52;  */
-       fadd    fp1,fp1,fp13    /* x+= TWO52;  */
-       fnabs   fp1,fp1         /* if (x == 0.0)  */
-       blr                     /* x = -0.0; */
-.L10:
-       /* Ensure sNaN input is converted to qNaN.  */
-       fcmpu   cr7,fp1,fp1
-       beqlr   cr7
-       fadd    fp1,fp1,fp1
-       blr
-       END (__rint)
-
-libm_alias_double (__rint, rint)
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_rintf.S b/sysdeps/powerpc/powerpc64/fpu/s_rintf.S
deleted file mode 100644 (file)
index 4511467..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Round float to int floating-point values.  PowerPC64 version.
-   Copyright (C) 2004-2019 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sysdep.h>
-#include <libm-alias-float.h>
-
-       .section        ".toc","aw"
-       .p2align 3
-.LC0:  /* 2**23 */
-       .long 0x4b000000
-       .long 0x0
-       .section        ".text"
-
-ENTRY (__rintf, 4)
-       CALL_MCOUNT 0
-       lfs     fp13,.LC0@toc(2)
-       fabs    fp0,fp1
-       fsubs   fp12,fp13,fp13  /* generate 0.0  */
-       fcmpu   cr7,fp0,fp13    /* if (fabs(x) > TWO23)  */
-       fcmpu   cr6,fp1,fp12    /* if (x > 0.0)  */
-       bnl     cr7,.L10
-       bng     cr6,.L4
-       fadds   fp1,fp1,fp13    /* x+= TWO23;  */
-       fsubs   fp1,fp1,fp13    /* x-= TWO23;  */
-       fabs    fp1,fp1         /* if (x == 0.0)  */
-       blr                     /* x = 0.0; */
-.L4:
-       bnllr   cr6             /* if (x < 0.0)  */
-       fsubs   fp1,fp1,fp13    /* x-= TWO23;  */
-       fadds   fp1,fp1,fp13    /* x+= TWO23;  */
-       fnabs   fp1,fp1         /* if (x == 0.0)  */
-       blr                     /* x = -0.0; */
-.L10:
-       /* Ensure sNaN input is converted to qNaN.  */
-       fcmpu   cr7,fp1,fp1
-       beqlr   cr7
-       fadds   fp1,fp1,fp1
-       blr
-       END (__rintf)
-
-libm_alias_float (__rint, rint)
-