summary refs log tree commit diff
path: root/sysdeps/powerpc/powerpc32/power4/fpu
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/power4/fpu
parenta63b96fbddbf97feaa068a9efed3b5623a1a1e78 (diff)
downloadglibc-9d5d214e86db30633e905907f7b3cf56b8fee16e.tar.gz
glibc-9d5d214e86db30633e905907f7b3cf56b8fee16e.tar.xz
glibc-9d5d214e86db30633e905907f7b3cf56b8fee16e.zip
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/power4/fpu')
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile5
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.S31
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.c2
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.S31
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.c2
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.S31
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.c2
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.S33
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.c2
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.S31
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.c2
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S105
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/s_llroundf.S1
13 files changed, 15 insertions, 263 deletions
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile
index d33d403a1b..60f2c95532 100644
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/Makefile
@@ -23,6 +23,11 @@ CFLAGS-s_llrintf-ppc32.c += -mcpu=power4
 CFLAGS-s_llrint-power6.c += -mcpu=power6
 CFLAGS-s_llrint-ppc32.c += -mcpu=power4
 CFLAGS-s_lrint-ppc32.c += -mcpu=power4
+CFLAGS-s_llround-power6.c += -mcpu=power6
+CFLAGS-s_llround-power5+.c += -mcpu=power5+
+CFLAGS-s_llround-ppc32.c += -mcpu=power4
+CFLAGS-s_lround-ppc32.c += -mcpu=power4
+CFLAGS-s_lround-power5+.c += -mcpu=power5+
 CFLAGS-s_ceil-power5+.c = -mcpu=power5+
 CFLAGS-s_ceilf-power5+.c = -mcpu=power5+
 CFLAGS-s_modf-power5+.c = -mcpu=power5+
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.S b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.S
deleted file mode 100644
index 80fc5b0f6c..0000000000
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* lround function.  PowerPC32/POWER5+ version.
-   Copyright (C) 2013-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>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __llround __llround_power5plus
-
-#include <sysdeps/powerpc/powerpc32/power5+/fpu/s_llround.S>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.c
new file mode 100644
index 0000000000..794fad71c2
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power5+.c
@@ -0,0 +1,2 @@
+#define __llround __llround_power5plus
+#include <sysdeps/powerpc/powerpc32/fpu/s_llround.c>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.S b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.S
deleted file mode 100644
index d6d9a0a4cb..0000000000
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* lround function.  PowerPC32/POWER6 version.
-   Copyright (C) 2013-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>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __llround __llround_power6
-
-#include <sysdeps/powerpc/powerpc32/power6/fpu/s_llround.S>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.c
new file mode 100644
index 0000000000..2b588c4c54
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-power6.c
@@ -0,0 +1,2 @@
+#define __llround __llround_power6
+#include <sysdeps/powerpc/powerpc32/fpu/s_llround.c>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.S b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.S
deleted file mode 100644
index 085fbc6de4..0000000000
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* llround function.  PowerPC32 default version.
-   Copyright (C) 2013-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>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __llround __llround_ppc32
-
-#include <sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.c
new file mode 100644
index 0000000000..3b5ff344bd
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_llround-ppc32.c
@@ -0,0 +1,2 @@
+#define __llround __llround_ppc32
+#include <sysdeps/powerpc/powerpc32/fpu/s_llround.c>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.S b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.S
deleted file mode 100644
index 350315e38b..0000000000
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.S
+++ /dev/null
@@ -1,33 +0,0 @@
-/* lround function.  POWER5+, PowerPC32 version.
-   Copyright (C) 2013-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>
-
-#undef hidden_def
-#define hidden_def(name)
-#undef weak_alias
-#define weak_alias(name, alias)
-#undef strong_alias
-#define strong_alias(name, alias)
-#undef compat_symbol
-#define compat_symbol(lib, name, alias, ver)
-
-#define __lround __lround_power5plus
-
-#include <sysdeps/powerpc/powerpc32/power5+/fpu/s_lround.S>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.c
new file mode 100644
index 0000000000..d6a17c4bca
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-power5+.c
@@ -0,0 +1,2 @@
+#define __lround __lround_power5plus
+#include <sysdeps/powerpc/powerpc32/fpu/s_lround.c>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.S b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.S
deleted file mode 100644
index 245a682720..0000000000
--- a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.S
+++ /dev/null
@@ -1,31 +0,0 @@
-/* lround function.  PowerPC32 default version.
-   Copyright (C) 2013-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>
-
-#undef weak_alias
-#define weak_alias(a,b)
-#undef strong_alias
-#define strong_alias(a,b)
-#undef compat_symbol
-#define compat_symbol(a,b,c,d)
-
-#define __lround __lround_ppc32
-
-#include <sysdeps/powerpc/powerpc32/fpu/s_lround.S>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.c b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.c
new file mode 100644
index 0000000000..5355e1f712
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/multiarch/s_lround-ppc32.c
@@ -0,0 +1,2 @@
+#define __lround __lround_ppc32
+#include <sysdeps/powerpc/powerpc32/fpu/s_lround.c>
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S b/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S
deleted file mode 100644
index 3d6ba34180..0000000000
--- a/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S
+++ /dev/null
@@ -1,105 +0,0 @@
-/* llround function.  PowerPC32 on 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 <math_ldbl_opt.h>
-#include <libm-alias-float.h>
-#include <libm-alias-double.h>
-
- .section .rodata.cst8,"aM",@progbits,8
- .align 3
- .LC0:	.long (52+127)<<23 /* 0x1p+52  */
-	.long (-1+127)<<23 /* 0.5  */
-
-	.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.  Likewise
-   if x is and odd number between +-(2^52 and 2^53-1) a shift and
-   carry will erroneously round if biased with +-0.5.  Therefore if x
-   is greater/less than +-2^52 we don't need to bias the number with
-   +-0.5.  */
-
-ENTRY (__llround)
-	stwu    r1,-16(r1)
-	cfi_adjust_cfa_offset (16)
-#ifdef SHARED
-	mflr	r11
-	cfi_register(lr,r11)
-	SETUP_GOT_ACCESS(r9,got_label)
-	addis	r9,r9,.LC0-got_label@ha
-	addi	r9,r9,.LC0-got_label@l
-	mtlr	r11
-	cfi_same_value (lr)
-	lfs	fp9,0(r9)
-	lfs	fp10,4(r9)
-#else
-	lis r9,.LC0@ha
-	lfs fp9,.LC0@l(r9)	/* Load 2^52 into fpr9.  */
-	lfs fp10,.LC0@l+4(r9)	/* Load 0.5 into fpr10.  */
-#endif
-	fabs	fp2,fp1		/* Get the absolute value of x.  */
-	fsub	fp12,fp10,fp10	/* Compute 0.0 into fpr12.  */
-	fcmpu	cr6,fp2,fp10	/* if |x| < 0.5  */
-	fcmpu	cr7,fp2,fp9	/* if |x| >= 2^52  */
-	fcmpu	cr1,fp1,fp12	/* x is negative? x < 0.0  */
-	blt-	cr6,.Lretzero	/* 0.5 > x < -0.5 so just return 0.  */
-	bge-	cr7,.Lnobias	/* 2^52 > x < -2^52 just convert with no bias.  */
-	/* Test whether an integer to avoid spurious "inexact".  */
-	fadd	fp3,fp2,fp9
-	fsub	fp3,fp3,fp9
-	fcmpu	cr5,fp2,fp3
-	beq	cr5,.Lnobias
-	fadd	fp3,fp2,fp10	/* |x|+=0.5 bias to prepare to round.  */
-	bge	cr1,.Lconvert	/* x is positive so don't negate x.  */
-	fnabs	fp3,fp3		/* -(|x|+=0.5)  */
-.Lconvert:
-	fctidz	fp4,fp3		/* Convert to Integer double word round toward 0.  */
-	stfd	fp4,8(r1)
-	nop
-	nop
-	nop
-	lwz	r3,8+HIWORD(r1)	/* Load return as integer.  */
-	lwz	r4,8+LOWORD(r1)
-.Lout:
-	addi	r1,r1,16
-	blr
-.Lretzero:			/* 0.5 > x > -0.5  */
-	li	r3,0		/* return 0.  */
-	li	r4,0
-	b	.Lout
-.Lnobias:
-	fmr	fp3,fp1
-	b	.Lconvert
-	END (__llround)
-
-libm_alias_double (__llround, llround)
-
-strong_alias (__llround, __llroundf)
-libm_alias_float (__llround, llround)
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/s_llroundf.S b/sysdeps/powerpc/powerpc32/power4/fpu/s_llroundf.S
deleted file mode 100644
index 72d6181541..0000000000
--- a/sysdeps/powerpc/powerpc32/power4/fpu/s_llroundf.S
+++ /dev/null
@@ -1 +0,0 @@
-/* __llroundf is in s_llround.S */