summaryrefslogtreecommitdiff
path: root/sysdeps/powerpc/powerpc32/fpu/s_lround.S
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2019-03-22 16:47:34 +0000
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2019-06-26 14:32:45 -0300
commit9d5d214e86db30633e905907f7b3cf56b8fee16e (patch)
treea92139b5d32f8c23de24da0bbeb2d58541ff1b2e /sysdeps/powerpc/powerpc32/fpu/s_lround.S
parenta63b96fbddbf97feaa068a9efed3b5623a1a1e78 (diff)
downloadglibc-9d5d214e86db30633e905907f7b3cf56b8fee16e.tar.gz
powerpc: Refactor powerpc32 lround/lroundf/llround/llroundf
This patches consolidates all the powerpc llround{f} implementations on the generic sysdeps/powerpc/powerpc32/fpu/s_llround{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/powerpc32/fpu/Makefile [$(subdir) == math] (CFLAGS-s_lround.c): New rule. * sysdeps/powerpc/powerpc32/fpu/s_llround.c (__llround): Add power5+ and fctidz optimization. * sysdeps/powerpc/powerpc32/fpu/s_lround.S: Remove file. * sysdeps/powerpc/powerpc32/fpu/s_lround.c: New file. * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile (CFLAGS-s_llround-power6.c, CFLAGS-s_llround-power5+.c, CFLAGS-s_llround-ppc32.c, CFLAGS-s_lround-ppc32.c, CFLAGS-s_lround-power5+.c): New rule. * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.c: New file. * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.c: Likewise. * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.c: Likewise. * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.c: Likewise. * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.c: Likewise. * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.S: Remove file. * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.S: Likewise. * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.S: Likewise. * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.S: Likewise. * sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.S: Likewise. * sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S: Likewise. * sysdeps/powerpc/powerpc32/power4/fpu/s_llroundf.S: Likewise. * sysdeps/powerpc/powerpc32/power5+/fpu/s_llround.S: Likewise. * sysdeps/powerpc/powerpc32/power5+/fpu/s_llroundf.S: Likewise. * sysdeps/powerpc/powerpc32/power5+/fpu/s_lround.S: Likewise. * sysdeps/powerpc/powerpc32/power6/fpu/s_llround.S: Likewise. * sysdeps/powerpc/powerpc32/power6/fpu/s_llroundf.S: Likewise. Reviewed-by: Gabriel F. T. Gomes <gabriel@inconstante.eti.br>
Diffstat (limited to 'sysdeps/powerpc/powerpc32/fpu/s_lround.S')
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_lround.S123
1 files changed, 0 insertions, 123 deletions
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_lround.S b/sysdeps/powerpc/powerpc32/fpu/s_lround.S
deleted file mode 100644
index 2d9540ceed..0000000000
--- a/sysdeps/powerpc/powerpc32/fpu/s_lround.S
+++ /dev/null
@@ -1,123 +0,0 @@
-/* lround function. 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 <math_ldbl_opt.h>
-#include <libm-alias-float.h>
-#include <libm-alias-double.h>
-
- .section .rodata.cst4,"aM",@progbits,4
- .align 2
-.LC0: /* 0.5 */
- .long 0x3f000000
-.LC1: /* 2^52. */
- .long 0x59800000
- .section .rodata.cst8,"aM",@progbits,8
- .align 3
-.LC2: /* 0x7fffffff.8p0. */
- .long 0x41dfffff
- .long 0xffe00000
-.LC3: /* -0x80000000.8p0. */
- .long 0xc1e00000
- .long 0x00100000
- .section ".text"
-
-/* long [r3] lround (float x [fp1])
- IEEE 1003.1 lround function. IEEE specifies "round to the nearest
- integer value, rounding halfway cases away from zero, regardless of
- the current rounding mode." However PowerPC Architecture defines
- "round to Nearest" as "Choose the best approximation. In case of a
- tie, choose the one that is even (least significant bit o).".
- So we can't use the PowerPC "round to Nearest" mode. Instead we set
- "round toward Zero" mode and round by adding +-0.5 before rounding
- to the integer value. It is necessary to detect when x is
- (+-)0x1.fffffffffffffp-2 because adding +-0.5 in this case will
- cause an erroneous shift, carry and round. We simply return 0 if
- 0.5 > x > -0.5. */
-
-ENTRY (__lround)
- stwu r1,-16(r1)
- cfi_adjust_cfa_offset (16)
-#ifdef SHARED
- mflr r11
- cfi_register(lr,r11)
- SETUP_GOT_ACCESS(r9,got_label)
- addis r10,r9,.LC0-got_label@ha
- lfs fp10,.LC0-got_label@l(r10)
- addis r10,r9,.LC1-got_label@ha
- lfs fp11,.LC1-got_label@l(r10)
- addis r10,r9,.LC2-got_label@ha
- lfd fp9,.LC2-got_label@l(r10)
- addis r10,r9,.LC3-got_label@ha
- lfd fp8,.LC3-got_label@l(r10)
- mtlr r11
- cfi_same_value (lr)
-#else
- lis r9,.LC0@ha
- lfs fp10,.LC0@l(r9)
- lis r9,.LC1@ha
- lfs fp11,.LC1@l(r9)
- lis r9,.LC2@ha
- lfd fp9,.LC2@l(r9)
- lis r9,.LC3@ha
- lfd fp8,.LC3@l(r9)
-#endif
- fabs fp2, fp1 /* Get the absolute value of x. */
- fsub fp12,fp10,fp10 /* Compute 0.0. */
- fcmpu cr6, fp2, fp10 /* if |x| < 0.5 */
- fcmpu cr5, fp1, fp9 /* if x >= 0x7fffffff.8p0 */
- fcmpu cr1, fp1, fp8 /* if x <= -0x80000000.8p0 */
- fcmpu cr7, fp1, fp12 /* x is negative? x < 0.0 */
- blt- cr6,.Lretzero
- bge- cr5,.Loflow
- ble- cr1,.Loflow
- /* Test whether an integer to avoid spurious "inexact". */
- fadd fp3,fp2,fp11
- fsub fp3,fp3,fp11
- fcmpu cr5, fp2, fp3
- beq cr5,.Lnobias
- fadd fp3,fp2,fp10 /* |x|+=0.5 bias to prepare to round. */
- bge cr7,.Lconvert /* x is positive so don't negate x. */
- fnabs fp3,fp3 /* -(|x|+=0.5) */
-.Lconvert:
- fctiwz fp4,fp3 /* Convert to Integer word lround toward 0. */
- stfd fp4,8(r1)
- nop /* Ensure the following load is in a different dispatch */
- nop /* group to avoid pipe stall on POWER4&5. */
- nop
- lwz r3,8+LOWORD(r1) /* Load return as integer. */
-.Lout:
- addi r1,r1,16
- blr
-.Lretzero: /* when 0.5 > x > -0.5 */
- li r3,0 /* return 0. */
- b .Lout
-.Lnobias:
- fmr fp3,fp1
- b .Lconvert
-.Loflow:
- fmr fp3,fp11
- bge cr7,.Lconvert
- fnabs fp3,fp3
- b .Lconvert
- END (__lround)
-
-libm_alias_double (__lround, lround)
-
-strong_alias (__lround, __lroundf)
-libm_alias_float (__lround, lround)